Compare commits

...

52 Commits

Author SHA1 Message Date
2b03bc798e new build 310 2020-05-21 11:26:26 +05:30
482556d378 Merge branch 'resend-email' into 'master'
Add Resend Email Option

See merge request mohit.panjvani/crater-web!236
2020-05-21 05:51:36 +00:00
deb525af6e build 310 2020-05-19 13:22:33 +05:30
cb2bfbb91c Add steps for update app 2020-05-19 07:50:58 +00:00
654395a175 Add steps for update app 2020-05-19 07:50:58 +00:00
e31b60bc48 Refactor Self Update Endpoints and Add Update Console Command 2020-05-17 07:04:43 +00:00
183953f4c4 Refactor Self Update Endpoints and Add Update Console Command 2020-05-17 07:04:43 +00:00
a24d8d3ebc fix updater issue 2020-05-13 16:50:45 +05:30
4ca574c581 fix migration errors 2020-05-13 12:47:06 +05:30
c7ce8c87dd new build 2020-05-13 11:31:37 +05:30
f64d546672 refactor 310 update listener 2020-05-13 11:12:33 +05:30
d4a1f1a784 fix item selection and item loader 2020-05-12 13:23:06 +05:30
e07532961e reset items on selection 2020-05-12 13:11:29 +05:30
450c265ded Merge branch 'refactor-report-pdfs' into 'master'
Refactor report pdfs

See merge request mohit.panjvani/crater-web!233
2020-05-11 15:48:49 +00:00
f8502c3ca8 Merge branch 'customer-delete' into 'master'
Customer delete label

See merge request mohit.panjvani/crater-web!237
2020-05-11 15:47:33 +00:00
899da6990d Merge branch 'new-issues' into 'master'
New issues

See merge request mohit.panjvani/crater-web!239
2020-05-11 15:47:03 +00:00
e7675f938e refactor estimate to invoice endpoint 2020-05-11 19:05:50 +05:30
b08138e9e0 refactor estimate to invoice endpoint 2020-05-11 18:34:20 +05:30
5df4abdc4b add aws-sdk-php package 2020-05-11 18:15:36 +05:30
a2fa8afa72 fix translation issue 2020-05-11 18:09:34 +05:30
7670cd67dc Merge branch 'template-refactor' into 'master'
refactor invoice2

See merge request mohit.panjvani/crater-web!238
2020-05-11 12:24:22 +00:00
8446ac2b27 refactor invoice2 2020-05-11 16:19:02 +05:30
63a80e44d5 Customer delete label 2020-05-11 14:33:11 +05:30
076df75322 Merge branch 'template-refactor' into 'master'
Template refactor

See merge request mohit.panjvani/crater-web!232
2020-05-11 07:03:45 +00:00
11db99da73 refactor invoice 1 style 2020-05-09 18:50:58 +05:30
050dca5a50 Add copy pdf url option 2020-05-09 14:37:22 +05:30
3c096f1386 Add Resend Email Option 2020-05-09 14:22:13 +05:30
0f3e8fce3b refactor heading text in payment 2020-05-08 20:55:00 +05:30
325f90bba5 Fix issues on invoice template 2020-05-08 18:49:02 +05:30
a739a938fc Fix estimate template issues 2020-05-08 16:52:48 +05:30
b30e3a9b11 merge with github 2020-05-08 11:11:57 +05:30
fc1a7c7438 refactor reports pdfs 2020-05-07 18:59:50 +05:30
6046113cb1 Refactor Invoice and Payment templates 2020-05-07 16:42:04 +05:30
611ffafec5 refactor sales customers pdf 2020-05-06 20:41:15 +05:30
c497b906df refactor taxt report pdf 2020-05-06 20:32:10 +05:30
c68fce19f9 refactor expenses pdf 2020-05-06 19:02:02 +05:30
f8913531b6 refactor profit loss pdfs 2020-05-06 18:09:28 +05:30
30f76e2088 Refactor Estimate templates 2020-05-06 18:02:27 +05:30
39556892cd refactor sales customers 2020-05-05 20:58:20 +05:30
2fd66bf748 refactor sales items and customer pdfs 2020-05-05 20:49:51 +05:30
d4f1428d5f refactor sales customers pdf template 2020-05-05 20:03:51 +05:30
189141c84d Refactor estimate pdf template 2020-05-05 18:21:25 +05:30
f8ccfece09 update templates 2020-05-05 13:12:26 +05:30
9a7c926d53 fix 310 update issues 2020-05-02 18:53:51 +05:30
c5c1674153 Merge branch 'master' 2020-05-02 13:37:36 +05:30
8562ee5414 Merge branch 'settings-customization-payments' into 'master'
Payments and UnitItems in doubles issue fixed...

See merge request mohit.panjvani/crater-web!218
2020-04-27 16:09:25 +00:00
06c66a756c Payments and UnitItems in doubles issue fixed... 2020-04-27 18:54:24 +05:30
b66d07d21b Merge pull request #201 from rexlManu/master
Updated German Language
2020-04-27 12:14:23 +05:30
05001b6a79 Merge pull request #170 from RobinDev/patch-1
Update french language
2020-04-21 14:52:02 +05:30
f02f4ba9d3 Updated German Language 2020-04-21 07:31:33 +02:00
fbace98aac add missing translation 2020-04-20 21:12:03 +02:00
0f130ab1b8 Update fr langugage 2020-04-17 09:57:38 +02:00
68 changed files with 6184 additions and 5796 deletions

View File

@ -0,0 +1,189 @@
<?php
namespace Crater\Console\Commands;
use Illuminate\Console\Command;
use Crater\Space\Updater;
use Crater\Setting;
class UpdateCommand extends Command
{
public $installed;
public $version;
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'crater:update';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Automatically update your crater app';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*/
public function handle()
{
set_time_limit(3600); // 1 hour
$this->installed = $this->getInstalledVersion();
$this->version = $this->getLatestVersion();
if (!$this->version) {
$this->info('No Update Available! You are already on the latest version.');
return;
}
if (!$this->confirm("Do you wish to update to {$this->version}?")) {
return;
}
if (!$path = $this->download()) {
return;
}
if (!$path = $this->unzip($path)) {
return;
}
if (!$this->copyFiles($path)) {
return;
}
if (!$this->migrateUpdate()) {
return;
}
if (!$this->finish()) {
return;
}
$this->info('Successfully updated to ' . $this->version);
}
public function getInstalledVersion()
{
return Setting::getSetting('version');
}
public function getLatestVersion()
{
$this->info('Your currently installed version is ' . $this->installed);
$this->line('');
$this->info('Checking for update...');
try {
$response = Updater::checkForUpdate($this->installed);
if ($response->success) {
return $response->version->version;
}
return false;
} catch (\Exception $e) {
$this->error($e->getMessage());
return false;
}
}
public function download()
{
$this->info('Downloading update...');
try {
$path = Updater::download($this->version);
if (!is_string($path)) {
$this->error('Download exception');
return false;
}
} catch (\Exception $e) {
$this->error($e->getMessage());
return false;
}
return $path;
}
public function unzip($path)
{
$this->info('Unzipping update package...');
try {
$path = Updater::unzip($path);
if (!is_string($path)) {
$this->error('Unzipping exception');
return false;
}
} catch (\Exception $e) {
$this->error($e->getMessage());
return false;
}
return $path;
}
public function copyFiles($path)
{
$this->info('Copying update files...');
try {
Updater::copyFiles($path);
} catch (\Exception $e) {
$this->error($e->getMessage());
return false;
}
return true;
}
public function migrateUpdate()
{
$this->info('Running Migrations...');
try {
Updater::migrateUpdate();
} catch (\Exception $e) {
$this->error($e->getMessage());
return false;
}
return true;
}
public function finish()
{
$this->info('Finishing update...');
try {
Updater::finishUpdate($this->installed, $this->version);
} catch (\Exception $e) {
$this->error($e->getMessage());
return false;
}
return true;
}
}

View File

@ -12,7 +12,8 @@ class Kernel extends ConsoleKernel
* @var array
*/
protected $commands = [
Commands\ResetApp::class
Commands\ResetApp::class,
Commands\UpdateCommand::class
];
/**

View File

@ -25,7 +25,7 @@ class UpdateFinished
*/
public function __construct($old, $new)
{
$this->old = $old;
$this->new = $new;
$this->old = $old;
$this->new = $new;
}
}

View File

@ -385,12 +385,12 @@ class EstimatesController extends Controller
public function estimateToInvoice(Request $request, $id)
{
$estimate = Estimate::with(['items', 'items.taxes', 'user', 'estimateTemplate', 'taxes'])->find($id);
$invoice_date = Carbon::parse($estimate->estimate_date);
$invoice_date = Carbon::now();
$invoice_prefix = CompanySetting::getSetting(
'invoice_prefix',
$request->header('company')
);
$due_date = Carbon::parse($estimate->estimate_date)->addDays(7);
$due_date = Carbon::now()->addDays(7);
$tax_per_item = CompanySetting::getSetting(
'tax_per_item',
$request->header('company')

View File

@ -1,4 +1,5 @@
<?php
namespace Crater\Http\Controllers;
use Crater\Expense;
@ -116,7 +117,7 @@ class ExpensesController extends Controller
* @param $id
* @return \Illuminate\Http\JsonResponse
*/
public function edit(Request $request,$id)
public function edit(Request $request, $id)
{
$categories = ExpenseCategory::whereCompany($request->header('company'))->get();
$customers = User::customer()
@ -196,11 +197,11 @@ class ExpensesController extends Controller
{
$data = json_decode($request->attachment_receipt);
if($data) {
if ($data) {
$expense = Expense::find($id);
if($expense) {
if($request->type === 'edit') {
if ($expense) {
if ($request->type === 'edit') {
$expense->clearMediaCollection('receipts');
}
@ -226,9 +227,9 @@ class ExpensesController extends Controller
$expense = Expense::find($id);
$imagePath = null;
if($expense) {
if ($expense) {
$media = $expense->getFirstMedia('receipts');
if($media) {
if ($media) {
$imagePath = $media->getPath();
} else {
return response()->json([
@ -239,7 +240,7 @@ class ExpensesController extends Controller
$type = \File::mimeType($imagePath);
$image = 'data:'.$type.';base64,'.base64_encode(file_get_contents($imagePath));
$image = 'data:' . $type . ';base64,' . base64_encode(file_get_contents($imagePath));
return response()->json([
'image' => $image,
@ -264,17 +265,10 @@ class ExpensesController extends Controller
->first();
$imagePath = null;
if($expense) {
if ($expense) {
$media = $expense->getFirstMedia('receipts');
if($media) {
if ($media) {
$imagePath = $media->getPath();
$filename = $media->getPath();
$type = \File::mimeType($imagePath);
$headers = array(
'Content-Type' => $type,
);
$response = \Response::download($imagePath, $media->file_name);
ob_end_clean();
return $response;
@ -286,4 +280,3 @@ class ExpensesController extends Controller
]);
}
}

View File

@ -2,23 +2,81 @@
namespace Crater\Http\Controllers;
use Crater\Setting;
use Illuminate\Http\Request;
use Crater\Space\Updater;
use Crater\Space\SiteApi;
use Illuminate\Support\Facades\Artisan;
class UpdateController extends Controller
{
public function update(Request $request)
public function download(Request $request)
{
set_time_limit(600); // 10 minutes
$request->validate([
'version' => 'required',
]);
$json = Updater::update($request->installed, $request->version);
$path = Updater::download($request->version);
return response()->json($json);
return response()->json([
'success' => true,
'path' => $path
]);
}
public function unzip(Request $request)
{
$request->validate([
'path' => 'required',
]);
try {
$path = Updater::unzip($request->path);
return response()->json([
'success' => true,
'path' => $path
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'error' => $e->getMessage()
], 500);
}
}
public function copyFiles(Request $request)
{
$request->validate([
'path' => 'required',
]);
$path = Updater::copyFiles($request->path);
return response()->json([
'success' => true,
'path' => $path
]);
}
public function migrate(Request $request)
{
Updater::migrateUpdate();
return response()->json([
'success' => true
]);
}
public function finishUpdate(Request $request)
{
$request->validate([
'installed' => 'required',
'version' => 'required',
]);
$json = Updater::finishUpdate($request->installed, $request->version);
return response()->json($json);
@ -28,7 +86,7 @@ class UpdateController extends Controller
{
set_time_limit(600); // 10 minutes
$json = Updater::checkForUpdate();
$json = Updater::checkForUpdate(Setting::getSetting('version'));
return response()->json($json);
}

View File

@ -1,51 +0,0 @@
<?php
namespace Crater\Listeners\Updates\v3;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Database\Schema\Blueprint;
use Crater\Events\UpdateFinished;
use Crater\Listeners\Updates\Listener;
use Crater\Setting;
use Crater\Currency;
class Version301 extends Listener
{
const VERSION = '3.0.1';
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param object $event
* @return void
*/
public function handle(UpdateFinished $event)
{
if ($this->isListenerFired($event)) {
return;
}
Currency::create([
'name' => 'Kyrgyzstani som',
'code' => 'KGS',
'symbol' => 'С̲ ',
'precision' => '2',
'thousand_separator' => '.',
'decimal_separator' => ','
]);
// Update Crater app version
Setting::setSetting('version', static::VERSION);
}
}

View File

@ -7,30 +7,46 @@ use Illuminate\Queue\InteractsWithQueue;
use Crater\Listeners\Updates\Listener;
use Illuminate\Database\Schema\Blueprint;
use Crater\Events\UpdateFinished;
use Crater\Setting;
use Crater\Currency;
use Schema;
use Artisan;
class Version310
class Version310 extends Listener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
const VERSION = '3.1.0';
/**
* Handle the event.
*
* @param object $event
* @param UpdateFinished $event
* @return void
*/
public function handle(UpdateFinished $event)
{
\Schema::table('expenses', function (Blueprint $table) {
$table->integer('user_id')->unsigned()->nullable();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
if ($this->isListenerFired($event)) {
return;
}
Currency::firstOrCreate(
[
'name' => 'Kyrgyzstani som',
'code' => 'KGS'
],
[
'name' => 'Kyrgyzstani som',
'code' => 'KGS',
'symbol' => 'С̲ ',
'precision' => '2',
'thousand_separator' => '.',
'decimal_separator' => ','
]
);
Artisan::call('migrate', ['--force' => true]);
// Update Crater app version
Setting::setSetting('version', static::VERSION);
}
}

View File

@ -1,4 +1,5 @@
<?php
namespace Crater\Providers;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
@ -11,7 +12,6 @@ use Crater\Listeners\Updates\v2\Version201;
use Crater\Listeners\Updates\v2\Version202;
use Crater\Listeners\Updates\v2\Version210;
use Crater\Listeners\Updates\v3\Version300;
use Crater\Listeners\Updates\v3\Version301;
use Crater\Listeners\Updates\v3\Version310;
class EventServiceProvider extends ServiceProvider
@ -22,14 +22,13 @@ class EventServiceProvider extends ServiceProvider
* @var array
*/
protected $listen = [
UpdateFinished::class=> [
UpdateFinished::class => [
Version110::class,
Version200::class,
Version201::class,
Version202::class,
Version210::class,
Version300::class,
Version301::class,
Version310::class,
],
Registered::class => [

View File

@ -2,31 +2,45 @@
namespace Crater\Space;
use File;
use ZipArchive;
use Artisan;
use GuzzleHttp\Exception\RequestException;
use Crater\Space\SiteApi;
use Crater\Events\UpdateFinished;
use Crater\Setting;
use Illuminate\Http\Request;
use ZipArchive;
class Updater
{
use SiteApi;
public static function update($installed, $version)
public static function checkForUpdate($installed_version)
{
$data = null;
if(env('APP_ENV') === 'development')
{
$url = 'https://craterapp.com/downloads/check/latest/'. $installed_version . '?type=update&is_dev=1';
} else {
$url = 'https://craterapp.com/downloads/check/latest/'. $installed_version . '?type=update';
}
$response = static::getRemote($url, ['timeout' => 100, 'track_redirects' => true]);
if ($response && ($response->getStatusCode() == 200)) {
$data = $response->getBody()->getContents();
}
return json_decode($data);
}
public static function download($new_version)
{
$data = null;
$path = null;
if(env('APP_ENV') === 'development')
{
$url = 'https://craterapp.com/downloads/file/'.$version.'?type=update&is_dev=1';
if (env('APP_ENV') === 'development') {
$url = 'https://craterapp.com/downloads/file/' . $new_version . '?type=update&is_dev=1';
} else {
$url = 'https://craterapp.com/downloads/file/'.$version.'?type=update';
$url = 'https://craterapp.com/downloads/file/' . $new_version . '?type=update';
}
$response = static::getRemote($url, ['timeout' => 100, 'track_redirects' => true]);
// Exception
@ -45,66 +59,68 @@ class Updater
}
// Create temp directory
$path = 'temp-' . md5(mt_rand());
$path2 = 'temp2-' . md5(mt_rand());
$temp_path = storage_path('app') . '/' . $path;
$temp_path2 = storage_path('app') . '/' . $path2;
$temp_dir = storage_path('app/temp-' . md5(mt_rand()));
if (!File::isDirectory($temp_path)) {
File::makeDirectory($temp_path);
File::makeDirectory($temp_path2);
if (!File::isDirectory($temp_dir)) {
File::makeDirectory($temp_dir);
}
try {
$zip_file_path = $temp_dir . '/upload.zip';
$file = $temp_path . '/upload.zip';
// Add content to the Zip file
$uploaded = is_int(file_put_contents($zip_file_path, $data)) ? true : false;
// Add content to the Zip file
$uploaded = is_int(file_put_contents($file, $data)) ? true : false;
if (!$uploaded) {
return false;
}
// Unzip the file
$zip = new ZipArchive();
if ($zip->open($file)) {
$zip->extractTo($temp_path2);
}
$zip->close();
// Delete zip file
File::delete($file);
if (!File::copyDirectory($temp_path2.'/Crater', base_path())) {
return false;
}
// Delete temp directory
File::deleteDirectory($temp_path);
File::deleteDirectory($temp_path2);
return [
'success' => true,
'error' => false,
'data' => []
];
} catch (\Exception $e) {
if (File::isDirectory($temp_path)) {
// Delete temp directory
File::deleteDirectory($temp_path);
File::deleteDirectory($temp_path2);
}
return [
'success' => false,
'error' => 'Update error',
'data' => []
];
if (!$uploaded) {
return false;
}
return $zip_file_path;
}
public static function unzip($zip_file_path)
{
if(!file_exists($zip_file_path)) {
throw new \Exception('Zip file not found');
}
$temp_extract_dir = storage_path('app/temp2-' . md5(mt_rand()));
if (!File::isDirectory($temp_extract_dir)) {
File::makeDirectory($temp_extract_dir);
}
// Unzip the file
$zip = new ZipArchive();
if ($zip->open($zip_file_path)) {
$zip->extractTo($temp_extract_dir);
}
$zip->close();
// Delete zip file
File::delete($zip_file_path);
return $temp_extract_dir;
}
public static function copyFiles($temp_extract_dir)
{
if (!File::copyDirectory($temp_extract_dir . '/Crater', base_path())) {
return false;
}
// Delete temp directory
File::deleteDirectory($temp_extract_dir);
return true;
}
public static function migrateUpdate()
{
Artisan::call('migrate --force');
return true;
}
public static function finishUpdate($installed, $version)
@ -118,22 +134,4 @@ class Updater
];
}
public static function checkForUpdate()
{
$data = null;
if(env('APP_ENV') === 'development')
{
$url = 'https://craterapp.com/downloads/check/latest/'. Setting::getSetting('version') . '?type=update&is_dev=1';
} else {
$url = 'https://craterapp.com/downloads/check/latest/'. Setting::getSetting('version') . '?type=update';
}
$response = static::getRemote($url, ['timeout' => 100, 'track_redirects' => true]);
if ($response && ($response->getStatusCode() == 200)) {
$data = $response->getBody()->getContents();
}
return json_decode($data);
}
}

View File

@ -9,6 +9,7 @@
"type": "project",
"require": {
"php": "^7.2",
"aws/aws-sdk-php": "^3.137",
"barryvdh/laravel-dompdf": "^0.8.1",
"doctrine/dbal": "^2.10",
"fideloper/proxy": "^4.0",

1719
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -9,6 +9,6 @@ return [
|
*/
'version' => '3.0.0',
'version' => '3.1.0',
];

View File

@ -13,13 +13,15 @@ class CreateUnitsTable extends Migration
*/
public function up()
{
Schema::create('units', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->integer('company_id')->unsigned()->nullable();
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
$table->timestamps();
});
if (!Schema::hasTable('units')) {
Schema::create('units', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->integer('company_id')->unsigned()->nullable();
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
$table->timestamps();
});
}
}
/**

View File

@ -23,8 +23,6 @@ class CreateExpensesTable extends Migration
$table->foreign('expense_category_id')->references('id')->on('expense_categories')->onDelete('cascade');
$table->integer('company_id')->unsigned()->nullable();
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
$table->integer('user_id')->unsigned()->nullable();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->timestamps();
});
}

View File

@ -13,13 +13,15 @@ class CreatePaymentMethodsTable extends Migration
*/
public function up()
{
Schema::create('payment_methods', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->integer('company_id')->unsigned()->nullable();
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
$table->timestamps();
});
if (!Schema::hasTable('payment_methods')) {
Schema::create('payment_methods', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->integer('company_id')->unsigned()->nullable();
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
$table->timestamps();
});
}
}
/**

View File

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddUserIdToExpensesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('expenses', function (Blueprint $table) {
$table->integer('user_id')->unsigned()->nullable();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('expenses', function (Blueprint $table) {
$table->dropColumn('paid');
});
}
}

541
package-lock.json generated
View File

@ -2332,11 +2332,6 @@
"integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
"dev": true
},
"@types/color-name": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
},
"@types/events": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
@ -2661,28 +2656,6 @@
}
}
},
"acorn-node": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
"integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
"requires": {
"acorn": "^7.0.0",
"acorn-walk": "^7.0.0",
"xtend": "^4.0.2"
},
"dependencies": {
"acorn": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz",
"integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg=="
}
}
},
"acorn-walk": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz",
"integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ=="
},
"adjust-sourcemap-loader": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz",
@ -2792,6 +2765,7 @@
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
},
@ -2800,6 +2774,7 @@
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
"color-name": "1.1.3"
}
@ -2807,7 +2782,8 @@
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
}
}
},
@ -3102,7 +3078,8 @@
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
"base": {
"version": "0.11.2",
@ -3287,10 +3264,16 @@
"integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
"dev": true
},
"bootstrap": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz",
"integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA=="
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@ -3458,7 +3441,8 @@
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
"dev": true
},
"cacache": {
"version": "12.0.3",
@ -3571,11 +3555,6 @@
"upper-case": "^1.1.1"
}
},
"camelcase-css": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
"integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="
},
"caniuse-api": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz",
@ -3604,6 +3583,7 @@
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
@ -3979,7 +3959,8 @@
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
"concat-stream": {
"version": "1.6.2",
@ -4369,7 +4350,8 @@
"css-unit-converter": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz",
"integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY="
"integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=",
"dev": true
},
"css-what": {
"version": "2.1.3",
@ -5112,7 +5094,8 @@
"defined": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
"integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
"integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
"dev": true
},
"del": {
"version": "4.1.1",
@ -5192,23 +5175,6 @@
"integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
"dev": true
},
"detective": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
"integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
"requires": {
"acorn-node": "^1.6.1",
"defined": "^1.0.0",
"minimist": "^1.1.1"
},
"dependencies": {
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
}
}
},
"diffie-hellman": {
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
@ -5554,7 +5520,8 @@
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"eslint": {
"version": "4.19.1",
@ -6584,7 +6551,8 @@
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
"fsevents": {
"version": "1.2.9",
@ -7243,6 +7211,7 @@
"version": "7.1.4",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
"integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@ -7355,7 +7324,8 @@
"graceful-fs": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz",
"integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q=="
"integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==",
"dev": true
},
"growly": {
"version": "1.3.0",
@ -7395,7 +7365,8 @@
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"has-symbols": {
"version": "1.0.0",
@ -7882,7 +7853,8 @@
"indexes-of": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
"integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
"integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
"dev": true
},
"infer-owner": {
"version": "1.0.4",
@ -7894,6 +7866,7 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"requires": {
"once": "^1.3.0",
"wrappy": "1"
@ -7902,7 +7875,8 @@
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
"ini": {
"version": "1.3.5",
@ -8824,11 +8798,6 @@
"integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
"dev": true
},
"lodash.toarray": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
"integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE="
},
"lodash.uniq": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
@ -9094,6 +9063,7 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@ -9263,14 +9233,6 @@
"lower-case": "^1.1.1"
}
},
"node-emoji": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz",
"integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==",
"requires": {
"lodash.toarray": "^4.4.0"
}
},
"node-forge": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz",
@ -9355,7 +9317,8 @@
"normalize-range": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
"integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
"integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
"dev": true
},
"normalize-url": {
"version": "1.9.1",
@ -9369,11 +9332,6 @@
"sort-keys": "^1.0.0"
}
},
"normalize.css": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz",
"integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg=="
},
"npm-run-path": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
@ -9395,7 +9353,8 @@
"num2fraction": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
"integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4="
"integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
"dev": true
},
"number-is-nan": {
"version": "1.0.1",
@ -9406,7 +9365,8 @@
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true
},
"object-copy": {
"version": "0.1.0",
@ -9566,6 +9526,7 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
"wrappy": "1"
}
@ -9785,7 +9746,8 @@
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
},
"path-is-inside": {
"version": "1.0.2",
@ -9802,7 +9764,8 @@
"path-parse": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
"dev": true
},
"path-to-regexp": {
"version": "0.1.7",
@ -9838,59 +9801,6 @@
"pinkie": "^2.0.0"
}
},
"pkg-up": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
"integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
"requires": {
"find-up": "^3.0.0"
},
"dependencies": {
"find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"requires": {
"locate-path": "^3.0.0"
}
},
"locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"requires": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
}
},
"p-limit": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
"integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"requires": {
"p-limit": "^2.0.0"
}
},
"p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
},
"path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
}
}
},
"pluralize": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
@ -10073,68 +9983,6 @@
"postcss": "^5.0.4"
}
},
"postcss-functions": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/postcss-functions/-/postcss-functions-3.0.0.tgz",
"integrity": "sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=",
"requires": {
"glob": "^7.1.2",
"object-assign": "^4.1.1",
"postcss": "^6.0.9",
"postcss-value-parser": "^3.3.0"
},
"dependencies": {
"postcss": {
"version": "6.0.23",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
"integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
"requires": {
"chalk": "^2.4.1",
"source-map": "^0.6.1",
"supports-color": "^5.4.0"
}
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
}
}
},
"postcss-js": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-2.0.3.tgz",
"integrity": "sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==",
"requires": {
"camelcase-css": "^2.0.1",
"postcss": "^7.0.18"
},
"dependencies": {
"postcss": {
"version": "7.0.27",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz",
"integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==",
"requires": {
"chalk": "^2.4.2",
"source-map": "^0.6.1",
"supports-color": "^6.1.0"
}
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
},
"supports-color": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
"requires": {
"has-flag": "^3.0.0"
}
}
}
},
"postcss-load-config": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz",
@ -10425,55 +10273,6 @@
}
}
},
"postcss-nested": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-4.2.1.tgz",
"integrity": "sha512-AMayXX8tS0HCp4O4lolp4ygj9wBn32DJWXvG6gCv+ZvJrEa00GUxJcJEEzMh87BIe6FrWdYkpR2cuyqHKrxmXw==",
"requires": {
"postcss": "^7.0.21",
"postcss-selector-parser": "^6.0.2"
},
"dependencies": {
"cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
},
"postcss": {
"version": "7.0.27",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz",
"integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==",
"requires": {
"chalk": "^2.4.2",
"source-map": "^0.6.1",
"supports-color": "^6.1.0"
}
},
"postcss-selector-parser": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
"integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
"requires": {
"cssesc": "^3.0.0",
"indexes-of": "^1.0.1",
"uniq": "^1.0.1"
}
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
},
"supports-color": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
"requires": {
"has-flag": "^3.0.0"
}
}
}
},
"postcss-normalize-charset": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz",
@ -10857,7 +10656,8 @@
"postcss-value-parser": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
"integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
"integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
"dev": true
},
"postcss-zindex": {
"version": "2.2.0",
@ -10897,11 +10697,6 @@
"fast-diff": "^1.1.2"
}
},
"pretty-hrtime": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
"integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE="
},
"private": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
@ -12432,6 +12227,7 @@
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
@ -12512,231 +12308,6 @@
}
}
},
"tailwindcss": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-1.2.0.tgz",
"integrity": "sha512-CKvY0ytB3ze5qvynG7qv4XSpQtFNGPbu9pUn8qFdkqgD8Yo/vGss8mhzbqls44YCXTl4G62p3qVZBj45qrd6FQ==",
"requires": {
"autoprefixer": "^9.4.5",
"bytes": "^3.0.0",
"chalk": "^3.0.0",
"detective": "^5.2.0",
"fs-extra": "^8.0.0",
"lodash": "^4.17.15",
"node-emoji": "^1.8.1",
"normalize.css": "^8.0.1",
"postcss": "^7.0.11",
"postcss-functions": "^3.0.0",
"postcss-js": "^2.0.0",
"postcss-nested": "^4.1.1",
"postcss-selector-parser": "^6.0.0",
"pretty-hrtime": "^1.0.3",
"reduce-css-calc": "^2.1.6",
"resolve": "^1.14.2"
},
"dependencies": {
"autoprefixer": {
"version": "9.7.5",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.5.tgz",
"integrity": "sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg==",
"requires": {
"browserslist": "^4.11.0",
"caniuse-lite": "^1.0.30001036",
"chalk": "^2.4.2",
"normalize-range": "^0.1.2",
"num2fraction": "^1.2.2",
"postcss": "^7.0.27",
"postcss-value-parser": "^4.0.3"
},
"dependencies": {
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
}
}
},
"browserslist": {
"version": "4.11.0",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.0.tgz",
"integrity": "sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A==",
"requires": {
"caniuse-lite": "^1.0.30001035",
"electron-to-chromium": "^1.3.380",
"node-releases": "^1.1.52",
"pkg-up": "^3.1.0"
}
},
"caniuse-lite": {
"version": "1.0.30001038",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz",
"integrity": "sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ=="
},
"chalk": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
"integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
"integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"requires": {
"@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
},
"supports-color": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
"integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"requires": {
"color-name": "~1.1.4"
}
},
"cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
},
"electron-to-chromium": {
"version": "1.3.390",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.390.tgz",
"integrity": "sha512-4RvbM5x+002gKI8sltkqWEk5pptn0UnzekUx8RTThAMPDSb8jjpm6SwGiSnEve7f85biyZl8DMXaipaCxDjXag=="
},
"fs-extra": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
}
},
"jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"requires": {
"graceful-fs": "^4.1.6"
}
},
"node-releases": {
"version": "1.1.53",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz",
"integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ=="
},
"postcss": {
"version": "7.0.27",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz",
"integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==",
"requires": {
"chalk": "^2.4.2",
"source-map": "^0.6.1",
"supports-color": "^6.1.0"
},
"dependencies": {
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
},
"dependencies": {
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"requires": {
"has-flag": "^3.0.0"
}
}
}
},
"supports-color": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
"requires": {
"has-flag": "^3.0.0"
}
}
}
},
"postcss-selector-parser": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
"integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
"requires": {
"cssesc": "^3.0.0",
"indexes-of": "^1.0.1",
"uniq": "^1.0.1"
}
},
"postcss-value-parser": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz",
"integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg=="
},
"reduce-css-calc": {
"version": "2.1.7",
"resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz",
"integrity": "sha512-fDnlZ+AybAS3C7Q9xDq5y8A2z+lT63zLbynew/lur/IR24OQF5x98tfNwf79mzEdfywZ0a2wpM860FhFfMxZlA==",
"requires": {
"css-unit-converter": "^1.1.1",
"postcss-value-parser": "^3.3.0"
},
"dependencies": {
"postcss-value-parser": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
"integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
}
}
},
"resolve": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
"integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
"requires": {
"path-parse": "^1.0.6"
}
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
}
}
},
"tapable": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
@ -13081,7 +12652,8 @@
"uniq": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
"integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8="
"integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
"dev": true
},
"uniqs": {
"version": "2.0.0",
@ -13110,7 +12682,8 @@
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
"dev": true
},
"unpipe": {
"version": "1.0.0",
@ -14218,7 +13791,8 @@
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
"write": {
"version": "0.2.1",
@ -14232,7 +13806,8 @@
"xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"dev": true
},
"y18n": {
"version": "3.2.1",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
{
"/assets/js/app.js": "/assets/js/app.js?id=08d4f6357dbe7738effa",
"/assets/css/crater.css": "/assets/css/crater.css?id=a00ceebbb86dd82a024b"
"/assets/js/app.js": "/assets/js/app.js?id=2521d0dcc4cb4e4975a5",
"/assets/css/crater.css": "/assets/css/crater.css?id=84a4eeb53b0e6a937e44"
}

View File

@ -1,16 +1,16 @@
export default {
toggleSidebar () {
toggleSidebar() {
let icon = document.getElementsByClassName('hamburger')[0]
document.body.classList.toggle('sidebar-open')
icon.classList.toggle('is-active')
},
addClass (el, className) {
addClass(el, className) {
if (el.classList) el.classList.add(className)
else el.className += ' ' + className
},
hasClass (el, className) {
hasClass(el, className) {
const hasClass = el.classList
? el.classList.contains(className)
: new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className)
@ -18,33 +18,38 @@ export default {
return hasClass
},
reset (prefix) {
reset(prefix) {
let regx = new RegExp('\\b' + prefix + '(.*)?\\b', 'g')
document.body.className = document.body.className.replace(regx, '')
},
setLayout (layoutName) {
setLayout(layoutName) {
this.reset('layout-')
document.body.classList.add('layout-' + layoutName)
},
setSkin (skinName) {
setSkin(skinName) {
this.reset('skin-')
document.body.classList.add('skin-' + skinName)
},
setLogo (logoSrc) {
setLogo(logoSrc) {
document.getElementById('logo-desk').src = logoSrc
},
formatMoney (amount, currency = 0) {
formatMoney(amount, currency = 0) {
if (!currency) {
currency = {precision: 2, thousand_separator: ',', decimal_separator: '.', symbol: '$'}
currency = {
precision: 2,
thousand_separator: ',',
decimal_separator: '.',
symbol: '$',
}
}
amount = amount / 100
let {precision, decimal_separator, thousand_separator, symbol} = currency
let { precision, decimal_separator, thousand_separator, symbol } = currency
try {
precision = Math.abs(precision)
@ -52,25 +57,44 @@ export default {
const negativeSign = amount < 0 ? '-' : ''
let i = parseInt(amount = Math.abs(Number(amount) || 0).toFixed(precision)).toString()
let j = (i.length > 3) ? i.length % 3 : 0
let i = parseInt(
(amount = Math.abs(Number(amount) || 0).toFixed(precision))
).toString()
let j = i.length > 3 ? i.length % 3 : 0
let moneySymbol = `<span style="font-family: sans-serif">${symbol}</span>`
return moneySymbol + ' ' + negativeSign + (j ? i.substr(0, j) + thousand_separator : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, '$1' + thousand_separator) + (precision ? decimal_separator + Math.abs(amount - i).toFixed(precision).slice(2) : '')
return (
moneySymbol +
' ' +
negativeSign +
(j ? i.substr(0, j) + thousand_separator : '') +
i.substr(j).replace(/(\d{3})(?=\d)/g, '$1' + thousand_separator) +
(precision
? decimal_separator +
Math.abs(amount - i)
.toFixed(precision)
.slice(2)
: '')
)
} catch (e) {
console.log(e)
}
},
formatGraphMoney (amount, currency = 0) {
formatGraphMoney(amount, currency = 0) {
if (!currency) {
currency = {precision: 2, thousand_separator: ',', decimal_separator: '.', symbol: '$'}
currency = {
precision: 2,
thousand_separator: ',',
decimal_separator: '.',
symbol: '$',
}
}
amount = amount / 100
let {precision, decimal_separator, thousand_separator, symbol} = currency
let { precision, decimal_separator, thousand_separator, symbol } = currency
try {
precision = Math.abs(precision)
@ -78,25 +102,76 @@ export default {
const negativeSign = amount < 0 ? '-' : ''
let i = parseInt(amount = Math.abs(Number(amount) || 0).toFixed(precision)).toString()
let j = (i.length > 3) ? i.length % 3 : 0
let i = parseInt(
(amount = Math.abs(Number(amount) || 0).toFixed(precision))
).toString()
let j = i.length > 3 ? i.length % 3 : 0
let moneySymbol = `${symbol}`
return moneySymbol + ' ' + negativeSign + (j ? i.substr(0, j) + thousand_separator : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, '$1' + thousand_separator) + (precision ? decimal_separator + Math.abs(amount - i).toFixed(precision).slice(2) : '')
return (
moneySymbol +
' ' +
negativeSign +
(j ? i.substr(0, j) + thousand_separator : '') +
i.substr(j).replace(/(\d{3})(?=\d)/g, '$1' + thousand_separator) +
(precision
? decimal_separator +
Math.abs(amount - i)
.toFixed(precision)
.slice(2)
: '')
)
} catch (e) {
console.log(e)
}
},
checkValidUrl (url) {
let pattern = new RegExp('^(https?:\\/\\/)?' + // protocol
checkValidUrl(url) {
let pattern = new RegExp(
'^(https?:\\/\\/)?' + // protocol
'((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name
'((\\d{1,3}\\.){3}\\d{1,3}))' + // OR ip (v4) address
'(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path
'(\\?[;&a-z\\d%_.~+=-]*)?' + // query string
'(\\#[-a-z\\d_]*)?$', 'i') // fragment locator
'(\\#[-a-z\\d_]*)?$',
'i'
) // fragment locator
return !!pattern.test(url)
}
},
fallbackCopyTextToClipboard(text) {
var textArea = document.createElement('textarea')
textArea.value = text
// Avoid scrolling to bottom
textArea.style.top = '0'
textArea.style.left = '0'
textArea.style.position = 'fixed'
document.body.appendChild(textArea)
textArea.focus()
textArea.select()
try {
var successful = document.execCommand('copy')
var msg = successful ? 'successful' : 'unsuccessful'
console.log('Fallback: Copying text command was ' + msg)
} catch (err) {
console.error('Fallback: Oops, unable to copy', err)
}
document.body.removeChild(textArea)
},
copyTextToClipboard(text) {
if (!navigator.clipboard) {
this.fallbackCopyTextToClipboard(text)
return
}
navigator.clipboard.writeText(text).then(
function () {
return true
},
function (err) {
return false
}
)
},
}

View File

@ -62,14 +62,14 @@
"four_zero_four": "404",
"you_got_lost": "عفواً! يبدو أنك قد تهت!",
"go_home": "عودة إلى الرئيسية",
"setting_updated": "تم تحديث الإعدادات بنجاح",
"select_state": "اختر الولاية/المنطقة",
"select_country": "اختر الدولة",
"select_city": "اختر المدينة",
"street_1": "عنوان الشارع 1",
"street_2": "عنوان الشارع 2",
"action_failed": "فشلت العملية"
"action_failed": "فشلت العملية",
"retry": "أعد المحاولة"
},
"dashboard": {
"select_year": "اختر السنة",
@ -155,7 +155,7 @@
"select_a_customer": "اختر العميل",
"type_or_click": "اكتب أو اضغط للاختيار",
"confirm_delete": "لن تكون قادراً على استرجاع هذا العميل | لن تكون قادراً على استرجاع هؤلاء العملاء",
"confirm_delete": "لن تتمكن من استرداد هذا العميل وجميع الفواتير والتقديرات والمدفوعات ذات الصلة. | لن تتمكن من استرداد هؤلاء العملاء وجميع الفواتير والتقديرات والمدفوعات ذات الصلة.",
"created_message": "تم إنشاء العملاء بنجاح",
"updated_message": "تم تحديث العملاء بنجاح",
"deleted_message": "تم حذف العملاء بنجاح | تم حذف العميل بنجاح"
@ -370,7 +370,7 @@
"description": "الوصف",
"quantity": "الكمية",
"price": "السعر",
"discount": "الخصم",
"discount": "الخصم",
"total": "الإجمالي",
"total_discount": "إجمالي الخصم",
"sub_total": "حاصل الجمع",
@ -603,65 +603,65 @@
"updated_message": "تم تحديث معلومات الشركة بنجاح"
},
"customization": {
"customization": "التخصيص",
"save": "حفظ",
"addresses": {
"title": "العنوان",
"section_description": "يمكنك ضبط عنوان إرسال فواتير العملاء وتنسيق عنوان شحن العملاء (معروض في PDF فقط).",
"customer_billing_address": "عنوان فواتير العميل",
"customer_shipping_address": "عنوان الشحن للعميل",
"company_address": "عنوان الشركة",
"insert_fields": "أضف حقل",
"contact": "تواصل",
"address": "العنوان",
"display_name": "الاسم الظاهر",
"primary_contact_name": "مسؤول التواصل الرئيسي",
"email": "البريد الإلكتروني",
"website": "موقع الإنترنت",
"name": "الاسم",
"country": "الدولة",
"state": "الولاية/المنطقة",
"city": "المدينة",
"company_name": "اسم الشركة",
"address_street_1": "عنوان الشارع 1",
"address_street_2": "عنوان الشارع 2",
"phone": "الهاتف",
"zip_code": "الرمز البريدي",
"address_setting_updated": "تم تحديث العنوان بنجاح"
},
"updated_message": "تم تحديث معلومات الشركة بنجاح",
"customization": "التخصيص",
"save": "حفظ",
"addresses": {
"title": "العنوان",
"section_description": "يمكنك ضبط عنوان إرسال فواتير العملاء وتنسيق عنوان شحن العملاء (معروض في PDF فقط).",
"customer_billing_address": "عنوان فواتير العميل",
"customer_shipping_address": "عنوان الشحن للعميل",
"company_address": "عنوان الشركة",
"insert_fields": "أضف حقل",
"contact": "تواصل",
"address": "العنوان",
"display_name": "الاسم الظاهر",
"primary_contact_name": "مسؤول التواصل الرئيسي",
"email": "البريد الإلكتروني",
"website": "موقع الإنترنت",
"name": "الاسم",
"country": "الدولة",
"state": "الولاية/المنطقة",
"city": "المدينة",
"company_name": "اسم الشركة",
"address_street_1": "عنوان الشارع 1",
"address_street_2": "عنوان الشارع 2",
"phone": "الهاتف",
"zip_code": "الرمز البريدي",
"address_setting_updated": "تم تحديث العنوان بنجاح"
},
"updated_message": "تم تحديث معلومات الشركة بنجاح",
"invoices": {
"title": "الفواتير",
"notes": "ملاحظات",
"invoice_prefix": "بادئة رقم الفاتورة",
"invoice_settings": "إعدادات الفاتورة",
"autogenerate_invoice_number": "ترقيم آلي للفاتورة",
"invoice_setting_description": "تعطيل الترقيم الآلي ، إذا كنت لا ترغب في إنشاء أرقام الفاتورة تلقائيًا في كل مرة تقوم فيها بإنشاء فاتورة جديدة.",
"enter_invoice_prefix": "أدخل بادئة رقم الفاتورة",
"terms_and_conditions": "الأحكام والشروط",
"invoice_setting_updated": "تم تحديث إعداد الفاتورة بنجاح"
},
"invoices": {
"title": "الفواتير",
"notes": "ملاحظات",
"invoice_prefix": "بادئة رقم الفاتورة",
"invoice_settings": "إعدادات الفاتورة",
"autogenerate_invoice_number": "ترقيم آلي للفاتورة",
"invoice_setting_description": "تعطيل الترقيم الآلي ، إذا كنت لا ترغب في إنشاء أرقام الفاتورة تلقائيًا في كل مرة تقوم فيها بإنشاء فاتورة جديدة.",
"enter_invoice_prefix": "أدخل بادئة رقم الفاتورة",
"terms_and_conditions": "الأحكام والشروط",
"invoice_setting_updated": "تم تحديث إعداد الفاتورة بنجاح"
},
"estimates": {
"title": "التقديرات",
"estimate_prefix": "بادئة رقم التقدير",
"estimate_settings": "إعدادت التقدير",
"autogenerate_estimate_number": "ترقيم آلي للتقدير",
"estimate_setting_description": "تعطيل الترقيم الآلي ، إذا كنت لا ترغب في إنشاء أرقام التقديرات تلقائيًا في كل مرة تقوم فيها بإنشاء تقدير جديد.",
"enter_estimate_prefix": "أدخل بادئة رقم التقدير",
"estimate_setting_updated": "تم تحديث إعدادات التقدير بنجاح"
},
"estimates": {
"title": "التقديرات",
"estimate_prefix": "بادئة رقم التقدير",
"estimate_settings": "إعدادت التقدير",
"autogenerate_estimate_number": "ترقيم آلي للتقدير",
"estimate_setting_description": "تعطيل الترقيم الآلي ، إذا كنت لا ترغب في إنشاء أرقام التقديرات تلقائيًا في كل مرة تقوم فيها بإنشاء تقدير جديد.",
"enter_estimate_prefix": "أدخل بادئة رقم التقدير",
"estimate_setting_updated": "تم تحديث إعدادات التقدير بنجاح"
},
"payments": {
"title": "المدفوعات",
"payment_prefix": "بادئة رقم الدفعة",
"payment_settings": "إعدادات الدفعة",
"autogenerate_payment_number": "ترقيم آلي للمدفوعات",
"payment_setting_description": "تعطيل الترقيم الآلي ، إذا كنت لا ترغب في إنشاء أرقام الدفعة تلقائيًا في كل مرة تقوم فيها بإنشاء دفعة جديدة.",
"enter_payment_prefix": "أدخل بادئة رقم الدفعة",
"payment_setting_updated": "تم تحديث إعدادات الدفعة بنجاح"
}
"payments": {
"title": "المدفوعات",
"payment_prefix": "بادئة رقم الدفعة",
"payment_settings": "إعدادات الدفعة",
"autogenerate_payment_number": "ترقيم آلي للمدفوعات",
"payment_setting_description": "تعطيل الترقيم الآلي ، إذا كنت لا ترغب في إنشاء أرقام الدفعة تلقائيًا في كل مرة تقوم فيها بإنشاء دفعة جديدة.",
"enter_payment_prefix": "أدخل بادئة رقم الدفعة",
"payment_setting_updated": "تم تحديث إعدادات الدفعة بنجاح"
}
},
"account_settings": {
"profile_picture": "صورة الملف الشخصي",
@ -752,7 +752,14 @@
"progress_text": "سوف يستغرق التحديث بضع دقائق. يرجى عدم تحديث الشاشة أو إغلاق النافذة قبل انتهاء التحديث",
"update_success": "تم تحديث النظام! يرجى الانتظار حتى يتم إعادة تحميل نافذة المتصفح تلقائيًا.",
"latest_message": "لا يوجد تحديثات متوفرة! لديك حالياً أحدث نسخة.",
"current_version": "النسخة الحالية"
"current_version": "النسخة الحالية",
"download_zip_file": "تنزيل ملف ZIP",
"unzipping_package": "حزمة فك الضغط",
"copying_files": "نسخ الملفات",
"running_migrations": "إدارة عمليات الترحيل",
"finishing_update": "تحديث التشطيب",
"update_failed": "فشل التحديث",
"update_failed_text": "آسف! فشل التحديث الخاص بك في: {step} خطوة"
}
},
"wizard": {
@ -806,22 +813,22 @@
"permission_desc": "فيما يلي قائمة أذونات المجلد المطلوبة حتى يعمل التطبيق. في حالة فشل فحص الإذن ، تأكد من تحديث أذونات المجلد."
},
"mail": {
"host": "خادم البريد",
"port": "منفذ البريد",
"driver": "مشغل البريد",
"secret": "سري",
"mailgun_secret": "الرمز السري لـ Mailgun",
"mailgun_domain": "المجال",
"mailgun_endpoint": "النهاية الطرفية لـ Mailgun",
"ses_secret": "SES الرمز السري",
"ses_key": "SES مفتاح",
"password": "كلمة مرور البريد الالكتروني",
"username": "اسم المستخدم للبريد الإلكتروني",
"mail_config": "إعدادات البريد الالكتروني",
"from_name": "اسم المرسل",
"from_mail": "عنوان البريد الالكتروني للمرسل",
"encryption": "صيغة ا لتشفير",
"mail_config_desc": "أدناه هو نموذج لتكوين برنامج تشغيل البريد الإلكتروني لإرسال رسائل البريد الإلكتروني من التطبيق. يمكنك أيضًا تهيئة موفري الجهات الخارجية مثل Sendgrid و SES إلخ."
"host": "خادم البريد",
"port": "منفذ البريد",
"driver": "مشغل البريد",
"secret": "سري",
"mailgun_secret": "الرمز السري لـ Mailgun",
"mailgun_domain": "المجال",
"mailgun_endpoint": "النهاية الطرفية لـ Mailgun",
"ses_secret": "SES الرمز السري",
"ses_key": "SES مفتاح",
"password": "كلمة مرور البريد الالكتروني",
"username": "اسم المستخدم للبريد الإلكتروني",
"mail_config": "إعدادات البريد الالكتروني",
"from_name": "اسم المرسل",
"from_mail": "عنوان البريد الالكتروني للمرسل",
"encryption": "صيغة ا لتشفير",
"mail_config_desc": "أدناه هو نموذج لتكوين برنامج تشغيل البريد الإلكتروني لإرسال رسائل البريد الإلكتروني من التطبيق. يمكنك أيضًا تهيئة موفري الجهات الخارجية مثل Sendgrid و SES إلخ."
},
"req": {
"system_req": "متطلبات النظام",

File diff suppressed because it is too large Load Diff

View File

@ -13,6 +13,7 @@
},
"general": {
"view_pdf": "View PDF",
"copy_pdf_url": "Copy PDF Url",
"download_pdf": "Download PDF",
"save": "Save",
"cancel": "Cancel",
@ -70,14 +71,14 @@
"go_home": "Go Home",
"test_mail_conf": "Test Mail Configuration",
"send_mail_successfully": "Mail sent successfully",
"setting_updated": "Setting updated successfully",
"select_state": "Select state",
"select_country": "Select Country",
"select_city": "Select City",
"street_1": "Street 1",
"street_2": "Street 2",
"action_failed": "Action Failed"
"action_failed": "Action Failed",
"retry": "Retry"
},
"dashboard": {
"select_year": "Select year",
@ -163,7 +164,7 @@
"select_a_customer": "Select a customer",
"type_or_click": "Type or click to select",
"confirm_delete": "You will not be able to recover this Customer | You will not be able to recover these Customers",
"confirm_delete": "You will not be able to recover this customer and all the related Invoices, Estimates and Payments. | You will not be able to recover these customers and all the related Invoices, Estimates and Payments.",
"created_message": "Customer created successfully",
"updated_message": "Customer updated successfully",
"deleted_message": "Customer deleted successfully | Customers deleted successfully"
@ -230,6 +231,7 @@
"convert_to_invoice": "Convert to Invoice",
"mark_as_sent": "Mark as Sent",
"send_estimate": "Send Estimate",
"resend_estimate": "Resend Estimate",
"record_payment": "Record Payment",
"add_estimate": "Add Estimate",
"save_estimate": "Save Estimate",
@ -316,6 +318,7 @@
"notes": "Notes",
"view": "View",
"send_invoice": "Send Invoice",
"resend_invoice": "Resend Invoice",
"invoice_template": "Invoice Template",
"template": "Template",
"mark_as_sent": "Mark as sent",
@ -618,85 +621,85 @@
"updated_message": "Company information updated successfully"
},
"customization": {
"customization": "customization",
"save": "Save",
"addresses": {
"title": "Addresses",
"section_description": "You can set Customer Billing Address and Customer Shipping Address Format (Displayed in PDF only). ",
"customer_billing_address": "Customer Billing Address",
"customer_shipping_address": "Customer Shipping Address",
"company_address": "Company Address",
"insert_fields": "Insert Fields",
"contact": "Contact",
"address": "Address",
"display_name": "Display Name",
"primary_contact_name": "Primary Contact Name",
"email": "Email",
"website": "Website",
"name": "Name",
"country": "Country",
"state": "State",
"city": "City",
"company_name": "Company Name",
"address_street_1": "Address Street 1",
"address_street_2": "Address Street 2",
"phone": "Phone",
"zip_code": "Zip Code",
"address_setting_updated": "Address Setting updated successfully"
},
"updated_message": "Company information updated successfully",
"customization": "customization",
"save": "Save",
"addresses": {
"title": "Addresses",
"section_description": "You can set Customer Billing Address and Customer Shipping Address Format (Displayed in PDF only). ",
"customer_billing_address": "Customer Billing Address",
"customer_shipping_address": "Customer Shipping Address",
"company_address": "Company Address",
"insert_fields": "Insert Fields",
"contact": "Contact",
"address": "Address",
"display_name": "Display Name",
"primary_contact_name": "Primary Contact Name",
"email": "Email",
"website": "Website",
"name": "Name",
"country": "Country",
"state": "State",
"city": "City",
"company_name": "Company Name",
"address_street_1": "Address Street 1",
"address_street_2": "Address Street 2",
"phone": "Phone",
"zip_code": "Zip Code",
"address_setting_updated": "Address Setting updated successfully"
},
"updated_message": "Company information updated successfully",
"invoices": {
"title": "Invoices",
"notes": "Notes",
"invoice_prefix": "Invoice Prefix",
"invoice_settings": "Invoice Settings",
"autogenerate_invoice_number": "Auto-generate Invoice Number",
"invoice_setting_description": "Disable this, If you don't wish to auto-generate invoice numbers each time you create a new invoice.",
"enter_invoice_prefix": "Enter invoice prefix",
"terms_and_conditions": "Terms and Conditions",
"invoice_setting_updated": "Invoice Setting updated successfully"
},
"invoices": {
"title": "Invoices",
"notes": "Notes",
"invoice_prefix": "Invoice Prefix",
"invoice_settings": "Invoice Settings",
"autogenerate_invoice_number": "Auto-generate Invoice Number",
"invoice_setting_description": "Disable this, If you don't wish to auto-generate invoice numbers each time you create a new invoice.",
"enter_invoice_prefix": "Enter invoice prefix",
"terms_and_conditions": "Terms and Conditions",
"invoice_setting_updated": "Invoice Setting updated successfully"
},
"estimates": {
"title": "Estimates",
"estimate_prefix": "Estimate Prefix",
"estimate_settings": "Estimate Settings",
"autogenerate_estimate_number": "Auto-generate Estimate Number",
"estimate_setting_description": "Disable this, If you don't wish to auto-generate estimate numbers each time you create a new estimate.",
"enter_estimate_prefix": "Enter estmiate prefix",
"estimate_setting_updated": "Estimate Setting updated successfully"
},
"estimates": {
"title": "Estimates",
"estimate_prefix": "Estimate Prefix",
"estimate_settings": "Estimate Settings",
"autogenerate_estimate_number": "Auto-generate Estimate Number",
"estimate_setting_description": "Disable this, If you don't wish to auto-generate estimate numbers each time you create a new estimate.",
"enter_estimate_prefix": "Enter estmiate prefix",
"estimate_setting_updated": "Estimate Setting updated successfully"
},
"payments": {
"title": "Payments",
"payment_prefix": "Payment Prefix",
"payment_settings": "Payment Settings",
"autogenerate_payment_number": "Auto-generate Payment Number",
"payment_setting_description": "Disable this, If you don't wish to auto-generate payment numbers each time you create a new payment.",
"enter_payment_prefix": "Enter Payment Prefix",
"payment_setting_updated": "Payment Setting updated successfully",
"payment_mode": "Payment Mode",
"add_payment_mode": "Add Payment Mode",
"mode_name": "Mode Name",
"payment_mode_added": "Payment Mode Added",
"payment_mode_updated": "Payment Mode Updated",
"payment_mode_confirm_delete":"You will not be able to recover this Payment Mode",
"already_in_use": "Payment Mode is already in use",
"deleted_message": "Payment Mode deleted successfully"
},
"payments": {
"title": "Payments",
"payment_prefix": "Payment Prefix",
"payment_settings": "Payment Settings",
"autogenerate_payment_number": "Auto-generate Payment Number",
"payment_setting_description": "Disable this, If you don't wish to auto-generate payment numbers each time you create a new payment.",
"enter_payment_prefix": "Enter Payment Prefix",
"payment_setting_updated": "Payment Setting updated successfully",
"payment_mode": "Payment Mode",
"add_payment_mode": "Add Payment Mode",
"mode_name": "Mode Name",
"payment_mode_added": "Payment Mode Added",
"payment_mode_updated": "Payment Mode Updated",
"payment_mode_confirm_delete": "You will not be able to recover this Payment Mode",
"already_in_use": "Payment Mode is already in use",
"deleted_message": "Payment Mode deleted successfully"
},
"items": {
"title": "Items",
"units": "units",
"add_item_unit": "Add Item Unit",
"unit_name": "Unit Name",
"item_unit_added": "Item Unit Added",
"item_unit_updated": "Item Unit Updated",
"item_unit_confirm_delete":"You will not be able to recover this Item unit",
"already_in_use": "Item Unit is already in use",
"deleted_message": "Item Unit deleted successfully"
}
"items": {
"title": "Items",
"units": "units",
"add_item_unit": "Add Item Unit",
"unit_name": "Unit Name",
"item_unit_added": "Item Unit Added",
"item_unit_updated": "Item Unit Updated",
"item_unit_confirm_delete": "You will not be able to recover this Item unit",
"already_in_use": "Item Unit is already in use",
"deleted_message": "Item Unit deleted successfully"
}
},
"account_settings": {
"profile_picture": "Profile Picture",
@ -787,7 +790,14 @@
"progress_text": "It will just take a few minutes. Please do not refresh the screen or close the window before the update finishes",
"update_success": "App has been updated! Please wait while your browser window gets reloaded automatically.",
"latest_message": "No update available! You are on the latest version.",
"current_version": "Current Version"
"current_version": "Current Version",
"download_zip_file": "Download ZIP file",
"unzipping_package": "Unzipping Package",
"copying_files": "Copying Files",
"running_migrations": "Running Migrations",
"finishing_update": "Finishing Update",
"update_failed": "Update Failed",
"update_failed_text": "Sorry! Your update failed on : {step} step"
}
},
"wizard": {

View File

@ -62,14 +62,14 @@
"four_zero_four": "404",
"you_got_lost": "Whoops! ¡Te perdiste!",
"go_home": "Volver al Inicio",
"setting_updated": "Configuración actualizada con éxito",
"select_state": "Seleccionar estado",
"select_country": "Seleccionar país",
"select_city": "Seleccionar ciudad",
"street_1": "Calle 1",
"street_2": "Calle 2",
"action_failed": "Accion Fallida"
"action_failed": "Accion Fallida",
"retry": "Procesar de nuevo"
},
"dashboard": {
"select_year": "Seleccionar año",
@ -155,7 +155,7 @@
"select_a_customer": "Selecciona un cliente",
"type_or_click": "Escriba o haga clic para seleccionar",
"confirm_delete": "No podrá recuperar este cliente | No podrá recuperar estos clientes",
"confirm_delete": "No podrá recuperar este cliente y todas las facturas, estimaciones y pagos relacionados. | No podrá recuperar estos clientes y todas las facturas, estimaciones y pagos relacionados.",
"created_message": "Cliente creado con éxito",
"updated_message": "Cliente actualizado con éxito",
"deleted_message": "Cliente eliminado correctamente | Clientes eliminados exitosamente"
@ -602,65 +602,65 @@
"updated_message": "Información de la empresa actualizada con éxito"
},
"customization": {
"customization": "Personalización",
"save": "Guardar",
"addresses": {
"title": "Direcciones",
"section_description": "Puede configurar la Dirección de facturación del cliente y el Formato de dirección de envío del cliente (solo se muestra en PDF).",
"customer_billing_address": "Dirección de facturación del cliente",
"customer_shipping_address": "Dirección de envío del cliente",
"company_address": "Dirección de la compañia",
"insert_fields": "Insertar campos",
"contact": "Contacto",
"address": "Dirección",
"display_name": "Nombre para mostrar",
"primary_contact_name": "Nombre de contacto principal",
"email": "Email",
"website": "Sitio web",
"name": "Nombre",
"country": "País",
"state": "Estado",
"city": "Ciudad",
"company_name": "Nombre de la compañia",
"address_street_1": "Dirección de la calle 1",
"address_street_2": "Dirección de la calle 2",
"phone": "Telefono",
"zip_code": "Codigo postal",
"address_setting_updated": "Configuración de dirección actualizada correctamente"
},
"updated_message": "Información de la empresa actualizada con éxito",
"customization": "Personalización",
"save": "Guardar",
"addresses": {
"title": "Direcciones",
"section_description": "Puede configurar la Dirección de facturación del cliente y el Formato de dirección de envío del cliente (solo se muestra en PDF).",
"customer_billing_address": "Dirección de facturación del cliente",
"customer_shipping_address": "Dirección de envío del cliente",
"company_address": "Dirección de la compañia",
"insert_fields": "Insertar campos",
"contact": "Contacto",
"address": "Dirección",
"display_name": "Nombre para mostrar",
"primary_contact_name": "Nombre de contacto principal",
"email": "Email",
"website": "Sitio web",
"name": "Nombre",
"country": "País",
"state": "Estado",
"city": "Ciudad",
"company_name": "Nombre de la compañia",
"address_street_1": "Dirección de la calle 1",
"address_street_2": "Dirección de la calle 2",
"phone": "Telefono",
"zip_code": "Codigo postal",
"address_setting_updated": "Configuración de dirección actualizada correctamente"
},
"updated_message": "Información de la empresa actualizada con éxito",
"invoices": {
"title": "Facturas",
"notes": "Notas",
"invoice_prefix": "Prefijo de las facturas",
"invoice_settings": "Ajustes de facturas",
"autogenerate_invoice_number": "Autogenerar número de factura",
"invoice_setting_description": "Desactive esto, si no desea generar automáticamente números de factura cada vez que cree una nueva factura.",
"enter_invoice_prefix": "Introduzca el prefijo de factura",
"terms_and_conditions": "Términos y Condiciones",
"invoice_setting_updated": "Configuración de factura actualizada correctamente"
},
"invoices": {
"title": "Facturas",
"notes": "Notas",
"invoice_prefix": "Prefijo de las facturas",
"invoice_settings": "Ajustes de facturas",
"autogenerate_invoice_number": "Autogenerar número de factura",
"invoice_setting_description": "Desactive esto, si no desea generar automáticamente números de factura cada vez que cree una nueva factura.",
"enter_invoice_prefix": "Introduzca el prefijo de factura",
"terms_and_conditions": "Términos y Condiciones",
"invoice_setting_updated": "Configuración de factura actualizada correctamente"
},
"estimates": {
"title": "Estimaciones",
"estimate_prefix": "Prefijo de los presupuestos",
"estimate_settings": "Ajustes de presupuestos",
"autogenerate_estimate_number": "Autogenerar número de presupuesto",
"estimate_setting_description": "Desactive esto, si no desea generar automáticamente números de presupuesto cada vez que cree un nuevo presupuesto.",
"enter_estimate_prefix": "Introduzca el prefijo de presupuesto",
"estimate_setting_updated": "Configuración de presupuestos actualizada correctamente"
},
"estimates": {
"title": "Estimaciones",
"estimate_prefix": "Prefijo de los presupuestos",
"estimate_settings": "Ajustes de presupuestos",
"autogenerate_estimate_number": "Autogenerar número de presupuesto",
"estimate_setting_description": "Desactive esto, si no desea generar automáticamente números de presupuesto cada vez que cree un nuevo presupuesto.",
"enter_estimate_prefix": "Introduzca el prefijo de presupuesto",
"estimate_setting_updated": "Configuración de presupuestos actualizada correctamente"
},
"payments": {
"title": "Payments",
"payment_prefix": "Prefijo de los pagos",
"payment_settings": "Ajustes de pagos",
"autogenerate_payment_number": "Autogenerar número de pago",
"payment_setting_description": "Desactive esto, si no desea generar automáticamente números de pago cada vez que cree un nuevo pago.",
"enter_payment_prefix": "Introduzca el prefijo de pago",
"payment_setting_updated": "Configuración de pagos actualizada correctamente"
}
"payments": {
"title": "Payments",
"payment_prefix": "Prefijo de los pagos",
"payment_settings": "Ajustes de pagos",
"autogenerate_payment_number": "Autogenerar número de pago",
"payment_setting_description": "Desactive esto, si no desea generar automáticamente números de pago cada vez que cree un nuevo pago.",
"enter_payment_prefix": "Introduzca el prefijo de pago",
"payment_setting_updated": "Configuración de pagos actualizada correctamente"
}
},
"account_settings": {
"profile_picture": "Foto de perfil",
@ -751,7 +751,14 @@
"progress_text": "Solo tomará unos minutos. No actualice la pantalla ni cierre la ventana antes de que finalice la actualización.",
"update_success": "¡La aplicación ha sido actualizada! Espere mientras la ventana de su navegador se vuelve a cargar automáticamente.",
"latest_message": "¡Actualización no disponible! Estás en la última versión.",
"current_version": "Versión actual"
"current_version": "Versión actual",
"download_zip_file": "Descargar archivo ZIP",
"unzipping_package": "Descomprimir paquete",
"copying_files": "Copiando documentos",
"running_migrations": "Ejecutar migraciones",
"finishing_update": "Actualización final",
"update_failed": "Actualización fallida",
"update_failed_text": "¡Lo siento! Su actualización falló el: {step} paso"
}
},
"wizard": {

View File

@ -17,6 +17,7 @@
"save": "Sauvegarder",
"cancel": "Annuler",
"update": "Mise à jour",
"deselect": "Retirer",
"download": "Télécharger",
"from_date": "A partir de la date",
"to_date": "À ce jour",
@ -28,7 +29,7 @@
"filter": "Filtre",
"delete": "Effacer",
"edit": "Modifier",
"view": "Vue",
"view": "Voir",
"add_new_item": "Ajoute un nouvel objet",
"clear_all": "Tout effacer",
"showing": "Montrant",
@ -62,14 +63,21 @@
"four_zero_four": "404",
"you_got_lost": "Oups! Vous vous êtes perdus!",
"go_home": "Rentrer chez soi",
"test_mail_conf": "Tester la configuration",
"send_mail_successfully": "Mail envoyé avec succès",
"setting_updated": "Réglage mis à jour avec succès",
"select_state": "Sélectionnez l'état",
"select_country": "Choisissez le pays",
"select_city": "Sélectionnez une ville",
"street_1": "Rue 1",
"street_2": "Rue # 2",
"action_failed": "Action : échoué"
"action_failed": "Action : échoué",
"sort_by": "Trier par",
"ascending": "Ascendant",
"descending": "Descendant",
"subject": "matière",
"message": "Message",
"retry": "Réessayez"
},
"dashboard": {
"select_year": "Sélectionnez l'année",
@ -160,7 +168,7 @@
"select_a_customer": "Sélectionnez un client",
"type_or_click": "Tapez ou cliquez pour sélectionner",
"confirm_delete": "Vous ne pourrez pas récupérer ce client | Vous ne pourrez pas récupérer ces clients",
"confirm_delete": "Vous ne pourrez pas récupérer ce client et toutes les factures, devis et paiements associés. | Vous ne serez pas en mesure de récupérer ces clients et toutes les factures, devis et paiements associés.",
"created_message": "Client créé avec succès",
"updated_message": "Client mis à jour avec succès",
"deleted_message": "Client supprimé avec succès | Les clients supprimés avec succès"
@ -202,24 +210,24 @@
"all": "Tout",
"paid": "Payé",
"unpaid": "Non payé",
"customer": "CLIENT CLIENT",
"ref_no": "REF NO.",
"number": "NOMBRE",
"customer": "Client",
"ref_no": "Réf.",
"number": "N°",
"amount_due": "MONTANT DÛ",
"partially_paid": "Partiellement payé",
"total": "Totale",
"total": "Total",
"discount": "Remise",
"sub_total": "Total partiel",
"estimate_number": "Numéro destimation",
"estimate_number": "N°",
"ref_number": "Numéro de ref",
"contact": "Contact",
"add_item": "Ajouter un article",
"date": "Date",
"due_date": "Date déchéance",
"due_date": "Date d'échéance",
"expiry_date": "Date dexpiration",
"status": "Statut",
"add_tax": "Ajouter une taxe",
"amount": "Montante",
"amount": "Montant",
"action": "action",
"notes": "Remarques",
"tax": "Impôt",
@ -227,7 +235,7 @@
"convert_to_invoice": "Convertir en facture",
"mark_as_sent": "Marquer comme envoyé",
"send_estimate": "Envoyer un devis",
"record_payment": "Record de paiement",
"record_payment": "Enregistrer un paiement",
"add_estimate": "Ajouter un devis",
"save_estimate": "Sauvegarder le devis",
"confirm_conversion": "Vous souhaitez convertir ce devis en facture?",
@ -269,14 +277,17 @@
"quantity": "Quantité",
"price": "Prix",
"discount": "Remise",
"total": "Totale",
"total": "Total",
"total_discount": "Remise totale",
"sub_total": "Total partiel",
"tax": "Impôt",
"amount": "Montante",
"amount": "Montant",
"select_an_item": "Tapez ou cliquez pour sélectionner un élément",
"type_item_description": "Type Item Description (optionnel)"
}
},
"no_matching_estimates": "Aucune estimation correspondante!",
"user_email_does_not_exist": "L'e-mail de l'utilisateur n'existe pas",
"something_went_wrong": "quelque chose a mal tourné"
},
"invoices": {
"title": "Factures",
@ -287,13 +298,13 @@
"all": "Toute",
"paid": "Payé",
"unpaid": "Non payé",
"customer": "CLIENTE CLIENT",
"paid_status": "Statut payé",
"customer": "CLIENT",
"paid_status": "Paiement",
"ref_no": "REF NO.",
"number": "NOMBRE",
"number": "N°",
"amount_due": "MONTANT DÛ",
"partially_paid": "Partiellement payé",
"total": "Totale Total",
"total": "Total",
"discount": "Remise",
"sub_total": "Total partiel",
"invoice": "Facture | Factures",
@ -302,21 +313,23 @@
"contact": "Contact",
"add_item": "Ajouter un article",
"date": "Date",
"due_date": "Date déchéance",
"due_date": "Date d'échéance",
"status": "Statut",
"add_tax": "Ajouter une taxe",
"amount": "Montante Montant",
"amount": "Montant",
"action": "action",
"notes": "Remarques",
"view": "Vue",
"view": "Voir",
"send_invoice": "Envoyer une facture",
"cloned_successfully": "Facture clonée avec succès",
"clone_invoice": "Cloner",
"invoice_template": "Modèle de facture",
"template": "Modèle",
"mark_as_sent": "Marquer comme envoyé",
"invoice_mark_as_sent": "Cette facture sera marquée comme envoyé",
"confirm_send": "Cette facture sera envoyée par courrier électronique au client.",
"invoice_date": "Date de facturation",
"record_payment": "Record de paiement",
"record_payment": "Enregister un paiement",
"add_new_invoice": "Ajouter une nouvelle facture",
"update_expense": "Frais de mise à jour",
"edit_invoice": "Modifier la facture",
@ -335,11 +348,11 @@
"quantity": "Quantité",
"price": "Prix",
"discount": "Remise",
"total": "Totale Total",
"total": "Total",
"total_discount": "Remise totale",
"sub_total": "Total partiel",
"tax": "Impôt",
"amount": "Montante Montant",
"amount": "Montant",
"select_an_item": "Tapez ou cliquez pour sélectionner un élément",
"type_item_description": "Type Item Description (optionnel)"
},
@ -349,7 +362,12 @@
"updated_message": "Facture mise à jour avec succès",
"deleted_message": "La Facture a été supprimée ! | Les Factures ont été supprimées !",
"marked_as_sent_message": "Facture supprimée avec succès | Factures supprimées avec succès",
"invalid_due_amount_message": "Le paiement entré est supérieur au montant total dû pour cette facture. Veuillez vérifier et réessayer"
"invalid_due_amount_message": "Le paiement entré est supérieur au montant total dû pour cette facture. Veuillez vérifier et réessayer",
"confirm_send_invoice": "Cette facture sera envoyée par email au client",
"no_matching_invoices": "Aucune facture correspondante!",
"confirm_clone": "Cette facture sera clonée dans une nouvelle facture",
"user_email_does_not_exist": "L'e-mail de l'utilisateur n'existe pas",
"something_went_wrong": "quelque chose a mal tourné"
},
"credit_notes": {
"title": "Notes de crédit",
@ -357,7 +375,7 @@
"credit_notes": "Notes de crédit",
"contact": "Contact",
"date": "Date",
"amount": "Montante Montant",
"amount": "Montant Montant",
"action": "action",
"credit_number": "Numéro de crédit",
"notes": "Remarques",
@ -368,7 +386,7 @@
"quantity": "Quantité",
"price": "Prix",
"discount": "Remise",
"total": "Totale Total",
"total": "Total",
"total_discount": "Remise totale",
"sub_total": "Total partiel",
"tax": "Impôt"
@ -377,12 +395,12 @@
"payments": {
"title": "Paiements",
"payments_list": "Liste de paiements",
"record_payment": "Record de paiement",
"customer": "Client Client",
"record_payment": "Enregistrer un paiement",
"customer": "Client",
"date": "Date",
"amount": "Montant Montant",
"amount": "Montant",
"action": "action",
"payment_number": "Numéro de paiement",
"payment_number": "N°",
"payment_mode": "Mode de paiement",
"invoice": "Facture dachat",
"note": "Remarque",
@ -391,6 +409,7 @@
"edit_payment": "Modifier le paiement",
"view_payment": "Voir le paiement",
"add_new_payment": "Ajouter un nouveau paiement",
"send_payment_receipt": "Envoyer le reçu",
"save_payment": "Enregistrer le paiement",
"update_payment": "Mettre à jour le paiement",
"payment": "Paiement | Paiements",
@ -403,7 +422,11 @@
"created_message": "Paiement créé avec succès",
"updated_message": "Paiement mis à jour avec succès",
"deleted_message": "Paiement supprimé avec succès | Paiements supprimés avec succès",
"invalid_amount_message": "Le montant du paiement est invalide"
"invalid_amount_message": "Le montant du paiement est invalide",
"confirm_send_payment": "Ce paiement sera envoyé par e-mail au client",
"send_payment_successfully": "Paiement envoyé avec succès",
"user_email_does_not_exist": "L'e-mail de l'utilisateur n'existe pas",
"something_went_wrong": "quelque chose a mal tourné"
},
"expenses": {
"title": "Dépenses",
@ -425,7 +448,7 @@
"date": "Date de dépense",
"add_expense": "Ajouter une dépense",
"add_new_expense": "Ajouter une nouvelle dépense",
"save_expense": "Économiser des dépenses",
"save_expense": "Enregistrer la dépense",
"update_expense": "Frais de mise à jour",
"download_receipt": "Télécharger le reçu",
"edit_expense": "Modifier les dépenses",
@ -449,7 +472,8 @@
"new_category": "Nouvelle catégorie",
"category": "Catégorie | Les catégories",
"select_a_category": "choisissez une catégorie"
}
},
"customer": "Client"
},
"login": {
"email": "Email",
@ -462,7 +486,8 @@
"enter_email": "Entrer email",
"enter_password": "Entrer le mot de passe",
"retype_password": "Retaper le mot de passe",
"login_placeholder": "mail@example.com"
"login_placeholder": "mail@example.com",
"password_reset_successfully": "Réinitialisation du mot de passe réussie"
},
"reports": {
"title": "rapport",
@ -501,7 +526,7 @@
"invoice": "Facture d'achat",
"invoice_date": "Date de facturation",
"due_date": "Date déchéance",
"amount": "Montante ",
"amount": "Montant ",
"contact_name": "Nom du contact",
"status": "Statut"
},
@ -509,7 +534,7 @@
"estimate": "Devis",
"estimate_date": "Date du devis",
"due_date": "Date d'échéance",
"estimate_number": "Numéro d'estimation",
"estimate_number": "N°",
"ref_number": "Numéro de ref",
"amount": "Montant",
"contact_name": "Nom du contact",
@ -529,6 +554,7 @@
"menu_title": {
"account_settings": "Paramètres du compte",
"company_information": "Informations sur la société",
"customization": "Personnalisation",
"preferences": "Préférences",
"notifications": "Les notifications",
"tax_types": "Types de taxe",
@ -593,10 +619,90 @@
"state": "Etat",
"city": "Ville",
"address": "Adresse",
"zip": "Zip",
"save": "sauver",
"zip": "Code postal",
"save": "Sauvegarder",
"updated_message": "Informations sur la société mises à jour avec succès"
},
"customization": {
"customization": "Personnalisation",
"save": "Sauvegarder",
"addresses": {
"title": "Adresses",
"section_description": "You can set Customer Billing Address and Customer Shipping Address Format (Displayed in PDF only). ",
"customer_billing_address": "Adresse de paiement",
"customer_shipping_address": "Adresse de livraison",
"company_address": "Adresse de l'entreprise",
"insert_fields": "Ajouter des champs",
"contact": "Contact",
"address": "Addresse",
"display_name": "Nom",
"primary_contact_name": "Nom du contact principal",
"email": "Email",
"website": "Website",
"name": "Nom",
"country": "Pays",
"state": "State",
"city": "Ville",
"company_name": "Nom de l'entreprise",
"address_street_1": "Rue",
"address_street_2": "Complément",
"phone": "Téléphone",
"zip_code": "Code postal",
"address_setting_updated": "Adresse mise à jour avec succès"
},
"updated_message": "Informations de l'entreprise mises à jour",
"invoices": {
"title": "Factures",
"notes": "Notes",
"invoice_prefix": "Préfixe",
"invoice_settings": "Paramètre",
"autogenerate_invoice_number": "Générer automatiquement le numéro de facture",
"invoice_setting_description": "Désactivez cette option si vous ne souhaitez pas générer automatiquement les numéros de facture à chaque fois que vous en créez une nouvelle.",
"enter_invoice_prefix": "Ajouter le préfixe de facture",
"terms_and_conditions": "Termes et conditions",
"invoice_setting_updated": "Paramètres de facturation mis à jour"
},
"estimates": {
"title": "Devis",
"estimate_prefix": "Préfixe",
"estimate_settings": "Paramètre",
"autogenerate_estimate_number": "Générer automatiquement le numéro de devis",
"estimate_setting_description": "Désactivez cette option si vous ne souhaitez pas générer automatiquement les numéros de devis à chaque fois que vous en créez un nouveau.",
"estimate_setting_updated": "Paramètres de devis mis à jour"
},
"payments": {
"title": "Paiements",
"payment_prefix": "Préfixe",
"payment_settings": "Paramètre",
"autogenerate_payment_number": "Générer automatiquement le numéro de paiement",
"payment_setting_description": "Désactivez cette option si vous ne souhaitez pas générer automatiquement les numéros de paiement à chaque fois que vous en créez un nouveau.",
"payment_setting_updated": "Les paramètres de paiement ont bien été mis à jour",
"payment_mode": "Mode de paiement",
"add_payment_mode": "Ajouter un mode de paiement",
"mode_name": "Nom",
"payment_mode_added": "Mode de paiement ajouté",
"payment_mode_updated": "Mode de paiement mis à jour",
"payment_mode_confirm_delete": "Êtes-vous sur de supprimer ce mode de paiement ?",
"already_in_use": "Ce mode de paiement existe déjà.",
"deleted_message": "Mode de paiement supprimé avec succès"
},
"items": {
"title": "Articles",
"units": "Unités",
"add_item_unit": "Ajouter une unité",
"unit_name": "Nom",
"item_unit_added": "Unité ajouté",
"item_unit_updated": "Unité mis à jour",
"item_unit_confirm_delete": "Êtes-vous sur de supprimer cette unité ?",
"already_in_use": "Cette unité existe déjà",
"deleted_message": "Unité supprimé avec succès"
}
},
"account_settings": {
"profile_picture": "Image de profil",
"name": "Nom",
@ -604,7 +710,7 @@
"password": "Mot de passe",
"confirm_password": "Confirmez le mot de passe",
"account_settings": "Paramètres du compte",
"save": "sauver",
"save": "Sauvegarder",
"section_description": "Vous pouvez mettre à jour votre nom, votre email et votre mot de passe en utilisant le formulaire ci-dessous.",
"updated_message": "Paramètres du compte mis à jour avec succès"
},
@ -619,10 +725,10 @@
"email": "Envoyer des notifications à",
"description": "Quelles notifications par courrier électronique souhaitez-vous recevoir lorsque quelque chose change?",
"invoice_viewed": "Facture consultée",
"invoice_viewed_desc": "Lorsque votre client visualise la facture envoyée via le tableau de bord du cratère.",
"estimate_viewed": "Estimation vue",
"estimate_viewed_desc": "Lorsque votre client visualise le devis envoyé via le tableau de bord du cratère.",
"save": "sauver",
"invoice_viewed_desc": "Lorsque le client visualise la facture envoyée via le tableau de bord de Neptune.",
"estimate_viewed": "Devis consulté",
"estimate_viewed_desc": "Lorsque le client visualise le devis envoyé via le tableau de bord de Neptune.",
"save": "Sauvegarder",
"email_save_message": "Email enregistré avec succès",
"invoice_viewed_message": "Facture consultée",
"estimate_viewed_message": "Estimation vue",
@ -652,7 +758,7 @@
"description": "Des catégories sont requises pour ajouter des entrées de dépenses. Vous pouvez ajouter ou supprimer ces catégories selon vos préférences.",
"add_new_category": "Ajouter une nouvelle catégorie",
"category_name": "Nom de catégorie",
"category_description": "La description",
"category_description": "Description",
"created_message": "Catégorie de dépenses créée avec succès",
"deleted_message": "La catégorie de dépenses a été supprimée avec succès",
"updated_message": "Catégorie de dépenses mise à jour avec succès",
@ -668,7 +774,7 @@
"discount_setting": "Réglage de remise",
"discount_per_item": "Remise par article",
"discount_setting_description": "Activez cette option si vous souhaitez ajouter une remise à des postes de facture individuels. Par défaut, les remises sont ajoutées directement à la facture.",
"save": "sauver",
"save": "Sauvegarder",
"preference": "Préférence | Préférences",
"general_settings": "Préférences par défaut pour le système.",
"updated_message": "Préférences mises à jour avec succès",
@ -689,7 +795,14 @@
"progress_text": "Cela ne prendra que quelques minutes. S'il vous plaît ne pas actualiser l'écran ou fermer la fenêtre avant la fin de la mise à jour",
"update_success": "App a été mis à jour! Veuillez patienter pendant le rechargement automatique de la fenêtre de votre navigateur.",
"latest_message": "Pas de mise a jour disponible! Vous êtes sur la dernière version.",
"current_version": "Version actuelle"
"current_version": "Version actuelle",
"download_zip_file": "Télécharger le fichier ZIP",
"unzipping_package": "Dézipper le package",
"copying_files": "Copie de fichiers",
"running_migrations": "Exécution de migrations",
"finishing_update": "Mise à jour de finition",
"update_failed": "Mise à jour a échoué",
"update_failed_text": "Désolé! Votre mise à jour a échoué à: {step} étape"
}
},
"wizard": {
@ -774,7 +887,8 @@
"success": {
"mail_variables_save_successfully": "Email configuré avec succès",
"database_variables_save_successfully": "Base de données configurée avec succès."
}
},
"skip": "sauter"
},
"layout_login": {
"copyright_crater": "Copyright @ Crater - 2020",
@ -783,7 +897,6 @@
"small_businesses": "Petites entreprises ",
"crater_help": "Crater vous aide à suivre vos dépenses, à enregistrer vos paiements et à générer de belles",
"invoices_and_estimates": "factures et devis avec possibilité de choisir plusieurs modèles."
},
"validation": {
"invalid_url": "URL invalide (ex: http://www.crater.com)",
@ -814,6 +927,7 @@
"maximum_options_error": "Maximum de {max} options sélectionnées. Commencez par supprimer une option sélectionnée pour en sélectionner une autre.",
"notes_maxlength": "Les notes ne doivent pas dépasser 255 caractères.",
"address_maxlength": "L'adresse ne doit pas dépasser 255 caractères.",
"ref_number_maxlength": "Le numéro de référence ne doit pas dépasser 255 caractères."
"ref_number_maxlength": "Le numéro de référence ne doit pas dépasser 255 caractères.",
"email_already_taken": "Un compte est déjà associé à cette adresse e-mail."
}
}

View File

@ -19,8 +19,8 @@ const i18n = new VueI18n({
ar,
de,
pt_BR,
it
}
it,
},
})
export default i18n

View File

@ -71,14 +71,14 @@
"go_home": "Vai alla Home",
"test_mail_conf": "Configurazione della mail di test",
"send_mail_successfully": "Mail inviata con successo",
"setting_updated": "Configurazioni aggiornate con successo",
"select_state": "Seleziona lo Stato",
"select_country": "Seleziona Paese",
"select_city": "Seleziona Città",
"street_1": "Indirizzo 1",
"street_2": "Indirizzo 2",
"action_failed": "Errore"
"action_failed": "Errore",
"retry": "Retry"
},
"dashboard": {
"select_year": "Seleziona anno",
@ -164,7 +164,7 @@
"select_a_customer": "Seleziona Cliente",
"type_or_click": "Scrivi o clicca per selezionare",
"confirm_delete": "Non potrai più recuperare il cliente cancellato | Non potrai più recuperare i clienti cancellati",
"confirm_delete": "Non sarai in grado di recuperare questo cliente e tutte le relative fatture, stime e pagamenti. | Non sarai in grado di recuperare questi clienti e tutte le relative fatture, stime e pagamenti.",
"created_message": "Cliente creato con successo",
"updated_message": "Cliente aggiornato con successo",
"deleted_message": "Cliente cancellato con successo | Clienti cancellati con successo"
@ -617,85 +617,85 @@
"updated_message": "Informazioni Azienda aggiornate con successo."
},
"customization": {
"customization": "personalizzazione",
"save": "Salva",
"addresses": {
"title": "Indirizzi",
"section_description": "Puoi settare l'indirizzo di fatturazione del Cliente e/o il formato dell'indirizzo di spedizione (Mostrato solo sul PDF). ",
"customer_billing_address": "Indirizzo Fatturazione Cliente",
"customer_shipping_address": "Indirizzo spedizione Cliente",
"company_address": "Indirizzo Azienda",
"insert_fields": "Inserisci Campi",
"contact": "Contatto",
"address": "Indirizzo",
"display_name": "Mostra nome",
"primary_contact_name": "Nome contatto primario",
"email": "Email",
"website": "Sito web",
"name": "Nome",
"country": "Paese",
"state": "Stato",
"city": "Città",
"company_name": "Nome Azienda",
"address_street_1": "Indirizzo 1",
"address_street_2": "Indirizzo 2",
"phone": "Telefono",
"zip_code": "CAP/ZIP Code",
"address_setting_updated": "Indirizzo aggiornato con Successo"
},
"updated_message": "Info azienda aggiornate con successo",
"customization": "personalizzazione",
"save": "Salva",
"addresses": {
"title": "Indirizzi",
"section_description": "Puoi settare l'indirizzo di fatturazione del Cliente e/o il formato dell'indirizzo di spedizione (Mostrato solo sul PDF). ",
"customer_billing_address": "Indirizzo Fatturazione Cliente",
"customer_shipping_address": "Indirizzo spedizione Cliente",
"company_address": "Indirizzo Azienda",
"insert_fields": "Inserisci Campi",
"contact": "Contatto",
"address": "Indirizzo",
"display_name": "Mostra nome",
"primary_contact_name": "Nome contatto primario",
"email": "Email",
"website": "Sito web",
"name": "Nome",
"country": "Paese",
"state": "Stato",
"city": "Città",
"company_name": "Nome Azienda",
"address_street_1": "Indirizzo 1",
"address_street_2": "Indirizzo 2",
"phone": "Telefono",
"zip_code": "CAP/ZIP Code",
"address_setting_updated": "Indirizzo aggiornato con Successo"
},
"updated_message": "Info azienda aggiornate con successo",
"invoices": {
"title": "Fatture",
"notes": "Note",
"invoice_prefix": "Prefisso Fattura",
"invoice_settings": "Impostazioni fattura",
"autogenerate_invoice_number": "Auto genera numero di fattura",
"invoice_setting_description": "Disabilita, se non vuoi auto-generare i numeri delle fatture ogni volta che crei una nuova fattura.",
"enter_invoice_prefix": "Inserisci prefisso fattura",
"terms_and_conditions": "Termini e Condizioni",
"invoice_setting_updated": "Impostazioni fatture aggiornate con successo"
},
"invoices": {
"title": "Fatture",
"notes": "Note",
"invoice_prefix": "Prefisso Fattura",
"invoice_settings": "Impostazioni fattura",
"autogenerate_invoice_number": "Auto genera numero di fattura",
"invoice_setting_description": "Disabilita, se non vuoi auto-generare i numeri delle fatture ogni volta che crei una nuova fattura.",
"enter_invoice_prefix": "Inserisci prefisso fattura",
"terms_and_conditions": "Termini e Condizioni",
"invoice_setting_updated": "Impostazioni fatture aggiornate con successo"
},
"estimates": {
"title": "Preventivi",
"estimate_prefix": "Prefisso Preventivi",
"estimate_settings": "Impostazioni Preventivi",
"autogenerate_estimate_number": "Auto-genera Numero di preventivo",
"estimate_setting_description": "Disabilita, se non vuoi autogenerare il numero di preventivo ogni volta che ne viene creato uno nuovo.",
"enter_estimate_prefix": "Inserisci prefisso preventivo",
"estimate_setting_updated": "Impostazioni preventivi aggiornate con successo"
},
"estimates": {
"title": "Preventivi",
"estimate_prefix": "Prefisso Preventivi",
"estimate_settings": "Impostazioni Preventivi",
"autogenerate_estimate_number": "Auto-genera Numero di preventivo",
"estimate_setting_description": "Disabilita, se non vuoi autogenerare il numero di preventivo ogni volta che ne viene creato uno nuovo.",
"enter_estimate_prefix": "Inserisci prefisso preventivo",
"estimate_setting_updated": "Impostazioni preventivi aggiornate con successo"
},
"payments": {
"title": "Pagamenti",
"payment_prefix": "Prefisso Pagamento",
"payment_settings": "Impostazioni Pagamento",
"autogenerate_payment_number": "Auto genera il numero di Pagamento",
"payment_setting_description": "Disabilita, se non vuoi autogenerare il numero di pagamento ogni volta che ne viene creato uno nuovo.",
"enter_payment_prefix": "Inserisci prefisso di pagamento",
"payment_setting_updated": "Impostazioni di pagamento aggiornate con successo",
"payment_mode": "Modalità di pagamento",
"add_payment_mode": "Aggiungi modalità di pagamento",
"mode_name": "Nome modalità",
"payment_mode_added": "Modalità di pagamento aggiunta",
"payment_mode_updated": "Modalità di pagamento aggiornata",
"payment_mode_confirm_delete":"Non potrai ripristinare la modalità di pagamento",
"already_in_use": "Modalità di pagamento già in uso",
"deleted_message": "Payment Mode deleted successfully"
},
"payments": {
"title": "Pagamenti",
"payment_prefix": "Prefisso Pagamento",
"payment_settings": "Impostazioni Pagamento",
"autogenerate_payment_number": "Auto genera il numero di Pagamento",
"payment_setting_description": "Disabilita, se non vuoi autogenerare il numero di pagamento ogni volta che ne viene creato uno nuovo.",
"enter_payment_prefix": "Inserisci prefisso di pagamento",
"payment_setting_updated": "Impostazioni di pagamento aggiornate con successo",
"payment_mode": "Modalità di pagamento",
"add_payment_mode": "Aggiungi modalità di pagamento",
"mode_name": "Nome modalità",
"payment_mode_added": "Modalità di pagamento aggiunta",
"payment_mode_updated": "Modalità di pagamento aggiornata",
"payment_mode_confirm_delete": "Non potrai ripristinare la modalità di pagamento",
"already_in_use": "Modalità di pagamento già in uso",
"deleted_message": "Payment Mode deleted successfully"
},
"items": {
"title": "Items",
"units": "unità",
"add_item_unit": "Aggiungi Unità Item",
"unit_name": "Nome",
"item_unit_added": "Unità aggiunta",
"item_unit_updated": "Unità aggiornata",
"item_unit_confirm_delete":"Non potrai ripristinare questa unità Item",
"already_in_use": "Unità Item già in uso",
"deleted_message": "Unità item eliminata con successo"
}
"items": {
"title": "Items",
"units": "unità",
"add_item_unit": "Aggiungi Unità Item",
"unit_name": "Nome",
"item_unit_added": "Unità aggiunta",
"item_unit_updated": "Unità aggiornata",
"item_unit_confirm_delete": "Non potrai ripristinare questa unità Item",
"already_in_use": "Unità Item già in uso",
"deleted_message": "Unità item eliminata con successo"
}
},
"account_settings": {
"profile_picture": "Immagine profilo",
@ -786,7 +786,14 @@
"progress_text": "Sarà necessario qualche minuto. Per favore non aggiornare la pagina e non chiudere la finestra prima che l'aggiornamento sia completato",
"update_success": "L'App è aggiornata! Attendi che la pagina venga ricaricata automaticamente.",
"latest_message": "Nessun aggiornamneto disponibile! Sei già alla versione più recente.",
"current_version": "Versione corrente"
"current_version": "Versione corrente",
"download_zip_file": "Scarica il file ZIP",
"unzipping_package": "Pacchetto di decompressione",
"copying_files": "Copia dei file",
"running_migrations": "Esecuzione delle migrazioni",
"finishing_update": "Aggiornamento di finitura",
"update_failed": "Aggiornamento non riuscito",
"update_failed_text": "Scusate! L'aggiornamento non è riuscito il: passaggio {step}"
}
},
"wizard": {

View File

@ -62,14 +62,14 @@
"four_zero_four": "404",
"you_got_lost": "Ops! Se perdeu!",
"go_home": "Ir para Home",
"setting_updated": "Configuração atualizada com sucesso",
"select_state": "Selecione Estado",
"select_country": "Selecionar pais",
"select_city": "Selecionar cidade",
"street_1": "Rua 1",
"street_2": "Rua # 2",
"action_failed": "Ação: Falhou"
"action_failed": "Ação: Falhou",
"retry": "Atualização falhou"
},
"dashboard": {
"select_year": "Selecione Ano",
@ -155,7 +155,7 @@
"select_a_customer": "Selecione um cliente",
"type_or_click": "Digite ou clique para selecionar",
"confirm_delete": "Você não poderá recuperar este cliente | Você não poderá recuperar esses clientes",
"confirm_delete": "Você não poderá recuperar este cliente e todas as faturas, estimativas e pagamentos relacionados. | Você não poderá recuperar esses clientes e todas as faturas, estimativas e pagamentos relacionados.",
"created_message": "Cliente criado com sucesso",
"updated_message": "Cliente atualizado com sucesso",
"deleted_message": "Cliente excluído com sucesso | Clientes excluídos com sucesso"
@ -528,7 +528,7 @@
"date_range": "Selecionar período"
}
},
"settings": {
"settings": {
"menu_title": {
"account_settings": "Configurações da conta",
"company_information": "Informações da Empresa",
@ -602,281 +602,288 @@
"updated_message": "Informações da Empresa atualizadas com sucesso"
},
"customization": {
"customization": "Personalizar",
"save": "Salvar",
"addresses": {
"title": "Endereço",
"section_description": "Você pode definir o endereço de cobrança do cliente e o formato do endereço de entrega do cliente (exibido apenas em PDF).",
"customer_billing_address": "Endereço de Cobrança do Cliente",
"customer_shipping_address": "Endereço de Entrega do Cliente",
"company_address": "Endereço da Empresa",
"insert_fields": "Inserir Campos",
"contact": "Contato",
"address": "Endereço",
"display_name": "Nome em Exibição",
"primary_contact_name": "Nome do Contato Principal",
"email": "Email",
"website": "Website",
"name": "Nome",
"country": "Pais",
"state": "Estado",
"city": "Cidade",
"company_name": "Nome da Empresa",
"address_street_1": "Endereço Rua 1",
"address_street_2": "Endereço Rua 2",
"phone": "Telefone",
"zip_code": "CEP",
"address_setting_updated": "Configuração de Endereço Atualizada com Sucesso"
},
"updated_message": "Informações da Empresa atualizadas com sucesso",
"invoices": {
"title": "Faturas",
"notes": "Notas",
"invoice_prefix": "Fatura Prefixo",
"invoice_settings": "Configrações da Fatura",
"autogenerate_invoice_number": "Gerar automaticamente o número da Fatura",
"invoice_setting_description": "Desative isso, se você não deseja gerar automaticamente números da Fatura sempre que criar uma nova.",
"enter_invoice_prefix": "Digite o prefixo da Fatura",
"terms_and_conditions": "Termos e Condições",
"invoice_setting_updated": "Configuração da Fatura atualizada com sucesso"
},
"estimates": {
"title": "Orçamentos",
"estimate_prefix": "Orçamento Prefixo",
"estimate_settings": "Configurações do Orçamento",
"autogenerate_estimate_number": "Gerar automaticamente o número do Orçamento",
"estimate_setting_description": "Desative isso, se você não deseja gerar automaticamente números do Orçamento sempre que criar um novo.",
"enter_estimate_prefix": "Digite o prefixo do Orçamento",
"estimate_setting_updated": "Configuração do Orçamento atualizada com sucesso"
},
"payments": {
"title": "Pagamentos",
"payment_prefix": "Pagamento Prefixo",
"payment_settings": "Configurações de Pagamento",
"autogenerate_payment_number": "Gerar automaticamente número do Pagamento",
"payment_setting_description": "Desative isso, se você não deseja gerar automaticamente números do Pagamento sempre que criar um novo.",
"enter_payment_prefix": "Digite o Prefixo do Pagamento",
"payment_setting_updated": "Configurações de Pagamento atualizada com sucesso"
}
},
"account_settings": {
"profile_picture": "Foto do Perfil",
"name": "Nome",
"customization": "Personalizar",
"save": "Salvar",
"addresses": {
"title": "Endereço",
"section_description": "Você pode definir o endereço de cobrança do cliente e o formato do endereço de entrega do cliente (exibido apenas em PDF).",
"customer_billing_address": "Endereço de Cobrança do Cliente",
"customer_shipping_address": "Endereço de Entrega do Cliente",
"company_address": "Endereço da Empresa",
"insert_fields": "Inserir Campos",
"contact": "Contato",
"address": "Endereço",
"display_name": "Nome em Exibição",
"primary_contact_name": "Nome do Contato Principal",
"email": "Email",
"password": "Senha",
"confirm_password": "Confirmar Senha",
"account_settings": "Configurações da conta",
"save": "Salvar",
"section_description": "Você pode atualizar seu nome, email e senha usando o formulário abaixo.",
"updated_message": "Configurações da conta atualizadas com sucesso"
},
"user_profile": {
"website": "Website",
"name": "Nome",
"email": "Email",
"password": "Password",
"confirm_password": "Confirmar Senha"
},
"notification": {
"title": "Notificação",
"email": "Enviar Notificações para",
"description": "Quais notificações por email você gostaria de receber quando algo mudar?",
"invoice_viewed": "Fatura Visualizada",
"invoice_viewed_desc": "Quando o seu cliente visualiza uma Fatura enviada pelo painel do Crater.",
"estimate_viewed": "Orçamento Visualizado",
"estimate_viewed_desc": "Quando o seu cliente visualiza um Orçamento enviada pelo painel do Crater.",
"save": "Salvar",
"email_save_message": "E-mail salvo com sucesso",
"please_enter_email": "Por favor digite um E-mail"
},
"tax_types": {
"title": "Tipos de Impostos",
"add_tax": "Adicionar Imposto",
"description": "Você pode adicionar ou remover impostos conforme desejar. O Crater suporta impostos sobre itens individuais e também na Fatura.",
"add_new_tax": "Adicionar Novo Imposto",
"tax_settings": "Configurações de Impostos",
"tax_per_item": "Imposto por Item",
"tax_name": "Nome do Imposto",
"compound_tax": "Imposto Composto",
"percent": "Porcentagem",
"action": "Ação",
"tax_setting_description": "Habilite isso se desejar adicionar Impostos a itens da Fatura Idividualmente. Por padrão, os impostos são adicionados diretamente à Fatura.",
"created_message": "Tipo de Imposto criado com sucesso",
"updated_message": "Tipo de Imposto Atualizado com sucesso",
"deleted_message": "Tipo de Imposto Deletado com sucesso",
"confirm_delete": "Você não poderá recuperar este tipo de Imposto",
"already_in_use": "O Imposto já está em uso"
},
"expense_category": {
"title": "Categoria de Despesa",
"action": "Ação",
"description": "As Categorias são necessárias para adicionar entradas de Despesas. Você pode adicionar ou remover essas Categorias de acordo com sua preferência.",
"add_new_category": "Adicionar Nova Categoria",
"category_name": "Nome da Categoria",
"category_description": "Descrição",
"created_message": "Categoria de Despesa criada com sucesso",
"deleted_message": "Categoria de Despesa excluída com sucesso",
"updated_message": "Categoria de Despesa atualizada com sucesso",
"confirm_delete": "Você não poderá recuperar esta Categoria de Despesa",
"already_in_use": "A categoria já está em uso"
},
"preferences": {
"currency": "Moeda",
"language": "Idioma",
"time_zone": "Fuso Horário",
"fiscal_year": "Ano Financeiro",
"date_format": "Formato da Data",
"discount_setting": "Configuração de Desconto",
"discount_per_item": "Desconto por Item ",
"discount_setting_description": "Habilite isso se desejar adicionar desconto a itens de Fatura individualmente. Por padrão, o desconto é adicionado diretamente à Fatura.",
"save": "Salvar",
"preference": "Preferência | Preferências",
"general_settings": "Preferências padrão para o sistema.",
"updated_message": "Preferências atualizadas com sucesso",
"select_language": "Selecione um Idioma",
"select_time_zone": "Selecione um fuso horário",
"select_date_formate": "Selecione um formato de data",
"select_financial_year": "Selecione o ano financeiro"
},
"update_app": {
"title": "Atualizar Aplicativo",
"description": "Você pode atualizar facilmente o Crater, verifique se hà novas atualizações, clicando no botão abaixo",
"check_update": "Verifique se há atualizações",
"avail_update": "Nova atualização disponível",
"next_version": "Próxima versão",
"update": "Atualizar agora",
"update_progress": "Atualização em progresso...",
"progress_text": "Levará apenas alguns minutos. Não atualize a tela ou feche a janela antes que a atualização seja concluída",
"update_success": "O aplicativo foi atualizado! Aguarde enquanto a janela do navegador é recarregada automaticamente.",
"latest_message": "Nenhuma atualização disponível! Você está na versão mais recente.",
"current_version": "Versão Atual"
}
},
"wizard": {
"account_info": "Informação da conta",
"account_info_desc": "Os detalhes abaixo serão usados para criar a conta principal do administrador. Além disso, você pode alterar os detalhes a qualquer momento após o login.",
"name": "Nome",
"email": "Email",
"password": "Senha",
"confirm_password": "Confirmar Senha",
"save_cont": "Salvar e Continuar",
"company_info": "Informação da Empresa",
"company_info_desc": "Esta informação será exibida nas Faturas. Observe que você pode editar isso mais tarde na página de configurações.",
"company_name": "Nome da Empresa",
"company_logo": "Logotipo da Empresa",
"logo_preview": "Previsualizar Logotipo",
"preferences": "Preferências",
"preferences_desc": "Preferências padrão para o sistema.",
"country": "Pais",
"state": "Estado",
"city": "Cidade",
"address": "Endereço",
"street": "Rua 1 | Rua 2",
"company_name": "Nome da Empresa",
"address_street_1": "Endereço Rua 1",
"address_street_2": "Endereço Rua 2",
"phone": "Telefone",
"zip_code": "CEP",
"go_back": "Voltar",
"currency": "Moeda",
"language": "Idioma",
"time_zone": "Fuso Horário",
"fiscal_year": "Ano Financeiro",
"date_format": "Formato de Data",
"from_address": "Do Endereço",
"username": "Nome de Usuário",
"next": "Próximo",
"continue": "Continuar",
"skip": "Pular",
"database": {
"database": "URL do Site e Base de Dados",
"connection": "Conexão da Base de Dados",
"host": "Host da Base de Dados",
"port": "Porta da Base de Dados",
"password": "Senha da Base de Dados",
"app_url": "URL do Aplicativo",
"username": "Usuário da Base de Dados",
"db_name": "Nome da Base de Dados",
"desc": "Crie um Banco de Dados no seu servidor e defina as credenciais usando o formulário abaixo."
},
"permissions": {
"permissions": "Permissões",
"permission_confirm_title": "Você tem certeza que quer continuar?",
"permission_confirm_desc": "Falha na verificação de permissão da pasta",
"permission_desc": "Abaixo está a lista de permissões de pasta que são necessárias para que o aplicativo funcione. Se a verificação da permissão falhar, atualize as permissões da pasta."
},
"mail": {
"host": "Host do email",
"port": "Porta do email",
"driver": "Driver do email",
"secret": "Segredo",
"mailgun_secret": "Segredo do Mailgun",
"mailgun_domain": "Domínio",
"mailgun_endpoint": "Endpoint do Mailgun",
"ses_secret": "Segredo do SES",
"ses_key": "Chave SES",
"password": "Senha do email",
"username": "Nome do Usuário do email",
"mail_config": "Configuração de email",
"from_name": "Nome do email",
"from_mail": "Endereço de email",
"encryption": "Criptografia de email",
"mail_config_desc": "Abaixo está o formulário para configurar o driver de email que será usado para enviar emails do aplicativo. Você também pode configurar provedores de terceiros como Sendgrid, SES etc."
},
"req": {
"system_req": "Requisitos de Sistema",
"php_req_version": "PHP (versão {version} obrigatória)",
"check_req": "Verificar Requisitos",
"system_req_desc": "O Crater tem alguns requisitos de servidor. Verifique se o seu servidor possui a versão do PHP necessária e todas as extensões mencionadas abaixo."
},
"errors": {
"migrate_failed": "Falha na migração",
"database_variables_save_error": "Não é possível gravar a configuração no arquivo .env. Por favor, verifique suas permissões de arquivo",
"mail_variables_save_error": "A configuração do email falhou.",
"connection_failed": "Falha na conexão com o banco de dados",
"database_should_be_empty": "O banco de dados deve estar vazio"
},
"success": {
"mail_variables_save_successfully": "Email configurado com sucesso",
"database_variables_save_successfully": "Banco de dados configurado com sucesso."
}
"address_setting_updated": "Configuração de Endereço Atualizada com Sucesso"
},
"layout_login": {
"copyright_crater": "Copyright @ Crater - 2020",
"super_simple_invoicing": "Faturamento super simples",
"for_freelancer": "Para Freelancers &",
"small_businesses": "Pequenos Negócios ",
"crater_help": "Crater ajuda a rastrear despesas, registrar pagamentos e gerar belas",
"invoices_and_estimates": "Faturas e Orçamentos com capacidade de escolher vários modelos."
"updated_message": "Informações da Empresa atualizadas com sucesso",
"invoices": {
"title": "Faturas",
"notes": "Notas",
"invoice_prefix": "Fatura Prefixo",
"invoice_settings": "Configrações da Fatura",
"autogenerate_invoice_number": "Gerar automaticamente o número da Fatura",
"invoice_setting_description": "Desative isso, se você não deseja gerar automaticamente números da Fatura sempre que criar uma nova.",
"enter_invoice_prefix": "Digite o prefixo da Fatura",
"terms_and_conditions": "Termos e Condições",
"invoice_setting_updated": "Configuração da Fatura atualizada com sucesso"
},
"validation": {
"invalid_url": "url inválidas (ex: http://www.crater.com)",
"required": "Campo obrigatório",
"email_incorrect": "E-mail incorreto",
"email_already_taken": "O email já foi recebido.",
"email_does_not_exist": "O usuário com determinado email não existe",
"send_reset_link": "Enviar link de redefinição",
"not_yet": "Ainda não? Envie novamente",
"password_min_length": "A senha deve conter {count} caracteres",
"name_min_length": "O nome deve ter pelo menos {count} letras.",
"enter_valid_tax_rate": "Insira uma taxa de imposto válida",
"numbers_only": "Apenas Números.",
"characters_only": "Apenas Caracteres.",
"password_incorrect": "As senhas devem ser idênticas",
"password_length": "A senha deve ter {count} caracteres.",
"qty_must_greater_than_zero": "A quantidade deve ser maior que zero.",
"price_greater_than_zero": "O preço deve ser maior que zero.",
"payment_greater_than_zero": "O pagamento deve ser maior que zero.",
"payment_greater_than_due_amount": "O pagamento inserido é mais do que o valor devido desta fatura.",
"quantity_maxlength": "A quantidade não deve exceder 20 dígitos.",
"price_maxlength": "O preço não deve ser superior a 20 dígitos.",
"price_minvalue": "O preço deve ser maior que 0.",
"amount_maxlength": "Montante não deve ser superior a 20 dígitos.",
"amount_minvalue": "Montante deve ser maior que zero",
"description_maxlength": "A descrição não deve ter mais que 255 caracteres.",
"maximum_options_error": "Máximo de {max} opções selecionadas. Primeiro remova uma opção selecionada para selecionar outra.",
"notes_maxlength": "As anotações não devem ter mais que 255 caracteres.",
"address_maxlength": "O endereço não deve ter mais que 255 caracteres.",
"ref_number_maxlength": "O número de referência não deve ter mais que 255 caracteres.",
"prefix_maxlength": "O prefixo não deve ter mais que 5 caracteres."
"estimates": {
"title": "Orçamentos",
"estimate_prefix": "Orçamento Prefixo",
"estimate_settings": "Configurações do Orçamento",
"autogenerate_estimate_number": "Gerar automaticamente o número do Orçamento",
"estimate_setting_description": "Desative isso, se você não deseja gerar automaticamente números do Orçamento sempre que criar um novo.",
"enter_estimate_prefix": "Digite o prefixo do Orçamento",
"estimate_setting_updated": "Configuração do Orçamento atualizada com sucesso"
},
"payments": {
"title": "Pagamentos",
"payment_prefix": "Pagamento Prefixo",
"payment_settings": "Configurações de Pagamento",
"autogenerate_payment_number": "Gerar automaticamente número do Pagamento",
"payment_setting_description": "Desative isso, se você não deseja gerar automaticamente números do Pagamento sempre que criar um novo.",
"enter_payment_prefix": "Digite o Prefixo do Pagamento",
"payment_setting_updated": "Configurações de Pagamento atualizada com sucesso"
}
},
"account_settings": {
"profile_picture": "Foto do Perfil",
"name": "Nome",
"email": "Email",
"password": "Senha",
"confirm_password": "Confirmar Senha",
"account_settings": "Configurações da conta",
"save": "Salvar",
"section_description": "Você pode atualizar seu nome, email e senha usando o formulário abaixo.",
"updated_message": "Configurações da conta atualizadas com sucesso"
},
"user_profile": {
"name": "Nome",
"email": "Email",
"password": "Password",
"confirm_password": "Confirmar Senha"
},
"notification": {
"title": "Notificação",
"email": "Enviar Notificações para",
"description": "Quais notificações por email você gostaria de receber quando algo mudar?",
"invoice_viewed": "Fatura Visualizada",
"invoice_viewed_desc": "Quando o seu cliente visualiza uma Fatura enviada pelo painel do Crater.",
"estimate_viewed": "Orçamento Visualizado",
"estimate_viewed_desc": "Quando o seu cliente visualiza um Orçamento enviada pelo painel do Crater.",
"save": "Salvar",
"email_save_message": "E-mail salvo com sucesso",
"please_enter_email": "Por favor digite um E-mail"
},
"tax_types": {
"title": "Tipos de Impostos",
"add_tax": "Adicionar Imposto",
"description": "Você pode adicionar ou remover impostos conforme desejar. O Crater suporta impostos sobre itens individuais e também na Fatura.",
"add_new_tax": "Adicionar Novo Imposto",
"tax_settings": "Configurações de Impostos",
"tax_per_item": "Imposto por Item",
"tax_name": "Nome do Imposto",
"compound_tax": "Imposto Composto",
"percent": "Porcentagem",
"action": "Ação",
"tax_setting_description": "Habilite isso se desejar adicionar Impostos a itens da Fatura Idividualmente. Por padrão, os impostos são adicionados diretamente à Fatura.",
"created_message": "Tipo de Imposto criado com sucesso",
"updated_message": "Tipo de Imposto Atualizado com sucesso",
"deleted_message": "Tipo de Imposto Deletado com sucesso",
"confirm_delete": "Você não poderá recuperar este tipo de Imposto",
"already_in_use": "O Imposto já está em uso"
},
"expense_category": {
"title": "Categoria de Despesa",
"action": "Ação",
"description": "As Categorias são necessárias para adicionar entradas de Despesas. Você pode adicionar ou remover essas Categorias de acordo com sua preferência.",
"add_new_category": "Adicionar Nova Categoria",
"category_name": "Nome da Categoria",
"category_description": "Descrição",
"created_message": "Categoria de Despesa criada com sucesso",
"deleted_message": "Categoria de Despesa excluída com sucesso",
"updated_message": "Categoria de Despesa atualizada com sucesso",
"confirm_delete": "Você não poderá recuperar esta Categoria de Despesa",
"already_in_use": "A categoria já está em uso"
},
"preferences": {
"currency": "Moeda",
"language": "Idioma",
"time_zone": "Fuso Horário",
"fiscal_year": "Ano Financeiro",
"date_format": "Formato da Data",
"discount_setting": "Configuração de Desconto",
"discount_per_item": "Desconto por Item ",
"discount_setting_description": "Habilite isso se desejar adicionar desconto a itens de Fatura individualmente. Por padrão, o desconto é adicionado diretamente à Fatura.",
"save": "Salvar",
"preference": "Preferência | Preferências",
"general_settings": "Preferências padrão para o sistema.",
"updated_message": "Preferências atualizadas com sucesso",
"select_language": "Selecione um Idioma",
"select_time_zone": "Selecione um fuso horário",
"select_date_formate": "Selecione um formato de data",
"select_financial_year": "Selecione o ano financeiro"
},
"update_app": {
"title": "Atualizar Aplicativo",
"description": "Você pode atualizar facilmente o Crater, verifique se hà novas atualizações, clicando no botão abaixo",
"check_update": "Verifique se há atualizações",
"avail_update": "Nova atualização disponível",
"next_version": "Próxima versão",
"update": "Atualizar agora",
"update_progress": "Atualização em progresso...",
"progress_text": "Levará apenas alguns minutos. Não atualize a tela ou feche a janela antes que a atualização seja concluída",
"update_success": "O aplicativo foi atualizado! Aguarde enquanto a janela do navegador é recarregada automaticamente.",
"latest_message": "Nenhuma atualização disponível! Você está na versão mais recente.",
"current_version": "Versão Atual",
"download_zip_file": "Baixar arquivo ZIP",
"unzipping_package": "Descompactando o pacote",
"copying_files": "Copiando arquivos",
"running_migrations": "Executando migrações",
"finishing_update": "Atualização de acabamento",
"update_failed": "Atualização falhou",
"update_failed_text": "Desculpa! Sua atualização falhou em: {step} step"
}
},
"wizard": {
"account_info": "Informação da conta",
"account_info_desc": "Os detalhes abaixo serão usados para criar a conta principal do administrador. Além disso, você pode alterar os detalhes a qualquer momento após o login.",
"name": "Nome",
"email": "Email",
"password": "Senha",
"confirm_password": "Confirmar Senha",
"save_cont": "Salvar e Continuar",
"company_info": "Informação da Empresa",
"company_info_desc": "Esta informação será exibida nas Faturas. Observe que você pode editar isso mais tarde na página de configurações.",
"company_name": "Nome da Empresa",
"company_logo": "Logotipo da Empresa",
"logo_preview": "Previsualizar Logotipo",
"preferences": "Preferências",
"preferences_desc": "Preferências padrão para o sistema.",
"country": "Pais",
"state": "Estado",
"city": "Cidade",
"address": "Endereço",
"street": "Rua 1 | Rua 2",
"phone": "Telefone",
"zip_code": "CEP",
"go_back": "Voltar",
"currency": "Moeda",
"language": "Idioma",
"time_zone": "Fuso Horário",
"fiscal_year": "Ano Financeiro",
"date_format": "Formato de Data",
"from_address": "Do Endereço",
"username": "Nome de Usuário",
"next": "Próximo",
"continue": "Continuar",
"skip": "Pular",
"database": {
"database": "URL do Site e Base de Dados",
"connection": "Conexão da Base de Dados",
"host": "Host da Base de Dados",
"port": "Porta da Base de Dados",
"password": "Senha da Base de Dados",
"app_url": "URL do Aplicativo",
"username": "Usuário da Base de Dados",
"db_name": "Nome da Base de Dados",
"desc": "Crie um Banco de Dados no seu servidor e defina as credenciais usando o formulário abaixo."
},
"permissions": {
"permissions": "Permissões",
"permission_confirm_title": "Você tem certeza que quer continuar?",
"permission_confirm_desc": "Falha na verificação de permissão da pasta",
"permission_desc": "Abaixo está a lista de permissões de pasta que são necessárias para que o aplicativo funcione. Se a verificação da permissão falhar, atualize as permissões da pasta."
},
"mail": {
"host": "Host do email",
"port": "Porta do email",
"driver": "Driver do email",
"secret": "Segredo",
"mailgun_secret": "Segredo do Mailgun",
"mailgun_domain": "Domínio",
"mailgun_endpoint": "Endpoint do Mailgun",
"ses_secret": "Segredo do SES",
"ses_key": "Chave SES",
"password": "Senha do email",
"username": "Nome do Usuário do email",
"mail_config": "Configuração de email",
"from_name": "Nome do email",
"from_mail": "Endereço de email",
"encryption": "Criptografia de email",
"mail_config_desc": "Abaixo está o formulário para configurar o driver de email que será usado para enviar emails do aplicativo. Você também pode configurar provedores de terceiros como Sendgrid, SES etc."
},
"req": {
"system_req": "Requisitos de Sistema",
"php_req_version": "PHP (versão {version} obrigatória)",
"check_req": "Verificar Requisitos",
"system_req_desc": "O Crater tem alguns requisitos de servidor. Verifique se o seu servidor possui a versão do PHP necessária e todas as extensões mencionadas abaixo."
},
"errors": {
"migrate_failed": "Falha na migração",
"database_variables_save_error": "Não é possível gravar a configuração no arquivo .env. Por favor, verifique suas permissões de arquivo",
"mail_variables_save_error": "A configuração do email falhou.",
"connection_failed": "Falha na conexão com o banco de dados",
"database_should_be_empty": "O banco de dados deve estar vazio"
},
"success": {
"mail_variables_save_successfully": "Email configurado com sucesso",
"database_variables_save_successfully": "Banco de dados configurado com sucesso."
}
},
"layout_login": {
"copyright_crater": "Copyright @ Crater - 2020",
"super_simple_invoicing": "Faturamento super simples",
"for_freelancer": "Para Freelancers &",
"small_businesses": "Pequenos Negócios ",
"crater_help": "Crater ajuda a rastrear despesas, registrar pagamentos e gerar belas",
"invoices_and_estimates": "Faturas e Orçamentos com capacidade de escolher vários modelos."
},
"validation": {
"invalid_url": "url inválidas (ex: http://www.crater.com)",
"required": "Campo obrigatório",
"email_incorrect": "E-mail incorreto",
"email_already_taken": "O email já foi recebido.",
"email_does_not_exist": "O usuário com determinado email não existe",
"send_reset_link": "Enviar link de redefinição",
"not_yet": "Ainda não? Envie novamente",
"password_min_length": "A senha deve conter {count} caracteres",
"name_min_length": "O nome deve ter pelo menos {count} letras.",
"enter_valid_tax_rate": "Insira uma taxa de imposto válida",
"numbers_only": "Apenas Números.",
"characters_only": "Apenas Caracteres.",
"password_incorrect": "As senhas devem ser idênticas",
"password_length": "A senha deve ter {count} caracteres.",
"qty_must_greater_than_zero": "A quantidade deve ser maior que zero.",
"price_greater_than_zero": "O preço deve ser maior que zero.",
"payment_greater_than_zero": "O pagamento deve ser maior que zero.",
"payment_greater_than_due_amount": "O pagamento inserido é mais do que o valor devido desta fatura.",
"quantity_maxlength": "A quantidade não deve exceder 20 dígitos.",
"price_maxlength": "O preço não deve ser superior a 20 dígitos.",
"price_minvalue": "O preço deve ser maior que 0.",
"amount_maxlength": "Montante não deve ser superior a 20 dígitos.",
"amount_minvalue": "Montante deve ser maior que zero",
"description_maxlength": "A descrição não deve ter mais que 255 caracteres.",
"maximum_options_error": "Máximo de {max} opções selecionadas. Primeiro remova uma opção selecionada para selecionar outra.",
"notes_maxlength": "As anotações não devem ter mais que 255 caracteres.",
"address_maxlength": "O endereço não deve ter mais que 255 caracteres.",
"ref_number_maxlength": "O número de referência não deve ter mais que 255 caracteres.",
"prefix_maxlength": "O prefixo não deve ter mais que 5 caracteres."
}
}

View File

@ -42,7 +42,6 @@ export default {
},
[types.ADD_ITEM_UNIT] (state, data) {
state.itemUnits.push(data.unit)
state.itemUnits = [data.unit, ...state.itemUnits]
},

View File

@ -40,7 +40,6 @@ export default {
},
[types.ADD_PAYMENT_MODE] (state, data) {
state.paymentModes.push(data.paymentMethod)
state.paymentModes = [data.paymentMethod, ...state.paymentModes]
},

View File

@ -4,16 +4,12 @@
<h3 class="page-title">{{ $t('estimates.title') }}</h3>
<ol class="breadcrumb">
<li class="breadcrumb-item">
<router-link
slot="item-title"
to="dashboard">
<router-link slot="item-title" to="dashboard">
{{ $t('general.home') }}
</router-link>
</li>
<li class="breadcrumb-item">
<router-link
slot="item-title"
to="#">
<router-link slot="item-title" to="#">
{{ $tc('estimates.estimate', 2) }}
</router-link>
</li>
@ -33,11 +29,9 @@
</base-button>
</div>
<router-link slot="item-title" class="col-xs-2" to="estimates/create">
<base-button
size="large"
icon="plus"
color="theme" >
{{ $t('estimates.new_estimate') }}</base-button>
<base-button size="large" icon="plus" color="theme">
{{ $t('estimates.new_estimate') }}</base-button
>
</router-link>
</div>
</div>
@ -46,7 +40,7 @@
<div v-show="showFilters" class="filter-section">
<div class="filter-container">
<div class="filter-customer">
<label>{{ $tc('customers.customer',1) }} </label>
<label>{{ $tc('customers.customer', 1) }} </label>
<base-customer-select
ref="customerSelect"
@select="onSelectCustomer"
@ -85,21 +79,28 @@
</div>
<div class="filter-estimate">
<label>{{ $t('estimates.estimate_number') }}</label>
<base-input
v-model="filters.estimate_number"
icon="hashtag"/>
<base-input v-model="filters.estimate_number" icon="hashtag" />
</div>
</div>
<label class="clear-filter" @click="clearFilter">{{ $t('general.clear_all') }}</label>
<label class="clear-filter" @click="clearFilter">{{
$t('general.clear_all')
}}</label>
</div>
</transition>
<div v-cloak v-show="showEmptyScreen" class="col-xs-1 no-data-info" align="center">
<moon-walker-icon class="mt-5 mb-4"/>
<div
v-cloak
v-show="showEmptyScreen"
class="col-xs-1 no-data-info"
align="center"
>
<moon-walker-icon class="mt-5 mb-4" />
<div class="row" align="center">
<label class="col title">{{ $t('estimates.no_estimates') }}</label>
</div>
<div class="row">
<label class="description col mt-1" align="center">{{ $t('estimates.list_of_estimates') }}</label>
<label class="description col mt-1" align="center">{{
$t('estimates.list_of_estimates')
}}</label>
</div>
<div class="btn-container">
<base-button
@ -116,28 +117,57 @@
<div v-show="!showEmptyScreen" class="table-container">
<div class="table-actions mt-5">
<p class="table-stats">{{ $t('general.showing') }}: <b>{{ estimates.length }}</b> {{ $t('general.of') }} <b>{{ totalEstimates }}</b></p>
<p class="table-stats">
{{ $t('general.showing') }}: <b>{{ estimates.length }}</b>
{{ $t('general.of') }} <b>{{ totalEstimates }}</b>
</p>
<!-- Tabs -->
<ul class="tabs">
<li class="tab" @click="getStatus('DRAFT')">
<a :class="['tab-link', {'a-active': filters.status === 'DRAFT'}]" href="#">{{ $t('general.draft') }}</a>
<a
:class="['tab-link', { 'a-active': filters.status === 'DRAFT' }]"
href="#"
>{{ $t('general.draft') }}</a
>
</li>
<li class="tab" @click="getStatus('SENT')">
<a :class="['tab-link', {'a-active': filters.status === 'SENT'}]" href="#" >{{ $t('general.sent') }}</a>
<a
:class="['tab-link', { 'a-active': filters.status === 'SENT' }]"
href="#"
>{{ $t('general.sent') }}</a
>
</li>
<li class="tab" @click="getStatus('')">
<a :class="['tab-link', {'a-active': filters.status === '' || filters.status !== 'DRAFT' && filters.status !== 'SENT'}]" href="#">{{ $t('general.all') }}</a>
<a
:class="[
'tab-link',
{
'a-active':
filters.status === '' ||
(filters.status !== 'DRAFT' && filters.status !== 'SENT'),
},
]"
href="#"
>{{ $t('general.all') }}</a
>
</li>
</ul>
<transition name="fade">
<v-dropdown v-if="selectedEstimates.length" :show-arrow="false">
<span slot="activator" href="#" class="table-actions-button dropdown-toggle">
<span
slot="activator"
href="#"
class="table-actions-button dropdown-toggle"
>
{{ $t('general.actions') }}
</span>
<v-dropdown-item>
<div class="dropdown-item" @click="removeMultipleEstimates">
<font-awesome-icon :icon="['fas', 'trash']" class="dropdown-item-icon" />
<font-awesome-icon
:icon="['fas', 'trash']"
class="dropdown-item-icon"
/>
{{ $t('general.delete') }}
</div>
</v-dropdown-item>
@ -153,8 +183,12 @@
type="checkbox"
class="custom-control-input"
@change="selectAllEstimates"
/>
<label
v-show="!isRequestOngoing"
for="select-all"
class="custom-control-label selectall"
>
<label v-show="!isRequestOngoing" for="select-all" class="custom-control-label selectall">
<span class="select-all-label">{{ $t('general.select_all') }} </span>
</label>
</div>
@ -178,7 +212,7 @@
:value="row.id"
type="checkbox"
class="custom-control-input"
>
/>
<label :for="row.id" class="custom-control-label" />
</div>
</template>
@ -186,30 +220,30 @@
<table-column
:label="$t('estimates.date')"
sort-as="estimate_date"
show="formattedEstimateDate" />
show="formattedEstimateDate"
/>
<table-column
:label="$t('estimates.customer')"
sort-as="name"
show="name" />
show="name"
/>
<!-- <table-column
:label="$t('estimates.expiry_date')"
sort-as="expiry_date"
show="formattedExpiryDate" /> -->
<table-column
:label="$t('estimates.status')"
show="status" >
<template slot-scope="row" >
<table-column :label="$t('estimates.status')" show="status">
<template slot-scope="row">
<span> {{ $t('estimates.status') }}</span>
<span :class="'est-status-'+row.status.toLowerCase()">{{ row.status }}</span>
<span :class="'est-status-' + row.status.toLowerCase()">{{
row.status
}}</span>
</template>
</table-column>
<table-column
:label="$tc('estimates.estimate', 1)"
show="estimate_number"/>
<table-column
:label="$t('invoices.total')"
sort-as="total"
>
show="estimate_number"
/>
<table-column :label="$t('invoices.total')" sort-as="total">
<template slot-scope="row">
<span> {{ $t('estimates.total') }}</span>
<div v-html="$utils.formatMoney(row.total, row.user.currency)" />
@ -227,50 +261,114 @@
<dot-icon />
</a>
<v-dropdown-item>
<router-link :to="{path: `estimates/${row.id}/edit`}" class="dropdown-item">
<font-awesome-icon :icon="['fas', 'pencil-alt']" class="dropdown-item-icon" />
<router-link
:to="{ path: `estimates/${row.id}/edit` }"
class="dropdown-item"
>
<font-awesome-icon
:icon="['fas', 'pencil-alt']"
class="dropdown-item-icon"
/>
{{ $t('general.edit') }}
</router-link>
</v-dropdown-item>
<v-dropdown-item>
<div class="dropdown-item" @click="removeEstimate(row.id)">
<font-awesome-icon :icon="['fas', 'trash']" class="dropdown-item-icon" />
<font-awesome-icon
:icon="['fas', 'trash']"
class="dropdown-item-icon"
/>
{{ $t('general.delete') }}
</div>
</v-dropdown-item>
<v-dropdown-item>
<router-link :to="{path: `estimates/${row.id}/view`}" class="dropdown-item">
<router-link
:to="{ path: `estimates/${row.id}/view` }"
class="dropdown-item"
>
<font-awesome-icon icon="eye" class="dropdown-item-icon" />
{{ $t('general.view') }}
</router-link>
</v-dropdown-item>
<v-dropdown-item>
<a class="dropdown-item" href="#/" @click="convertInToinvoice(row.id)">
<font-awesome-icon icon="file-alt" class="dropdown-item-icon" />
<a
class="dropdown-item"
href="#/"
@click="convertInToinvoice(row.id)"
>
<font-awesome-icon
icon="file-alt"
class="dropdown-item-icon"
/>
{{ $t('estimates.convert_to_invoice') }}
</a>
</v-dropdown-item>
<v-dropdown-item v-if="row.status !== 'SENT'">
<a class="dropdown-item" href="#/" @click.self="onMarkAsSent(row.id)">
<font-awesome-icon icon="check-circle" class="dropdown-item-icon" />
<a
class="dropdown-item"
href="#/"
@click.self="onMarkAsSent(row.id)"
>
<font-awesome-icon
icon="check-circle"
class="dropdown-item-icon"
/>
{{ $t('estimates.mark_as_sent') }}
</a>
</v-dropdown-item>
<v-dropdown-item v-if="row.status !== 'SENT'">
<a class="dropdown-item" href="#/" @click.self="sendEstimate(row.id)">
<font-awesome-icon icon="paper-plane" class="dropdown-item-icon" />
<v-dropdown-item v-if="row.status === 'DRAFT'">
<a
class="dropdown-item"
href="#/"
@click.self="sendEstimate(row.id)"
>
<font-awesome-icon
icon="paper-plane"
class="dropdown-item-icon"
/>
{{ $t('estimates.send_estimate') }}
</a>
</v-dropdown-item>
<!-- resend estimte -->
<v-dropdown-item
v-if="row.status == 'SENT' || row.status == 'VIEWED'"
>
<a
class="dropdown-item"
href="#/"
@click.self="sendEstimate(row.id)"
>
<font-awesome-icon
icon="paper-plane"
class="dropdown-item-icon"
/>
{{ $t('estimates.resend_estimate') }}
</a>
</v-dropdown-item>
<!-- -->
<v-dropdown-item v-if="row.status !== 'ACCEPTED'">
<a class="dropdown-item" href="#/" @click.self="onMarkAsAccepted(row.id)">
<font-awesome-icon icon="check-circle" class="dropdown-item-icon" />
<a
class="dropdown-item"
href="#/"
@click.self="onMarkAsAccepted(row.id)"
>
<font-awesome-icon
icon="check-circle"
class="dropdown-item-icon"
/>
{{ $t('estimates.mark_as_accepted') }}
</a>
</v-dropdown-item>
<v-dropdown-item v-if="row.status !== 'REJECTED'">
<a class="dropdown-item" href="#/" @click.self="onMarkAsRejected(row.id)">
<font-awesome-icon icon="times-circle" class="dropdown-item-icon" />
<a
class="dropdown-item"
href="#/"
@click.self="onMarkAsRejected(row.id)"
>
<font-awesome-icon
icon="times-circle"
class="dropdown-item-icon"
/>
{{ $t('estimates.mark_as_rejected') }}
</a>
</v-dropdown-item>

View File

@ -12,6 +12,7 @@
ref="baseSelect"
v-model="itemSelect"
:options="items"
:loading="loading"
:show-labels="false"
:preserve-search="true"
:initial-search="item.name"
@ -20,7 +21,7 @@
label="name"
class="multi-select-item"
@value="onTextChange"
@select="(val) => $emit('select', val)"
@select="onSelect"
>
<div slot="afterList">
<button type="button" class="list-add-button" @click="openItemModal">
@ -142,6 +143,10 @@ export default {
'data': {taxPerItem: this.taxPerItem, taxes: this.taxes}
})
},
onSelect(val) {
this.$emit('select', val)
this.fetchItems()
},
deselectItem () {
this.itemSelect = null
this.$emit('deselect')

View File

@ -1,7 +1,7 @@
<template>
<div v-if="estimate" class="main-content estimate-view-page">
<div class="page-header">
<h3 class="page-title"> {{ estimate.estimate_number }}</h3>
<h3 class="page-title">{{ estimate.estimate_number }}</h3>
<div class="page-actions row">
<div class="col-xs-2 mr-3">
<base-button
@ -26,19 +26,42 @@
{{ $t('estimates.send_estimate') }}
</base-button>
</div>
<v-dropdown :close-on-select="false" align="left" class="filter-container">
<v-dropdown
:close-on-select="true"
align="left"
class="filter-container"
>
<a slot="activator" href="#">
<base-button color="theme">
<font-awesome-icon icon="ellipsis-h" />
</base-button>
</a>
<v-dropdown-item>
<router-link :to="{path: `/admin/estimates/${$route.params.id}/edit`}" class="dropdown-item">
<font-awesome-icon :icon="['fas', 'pencil-alt']" class="dropdown-item-icon"/>
<div class="dropdown-item" @click="copyPdfUrl()">
<font-awesome-icon
:icon="['fas', 'link']"
class="dropdown-item-icon"
/>
{{ $t('general.copy_pdf_url') }}
</div>
<router-link
:to="{ path: `/admin/estimates/${$route.params.id}/edit` }"
class="dropdown-item"
>
<font-awesome-icon
:icon="['fas', 'pencil-alt']"
class="dropdown-item-icon"
/>
{{ $t('general.edit') }}
</router-link>
<div class="dropdown-item" @click="removeEstimate($route.params.id)">
<font-awesome-icon :icon="['fas', 'trash']" class="dropdown-item-icon" />
<div
class="dropdown-item"
@click="removeEstimate($route.params.id)"
>
<font-awesome-icon
:icon="['fas', 'trash']"
class="dropdown-item-icon"
/>
{{ $t('general.delete') }}
</div>
</v-dropdown-item>
@ -57,14 +80,18 @@
align-icon="right"
@input="onSearched()"
/>
<div
class="btn-group ml-3"
role="group"
aria-label="First group"
>
<v-dropdown :close-on-select="false" align="left" class="filter-container">
<div class="btn-group ml-3" role="group" aria-label="First group">
<v-dropdown
:close-on-select="false"
align="left"
class="filter-container"
>
<a slot="activator" href="#">
<base-button class="inv-button inv-filter-fields-btn" color="default" size="medium">
<base-button
class="inv-button inv-filter-fields-btn"
color="default"
size="medium"
>
<font-awesome-icon icon="filter" />
</base-button>
</a>
@ -80,8 +107,10 @@
class="inv-radio"
value="estimate_date"
@change="onSearched"
>
<label class="inv-label" for="filter_estimate_date">{{ $t('reports.estimates.estimate_date') }}</label>
/>
<label class="inv-label" for="filter_estimate_date">{{
$t('reports.estimates.estimate_date')
}}</label>
</div>
<div class="filter-items">
<input
@ -92,8 +121,10 @@
class="inv-radio"
value="expiry_date"
@change="onSearched"
>
<label class="inv-label" for="filter_due_date">{{ $t('estimates.due_date') }}</label>
/>
<label class="inv-label" for="filter_due_date">{{
$t('estimates.due_date')
}}</label>
</div>
<div class="filter-items">
<input
@ -104,11 +135,19 @@
class="inv-radio"
value="estimate_number"
@change="onSearched"
>
<label class="inv-label" for="filter_estimate_number">{{ $t('estimates.estimate_number') }}</label>
/>
<label class="inv-label" for="filter_estimate_number">{{
$t('estimates.estimate_number')
}}</label>
</div>
</v-dropdown>
<base-button v-tooltip.top-center="{ content: getOrderName }" class="inv-button inv-filter-sorting-btn" color="default" size="medium" @click="sortData">
<base-button
v-tooltip.top-center="{ content: getOrderName }"
class="inv-button inv-filter-sorting-btn"
color="default"
size="medium"
@click="sortData"
>
<font-awesome-icon v-if="getOrderBy" icon="sort-amount-up" />
<font-awesome-icon v-else icon="sort-amount-down" />
</base-button>
@ -116,7 +155,7 @@
</div>
<div class="side-content">
<router-link
v-for="(estimate,index) in estimates"
v-for="(estimate, index) in estimates"
:to="`/admin/estimates/${estimate.id}/view`"
:key="index"
class="side-estimate"
@ -124,10 +163,20 @@
<div class="left">
<div class="inv-name">{{ estimate.user.name }}</div>
<div class="inv-number">{{ estimate.estimate_number }}</div>
<div :class="'est-status-'+estimate.status.toLowerCase()" class="inv-status">{{ estimate.status }}</div>
<div
:class="'est-status-' + estimate.status.toLowerCase()"
class="inv-status"
>
{{ estimate.status }}
</div>
</div>
<div class="right">
<div class="inv-amount" v-html="$utils.formatMoney(estimate.total, estimate.user.currency)" />
<div
class="inv-amount"
v-html="
$utils.formatMoney(estimate.total, estimate.user.currency)
"
/>
<div class="inv-date">{{ estimate.formattedEstimateDate }}</div>
</div>
</router-link>
@ -137,7 +186,7 @@
</div>
</div>
<div class="estimate-view-page-container">
<iframe :src="`${shareableLink}`" class="frame-style"/>
<iframe :src="`${shareableLink}`" class="frame-style" />
</div>
</div>
</template>
@ -289,6 +338,13 @@ export default {
}
})
},
copyPdfUrl () {
let pdfUrl = `${window.location.origin}/estimates/pdf/${this.estimate.unique_hash}`
let response = this.$utils.copyTextToClipboard(pdfUrl)
window.toastr['success'](this.$tc('Copied PDF url to clipboard!'))
},
async removeEstimate (id) {
window.swal({
title: 'Deleted',

View File

@ -1,19 +1,15 @@
<template>
<div class="invoice-index-page invoices main-content">
<div class="page-header">
<h3 class="page-title"> {{ $t('invoices.title') }}</h3>
<h3 class="page-title">{{ $t('invoices.title') }}</h3>
<ol class="breadcrumb">
<li class="breadcrumb-item">
<router-link
slot="item-title"
to="dashboard">
<router-link slot="item-title" to="dashboard">
{{ $t('general.home') }}
</router-link>
</li>
<li class="breadcrumb-item">
<router-link
slot="item-title"
to="#">
<router-link slot="item-title" to="#">
{{ $tc('invoices.invoice', 2) }}
</router-link>
</li>
@ -32,7 +28,11 @@
{{ $t('general.filter') }}
</base-button>
</div>
<router-link slot="item-title" class="col-xs-2" to="/admin/invoices/create">
<router-link
slot="item-title"
class="col-xs-2"
to="/admin/invoices/create"
>
<base-button size="large" icon="plus" color="theme">
{{ $t('invoices.new_invoice') }}
</base-button>
@ -44,7 +44,7 @@
<div v-show="showFilters" class="filter-section">
<div class="filter-container">
<div class="filter-customer">
<label>{{ $tc('customers.customer',1) }} </label>
<label>{{ $tc('customers.customer', 1) }} </label>
<base-customer-select
ref="customerSelect"
@select="onSelectCustomer"
@ -88,22 +88,29 @@
</div>
<div class="filter-invoice">
<label>{{ $t('invoices.invoice_number') }}</label>
<base-input
v-model="filters.invoice_number"
icon="hashtag"/>
<base-input v-model="filters.invoice_number" icon="hashtag" />
</div>
</div>
<label class="clear-filter" @click="clearFilter">{{ $t('general.clear_all') }}</label>
<label class="clear-filter" @click="clearFilter">{{
$t('general.clear_all')
}}</label>
</div>
</transition>
<div v-cloak v-show="showEmptyScreen" class="col-xs-1 no-data-info" align="center">
<moon-walker-icon class="mt-5 mb-4"/>
<div
v-cloak
v-show="showEmptyScreen"
class="col-xs-1 no-data-info"
align="center"
>
<moon-walker-icon class="mt-5 mb-4" />
<div class="row" align="center">
<label class="col title">{{ $t('invoices.no_invoices') }}</label>
</div>
<div class="row">
<label class="description col mt-1" align="center">{{ $t('invoices.list_of_invoices') }}</label>
<label class="description col mt-1" align="center">{{
$t('invoices.list_of_invoices')
}}</label>
</div>
<div class="btn-container">
<base-button
@ -120,28 +127,65 @@
<div v-show="!showEmptyScreen" class="table-container">
<div class="table-actions mt-5">
<p class="table-stats">{{ $t('general.showing') }}: <b>{{ invoices.length }}</b> {{ $t('general.of') }} <b>{{ totalInvoices }}</b></p>
<p class="table-stats">
{{ $t('general.showing') }}: <b>{{ invoices.length }}</b>
{{ $t('general.of') }} <b>{{ totalInvoices }}</b>
</p>
<!-- Tabs -->
<ul class="tabs">
<li class="tab" @click="getStatus('UNPAID')">
<a :class="['tab-link', {'a-active': filters.status.value === 'UNPAID'}]" href="#" >{{ $t('general.due') }}</a>
<a
:class="[
'tab-link',
{ 'a-active': filters.status.value === 'UNPAID' },
]"
href="#"
>{{ $t('general.due') }}</a
>
</li>
<li class="tab" @click="getStatus('DRAFT')">
<a :class="['tab-link', {'a-active': filters.status.value === 'DRAFT'}]" href="#">{{ $t('general.draft') }}</a>
<a
:class="[
'tab-link',
{ 'a-active': filters.status.value === 'DRAFT' },
]"
href="#"
>{{ $t('general.draft') }}</a
>
</li>
<li class="tab" @click="getStatus('')">
<a :class="['tab-link', {'a-active': filters.status.value === '' || filters.status.value === null || filters.status.value !== 'DRAFT' && filters.status.value !== 'UNPAID'}]" href="#">{{ $t('general.all') }}</a>
<a
:class="[
'tab-link',
{
'a-active':
filters.status.value === '' ||
filters.status.value === null ||
(filters.status.value !== 'DRAFT' &&
filters.status.value !== 'UNPAID'),
},
]"
href="#"
>{{ $t('general.all') }}</a
>
</li>
</ul>
<transition name="fade">
<v-dropdown v-if="selectedInvoices.length" :show-arrow="false">
<span slot="activator" href="#" class="table-actions-button dropdown-toggle">
<span
slot="activator"
href="#"
class="table-actions-button dropdown-toggle"
>
{{ $t('general.actions') }}
</span>
<v-dropdown-item>
<div class="dropdown-item" @click="removeMultipleInvoices">
<font-awesome-icon :icon="['fas', 'trash']" class="dropdown-item-icon" />
<font-awesome-icon
:icon="['fas', 'trash']"
class="dropdown-item-icon"
/>
{{ $t('general.delete') }}
</div>
</v-dropdown-item>
@ -155,8 +199,12 @@
type="checkbox"
class="custom-control-input"
@change="selectAllInvoices"
/>
<label
v-show="!isRequestOngoing"
for="select-all"
class="custom-control-label selectall"
>
<label v-show="!isRequestOngoing" for="select-all" class="custom-control-label selectall">
<span class="select-all-label">{{ $t('general.select_all') }} </span>
</label>
</div>
@ -180,8 +228,8 @@
:value="row.id"
type="checkbox"
class="custom-control-input"
>
<label :for="row.id" class="custom-control-label"/>
/>
<label :for="row.id" class="custom-control-label" />
</div>
</template>
</table-column>
@ -195,35 +243,33 @@
width="20%"
show="name"
/>
<table-column
:label="$t('invoices.status')"
sort-as="status"
>
<template slot-scope="row" >
<table-column :label="$t('invoices.status')" sort-as="status">
<template slot-scope="row">
<span> {{ $t('invoices.status') }}</span>
<span :class="'inv-status-'+row.status.toLowerCase()">{{ (row.status != 'PARTIALLY_PAID')? row.status : row.status.replace('_', ' ') }}</span>
<span :class="'inv-status-' + row.status.toLowerCase()">{{
row.status != 'PARTIALLY_PAID'
? row.status
: row.status.replace('_', ' ')
}}</span>
</template>
</table-column>
<table-column
:label="$t('invoices.paid_status')"
sort-as="paid_status"
>
<table-column :label="$t('invoices.paid_status')" sort-as="paid_status">
<template slot-scope="row">
<span>{{ $t('invoices.paid_status') }}</span>
<span :class="'inv-status-'+row.paid_status.toLowerCase()">{{ (row.paid_status != 'PARTIALLY_PAID')? row.paid_status : row.paid_status.replace('_', ' ') }}</span>
<span :class="'inv-status-' + row.paid_status.toLowerCase()">{{
row.paid_status != 'PARTIALLY_PAID'
? row.paid_status
: row.paid_status.replace('_', ' ')
}}</span>
</template>
</table-column>
<table-column
:label="$t('invoices.number')"
show="invoice_number"
/>
<table-column
:label="$t('invoices.amount_due')"
sort-as="due_amount"
>
<table-column :label="$t('invoices.number')" show="invoice_number" />
<table-column :label="$t('invoices.amount_due')" sort-as="due_amount">
<template slot-scope="row">
<span>{{ $t('invoices.amount_due') }}</span>
<div v-html="$utils.formatMoney(row.due_amount, row.user.currency)"/>
<div
v-html="$utils.formatMoney(row.due_amount, row.user.currency)"
/>
</template>
</table-column>
<table-column
@ -238,42 +284,91 @@
<dot-icon />
</a>
<v-dropdown-item>
<router-link :to="{path: `invoices/${row.id}/edit`}" class="dropdown-item">
<font-awesome-icon :icon="['fas', 'pencil-alt']" class="dropdown-item-icon"/>
<router-link
:to="{ path: `invoices/${row.id}/edit` }"
class="dropdown-item"
>
<font-awesome-icon
:icon="['fas', 'pencil-alt']"
class="dropdown-item-icon"
/>
{{ $t('general.edit') }}
</router-link>
<router-link :to="{path: `invoices/${row.id}/view`}" class="dropdown-item">
<router-link
:to="{ path: `invoices/${row.id}/view` }"
class="dropdown-item"
>
<font-awesome-icon icon="eye" class="dropdown-item-icon" />
{{ $t('invoices.view') }}
</router-link>
</v-dropdown-item>
<v-dropdown-item v-if="row.status == 'DRAFT'">
<a class="dropdown-item" href="#/" @click="sendInvoice(row.id)" >
<font-awesome-icon icon="paper-plane" class="dropdown-item-icon" />
<a class="dropdown-item" href="#/" @click="sendInvoice(row.id)">
<font-awesome-icon
icon="paper-plane"
class="dropdown-item-icon"
/>
{{ $t('invoices.send_invoice') }}
</a>
</v-dropdown-item>
<v-dropdown-item
v-if="row.status === 'SENT' || row.status === 'VIEWED'"
>
<a class="dropdown-item" href="#/" @click="sendInvoice(row.id)">
<font-awesome-icon
icon="paper-plane"
class="dropdown-item-icon"
/>
{{ $t('invoices.resend_invoice') }}
</a>
</v-dropdown-item>
<v-dropdown-item v-if="row.status == 'DRAFT'">
<a class="dropdown-item" href="#/" @click="markInvoiceAsSent(row.id)">
<font-awesome-icon icon="check-circle" class="dropdown-item-icon" />
<a
class="dropdown-item"
href="#/"
@click="markInvoiceAsSent(row.id)"
>
<font-awesome-icon
icon="check-circle"
class="dropdown-item-icon"
/>
{{ $t('invoices.mark_as_sent') }}
</a>
</v-dropdown-item>
<v-dropdown-item v-if="row.status === 'SENT' || row.status === 'VIEWED' || row.status === 'OVERDUE'">
<router-link :to="`/admin/payments/${row.id}/create`" class="dropdown-item">
<font-awesome-icon :icon="['fas', 'credit-card']" class="dropdown-item-icon"/>
<v-dropdown-item
v-if="
row.status === 'SENT' ||
row.status === 'VIEWED' ||
row.status === 'OVERDUE'
"
>
<router-link
:to="`/admin/payments/${row.id}/create`"
class="dropdown-item"
>
<font-awesome-icon
:icon="['fas', 'credit-card']"
class="dropdown-item-icon"
/>
{{ $t('payments.record_payment') }}
</router-link>
</v-dropdown-item>
<v-dropdown-item>
<a class="dropdown-item" href="#/" @click="onCloneInvoice(row.id)">
<a
class="dropdown-item"
href="#/"
@click="onCloneInvoice(row.id)"
>
<font-awesome-icon icon="copy" class="dropdown-item-icon" />
{{ $t('invoices.clone_invoice') }}
</a>
</v-dropdown-item>
<v-dropdown-item>
<div class="dropdown-item" @click="removeInvoice(row.id)">
<font-awesome-icon :icon="['fas', 'trash']" class="dropdown-item-icon" />
<font-awesome-icon
:icon="['fas', 'trash']"
class="dropdown-item-icon"
/>
{{ $t('general.delete') }}
</div>
</v-dropdown-item>

View File

@ -12,6 +12,7 @@
ref="baseSelect"
v-model="itemSelect"
:options="items"
:loading="loading"
:show-labels="false"
:preserve-search="true"
:initial-search="item.name"
@ -20,7 +21,7 @@
label="name"
class="multi-select-item"
@value="onTextChange"
@select="(val) => $emit('select', val)"
@select="onSelect"
>
<div slot="afterList">
<button type="button" class="list-add-button" @click="openItemModal">
@ -131,6 +132,10 @@ export default {
'data': {taxPerItem: this.taxPerItem, taxes: this.taxes}
})
},
onSelect(val) {
this.$emit('select', val)
this.fetchItems()
},
deselectItem () {
this.itemSelect = null
this.$emit('deselect')

View File

@ -1,7 +1,7 @@
<template>
<div v-if="invoice" class="main-content invoice-view-page">
<div class="page-header">
<h3 class="page-title"> {{ invoice.invoice_number }}</h3>
<h3 class="page-title">{{ invoice.invoice_number }}</h3>
<div class="page-actions row">
<div class="col-xs-2 mr-3">
<base-button
@ -24,26 +24,47 @@
>
{{ $t('invoices.send_invoice') }}
</base-button>
<router-link v-if="invoice.status === 'SENT'" :to="`/admin/payments/${$route.params.id}/create`">
<base-button
color="theme"
>
<router-link
v-if="invoice.status === 'SENT'"
:to="`/admin/payments/${$route.params.id}/create`"
>
<base-button color="theme">
{{ $t('payments.record_payment') }}
</base-button>
</router-link>
<v-dropdown :close-on-select="false" align="left" class="filter-container">
<v-dropdown
:close-on-select="true"
align="left"
class="filter-container"
>
<a slot="activator" href="#">
<base-button color="theme">
<font-awesome-icon icon="ellipsis-h" />
</base-button>
</a>
<v-dropdown-item>
<router-link :to="{path: `/admin/invoices/${$route.params.id}/edit`}" class="dropdown-item">
<font-awesome-icon :icon="['fas', 'pencil-alt']" class="dropdown-item-icon"/>
<div class="dropdown-item" @click="copyPdfUrl">
<font-awesome-icon
:icon="['fas', 'link']"
class="dropdown-item-icon"
/>
{{ $t('general.copy_pdf_url') }}
</div>
<router-link
:to="{ path: `/admin/invoices/${$route.params.id}/edit` }"
class="dropdown-item"
>
<font-awesome-icon
:icon="['fas', 'pencil-alt']"
class="dropdown-item-icon"
/>
{{ $t('general.edit') }}
</router-link>
<div class="dropdown-item" @click="removeInvoice($route.params.id)">
<font-awesome-icon :icon="['fas', 'trash']" class="dropdown-item-icon" />
<font-awesome-icon
:icon="['fas', 'trash']"
class="dropdown-item-icon"
/>
{{ $t('general.delete') }}
</div>
</v-dropdown-item>
@ -61,14 +82,18 @@
align-icon="right"
@input="onSearch"
/>
<div
class="btn-group ml-3"
role="group"
aria-label="First group"
>
<v-dropdown :close-on-select="false" align="left" class="filter-container">
<div class="btn-group ml-3" role="group" aria-label="First group">
<v-dropdown
:close-on-select="false"
align="left"
class="filter-container"
>
<a slot="activator" href="#">
<base-button class="inv-button inv-filter-fields-btn" color="default" size="medium">
<base-button
class="inv-button inv-filter-fields-btn"
color="default"
size="medium"
>
<font-awesome-icon icon="filter" />
</base-button>
</a>
@ -84,8 +109,10 @@
class="inv-radio"
value="invoice_date"
@change="onSearch"
>
<label class="inv-label" for="filter_invoice_date">{{ $t('invoices.invoice_date') }}</label>
/>
<label class="inv-label" for="filter_invoice_date">{{
$t('invoices.invoice_date')
}}</label>
</div>
<div class="filter-items">
<input
@ -96,8 +123,10 @@
class="inv-radio"
value="due_date"
@change="onSearch"
>
<label class="inv-label" for="filter_due_date">{{ $t('invoices.due_date') }}</label>
/>
<label class="inv-label" for="filter_due_date">{{
$t('invoices.due_date')
}}</label>
</div>
<div class="filter-items">
<input
@ -108,11 +137,19 @@
class="inv-radio"
value="invoice_number"
@change="onSearch"
>
<label class="inv-label" for="filter_invoice_number">{{ $t('invoices.invoice_number') }}</label>
/>
<label class="inv-label" for="filter_invoice_number">{{
$t('invoices.invoice_number')
}}</label>
</div>
</v-dropdown>
<base-button v-tooltip.top-center="{ content: getOrderName }" class="inv-button inv-filter-sorting-btn" color="default" size="medium" @click="sortData">
<base-button
v-tooltip.top-center="{ content: getOrderName }"
class="inv-button inv-filter-sorting-btn"
color="default"
size="medium"
@click="sortData"
>
<font-awesome-icon v-if="getOrderBy" icon="sort-amount-up" />
<font-awesome-icon v-else icon="sort-amount-down" />
</base-button>
@ -121,7 +158,7 @@
<base-loader v-if="isSearching" />
<div v-else class="side-content">
<router-link
v-for="(invoice,index) in invoices"
v-for="(invoice, index) in invoices"
:to="`/admin/invoices/${invoice.id}/view`"
:key="index"
class="side-invoice"
@ -129,10 +166,20 @@
<div class="left">
<div class="inv-name">{{ invoice.user.name }}</div>
<div class="inv-number">{{ invoice.invoice_number }}</div>
<div :class="'inv-status-'+invoice.status.toLowerCase()" class="inv-status">{{ invoice.status }}</div>
<div
:class="'inv-status-' + invoice.status.toLowerCase()"
class="inv-status"
>
{{ invoice.status }}
</div>
</div>
<div class="right">
<div class="inv-amount" v-html="$utils.formatMoney(invoice.due_amount, invoice.user.currency)" />
<div
class="inv-amount"
v-html="
$utils.formatMoney(invoice.due_amount, invoice.user.currency)
"
/>
<div class="inv-date">{{ invoice.formattedInvoiceDate }}</div>
</div>
</router-link>
@ -141,8 +188,8 @@
</p>
</div>
</div>
<div class="invoice-view-page-container" >
<iframe :src="`${shareableLink}`" class="frame-style"/>
<div class="invoice-view-page-container">
<iframe :src="`${shareableLink}`" class="frame-style" />
</div>
</div>
</template>
@ -291,6 +338,14 @@ export default {
}
})
},
copyPdfUrl () {
let pdfUrl = `${window.location.origin}/invoices/pdf/${this.invoice.unique_hash}`
let response = this.$utils.copyTextToClipboard(pdfUrl)
window.toastr['success'](this.$tc('Copied PDF url to clipboard!'))
},
async removeInvoice (id) {
this.selectInvoice([parseInt(id)])
this.id = id

View File

@ -1,7 +1,7 @@
<template>
<div v-if="payment" class="main-content payment-view-page">
<div class="page-header">
<h3 class="page-title"> {{ payment.payment_number }}</h3>
<h3 class="page-title">{{ payment.payment_number }}</h3>
<div class="page-actions row">
<base-button
:loading="isSendingEmail"
@ -11,19 +11,39 @@
>
{{ $t('payments.send_payment_receipt') }}
</base-button>
<v-dropdown :close-on-select="false" align="left" class="filter-container">
<v-dropdown
:close-on-select="true"
align="left"
class="filter-container"
>
<a slot="activator" href="#">
<base-button color="theme">
<font-awesome-icon icon="ellipsis-h" />
</base-button>
</a>
<v-dropdown-item>
<router-link :to="{path: `/admin/payments/${$route.params.id}/edit`}" class="dropdown-item">
<font-awesome-icon :icon="['fas', 'pencil-alt']" class="dropdown-item-icon"/>
<div class="dropdown-item" @click="copyPdfUrl">
<font-awesome-icon
:icon="['fas', 'link']"
class="dropdown-item-icon"
/>
{{ $t('general.copy_pdf_url') }}
</div>
<router-link
:to="{ path: `/admin/payments/${$route.params.id}/edit` }"
class="dropdown-item"
>
<font-awesome-icon
:icon="['fas', 'pencil-alt']"
class="dropdown-item-icon"
/>
{{ $t('general.edit') }}
</router-link>
<div class="dropdown-item" @click="removePayment($route.params.id)">
<font-awesome-icon :icon="['fas', 'trash']" class="dropdown-item-icon" />
<font-awesome-icon
:icon="['fas', 'trash']"
class="dropdown-item-icon"
/>
{{ $t('general.delete') }}
</div>
</v-dropdown-item>
@ -41,14 +61,18 @@
align-icon="right"
@input="onSearch"
/>
<div
class="btn-group ml-3"
role="group"
aria-label="First group"
>
<v-dropdown :close-on-select="false" align="left" class="filter-container">
<div class="btn-group ml-3" role="group" aria-label="First group">
<v-dropdown
:close-on-select="false"
align="left"
class="filter-container"
>
<a slot="activator" href="#">
<base-button class="inv-button inv-filter-fields-btn" color="default" size="medium">
<base-button
class="inv-button inv-filter-fields-btn"
color="default"
size="medium"
>
<font-awesome-icon icon="filter" />
</base-button>
</a>
@ -64,8 +88,10 @@
class="inv-radio"
value="invoice_number"
@change="onSearch"
>
<label class="inv-label" for="filter_invoice_number">{{ $t('invoices.title') }}</label>
/>
<label class="inv-label" for="filter_invoice_number">{{
$t('invoices.title')
}}</label>
</div>
<div class="filter-items">
<input
@ -76,8 +102,10 @@
class="inv-radio"
value="payment_date"
@change="onSearch"
>
<label class="inv-label" for="filter_payment_date">{{ $t('payments.date') }}</label>
/>
<label class="inv-label" for="filter_payment_date">{{
$t('payments.date')
}}</label>
</div>
<div class="filter-items">
<input
@ -88,11 +116,19 @@
class="inv-radio"
value="payment_number"
@change="onSearch"
>
<label class="inv-label" for="filter_payment_number">{{ $t('payments.payment_number') }}</label>
/>
<label class="inv-label" for="filter_payment_number">{{
$t('payments.payment_number')
}}</label>
</div>
</v-dropdown>
<base-button v-tooltip.top-center="{ content: getOrderName }" class="inv-button inv-filter-sorting-btn" color="default" size="medium" @click="sortData">
<base-button
v-tooltip.top-center="{ content: getOrderName }"
class="inv-button inv-filter-sorting-btn"
color="default"
size="medium"
@click="sortData"
>
<font-awesome-icon v-if="getOrderBy" icon="sort-amount-up" />
<font-awesome-icon v-else icon="sort-amount-down" />
</base-button>
@ -101,7 +137,7 @@
<base-loader v-if="isSearching" />
<div v-else class="side-content">
<router-link
v-for="(payment,index) in payments"
v-for="(payment, index) in payments"
:to="`/admin/payments/${payment.id}/view`"
:key="index"
class="side-payment"
@ -112,7 +148,10 @@
<div class="inv-number">{{ payment.invoice_number }}</div>
</div>
<div class="right">
<div class="inv-amount" v-html="$utils.formatMoney(payment.amount, payment.user.currency)" />
<div
class="inv-amount"
v-html="$utils.formatMoney(payment.amount, payment.user.currency)"
/>
<div class="inv-date">{{ payment.formattedPaymentDate }}</div>
<!-- <div class="inv-number">{{ payment.payment_method.name }}</div> -->
</div>
@ -122,8 +161,8 @@
</p>
</div>
</div>
<div class="payment-view-page-container" >
<iframe :src="`${shareableLink}`" class="frame-style"/>
<div class="payment-view-page-container">
<iframe :src="`${shareableLink}`" class="frame-style" />
</div>
</div>
</template>
@ -260,6 +299,13 @@ export default {
}
})
},
copyPdfUrl () {
let pdfUrl = `${window.location.origin}/payments/pdf/${this.payment.unique_hash}`
let response = this.$utils.copyTextToClipboard(pdfUrl)
window.toastr['success'](this.$tc('Copied PDF url to clipboard!'))
},
async removePayment (id) {
this.id = id
window.swal({

View File

@ -1,33 +1,76 @@
<template>
<div class="setting-main-container">
<div class="setting-main-container update-container">
<div class="card setting-card">
<div class="page-header">
<h3 class="page-title">{{ $t('settings.update_app.title') }}</h3>
<p class="page-sub-title">
{{ $t('settings.update_app.description') }}
</p>
<label class="input-label">{{ $t('settings.update_app.current_version') }}</label><br>
<label class="input-label">{{
$t('settings.update_app.current_version')
}}</label
><br />
<label class="version mb-4">{{ currentVersion }}</label>
<base-button :outline="true" :disabled="isCheckingforUpdate || isUpdating" size="large" color="theme" class="mb-4" @click="checkUpdate">
<font-awesome-icon :class="{'update': isCheckingforUpdate}" style="margin-right: 10px;" icon="sync-alt" />
<base-button
:outline="true"
:disabled="isCheckingforUpdate || isUpdating"
size="large"
color="theme"
class="mb-4"
@click="checkUpdate"
>
<font-awesome-icon
:class="{ update: isCheckingforUpdate }"
style="margin-right: 10px;"
icon="sync-alt"
/>
{{ $t('settings.update_app.check_update') }}
</base-button>
<hr>
<hr />
<div v-show="!isUpdating" v-if="isUpdateAvailable" class="mt-4 content">
<h3 class="page-title mb-3">{{ $t('settings.update_app.avail_update') }}</h3>
<label class="input-label">{{ $t('settings.update_app.next_version') }}</label><br>
<h3 class="page-title mb-3">
{{ $t('settings.update_app.avail_update') }}
</h3>
<label class="input-label">{{
$t('settings.update_app.next_version')
}}</label
><br />
<label class="version">{{ updateData.version }}</label>
<p class="page-sub-title" style="white-space: pre-wrap;">{{ description }}</p>
<base-button size="large" icon="rocket" color="theme" @click="onUpdateApp">
<base-button
size="large"
icon="rocket"
color="theme"
@click="onUpdateApp"
>
{{ $t('settings.update_app.update') }}
</base-button>
</div>
<div v-if="isUpdating" class="mt-4 content">
<h3 class="page-title">{{ $t('settings.update_app.update_progress') }}</h3>
<p class="page-sub-title">
{{ $t('settings.update_app.progress_text') }}
</p>
<font-awesome-icon icon="spinner" class="fa-spin"/>
<div class="d-flex flex-row justify-content-between">
<div>
<h3 class="page-title">
{{ $t('settings.update_app.update_progress') }}
</h3>
<p class="page-sub-title">
{{ $t('settings.update_app.progress_text') }}
</p>
</div>
<font-awesome-icon icon="spinner" class="update-spinner fa-spin" />
</div>
<ul class="update-steps-container">
<li class="update-step" v-for="step in updateSteps">
<p class="update-step-text">{{ $t(step.translationKey) }}</p>
<div class="update-status-container">
<span v-if="step.time" class="update-time">{{
step.time
}}</span>
<span :class="'update-status status-' + getStatus(step)">{{
getStatus(step)
}}</span>
</div>
</li>
</ul>
</div>
</div>
</div>
@ -36,7 +79,7 @@
<script>
export default {
data () {
data() {
return {
isShowProgressBar: false,
isUpdateAvailable: false,
@ -46,60 +89,78 @@ export default {
interval: null,
description: '',
currentVersion: '',
updateSteps: [
{
translationKey: 'settings.update_app.download_zip_file',
stepUrl: '/api/update/download',
time: null,
started: false,
completed: false,
},
{
translationKey: 'settings.update_app.unzipping_package',
stepUrl: '/api/update/unzip',
time: null,
started: false,
completed: false,
},
{
translationKey: 'settings.update_app.copying_files',
stepUrl: '/api/update/copy',
time: null,
started: false,
completed: false,
},
{
translationKey: 'settings.update_app.running_migrations',
stepUrl: '/api/update/migrate',
time: null,
started: false,
completed: false,
},
{
translationKey: 'settings.update_app.finishing_update',
stepUrl: '/api/update/finish',
time: null,
started: false,
completed: false,
},
],
updateData: {
isMinor: Boolean,
installed: '',
version: ''
}
version: '',
},
}
},
created () {
created() {
window.addEventListener('beforeunload', (event) => {
if (this.isUpdating) {
event.returnValue = 'Update is in progress!'
}
})
},
mounted () {
mounted() {
window.axios.get('/api/settings/app/version').then((res) => {
this.currentVersion = res.data.version
})
},
methods: {
closeHandler () {
closeHandler() {
console.log('closing')
},
async onUpdateApp () {
try {
this.isUpdating = true
this.updateData.installed = this.currentVersion
let res = await window.axios.post('/api/update', this.updateData)
if (res.data.success) {
setTimeout(async () => {
await window.axios.post('/api/update/finish', this.updateData)
window.toastr['success'](this.$t('settings.update_app.update_success'))
this.currentVersion = this.updateData.version
this.isUpdateAvailable = false
setTimeout(() => {
location.reload()
}, 2000)
}, 1000)
} else {
console.log(res.data)
window.toastr['error'](res.data.error)
}
} catch (e) {
console.log(e)
window.toastr['error']('Something went wrong')
getStatus(step) {
if (step.started && step.completed) {
return 'finished'
} else if (step.started && !step.completed) {
return 'running'
} else if (!step.started && !step.completed) {
return 'pending'
} else {
return 'error'
}
this.isUpdating = false
},
async checkUpdate () {
async checkUpdate() {
try {
this.isCheckingforUpdate = true
let response = await window.axios.get('/api/check/update')
@ -122,8 +183,67 @@ export default {
this.isCheckingforUpdate = false
window.toastr['error']('Something went wrong')
}
}
}
},
async onUpdateApp() {
let path = null
for (let index = 0; index < this.updateSteps.length; index++) {
let currentStep = this.updateSteps[index]
try {
this.isUpdating = true
currentStep.started = true
let updateParams = {
version: this.updateData.version,
installed: this.currentVersion,
path: path || null,
}
let requestResponse = await window.axios.post(
currentStep.stepUrl,
updateParams
)
currentStep.completed = true
if (requestResponse.data && requestResponse.data.path) {
path = requestResponse.data.path
}
// on finish
if (
currentStep.translationKey == 'settings.update_app.finishing_update'
) {
this.isUpdating = false
window.toastr['success'](
this.$t('settings.update_app.update_success')
)
setTimeout(() => {
location.reload()
}, 3000)
}
} catch (error) {
currentStep.started = false
currentStep.completed = true
window.toastr['error'](this.$t('validation.something_went_wrong'))
this.onUpdateFailed(currentStep.translationKey)
return false
}
}
},
onUpdateFailed(translationKey) {
let stepName = this.$t(translationKey)
swal({
title: this.$t('settings.update_app.update_failed'),
text: this.$tc('settings.update_app.update_failed_text', stepName, {step: stepName}),
buttons: [this.$t('general.cancel'), this.$t('general.retry')],
}).then(async (value) => {
if (value) {
this.onUpdateApp()
return
}
this.isUpdating = false
})
},
},
}
</script>

View File

@ -54,7 +54,8 @@ import {
faEyeSlash,
faSyncAlt,
faRocket,
faCamera
faCamera,
faLink,
} from '@fortawesome/free-solid-svg-icons'
import { far } from '@fortawesome/free-regular-svg-icons'
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
@ -119,7 +120,8 @@ library.add(
faPaperPlane,
faSyncAlt,
faRocket,
faCamera
faCamera,
faLink
)
Vue.component('font-awesome-icon', FontAwesomeIcon)

View File

@ -27,6 +27,7 @@ fieldset[disabled] .multiselect {
top: 50%;
left: 50%;
margin: -8px 0 0 -8px;
z-index: 5;
width: 16px;
height: 16px;
border-radius: 100%;

View File

@ -122,6 +122,84 @@
}
.update-container {
.update-spinner {
font-size: 30px;
color: $ls-color-gray--dark;
}
.update-steps-container {
list-style-type: none;
width: 100%;
padding: 0px;
.update-step {
display: flex;
width: 100%;
justify-content: space-between;
padding: 10px 0px;
border-bottom: 1px solid $ls-color-gray--light;
&:last-child {
border-bottom: 0px solid;
}
}
}
.update-step-text {
font-size: $font-size-base;
margin: 0px;
line-height: 2rem;
}
.update-status-container {
display: flex;
flex-direction: row;
align-items: center;
.update-time {
font-size: 10px;
color: $ls-color-gray--dark;
margin-right: 10px;
}
.update-status {
font-size: 13px;
width: 88px;
height: 28px;
display: block;
text-align: center;
border-radius: 30px;
text-transform: uppercase;
line-height: 2rem;
}
.status-pending {
background-color: #EAF1FB;
color: $ls-color-secondary;
}
.status-running {
background-color: rgba(21, 178, 236, 0.15);
color: $ls-color-light-blue;
}
.status-finished {
background-color: #D4F6EE;
color: $ls-color-green;
}
.status-error {
background-color: rgba(251, 113, 120, 0.22);
color: $ls-color-red;
}
}
}
.add-new-tax {
height: 45px;
white-space: nowrap;

View File

@ -1,10 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<title>Estimate</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
/* -- Base -- */
body {
font-family: "DejaVu Sans";
}
@ -12,31 +14,22 @@
html {
margin: 0px;
padding: 0px;
margin-top: 50px;
}
table {
border-collapse: collapse;
}
.header-line {
color:rgba(0, 0, 0, 0.2);
position: absolute;
top: 90px;
left: 0px;
width: 100%;
}
hr {
margin: 0 30px 0 30px;
color:rgba(0, 0, 0, 0.2);
color: rgba(0, 0, 0, 0.2);
border: 0.5px solid #EAF1FB;
}
.header-center {
text-align: center
}
/* -- Header -- */
.header-table {
.header-container {
position: absolute;
width: 100%;
height: 90px;
@ -44,6 +37,14 @@
top: -50px;
}
.header-bottom-divider {
color: rgba(0, 0, 0, 0.2);
position: absolute;
top: 90px;
left: 0px;
width: 100%;
}
.header-logo {
height: 50px;
margin-top: 20px;
@ -51,122 +52,95 @@
color: #817AE3;
}
.inv-flex{
display:flex;
}
.inv-data{
text-align:right;
margin-right:120px;
}
.inv-value{
text-align:left;
margin-left:160px;
}
.header {
font-size: 20px;
color: rgba(0, 0, 0, 0.7);
}
.TextColor1 {
font-size: 16px;
color: rgba(0, 0, 0, 0.5);
}
@page {
margin-top: 60px !important;
}
.wrapper {
display: block;
margin-top: 0px;
padding-top: 16px;
padding-bottom: 20px;
display: block;
margin-top: 0px;
padding-top: 16px;
padding-bottom: 20px;
}
.address {
/* display: inline-block; */
padding-top: 30px
/* -- Company Details -- */
.company-details-container {
padding-top: 30px;
}
.company {
.company-address-container {
float: left;
padding-left: 30px;
font-weight: normal;
display: inline;
float:left;
width:30%;
width: 30%;
text-transform: capitalize;
margin-bottom: 2px;
}
.company h1 {
font-style: normal;
font-weight: normal;
.company-address-container {
padding-left: 30px;
float: left;
width: 30%;
text-transform: capitalize;
margin-bottom: 2px;
}
.company-address-container h1 {
font-size: 15px;
line-height: 22px;
letter-spacing: 0.05em;
margin-bottom: 0px;
margin-top: 10px;
}
.company-add {
.company-address {
margin-top: 2px;
text-align: left;
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 15px;
color: #595959;
}
.job-add {
/* display: inline; */
.estimate-details-container {
float: right;
padding: 10px 30px 0 0;
}
.amount-due {
background-color: #f2f2f2;
}
.textRight {
text-align: right;
}
.textLeft {
text-align: left;
}
.textStyle1 {
font-style: normal;
font-weight: normal;
.attribute-label {
font-size: 12px;
line-height: 18px;
padding-right: 40px;
text-align: left;
color: #55547A
}
.textStyle2 {
font-style: normal;
font-weight: normal;
.attribute-value {
font-size: 12px;
line-height: 18px;
text-align: right;
}
.bill-add {
width:45%;
/* -- Customer Address -- */
.customer-address-container {
width: 45%;
padding: 0px 0 0 0px;
}
/* -------------------------- */
/* shipping style */
/* -- Shipping -- */
.ship-address-container {
.shipping-address-container {
float: right;
padding-left: 30px;
}
.ship-to {
font-style: normal;
font-weight: normal;
.shipping-address-container--left {
float: left;
padding-left: 0px;
}
.shipping-address-label {
font-size: 12px;
line-height: 18px;
padding: 0px;
@ -174,18 +148,15 @@
margin-bottom: 0px;
}
.ship-user-name {
max-width: 250px
font-style: normal;
font-weight: normal;
.shipping-address-name {
max-width: 160px;
font-size: 15px;
line-height: 22px;
padding: 0px;
margin: 0px;
}
.ship-user-address {
font-style: normal;
font-weight: normal;
.shipping-address {
font-size: 10px;
line-height: 15px;
color: #595959;
@ -193,27 +164,15 @@
margin: 0px;
width: 160px;
}
.ship-user-phone {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
padding: 0px;
margin: 0px;
}
/* -------------------------- */
/* billing style */
/* -- Billing -- */
.bill-address-container {
.billing-address-container {
float: left;
padding-left: 30px;
}
.bill-to {
font-style: normal;
font-weight: normal;
.billing-address-label {
font-size: 12px;
line-height: 18px;
padding: 0px;
@ -221,19 +180,15 @@
margin-bottom: 0px;
}
.bill-user-name {
max-width: 250px
font-style: normal;
font-weight: normal;
.billing-address-name {
max-width: 160px;
font-size: 15px;
line-height: 22px;
padding: 0px;
margin: 0px;
}
.bill-user-address {
font-style: normal;
font-weight: normal;
.billing-address {
font-size: 10px;
line-height: 15px;
color: #595959;
@ -242,28 +197,20 @@
width: 160px;
}
.bill-user-phone {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
padding: 0px;
margin: 0px;
}
/* -- Items Table -- */
.table2 {
.items-table {
margin-top: 35px;
padding: 0px 30px 10px 30px;
page-break-before: avoid;
page-break-after: auto;
}
.table2 hr {
height:0.1px;
.items-table hr {
height: 0.1px;
}
.ItemTableHeader {
.item-table-heading {
font-size: 13.5;
text-align: center;
color: rgba(0, 0, 0, 0.85);
@ -271,85 +218,86 @@
padding-bottom: 10px;
}
tr.main-table-header th {
tr.item-table-heading-row th {
border-bottom: 0.620315px solid #E8E8E8;
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
}
.main-table-header {
.item-table-heading-row {
margin-bottom: 10px;
}
tr.item-details td {
font-style: normal;
font-weight: normal;
tr.item-row td {
font-size: 12px;
line-height: 18px;
}
.items {
.item-cell {
font-size: 13;
color: rgba(0, 0, 0, 0.6);
color: #040405;
text-align: center;
padding: 5px;
padding-top: 10px;
}
.padd8 {
padding-top: 8px;
padding-bottom: 8px;
}
.padd2 {
padding-top: 2px;
padding-bottom: 2px;
}
.table3 {
border-top: none;
box-sizing: border-box;
width: 630px;
page-break-inside: avoid;
page-break-before: auto;
page-break-after: auto;
}
.total-border-left {
border: 1px solid #E8E8E8!important;
border-right: 0px !important;
padding-top: 0px;
padding:8px !important;
}
.total-border-right {
border: 1px solid #E8E8E8!important;
border-left: 0px !important;
padding-top: 0px;
padding:8px !important;
}
.inv-item {
border-color: #d9d9d9;
}
.no-border {
border: none;
.item-description {
color: #595959;
font-size: 9px;
line-height: 12px;
}
.desc {
font-weight: 100;
text-align: justify;
font-size: 10px;
margin-bottom: 15px;
margin-top:7px;
color:rgba(0, 0, 0, 0.85);
/* -- Total Display Table -- */
.total-display-container {
padding: 0 25px;
}
.total-display-table {
border-top: none;
box-sizing: border-box;
page-break-inside: avoid;
page-break-before: auto;
page-break-after: auto;
margin-left: 500px;
margin-top: 20px;
}
.total-table-attribute-label {
font-size: 12px;
color: #55547A;
text-align: left;
padding-left: 10px;
}
.total-table-attribute-value {
font-weight: bold;
text-align: right;
font-size: 12px;
color: #040405;
padding-right: 10px;
padding-top: 2px;
padding-bottom: 2px;
}
.total-border-left {
border: 1px solid #E8E8E8 !important;
border-right: 0px !important;
padding-top: 0px;
padding: 8px !important;
}
.total-border-right {
border: 1px solid #E8E8E8 !important;
border-left: 0px !important;
padding-top: 0px;
padding: 8px !important;
}
/* -- Notes -- */
.notes {
font-style: normal;
font-weight: 300;
font-size: 12px;
color: #595959;
margin-top: 15px;
@ -360,8 +308,6 @@
}
.notes-label {
font-style: normal;
font-weight: normal;
font-size: 15px;
line-height: 22px;
letter-spacing: 0.05em;
@ -371,65 +317,122 @@
padding-bottom: 10px;
}
/* -- Helpers -- */
.text-primary {
color: #5851DB;
}
.text-center {
text-align: center
}
table .text-left {
text-align: left;
}
table .text-right {
text-align: right;
}
.border-0 {
border: none;
}
.py-2 {
padding-top: 2px;
padding-bottom: 2px;
}
.py-8 {
padding-top: 8px;
padding-bottom: 8px;
}
.py-3 {
padding: 3px 0;
}
.pr-20 {
padding-right: 20px;
}
.pr-10 {
padding-right: 10px;
}
.pl-20 {
padding-left: 20px;
}
.pl-10 {
padding-left: 10px;
}
.pl-0 {
padding-left: 0;
}
</style>
</head>
<body>
<div class="header-table">
<div class="header-container">
<table width="100%">
<tr>
<td class="header-center">
<td class="text-center">
@if($logo)
<img class="header-logo" src="{{ $logo }}" alt="Company Logo">
<img class="header-logo" src="{{ $logo }}" alt="Company Logo">
@else
@if($estimate->user->company)
<h2 class="header-logo"> {{$estimate->user->company->name}} </h2>
@endif
@if($estimate->user->company)
<h2 class="header-logo"> {{$estimate->user->company->name}} </h2>
@endif
@endif
</td>
</tr>
</table>
<hr class="header-line" />
<hr class="header-bottom-divider" />
</div>
<div class="wrapper">
<div class="address">
<div class="company">
<div class="company-details-container">
<div class="company-address-container">
@include('app.pdf.estimate.partials.company-address')
</div>
<div class="job-add">
<table>
<div class="estimate-details-container">
<table class="estimate-details-table">
<tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Estimate Number</td>
<td class="textStyle2"> &nbsp;{{$estimate->estimate_number}}</td>
<td class="attribute-label">Estimate Number</td>
<td class="attribute-value"> &nbsp;{{$estimate->estimate_number}}</td>
</tr>
<tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Estimate Date </td>
<td class="textStyle2"> &nbsp;{{$estimate->formattedEstimateDate}}</td>
<td class="attribute-label">Estimate Date </td>
<td class="attribute-value"> &nbsp;{{$estimate->formattedEstimateDate}}</td>
</tr>
<tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Expiry Date</td>
<td class="textStyle2"> &nbsp;{{$estimate->formattedExpiryDate}}</td>
<td class="attribute-label">Expiry Date</td>
<td class="attribute-value"> &nbsp;{{$estimate->formattedExpiryDate}}</td>
</tr>
</table>
</div>
<div style="clear: both;"></div>
</div>
<div class="bill-add">
<div class="bill-address-container">
<div class="customer-address-container">
<div class="billing-address-container">
@include('app.pdf.estimate.partials.billing-address')
</div>
@if($estimate->user->billingaddress)
<div class="ship-address-container">
<div class="shipping-address-container">
@else
<div class="ship-address-container " style="float:left;padding-left:0px;">
<div class="shipping-address-container--left">
@endif
@include('app.pdf.estimate.partials.shipping-address')
@include('app.pdf.estimate.partials.shipping-address')
</div>
<div style="clear: both;"></div>
</div>
<div style="position:relative">
@include('app.pdf.estimate.partials.table')
</div>
@include('app.pdf.estimate.partials.notes')
</div>
<div style="position:relative">
@include('app.pdf.estimate.partials.table')
</div>
@include('app.pdf.estimate.partials.notes')
</div>
</body>
</html>

View File

@ -1,9 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<title>Estimate</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
/* -- Base -- */
body {
font-family: "DejaVu Sans";
}
@ -11,22 +13,21 @@
html {
margin: 0px;
padding: 0px;
margin-top: 50px;
}
table {
border-collapse: collapse;
}
.header-left {
padding-top: 45px;
padding-bottom: 45px;
padding-left: 30px;
display:inline-block;
width:30%;
hr {
color: rgba(0, 0, 0, 0.2);
border: 0.5px solid #EAF1FB;
}
@page {
margin-top: 60px !important;
}
.header-table {
/* -- Header -- */
.header-container {
background: #817AE3;
position: absolute;
width: 100%;
@ -34,351 +35,286 @@
left: 0px;
top: -60px;
}
.header-section-left {
padding-top: 45px;
padding-bottom: 45px;
padding-left: 30px;
display: inline-block;
width: 30%;
}
.header-logo {
position: absolute;
height: 50px;
text-transform: capitalize;
color: #fff;
}
.header-right {
display:inline-block;
width:35%;
float:right;
.header-section-right {
display: inline-block;
width: 35%;
float: right;
padding: 20px 30px 20px 0px;
text-align: right;
color:white;
color: white;
}
}
.inv-flex{
display:flex;
}
.inv-data{
text-align:right;
margin-right:120px;
}
.inv-value{
text-align:left;
margin-left:160px;
}
.header {
font-size: 20px;
color: rgba(0, 0, 0, 0.7);
}
.TextColor1 {
font-size: 16px;
color: rgba(0, 0, 0, 0.5);
/* -- Estimate Details -- */
.estimate-details-container {
text-align: center;
width: 40%;
}
.wrapper {
display: block;
margin-top: 60px;
padding-bottom: 20px;
.estimate-details-container h1 {
margin: 0;
font-size: 24px;
line-height: 36px;
text-align: right;
font-family: "DejaVu Sans";
}
.address {
display: block;
padding-top: 20px;
}
.company {
padding: 0 0 0 30px;
display: inline;
float:left;
width:30%;
}
.company h1 {
font-style: normal;
font-weight: bold;
font-size: 15px;
line-height: 22px;
letter-spacing: 0.05em;
margin-bottom: 0;
}
.company-add {
font-style: normal;
font-weight: normal;
.estimate-details-container h4 {
margin: 0;
font-size: 10px;
line-height: 15px;
color: #595959;
margin-top: 0px;
}
/* -------------------------- */
/* billing style */
.bill-address-container {
display: block;
/* position: absolute; */
float:right;
padding: 0 40px 0 0;
}
.bill-to {
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
padding: 0px;
margin-bottom: 0px;
}
.bill-user-name {
max-width: 250px
font-style: normal;
font-weight: normal;
font-size: 15px;
line-height: 22px;
padding: 0px;
margin-top: 0px;
margin-bottom: 0px;
}
.bill-user-address {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
padding: 0px;
margin: 0px;
width: 170px;
}
.bill-user-phone {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
padding: 0px;
margin: 0px;
}
/* -------------------------- */
/* shipping style */
.ship-address-container {
display: block;
float:right;
padding: 0 30px 0 0;
}
.ship-to {
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
padding: 0px;
margin-bottom: 0px;
}
.ship-user-name {
max-width: 250px
font-style: normal;
font-weight: normal;
font-size: 15px;
line-height: 22px;
padding: 0px;
margin-top: 0px;
margin-bottom: 0px;
}
.ship-user-address {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
padding: 0px;
margin: 0px;
width: 170px;
}
.ship-user-phone {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
padding: 0px;
margin: 0px;
}
.job-add {
display: inline;
float: right;
width:40%;
}
.amount-due {
background-color: #f2f2f2;
}
.textRight {
text-align: right;
}
.textLeft {
text-align: left;
.estimate-details-container h3 {
margin-bottom: 1px;
margin-top: 0;
}
.textStyle1 {
/* -- Address -- */
.wrapper {
display: block;
margin-top: 60px;
padding-bottom: 20px;
}
.address-container {
display: block;
padding-top: 20px;
}
/* -- Company Address -- */
.company-address-container {
padding: 0 0 0 30px;
display: inline;
float: left;
width: 30%;
}
.company-address-container {
padding-left: 30px;
float: left;
width: 30%;
text-transform: capitalize;
margin-bottom: 2px;
}
.company-address-container h1 {
font-size: 15px;
line-height: 22px;
letter-spacing: 0.05em;
margin-bottom: 0px;
margin-top: 10px;
}
.company-address {
margin-top: 2px;
text-align: left;
font-size: 12px;
line-height: 15px;
color: #595959;
}
/* -- Billing -- */
.billing-address-container {
display: block;
/* position: absolute; */
float: right;
padding: 0 40px 0 0;
}
.billing-address-label {
font-size: 12px;
line-height: 18px;
padding: 0px;
margin-bottom: 0px;
}
.billing-address-name {
max-width: 160px;
font-size: 15px;
line-height: 22px;
padding: 0px;
margin-top: 0px;
margin-bottom: 0px;
}
.billing-address {
font-size: 10px;
line-height: 15px;
color: #595959;
padding: 0px;
margin: 0px;
width: 170px;
}
/* -- Shipping -- */
.shipping-address-container {
display: block;
float: right;
padding: 0 30px 0 0;
}
.shipping-address-label {
font-size: 12px;
line-height: 18px;
padding: 0px;
margin-bottom: 0px;
}
.shipping-address-name {
max-width: 160px;
font-size: 15px;
line-height: 22px;
padding: 0px;
margin-top: 0px;
margin-bottom: 0px;
}
.shipping-address {
font-size: 10px;
line-height: 15px;
color: #595959;
padding: 0px;
margin: 0px;
width: 170px;
}
.attribute-label {
font-size: 12;
font-weight: bold;
line-height:22px;
line-height: 22px;
color: rgba(0, 0, 0, 0.8);
}
.textStyle2 {
.attribute-value {
font-size: 12;
line-height:22px;
line-height: 22px;
color: rgba(0, 0, 0, 0.7);
}
.main-table-header td {
padding: 5px;
padding-bottom: 10px;
}
/* -- Items Table -- */
.main-table-header {
border-bottom: 1px solid red;
}
.table2 {
margin-top: 30px;
padding: 0px 30px 10px 30px;
.items-table {
padding: 30px 30px 10px 30px;
page-break-before: avoid;
page-break-after: auto;
}
hr {
margin: 0 30px 0 30px;
color:rgba(0, 0, 0, 0.2);
border: 0.5px solid #EAF1FB;
.items-table hr {
height: 0.1px;
margin: 0 30px;
}
.table2 hr {
height:0.1px;
}
.ItemTableHeader {
.item-table-heading {
font-size: 13.5;
text-align: center;
color: rgba(0, 0, 0, 0.85);
padding: 5px;
}
tr.main-table-header th {
.item-table-heading-row td {
padding: 5px;
padding-bottom: 10px;
}
.item-table-heading-row {
border-bottom: 1px solid red;
}
tr.item-table-heading-row th {
border-bottom: 0.620315px solid #E8E8E8;
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
}
tr.item-details td {
font-style: normal;
font-weight: normal;
tr.item-row td {
font-size: 12px;
line-height: 18px;
}
.items {
.item-cell {
font-size: 13;
color: rgba(0, 0, 0, 0.6);
color: #040405;
text-align: center;
padding: 5px;
padding-top: 10px;
}
.note-header {
font-size: 13;
color: rgba(0, 0, 0, 0.6);
.item-description {
color: #595959;
font-size: 9px;
line-height: 12px;
page-break-inside: avoid;
}
.note-text {
font-size: 10;
color: rgba(0, 0, 0, 0.6);
/* -- Total Display Table -- */
.total-display-container {
padding: 0 25px;
}
.padd8 {
padding-top: 8px;
padding-bottom: 8px;
.item-cell-table-hr {
margin: 0 25px 0 30px;
}
.padd2 {
.total-display-table {
box-sizing: border-box;
page-break-inside: avoid;
page-break-before: auto;
page-break-after: auto;
margin-left: 500px;
border: 1px solid #EAF1FB;
border-top: none;
}
.total-table-attribute-label {
font-size: 12px;
color: #55547A;
text-align: left;
padding-left: 10px;
}
.total-table-attribute-value {
font-weight: bold;
text-align: right;
font-size: 12px;
color: #040405;
padding-right: 10px;
padding-top: 2px;
padding-bottom: 2px;
}
.table3 {
border: 1px solid #EAF1FB;
border-top: none;
box-sizing: border-box;
width: 630px;
page-break-inside: avoid;
page-break-before: auto;
page-break-after: auto;
}
.text-per-item-table3 {
border: 1px solid #EAF1FB;
border-top: none;
padding-right: 30px;
box-sizing: border-box;
width: 260px;
/* height: 100px; */
position: absolute;
right: -25;
}
.inv-item {
border-color: #d9d9d9;
}
.no-border {
border: none;
}
.desc {
font-weight: 100;
text-align: justify;
font-size: 10px;
margin-bottom: 15px;
margin-top:7px;
color:rgba(0, 0, 0, 0.85);
}
.company-details{
text-align: center;
width: 40%;
}
.company-details h1 {
margin:0;
font-style: normal;
font-weight: 500;
font-size: 24px;
line-height: 36px;
text-align: right;
}
.company-details h4 {
margin:0;
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
text-align: right;
}
.company-details h3 {
margin-bottom:1px;
margin-top:0;
}
/* -- Notes -- */
.notes {
font-style: normal;
font-weight: 300;
font-size: 12px;
color: #595959;
margin-top: 15px;
@ -389,8 +325,6 @@
}
.notes-label {
font-style: normal;
font-weight: normal;
font-size: 15px;
line-height: 22px;
letter-spacing: 0.05em;
@ -400,23 +334,79 @@
padding-bottom: 10px;
}
/* -- Helpers -- */
.text-primary {
color: #5851DB;
}
.text-center {
text-align: center
}
table .text-left {
text-align: left;
}
table .text-right {
text-align: right;
}
.border-0 {
border: none;
}
.py-2 {
padding-top: 2px;
padding-bottom: 2px;
}
.py-8 {
padding-top: 8px;
padding-bottom: 8px;
}
.py-3 {
padding: 3px 0;
}
.pr-20 {
padding-right: 20px;
}
.pr-10 {
padding-right: 10px;
}
.pl-20 {
padding-left: 20px;
}
.pl-10 {
padding-left: 10px;
}
.pl-0 {
padding-left: 0;
}
</style>
</head>
<body>
<div class="header-table">
<div class="header-container">
<table width="100%">
<tr>
@if($logo)
<td width="60%" class="header-left">
<img class="header-logo" src="{{ $logo }}" alt="Company Logo">
@else
<td width="60%" class="header-left" style="padding-top: 0px;">
@if($estimate->user->company)
<h1 class="header-logo"> {{$estimate->user->company->name}} </h1>
@endif
@endif
<td width="60%" class="header-section-left">
<img class="header-logo" src="{{ $logo }}" alt="Company Logo">
@else
<td width="60%" class="header-section-left" style="padding-top: 0px;">
@if($estimate->user->company)
<h1 class="header-logo"> {{$estimate->user->company->name}} </h1>
@endif
@endif
</td>
<td width="40%" class="header-right company-details">
<td width="40%" class="header-section-right estimate-details-container">
<h1>Estimate</h1>
<h4>{{$estimate->estimate_number}}</h4>
<h4>{{$estimate->formattedEstimateDate}}</h4>
@ -426,24 +416,24 @@
</div>
<hr>
<div class="wrapper">
<div class="address">
<div class="company">
<div class="address-container">
<div class="company-address-container">
@include('app.pdf.estimate.partials.company-address')
</div>
<div class="ship-address-container">
<div class="shipping-address-container">
@include('app.pdf.estimate.partials.shipping-address')
</div>
@if($estimate->user->shippingaddress)
<div class="bill-address-container">
<div class="billing-address-container">
@else
<div class="bill-address-container" style="float:right;padding-right:0px;">
<div class="billing-address-container" style="float:right; padding-right:0px;">
@endif
@include('app.pdf.estimate.partials.billing-address')
</div>
<div style="clear: both;"></div>
@include('app.pdf.estimate.partials.table')
@include('app.pdf.estimate.partials.notes')
</div>
@include('app.pdf.estimate.partials.table')
@include('app.pdf.estimate.partials.notes')
</div>
</body>
</html>

View File

@ -1,10 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<title>Estimate</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
/* -- Base -- */
body {
font-family: "DejaVu Sans";
}
@ -12,147 +14,138 @@
html {
margin: 0px;
padding: 0px;
margin-top: 50px;
}
table {
border-collapse: collapse;
}
.header-line {
color:rgba(0, 0, 0, 0.2);
position: absolute;
top: 80px;
left: 0px;
right: -70px;
width: 100%;
}
hr {
color:rgba(0, 0, 0, 0.2);
color: rgba(0, 0, 0, 0.2);
border: 0.5px solid #EAF1FB;
}
.items-table-hr{
margin: 0 30px 0 30px;
}
/* -- Header -- */
.header-left {
padding-top: 45px;
padding-bottom: 45px;
padding-left: 30px;
display:inline-block;
width:30%;
}
.header-table {
.header-container {
position: absolute;
width: 100%;
height: 150px;
left: 0px;
top: -60px;
}
.header-section-left {
padding-top: 45px;
padding-bottom: 45px;
padding-left: 30px;
display: inline-block;
width: 30%;
}
.header-bottom-divider {
color: rgba(0, 0, 0, 0.2);
position: absolute;
top: 100px;
left: 0px;
width: 100%;
}
.header-logo {
position: absolute;
height: 50px;
text-transform: capitalize;
color: #817AE3;
}
.header-right {
display:inline-block;
.header-section-right {
display: inline-block;
position: absolute;
right:0;
right: 0;
padding: 15px 30px 15px 0px;
float: right;
}
.inv-flex{
display:flex;
}
.inv-data{
text-align:right;
margin-right:120px;
}
.inv-value{
text-align:left;
margin-left:160px;
}
.header {
font-size: 20px;
color: rgba(0, 0, 0, 0.7);
}
.TextColor1 {
font-size: 16px;
color: rgba(0, 0, 0, 0.5);
/* -- Company Address -- */
.company-address-container {
width: auto;
text-transform: capitalize;
margin-bottom: 2px;
}
@page {
margin-top: 60px !important;
}
.company-address-container h1 {
.wrapper {
display: block;
padding-top: 50px;
padding-bottom: 20px;
}
.address {
display: inline-block;
padding-top: 100px
}
.bill-add {
display: inline;
float:left;
width:40%;
padding: 0 0 0 30px;
}
.company {
padding-left: 30px;
display: inline;
float:left;
width:30%;
}
.company h1 {
font-style: normal;
font-weight: bold;
font-size: 18px;
font-size: 15px;
line-height: 22px;
letter-spacing: 0.05em;
margin-bottom: 0px;
margin-top: 10px;
}
.company-add {
.company-address {
margin-top: 2px;
text-align: left;
font-style: normal;
font-weight: normal;
font-size: 10px;
font-size: 12px;
line-height: 15px;
color: #595959;
margin: 0px;
}
/* -------------------------- */
/* shipping style */
.ship-to {
/* -- Content Wrapper -- */
.wrapper {
display: block;
padding-top: 100px;
padding-bottom: 20px;
}
.main-content {
}
.customer-address-container {
display: inline;
float: left;
width: 40%;
padding: 0 0 0 30px;
}
/* -- Shipping -- */
.shipping-address-container {
float: right;
display: block;
}
.shipping-address-container--left {
float: left;
padding-left: 0;
}
.shipping-address-label {
padding-top: 5px;
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
margin-bottom: 0px;
}
.ship-user-name {
.shipping-address-name {
padding: 0px;
font-style: normal;
font-weight: normal;
font-size: 15px;
line-height: 22px;
margin: 0px;
max-width: 160px;
}
.ship-user-address {
font-style: normal;
font-weight: normal;
.shipping-address {
font-size: 10px;
line-height: 15px;
color: #595959;
@ -160,38 +153,28 @@
width: 160px;
}
.ship-user-phone {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
margin: 0px;
/* -- Billing -- */
.billing-address-container {
float: left;
}
/* -------------------------- */
/* billing style */
.bill-to {
.billing-address-label {
padding-top: 5px;
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
margin-bottom: 0px;
}
.bill-user-name {
.billing-address-name {
padding: 0px;
font-style: normal;
font-weight: normal;
font-size: 15px;
line-height: 22px;
margin: 0px;
max-width: 160px;
}
.bill-user-address {
font-style: normal;
font-weight: normal;
.billing-address {
font-size: 10px;
line-height: 15px;
color: #595959;
@ -199,187 +182,131 @@
width: 160px;
}
.bill-user-phone {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
margin: 0px;
}
/* -- Estimate Details -- */
.job-add {
.estimate-details-container {
display: block;
float: right;
padding: 20px 30px 0 0;
}
.amount-due {
background-color: #f2f2f2;
}
.textRight {
text-align: right;
}
.textLeft {
.attribute-label {
font-size: 12px;
line-height: 18px;
text-align: left;
color: #55547A
}
.textStyle1 {
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
}
.textStyle2 {
font-style: normal;
font-weight: normal;
.attribute-value {
font-size: 12px;
line-height: 18px;
text-align: right;
}
.main-table-header td {
padding: 10px;
}
.main-table-header {
border-bottom: 1px solid red;
}
tr.main-table-header th {
font-style: normal;
font-weight: 600;
font-size: 12px;
line-height: 18px;
}
tr.item-details td {
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
}
.table2 {
padding: 0px 30px 10px 30px;
/* -- Items Table -- */
.items-table {
padding: 30px 30px 10px 30px;
page-break-before: avoid;
page-break-after: auto;
}
.table2 hr {
height:0.1px;
.items-table hr {
height: 0.1px;
margin: 0 30px;
}
.ItemTableHeader {
.item-table-heading {
font-size: 13.5;
text-align: center;
color: rgba(0, 0, 0, 0.85);
padding: 5px;
padding-bottom: 10px;
}
.items {
tr.item-table-heading-row th {
border-bottom: 0.620315px solid #E8E8E8;
font-size: 12px;
line-height: 18px;
}
.item-table-heading-row {
margin-bottom: 10px;
}
tr.item-row td {
font-size: 12px;
line-height: 18px;
}
.item-cell {
font-size: 13;
color: rgba(0, 0, 0, 0.6);
color: #040405;
text-align: center;
padding: 5px;
padding-top: 10px;
border-color: #d9d9d9;
}
.note-header {
font-size: 13;
color: rgba(0, 0, 0, 0.6);
.item-description {
color: #595959;
font-size: 9px;
line-height: 12px;
}
.note-text {
font-size: 10;
color: rgba(0, 0, 0, 0.6);
.item-cell-table-hr {
margin: 0 30px 0 30px;
}
.padd8 {
padding-top: 8px;
padding-bottom: 8px;
/* -- Total Display Table -- */
.total-display-container {
padding: 0 25px;
}
.padd2 {
.total-display-table {
box-sizing: border-box;
page-break-inside: avoid;
page-break-before: auto;
page-break-after: auto;
margin-left: 500px;
margin-top: 20px;
}
.total-table-attribute-label {
font-size: 12px;
color: #55547A;
text-align: left;
padding-left: 10px;
}
.total-table-attribute-value {
font-weight: bold;
text-align: right;
font-size: 12px;
color: #040405;
padding-right: 10px;
padding-top: 2px;
padding-bottom: 2px;
}
.table3 {
border: 1px solid #EAF1FB;
border-top: none;
box-sizing: border-box;
width: 630px;
page-break-inside: avoid;
page-break-before: auto;
page-break-after: auto;
.total-border-left {
border: 1px solid #E8E8E8 !important;
border-right: 0px !important;
padding-top: 0px;
padding: 8px !important;
}
td.estimate-total1 {
text-align:left;
padding: 15px 0 15px 10px;
font-size:12px;
line-height: 18px;
color: #55547A;
border-bottom:1px solid #E8E8E8;
border-top:1px solid #E8E8E8;
border-left:1px solid #E8E8E8;
.total-border-right {
border: 1px solid #E8E8E8 !important;
border-left: 0px !important;
padding-top: 0px;
padding: 8px !important;
}
td.estimate-total2 {
font-weight: 500;
text-align: right;
font-size:12px;
line-height: 18px;
padding: 15px 10px 15px 0;
color: #5851DB;
border-bottom:1px solid #E8E8E8;
border-top:1px solid #E8E8E8;
border-right:1px solid #E8E8E8;
}
.inv-item {
border-color: #d9d9d9;
}
.no-border {
border: none;
}
.desc {
font-weight: 100;
text-align: justify;
font-size: 10px;
margin-bottom: 15px;
margin-top:7px;
color:rgba(0, 0, 0, 0.85);
}
.company-details h1 {
margin:0;
font-style: normal;
font-weight: bold;
font-size: 15px;
line-height: 22px;
letter-spacing: 0.05em;
text-align: left;
max-width: 220px;
}
.company-details h4 {
margin:0;
font-style: normal;
font-weight: 100;
font-size: 18px;
line-height: 25px;
text-align: right;
}
.company-details h3 {
margin-bottom:1px;
margin-top:0;
}
tr.total td {
border-bottom:1px solid #E8E8E8;
border-top:1px solid #E8E8E8;
}
/* -- Notes -- */
.notes {
font-style: normal;
font-weight: 300;
font-size: 12px;
color: #595959;
margin-top: 15px;
@ -390,8 +317,6 @@
}
.notes-label {
font-style: normal;
font-weight: normal;
font-size: 15px;
line-height: 22px;
letter-spacing: 0.05em;
@ -401,67 +326,125 @@
padding-bottom: 10px;
}
/* -- Helpers -- */
.text-primary {
color: #5851DB;
}
.text-center {
text-align: center
}
table .text-left {
text-align: left;
}
table .text-right {
text-align: right;
}
.border-0 {
border: none;
}
.py-2 {
padding-top: 2px;
padding-bottom: 2px;
}
.py-8 {
padding-top: 8px;
padding-bottom: 8px;
}
.py-3 {
padding: 3px 0;
}
.pr-20 {
padding-right: 20px;
}
.pr-10 {
padding-right: 10px;
}
.pl-20 {
padding-left: 20px;
}
.pl-10 {
padding-left: 10px;
}
.pl-0 {
padding-left: 0;
}
</style>
</head>
<body>
<div class="header-table">
<div class="header-container">
<table width="100%">
<tr>
@if($logo)
<td class="header-left">
<td class="header-section-left">
<img class="header-logo" src="{{ $logo }}" alt="Company Logo">
@else
@else
@if($estimate->user->company)
<td class="header-left" style="padding-top:0px;">
<h1 class="header-logo"> {{$estimate->user->company->name}} </h1>
<td class="header-section-left" style="padding-top:0px;">
<h1 class="header-logo"> {{$estimate->user->company->name}} </h1>
@endif
@endif
@endif
</td>
<td class="header-right company-details">
<td class="header-section-right company-address-container">
@include('app.pdf.estimate.partials.company-address')
</td>
</tr>
</table>
</div>
<hr class="header-line">
<hr class="header-bottom-divider">
<div class="wrapper">
<div class="address">
<div class="bill-add">
<div style="float:left;">
<div class="main-content">
<div class="customer-address-container">
<div class="billing-address-container">
@include('app.pdf.estimate.partials.billing-address')
</div>
@if($estimate->user->billingaddress)
<div style="float:right;">
@else
<div style="float:left;">
@endif
@include('app.pdf.estimate.partials.shipping-address')
@if($estimate->user->billingaddress)
<div class="shipping-address-container">
@else
<div class="shipping-address-container--left">
@endif
@include('app.pdf.estimate.partials.shipping-address')
</div>
<div style="clear: both;"></div>
</div>
<div class="estimate-details-container">
<table>
<tr>
<td class="attribute-label">Estimate Number</td>
<td class="attribute-value"> &nbsp;{{$estimate->estimate_number}}</td>
</tr>
<tr>
<td class="attribute-label">Estimate Date </td>
<td class="attribute-value"> &nbsp;{{$estimate->formattedEstimateDate}}</td>
</tr>
<tr>
<td class="attribute-label">Expiry Date</td>
<td class="attribute-value"> &nbsp;{{$estimate->formattedExpiryDate}}</td>
</tr>
</table>
</div>
<div style="clear: both;"></div>
</div>
<div class="job-add">
<table>
<tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Estimate Number</td>
<td class="textStyle2"> &nbsp;{{$estimate->estimate_number}}</td>
</tr>
<tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Estimate Date </td>
<td class="textStyle2"> &nbsp;{{$estimate->formattedEstimateDate}}</td>
</tr>
<tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Expiry Date</td>
<td class="textStyle2"> &nbsp;{{$estimate->formattedExpiryDate}}</td>
</tr>
</table>
</div>
<div style="clear: both;"></div>
@include('app.pdf.estimate.partials.table')
@include('app.pdf.estimate.partials.notes')
</div>
@include('app.pdf.estimate.partials.table')
@include('app.pdf.estimate.partials.notes')
</div>
</body>
</html>

View File

@ -1,11 +1,11 @@
@if($estimate->user->billingaddress)
<p class="bill-to">Bill To,</p>
<p class="billing-address-label">Bill To,</p>
@if($estimate->user->billingaddress->name)
<p class="bill-user-name">
<p class="billing-address-name">
{{$estimate->user->billingaddress->name}}
</p>
@endif
<p class="bill-user-address">
<p class="billing-address">
@if($estimate->user->billingaddress->address_street_1)
{!! nl2br(htmlspecialchars($estimate->user->billingaddress->address_street_1)) !!}<br>
@endif
@ -31,7 +31,7 @@
@endif
@if($estimate->user->billingaddress->phone)
<p class="bill-user-phone">
<p class="billing-address">
Phone :{{$estimate->user->billingaddress->phone}}
</p>
@endif

View File

@ -3,7 +3,7 @@
@endif
@if($company_address)
<p class="company-add">
<p class="company-address">
@if($company_address->addresses[0]['address_street_1'])
{!! nl2br(htmlspecialchars($company_address->addresses[0]['address_street_1'])) !!} <br>
@endif

View File

@ -1,11 +1,11 @@
@if($estimate->user->shippingaddress)
<p class="ship-to">Ship To,</p>
<p class="shipping-address-label">Ship To,</p>
@if($estimate->user->shippingaddress->name)
<p class="ship-user-name">
<p class="shipping-address-name">
{{$estimate->user->shippingaddress->name}}
</p>
@endif
<p class="ship-user-address">
<p class="shipping-address">
@if($estimate->user->shippingaddress->address_street_1)
{!! nl2br(htmlspecialchars($estimate->user->shippingaddress->address_street_1)) !!}<br>
@endif
@ -30,8 +30,8 @@
{{$estimate->user->shippingaddress->country->name}}<br>
@endif
@if($estimate->user->phone)
<p class="ship-user-phone">
@if($estimate->user->shippingAddress->phone)
<p class="shipping-address">
Phone :{{$estimate->user->shippingaddress->phone}}
</p>
@endif

View File

@ -1,50 +1,49 @@
<table width="100%" class="table2" cellspacing="0" border="0">
<tr class="main-table-header">
<th width="2%" class="ItemTableHeader" style="text-align: right; color: #55547A; padding-right: 20px">#</th>
<th width="40%" class="ItemTableHeader" style="text-align: left; color: #55547A; padding-left: 0px">Items</th>
<th class="ItemTableHeader" style="text-align: right; color: #55547A; padding-right: 20px">Quantity</th>
<th class="ItemTableHeader" style="text-align: right; color: #55547A; padding-right: 20px">Price</th>
<table width="100%" class="items-table" cellspacing="0" border="0">
<tr class="item-table-heading-row">
<th width="2%" class="item-table-heading text-right pr-20">#</th>
<th width="40%" class="item-table-heading text-left pl-0">Items</th>
<th class="item-table-heading text-right pr-20">Quantity</th>
<th class="item-table-heading text-right pr-20">Price</th>
@if($estimate->discount_per_item === 'YES')
<th class="ItemTableHeader" style="text-align: right; color: #55547A; padding-left: 10px">Discount</th>
<th class="item-table-heading text-right pl-10">Discount</th>
@endif
<th class="ItemTableHeader" style="text-align: right; color: #55547A;">Amount</th>
<th class="item-table-heading text-right">Amount </th>
</tr>
@php
$index = 1
@endphp
@foreach ($estimate->items as $item)
<tr class="item-details">
<tr class="item-row">
<td
class="inv-item items"
style="text-align: right; color: #040405; padding-right: 20px; vertical-align: top;"
class="item-cell text-right pr-20"
style="vertical-align: top;"
>
{{$index}}
</td>
<td
class="inv-item items"
style="text-align: left; color: #040405;padding-left: 0px"
class="item-cell text-left pl-0"
>
<span>{{ $item->name }}</span><br>
<span
style="text-align: left; color: #595959; font-size: 9px; font-weight:300; line-height: 12px;"
class="item-description"
>
{!! nl2br(htmlspecialchars($item->description)) !!}
</span>
</td>
<td
class="inv-item items"
style="text-align: right; color: #040405; padding-right: 20px"
class="item-cell text-right pr-20"
style="vertical-align: top;"
>
{{$item->quantity}}
</td>
<td
class="inv-item items"
style="text-align: right; color: #040405; padding-right: 20px"
class="item-cell text-right pr-20"
style="vertical-align: top;"
>
{!! format_money_pdf($item->price, $estimate->user->currency) !!}
</td>
@if($estimate->discount_per_item === 'YES')
<td class="inv-item items" style="text-align: right; color: #040405; padding-left: 10px">
<td class="item-cell text-right pl-10" style="vertical-align: top;">
@if($item->discount_type === 'fixed')
{!! format_money_pdf($item->discount_val, $estimate->user->currency) !!}
@endif
@ -53,7 +52,7 @@
@endif
</td>
@endif
<td class="inv-item items" style="text-align: right; color: #040405;">
<td class="item-cell text-right" style="vertical-align: top;">
{!! format_money_pdf($item->total, $estimate->user->currency) !!}
</td>
</tr>
@ -63,74 +62,68 @@
@endforeach
</table>
<hr class="items-table-hr">
<hr class="item-cell-table-hr">
<table width="100%" cellspacing="0px" style="margin-left:420px;margin-top: 10px" border="0" class="table3 @if(count($estimate->items) > 12) page-break @endif">
<tr>
<td class="no-borde" style="color: #55547A; padding-left:10px; font-size:12px;">Subtotal</td>
<td class="no-border items"
style="padding-right:10px; text-align: right; font-size:12px; color: #040405; font-weight: 500;">{!! format_money_pdf($estimate->sub_total, $estimate->user->currency) !!}</td>
</tr>
@if ($estimate->tax_per_item === 'YES')
@for ($i = 0; $i < count($labels); $i++)
<tr>
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; color: #55547A;">
{{$labels[$i]}}
</td>
<td class="no-border items padd2" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; color: #040405">
{!! format_money_pdf($taxes[$i], $estimate->user->currency) !!}
</td>
</tr>
@endfor
@else
@foreach ($estimate->taxes as $tax)
<tr>
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; color: #55547A;">
{{$tax->name.' ('.$tax->percent.'%)'}}
</td>
<td class="no-border items padd2" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; color: #040405">
{!! format_money_pdf($tax->amount, $estimate->user->currency) !!}
</td>
</tr>
@endforeach
@endif
@if ($estimate->discount_per_item === 'NO')
<div class="total-display-container">
<table width="100%" cellspacing="0px" border="0" class="total-display-table @if(count($estimate->items) > 12) page-break @endif">
<tr>
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; color: #55547A;">
@if($estimate->discount_type === 'fixed')
Discount
@endif
@if($estimate->discount_type === 'percentage')
Discount ({{$estimate->discount}}%)
@endif
</td>
<td class="no-border items padd2" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; color: #040405">
@if($estimate->discount_type === 'fixed')
{!! format_money_pdf($estimate->discount_val, $estimate->user->currency) !!}
@endif
@if($estimate->discount_type === 'percentage')
{!! format_money_pdf($estimate->discount_val, $estimate->user->currency) !!}
@endif
<td class="border-0 total-table-attribute-label">Subtotal</td>
<td class="border-0 item-cell total-table-attribute-value ">{!! format_money_pdf($estimate->sub_total, $estimate->user->currency) !!}</td>
</tr>
@if ($estimate->tax_per_item === 'YES')
@for ($i = 0; $i < count($labels); $i++)
<tr>
<td class="border-0 total-table-attribute-label">
{{$labels[$i]}}
</td>
<td class="border-0 item-cell total-table-attribute-value">
{!! format_money_pdf($taxes[$i], $estimate->user->currency) !!}
</td>
</tr>
@endfor
@else
@foreach ($estimate->taxes as $tax)
<tr>
<td class="border-0 total-table-attribute-label">
{{$tax->name.' ('.$tax->percent.'%)'}}
</td>
<td class="border-0 item-cell total-table-attribute-value" >
{!! format_money_pdf($tax->amount, $estimate->user->currency) !!}
</td>
</tr>
@endforeach
@endif
@if ($estimate->discount_per_item === 'NO')
<tr>
<td class="border-0 total-table-attribute-label pl-10">
@if($estimate->discount_type === 'fixed')
Discount
@endif
@if($estimate->discount_type === 'percentage')
Discount ({{$estimate->discount}}%)
@endif
</td>
<td class="border-0 item-cell total-table-attribute-value text-right">
@if($estimate->discount_type === 'fixed')
{!! format_money_pdf($estimate->discount_val, $estimate->user->currency) !!}
@endif
@if($estimate->discount_type === 'percentage')
{!! format_money_pdf($estimate->discount_val, $estimate->user->currency) !!}
@endif
</td>
</tr>
@endif
<tr>
<td class="py-3"></td>
<td class="py-3"></td>
</tr>
<tr>
<td class="border-0 total-border-left total-table-attribute-label">Total</td>
<td class="border-0 total-border-right item-cell py-8 total-table-attribute-value text-primary">
{!! format_money_pdf($estimate->total, $estimate->user->currency)!!}
</td>
</tr>
@endif
<tr>
<td style="padding:3px 0px"></td>
<td style="padding:3px 0px"></td>
</tr>
<tr>
<td class="no-border total-border-left"
style="padding-left:10px; padding-bottom:10px; text-align:left; padding-top:20px; font-size:12px; color: #55547A;"
>
<label class="total-bottom"> Total </label>
</td>
<td
class="no-border total-border-right items padd8"
style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; padding-top:20px; color: #5851DB"
>
{!! format_money_pdf($estimate->total, $estimate->user->currency)!!}
</td>
</tr>
</table>
</table>
</div>

View File

@ -1,10 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<title>Invoice</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
/* -- Base -- */
body {
font-family: "DejaVu Sans";
}
@ -15,29 +17,27 @@
margin-top: 50px;
}
table {
border-collapse: collapse;
.text-center {
text-align: center
}
.header-line {
color:rgba(0, 0, 0, 0.2);
hr {
margin: 0 30px 0 30px;
color: rgba(0, 0, 0, 0.2);
border: 0.5px solid #EAF1FB;
}
/* -- Header -- */
.header-bottom-divider {
color: rgba(0, 0, 0, 0.2);
position: absolute;
top: 90px;
left: 0px;
width: 100%;
}
hr {
margin: 0 30px 0 30px;
color:rgba(0, 0, 0, 0.2);
border: 0.5px solid #EAF1FB;
}
.header-center {
text-align: center
}
.header-table {
.header-container {
position: absolute;
width: 100%;
height: 90px;
@ -52,122 +52,69 @@
color: #817AE3;
}
.inv-flex{
display:flex;
}
.inv-data{
text-align:right;
margin-right:120px;
}
.inv-value{
text-align:left;
margin-left:160px;
}
.header {
font-size: 20px;
color: rgba(0, 0, 0, 0.7);
}
.TextColor1 {
font-size: 16px;
color: rgba(0, 0, 0, 0.5);
.content-wrapper {
display: block;
margin-top: 0px;
padding-top: 16px;
padding-bottom: 20px;
}
@page {
margin-top: 60px !important;
}
.wrapper {
display: block;
margin-top: 0px;
padding-top: 16px;
padding-bottom: 20px;
}
.address {
/* display: inline-block; */
padding-top: 30px
}
.company {
float: left;
.company-address-container {
padding-left: 30px;
font-weight: normal;
display: inline;
float:left;
width:30%;
float: left;
width: 30%;
text-transform: capitalize;
margin-bottom: 2px;
}
.company h1 {
font-style: normal;
font-weight: normal;
.company-address-container h1 {
font-size: 15px;
line-height: 22px;
letter-spacing: 0.05em;
margin-bottom: 0px;
margin-top: 10px;
}
.company-add {
.company-address {
margin-top: 2px;
text-align: left;
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 15px;
color: #595959;
}
.job-add {
/* display: inline; */
.invoice-details-container {
float: right;
padding: 10px 30px 0 0;
}
.amount-due {
background-color: #f2f2f2;
}
.textRight {
text-align: right;
}
.textLeft {
text-align: left;
}
.textStyle1 {
font-style: normal;
font-weight: normal;
.attribute-label {
font-size: 12px;
line-height: 18px;
padding-right: 40px;
text-align: left;
color: #55547A;
}
.textStyle2 {
font-style: normal;
font-weight: normal;
.attribute-value {
font-size: 12px;
line-height: 18px;
text-align: right;
}
.bill-add {
width:45%;
padding: 0px 0 0 0px;
}
/* -------------------------- */
/* shipping style */
/* -- Shipping -- */
.ship-address-container {
.shipping-address-container {
float: right;
padding-left: 30px;
}
.ship-to {
font-style: normal;
font-weight: normal;
.shipping-address-label {
font-size: 12px;
line-height: 18px;
padding: 0px;
@ -175,18 +122,15 @@
margin-bottom: 0px;
}
.ship-user-name {
max-width: 250px
font-style: normal;
font-weight: normal;
.shipping-address-name {
max-width: 160px;
font-size: 15px;
line-height: 22px;
padding: 0px;
margin: 0px;
}
.ship-user-address {
font-style: normal;
font-weight: normal;
.shipping-address {
font-size: 10px;
line-height: 15px;
color: #595959;
@ -194,27 +138,15 @@
margin: 0px;
width: 160px;
}
.ship-user-phone {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
padding: 0px;
margin: 0px;
}
/* -------------------------- */
/* billing style */
/* -- Billing -- */
.bill-address-container {
.billing-address-container {
float: left;
padding-left: 30px;
}
.bill-to {
font-style: normal;
font-weight: normal;
.billing-address-label {
font-size: 12px;
line-height: 18px;
padding: 0px;
@ -222,19 +154,15 @@
margin-bottom: 0px;
}
.bill-user-name {
max-width: 250px
font-style: normal;
font-weight: normal;
.billing-address-name {
max-width: 160px;
font-size: 15px;
line-height: 22px;
padding: 0px;
margin: 0px;
}
.bill-user-address {
font-style: normal;
font-weight: normal;
.billing-address {
font-size: 10px;
line-height: 15px;
color: #595959;
@ -243,115 +171,102 @@
width: 160px;
}
.bill-user-phone {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
padding: 0px;
margin: 0px;
}
/* -- Items Table -- */
.table2 {
.items-table {
margin-top: 35px;
padding: 0px 30px 10px 30px;
page-break-before: avoid;
page-break-after: auto;
}
.table2 hr {
height:0.1px;
.items-table hr {
height: 0.1px;
}
.ItemTableHeader {
.item-table-heading {
font-size: 13.5;
text-align: center;
color: rgba(0, 0, 0, 0.85);
padding: 5px;
color: #55547A;
}
tr.main-table-header th {
tr.item-table-heading-row th {
border-bottom: 0.620315px solid #E8E8E8;
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
}
tr.item-details td {
font-style: normal;
font-weight: normal;
tr.item-row td {
font-size: 12px;
line-height: 18px;
}
.items {
.item-cell {
font-size: 13;
color: rgba(0, 0, 0, 0.6);
text-align: center;
padding: 5px;
padding-top: 10px;
color: #040405;
}
.padd8 {
padding-top: 8px;
padding-bottom: 8px;
.item-description {
color: #595959;
font-size: 9px;
line-height: 12px;
}
.padd2 {
/* -- Total Display Table -- */
.total-display-container {
padding: 0 25px;
}
.total-display-table {
border-top: none;
box-sizing: border-box;
page-break-inside: avoid;
page-break-before: auto;
page-break-after: auto;
margin-left: 500px;
margin-top: 20px;
}
.total-table-attribute-label {
font-size: 13px;
color: #55547A;
text-align: left;
padding-left: 10px;
}
.total-table-attribute-value {
font-weight: bold;
text-align: right;
font-size: 13px;
color: #040405;
padding-right: 10px;
padding-top: 2px;
padding-bottom: 2px;
}
.table3 {
/* border: 1px solid #EAF1FB; */
border-top: none;
/* padding-right: 30px; */
box-sizing: border-box;
width: 630px;
/* position: absolute;
right: -25; */
page-break-inside: avoid;
page-break-before: auto;
page-break-after: auto;
}
.total-border-left {
border: 1px solid #E8E8E8!important;
border: 1px solid #E8E8E8 !important;
border-right: 0px !important;
padding-top: 0px;
padding:8px !important;
padding: 8px !important;
}
.total-border-right {
border: 1px solid #E8E8E8!important;
border: 1px solid #E8E8E8 !important;
border-left: 0px !important;
padding-top: 0px;
padding:8px !important;
padding: 8px !important;
}
.inv-item {
border-color: #d9d9d9;
}
.no-border {
border: none;
}
.desc {
font-weight: 100;
text-align: justify;
font-size: 10px;
margin-bottom: 15px;
margin-top:7px;
color:rgba(0, 0, 0, 0.85);
}
/* -- Notes -- */
.notes {
font-style: normal;
font-weight: 300;
font-size: 12px;
color: #595959;
margin-top: 15px;
@ -362,8 +277,6 @@
}
.notes-label {
font-style: normal;
font-weight: normal;
font-size: 15px;
line-height: 22px;
letter-spacing: 0.05em;
@ -373,13 +286,69 @@
padding-bottom: 10px;
}
/* -- Helpers -- */
.text-primary {
color: #5851DB;
}
.text-center {
text-align: center
}
table .text-left {
text-align: left;
}
table .text-right {
text-align: right;
}
.border-0 {
border: none;
}
.py-2 {
padding-top: 2px;
padding-bottom: 2px;
}
.py-8 {
padding-top: 8px;
padding-bottom: 8px;
}
.py-3 {
padding: 3px 0;
}
.pr-20 {
padding-right: 20px;
}
.pr-10 {
padding-right: 10px;
}
.pl-20 {
padding-left: 20px;
}
.pl-10 {
padding-left: 10px;
}
.pl-0 {
padding-left: 0;
}
</style>
</head>
<body>
<div class="header-table">
<div class="header-container">
<table width="100%">
<tr>
<td class="header-center">
<td class="text-center">
@if($logo)
<img class="header-logo" src="{{ $logo }}" alt="Company Logo">
@else
@ -390,48 +359,44 @@
</td>
</tr>
</table>
<hr class="header-line" style="border: 0.620315px solid #E8E8E8;"/>
<hr class="header-bottom-divider" style="border: 0.620315px solid #E8E8E8;" />
</div>
<div class="wrapper">
<div class="address">
<div class="company">
<div class="content-wrapper">
<div style="padding-top: 30px">
<div class="company-address-container">
@include('app.pdf.invoice.partials.company-address')
</div>
<div class="job-add">
<div class="invoice-details-container">
<table>
<tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Invoice Number</td>
<td class="textStyle2"> &nbsp;{{$invoice->invoice_number}}</td>
<td class="attribute-label">Invoice Number</td>
<td class="attribute-value"> &nbsp;{{$invoice->invoice_number}}</td>
</tr>
<tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Invoice Date </td>
<td class="textStyle2"> &nbsp;{{$invoice->formattedInvoiceDate}}</td>
<td class="attribute-label">Invoice Date </td>
<td class="attribute-value"> &nbsp;{{$invoice->formattedInvoiceDate}}</td>
</tr>
<tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Due date</td>
<td class="textStyle2"> &nbsp;{{$invoice->formattedDueDate}}</td>
<td class="attribute-label">Due date</td>
<td class="attribute-value"> &nbsp;{{$invoice->formattedDueDate}}</td>
</tr>
</table>
</div>
<div style="clear: both;"></div>
</div>
<div class="bill-add">
<div class="bill-address-container">
@include('app.pdf.invoice.partials.billing-address')
</div>
@if($invoice->user->billingaddress)
<div class="ship-address-container">
@else
<div class="ship-address-container " style="float:left;padding-left:0px;">
@endif
@include('app.pdf.invoice.partials.shipping-address')
</div>
<div style="clear: both;"></div>
<div class="billing-address-container">
@include('app.pdf.invoice.partials.billing-address')
</div>
<div style="position:relative">
<div class="shipping-address-container" @if($invoice->user->billingaddress) style="float:left;" @else style="float:left: padding-left: 0px;" @endif>
@include('app.pdf.invoice.partials.shipping-address')
@if($invoice->user->billingaddress) <div style="clear: both;"></div> @endif
</div>
<div style="position: relative; clear: both;">
@include('app.pdf.invoice.partials.table')
</div>
@include('app.pdf.invoice.partials.notes')
</div>
</body>
</html>

View File

@ -1,10 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<title>Invoice</title>
{{-- <link href="https://fonts.googleapis.com/css?family=Poppins&display=swap" rel="stylesheet"> --}}
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
/* -- Base -- */
body {
font-family: "DejaVu Sans";
}
@ -12,22 +13,22 @@
html {
margin: 0px;
padding: 0px;
margin-top: 50px;
}
table {
border-collapse: collapse;
}
.header-left {
padding-top: 45px;
padding-bottom: 45px;
padding-left: 30px;
display:inline-block;
width:30%;
hr {
margin: 0 30px 0 30px;
color: rgba(0, 0, 0, 0.2);
border: 0.5px solid #EAF1FB;
}
@page {
margin-top: 60px !important;
}
.header-table {
/* -- Header -- */
.header-container {
background: #817AE3;
position: absolute;
width: 100%;
@ -35,351 +36,266 @@
left: 0px;
top: -60px;
}
.header-section-left {
padding-top: 45px;
padding-bottom: 45px;
padding-left: 30px;
display: inline-block;
width: 30%;
}
.header-logo {
position: absolute;
height: 50px;
text-transform: capitalize;
color: #fff;
}
.header-right {
display:inline-block;
width:35%;
float:right;
.header-section-right {
display: inline-block;
width: 35%;
float: right;
padding: 20px 30px 20px 0px;
text-align: right;
color:white;
color: white;
}
}
.inv-flex{
display:flex;
}
.inv-data{
text-align:right;
margin-right:120px;
}
.inv-value{
text-align:left;
margin-left:160px;
}
.header {
font-size: 20px;
color: rgba(0, 0, 0, 0.7);
}
.TextColor1 {
font-size: 16px;
color: rgba(0, 0, 0, 0.5);
}
/* -- Estimate Details -- */
.wrapper {
display: block;
margin-top: 60px;
padding-bottom: 20px;
}
.address {
display: block;
padding-top: 20px;
}
.company {
padding: 0 0 0 30px;
display: inline;
float:left;
width:30%;
}
.company h1 {
font-style: normal;
font-weight: bold;
font-size: 15px;
line-height: 22px;
letter-spacing: 0.05em;
margin-bottom: 0;
}
.company-add {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
margin-top: 0px;
}
/* -------------------------- */
/* billing style */
.bill-address-container {
display: block;
/* position: absolute; */
float:right;
padding: 0 40px 0 0;
}
.bill-to {
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
padding: 0px;
margin-bottom: 0px;
}
.bill-user-name {
max-width: 250px
font-style: normal;
font-weight: normal;
font-size: 15px;
line-height: 22px;
padding: 0px;
margin-top: 0px;
margin-bottom: 0px;
}
.bill-user-address {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
padding: 0px;
margin: 0px;
width: 170px;
}
.bill-user-phone {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
padding: 0px;
margin: 0px;
}
/* -------------------------- */
/* shipping style */
.ship-address-container {
display: block;
float:right;
padding: 0 30px 0 0;
}
.ship-to {
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
padding: 0px;
margin-bottom: 0px;
}
.ship-user-name {
max-width: 250px
font-style: normal;
font-weight: normal;
font-size: 15px;
line-height: 22px;
padding: 0px;
margin-top: 0px;
margin-bottom: 0px;
}
.ship-user-address {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
padding: 0px;
margin: 0px;
width: 170px;
}
.ship-user-phone {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
padding: 0px;
margin: 0px;
}
.job-add {
display: inline;
float: right;
width:40%;
}
.amount-due {
background-color: #f2f2f2;
}
.textRight {
text-align: right;
}
.textLeft {
text-align: left;
}
.textStyle1 {
font-size: 12;
font-weight: bold;
line-height:22px;
color: rgba(0, 0, 0, 0.8);
}
.textStyle2 {
font-size: 12;
line-height:22px;
color: rgba(0, 0, 0, 0.7);
}
.main-table-header td {
padding: 5px;
padding-bottom: 10px;
}
.main-table-header {
border-bottom: 1px solid red;
}
.table2 {
margin-top: 30px;
padding: 0px 30px 10px 30px;
page-break-before: avoid;
page-break-after: auto;
}
hr {
margin: 0 30px 0 30px;
color:rgba(0, 0, 0, 0.2);
border: 0.5px solid #EAF1FB;
}
.table2 hr {
height:0.1px;
}
.ItemTableHeader {
font-size: 13.5;
text-align: center;
color: rgba(0, 0, 0, 0.85);
padding: 5px;
}
tr.main-table-header th {
border-bottom: 0.620315px solid #E8E8E8;
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
}
tr.item-details td {
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
}
.items {
font-size: 13;
color: rgba(0, 0, 0, 0.6);
text-align: center;
padding: 5px;
padding-top: 10px;
}
.note-header {
font-size: 13;
color: rgba(0, 0, 0, 0.6);
}
.note-text {
font-size: 10;
color: rgba(0, 0, 0, 0.6);
}
.padd8 {
padding-top: 8px;
padding-bottom: 8px;
}
.padd2 {
padding-top: 2px;
padding-bottom: 2px;
}
.table3 {
border: 1px solid #EAF1FB;
border-top: none;
box-sizing: border-box;
width: 630px;
page-break-inside: avoid;
page-break-before: auto;
page-break-after: auto;
}
.text-per-item-table3 {
border: 1px solid #EAF1FB;
border-top: none;
padding-right: 30px;
box-sizing: border-box;
width: 260px;
/* height: 100px; */
position: absolute;
right: -25;
}
.inv-item {
border-color: #d9d9d9;
}
.no-border {
border: none;
}
.desc {
font-weight: 100;
text-align: justify;
font-size: 10px;
margin-bottom: 15px;
margin-top:7px;
color:rgba(0, 0, 0, 0.85);
}
.company-details{
.invoice-details-container {
text-align: center;
width: 40%;
}
.company-details h1 {
margin:0;
font-style: normal;
font-weight: 500;
.invoice-details-container h1 {
margin: 0;
font-size: 24px;
line-height: 36px;
text-align: right;
}
.company-details h4 {
margin:0;
font-style: normal;
font-weight: normal;
.invoice-details-container h4 {
margin: 0;
font-size: 10px;
line-height: 15px;
text-align: right;
}
.company-details h3 {
margin-bottom:1px;
margin-top:0;
.invoice-details-container h3 {
margin-bottom: 1px;
margin-top: 0;
}
/* -- Content Wrapper -- */
.content-wrapper {
display: block;
margin-top: 60px;
padding-bottom: 20px;
}
.address-container {
display: block;
padding-top: 20px;
}
/* -- Company -- */
.company-address-container {
padding: 0 0 0 30px;
display: inline;
float: left;
width: 30%;
}
.company-address-container h1 {
font-weight: bold;
font-size: 15px;
letter-spacing: 0.05em;
margin-bottom: 0;
margin-top: 18px;
}
.company-address{
font-size: 10px;
line-height: 15px;
color: #595959;
margin-top: 0px;
}
/* -- Billing -- */
.billing-address-container {
display: block;
/* position: absolute; */
float: right;
padding: 0 40px 0 0;
}
.billing-address-label {
font-size: 12px;
line-height: 18px;
padding: 0px;
margin-bottom: 0px;
}
.billing-address-name {
max-width: 250px;
font-size: 15px;
line-height: 22px;
padding: 0px;
margin-top: 0px;
margin-bottom: 0px;
}
.billing-address{
font-size: 10px;
line-height: 15px;
color: #595959;
padding: 0px;
margin: 0px;
width: 170px;
}
/* -- Shipping -- */
.shipping-address-container {
display: block;
float: right;
padding: 0 30px 0 0;
}
.shipping-address-label {
font-size: 12px;
line-height: 18px;
padding: 0px;
margin-bottom: 0px;
}
.shipping-address-name {
max-width: 250px;
font-size: 15px;
line-height: 22px;
padding: 0px;
margin-top: 0px;
margin-bottom: 0px;
}
.shipping-address {
font-size: 10px;
line-height: 15px;
color: #595959;
padding: 0px;
margin: 0px;
width: 170px;
}
/* -- Items Table -- */
.items-table {
margin-top: 35px;
padding: 0px 30px 10px 30px;
page-break-before: avoid;
page-break-after: auto;
}
.items-table hr {
height: 0.1px;
}
.item-table-heading {
font-size: 13.5;
text-align: center;
color: rgba(0, 0, 0, 0.85);
padding: 5px;
color: #55547A;
}
tr.item-table-heading-row th {
border-bottom: 0.620315px solid #E8E8E8;
font-size: 12px;
line-height: 18px;
}
tr.item-row td {
font-size: 12px;
line-height: 18px;
}
.item-cell {
font-size: 13;
text-align: center;
padding: 5px;
padding-top: 10px;
color: #040405;
}
.item-description {
color: #595959;
font-size: 9px;
line-height: 12px;
}
/* -- Total Display Table -- */
.total-display-container {
padding: 0 25px;
}
.item-cell-table-hr {
margin: 0 25px 0 30px;
}
.total-display-table {
box-sizing: border-box;
page-break-inside: avoid;
page-break-before: auto;
page-break-after: auto;
margin-left: 500px;
border: 1px solid #EAF1FB;
border-top: none;
}
.total-table-attribute-label {
font-size: 12px;
color: #55547A;
text-align: left;
padding-left: 10px;
}
.total-table-attribute-value {
font-weight: 500;
text-align: right;
font-size: 12px;
color: #040405;
padding-right: 10px;
padding-top: 2px;
padding-bottom: 2px;
}
.total-border-left {
border: 1px solid #E8E8E8 !important;
border-right: 0px !important;
padding-top: 0px;
padding: 8px !important;
}
.total-border-right {
border: 1px solid #E8E8E8 !important;
border-left: 0px !important;
padding-top: 0px;
padding: 8px !important;
}
/* -- Notes -- */
.notes {
font-style: normal;
font-weight: 300;
font-size: 12px;
color: #595959;
margin-top: 15px;
@ -390,8 +306,6 @@
}
.notes-label {
font-style: normal;
font-weight: normal;
font-size: 15px;
line-height: 22px;
letter-spacing: 0.05em;
@ -401,23 +315,79 @@
padding-bottom: 10px;
}
/* -- Helpers -- */
.text-primary {
color: #5851DB;
}
.text-center {
text-align: center
}
table .text-left {
text-align: left;
}
table .text-right {
text-align: right;
}
.border-0 {
border: none;
}
.py-2 {
padding-top: 2px;
padding-bottom: 2px;
}
.py-8 {
padding-top: 8px;
padding-bottom: 8px;
}
.py-3 {
padding: 3px 0;
}
.pr-20 {
padding-right: 20px;
}
.pr-10 {
padding-right: 10px;
}
.pl-20 {
padding-left: 20px;
}
.pl-10 {
padding-left: 10px;
}
.pl-0 {
padding-left: 0;
}
</style>
</head>
<body>
<div class="header-table">
<div class="header-container">
<table width="100%">
<tr>
@if($logo)
<td width="60%" class="header-left">
<img class="header-logo" src="{{ $logo }}" alt="Company Logo">
@else
<td width="60%" class="header-left" style="padding-top: 0px;">
@if($invoice->user->company)
<h1 class="header-logo"> {{$invoice->user->company->name}} </h1>
@endif
@endif
<td width="60%" class="header-section-left">
<img class="header-logo" src="{{ $logo }}" alt="Company Logo">
@else
<td width="60%" class="header-section-left" style="padding-top: 0px;">
@if($invoice->user->company)
<h1 class="header-logo"> {{$invoice->user->company->name}} </h1>
@endif
@endif
</td>
<td width="40%" class="header-right company-details">
<td width="40%" class="header-section-right invoice-details-container">
<h1>Invoice</h1>
<h4>{{$invoice->invoice_number}}</h4>
<h4>{{$invoice->formattedInvoiceDate}}</h4>
@ -426,25 +396,26 @@
</table>
</div>
<hr>
<div class="wrapper">
<div class="address">
<div class="company">
<div class="content-wrapper">
<div class="address-container">
<div class="company-address-container">
@include('app.pdf.invoice.partials.company-address')
</div>
<div class="ship-address-container">
<div class="shipping-address-container">
@include('app.pdf.invoice.partials.shipping-address')
</div>
@if($invoice->user->shippingaddress)
<div class="bill-address-container">
@else
<div class="bill-address-container" style="float:right;padding-right:0px;">
@endif
@include('app.pdf.invoice.partials.billing-address')
<div class="billing-address-container">
@else
<div class="billing-address-container" style="float:right;padding-right:0px;">
@endif
@include('app.pdf.invoice.partials.billing-address')
</div>
<div style="clear: both;"></div>
</div>
<div style="clear: both;"></div>
@include('app.pdf.invoice.partials.table')
@include('app.pdf.invoice.partials.notes')
</div>
@include('app.pdf.invoice.partials.table')
@include('app.pdf.invoice.partials.notes')
</div>
</body>
</html>

View File

@ -1,11 +1,13 @@
<!DOCTYPE html>
<html>
<head>
<title>Invoice</title>
{{-- <link href="https://fonts.googleapis.com/css?family=Poppins&display=swap" rel="stylesheet"> --}}
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
/* -- Base -- */
body {
font-family: "DejaVu Sans";
}
@ -13,146 +15,134 @@
html {
margin: 0px;
padding: 0px;
margin-top: 50px;
}
table {
border-collapse: collapse;
}
.header-line {
color:rgba(0, 0, 0, 0.2);
position: absolute;
top: 80px;
left: 0px;
right: -70px;
width: 100%;
}
hr {
color:rgba(0, 0, 0, 0.2);
color: rgba(0, 0, 0, 0.2);
border: 0.5px solid #EAF1FB;
}
.items-table-hr{
margin: 0 30px 0 30px;
/* -- Header -- */
.header-bottom-divider {
color: rgba(0, 0, 0, 0.2);
position: absolute;
top: 100px;
left: 0px;
width: 100%;
}
.header-left {
.header-section-left {
padding-top: 45px;
padding-bottom: 45px;
padding-left: 30px;
display:inline-block;
width:30%;
display: inline-block;
width: 30%;
}
.header-table {
.header-container {
position: absolute;
width: 100%;
height: 150px;
left: 0px;
top: -60px;
}
.header-logo {
position: absolute;
height: 50px;
text-transform: capitalize;
color: #817AE3;
}
.header-right {
display:inline-block;
.header-section-right {
display: inline-block;
position: absolute;
right:0;
right: 0;
padding: 15px 30px 15px 0px;
float: right;
}
.inv-flex{
display:flex;
}
.inv-data{
text-align:right;
margin-right:120px;
}
.inv-value{
text-align:left;
margin-left:160px;
}
.header {
font-size: 20px;
color: rgba(0, 0, 0, 0.7);
}
.TextColor1 {
font-size: 16px;
color: rgba(0, 0, 0, 0.5);
/* -- Company Address */
.company-address-container {
width: auto;
text-transform: capitalize;
margin-bottom: 2px;
}
@page {
margin-top: 60px !important;
}
.wrapper {
display: block;
padding-top: 50px;
padding-bottom: 20px;
}
.address {
display: inline-block;
padding-top: 100px;
}
.bill-add {
display: block;
float:left;
width:40%;
padding: 0 0 0 30px;
}
.company {
padding-left: 30px;
display: inline;
float:left;
width:30%;
}
.company h1 {
font-style: normal;
font-weight: bold;
font-size: 18px;
.company-address-container h1 {
font-size: 15px;
line-height: 22px;
letter-spacing: 0.05em;
margin-bottom: 0px;
margin-top: 10px;
}
.company-add {
text-align: left;
font-style: normal;
font-weight: normal;
font-size: 10px;
.company-address {
margin-top: 2px;
font-size: 12px;
line-height: 15px;
color: #595959;
margin: 0px;
}
/* -------------------------- */
/* shipping style */
.ship-to {
/* -- Content Wrapper */
.content-wrapper {
display: block;
padding-top: 100px;
padding-bottom: 20px;
}
.main-content {
}
.customer-address-container {
display: block;
float: left;
width: 40%;
padding: 0 0 0 30px;
}
/* -- Shipping -- */
.shipping-address-container {
float:right;
display: block;
}
.shipping-address-container--left {
float:left;
display: block;
padding-left: 0;
}
.shipping-address-label {
padding-top: 5px;
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
margin-bottom: 0px;
}
.ship-user-name {
.shipping-address-name {
padding: 0px;
font-style: normal;
font-weight: normal;
font-size: 15px;
line-height: 22px;
margin: 0px;
max-width: 160px;
}
.ship-user-address {
font-style: normal;
font-weight: normal;
.shipping-address {
font-size: 10px;
line-height: 15px;
color: #595959;
@ -160,237 +150,156 @@
width: 160px;
}
.ship-user-phone {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
margin: 0px;
/* -- Billing -- */
.billing-address-container {
display: block;
float: left;
}
/* -------------------------- */
/* billing style */
.bill-to {
.billing-address-label {
padding-top: 5px;
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
margin-bottom: 0px;
}
.bill-user-name {
.billing-address-name {
padding: 0px;
font-style: normal;
font-weight: normal;
font-size: 15px;
line-height: 22px;
margin: 0px;
max-width: 160px;
}
.bill-user-address {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
margin:0px;
width: 160px;
}
.bill-user-phone {
font-style: normal;
font-weight: normal;
.billing-address {
font-size: 10px;
line-height: 15px;
color: #595959;
margin: 0px;
width: 160px;
}
/* -- Estimate Details -- */
.job-add {
.invoice-details-container {
display: block;
float: right;
padding: 20px 30px 0 0;
}
.amount-due {
background-color: #f2f2f2;
}
.textRight {
text-align: right;
}
.textLeft {
.attribute-label {
font-size: 12px;
line-height: 18px;
text-align: left;
color: #55547A
}
.textStyle1 {
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
}
.textStyle2 {
font-style: normal;
font-weight: normal;
.attribute-value {
font-size: 12px;
line-height: 18px;
text-align: right;
}
.main-table-header td {
padding: 10px;
}
.main-table-header {
border-bottom: 1px solid red;
}
tr.main-table-header th {
font-style: normal;
font-weight: 600;
font-size: 12px;
line-height: 18px;
}
tr.item-details td {
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
}
.table2 {
/* -- Items Table -- */
.items-table {
margin-top: 35px;
padding: 0px 30px 10px 30px;
page-break-before: avoid;
page-break-after: auto;
}
.table2 hr {
height:0.1px;
.items-table hr {
height: 0.1px;
}
.ItemTableHeader {
.item-table-heading {
font-size: 13.5;
text-align: center;
color: rgba(0, 0, 0, 0.85);
padding: 5px;
color: #55547A;
}
.items {
tr.item-table-heading-row th {
border-bottom: 0.620315px solid #E8E8E8;
font-size: 12px;
line-height: 18px;
}
tr.item-row td {
font-size: 12px;
line-height: 18px;
}
.item-cell {
font-size: 13;
color: rgba(0, 0, 0, 0.6);
text-align: center;
padding: 5px;
padding-top: 10px;
color: #040405;
}
.note-header {
font-size: 13;
color: rgba(0, 0, 0, 0.6);
.item-description {
color: #595959;
font-size: 9px;
line-height: 12px;
}
.note-text {
font-size: 10;
color: rgba(0, 0, 0, 0.6);
.item-cell-table-hr {
margin: 0 30px 0 30px;
}
.padd8 {
padding-top: 8px;
padding-bottom: 8px;
/* -- Total Display Table -- */
.total-display-container {
padding: 0 25px;
}
.padd2 {
.total-display-table {
box-sizing: border-box;
page-break-inside: avoid;
page-break-before: auto;
page-break-after: auto;
margin-left: 500px;
margin-top: 20px;
}
.total-table-attribute-label {
font-size: 12px;
color: #55547A;
text-align: left;
padding-left: 10px;
}
.total-table-attribute-value {
font-weight: bold;
text-align: right;
font-size: 12px;
color: #040405;
padding-right: 10px;
padding-top: 2px;
padding-bottom: 2px;
}
.table3 {
border: 1px solid #EAF1FB;
border-top: none;
box-sizing: border-box;
width: 630px;
page-break-inside: avoid;
page-break-before: auto;
page-break-after: auto;
.total-border-left {
border: 1px solid #E8E8E8 !important;
border-right: 0px !important;
padding-top: 0px;
padding: 8px !important;
}
.text-per-item-table3 {
border: 1px solid #EAF1FB;
border-top: none;
padding-right: 30px;
box-sizing: border-box;
width: 260px;
/* height: 100px; */
position: absolute;
right: -25;
}
td.invoice-total1 {
text-align:left;
padding: 15px 0 15px 10px;
font-size:12px;
line-height: 18px;
color: #55547A;
border-bottom:1px solid #E8E8E8;
border-top:1px solid #E8E8E8;
border-left:1px solid #E8E8E8;
}
td.invoice-total2 {
font-weight: 500;
text-align: right;
font-size:12px;
line-height: 18px;
padding: 15px 10px 15px 0;
color: #5851DB;
border-bottom:1px solid #E8E8E8;
border-top:1px solid #E8E8E8;
border-right:1px solid #E8E8E8;
}
.inv-item {
border-color: #d9d9d9;
}
.no-border {
border: none;
}
.desc {
font-weight: 100;
text-align: justify;
font-size: 10px;
margin-bottom: 15px;
margin-top:7px;
color:rgba(0, 0, 0, 0.85);
}
.company-details h1 {
margin:0;
font-style: normal;
font-weight: bold;
font-size: 15px;
line-height: 22px;
letter-spacing: 0.05em;
text-align: left;
max-width: 220px;
}
.company-details h4 {
margin:0;
font-style: normal;
font-weight: 100;
font-size: 18px;
line-height: 25px;
text-align: right;
}
.company-details h3 {
margin-bottom:1px;
margin-top:0;
}
tr.total td {
border-bottom:1px solid #E8E8E8;
border-top:1px solid #E8E8E8;
.total-border-right {
border: 1px solid #E8E8E8 !important;
border-left: 0px !important;
padding-top: 0px;
padding: 8px !important;
}
/* -- Notes -- */
.notes {
font-style: normal;
font-weight: 300;
font-size: 12px;
color: #595959;
margin-top: 15px;
@ -401,8 +310,6 @@
}
.notes-label {
font-style: normal;
font-weight: normal;
font-size: 15px;
line-height: 22px;
letter-spacing: 0.05em;
@ -412,67 +319,122 @@
padding-bottom: 10px;
}
/* -- Helpers -- */
.text-primary {
color: #5851DB;
}
.text-center {
text-align: center
}
table .text-left {
text-align: left;
}
table .text-right {
text-align: right;
}
.border-0 {
border: none;
}
.py-2 {
padding-top: 2px;
padding-bottom: 2px;
}
.py-8 {
padding-top: 8px;
padding-bottom: 8px;
}
.py-3 {
padding: 3px 0;
}
.pr-20 {
padding-right: 20px;
}
.pr-10 {
padding-right: 10px;
}
.pl-20 {
padding-left: 20px;
}
.pl-10 {
padding-left: 10px;
}
.pl-0 {
padding-left: 0;
}
</style>
</head>
<body>
<div class="header-table">
<div class="header-container">
<table width="100%">
<tr>
@if($logo)
<td class="header-left">
<td class="header-section-left">
@if($logo)
<img class="header-logo" src="{{ $logo }}" alt="Company Logo">
@else
@if($invoice->user->company)
<td class="header-left" style="padding-top:0px;">
<h1 class="header-logo"> {{$invoice->user->company->name}} </h1>
@endif
<h1 class="header-logo"> {{$invoice->user->company->name}} </h1>
@endif
</td>
<td class="header-right company-details">
<td class="header-section-right company-address-container">
@include('app.pdf.invoice.partials.company-address')
</td>
</tr>
</table>
</div>
<hr class="header-line">
<hr class="header-bottom-divider">
<div class="wrapper">
<div class="address">
<div class="bill-add">
<div style="float:left;">
<div class="content-wrapper">
<div class="main-content">
<div class="customer-address-container">
<div class="billing-address-container">
@include('app.pdf.invoice.partials.billing-address')
</div>
@if($invoice->user->billingaddress)
<div style="float:right;">
<div class="shipping-address-container">
@else
<div style="float:left;">
<div class="shipping-address-container--left">
@endif
@include('app.pdf.invoice.partials.shipping-address')
@include('app.pdf.invoice.partials.shipping-address')
</div>
<div style="clear: both;"></div>
</div>
<div class="invoice-details-container">
<table>
<tr>
<td class="attribute-label">Invoice Number</td>
<td class="attribute-value"> &nbsp;{{$invoice->invoice_number}}</td>
</tr>
<tr>
<td class="attribute-label">Invoice Date </td>
<td class="attribute-value"> &nbsp;{{$invoice->formattedInvoiceDate}}</td>
</tr>
<tr>
<td class="attribute-label">Due date</td>
<td class="attribute-value"> &nbsp;{{$invoice->formattedDueDate}}</td>
</tr>
</table>
</div>
<div style="clear: both;"></div>
</div>
<div class="job-add">
<table>
<tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Invoice Number</td>
<td class="textStyle2"> &nbsp;{{$invoice->invoice_number}}</td>
</tr>
<tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Invoice Date </td>
<td class="textStyle2"> &nbsp;{{$invoice->formattedInvoiceDate}}</td>
</tr>
<tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Due date</td>
<td class="textStyle2"> &nbsp;{{$invoice->formattedDueDate}}</td>
</tr>
</table>
</div>
<div style="clear: both;"></div>
@include('app.pdf.invoice.partials.table')
@include('app.pdf.invoice.partials.notes')
</div>
@include('app.pdf.invoice.partials.table')
@include('app.pdf.invoice.partials.notes')
</div>
</body>
</html>

View File

@ -1,11 +1,11 @@
@if($invoice->user->billingaddress)
<p class="bill-to">Bill To,</p>
<p class="billing-address-label">Bill To,</p>
@if($invoice->user->billingaddress->name)
<p class="bill-user-name">
<p class="billing-address-name">
{{$invoice->user->billingaddress->name}}
</p>
@endif
<p class="bill-user-address">
<p class="billing-address">
@if($invoice->user->billingaddress->address_street_1)
{!! nl2br(htmlspecialchars($invoice->user->billingaddress->address_street_1)) !!}<br>
@endif
@ -25,7 +25,7 @@
{{$invoice->user->billingaddress->country->name}}<br>
@endif
@if($invoice->user->billingaddress->phone)
<p class="bill-user-phone">
<p class="billing-address">
Phone :{{$invoice->user->billingaddress->phone}}
</p>
@endif

View File

@ -3,7 +3,7 @@
@endif
@if($company_address)
<p class="company-add">
<p class="company-address">
@if($company_address->addresses[0]['address_street_1'])
{!! nl2br(htmlspecialchars($company_address->addresses[0]['address_street_1'])) !!} <br>
@endif

View File

@ -1,11 +1,11 @@
@if($invoice->user->shippingaddress)
<p class="ship-to">Ship To,</p>
<p class="shipping-address-label">Ship To,</p>
@if($invoice->user->shippingaddress->name)
<p class="ship-user-name">
<p class="shipping-address-name">
{{$invoice->user->shippingaddress->name}}
</p>
@endif
<p class="ship-user-address">
<p class="shipping-address">
@if($invoice->user->shippingaddress->address_street_1)
{!! nl2br(htmlspecialchars($invoice->user->shippingaddress->address_street_1)) !!}<br>
@endif
@ -30,8 +30,8 @@
{{$invoice->user->shippingaddress->country->name}}<br>
@endif
@if($invoice->user->phone)
<p class="ship-user-phone">
@if($invoice->user->shippingaddress->phone)
<p class="shipping-address">
Phone :{{$invoice->user->shippingaddress->phone}}
</p>
@endif

View File

@ -1,46 +1,49 @@
<table width="100%" class="table2" cellspacing="0" border="0">
<tr class="main-table-header">
<th width="2%" class="ItemTableHeader" style="text-align: right; color: #55547A; padding-right: 20px">#</th>
<th width="40%" class="ItemTableHeader" style="text-align: left; color: #55547A; padding-left: 0px">Items</th>
<th class="ItemTableHeader" style="text-align: right; color: #55547A; padding-right: 20px">Quantity</th>
<th class="ItemTableHeader" style="text-align: right; color: #55547A; padding-right: 20px">Price</th>
<table width="100%" class="items-table" cellspacing="0" border="0">
<tr class="item-table-heading-row">
<th width="2%" class="item-table-heading text-right pr-20">#</th>
<th width="40%" class="item-table-heading text-left pl-0">Items</th>
<th class="item-table-heading text-right pr-20">Quantity</th>
<th class="item-table-heading pr-20 text-right">Price</th>
@if($invoice->discount_per_item === 'YES')
<th class="ItemTableHeader" style="text-align: right; color: #55547A; padding-left: 10px">Discount</th>
<th class="item-table-heading text-right pl-10">Discount</th>
@endif
<th class="ItemTableHeader" style="text-align: right; color: #55547A;">Amount</th>
<th class="item-table-heading text-right">Amount</th>
</tr>
@php
$index = 1
@endphp
@foreach ($invoice->items as $item)
<tr class="item-details">
<tr class="item-row">
<td
class="inv-item items"
style="text-align: right; color: #040405; padding-right: 20px; vertical-align: top;"
class="item-cell text-right pr-20"
style="vertical-align: top;"
>
{{$index}}
</td>
<td
class="inv-item items"
style="text-align: left; color: #040405;padding-left: 0px"
class="item-cell text-left pl-0"
style="vertical-align: top;"
>
<span>{{ $item->name }}</span><br>
<span style="text-align: left; color: #595959; font-size: 9px; font-weight:300; line-height: 12px;">{!! nl2br(htmlspecialchars($item->description)) !!}</span>
<span class="item-description">{!! nl2br(htmlspecialchars($item->description)) !!}</span>
</td>
<td
class="inv-item items"
style="text-align: right; color: #040405; padding-right: 20px"
class="item-cell pr-20 text-right"
style="vertical-align: top;"
>
{{$item->quantity}}
</td>
<td
class="inv-item items"
style="text-align: right; color: #040405; padding-right: 20px"
class="item-cell text-right pr-20"
style="vertical-align: top;"
>
{!! format_money_pdf($item->price, $invoice->user->currency) !!}
</td>
@if($invoice->discount_per_item === 'YES')
<td class="inv-item items" style="text-align: right; color: #040405; padding-left: 10px">
<td
class="item-cell text-right pl-10"
style="vertical-align: top;"
>
@if($item->discount_type === 'fixed')
{!! format_money_pdf($item->discount_val, $invoice->user->currency) !!}
@endif
@ -50,8 +53,8 @@
</td>
@endif
<td
class="inv-item items"
style="text-align: right; color: #040405;"
class="item-cell text-right"
style="vertical-align: top;"
>
{!! format_money_pdf($item->total, $invoice->user->currency) !!}
</td>
@ -62,74 +65,74 @@
@endforeach
</table>
<hr class="items-table-hr">
<hr class="item-cell-table-hr">
<table width="100%" cellspacing="0px" style="margin-left:420px; margin-top: 10px" border="0" class="table3 @if(count($invoice->items) > 12) page-break @endif">
<tr>
<td class="no-border" style="color: #55547A; padding-left:10px; font-size:12px;">Subtotal</td>
<td class="no-border items padd2"
style="padding-right:10px; text-align: right; font-size:12px; color: #040405; font-weight: 500;">{!! format_money_pdf($invoice->sub_total, $invoice->user->currency) !!}</td>
</tr>
@if ($invoice->tax_per_item === 'YES')
@for ($i = 0; $i < count($labels); $i++)
<tr>
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; color: #55547A;">
{{$labels[$i]}}
</td>
<td class="no-border items padd2" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; color: #040405">
{!! format_money_pdf($taxes[$i], $invoice->user->currency) !!}
</td>
</tr>
@endfor
@else
@foreach ($invoice->taxes as $tax)
<tr>
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; color: #55547A;">
{{$tax->name.' ('.$tax->percent.'%)'}}
</td>
<td class="no-border items padd2" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; color: #040405">
{!! format_money_pdf($tax->amount, $invoice->user->currency) !!}
</td>
</tr>
@endforeach
@endif
@if ($invoice->discount_per_item === 'NO')
<div class="total-display-container">
<table width="100%" cellspacing="0px" border="0" class="total-display-table @if(count($invoice->items) > 12) page-break @endif">
<tr>
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; color: #55547A;">
@if($invoice->discount_type === 'fixed')
Discount
@endif
@if($invoice->discount_type === 'percentage')
Discount ({{$invoice->discount}}%)
@endif
</td>
<td class="no-border items padd2" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; color: #040405">
@if($invoice->discount_type === 'fixed')
{!! format_money_pdf($invoice->discount_val, $invoice->user->currency) !!}
@endif
@if($invoice->discount_type === 'percentage')
{!! format_money_pdf($invoice->discount_val, $invoice->user->currency) !!}
@endif
<td class="border-0 total-table-attribute-label">Subtotal</td>
<td class="border-0 item-cell py-2 total-table-attribute-value">
{!! format_money_pdf($invoice->sub_total, $invoice->user->currency) !!}
</td>
</tr>
@endif
<tr>
<td style="padding:3px 0px"></td>
<td style="padding:3px 0px"></td>
</tr>
<tr>
<td class="no-border total-border-left"
style="padding-left:10px; padding-bottom:10px; text-align:left; padding-top:20px; font-size:12px; color: #55547A;"
>
<label class="total-bottom"> Total </label>
</td>
<td
class="no-border total-border-right items padd8"
style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; padding-top:20px; color: #5851DB"
>
{!! format_money_pdf($invoice->total, $invoice->user->currency)!!}
</td>
</tr>
</table>
@if ($invoice->tax_per_item === 'YES')
@for ($i = 0; $i < count($labels); $i++)
<tr>
<td class="border-0 total-table-attribute-label">
{{$labels[$i]}}
</td>
<td class="border-0 item-cell py-2 total-table-attribute-value">
{!! format_money_pdf($taxes[$i], $invoice->user->currency) !!}
</td>
</tr>
@endfor
@else
@foreach ($invoice->taxes as $tax)
<tr>
<td class="border-0 total-table-attribute-label">
{{$tax->name.' ('.$tax->percent.'%)'}}
</td>
<td class="border-0 item-cell py-2 total-table-attribute-value">
{!! format_money_pdf($tax->amount, $invoice->user->currency) !!}
</td>
</tr>
@endforeach
@endif
@if ($invoice->discount_per_item === 'NO')
<tr>
<td class="border-0 total-table-attribute-label">
@if($invoice->discount_type === 'fixed')
Discount
@endif
@if($invoice->discount_type === 'percentage')
Discount ({{$invoice->discount}}%)
@endif
</td>
<td class="border-0 item-cell py-2 total-table-attribute-value" >
@if($invoice->discount_type === 'fixed')
{!! format_money_pdf($invoice->discount_val, $invoice->user->currency) !!}
@endif
@if($invoice->discount_type === 'percentage')
{!! format_money_pdf($invoice->discount_val, $invoice->user->currency) !!}
@endif
</td>
</tr>
@endif
<tr>
<td class="py-3"></td>
<td class="py-3"></td>
</tr>
<tr>
<td class="border-0 total-border-left total-table-attribute-label">
Total
</td>
<td
class="border-0 total-border-right item-cell py-8 total-table-attribute-value text-primary"
>
{!! format_money_pdf($invoice->total, $invoice->user->currency)!!}
</td>
</tr>
</table>
</div>

View File

@ -1,11 +1,11 @@
@if($payment->user->billingaddress)
<p class="bill-to">Received From:</p>
<p class="billing-address-label">Received From:</p>
@if($payment->user->billingaddress->name)
<p class="bill-user-name">
<p class="billing-address-name">
{{$payment->user->billingaddress->name}}
</p>
@endif
<p class="bill-user-address">
<p class="billing-address">
@if($payment->user->billingaddress->address_street_1)
{!! nl2br(htmlspecialchars($payment->user->billingaddress->address_street_1)) !!}<br>
@endif
@ -25,7 +25,7 @@
{{$payment->user->billingaddress->country->name}}<br>
@endif
@if($payment->user->billingaddress->phone)
<p class="bill-user-phone">
<p class="billing-address">
Phone :{{$payment->user->billingaddress->phone}}
</p>
@endif

View File

@ -3,7 +3,7 @@
@endif
@if($company_address)
<p class="company-add">
<p class="company-address">
@if($company_address->addresses[0]['address_street_1'])
{!! nl2br(htmlspecialchars($company_address->addresses[0]['address_street_1'])) !!} <br>
@endif

View File

@ -1,11 +1,11 @@
@if($payment->user->shippingaddress)
<p class="ship-to">Ship To,</p>
<p class="shipping-address-label">Ship To,</p>
@if($payment->user->shippingaddress->name)
<p class="ship-user-name">
<p class="shipping-address-name">
{{$payment->user->shippingaddress->name}}
</p>
@endif
<p class="ship-user-address">
<p class="shipping-address">
@if($payment->user->shippingaddress->address_street_1)
{!! nl2br(htmlspecialchars($payment->user->shippingaddress->address_street_1)) !!}<br>
@endif
@ -31,7 +31,7 @@
@endif
@if($payment->user->phone)
<p class="ship-user-phone">
<p class="shipping-address">
Phone :{{$payment->user->shippingaddress->phone}}
</p>
@endif

View File

@ -2,10 +2,10 @@
<html>
<head>
<title>Invoice</title>
{{-- <link href="https://fonts.googleapis.com/css?family=Poppins&display=swap" rel="stylesheet"> --}}
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style type="text/css">
/* -- Base -- */
body {
font-family: "DejaVu Sans";
}
@ -13,6 +13,7 @@
html {
margin: 0px;
padding: 0px;
margin-top: 50px;
}
table {
border-collapse: collapse;
@ -27,339 +28,48 @@
width: 100%;
}
.header-left {
padding-top: 45px;
padding-bottom: 45px;
padding-left: 30px;
display:inline-block;
width:30%;
}
.header-table {
/* -- Heeader -- */
.header-container {
position: absolute;
width: 100%;
height: 150px;
left: 0px;
top: -60px;
}
.header-section-left {
padding-top: 45px;
padding-bottom: 45px;
padding-left: 30px;
display:inline-block;
width:30%;
}
.header-logo {
position: absolute;
height: 50px;
text-transform: capitalize;
color: #817AE3;
}
.header-right {
.header-section-right {
display:inline-block;
position: absolute;
right:0;
padding: 15px 30px 15px 0px;
float: right;
}
.inv-flex{
display:flex;
}
.inv-data{
text-align:right;
margin-right:120px;
}
.inv-value{
text-align:left;
margin-left:160px;
}
.header {
font-size: 20px;
color: rgba(0, 0, 0, 0.7);
}
.TextColor1 {
font-size: 16px;
color: rgba(0, 0, 0, 0.5);
}
/* -- Company Address -- */
@page {
margin-top: 60px !important;
}
.wrapper {
display: block;
height: 200px;
}
.address {
display: inline-block;
padding-top: 20px
}
.bill-add {
display: block;
float:left;
width:40%;
padding: 0 0 0 30px;
}
.company {
padding-left: 30px;
display: inline;
float:left;
width:30%;
}
.company h1 {
font-style: normal;
font-weight: bold;
font-size: 18px;
line-height: 22px;
letter-spacing: 0.05em;
}
.company-add {
text-align: left;
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
margin: 0px;
}
/* -------------------------- */
/* shipping style */
.ship-to {
padding-top: 5px;
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
margin-bottom: 0px;
}
.ship-user-name {
padding: 0px;
font-style: normal;
font-weight: normal;
font-size: 15px;
line-height: 22px;
margin: 0px;
}
.ship-user-address {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
margin: 0px;
width: 160px;
}
.ship-user-phone {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
margin: 0px;
}
/* -------------------------- */
/* billing style */
.bill-to {
padding-top: 5px;
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
margin-bottom: 0px;
color: #55547A;
}
.bill-user-name {
padding: 0px;
font-style: normal;
font-weight: normal;
font-size: 15px;
line-height: 22px;
margin: 0px;
}
.bill-user-address {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
margin:0px;
width: 160px;
}
.bill-user-phone {
font-style: normal;
font-weight: normal;
font-size: 10px;
line-height: 15px;
color: #595959;
margin: 0px;
}
.job-add {
display: inline;
position: absolute;
float: right;
width: 40%;
height: 120px;
padding: 20px 30px 0 0;
}
.amount-due {
background-color: #f2f2f2;
}
.textRight {
text-align: right;
}
.textLeft {
text-align: left;
}
.textStyle1 {
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
}
.textStyle2 {
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
text-align: right;
}
.main-table-header td {
padding: 10px;
}
.main-table-header {
border-bottom: 1px solid red;
}
tr.main-table-header th {
font-style: normal;
font-weight: 600;
font-size: 12px;
line-height: 18px;
}
tr.item-details td {
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
}
.table2 {
margin-top: 188px;
border-bottom: 1px solid #EAF1FB;
padding: 0px 30px 0 30px;
page-break-before: avoid;
page-break-after: auto;
}
.table2 hr {
height:0.1px;
}
.ItemTableHeader {
font-size: 13.5;
text-align: center;
color: rgba(0, 0, 0, 0.85);
padding: 5px;
}
.items {
font-size: 13;
color: rgba(0, 0, 0, 0.6);
text-align: center;
padding: 5px;
}
.note-header {
font-size: 13;
color: rgba(0, 0, 0, 0.6);
}
.note-text {
font-size: 10;
color: rgba(0, 0, 0, 0.6);
}
.padd8 {
padding-top: 8px;
padding-bottom: 8px;
}
.padd2 {
padding-top: 2px;
padding-bottom: 2px;
}
.table3 {
border: 1px solid #EAF1FB;
border-top: none;
box-sizing: border-box;
width: 630px;
page-break-inside: avoid;
page-break-before: auto;
page-break-after: auto;
}
.text-per-item-table3 {
border: 1px solid #EAF1FB;
border-top: none;
padding-right: 30px;
box-sizing: border-box;
width: 260px;
/* height: 100px; */
position: absolute;
right: -25;
}
td.invoice-total1 {
text-align:left;
padding: 15px 0 15px 10px;
font-size:12px;
line-height: 18px;
color: #55547A;
border-bottom:1px solid #E8E8E8;
border-top:1px solid #E8E8E8;
border-left:1px solid #E8E8E8;
}
td.invoice-total2 {
font-weight: 500;
text-align: right;
font-size:12px;
line-height: 18px;
padding: 15px 10px 15px 0;
color: #5851DB;
border-bottom:1px solid #E8E8E8;
border-top:1px solid #E8E8E8;
border-right:1px solid #E8E8E8;
}
.inv-item {
border-color: #d9d9d9;
}
.no-border {
border: none;
}
.desc {
font-weight: 100;
text-align: justify;
font-size: 10px;
margin-bottom: 15px;
margin-top:7px;
color:rgba(0, 0, 0, 0.85);
}
.company-details h1 {
margin:0;
font-style: normal;
font-weight: bold;
font-size: 15px;
line-height: 22px;
@ -367,26 +77,117 @@
text-align: left;
max-width: 220px;
}
.company-details h4 {
margin:0;
font-style: normal;
font-weight: 100;
font-size: 18px;
line-height: 25px;
text-align: right;
}
.company-details h3 {
margin-bottom:1px;
margin-top:0;
}
tr.total td {
border-bottom:1px solid #E8E8E8;
border-top:1px solid #E8E8E8;
.company-address{
text-align: left;
font-size: 10px;
line-height: 15px;
color: #595959;
margin: 0px;
}
.content-wrapper {
display: block;
height: 200px;
}
.main-content {
display: inline-block;
padding-top: 20px
}
/* -- Customer Address -- */
.customer-address-container {
display: block;
float:left;
width:40%;
padding: 0 0 0 30px;
}
/* -- Shipping -- */
.shipping-address-label {
padding-top: 5px;
font-size: 12px;
line-height: 18px;
margin-bottom: 0px;
}
.shipping-address-name {
padding: 0px;
font-size: 15px;
line-height: 22px;
margin: 0px;
}
.shipping-address {
font-size: 10px;
line-height: 15px;
color: #595959;
margin: 0px;
width: 160px;
}
/* -- Billing -- */
.billing-address-container {
float: left;
}
.billing-address-container--right {
float: right;
}
.billing-address-label {
padding-top: 5px;
font-size: 12px;
line-height: 18px;
margin-bottom: 0px;
color: #55547A;
}
.billing-address-name {
padding: 0px;
font-size: 15px;
line-height: 22px;
margin: 0px;
}
.billing-address {
font-size: 10px;
line-height: 15px;
color: #595959;
margin:0px;
width: 160px;
}
/* -- Payment Details -- */
.payment-details-container {
display: inline;
position: absolute;
float: right;
width: 40%;
height: 120px;
padding: 20px 30px 0 0;
}
.attribute-label {
font-size: 12px;
line-height: 18px;
text-align: left;
color: #55547A
}
.attribute-value {
font-size: 12px;
line-height: 18px;
text-align: right;
}
/* -- Notes -- */
.notes {
font-style: normal;
font-weight: 300;
font-size: 12px;
color: #595959;
margin-top: 15px;
@ -397,8 +198,6 @@
}
.notes-label {
font-style: normal;
font-weight: normal;
font-size: 15px;
line-height: 22px;
letter-spacing: 0.05em;
@ -408,7 +207,7 @@
padding-bottom: 10px;
}
.content-header {
.content-heading {
margin-top: 120px;
width: 100%;
text-align: center;
@ -419,14 +218,17 @@
margin: 0 0 0 0;
}
.content-header span {
font-weight: 500;
.content-heading span {
font-weight: 400;
font-size: 14px;
line-height: 25px;
padding-bottom: 5px;
border-bottom: 1px solid #B9C1D1;
}
.total-amount {
/* -- Total Display Box -- */
.total-display-box {
width: 315px;
display: block;
margin-right: 30px;
@ -437,7 +239,7 @@
padding: 12px 15px 15px 15px;
}
.total-amount-label {
.total-display-label {
display: inline;
font-weight: 600;
font-size: 14px;
@ -445,7 +247,7 @@
color: #595959;
}
.total-amount span {
.total-display-box span {
float: right;
font-weight: 500;
font-size: 14px;
@ -453,62 +255,64 @@
text-align: right;
color: #5851D8;
}
</style>
</head>
<body>
<div class="header-table">
<div class="header-container">
<table width="100%">
<tr>
@if($logo)
<td class="header-left">
<td class="header-section-left">
<img class="header-logo" src="{{ $logo }}" alt="Company Logo">
@else
@if($payment->user->company)
<td class="header-left" style="padding-top:0px;">
<td class="header-section-left" style="padding-top:0px;">
<h1 class="header-logo"> {{$payment->user->company->name}} </h1>
@endif
@endif
</td>
<td class="header-right company-details">
<td class="header-section-right company-details">
@include('app.pdf.payment.partials.company-address')
</td>
</tr>
</table>
</div>
<hr style="border: 0.620315px solid #E8E8E8;">
<p class="content-header">
<p class="content-heading">
<span>PAYMENT RECEIPT</span>
</p>
<div class="wrapper">
<div class="address">
<div class="bill-add">
<div style="float:left;">
<div class="content-wrapper">
<div class="main-content">
<div class="customer-address-container">
<div class="billing-address-container">
@include('app.pdf.payment.partials.billing-address')
</div>
<div style="float:right;">
<div class="billing-address-container--right">
</div>
<div style="clear: both;"></div>
</div>
<div class="job-add">
<div class="payment-details-container">
<table width="100%">
<tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Payment Date</td>
<td class="textStyle2"> &nbsp;{{$payment->formattedPaymentDate}}</td>
<td class="attribute-label">Payment Date</td>
<td class="attribute-value"> &nbsp;{{$payment->formattedPaymentDate}}</td>
</tr>
<tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Payment Number</td>
<td class="textStyle2"> &nbsp;{{$payment->payment_number}}</td>
<td class="attribute-label">Payment Number</td>
<td class="attribute-value"> &nbsp;{{$payment->payment_number}}</td>
</tr>
<tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Payment Mode</td>
<td class="textStyle2"> &nbsp;{{$payment->paymentMethod ? $payment->paymentMethod->name : '-'}}</td>
<td class="attribute-label">Payment Mode</td>
<td class="attribute-value"> &nbsp;{{$payment->paymentMethod ? $payment->paymentMethod->name : '-'}}</td>
</tr>
@if ($payment->invoice && $payment->invoice->invoice_number)
<tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Invoice</td>
<td class="textStyle2"> &nbsp;{{$payment->invoice->invoice_number}}</td>
<td class="attribute-label">Invoice</td>
<td class="attribute-value"> &nbsp;{{$payment->invoice->invoice_number}}</td>
</tr>
@endif
</table>
@ -516,8 +320,8 @@
</div>
<div style="clear: both;"></div>
</div>
<div class="total-amount">
<p class="total-amount-label">Amount Received</p>
<div class="total-display-box">
<p class="total-display-label">Amount Received</p>
<span>{!! format_money_pdf($payment->amount, $payment->user->currency) !!}</span>
</div>
</body>

View File

@ -2,35 +2,24 @@
<html lang="en">
<head>
<title>Expenses Report</title>
{{-- <link href="https://fonts.googleapis.com/css?family=Poppins&display=swap" rel="stylesheet"> --}}
<style type="text/css">
body {
font-family: "DejaVu Sans";
}
/* html {
margin: 0px;
padding: 0px;
} */
table {
border-collapse: collapse;
}
.main-container {
/* padding: 30px 60px; */
}
.sub-container{
padding: 0px 20px;
}
.header {
.report-header {
width: 100%;
}
.heading-text {
font-style: normal;
font-weight: 600;
font-size: 24px;
color: #5851D8;
@ -41,7 +30,6 @@
}
.heading-date-range {
font-style: normal;
font-weight: 600;
font-size: 15px;
color: #A5ACC1;
@ -52,10 +40,8 @@
}
.sub-heading-text {
font-style: normal;
font-weight: 600;
font-size: 16px;
/* line-height: 21px; */
color: #595959;
padding: 0px;
margin: 0px;
@ -65,8 +51,6 @@
.expenses-title {
margin-top: 60px;
padding-left: 3px;
font-style: normal;
font-weight: normal;
font-size: 16px;
line-height: 21px;
color: #040405;
@ -84,18 +68,14 @@
.expense-title {
padding: 0px;
margin: 0px;
font-style: normal;
font-weight: normal;
font-size: 14px;
line-height: 21px;
color: #595959;
}
.expense-money {
.expense-amount {
padding: 0px;
margin: 0px;
font-style: normal;
font-weight: normal;
font-size: 14px;
line-height: 21px;
text-align: right;
@ -118,7 +98,6 @@
padding: 0px;
margin: 0px;
text-align: right;
font-style: normal;
font-weight: 500;
font-size: 16px;
line-height: 21px;
@ -126,7 +105,7 @@
color: #040405;
}
.total-expense-table {
.report-footer {
width: 100%;
margin-top: 40px;
padding: 15px 20px;
@ -134,22 +113,20 @@
box-sizing: border-box;
}
.total-expense-title {
.report-footer-label {
padding: 0px;
margin: 0px;
text-align: left;
font-style: normal;
font-weight: 600;
font-size: 16px;
line-height: 21px;
color: #595959;
}
.total-expense-money {
.report-footer-value {
padding: 0px;
margin: 0px;
text-align: right;
font-style: normal;
font-weight: 500;
font-size: 20px;
line-height: 21px;
@ -158,61 +135,59 @@
</style>
</head>
<body>
<div class="main-container">
<div class="sub-container">
<table class="header">
<tr>
<td>
<p class="heading-text">{{ $company->name }}</p>
</td>
<td>
<p class="heading-date-range">{{ $from_date }} - {{ $to_date }}</p>
</td>
</tr>
<tr>
<td colspan="2">
<p class="sub-heading-text">EXPENSES REPORT</p>
</td>
</tr>
<div class="sub-container">
<table class="report-header">
<tr>
<td>
<p class="heading-text">{{ $company->name }}</p>
</td>
<td>
<p class="heading-date-range">{{ $from_date }} - {{ $to_date }}</p>
</td>
</tr>
<tr>
<td colspan="2">
<p class="sub-heading-text">EXPENSES REPORT</p>
</td>
</tr>
</table>
<p class="expenses-title">Expenses</p>
<div class="expenses-table-container">
<table class="expenses-table">
@foreach ($expenseCategories as $expenseCategory)
<tr>
<td>
<p class="expense-title">
{{ $expenseCategory->category->name }}
</p>
</td>
<td>
<p class="expense-amount">
{!! format_money_pdf($expenseCategory->total_amount) !!}
</p>
</td>
</tr>
@endforeach
</table>
<p class="expenses-title">Expenses</p>
<div class="expenses-table-container">
<table class="expenses-table">
@foreach ($expenseCategories as $expenseCategory)
<tr>
<td>
<p class="expense-title">
{{ $expenseCategory->category->name }}
</p>
</td>
<td>
<p class="expense-money">
{!! format_money_pdf($expenseCategory->total_amount) !!}
</p>
</td>
</tr>
@endforeach
</table>
</div>
</div>
<table class="expense-total-table">
<tr>
<td class="expense-total-cell">
<p class="expense-total">{!! format_money_pdf($totalExpense) !!}</p>
</td>
</tr>
</table>
<table class="total-expense-table">
<tr>
<td>
<p class="total-expense-title">TOTAL EXPENSE</p>
</td>
<td>
<p class="total-expense-money">{!! format_money_pdf($totalExpense) !!}</p>
</td>
</tr>
</table>
</div>
<table class="expense-total-table">
<tr>
<td class="expense-total-cell">
<p class="expense-total">{!! format_money_pdf($totalExpense) !!}</p>
</td>
</tr>
</table>
<table class="report-footer">
<tr>
<td>
<p class="report-footer-label">TOTAL EXPENSE</p>
</td>
<td>
<p class="report-footer-value">{!! format_money_pdf($totalExpense) !!}</p>
</td>
</tr>
</table>
</body>
</html>

View File

@ -2,35 +2,24 @@
<html lang="en">
<head>
<title>Profit & Loss Report</title>
{{-- <link href="https://fonts.googleapis.com/css?family=Poppins&display=swap" rel="stylesheet"> --}}
<style type="text/css">
body {
font-family: "DejaVu Sans";
}
html {
margin: 0px;
padding: 0px;
}
table {
border-collapse: collapse;
}
.main-container {
padding: 30px 60px;
}
.sub-container{
padding: 0px 20px;
}
.header {
.report-header {
width: 100%;
}
.heading-text {
font-style: normal;
font-weight: 600;
font-size: 24px;
color: #5851D8;
@ -41,7 +30,6 @@
}
.heading-date-range {
font-style: normal;
font-weight: 600;
font-size: 15px;
color: #A5ACC1;
@ -52,10 +40,8 @@
}
.sub-heading-text {
font-style: normal;
font-weight: 600;
font-size: 16px;
/* line-height: 21px; */
color: #595959;
padding: 0px;
margin: 0px;
@ -70,18 +56,15 @@
.income-title {
padding: 0px;
margin: 0px;
font-style: normal;
font-weight: normal;
font-size: 16px;
line-height: 21px;
color: #040405;
text-align: left;
}
.income-money {
.income-amount {
padding: 0px;
margin: 0px;
font-style: normal;
font-weight: 500;
font-size: 16px;
line-height: 21px;
@ -93,8 +76,6 @@
.expenses-title {
margin-top: 20px;
padding-left: 3px;
font-style: normal;
font-weight: normal;
font-size: 16px;
line-height: 21px;
color: #040405;
@ -112,25 +93,21 @@
.expense-title {
padding: 0px;
margin: 0px;
font-style: normal;
font-weight: normal;
font-size: 14px;
line-height: 21px;
color: #595959;
}
.expense-money {
.expense-amount {
padding: 0px;
margin: 0px;
font-style: normal;
font-weight: normal;
font-size: 14px;
line-height: 21px;
text-align: right;
color: #595959;
}
.expense-total-table {
.expense-total-indicator-table {
border-top: 1px solid #EAF1FB;
width: 100%;
}
@ -146,7 +123,6 @@
padding: 0px;
margin: 0px;
text-align: right;
font-style: normal;
font-weight: 500;
font-size: 16px;
line-height: 21px;
@ -154,7 +130,7 @@
color: #040405;
}
.profit-table {
.report-footer {
width: 100%;
margin-top: 40px;
padding: 15px 20px;
@ -162,22 +138,20 @@
box-sizing: border-box;
}
.profit-title {
.report-footer-label {
padding: 0px;
margin: 0px;
text-align: left;
font-style: normal;
font-weight: 600;
font-size: 16px;
line-height: 21px;
color: #595959;
}
.profit-money {
.report-footer-value {
padding: 0px;
margin: 0px;
text-align: right;
font-style: normal;
font-weight: 500;
font-size: 20px;
line-height: 21px;
@ -186,73 +160,71 @@
</style>
</head>
<body>
<div class="main-container">
<div class="sub-container">
<table class="header">
<tr>
<td>
<p class="heading-text">{{ $company->name }}</p>
</td>
<td>
<p class="heading-date-range">{{ $from_date }} - {{ $to_date }}</p>
</td>
</tr>
<tr>
<td colspan="2">
<p class="sub-heading-text">PROFIT & LOSS REPORT</p>
</td>
</tr>
</table>
<div class="sub-container">
<table class="report-header">
<tr>
<td>
<p class="heading-text">{{ $company->name }}</p>
</td>
<td>
<p class="heading-date-range">{{ $from_date }} - {{ $to_date }}</p>
</td>
</tr>
<tr>
<td colspan="2">
<p class="sub-heading-text">PROFIT & LOSS REPORT</p>
</td>
</tr>
</table>
<table class="income-table">
<tr>
<td>
<p class="income-title">Income</p>
</td>
<td>
<p class="income-money">{!! format_money_pdf($income) !!}</p>
</td>
</tr>
</table>
<p class="expenses-title">Expenses</p>
<div class="expenses-table-container">
<table class="expenses-table">
@foreach ($expenseCategories as $expenseCategory)
<tr>
<td>
<p class="expense-title">
{{ $expenseCategory->category->name }}
</p>
</td>
<td>
<p class="expense-money">
{!! format_money_pdf($expenseCategory->total_amount) !!}
</p>
</td>
</tr>
@endforeach
<table class="income-table">
<tr>
<td>
<p class="income-title">Income</p>
</td>
<td>
<p class="income-amount">{!! format_money_pdf($income) !!}</p>
</td>
</tr>
</table>
<p class="expenses-title">Expenses</p>
<div class="expenses-table-container">
<table class="expenses-table">
@foreach ($expenseCategories as $expenseCategory)
<tr>
<td>
<p class="expense-title">
{{ $expenseCategory->category->name }}
</p>
</td>
<td>
<p class="expense-amount">
{!! format_money_pdf($expenseCategory->total_amount) !!}
</p>
</td>
</tr>
@endforeach
</table>
</div>
</table>
</div>
<table class="expense-total-table">
<tr>
<td class="expense-total-cell">
<p class="expense-total">{!! format_money_pdf($totalExpense) !!}</p>
</td>
</tr>
</table>
<table class="profit-table">
<tr>
<td>
<p class="profit-title">NET PROFIT</p>
</td>
<td>
<p class="profit-money">{!! format_money_pdf(($income-$totalExpense)) !!}</p>
</td>
</tr>
</table>
</div>
<table class="expense-total-indicator-table">
<tr>
<td class="expense-total-cell">
<p class="expense-total">{!! format_money_pdf($totalExpense) !!}</p>
</td>
</tr>
</table>
<table class="report-footer">
<tr>
<td>
<p class="report-footer-label">NET PROFIT</p>
</td>
<td>
<p class="report-footer-value">{!! format_money_pdf(($income-$totalExpense)) !!}</p>
</td>
</tr>
</table>
</body>
</html>

View File

@ -2,35 +2,24 @@
<html lang="en">
<head>
<title>Sales Customer Report</title>
{{-- <link href="https://fonts.googleapis.com/css?family=Poppins&display=swap" rel="stylesheet"> --}}
<style type="text/css">
body {
font-family: "DejaVu Sans";
}
/* html {
margin: 0px;
padding: 0px;
} */
table {
border-collapse: collapse;
}
.main-container {
/* padding: 30px 80px; */
}
.sub-container{
padding: 0px 20px;
}
.header {
.report-header {
width: 100%;
}
.heading-text {
font-style: normal;
font-weight: 600;
font-size: 24px;
color: #5851D8;
@ -41,7 +30,6 @@
}
.heading-date-range {
font-style: normal;
font-weight: 600;
font-size: 15px;
color: #A5ACC1;
@ -52,7 +40,6 @@
}
.sub-heading-text {
font-style: normal;
font-weight: 600;
font-size: 16px;
line-height: 21px;
@ -62,90 +49,55 @@
margin-top: 30px;
}
.income-table {
margin-top: 53px;
width: 100%;
}
.income-title {
padding: 0px;
margin: 0px;
font-style: normal;
font-weight: normal;
font-size: 16px;
line-height: 21px;
color: #040405;
text-align: left;
}
.income-money {
padding: 0px;
margin: 0px;
font-style: normal;
font-weight: 500;
font-size: 16px;
line-height: 21px;
text-align: right;
color: #040405;
text-align: right;
}
.expenses-title {
.sales-customer-name {
margin-top: 20px;
padding-left: 3px;
font-style: normal;
font-weight: normal;
font-size: 16px;
line-height: 21px;
color: #040405;
}
.expenses-table-container {
.sales-table-container {
padding-left: 10px;
}
.expenses-table {
.sales-table {
width: 100%;
padding-bottom: 10px;
}
.expense-title {
.sales-information-text {
padding: 0px;
margin: 0px;
font-style: normal;
font-weight: normal;
font-size: 14px;
line-height: 21px;
color: #595959;
}
.expense-money {
.sales-amount {
padding: 0px;
margin: 0px;
font-style: normal;
font-weight: normal;
font-size: 14px;
line-height: 21px;
text-align: right;
color: #595959;
}
.expense-total-table {
.sales-total-indicator-table {
border-top: 1px solid #EAF1FB;
width: 100%;
}
.expense-total-cell {
.sales-total-cell {
padding-top: 10px;
}
.expense-total {
.sales-total-amount {
padding-top: 10px;
padding-right: 30px;
padding: 0px;
margin: 0px;
text-align: right;
font-style: normal;
font-weight: 500;
font-size: 16px;
line-height: 21px;
@ -153,7 +105,7 @@
color: #040405;
}
.profit-table {
.report-footer {
width: 100%;
margin-top: 40px;
padding: 15px 20px;
@ -161,22 +113,20 @@
box-sizing: border-box;
}
.profit-title {
.report-footer-label {
padding: 0px;
margin: 0px;
text-align: left;
font-style: normal;
font-weight: 600;
font-size: 16px;
line-height: 21px;
color: #595959;
}
.profit-money {
.report-footer-value {
padding: 0px;
margin: 0px;
text-align: right;
font-style: normal;
font-weight: 500;
font-size: 20px;
line-height: 21px;
@ -188,79 +138,67 @@
</style>
</head>
<body>
<div class="main-container">
<div class="sub-container">
<table class="header">
<tr>
<td>
<p class="heading-text">{{ $company->name }}</p>
</td>
<td>
<p class="heading-date-range">{{ $from_date }} - {{ $to_date }}</p>
</td>
</tr>
<tr>
<td colspan="2">
<p class="sub-heading-text text-center">Sales Report: By Customer</p>
</td>
</tr>
</table>
{{-- <table class="income-table">
<tr>
<td>
<p class="income-title">Income</p>
</td>
<td>
<p class="income-money">{{ $income }}</p>
</td>
</tr>
</table> --}}
@foreach ($customers as $customer)
<p class="expenses-title">{{ $customer->name }}</p>
<div class="expenses-table-container">
<table class="expenses-table">
@foreach ($customer->invoices as $invoice)
<tr>
<td>
<p class="expense-title">
{{ $invoice->formattedInvoiceDate }} ({{ $invoice->invoice_number }})
</p>
</td>
<td>
<p class="expense-money">
{!! format_money_pdf($invoice->total) !!}
</p>
</td>
</tr>
@endforeach
</table>
</div>
<table class="expense-total-table">
<tr>
<td class="expense-total-cell">
<p class="expense-total">
{!! format_money_pdf($customer->totalAmount) !!}
</p>
</td>
</tr>
</table>
@endforeach
</div>
<table class="profit-table">
<div class="sub-container">
<table class="report-header">
<tr>
<td>
<p class="profit-title">TOTAL SALES</p>
<p class="heading-text">{{ $company->name }}</p>
</td>
<td>
<p class="profit-money">
{!! format_money_pdf($totalAmount) !!}
</p>
<p class="heading-date-range">{{ $from_date }} - {{ $to_date }}</p>
</td>
</tr>
<tr>
<td colspan="2">
<p class="sub-heading-text text-center">Sales Report: By Customer</p>
</td>
</tr>
</table>
@foreach ($customers as $customer)
<p class="sales-customer-name">{{ $customer->name }}</p>
<div class="sales-table-container">
<table class="sales-table">
@foreach ($customer->invoices as $invoice)
<tr>
<td>
<p class="sales-information-text">
{{ $invoice->formattedInvoiceDate }} ({{ $invoice->invoice_number }})
</p>
</td>
<td>
<p class="sales-amount">
{!! format_money_pdf($invoice->total) !!}
</p>
</td>
</tr>
@endforeach
</table>
</div>
<table class="sales-total-indicator-table">
<tr>
<td class="sales-total-cell">
<p class="sales-total-amount">
{!! format_money_pdf($customer->totalAmount) !!}
</p>
</td>
</tr>
</table>
@endforeach
</div>
<table class="report-footer">
<tr>
<td>
<p class="report-footer-label">TOTAL SALES</p>
</td>
<td>
<p class="report-footer-value">
{!! format_money_pdf($totalAmount) !!}
</p>
</td>
</tr>
</table>
</body>
</html>

View File

@ -2,35 +2,24 @@
<html lang="en">
<head>
<title>Sales Item Report</title>
{{-- <link href="https://fonts.googleapis.com/css?family=Poppins&display=swap" rel="stylesheet"> --}}
<style type="text/css">
body {
font-family: "DejaVu Sans";
}
/* html {
margin: 0px;
padding: 0px;
} */
table {
border-collapse: collapse;
}
.main-container {
/* padding: 30px 80px; */
}
.sub-container{
padding: 0px 20px;
}
.header {
.report-header {
width: 100%;
}
.heading-text {
font-style: normal;
font-weight: 600;
font-size: 24px;
color: #5851D8;
@ -41,7 +30,6 @@
}
.heading-date-range {
font-style: normal;
font-weight: 600;
font-size: 15px;
color: #A5ACC1;
@ -52,7 +40,6 @@
}
.sub-heading-text {
font-style: normal;
font-weight: 600;
font-size: 16px;
line-height: 21px;
@ -62,90 +49,55 @@
margin-top: 30px;
}
.income-table {
margin-top: 53px;
width: 100%;
}
.income-title {
padding: 0px;
margin: 0px;
font-style: normal;
font-weight: normal;
font-size: 16px;
line-height: 21px;
color: #040405;
text-align: left;
}
.income-money {
padding: 0px;
margin: 0px;
font-style: normal;
font-weight: 500;
font-size: 16px;
line-height: 21px;
text-align: right;
color: #040405;
text-align: right;
}
.expenses-title {
.sales-items-title {
margin-top: 20px;
padding-left: 3px;
font-style: normal;
font-weight: normal;
font-size: 16px;
line-height: 21px;
color: #040405;
}
.expenses-table-container {
.items-table-container {
padding-left: 10px;
}
.expenses-table {
.items-table {
width: 100%;
padding-bottom: 10px;
}
.expense-title {
.item-title {
padding: 0px;
margin: 0px;
font-style: normal;
font-weight: normal;
font-size: 14px;
line-height: 21px;
color: #595959;
}
.expense-money {
.item-sales-amount {
padding: 0px;
margin: 0px;
font-style: normal;
font-weight: normal;
font-size: 14px;
line-height: 21px;
text-align: right;
color: #595959;
}
.expense-total-table {
.sales-total-indicator-table {
border-top: 1px solid #EAF1FB;
width: 100%;
}
.expense-total-cell {
.sales-total-cell {
padding-top: 10px;
}
.expense-total {
.sales-total-amount {
padding-top: 10px;
padding-right: 30px;
padding: 0px;
margin: 0px;
text-align: right;
font-style: normal;
font-weight: 500;
font-size: 16px;
line-height: 21px;
@ -153,7 +105,7 @@
color: #040405;
}
.profit-table {
.report-footer {
width: 100%;
margin-top: 40px;
padding: 15px 20px;
@ -161,22 +113,20 @@
box-sizing: border-box;
}
.profit-title {
.report-footer-label {
padding: 0px;
margin: 0px;
text-align: left;
font-style: normal;
font-weight: 600;
font-size: 16px;
line-height: 21px;
color: #595959;
}
.profit-money {
.report-footer-value {
padding: 0px;
margin: 0px;
text-align: right;
font-style: normal;
font-weight: 500;
font-size: 20px;
line-height: 21px;
@ -188,78 +138,66 @@
</style>
</head>
<body>
<div class="main-container">
<div class="sub-container">
<table class="header">
<tr>
<td>
<p class="heading-text">{{ $company->name }}</p>
</td>
<td>
<p class="heading-date-range">{{ $from_date }} - {{ $to_date }}</p>
</td>
</tr>
<tr>
<td colspan="2">
<p class="sub-heading-text text-center">Sales Report: By Item</p>
</td>
</tr>
</table>
<div class="sub-container">
<table class="report-header">
<tr>
<td>
<p class="heading-text">{{ $company->name }}</p>
</td>
<td>
<p class="heading-date-range">{{ $from_date }} - {{ $to_date }}</p>
</td>
</tr>
<tr>
<td colspan="2">
<p class="sub-heading-text text-center">Sales Report: By Item</p>
</td>
</tr>
</table>
{{-- <table class="income-table">
<tr>
<td>
<p class="income-title">Income</p>
</td>
<td>
<p class="income-money">{{ $income }}</p>
</td>
</tr>
</table> --}}
<p class="expenses-title">Items</p>
@foreach ($items as $item)
<div class="expenses-table-container">
<table class="expenses-table">
<tr>
<td>
<p class="expense-title">
{{ $item->name }}
</p>
</td>
<td>
<p class="expense-money">
{!! format_money_pdf($item->total_amount) !!}
</p>
</td>
</tr>
</table>
</div>
@endforeach
<table class="expense-total-table">
<p class="sales-items-title">Items</p>
@foreach ($items as $item)
<div class="items-table-container">
<table class="items-table">
<tr>
<td class="expense-total-cell">
<p class="expense-total">
{!! format_money_pdf($totalAmount) !!}
<td>
<p class="item-title">
{{ $item->name }}
</p>
</td>
<td>
<p class="item-sales-amount">
{!! format_money_pdf($item->total_amount) !!}
</p>
</td>
</tr>
</table>
</div>
</div>
@endforeach
<table class="profit-table">
<tr>
<td>
<p class="profit-title">TOTAL SALES</p>
</td>
<td>
<p class="profit-money">
{!! format_money_pdf($totalAmount) !!}
</p>
</td>
</tr>
</table>
<table class="sales-total-indicator-table">
<tr>
<td class="sales-total-cell">
<p class="sales-total-amount">
{!! format_money_pdf($totalAmount) !!}
</p>
</td>
</tr>
</table>
</div>
<table class="report-footer">
<tr>
<td>
<p class="report-footer-label">TOTAL SALES</p>
</td>
<td>
<p class="report-footer-value">
{!! format_money_pdf($totalAmount) !!}
</p>
</td>
</tr>
</table>
</body>
</html>

View File

@ -2,36 +2,25 @@
<html lang="en">
<head>
<title>Tax Summary Report</title>
{{-- <link href="https://fonts.googleapis.com/css?family=Poppins&display=swap" rel="stylesheet"> --}}
<style type="text/css">
body {
font-family: "DejaVu Sans";
}
/* html {
margin: 0px;
padding: 0px;
} */
table {
border-collapse: collapse;
}
.main-container {
/* padding: 30px 60px; */
}
.sub-container{
padding: 0px 20px;
}
.header {
.report-header {
width: 100%;
margin-bottom: 60px
}
.heading-text {
font-style: normal;
font-weight: 600;
font-size: 24px;
color: #5851D8;
@ -42,7 +31,6 @@
}
.heading-date-range {
font-style: normal;
font-weight: 600;
font-size: 15px;
color: #A5ACC1;
@ -53,31 +41,17 @@
}
.sub-heading-text {
font-style: normal;
font-weight: 600;
font-size: 16px;
/* line-height: 21px; */
color: #595959;
padding: 0px;
margin: 0px;
margin-top: 6px;
}
.types-title {
.tax-types-title {
margin-top: 20px;
padding-left: 3px;
font-style: normal;
font-weight: normal;
font-size: 16px;
line-height: 21px;
color: #040405;
}
.tax-title {
margin-top: 60px;
padding-left: 3px;
font-style: normal;
font-weight: normal;
font-size: 16px;
line-height: 21px;
color: #040405;
@ -95,18 +69,14 @@
.tax-title {
padding: 0px;
margin: 0px;
font-style: normal;
font-weight: normal;
font-size: 14px;
line-height: 21px;
color: #595959;
}
.tax-money {
.tax-amount {
padding: 0px;
margin: 0px;
font-style: normal;
font-weight: normal;
font-size: 14px;
line-height: 21px;
text-align: right;
@ -129,7 +99,6 @@
padding: 0px;
margin: 0px;
text-align: right;
font-style: normal;
font-weight: 500;
font-size: 16px;
line-height: 21px;
@ -137,7 +106,7 @@
color: #040405;
}
.total-tax-table {
.report-footer {
width: 100%;
margin-top: 40px;
padding: 15px 20px;
@ -145,22 +114,20 @@
box-sizing: border-box;
}
.total-tax-title {
.report-footer-label {
padding: 0px;
margin: 0px;
text-align: left;
font-style: normal;
font-weight: 600;
font-size: 16px;
line-height: 21px;
color: #595959;
}
.total-tax-money {
.report-footer-value {
padding: 0px;
margin: 0px;
text-align: right;
font-style: normal;
font-weight: 500;
font-size: 20px;
line-height: 21px;
@ -169,70 +136,68 @@
</style>
</head>
<body>
<div class="main-container">
<div class="sub-container">
<table class="header">
<tr>
<td>
<p class="heading-text">
{{ $company->name }}
</p>
</td>
<td>
<p class="heading-date-range">
{{ $from_date }} - {{ $to_date }}
</p>
</td>
</tr>
<tr>
<td colspan="2">
<p class="sub-heading-text">TAX REPORT</p>
</td>
</tr>
<div class="sub-container">
<table class="report-header">
<tr>
<td>
<p class="heading-text">
{{ $company->name }}
</p>
</td>
<td>
<p class="heading-date-range">
{{ $from_date }} - {{ $to_date }}
</p>
</td>
</tr>
<tr>
<td colspan="2">
<p class="sub-heading-text">TAX REPORT</p>
</td>
</tr>
</table>
<p class="tax-types-title">Tax Types</p>
<div class="tax-table-container">
<table class="tax-table">
@foreach ($taxTypes as $tax)
<tr>
<td>
<p class="tax-title">
{{ $tax->taxType->name }}
</p>
</td>
<td>
<p class="tax-amount">
{!! format_money_pdf($tax->total_tax_amount) !!}
</p>
</td>
</tr>
@endforeach
</table>
<p class="types-title">Tax Types</p>
<div class="tax-table-container">
<table class="tax-table">
@foreach ($taxTypes as $tax)
<tr>
<td>
<p class="tax-title">
{{ $tax->taxType->name }}
</p>
</td>
<td>
<p class="tax-money">
{!! format_money_pdf($tax->total_tax_amount) !!}
</p>
</td>
</tr>
@endforeach
</table>
</div>
</div>
<table class="tax-total-table">
<tr>
<td class="tax-total-cell">
<p class="tax-total">
{!! format_money_pdf($totalTaxAmount) !!}
</p>
</td>
</tr>
</table>
<table class="total-tax-table">
<tr>
<td>
<p class="total-tax-title">TOTAL TAX</p>
</td>
<td>
<p class="total-tax-money">
{!! format_money_pdf($totalTaxAmount) !!}
</p>
</td>
</tr>
</table>
</div>
<table class="tax-total-table">
<tr>
<td class="tax-total-cell">
<p class="tax-total">
{!! format_money_pdf($totalTaxAmount) !!}
</p>
</td>
</tr>
</table>
<table class="report-footer">
<tr>
<td>
<p class="report-footer-label">TOTAL TAX</p>
</td>
<td>
<p class="report-footer-value">
{!! format_money_pdf($totalTaxAmount) !!}
</p>
</td>
</tr>
</table>
</body>
</html>

View File

@ -122,23 +122,41 @@ Route::group(['middleware' => 'api'], function () {
'middleware' => 'admin'
], function () {
// Auto update routes
// Self Update
//----------------------------------
Route::post('/update', [
'as' => 'auto.update',
'uses' => 'UpdateController@update'
Route::get('/check/update', [
'as' => 'update.check',
'uses' => 'UpdateController@checkLatestVersion'
]);
Route::post('/update/download', [
'as' => 'update.download',
'uses' => 'UpdateController@download'
]);
Route::post('/update/unzip', [
'as' => 'update.unzip',
'uses' => 'UpdateController@unzip'
]);
Route::post('/update/copy', [
'as' => 'update.copy',
'uses' => 'UpdateController@copyFiles'
]);
Route::post('/update/migrate', [
'as' => 'update.migrate',
'uses' => 'UpdateController@migrate'
]);
Route::post('/update/finish', [
'as' => 'auto.update.finish',
'as' => 'update.finish',
'uses' => 'UpdateController@finishUpdate'
]);
Route::get('/check/update', [
'as' => 'check.update',
'uses' => 'UpdateController@checkLatestVersion'
]);
// Bootstrap
//----------------------------------
Route::get('/bootstrap', [
'as' => 'bootstrap',

View File

@ -6,6 +6,7 @@
|--------------------------------------------------------------------------
|
*/
Route::group(['prefix' => 'reports'], function () {
// sales report by customer
@ -46,7 +47,6 @@ Route::group(['prefix' => 'reports'], function () {
'as' => 'get.profit.loss',
'uses' => 'ReportController@profitLossReport'
]);
});
@ -88,7 +88,7 @@ Route::get('/expenses/{id}/receipt/{hash}', [
'uses' => 'ExpensesController@downloadReceipt'
]);
// Setup for instalation of app
// Setup for installation of app
// ----------------------------------------------
Route::get('/on-boarding', function () {
return view('app');