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
70 changed files with 6205 additions and 6735 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 * @var array
*/ */
protected $commands = [ protected $commands = [
Commands\ResetApp::class Commands\ResetApp::class,
Commands\UpdateCommand::class
]; ];
/** /**

View File

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

View File

@ -1,5 +1,4 @@
<?php <?php
namespace Crater\Http\Controllers; namespace Crater\Http\Controllers;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@ -123,17 +122,17 @@ class CompanyController extends Controller
$time_zones = TimeZones::get_list(); $time_zones = TimeZones::get_list();
$fiscal_years = [ $fiscal_years = [
['key' => 'january-december', 'value' => '1-12'], ['key' => 'january-december' , 'value' => '1-12'],
['key' => 'february-january', 'value' => '2-1'], ['key' => 'february-january' , 'value' => '2-1'],
['key' => 'march-february', 'value' => '3-2'], ['key' => 'march-february' , 'value' => '3-2'],
['key' => 'april-march', 'value' => '4-3'], ['key' => 'april-march' , 'value' => '4-3'],
['key' => 'may-april', 'value' => '5-4'], ['key' => 'may-april' , 'value' => '5-4'],
['key' => 'june-may', 'value' => '6-5'], ['key' => 'june-may' , 'value' => '6-5'],
['key' => 'july-june', 'value' => '7-6'], ['key' => 'july-june' , 'value' => '7-6'],
['key' => 'august-july', 'value' => '8-7'], ['key' => 'august-july' , 'value' => '8-7'],
['key' => 'september-august', 'value' => '9-8'], ['key' => 'september-august' , 'value' => '9-8'],
['key' => 'october-september', 'value' => '10-9'], ['key' => 'october-september', 'value' => '10-9'],
['key' => 'november-october', 'value' => '11-10'], ['key' => 'november-october' , 'value' => '11-10'],
['key' => 'december-november', 'value' => '12-11'], ['key' => 'december-november', 'value' => '12-11'],
]; ];
@ -145,16 +144,13 @@ class CompanyController extends Controller
$fiscal_year = CompanySetting::getSetting('fiscal_year', $request->header('company')); $fiscal_year = CompanySetting::getSetting('fiscal_year', $request->header('company'));
$languages = [ // alphabetical order $languages = [ // alphabetical order
["code" => "pt_BR", "name" => "Brazilian Portuguese"], ["code"=>"pt_BR", "name" => "Brazilian Portuguese"],
["code" => "en", "name" => "English"], ["code"=>"en", "name" => "English"],
["code" => "fr", "name" => "French"], ["code"=>"fr", "name" => "French"],
["code" => "de", "name" => "German"], ["code"=>"de", "name" => "German"],
["code" => "it", "name" => "Italian"], ["code"=>"it", "name" => "Italian"],
["code" => "es", "name" => "Spanish"], ["code"=>"es", "name" => "Spanish"],
["code" => "ar", "name" => "العربية"], ["code"=>"ar", "name" => "العربية"],
["code" => "de", "name" => "German"],
["code" => "pt_BR", "name" => "Brazilian Portuguese"],
["code" => "nl", "name" => "Dutch"]
]; ];
return response()->json([ return response()->json([
@ -199,7 +195,7 @@ class CompanyController extends Controller
]); ]);
} }
public function getCustomizeSetting(Request $request) public function getCustomizeSetting (Request $request)
{ {
$invoice_prefix = CompanySetting::getSetting('invoice_prefix', $request->header('company')); $invoice_prefix = CompanySetting::getSetting('invoice_prefix', $request->header('company'));
$invoice_auto_generate = CompanySetting::getSetting('invoice_auto_generate', $request->header('company')); $invoice_auto_generate = CompanySetting::getSetting('invoice_auto_generate', $request->header('company'));
@ -220,7 +216,7 @@ class CompanyController extends Controller
]); ]);
} }
public function updateCustomizeSetting(Request $request) public function updateCustomizeSetting (Request $request)
{ {
$sets = []; $sets = [];
@ -325,10 +321,10 @@ class CompanyController extends Controller
{ {
$data = json_decode($request->company_logo); $data = json_decode($request->company_logo);
if ($data) { if($data) {
$company = Company::find($request->header('company')); $company = Company::find($request->header('company'));
if ($company) { if($company) {
$company->clearMediaCollection('logo'); $company->clearMediaCollection('logo');
$company->addMediaFromBase64($data->data) $company->addMediaFromBase64($data->data)
@ -352,10 +348,10 @@ class CompanyController extends Controller
{ {
$data = json_decode($request->admin_avatar); $data = json_decode($request->admin_avatar);
if ($data) { if($data) {
$user = auth()->user(); $user = auth()->user();
if ($user) { if($user) {
$user->clearMediaCollection('admin_avatar'); $user->clearMediaCollection('admin_avatar');
$user->addMediaFromBase64($data->data) $user->addMediaFromBase64($data->data)

View File

@ -385,12 +385,12 @@ class EstimatesController extends Controller
public function estimateToInvoice(Request $request, $id) public function estimateToInvoice(Request $request, $id)
{ {
$estimate = Estimate::with(['items', 'items.taxes', 'user', 'estimateTemplate', 'taxes'])->find($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 = CompanySetting::getSetting(
'invoice_prefix', 'invoice_prefix',
$request->header('company') $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 = CompanySetting::getSetting(
'tax_per_item', 'tax_per_item',
$request->header('company') $request->header('company')

View File

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

View File

@ -2,23 +2,81 @@
namespace Crater\Http\Controllers; namespace Crater\Http\Controllers;
use Crater\Setting;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Crater\Space\Updater; use Crater\Space\Updater;
use Crater\Space\SiteApi; use Crater\Space\SiteApi;
use Illuminate\Support\Facades\Artisan;
class UpdateController extends Controller 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) public function finishUpdate(Request $request)
{ {
$request->validate([
'installed' => 'required',
'version' => 'required',
]);
$json = Updater::finishUpdate($request->installed, $request->version); $json = Updater::finishUpdate($request->installed, $request->version);
return response()->json($json); return response()->json($json);
@ -28,7 +86,7 @@ class UpdateController extends Controller
{ {
set_time_limit(600); // 10 minutes set_time_limit(600); // 10 minutes
$json = Updater::checkForUpdate(); $json = Updater::checkForUpdate(Setting::getSetting('version'));
return response()->json($json); 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 Crater\Listeners\Updates\Listener;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Crater\Events\UpdateFinished; use Crater\Events\UpdateFinished;
use Crater\Setting;
use Crater\Currency;
use Schema;
use Artisan;
class Version310 class Version310 extends Listener
{ {
/** const VERSION = '3.1.0';
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/** /**
* Handle the event. * Handle the event.
* *
* @param object $event * @param UpdateFinished $event
* @return void * @return void
*/ */
public function handle(UpdateFinished $event) public function handle(UpdateFinished $event)
{ {
\Schema::table('expenses', function (Blueprint $table) { if ($this->isListenerFired($event)) {
$table->integer('user_id')->unsigned()->nullable(); return;
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); }
});
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 <?php
namespace Crater\Providers; namespace Crater\Providers;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; 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\Version202;
use Crater\Listeners\Updates\v2\Version210; use Crater\Listeners\Updates\v2\Version210;
use Crater\Listeners\Updates\v3\Version300; use Crater\Listeners\Updates\v3\Version300;
use Crater\Listeners\Updates\v3\Version301;
use Crater\Listeners\Updates\v3\Version310; use Crater\Listeners\Updates\v3\Version310;
class EventServiceProvider extends ServiceProvider class EventServiceProvider extends ServiceProvider
@ -22,14 +22,13 @@ class EventServiceProvider extends ServiceProvider
* @var array * @var array
*/ */
protected $listen = [ protected $listen = [
UpdateFinished::class=> [ UpdateFinished::class => [
Version110::class, Version110::class,
Version200::class, Version200::class,
Version201::class, Version201::class,
Version202::class, Version202::class,
Version210::class, Version210::class,
Version300::class, Version300::class,
Version301::class,
Version310::class, Version310::class,
], ],
Registered::class => [ Registered::class => [

View File

@ -2,31 +2,45 @@
namespace Crater\Space; namespace Crater\Space;
use File; use File;
use ZipArchive;
use Artisan; use Artisan;
use GuzzleHttp\Exception\RequestException; use GuzzleHttp\Exception\RequestException;
use Crater\Space\SiteApi;
use Crater\Events\UpdateFinished; use Crater\Events\UpdateFinished;
use Crater\Setting; use ZipArchive;
use Illuminate\Http\Request;
class Updater class Updater
{ {
use SiteApi; 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; $data = null;
$path = null; $path = null;
if(env('APP_ENV') === 'development') if (env('APP_ENV') === 'development') {
{ $url = 'https://craterapp.com/downloads/file/' . $new_version . '?type=update&is_dev=1';
$url = 'https://craterapp.com/downloads/file/'.$version.'?type=update&is_dev=1';
} else { } 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]); $response = static::getRemote($url, ['timeout' => 100, 'track_redirects' => true]);
// Exception // Exception
@ -45,66 +59,68 @@ class Updater
} }
// Create temp directory // Create temp directory
$path = 'temp-' . md5(mt_rand()); $temp_dir = storage_path('app/temp-' . md5(mt_rand()));
$path2 = 'temp2-' . md5(mt_rand());
$temp_path = storage_path('app') . '/' . $path;
$temp_path2 = storage_path('app') . '/' . $path2;
if (!File::isDirectory($temp_path)) { if (!File::isDirectory($temp_dir)) {
File::makeDirectory($temp_path); File::makeDirectory($temp_dir);
File::makeDirectory($temp_path2);
} }
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 if (!$uploaded) {
$uploaded = is_int(file_put_contents($file, $data)) ? true : false; return 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' => []
];
} }
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) 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", "type": "project",
"require": { "require": {
"php": "^7.2", "php": "^7.2",
"aws/aws-sdk-php": "^3.137",
"barryvdh/laravel-dompdf": "^0.8.1", "barryvdh/laravel-dompdf": "^0.8.1",
"doctrine/dbal": "^2.10", "doctrine/dbal": "^2.10",
"fideloper/proxy": "^4.0", "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() public function up()
{ {
Schema::create('units', function (Blueprint $table) { if (!Schema::hasTable('units')) {
$table->increments('id'); Schema::create('units', function (Blueprint $table) {
$table->string('name'); $table->increments('id');
$table->integer('company_id')->unsigned()->nullable(); $table->string('name');
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade'); $table->integer('company_id')->unsigned()->nullable();
$table->timestamps(); $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->foreign('expense_category_id')->references('id')->on('expense_categories')->onDelete('cascade');
$table->integer('company_id')->unsigned()->nullable(); $table->integer('company_id')->unsigned()->nullable();
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade'); $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(); $table->timestamps();
}); });
} }

View File

@ -13,13 +13,15 @@ class CreatePaymentMethodsTable extends Migration
*/ */
public function up() public function up()
{ {
Schema::create('payment_methods', function (Blueprint $table) { if (!Schema::hasTable('payment_methods')) {
$table->increments('id'); Schema::create('payment_methods', function (Blueprint $table) {
$table->string('name'); $table->increments('id');
$table->integer('company_id')->unsigned()->nullable(); $table->string('name');
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade'); $table->integer('company_id')->unsigned()->nullable();
$table->timestamps(); $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==", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
"dev": true "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": { "@types/events": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", "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": { "adjust-sourcemap-loader": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz",
@ -2792,6 +2765,7 @@
"version": "3.2.1", "version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": { "requires": {
"color-convert": "^1.9.0" "color-convert": "^1.9.0"
}, },
@ -2800,6 +2774,7 @@
"version": "1.9.3", "version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": { "requires": {
"color-name": "1.1.3" "color-name": "1.1.3"
} }
@ -2807,7 +2782,8 @@
"color-name": { "color-name": {
"version": "1.1.3", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "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": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
}, },
"base": { "base": {
"version": "0.11.2", "version": "0.11.2",
@ -3287,10 +3264,16 @@
"integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
"dev": true "dev": true
}, },
"bootstrap": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz",
"integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA=="
},
"brace-expansion": { "brace-expansion": {
"version": "1.1.11", "version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": { "requires": {
"balanced-match": "^1.0.0", "balanced-match": "^1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
@ -3458,7 +3441,8 @@
"bytes": { "bytes": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
"dev": true
}, },
"cacache": { "cacache": {
"version": "12.0.3", "version": "12.0.3",
@ -3571,11 +3555,6 @@
"upper-case": "^1.1.1" "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": { "caniuse-api": {
"version": "1.6.1", "version": "1.6.1",
"resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz",
@ -3604,6 +3583,7 @@
"version": "2.4.2", "version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": { "requires": {
"ansi-styles": "^3.2.1", "ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5", "escape-string-regexp": "^1.0.5",
@ -3979,7 +3959,8 @@
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "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": { "concat-stream": {
"version": "1.6.2", "version": "1.6.2",
@ -4369,7 +4350,8 @@
"css-unit-converter": { "css-unit-converter": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", "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": { "css-what": {
"version": "2.1.3", "version": "2.1.3",
@ -5112,7 +5094,8 @@
"defined": { "defined": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
"integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
"dev": true
}, },
"del": { "del": {
"version": "4.1.1", "version": "4.1.1",
@ -5192,23 +5175,6 @@
"integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
"dev": true "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": { "diffie-hellman": {
"version": "5.0.3", "version": "5.0.3",
"resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
@ -5554,7 +5520,8 @@
"escape-string-regexp": { "escape-string-regexp": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "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": { "eslint": {
"version": "4.19.1", "version": "4.19.1",
@ -6584,7 +6551,8 @@
"fs.realpath": { "fs.realpath": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
}, },
"fsevents": { "fsevents": {
"version": "1.2.9", "version": "1.2.9",
@ -7243,6 +7211,7 @@
"version": "7.1.4", "version": "7.1.4",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
"integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
"dev": true,
"requires": { "requires": {
"fs.realpath": "^1.0.0", "fs.realpath": "^1.0.0",
"inflight": "^1.0.4", "inflight": "^1.0.4",
@ -7355,7 +7324,8 @@
"graceful-fs": { "graceful-fs": {
"version": "4.2.2", "version": "4.2.2",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", "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": { "growly": {
"version": "1.3.0", "version": "1.3.0",
@ -7395,7 +7365,8 @@
"has-flag": { "has-flag": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
}, },
"has-symbols": { "has-symbols": {
"version": "1.0.0", "version": "1.0.0",
@ -7882,7 +7853,8 @@
"indexes-of": { "indexes-of": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
"integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
"dev": true
}, },
"infer-owner": { "infer-owner": {
"version": "1.0.4", "version": "1.0.4",
@ -7894,6 +7866,7 @@
"version": "1.0.6", "version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"requires": { "requires": {
"once": "^1.3.0", "once": "^1.3.0",
"wrappy": "1" "wrappy": "1"
@ -7902,7 +7875,8 @@
"inherits": { "inherits": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "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": { "ini": {
"version": "1.3.5", "version": "1.3.5",
@ -8824,11 +8798,6 @@
"integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
"dev": true "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": { "lodash.uniq": {
"version": "4.5.0", "version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
@ -9094,6 +9063,7 @@
"version": "3.0.4", "version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": { "requires": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
} }
@ -9263,14 +9233,6 @@
"lower-case": "^1.1.1" "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": { "node-forge": {
"version": "0.9.0", "version": "0.9.0",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz",
@ -9355,7 +9317,8 @@
"normalize-range": { "normalize-range": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "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": { "normalize-url": {
"version": "1.9.1", "version": "1.9.1",
@ -9369,11 +9332,6 @@
"sort-keys": "^1.0.0" "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": { "npm-run-path": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
@ -9395,7 +9353,8 @@
"num2fraction": { "num2fraction": {
"version": "1.2.2", "version": "1.2.2",
"resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
"integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
"dev": true
}, },
"number-is-nan": { "number-is-nan": {
"version": "1.0.1", "version": "1.0.1",
@ -9406,7 +9365,8 @@
"object-assign": { "object-assign": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "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": { "object-copy": {
"version": "0.1.0", "version": "0.1.0",
@ -9566,6 +9526,7 @@
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": { "requires": {
"wrappy": "1" "wrappy": "1"
} }
@ -9785,7 +9746,8 @@
"path-is-absolute": { "path-is-absolute": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "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": { "path-is-inside": {
"version": "1.0.2", "version": "1.0.2",
@ -9802,7 +9764,8 @@
"path-parse": { "path-parse": {
"version": "1.0.6", "version": "1.0.6",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "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": { "path-to-regexp": {
"version": "0.1.7", "version": "0.1.7",
@ -9838,59 +9801,6 @@
"pinkie": "^2.0.0" "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": { "pluralize": {
"version": "7.0.0", "version": "7.0.0",
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
@ -10073,68 +9983,6 @@
"postcss": "^5.0.4" "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": { "postcss-load-config": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", "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": { "postcss-normalize-charset": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz",
@ -10857,7 +10656,8 @@
"postcss-value-parser": { "postcss-value-parser": {
"version": "3.3.1", "version": "3.3.1",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "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": { "postcss-zindex": {
"version": "2.2.0", "version": "2.2.0",
@ -10897,11 +10697,6 @@
"fast-diff": "^1.1.2" "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": { "private": {
"version": "0.1.8", "version": "0.1.8",
"resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
@ -12432,6 +12227,7 @@
"version": "5.5.0", "version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": { "requires": {
"has-flag": "^3.0.0" "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": { "tapable": {
"version": "1.1.3", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
@ -13081,7 +12652,8 @@
"uniq": { "uniq": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
"integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
"dev": true
}, },
"uniqs": { "uniqs": {
"version": "2.0.0", "version": "2.0.0",
@ -13110,7 +12682,8 @@
"universalify": { "universalify": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "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": { "unpipe": {
"version": "1.0.0", "version": "1.0.0",
@ -14218,7 +13791,8 @@
"wrappy": { "wrappy": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
}, },
"write": { "write": {
"version": "0.2.1", "version": "0.2.1",
@ -14232,7 +13806,8 @@
"xtend": { "xtend": {
"version": "4.0.2", "version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "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": { "y18n": {
"version": "3.2.1", "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/js/app.js": "/assets/js/app.js?id=2521d0dcc4cb4e4975a5",
"/assets/css/crater.css": "/assets/css/crater.css?id=a00ceebbb86dd82a024b" "/assets/css/crater.css": "/assets/css/crater.css?id=84a4eeb53b0e6a937e44"
} }

View File

@ -1,16 +1,16 @@
export default { export default {
toggleSidebar () { toggleSidebar() {
let icon = document.getElementsByClassName('hamburger')[0] let icon = document.getElementsByClassName('hamburger')[0]
document.body.classList.toggle('sidebar-open') document.body.classList.toggle('sidebar-open')
icon.classList.toggle('is-active') icon.classList.toggle('is-active')
}, },
addClass (el, className) { addClass(el, className) {
if (el.classList) el.classList.add(className) if (el.classList) el.classList.add(className)
else el.className += ' ' + className else el.className += ' ' + className
}, },
hasClass (el, className) { hasClass(el, className) {
const hasClass = el.classList const hasClass = el.classList
? el.classList.contains(className) ? el.classList.contains(className)
: new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className) : new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className)
@ -18,33 +18,38 @@ export default {
return hasClass return hasClass
}, },
reset (prefix) { reset(prefix) {
let regx = new RegExp('\\b' + prefix + '(.*)?\\b', 'g') let regx = new RegExp('\\b' + prefix + '(.*)?\\b', 'g')
document.body.className = document.body.className.replace(regx, '') document.body.className = document.body.className.replace(regx, '')
}, },
setLayout (layoutName) { setLayout(layoutName) {
this.reset('layout-') this.reset('layout-')
document.body.classList.add('layout-' + layoutName) document.body.classList.add('layout-' + layoutName)
}, },
setSkin (skinName) { setSkin(skinName) {
this.reset('skin-') this.reset('skin-')
document.body.classList.add('skin-' + skinName) document.body.classList.add('skin-' + skinName)
}, },
setLogo (logoSrc) { setLogo(logoSrc) {
document.getElementById('logo-desk').src = logoSrc document.getElementById('logo-desk').src = logoSrc
}, },
formatMoney (amount, currency = 0) { formatMoney(amount, currency = 0) {
if (!currency) { if (!currency) {
currency = {precision: 2, thousand_separator: ',', decimal_separator: '.', symbol: '$'} currency = {
precision: 2,
thousand_separator: ',',
decimal_separator: '.',
symbol: '$',
}
} }
amount = amount / 100 amount = amount / 100
let {precision, decimal_separator, thousand_separator, symbol} = currency let { precision, decimal_separator, thousand_separator, symbol } = currency
try { try {
precision = Math.abs(precision) precision = Math.abs(precision)
@ -52,25 +57,44 @@ export default {
const negativeSign = amount < 0 ? '-' : '' const negativeSign = amount < 0 ? '-' : ''
let i = parseInt(amount = Math.abs(Number(amount) || 0).toFixed(precision)).toString() let i = parseInt(
let j = (i.length > 3) ? i.length % 3 : 0 (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>` 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) { } catch (e) {
console.log(e) console.log(e)
} }
}, },
formatGraphMoney (amount, currency = 0) { formatGraphMoney(amount, currency = 0) {
if (!currency) { if (!currency) {
currency = {precision: 2, thousand_separator: ',', decimal_separator: '.', symbol: '$'} currency = {
precision: 2,
thousand_separator: ',',
decimal_separator: '.',
symbol: '$',
}
} }
amount = amount / 100 amount = amount / 100
let {precision, decimal_separator, thousand_separator, symbol} = currency let { precision, decimal_separator, thousand_separator, symbol } = currency
try { try {
precision = Math.abs(precision) precision = Math.abs(precision)
@ -78,25 +102,76 @@ export default {
const negativeSign = amount < 0 ? '-' : '' const negativeSign = amount < 0 ? '-' : ''
let i = parseInt(amount = Math.abs(Number(amount) || 0).toFixed(precision)).toString() let i = parseInt(
let j = (i.length > 3) ? i.length % 3 : 0 (amount = Math.abs(Number(amount) || 0).toFixed(precision))
).toString()
let j = i.length > 3 ? i.length % 3 : 0
let moneySymbol = `${symbol}` 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) { } catch (e) {
console.log(e) console.log(e)
} }
}, },
checkValidUrl (url) { checkValidUrl(url) {
let pattern = new RegExp('^(https?:\\/\\/)?' + // protocol let pattern = new RegExp(
'^(https?:\\/\\/)?' + // protocol
'((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name '((([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{1,3}\\.){3}\\d{1,3}))' + // OR ip (v4) address
'(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path
'(\\?[;&a-z\\d%_.~+=-]*)?' + // query string '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string
'(\\#[-a-z\\d_]*)?$', 'i') // fragment locator '(\\#[-a-z\\d_]*)?$',
'i'
) // fragment locator
return !!pattern.test(url) 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", "four_zero_four": "404",
"you_got_lost": "عفواً! يبدو أنك قد تهت!", "you_got_lost": "عفواً! يبدو أنك قد تهت!",
"go_home": "عودة إلى الرئيسية", "go_home": "عودة إلى الرئيسية",
"setting_updated": "تم تحديث الإعدادات بنجاح", "setting_updated": "تم تحديث الإعدادات بنجاح",
"select_state": "اختر الولاية/المنطقة", "select_state": "اختر الولاية/المنطقة",
"select_country": "اختر الدولة", "select_country": "اختر الدولة",
"select_city": "اختر المدينة", "select_city": "اختر المدينة",
"street_1": "عنوان الشارع 1", "street_1": "عنوان الشارع 1",
"street_2": "عنوان الشارع 2", "street_2": "عنوان الشارع 2",
"action_failed": "فشلت العملية" "action_failed": "فشلت العملية",
"retry": "أعد المحاولة"
}, },
"dashboard": { "dashboard": {
"select_year": "اختر السنة", "select_year": "اختر السنة",
@ -155,7 +155,7 @@
"select_a_customer": "اختر العميل", "select_a_customer": "اختر العميل",
"type_or_click": "اكتب أو اضغط للاختيار", "type_or_click": "اكتب أو اضغط للاختيار",
"confirm_delete": "لن تكون قادراً على استرجاع هذا العميل | لن تكون قادراً على استرجاع هؤلاء العملاء", "confirm_delete": "لن تتمكن من استرداد هذا العميل وجميع الفواتير والتقديرات والمدفوعات ذات الصلة. | لن تتمكن من استرداد هؤلاء العملاء وجميع الفواتير والتقديرات والمدفوعات ذات الصلة.",
"created_message": "تم إنشاء العملاء بنجاح", "created_message": "تم إنشاء العملاء بنجاح",
"updated_message": "تم تحديث العملاء بنجاح", "updated_message": "تم تحديث العملاء بنجاح",
"deleted_message": "تم حذف العملاء بنجاح | تم حذف العميل بنجاح" "deleted_message": "تم حذف العملاء بنجاح | تم حذف العميل بنجاح"
@ -370,7 +370,7 @@
"description": "الوصف", "description": "الوصف",
"quantity": "الكمية", "quantity": "الكمية",
"price": "السعر", "price": "السعر",
"discount": "الخصم", "discount": "الخصم",
"total": "الإجمالي", "total": "الإجمالي",
"total_discount": "إجمالي الخصم", "total_discount": "إجمالي الخصم",
"sub_total": "حاصل الجمع", "sub_total": "حاصل الجمع",
@ -603,65 +603,65 @@
"updated_message": "تم تحديث معلومات الشركة بنجاح" "updated_message": "تم تحديث معلومات الشركة بنجاح"
}, },
"customization": { "customization": {
"customization": "التخصيص", "customization": "التخصيص",
"save": "حفظ", "save": "حفظ",
"addresses": { "addresses": {
"title": "العنوان", "title": "العنوان",
"section_description": "يمكنك ضبط عنوان إرسال فواتير العملاء وتنسيق عنوان شحن العملاء (معروض في PDF فقط).", "section_description": "يمكنك ضبط عنوان إرسال فواتير العملاء وتنسيق عنوان شحن العملاء (معروض في PDF فقط).",
"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": "عنوان الشارع 1", "address_street_1": "عنوان الشارع 1",
"address_street_2": "عنوان الشارع 2", "address_street_2": "عنوان الشارع 2",
"phone": "الهاتف", "phone": "الهاتف",
"zip_code": "الرمز البريدي", "zip_code": "الرمز البريدي",
"address_setting_updated": "تم تحديث العنوان بنجاح" "address_setting_updated": "تم تحديث العنوان بنجاح"
}, },
"updated_message": "تم تحديث معلومات الشركة بنجاح", "updated_message": "تم تحديث معلومات الشركة بنجاح",
"invoices": { "invoices": {
"title": "الفواتير", "title": "الفواتير",
"notes": "ملاحظات", "notes": "ملاحظات",
"invoice_prefix": "بادئة رقم الفاتورة", "invoice_prefix": "بادئة رقم الفاتورة",
"invoice_settings": "إعدادات الفاتورة", "invoice_settings": "إعدادات الفاتورة",
"autogenerate_invoice_number": "ترقيم آلي للفاتورة", "autogenerate_invoice_number": "ترقيم آلي للفاتورة",
"invoice_setting_description": "تعطيل الترقيم الآلي ، إذا كنت لا ترغب في إنشاء أرقام الفاتورة تلقائيًا في كل مرة تقوم فيها بإنشاء فاتورة جديدة.", "invoice_setting_description": "تعطيل الترقيم الآلي ، إذا كنت لا ترغب في إنشاء أرقام الفاتورة تلقائيًا في كل مرة تقوم فيها بإنشاء فاتورة جديدة.",
"enter_invoice_prefix": "أدخل بادئة رقم الفاتورة", "enter_invoice_prefix": "أدخل بادئة رقم الفاتورة",
"terms_and_conditions": "الأحكام والشروط", "terms_and_conditions": "الأحكام والشروط",
"invoice_setting_updated": "تم تحديث إعداد الفاتورة بنجاح" "invoice_setting_updated": "تم تحديث إعداد الفاتورة بنجاح"
}, },
"estimates": { "estimates": {
"title": "التقديرات", "title": "التقديرات",
"estimate_prefix": "بادئة رقم التقدير", "estimate_prefix": "بادئة رقم التقدير",
"estimate_settings": "إعدادت التقدير", "estimate_settings": "إعدادت التقدير",
"autogenerate_estimate_number": "ترقيم آلي للتقدير", "autogenerate_estimate_number": "ترقيم آلي للتقدير",
"estimate_setting_description": "تعطيل الترقيم الآلي ، إذا كنت لا ترغب في إنشاء أرقام التقديرات تلقائيًا في كل مرة تقوم فيها بإنشاء تقدير جديد.", "estimate_setting_description": "تعطيل الترقيم الآلي ، إذا كنت لا ترغب في إنشاء أرقام التقديرات تلقائيًا في كل مرة تقوم فيها بإنشاء تقدير جديد.",
"enter_estimate_prefix": "أدخل بادئة رقم التقدير", "enter_estimate_prefix": "أدخل بادئة رقم التقدير",
"estimate_setting_updated": "تم تحديث إعدادات التقدير بنجاح" "estimate_setting_updated": "تم تحديث إعدادات التقدير بنجاح"
}, },
"payments": { "payments": {
"title": "المدفوعات", "title": "المدفوعات",
"payment_prefix": "بادئة رقم الدفعة", "payment_prefix": "بادئة رقم الدفعة",
"payment_settings": "إعدادات الدفعة", "payment_settings": "إعدادات الدفعة",
"autogenerate_payment_number": "ترقيم آلي للمدفوعات", "autogenerate_payment_number": "ترقيم آلي للمدفوعات",
"payment_setting_description": "تعطيل الترقيم الآلي ، إذا كنت لا ترغب في إنشاء أرقام الدفعة تلقائيًا في كل مرة تقوم فيها بإنشاء دفعة جديدة.", "payment_setting_description": "تعطيل الترقيم الآلي ، إذا كنت لا ترغب في إنشاء أرقام الدفعة تلقائيًا في كل مرة تقوم فيها بإنشاء دفعة جديدة.",
"enter_payment_prefix": "أدخل بادئة رقم الدفعة", "enter_payment_prefix": "أدخل بادئة رقم الدفعة",
"payment_setting_updated": "تم تحديث إعدادات الدفعة بنجاح" "payment_setting_updated": "تم تحديث إعدادات الدفعة بنجاح"
} }
}, },
"account_settings": { "account_settings": {
"profile_picture": "صورة الملف الشخصي", "profile_picture": "صورة الملف الشخصي",
@ -752,7 +752,14 @@
"progress_text": "سوف يستغرق التحديث بضع دقائق. يرجى عدم تحديث الشاشة أو إغلاق النافذة قبل انتهاء التحديث", "progress_text": "سوف يستغرق التحديث بضع دقائق. يرجى عدم تحديث الشاشة أو إغلاق النافذة قبل انتهاء التحديث",
"update_success": "تم تحديث النظام! يرجى الانتظار حتى يتم إعادة تحميل نافذة المتصفح تلقائيًا.", "update_success": "تم تحديث النظام! يرجى الانتظار حتى يتم إعادة تحميل نافذة المتصفح تلقائيًا.",
"latest_message": "لا يوجد تحديثات متوفرة! لديك حالياً أحدث نسخة.", "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": { "wizard": {
@ -806,22 +813,22 @@
"permission_desc": "فيما يلي قائمة أذونات المجلد المطلوبة حتى يعمل التطبيق. في حالة فشل فحص الإذن ، تأكد من تحديث أذونات المجلد." "permission_desc": "فيما يلي قائمة أذونات المجلد المطلوبة حتى يعمل التطبيق. في حالة فشل فحص الإذن ، تأكد من تحديث أذونات المجلد."
}, },
"mail": { "mail": {
"host": "خادم البريد", "host": "خادم البريد",
"port": "منفذ البريد", "port": "منفذ البريد",
"driver": "مشغل البريد", "driver": "مشغل البريد",
"secret": "سري", "secret": "سري",
"mailgun_secret": "الرمز السري لـ Mailgun", "mailgun_secret": "الرمز السري لـ Mailgun",
"mailgun_domain": "المجال", "mailgun_domain": "المجال",
"mailgun_endpoint": "النهاية الطرفية لـ Mailgun", "mailgun_endpoint": "النهاية الطرفية لـ Mailgun",
"ses_secret": "SES الرمز السري", "ses_secret": "SES الرمز السري",
"ses_key": "SES مفتاح", "ses_key": "SES مفتاح",
"password": "كلمة مرور البريد الالكتروني", "password": "كلمة مرور البريد الالكتروني",
"username": "اسم المستخدم للبريد الإلكتروني", "username": "اسم المستخدم للبريد الإلكتروني",
"mail_config": "إعدادات البريد الالكتروني", "mail_config": "إعدادات البريد الالكتروني",
"from_name": "اسم المرسل", "from_name": "اسم المرسل",
"from_mail": "عنوان البريد الالكتروني للمرسل", "from_mail": "عنوان البريد الالكتروني للمرسل",
"encryption": "صيغة ا لتشفير", "encryption": "صيغة ا لتشفير",
"mail_config_desc": "أدناه هو نموذج لتكوين برنامج تشغيل البريد الإلكتروني لإرسال رسائل البريد الإلكتروني من التطبيق. يمكنك أيضًا تهيئة موفري الجهات الخارجية مثل Sendgrid و SES إلخ." "mail_config_desc": "أدناه هو نموذج لتكوين برنامج تشغيل البريد الإلكتروني لإرسال رسائل البريد الإلكتروني من التطبيق. يمكنك أيضًا تهيئة موفري الجهات الخارجية مثل Sendgrid و SES إلخ."
}, },
"req": { "req": {
"system_req": "متطلبات النظام", "system_req": "متطلبات النظام",

File diff suppressed because it is too large Load Diff

View File

@ -13,6 +13,7 @@
}, },
"general": { "general": {
"view_pdf": "View PDF", "view_pdf": "View PDF",
"copy_pdf_url": "Copy PDF Url",
"download_pdf": "Download PDF", "download_pdf": "Download PDF",
"save": "Save", "save": "Save",
"cancel": "Cancel", "cancel": "Cancel",
@ -70,14 +71,14 @@
"go_home": "Go Home", "go_home": "Go Home",
"test_mail_conf": "Test Mail Configuration", "test_mail_conf": "Test Mail Configuration",
"send_mail_successfully": "Mail sent successfully", "send_mail_successfully": "Mail sent successfully",
"setting_updated": "Setting updated successfully", "setting_updated": "Setting updated successfully",
"select_state": "Select state", "select_state": "Select state",
"select_country": "Select Country", "select_country": "Select Country",
"select_city": "Select City", "select_city": "Select City",
"street_1": "Street 1", "street_1": "Street 1",
"street_2": "Street 2", "street_2": "Street 2",
"action_failed": "Action Failed" "action_failed": "Action Failed",
"retry": "Retry"
}, },
"dashboard": { "dashboard": {
"select_year": "Select year", "select_year": "Select year",
@ -163,7 +164,7 @@
"select_a_customer": "Select a customer", "select_a_customer": "Select a customer",
"type_or_click": "Type or click to select", "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", "created_message": "Customer created successfully",
"updated_message": "Customer updated successfully", "updated_message": "Customer updated successfully",
"deleted_message": "Customer deleted successfully | Customers deleted successfully" "deleted_message": "Customer deleted successfully | Customers deleted successfully"
@ -230,6 +231,7 @@
"convert_to_invoice": "Convert to Invoice", "convert_to_invoice": "Convert to Invoice",
"mark_as_sent": "Mark as Sent", "mark_as_sent": "Mark as Sent",
"send_estimate": "Send Estimate", "send_estimate": "Send Estimate",
"resend_estimate": "Resend Estimate",
"record_payment": "Record Payment", "record_payment": "Record Payment",
"add_estimate": "Add Estimate", "add_estimate": "Add Estimate",
"save_estimate": "Save Estimate", "save_estimate": "Save Estimate",
@ -316,6 +318,7 @@
"notes": "Notes", "notes": "Notes",
"view": "View", "view": "View",
"send_invoice": "Send Invoice", "send_invoice": "Send Invoice",
"resend_invoice": "Resend Invoice",
"invoice_template": "Invoice Template", "invoice_template": "Invoice Template",
"template": "Template", "template": "Template",
"mark_as_sent": "Mark as sent", "mark_as_sent": "Mark as sent",
@ -618,85 +621,85 @@
"updated_message": "Company information updated successfully" "updated_message": "Company information updated successfully"
}, },
"customization": { "customization": {
"customization": "customization", "customization": "customization",
"save": "Save", "save": "Save",
"addresses": { "addresses": {
"title": "Addresses", "title": "Addresses",
"section_description": "You can set Customer Billing Address and Customer Shipping Address Format (Displayed in PDF only). ", "section_description": "You can set Customer Billing Address and Customer Shipping Address Format (Displayed in PDF only). ",
"customer_billing_address": "Customer Billing Address", "customer_billing_address": "Customer Billing Address",
"customer_shipping_address": "Customer Shipping Address", "customer_shipping_address": "Customer Shipping Address",
"company_address": "Company Address", "company_address": "Company Address",
"insert_fields": "Insert Fields", "insert_fields": "Insert Fields",
"contact": "Contact", "contact": "Contact",
"address": "Address", "address": "Address",
"display_name": "Display Name", "display_name": "Display Name",
"primary_contact_name": "Primary Contact Name", "primary_contact_name": "Primary Contact Name",
"email": "Email", "email": "Email",
"website": "Website", "website": "Website",
"name": "Name", "name": "Name",
"country": "Country", "country": "Country",
"state": "State", "state": "State",
"city": "City", "city": "City",
"company_name": "Company Name", "company_name": "Company Name",
"address_street_1": "Address Street 1", "address_street_1": "Address Street 1",
"address_street_2": "Address Street 2", "address_street_2": "Address Street 2",
"phone": "Phone", "phone": "Phone",
"zip_code": "Zip Code", "zip_code": "Zip Code",
"address_setting_updated": "Address Setting updated successfully" "address_setting_updated": "Address Setting updated successfully"
}, },
"updated_message": "Company information updated successfully", "updated_message": "Company information updated successfully",
"invoices": { "invoices": {
"title": "Invoices", "title": "Invoices",
"notes": "Notes", "notes": "Notes",
"invoice_prefix": "Invoice Prefix", "invoice_prefix": "Invoice Prefix",
"invoice_settings": "Invoice Settings", "invoice_settings": "Invoice Settings",
"autogenerate_invoice_number": "Auto-generate Invoice Number", "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.", "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", "enter_invoice_prefix": "Enter invoice prefix",
"terms_and_conditions": "Terms and Conditions", "terms_and_conditions": "Terms and Conditions",
"invoice_setting_updated": "Invoice Setting updated successfully" "invoice_setting_updated": "Invoice Setting updated successfully"
}, },
"estimates": { "estimates": {
"title": "Estimates", "title": "Estimates",
"estimate_prefix": "Estimate Prefix", "estimate_prefix": "Estimate Prefix",
"estimate_settings": "Estimate Settings", "estimate_settings": "Estimate Settings",
"autogenerate_estimate_number": "Auto-generate Estimate Number", "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.", "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", "enter_estimate_prefix": "Enter estmiate prefix",
"estimate_setting_updated": "Estimate Setting updated successfully" "estimate_setting_updated": "Estimate Setting updated successfully"
}, },
"payments": { "payments": {
"title": "Payments", "title": "Payments",
"payment_prefix": "Payment Prefix", "payment_prefix": "Payment Prefix",
"payment_settings": "Payment Settings", "payment_settings": "Payment Settings",
"autogenerate_payment_number": "Auto-generate Payment Number", "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.", "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", "enter_payment_prefix": "Enter Payment Prefix",
"payment_setting_updated": "Payment Setting updated successfully", "payment_setting_updated": "Payment Setting updated successfully",
"payment_mode": "Payment Mode", "payment_mode": "Payment Mode",
"add_payment_mode": "Add Payment Mode", "add_payment_mode": "Add Payment Mode",
"mode_name": "Mode Name", "mode_name": "Mode Name",
"payment_mode_added": "Payment Mode Added", "payment_mode_added": "Payment Mode Added",
"payment_mode_updated": "Payment Mode Updated", "payment_mode_updated": "Payment Mode Updated",
"payment_mode_confirm_delete":"You will not be able to recover this Payment Mode", "payment_mode_confirm_delete": "You will not be able to recover this Payment Mode",
"already_in_use": "Payment Mode is already in use", "already_in_use": "Payment Mode is already in use",
"deleted_message": "Payment Mode deleted successfully" "deleted_message": "Payment Mode deleted successfully"
}, },
"items": { "items": {
"title": "Items", "title": "Items",
"units": "units", "units": "units",
"add_item_unit": "Add Item Unit", "add_item_unit": "Add Item Unit",
"unit_name": "Unit Name", "unit_name": "Unit Name",
"item_unit_added": "Item Unit Added", "item_unit_added": "Item Unit Added",
"item_unit_updated": "Item Unit Updated", "item_unit_updated": "Item Unit Updated",
"item_unit_confirm_delete":"You will not be able to recover this Item unit", "item_unit_confirm_delete": "You will not be able to recover this Item unit",
"already_in_use": "Item Unit is already in use", "already_in_use": "Item Unit is already in use",
"deleted_message": "Item Unit deleted successfully" "deleted_message": "Item Unit deleted successfully"
} }
}, },
"account_settings": { "account_settings": {
"profile_picture": "Profile Picture", "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", "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.", "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.", "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": { "wizard": {

View File

@ -62,14 +62,14 @@
"four_zero_four": "404", "four_zero_four": "404",
"you_got_lost": "Whoops! ¡Te perdiste!", "you_got_lost": "Whoops! ¡Te perdiste!",
"go_home": "Volver al Inicio", "go_home": "Volver al Inicio",
"setting_updated": "Configuración actualizada con éxito", "setting_updated": "Configuración actualizada con éxito",
"select_state": "Seleccionar estado", "select_state": "Seleccionar estado",
"select_country": "Seleccionar país", "select_country": "Seleccionar país",
"select_city": "Seleccionar ciudad", "select_city": "Seleccionar ciudad",
"street_1": "Calle 1", "street_1": "Calle 1",
"street_2": "Calle 2", "street_2": "Calle 2",
"action_failed": "Accion Fallida" "action_failed": "Accion Fallida",
"retry": "Procesar de nuevo"
}, },
"dashboard": { "dashboard": {
"select_year": "Seleccionar año", "select_year": "Seleccionar año",
@ -155,7 +155,7 @@
"select_a_customer": "Selecciona un cliente", "select_a_customer": "Selecciona un cliente",
"type_or_click": "Escriba o haga clic para seleccionar", "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", "created_message": "Cliente creado con éxito",
"updated_message": "Cliente actualizado con éxito", "updated_message": "Cliente actualizado con éxito",
"deleted_message": "Cliente eliminado correctamente | Clientes eliminados exitosamente" "deleted_message": "Cliente eliminado correctamente | Clientes eliminados exitosamente"
@ -602,65 +602,65 @@
"updated_message": "Información de la empresa actualizada con éxito" "updated_message": "Información de la empresa actualizada con éxito"
}, },
"customization": { "customization": {
"customization": "Personalización", "customization": "Personalización",
"save": "Guardar", "save": "Guardar",
"addresses": { "addresses": {
"title": "Direcciones", "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).", "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_billing_address": "Dirección de facturación del cliente",
"customer_shipping_address": "Dirección de envío del cliente", "customer_shipping_address": "Dirección de envío del cliente",
"company_address": "Dirección de la compañia", "company_address": "Dirección de la compañia",
"insert_fields": "Insertar campos", "insert_fields": "Insertar campos",
"contact": "Contacto", "contact": "Contacto",
"address": "Dirección", "address": "Dirección",
"display_name": "Nombre para mostrar", "display_name": "Nombre para mostrar",
"primary_contact_name": "Nombre de contacto principal", "primary_contact_name": "Nombre de contacto principal",
"email": "Email", "email": "Email",
"website": "Sitio web", "website": "Sitio web",
"name": "Nombre", "name": "Nombre",
"country": "País", "country": "País",
"state": "Estado", "state": "Estado",
"city": "Ciudad", "city": "Ciudad",
"company_name": "Nombre de la compañia", "company_name": "Nombre de la compañia",
"address_street_1": "Dirección de la calle 1", "address_street_1": "Dirección de la calle 1",
"address_street_2": "Dirección de la calle 2", "address_street_2": "Dirección de la calle 2",
"phone": "Telefono", "phone": "Telefono",
"zip_code": "Codigo postal", "zip_code": "Codigo postal",
"address_setting_updated": "Configuración de dirección actualizada correctamente" "address_setting_updated": "Configuración de dirección actualizada correctamente"
}, },
"updated_message": "Información de la empresa actualizada con éxito", "updated_message": "Información de la empresa actualizada con éxito",
"invoices": { "invoices": {
"title": "Facturas", "title": "Facturas",
"notes": "Notas", "notes": "Notas",
"invoice_prefix": "Prefijo de las facturas", "invoice_prefix": "Prefijo de las facturas",
"invoice_settings": "Ajustes de facturas", "invoice_settings": "Ajustes de facturas",
"autogenerate_invoice_number": "Autogenerar número de factura", "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.", "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", "enter_invoice_prefix": "Introduzca el prefijo de factura",
"terms_and_conditions": "Términos y Condiciones", "terms_and_conditions": "Términos y Condiciones",
"invoice_setting_updated": "Configuración de factura actualizada correctamente" "invoice_setting_updated": "Configuración de factura actualizada correctamente"
}, },
"estimates": { "estimates": {
"title": "Estimaciones", "title": "Estimaciones",
"estimate_prefix": "Prefijo de los presupuestos", "estimate_prefix": "Prefijo de los presupuestos",
"estimate_settings": "Ajustes de presupuestos", "estimate_settings": "Ajustes de presupuestos",
"autogenerate_estimate_number": "Autogenerar número de presupuesto", "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.", "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", "enter_estimate_prefix": "Introduzca el prefijo de presupuesto",
"estimate_setting_updated": "Configuración de presupuestos actualizada correctamente" "estimate_setting_updated": "Configuración de presupuestos actualizada correctamente"
}, },
"payments": { "payments": {
"title": "Payments", "title": "Payments",
"payment_prefix": "Prefijo de los pagos", "payment_prefix": "Prefijo de los pagos",
"payment_settings": "Ajustes de pagos", "payment_settings": "Ajustes de pagos",
"autogenerate_payment_number": "Autogenerar número de pago", "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.", "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", "enter_payment_prefix": "Introduzca el prefijo de pago",
"payment_setting_updated": "Configuración de pagos actualizada correctamente" "payment_setting_updated": "Configuración de pagos actualizada correctamente"
} }
}, },
"account_settings": { "account_settings": {
"profile_picture": "Foto de perfil", "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.", "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.", "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.", "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": { "wizard": {

View File

@ -17,6 +17,7 @@
"save": "Sauvegarder", "save": "Sauvegarder",
"cancel": "Annuler", "cancel": "Annuler",
"update": "Mise à jour", "update": "Mise à jour",
"deselect": "Retirer",
"download": "Télécharger", "download": "Télécharger",
"from_date": "A partir de la date", "from_date": "A partir de la date",
"to_date": "À ce jour", "to_date": "À ce jour",
@ -28,7 +29,7 @@
"filter": "Filtre", "filter": "Filtre",
"delete": "Effacer", "delete": "Effacer",
"edit": "Modifier", "edit": "Modifier",
"view": "Vue", "view": "Voir",
"add_new_item": "Ajoute un nouvel objet", "add_new_item": "Ajoute un nouvel objet",
"clear_all": "Tout effacer", "clear_all": "Tout effacer",
"showing": "Montrant", "showing": "Montrant",
@ -62,14 +63,21 @@
"four_zero_four": "404", "four_zero_four": "404",
"you_got_lost": "Oups! Vous vous êtes perdus!", "you_got_lost": "Oups! Vous vous êtes perdus!",
"go_home": "Rentrer chez soi", "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", "setting_updated": "Réglage mis à jour avec succès",
"select_state": "Sélectionnez l'état", "select_state": "Sélectionnez l'état",
"select_country": "Choisissez le pays", "select_country": "Choisissez le pays",
"select_city": "Sélectionnez une ville", "select_city": "Sélectionnez une ville",
"street_1": "Rue 1", "street_1": "Rue 1",
"street_2": "Rue # 2", "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": { "dashboard": {
"select_year": "Sélectionnez l'année", "select_year": "Sélectionnez l'année",
@ -160,7 +168,7 @@
"select_a_customer": "Sélectionnez un client", "select_a_customer": "Sélectionnez un client",
"type_or_click": "Tapez ou cliquez pour sélectionner", "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", "created_message": "Client créé avec succès",
"updated_message": "Client mis à jour 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" "deleted_message": "Client supprimé avec succès | Les clients supprimés avec succès"
@ -202,24 +210,24 @@
"all": "Tout", "all": "Tout",
"paid": "Payé", "paid": "Payé",
"unpaid": "Non payé", "unpaid": "Non payé",
"customer": "CLIENT CLIENT", "customer": "Client",
"ref_no": "REF NO.", "ref_no": "Réf.",
"number": "NOMBRE", "number": "N°",
"amount_due": "MONTANT DÛ", "amount_due": "MONTANT DÛ",
"partially_paid": "Partiellement payé", "partially_paid": "Partiellement payé",
"total": "Totale", "total": "Total",
"discount": "Remise", "discount": "Remise",
"sub_total": "Total partiel", "sub_total": "Total partiel",
"estimate_number": "Numéro destimation", "estimate_number": "N°",
"ref_number": "Numéro de ref", "ref_number": "Numéro de ref",
"contact": "Contact", "contact": "Contact",
"add_item": "Ajouter un article", "add_item": "Ajouter un article",
"date": "Date", "date": "Date",
"due_date": "Date déchéance", "due_date": "Date d'échéance",
"expiry_date": "Date dexpiration", "expiry_date": "Date dexpiration",
"status": "Statut", "status": "Statut",
"add_tax": "Ajouter une taxe", "add_tax": "Ajouter une taxe",
"amount": "Montante", "amount": "Montant",
"action": "action", "action": "action",
"notes": "Remarques", "notes": "Remarques",
"tax": "Impôt", "tax": "Impôt",
@ -227,7 +235,7 @@
"convert_to_invoice": "Convertir en facture", "convert_to_invoice": "Convertir en facture",
"mark_as_sent": "Marquer comme envoyé", "mark_as_sent": "Marquer comme envoyé",
"send_estimate": "Envoyer un devis", "send_estimate": "Envoyer un devis",
"record_payment": "Record de paiement", "record_payment": "Enregistrer un paiement",
"add_estimate": "Ajouter un devis", "add_estimate": "Ajouter un devis",
"save_estimate": "Sauvegarder le devis", "save_estimate": "Sauvegarder le devis",
"confirm_conversion": "Vous souhaitez convertir ce devis en facture?", "confirm_conversion": "Vous souhaitez convertir ce devis en facture?",
@ -269,14 +277,17 @@
"quantity": "Quantité", "quantity": "Quantité",
"price": "Prix", "price": "Prix",
"discount": "Remise", "discount": "Remise",
"total": "Totale", "total": "Total",
"total_discount": "Remise totale", "total_discount": "Remise totale",
"sub_total": "Total partiel", "sub_total": "Total partiel",
"tax": "Impôt", "tax": "Impôt",
"amount": "Montante", "amount": "Montant",
"select_an_item": "Tapez ou cliquez pour sélectionner un élément", "select_an_item": "Tapez ou cliquez pour sélectionner un élément",
"type_item_description": "Type Item Description (optionnel)" "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": { "invoices": {
"title": "Factures", "title": "Factures",
@ -287,13 +298,13 @@
"all": "Toute", "all": "Toute",
"paid": "Payé", "paid": "Payé",
"unpaid": "Non payé", "unpaid": "Non payé",
"customer": "CLIENTE CLIENT", "customer": "CLIENT",
"paid_status": "Statut payé", "paid_status": "Paiement",
"ref_no": "REF NO.", "ref_no": "REF NO.",
"number": "NOMBRE", "number": "N°",
"amount_due": "MONTANT DÛ", "amount_due": "MONTANT DÛ",
"partially_paid": "Partiellement payé", "partially_paid": "Partiellement payé",
"total": "Totale Total", "total": "Total",
"discount": "Remise", "discount": "Remise",
"sub_total": "Total partiel", "sub_total": "Total partiel",
"invoice": "Facture | Factures", "invoice": "Facture | Factures",
@ -302,21 +313,23 @@
"contact": "Contact", "contact": "Contact",
"add_item": "Ajouter un article", "add_item": "Ajouter un article",
"date": "Date", "date": "Date",
"due_date": "Date déchéance", "due_date": "Date d'échéance",
"status": "Statut", "status": "Statut",
"add_tax": "Ajouter une taxe", "add_tax": "Ajouter une taxe",
"amount": "Montante Montant", "amount": "Montant",
"action": "action", "action": "action",
"notes": "Remarques", "notes": "Remarques",
"view": "Vue", "view": "Voir",
"send_invoice": "Envoyer une facture", "send_invoice": "Envoyer une facture",
"cloned_successfully": "Facture clonée avec succès",
"clone_invoice": "Cloner",
"invoice_template": "Modèle de facture", "invoice_template": "Modèle de facture",
"template": "Modèle", "template": "Modèle",
"mark_as_sent": "Marquer comme envoyé", "mark_as_sent": "Marquer comme envoyé",
"invoice_mark_as_sent": "Cette facture sera marquée 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.", "confirm_send": "Cette facture sera envoyée par courrier électronique au client.",
"invoice_date": "Date de facturation", "invoice_date": "Date de facturation",
"record_payment": "Record de paiement", "record_payment": "Enregister un paiement",
"add_new_invoice": "Ajouter une nouvelle facture", "add_new_invoice": "Ajouter une nouvelle facture",
"update_expense": "Frais de mise à jour", "update_expense": "Frais de mise à jour",
"edit_invoice": "Modifier la facture", "edit_invoice": "Modifier la facture",
@ -335,11 +348,11 @@
"quantity": "Quantité", "quantity": "Quantité",
"price": "Prix", "price": "Prix",
"discount": "Remise", "discount": "Remise",
"total": "Totale Total", "total": "Total",
"total_discount": "Remise totale", "total_discount": "Remise totale",
"sub_total": "Total partiel", "sub_total": "Total partiel",
"tax": "Impôt", "tax": "Impôt",
"amount": "Montante Montant", "amount": "Montant",
"select_an_item": "Tapez ou cliquez pour sélectionner un élément", "select_an_item": "Tapez ou cliquez pour sélectionner un élément",
"type_item_description": "Type Item Description (optionnel)" "type_item_description": "Type Item Description (optionnel)"
}, },
@ -349,7 +362,12 @@
"updated_message": "Facture mise à jour avec succès", "updated_message": "Facture mise à jour avec succès",
"deleted_message": "La Facture a été supprimée ! | Les Factures ont été supprimées !", "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", "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": { "credit_notes": {
"title": "Notes de crédit", "title": "Notes de crédit",
@ -357,7 +375,7 @@
"credit_notes": "Notes de crédit", "credit_notes": "Notes de crédit",
"contact": "Contact", "contact": "Contact",
"date": "Date", "date": "Date",
"amount": "Montante Montant", "amount": "Montant Montant",
"action": "action", "action": "action",
"credit_number": "Numéro de crédit", "credit_number": "Numéro de crédit",
"notes": "Remarques", "notes": "Remarques",
@ -368,7 +386,7 @@
"quantity": "Quantité", "quantity": "Quantité",
"price": "Prix", "price": "Prix",
"discount": "Remise", "discount": "Remise",
"total": "Totale Total", "total": "Total",
"total_discount": "Remise totale", "total_discount": "Remise totale",
"sub_total": "Total partiel", "sub_total": "Total partiel",
"tax": "Impôt" "tax": "Impôt"
@ -377,12 +395,12 @@
"payments": { "payments": {
"title": "Paiements", "title": "Paiements",
"payments_list": "Liste de paiements", "payments_list": "Liste de paiements",
"record_payment": "Record de paiement", "record_payment": "Enregistrer un paiement",
"customer": "Client Client", "customer": "Client",
"date": "Date", "date": "Date",
"amount": "Montant Montant", "amount": "Montant",
"action": "action", "action": "action",
"payment_number": "Numéro de paiement", "payment_number": "N°",
"payment_mode": "Mode de paiement", "payment_mode": "Mode de paiement",
"invoice": "Facture dachat", "invoice": "Facture dachat",
"note": "Remarque", "note": "Remarque",
@ -391,6 +409,7 @@
"edit_payment": "Modifier le paiement", "edit_payment": "Modifier le paiement",
"view_payment": "Voir le paiement", "view_payment": "Voir le paiement",
"add_new_payment": "Ajouter un nouveau paiement", "add_new_payment": "Ajouter un nouveau paiement",
"send_payment_receipt": "Envoyer le reçu",
"save_payment": "Enregistrer le paiement", "save_payment": "Enregistrer le paiement",
"update_payment": "Mettre à jour le paiement", "update_payment": "Mettre à jour le paiement",
"payment": "Paiement | Paiements", "payment": "Paiement | Paiements",
@ -403,7 +422,11 @@
"created_message": "Paiement créé avec succès", "created_message": "Paiement créé avec succès",
"updated_message": "Paiement mis à jour avec succès", "updated_message": "Paiement mis à jour avec succès",
"deleted_message": "Paiement supprimé avec succès | Paiements supprimés 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": { "expenses": {
"title": "Dépenses", "title": "Dépenses",
@ -425,7 +448,7 @@
"date": "Date de dépense", "date": "Date de dépense",
"add_expense": "Ajouter une dépense", "add_expense": "Ajouter une dépense",
"add_new_expense": "Ajouter une nouvelle 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", "update_expense": "Frais de mise à jour",
"download_receipt": "Télécharger le reçu", "download_receipt": "Télécharger le reçu",
"edit_expense": "Modifier les dépenses", "edit_expense": "Modifier les dépenses",
@ -449,7 +472,8 @@
"new_category": "Nouvelle catégorie", "new_category": "Nouvelle catégorie",
"category": "Catégorie | Les catégories", "category": "Catégorie | Les catégories",
"select_a_category": "choisissez une catégorie" "select_a_category": "choisissez une catégorie"
} },
"customer": "Client"
}, },
"login": { "login": {
"email": "Email", "email": "Email",
@ -462,7 +486,8 @@
"enter_email": "Entrer email", "enter_email": "Entrer email",
"enter_password": "Entrer le mot de passe", "enter_password": "Entrer le mot de passe",
"retype_password": "Retaper 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": { "reports": {
"title": "rapport", "title": "rapport",
@ -501,7 +526,7 @@
"invoice": "Facture d'achat", "invoice": "Facture d'achat",
"invoice_date": "Date de facturation", "invoice_date": "Date de facturation",
"due_date": "Date déchéance", "due_date": "Date déchéance",
"amount": "Montante ", "amount": "Montant ",
"contact_name": "Nom du contact", "contact_name": "Nom du contact",
"status": "Statut" "status": "Statut"
}, },
@ -509,7 +534,7 @@
"estimate": "Devis", "estimate": "Devis",
"estimate_date": "Date du devis", "estimate_date": "Date du devis",
"due_date": "Date d'échéance", "due_date": "Date d'échéance",
"estimate_number": "Numéro d'estimation", "estimate_number": "N°",
"ref_number": "Numéro de ref", "ref_number": "Numéro de ref",
"amount": "Montant", "amount": "Montant",
"contact_name": "Nom du contact", "contact_name": "Nom du contact",
@ -529,6 +554,7 @@
"menu_title": { "menu_title": {
"account_settings": "Paramètres du compte", "account_settings": "Paramètres du compte",
"company_information": "Informations sur la société", "company_information": "Informations sur la société",
"customization": "Personnalisation",
"preferences": "Préférences", "preferences": "Préférences",
"notifications": "Les notifications", "notifications": "Les notifications",
"tax_types": "Types de taxe", "tax_types": "Types de taxe",
@ -593,10 +619,90 @@
"state": "Etat", "state": "Etat",
"city": "Ville", "city": "Ville",
"address": "Adresse", "address": "Adresse",
"zip": "Zip", "zip": "Code postal",
"save": "sauver", "save": "Sauvegarder",
"updated_message": "Informations sur la société mises à jour avec succès" "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": { "account_settings": {
"profile_picture": "Image de profil", "profile_picture": "Image de profil",
"name": "Nom", "name": "Nom",
@ -604,7 +710,7 @@
"password": "Mot de passe", "password": "Mot de passe",
"confirm_password": "Confirmez le mot de passe", "confirm_password": "Confirmez le mot de passe",
"account_settings": "Paramètres du compte", "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.", "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" "updated_message": "Paramètres du compte mis à jour avec succès"
}, },
@ -619,10 +725,10 @@
"email": "Envoyer des notifications à", "email": "Envoyer des notifications à",
"description": "Quelles notifications par courrier électronique souhaitez-vous recevoir lorsque quelque chose change?", "description": "Quelles notifications par courrier électronique souhaitez-vous recevoir lorsque quelque chose change?",
"invoice_viewed": "Facture consultée", "invoice_viewed": "Facture consultée",
"invoice_viewed_desc": "Lorsque votre client visualise la facture envoyée via le tableau de bord du cratère.", "invoice_viewed_desc": "Lorsque le client visualise la facture envoyée via le tableau de bord de Neptune.",
"estimate_viewed": "Estimation vue", "estimate_viewed": "Devis consulté",
"estimate_viewed_desc": "Lorsque votre client visualise le devis envoyé via le tableau de bord du cratère.", "estimate_viewed_desc": "Lorsque le client visualise le devis envoyé via le tableau de bord de Neptune.",
"save": "sauver", "save": "Sauvegarder",
"email_save_message": "Email enregistré avec succès", "email_save_message": "Email enregistré avec succès",
"invoice_viewed_message": "Facture consultée", "invoice_viewed_message": "Facture consultée",
"estimate_viewed_message": "Estimation vue", "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.", "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", "add_new_category": "Ajouter une nouvelle catégorie",
"category_name": "Nom de 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", "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", "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", "updated_message": "Catégorie de dépenses mise à jour avec succès",
@ -668,7 +774,7 @@
"discount_setting": "Réglage de remise", "discount_setting": "Réglage de remise",
"discount_per_item": "Remise par article", "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.", "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", "preference": "Préférence | Préférences",
"general_settings": "Préférences par défaut pour le système.", "general_settings": "Préférences par défaut pour le système.",
"updated_message": "Préférences mises à jour avec succès", "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", "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.", "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.", "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": { "wizard": {
@ -774,7 +887,8 @@
"success": { "success": {
"mail_variables_save_successfully": "Email configuré avec succès", "mail_variables_save_successfully": "Email configuré avec succès",
"database_variables_save_successfully": "Base de données configurée avec succès." "database_variables_save_successfully": "Base de données configurée avec succès."
} },
"skip": "sauter"
}, },
"layout_login": { "layout_login": {
"copyright_crater": "Copyright @ Crater - 2020", "copyright_crater": "Copyright @ Crater - 2020",
@ -783,7 +897,6 @@
"small_businesses": "Petites entreprises ", "small_businesses": "Petites entreprises ",
"crater_help": "Crater vous aide à suivre vos dépenses, à enregistrer vos paiements et à générer de belles", "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." "invoices_and_estimates": "factures et devis avec possibilité de choisir plusieurs modèles."
}, },
"validation": { "validation": {
"invalid_url": "URL invalide (ex: http://www.crater.com)", "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.", "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.", "notes_maxlength": "Les notes ne doivent pas dépasser 255 caractères.",
"address_maxlength": "L'adresse ne doit 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

@ -7,7 +7,6 @@ import ar from './ar.json'
import de from './de.json' import de from './de.json'
import pt_BR from './pt-br.json' import pt_BR from './pt-br.json'
import it from './it.json' import it from './it.json'
import nl from './nl.json'
Vue.use(VueI18n) Vue.use(VueI18n)
@ -21,7 +20,6 @@ const i18n = new VueI18n({
de, de,
pt_BR, pt_BR,
it, it,
nl,
}, },
}) })

View File

@ -1,5 +1,5 @@
{ {
"_comment": "Italian - IT translation - by Alessandro Fuda - Milan, Italy - 20/03/2020 - Coronavirus's times But towards spring :-) ", "_comment": "Italian - IT translation - by Alessandro Fuda - Milan, Italy - 20/03/2020 - Coronavirus's times But towards spring :-) ",
"navigation": { "navigation": {
"dashboard": "Dashboard", "dashboard": "Dashboard",
"customers": "Clienti", "customers": "Clienti",
@ -71,14 +71,14 @@
"go_home": "Vai alla Home", "go_home": "Vai alla Home",
"test_mail_conf": "Configurazione della mail di test", "test_mail_conf": "Configurazione della mail di test",
"send_mail_successfully": "Mail inviata con successo", "send_mail_successfully": "Mail inviata con successo",
"setting_updated": "Configurazioni aggiornate con successo", "setting_updated": "Configurazioni aggiornate con successo",
"select_state": "Seleziona lo Stato", "select_state": "Seleziona lo Stato",
"select_country": "Seleziona Paese", "select_country": "Seleziona Paese",
"select_city": "Seleziona Città", "select_city": "Seleziona Città",
"street_1": "Indirizzo 1", "street_1": "Indirizzo 1",
"street_2": "Indirizzo 2", "street_2": "Indirizzo 2",
"action_failed": "Errore" "action_failed": "Errore",
"retry": "Retry"
}, },
"dashboard": { "dashboard": {
"select_year": "Seleziona anno", "select_year": "Seleziona anno",
@ -164,7 +164,7 @@
"select_a_customer": "Seleziona Cliente", "select_a_customer": "Seleziona Cliente",
"type_or_click": "Scrivi o clicca per selezionare", "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", "created_message": "Cliente creato con successo",
"updated_message": "Cliente aggiornato con successo", "updated_message": "Cliente aggiornato con successo",
"deleted_message": "Cliente cancellato con successo | Clienti cancellati con successo" "deleted_message": "Cliente cancellato con successo | Clienti cancellati con successo"
@ -617,85 +617,85 @@
"updated_message": "Informazioni Azienda aggiornate con successo." "updated_message": "Informazioni Azienda aggiornate con successo."
}, },
"customization": { "customization": {
"customization": "personalizzazione", "customization": "personalizzazione",
"save": "Salva", "save": "Salva",
"addresses": { "addresses": {
"title": "Indirizzi", "title": "Indirizzi",
"section_description": "Puoi settare l'indirizzo di fatturazione del Cliente e/o il formato dell'indirizzo di spedizione (Mostrato solo sul PDF). ", "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_billing_address": "Indirizzo Fatturazione Cliente",
"customer_shipping_address": "Indirizzo spedizione Cliente", "customer_shipping_address": "Indirizzo spedizione Cliente",
"company_address": "Indirizzo Azienda", "company_address": "Indirizzo Azienda",
"insert_fields": "Inserisci Campi", "insert_fields": "Inserisci Campi",
"contact": "Contatto", "contact": "Contatto",
"address": "Indirizzo", "address": "Indirizzo",
"display_name": "Mostra nome", "display_name": "Mostra nome",
"primary_contact_name": "Nome contatto primario", "primary_contact_name": "Nome contatto primario",
"email": "Email", "email": "Email",
"website": "Sito web", "website": "Sito web",
"name": "Nome", "name": "Nome",
"country": "Paese", "country": "Paese",
"state": "Stato", "state": "Stato",
"city": "Città", "city": "Città",
"company_name": "Nome Azienda", "company_name": "Nome Azienda",
"address_street_1": "Indirizzo 1", "address_street_1": "Indirizzo 1",
"address_street_2": "Indirizzo 2", "address_street_2": "Indirizzo 2",
"phone": "Telefono", "phone": "Telefono",
"zip_code": "CAP/ZIP Code", "zip_code": "CAP/ZIP Code",
"address_setting_updated": "Indirizzo aggiornato con Successo" "address_setting_updated": "Indirizzo aggiornato con Successo"
}, },
"updated_message": "Info azienda aggiornate con successo", "updated_message": "Info azienda aggiornate con successo",
"invoices": { "invoices": {
"title": "Fatture", "title": "Fatture",
"notes": "Note", "notes": "Note",
"invoice_prefix": "Prefisso Fattura", "invoice_prefix": "Prefisso Fattura",
"invoice_settings": "Impostazioni fattura", "invoice_settings": "Impostazioni fattura",
"autogenerate_invoice_number": "Auto genera numero di 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.", "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", "enter_invoice_prefix": "Inserisci prefisso fattura",
"terms_and_conditions": "Termini e Condizioni", "terms_and_conditions": "Termini e Condizioni",
"invoice_setting_updated": "Impostazioni fatture aggiornate con successo" "invoice_setting_updated": "Impostazioni fatture aggiornate con successo"
}, },
"estimates": { "estimates": {
"title": "Preventivi", "title": "Preventivi",
"estimate_prefix": "Prefisso Preventivi", "estimate_prefix": "Prefisso Preventivi",
"estimate_settings": "Impostazioni Preventivi", "estimate_settings": "Impostazioni Preventivi",
"autogenerate_estimate_number": "Auto-genera Numero di preventivo", "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.", "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", "enter_estimate_prefix": "Inserisci prefisso preventivo",
"estimate_setting_updated": "Impostazioni preventivi aggiornate con successo" "estimate_setting_updated": "Impostazioni preventivi aggiornate con successo"
}, },
"payments": { "payments": {
"title": "Pagamenti", "title": "Pagamenti",
"payment_prefix": "Prefisso Pagamento", "payment_prefix": "Prefisso Pagamento",
"payment_settings": "Impostazioni Pagamento", "payment_settings": "Impostazioni Pagamento",
"autogenerate_payment_number": "Auto genera il numero di 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.", "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", "enter_payment_prefix": "Inserisci prefisso di pagamento",
"payment_setting_updated": "Impostazioni di pagamento aggiornate con successo", "payment_setting_updated": "Impostazioni di pagamento aggiornate con successo",
"payment_mode": "Modalità di pagamento", "payment_mode": "Modalità di pagamento",
"add_payment_mode": "Aggiungi modalità di pagamento", "add_payment_mode": "Aggiungi modalità di pagamento",
"mode_name": "Nome modalità", "mode_name": "Nome modalità",
"payment_mode_added": "Modalità di pagamento aggiunta", "payment_mode_added": "Modalità di pagamento aggiunta",
"payment_mode_updated": "Modalità di pagamento aggiornata", "payment_mode_updated": "Modalità di pagamento aggiornata",
"payment_mode_confirm_delete":"Non potrai ripristinare la modalità di pagamento", "payment_mode_confirm_delete": "Non potrai ripristinare la modalità di pagamento",
"already_in_use": "Modalità di pagamento già in uso", "already_in_use": "Modalità di pagamento già in uso",
"deleted_message": "Payment Mode deleted successfully" "deleted_message": "Payment Mode deleted successfully"
}, },
"items": { "items": {
"title": "Items", "title": "Items",
"units": "unità", "units": "unità",
"add_item_unit": "Aggiungi Unità Item", "add_item_unit": "Aggiungi Unità Item",
"unit_name": "Nome", "unit_name": "Nome",
"item_unit_added": "Unità aggiunta", "item_unit_added": "Unità aggiunta",
"item_unit_updated": "Unità aggiornata", "item_unit_updated": "Unità aggiornata",
"item_unit_confirm_delete":"Non potrai ripristinare questa unità Item", "item_unit_confirm_delete": "Non potrai ripristinare questa unità Item",
"already_in_use": "Unità Item già in uso", "already_in_use": "Unità Item già in uso",
"deleted_message": "Unità item eliminata con successo" "deleted_message": "Unità item eliminata con successo"
} }
}, },
"account_settings": { "account_settings": {
"profile_picture": "Immagine profilo", "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", "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.", "update_success": "L'App è aggiornata! Attendi che la pagina venga ricaricata automaticamente.",
"latest_message": "Nessun aggiornamneto disponibile! Sei già alla versione più recente.", "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": { "wizard": {

View File

@ -1,912 +0,0 @@
{
"navigation": {
"dashboard": "Dashboard",
"customers": "Klanten",
"items": "Artikelen",
"invoices": "Facturen",
"expenses": "Uitgaven",
"estimates": "Offertes",
"payments": "Betalingen",
"reports": "Rapporten",
"settings": "Instellingen",
"logout": "Uitloggen"
},
"general": {
"view_pdf": "Bekijk PDF",
"download_pdf": "Download PDF",
"save": "Opslaan",
"cancel": "Annuleer",
"update": "Bewerk",
"download": "Download",
"from_date": "Van datum",
"to_date": "tot datum",
"from": "Van",
"to": "Naar",
"go_back": "Ga terug",
"back_to_login": "Terug naar inloggen?",
"home": "Home",
"filter": "Filter",
"delete": "Verwijder",
"edit": "Bewerk",
"view": "Bekijk",
"add_new_item": "Nieuw product",
"clear_all": "Alles wissen",
"showing": "Tonen",
"of": "van",
"actions": "Acties",
"subtotal": "SUBTOTAAL",
"discount": "KORTING",
"fixed": "Vast",
"percentage": "Percentage",
"tax": "BTW",
"total_amount": "TOTAAL BEDRAG",
"bill_to": "Factureren aan",
"ship_to": "Verzenden naar",
"due": "Verschuldigd",
"draft": "Concept",
"sent": "Verzonden",
"all": "Alles",
"select_all": "Selecteer Alles",
"choose_file": "Klik hier om een bestand te kiezen",
"choose_template": "Kies een template",
"choose": "Kies",
"remove": "Verwijder",
"powered_by": "Powered by",
"bytefury": "Bytefury",
"select_a_status": "Selecteer een status",
"select_a_tax": "Select een btw",
"search": "Zoek",
"are_you_sure": "Ben je zeker?",
"list_is_empty": "Lijst is leeg.",
"no_tax_found": "Geen btw gevonden!",
"four_zero_four": "404",
"you_got_lost": "Whoops! Je bent verloren!",
"go_home": "Ga naar de homepagina",
"setting_updated": "Instellingen zijn geüpdatet",
"select_state": "Selecteer staat",
"select_country": "Selecteer land",
"select_city": "Selecteer stad",
"street_1": "Straat 1",
"street_2": "Straat 2",
"action_failed": "Actie mislukt",
"sort_by": "sorteer op",
"ascending": "Oplopend",
"descending": "Aflopend",
"subject": "onderwerpen",
"message": "Bericht",
"test_mail_conf": "Test de e-mailconfiguratie",
"send_mail_successfully": "Mail is succesvol verzonden",
},
"dashboard": {
"select_year": "Selecteer jaar",
"cards": {
"due_amount": "Verschuldigd bedrag",
"customers": "Klanten",
"invoices": "Facturen",
"estimates": "Offertes"
},
"chart_info": {
"total_sales": "Verkopen",
"total_receipts": "Ontvangen",
"total_expense": "Uitgaven",
"net_income": "Netto inkomen",
"year": "Selecteer jaar"
},
"weekly_invoices": {
"title": "Wekelijkse facturen"
},
"monthly_chart": {
"title": "Verkopen & uitgaven"
},
"recent_invoices_card": {
"title": "Te betalen facturen",
"due_on": "Verschuldigd op",
"customer": "Klant",
"amount_due": "Verschuldigd bedrag",
"actions": "Acties",
"view_all": "Bekijk alle"
},
"recent_estimate_card": {
"title": "Recente offertes",
"date": "Datum",
"customer": "Klant",
"amount_due": "Verschuldigd Bedrag",
"actions": "Acties",
"view_all": "Bekijk alle"
}
},
"tax_types": {
"name": "Naam",
"description": "Omschrijving",
"percent": "Percentage",
"compound_tax": "Samengestelde Btw"
},
"customers": {
"title": "Klanten",
"add_customer": "Klant toevoegen",
"contacts_list": "Klanten lijst",
"name": "Naam",
"display_name": "Weergavenaam",
"primary_contact_name": "Primaire contactpersoon",
"contact_name": "Contact naam",
"amount_due": "Verschuldigd Bedrag",
"email": "E-mail",
"address": "Adres",
"phone": "Telefoon",
"website": "Website",
"country": "Land",
"state": "Staat",
"city": "Stad",
"zip_code": "Postcode",
"added_on": "Toegevoegd op",
"action": "Actie",
"password": "Wachtwoord",
"street_number": "Straat nummer",
"primary_currency": "Primaire valuta",
"add_new_customer": "Nieuwe klant toevoegen",
"save_customer": "Klant opslaan",
"update_customer": "Klant bewerken",
"customer": "Klant | Klanten",
"new_customer": "Nieuwe Klant",
"edit_customer": "Bewerk Klant",
"basic_info": "Basis info",
"billing_address": "Facturatieadres",
"shipping_address": "Verzendadres",
"copy_billing_address": "Kopieer van facturatie",
"no_customers": "Nog geen klanten!",
"no_customers_found": "Geen klanten gevonden!",
"list_of_customers": "Dit gedeelte bevat de lijst van klanten.",
"primary_display_name": "Primaire weergavenaam",
"select_currency": "Selecteer valuta",
"select_a_customer": "Selecteer een klant",
"type_or_click": "Typ of klik om te selecteren",
"confirm_delete": "Je zal niet in staat zijn om deze klant te herstellen | Je zal niet in staat zijn om deze klanten te herstellen",
"created_message": "Klant succesvol aangemaakt",
"updated_message": "Klant succesvol bijgewerkt",
"deleted_message": "Klant succesvol verwijderd | Klanten succesvol verwijderd"
},
"items": {
"title": "Artikelen",
"items_list": "Artikelen lijst",
"name": "Naam",
"unit": "Eenheid",
"description": "Beschrijving",
"added_on": "Toegevoegd op",
"price": "Prijs",
"date_of_creation": "Datum van aanmaak",
"action": "Actie",
"add_item": "Artikel toevoegen",
"save_item": "Artikel opslaan",
"update_item": "Artikel bewerken",
"item": "Artikel | Artikels",
"add_new_item": "Nieuw artikel toevoegen",
"new_item": "Nieuw artikel",
"edit_item": "Bewerk artikel",
"no_items": "Nog geen artikelen!",
"list_of_items": "Dit gedeelte zal de lijst met artikels bevatten.",
"select_a_unit": "kies een eenheid",
"item_attached_message": "Kan een artikel dat al in gebruik is niet verwijderen",
"confirm_delete": "U zult niet in staat zijn om dit artikel terug te krijgen. | U zult niet in staat zijn om deze artikels terug te krijgen.",
"created_message": "Artikel succesvol aangemaakt",
"updated_message": "Artikel succesvol bijgewerkt",
"deleted_message": "Artikel succesvol verwijderd | Artikels succesvol verwijderd",
"taxes": "Belastingen",
},
"estimates": {
"title": "Offertes",
"estimate": "Offerte | Offertes",
"estimates_list": "Offerte lijst",
"days": "{days} Dagen",
"months": "{months} Maanden",
"years": "{years} Jaren",
"all": "Alles",
"paid": "Betaald",
"unpaid": "Onbetaald",
"customer": "KLANT",
"ref_no": "REF NR.",
"number": "NUMMER",
"amount_due": "VERSCHULDIGD BEDRAG",
"partially_paid": "Gedeeltelijk betaald",
"total": "Totaal",
"discount": "Korting",
"sub_total": "Subtotaal",
"estimate_number": "Offerte Nummer",
"ref_number": "Ref. Nummer",
"contact": "Contact",
"add_item": "Voeg een item toe",
"date": "Datum",
"due_date": "Vervaldatum",
"expiry_date": "Vervaldatum",
"status": "Status",
"add_tax": "Btw toevoegen",
"amount": "Bedrag",
"action": "Actie",
"notes": "Notitie's",
"tax": "Btw",
"estimate_template": "Sjabloon",
"convert_to_invoice": "Omzetten naar factuur",
"mark_as_sent": "Markeer als verzonden",
"send_estimate": "Verzend offerte",
"record_payment": "Record Payment",
"add_estimate": "Offerte toevoegen",
"save_estimate": "Offerte opslaan",
"confirm_conversion": "Wil je deze offerte omzetten in een factuur?",
"conversion_message": "Factuur succesvol aangemaakt",
"confirm_send_estimate": "Deze offerte zal verzonden worden via email naar de klant",
"confirm_mark_as_sent": "Deze offerte zal gemarkeerd worden als verzonden",
"confirm_mark_as_accepted": "Deze offerte zal gemarkeerd worden als geaccepteerd",
"confirm_mark_as_rejected": "Deze offerte zal gemarkeerd worden als afgewezen",
"no_matching_estimates": "Er zijn geen overeenkomende offertes!",
"mark_as_sent_successfully": "Offerte succesvol gemarkeerd als verzonden",
"send_estimate_successfully": "Offerte succesvol verzonden",
"errors": {
"required": "Veld is verplicht"
},
"accepted": "Geaccepteerd",
"sent": "Verzonden",
"draft": "Concept",
"declined": "Geweigerd",
"new_estimate": "Nieuwe offerte",
"add_new_estimate": "Nieuwe offerte toevoegen",
"update_Estimate": "Offerte bijwerken",
"edit_estimate": "Bewerk offerte",
"items": "items",
"Estimate": "Offerte | Offertes",
"add_new_tax": "Nieuwe Btw toevoegen",
"no_estimates": "Nog geen offertes!",
"list_of_estimates": "Dit deel bevat de lijst met offertes.",
"mark_as_rejected": "Markeer als afgewezen",
"mark_as_accepted": "Markeer als geaccepteerd",
"marked_as_accepted_message": "Offerte gemarkeerd als geaccepteerd",
"marked_as_rejected_message": "Offerte gemarkeerd als afgewezen",
"confirm_delete": "U zult niet in staat zijn om deze offerte te herstellen. | U zult niet in staat zijn om deze offertes te herstellen.",
"created_message": "Offerte succesvol aangemaakt",
"updated_message": "Offerte succesvol bijgewerkt",
"deleted_message": "Offerte succesvol verwijderd | Offertes succesvol verwijderd",
"user_email_does_not_exist": "E-mail van de gebruiker bestaat niet",
"something_went_wrong": "er ging iets mis",
"item": {
"title": "Artikel titel",
"description": "Omschrijving",
"quantity": "Aantal",
"price": "Prijs",
"discount": "Korting",
"total": "Totaal",
"total_discount": "Totale korting",
"sub_total": "Subtotaal",
"tax": "Btw",
"amount": "Bedrag",
"select_an_item": "Typ of klik om te selecteren",
"type_item_description": "Type Artikel Omschrijving (optioneel)"
}
},
"invoices": {
"title": "Facturen",
"invoices_list": "Facturen Lijst",
"days": "{days} Dagen",
"months": "{months} Maanden",
"years": "{years} Jaren",
"all": "Alle",
"paid": "Betaald",
"unpaid": "Onbetaald",
"customer": "KLANT",
"paid_status": "BETAALD STATUS",
"ref_no": "REF NR.",
"number": "NUMMER",
"amount_due": "BEDRAG VERSCHULDIGD",
"partially_paid": "Gedeeltelijk betaald",
"total": "Totaal",
"discount": "Korting",
"sub_total": "Subtotaal",
"invoice": "Factuur | Facturen",
"invoice_number": "Factuurnummer",
"ref_number": "Ref. Nummer",
"contact": "Contact",
"add_item": "Artikel toevoegen",
"date": "Datum",
"due_date": "Vervaldatum",
"status": "Status",
"add_tax": "Add Btw",
"amount": "Bedrag",
"action": "Actie",
"notes": "Notie's",
"view": "Bekijk",
"send_invoice": "Verstuur Factuur",
"invoice_template": "Factuur Sjabloon",
"template": "Sjabloon",
"mark_as_sent": "Markeer als verzonden",
"confirm_send_invoice": "Deze factuur wordt per e-mail naar de klant gestuurd",
"invoice_mark_as_sent": "Deze factuur wordt gemarkeerd als verzonden",
"confirm_send": "Deze factuur wordt per e-mail naar de klant gestuurd",
"invoice_date": "Factuurdatum",
"record_payment": "Record Payment",
"add_new_invoice": "Nieuwe factuur toevoegen",
"update_expense": "Bewerk Uitgaven",
"edit_invoice": "Bewerk Factuur",
"new_invoice": "Nieuw Factuur",
"save_invoice": "Factuur opslaan",
"update_invoice": "Bewerk Factuur",
"add_new_tax": "Nieuwe Btw toevoegen",
"no_invoices": "Nog geen facturen!",
"list_of_invoices": "Dit gedeelte bevat de lijst met facturen.",
"select_invoice": "Selecteer factuur",
"no_matching_invoices": "Er zijn geen overeenkomstige facturen!",
"mark_as_sent_successfully": "Factuur succesvol gemarkeerd als verzonden",
"send_invoice_successfully": "Factuur succesvol verzonden",
"item": {
"title": "Artikel titel",
"description": "Omschrijving",
"quantity": "Aantal",
"price": "Prijs",
"discount": "Korting",
"total": "Totaal",
"total_discount": "Totale korting",
"sub_total": "Subtotaal",
"tax": "Btw",
"amount": "Bedrag",
"select_an_item": "Typ of klik om te selecteren",
"type_item_description": "Type Artikel omschrijving (optioneel)"
},
"payment_attached_message": "Een van de geselecteerde facturen is al aan een betaling gekoppeld. Zorg ervoor dat u de bijgevoegde betalingen eerst verwijderd om door te kunnen gaan met de verwijdering.",
"confirm_delete": "U zult deze factuur niet kunnen herstellen | U zult deze facturen niet kunnen herstellen",
"created_message": "Factuur succesvol aangemaakt ",
"updated_message": "Factuur succesvol bijgewerkt ",
"deleted_message": "Factuur succesvol verwijderd | Facturen succesvol verwijderd",
"marked_as_sent_message": "Factuur succesvol gemarkeerd als verzonden",
"user_email_does_not_exist": "E-mail van de gebruiker bestaat niet",
"something_went_wrong": "er ging iets mis",
"invalid_due_amount_message": "Het totale factuurbedrag kan niet lager zijn dan het totale betaalde bedrag voor deze factuur. Gelieve de factuur bij te werken of de bijhorende betalingen te verwijderen om verder te kunnen gaan.",
"cloned_successfully": "Factuur succesvol gekloond",
"clone_invoice": "Factuur klonen",
"confirm_clone": "Deze factuur wordt gekloond in een nieuwe factuur",
},
"credit_notes": {
"title": "Creditnota's",
"credit_notes_list": "Creditnota's lijst",
"credit_notes": "Creditnota's",
"contact": "Contact",
"date": "Datum",
"amount": "Bedrag",
"action": "Actie",
"credit_number": "Credit Nummer",
"notes": "Notie's",
"confirm_delete": "Wil je deze Creditnota verwijderen?",
"item": {
"title": "Artikel titel",
"description": "Omschrijving",
"quantity": "Aantal",
"price": "Prijs",
"discount": "Korting",
"total": "Totaal",
"total_discount": "Totale korting",
"sub_total": "Subtotaal",
"tax": "Btw"
}
},
"payments": {
"title": "Betalingen",
"payments_list": "Betalingen lijst",
"record_payment": "Record Betaling",
"customer": "Klant",
"date": "Datum",
"amount": "Bedrag",
"action": "Actie",
"payment_number": "betaling Nummer",
"payment_mode": "Betalingswijze",
"invoice": "Factuur",
"note": "Notitie",
"add_payment": "Betaling toevoegen",
"new_payment": "Nieuwe betaling",
"edit_payment": "Betaling bewerken",
"view_payment": "Betaling bekijken",
"add_new_payment": "Nieuwe betaling toevoegen",
"save_payment": "Betaling opslaan",
"update_payment": "Betaling bewerken",
"payment": "Betaling | Betalingen",
"no_payments": "Nog geen betalingen!",
"list_of_payments": "Dit gedeelte bevat de lijst met betalingen.",
"select_payment_mode": "Selecteer betalingswijze",
"confirm_delete": "U zult deze betaling niet kunnen herstellen | U zult deze betalingen niet kunnen herstellen",
"created_message": "Betaling succesvol aangemaakt",
"updated_message": "Betaling succesvol bijgewerkt",
"deleted_message": "Betaling succesvol verwijderd | Betalingen succesvol verwijderd",
"invalid_amount_message": "Betalingsbedrag is ongeldig",
"send_payment_receipt": "Betaalbewijs verzenden",
"confirm_send_payment": "Deze betaling wordt via e-mail naar de klant gestuurd",
"send_payment_successfully": "Betaling succesvol verzonden",
"user_email_does_not_exist": "E-mailadres van gebruiker bestaat niet",
"something_went_wrong": "Er is iets fout gegaan",
},
"expenses": {
"title": "Uitgaven",
"expenses_list": "Uitgaven lijst",
"expense_title": "Titel",
"contact": "Contact",
"category": "Categorie",
"from_date": "Van Datum",
"to_date": "Tot Datum",
"expense_date": "Datum",
"description": "Omschrijving",
"receipt": "Bewijs",
"amount": "Bedrag",
"action": "Actie",
"note": "Notitie",
"category_id": "Categorie Id",
"date": "Uitgave datum",
"add_expense": "Uitgave toevoegen",
"add_new_expense": "Nieuwe uitgave toevoegen",
"save_expense": "Uitgave opslaan",
"update_expense": "Uitgave bewerken",
"download_receipt": "Download Bewijs",
"edit_expense": "Bewerk uitgave",
"new_expense": "Nieuwe uitgave",
"expense": "Uitgave | Uitgaven",
"no_expenses": "Nog geen uitgaven!",
"list_of_expenses": "Dit gedeelte bevat de lijst met uitgaven.",
"confirm_delete": "U zult niet in staat zijn om deze uitgave te herstellen | U zult niet in staat zijn om deze uitgaven te herstellen",
"created_message": "Uitgave succesvol aangemaakt",
"updated_message": "Uitgave succesvol bijgewerkt",
"deleted_message": "Uitgave succesvol verwijderd | Uitgaven succesvol verwijderd",
"select_a_customer": "Selecteer een klant",
"customer": "Klanten",
"categories": {
"categories_list": "Categories Lijst",
"title": "Titel",
"name": "Naam",
"description": "Omschrijving",
"amount": "Bedrag",
"actions": "Acties",
"add_category": "Categorie toevoegen",
"new_category": "Nieuwe categorie",
"category": "Categorie | Categorieën",
"select_a_category": "Selecteer een categorie"
}
},
"login": {
"email": "E-mail",
"password": "Wachtwoord",
"forgot_password": "Wachtwoord vergeten?",
"or_signIn_with": "of aanmelden met",
"login": "Aanmelden",
"register": "Registreer",
"reset_password": "Wachtwoord resetten",
"password_reset_successfully": "Wachtwoord succesvol gereset",
"enter_email": "Voer e-mail in",
"enter_password": "Voer wachtwoord in",
"retype_password": "Herhaal wachtwoord",
"login_placeholder": "mail@example.com"
},
"reports": {
"title": "Rapport",
"from_date": "Van Datum",
"to_date": "Tot Datum",
"status": "Status",
"paid": "Betaald",
"unpaid": "Onbetaald",
"download_pdf": "Download PDF",
"view_pdf": "Bekijk PDF",
"update_report": "Bewerk Rapport",
"report": "Rapport | Rapporten",
"profit_loss": {
"profit_loss": "Winst & Verlies",
"to_date": "Tot Datum",
"from_date": "Van Datum",
"date_range": "Selecteer Datumbereik"
},
"sales": {
"sales": "Verkopen",
"date_range": "Selecteer Datumbereik",
"to_date": "Tot Datum",
"from_date": "Van Datum",
"report_type": "Rapport Type"
},
"taxes": {
"taxes": "BTW",
"to_date": "Tot Datum",
"from_date": "Van Datum",
"date_range": "Selecteer Datumbereik"
},
"errors": {
"required": "Veld is verplicht"
},
"invoices": {
"invoice": "Factuur",
"invoice_date": "Factuurdatum",
"due_date": "Vervaldatum",
"amount": "Bedrag",
"contact_name": "Naam contactpersoon",
"status": "Status"
},
"estimates": {
"estimate": "Offerte",
"estimate_date": "Offertedatum",
"due_date": "Vervaldatum",
"estimate_number": "Offerte nummer",
"ref_number": "Ref. Nummer",
"amount": "Bedrag",
"contact_name": "Naam contactpersoon",
"status": "Status"
},
"expenses": {
"expenses": "Uitgaven",
"category": "Categorie",
"date": "Datum",
"amount": "Bedrag",
"to_date": "Tot Datum",
"from_date": "Van Datum",
"date_range": "Selecteer Datumbereik"
}
},
"settings": {
"items": {
"title": "Artikelen",
"units": "eenheden",
"add_item_unit": "Itemeenheid toevoegen",
"unit_name": "Naam eenheid",
"item_unit_added": "Item Unit toegevoegd",
"item_unit_updated": "Artikeleenheid geüpdatet",
"item_unit_confirm_delete": "U kunt dit item niet terughalen",
"already_in_use": "Item Unit is al in gebruik",
"deleted_message": "Artikeleenheid succesvol verwijderd"
},
"menu_title": {
"account_settings": "Account Instellingen",
"company_information": "Bedrijfsinformatie",
"customization": "Customizatie",
"preferences": "Voorkeuren",
"notifications": "Notificaties",
"tax_types": "Btw Types",
"expense_category": "Uitgave Categories",
"update_app": "Bewerk App"
},
"title": "Instellingen",
"setting": "Instellingen | Instellingen",
"general": "Algemeen",
"language": "Taal",
"primary_currency": "Primaire valuta",
"timezone": "Tijdszone",
"date_format": "Datum formaat",
"currencies": {
"title": "Valuta's",
"currency": "Valuta | Valuta's",
"currencies_list": "Valuta's lijst",
"select_currency": "Selecteer Valuta",
"name": "Naam",
"code": "Code",
"symbol": "Symbool",
"precision": "Precisie",
"thousand_separator": "Thousand Separator",
"decimal_separator": "Decimal Separator",
"position": "Positie",
"position_of_symbol": "Positie van symbool",
"right": "Rechts",
"left": "Links",
"action": "Actie",
"add_currency": "Valuta toevoegen"
},
"mail": {
"host": "Mail Host",
"port": "Mail Port",
"driver": "Mail Driver",
"secret": "Geheim",
"mailgun_secret": "Mailgun Geheim",
"mailgun_domain": "Domein",
"mailgun_endpoint": "Mailgun Endpoint",
"ses_secret": "SES Secret",
"ses_key": "SES Key",
"password": "Mail Wachtwoord",
"username": "Mail Gebruikersnaam",
"mail_config": "Mail configuratie",
"from_name": "Van Mail Naam",
"from_mail": "Van Mail Adres",
"encryption": "Mail Encryptie",
"mail_config_desc": "Hieronder vindt u het formulier voor het configureren van het e-mailstuurprogramma voor het verzenden van e-mails vanuit de app. U kunt ook externe leveranciers zoals Sendgrid, SES etc. configureren."
},
"pdf": {
"title": "PDF Instellingen",
"footer_text": "Voettekst",
"pdf_layout": "PDF Layout"
},
"company_info": {
"company_info": "Bedrijfsinformatie",
"company_name": "Bedrijfsnaam",
"company_logo": "bedrijfslogo",
"section_description": "Informatie over uw bedrijf die zal worden weergegeven op facturen, offertes en andere documenten gemaakt door Crater.",
"phone": "Telefoon",
"country": "Land",
"state": "Staat",
"city": "Stad",
"address": "Adres",
"zip": "Postcode",
"save": "Opslaan",
"updated_message": "Bedrijfsinformatie succesvol bijgewerkt"
},
"customization": {
"customization": "Customizatie",
"save": "Opslaan",
"addresses": {
"title": "Adressen",
"section_description": "U kan het formaat Klant Factuuradres en Klant Leveradres instellen (Alleen weergegeven in PDF). ",
"customer_billing_address": "Factuuradres van de klant",
"customer_shipping_address": "Verzendadres van de klant",
"company_address": "Bedrijfsadres",
"insert_fields": "Velden invoegen",
"contact": "Contactpersoon",
"address": "Adres",
"display_name": "Weergavenaam",
"primary_contact_name": "Primair contactpersoon naam",
"email": "E-mail",
"website": "Website",
"name": "Naam",
"country": "Land",
"state": "Staat",
"city": "Stad",
"company_name": "Bedrijfsnaam",
"address_street_1": "Adres straat 1",
"address_street_2": "Adres straat 2",
"phone": "Telefoon",
"zip_code": "Postcode",
"address_setting_updated": "Adres instellingen succesvol bijgewerkt"
},
"updated_message": "Adres informatie succesvol bijgewerkt",
"invoices": {
"title": "Facturen",
"notes": "Notie's",
"invoice_prefix": "Factuur Prefix",
"invoice_settings": "Factuur instellingen",
"autogenerate_invoice_number": "Autogenereer Factuurnummer",
"invoice_setting_description": "Schakel dit uit, Als u niet elke keer dat u een nieuwe factuur aanmaakt automatisch factuurnummers wilt genereren.",
"enter_invoice_prefix": "Voer factuur prefix in",
"terms_and_conditions": "Algemene voorwaarden",
"invoice_setting_updated": "Factuur instellingen succesvol bijgewerkt"
},
"estimates": {
"title": "Offertes",
"estimate_prefix": "Offerte Prefix",
"estimate_settings": "Offerte instellingen",
"autogenerate_estimate_number": "Autogenereer offertenummer",
"estimate_setting_description": "Schakel dit uit, Als u niet elke keer dat u een nieuwe offerte aanmaakt automatisch offertenummers wilt genereren.",
"enter_estimate_prefix": "Voer offerte prefix in",
"estimate_setting_updated": "Offerte instellingen succesvol bijgewerkt"
},
"payments": {
"title": "Betalingen",
"payment_prefix": "Betaling Prefix",
"payment_settings": "Betalingsinstellingen",
"autogenerate_payment_number": "Autogenereer betalingsnummer",
"payment_setting_description": "Schakel dit uit, Als u niet elke keer dat u een nieuwe betaling aanmaakt automatisch betalingsnummers wilt genereren.",
"enter_payment_prefix": "Voer betaling prefix in",
"payment_setting_updated": "Betaling instellingen succesvol bijgewerkt",
"payment_mode": "Betalingsmiddel",
"add_payment_mode": "Betaalmodus toevoegen",
"mode_name": "Mode Name",
"payment_mode_added": "Betaalmethode toegevoegd",
"payment_mode_updated": "Betalingsmodus geüpdatet",
"payment_mode_confirm_delete": "U kunt deze betalingsmodus niet herstellen",
"already_in_use": "De betalingsmodus is al in gebruik",
"deleted_message": "Betaalmethode succesvol verwijderd"
}
},
"account_settings": {
"profile_picture": "Profielfoto",
"name": "Naam",
"email": "E-mail",
"password": "Wachtwoord",
"confirm_password": "Bevestig wachtwoord",
"account_settings": "Account Instellingen",
"save": "Opslaan",
"section_description": "U kunt uw naam, e-mail en wachtwoord updaten met behulp van het onderstaande formulier.",
"updated_message": "Account instellingen succesvol bijgewerkt"
},
"user_profile": {
"name": "Naam",
"email": "E-mail",
"password": "Wachtwoord",
"confirm_password": "Bevestig wachtwoord"
},
"notification": {
"title": "Notificatie",
"email": "Zend notificatie naar",
"description": "Welke e-mailmeldingen wilt u ontvangen als er iets verandert?",
"invoice_viewed": "Factuur bekeken",
"invoice_viewed_desc": "Wanneer uw klant de factuur bekijkt die via het Crater dashboard is verstuurd.",
"estimate_viewed": "Offerte bekeken",
"estimate_viewed_desc": "Wanneer uw klant de offerte bekijkt die via het Crater dashboard is verstuurd.",
"save": "Opslaan",
"email_save_message": "E-mail succesvol opgeslaan",
"please_enter_email": "Vul a.u.b. e-mail in"
},
"tax_types": {
"title": "Btw Types",
"add_tax": "Add Btw",
"description": "U kunt naar keuze btw toevoegen of verwijderen. Crater ondersteunt btw op individuele items en op de factuur.",
"add_new_tax": "Nieuwe Btw toevoegen",
"tax_settings": "Btw instellingen",
"tax_per_item": "Btw per artikel",
"tax_name": "Btw naam",
"compound_tax": "Samengestelde btw",
"percent": "Percentage",
"action": "Actie",
"tax_setting_description": "Schakel dit in als u btw wilt toevoegen aan individuele factuurposten. Standaard worden de belastingen direct aan de factuur toegevoegd.",
"created_message": "btw type succesvol aangemaakt",
"updated_message": "btw type succesvol bijgewerkt",
"deleted_message": "btw type succesvol verwijderd",
"confirm_delete": "U zult niet in staat zjin om dit btw type te herstellen",
"already_in_use": "Btw al in gebruik"
},
"expense_category": {
"title": "Uitgavencategorieën",
"action": "Actie",
"description": "Voor het toevoegen van uitgavenposten zijn categorieën vereist. U kunt deze categorieën naar keuze toevoegen of verwijderen.",
"add_new_category": "Nieuwe categorie toevoegen",
"category_name": "Categorienaam",
"category_description": "Omschrijving",
"created_message": "Uitgavencategorie succesvol aangemaakt",
"deleted_message": "Uitgavencategorie succesvol verwijderd",
"updated_message": "Uitgavencategorie succesvol bijgewerkt",
"confirm_delete": "U zult niet in staat zijn om deze uitgavencategorie te herstellen",
"already_in_use": "Categorie is al in gebruik"
},
"preferences": {
"currency": "Valuta",
"language": "Taal",
"time_zone": "Tijdzone",
"fiscal_year": "Boekjaar",
"date_format": "Datum Formaat",
"discount_setting": "Korting instelling",
"discount_per_item": "Korting per Artikel ",
"discount_setting_description": "Schakel dit in als u korting wilt toevoegen aan individuele factuurartikelen. Standaard wordt Korting direct aan de factuur toegevoegd.",
"save": "Opslaan",
"preference": "Voorkeur | Voorkeuren",
"general_settings": "Standaard voorkeuren voor het systeem.",
"updated_message": "Voorkeuren succesvol bijgewerkt",
"select_language": "selecteer taal",
"select_time_zone": "selecteer Tijdzone",
"select_date_formate": "selecteer Datum formaat",
"select_financial_year": "selecteer boekjaar"
},
"update_app": {
"title": "App bijwerken",
"description": "U kunt Crater eenvoudig updaten door te controleren of er een nieuwe update is door op onderstaande knop te klikken.",
"check_update": "Controleer op updates",
"avail_update": "Nieuwe update beschikbaar",
"next_version": "Volgende versie",
"update": "Update nu",
"update_progress": "Update in behandeling...",
"progress_text": "Het zal slechts een paar minuten duren. Gelieve het scherm niet te verversen of het venster te sluiten voordat de update is voltooid.",
"update_success": "App is geüpdatet! Wacht even terwijl uw browser automatisch wordt herladen..",
"latest_message": "Geen update beschikbaar! U zit op de laatste versie.",
"current_version": "Huidige versie"
}
},
"wizard": {
"account_info": "Account Informatie",
"account_info_desc": "Hieronder worden de gegevens gebruikt om de hoofdadministrator-account aan te maken. Ook kunt u de gegevens op elk moment na het inloggen wijzigen.",
"name": "Naam",
"email": "E-mail",
"password": "Wachtwoord",
"confirm_password": "Bevestig wachtwoord",
"save_cont": "Opslaan & doorgaan",
"company_info": "Bedrijfsinformatie",
"company_info_desc": "Deze informatie wordt op de facturen weergegeven. Merk op dat u dit later op de instellingenpagina kunt bewerken.",
"company_name": "Bedrijfsnaam",
"company_logo": "Bedrijfslogo",
"logo_preview": "Logo Voorbeeld",
"preferences": "Voorkeuren",
"preferences_desc": "Standaard voorkeuren voor het systeem.",
"country": "Land",
"state": "Staat",
"city": "Stad",
"address": "Adres",
"street": "Straat1 | Straatt2",
"phone": "Telefoon",
"zip_code": "Postcode",
"go_back": "Ga Terug",
"currency": "Valuta",
"language": "Taal",
"time_zone": "Tijdzone",
"fiscal_year": "Boekjaar",
"date_format": "Datum Formaat",
"from_address": "Van Adres",
"username": "Gebruikersnaam",
"next": "Volgende",
"continue": "Doorgaan",
"skip": "Sla over",
"database": {
"database": "Site URL & Database",
"connection": "Database Connectie",
"host": "Database Host",
"port": "Database Port",
"password": "Database Wachtwoord",
"app_url": "App URL",
"username": "Database Gebruikersnaam",
"db_name": "Database Naam",
"desc": "Maak een database aan op de server en vul de referenties in in het formulier."
},
"permissions": {
"permissions": "Rechten",
"permission_confirm_title": "Ben je zeker dat je wilt doorgaan?",
"permission_confirm_desc": "Toestemmingscheck van de map is mislukt",
"permission_desc": "Hieronder staat de lijst met mapmachtigingen die nodig zijn om de app te laten werken. Als de toestemmingscontrole mislukt, zorg er dan voor dat u uw mapmachtigingen bijwerkt."
},
"mail": {
"host": "Mail Host",
"port": "Mail Port",
"driver": "Mail Driver",
"secret": "Geheim",
"mailgun_secret": "Mailgun Geheim",
"mailgun_domain": "Domein",
"mailgun_endpoint": "Mailgun Endpoint",
"ses_secret": "SES Geheim",
"ses_key": "SES Sleutel",
"password": "Mail Wachtwoord",
"username": "Mail Gebruikersnaam",
"mail_config": "Mail Configuratie",
"from_name": "Van Mail Naam",
"from_mail": "Van Mail Adres",
"encryption": "Mail Encryptie",
"mail_config_desc": "Hieronder vindt u het formulier voor het configureren van het e-mailstuurprogramma voor het verzenden van e-mails vanuit de app. U kunt ook externe providers zoals Sendgrid, SES etc. configureren."
},
"req": {
"system_req": "Systeemvereisten",
"php_req_version": "Php (versie {version} verplicht)",
"check_req": "Controleer vereisten",
"system_req_desc": "Crater heeft een paar serververeisten. Zorg ervoor dat uw server de vereiste php-versie en alle hieronder vermelde extensies heeft."
},
"errors": {
"migrate_failed": "Migratie Mislukt",
"database_variables_save_error": "Niet in staat om verbinding te maken met de DB met de voorziene waarden.",
"mail_variables_save_error": "E-mail configuratie mislukt.",
"connection_failed": "Database connectie mislukt",
"database_should_be_empty": "Database moet leeg zijn"
},
"success": {
"mail_variables_save_successfully": "E-mail succesvol geconfigureerd",
"database_variables_save_successfully": "Database succesvol geconfigureerd."
}
},
"layout_login": {
"copyright_crater": "Copyright @ Crater - 2019",
"super_simple_invoicing": "Super eenvoudige facturatie",
"for_freelancer": "voor Freelancers &",
"small_businesses": "Kleine bedrijven ",
"crater_help": "Crater helpt u bij het bijhouden van de uitgaven, het registreren van betalingen & het genereren van mooie",
"invoices_and_estimates": "facturen & offertes met de mogelijkheid te kiezen uit meerdere sjablonen."
},
"validation": {
"invalid_url": "Ongeldige url (ex: http://www.crater.com)",
"required": "Veld is verplicht",
"email_incorrect": "Onjuist E-mail.",
"email_already_taken": "De e-mail is reeds ingenomen.",
"email_does_not_exist": "Gebruiker met opgegeven e-mail bestaat niet",
"send_reset_link": "Verstuur Reset Link",
"not_yet": "Nog niet? Verstuur opnieuw.",
"password_min_length": "Wachtwoord moet {count} karakters bevatten",
"name_min_length": "Naam moet tenminste {count} letters bevatten.",
"enter_valid_tax_rate": "Voer een geldig btw tarief in",
"numbers_only": "Alleen nummers.",
"characters_only": "Alleen karakters.",
"password_incorrect": "Wachtwoorden moeten identiek zijn",
"password_length": "Wachtwoord moet {count} karakters lang zijn.",
"qty_must_greater_than_zero": "Hoeveelheid moet groter zijn dan nul.",
"price_greater_than_zero": "Prijs moet groter zijn dan nul.",
"payment_greater_than_zero": "Betaling moet groter zijn dan nul.",
"payment_greater_than_due_amount": "Ingevoerde betaling is meer dan het verschuldigde bedrag van deze factuur.",
"quantity_maxlength": "De hoeveelheid mag niet groter zijn dan 20 cijfers.",
"price_maxlength": "De prijs mag niet hoger zijn dan 20 cijfers.",
"price_minvalue": "De prijs moet groter zijn dan 0.",
"amount_maxlength": "Het bedrag mag niet groter zijn dan 20 cijfers.",
"amount_minvalue": "Bedrag moet groter zijn dan 0.",
"description_maxlength": "De beschrijving mag niet groter zijn dan 255 tekens.",
"maximum_options_error": "Maximum van {max} opties geselecteerd. Verwijder eerst een geselecteerde optie om een andere te selecteren.",
"notes_maxlength": "Notities mogen niet groter zijn dan 255 tekens.",
"address_maxlength": "Het adres mag niet groter zijn dan 255 tekens.",
"ref_number_maxlength": "Ref. Nummer mag niet groter zijn dan 255 tekens.",
"prefix_maxlength": "prefix mag niet groter zijn dan 5 karakters.",
"item_unit_already_taken": "De naam van dit item is al in gebruik",
"payment_mode_already_taken": "Deze naam voor de betalingsmodus is al in gebruik",
"subject_maxlength": "Het onderwerp mag niet meer dan 100 tekens bevatten.",
"message_maxlength": "Bericht mag niet groter zijn dan 255 tekens.",
"something_went_wrong": "Er is iets fout gegaan"
}
}

View File

@ -62,14 +62,14 @@
"four_zero_four": "404", "four_zero_four": "404",
"you_got_lost": "Ops! Se perdeu!", "you_got_lost": "Ops! Se perdeu!",
"go_home": "Ir para Home", "go_home": "Ir para Home",
"setting_updated": "Configuração atualizada com sucesso", "setting_updated": "Configuração atualizada com sucesso",
"select_state": "Selecione Estado", "select_state": "Selecione Estado",
"select_country": "Selecionar pais", "select_country": "Selecionar pais",
"select_city": "Selecionar cidade", "select_city": "Selecionar cidade",
"street_1": "Rua 1", "street_1": "Rua 1",
"street_2": "Rua # 2", "street_2": "Rua # 2",
"action_failed": "Ação: Falhou" "action_failed": "Ação: Falhou",
"retry": "Atualização falhou"
}, },
"dashboard": { "dashboard": {
"select_year": "Selecione Ano", "select_year": "Selecione Ano",
@ -155,7 +155,7 @@
"select_a_customer": "Selecione um cliente", "select_a_customer": "Selecione um cliente",
"type_or_click": "Digite ou clique para selecionar", "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", "created_message": "Cliente criado com sucesso",
"updated_message": "Cliente atualizado com sucesso", "updated_message": "Cliente atualizado com sucesso",
"deleted_message": "Cliente excluído com sucesso | Clientes excluídos com sucesso" "deleted_message": "Cliente excluído com sucesso | Clientes excluídos com sucesso"
@ -528,7 +528,7 @@
"date_range": "Selecionar período" "date_range": "Selecionar período"
} }
}, },
"settings": { "settings": {
"menu_title": { "menu_title": {
"account_settings": "Configurações da conta", "account_settings": "Configurações da conta",
"company_information": "Informações da Empresa", "company_information": "Informações da Empresa",
@ -602,281 +602,288 @@
"updated_message": "Informações da Empresa atualizadas com sucesso" "updated_message": "Informações da Empresa atualizadas com sucesso"
}, },
"customization": { "customization": {
"customization": "Personalizar", "customization": "Personalizar",
"save": "Salvar", "save": "Salvar",
"addresses": { "addresses": {
"title": "Endereço", "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).", "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_billing_address": "Endereço de Cobrança do Cliente",
"customer_shipping_address": "Endereço de Entrega do Cliente", "customer_shipping_address": "Endereço de Entrega do Cliente",
"company_address": "Endereço da Empresa", "company_address": "Endereço da Empresa",
"insert_fields": "Inserir Campos", "insert_fields": "Inserir Campos",
"contact": "Contato", "contact": "Contato",
"address": "Endereço", "address": "Endereço",
"display_name": "Nome em Exibição", "display_name": "Nome em Exibição",
"primary_contact_name": "Nome do Contato Principal", "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",
"email": "Email", "email": "Email",
"password": "Senha", "website": "Website",
"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", "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", "country": "Pais",
"state": "Estado", "state": "Estado",
"city": "Cidade", "city": "Cidade",
"address": "Endereço", "company_name": "Nome da Empresa",
"street": "Rua 1 | Rua 2", "address_street_1": "Endereço Rua 1",
"address_street_2": "Endereço Rua 2",
"phone": "Telefone", "phone": "Telefone",
"zip_code": "CEP", "zip_code": "CEP",
"go_back": "Voltar", "address_setting_updated": "Configuração de Endereço Atualizada com Sucesso"
"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": { "updated_message": "Informações da Empresa atualizadas com sucesso",
"copyright_crater": "Copyright @ Crater - 2020",
"super_simple_invoicing": "Faturamento super simples", "invoices": {
"for_freelancer": "Para Freelancers &", "title": "Faturas",
"small_businesses": "Pequenos Negócios ", "notes": "Notas",
"crater_help": "Crater ajuda a rastrear despesas, registrar pagamentos e gerar belas", "invoice_prefix": "Fatura Prefixo",
"invoices_and_estimates": "Faturas e Orçamentos com capacidade de escolher vários modelos." "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)", "estimates": {
"required": "Campo obrigatório", "title": "Orçamentos",
"email_incorrect": "E-mail incorreto", "estimate_prefix": "Orçamento Prefixo",
"email_already_taken": "O email já foi recebido.", "estimate_settings": "Configurações do Orçamento",
"email_does_not_exist": "O usuário com determinado email não existe", "autogenerate_estimate_number": "Gerar automaticamente o número do Orçamento",
"send_reset_link": "Enviar link de redefinição", "estimate_setting_description": "Desative isso, se você não deseja gerar automaticamente números do Orçamento sempre que criar um novo.",
"not_yet": "Ainda não? Envie novamente", "enter_estimate_prefix": "Digite o prefixo do Orçamento",
"password_min_length": "A senha deve conter {count} caracteres", "estimate_setting_updated": "Configuração do Orçamento atualizada com sucesso"
"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.", "payments": {
"characters_only": "Apenas Caracteres.", "title": "Pagamentos",
"password_incorrect": "As senhas devem ser idênticas", "payment_prefix": "Pagamento Prefixo",
"password_length": "A senha deve ter {count} caracteres.", "payment_settings": "Configurações de Pagamento",
"qty_must_greater_than_zero": "A quantidade deve ser maior que zero.", "autogenerate_payment_number": "Gerar automaticamente número do Pagamento",
"price_greater_than_zero": "O preço deve ser maior que zero.", "payment_setting_description": "Desative isso, se você não deseja gerar automaticamente números do Pagamento sempre que criar um novo.",
"payment_greater_than_zero": "O pagamento deve ser maior que zero.", "enter_payment_prefix": "Digite o Prefixo do Pagamento",
"payment_greater_than_due_amount": "O pagamento inserido é mais do que o valor devido desta fatura.", "payment_setting_updated": "Configurações de Pagamento atualizada com sucesso"
"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."
} }
},
"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) { [types.ADD_ITEM_UNIT] (state, data) {
state.itemUnits.push(data.unit)
state.itemUnits = [data.unit, ...state.itemUnits] state.itemUnits = [data.unit, ...state.itemUnits]
}, },

View File

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

View File

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

View File

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

View File

@ -1,7 +1,7 @@
<template> <template>
<div v-if="estimate" class="main-content estimate-view-page"> <div v-if="estimate" class="main-content estimate-view-page">
<div class="page-header"> <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="page-actions row">
<div class="col-xs-2 mr-3"> <div class="col-xs-2 mr-3">
<base-button <base-button
@ -26,19 +26,42 @@
{{ $t('estimates.send_estimate') }} {{ $t('estimates.send_estimate') }}
</base-button> </base-button>
</div> </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="#"> <a slot="activator" href="#">
<base-button color="theme"> <base-button color="theme">
<font-awesome-icon icon="ellipsis-h" /> <font-awesome-icon icon="ellipsis-h" />
</base-button> </base-button>
</a> </a>
<v-dropdown-item> <v-dropdown-item>
<router-link :to="{path: `/admin/estimates/${$route.params.id}/edit`}" class="dropdown-item"> <div class="dropdown-item" @click="copyPdfUrl()">
<font-awesome-icon :icon="['fas', 'pencil-alt']" class="dropdown-item-icon"/> <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') }} {{ $t('general.edit') }}
</router-link> </router-link>
<div class="dropdown-item" @click="removeEstimate($route.params.id)"> <div
<font-awesome-icon :icon="['fas', 'trash']" class="dropdown-item-icon" /> class="dropdown-item"
@click="removeEstimate($route.params.id)"
>
<font-awesome-icon
:icon="['fas', 'trash']"
class="dropdown-item-icon"
/>
{{ $t('general.delete') }} {{ $t('general.delete') }}
</div> </div>
</v-dropdown-item> </v-dropdown-item>
@ -57,14 +80,18 @@
align-icon="right" align-icon="right"
@input="onSearched()" @input="onSearched()"
/> />
<div <div class="btn-group ml-3" role="group" aria-label="First group">
class="btn-group ml-3" <v-dropdown
role="group" :close-on-select="false"
aria-label="First group" align="left"
> class="filter-container"
<v-dropdown :close-on-select="false" align="left" class="filter-container"> >
<a slot="activator" href="#"> <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" /> <font-awesome-icon icon="filter" />
</base-button> </base-button>
</a> </a>
@ -80,8 +107,10 @@
class="inv-radio" class="inv-radio"
value="estimate_date" value="estimate_date"
@change="onSearched" @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>
<div class="filter-items"> <div class="filter-items">
<input <input
@ -92,8 +121,10 @@
class="inv-radio" class="inv-radio"
value="expiry_date" value="expiry_date"
@change="onSearched" @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>
<div class="filter-items"> <div class="filter-items">
<input <input
@ -104,11 +135,19 @@
class="inv-radio" class="inv-radio"
value="estimate_number" value="estimate_number"
@change="onSearched" @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> </div>
</v-dropdown> </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-if="getOrderBy" icon="sort-amount-up" />
<font-awesome-icon v-else icon="sort-amount-down" /> <font-awesome-icon v-else icon="sort-amount-down" />
</base-button> </base-button>
@ -116,7 +155,7 @@
</div> </div>
<div class="side-content"> <div class="side-content">
<router-link <router-link
v-for="(estimate,index) in estimates" v-for="(estimate, index) in estimates"
:to="`/admin/estimates/${estimate.id}/view`" :to="`/admin/estimates/${estimate.id}/view`"
:key="index" :key="index"
class="side-estimate" class="side-estimate"
@ -124,10 +163,20 @@
<div class="left"> <div class="left">
<div class="inv-name">{{ estimate.user.name }}</div> <div class="inv-name">{{ estimate.user.name }}</div>
<div class="inv-number">{{ estimate.estimate_number }}</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>
<div class="right"> <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 class="inv-date">{{ estimate.formattedEstimateDate }}</div>
</div> </div>
</router-link> </router-link>
@ -137,7 +186,7 @@
</div> </div>
</div> </div>
<div class="estimate-view-page-container"> <div class="estimate-view-page-container">
<iframe :src="`${shareableLink}`" class="frame-style"/> <iframe :src="`${shareableLink}`" class="frame-style" />
</div> </div>
</div> </div>
</template> </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) { async removeEstimate (id) {
window.swal({ window.swal({
title: 'Deleted', title: 'Deleted',

View File

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

View File

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

View File

@ -1,7 +1,7 @@
<template> <template>
<div v-if="invoice" class="main-content invoice-view-page"> <div v-if="invoice" class="main-content invoice-view-page">
<div class="page-header"> <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="page-actions row">
<div class="col-xs-2 mr-3"> <div class="col-xs-2 mr-3">
<base-button <base-button
@ -24,26 +24,47 @@
> >
{{ $t('invoices.send_invoice') }} {{ $t('invoices.send_invoice') }}
</base-button> </base-button>
<router-link v-if="invoice.status === 'SENT'" :to="`/admin/payments/${$route.params.id}/create`"> <router-link
<base-button v-if="invoice.status === 'SENT'"
color="theme" :to="`/admin/payments/${$route.params.id}/create`"
> >
<base-button color="theme">
{{ $t('payments.record_payment') }} {{ $t('payments.record_payment') }}
</base-button> </base-button>
</router-link> </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="#"> <a slot="activator" href="#">
<base-button color="theme"> <base-button color="theme">
<font-awesome-icon icon="ellipsis-h" /> <font-awesome-icon icon="ellipsis-h" />
</base-button> </base-button>
</a> </a>
<v-dropdown-item> <v-dropdown-item>
<router-link :to="{path: `/admin/invoices/${$route.params.id}/edit`}" class="dropdown-item"> <div class="dropdown-item" @click="copyPdfUrl">
<font-awesome-icon :icon="['fas', 'pencil-alt']" class="dropdown-item-icon"/> <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') }} {{ $t('general.edit') }}
</router-link> </router-link>
<div class="dropdown-item" @click="removeInvoice($route.params.id)"> <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') }} {{ $t('general.delete') }}
</div> </div>
</v-dropdown-item> </v-dropdown-item>
@ -61,14 +82,18 @@
align-icon="right" align-icon="right"
@input="onSearch" @input="onSearch"
/> />
<div <div class="btn-group ml-3" role="group" aria-label="First group">
class="btn-group ml-3" <v-dropdown
role="group" :close-on-select="false"
aria-label="First group" align="left"
> class="filter-container"
<v-dropdown :close-on-select="false" align="left" class="filter-container"> >
<a slot="activator" href="#"> <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" /> <font-awesome-icon icon="filter" />
</base-button> </base-button>
</a> </a>
@ -84,8 +109,10 @@
class="inv-radio" class="inv-radio"
value="invoice_date" value="invoice_date"
@change="onSearch" @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>
<div class="filter-items"> <div class="filter-items">
<input <input
@ -96,8 +123,10 @@
class="inv-radio" class="inv-radio"
value="due_date" value="due_date"
@change="onSearch" @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>
<div class="filter-items"> <div class="filter-items">
<input <input
@ -108,11 +137,19 @@
class="inv-radio" class="inv-radio"
value="invoice_number" value="invoice_number"
@change="onSearch" @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> </div>
</v-dropdown> </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-if="getOrderBy" icon="sort-amount-up" />
<font-awesome-icon v-else icon="sort-amount-down" /> <font-awesome-icon v-else icon="sort-amount-down" />
</base-button> </base-button>
@ -121,7 +158,7 @@
<base-loader v-if="isSearching" /> <base-loader v-if="isSearching" />
<div v-else class="side-content"> <div v-else class="side-content">
<router-link <router-link
v-for="(invoice,index) in invoices" v-for="(invoice, index) in invoices"
:to="`/admin/invoices/${invoice.id}/view`" :to="`/admin/invoices/${invoice.id}/view`"
:key="index" :key="index"
class="side-invoice" class="side-invoice"
@ -129,10 +166,20 @@
<div class="left"> <div class="left">
<div class="inv-name">{{ invoice.user.name }}</div> <div class="inv-name">{{ invoice.user.name }}</div>
<div class="inv-number">{{ invoice.invoice_number }}</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>
<div class="right"> <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 class="inv-date">{{ invoice.formattedInvoiceDate }}</div>
</div> </div>
</router-link> </router-link>
@ -141,8 +188,8 @@
</p> </p>
</div> </div>
</div> </div>
<div class="invoice-view-page-container" > <div class="invoice-view-page-container">
<iframe :src="`${shareableLink}`" class="frame-style"/> <iframe :src="`${shareableLink}`" class="frame-style" />
</div> </div>
</div> </div>
</template> </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) { async removeInvoice (id) {
this.selectInvoice([parseInt(id)]) this.selectInvoice([parseInt(id)])
this.id = id this.id = id

View File

@ -1,7 +1,7 @@
<template> <template>
<div v-if="payment" class="main-content payment-view-page"> <div v-if="payment" class="main-content payment-view-page">
<div class="page-header"> <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"> <div class="page-actions row">
<base-button <base-button
:loading="isSendingEmail" :loading="isSendingEmail"
@ -11,19 +11,39 @@
> >
{{ $t('payments.send_payment_receipt') }} {{ $t('payments.send_payment_receipt') }}
</base-button> </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="#"> <a slot="activator" href="#">
<base-button color="theme"> <base-button color="theme">
<font-awesome-icon icon="ellipsis-h" /> <font-awesome-icon icon="ellipsis-h" />
</base-button> </base-button>
</a> </a>
<v-dropdown-item> <v-dropdown-item>
<router-link :to="{path: `/admin/payments/${$route.params.id}/edit`}" class="dropdown-item"> <div class="dropdown-item" @click="copyPdfUrl">
<font-awesome-icon :icon="['fas', 'pencil-alt']" class="dropdown-item-icon"/> <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') }} {{ $t('general.edit') }}
</router-link> </router-link>
<div class="dropdown-item" @click="removePayment($route.params.id)"> <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') }} {{ $t('general.delete') }}
</div> </div>
</v-dropdown-item> </v-dropdown-item>
@ -41,14 +61,18 @@
align-icon="right" align-icon="right"
@input="onSearch" @input="onSearch"
/> />
<div <div class="btn-group ml-3" role="group" aria-label="First group">
class="btn-group ml-3" <v-dropdown
role="group" :close-on-select="false"
aria-label="First group" align="left"
> class="filter-container"
<v-dropdown :close-on-select="false" align="left" class="filter-container"> >
<a slot="activator" href="#"> <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" /> <font-awesome-icon icon="filter" />
</base-button> </base-button>
</a> </a>
@ -64,8 +88,10 @@
class="inv-radio" class="inv-radio"
value="invoice_number" value="invoice_number"
@change="onSearch" @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>
<div class="filter-items"> <div class="filter-items">
<input <input
@ -76,8 +102,10 @@
class="inv-radio" class="inv-radio"
value="payment_date" value="payment_date"
@change="onSearch" @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>
<div class="filter-items"> <div class="filter-items">
<input <input
@ -88,11 +116,19 @@
class="inv-radio" class="inv-radio"
value="payment_number" value="payment_number"
@change="onSearch" @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> </div>
</v-dropdown> </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-if="getOrderBy" icon="sort-amount-up" />
<font-awesome-icon v-else icon="sort-amount-down" /> <font-awesome-icon v-else icon="sort-amount-down" />
</base-button> </base-button>
@ -101,7 +137,7 @@
<base-loader v-if="isSearching" /> <base-loader v-if="isSearching" />
<div v-else class="side-content"> <div v-else class="side-content">
<router-link <router-link
v-for="(payment,index) in payments" v-for="(payment, index) in payments"
:to="`/admin/payments/${payment.id}/view`" :to="`/admin/payments/${payment.id}/view`"
:key="index" :key="index"
class="side-payment" class="side-payment"
@ -112,7 +148,10 @@
<div class="inv-number">{{ payment.invoice_number }}</div> <div class="inv-number">{{ payment.invoice_number }}</div>
</div> </div>
<div class="right"> <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-date">{{ payment.formattedPaymentDate }}</div>
<!-- <div class="inv-number">{{ payment.payment_method.name }}</div> --> <!-- <div class="inv-number">{{ payment.payment_method.name }}</div> -->
</div> </div>
@ -122,8 +161,8 @@
</p> </p>
</div> </div>
</div> </div>
<div class="payment-view-page-container" > <div class="payment-view-page-container">
<iframe :src="`${shareableLink}`" class="frame-style"/> <iframe :src="`${shareableLink}`" class="frame-style" />
</div> </div>
</div> </div>
</template> </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) { async removePayment (id) {
this.id = id this.id = id
window.swal({ window.swal({

View File

@ -1,33 +1,76 @@
<template> <template>
<div class="setting-main-container"> <div class="setting-main-container update-container">
<div class="card setting-card"> <div class="card setting-card">
<div class="page-header"> <div class="page-header">
<h3 class="page-title">{{ $t('settings.update_app.title') }}</h3> <h3 class="page-title">{{ $t('settings.update_app.title') }}</h3>
<p class="page-sub-title"> <p class="page-sub-title">
{{ $t('settings.update_app.description') }} {{ $t('settings.update_app.description') }}
</p> </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> <label class="version mb-4">{{ currentVersion }}</label>
<base-button :outline="true" :disabled="isCheckingforUpdate || isUpdating" size="large" color="theme" class="mb-4" @click="checkUpdate"> <base-button
<font-awesome-icon :class="{'update': isCheckingforUpdate}" style="margin-right: 10px;" icon="sync-alt" /> :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') }} {{ $t('settings.update_app.check_update') }}
</base-button> </base-button>
<hr> <hr />
<div v-show="!isUpdating" v-if="isUpdateAvailable" class="mt-4 content"> <div v-show="!isUpdating" v-if="isUpdateAvailable" class="mt-4 content">
<h3 class="page-title mb-3">{{ $t('settings.update_app.avail_update') }}</h3> <h3 class="page-title mb-3">
<label class="input-label">{{ $t('settings.update_app.next_version') }}</label><br> {{ $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> <label class="version">{{ updateData.version }}</label>
<p class="page-sub-title" style="white-space: pre-wrap;">{{ description }}</p> <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') }} {{ $t('settings.update_app.update') }}
</base-button> </base-button>
</div> </div>
<div v-if="isUpdating" class="mt-4 content"> <div v-if="isUpdating" class="mt-4 content">
<h3 class="page-title">{{ $t('settings.update_app.update_progress') }}</h3> <div class="d-flex flex-row justify-content-between">
<p class="page-sub-title"> <div>
{{ $t('settings.update_app.progress_text') }} <h3 class="page-title">
</p> {{ $t('settings.update_app.update_progress') }}
<font-awesome-icon icon="spinner" class="fa-spin"/> </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> </div>
</div> </div>
@ -36,7 +79,7 @@
<script> <script>
export default { export default {
data () { data() {
return { return {
isShowProgressBar: false, isShowProgressBar: false,
isUpdateAvailable: false, isUpdateAvailable: false,
@ -46,60 +89,78 @@ export default {
interval: null, interval: null,
description: '', description: '',
currentVersion: '', 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: { updateData: {
isMinor: Boolean, isMinor: Boolean,
installed: '', installed: '',
version: '' version: '',
} },
} }
}, },
created () { created() {
window.addEventListener('beforeunload', (event) => { window.addEventListener('beforeunload', (event) => {
if (this.isUpdating) { if (this.isUpdating) {
event.returnValue = 'Update is in progress!' event.returnValue = 'Update is in progress!'
} }
}) })
}, },
mounted () { mounted() {
window.axios.get('/api/settings/app/version').then((res) => { window.axios.get('/api/settings/app/version').then((res) => {
this.currentVersion = res.data.version this.currentVersion = res.data.version
}) })
}, },
methods: { methods: {
closeHandler () { closeHandler() {
console.log('closing') console.log('closing')
}, },
async onUpdateApp () { getStatus(step) {
try { if (step.started && step.completed) {
this.isUpdating = true return 'finished'
this.updateData.installed = this.currentVersion } else if (step.started && !step.completed) {
let res = await window.axios.post('/api/update', this.updateData) return 'running'
} else if (!step.started && !step.completed) {
if (res.data.success) { return 'pending'
setTimeout(async () => { } else {
await window.axios.post('/api/update/finish', this.updateData) return 'error'
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')
} }
this.isUpdating = false
}, },
async checkUpdate() {
async checkUpdate () {
try { try {
this.isCheckingforUpdate = true this.isCheckingforUpdate = true
let response = await window.axios.get('/api/check/update') let response = await window.axios.get('/api/check/update')
@ -122,8 +183,67 @@ export default {
this.isCheckingforUpdate = false this.isCheckingforUpdate = false
window.toastr['error']('Something went wrong') 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> </script>

View File

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

View File

@ -27,6 +27,7 @@ fieldset[disabled] .multiselect {
top: 50%; top: 50%;
left: 50%; left: 50%;
margin: -8px 0 0 -8px; margin: -8px 0 0 -8px;
z-index: 5;
width: 16px; width: 16px;
height: 16px; height: 16px;
border-radius: 100%; 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 { .add-new-tax {
height: 45px; height: 45px;
white-space: nowrap; white-space: nowrap;

View File

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

View File

@ -1,9 +1,11 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>Estimate</title> <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"> <style type="text/css">
/* -- Base -- */
body { body {
font-family: "DejaVu Sans"; font-family: "DejaVu Sans";
} }
@ -11,22 +13,21 @@
html { html {
margin: 0px; margin: 0px;
padding: 0px; padding: 0px;
margin-top: 50px;
} }
table { table {
border-collapse: collapse; border-collapse: collapse;
} }
.header-left { hr {
padding-top: 45px; color: rgba(0, 0, 0, 0.2);
padding-bottom: 45px; border: 0.5px solid #EAF1FB;
padding-left: 30px;
display:inline-block;
width:30%;
} }
@page {
margin-top: 60px !important; /* -- Header -- */
}
.header-table { .header-container {
background: #817AE3; background: #817AE3;
position: absolute; position: absolute;
width: 100%; width: 100%;
@ -34,351 +35,286 @@
left: 0px; left: 0px;
top: -60px; top: -60px;
} }
.header-section-left {
padding-top: 45px;
padding-bottom: 45px;
padding-left: 30px;
display: inline-block;
width: 30%;
}
.header-logo { .header-logo {
position: absolute; position: absolute;
height: 50px; height: 50px;
text-transform: capitalize; text-transform: capitalize;
color: #fff; color: #fff;
} }
.header-right {
display:inline-block; .header-section-right {
width:35%; display: inline-block;
float:right; width: 35%;
float: right;
padding: 20px 30px 20px 0px; padding: 20px 30px 20px 0px;
text-align: right; 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 { .header {
font-size: 20px; font-size: 20px;
color: rgba(0, 0, 0, 0.7); color: rgba(0, 0, 0, 0.7);
} }
.TextColor1 { /* -- Estimate Details -- */
font-size: 16px;
color: rgba(0, 0, 0, 0.5); .estimate-details-container {
text-align: center;
width: 40%;
} }
.wrapper { .estimate-details-container h1 {
display: block; margin: 0;
margin-top: 60px; font-size: 24px;
padding-bottom: 20px; line-height: 36px;
text-align: right;
font-family: "DejaVu Sans";
} }
.address { .estimate-details-container h4 {
display: block; margin: 0;
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; font-size: 10px;
line-height: 15px; 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; text-align: right;
} }
.textLeft { .estimate-details-container h3 {
text-align: left; 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-size: 12;
font-weight: bold; font-weight: bold;
line-height:22px; line-height: 22px;
color: rgba(0, 0, 0, 0.8); color: rgba(0, 0, 0, 0.8);
} }
.textStyle2 { .attribute-value {
font-size: 12; font-size: 12;
line-height:22px; line-height: 22px;
color: rgba(0, 0, 0, 0.7); color: rgba(0, 0, 0, 0.7);
} }
.main-table-header td { /* -- Items Table -- */
padding: 5px;
padding-bottom: 10px;
}
.main-table-header { .items-table {
border-bottom: 1px solid red; padding: 30px 30px 10px 30px;
}
.table2 {
margin-top: 30px;
padding: 0px 30px 10px 30px;
page-break-before: avoid; page-break-before: avoid;
page-break-after: auto; page-break-after: auto;
} }
hr { .items-table hr {
margin: 0 30px 0 30px; height: 0.1px;
color:rgba(0, 0, 0, 0.2); margin: 0 30px;
border: 0.5px solid #EAF1FB;
} }
.table2 hr { .item-table-heading {
height:0.1px;
}
.ItemTableHeader {
font-size: 13.5; font-size: 13.5;
text-align: center; text-align: center;
color: rgba(0, 0, 0, 0.85); color: rgba(0, 0, 0, 0.85);
padding: 5px; 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; border-bottom: 0.620315px solid #E8E8E8;
font-style: normal;
font-weight: normal;
font-size: 12px; font-size: 12px;
line-height: 18px; line-height: 18px;
} }
tr.item-details td { tr.item-row td {
font-style: normal;
font-weight: normal;
font-size: 12px; font-size: 12px;
line-height: 18px; line-height: 18px;
} }
.items { .item-cell {
font-size: 13; font-size: 13;
color: rgba(0, 0, 0, 0.6); color: #040405;
text-align: center; text-align: center;
padding: 5px; padding: 5px;
padding-top: 10px; padding-top: 10px;
} }
.note-header { .item-description {
font-size: 13; color: #595959;
color: rgba(0, 0, 0, 0.6); font-size: 9px;
line-height: 12px;
page-break-inside: avoid;
} }
.note-text { /* -- Total Display Table -- */
font-size: 10;
color: rgba(0, 0, 0, 0.6); .total-display-container {
padding: 0 25px;
} }
.padd8 { .item-cell-table-hr {
padding-top: 8px; margin: 0 25px 0 30px;
padding-bottom: 8px;
} }
.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-top: 2px;
padding-bottom: 2px; padding-bottom: 2px;
} }
.table3 { /* -- Notes -- */
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; font-size: 12px;
color: #595959; color: #595959;
margin-top: 15px; margin-top: 15px;
@ -389,8 +325,6 @@
} }
.notes-label { .notes-label {
font-style: normal;
font-weight: normal;
font-size: 15px; font-size: 15px;
line-height: 22px; line-height: 22px;
letter-spacing: 0.05em; letter-spacing: 0.05em;
@ -400,23 +334,79 @@
padding-bottom: 10px; 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> </style>
</head> </head>
<body> <body>
<div class="header-table"> <div class="header-container">
<table width="100%"> <table width="100%">
<tr> <tr>
@if($logo) @if($logo)
<td width="60%" class="header-left"> <td width="60%" class="header-section-left">
<img class="header-logo" src="{{ $logo }}" alt="Company Logo"> <img class="header-logo" src="{{ $logo }}" alt="Company Logo">
@else @else
<td width="60%" class="header-left" style="padding-top: 0px;"> <td width="60%" class="header-section-left" style="padding-top: 0px;">
@if($estimate->user->company) @if($estimate->user->company)
<h1 class="header-logo"> {{$estimate->user->company->name}} </h1> <h1 class="header-logo"> {{$estimate->user->company->name}} </h1>
@endif @endif
@endif @endif
</td> </td>
<td width="40%" class="header-right company-details"> <td width="40%" class="header-section-right estimate-details-container">
<h1>Estimate</h1> <h1>Estimate</h1>
<h4>{{$estimate->estimate_number}}</h4> <h4>{{$estimate->estimate_number}}</h4>
<h4>{{$estimate->formattedEstimateDate}}</h4> <h4>{{$estimate->formattedEstimateDate}}</h4>
@ -426,24 +416,24 @@
</div> </div>
<hr> <hr>
<div class="wrapper"> <div class="wrapper">
<div class="address"> <div class="address-container">
<div class="company"> <div class="company-address-container">
@include('app.pdf.estimate.partials.company-address') @include('app.pdf.estimate.partials.company-address')
</div> </div>
<div class="ship-address-container"> <div class="shipping-address-container">
@include('app.pdf.estimate.partials.shipping-address') @include('app.pdf.estimate.partials.shipping-address')
</div> </div>
@if($estimate->user->shippingaddress) @if($estimate->user->shippingaddress)
<div class="bill-address-container"> <div class="billing-address-container">
@else @else
<div class="bill-address-container" style="float:right;padding-right:0px;"> <div class="billing-address-container" style="float:right; padding-right:0px;">
@endif @endif
@include('app.pdf.estimate.partials.billing-address') @include('app.pdf.estimate.partials.billing-address')
</div> </div>
<div style="clear: both;"></div> <div style="clear: both;"></div>
@include('app.pdf.estimate.partials.table')
@include('app.pdf.estimate.partials.notes')
</div> </div>
@include('app.pdf.estimate.partials.table')
@include('app.pdf.estimate.partials.notes')
</div>
</body> </body>
</html> </html>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,10 +1,11 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>Invoice</title> <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"> <style type="text/css">
/* -- Base -- */
body { body {
font-family: "DejaVu Sans"; font-family: "DejaVu Sans";
} }
@ -12,22 +13,22 @@
html { html {
margin: 0px; margin: 0px;
padding: 0px; padding: 0px;
margin-top: 50px;
} }
table { table {
border-collapse: collapse; border-collapse: collapse;
} }
.header-left { hr {
padding-top: 45px; margin: 0 30px 0 30px;
padding-bottom: 45px; color: rgba(0, 0, 0, 0.2);
padding-left: 30px; border: 0.5px solid #EAF1FB;
display:inline-block;
width:30%;
} }
@page {
margin-top: 60px !important; /* -- Header -- */
}
.header-table { .header-container {
background: #817AE3; background: #817AE3;
position: absolute; position: absolute;
width: 100%; width: 100%;
@ -35,351 +36,266 @@
left: 0px; left: 0px;
top: -60px; top: -60px;
} }
.header-section-left {
padding-top: 45px;
padding-bottom: 45px;
padding-left: 30px;
display: inline-block;
width: 30%;
}
.header-logo { .header-logo {
position: absolute; position: absolute;
height: 50px; height: 50px;
text-transform: capitalize; text-transform: capitalize;
color: #fff; color: #fff;
} }
.header-right {
display:inline-block; .header-section-right {
width:35%; display: inline-block;
float:right; width: 35%;
float: right;
padding: 20px 30px 20px 0px; padding: 20px 30px 20px 0px;
text-align: right; 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 { .header {
font-size: 20px; font-size: 20px;
color: rgba(0, 0, 0, 0.7); color: rgba(0, 0, 0, 0.7);
} }
.TextColor1 { /* -- Estimate Details -- */
font-size: 16px;
color: rgba(0, 0, 0, 0.5);
}
.wrapper { .invoice-details-container {
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{
text-align: center; text-align: center;
width: 40%; width: 40%;
} }
.company-details h1 { .invoice-details-container h1 {
margin:0; margin: 0;
font-style: normal;
font-weight: 500;
font-size: 24px; font-size: 24px;
line-height: 36px; line-height: 36px;
text-align: right; text-align: right;
} }
.company-details h4 { .invoice-details-container h4 {
margin:0; margin: 0;
font-style: normal;
font-weight: normal;
font-size: 10px; font-size: 10px;
line-height: 15px; line-height: 15px;
text-align: right; text-align: right;
} }
.company-details h3 { .invoice-details-container h3 {
margin-bottom:1px; margin-bottom: 1px;
margin-top:0; 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 { .notes {
font-style: normal;
font-weight: 300;
font-size: 12px; font-size: 12px;
color: #595959; color: #595959;
margin-top: 15px; margin-top: 15px;
@ -390,8 +306,6 @@
} }
.notes-label { .notes-label {
font-style: normal;
font-weight: normal;
font-size: 15px; font-size: 15px;
line-height: 22px; line-height: 22px;
letter-spacing: 0.05em; letter-spacing: 0.05em;
@ -401,23 +315,79 @@
padding-bottom: 10px; 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> </style>
</head> </head>
<body> <body>
<div class="header-table"> <div class="header-container">
<table width="100%"> <table width="100%">
<tr> <tr>
@if($logo) @if($logo)
<td width="60%" class="header-left"> <td width="60%" class="header-section-left">
<img class="header-logo" src="{{ $logo }}" alt="Company Logo"> <img class="header-logo" src="{{ $logo }}" alt="Company Logo">
@else @else
<td width="60%" class="header-left" style="padding-top: 0px;"> <td width="60%" class="header-section-left" style="padding-top: 0px;">
@if($invoice->user->company) @if($invoice->user->company)
<h1 class="header-logo"> {{$invoice->user->company->name}} </h1> <h1 class="header-logo"> {{$invoice->user->company->name}} </h1>
@endif @endif
@endif @endif
</td> </td>
<td width="40%" class="header-right company-details"> <td width="40%" class="header-section-right invoice-details-container">
<h1>Invoice</h1> <h1>Invoice</h1>
<h4>{{$invoice->invoice_number}}</h4> <h4>{{$invoice->invoice_number}}</h4>
<h4>{{$invoice->formattedInvoiceDate}}</h4> <h4>{{$invoice->formattedInvoiceDate}}</h4>
@ -426,25 +396,26 @@
</table> </table>
</div> </div>
<hr> <hr>
<div class="wrapper"> <div class="content-wrapper">
<div class="address"> <div class="address-container">
<div class="company"> <div class="company-address-container">
@include('app.pdf.invoice.partials.company-address') @include('app.pdf.invoice.partials.company-address')
</div> </div>
<div class="ship-address-container"> <div class="shipping-address-container">
@include('app.pdf.invoice.partials.shipping-address') @include('app.pdf.invoice.partials.shipping-address')
</div> </div>
@if($invoice->user->shippingaddress) @if($invoice->user->shippingaddress)
<div class="bill-address-container"> <div class="billing-address-container">
@else @else
<div class="bill-address-container" style="float:right;padding-right:0px;"> <div class="billing-address-container" style="float:right;padding-right:0px;">
@endif @endif
@include('app.pdf.invoice.partials.billing-address') @include('app.pdf.invoice.partials.billing-address')
</div>
<div style="clear: both;"></div>
</div> </div>
<div style="clear: both;"></div> @include('app.pdf.invoice.partials.table')
@include('app.pdf.invoice.partials.notes')
</div> </div>
@include('app.pdf.invoice.partials.table')
@include('app.pdf.invoice.partials.notes')
</div>
</body> </body>
</html> </html>

View File

@ -1,11 +1,13 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>Invoice</title> <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"> <style type="text/css">
/* -- Base -- */
body { body {
font-family: "DejaVu Sans"; font-family: "DejaVu Sans";
} }
@ -13,146 +15,134 @@
html { html {
margin: 0px; margin: 0px;
padding: 0px; padding: 0px;
margin-top: 50px;
} }
table { table {
border-collapse: collapse; border-collapse: collapse;
} }
.header-line {
color:rgba(0, 0, 0, 0.2);
position: absolute;
top: 80px;
left: 0px;
right: -70px;
width: 100%;
}
hr { hr {
color:rgba(0, 0, 0, 0.2); color: rgba(0, 0, 0, 0.2);
border: 0.5px solid #EAF1FB; border: 0.5px solid #EAF1FB;
} }
.items-table-hr{ /* -- Header -- */
margin: 0 30px 0 30px;
.header-bottom-divider {
color: rgba(0, 0, 0, 0.2);
position: absolute;
top: 100px;
left: 0px;
width: 100%;
} }
.header-section-left {
.header-left {
padding-top: 45px; padding-top: 45px;
padding-bottom: 45px; padding-bottom: 45px;
padding-left: 30px; padding-left: 30px;
display:inline-block; display: inline-block;
width:30%; width: 30%;
} }
.header-table {
.header-container {
position: absolute; position: absolute;
width: 100%; width: 100%;
height: 150px; height: 150px;
left: 0px; left: 0px;
top: -60px; top: -60px;
} }
.header-logo { .header-logo {
position: absolute; position: absolute;
height: 50px; height: 50px;
text-transform: capitalize; text-transform: capitalize;
color: #817AE3; color: #817AE3;
} }
.header-right {
display:inline-block; .header-section-right {
display: inline-block;
position: absolute; position: absolute;
right:0; right: 0;
padding: 15px 30px 15px 0px; padding: 15px 30px 15px 0px;
float: right; float: right;
} }
.inv-flex{
display:flex;
}
.inv-data{
text-align:right;
margin-right:120px;
}
.inv-value{
text-align:left;
margin-left:160px;
}
.header { .header {
font-size: 20px; font-size: 20px;
color: rgba(0, 0, 0, 0.7); color: rgba(0, 0, 0, 0.7);
} }
.TextColor1 { /* -- Company Address */
font-size: 16px;
color: rgba(0, 0, 0, 0.5); .company-address-container {
width: auto;
text-transform: capitalize;
margin-bottom: 2px;
} }
@page { .company-address-container h1 {
margin-top: 60px !important; font-size: 15px;
}
.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;
line-height: 22px; line-height: 22px;
letter-spacing: 0.05em; letter-spacing: 0.05em;
margin-bottom: 0px;
margin-top: 10px;
} }
.company-add { .company-address {
text-align: left; margin-top: 2px;
font-style: normal; font-size: 12px;
font-weight: normal;
font-size: 10px;
line-height: 15px; line-height: 15px;
color: #595959; color: #595959;
margin: 0px;
} }
/* -------------------------- */ /* -- Content Wrapper */
/* shipping style */
.ship-to { .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; padding-top: 5px;
font-style: normal;
font-weight: normal;
font-size: 12px; font-size: 12px;
line-height: 18px; line-height: 18px;
margin-bottom: 0px; margin-bottom: 0px;
} }
.ship-user-name { .shipping-address-name {
padding: 0px; padding: 0px;
font-style: normal;
font-weight: normal;
font-size: 15px; font-size: 15px;
line-height: 22px; line-height: 22px;
margin: 0px; margin: 0px;
max-width: 160px;
} }
.ship-user-address { .shipping-address {
font-style: normal;
font-weight: normal;
font-size: 10px; font-size: 10px;
line-height: 15px; line-height: 15px;
color: #595959; color: #595959;
@ -160,237 +150,156 @@
width: 160px; width: 160px;
} }
.ship-user-phone { /* -- Billing -- */
font-style: normal;
font-weight: normal; .billing-address-container {
font-size: 10px; display: block;
line-height: 15px; float: left;
color: #595959;
margin: 0px;
} }
/* -------------------------- */ .billing-address-label {
/* billing style */
.bill-to {
padding-top: 5px; padding-top: 5px;
font-style: normal;
font-weight: normal;
font-size: 12px; font-size: 12px;
line-height: 18px; line-height: 18px;
margin-bottom: 0px; margin-bottom: 0px;
} }
.bill-user-name { .billing-address-name {
padding: 0px; padding: 0px;
font-style: normal;
font-weight: normal;
font-size: 15px; font-size: 15px;
line-height: 22px; line-height: 22px;
margin: 0px; margin: 0px;
max-width: 160px;
} }
.bill-user-address { .billing-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; font-size: 10px;
line-height: 15px; line-height: 15px;
color: #595959; color: #595959;
margin: 0px; margin: 0px;
width: 160px;
} }
/* -- Estimate Details -- */
.job-add { .invoice-details-container {
display: block; display: block;
float: right; float: right;
padding: 20px 30px 0 0; padding: 20px 30px 0 0;
} }
.amount-due {
background-color: #f2f2f2;
}
.textRight { .attribute-label {
text-align: right; font-size: 12px;
} line-height: 18px;
.textLeft {
text-align: left; text-align: left;
color: #55547A
} }
.textStyle1 { .attribute-value {
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 18px;
}
.textStyle2 {
font-style: normal;
font-weight: normal;
font-size: 12px; font-size: 12px;
line-height: 18px; line-height: 18px;
text-align: right; text-align: right;
} }
.main-table-header td {
padding: 10px; /* -- Items Table -- */
}
.main-table-header { .items-table {
border-bottom: 1px solid red; margin-top: 35px;
}
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; padding: 0px 30px 10px 30px;
page-break-before: avoid; page-break-before: avoid;
page-break-after: auto; page-break-after: auto;
} }
.table2 hr { .items-table hr {
height:0.1px; height: 0.1px;
} }
.ItemTableHeader { .item-table-heading {
font-size: 13.5; font-size: 13.5;
text-align: center; text-align: center;
color: rgba(0, 0, 0, 0.85); color: rgba(0, 0, 0, 0.85);
padding: 5px; 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; font-size: 13;
color: rgba(0, 0, 0, 0.6);
text-align: center; text-align: center;
padding: 5px; padding: 5px;
padding-top: 10px;
color: #040405;
} }
.note-header { .item-description {
font-size: 13; color: #595959;
color: rgba(0, 0, 0, 0.6); font-size: 9px;
line-height: 12px;
} }
.note-text { .item-cell-table-hr {
font-size: 10; margin: 0 30px 0 30px;
color: rgba(0, 0, 0, 0.6);
} }
.padd8 { /* -- Total Display Table -- */
padding-top: 8px;
padding-bottom: 8px; .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-top: 2px;
padding-bottom: 2px; padding-bottom: 2px;
} }
.table3 { .total-border-left {
border: 1px solid #EAF1FB; border: 1px solid #E8E8E8 !important;
border-top: none; border-right: 0px !important;
box-sizing: border-box; padding-top: 0px;
width: 630px; padding: 8px !important;
page-break-inside: avoid;
page-break-before: auto;
page-break-after: auto;
} }
.text-per-item-table3 { .total-border-right {
border: 1px solid #EAF1FB; border: 1px solid #E8E8E8 !important;
border-top: none; border-left: 0px !important;
padding-right: 30px; padding-top: 0px;
box-sizing: border-box; padding: 8px !important;
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;
} }
/* -- Notes -- */
.notes { .notes {
font-style: normal;
font-weight: 300;
font-size: 12px; font-size: 12px;
color: #595959; color: #595959;
margin-top: 15px; margin-top: 15px;
@ -401,8 +310,6 @@
} }
.notes-label { .notes-label {
font-style: normal;
font-weight: normal;
font-size: 15px; font-size: 15px;
line-height: 22px; line-height: 22px;
letter-spacing: 0.05em; letter-spacing: 0.05em;
@ -412,67 +319,122 @@
padding-bottom: 10px; 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> </style>
</head> </head>
<body> <body>
<div class="header-table"> <div class="header-container">
<table width="100%"> <table width="100%">
<tr> <tr>
@if($logo) <td class="header-section-left">
<td class="header-left"> @if($logo)
<img class="header-logo" src="{{ $logo }}" alt="Company Logo"> <img class="header-logo" src="{{ $logo }}" alt="Company Logo">
@else @else
@if($invoice->user->company) <h1 class="header-logo"> {{$invoice->user->company->name}} </h1>
<td class="header-left" style="padding-top:0px;">
<h1 class="header-logo"> {{$invoice->user->company->name}} </h1>
@endif
@endif @endif
</td> </td>
<td class="header-right company-details"> <td class="header-section-right company-address-container">
@include('app.pdf.invoice.partials.company-address') @include('app.pdf.invoice.partials.company-address')
</td> </td>
</tr> </tr>
</table> </table>
</div> </div>
<hr class="header-line"> <hr class="header-bottom-divider">
<div class="wrapper"> <div class="content-wrapper">
<div class="address"> <div class="main-content">
<div class="bill-add"> <div class="customer-address-container">
<div style="float:left;"> <div class="billing-address-container">
@include('app.pdf.invoice.partials.billing-address') @include('app.pdf.invoice.partials.billing-address')
</div> </div>
@if($invoice->user->billingaddress) @if($invoice->user->billingaddress)
<div style="float:right;"> <div class="shipping-address-container">
@else @else
<div style="float:left;"> <div class="shipping-address-container--left">
@endif @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>
<div style="clear: both;"></div> <div style="clear: both;"></div>
</div> </div>
@include('app.pdf.invoice.partials.table')
<div class="job-add"> @include('app.pdf.invoice.partials.notes')
<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>
</div> </div>
@include('app.pdf.invoice.partials.table')
@include('app.pdf.invoice.partials.notes')
</div> </div>
</body> </body>
</html> </html>

View File

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

View File

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

View File

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

View File

@ -1,46 +1,49 @@
<table width="100%" class="table2" cellspacing="0" border="0"> <table width="100%" class="items-table" cellspacing="0" border="0">
<tr class="main-table-header"> <tr class="item-table-heading-row">
<th width="2%" class="ItemTableHeader" style="text-align: right; color: #55547A; padding-right: 20px">#</th> <th width="2%" class="item-table-heading text-right pr-20">#</th>
<th width="40%" class="ItemTableHeader" style="text-align: left; color: #55547A; padding-left: 0px">Items</th> <th width="40%" class="item-table-heading text-left pl-0">Items</th>
<th class="ItemTableHeader" style="text-align: right; color: #55547A; padding-right: 20px">Quantity</th> <th class="item-table-heading text-right pr-20">Quantity</th>
<th class="ItemTableHeader" style="text-align: right; color: #55547A; padding-right: 20px">Price</th> <th class="item-table-heading pr-20 text-right">Price</th>
@if($invoice->discount_per_item === 'YES') @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 @endif
<th class="ItemTableHeader" style="text-align: right; color: #55547A;">Amount</th> <th class="item-table-heading text-right">Amount</th>
</tr> </tr>
@php @php
$index = 1 $index = 1
@endphp @endphp
@foreach ($invoice->items as $item) @foreach ($invoice->items as $item)
<tr class="item-details"> <tr class="item-row">
<td <td
class="inv-item items" class="item-cell text-right pr-20"
style="text-align: right; color: #040405; padding-right: 20px; vertical-align: top;" style="vertical-align: top;"
> >
{{$index}} {{$index}}
</td> </td>
<td <td
class="inv-item items" class="item-cell text-left pl-0"
style="text-align: left; color: #040405;padding-left: 0px" style="vertical-align: top;"
> >
<span>{{ $item->name }}</span><br> <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>
<td <td
class="inv-item items" class="item-cell pr-20 text-right"
style="text-align: right; color: #040405; padding-right: 20px" style="vertical-align: top;"
> >
{{$item->quantity}} {{$item->quantity}}
</td> </td>
<td <td
class="inv-item items" class="item-cell text-right pr-20"
style="text-align: right; color: #040405; padding-right: 20px" style="vertical-align: top;"
> >
{!! format_money_pdf($item->price, $invoice->user->currency) !!} {!! format_money_pdf($item->price, $invoice->user->currency) !!}
</td> </td>
@if($invoice->discount_per_item === 'YES') @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') @if($item->discount_type === 'fixed')
{!! format_money_pdf($item->discount_val, $invoice->user->currency) !!} {!! format_money_pdf($item->discount_val, $invoice->user->currency) !!}
@endif @endif
@ -50,8 +53,8 @@
</td> </td>
@endif @endif
<td <td
class="inv-item items" class="item-cell text-right"
style="text-align: right; color: #040405;" style="vertical-align: top;"
> >
{!! format_money_pdf($item->total, $invoice->user->currency) !!} {!! format_money_pdf($item->total, $invoice->user->currency) !!}
</td> </td>
@ -62,74 +65,74 @@
@endforeach @endforeach
</table> </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"> <div class="total-display-container">
<tr> <table width="100%" cellspacing="0px" border="0" class="total-display-table @if(count($invoice->items) > 12) page-break @endif">
<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')
<tr> <tr>
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; color: #55547A;"> <td class="border-0 total-table-attribute-label">Subtotal</td>
@if($invoice->discount_type === 'fixed') <td class="border-0 item-cell py-2 total-table-attribute-value">
Discount {!! format_money_pdf($invoice->sub_total, $invoice->user->currency) !!}
@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> </td>
</tr> </tr>
@endif
<tr> @if ($invoice->tax_per_item === 'YES')
<td style="padding:3px 0px"></td> @for ($i = 0; $i < count($labels); $i++)
<td style="padding:3px 0px"></td> <tr>
</tr> <td class="border-0 total-table-attribute-label">
<tr> {{$labels[$i]}}
<td class="no-border total-border-left" </td>
style="padding-left:10px; padding-bottom:10px; text-align:left; padding-top:20px; font-size:12px; color: #55547A;" <td class="border-0 item-cell py-2 total-table-attribute-value">
> {!! format_money_pdf($taxes[$i], $invoice->user->currency) !!}
<label class="total-bottom"> Total </label> </td>
</td> </tr>
<td @endfor
class="no-border total-border-right items padd8" @else
style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; padding-top:20px; color: #5851DB" @foreach ($invoice->taxes as $tax)
> <tr>
{!! format_money_pdf($invoice->total, $invoice->user->currency)!!} <td class="border-0 total-table-attribute-label">
</td> {{$tax->name.' ('.$tax->percent.'%)'}}
</tr> </td>
</table> <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) @if($payment->user->billingaddress)
<p class="bill-to">Received From:</p> <p class="billing-address-label">Received From:</p>
@if($payment->user->billingaddress->name) @if($payment->user->billingaddress->name)
<p class="bill-user-name"> <p class="billing-address-name">
{{$payment->user->billingaddress->name}} {{$payment->user->billingaddress->name}}
</p> </p>
@endif @endif
<p class="bill-user-address"> <p class="billing-address">
@if($payment->user->billingaddress->address_street_1) @if($payment->user->billingaddress->address_street_1)
{!! nl2br(htmlspecialchars($payment->user->billingaddress->address_street_1)) !!}<br> {!! nl2br(htmlspecialchars($payment->user->billingaddress->address_street_1)) !!}<br>
@endif @endif
@ -25,7 +25,7 @@
{{$payment->user->billingaddress->country->name}}<br> {{$payment->user->billingaddress->country->name}}<br>
@endif @endif
@if($payment->user->billingaddress->phone) @if($payment->user->billingaddress->phone)
<p class="bill-user-phone"> <p class="billing-address">
Phone :{{$payment->user->billingaddress->phone}} Phone :{{$payment->user->billingaddress->phone}}
</p> </p>
@endif @endif

View File

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

View File

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

View File

@ -2,10 +2,10 @@
<html> <html>
<head> <head>
<title>Invoice</title> <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"> <style type="text/css">
/* -- Base -- */
body { body {
font-family: "DejaVu Sans"; font-family: "DejaVu Sans";
} }
@ -13,6 +13,7 @@
html { html {
margin: 0px; margin: 0px;
padding: 0px; padding: 0px;
margin-top: 50px;
} }
table { table {
border-collapse: collapse; border-collapse: collapse;
@ -27,339 +28,48 @@
width: 100%; width: 100%;
} }
.header-left { /* -- Heeader -- */
padding-top: 45px;
padding-bottom: 45px; .header-container {
padding-left: 30px;
display:inline-block;
width:30%;
}
.header-table {
position: absolute; position: absolute;
width: 100%; width: 100%;
height: 150px; height: 150px;
left: 0px; left: 0px;
top: -60px; top: -60px;
} }
.header-section-left {
padding-top: 45px;
padding-bottom: 45px;
padding-left: 30px;
display:inline-block;
width:30%;
}
.header-logo { .header-logo {
position: absolute; position: absolute;
height: 50px; height: 50px;
text-transform: capitalize; text-transform: capitalize;
color: #817AE3; color: #817AE3;
} }
.header-right { .header-section-right {
display:inline-block; display:inline-block;
position: absolute; position: absolute;
right:0; right:0;
padding: 15px 30px 15px 0px; padding: 15px 30px 15px 0px;
float: right; float: right;
} }
.inv-flex{
display:flex;
}
.inv-data{
text-align:right;
margin-right:120px;
}
.inv-value{
text-align:left;
margin-left:160px;
}
.header { .header {
font-size: 20px; font-size: 20px;
color: rgba(0, 0, 0, 0.7); color: rgba(0, 0, 0, 0.7);
} }
.TextColor1 { /* -- Company Address -- */
font-size: 16px;
color: rgba(0, 0, 0, 0.5);
}
@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 { .company-details h1 {
margin:0; margin:0;
font-style: normal;
font-weight: bold; font-weight: bold;
font-size: 15px; font-size: 15px;
line-height: 22px; line-height: 22px;
@ -367,26 +77,117 @@
text-align: left; text-align: left;
max-width: 220px; max-width: 220px;
} }
.company-details h4 {
margin:0; .company-address{
font-style: normal; text-align: left;
font-weight: 100; font-size: 10px;
font-size: 18px; line-height: 15px;
line-height: 25px; color: #595959;
text-align: right; margin: 0px;
}
.company-details h3 {
margin-bottom:1px;
margin-top:0;
}
tr.total td {
border-bottom:1px solid #E8E8E8;
border-top:1px solid #E8E8E8;
} }
.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 { .notes {
font-style: normal;
font-weight: 300;
font-size: 12px; font-size: 12px;
color: #595959; color: #595959;
margin-top: 15px; margin-top: 15px;
@ -397,8 +198,6 @@
} }
.notes-label { .notes-label {
font-style: normal;
font-weight: normal;
font-size: 15px; font-size: 15px;
line-height: 22px; line-height: 22px;
letter-spacing: 0.05em; letter-spacing: 0.05em;
@ -408,7 +207,7 @@
padding-bottom: 10px; padding-bottom: 10px;
} }
.content-header { .content-heading {
margin-top: 120px; margin-top: 120px;
width: 100%; width: 100%;
text-align: center; text-align: center;
@ -419,14 +218,17 @@
margin: 0 0 0 0; margin: 0 0 0 0;
} }
.content-header span { .content-heading span {
font-weight: 500; font-weight: 400;
font-size: 14px; font-size: 14px;
line-height: 25px; line-height: 25px;
padding-bottom: 5px;
border-bottom: 1px solid #B9C1D1; border-bottom: 1px solid #B9C1D1;
} }
.total-amount { /* -- Total Display Box -- */
.total-display-box {
width: 315px; width: 315px;
display: block; display: block;
margin-right: 30px; margin-right: 30px;
@ -437,7 +239,7 @@
padding: 12px 15px 15px 15px; padding: 12px 15px 15px 15px;
} }
.total-amount-label { .total-display-label {
display: inline; display: inline;
font-weight: 600; font-weight: 600;
font-size: 14px; font-size: 14px;
@ -445,7 +247,7 @@
color: #595959; color: #595959;
} }
.total-amount span { .total-display-box span {
float: right; float: right;
font-weight: 500; font-weight: 500;
font-size: 14px; font-size: 14px;
@ -453,62 +255,64 @@
text-align: right; text-align: right;
color: #5851D8; color: #5851D8;
} }
</style> </style>
</head> </head>
<body> <body>
<div class="header-table"> <div class="header-container">
<table width="100%"> <table width="100%">
<tr> <tr>
@if($logo) @if($logo)
<td class="header-left"> <td class="header-section-left">
<img class="header-logo" src="{{ $logo }}" alt="Company Logo"> <img class="header-logo" src="{{ $logo }}" alt="Company Logo">
@else @else
@if($payment->user->company) @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> <h1 class="header-logo"> {{$payment->user->company->name}} </h1>
@endif @endif
@endif @endif
</td> </td>
<td class="header-right company-details"> <td class="header-section-right company-details">
@include('app.pdf.payment.partials.company-address') @include('app.pdf.payment.partials.company-address')
</td> </td>
</tr> </tr>
</table> </table>
</div> </div>
<hr style="border: 0.620315px solid #E8E8E8;"> <hr style="border: 0.620315px solid #E8E8E8;">
<p class="content-header">
<p class="content-heading">
<span>PAYMENT RECEIPT</span> <span>PAYMENT RECEIPT</span>
</p> </p>
<div class="wrapper">
<div class="address"> <div class="content-wrapper">
<div class="bill-add"> <div class="main-content">
<div style="float:left;"> <div class="customer-address-container">
<div class="billing-address-container">
@include('app.pdf.payment.partials.billing-address') @include('app.pdf.payment.partials.billing-address')
</div> </div>
<div style="float:right;"> <div class="billing-address-container--right">
</div> </div>
<div style="clear: both;"></div> <div style="clear: both;"></div>
</div> </div>
<div class="job-add"> <div class="payment-details-container">
<table width="100%"> <table width="100%">
<tr> <tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Payment Date</td> <td class="attribute-label">Payment Date</td>
<td class="textStyle2"> &nbsp;{{$payment->formattedPaymentDate}}</td> <td class="attribute-value"> &nbsp;{{$payment->formattedPaymentDate}}</td>
</tr> </tr>
<tr> <tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Payment Number</td> <td class="attribute-label">Payment Number</td>
<td class="textStyle2"> &nbsp;{{$payment->payment_number}}</td> <td class="attribute-value"> &nbsp;{{$payment->payment_number}}</td>
</tr> </tr>
<tr> <tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Payment Mode</td> <td class="attribute-label">Payment Mode</td>
<td class="textStyle2"> &nbsp;{{$payment->paymentMethod ? $payment->paymentMethod->name : '-'}}</td> <td class="attribute-value"> &nbsp;{{$payment->paymentMethod ? $payment->paymentMethod->name : '-'}}</td>
</tr> </tr>
@if ($payment->invoice && $payment->invoice->invoice_number) @if ($payment->invoice && $payment->invoice->invoice_number)
<tr> <tr>
<td class="textStyle1" style="text-align: left; color: #55547A">Invoice</td> <td class="attribute-label">Invoice</td>
<td class="textStyle2"> &nbsp;{{$payment->invoice->invoice_number}}</td> <td class="attribute-value"> &nbsp;{{$payment->invoice->invoice_number}}</td>
</tr> </tr>
@endif @endif
</table> </table>
@ -516,8 +320,8 @@
</div> </div>
<div style="clear: both;"></div> <div style="clear: both;"></div>
</div> </div>
<div class="total-amount"> <div class="total-display-box">
<p class="total-amount-label">Amount Received</p> <p class="total-display-label">Amount Received</p>
<span>{!! format_money_pdf($payment->amount, $payment->user->currency) !!}</span> <span>{!! format_money_pdf($payment->amount, $payment->user->currency) !!}</span>
</div> </div>
</body> </body>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -122,23 +122,41 @@ Route::group(['middleware' => 'api'], function () {
'middleware' => 'admin' 'middleware' => 'admin'
], function () { ], function () {
// Self Update
// Auto update routes
//---------------------------------- //----------------------------------
Route::post('/update', [
'as' => 'auto.update', Route::get('/check/update', [
'uses' => 'UpdateController@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', [ Route::post('/update/finish', [
'as' => 'auto.update.finish', 'as' => 'update.finish',
'uses' => 'UpdateController@finishUpdate' 'uses' => 'UpdateController@finishUpdate'
]); ]);
Route::get('/check/update', [ // Bootstrap
'as' => 'check.update', //----------------------------------
'uses' => 'UpdateController@checkLatestVersion'
]);
Route::get('/bootstrap', [ Route::get('/bootstrap', [
'as' => 'bootstrap', 'as' => 'bootstrap',

View File

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