Merge branch '1.3-dev' of github.com:akaunting/akaunting into tax-rate
This commit is contained in:
commit
49112ce50f
@ -26,3 +26,5 @@ MAIL_PORT=2525
|
||||
MAIL_USERNAME=null
|
||||
MAIL_PASSWORD=null
|
||||
MAIL_ENCRYPTION=null
|
||||
MAIL_FROM_NAME=null
|
||||
MAIL_FROM_ADDRESS=null
|
||||
|
78
app/Console/Commands/ModuleDelete.php
Normal file
78
app/Console/Commands/ModuleDelete.php
Normal file
@ -0,0 +1,78 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Models\Module\Module;
|
||||
use App\Models\Module\ModuleHistory;
|
||||
use Artisan;
|
||||
use Illuminate\Console\Command;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
|
||||
class ModuleDelete extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'module:delete {alias} {company_id}';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Delete the specified module.';
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$alias = $this->argument('alias');
|
||||
$company_id = $this->argument('company_id');
|
||||
|
||||
$model = Module::alias($alias)->companyId($company_id)->first();
|
||||
|
||||
if (!$model) {
|
||||
$this->info("Module [{$alias}] not found.");
|
||||
return;
|
||||
}
|
||||
|
||||
$module = $this->laravel['modules']->findByAlias($alias);
|
||||
$module->delete();
|
||||
|
||||
$model->status = 0;
|
||||
$model->save();
|
||||
|
||||
// Add history
|
||||
$data = [
|
||||
'company_id' => $company_id,
|
||||
'module_id' => $model->id,
|
||||
'category' => $module->get('category'),
|
||||
'version' => $module->get('version'),
|
||||
'description' => trans('modules.deleted', ['module' => $module->get('name')]),
|
||||
];
|
||||
|
||||
ModuleHistory::create($data);
|
||||
|
||||
Artisan::call('cache:clear');
|
||||
|
||||
$this->info("Module [{$alias}] deleted.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command arguments.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getArguments()
|
||||
{
|
||||
return array(
|
||||
array('alias', InputArgument::REQUIRED, 'Module alias.'),
|
||||
array('company_id', InputArgument::REQUIRED, 'Company ID.'),
|
||||
);
|
||||
}
|
||||
}
|
@ -13,10 +13,11 @@ class Kernel extends ConsoleKernel
|
||||
* @var array
|
||||
*/
|
||||
protected $commands = [
|
||||
Commands\CompanySeed::class,
|
||||
Commands\BillReminder::class,
|
||||
Commands\CompanySeed::class,
|
||||
Commands\Install::class,
|
||||
Commands\InvoiceReminder::class,
|
||||
Commands\ModuleDelete::class,
|
||||
Commands\ModuleDisable::class,
|
||||
Commands\ModuleEnable::class,
|
||||
Commands\ModuleInstall::class,
|
||||
|
@ -267,7 +267,7 @@ class Bills extends Controller
|
||||
|
||||
$excel->sheet('bills', function ($sheet) use ($bills) {
|
||||
$sheet->fromModel($bills->makeHidden([
|
||||
'company_id', 'parent_id', 'created_at', 'updated_at', 'deleted_at', 'attachment', 'discount', 'items', 'histories', 'payments', 'totals', 'media'
|
||||
'company_id', 'parent_id', 'created_at', 'updated_at', 'deleted_at', 'attachment', 'discount', 'items', 'histories', 'payments', 'totals', 'media', 'paid'
|
||||
]));
|
||||
});
|
||||
|
||||
|
@ -279,7 +279,7 @@ class Invoices extends Controller
|
||||
|
||||
$excel->sheet('invoices', function ($sheet) use ($invoices) {
|
||||
$sheet->fromModel($invoices->makeHidden([
|
||||
'company_id', 'parent_id', 'created_at', 'updated_at', 'deleted_at', 'attachment', 'discount', 'items', 'histories', 'payments', 'totals', 'media'
|
||||
'company_id', 'parent_id', 'created_at', 'updated_at', 'deleted_at', 'attachment', 'discount', 'items', 'histories', 'payments', 'totals', 'media', 'paid'
|
||||
]));
|
||||
});
|
||||
|
||||
|
@ -104,7 +104,7 @@ class TaxSummary extends Controller
|
||||
private function setAmount(&$items, &$totals, $rows, $type, $date_field)
|
||||
{
|
||||
foreach ($rows as $row) {
|
||||
if ($row['table'] == 'bill_payments' || $row['table'] == 'invoice_payments') {
|
||||
if ($row->getTable() == 'bill_payments' || $row->getTable() == 'invoice_payments') {
|
||||
$type_row = $row->$type;
|
||||
|
||||
$row->category_id = $type_row->category_id;
|
||||
@ -127,7 +127,14 @@ class TaxSummary extends Controller
|
||||
continue;
|
||||
}
|
||||
|
||||
$amount = $this->convert($row_total->amount, $row->currency_code, $row->currency_rate);
|
||||
if ($date_field == 'paid_at') {
|
||||
$rate = ($row->amount * 100) / $type_row->amount;
|
||||
$row_amount = ($row_total->amount / 100) * $rate;
|
||||
} else {
|
||||
$row_amount = $row_total->amount;
|
||||
}
|
||||
|
||||
$amount = $this->convert($row_amount, $row->currency_code, $row->currency_rate);
|
||||
|
||||
$items[$row_total->name][$date]['amount'] += $amount;
|
||||
|
||||
|
@ -181,17 +181,17 @@ class Settings extends Controller
|
||||
protected function oneCompany($key, $value)
|
||||
{
|
||||
switch ($key) {
|
||||
case 'company_name':
|
||||
Installer::updateEnv(['MAIL_FROM_NAME' => '"' . $value . '"']);
|
||||
break;
|
||||
case 'company_email':
|
||||
Installer::updateEnv(['MAIL_FROM_ADDRESS' => $value]);
|
||||
break;
|
||||
case 'default_locale':
|
||||
// Change default locale
|
||||
Installer::updateEnv([
|
||||
'APP_LOCALE' => $value
|
||||
]);
|
||||
Installer::updateEnv(['APP_LOCALE' => $value]);
|
||||
break;
|
||||
case 'session_handler':
|
||||
// Change session handler
|
||||
Installer::updateEnv([
|
||||
'SESSION_DRIVER' => $value
|
||||
]);
|
||||
Installer::updateEnv(['SESSION_DRIVER' => $value]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -43,11 +43,9 @@ class Reset extends Notification
|
||||
*/
|
||||
public function toMail($notifiable)
|
||||
{
|
||||
setting(['general.company_name' => config('app.name')]);
|
||||
|
||||
return (new MailMessage)
|
||||
->line(trans('auth.notification.message_1'))
|
||||
->action(trans('auth.notification.button'), url('auth/reset', $this->token, true))
|
||||
->action(trans('auth.notification.button'), url('auth/reset', $this->token))
|
||||
->line(trans('auth.notification.message_2'));
|
||||
}
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ class Item extends Notification
|
||||
{
|
||||
$message = (new MailMessage)
|
||||
->line(trans('items.notification.message.out_of_stock', ['name' => $this->item->name]))
|
||||
->action(trans('items.notification.button'), url('items/items', $this->item->id, true));
|
||||
->action(trans('items.notification.button'), url('items/items', $this->item->id));
|
||||
|
||||
// Override per company as Laravel doesn't read config
|
||||
$message->from(config('mail.from.address'), config('mail.from.name'));
|
||||
|
@ -45,7 +45,7 @@ class ItemReminder extends Notification
|
||||
{
|
||||
$message = (new MailMessage)
|
||||
->line(trans('items.notification.message.reminder', ['name' => $this->item->name, 'quantity' => $this->item->quantity]))
|
||||
->action(trans('items.notification.button'), url('items/items', $this->item->id, true));
|
||||
->action(trans('items.notification.button'), url('items/items', $this->item->id));
|
||||
|
||||
// Override per company as Laravel doesn't read config
|
||||
$message->from(config('mail.from.address'), config('mail.from.name'));
|
||||
|
@ -62,7 +62,7 @@ class Invoice extends Notification
|
||||
]);
|
||||
}
|
||||
|
||||
$message->action(trans('customers.notification.button'), url('incomes/invoices', $this->invoice->id, true));
|
||||
$message->action(trans('customers.notification.button'), url('incomes/invoices', $this->invoice->id));
|
||||
|
||||
return $message;
|
||||
}
|
||||
|
@ -48,7 +48,7 @@ class Bill extends Notification
|
||||
{
|
||||
$message = (new MailMessage)
|
||||
->line('You are receiving this email because you have an upcoming ' . money($this->bill->amount, $this->bill->currency_code, true) . ' bill to ' . $this->bill->vendor_name . ' vendor.')
|
||||
->action('Add Payment', url('expenses/bills', $this->bill->id, true));
|
||||
->action('Add Payment', url('expenses/bills', $this->bill->id));
|
||||
|
||||
// Override per company as Laravel doesn't read config
|
||||
$message->from(config('mail.from.address'), config('mail.from.name'));
|
||||
|
@ -60,7 +60,7 @@ class Invoice extends Notification
|
||||
}
|
||||
|
||||
if ($this->invoice->customer->user) {
|
||||
$message->action(trans('invoices.notification.button'), url('customers/invoices', $this->invoice->id, true));
|
||||
$message->action(trans('invoices.notification.button'), url('customers/invoices', $this->invoice->id));
|
||||
}
|
||||
|
||||
return $message;
|
||||
|
@ -269,16 +269,24 @@ class Installer
|
||||
$env = explode("\n", $env);
|
||||
|
||||
foreach ($data as $data_key => $data_value) {
|
||||
$updated = false;
|
||||
|
||||
foreach ($env as $env_key => $env_value) {
|
||||
$entry = explode('=', $env_value, 2);
|
||||
|
||||
// Check if new or old key
|
||||
if ($entry[0] == $data_key) {
|
||||
$env[$env_key] = $data_key . '=' . $data_value;
|
||||
$updated = true;
|
||||
} else {
|
||||
$env[$env_key] = $env_value;
|
||||
}
|
||||
}
|
||||
|
||||
// Lets create if not available
|
||||
if (!$updated) {
|
||||
$env[] = $data_key . '=' . $data_value;
|
||||
}
|
||||
}
|
||||
|
||||
$env = implode("\n", $env);
|
||||
|
102
composer.lock
generated
102
composer.lock
generated
@ -66,16 +66,16 @@
|
||||
},
|
||||
{
|
||||
"name": "akaunting/money",
|
||||
"version": "1.0.6",
|
||||
"version": "1.0.7",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/akaunting/money.git",
|
||||
"reference": "d56221b2cbf4771c50da0c2e0273869cc659ed2e"
|
||||
"reference": "e5d038fe38f6400261dfff6f7ed0e0a8245719af"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/akaunting/money/zipball/d56221b2cbf4771c50da0c2e0273869cc659ed2e",
|
||||
"reference": "d56221b2cbf4771c50da0c2e0273869cc659ed2e",
|
||||
"url": "https://api.github.com/repos/akaunting/money/zipball/e5d038fe38f6400261dfff6f7ed0e0a8245719af",
|
||||
"reference": "e5d038fe38f6400261dfff6f7ed0e0a8245719af",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -123,7 +123,7 @@
|
||||
"laravel",
|
||||
"money"
|
||||
],
|
||||
"time": "2018-09-01T11:56:07+00:00"
|
||||
"time": "2018-11-04T07:12:33+00:00"
|
||||
},
|
||||
{
|
||||
"name": "akaunting/setting",
|
||||
@ -2764,16 +2764,16 @@
|
||||
},
|
||||
{
|
||||
"name": "monolog/monolog",
|
||||
"version": "1.23.0",
|
||||
"version": "1.24.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/Seldaek/monolog.git",
|
||||
"reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4"
|
||||
"reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4",
|
||||
"reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4",
|
||||
"url": "https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266",
|
||||
"reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -2838,7 +2838,7 @@
|
||||
"logging",
|
||||
"psr-3"
|
||||
],
|
||||
"time": "2017-06-19T01:22:40+00:00"
|
||||
"time": "2018-11-05T09:00:11+00:00"
|
||||
},
|
||||
{
|
||||
"name": "mtdowling/cron-expression",
|
||||
@ -4209,16 +4209,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/class-loader",
|
||||
"version": "v3.4.17",
|
||||
"version": "v3.4.18",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/class-loader.git",
|
||||
"reference": "f31333bdff54c7595f834d510a6d2325573ddb36"
|
||||
"reference": "5605edec7b8f034ead2497ff4aab17bb70d558c1"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/class-loader/zipball/f31333bdff54c7595f834d510a6d2325573ddb36",
|
||||
"reference": "f31333bdff54c7595f834d510a6d2325573ddb36",
|
||||
"url": "https://api.github.com/repos/symfony/class-loader/zipball/5605edec7b8f034ead2497ff4aab17bb70d558c1",
|
||||
"reference": "5605edec7b8f034ead2497ff4aab17bb70d558c1",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -4261,20 +4261,20 @@
|
||||
],
|
||||
"description": "Symfony ClassLoader Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2018-10-02T12:28:39+00:00"
|
||||
"time": "2018-10-31T09:06:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/console",
|
||||
"version": "v3.4.17",
|
||||
"version": "v3.4.18",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/console.git",
|
||||
"reference": "3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b"
|
||||
"reference": "1d228fb4602047d7b26a0554e0d3efd567da5803"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b",
|
||||
"reference": "3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/1d228fb4602047d7b26a0554e0d3efd567da5803",
|
||||
"reference": "1d228fb4602047d7b26a0554e0d3efd567da5803",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -4330,11 +4330,11 @@
|
||||
],
|
||||
"description": "Symfony Console Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2018-10-02T16:33:53+00:00"
|
||||
"time": "2018-10-30T16:50:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/css-selector",
|
||||
"version": "v3.4.17",
|
||||
"version": "v3.4.18",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/css-selector.git",
|
||||
@ -4387,16 +4387,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/debug",
|
||||
"version": "v3.4.17",
|
||||
"version": "v3.4.18",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/debug.git",
|
||||
"reference": "0a612e9dfbd2ccce03eb174365f31ecdca930ff6"
|
||||
"reference": "fe9793af008b651c5441bdeab21ede8172dab097"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/debug/zipball/0a612e9dfbd2ccce03eb174365f31ecdca930ff6",
|
||||
"reference": "0a612e9dfbd2ccce03eb174365f31ecdca930ff6",
|
||||
"url": "https://api.github.com/repos/symfony/debug/zipball/fe9793af008b651c5441bdeab21ede8172dab097",
|
||||
"reference": "fe9793af008b651c5441bdeab21ede8172dab097",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -4439,20 +4439,20 @@
|
||||
],
|
||||
"description": "Symfony Debug Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2018-10-02T16:33:53+00:00"
|
||||
"time": "2018-10-31T09:06:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/event-dispatcher",
|
||||
"version": "v3.4.17",
|
||||
"version": "v3.4.18",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/event-dispatcher.git",
|
||||
"reference": "b2e1f19280c09a42dc64c0b72b80fe44dd6e88fb"
|
||||
"reference": "db9e829c8f34c3d35cf37fcd4cdb4293bc4a2f14"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b2e1f19280c09a42dc64c0b72b80fe44dd6e88fb",
|
||||
"reference": "b2e1f19280c09a42dc64c0b72b80fe44dd6e88fb",
|
||||
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/db9e829c8f34c3d35cf37fcd4cdb4293bc4a2f14",
|
||||
"reference": "db9e829c8f34c3d35cf37fcd4cdb4293bc4a2f14",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -4502,11 +4502,11 @@
|
||||
],
|
||||
"description": "Symfony EventDispatcher Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2018-07-26T09:06:28+00:00"
|
||||
"time": "2018-10-30T16:50:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/finder",
|
||||
"version": "v3.4.17",
|
||||
"version": "v3.4.18",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/finder.git",
|
||||
@ -4555,16 +4555,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/http-foundation",
|
||||
"version": "v3.4.17",
|
||||
"version": "v3.4.18",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/http-foundation.git",
|
||||
"reference": "3a4498236ade473c52b92d509303e5fd1b211ab1"
|
||||
"reference": "5aea7a86ca3203dd7a257e765b4b9c9cfd01c6c0"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/3a4498236ade473c52b92d509303e5fd1b211ab1",
|
||||
"reference": "3a4498236ade473c52b92d509303e5fd1b211ab1",
|
||||
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/5aea7a86ca3203dd7a257e765b4b9c9cfd01c6c0",
|
||||
"reference": "5aea7a86ca3203dd7a257e765b4b9c9cfd01c6c0",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -4605,20 +4605,20 @@
|
||||
],
|
||||
"description": "Symfony HttpFoundation Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2018-10-03T08:48:18+00:00"
|
||||
"time": "2018-10-31T08:57:11+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/http-kernel",
|
||||
"version": "v3.4.17",
|
||||
"version": "v3.4.18",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/http-kernel.git",
|
||||
"reference": "a0944a9a1d8845da724236cde9a310964acadb1c"
|
||||
"reference": "4bf0be7c7fe63eff6a5eae2f21c83e77e31a56fb"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/a0944a9a1d8845da724236cde9a310964acadb1c",
|
||||
"reference": "a0944a9a1d8845da724236cde9a310964acadb1c",
|
||||
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/4bf0be7c7fe63eff6a5eae2f21c83e77e31a56fb",
|
||||
"reference": "4bf0be7c7fe63eff6a5eae2f21c83e77e31a56fb",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -4694,7 +4694,7 @@
|
||||
],
|
||||
"description": "Symfony HttpKernel Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2018-10-03T12:03:34+00:00"
|
||||
"time": "2018-11-03T10:03:02+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-ctype",
|
||||
@ -4982,16 +4982,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/process",
|
||||
"version": "v3.4.17",
|
||||
"version": "v3.4.18",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/process.git",
|
||||
"reference": "1dc2977afa7d70f90f3fefbcd84152813558910e"
|
||||
"reference": "35c2914a9f50519bd207164c353ae4d59182c2cb"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/process/zipball/1dc2977afa7d70f90f3fefbcd84152813558910e",
|
||||
"reference": "1dc2977afa7d70f90f3fefbcd84152813558910e",
|
||||
"url": "https://api.github.com/repos/symfony/process/zipball/35c2914a9f50519bd207164c353ae4d59182c2cb",
|
||||
"reference": "35c2914a9f50519bd207164c353ae4d59182c2cb",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -5027,11 +5027,11 @@
|
||||
],
|
||||
"description": "Symfony Process Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2018-10-02T12:28:39+00:00"
|
||||
"time": "2018-10-14T17:33:21+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/routing",
|
||||
"version": "v3.4.17",
|
||||
"version": "v3.4.18",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/routing.git",
|
||||
@ -5108,7 +5108,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/translation",
|
||||
"version": "v3.4.17",
|
||||
"version": "v3.4.18",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/translation.git",
|
||||
@ -5176,7 +5176,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/var-dumper",
|
||||
"version": "v3.4.17",
|
||||
"version": "v3.4.18",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/var-dumper.git",
|
||||
@ -6608,7 +6608,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/yaml",
|
||||
"version": "v3.4.17",
|
||||
"version": "v3.4.18",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/yaml.git",
|
||||
|
@ -14,11 +14,11 @@ return [
|
||||
|
||||
'build' => '',
|
||||
|
||||
'status' => 'RC 2',
|
||||
'status' => 'RC 3',
|
||||
|
||||
'date' => '02-November-2018',
|
||||
'date' => '06-November-2018',
|
||||
|
||||
'time' => '18:30',
|
||||
'time' => '10:30',
|
||||
|
||||
'zone' => 'GMT +3',
|
||||
|
||||
|
13
public/css/app.css
vendored
13
public/css/app.css
vendored
@ -770,12 +770,13 @@ input[type="number"] {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
#tax-add-new {
|
||||
padding: 6px 12px;
|
||||
}
|
||||
|
||||
#items .select2-search__field {
|
||||
padding-left: 15px;
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
#tax-add-new {
|
||||
padding: 6px 12px;
|
||||
}
|
||||
|
||||
.stepwizard-step p {
|
||||
@ -866,6 +867,10 @@ input[type="number"] {
|
||||
min-height: 30px !important;
|
||||
}
|
||||
|
||||
.box-filter .select2-search__field {
|
||||
font-size: 12px !important;
|
||||
}
|
||||
|
||||
/* App Detail Page Sliders Start */
|
||||
.row.module #description .img-fluid.d-block.w-100 {
|
||||
height: 420px;
|
||||
|
@ -48,6 +48,7 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($bills as $item)
|
||||
@php $paid = $item->paid; @endphp
|
||||
<tr>
|
||||
<td><a href="{{ url('expenses/bills/' . $item->id . ' ') }}">{{ $item->bill_number }}</a></td>
|
||||
<td>{{ $item->vendor_name }}</td>
|
||||
@ -62,7 +63,7 @@
|
||||
</button>
|
||||
<ul class="dropdown-menu dropdown-menu-right">
|
||||
<li><a href="{{ url('expenses/bills/' . $item->id) }}">{{ trans('general.show') }}</a></li>
|
||||
@if ($item->paid && !$item->reconciled)
|
||||
@if (!$item->reconciled)
|
||||
<li><a href="{{ url('expenses/bills/' . $item->id . '/edit') }}">{{ trans('general.edit') }}</a></li>
|
||||
@endif
|
||||
@permission('create-expenses-bills')
|
||||
|
@ -47,6 +47,7 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($invoices as $item)
|
||||
@php $paid = $item->paid; @endphp
|
||||
<tr>
|
||||
<td><a href="{{ url('incomes/invoices/' . $item->id . ' ') }}">{{ $item->invoice_number }}</a></td>
|
||||
<td>{{ $item->customer_name }}</td>
|
||||
@ -61,7 +62,7 @@
|
||||
</button>
|
||||
<ul class="dropdown-menu dropdown-menu-right">
|
||||
<li><a href="{{ url('incomes/invoices/' . $item->id) }}">{{ trans('general.show') }}</a></li>
|
||||
@if ($item->paid && !$item->reconciled)
|
||||
@if (!$item->reconciled)
|
||||
<li><a href="{{ url('incomes/invoices/' . $item->id . '/edit') }}">{{ trans('general.edit') }}</a></li>
|
||||
@endif
|
||||
@permission('create-incomes-invoices')
|
||||
|
@ -2,7 +2,7 @@
|
||||
{{-- Header --}}
|
||||
@slot('header')
|
||||
@component('mail::header', ['url' => config('app.url')])
|
||||
{{ setting('general.company_name', config('app.name')) }}
|
||||
{{ setting('general.company_name', config('mail.from.name', config('app.name'))) }}
|
||||
@endcomponent
|
||||
@endslot
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
{{-- Footer --}}
|
||||
@slot('footer')
|
||||
@component('mail::footer')
|
||||
© {{ date('Y') }} {{ setting('general.company_name', config('app.name')) }}. All rights reserved.
|
||||
© {{ date('Y') }} {{ setting('general.company_name', config('mail.from.name', config('app.name'))) }}. All rights reserved.
|
||||
@endcomponent
|
||||
@endslot
|
||||
@endcomponent
|
||||
|
@ -2,7 +2,7 @@
|
||||
{{-- Header --}}
|
||||
@slot('header')
|
||||
@component('mail::header', ['url' => config('app.url')])
|
||||
{{ setting('general.company_name', config('app.name')) }}
|
||||
{{ setting('general.company_name', config('mail.from.name', config('app.name'))) }}
|
||||
@endcomponent
|
||||
@endslot
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
{{-- Footer --}}
|
||||
@slot('footer')
|
||||
@component('mail::footer')
|
||||
© {{ date('Y') }} {{ setting('general.company_name', config('app.name')) }}. All rights reserved.
|
||||
© {{ date('Y') }} {{ setting('general.company_name', config('mail.from.name', config('app.name'))) }}. All rights reserved.
|
||||
@endcomponent
|
||||
@endslot
|
||||
@endcomponent
|
||||
|
@ -45,7 +45,7 @@
|
||||
@if (! empty($salutation))
|
||||
{{ $salutation }}
|
||||
@else
|
||||
{!! trans('notifications.salutation', ['company_name' => setting('general.company_name', config('app.name'))]) !!}
|
||||
{!! trans('notifications.salutation', ['company_name' => setting('general.company_name', config('mail.from.name', config('app.name')))]) !!}
|
||||
@endif
|
||||
|
||||
<!-- Subcopy -->
|
||||
|
90
tests/Feature/Banking/AccountsTest.php
Normal file
90
tests/Feature/Banking/AccountsTest.php
Normal file
@ -0,0 +1,90 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature\Banking;
|
||||
|
||||
use App\Models\Banking\Account;
|
||||
use Tests\Feature\FeatureTestCase;
|
||||
|
||||
class AccountsTest extends FeatureTestCase
|
||||
{
|
||||
public function testItShouldSeeAccountListPage()
|
||||
{
|
||||
$this->loginAs()
|
||||
->get(route('accounts.index'))
|
||||
->assertStatus(200)
|
||||
->assertSeeText(trans_choice('general.accounts', 2));
|
||||
}
|
||||
|
||||
public function testItShouldSeeAccountCreatePage()
|
||||
{
|
||||
$this->loginAs()
|
||||
->get(route('accounts.create'))
|
||||
->assertStatus(200)
|
||||
->assertSeeText(trans('general.title.new', ['type' => trans_choice('general.accounts', 1)]));
|
||||
}
|
||||
|
||||
public function testItShouldCreateAccount()
|
||||
{
|
||||
$this->loginAs()
|
||||
->post(url('banking/accounts'), $this->getAccountRequest())
|
||||
->assertStatus(302)
|
||||
->assertRedirect(url('banking/accounts'));
|
||||
|
||||
$this->assertFlashLevel('success');
|
||||
}
|
||||
|
||||
public function testItShouldSeeAccountUpdatePage()
|
||||
{
|
||||
$account = Account::create($this->getAccountRequest());
|
||||
|
||||
$this->loginAs()
|
||||
->get(route('accounts.edit', ['account' => $account->id]))
|
||||
->assertStatus(200)
|
||||
->assertSee($account->name);
|
||||
}
|
||||
|
||||
public function testItShouldUpdateAccount()
|
||||
{
|
||||
$request = $this->getAccountRequest();
|
||||
|
||||
$account= Account::create($request);
|
||||
|
||||
$request['name'] = $this->faker->text(5);
|
||||
|
||||
$this->loginAs()
|
||||
->patch(url('banking/accounts', $account->id), $request)
|
||||
->assertStatus(302)
|
||||
->assertRedirect(url('banking/accounts'));
|
||||
|
||||
$this->assertFlashLevel('success');
|
||||
}
|
||||
|
||||
public function testItShouldDeleteAccount()
|
||||
{
|
||||
$account = Account::create($this->getAccountRequest());
|
||||
|
||||
$this->loginAs()
|
||||
->delete(route('accounts.destroy', ['account' => $account]))
|
||||
->assertStatus(302)
|
||||
->assertRedirect(route('accounts.index'));
|
||||
|
||||
$this->assertFlashLevel('success');
|
||||
}
|
||||
|
||||
private function getAccountRequest()
|
||||
{
|
||||
return[
|
||||
'company_id' => $this->company->id,
|
||||
'name' => $this->faker->text(5),
|
||||
'number' => '1',
|
||||
'currency_code' => setting('general.default_currency'),
|
||||
'opening_balance' => 0,
|
||||
'bank_name' => $this->faker->text(5),
|
||||
'bank_phone' => null,
|
||||
'bank_address' => null,
|
||||
'default_account' => $this->faker->randomElement(['yes', 'no']),
|
||||
'enabled' => $this->faker->boolean ? 1 : 0,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -87,7 +87,7 @@ class BillsTest extends FeatureTestCase
|
||||
{
|
||||
$amount = $this->faker->randomFloat(2, 2);
|
||||
|
||||
$items = [['name' => 'urun', 'item_id' => null, 'quantity' => '1', 'price' => $amount, 'currency' => 'USD', 'tax_id' => null]];
|
||||
$items = [['name' => $this->faker->text(5), 'item_id' => null, 'quantity' => '1', 'price' => $amount, 'currency' => 'USD', 'tax_id' => null]];
|
||||
|
||||
$data = [
|
||||
'vendor_id' => '0',
|
||||
|
@ -58,6 +58,7 @@ class InvoicesTest extends FeatureTestCase
|
||||
->assertStatus(302);
|
||||
|
||||
$this->assertFlashLevel('success');
|
||||
|
||||
}
|
||||
|
||||
public function testItShouldDeleteInvoice()
|
||||
@ -70,20 +71,24 @@ class InvoicesTest extends FeatureTestCase
|
||||
->assertRedirect(url('incomes/invoices'));
|
||||
|
||||
$this->assertFlashLevel('success');
|
||||
|
||||
}
|
||||
|
||||
private function getInvoiceRequest($recurring = 0)
|
||||
{
|
||||
$amount = $this->faker->randomFloat(2, 2);
|
||||
|
||||
$items = [['name' => $this->faker->text(5), 'item_id' => null, 'quantity' => '1', 'price' => $amount, 'currency' => 'USD']];
|
||||
|
||||
$data = [
|
||||
'company_id' => $this->company->id,
|
||||
'customer_id' => '0',
|
||||
'currency_code' => setting('general.default_currency'),
|
||||
'currency_rate' => '1',
|
||||
'invoiced_at' => $this->faker->date(),
|
||||
'due_at' => $this->faker->date(),
|
||||
'invoice_number' => $this->faker->lexify('INV ???'),
|
||||
'order_number' => $this->faker->randomDigit,
|
||||
'invoice_number' => '1',
|
||||
'order_number' => '1',
|
||||
'currency_code' => setting('general.default_currency'),
|
||||
'currency_rate' => '1',
|
||||
'item' => $items,
|
||||
'discount' => '0',
|
||||
'notes' => $this->faker->text(5),
|
||||
'category_id' => $this->company->categories()->type('income')->first()->id,
|
||||
@ -95,6 +100,7 @@ class InvoicesTest extends FeatureTestCase
|
||||
'customer_address' => $this->faker->address,
|
||||
'invoice_status_code' => 'draft',
|
||||
'amount' => $amount,
|
||||
'company_id' => $this->company->id,
|
||||
];
|
||||
|
||||
if ($recurring) {
|
||||
@ -103,6 +109,7 @@ class InvoicesTest extends FeatureTestCase
|
||||
$data['recurring_custom_frequency'] = $this->faker->randomElement(['monthly', 'weekly']);
|
||||
$data['recurring_count'] = '1';
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user