diff --git a/.env.example b/.env.example
index ec281e283601..ce6f298ebdf7 100644
--- a/.env.example
+++ b/.env.example
@@ -45,6 +45,7 @@ FCM_API_TOKEN=
#CACHE_DRIVER=
#CACHE_HOST=
+#REDIS_HOST=
#CACHE_PORT1=
#CACHE_PORT2=
diff --git a/README.md b/README.md
index 934637117002..2f5942acef4f 100644
--- a/README.md
+++ b/README.md
@@ -70,7 +70,7 @@ All contributors are welcome!
For information on how contribute to Invoice Ninja, please see our [contributing guide](CONTRIBUTING.md).
## Credits
-* [Hillel Coren](https://github.com/hillelcoren)
+* [Hillel Coren](https://hillelcoren.com/)
* [All contributors](https://github.com/invoiceninja/invoiceninja/graphs/contributors)
**Special thanks to:**
diff --git a/app/Constants.php b/app/Constants.php
index 75634ad9da1e..2e0570972749 100644
--- a/app/Constants.php
+++ b/app/Constants.php
@@ -296,7 +296,7 @@ if (! defined('APP_NAME')) {
define('NINJA_APP_URL', env('NINJA_APP_URL', 'https://app.invoiceninja.com'));
define('NINJA_DOCS_URL', env('NINJA_DOCS_URL', 'http://docs.invoiceninja.com/en/latest'));
define('NINJA_DATE', '2000-01-01');
- define('NINJA_VERSION', '3.2.0' . env('NINJA_VERSION_SUFFIX'));
+ define('NINJA_VERSION', '3.2.1' . env('NINJA_VERSION_SUFFIX'));
define('SOCIAL_LINK_FACEBOOK', env('SOCIAL_LINK_FACEBOOK', 'https://www.facebook.com/invoiceninja'));
define('SOCIAL_LINK_TWITTER', env('SOCIAL_LINK_TWITTER', 'https://twitter.com/invoiceninja'));
@@ -321,10 +321,13 @@ if (! defined('APP_NAME')) {
define('FIREFOX_PDF_HELP_URL', 'https://support.mozilla.org/en-US/kb/view-pdf-files-firefox');
define('MSBOT_LOGIN_URL', 'https://login.microsoftonline.com/common/oauth2/v2.0/token');
- define('MSBOT_LUIS_URL', 'https://api.projectoxford.ai/luis/v1/application');
+ define('MSBOT_LUIS_URL', 'https://westus.api.cognitive.microsoft.com/luis/v2.0/apps');
define('SKYPE_API_URL', 'https://apis.skype.com/v3');
define('MSBOT_STATE_URL', 'https://state.botframework.com/v3');
+ define('BOT_PLATFORM_WEB_APP', 'WebApp');
+ define('BOT_PLATFORM_SKYPE', 'Skype');
+
define('BLANK_IMAGE', 'data:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=');
define('COUNT_FREE_DESIGNS', 4);
diff --git a/app/Http/Controllers/BotController.php b/app/Http/Controllers/BotController.php
index 02267924f23a..0a32a5b1f9e1 100644
--- a/app/Http/Controllers/BotController.php
+++ b/app/Http/Controllers/BotController.php
@@ -80,7 +80,7 @@ class BotController extends Controller
$user->account->loadLocalizationSettings();
$data = $this->parseMessage($text);
- $intent = BaseIntent::createIntent($state, $data);
+ $intent = BaseIntent::createIntent($platform, $state, $data);
$response = $intent->process();
$state = $intent->getState();
}
@@ -97,6 +97,20 @@ class BotController extends Controller
return RESULT_SUCCESS;
}
+ public function handleCommand()
+ {
+ $command = request()->command;
+ $data = $this->parseMessage($command);
+
+ try {
+ $intent = BaseIntent::createIntent(BOT_PLATFORM_WEB_APP, false, $data);
+ return $intent->process();
+ } catch (Exception $exception) {
+ $message = sprintf('"%s"
%s', $command, $exception->getMessage());
+ return redirect()->back()->withWarning($message);
+ }
+ }
+
private function authenticate($input)
{
$token = isset($_SERVER['HTTP_AUTHORIZATION']) ? $_SERVER['HTTP_AUTHORIZATION'] : false;
@@ -146,7 +160,8 @@ class BotController extends Controller
$subKey = env('MSBOT_LUIS_SUBSCRIPTION_KEY');
$message = rawurlencode($message);
- $url = sprintf('%s?id=%s&subscription-key=%s&q=%s', MSBOT_LUIS_URL, $appId, $subKey, $message);
+ $url = sprintf('%s/%s?subscription-key=%s&verbose=true&q=%s', MSBOT_LUIS_URL, $appId, $subKey, $message);
+ //$url = sprintf('%s?id=%s&subscription-key=%s&q=%s', MSBOT_LUIS_URL, $appId, $subKey, $message);
$data = file_get_contents($url);
$data = json_decode($data);
diff --git a/app/Http/Controllers/ClientPortalController.php b/app/Http/Controllers/ClientPortalController.php
index c583835fd49d..9800a1ed1651 100644
--- a/app/Http/Controllers/ClientPortalController.php
+++ b/app/Http/Controllers/ClientPortalController.php
@@ -326,14 +326,20 @@ class ClientPortalController extends BaseController
}
$color = $account->primary_color ? $account->primary_color : '#0b4d78';
+ $columns = ['frequency', 'start_date', 'end_date', 'invoice_total'];
+ $client = $contact->client;
+
+ if ($client->hasAutoBillConfigurableInvoices()) {
+ $columns[] = 'auto_bill';
+ }
$data = [
'color' => $color,
'account' => $account,
- 'client' => $contact->client,
+ 'client' => $client,
'title' => trans('texts.recurring_invoices'),
'entityType' => ENTITY_RECURRING_INVOICE,
- 'columns' => Utils::trans(['frequency', 'start_date', 'end_date', 'invoice_total', 'auto_bill']),
+ 'columns' => Utils::trans($columns),
];
return response()->view('public_list', $data);
diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php
index 18d562dfbedc..fea15293ab57 100644
--- a/app/Http/Controllers/InvoiceController.php
+++ b/app/Http/Controllers/InvoiceController.php
@@ -194,6 +194,7 @@ class InvoiceController extends BaseController
$invoice = $account->createInvoice($entityType, $clientId);
$invoice->public_id = 0;
+ $invoice->loadFromRequest();
$clients = Client::scope()->with('contacts', 'country')->orderBy('name');
if (! Auth::user()->hasPermission('view_all')) {
diff --git a/app/Http/routes.php b/app/Http/routes.php
index 2a4258f8c43a..614954aa3d02 100644
--- a/app/Http/routes.php
+++ b/app/Http/routes.php
@@ -127,6 +127,7 @@ Route::group(['middleware' => 'auth:user'], function () {
Route::get('check_invoice_number/{invoice_id?}', 'InvoiceController@checkInvoiceNumber');
Route::post('save_sidebar_state', 'UserController@saveSidebarState');
Route::post('contact_us', 'HomeController@contactUs');
+ Route::post('handle_command', 'BotController@handleCommand');
Route::get('settings/user_details', 'AccountController@showUserDetails');
Route::post('settings/user_details', 'AccountController@saveUserDetails');
diff --git a/app/Models/Client.php b/app/Models/Client.php
index 5a42983d38ba..7f886fc96879 100644
--- a/app/Models/Client.php
+++ b/app/Models/Client.php
@@ -543,7 +543,15 @@ class Client extends EntityModel
*/
public function hasAutoBillConfigurableInvoices()
{
- return $this->invoices()->whereIn('auto_bill', [AUTO_BILL_OPT_IN, AUTO_BILL_OPT_OUT])->count() > 0;
+ return $this->invoices()->whereIsPublic(true)->whereIn('auto_bill', [AUTO_BILL_OPT_IN, AUTO_BILL_OPT_OUT])->count() > 0;
+ }
+
+ /**
+ * @return bool
+ */
+ public function hasRecurringInvoices()
+ {
+ return $this->invoices()->whereIsPublic(true)->whereIsRecurring(true)->count() > 0;
}
public function defaultDaysDue()
diff --git a/app/Models/EntityModel.php b/app/Models/EntityModel.php
index 3cb8a052cc19..36220a53b1d2 100644
--- a/app/Models/EntityModel.php
+++ b/app/Models/EntityModel.php
@@ -319,6 +319,15 @@ class EntityModel extends Eloquent
return array_get($icons, $entityType);
}
+ public function loadFromRequest()
+ {
+ foreach (static::$requestFields as $field) {
+ if ($value = request()->$field) {
+ $this->$field = strpos($field, 'date') ? Utils::fromSqlDate($value) : $value;
+ }
+ }
+ }
+
// isDirty return true if the field's new value is the same as the old one
public function isChanged()
{
diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php
index 7e5b3b66c67f..83e6912205ab 100644
--- a/app/Models/Invoice.php
+++ b/app/Models/Invoice.php
@@ -73,6 +73,18 @@ class Invoice extends EntityModel implements BalanceAffecting
'date:',
];
+ /**
+ * @var array
+ */
+ public static $requestFields = [
+ 'invoice_number',
+ 'invoice_date',
+ 'due_date',
+ 'po_number',
+ 'discount',
+ 'partial',
+ ];
+
public static $statusClasses = [
INVOICE_STATUS_SENT => 'info',
INVOICE_STATUS_VIEWED => 'warning',
diff --git a/app/Models/InvoiceStatus.php b/app/Models/InvoiceStatus.php
index 4a4dddb5eecb..302b79ca9fc3 100644
--- a/app/Models/InvoiceStatus.php
+++ b/app/Models/InvoiceStatus.php
@@ -13,4 +13,26 @@ class InvoiceStatus extends Eloquent
* @var bool
*/
public $timestamps = false;
+
+ public static function getIdFromAlias($status)
+ {
+ switch ($status) {
+ case 'draft':
+ return INVOICE_STATUS_DRAFT;
+ case 'sent':
+ return INVOICE_STATUS_SENT;
+ case 'viewed':
+ return INVOICE_STATUS_VIEWED;
+ case 'approved':
+ return INVOICE_STATUS_APPROVED;
+ case 'partial':
+ return INVOICE_STATUS_PARTIAL;
+ case 'overdue':
+ return INVOICE_STATUS_OVERDUE;
+ case 'unpaid':
+ return INVOICE_STATUS_UNPAID;
+ default:
+ return false;
+ }
+ }
}
diff --git a/app/Ninja/Intents/BaseIntent.php b/app/Ninja/Intents/BaseIntent.php
index 012a75d46eb1..f65407283431 100644
--- a/app/Ninja/Intents/BaseIntent.php
+++ b/app/Ninja/Intents/BaseIntent.php
@@ -3,6 +3,7 @@
namespace App\Ninja\Intents;
use App\Libraries\Skype\SkypeResponse;
+use App\Models\Client;
use Exception;
use stdClass;
@@ -28,11 +29,22 @@ class BaseIntent
$this->state = $state;
$this->data = $data;
+
+ // If they're viewing a client set it as the current state
+ if (! $this->hasField('Filter', 'all')) {
+ $url = url()->previous();
+ preg_match('/clients\/(\d*)/', $url, $matches);
+ if (count($matches) >= 2) {
+ if ($client = Client::scope($matches[1])->first()) {
+ $this->state->current->client = $client;
+ }
+ }
+ }
//var_dump($state);
}
- public static function createIntent($state, $data)
+ public static function createIntent($platform, $state, $data)
{
if (! count($data->intents)) {
throw new Exception(trans('texts.intent_not_found'));
@@ -43,20 +55,26 @@ class BaseIntent
foreach ($data->entities as $entity) {
if ($entity->type === 'EntityType') {
- $entityType = $entity->entity;
+ $entityType = rtrim($entity->entity, 's');
break;
}
}
- if (! $entityType) {
+ if ($state && ! $entityType) {
$entityType = $state->current->entityType;
}
-
+ $entityType = $entityType ?: 'client';
$entityType = ucwords(strtolower($entityType));
+ if ($entityType == 'Recurring') {
+ $entityType = 'RecurringInvoice';
+ }
$intent = str_replace('Entity', $entityType, $intent);
- $className = "App\\Ninja\\Intents\\{$intent}Intent";
- //echo "Intent: $intent
"; + if ($platform == BOT_PLATFORM_WEB_APP) { + $className = "App\\Ninja\\Intents\\WebApp\\{$intent}Intent"; + } else { + $className = "App\\Ninja\\Intents\\{$intent}Intent"; + } if (! class_exists($className)) { throw new Exception(trans('texts.intent_not_supported')); @@ -65,6 +83,52 @@ class BaseIntent return new $className($state, $data); } + protected function getField($field) + { + foreach ($this->data->entities as $entity) { + if ($entity->type === $field) { + return $entity->entity; + } + } + + return false; + } + + protected function getFields($field) + { + $data = []; + + foreach ($this->data->entities as $entity) { + if ($entity->type === $field) { + $data[] = $entity->entity; + } + } + + return $data; + } + + protected function loadStates($entityType) + { + $states = array_filter($this->getFields('Filter'), function($state) { + return in_array($state, [STATUS_ACTIVE, STATUS_ARCHIVED, STATUS_DELETED]); + }); + + if (count($states) || $this->hasField('Filter', 'all')) { + session(['entity_state_filter:' . $entityType => join(',', $states)]); + } + } + + protected function hasField($field, $value = false) + { + $fieldValue = $this->getField($field); + + if ($value) { + return $fieldValue && $fieldValue == $value; + } else { + return $fieldValue ? true : false; + } + } + public function process() { throw new Exception(trans('texts.intent_not_supported')); @@ -128,13 +192,32 @@ class BaseIntent foreach ($this->data->entities as $param) { if ($param->type == 'Name') { + $param->type = rtrim($param->type, ' \' s'); $client = $clientRepo->findPhonetically($param->entity); } } + if (! $client) { + $client = $this->state->current->client; + } + return $client; } + protected function requestInvoice() + { + $invoiceRepo = app('App\Ninja\Repositories\InvoiceRepository'); + $invoice = false; + + foreach ($this->data->entities as $param) { + if ($param->type == 'builtin.number') { + return $invoiceRepo->findPhonetically($param->entity); + } + } + + return false; + } + protected function requestFields() { $data = []; @@ -178,13 +261,31 @@ class BaseIntent return $data; } + protected function requestFieldsAsString($fields) + { + $str = ''; + + foreach ($this->requestFields() as $field => $value) { + if (in_array($field, $fields)) { + $str .= $field . '=' . urlencode($value) . '&'; + } + } + + $str = rtrim($str, '?'); + $str = rtrim($str, '&'); + + return $str; + } + protected function processField($field) { $field = str_replace(' ', '_', $field); + /* Shouldn't be need any more if (strpos($field, 'date') !== false) { $field .= '_sql'; } + */ return $field; } diff --git a/app/Ninja/Intents/InvoiceIntent.php b/app/Ninja/Intents/InvoiceIntent.php index 9421e32e0a4e..a6b712c01304 100644 --- a/app/Ninja/Intents/InvoiceIntent.php +++ b/app/Ninja/Intents/InvoiceIntent.php @@ -3,6 +3,7 @@ namespace App\Ninja\Intents; use App\Models\Invoice; +use App\Models\InvoiceStatus; use Auth; use Exception; @@ -104,4 +105,20 @@ class InvoiceIntent extends BaseIntent return $invoiceItems; } + + protected function loadStatuses($entityType) + { + $statusIds = []; + $statuses = $this->getFields('Filter'); + + foreach ($statuses as $status) { + if ($statusId = InvoiceStatus::getIdFromAlias($status)) { + $statusIds[] = $statusId; + } + } + + if (count($statusIds) || $this->hasField('Filter', 'all')) { + session(['entity_status_filter:' . $entityType => join(',', $statusIds)]); + } + } } diff --git a/app/Ninja/Intents/WebApp/CreateClientIntent.php b/app/Ninja/Intents/WebApp/CreateClientIntent.php new file mode 100644 index 000000000000..f8b05eaed6ac --- /dev/null +++ b/app/Ninja/Intents/WebApp/CreateClientIntent.php @@ -0,0 +1,18 @@ +requestFieldsAsString(Invoice::$requestFields); + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/CreateCreditIntent.php b/app/Ninja/Intents/WebApp/CreateCreditIntent.php new file mode 100644 index 000000000000..dc3bec7c0c0c --- /dev/null +++ b/app/Ninja/Intents/WebApp/CreateCreditIntent.php @@ -0,0 +1,21 @@ +requestClient(); + $clientPublicId = $client ? $client->public_id : null; + + //$invoiceItems = $this->requestInvoiceItems(); + + $url = '/credits/create/' . $clientPublicId; + //$url .= $this->requestFieldsAsString(Invoice::$requestFields); + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/CreateExpenseIntent.php b/app/Ninja/Intents/WebApp/CreateExpenseIntent.php new file mode 100644 index 000000000000..f247937451c7 --- /dev/null +++ b/app/Ninja/Intents/WebApp/CreateExpenseIntent.php @@ -0,0 +1,18 @@ +requestFieldsAsString(Invoice::$requestFields); + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/CreateInvoiceIntent.php b/app/Ninja/Intents/WebApp/CreateInvoiceIntent.php new file mode 100644 index 000000000000..395b5a78ca08 --- /dev/null +++ b/app/Ninja/Intents/WebApp/CreateInvoiceIntent.php @@ -0,0 +1,27 @@ +requestClient(); + $clientPublicId = $client ? $client->public_id : null; + + //$invoiceItems = $this->requestInvoiceItems(); + + $url = '/invoices/create/' . $clientPublicId . '?'; + $url .= $this->requestFieldsAsString(Invoice::$requestFields); + + $url = rtrim($url, '?'); + $url = rtrim($url, '&'); + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/CreatePaymentIntent.php b/app/Ninja/Intents/WebApp/CreatePaymentIntent.php new file mode 100644 index 000000000000..63cb631de1b1 --- /dev/null +++ b/app/Ninja/Intents/WebApp/CreatePaymentIntent.php @@ -0,0 +1,27 @@ +requestInvoice()) { + $invoicePublicId = $invoice->public_id; + } elseif ($client = $this->requestClient()) { + $clientPublicId = $client->public_id; + } + + //$invoiceItems = $this->requestInvoiceItems(); + + $url = sprintf('/payments/create/%s/%s', $clientPublicId, $invoicePublicId); + //$url .= $this->requestFieldsAsString(Invoice::$requestFields); + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/CreateProductIntent.php b/app/Ninja/Intents/WebApp/CreateProductIntent.php new file mode 100644 index 000000000000..d8989b3f0c05 --- /dev/null +++ b/app/Ninja/Intents/WebApp/CreateProductIntent.php @@ -0,0 +1,21 @@ +requestFieldsAsString(Invoice::$requestFields); + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/CreateQuoteIntent.php b/app/Ninja/Intents/WebApp/CreateQuoteIntent.php new file mode 100644 index 000000000000..cd93d4a06d61 --- /dev/null +++ b/app/Ninja/Intents/WebApp/CreateQuoteIntent.php @@ -0,0 +1,25 @@ +requestClient(); + $clientPublicId = $client ? $client->public_id : null; + + //$invoiceItems = $this->requestInvoiceItems(); + + $url = '/quotes/create/' . $clientPublicId . '?'; + $url .= $this->requestFieldsAsString(Invoice::$requestFields); + + $url = rtrim($url, '?'); + $url = rtrim($url, '&'); + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/CreateRecurringInvoiceIntent.php b/app/Ninja/Intents/WebApp/CreateRecurringInvoiceIntent.php new file mode 100644 index 000000000000..db09f8ff4778 --- /dev/null +++ b/app/Ninja/Intents/WebApp/CreateRecurringInvoiceIntent.php @@ -0,0 +1,25 @@ +requestClient(); + $clientPublicId = $client ? $client->public_id : null; + + //$invoiceItems = $this->requestInvoiceItems(); + + $url = '/recurring_invoices/create/' . $clientPublicId . '?'; + $url .= $this->requestFieldsAsString(Invoice::$requestFields); + + $url = rtrim($url, '?'); + $url = rtrim($url, '&'); + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/CreateTaskIntent.php b/app/Ninja/Intents/WebApp/CreateTaskIntent.php new file mode 100644 index 000000000000..b1ff8266d40e --- /dev/null +++ b/app/Ninja/Intents/WebApp/CreateTaskIntent.php @@ -0,0 +1,21 @@ +requestClient(); + $clientPublicId = $client ? $client->public_id : null; + + //$invoiceItems = $this->requestInvoiceItems(); + + $url = '/tasks/create/' . $clientPublicId . '?'; + //$url .= $this->requestFieldsAsString(Invoice::$requestFields); + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/CreateVendorIntent.php b/app/Ninja/Intents/WebApp/CreateVendorIntent.php new file mode 100644 index 000000000000..ef187567e70b --- /dev/null +++ b/app/Ninja/Intents/WebApp/CreateVendorIntent.php @@ -0,0 +1,18 @@ +requestFieldsAsString(Invoice::$requestFields); + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/FindClientIntent.php b/app/Ninja/Intents/WebApp/FindClientIntent.php new file mode 100644 index 000000000000..baa438193921 --- /dev/null +++ b/app/Ninja/Intents/WebApp/FindClientIntent.php @@ -0,0 +1,17 @@ +requestClient(); + + $url = $client ? $client->present()->url : '/clients'; + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/FindInvoiceIntent.php b/app/Ninja/Intents/WebApp/FindInvoiceIntent.php new file mode 100644 index 000000000000..158cdd023482 --- /dev/null +++ b/app/Ninja/Intents/WebApp/FindInvoiceIntent.php @@ -0,0 +1,17 @@ +requestInvoice(); + + $url = $invoice ? $invoice->present()->url : '/invoices'; + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/FindQuoteIntent.php b/app/Ninja/Intents/WebApp/FindQuoteIntent.php new file mode 100644 index 000000000000..0222c15dddc3 --- /dev/null +++ b/app/Ninja/Intents/WebApp/FindQuoteIntent.php @@ -0,0 +1,17 @@ +requestInvoice(); + + $url = $invoice ? $invoice->present()->url : '/quotes'; + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/ListClientIntent.php b/app/Ninja/Intents/WebApp/ListClientIntent.php new file mode 100644 index 000000000000..6cb087d2af59 --- /dev/null +++ b/app/Ninja/Intents/WebApp/ListClientIntent.php @@ -0,0 +1,15 @@ +loadStates(ENTITY_CLIENT); + + return redirect('/clients'); + } +} diff --git a/app/Ninja/Intents/WebApp/ListCreditIntent.php b/app/Ninja/Intents/WebApp/ListCreditIntent.php new file mode 100644 index 000000000000..dadc36080189 --- /dev/null +++ b/app/Ninja/Intents/WebApp/ListCreditIntent.php @@ -0,0 +1,21 @@ +loadStates(ENTITY_CREDIT); + + if ($client = $this->requestClient()) { + $url = $client->present()->url . '#credits'; + } else { + $url = '/credits'; + } + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/ListExpenseIntent.php b/app/Ninja/Intents/WebApp/ListExpenseIntent.php new file mode 100644 index 000000000000..5b6e6f7dff3c --- /dev/null +++ b/app/Ninja/Intents/WebApp/ListExpenseIntent.php @@ -0,0 +1,15 @@ +loadStates(ENTITY_EXPENSE); + + return redirect('/expenses'); + } +} diff --git a/app/Ninja/Intents/WebApp/ListInvoiceIntent.php b/app/Ninja/Intents/WebApp/ListInvoiceIntent.php new file mode 100644 index 000000000000..339493bb00f9 --- /dev/null +++ b/app/Ninja/Intents/WebApp/ListInvoiceIntent.php @@ -0,0 +1,22 @@ +loadStates(ENTITY_INVOICE); + $this->loadStatuses(ENTITY_INVOICE); + + if ($client = $this->requestClient()) { + $url = $client->present()->url . '#invoices'; + } else { + $url = '/invoices'; + } + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/ListPaymentIntent.php b/app/Ninja/Intents/WebApp/ListPaymentIntent.php new file mode 100644 index 000000000000..a545bd8559b3 --- /dev/null +++ b/app/Ninja/Intents/WebApp/ListPaymentIntent.php @@ -0,0 +1,21 @@ +loadStates(ENTITY_PAYMENT); + + if ($client = $this->requestClient()) { + $url = $client->present()->url . '#payments'; + } else { + $url = '/payments'; + } + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/ListProductIntent.php b/app/Ninja/Intents/WebApp/ListProductIntent.php new file mode 100644 index 000000000000..70bfac9c6703 --- /dev/null +++ b/app/Ninja/Intents/WebApp/ListProductIntent.php @@ -0,0 +1,15 @@ +loadStates(ENTITY_PRODUCT); + + return redirect('/products'); + } +} diff --git a/app/Ninja/Intents/WebApp/ListQuoteIntent.php b/app/Ninja/Intents/WebApp/ListQuoteIntent.php new file mode 100644 index 000000000000..1867d34e0dfe --- /dev/null +++ b/app/Ninja/Intents/WebApp/ListQuoteIntent.php @@ -0,0 +1,22 @@ +loadStates(ENTITY_QUOTE); + $this->loadStatuses(ENTITY_QUOTE); + + if ($client = $this->requestClient()) { + $url = $client->present()->url . '#quotes'; + } else { + $url = '/quotes'; + } + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/ListRecurringInvoiceIntent.php b/app/Ninja/Intents/WebApp/ListRecurringInvoiceIntent.php new file mode 100644 index 000000000000..d8823dd7bbcb --- /dev/null +++ b/app/Ninja/Intents/WebApp/ListRecurringInvoiceIntent.php @@ -0,0 +1,21 @@ +loadStates(ENTITY_RECURRING_INVOICE); + + if ($client = $this->requestClient()) { + $url = $client->present()->url . '#recurring_invoices'; + } else { + $url = '/recurring_invoices'; + } + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/ListTaskIntent.php b/app/Ninja/Intents/WebApp/ListTaskIntent.php new file mode 100644 index 000000000000..05574761c836 --- /dev/null +++ b/app/Ninja/Intents/WebApp/ListTaskIntent.php @@ -0,0 +1,21 @@ +loadStates(ENTITY_TASK); + + if ($client = $this->requestClient()) { + $url = $client->present()->url . '#tasks'; + } else { + $url = '/tasks'; + } + + return redirect($url); + } +} diff --git a/app/Ninja/Intents/WebApp/ListVendorIntent.php b/app/Ninja/Intents/WebApp/ListVendorIntent.php new file mode 100644 index 000000000000..0b98d5cbdd3c --- /dev/null +++ b/app/Ninja/Intents/WebApp/ListVendorIntent.php @@ -0,0 +1,15 @@ +loadStates(ENTITY_VENDOR); + + return redirect('/vendors'); + } +} diff --git a/app/Ninja/Intents/WebApp/NavigateToIntent.php b/app/Ninja/Intents/WebApp/NavigateToIntent.php new file mode 100644 index 000000000000..53ea8f72caeb --- /dev/null +++ b/app/Ninja/Intents/WebApp/NavigateToIntent.php @@ -0,0 +1,27 @@ +getField('Location'); + $location = str_replace(' ', '_', $location); + + if (in_array($location, array_merge(Account::$basicSettings, Account::$advancedSettings))) { + $location = '/settings/' . $location; + } elseif (in_array($location, ['report', 'reports'])) { + $location = '/reports'; + } elseif ($location == 'settings') { + $location = '/settings'; + } else { + $location = '/dashboard'; + } + + return redirect($location); + } +} diff --git a/app/Ninja/Repositories/InvoiceRepository.php b/app/Ninja/Repositories/InvoiceRepository.php index 7bed6377013a..0a6ea25ec70c 100644 --- a/app/Ninja/Repositories/InvoiceRepository.php +++ b/app/Ninja/Repositories/InvoiceRepository.php @@ -211,7 +211,6 @@ class InvoiceRepository extends BaseRepository ->where('clients.deleted_at', '=', null) ->where('invoices.is_recurring', '=', true) ->where('invoices.is_public', '=', true) - ->whereIn('invoices.auto_bill', [AUTO_BILL_OPT_IN, AUTO_BILL_OPT_OUT]) //->where('invoices.start_date', '>=', date('Y-m-d H:i:s')) ->select( DB::raw('COALESCE(clients.currency_id, accounts.currency_id) currency_id'), @@ -225,6 +224,7 @@ class InvoiceRepository extends BaseRepository 'invoices.amount', 'invoices.start_date', 'invoices.end_date', + 'invoices.auto_bill', 'invoices.client_enable_auto_bill', 'frequencies.name as frequency' ); @@ -243,7 +243,11 @@ class InvoiceRepository extends BaseRepository return Utils::formatMoney($model->amount, $model->currency_id, $model->country_id); }) ->addColumn('client_enable_auto_bill', function ($model) { - if ($model->client_enable_auto_bill) { + if ($model->auto_bill == AUTO_BILL_OFF) { + return trans('texts.disabled'); + } elseif ($model->auto_bill == AUTO_BILL_ALWAYS) { + return trans('texts.enabled'); + } elseif ($model->client_enable_auto_bill) { return trans('texts.enabled') . ' - '.trans('texts.disable').''; } else { return trans('texts.disabled') . ' - '.trans('texts.enable').''; @@ -1122,4 +1126,26 @@ class InvoiceRepository extends BaseRepository $this->save($data, $invoice); $invoice->load('invoice_items'); } + + public function findPhonetically($invoiceNumber) + { + $map = []; + $max = SIMILAR_MIN_THRESHOLD; + $invoiceId = 0; + + $invoices = Invoice::scope()->get(['id', 'invoice_number', 'public_id']); + + foreach ($invoices as $invoice) { + $map[$invoice->id] = $invoice; + $similar = similar_text($invoiceNumber, $invoice->invoice_number, $percent); + var_dump($similar); + if ($percent > $max) { + $invoiceId = $invoice->id; + $max = $percent; + } + } + + return ($invoiceId && isset($map[$invoiceId])) ? $map[$invoiceId] : null; + } + } diff --git a/database/seeds/CurrenciesSeeder.php b/database/seeds/CurrenciesSeeder.php index 5e6ed9039691..b4051e16a242 100644 --- a/database/seeds/CurrenciesSeeder.php +++ b/database/seeds/CurrenciesSeeder.php @@ -68,6 +68,7 @@ class CurrenciesSeeder extends Seeder ['name' => 'Mozambican Metical', 'code' => 'MZN', 'symbol' => 'MT', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ',', 'swap_currency_symbol' => true], ['name' => 'Omani Rial', 'code' => 'OMR', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'], ['name' => 'Ukrainian Hryvnia', 'code' => 'UAH', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'], + ['name' => 'Macanese Pataca', 'code' => 'MOP', 'symbol' => 'MOP$', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'], ]; foreach ($currencies as $currency) { diff --git a/database/seeds/PaymentTypesSeeder.php b/database/seeds/PaymentTypesSeeder.php index 8b39c26b0c04..0d50023db7ca 100644 --- a/database/seeds/PaymentTypesSeeder.php +++ b/database/seeds/PaymentTypesSeeder.php @@ -34,6 +34,7 @@ class PaymentTypesSeeder extends Seeder ['name' => 'Switch', 'gateway_type_id' => GATEWAY_TYPE_CREDIT_CARD], ['name' => 'iZettle', 'gateway_type_id' => GATEWAY_TYPE_CREDIT_CARD], ['name' => 'Swish', 'gateway_type_id' => GATEWAY_TYPE_BANK_TRANSFER], + ['name' => 'Venmo'], ]; foreach ($paymentTypes as $paymentType) { diff --git a/database/setup.sql b/database/setup.sql index cf63b132b74d..ebe86b7c7fc7 100644 --- a/database/setup.sql +++ b/database/setup.sql @@ -831,7 +831,7 @@ CREATE TABLE `currencies` ( `code` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `swap_currency_symbol` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; +) ENGINE=InnoDB AUTO_INCREMENT=60 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -840,7 +840,7 @@ CREATE TABLE `currencies` ( LOCK TABLES `currencies` WRITE; /*!40000 ALTER TABLE `currencies` DISABLE KEYS */; -INSERT INTO `currencies` VALUES (1,'US Dollar','$','2',',','.','USD',0),(2,'British Pound','£','2',',','.','GBP',0),(3,'Euro','€','2','.',',','EUR',0),(4,'South African Rand','R','2','.',',','ZAR',0),(5,'Danish Krone','kr','2','.',',','DKK',1),(6,'Israeli Shekel','NIS ','2',',','.','ILS',0),(7,'Swedish Krona','kr','2','.',',','SEK',1),(8,'Kenyan Shilling','KSh ','2',',','.','KES',0),(9,'Canadian Dollar','C$','2',',','.','CAD',0),(10,'Philippine Peso','P ','2',',','.','PHP',0),(11,'Indian Rupee','Rs. ','2',',','.','INR',0),(12,'Australian Dollar','$','2',',','.','AUD',0),(13,'Singapore Dollar','','2',',','.','SGD',0),(14,'Norske Kroner','kr','2','.',',','NOK',1),(15,'New Zealand Dollar','$','2',',','.','NZD',0),(16,'Vietnamese Dong','','0','.',',','VND',0),(17,'Swiss Franc','','2','\'','.','CHF',0),(18,'Guatemalan Quetzal','Q','2',',','.','GTQ',0),(19,'Malaysian Ringgit','RM','2',',','.','MYR',0),(20,'Brazilian Real','R$','2','.',',','BRL',0),(21,'Thai Baht','','2',',','.','THB',0),(22,'Nigerian Naira','','2',',','.','NGN',0),(23,'Argentine Peso','$','2','.',',','ARS',0),(24,'Bangladeshi Taka','Tk','2',',','.','BDT',0),(25,'United Arab Emirates Dirham','DH ','2',',','.','AED',0),(26,'Hong Kong Dollar','','2',',','.','HKD',0),(27,'Indonesian Rupiah','Rp','2',',','.','IDR',0),(28,'Mexican Peso','$','2',',','.','MXN',0),(29,'Egyptian Pound','E£','2',',','.','EGP',0),(30,'Colombian Peso','$','2','.',',','COP',0),(31,'West African Franc','CFA ','2',',','.','XOF',0),(32,'Chinese Renminbi','RMB ','2',',','.','CNY',0),(33,'Rwandan Franc','RF ','2',',','.','RWF',0),(34,'Tanzanian Shilling','TSh ','2',',','.','TZS',0),(35,'Netherlands Antillean Guilder','','2','.',',','ANG',0),(36,'Trinidad and Tobago Dollar','TT$','2',',','.','TTD',0),(37,'East Caribbean Dollar','EC$','2',',','.','XCD',0),(38,'Ghanaian Cedi','','2',',','.','GHS',0),(39,'Bulgarian Lev','','2',' ','.','BGN',0),(40,'Aruban Florin','Afl. ','2',' ','.','AWG',0),(41,'Turkish Lira','TL ','2','.',',','TRY',0),(42,'Romanian New Leu','','2',',','.','RON',0),(43,'Croatian Kuna','kn','2','.',',','HRK',0),(44,'Saudi Riyal','','2',',','.','SAR',0),(45,'Japanese Yen','¥','0',',','.','JPY',0),(46,'Maldivian Rufiyaa','','2',',','.','MVR',0),(47,'Costa Rican Colón','','2',',','.','CRC',0),(48,'Pakistani Rupee','Rs ','0',',','.','PKR',0),(49,'Polish Zloty','zł','2',' ',',','PLN',1),(50,'Sri Lankan Rupee','LKR','2',',','.','LKR',1),(51,'Czech Koruna','Kč','2',' ',',','CZK',1),(52,'Uruguayan Peso','$','2','.',',','UYU',0),(53,'Namibian Dollar','$','2',',','.','NAD',0),(54,'Tunisian Dinar','','2',',','.','TND',0),(55,'Russian Ruble','','2',',','.','RUB',0),(56,'Mozambican Metical','MT','2','.',',','MZN',1),(57,'Omani Rial','','2',',','.','OMR',0),(58,'Ukrainian Hryvnia','','2',',','.','UAH',0); +INSERT INTO `currencies` VALUES (1,'US Dollar','$','2',',','.','USD',0),(2,'British Pound','£','2',',','.','GBP',0),(3,'Euro','€','2','.',',','EUR',0),(4,'South African Rand','R','2','.',',','ZAR',0),(5,'Danish Krone','kr','2','.',',','DKK',1),(6,'Israeli Shekel','NIS ','2',',','.','ILS',0),(7,'Swedish Krona','kr','2','.',',','SEK',1),(8,'Kenyan Shilling','KSh ','2',',','.','KES',0),(9,'Canadian Dollar','C$','2',',','.','CAD',0),(10,'Philippine Peso','P ','2',',','.','PHP',0),(11,'Indian Rupee','Rs. ','2',',','.','INR',0),(12,'Australian Dollar','$','2',',','.','AUD',0),(13,'Singapore Dollar','','2',',','.','SGD',0),(14,'Norske Kroner','kr','2','.',',','NOK',1),(15,'New Zealand Dollar','$','2',',','.','NZD',0),(16,'Vietnamese Dong','','0','.',',','VND',0),(17,'Swiss Franc','','2','\'','.','CHF',0),(18,'Guatemalan Quetzal','Q','2',',','.','GTQ',0),(19,'Malaysian Ringgit','RM','2',',','.','MYR',0),(20,'Brazilian Real','R$','2','.',',','BRL',0),(21,'Thai Baht','','2',',','.','THB',0),(22,'Nigerian Naira','','2',',','.','NGN',0),(23,'Argentine Peso','$','2','.',',','ARS',0),(24,'Bangladeshi Taka','Tk','2',',','.','BDT',0),(25,'United Arab Emirates Dirham','DH ','2',',','.','AED',0),(26,'Hong Kong Dollar','','2',',','.','HKD',0),(27,'Indonesian Rupiah','Rp','2',',','.','IDR',0),(28,'Mexican Peso','$','2',',','.','MXN',0),(29,'Egyptian Pound','E£','2',',','.','EGP',0),(30,'Colombian Peso','$','2','.',',','COP',0),(31,'West African Franc','CFA ','2',',','.','XOF',0),(32,'Chinese Renminbi','RMB ','2',',','.','CNY',0),(33,'Rwandan Franc','RF ','2',',','.','RWF',0),(34,'Tanzanian Shilling','TSh ','2',',','.','TZS',0),(35,'Netherlands Antillean Guilder','','2','.',',','ANG',0),(36,'Trinidad and Tobago Dollar','TT$','2',',','.','TTD',0),(37,'East Caribbean Dollar','EC$','2',',','.','XCD',0),(38,'Ghanaian Cedi','','2',',','.','GHS',0),(39,'Bulgarian Lev','','2',' ','.','BGN',0),(40,'Aruban Florin','Afl. ','2',' ','.','AWG',0),(41,'Turkish Lira','TL ','2','.',',','TRY',0),(42,'Romanian New Leu','','2',',','.','RON',0),(43,'Croatian Kuna','kn','2','.',',','HRK',0),(44,'Saudi Riyal','','2',',','.','SAR',0),(45,'Japanese Yen','¥','0',',','.','JPY',0),(46,'Maldivian Rufiyaa','','2',',','.','MVR',0),(47,'Costa Rican Colón','','2',',','.','CRC',0),(48,'Pakistani Rupee','Rs ','0',',','.','PKR',0),(49,'Polish Zloty','zł','2',' ',',','PLN',1),(50,'Sri Lankan Rupee','LKR','2',',','.','LKR',1),(51,'Czech Koruna','Kč','2',' ',',','CZK',1),(52,'Uruguayan Peso','$','2','.',',','UYU',0),(53,'Namibian Dollar','$','2',',','.','NAD',0),(54,'Tunisian Dinar','','2',',','.','TND',0),(55,'Russian Ruble','','2',',','.','RUB',0),(56,'Mozambican Metical','MT','2','.',',','MZN',1),(57,'Omani Rial','','2',',','.','OMR',0),(58,'Ukrainian Hryvnia','','2',',','.','UAH',0),(59,'Macanese Pataca','MOP$','2',',','.','MOP',0); /*!40000 ALTER TABLE `currencies` ENABLE KEYS */; UNLOCK TABLES; @@ -1176,7 +1176,7 @@ CREATE TABLE `gateways` ( LOCK TABLES `gateways` WRITE; /*!40000 ALTER TABLE `gateways` DISABLE KEYS */; -INSERT INTO `gateways` VALUES (1,'2017-04-02 16:31:14','2017-04-02 16:31:14','Authorize.Net AIM','AuthorizeNet_AIM',1,1,4,0,NULL,0,0),(2,'2017-04-02 16:31:14','2017-04-02 16:31:14','Authorize.Net SIM','AuthorizeNet_SIM',1,2,10000,0,NULL,0,0),(3,'2017-04-02 16:31:14','2017-04-02 16:31:14','CardSave','CardSave',1,1,10000,0,NULL,0,0),(4,'2017-04-02 16:31:14','2017-04-02 16:31:14','Eway Rapid','Eway_RapidShared',1,1,10000,0,NULL,1,0),(5,'2017-04-02 16:31:14','2017-04-02 16:31:14','FirstData Connect','FirstData_Connect',1,1,10000,0,NULL,0,0),(6,'2017-04-02 16:31:14','2017-04-02 16:31:14','GoCardless','GoCardless',1,1,10000,0,NULL,1,0),(7,'2017-04-02 16:31:14','2017-04-02 16:31:14','Migs ThreeParty','Migs_ThreeParty',1,1,10000,0,NULL,0,0),(8,'2017-04-02 16:31:14','2017-04-02 16:31:14','Migs TwoParty','Migs_TwoParty',1,1,10000,0,NULL,0,0),(9,'2017-04-02 16:31:14','2017-04-02 16:31:14','Mollie','Mollie',1,1,7,0,NULL,1,0),(10,'2017-04-02 16:31:14','2017-04-02 16:31:14','MultiSafepay','MultiSafepay',1,1,10000,0,NULL,0,0),(11,'2017-04-02 16:31:14','2017-04-02 16:31:14','Netaxept','Netaxept',1,1,10000,0,NULL,0,0),(12,'2017-04-02 16:31:14','2017-04-02 16:31:14','NetBanx','NetBanx',1,1,10000,0,NULL,0,0),(13,'2017-04-02 16:31:14','2017-04-02 16:31:14','PayFast','PayFast',1,1,10000,0,NULL,1,0),(14,'2017-04-02 16:31:14','2017-04-02 16:31:14','Payflow Pro','Payflow_Pro',1,1,10000,0,NULL,0,0),(15,'2017-04-02 16:31:14','2017-04-02 16:31:14','PaymentExpress PxPay','PaymentExpress_PxPay',1,1,10000,0,NULL,0,0),(16,'2017-04-02 16:31:14','2017-04-02 16:31:14','PaymentExpress PxPost','PaymentExpress_PxPost',1,1,10000,0,NULL,0,0),(17,'2017-04-02 16:31:14','2017-04-02 16:31:14','PayPal Express','PayPal_Express',1,1,3,0,NULL,1,0),(18,'2017-04-02 16:31:14','2017-04-02 16:31:14','PayPal Pro','PayPal_Pro',1,1,10000,0,NULL,0,0),(19,'2017-04-02 16:31:14','2017-04-02 16:31:14','Pin','Pin',1,1,10000,0,NULL,0,0),(20,'2017-04-02 16:31:14','2017-04-02 16:31:14','SagePay Direct','SagePay_Direct',1,1,10000,0,NULL,0,0),(21,'2017-04-02 16:31:14','2017-04-02 16:31:14','SagePay Server','SagePay_Server',1,1,10000,0,NULL,0,0),(22,'2017-04-02 16:31:14','2017-04-02 16:31:14','SecurePay DirectPost','SecurePay_DirectPost',1,1,10000,0,NULL,0,0),(23,'2017-04-02 16:31:14','2017-04-02 16:31:14','Stripe','Stripe',1,1,1,0,NULL,0,0),(24,'2017-04-02 16:31:14','2017-04-02 16:31:14','TargetPay Direct eBanking','TargetPay_Directebanking',1,1,10000,0,NULL,0,0),(25,'2017-04-02 16:31:14','2017-04-02 16:31:14','TargetPay Ideal','TargetPay_Ideal',1,1,10000,0,NULL,0,0),(26,'2017-04-02 16:31:14','2017-04-02 16:31:14','TargetPay Mr Cash','TargetPay_Mrcash',1,1,10000,0,NULL,0,0),(27,'2017-04-02 16:31:14','2017-04-02 16:31:14','TwoCheckout','TwoCheckout',1,1,10000,0,NULL,1,0),(28,'2017-04-02 16:31:14','2017-04-02 16:31:14','WorldPay','WorldPay',1,1,10000,0,NULL,0,0),(29,'2017-04-02 16:31:14','2017-04-02 16:31:14','BeanStream','BeanStream',1,2,10000,0,NULL,0,0),(30,'2017-04-02 16:31:14','2017-04-02 16:31:14','Psigate','Psigate',1,2,10000,0,NULL,0,0),(31,'2017-04-02 16:31:14','2017-04-02 16:31:14','moolah','AuthorizeNet_AIM',1,1,10000,0,NULL,0,0),(32,'2017-04-02 16:31:14','2017-04-02 16:31:14','Alipay','Alipay_Express',1,1,10000,0,NULL,0,0),(33,'2017-04-02 16:31:14','2017-04-02 16:31:14','Buckaroo','Buckaroo_CreditCard',1,1,10000,0,NULL,0,0),(34,'2017-04-02 16:31:14','2017-04-02 16:31:14','Coinbase','Coinbase',1,1,10000,0,NULL,0,0),(35,'2017-04-02 16:31:14','2017-04-02 16:31:14','DataCash','DataCash',1,1,10000,0,NULL,0,0),(36,'2017-04-02 16:31:14','2017-04-02 16:31:14','Neteller','Neteller',1,2,10000,0,NULL,0,0),(37,'2017-04-02 16:31:14','2017-04-02 16:31:14','Pacnet','Pacnet',1,1,10000,0,NULL,0,0),(38,'2017-04-02 16:31:14','2017-04-02 16:31:14','PaymentSense','PaymentSense',1,2,10000,0,NULL,0,0),(39,'2017-04-02 16:31:14','2017-04-02 16:31:14','Realex','Realex_Remote',1,1,10000,0,NULL,0,0),(40,'2017-04-02 16:31:14','2017-04-02 16:31:14','Sisow','Sisow',1,1,10000,0,NULL,0,0),(41,'2017-04-02 16:31:14','2017-04-02 16:31:14','Skrill','Skrill',1,1,10000,0,NULL,1,0),(42,'2017-04-02 16:31:14','2017-04-02 16:31:14','BitPay','BitPay',1,1,6,0,NULL,1,0),(43,'2017-04-02 16:31:14','2017-04-02 16:31:14','Dwolla','Dwolla',1,1,5,0,NULL,1,0),(44,'2017-04-02 16:31:14','2017-04-02 16:31:14','AGMS','Agms',1,1,10000,0,NULL,0,0),(45,'2017-04-02 16:31:14','2017-04-02 16:31:14','Barclays','BarclaysEpdq\\Essential',1,1,10000,0,NULL,0,0),(46,'2017-04-02 16:31:14','2017-04-02 16:31:14','Cardgate','Cardgate',1,1,10000,0,NULL,0,0),(47,'2017-04-02 16:31:14','2017-04-02 16:31:14','Checkout.com','CheckoutCom',1,1,10000,0,NULL,0,0),(48,'2017-04-02 16:31:14','2017-04-02 16:31:14','Creditcall','Creditcall',1,1,10000,0,NULL,0,0),(49,'2017-04-02 16:31:14','2017-04-02 16:31:14','Cybersource','Cybersource',1,1,10000,0,NULL,0,0),(50,'2017-04-02 16:31:14','2017-04-02 16:31:14','ecoPayz','Ecopayz',1,1,10000,0,NULL,0,0),(51,'2017-04-02 16:31:14','2017-04-02 16:31:14','Fasapay','Fasapay',1,1,10000,0,NULL,0,0),(52,'2017-04-02 16:31:14','2017-04-02 16:31:14','Komoju','Komoju',1,1,10000,0,NULL,0,0),(53,'2017-04-02 16:31:14','2017-04-02 16:31:14','Multicards','Multicards',1,1,10000,0,NULL,0,0),(54,'2017-04-02 16:31:14','2017-04-02 16:31:14','Pagar.Me','Pagarme',1,2,10000,0,NULL,0,0),(55,'2017-04-02 16:31:14','2017-04-02 16:31:14','Paysafecard','Paysafecard',1,1,10000,0,NULL,0,0),(56,'2017-04-02 16:31:14','2017-04-02 16:31:14','Paytrace','Paytrace_CreditCard',1,1,10000,0,NULL,0,0),(57,'2017-04-02 16:31:14','2017-04-02 16:31:14','Secure Trading','SecureTrading',1,1,10000,0,NULL,0,0),(58,'2017-04-02 16:31:14','2017-04-02 16:31:14','SecPay','SecPay',1,1,10000,0,NULL,0,0),(59,'2017-04-02 16:31:14','2017-04-02 16:31:14','WeChat Express','WeChat_Express',1,2,10000,0,NULL,0,0),(60,'2017-04-02 16:31:14','2017-04-02 16:31:14','WePay','WePay',1,1,10000,0,NULL,0,0),(61,'2017-04-02 16:31:14','2017-04-02 16:31:14','Braintree','Braintree',1,1,2,0,NULL,0,0),(62,'2017-04-02 16:31:14','2017-04-02 16:31:14','Custom','Custom',1,1,8,0,NULL,1,0); +INSERT INTO `gateways` VALUES (1,'2017-04-06 10:56:18','2017-04-06 10:56:18','Authorize.Net AIM','AuthorizeNet_AIM',1,1,4,0,NULL,0,0),(2,'2017-04-06 10:56:18','2017-04-06 10:56:18','Authorize.Net SIM','AuthorizeNet_SIM',1,2,10000,0,NULL,0,0),(3,'2017-04-06 10:56:18','2017-04-06 10:56:18','CardSave','CardSave',1,1,10000,0,NULL,0,0),(4,'2017-04-06 10:56:18','2017-04-06 10:56:18','Eway Rapid','Eway_RapidShared',1,1,10000,0,NULL,1,0),(5,'2017-04-06 10:56:18','2017-04-06 10:56:18','FirstData Connect','FirstData_Connect',1,1,10000,0,NULL,0,0),(6,'2017-04-06 10:56:18','2017-04-06 10:56:18','GoCardless','GoCardless',1,1,10000,0,NULL,1,0),(7,'2017-04-06 10:56:18','2017-04-06 10:56:18','Migs ThreeParty','Migs_ThreeParty',1,1,10000,0,NULL,0,0),(8,'2017-04-06 10:56:18','2017-04-06 10:56:18','Migs TwoParty','Migs_TwoParty',1,1,10000,0,NULL,0,0),(9,'2017-04-06 10:56:18','2017-04-06 10:56:18','Mollie','Mollie',1,1,7,0,NULL,1,0),(10,'2017-04-06 10:56:18','2017-04-06 10:56:18','MultiSafepay','MultiSafepay',1,1,10000,0,NULL,0,0),(11,'2017-04-06 10:56:18','2017-04-06 10:56:18','Netaxept','Netaxept',1,1,10000,0,NULL,0,0),(12,'2017-04-06 10:56:18','2017-04-06 10:56:18','NetBanx','NetBanx',1,1,10000,0,NULL,0,0),(13,'2017-04-06 10:56:18','2017-04-06 10:56:18','PayFast','PayFast',1,1,10000,0,NULL,1,0),(14,'2017-04-06 10:56:18','2017-04-06 10:56:18','Payflow Pro','Payflow_Pro',1,1,10000,0,NULL,0,0),(15,'2017-04-06 10:56:18','2017-04-06 10:56:18','PaymentExpress PxPay','PaymentExpress_PxPay',1,1,10000,0,NULL,0,0),(16,'2017-04-06 10:56:18','2017-04-06 10:56:18','PaymentExpress PxPost','PaymentExpress_PxPost',1,1,10000,0,NULL,0,0),(17,'2017-04-06 10:56:18','2017-04-06 10:56:18','PayPal Express','PayPal_Express',1,1,3,0,NULL,1,0),(18,'2017-04-06 10:56:18','2017-04-06 10:56:18','PayPal Pro','PayPal_Pro',1,1,10000,0,NULL,0,0),(19,'2017-04-06 10:56:18','2017-04-06 10:56:18','Pin','Pin',1,1,10000,0,NULL,0,0),(20,'2017-04-06 10:56:18','2017-04-06 10:56:18','SagePay Direct','SagePay_Direct',1,1,10000,0,NULL,0,0),(21,'2017-04-06 10:56:18','2017-04-06 10:56:18','SagePay Server','SagePay_Server',1,1,10000,0,NULL,0,0),(22,'2017-04-06 10:56:18','2017-04-06 10:56:18','SecurePay DirectPost','SecurePay_DirectPost',1,1,10000,0,NULL,0,0),(23,'2017-04-06 10:56:18','2017-04-06 10:56:18','Stripe','Stripe',1,1,1,0,NULL,0,0),(24,'2017-04-06 10:56:18','2017-04-06 10:56:18','TargetPay Direct eBanking','TargetPay_Directebanking',1,1,10000,0,NULL,0,0),(25,'2017-04-06 10:56:18','2017-04-06 10:56:18','TargetPay Ideal','TargetPay_Ideal',1,1,10000,0,NULL,0,0),(26,'2017-04-06 10:56:19','2017-04-06 10:56:19','TargetPay Mr Cash','TargetPay_Mrcash',1,1,10000,0,NULL,0,0),(27,'2017-04-06 10:56:19','2017-04-06 10:56:19','TwoCheckout','TwoCheckout',1,1,10000,0,NULL,1,0),(28,'2017-04-06 10:56:19','2017-04-06 10:56:19','WorldPay','WorldPay',1,1,10000,0,NULL,0,0),(29,'2017-04-06 10:56:19','2017-04-06 10:56:19','BeanStream','BeanStream',1,2,10000,0,NULL,0,0),(30,'2017-04-06 10:56:19','2017-04-06 10:56:19','Psigate','Psigate',1,2,10000,0,NULL,0,0),(31,'2017-04-06 10:56:19','2017-04-06 10:56:19','moolah','AuthorizeNet_AIM',1,1,10000,0,NULL,0,0),(32,'2017-04-06 10:56:19','2017-04-06 10:56:19','Alipay','Alipay_Express',1,1,10000,0,NULL,0,0),(33,'2017-04-06 10:56:19','2017-04-06 10:56:19','Buckaroo','Buckaroo_CreditCard',1,1,10000,0,NULL,0,0),(34,'2017-04-06 10:56:19','2017-04-06 10:56:19','Coinbase','Coinbase',1,1,10000,0,NULL,0,0),(35,'2017-04-06 10:56:19','2017-04-06 10:56:19','DataCash','DataCash',1,1,10000,0,NULL,0,0),(36,'2017-04-06 10:56:19','2017-04-06 10:56:19','Neteller','Neteller',1,2,10000,0,NULL,0,0),(37,'2017-04-06 10:56:19','2017-04-06 10:56:19','Pacnet','Pacnet',1,1,10000,0,NULL,0,0),(38,'2017-04-06 10:56:19','2017-04-06 10:56:19','PaymentSense','PaymentSense',1,2,10000,0,NULL,0,0),(39,'2017-04-06 10:56:19','2017-04-06 10:56:19','Realex','Realex_Remote',1,1,10000,0,NULL,0,0),(40,'2017-04-06 10:56:19','2017-04-06 10:56:19','Sisow','Sisow',1,1,10000,0,NULL,0,0),(41,'2017-04-06 10:56:19','2017-04-06 10:56:19','Skrill','Skrill',1,1,10000,0,NULL,1,0),(42,'2017-04-06 10:56:19','2017-04-06 10:56:19','BitPay','BitPay',1,1,6,0,NULL,1,0),(43,'2017-04-06 10:56:19','2017-04-06 10:56:19','Dwolla','Dwolla',1,1,5,0,NULL,1,0),(44,'2017-04-06 10:56:19','2017-04-06 10:56:19','AGMS','Agms',1,1,10000,0,NULL,0,0),(45,'2017-04-06 10:56:19','2017-04-06 10:56:19','Barclays','BarclaysEpdq\\Essential',1,1,10000,0,NULL,0,0),(46,'2017-04-06 10:56:19','2017-04-06 10:56:19','Cardgate','Cardgate',1,1,10000,0,NULL,0,0),(47,'2017-04-06 10:56:19','2017-04-06 10:56:19','Checkout.com','CheckoutCom',1,1,10000,0,NULL,0,0),(48,'2017-04-06 10:56:19','2017-04-06 10:56:19','Creditcall','Creditcall',1,1,10000,0,NULL,0,0),(49,'2017-04-06 10:56:19','2017-04-06 10:56:19','Cybersource','Cybersource',1,1,10000,0,NULL,0,0),(50,'2017-04-06 10:56:19','2017-04-06 10:56:19','ecoPayz','Ecopayz',1,1,10000,0,NULL,0,0),(51,'2017-04-06 10:56:19','2017-04-06 10:56:19','Fasapay','Fasapay',1,1,10000,0,NULL,0,0),(52,'2017-04-06 10:56:19','2017-04-06 10:56:19','Komoju','Komoju',1,1,10000,0,NULL,0,0),(53,'2017-04-06 10:56:19','2017-04-06 10:56:19','Multicards','Multicards',1,1,10000,0,NULL,0,0),(54,'2017-04-06 10:56:19','2017-04-06 10:56:19','Pagar.Me','Pagarme',1,2,10000,0,NULL,0,0),(55,'2017-04-06 10:56:19','2017-04-06 10:56:19','Paysafecard','Paysafecard',1,1,10000,0,NULL,0,0),(56,'2017-04-06 10:56:19','2017-04-06 10:56:19','Paytrace','Paytrace_CreditCard',1,1,10000,0,NULL,0,0),(57,'2017-04-06 10:56:19','2017-04-06 10:56:19','Secure Trading','SecureTrading',1,1,10000,0,NULL,0,0),(58,'2017-04-06 10:56:19','2017-04-06 10:56:19','SecPay','SecPay',1,1,10000,0,NULL,0,0),(59,'2017-04-06 10:56:19','2017-04-06 10:56:19','WeChat Express','WeChat_Express',1,2,10000,0,NULL,0,0),(60,'2017-04-06 10:56:19','2017-04-06 10:56:19','WePay','WePay',1,1,10000,0,NULL,0,0),(61,'2017-04-06 10:56:19','2017-04-06 10:56:19','Braintree','Braintree',1,1,2,0,NULL,0,0),(62,'2017-04-06 10:56:19','2017-04-06 10:56:19','Custom','Custom',1,1,8,0,NULL,1,0); /*!40000 ALTER TABLE `gateways` ENABLE KEYS */; UNLOCK TABLES; @@ -1594,7 +1594,7 @@ CREATE TABLE `payment_libraries` ( LOCK TABLES `payment_libraries` WRITE; /*!40000 ALTER TABLE `payment_libraries` DISABLE KEYS */; -INSERT INTO `payment_libraries` VALUES (1,'2017-04-02 16:31:13','2017-04-02 16:31:13','Omnipay',1),(2,'2017-04-02 16:31:13','2017-04-02 16:31:13','PHP-Payments [Deprecated]',1); +INSERT INTO `payment_libraries` VALUES (1,'2017-04-06 10:56:17','2017-04-06 10:56:17','Omnipay',1),(2,'2017-04-06 10:56:17','2017-04-06 10:56:17','PHP-Payments [Deprecated]',1); /*!40000 ALTER TABLE `payment_libraries` ENABLE KEYS */; UNLOCK TABLES; @@ -1704,7 +1704,7 @@ CREATE TABLE `payment_terms` ( LOCK TABLES `payment_terms` WRITE; /*!40000 ALTER TABLE `payment_terms` DISABLE KEYS */; -INSERT INTO `payment_terms` VALUES (1,7,'Net 7','2017-04-02 16:31:13','2017-04-02 16:31:13',NULL,0,0,1),(2,10,'Net 10','2017-04-02 16:31:13','2017-04-02 16:31:13',NULL,0,0,2),(3,14,'Net 14','2017-04-02 16:31:13','2017-04-02 16:31:13',NULL,0,0,3),(4,15,'Net 15','2017-04-02 16:31:13','2017-04-02 16:31:13',NULL,0,0,4),(5,30,'Net 30','2017-04-02 16:31:13','2017-04-02 16:31:13',NULL,0,0,5),(6,60,'Net 60','2017-04-02 16:31:13','2017-04-02 16:31:13',NULL,0,0,6),(7,90,'Net 90','2017-04-02 16:31:13','2017-04-02 16:31:13',NULL,0,0,7),(8,-1,'Net 0','2017-04-02 16:31:16','2017-04-02 16:31:16',NULL,0,0,0); +INSERT INTO `payment_terms` VALUES (1,7,'Net 7','2017-04-06 10:56:17','2017-04-06 10:56:17',NULL,0,0,1),(2,10,'Net 10','2017-04-06 10:56:17','2017-04-06 10:56:17',NULL,0,0,2),(3,14,'Net 14','2017-04-06 10:56:17','2017-04-06 10:56:17',NULL,0,0,3),(4,15,'Net 15','2017-04-06 10:56:17','2017-04-06 10:56:17',NULL,0,0,4),(5,30,'Net 30','2017-04-06 10:56:17','2017-04-06 10:56:17',NULL,0,0,5),(6,60,'Net 60','2017-04-06 10:56:17','2017-04-06 10:56:17',NULL,0,0,6),(7,90,'Net 90','2017-04-06 10:56:17','2017-04-06 10:56:17',NULL,0,0,7),(8,-1,'Net 0','2017-04-06 10:56:22','2017-04-06 10:56:22',NULL,0,0,0); /*!40000 ALTER TABLE `payment_terms` ENABLE KEYS */; UNLOCK TABLES; @@ -1722,7 +1722,7 @@ CREATE TABLE `payment_types` ( PRIMARY KEY (`id`), KEY `payment_types_gateway_type_id_foreign` (`gateway_type_id`), CONSTRAINT `payment_types_gateway_type_id_foreign` FOREIGN KEY (`gateway_type_id`) REFERENCES `gateway_types` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; +) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -1731,7 +1731,7 @@ CREATE TABLE `payment_types` ( LOCK TABLES `payment_types` WRITE; /*!40000 ALTER TABLE `payment_types` DISABLE KEYS */; -INSERT INTO `payment_types` VALUES (1,'Apply Credit',NULL),(2,'Bank Transfer',2),(3,'Cash',NULL),(4,'Debit',1),(5,'ACH',2),(6,'Visa Card',1),(7,'MasterCard',1),(8,'American Express',1),(9,'Discover Card',1),(10,'Diners Card',1),(11,'EuroCard',1),(12,'Nova',1),(13,'Credit Card Other',1),(14,'PayPal',3),(15,'Google Wallet',NULL),(16,'Check',NULL),(17,'Carte Blanche',1),(18,'UnionPay',1),(19,'JCB',1),(20,'Laser',1),(21,'Maestro',1),(22,'Solo',1),(23,'Switch',1),(24,'iZettle',1),(25,'Swish',2); +INSERT INTO `payment_types` VALUES (1,'Apply Credit',NULL),(2,'Bank Transfer',2),(3,'Cash',NULL),(4,'Debit',1),(5,'ACH',2),(6,'Visa Card',1),(7,'MasterCard',1),(8,'American Express',1),(9,'Discover Card',1),(10,'Diners Card',1),(11,'EuroCard',1),(12,'Nova',1),(13,'Credit Card Other',1),(14,'PayPal',3),(15,'Google Wallet',NULL),(16,'Check',NULL),(17,'Carte Blanche',1),(18,'UnionPay',1),(19,'JCB',1),(20,'Laser',1),(21,'Maestro',1),(22,'Solo',1),(23,'Switch',1),(24,'iZettle',1),(25,'Swish',2),(26,'Venmo',NULL); /*!40000 ALTER TABLE `payment_types` ENABLE KEYS */; UNLOCK TABLES; @@ -2299,4 +2299,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2017-04-02 22:31:16 +-- Dump completed on 2017-04-06 16:56:22 diff --git a/docs/conf.py b/docs/conf.py index 556af9b289ae..278b9c9319cb 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -59,7 +59,7 @@ author = u'Invoice Ninja' # The short X.Y version. version = u'3.2' # The full version, including alpha/beta/rc tags. -release = u'3.2.0' +release = u'3.2.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/install.rst b/docs/install.rst index d8708539ee71..f5eb71e61b22 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -29,7 +29,7 @@ Step 1: Download the code You can either download the zip file below or checkout the code from our GitHub repository. The zip includes all third party libraries whereas using GitHub requires you to use Composer to install the dependencies. -https://download.invoiceninja.com/ninja-v3.1.3.zip +https://download.invoiceninja.com/ninja-v3.2.0.zip .. Note:: All Pro and Enterprise features from our hosted app are included in both the zip file and the GitHub repository. We offer a $20 per year white-label license to remove our branding. diff --git a/resources/lang/ca/texts.php b/resources/lang/ca/texts.php index 498255eba8b6..c57f7cbcf478 100644 --- a/resources/lang/ca/texts.php +++ b/resources/lang/ca/texts.php @@ -851,6 +851,7 @@ $LANG = array( 'dark' => 'Dark', 'industry_help' => 'Used to provide comparisons against the averages of companies of similar size and industry.', 'subdomain_help' => 'Set the subdomain or display the invoice on your own website.', + 'website_help' => 'Display the invoice in an iFrame on your own website', 'invoice_number_help' => 'Specify a prefix or use a custom pattern to dynamically set the invoice number.', 'quote_number_help' => 'Specify a prefix or use a custom pattern to dynamically set the quote number.', 'custom_client_fields_helps' => 'Add a field when creating a client and display the label and value on the PDF.', @@ -1041,7 +1042,7 @@ $LANG = array( 'invoiced_amount' => 'Invoiced Amount', 'invoice_item_fields' => 'Invoice Item Fields', 'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.', - 'recurring_invoice_number' => 'Recurring Invoice Number', + 'recurring_invoice_number' => 'Recurring Number', 'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.', // Client Passwords @@ -2463,6 +2464,12 @@ $LANG = array( 'import_complete' => 'Your import has successfully completed.', 'confirm_account_to_import' => 'Please confirm your account to import data.', 'import_started' => 'Your import has started, we\'ll send you an email once it completes.', + 'listening' => 'Listening...', + 'microphone_help' => 'Say \'new invoice for...\'', + 'voice_commands' => 'Voice Commands', + 'sample_commands' => 'Sample commands', + 'voice_commands_feedback' => 'We\'re actively working to improve this feature, if there\'s a command you\'d like us to support please email us at :email.', + 'payment_type_Venmo' => 'Venmo', ); diff --git a/resources/lang/cs/texts.php b/resources/lang/cs/texts.php index dbcfc1098752..597f9ff7ba9c 100644 --- a/resources/lang/cs/texts.php +++ b/resources/lang/cs/texts.php @@ -852,6 +852,7 @@ $LANG = array( 'dark' => 'Tmavý', 'industry_help' => 'Používá se pro porovnání proti průměru u firem podobné velikosti a podobného odvětví.', 'subdomain_help' => 'Set the subdomain or display the invoice on your own website.', + 'website_help' => 'Display the invoice in an iFrame on your own website', 'invoice_number_help' => 'Určete prefix nebo použijte upravitelný vzorec pro nastavení číslování faktur.', 'quote_number_help' => 'Určete prefix nebo použijte upravitelný vzorec pro nastavení číslování nabídek.', 'custom_client_fields_helps' => 'Když vytváříte klienta - přidejte nové pole a jeho popis a hodnotu pro zobrazení v PDF.', @@ -1043,7 +1044,7 @@ $LANG = array( 'invoiced_amount' => 'Fakturovaná částka', 'invoice_item_fields' => 'Pole položky faktury', 'custom_invoice_item_fields_help' => 'Během vytváření faktury si přidejte pole a zobrazte si jeho popis a hodnotu v PDF.', - 'recurring_invoice_number' => 'Číslo pravidelné faktury', + 'recurring_invoice_number' => 'Recurring Number', 'recurring_invoice_number_prefix_help' => 'Určete prefix, který se přidá k číslu pravidelných faktur. Výchozí hodnota je \'R\'.', // Client Passwords @@ -2465,6 +2466,12 @@ $LANG = array( 'import_complete' => 'Your import has successfully completed.', 'confirm_account_to_import' => 'Please confirm your account to import data.', 'import_started' => 'Your import has started, we\'ll send you an email once it completes.', + 'listening' => 'Listening...', + 'microphone_help' => 'Say \'new invoice for...\'', + 'voice_commands' => 'Voice Commands', + 'sample_commands' => 'Sample commands', + 'voice_commands_feedback' => 'We\'re actively working to improve this feature, if there\'s a command you\'d like us to support please email us at :email.', + 'payment_type_Venmo' => 'Venmo', ); diff --git a/resources/lang/da/texts.php b/resources/lang/da/texts.php index 335c881c47cb..ebed07af95ce 100644 --- a/resources/lang/da/texts.php +++ b/resources/lang/da/texts.php @@ -851,6 +851,7 @@ $LANG = array( 'dark' => 'Dark', 'industry_help' => 'Used to provide comparisons against the averages of companies of similar size and industry.', 'subdomain_help' => 'Set the subdomain or display the invoice on your own website.', + 'website_help' => 'Display the invoice in an iFrame on your own website', 'invoice_number_help' => 'Specify a prefix or use a custom pattern to dynamically set the invoice number.', 'quote_number_help' => 'Specify a prefix or use a custom pattern to dynamically set the quote number.', 'custom_client_fields_helps' => 'Add a text input to the client create/edit page and display the label and value on the PDF.', @@ -1041,7 +1042,7 @@ $LANG = array( 'invoiced_amount' => 'Invoiced Amount', 'invoice_item_fields' => 'Invoice Item Fields', 'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.', - 'recurring_invoice_number' => 'Recurring Invoice Number', + 'recurring_invoice_number' => 'Recurring Number', 'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.', // Client Passwords @@ -2463,6 +2464,12 @@ $LANG = array( 'import_complete' => 'Your import has successfully completed.', 'confirm_account_to_import' => 'Please confirm your account to import data.', 'import_started' => 'Your import has started, we\'ll send you an email once it completes.', + 'listening' => 'Listening...', + 'microphone_help' => 'Say \'new invoice for...\'', + 'voice_commands' => 'Voice Commands', + 'sample_commands' => 'Sample commands', + 'voice_commands_feedback' => 'We\'re actively working to improve this feature, if there\'s a command you\'d like us to support please email us at :email.', + 'payment_type_Venmo' => 'Venmo', ); diff --git a/resources/lang/de/texts.php b/resources/lang/de/texts.php index b61eba1a79be..5aecdab3e51f 100644 --- a/resources/lang/de/texts.php +++ b/resources/lang/de/texts.php @@ -2,7 +2,7 @@ $LANG = array( - 'organization' => 'Organisation', + 'organization' => 'Unternehmen', 'name' => 'Name', 'website' => 'Webseite', 'work_phone' => 'Telefon', @@ -151,7 +151,7 @@ $LANG = array( 'last_logged_in' => 'Zuletzt eingeloggt', 'details' => 'Details', 'standing' => 'Aktueller Stand', - 'credit' => 'Guthaben', + 'credit' => 'Gutschrift', 'activity' => 'Aktivität', 'date' => 'Datum', 'message' => 'Nachricht', @@ -266,7 +266,7 @@ $LANG = array( 'working' => 'Wird bearbeitet', 'success' => 'Erfolg', 'success_message' => 'Du hast dich erfolgreich registriert. Bitte besuche den Link in deiner Bestätigungsmail um deine E-Mail-Adresse zu verifizieren.', - 'erase_data' => 'Your account is not registered, this will permanently erase your data.', + 'erase_data' => 'Ihr Konto ist nicht registriert, diese Aktion wird Ihre Daten unwiederbringlich löschen.', 'password' => 'Passwort', 'pro_plan_product' => 'Pro Plan', 'pro_plan_success' => 'Danke, dass Sie Invoice Ninja\'s Pro gewählt haben!