From 53f82a808be73a3208837fa11e0e912487ee0c82 Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Fri, 21 Sep 2018 01:27:56 +0200 Subject: [PATCH] improved invoices with new renderer (#306) * added docx renderer and demo template * added csv renderer and demo template * added xlsx renderer and demo template * added ods renderer and demo template * added user calculator * added invoice documentation --- .gitignore | 7 +- .scrutinizer.yml | 7 + README.md | 5 +- UPGRADING.md | 9 + assets/sass/content.scss | 7 +- assets/sass/invoice.scss | 5 + composer.json | 2 + composer.lock | 430 +++++++++++++++++- config/packages/kimai.yaml | 17 +- config/services.yaml | 9 +- public/build/app.css | 2 +- public/build/manifest.json | 2 +- src/Command/KimaiImporterCommand.php | 46 +- src/Controller/InvoiceController.php | 61 ++- src/Controller/InvoicePrintController.php | 54 --- src/DataFixtures/InvoiceFixtures.php | 158 +++---- src/DependencyInjection/AppExtension.php | 22 +- .../Compiler/InvoiceServiceCompilerPass.php | 51 +++ .../Compiler/TwigContextCompilerPass.php | 12 + src/DependencyInjection/Configuration.php | 33 +- src/Entity/InvoiceDocument.php | 52 +++ src/Entity/Timesheet.php | 2 + src/Form/Type/InvoiceCalculatorType.php | 9 +- src/Form/Type/InvoiceNumberGeneratorType.php | 9 +- src/Form/Type/InvoiceRendererType.php | 40 +- .../AbstractCalculator.php} | 20 +- .../Calculator/AbstractMergedCalculator.php | 51 +++ src/Invoice/Calculator/DefaultCalculator.php | 38 ++ .../Calculator/ShortInvoiceCalculator.php | 47 ++ .../Calculator/UserInvoiceCalculator.php | 51 +++ src/Invoice/CalculatorInterface.php | 10 + .../DateNumberGenerator.php | 13 +- src/Invoice/NumberGeneratorInterface.php | 10 + src/Invoice/Renderer/AbstractRenderer.php | 82 ++++ .../Renderer/AbstractSpreadsheetRenderer.php | 129 ++++++ src/Invoice/Renderer/CsvRenderer.php | 47 ++ src/Invoice/Renderer/DocxRenderer.php | 88 ++++ src/Invoice/Renderer/OdsRenderer.php | 47 ++ src/Invoice/Renderer/RendererTrait.php | 180 ++++++++ src/Invoice/Renderer/TwigRenderer.php | 57 +++ src/Invoice/Renderer/XlsxRenderer.php | 47 ++ src/Invoice/RendererInterface.php | 34 ++ src/Invoice/ServiceInvoice.php | 116 +++-- src/Invoice/ShortInvoiceCalculator.php | 44 -- src/Kernel.php | 16 +- src/Model/InvoiceModel.php | 29 +- src/Model/Statistic/Month.php | 9 +- src/Model/Statistic/Year.php | 6 +- src/Repository/InvoiceDocumentRepository.php | 72 +++ src/Repository/Query/InvoiceQuery.php | 19 - src/Timesheet/Calculator/RateCalculator.php | 25 +- src/Twig/MarkdownExtension.php | 6 +- symfony.lock | 18 + templates/invoice/index.html.twig | 27 +- templates/invoice/layout.html.twig | 26 ++ templates/invoice/preview.html.twig | 52 +++ templates/invoice/renderer/company.docx | Bin 0 -> 8899 bytes .../{invoice.html.twig => default.html.twig} | 12 +- templates/invoice/renderer/export.csv | 2 + .../invoice/renderer/freelancer.html.twig | 16 +- .../invoice/renderer/open-spreadsheet.ods | Bin 0 -> 18571 bytes templates/invoice/renderer/spreadsheet.xlsx | Bin 0 -> 5685 bytes .../invoice/renderer/timesheet.html.twig | 25 +- templates/invoice/templates.html.twig | 2 - templates/timesheet/index.html.twig | 2 +- tests/Command/CreateUserCommandTest.php | 2 +- tests/Controller/ActivityControllerTest.php | 2 - tests/Controller/InvoiceControllerTest.php | 83 +++- tests/Controller/SidebarControllerTest.php | 2 +- tests/DataFixtures/TimesheetFixtures.php | 12 + .../AbstractInvoiceCalculatorTest.php | 96 ++++ .../DefaultCalculatorTest.php | 28 +- .../ShortInvoiceCalculatorTest.php | 96 ++-- .../Calculator/UserInvoiceCalculatorTest.php | 129 ++++++ .../DateNumberGeneratorTest.php | 29 ++ .../Invoice/Renderer/AbstractRendererTest.php | 176 +++++++ tests/Invoice/Renderer/CsvRendererTest.php | 67 +++ tests/Invoice/Renderer/DocxRendererTest.php | 69 +++ tests/Invoice/Renderer/OdsRendererTest.php | 70 +++ tests/Invoice/Renderer/TwigRendererTest.php | 65 +++ tests/Invoice/Renderer/XlsxRendererTest.php | 70 +++ tests/Invoice/ServiceInvoiceTest.php | 77 ++++ tests/Model/ActivityStatisticTest.php | 39 ++ tests/Model/CustomerStatisticTest.php | 45 ++ tests/Model/DashboardSectionTest.php | 42 ++ tests/Model/InvoiceModelTest.php | 65 +++ tests/Model/ProjectStatisticTest.php | 42 ++ tests/Model/Statistic/MonthTest.php | 65 +++ tests/Model/Statistic/YearTest.php | 48 ++ tests/Model/TimesheetStatisticTest.php | 50 ++ .../InvoiceDocumentRepositoryTest.php | 60 +++ .../Calculator/RateCalculatorTest.php | 42 -- tests/Twig/ExtensionsTest.php | 1 + tests/Twig/MarkdownExtensionTest.php | 2 + translations/invoice-calculator.de.xliff | 23 + translations/invoice-calculator.en.xliff | 23 + translations/invoice-calculator.es.xliff | 19 + translations/invoice-calculator.fr.xliff | 19 + translations/invoice-calculator.it.xliff | 19 + translations/invoice-calculator.ru.xliff | 19 + translations/invoice-numbergenerator.de.xliff | 15 + translations/invoice-numbergenerator.en.xliff | 15 + translations/invoice-numbergenerator.es.xliff | 15 + translations/invoice-numbergenerator.fr.xliff | 15 + translations/invoice-numbergenerator.it.xliff | 15 + translations/invoice-numbergenerator.ru.xliff | 15 + translations/invoice-renderer.de.xliff | 39 ++ translations/invoice-renderer.en.xliff | 39 ++ translations/invoice-renderer.es.xliff | 19 + translations/invoice-renderer.fr.xliff | 19 + translations/invoice-renderer.it.xliff | 19 + translations/invoice-renderer.ru.xliff | 19 + translations/messages.de.xliff | 50 +- translations/messages.en.xliff | 50 +- translations/messages.es.xliff | 32 -- translations/messages.fr.xliff | 32 -- translations/messages.it.xliff | 32 -- translations/messages.ru.xliff | 32 -- var/docs/README.md | 1 + var/docs/developers.md | 6 +- var/docs/invoices.md | 163 +++++++ 121 files changed, 4094 insertions(+), 770 deletions(-) delete mode 100644 src/Controller/InvoicePrintController.php create mode 100644 src/DependencyInjection/Compiler/InvoiceServiceCompilerPass.php create mode 100644 src/Entity/InvoiceDocument.php rename src/Invoice/{DefaultCalculator.php => Calculator/AbstractCalculator.php} (85%) create mode 100644 src/Invoice/Calculator/AbstractMergedCalculator.php create mode 100644 src/Invoice/Calculator/DefaultCalculator.php create mode 100644 src/Invoice/Calculator/ShortInvoiceCalculator.php create mode 100644 src/Invoice/Calculator/UserInvoiceCalculator.php rename src/Invoice/{ => NumberGenerator}/DateNumberGenerator.php (73%) create mode 100644 src/Invoice/Renderer/AbstractRenderer.php create mode 100644 src/Invoice/Renderer/AbstractSpreadsheetRenderer.php create mode 100644 src/Invoice/Renderer/CsvRenderer.php create mode 100644 src/Invoice/Renderer/DocxRenderer.php create mode 100644 src/Invoice/Renderer/OdsRenderer.php create mode 100644 src/Invoice/Renderer/RendererTrait.php create mode 100644 src/Invoice/Renderer/TwigRenderer.php create mode 100644 src/Invoice/Renderer/XlsxRenderer.php create mode 100644 src/Invoice/RendererInterface.php delete mode 100644 src/Invoice/ShortInvoiceCalculator.php create mode 100644 src/Repository/InvoiceDocumentRepository.php create mode 100644 templates/invoice/layout.html.twig create mode 100644 templates/invoice/preview.html.twig create mode 100644 templates/invoice/renderer/company.docx rename templates/invoice/renderer/{invoice.html.twig => default.html.twig} (94%) create mode 100644 templates/invoice/renderer/export.csv create mode 100644 templates/invoice/renderer/open-spreadsheet.ods create mode 100644 templates/invoice/renderer/spreadsheet.xlsx create mode 100644 tests/Invoice/Calculator/AbstractInvoiceCalculatorTest.php rename tests/Invoice/{ => Calculator}/DefaultCalculatorTest.php (66%) rename tests/Invoice/{ => Calculator}/ShortInvoiceCalculatorTest.php (50%) create mode 100644 tests/Invoice/Calculator/UserInvoiceCalculatorTest.php create mode 100644 tests/Invoice/NumberGenerator/DateNumberGeneratorTest.php create mode 100644 tests/Invoice/Renderer/AbstractRendererTest.php create mode 100644 tests/Invoice/Renderer/CsvRendererTest.php create mode 100644 tests/Invoice/Renderer/DocxRendererTest.php create mode 100644 tests/Invoice/Renderer/OdsRendererTest.php create mode 100644 tests/Invoice/Renderer/TwigRendererTest.php create mode 100644 tests/Invoice/Renderer/XlsxRendererTest.php create mode 100644 tests/Invoice/ServiceInvoiceTest.php create mode 100644 tests/Model/ActivityStatisticTest.php create mode 100644 tests/Model/CustomerStatisticTest.php create mode 100644 tests/Model/DashboardSectionTest.php create mode 100644 tests/Model/InvoiceModelTest.php create mode 100644 tests/Model/ProjectStatisticTest.php create mode 100644 tests/Model/Statistic/MonthTest.php create mode 100644 tests/Model/Statistic/YearTest.php create mode 100644 tests/Model/TimesheetStatisticTest.php create mode 100644 tests/Repository/InvoiceDocumentRepositoryTest.php create mode 100644 translations/invoice-calculator.de.xliff create mode 100644 translations/invoice-calculator.en.xliff create mode 100644 translations/invoice-calculator.es.xliff create mode 100644 translations/invoice-calculator.fr.xliff create mode 100644 translations/invoice-calculator.it.xliff create mode 100644 translations/invoice-calculator.ru.xliff create mode 100644 translations/invoice-numbergenerator.de.xliff create mode 100644 translations/invoice-numbergenerator.en.xliff create mode 100644 translations/invoice-numbergenerator.es.xliff create mode 100644 translations/invoice-numbergenerator.fr.xliff create mode 100644 translations/invoice-numbergenerator.it.xliff create mode 100644 translations/invoice-numbergenerator.ru.xliff create mode 100644 translations/invoice-renderer.de.xliff create mode 100644 translations/invoice-renderer.en.xliff create mode 100644 translations/invoice-renderer.es.xliff create mode 100644 translations/invoice-renderer.fr.xliff create mode 100644 translations/invoice-renderer.it.xliff create mode 100644 translations/invoice-renderer.ru.xliff create mode 100644 var/docs/invoices.md diff --git a/.gitignore b/.gitignore index e265463b..91cef87a 100644 --- a/.gitignore +++ b/.gitignore @@ -7,11 +7,16 @@ !bin/console /config/packages/local.yaml -/var/data/kimai.sqlite +templates/invoice/renderer/.~lock* + +/var/data/*.sqlite +!/var/data/kimai_test.sqlite /var/coverage/ /var/cache/* !var/cache/.gitkeep +/var/invoices/* + /var/log/* !var/log/.gitkeep diff --git a/.scrutinizer.yml b/.scrutinizer.yml index 43e482ec..3ccf133f 100644 --- a/.scrutinizer.yml +++ b/.scrutinizer.yml @@ -12,11 +12,13 @@ build: override: - command: 'vendor/bin/phpunit --coverage-clover=clover.xml tests/' + stop_on_failure: true coverage: file: 'clover.xml' format: 'clover' - command: 'bin/console kimai:phpcs --checkstyle=checkstyle' + stop_on_failure: true analysis: file: 'checkstyle' format: 'php-cs-checkstyle' @@ -33,3 +35,8 @@ filter: dependency_paths: - 'node_modules/' - 'vendor/' + +build_failure_conditions: + - 'project.metric("scrutinizer.quality", < 9.30)' + - 'project.metric("scrutinizer.test_coverage", < 0.70)' + - 'project.metric_change("scrutinizer.test_coverage", < 0.01)' \ No newline at end of file diff --git a/README.md b/README.md index afe027ea..bb6bb6bc 100644 --- a/README.md +++ b/README.md @@ -55,10 +55,11 @@ git clone https://github.com/kevinpapst/kimai2.git cd kimai2/ ``` -Make sure the [file permissions are correct](https://symfony.com/doc/current/setup/file_permissions.html): +Make sure the [file permissions are correct](https://symfony.com/doc/current/setup/file_permissions.html) and create your `.env` file: ```bash chown -R www-data var/ chmod -R 777 var/ +cp .env.dist .env ``` It's up to you which database server you want to use, Kimai v2 supports MySQL/MariaDB and SQLite. @@ -66,7 +67,7 @@ Configure the database connection string in your the `.env` file: ``` # adjust all settings in .env to your needs APP_ENV=prod -DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name +DATABASE_URL=mysql://user:password@127.0.0.1:3306/database ``` Now install all dependencies for Kimai 2: diff --git a/UPGRADING.md b/UPGRADING.md index 3425cfda..26bab817 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -19,6 +19,15 @@ bin/console doctrine:migrations:migrate There might be version specific tasks that need to be executed before or after these steps, please see below if your updated version is mentioned below. +## [0.5](https://github.com/kevinpapst/kimai2/releases/tag/0.5) (unreleased) + +Some configuration nodes were removed, if you have one of them in your `local.yaml` you need to delete them: +- `kimai.invoice.calculator` +- `kimai.invoice.renderer` +- `kimai.invoice.number_generator` + +The new config `kimai.invoice.documents` was introduced, holding a list of directories ([read more](https://github.com/kevinpapst/kimai2/blob/master/var/docs/invoices.md)). + ## [0.4](https://github.com/kevinpapst/kimai2/releases/tag/0.4) (2018-09-01) In the time between 0.3 and 0.4 there was a release of composer that introduced a BC break, diff --git a/assets/sass/content.scss b/assets/sass/content.scss index 5ec1b3e0..c5e4e24c 100644 --- a/assets/sass/content.scss +++ b/assets/sass/content.scss @@ -31,8 +31,11 @@ td { &.timesheet-description { - & >ul { - padding-left: 10px; + ul { + padding-left: 15px; + } + p { + margin: 0; } } } \ No newline at end of file diff --git a/assets/sass/invoice.scss b/assets/sass/invoice.scss index df55baa4..4d744a1b 100644 --- a/assets/sass/invoice.scss +++ b/assets/sass/invoice.scss @@ -5,6 +5,11 @@ * file that was distributed with this source code. */ +body.invoice_print +{ + margin: 20px; +} + .invoice { margin: 0; } diff --git a/composer.json b/composer.json index c3ef6ce2..ec463681 100644 --- a/composer.json +++ b/composer.json @@ -16,6 +16,8 @@ "kevinpapst/adminlte-bundle": "^2.1", "nelmio/api-doc-bundle": "^3.2", "ocramius/proxy-manager": "2.1.1", + "phpoffice/phpspreadsheet": "^1.4", + "phpoffice/phpword": "^0.15.0", "sensio/framework-extra-bundle": "^5.2", "symfony/asset": "^4.0", "symfony/console": "^4.0", diff --git a/composer.lock b/composer.lock index af873bad..9cba6d63 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "26a66efe4ec32d6644deeaff090a303b", + "content-hash": "a26c523a27230af927eae4b468daadda", "packages": [ { "name": "beberlei/DoctrineExtensions", @@ -1899,6 +1899,101 @@ "description": "Admin Theme based on the AdminLTE 2.4.8 for easy integration with Symfony 4", "time": "2018-09-02T17:21:38+00:00" }, + { + "name": "markbaker/complex", + "version": "1.4.6", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "a78d82ae4e682c3809fc3023d1b0ce654f6ab12b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/a78d82ae4e682c3809fc3023d1b0ce654f6ab12b", + "reference": "a78d82ae4e682c3809fc3023d1b0ce654f6ab12b", + "shasum": "" + }, + "require": { + "php": "^5.6.0|^7.0.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3", + "phpcompatibility/php-compatibility": "^8.0", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "2.*", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^4.8.35|^5.4.0", + "sebastian/phpcpd": "2.*", + "squizlabs/php_codesniffer": "^3.3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + }, + "files": [ + "classes/src/functions/abs.php", + "classes/src/functions/acos.php", + "classes/src/functions/acosh.php", + "classes/src/functions/acot.php", + "classes/src/functions/acoth.php", + "classes/src/functions/acsc.php", + "classes/src/functions/acsch.php", + "classes/src/functions/argument.php", + "classes/src/functions/asec.php", + "classes/src/functions/asech.php", + "classes/src/functions/asin.php", + "classes/src/functions/asinh.php", + "classes/src/functions/atan.php", + "classes/src/functions/atanh.php", + "classes/src/functions/conjugate.php", + "classes/src/functions/cos.php", + "classes/src/functions/cosh.php", + "classes/src/functions/cot.php", + "classes/src/functions/coth.php", + "classes/src/functions/csc.php", + "classes/src/functions/csch.php", + "classes/src/functions/exp.php", + "classes/src/functions/inverse.php", + "classes/src/functions/ln.php", + "classes/src/functions/log2.php", + "classes/src/functions/log10.php", + "classes/src/functions/negative.php", + "classes/src/functions/pow.php", + "classes/src/functions/rho.php", + "classes/src/functions/sec.php", + "classes/src/functions/sech.php", + "classes/src/functions/sin.php", + "classes/src/functions/sinh.php", + "classes/src/functions/sqrt.php", + "classes/src/functions/tan.php", + "classes/src/functions/tanh.php", + "classes/src/functions/theta.php", + "classes/src/operations/add.php", + "classes/src/operations/subtract.php", + "classes/src/operations/multiply.php", + "classes/src/operations/divideby.php", + "classes/src/operations/divideinto.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "time": "2018-07-31T08:38:40+00:00" + }, { "name": "monolog/monolog", "version": "1.23.0", @@ -2295,6 +2390,43 @@ ], "time": "2018-07-04T16:31:37+00:00" }, + { + "name": "pclzip/pclzip", + "version": "2.8.2", + "source": { + "type": "git", + "url": "https://github.com/ivanlanin/pclzip.git", + "reference": "19dd1de9d3f5fc4d7d70175b4c344dee329f45fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ivanlanin/pclzip/zipball/19dd1de9d3f5fc4d7d70175b4c344dee329f45fd", + "reference": "19dd1de9d3f5fc4d7d70175b4c344dee329f45fd", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "pclzip.lib.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "Vincent Blavet" + } + ], + "description": "A PHP library that offers compression and extraction functions for Zip formatted archives", + "homepage": "http://www.phpconcept.net/pclzip", + "keywords": [ + "php", + "zip" + ], + "time": "2014-06-05T11:42:24+00:00" + }, { "name": "phpcollection/phpcollection", "version": "0.5.0", @@ -2495,6 +2627,257 @@ ], "time": "2017-07-14T14:27:02+00:00" }, + { + "name": "phpoffice/common", + "version": "0.2.9", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/Common.git", + "reference": "edb5d32b1e3400a35a5c91e2539ed6f6ce925e4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/Common/zipball/edb5d32b1e3400a35a5c91e2539ed6f6ce925e4d", + "reference": "edb5d32b1e3400a35a5c91e2539ed6f6ce925e4d", + "shasum": "" + }, + "require": { + "pclzip/pclzip": "^2.8", + "php": ">=5.3.0" + }, + "require-dev": { + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "2.*", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^4.8.36 || ^7.0", + "sebastian/phpcpd": "2.*", + "squizlabs/php_codesniffer": "2.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\Common\\": "src/Common/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL" + ], + "authors": [ + { + "name": "Mark Baker" + }, + { + "name": "Franck Lefevre", + "homepage": "http://rootslabs.net" + } + ], + "description": "PHPOffice Common", + "homepage": "http://phpoffice.github.io", + "keywords": [ + "common", + "component", + "office", + "php" + ], + "time": "2018-07-13T14:12:34+00:00" + }, + { + "name": "phpoffice/phpspreadsheet", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "125f462a718956f37d81305ca0df4f17cef0f3b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/125f462a718956f37d81305ca0df4f17cef0f3b9", + "reference": "125f462a718956f37d81305ca0df4f17cef0f3b9", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-dom": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "markbaker/complex": "^1.4.1", + "php": "^5.6|^7.0", + "psr/simple-cache": "^1.0" + }, + "require-dev": { + "dompdf/dompdf": "^0.8.0", + "friendsofphp/php-cs-fixer": "@stable", + "jpgraph/jpgraph": "^4.0", + "mpdf/mpdf": "^7.0.0", + "phpunit/phpunit": "^5.7", + "squizlabs/php_codesniffer": "^3.3", + "tecnickcom/tcpdf": "^6.2" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnick.com/tcpdf": "Option for rendering PDF with PDF Writer" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "http://blog.maartenballiauw.be" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Franck Lefevre", + "homepage": "http://rootslabs.net" + }, + { + "name": "Mark Baker", + "homepage": "http://markbakeruk.net" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "time": "2018-08-06T02:58:06+00:00" + }, + { + "name": "phpoffice/phpword", + "version": "0.15.0", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PHPWord.git", + "reference": "dfa2f36cad2b632b7ab1c56473e4f5db9a7caf7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PHPWord/zipball/dfa2f36cad2b632b7ab1c56473e4f5db9a7caf7f", + "reference": "dfa2f36cad2b632b7ab1c56473e4f5db9a7caf7f", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": "^5.3.3 || ^7.0", + "phpoffice/common": "^0.2.9", + "zendframework/zend-escaper": "^2.2" + }, + "require-dev": { + "dompdf/dompdf": "0.8.*", + "ext-gd": "*", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^2.2", + "mpdf/mpdf": "5.7.4 || 6.* || 7.*", + "php-coveralls/php-coveralls": "1.1.0 || ^2.0", + "phploc/phploc": "2.* || 3.* || 4.*", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^4.8.36 || ^7.0", + "squizlabs/php_codesniffer": "^2.9", + "tecnickcom/tcpdf": "6.*" + }, + "suggest": { + "dompdf/dompdf": "Allows writing PDF", + "ext-gd2": "Allows adding images", + "ext-xmlwriter": "Allows writing OOXML and ODF", + "ext-xsl": "Allows applying XSL style sheet to headers, to main document part, and to footers of an OOXML template", + "ext-zip": "Allows writing OOXML and ODF" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "0.16-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOffice\\PhpWord\\": "src/PhpWord" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Mark Baker" + }, + { + "name": "Gabriel Bull", + "email": "me@gabrielbull.com", + "homepage": "http://gabrielbull.com/" + }, + { + "name": "Ivan Lanin", + "homepage": "http://ivan.lanin.org" + }, + { + "name": "Roman Syroeshko", + "homepage": "http://ru.linkedin.com/pub/roman-syroeshko/34/a53/994/" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net/blog/" + }, + { + "name": "Antoine de Troostembergh" + } + ], + "description": "PHPWord - A pure PHP library for reading and writing word processing documents (OOXML, ODF, RTF, HTML, PDF)", + "homepage": "http://phpoffice.github.io", + "keywords": [ + "ISO IEC 29500", + "OOXML", + "Office Open XML", + "OpenDocument", + "OpenXML", + "PhpOffice", + "PhpWord", + "Rich Text Format", + "WordprocessingML", + "doc", + "docx", + "html", + "odf", + "odt", + "office", + "pdf", + "php", + "reader", + "rtf", + "template", + "template processor", + "word", + "writer" + ], + "time": "2018-07-14T16:59:43+00:00" + }, { "name": "phpoption/phpoption", "version": "1.5.0", @@ -6216,6 +6599,51 @@ ], "time": "2018-08-13T20:36:59+00:00" }, + { + "name": "zendframework/zend-escaper", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-escaper.git", + "reference": "31d8aafae982f9568287cb4dce987e6aff8fd074" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-escaper/zipball/31d8aafae982f9568287cb4dce987e6aff8fd074", + "reference": "31d8aafae982f9568287cb4dce987e6aff8fd074", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", + "zendframework/zend-coding-standard": "~1.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6.x-dev", + "dev-develop": "2.7.x-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Escaper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs", + "keywords": [ + "ZendFramework", + "escaper", + "zf" + ], + "time": "2018-04-25T15:48:53+00:00" + }, { "name": "zendframework/zend-eventmanager", "version": "3.2.1", diff --git a/config/packages/kimai.yaml b/config/packages/kimai.yaml index 4d772554..e1769dca 100644 --- a/config/packages/kimai.yaml +++ b/config/packages/kimai.yaml @@ -33,17 +33,12 @@ kimai: # days: ['saturday','sunday'] # factor: 1.5 - # All configs related to the invoice administration - invoice: - renderer: - default: 'App\Controller\InvoicePrintController::printInvoice' - timesheet: 'App\Controller\InvoicePrintController::printTimesheet' - freelancer: 'App\Controller\InvoicePrintController::printFreelancer' - calculator: - default: 'App\Invoice\DefaultCalculator' - short: 'App\Invoice\ShortInvoiceCalculator' - number_generator: - default: 'App\Invoice\DateNumberGenerator' + # Invoice management + #invoice: + # # all files in these directories will be used as invoice documents (if supported by a renderer) + # documents: + # - 'var/invoices/' + # - 'templates/invoice/renderer/' # Language specific settings, like the date formats languages: diff --git a/config/services.yaml b/config/services.yaml index d8a15188..f5155fc9 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -32,10 +32,6 @@ services: # APPLICATION CORE # ================================================================================ - App\Invoice\ServiceInvoice: - class: App\Invoice\ServiceInvoice - arguments: ['%kimai.invoice%'] - App\EventSubscriber\RedirectToLocaleSubscriber: class: App\EventSubscriber\RedirectToLocaleSubscriber arguments: ['@router', '%app_locales%', '%locale%'] @@ -150,3 +146,8 @@ services: class: Doctrine\ORM\EntityRepository factory: ['@doctrine.orm.entity_manager', getRepository] arguments: ['App\Entity\InvoiceTemplate'] + + App\Repository\InvoiceDocumentRepository: + class: App\Repository\InvoiceDocumentRepository + arguments: ['%kimai.invoice.documents%'] + diff --git a/public/build/app.css b/public/build/app.css index 5318f172..cef31fc5 100644 --- a/public/build/app.css +++ b/public/build/app.css @@ -36,7 +36,7 @@ * Website: Almsaeed Studio * License: Open source - MIT * Please visit http://opensource.org/licenses/MIT for more information - */.layout-boxed body,.layout-boxed html,body,html{height:100%}body{font-family:Source Sans Pro,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400}.wrapper,body{overflow-x:hidden;overflow-y:auto}.wrapper{height:100%;position:relative}.wrapper:after,.wrapper:before{content:" ";display:table}.wrapper:after{clear:both}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;min-height:100%;box-shadow:0 0 8px rgba(0,0,0,.5);position:relative}.layout-boxed{background-color:#f9fafc}.content-wrapper,.main-footer{-webkit-transition:-webkit-transform .3s ease-in-out,margin .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,margin .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,margin .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out;margin-left:230px;z-index:820}.layout-top-nav .content-wrapper,.layout-top-nav .main-footer{margin-left:0}@media (max-width:767px){.content-wrapper,.main-footer{margin-left:0}}@media (min-width:768px){.sidebar-collapse .content-wrapper,.sidebar-collapse .main-footer{margin-left:0}}@media (max-width:767px){.sidebar-open .content-wrapper,.sidebar-open .main-footer{-webkit-transform:translate(230px);-ms-transform:translate(230px);-o-transform:translate(230px);transform:translate(230px)}}.content-wrapper{min-height:100%;background-color:#ecf0f5;z-index:800}.main-footer{background:#fff;padding:15px;color:#444;border-top:1px solid #d2d6de}.fixed .left-side,.fixed .main-header,.fixed .main-sidebar{position:fixed}.fixed .main-header{top:0;right:0;left:0}.fixed .content-wrapper,.fixed .right-side{padding-top:50px}@media (max-width:767px){.fixed .content-wrapper,.fixed .right-side{padding-top:100px}}.fixed.layout-boxed .wrapper{max-width:100%}.fixed .wrapper{overflow:hidden}.hold-transition .content-wrapper,.hold-transition .left-side,.hold-transition .main-footer,.hold-transition .main-header .logo,.hold-transition .main-header .navbar,.hold-transition .main-sidebar,.hold-transition .menu-open .fa-angle-left,.hold-transition .right-side{-webkit-transition:none;-o-transition:none;transition:none}.content{min-height:250px;padding:15px;margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:Source Sans Pro,sans-serif}a{color:#3c8dbc}a:active,a:focus,a:hover{outline:none;text-decoration:none;color:#72afd2}.page-header{margin:10px 0 20px;font-size:22px}.page-header>small{color:#666;display:block;margin-top:5px}.main-header{position:relative;max-height:100px;z-index:1030}.main-header .navbar{-webkit-transition:margin-left .3s ease-in-out;-o-transition:margin-left .3s ease-in-out;transition:margin-left .3s ease-in-out;margin-bottom:0;margin-left:230px;border:none;min-height:50px;border-radius:0}.layout-top-nav .main-header .navbar{margin-left:0}.main-header #navbar-search-input.form-control{background:hsla(0,0%,100%,.2);border-color:transparent}.main-header #navbar-search-input.form-control:active,.main-header #navbar-search-input.form-control:focus{border-color:rgba(0,0,0,.1);background:hsla(0,0%,100%,.9)}.main-header #navbar-search-input.form-control::-moz-placeholder{color:#ccc;opacity:1}.main-header #navbar-search-input.form-control:-ms-input-placeholder{color:#ccc}.main-header #navbar-search-input.form-control::-webkit-input-placeholder{color:#ccc}.main-header .navbar-custom-menu,.main-header .navbar-right{float:right}@media (max-width:991px){.main-header .navbar-custom-menu a,.main-header .navbar-right a{color:inherit;background:transparent}}@media (max-width:767px){.main-header .navbar-right{float:none}.navbar-collapse .main-header .navbar-right{margin:7.5px -15px}.main-header .navbar-right>li{color:inherit;border:0}}.main-header .sidebar-toggle{float:left;background-color:transparent;background-image:none;padding:15px;font-family:fontAwesome}.main-header .sidebar-toggle:before{content:"\F0C9"}.main-header .sidebar-toggle:hover{color:#fff}.main-header .sidebar-toggle:active,.main-header .sidebar-toggle:focus{background:transparent}.main-header .sidebar-toggle .icon-bar{display:none}.main-header .navbar .nav>li.user>a>.fa,.main-header .navbar .nav>li.user>a>.glyphicon,.main-header .navbar .nav>li.user>a>.ion{margin-right:5px}.main-header .navbar .nav>li>a>.label{position:absolute;top:9px;right:7px;text-align:center;font-size:9px;padding:2px 3px;line-height:.9}.main-header .logo{-webkit-transition:width .3s ease-in-out;-o-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;float:left;height:50px;font-size:20px;line-height:50px;text-align:center;width:230px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.main-header .logo .logo-lg{display:block}.main-header .logo .logo-mini{display:none}.main-header .navbar-brand{color:#fff}.content-header{position:relative;padding:15px 15px 0}.content-header>h1{margin:0;font-size:24px}.content-header>h1>small{font-size:15px;display:inline-block;padding-left:4px;font-weight:300}.content-header>.breadcrumb{float:right;background:transparent;margin-top:0;margin-bottom:0;font-size:12px;padding:7px 5px;position:absolute;top:15px;right:10px;border-radius:2px}.content-header>.breadcrumb>li>a{color:#444;text-decoration:none;display:inline-block}.content-header>.breadcrumb>li>a>.fa,.content-header>.breadcrumb>li>a>.glyphicon,.content-header>.breadcrumb>li>a>.ion{margin-right:5px}.content-header>.breadcrumb>li+li:before{content:">\A0"}@media (max-width:991px){.content-header>.breadcrumb{position:relative;margin-top:5px;top:0;right:0;float:none;background:#d2d6de;padding-left:10px}.content-header>.breadcrumb li:before{color:#97a0b3}}.navbar-toggle{color:#fff;border:0;margin:0;padding:15px}@media (max-width:991px){.navbar-custom-menu .navbar-nav>li{float:left}.navbar-custom-menu .navbar-nav{margin:0;float:left}.navbar-custom-menu .navbar-nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}}@media (max-width:767px){.main-header{position:relative}.main-header .logo,.main-header .navbar{width:100%;float:none}.main-header .navbar{margin:0}.main-header .navbar-custom-menu{float:right}}@media (max-width:991px){.navbar-collapse.pull-left{float:none!important}.navbar-collapse.pull-left+.navbar-custom-menu{display:block;position:absolute;top:0;right:40px}}.main-sidebar{position:absolute;top:0;left:0;padding-top:50px;min-height:100%;width:230px;z-index:810;-webkit-transition:-webkit-transform .3s ease-in-out,width .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,width .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,width .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out}@media (max-width:767px){.main-sidebar{padding-top:100px;-webkit-transform:translate(-230px);-ms-transform:translate(-230px);-o-transform:translate(-230px);transform:translate(-230px)}}@media (min-width:768px){.sidebar-collapse .main-sidebar{-webkit-transform:translate(-230px);-ms-transform:translate(-230px);-o-transform:translate(-230px);transform:translate(-230px)}}@media (max-width:767px){.sidebar-open .main-sidebar{-webkit-transform:translate(0);-ms-transform:translate(0);-o-transform:translate(0);transform:translate(0)}}.sidebar{padding-bottom:10px}.sidebar-form input:focus{border-color:transparent}.user-panel{position:relative;width:100%;padding:10px;overflow:hidden}.user-panel:after,.user-panel:before{content:" ";display:table}.user-panel:after{clear:both}.user-panel>.image>img{width:100%;max-width:45px;height:auto}.user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.user-panel>.info>p{font-weight:600;margin-bottom:9px}.user-panel>.info>a{text-decoration:none;padding-right:5px;margin-top:3px;font-size:11px}.user-panel>.info>a>.fa,.user-panel>.info>a>.glyphicon,.user-panel>.info>a>.ion{margin-right:3px}.sidebar-menu{list-style:none;margin:0;padding:0}.sidebar-menu>li{position:relative;margin:0;padding:0}.sidebar-menu>li>a{padding:12px 5px 12px 15px;display:block}.sidebar-menu>li>a>.fa,.sidebar-menu>li>a>.glyphicon,.sidebar-menu>li>a>.ion{width:20px}.sidebar-menu>li .badge,.sidebar-menu>li .label{margin-right:5px}.sidebar-menu>li .badge{margin-top:3px}.sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px}.sidebar-menu li>a>.fa-angle-left,.sidebar-menu li>a>.pull-right-container>.fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px;-webkit-transition:transform .5s ease;-o-transition:transform .5s ease;transition:transform .5s ease}.sidebar-menu li>a>.fa-angle-left{position:absolute;top:50%;right:10px;margin-top:-8px}.sidebar-menu .menu-open>a>.fa-angle-left,.sidebar-menu .menu-open>a>.pull-right-container>.fa-angle-left{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.sidebar-menu .active>.treeview-menu{display:block}@media (min-width:768px){.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .main-footer,.sidebar-mini.sidebar-collapse .right-side{margin-left:50px!important;z-index:840}.sidebar-mini.sidebar-collapse .main-sidebar{-webkit-transform:translate(0);-ms-transform:translate(0);-o-transform:translate(0);transform:translate(0);width:50px!important;z-index:850}.sidebar-mini.sidebar-collapse .sidebar-menu>li{position:relative}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a{margin-right:0}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{border-top-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:not(.treeview)>a>span{border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{padding-top:5px;padding-bottom:5px;border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel>.info,.sidebar-mini.sidebar-collapse .sidebar-form,.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>.pull-right,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span,.sidebar-mini.sidebar-collapse .sidebar-menu li.header{display:none!important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-header .logo{width:50px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-mini{display:block;margin-left:-15px;margin-right:-15px;font-size:18px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-lg{display:none}.sidebar-mini.sidebar-collapse .main-header .navbar{margin-left:50px}}@media (min-width:768px){.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>.treeview-menu,.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>span:not(.pull-right){display:block!important;position:absolute;width:180px;left:50px}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>span{top:0;margin-left:-3px;padding:12px 5px 12px 20px;background-color:inherit}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container{position:relative!important;float:right;width:auto!important;left:180px!important;top:-22px!important;z-index:900}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container>.label:not(:first-of-type){display:none}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{top:44px;margin-left:0}}.sidebar-expanded-on-hover .content-wrapper,.sidebar-expanded-on-hover .main-footer{margin-left:50px}.sidebar-expanded-on-hover .main-sidebar{box-shadow:3px 0 8px rgba(0,0,0,.125)}.main-sidebar .user-panel,.sidebar-menu,.sidebar-menu>li.header{white-space:nowrap;overflow:hidden}.sidebar-menu:hover{overflow:visible}.sidebar-form,.sidebar-menu>li.header{overflow:hidden;text-overflow:clip}.sidebar-menu li>a{position:relative}.sidebar-menu li>a>.pull-right-container{position:absolute;right:10px;top:50%;margin-top:-7px}.control-sidebar-bg{position:fixed;z-index:1000;bottom:0}.control-sidebar,.control-sidebar-bg{top:0;right:-230px;width:230px;-webkit-transition:right .3s ease-in-out;-o-transition:right .3s ease-in-out;transition:right .3s ease-in-out}.control-sidebar{position:absolute;padding-top:50px;z-index:1010}@media (max-width:767px){.control-sidebar{padding-top:100px}}.control-sidebar>.tab-content{padding:10px 15px}.control-sidebar-open .control-sidebar,.control-sidebar-open .control-sidebar-bg,.control-sidebar.control-sidebar-open,.control-sidebar.control-sidebar-open+.control-sidebar-bg{right:0}@media (min-width:768px){.control-sidebar-open .content-wrapper,.control-sidebar-open .main-footer,.control-sidebar-open .right-side{margin-right:230px}}.fixed .control-sidebar{position:fixed;height:100%;overflow-y:auto;padding-bottom:50px}.nav-tabs.control-sidebar-tabs>li:first-of-type>a,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:focus,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:hover{border-left-width:0}.nav-tabs.control-sidebar-tabs>li>a{border-radius:0}.nav-tabs.control-sidebar-tabs>li>a,.nav-tabs.control-sidebar-tabs>li>a:hover{border-top:none;border-right:none;border-left:1px solid transparent;border-bottom:1px solid transparent}.nav-tabs.control-sidebar-tabs>li>a .icon{font-size:16px}.nav-tabs.control-sidebar-tabs>li.active>a,.nav-tabs.control-sidebar-tabs>li.active>a:active,.nav-tabs.control-sidebar-tabs>li.active>a:focus,.nav-tabs.control-sidebar-tabs>li.active>a:hover{border-top:none;border-right:none;border-bottom:none}@media (max-width:768px){.nav-tabs.control-sidebar-tabs{display:table}.nav-tabs.control-sidebar-tabs>li{display:table-cell}}.control-sidebar-heading{font-weight:400;font-size:16px;padding:10px 0;margin-bottom:10px}.control-sidebar-subheading{display:block;font-weight:400;font-size:14px}.control-sidebar-menu{list-style:none;padding:0;margin:0 -15px}.control-sidebar-menu>li>a{display:block;padding:10px 15px}.control-sidebar-menu>li>a:after,.control-sidebar-menu>li>a:before{content:" ";display:table}.control-sidebar-menu>li>a:after{clear:both}.control-sidebar-menu>li>a>.control-sidebar-subheading{margin-top:0}.control-sidebar-menu .menu-icon{float:left;width:35px;height:35px;border-radius:50%;text-align:center;line-height:35px}.control-sidebar-menu .menu-info{margin-left:45px;margin-top:3px}.control-sidebar-menu .menu-info>.control-sidebar-subheading{margin:0}.control-sidebar-menu .menu-info>p{margin:0;font-size:11px}.control-sidebar-menu .progress{margin:0}.control-sidebar-dark{color:#b8c7ce}.control-sidebar-dark,.control-sidebar-dark+.control-sidebar-bg{background:#222d32}.control-sidebar-dark .nav-tabs.control-sidebar-tabs{border-bottom:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a{background:#181f23;color:#b8c7ce}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{border-left-color:#141a1d;border-bottom-color:#141a1d}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:active,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{background:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{color:#fff}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:active,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:hover{background:#222d32;color:#fff}.control-sidebar-dark .control-sidebar-heading,.control-sidebar-dark .control-sidebar-subheading{color:#fff}.control-sidebar-dark .control-sidebar-menu>li>a:hover{background:#1e282c}.control-sidebar-dark .control-sidebar-menu>li>a .menu-info>p{color:#b8c7ce}.control-sidebar-light{color:#5e5e5e}.control-sidebar-light,.control-sidebar-light+.control-sidebar-bg{background:#f9fafc;border-left:1px solid #d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs{border-bottom:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a{background:#e8ecf4;color:#444}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover{border-left-color:#d2d6de;border-bottom-color:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:active,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover{background:#eff1f7}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:active,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:hover{background:#f9fafc;color:#111}.control-sidebar-light .control-sidebar-heading,.control-sidebar-light .control-sidebar-subheading{color:#111}.control-sidebar-light .control-sidebar-menu{margin-left:-14px}.control-sidebar-light .control-sidebar-menu>li>a:hover{background:#f4f4f5}.control-sidebar-light .control-sidebar-menu>li>a .menu-info>p{color:#5e5e5e}.dropdown-menu{box-shadow:none;border-color:#eee}.dropdown-menu>li>a{color:#777}.dropdown-menu>li>a>.fa,.dropdown-menu>li>a>.glyphicon,.dropdown-menu>li>a>.ion{margin-right:10px}.dropdown-menu>li>a:hover{background-color:#e1e3e9;color:#333}.dropdown-menu>.divider{background-color:#eee}.navbar-nav>.messages-menu>.dropdown-menu,.navbar-nav>.notifications-menu>.dropdown-menu,.navbar-nav>.tasks-menu>.dropdown-menu{width:280px;padding:0;margin:0;top:100%}.navbar-nav>.messages-menu>.dropdown-menu>li,.navbar-nav>.notifications-menu>.dropdown-menu>li,.navbar-nav>.tasks-menu>.dropdown-menu>li{position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li.header,.navbar-nav>.notifications-menu>.dropdown-menu>li.header,.navbar-nav>.tasks-menu>.dropdown-menu>li.header{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0;background-color:#fff;padding:7px 10px;border-bottom:1px solid #f4f4f4;color:#444;font-size:14px}.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;font-size:12px;background-color:#fff;padding:7px 10px;border-bottom:1px solid #eee;color:#444!important;text-align:center}@media (max-width:991px){.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{background:#fff!important;color:#444!important}}.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a:hover{text-decoration:none;font-weight:400}.navbar-nav>.messages-menu>.dropdown-menu>li .menu,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu{max-height:200px;margin:0;padding:0;list-style:none;overflow-x:hidden}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{display:block;white-space:nowrap;border-bottom:1px solid #f4f4f4}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a:hover{background:#f4f4f4;text-decoration:none}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a{color:#444;overflow:hidden;text-overflow:ellipsis;padding:10px}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.fa,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.glyphicon,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.ion{width:20px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a{margin:0;padding:10px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>div>img{margin:auto 10px auto auto;width:40px;height:40px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4{padding:0;margin:0 0 0 45px;color:#444;font-size:15px;position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4>small{color:#999;font-size:10px;position:absolute;top:0;right:0}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{margin:0 0 0 45px;font-size:12px;color:#888}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:before{content:" ";display:table}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{clear:both}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{padding:10px}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>h3{font-size:14px;padding:0;margin:0 0 10px;color:#666}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>.progress{padding:0;margin:0}.navbar-nav>.user-menu>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;padding:1px 0 0;border-top-width:0;width:280px}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid;border-color:transparent;border-color:hsla(0,0%,100%,.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;color:#fff;color:hsla(0,0%,100%,.8);font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body{padding:15px;border-bottom:1px solid #f4f4f4;border-top:1px solid #ddd}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after,.navbar-nav>.user-menu>.dropdown-menu>.user-body:before{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-body a{color:#444!important}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff!important;color:#444!important}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f9f9f9;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:before{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#666}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f9f9f9}}.navbar-nav>.user-menu .user-image{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px;margin-top:-2px}@media (max-width:767px){.navbar-nav>.user-menu .user-image{float:none;margin-right:0;margin-top:-8px;line-height:10px}}.open:not(.dropup)>.animated-dropdown-menu{backface-visibility:visible!important;-webkit-animation:flipInX .7s both;-o-animation:flipInX .7s both;animation:flipInX .7s both}@keyframes flipInX{0%{transform:perspective(400px) rotateX(90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateX(-20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotateX(10deg);opacity:1}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotateX(90deg);-webkit-transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotateX(-20deg);-webkit-transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotateX(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media (max-width:991px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.form-control{border-radius:0;box-shadow:none;border-color:#d2d6de}.form-control:focus{border-color:#3c8dbc;box-shadow:none}.form-control:-ms-input-placeholder,.form-control::-moz-placeholder,.form-control::-webkit-input-placeholder{color:#bbb;opacity:1}.form-control:not(select){-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-group.has-success label{color:#00a65a}.form-group.has-success .form-control,.form-group.has-success .input-group-addon{border-color:#00a65a;box-shadow:none}.form-group.has-success .help-block{color:#00a65a}.form-group.has-warning label{color:#f39c12}.form-group.has-warning .form-control,.form-group.has-warning .input-group-addon{border-color:#f39c12;box-shadow:none}.form-group.has-warning .help-block{color:#f39c12}.form-group.has-error label{color:#dd4b39}.form-group.has-error .form-control,.form-group.has-error .input-group-addon{border-color:#dd4b39;box-shadow:none}.form-group.has-error .help-block{color:#dd4b39}.input-group .input-group-addon{border-radius:0;border-color:#d2d6de;background-color:#fff}.btn-group-vertical .btn.btn-flat:first-of-type,.btn-group-vertical .btn.btn-flat:last-of-type{border-radius:0}.icheck>label{padding-left:0}.form-control-feedback.fa{line-height:34px}.form-group-lg .form-control+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fa,.input-lg+.form-control-feedback.fa{line-height:46px}.form-group-sm .form-control+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fa,.input-sm+.form-control-feedback.fa{line-height:30px}.progress,.progress>.progress-bar{-webkit-box-shadow:none;box-shadow:none}.progress,.progress .progress-bar,.progress>.progress-bar,.progress>.progress-bar .progress-bar{border-radius:1px}.progress-sm,.progress.sm{height:10px}.progress-sm,.progress-sm .progress-bar,.progress.sm,.progress.sm .progress-bar{border-radius:1px}.progress-xs,.progress.xs{height:7px}.progress-xs,.progress-xs .progress-bar,.progress.xs,.progress.xs .progress-bar{border-radius:1px}.progress-xxs,.progress.xxs{height:3px}.progress-xxs,.progress-xxs .progress-bar,.progress.xxs,.progress.xxs .progress-bar{border-radius:1px}.progress.vertical{position:relative;width:30px;height:200px;display:inline-block;margin-right:10px}.progress.vertical>.progress-bar{width:100%;position:absolute;bottom:0}.progress.vertical.progress-sm,.progress.vertical.sm{width:20px}.progress.vertical.progress-xs,.progress.vertical.xs{width:10px}.progress.vertical.progress-xxs,.progress.vertical.xxs{width:3px}.progress-group .progress-text{font-weight:600}.progress-group .progress-number{float:right}.table tr>td .progress{margin:0}.progress-bar-light-blue,.progress-bar-primary{background-color:#3c8dbc}.progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.progress-bar-green,.progress-bar-success{background-color:#00a65a}.progress-striped .progress-bar-green,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.progress-bar-aqua,.progress-bar-info{background-color:#00c0ef}.progress-striped .progress-bar-aqua,.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.progress-bar-warning,.progress-bar-yellow{background-color:#f39c12}.progress-striped .progress-bar-warning,.progress-striped .progress-bar-yellow{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.progress-bar-danger,.progress-bar-red{background-color:#dd4b39}.progress-striped .progress-bar-danger,.progress-striped .progress-bar-red{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.small-box{border-radius:2px;position:relative;display:block;margin-bottom:20px;box-shadow:0 1px 1px rgba(0,0,0,.1)}.small-box>.inner{padding:10px}.small-box>.small-box-footer{position:relative;text-align:center;padding:3px 0;color:#fff;color:hsla(0,0%,100%,.8);display:block;z-index:10;background:rgba(0,0,0,.1);text-decoration:none}.small-box>.small-box-footer:hover{color:#fff;background:rgba(0,0,0,.15)}.small-box h3{font-size:38px;font-weight:700;margin:0 0 10px;white-space:nowrap;padding:0}.small-box p{font-size:15px}.small-box p>small{display:block;color:#f9f9f9;font-size:13px;margin-top:5px}.small-box h3,.small-box p{z-index:5}.small-box .icon{-webkit-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;position:absolute;top:-10px;right:10px;z-index:0;font-size:90px;color:rgba(0,0,0,.15)}.small-box:hover{text-decoration:none;color:#f9f9f9}.small-box:hover .icon{font-size:95px}@media (max-width:767px){.small-box{text-align:center}.small-box .icon{display:none}.small-box p{font-size:12px}}.box{position:relative;border-radius:3px;background:#fff;border-top:3px solid #d2d6de;margin-bottom:20px;width:100%;box-shadow:0 1px 1px rgba(0,0,0,.1)}.box.box-primary{border-top-color:#3c8dbc}.box.box-info{border-top-color:#00c0ef}.box.box-danger{border-top-color:#dd4b39}.box.box-warning{border-top-color:#f39c12}.box.box-success{border-top-color:#00a65a}.box.box-default{border-top-color:#d2d6de}.box.collapsed-box .box-body,.box.collapsed-box .box-footer{display:none}.box .nav-stacked>li{border-bottom:1px solid #f4f4f4;margin:0}.box .nav-stacked>li:last-of-type{border-bottom:none}.box.height-control .box-body{max-height:300px;overflow:auto}.box .border-right{border-right:1px solid #f4f4f4}.box .border-left{border-left:1px solid #f4f4f4}.box.box-solid{border-top:0}.box.box-solid>.box-header .btn.btn-default{background:transparent}.box.box-solid>.box-header .btn:hover,.box.box-solid>.box-header a:hover{background:rgba(0,0,0,.1)}.box.box-solid.box-default{border:1px solid #d2d6de}.box.box-solid.box-default>.box-header{color:#444;background:#d2d6de;background-color:#d2d6de}.box.box-solid.box-default>.box-header .btn,.box.box-solid.box-default>.box-header a{color:#444}.box.box-solid.box-primary{border:1px solid #3c8dbc}.box.box-solid.box-primary>.box-header{color:#fff;background:#3c8dbc;background-color:#3c8dbc}.box.box-solid.box-primary>.box-header .btn,.box.box-solid.box-primary>.box-header a{color:#fff}.box.box-solid.box-info{border:1px solid #00c0ef}.box.box-solid.box-info>.box-header{color:#fff;background:#00c0ef;background-color:#00c0ef}.box.box-solid.box-info>.box-header .btn,.box.box-solid.box-info>.box-header a{color:#fff}.box.box-solid.box-danger{border:1px solid #dd4b39}.box.box-solid.box-danger>.box-header{color:#fff;background:#dd4b39;background-color:#dd4b39}.box.box-solid.box-danger>.box-header .btn,.box.box-solid.box-danger>.box-header a{color:#fff}.box.box-solid.box-warning{border:1px solid #f39c12}.box.box-solid.box-warning>.box-header{color:#fff;background:#f39c12;background-color:#f39c12}.box.box-solid.box-warning>.box-header .btn,.box.box-solid.box-warning>.box-header a{color:#fff}.box.box-solid.box-success{border:1px solid #00a65a}.box.box-solid.box-success>.box-header{color:#fff;background:#00a65a;background-color:#00a65a}.box.box-solid.box-success>.box-header .btn,.box.box-solid.box-success>.box-header a{color:#fff}.box.box-solid>.box-header>.box-tools .btn{border:0;box-shadow:none}.box.box-solid[class*=bg]>.box-header{color:#fff}.box .box-group>.box{margin-bottom:5px}.box .knob-label{text-align:center;color:#333;font-weight:100;font-size:12px;margin-bottom:.3em}.box>.loading-img,.box>.overlay,.overlay-wrapper>.loading-img,.overlay-wrapper>.overlay{position:absolute;top:0;left:0;width:100%;height:100%}.box .overlay,.overlay-wrapper .overlay{z-index:50;background:hsla(0,0%,100%,.7);border-radius:3px}.box .overlay>.fa,.overlay-wrapper .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px}.box .overlay.dark,.overlay-wrapper .overlay.dark{background:rgba(0,0,0,.5)}.box-body:after,.box-body:before,.box-footer:after,.box-footer:before,.box-header:after,.box-header:before{content:" ";display:table}.box-body:after,.box-footer:after,.box-header:after{clear:both}.box-header{color:#444;display:block;padding:10px;position:relative}.box-header.with-border{border-bottom:1px solid #f4f4f4}.collapsed-box .box-header.with-border{border-bottom:none}.box-header .box-title,.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{display:inline-block;font-size:18px;margin:0;line-height:1}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{margin-right:5px}.box-header>.box-tools{position:absolute;right:10px;top:5px}.box-header>.box-tools [data-toggle=tooltip]{position:relative}.box-header>.box-tools.pull-right .dropdown-menu{right:0;left:auto}.box-header>.box-tools .dropdown-menu>li>a{color:#444!important}.btn-box-tool{padding:5px;font-size:12px;background:transparent;color:#97a0b3}.btn-box-tool:hover,.open .btn-box-tool{color:#606c84}.btn-box-tool.btn:active{box-shadow:none}.box-body{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;padding:10px}.no-header .box-body{border-top-right-radius:3px;border-top-left-radius:3px}.box-body>.table{margin-bottom:0}.box-body .fc{margin-top:5px}.box-body .full-width-chart{margin:-19px}.box-body.no-padding .full-width-chart{margin:-9px}.box-body .box-pane{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:3px}.box-body .box-pane-right{border-bottom-left-radius:0}.box-body .box-pane-right,.box-footer{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px}.box-footer{border-bottom-left-radius:3px;border-top:1px solid #f4f4f4;padding:10px;background-color:#fff}.chart-legend{margin:10px 0}@media (max-width:991px){.chart-legend>li{float:left;margin-right:10px}}.box-comments{background:#f7f7f7}.box-comments .box-comment{padding:8px 0;border-bottom:1px solid #eee}.box-comments .box-comment:after,.box-comments .box-comment:before{content:" ";display:table}.box-comments .box-comment:after{clear:both}.box-comments .box-comment:last-of-type{border-bottom:0}.box-comments .box-comment:first-of-type{padding-top:0}.box-comments .box-comment img{float:left}.box-comments .comment-text{margin-left:40px;color:#555}.box-comments .username{color:#444;display:block;font-weight:600}.box-comments .text-muted{font-weight:400;font-size:12px}.todo-list{margin:0;padding:0;list-style:none;overflow:auto}.todo-list>li{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:2px;border-left:2px solid #e6e7e8;color:#444}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type=checkbox]{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;margin-left:5px;font-weight:600}.todo-list>li .label{margin-left:10px;font-size:9px}.todo-list>li .tools{display:none;float:right;color:#dd4b39}.todo-list>li .tools>.fa,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{margin-right:5px;cursor:pointer}.todo-list>li:hover .tools{display:inline-block}.todo-list>li.done{color:#999}.todo-list>li.done .text{text-decoration:line-through;font-weight:500}.todo-list>li.done .label{background:#d2d6de!important}.todo-list .danger{border-left-color:#dd4b39}.todo-list .warning{border-left-color:#f39c12}.todo-list .info{border-left-color:#00c0ef}.todo-list .success{border-left-color:#00a65a}.todo-list .primary{border-left-color:#3c8dbc}.todo-list .handle{display:inline-block;cursor:move;margin:0 5px}.chat{padding:5px 20px 5px 10px}.chat .item{margin-bottom:10px}.chat .item:after,.chat .item:before{content:" ";display:table}.chat .item:after{clear:both}.chat .item>img{width:40px;height:40px;border:2px solid transparent;border-radius:50%}.chat .item>.online{border:2px solid #00a65a}.chat .item>.offline{border:2px solid #dd4b39}.chat .item>.message{margin-left:55px;margin-top:-40px}.chat .item>.message>.name{display:block;font-weight:600}.chat .item>.attachment{border-radius:3px;background:#f4f4f4;margin-left:65px;margin-right:15px;padding:10px}.chat .item>.attachment>h4{margin:0 0 5px;font-weight:600;font-size:14px}.chat .item>.attachment>.filename,.chat .item>.attachment>p{font-weight:600;font-size:13px;font-style:italic;margin:0}.chat .item>.attachment:after,.chat .item>.attachment:before{content:" ";display:table}.chat .item>.attachment:after{clear:both}.box-input{max-width:200px}.modal .panel-body{color:#444}.info-box{display:block;min-height:90px;background:#fff;width:100%;box-shadow:0 1px 1px rgba(0,0,0,.1);border-radius:2px;margin-bottom:15px}.info-box small{font-size:14px}.info-box .progress{background:rgba(0,0,0,.2);margin:5px -10px;height:2px}.info-box .progress,.info-box .progress .progress-bar{border-radius:0}.info-box .progress .progress-bar{background:#fff}.info-box-icon{border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px;display:block;float:left;height:90px;width:90px;text-align:center;font-size:45px;line-height:90px;background:rgba(0,0,0,.2)}.info-box-icon>img{max-width:100%}.info-box-content{padding:5px 10px;margin-left:90px}.info-box-number{display:block;font-weight:700;font-size:18px}.info-box-text,.progress-description{display:block;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.info-box-text{text-transform:uppercase}.info-box-more{display:block}.progress-description{margin:0}.timeline{position:relative;margin:0 0 30px;padding:0;list-style:none}.timeline:before{content:"";position:absolute;top:0;bottom:0;width:4px;background:#ddd;left:31px;margin:0;border-radius:2px}.timeline>li{position:relative;margin-right:10px;margin-bottom:15px}.timeline>li:after,.timeline>li:before{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-item{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1);border-radius:3px;margin-top:0;background:#fff;color:#444;margin-left:60px;margin-right:15px;padding:0;position:relative}.timeline>li>.timeline-item>.time{color:#999;float:right;padding:10px;font-size:12px}.timeline>li>.timeline-item>.timeline-header{margin:0;color:#555;border-bottom:1px solid #f4f4f4;padding:10px;font-size:16px;line-height:1.1}.timeline>li>.timeline-item>.timeline-header>a{font-weight:600}.timeline>li>.timeline-item>.timeline-body,.timeline>li>.timeline-item>.timeline-footer{padding:10px}.timeline>li>.fa,.timeline>li>.glyphicon,.timeline>li>.ion{width:30px;height:30px;font-size:15px;line-height:30px;position:absolute;color:#666;background:#d2d6de;border-radius:50%;text-align:center;left:18px;top:0}.timeline>.time-label>span{font-weight:600;padding:5px;display:inline-block;background-color:#fff;border-radius:4px}.timeline-inverse>li>.timeline-item{background:#f0f0f0;border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none}.timeline-inverse>li>.timeline-item>.timeline-header{border-bottom-color:#ddd}.btn{border-radius:3px;-webkit-box-shadow:none;box-shadow:none;border:1px solid transparent}.btn.uppercase{text-transform:uppercase}.btn.btn-flat{border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-width:1px}.btn:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:focus{outline:none}.btn.btn-file{position:relative;overflow:hidden}.btn.btn-file>input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;opacity:0;filter:alpha(opacity=0);outline:none;background:#fff;cursor:inherit;display:block}.btn-default{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-default.hover,.btn-default:active,.btn-default:hover{background-color:#e7e7e7}.btn-primary{background-color:#3c8dbc;border-color:#367fa9}.btn-primary.hover,.btn-primary:active,.btn-primary:hover{background-color:#367fa9}.btn-success{background-color:#00a65a;border-color:#008d4c}.btn-success.hover,.btn-success:active,.btn-success:hover{background-color:#008d4c}.btn-info{background-color:#00c0ef;border-color:#00acd6}.btn-info.hover,.btn-info:active,.btn-info:hover{background-color:#00acd6}.btn-danger{background-color:#dd4b39;border-color:#d73925}.btn-danger.hover,.btn-danger:active,.btn-danger:hover{background-color:#d73925}.btn-warning{background-color:#f39c12;border-color:#e08e0b}.btn-warning.hover,.btn-warning:active,.btn-warning:hover{background-color:#e08e0b}.btn-outline{border:1px solid #fff;background:transparent;color:#fff}.btn-outline:active,.btn-outline:focus,.btn-outline:hover{color:hsla(0,0%,100%,.7);border-color:hsla(0,0%,100%,.7)}.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn[class*=bg-]:hover{-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,.2);box-shadow:inset 0 0 100px rgba(0,0,0,.2)}.btn-app{border-radius:3px;position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;text-align:center;color:#666;border:1px solid #ddd;background-color:#f4f4f4;font-size:12px}.btn-app>.fa,.btn-app>.glyphicon,.btn-app>.ion{font-size:20px;display:block}.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn-app:active,.btn-app:focus{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}.callout{border-radius:3px;margin:0 0 20px;padding:15px 30px 15px 15px;border-left:5px solid #eee}.callout a{color:#fff;text-decoration:underline}.callout a:hover{color:#eee}.callout h4{margin-top:0;font-weight:600}.callout p:last-child{margin-bottom:0}.callout .highlight,.callout code{background-color:#fff}.callout.callout-danger{border-color:#c23321}.callout.callout-warning{border-color:#c87f0a}.callout.callout-info{border-color:#0097bc}.callout.callout-success{border-color:#00733e}.alert{border-radius:3px}.alert h4{font-weight:600}.alert .icon{margin-right:10px}.alert .close{color:#000;opacity:.2;filter:alpha(opacity=20)}.alert .close:hover{opacity:.5;filter:alpha(opacity=50)}.alert a{color:#fff;text-decoration:underline}.alert-success{border-color:#008d4c}.alert-danger,.alert-error{border-color:#d73925}.alert-warning{border-color:#e08e0b}.alert-info{border-color:#00acd6}.nav>li>a:active,.nav>li>a:focus,.nav>li>a:hover{color:#444;background:#f7f7f7}.nav-pills>li>a{border-radius:0;border-top:3px solid transparent;color:#444}.nav-pills>li>a>.fa,.nav-pills>li>a>.glyphicon,.nav-pills>li>a>.ion{margin-right:5px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{border-top-color:#3c8dbc}.nav-pills>li.active>a{font-weight:600}.nav-stacked>li>a{border-radius:0;border-top:0;border-left:3px solid transparent;color:#444}.nav-stacked>li.active>a,.nav-stacked>li.active>a:hover{background:transparent;color:#444;border-top:0;border-left-color:#3c8dbc}.nav-stacked>li.header{border-bottom:1px solid #ddd;color:#777;margin-bottom:10px;padding:5px 10px;text-transform:uppercase}.nav-tabs-custom{margin-bottom:20px;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,.1);border-radius:3px}.nav-tabs-custom>.nav-tabs{margin:0;border-bottom-color:#f4f4f4;border-top-right-radius:3px;border-top-left-radius:3px}.nav-tabs-custom>.nav-tabs>li{border-top:3px solid transparent;margin-bottom:-2px;margin-right:5px}.nav-tabs-custom>.nav-tabs>li.disabled>a{color:#777}.nav-tabs-custom>.nav-tabs>li>a{color:#444;border-radius:0}.nav-tabs-custom>.nav-tabs>li>a.text-muted{color:#999}.nav-tabs-custom>.nav-tabs>li>a,.nav-tabs-custom>.nav-tabs>li>a:hover{background:transparent;margin:0}.nav-tabs-custom>.nav-tabs>li>a:hover{color:#999}.nav-tabs-custom>.nav-tabs>li:not(.active)>a:active,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:focus,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:hover{border-color:transparent}.nav-tabs-custom>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom>.nav-tabs>li.active:hover>a,.nav-tabs-custom>.nav-tabs>li.active>a{background-color:#fff;color:#444}.nav-tabs-custom>.nav-tabs>li.active>a{border-top-color:transparent;border-left-color:#f4f4f4;border-right-color:#f4f4f4}.nav-tabs-custom>.nav-tabs>li:first-of-type{margin-left:0}.nav-tabs-custom>.nav-tabs>li:first-of-type.active>a{border-left-color:transparent}.nav-tabs-custom>.nav-tabs.pull-right{float:none!important}.nav-tabs-custom>.nav-tabs.pull-right>li{float:right}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type{margin-right:0}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type>a{border-left-width:1px}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type.active>a{border-left-color:#f4f4f4;border-right-color:transparent}.nav-tabs-custom>.nav-tabs>li.header{line-height:35px;padding:0 10px;font-size:20px;color:#444}.nav-tabs-custom>.nav-tabs>li.header>.fa,.nav-tabs-custom>.nav-tabs>li.header>.glyphicon,.nav-tabs-custom>.nav-tabs>li.header>.ion{margin-right:5px}.nav-tabs-custom>.tab-content{background:#fff;padding:10px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.nav-tabs-custom .dropdown.open>a:active,.nav-tabs-custom .dropdown.open>a:focus{background:transparent;color:#999}.nav-tabs-custom.tab-primary>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom.tab-info>.nav-tabs>li.active{border-top-color:#00c0ef}.nav-tabs-custom.tab-danger>.nav-tabs>li.active{border-top-color:#dd4b39}.nav-tabs-custom.tab-warning>.nav-tabs>li.active{border-top-color:#f39c12}.nav-tabs-custom.tab-success>.nav-tabs>li.active{border-top-color:#00a65a}.nav-tabs-custom.tab-default>.nav-tabs>li.active{border-top-color:#d2d6de}.pagination>li>a{background:#fafafa;color:#666}.pagination.pagination-flat>li>a{border-radius:0!important}.products-list{list-style:none;margin:0;padding:0}.products-list>.item{border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1);padding:10px 0;background:#fff}.products-list>.item:after,.products-list>.item:before{content:" ";display:table}.products-list>.item:after{clear:both}.products-list .product-img{float:left}.products-list .product-img img{width:50px;height:50px}.products-list .product-info{margin-left:60px}.products-list .product-title{font-weight:600}.products-list .product-description{display:block;color:#999;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.product-list-in-box>.item{-webkit-box-shadow:none;box-shadow:none;border-radius:0;border-bottom:1px solid #f4f4f4}.product-list-in-box>.item:last-of-type{border-bottom-width:0}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{border-top:1px solid #f4f4f4}.table>thead>tr>th{border-bottom:2px solid #f4f4f4}.table tr td .progress{margin-top:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #f4f4f4}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table.no-border,.table.no-border td,.table.no-border th{border:0}table.text-center,table.text-center td,table.text-center th{text-align:center}.table.align th{text-align:left}.table.align td{text-align:right}.label-default{background-color:#d2d6de;color:#444}.direct-chat .box-body{border-bottom-right-radius:0;border-bottom-left-radius:0;position:relative;overflow-x:hidden;padding:0}.direct-chat-messages,.direct-chat.chat-pane-open .direct-chat-contacts{-webkit-transform:translate(0);-ms-transform:translate(0);-o-transform:translate(0);transform:translate(0)}.direct-chat-messages{padding:10px;height:250px;overflow:auto}.direct-chat-msg,.direct-chat-text{display:block}.direct-chat-msg{margin-bottom:10px}.direct-chat-msg:after,.direct-chat-msg:before{content:" ";display:table}.direct-chat-msg:after{clear:both}.direct-chat-contacts,.direct-chat-messages{-webkit-transition:-webkit-transform .5s ease-in-out;-moz-transition:-moz-transform .5s ease-in-out;-o-transition:-o-transform .5s ease-in-out;transition:transform .5s ease-in-out}.direct-chat-text{border-radius:5px;position:relative;padding:5px 10px;background:#d2d6de;border:1px solid #d2d6de;margin:5px 0 0 50px;color:#444}.direct-chat-text:after,.direct-chat-text:before{position:absolute;right:100%;top:15px;border:solid transparent;border-right-color:#d2d6de;content:" ";height:0;width:0;pointer-events:none}.direct-chat-text:after{border-width:5px;margin-top:-5px}.direct-chat-text:before{border-width:6px;margin-top:-6px}.right .direct-chat-text{margin-right:50px;margin-left:0}.right .direct-chat-text:after,.right .direct-chat-text:before{right:auto;left:100%;border-right-color:transparent;border-left-color:#d2d6de}.direct-chat-img{border-radius:50%;float:left;width:40px;height:40px}.right .direct-chat-img{float:right}.direct-chat-info{display:block;margin-bottom:2px;font-size:12px}.direct-chat-name{font-weight:600}.direct-chat-timestamp{color:#999}.direct-chat-contacts-open .direct-chat-contacts{-webkit-transform:translate(0);-ms-transform:translate(0);-o-transform:translate(0);transform:translate(0)}.direct-chat-contacts{-webkit-transform:translate(101%);-ms-transform:translate(101%);-o-transform:translate(101%);transform:translate(101%);position:absolute;top:0;bottom:0;height:250px;width:100%;background:#222d32;color:#fff;overflow:auto}.contacts-list>li{border-bottom:1px solid rgba(0,0,0,.2);padding:10px;margin:0}.contacts-list>li:after,.contacts-list>li:before{content:" ";display:table}.contacts-list>li:after{clear:both}.contacts-list>li:last-of-type{border-bottom:none}.contacts-list-img{border-radius:50%;width:40px;float:left}.contacts-list-info{margin-left:45px;color:#fff}.contacts-list-name,.contacts-list-status{display:block}.contacts-list-name{font-weight:600}.contacts-list-status{font-size:12px}.contacts-list-date{color:#aaa;font-weight:400}.contacts-list-msg{color:#999}.direct-chat-danger .right>.direct-chat-text{background:#dd4b39;border-color:#dd4b39;color:#fff}.direct-chat-danger .right>.direct-chat-text:after,.direct-chat-danger .right>.direct-chat-text:before{border-left-color:#dd4b39}.direct-chat-primary .right>.direct-chat-text{background:#3c8dbc;border-color:#3c8dbc;color:#fff}.direct-chat-primary .right>.direct-chat-text:after,.direct-chat-primary .right>.direct-chat-text:before{border-left-color:#3c8dbc}.direct-chat-warning .right>.direct-chat-text{background:#f39c12;border-color:#f39c12;color:#fff}.direct-chat-warning .right>.direct-chat-text:after,.direct-chat-warning .right>.direct-chat-text:before{border-left-color:#f39c12}.direct-chat-info .right>.direct-chat-text{background:#00c0ef;border-color:#00c0ef;color:#fff}.direct-chat-info .right>.direct-chat-text:after,.direct-chat-info .right>.direct-chat-text:before{border-left-color:#00c0ef}.direct-chat-success .right>.direct-chat-text{background:#00a65a;border-color:#00a65a;color:#fff}.direct-chat-success .right>.direct-chat-text:after,.direct-chat-success .right>.direct-chat-text:before{border-left-color:#00a65a}.users-list>li{width:25%;float:left;padding:10px;text-align:center}.users-list>li img{border-radius:50%;max-width:100%;height:auto}.users-list>li>a:hover,.users-list>li>a:hover .users-list-name{color:#999}.users-list-date,.users-list-name{display:block}.users-list-name{font-weight:600;color:#444;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.users-list-date{color:#999;font-size:12px}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.modal{background:rgba(0,0,0,.3)}.modal-content{border-radius:0;-webkit-box-shadow:0 2px 3px rgba(0,0,0,.125);box-shadow:0 2px 3px rgba(0,0,0,.125);border:0}@media (min-width:768px){.modal-content{-webkit-box-shadow:0 2px 3px rgba(0,0,0,.125);box-shadow:0 2px 3px rgba(0,0,0,.125)}}.modal-header{border-bottom-color:#f4f4f4}.modal-footer{border-top-color:#f4f4f4}.modal-primary .modal-footer,.modal-primary .modal-header{border-color:#307095}.modal-warning .modal-footer,.modal-warning .modal-header{border-color:#c87f0a}.modal-info .modal-footer,.modal-info .modal-header{border-color:#0097bc}.modal-success .modal-footer,.modal-success .modal-header{border-color:#00733e}.modal-danger .modal-footer,.modal-danger .modal-header{border-color:#c23321}.box-widget{border:none;position:relative}.widget-user .widget-user-header{padding:20px;height:120px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user .widget-user-username{margin-top:0;margin-bottom:5px;font-size:25px;font-weight:300;text-shadow:0 1px 1px rgba(0,0,0,.2)}.widget-user .widget-user-desc{margin-top:0}.widget-user .widget-user-image{position:absolute;top:65px;left:50%;margin-left:-45px}.widget-user .widget-user-image>img{width:90px;height:auto;border:3px solid #fff}.widget-user .box-footer{padding-top:30px}.widget-user-2 .widget-user-header{padding:20px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user-2 .widget-user-username{margin-top:5px;margin-bottom:5px;font-size:25px;font-weight:300}.widget-user-2 .widget-user-desc{margin-top:0}.widget-user-2 .widget-user-desc,.widget-user-2 .widget-user-username{margin-left:75px}.widget-user-2 .widget-user-image>img{width:65px;height:auto;float:left}.treeview-menu{display:none;list-style:none;padding:0;margin:0;padding-left:5px}.treeview-menu .treeview-menu{padding-left:20px}.treeview-menu>li{margin:0}.treeview-menu>li>a{padding:5px 5px 5px 15px;display:block;font-size:14px}.treeview-menu>li>a>.fa,.treeview-menu>li>a>.glyphicon,.treeview-menu>li>a>.ion{width:20px}.treeview-menu>li>a>.fa-angle-down,.treeview-menu>li>a>.fa-angle-left,.treeview-menu>li>a>.pull-right-container>.fa-angle-down,.treeview-menu>li>a>.pull-right-container>.fa-angle-left{width:auto}.mailbox-messages>.table{margin:0}.mailbox-controls{padding:5px}.mailbox-controls.with-border,.mailbox-read-info{border-bottom:1px solid #f4f4f4}.mailbox-read-info{padding:10px}.mailbox-read-info h3{font-size:20px;margin:0}.mailbox-read-info h5{margin:0;padding:5px 0 0}.mailbox-read-time{color:#999;font-size:13px}.mailbox-read-message{padding:10px}.mailbox-attachments li{float:left;width:200px;border:1px solid #eee;margin-bottom:10px;margin-right:10px}.mailbox-attachment-name{font-weight:700;color:#666}.mailbox-attachment-icon,.mailbox-attachment-info,.mailbox-attachment-size{display:block}.mailbox-attachment-info{padding:10px;background:#f4f4f4}.mailbox-attachment-size{color:#999;font-size:12px}.mailbox-attachment-icon{text-align:center;font-size:65px;color:#666;padding:20px 10px}.mailbox-attachment-icon.has-img{padding:0}.mailbox-attachment-icon.has-img>img{max-width:100%;height:auto}.lockscreen{background:#d2d6de}.lockscreen-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.lockscreen-logo a{color:#444}.lockscreen-wrapper{max-width:400px;margin:0 auto;margin-top:10%}.lockscreen .lockscreen-name{text-align:center;font-weight:600}.lockscreen-item{border-radius:4px;padding:0;background:#fff;position:relative;margin:10px auto 30px;width:290px}.lockscreen-image{border-radius:50%;position:absolute;left:-10px;top:-25px;background:#fff;padding:5px;z-index:10}.lockscreen-image>img{border-radius:50%;width:70px;height:70px}.lockscreen-credentials{margin-left:70px}.lockscreen-credentials .form-control{border:0}.lockscreen-credentials .btn{background-color:#fff;border:0;padding:0 10px}.lockscreen-footer{margin-top:10px}.login-logo,.register-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.login-logo a,.register-logo a{color:#444}.login-page,.register-page{background:#d2d6de}.login-box,.register-box{width:360px;margin:7% auto}@media (max-width:768px){.login-box,.register-box{width:90%;margin-top:20px}}.login-box-body,.register-box-body{background:#fff;padding:20px;border-top:0;color:#666}.login-box-body .form-control-feedback,.register-box-body .form-control-feedback{color:#777}.login-box-msg,.register-box-msg{margin:0;text-align:center;padding:0 20px 20px}.social-auth-links{margin:10px 0}.error-page{width:600px;margin:20px auto 0}@media (max-width:991px){.error-page{width:100%}}.error-page>.headline{float:left;font-size:100px;font-weight:300}@media (max-width:991px){.error-page>.headline{float:none;text-align:center}}.error-page>.error-content{margin-left:190px;display:block}@media (max-width:991px){.error-page>.error-content{margin-left:0}}.error-page>.error-content>h3{font-weight:300;font-size:25px}@media (max-width:991px){.error-page>.error-content>h3{text-align:center}}.invoice{position:relative;background:#fff;border:1px solid #f4f4f4;padding:20px;margin:10px 25px}.invoice-title{margin-top:0}.profile-user-img{margin:0 auto;width:100px;padding:3px;border:3px solid #d2d6de}.profile-username{font-size:21px;margin-top:5px}.post{border-bottom:1px solid #d2d6de;margin-bottom:15px;padding-bottom:15px;color:#666}.post:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.post .user-block{margin-bottom:15px}.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;border-right:1px solid rgba(0,0,0,.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon>:first-child{border:none;text-align:center;width:100%}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,.2)}.btn-adn.active,.btn-adn.focus,.btn-adn:active,.btn-adn:focus,.btn-adn:hover,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,.2)}.btn-adn.active,.btn-adn:active,.open>.dropdown-toggle.btn-adn{background-image:none}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,.2)}.btn-bitbucket.active,.btn-bitbucket.focus,.btn-bitbucket:active,.btn-bitbucket:focus,.btn-bitbucket:hover,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,.2)}.btn-bitbucket.active,.btn-bitbucket:active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,.2)}.btn-dropbox.active,.btn-dropbox.focus,.btn-dropbox:active,.btn-dropbox:focus,.btn-dropbox:hover,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,.2)}.btn-dropbox.active,.btn-dropbox:active,.open>.dropdown-toggle.btn-dropbox{background-image:none}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,.2)}.btn-facebook.active,.btn-facebook.focus,.btn-facebook:active,.btn-facebook:focus,.btn-facebook:hover,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,.2)}.btn-facebook.active,.btn-facebook:active,.open>.dropdown-toggle.btn-facebook{background-image:none}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,.2)}.btn-flickr.active,.btn-flickr.focus,.btn-flickr:active,.btn-flickr:focus,.btn-flickr:hover,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,.2)}.btn-flickr.active,.btn-flickr:active,.open>.dropdown-toggle.btn-flickr{background-image:none}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,.2)}.btn-foursquare.active,.btn-foursquare.focus,.btn-foursquare:active,.btn-foursquare:focus,.btn-foursquare:hover,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,.2)}.btn-foursquare.active,.btn-foursquare:active,.open>.dropdown-toggle.btn-foursquare{background-image:none}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,.2)}.btn-github.active,.btn-github.focus,.btn-github:active,.btn-github:focus,.btn-github:hover,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,.2)}.btn-github.active,.btn-github:active,.open>.dropdown-toggle.btn-github{background-image:none}.btn-github .badge{color:#444;background-color:#fff}.btn-google{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,.2)}.btn-google.active,.btn-google.focus,.btn-google:active,.btn-google:focus,.btn-google:hover,.open>.dropdown-toggle.btn-google{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,.2)}.btn-google.active,.btn-google:active,.open>.dropdown-toggle.btn-google{background-image:none}.btn-google .badge{color:#dd4b39;background-color:#fff}.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,.2)}.btn-instagram.active,.btn-instagram.focus,.btn-instagram:active,.btn-instagram:focus,.btn-instagram:hover,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,.2)}.btn-instagram.active,.btn-instagram:active,.open>.dropdown-toggle.btn-instagram{background-image:none}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,.2)}.btn-linkedin.active,.btn-linkedin.focus,.btn-linkedin:active,.btn-linkedin:focus,.btn-linkedin:hover,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,.2)}.btn-linkedin.active,.btn-linkedin:active,.open>.dropdown-toggle.btn-linkedin{background-image:none}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,.2)}.btn-microsoft.active,.btn-microsoft.focus,.btn-microsoft:active,.btn-microsoft:focus,.btn-microsoft:hover,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,.2)}.btn-microsoft.active,.btn-microsoft:active,.open>.dropdown-toggle.btn-microsoft{background-image:none}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,.2)}.btn-openid.active,.btn-openid.focus,.btn-openid:active,.btn-openid:focus,.btn-openid:hover,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,.2)}.btn-openid.active,.btn-openid:active,.open>.dropdown-toggle.btn-openid{background-image:none}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,.2)}.btn-pinterest.active,.btn-pinterest.focus,.btn-pinterest:active,.btn-pinterest:focus,.btn-pinterest:hover,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,.2)}.btn-pinterest.active,.btn-pinterest:active,.open>.dropdown-toggle.btn-pinterest{background-image:none}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,.2)}.btn-reddit.active,.btn-reddit.focus,.btn-reddit:active,.btn-reddit:focus,.btn-reddit:hover,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,.2)}.btn-reddit.active,.btn-reddit:active,.open>.dropdown-toggle.btn-reddit{background-image:none}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,.2)}.btn-soundcloud.active,.btn-soundcloud.focus,.btn-soundcloud:active,.btn-soundcloud:focus,.btn-soundcloud:hover,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,.2)}.btn-soundcloud.active,.btn-soundcloud:active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,.2)}.btn-tumblr.active,.btn-tumblr.focus,.btn-tumblr:active,.btn-tumblr:focus,.btn-tumblr:hover,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,.2)}.btn-tumblr.active,.btn-tumblr:active,.open>.dropdown-toggle.btn-tumblr{background-image:none}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,.2)}.btn-twitter.active,.btn-twitter.focus,.btn-twitter:active,.btn-twitter:focus,.btn-twitter:hover,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,.2)}.btn-twitter.active,.btn-twitter:active,.open>.dropdown-toggle.btn-twitter{background-image:none}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,.2)}.btn-vimeo.active,.btn-vimeo.focus,.btn-vimeo:active,.btn-vimeo:focus,.btn-vimeo:hover,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,.2)}.btn-vimeo.active,.btn-vimeo:active,.open>.dropdown-toggle.btn-vimeo{background-image:none}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,.2)}.btn-vk.active,.btn-vk.focus,.btn-vk:active,.btn-vk:focus,.btn-vk:hover,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,.2)}.btn-vk.active,.btn-vk:active,.open>.dropdown-toggle.btn-vk{background-image:none}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,.2)}.btn-yahoo.active,.btn-yahoo.focus,.btn-yahoo:active,.btn-yahoo:focus,.btn-yahoo:hover,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,.2)}.btn-yahoo.active,.btn-yahoo:active,.open>.dropdown-toggle.btn-yahoo{background-image:none}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.fc-button{background:#f4f4f4;background-image:none;color:#444;border-color:#ddd;border-bottom-color:#ddd}.fc-button.hover,.fc-button:active,.fc-button:hover{background-color:#e9e9e9}.fc-header-title h2{font-size:15px;line-height:1.6em;color:#666;margin-left:10px}.fc-header-right{padding-right:10px}.fc-header-left{padding-left:10px}.fc-widget-header{background:#fafafa}.fc-grid{width:100%;border:0}.fc-widget-content:first-of-type,.fc-widget-header:first-of-type{border-left:0;border-right:0}.fc-widget-content:last-of-type,.fc-widget-header:last-of-type{border-right:0}.fc-toolbar{padding:10px;margin:0}.fc-day-number{font-size:20px;font-weight:300;padding-right:10px}.fc-color-picker{list-style:none;margin:0;padding:0}.fc-color-picker>li{float:left;font-size:30px;margin-right:5px;line-height:30px}.fc-color-picker>li .fa{-webkit-transition:-webkit-transform .3s linear;-moz-transition:-moz-transform linear .3s;-o-transition:-o-transform linear .3s;transition:transform .3s linear}.fc-color-picker>li .fa:hover{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);-o-transform:rotate(30deg);transform:rotate(30deg)}#add-new-event{-webkit-transition:all .3s linear;-o-transition:all linear .3s;transition:all .3s linear}.external-event{padding:5px 10px;font-weight:700;margin-bottom:4px;box-shadow:0 1px 1px rgba(0,0,0,.1);text-shadow:0 1px 1px rgba(0,0,0,.1);border-radius:3px;cursor:move}.external-event:hover{box-shadow:inset 0 0 90px rgba(0,0,0,.2)}.select2-container--default.select2-container--focus,.select2-container--default:active,.select2-container--default:focus,.select2-selection.select2-container--focus,.select2-selection:active,.select2-selection:focus{outline:none}.select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #d2d6de;border-radius:0;padding:6px 12px;height:34px}.select2-container--default.select2-container--open{border-color:#3c8dbc}.select2-dropdown{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:#fff}.select2-results__option{padding:6px 12px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;padding-right:0;height:auto;margin-top:-4px}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px}.select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0}.select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #d2d6de}.select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:none}.select2-container--default.select2-container--focus .select2-selection--multiple,.select2-container--default .select2-search--dropdown .select2-search__field{border-color:#3c8dbc!important}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444}.select2-container--default .select2-selection--multiple{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#d2d6de}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:hsla(0,0%,100%,.7)}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff}.select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px}.box .datepicker-inline,.box .datepicker-inline .datepicker-days,.box .datepicker-inline .datepicker-days>table,.box .datepicker-inline>table{width:100%}.box .datepicker-inline .datepicker-days>table td:hover,.box .datepicker-inline .datepicker-days td:hover,.box .datepicker-inline>table td:hover,.box .datepicker-inline td:hover{background-color:hsla(0,0%,100%,.3)}.box .datepicker-inline .datepicker-days>table td.day.new,.box .datepicker-inline .datepicker-days>table td.day.old,.box .datepicker-inline .datepicker-days td.day.new,.box .datepicker-inline .datepicker-days td.day.old,.box .datepicker-inline>table td.day.new,.box .datepicker-inline>table td.day.old,.box .datepicker-inline td.day.new,.box .datepicker-inline td.day.old{color:#777}.pad{padding:10px}.margin{margin:10px}.margin-bottom{margin-bottom:20px}.margin-bottom-none{margin-bottom:0}.margin-r-5{margin-right:5px}.inline{display:inline}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{margin:0;padding:0;font-weight:600;font-size:16px}.description-block>.description-text{text-transform:uppercase}.alert-danger,.alert-error,.alert-info,.alert-success,.alert-warning,.bg-aqua,.bg-aqua-active,.bg-black,.bg-black-active,.bg-blue,.bg-blue-active,.bg-fuchsia,.bg-fuchsia-active,.bg-green,.bg-green-active,.bg-light-blue,.bg-light-blue-active,.bg-lime,.bg-lime-active,.bg-maroon,.bg-maroon-active,.bg-navy,.bg-navy-active,.bg-olive,.bg-olive-active,.bg-orange,.bg-orange-active,.bg-purple,.bg-purple-active,.bg-red,.bg-red-active,.bg-teal,.bg-teal-active,.bg-yellow,.bg-yellow-active,.callout.callout-danger,.callout.callout-info,.callout.callout-success,.callout.callout-warning,.label-danger,.label-info,.label-primary,.label-success,.label-warning,.modal-danger .modal-body,.modal-danger .modal-footer,.modal-danger .modal-header,.modal-info .modal-body,.modal-info .modal-footer,.modal-info .modal-header,.modal-primary .modal-body,.modal-primary .modal-footer,.modal-primary .modal-header,.modal-success .modal-body,.modal-success .modal-footer,.modal-success .modal-header,.modal-warning .modal-body,.modal-warning .modal-footer,.modal-warning .modal-header{color:#fff!important}.bg-gray{color:#000;background-color:#d2d6de!important}.bg-gray-light{background-color:#f7f7f7}.bg-black{background-color:#111!important}.alert-danger,.alert-error,.bg-red,.callout.callout-danger,.label-danger,.modal-danger .modal-body{background-color:#dd4b39!important}.alert-warning,.bg-yellow,.callout.callout-warning,.label-warning,.modal-warning .modal-body{background-color:#f39c12!important}.alert-info,.bg-aqua,.callout.callout-info,.label-info,.modal-info .modal-body{background-color:#00c0ef!important}.bg-blue{background-color:#0073b7!important}.bg-light-blue,.label-primary,.modal-primary .modal-body{background-color:#3c8dbc!important}.alert-success,.bg-green,.callout.callout-success,.label-success,.modal-success .modal-body{background-color:#00a65a!important}.bg-navy{background-color:#001f3f!important}.bg-teal{background-color:#39cccc!important}.bg-olive{background-color:#3d9970!important}.bg-lime{background-color:#01ff70!important}.bg-orange{background-color:#ff851b!important}.bg-fuchsia{background-color:#f012be!important}.bg-purple{background-color:#605ca8!important}.bg-maroon{background-color:#d81b60!important}.bg-gray-active{color:#000;background-color:#b5bbc8!important}.bg-black-active{background-color:#000!important}.bg-red-active,.modal-danger .modal-footer,.modal-danger .modal-header{background-color:#d33724!important}.bg-yellow-active,.modal-warning .modal-footer,.modal-warning .modal-header{background-color:#db8b0b!important}.bg-aqua-active,.modal-info .modal-footer,.modal-info .modal-header{background-color:#00a7d0!important}.bg-blue-active{background-color:#005384!important}.bg-light-blue-active,.modal-primary .modal-footer,.modal-primary .modal-header{background-color:#357ca5!important}.bg-green-active,.modal-success .modal-footer,.modal-success .modal-header{background-color:#008d4c!important}.bg-navy-active{background-color:#001a35!important}.bg-teal-active{background-color:#30bbbb!important}.bg-olive-active{background-color:#368763!important}.bg-lime-active{background-color:#00e765!important}.bg-orange-active{background-color:#ff7701!important}.bg-fuchsia-active{background-color:#db0ead!important}.bg-purple-active{background-color:#555299!important}.bg-maroon-active{background-color:#ca195a!important}[class^=bg-].disabled{opacity:.65;filter:alpha(opacity=65)}.text-red{color:#dd4b39!important}.text-yellow{color:#f39c12!important}.text-aqua{color:#00c0ef!important}.text-blue{color:#0073b7!important}.text-black{color:#111!important}.text-light-blue{color:#3c8dbc!important}.text-green{color:#00a65a!important}.text-gray{color:#d2d6de!important}.text-navy{color:#001f3f!important}.text-teal{color:#39cccc!important}.text-olive{color:#3d9970!important}.text-lime{color:#01ff70!important}.text-orange{color:#ff851b!important}.text-fuchsia{color:#f012be!important}.text-purple{color:#605ca8!important}.text-maroon{color:#d81b60!important}.link-muted{color:#7a869d}.link-muted:focus,.link-muted:hover{color:#606c84}.link-black{color:#666}.link-black:focus,.link-black:hover{color:#999}.hide{display:none!important}.no-border{border:0!important}.no-padding{padding:0!important}.no-margin{margin:0!important}.no-shadow{box-shadow:none!important}.chart-legend,.contacts-list,.list-unstyled,.mailbox-attachments,.users-list{list-style:none;margin:0;padding:0}.list-group-unbordered>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0}.flat{border-radius:0!important}.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}.text-sm{font-size:12px}.jqstooltip{padding:5px!important;width:auto!important;height:auto!important}.bg-teal-gradient{background:#39cccc!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#39cccc),color-stop(1,#7adddd))!important;background:-ms-linear-gradient(bottom,#39cccc,#7adddd)!important;background:-moz-linear-gradient(center bottom,#39cccc 0,#7adddd 100%)!important;background:-o-linear-gradient(#7adddd,#39cccc)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#7adddd",endColorstr="#39cccc",GradientType=0)!important;color:#fff}.bg-light-blue-gradient{background:#3c8dbc!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#3c8dbc),color-stop(1,#67a8ce))!important;background:-ms-linear-gradient(bottom,#3c8dbc,#67a8ce)!important;background:-moz-linear-gradient(center bottom,#3c8dbc 0,#67a8ce 100%)!important;background:-o-linear-gradient(#67a8ce,#3c8dbc)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#67a8ce",endColorstr="#3c8dbc",GradientType=0)!important;color:#fff}.bg-blue-gradient{background:#0073b7!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#0073b7),color-stop(1,#0089db))!important;background:-ms-linear-gradient(bottom,#0073b7,#0089db)!important;background:-moz-linear-gradient(center bottom,#0073b7 0,#0089db 100%)!important;background:-o-linear-gradient(#0089db,#0073b7)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#0089db",endColorstr="#0073b7",GradientType=0)!important;color:#fff}.bg-aqua-gradient{background:#00c0ef!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#00c0ef),color-stop(1,#14d1ff))!important;background:-ms-linear-gradient(bottom,#00c0ef,#14d1ff)!important;background:-moz-linear-gradient(center bottom,#00c0ef 0,#14d1ff 100%)!important;background:-o-linear-gradient(#14d1ff,#00c0ef)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#14d1ff",endColorstr="#00c0ef",GradientType=0)!important;color:#fff}.bg-yellow-gradient{background:#f39c12!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#f39c12),color-stop(1,#f7bc60))!important;background:-ms-linear-gradient(bottom,#f39c12,#f7bc60)!important;background:-moz-linear-gradient(center bottom,#f39c12 0,#f7bc60 100%)!important;background:-o-linear-gradient(#f7bc60,#f39c12)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#f7bc60",endColorstr="#f39c12",GradientType=0)!important;color:#fff}.bg-purple-gradient{background:#605ca8!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#605ca8),color-stop(1,#9491c4))!important;background:-ms-linear-gradient(bottom,#605ca8,#9491c4)!important;background:-moz-linear-gradient(center bottom,#605ca8 0,#9491c4 100%)!important;background:-o-linear-gradient(#9491c4,#605ca8)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#9491c4",endColorstr="#605ca8",GradientType=0)!important;color:#fff}.bg-green-gradient{background:#00a65a!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#00a65a),color-stop(1,#00ca6d))!important;background:-ms-linear-gradient(bottom,#00a65a,#00ca6d)!important;background:-moz-linear-gradient(center bottom,#00a65a 0,#00ca6d 100%)!important;background:-o-linear-gradient(#00ca6d,#00a65a)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00ca6d",endColorstr="#00a65a",GradientType=0)!important;color:#fff}.bg-red-gradient{background:#dd4b39!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#dd4b39),color-stop(1,#e47365))!important;background:-ms-linear-gradient(bottom,#dd4b39,#e47365)!important;background:-moz-linear-gradient(center bottom,#dd4b39 0,#e47365 100%)!important;background:-o-linear-gradient(#e47365,#dd4b39)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#e47365",endColorstr="#dd4b39",GradientType=0)!important;color:#fff}.bg-black-gradient{background:#111!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#111),color-stop(1,#2b2b2b))!important;background:-ms-linear-gradient(bottom,#111,#2b2b2b)!important;background:-moz-linear-gradient(center bottom,#111 0,#2b2b2b 100%)!important;background:-o-linear-gradient(#2b2b2b,#111)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#2b2b2b",endColorstr="#111111",GradientType=0)!important;color:#fff}.bg-maroon-gradient{background:#d81b60!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#d81b60),color-stop(1,#e73f7c))!important;background:-ms-linear-gradient(bottom,#d81b60,#e73f7c)!important;background:-moz-linear-gradient(center bottom,#d81b60 0,#e73f7c 100%)!important;background:-o-linear-gradient(#e73f7c,#d81b60)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#e73f7c",endColorstr="#d81b60",GradientType=0)!important;color:#fff}.description-block .description-icon{font-size:16px}.no-pad-top{padding-top:0}.position-static{position:static!important}.list-header{font-size:15px;padding:10px 4px;font-weight:700;color:#666}.list-seperator{height:1px;background:#f4f4f4;margin:15px 0 9px}.list-link>a{padding:4px;color:#777}.list-link>a:hover{color:#222}.font-light{font-weight:300}.user-block:after,.user-block:before{content:" ";display:table}.user-block:after{clear:both}.user-block img{width:40px;height:40px;float:left}.user-block .comment,.user-block .description,.user-block .username{display:block;margin-left:50px}.user-block .username{font-size:16px;font-weight:600}.user-block .description{color:#999;font-size:13px}.user-block.user-block-sm .comment,.user-block.user-block-sm .description,.user-block.user-block-sm .username{margin-left:40px}.user-block.user-block-sm .username{font-size:14px}.box-comments .box-comment img,.img-lg,.img-md,.img-sm,.user-block.user-block-sm img{float:left}.box-comments .box-comment img,.img-sm,.user-block.user-block-sm img{width:30px!important;height:30px!important}.img-sm+.img-push{margin-left:40px}.img-md{width:60px;height:60px}.img-md+.img-push{margin-left:70px}.img-lg{width:100px;height:100px}.img-lg+.img-push{margin-left:110px}.img-bordered{border:3px solid #d2d6de;padding:3px}.img-bordered-sm{border:2px solid #d2d6de;padding:2px}.attachment-block{border:1px solid #f4f4f4;padding:5px;margin-bottom:10px;background:#f7f7f7}.attachment-block .attachment-img{max-width:100px;max-height:100px;height:auto;float:left}.attachment-block .attachment-pushed{margin-left:110px}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#555}.connectedSortable{min-height:100px}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sort-highlight{background:#f4f4f4;border:1px dashed #ddd;margin-bottom:10px}.full-opacity-hover{opacity:.65;filter:alpha(opacity=65)}.full-opacity-hover:hover{opacity:1;filter:alpha(opacity=100)}.chart{position:relative;overflow:hidden;width:100%}.chart canvas,.chart svg{width:100%!important}@media print{.content-header,.left-side,.main-header,.main-sidebar,.no-print{display:none!important}.content-wrapper,.main-footer,.right-side{margin-left:0!important;min-height:0!important;-webkit-transform:translate(0)!important;-ms-transform:translate(0)!important;-o-transform:translate(0)!important;transform:translate(0)!important}.fixed .content-wrapper,.fixed .right-side{padding-top:0!important}.invoice{width:100%;border:0;margin:0;padding:0}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr td,.table-responsive>.table tr th{white-space:normal!important}}.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav>.active>a,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .left-side,.skin-blue .main-sidebar,.skin-blue .wrapper{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li.active>a,.skin-blue .sidebar-menu>li.menu-open>a,.skin-blue .sidebar-menu>li:hover>a{color:#fff;background:#1e282c}.skin-blue .sidebar-menu>li.active>a{border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-blue .sidebar-menu .treeview-menu>li.active>a,.skin-blue .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px}.skin-blue .sidebar-form .btn,.skin-blue .sidebar-form input[type=text]{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-blue .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type=text]:focus,.skin-blue .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue-light .main-header .navbar{background-color:#3c8dbc}.skin-blue-light .main-header .navbar .nav>li>a{color:#fff}.skin-blue-light .main-header .navbar .nav .open>a,.skin-blue-light .main-header .navbar .nav .open>a:focus,.skin-blue-light .main-header .navbar .nav .open>a:hover,.skin-blue-light .main-header .navbar .nav>.active>a,.skin-blue-light .main-header .navbar .nav>li>a:active,.skin-blue-light .main-header .navbar .nav>li>a:focus,.skin-blue-light .main-header .navbar .nav>li>a:hover,.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue-light .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-blue-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue-light .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue-light .main-header .logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue-light .main-header .logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header li.user-header{background-color:#3c8dbc}.skin-blue-light .content-header{background:transparent}.skin-blue-light .left-side,.skin-blue-light .main-sidebar,.skin-blue-light .wrapper{background-color:#f9fafc}.skin-blue-light .main-sidebar{border-right:1px solid #d2d6de}.skin-blue-light .user-panel>.info,.skin-blue-light .user-panel>.info>a{color:#444}.skin-blue-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-blue-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-blue-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-blue-light .sidebar-menu>li.active>a,.skin-blue-light .sidebar-menu>li:hover>a{color:#000;background:#f4f4f5}.skin-blue-light .sidebar-menu>li.active{border-left-color:#3c8dbc}.skin-blue-light .sidebar-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-blue-light .sidebar a{color:#444}.skin-blue-light .sidebar a:hover{text-decoration:none}.skin-blue-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-blue-light .sidebar-menu .treeview-menu>li.active>a,.skin-blue-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-blue-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px}.skin-blue-light .sidebar-form .btn,.skin-blue-light .sidebar-form input[type=text]{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-blue-light .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue-light .sidebar-form input[type=text]:focus,.skin-blue-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-blue-light .main-footer{border-top-color:#d2d6de}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}.skin-black .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.skin-black .main-header .navbar-toggle{color:#333}.skin-black .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar{background-color:#fff}.skin-black .main-header .navbar .nav>li>a{color:#333}.skin-black .main-header .navbar .nav .open>a,.skin-black .main-header .navbar .nav .open>a:focus,.skin-black .main-header .navbar .nav .open>a:hover,.skin-black .main-header .navbar .nav>.active>a,.skin-black .main-header .navbar .nav>li>a:active,.skin-black .main-header .navbar .nav>li>a:focus,.skin-black .main-header .navbar .nav>li>a:hover{background:#fff;color:#999}.skin-black .main-header .navbar .sidebar-toggle{color:#333}.skin-black .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black .main-header .navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black .main-header .logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black .main-header .logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black .main-header .logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black .main-header .logo:hover{background-color:#1f1f1f}}.skin-black .main-header li.user-header{background-color:#222}.skin-black .content-header{background:transparent;box-shadow:none}.skin-black .left-side,.skin-black .main-sidebar,.skin-black .wrapper{background-color:#222d32}.skin-black .user-panel>.info,.skin-black .user-panel>.info>a{color:#fff}.skin-black .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-black .sidebar-menu>li>a{border-left:3px solid transparent}.skin-black .sidebar-menu>li.active>a,.skin-black .sidebar-menu>li.menu-open>a,.skin-black .sidebar-menu>li:hover>a{color:#fff;background:#1e282c}.skin-black .sidebar-menu>li.active>a{border-left-color:#fff}.skin-black .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-black .sidebar a{color:#b8c7ce}.skin-black .sidebar a:hover{text-decoration:none}.skin-black .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-black .sidebar-menu .treeview-menu>li.active>a,.skin-black .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-black .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px}.skin-black .sidebar-form .btn,.skin-black .sidebar-form input[type=text]{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-black .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black .sidebar-form input[type=text]:focus,.skin-black .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-black .pace .pace-progress{background:#222}.skin-black .pace .pace-activity{border-top-color:#222;border-left-color:#222}.skin-black-light .main-header{border-bottom:1px solid #d2d6de}.skin-black-light .main-header .navbar-toggle{color:#333}.skin-black-light .main-header .navbar-brand{color:#333;border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar{background-color:#fff}.skin-black-light .main-header .navbar .nav>li>a{color:#333}.skin-black-light .main-header .navbar .nav .open>a,.skin-black-light .main-header .navbar .nav .open>a:focus,.skin-black-light .main-header .navbar .nav .open>a:hover,.skin-black-light .main-header .navbar .nav>.active>a,.skin-black-light .main-header .navbar .nav>li>a:active,.skin-black-light .main-header .navbar .nav>li>a:focus,.skin-black-light .main-header .navbar .nav>li>a:hover{background:#fff;color:#999}.skin-black-light .main-header .navbar .sidebar-toggle{color:#333}.skin-black-light .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black-light .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar .navbar-nav>li>a{border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black-light .main-header .navbar .navbar-right>li>a{border-left:1px solid #d2d6de;border-right-width:0}.skin-black-light .main-header .logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #d2d6de}.skin-black-light .main-header .logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black-light .main-header .logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black-light .main-header .logo:hover{background-color:#1f1f1f}}.skin-black-light .main-header li.user-header{background-color:#222}.skin-black-light .content-header{background:transparent;box-shadow:none}.skin-black-light .left-side,.skin-black-light .main-sidebar,.skin-black-light .wrapper{background-color:#f9fafc}.skin-black-light .main-sidebar{border-right:1px solid #d2d6de}.skin-black-light .user-panel>.info,.skin-black-light .user-panel>.info>a{color:#444}.skin-black-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-black-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-black-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-black-light .sidebar-menu>li.active>a,.skin-black-light .sidebar-menu>li:hover>a{color:#000;background:#f4f4f5}.skin-black-light .sidebar-menu>li.active{border-left-color:#fff}.skin-black-light .sidebar-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-black-light .sidebar a{color:#444}.skin-black-light .sidebar a:hover{text-decoration:none}.skin-black-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-black-light .sidebar-menu .treeview-menu>li.active>a,.skin-black-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-black-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px}.skin-black-light .sidebar-form .btn,.skin-black-light .sidebar-form input[type=text]{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-black-light .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black-light .sidebar-form input[type=text]:focus,.skin-black-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-green .main-header .navbar{background-color:#00a65a}.skin-green .main-header .navbar .nav>li>a{color:#fff}.skin-green .main-header .navbar .nav .open>a,.skin-green .main-header .navbar .nav .open>a:focus,.skin-green .main-header .navbar .nav .open>a:hover,.skin-green .main-header .navbar .nav>.active>a,.skin-green .main-header .navbar .nav>li>a:active,.skin-green .main-header .navbar .nav>li>a:focus,.skin-green .main-header .navbar .nav>li>a:hover,.skin-green .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-green .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green .main-header .logo{background-color:#008d4c;color:#fff;border-bottom:0 solid transparent}.skin-green .main-header .logo:hover{background-color:#008749}.skin-green .main-header li.user-header{background-color:#00a65a}.skin-green .content-header{background:transparent}.skin-green .left-side,.skin-green .main-sidebar,.skin-green .wrapper{background-color:#222d32}.skin-green .user-panel>.info,.skin-green .user-panel>.info>a{color:#fff}.skin-green .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-green .sidebar-menu>li>a{border-left:3px solid transparent}.skin-green .sidebar-menu>li.active>a,.skin-green .sidebar-menu>li.menu-open>a,.skin-green .sidebar-menu>li:hover>a{color:#fff;background:#1e282c}.skin-green .sidebar-menu>li.active>a{border-left-color:#00a65a}.skin-green .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-green .sidebar a{color:#b8c7ce}.skin-green .sidebar a:hover{text-decoration:none}.skin-green .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-green .sidebar-menu .treeview-menu>li.active>a,.skin-green .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-green .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px}.skin-green .sidebar-form .btn,.skin-green .sidebar-form input[type=text]{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-green .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green .sidebar-form input[type=text]:focus,.skin-green .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-green-light .main-header .navbar{background-color:#00a65a}.skin-green-light .main-header .navbar .nav>li>a{color:#fff}.skin-green-light .main-header .navbar .nav .open>a,.skin-green-light .main-header .navbar .nav .open>a:focus,.skin-green-light .main-header .navbar .nav .open>a:hover,.skin-green-light .main-header .navbar .nav>.active>a,.skin-green-light .main-header .navbar .nav>li>a:active,.skin-green-light .main-header .navbar .nav>li>a:focus,.skin-green-light .main-header .navbar .nav>li>a:hover,.skin-green-light .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green-light .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-green-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green-light .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green-light .main-header .logo{background-color:#00a65a;color:#fff;border-bottom:0 solid transparent}.skin-green-light .main-header .logo:hover{background-color:#00a157}.skin-green-light .main-header li.user-header{background-color:#00a65a}.skin-green-light .content-header{background:transparent}.skin-green-light .left-side,.skin-green-light .main-sidebar,.skin-green-light .wrapper{background-color:#f9fafc}.skin-green-light .main-sidebar{border-right:1px solid #d2d6de}.skin-green-light .user-panel>.info,.skin-green-light .user-panel>.info>a{color:#444}.skin-green-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-green-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-green-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-green-light .sidebar-menu>li.active>a,.skin-green-light .sidebar-menu>li:hover>a{color:#000;background:#f4f4f5}.skin-green-light .sidebar-menu>li.active{border-left-color:#00a65a}.skin-green-light .sidebar-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-green-light .sidebar a{color:#444}.skin-green-light .sidebar a:hover{text-decoration:none}.skin-green-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-green-light .sidebar-menu .treeview-menu>li.active>a,.skin-green-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-green-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px}.skin-green-light .sidebar-form .btn,.skin-green-light .sidebar-form input[type=text]{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-green-light .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green-light .sidebar-form input[type=text]:focus,.skin-green-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-red .main-header .navbar{background-color:#dd4b39}.skin-red .main-header .navbar .nav>li>a{color:#fff}.skin-red .main-header .navbar .nav .open>a,.skin-red .main-header .navbar .nav .open>a:focus,.skin-red .main-header .navbar .nav .open>a:hover,.skin-red .main-header .navbar .nav>.active>a,.skin-red .main-header .navbar .nav>li>a:active,.skin-red .main-header .navbar .nav>li>a:focus,.skin-red .main-header .navbar .nav>li>a:hover,.skin-red .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-red .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red .main-header .logo{background-color:#d73925;color:#fff;border-bottom:0 solid transparent}.skin-red .main-header .logo:hover{background-color:#d33724}.skin-red .main-header li.user-header{background-color:#dd4b39}.skin-red .content-header{background:transparent}.skin-red .left-side,.skin-red .main-sidebar,.skin-red .wrapper{background-color:#222d32}.skin-red .user-panel>.info,.skin-red .user-panel>.info>a{color:#fff}.skin-red .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-red .sidebar-menu>li>a{border-left:3px solid transparent}.skin-red .sidebar-menu>li.active>a,.skin-red .sidebar-menu>li.menu-open>a,.skin-red .sidebar-menu>li:hover>a{color:#fff;background:#1e282c}.skin-red .sidebar-menu>li.active>a{border-left-color:#dd4b39}.skin-red .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-red .sidebar a{color:#b8c7ce}.skin-red .sidebar a:hover{text-decoration:none}.skin-red .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-red .sidebar-menu .treeview-menu>li.active>a,.skin-red .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-red .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px}.skin-red .sidebar-form .btn,.skin-red .sidebar-form input[type=text]{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-red .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red .sidebar-form input[type=text]:focus,.skin-red .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-red-light .main-header .navbar{background-color:#dd4b39}.skin-red-light .main-header .navbar .nav>li>a{color:#fff}.skin-red-light .main-header .navbar .nav .open>a,.skin-red-light .main-header .navbar .nav .open>a:focus,.skin-red-light .main-header .navbar .nav .open>a:hover,.skin-red-light .main-header .navbar .nav>.active>a,.skin-red-light .main-header .navbar .nav>li>a:active,.skin-red-light .main-header .navbar .nav>li>a:focus,.skin-red-light .main-header .navbar .nav>li>a:hover,.skin-red-light .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red-light .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-red-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red-light .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red-light .main-header .logo{background-color:#dd4b39;color:#fff;border-bottom:0 solid transparent}.skin-red-light .main-header .logo:hover{background-color:#dc4735}.skin-red-light .main-header li.user-header{background-color:#dd4b39}.skin-red-light .content-header{background:transparent}.skin-red-light .left-side,.skin-red-light .main-sidebar,.skin-red-light .wrapper{background-color:#f9fafc}.skin-red-light .main-sidebar{border-right:1px solid #d2d6de}.skin-red-light .user-panel>.info,.skin-red-light .user-panel>.info>a{color:#444}.skin-red-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-red-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-red-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-red-light .sidebar-menu>li.active>a,.skin-red-light .sidebar-menu>li:hover>a{color:#000;background:#f4f4f5}.skin-red-light .sidebar-menu>li.active{border-left-color:#dd4b39}.skin-red-light .sidebar-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-red-light .sidebar a{color:#444}.skin-red-light .sidebar a:hover{text-decoration:none}.skin-red-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-red-light .sidebar-menu .treeview-menu>li.active>a,.skin-red-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-red-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px}.skin-red-light .sidebar-form .btn,.skin-red-light .sidebar-form input[type=text]{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-red-light .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red-light .sidebar-form input[type=text]:focus,.skin-red-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-yellow .main-header .navbar{background-color:#f39c12}.skin-yellow .main-header .navbar .nav>li>a{color:#fff}.skin-yellow .main-header .navbar .nav .open>a,.skin-yellow .main-header .navbar .nav .open>a:focus,.skin-yellow .main-header .navbar .nav .open>a:hover,.skin-yellow .main-header .navbar .nav>.active>a,.skin-yellow .main-header .navbar .nav>li>a:active,.skin-yellow .main-header .navbar .nav>li>a:focus,.skin-yellow .main-header .navbar .nav>li>a:hover,.skin-yellow .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-yellow .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow .main-header .logo{background-color:#e08e0b;color:#fff;border-bottom:0 solid transparent}.skin-yellow .main-header .logo:hover{background-color:#db8b0b}.skin-yellow .main-header li.user-header{background-color:#f39c12}.skin-yellow .content-header{background:transparent}.skin-yellow .left-side,.skin-yellow .main-sidebar,.skin-yellow .wrapper{background-color:#222d32}.skin-yellow .user-panel>.info,.skin-yellow .user-panel>.info>a{color:#fff}.skin-yellow .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-yellow .sidebar-menu>li>a{border-left:3px solid transparent}.skin-yellow .sidebar-menu>li.active>a,.skin-yellow .sidebar-menu>li.menu-open>a,.skin-yellow .sidebar-menu>li:hover>a{color:#fff;background:#1e282c}.skin-yellow .sidebar-menu>li.active>a{border-left-color:#f39c12}.skin-yellow .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-yellow .sidebar a{color:#b8c7ce}.skin-yellow .sidebar a:hover{text-decoration:none}.skin-yellow .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-yellow .sidebar-menu .treeview-menu>li.active>a,.skin-yellow .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-yellow .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px}.skin-yellow .sidebar-form .btn,.skin-yellow .sidebar-form input[type=text]{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-yellow .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow .sidebar-form input[type=text]:focus,.skin-yellow .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-yellow-light .main-header .navbar{background-color:#f39c12}.skin-yellow-light .main-header .navbar .nav>li>a{color:#fff}.skin-yellow-light .main-header .navbar .nav .open>a,.skin-yellow-light .main-header .navbar .nav .open>a:focus,.skin-yellow-light .main-header .navbar .nav .open>a:hover,.skin-yellow-light .main-header .navbar .nav>.active>a,.skin-yellow-light .main-header .navbar .nav>li>a:active,.skin-yellow-light .main-header .navbar .nav>li>a:focus,.skin-yellow-light .main-header .navbar .nav>li>a:hover,.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow-light .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-yellow-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow-light .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow-light .main-header .logo{background-color:#f39c12;color:#fff;border-bottom:0 solid transparent}.skin-yellow-light .main-header .logo:hover{background-color:#f39a0d}.skin-yellow-light .main-header li.user-header{background-color:#f39c12}.skin-yellow-light .content-header{background:transparent}.skin-yellow-light .left-side,.skin-yellow-light .main-sidebar,.skin-yellow-light .wrapper{background-color:#f9fafc}.skin-yellow-light .main-sidebar{border-right:1px solid #d2d6de}.skin-yellow-light .user-panel>.info,.skin-yellow-light .user-panel>.info>a{color:#444}.skin-yellow-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-yellow-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-yellow-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-yellow-light .sidebar-menu>li.active>a,.skin-yellow-light .sidebar-menu>li:hover>a{color:#000;background:#f4f4f5}.skin-yellow-light .sidebar-menu>li.active{border-left-color:#f39c12}.skin-yellow-light .sidebar-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-yellow-light .sidebar a{color:#444}.skin-yellow-light .sidebar a:hover{text-decoration:none}.skin-yellow-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-yellow-light .sidebar-menu .treeview-menu>li.active>a,.skin-yellow-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-yellow-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px}.skin-yellow-light .sidebar-form .btn,.skin-yellow-light .sidebar-form input[type=text]{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-yellow-light .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow-light .sidebar-form input[type=text]:focus,.skin-yellow-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-purple .main-header .navbar{background-color:#605ca8}.skin-purple .main-header .navbar .nav>li>a{color:#fff}.skin-purple .main-header .navbar .nav .open>a,.skin-purple .main-header .navbar .nav .open>a:focus,.skin-purple .main-header .navbar .nav .open>a:hover,.skin-purple .main-header .navbar .nav>.active>a,.skin-purple .main-header .navbar .nav>li>a:active,.skin-purple .main-header .navbar .nav>li>a:focus,.skin-purple .main-header .navbar .nav>li>a:hover,.skin-purple .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-purple .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple .main-header .logo{background-color:#555299;color:#fff;border-bottom:0 solid transparent}.skin-purple .main-header .logo:hover{background-color:#545096}.skin-purple .main-header li.user-header{background-color:#605ca8}.skin-purple .content-header{background:transparent}.skin-purple .left-side,.skin-purple .main-sidebar,.skin-purple .wrapper{background-color:#222d32}.skin-purple .user-panel>.info,.skin-purple .user-panel>.info>a{color:#fff}.skin-purple .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-purple .sidebar-menu>li>a{border-left:3px solid transparent}.skin-purple .sidebar-menu>li.active>a,.skin-purple .sidebar-menu>li.menu-open>a,.skin-purple .sidebar-menu>li:hover>a{color:#fff;background:#1e282c}.skin-purple .sidebar-menu>li.active>a{border-left-color:#605ca8}.skin-purple .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-purple .sidebar a{color:#b8c7ce}.skin-purple .sidebar a:hover{text-decoration:none}.skin-purple .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-purple .sidebar-menu .treeview-menu>li.active>a,.skin-purple .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-purple .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px}.skin-purple .sidebar-form .btn,.skin-purple .sidebar-form input[type=text]{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-purple .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple .sidebar-form input[type=text]:focus,.skin-purple .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-purple-light .main-header .navbar{background-color:#605ca8}.skin-purple-light .main-header .navbar .nav>li>a{color:#fff}.skin-purple-light .main-header .navbar .nav .open>a,.skin-purple-light .main-header .navbar .nav .open>a:focus,.skin-purple-light .main-header .navbar .nav .open>a:hover,.skin-purple-light .main-header .navbar .nav>.active>a,.skin-purple-light .main-header .navbar .nav>li>a:active,.skin-purple-light .main-header .navbar .nav>li>a:focus,.skin-purple-light .main-header .navbar .nav>li>a:hover,.skin-purple-light .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple-light .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-purple-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple-light .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple-light .main-header .logo{background-color:#605ca8;color:#fff;border-bottom:0 solid transparent}.skin-purple-light .main-header .logo:hover{background-color:#5d59a6}.skin-purple-light .main-header li.user-header{background-color:#605ca8}.skin-purple-light .content-header{background:transparent}.skin-purple-light .left-side,.skin-purple-light .main-sidebar,.skin-purple-light .wrapper{background-color:#f9fafc}.skin-purple-light .main-sidebar{border-right:1px solid #d2d6de}.skin-purple-light .user-panel>.info,.skin-purple-light .user-panel>.info>a{color:#444}.skin-purple-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-purple-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-purple-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-purple-light .sidebar-menu>li.active>a,.skin-purple-light .sidebar-menu>li:hover>a{color:#000;background:#f4f4f5}.skin-purple-light .sidebar-menu>li.active{border-left-color:#605ca8}.skin-purple-light .sidebar-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-purple-light .sidebar a{color:#444}.skin-purple-light .sidebar a:hover{text-decoration:none}.skin-purple-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-purple-light .sidebar-menu .treeview-menu>li.active>a,.skin-purple-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-purple-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px}.skin-purple-light .sidebar-form .btn,.skin-purple-light .sidebar-form input[type=text]{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-purple-light .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple-light .sidebar-form input[type=text]:focus,.skin-purple-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.sidebar-menu .treeview-menu>li>a>.fab,.sidebar-menu .treeview-menu>li>a>.fal,.sidebar-menu .treeview-menu>li>a>.far,.sidebar-menu .treeview-menu>li>a>.fas,.sidebar-menu>li>a>.fab,.sidebar-menu>li>a>.fal,.sidebar-menu>li>a>.far,.sidebar-menu>li>a>.fas{width:20px}.main-header .sidebar-toggle{font-family:Font Awesome\ 5 Free;font-weight:900}.login-page form label{padding-left:5px}.icheckbox_square-blue,.iradio_square-blue{display:inline-block;*display:inline;vertical-align:middle;margin:0;padding:0;width:22px;height:22px;background:url(/build/images/blue.png?96f8a905) no-repeat;border:none;cursor:pointer}.icheckbox_square-blue{background-position:0 0}.icheckbox_square-blue.hover{background-position:-24px 0}.icheckbox_square-blue.checked{background-position:-48px 0}.icheckbox_square-blue.disabled{background-position:-72px 0;cursor:default}.icheckbox_square-blue.checked.disabled{background-position:-96px 0}.iradio_square-blue{background-position:-120px 0}.iradio_square-blue.hover{background-position:-144px 0}.iradio_square-blue.checked{background-position:-168px 0}.iradio_square-blue.disabled{background-position:-192px 0;cursor:default}.iradio_square-blue.checked.disabled{background-position:-216px 0}@media (-o-min-device-pixel-ratio:5/4),(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.icheckbox_square-blue,.iradio_square-blue{background-image:url(/build/images/blue@2x.png?2694acfd);-webkit-background-size:240px 24px;background-size:240px 24px}}.error-page{margin-bottom:50px}@media print{.control-sidebar,.sf-toolbar{display:none!important}}.content{padding:15px 0}.content-header h1 small{display:none}@media (min-width:768px){.content-header h1 small{display:inline-block}.content{padding:15px}}td.timesheet-description>ul{padding-left:10px}.content-header>.breadcrumb{position:absolute;float:right;background:transparent}.control-sidebar select{color:#555;background-color:#fff}.control-sidebar div.image img.img-circle{max-width:34px}.toolbar form{font-size:14px}.user-panel>.info{left:80px}footer.main-footer{padding:5px;font-size:80%}.invoice{margin:0}@media (min-width:768px){.invoice{margin:10px 25px}}.page-header-small{font-size:14px}div.invoice-address{margin-top:30px;margin-bottom:30px}table.invoice-meta th{padding-right:40px}table.invoice-sum th{width:70%}table.invoice-sum td,table.invoice-sum th{text-align:right}#freelancer-invoice{font:16px/1 Open Sans,sans-serif;box-sizing:border-box}#freelancer-invoice h1{font:700 100% sans-serif;letter-spacing:.5em;text-align:center;text-transform:uppercase}#freelancer-invoice h2{font:700 1.5em sans-serif;margin-bottom:1em}#freelancer-invoice table{table-layout:fixed;width:100%;border-collapse:separate;border-spacing:0}#freelancer-invoice header:after{clear:both;content:"";display:table;font-size:1em}#freelancer-invoice header address{float:left;font-style:normal;line-height:1.25;margin:0 1em 1em 0;font-weight:700;font-size:.7em}#freelancer-invoice article address{font-size:1em;float:left}#freelancer-invoice article.address{margin-bottom:1.5em}#freelancer-invoice article.footer{margin-top:60px}#freelancer-invoice article,#freelancer-invoice article address,#freelancer-invoice table.inventory,#freelancer-invoice table.meta{margin:2em 0}#freelancer-invoice article:after{clear:both;content:"";display:table}#freelancer-invoice article h1{clip:rect(0 0 0 0);position:absolute}#freelancer-invoice article p{margin-bottom:20px}#freelancer-invoice table.balance:after,#freelancer-invoice table.meta:after{clear:both;content:"";display:table}#freelancer-invoice table.meta{float:right;width:50%;font-size:90%}#freelancer-invoice table.meta th{text-align:right;font-weight:400}#freelancer-invoice table.meta td{width:120px;text-align:right}#freelancer-invoice table.balance{float:right}#freelancer-invoice table.balance th{text-align:right;font-weight:400}#freelancer-invoice table.balance td{width:140px;text-align:right}#freelancer-invoice table.balance .total{font-weight:700}#freelancer-invoice table.inventory{clear:both;width:100%;margin-top:2em;border-bottom:1px solid #000}#freelancer-invoice table.inventory th{font-weight:700;border-width:0 0 1px;border-bottom:1px solid #000}#freelancer-invoice table.inventory td,#freelancer-invoice table.inventory th{padding:5px}#freelancer-invoice table.inventory td:first-child,#freelancer-invoice table.inventory th:first-child{text-align:left}#freelancer-invoice table.inventory td:nth-child(2),#freelancer-invoice table.inventory td:nth-child(3),#freelancer-invoice table.inventory th:nth-child(2),#freelancer-invoice table.inventory th:nth-child(3){text-align:center;width:20%}#freelancer-invoice table.inventory td:nth-child(4),#freelancer-invoice table.inventory th:nth-child(4){text-align:right;width:20%}#freelancer-invoice footer{margin-top:50px}#freelancer-invoice footer table{border-top:1px solid #000;font-size:.8em;padding-top:5px}#freelancer-invoice footer th{text-align:left;font-weight:700;margin-bottom:10px}#freelancer-invoice footer table th:first-child{width:32%}#freelancer-invoice footer table th:nth-child(3){width:28%}#freelancer-invoice footer td{text-align:left;vertical-align:bottom}#freelancer-invoice aside{position:absolute;top:10in;width:7.5in}#freelancer-invoice aside h1{border:none;border-width:0 0 1px;margin:0 0 1em;border-color:#999;border-bottom-style:solid}#freelancer-invoice aside p{font-size:85%}#freelancer-invoice aside div{margin-top:15px}#freelancer-invoice aside div p{line-height:1.4}#freelancer-invoice aside p span{width:130px;font-weight:700;display:inline-block}@media print{*{-webkit-print-color-adjust:exact}#freelancer-invoice,.invoice,.wrapper,body{margin:0;padding:0}#freelancer-invoice{margin:1em 2em}#freelancer-invoice .add,#freelancer-invoice .cut,#freelancer-invoice span:empty{display:none}}div.dataTables_length label{font-weight:400;text-align:left;white-space:nowrap}div.dataTables_length select{width:75px;display:inline-block}div.dataTables_filter{text-align:right}div.dataTables_filter label{font-weight:400;white-space:nowrap;text-align:left}div.dataTables_filter input{margin-left:.5em;display:inline-block;width:auto}div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}@media screen and (max-width:767px){div.dataTables_filter,div.dataTables_info,div.dataTables_length,div.dataTables_paginate{text-align:center}div.DTTT{margin-bottom:.5em}}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}table.dataTable{clear:both;margin-bottom:0!important;max-width:none!important}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after{position:absolute;top:8px;right:8px;display:block;font-family:Glyphicons Halflings;opacity:.5}table.dataTable thead .sorting:after{opacity:.2;content:"\E150"}table.dataTable thead .sorting_asc:after{content:"\E155"}table.dataTable thead .sorting_desc:after{content:"\E156"}div.dataTables_scrollBody table.dataTable thead .sorting:after,div.dataTables_scrollBody table.dataTable thead .sorting_asc:after,div.dataTables_scrollBody table.dataTable thead .sorting_desc:after{display:none}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}table.dataTable thead>tr>th{padding-right:30px}table.dataTable th:active{outline:none}table.dataTable.table-condensed thead>tr>th{padding-right:20px}table.dataTable.table-condensed thead .sorting:after,table.dataTable.table-condensed thead .sorting_asc:after,table.dataTable.table-condensed thead .sorting_desc:after{top:6px;right:6px}div.dataTables_scrollHead table{margin-bottom:0!important;border-bottom-left-radius:0;border-bottom-right-radius:0}div.dataTables_scrollHead table thead tr:last-child td:first-child,div.dataTables_scrollHead table thead tr:last-child th:first-child{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}div.dataTables_scrollBody table{border-top:none;margin-top:0!important;margin-bottom:0!important}div.dataTables_scrollBody tbody tr:first-child td,div.dataTables_scrollBody tbody tr:first-child th{border-top:none}div.dataTables_scrollFoot table{margin-top:0!important;border-top:none}table.table-bordered.dataTable{border-collapse:separate!important}table.table-bordered thead td,table.table-bordered thead th{border-left-width:0;border-top-width:0}table.table-bordered tbody td,table.table-bordered tbody th,table.table-bordered tfoot td,table.table-bordered tfoot th{border-left-width:0;border-bottom-width:0}table.table-bordered td:last-child,table.table-bordered th:last-child{border-right-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}.table.dataTable tbody tr.active td,.table.dataTable tbody tr.active th{background-color:#08c;color:#fff}.table.dataTable tbody tr.active:hover td,.table.dataTable tbody tr.active:hover th{background-color:#0075b0!important}.table.dataTable tbody tr.active td>a,.table.dataTable tbody tr.active th>a{color:#fff}.table-striped.dataTable tbody tr.active:nth-child(odd) td,.table-striped.dataTable tbody tr.active:nth-child(odd) th{background-color:#017ebc}.popover-content .calendar-entry ul{padding:0 0 0 10px}section.dashboard .info-box .info-box-text{white-space:normal}.navbar-nav>li>a.ddt-large{padding-top:12px;padding-bottom:9px}li.messages-menu ul.menu li .pull-left i{color:#dd4b39}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{overflow:hidden;text-overflow:ellipsis}.navbar-nav .start_record{text-align:center}/*! + */.layout-boxed body,.layout-boxed html,body,html{height:100%}body{font-family:Source Sans Pro,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400}.wrapper,body{overflow-x:hidden;overflow-y:auto}.wrapper{height:100%;position:relative}.wrapper:after,.wrapper:before{content:" ";display:table}.wrapper:after{clear:both}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;min-height:100%;box-shadow:0 0 8px rgba(0,0,0,.5);position:relative}.layout-boxed{background-color:#f9fafc}.content-wrapper,.main-footer{-webkit-transition:-webkit-transform .3s ease-in-out,margin .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,margin .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,margin .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out;margin-left:230px;z-index:820}.layout-top-nav .content-wrapper,.layout-top-nav .main-footer{margin-left:0}@media (max-width:767px){.content-wrapper,.main-footer{margin-left:0}}@media (min-width:768px){.sidebar-collapse .content-wrapper,.sidebar-collapse .main-footer{margin-left:0}}@media (max-width:767px){.sidebar-open .content-wrapper,.sidebar-open .main-footer{-webkit-transform:translate(230px);-ms-transform:translate(230px);-o-transform:translate(230px);transform:translate(230px)}}.content-wrapper{min-height:100%;background-color:#ecf0f5;z-index:800}.main-footer{background:#fff;padding:15px;color:#444;border-top:1px solid #d2d6de}.fixed .left-side,.fixed .main-header,.fixed .main-sidebar{position:fixed}.fixed .main-header{top:0;right:0;left:0}.fixed .content-wrapper,.fixed .right-side{padding-top:50px}@media (max-width:767px){.fixed .content-wrapper,.fixed .right-side{padding-top:100px}}.fixed.layout-boxed .wrapper{max-width:100%}.fixed .wrapper{overflow:hidden}.hold-transition .content-wrapper,.hold-transition .left-side,.hold-transition .main-footer,.hold-transition .main-header .logo,.hold-transition .main-header .navbar,.hold-transition .main-sidebar,.hold-transition .menu-open .fa-angle-left,.hold-transition .right-side{-webkit-transition:none;-o-transition:none;transition:none}.content{min-height:250px;padding:15px;margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:Source Sans Pro,sans-serif}a{color:#3c8dbc}a:active,a:focus,a:hover{outline:none;text-decoration:none;color:#72afd2}.page-header{margin:10px 0 20px;font-size:22px}.page-header>small{color:#666;display:block;margin-top:5px}.main-header{position:relative;max-height:100px;z-index:1030}.main-header .navbar{-webkit-transition:margin-left .3s ease-in-out;-o-transition:margin-left .3s ease-in-out;transition:margin-left .3s ease-in-out;margin-bottom:0;margin-left:230px;border:none;min-height:50px;border-radius:0}.layout-top-nav .main-header .navbar{margin-left:0}.main-header #navbar-search-input.form-control{background:hsla(0,0%,100%,.2);border-color:transparent}.main-header #navbar-search-input.form-control:active,.main-header #navbar-search-input.form-control:focus{border-color:rgba(0,0,0,.1);background:hsla(0,0%,100%,.9)}.main-header #navbar-search-input.form-control::-moz-placeholder{color:#ccc;opacity:1}.main-header #navbar-search-input.form-control:-ms-input-placeholder{color:#ccc}.main-header #navbar-search-input.form-control::-webkit-input-placeholder{color:#ccc}.main-header .navbar-custom-menu,.main-header .navbar-right{float:right}@media (max-width:991px){.main-header .navbar-custom-menu a,.main-header .navbar-right a{color:inherit;background:transparent}}@media (max-width:767px){.main-header .navbar-right{float:none}.navbar-collapse .main-header .navbar-right{margin:7.5px -15px}.main-header .navbar-right>li{color:inherit;border:0}}.main-header .sidebar-toggle{float:left;background-color:transparent;background-image:none;padding:15px;font-family:fontAwesome}.main-header .sidebar-toggle:before{content:"\F0C9"}.main-header .sidebar-toggle:hover{color:#fff}.main-header .sidebar-toggle:active,.main-header .sidebar-toggle:focus{background:transparent}.main-header .sidebar-toggle .icon-bar{display:none}.main-header .navbar .nav>li.user>a>.fa,.main-header .navbar .nav>li.user>a>.glyphicon,.main-header .navbar .nav>li.user>a>.ion{margin-right:5px}.main-header .navbar .nav>li>a>.label{position:absolute;top:9px;right:7px;text-align:center;font-size:9px;padding:2px 3px;line-height:.9}.main-header .logo{-webkit-transition:width .3s ease-in-out;-o-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;float:left;height:50px;font-size:20px;line-height:50px;text-align:center;width:230px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.main-header .logo .logo-lg{display:block}.main-header .logo .logo-mini{display:none}.main-header .navbar-brand{color:#fff}.content-header{position:relative;padding:15px 15px 0}.content-header>h1{margin:0;font-size:24px}.content-header>h1>small{font-size:15px;display:inline-block;padding-left:4px;font-weight:300}.content-header>.breadcrumb{float:right;background:transparent;margin-top:0;margin-bottom:0;font-size:12px;padding:7px 5px;position:absolute;top:15px;right:10px;border-radius:2px}.content-header>.breadcrumb>li>a{color:#444;text-decoration:none;display:inline-block}.content-header>.breadcrumb>li>a>.fa,.content-header>.breadcrumb>li>a>.glyphicon,.content-header>.breadcrumb>li>a>.ion{margin-right:5px}.content-header>.breadcrumb>li+li:before{content:">\A0"}@media (max-width:991px){.content-header>.breadcrumb{position:relative;margin-top:5px;top:0;right:0;float:none;background:#d2d6de;padding-left:10px}.content-header>.breadcrumb li:before{color:#97a0b3}}.navbar-toggle{color:#fff;border:0;margin:0;padding:15px}@media (max-width:991px){.navbar-custom-menu .navbar-nav>li{float:left}.navbar-custom-menu .navbar-nav{margin:0;float:left}.navbar-custom-menu .navbar-nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}}@media (max-width:767px){.main-header{position:relative}.main-header .logo,.main-header .navbar{width:100%;float:none}.main-header .navbar{margin:0}.main-header .navbar-custom-menu{float:right}}@media (max-width:991px){.navbar-collapse.pull-left{float:none!important}.navbar-collapse.pull-left+.navbar-custom-menu{display:block;position:absolute;top:0;right:40px}}.main-sidebar{position:absolute;top:0;left:0;padding-top:50px;min-height:100%;width:230px;z-index:810;-webkit-transition:-webkit-transform .3s ease-in-out,width .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,width .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,width .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out}@media (max-width:767px){.main-sidebar{padding-top:100px;-webkit-transform:translate(-230px);-ms-transform:translate(-230px);-o-transform:translate(-230px);transform:translate(-230px)}}@media (min-width:768px){.sidebar-collapse .main-sidebar{-webkit-transform:translate(-230px);-ms-transform:translate(-230px);-o-transform:translate(-230px);transform:translate(-230px)}}@media (max-width:767px){.sidebar-open .main-sidebar{-webkit-transform:translate(0);-ms-transform:translate(0);-o-transform:translate(0);transform:translate(0)}}.sidebar{padding-bottom:10px}.sidebar-form input:focus{border-color:transparent}.user-panel{position:relative;width:100%;padding:10px;overflow:hidden}.user-panel:after,.user-panel:before{content:" ";display:table}.user-panel:after{clear:both}.user-panel>.image>img{width:100%;max-width:45px;height:auto}.user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.user-panel>.info>p{font-weight:600;margin-bottom:9px}.user-panel>.info>a{text-decoration:none;padding-right:5px;margin-top:3px;font-size:11px}.user-panel>.info>a>.fa,.user-panel>.info>a>.glyphicon,.user-panel>.info>a>.ion{margin-right:3px}.sidebar-menu{list-style:none;margin:0;padding:0}.sidebar-menu>li{position:relative;margin:0;padding:0}.sidebar-menu>li>a{padding:12px 5px 12px 15px;display:block}.sidebar-menu>li>a>.fa,.sidebar-menu>li>a>.glyphicon,.sidebar-menu>li>a>.ion{width:20px}.sidebar-menu>li .badge,.sidebar-menu>li .label{margin-right:5px}.sidebar-menu>li .badge{margin-top:3px}.sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px}.sidebar-menu li>a>.fa-angle-left,.sidebar-menu li>a>.pull-right-container>.fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px;-webkit-transition:transform .5s ease;-o-transition:transform .5s ease;transition:transform .5s ease}.sidebar-menu li>a>.fa-angle-left{position:absolute;top:50%;right:10px;margin-top:-8px}.sidebar-menu .menu-open>a>.fa-angle-left,.sidebar-menu .menu-open>a>.pull-right-container>.fa-angle-left{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.sidebar-menu .active>.treeview-menu{display:block}@media (min-width:768px){.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .main-footer,.sidebar-mini.sidebar-collapse .right-side{margin-left:50px!important;z-index:840}.sidebar-mini.sidebar-collapse .main-sidebar{-webkit-transform:translate(0);-ms-transform:translate(0);-o-transform:translate(0);transform:translate(0);width:50px!important;z-index:850}.sidebar-mini.sidebar-collapse .sidebar-menu>li{position:relative}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a{margin-right:0}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{border-top-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:not(.treeview)>a>span{border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{padding-top:5px;padding-bottom:5px;border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel>.info,.sidebar-mini.sidebar-collapse .sidebar-form,.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>.pull-right,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span,.sidebar-mini.sidebar-collapse .sidebar-menu li.header{display:none!important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-header .logo{width:50px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-mini{display:block;margin-left:-15px;margin-right:-15px;font-size:18px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-lg{display:none}.sidebar-mini.sidebar-collapse .main-header .navbar{margin-left:50px}}@media (min-width:768px){.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>.treeview-menu,.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>span:not(.pull-right){display:block!important;position:absolute;width:180px;left:50px}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>span{top:0;margin-left:-3px;padding:12px 5px 12px 20px;background-color:inherit}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container{position:relative!important;float:right;width:auto!important;left:180px!important;top:-22px!important;z-index:900}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container>.label:not(:first-of-type){display:none}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{top:44px;margin-left:0}}.sidebar-expanded-on-hover .content-wrapper,.sidebar-expanded-on-hover .main-footer{margin-left:50px}.sidebar-expanded-on-hover .main-sidebar{box-shadow:3px 0 8px rgba(0,0,0,.125)}.main-sidebar .user-panel,.sidebar-menu,.sidebar-menu>li.header{white-space:nowrap;overflow:hidden}.sidebar-menu:hover{overflow:visible}.sidebar-form,.sidebar-menu>li.header{overflow:hidden;text-overflow:clip}.sidebar-menu li>a{position:relative}.sidebar-menu li>a>.pull-right-container{position:absolute;right:10px;top:50%;margin-top:-7px}.control-sidebar-bg{position:fixed;z-index:1000;bottom:0}.control-sidebar,.control-sidebar-bg{top:0;right:-230px;width:230px;-webkit-transition:right .3s ease-in-out;-o-transition:right .3s ease-in-out;transition:right .3s ease-in-out}.control-sidebar{position:absolute;padding-top:50px;z-index:1010}@media (max-width:767px){.control-sidebar{padding-top:100px}}.control-sidebar>.tab-content{padding:10px 15px}.control-sidebar-open .control-sidebar,.control-sidebar-open .control-sidebar-bg,.control-sidebar.control-sidebar-open,.control-sidebar.control-sidebar-open+.control-sidebar-bg{right:0}@media (min-width:768px){.control-sidebar-open .content-wrapper,.control-sidebar-open .main-footer,.control-sidebar-open .right-side{margin-right:230px}}.fixed .control-sidebar{position:fixed;height:100%;overflow-y:auto;padding-bottom:50px}.nav-tabs.control-sidebar-tabs>li:first-of-type>a,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:focus,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:hover{border-left-width:0}.nav-tabs.control-sidebar-tabs>li>a{border-radius:0}.nav-tabs.control-sidebar-tabs>li>a,.nav-tabs.control-sidebar-tabs>li>a:hover{border-top:none;border-right:none;border-left:1px solid transparent;border-bottom:1px solid transparent}.nav-tabs.control-sidebar-tabs>li>a .icon{font-size:16px}.nav-tabs.control-sidebar-tabs>li.active>a,.nav-tabs.control-sidebar-tabs>li.active>a:active,.nav-tabs.control-sidebar-tabs>li.active>a:focus,.nav-tabs.control-sidebar-tabs>li.active>a:hover{border-top:none;border-right:none;border-bottom:none}@media (max-width:768px){.nav-tabs.control-sidebar-tabs{display:table}.nav-tabs.control-sidebar-tabs>li{display:table-cell}}.control-sidebar-heading{font-weight:400;font-size:16px;padding:10px 0;margin-bottom:10px}.control-sidebar-subheading{display:block;font-weight:400;font-size:14px}.control-sidebar-menu{list-style:none;padding:0;margin:0 -15px}.control-sidebar-menu>li>a{display:block;padding:10px 15px}.control-sidebar-menu>li>a:after,.control-sidebar-menu>li>a:before{content:" ";display:table}.control-sidebar-menu>li>a:after{clear:both}.control-sidebar-menu>li>a>.control-sidebar-subheading{margin-top:0}.control-sidebar-menu .menu-icon{float:left;width:35px;height:35px;border-radius:50%;text-align:center;line-height:35px}.control-sidebar-menu .menu-info{margin-left:45px;margin-top:3px}.control-sidebar-menu .menu-info>.control-sidebar-subheading{margin:0}.control-sidebar-menu .menu-info>p{margin:0;font-size:11px}.control-sidebar-menu .progress{margin:0}.control-sidebar-dark{color:#b8c7ce}.control-sidebar-dark,.control-sidebar-dark+.control-sidebar-bg{background:#222d32}.control-sidebar-dark .nav-tabs.control-sidebar-tabs{border-bottom:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a{background:#181f23;color:#b8c7ce}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{border-left-color:#141a1d;border-bottom-color:#141a1d}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:active,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{background:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{color:#fff}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:active,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:hover{background:#222d32;color:#fff}.control-sidebar-dark .control-sidebar-heading,.control-sidebar-dark .control-sidebar-subheading{color:#fff}.control-sidebar-dark .control-sidebar-menu>li>a:hover{background:#1e282c}.control-sidebar-dark .control-sidebar-menu>li>a .menu-info>p{color:#b8c7ce}.control-sidebar-light{color:#5e5e5e}.control-sidebar-light,.control-sidebar-light+.control-sidebar-bg{background:#f9fafc;border-left:1px solid #d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs{border-bottom:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a{background:#e8ecf4;color:#444}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover{border-left-color:#d2d6de;border-bottom-color:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:active,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover{background:#eff1f7}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:active,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:hover{background:#f9fafc;color:#111}.control-sidebar-light .control-sidebar-heading,.control-sidebar-light .control-sidebar-subheading{color:#111}.control-sidebar-light .control-sidebar-menu{margin-left:-14px}.control-sidebar-light .control-sidebar-menu>li>a:hover{background:#f4f4f5}.control-sidebar-light .control-sidebar-menu>li>a .menu-info>p{color:#5e5e5e}.dropdown-menu{box-shadow:none;border-color:#eee}.dropdown-menu>li>a{color:#777}.dropdown-menu>li>a>.fa,.dropdown-menu>li>a>.glyphicon,.dropdown-menu>li>a>.ion{margin-right:10px}.dropdown-menu>li>a:hover{background-color:#e1e3e9;color:#333}.dropdown-menu>.divider{background-color:#eee}.navbar-nav>.messages-menu>.dropdown-menu,.navbar-nav>.notifications-menu>.dropdown-menu,.navbar-nav>.tasks-menu>.dropdown-menu{width:280px;padding:0;margin:0;top:100%}.navbar-nav>.messages-menu>.dropdown-menu>li,.navbar-nav>.notifications-menu>.dropdown-menu>li,.navbar-nav>.tasks-menu>.dropdown-menu>li{position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li.header,.navbar-nav>.notifications-menu>.dropdown-menu>li.header,.navbar-nav>.tasks-menu>.dropdown-menu>li.header{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0;background-color:#fff;padding:7px 10px;border-bottom:1px solid #f4f4f4;color:#444;font-size:14px}.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;font-size:12px;background-color:#fff;padding:7px 10px;border-bottom:1px solid #eee;color:#444!important;text-align:center}@media (max-width:991px){.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{background:#fff!important;color:#444!important}}.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a:hover{text-decoration:none;font-weight:400}.navbar-nav>.messages-menu>.dropdown-menu>li .menu,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu{max-height:200px;margin:0;padding:0;list-style:none;overflow-x:hidden}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{display:block;white-space:nowrap;border-bottom:1px solid #f4f4f4}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a:hover{background:#f4f4f4;text-decoration:none}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a{color:#444;overflow:hidden;text-overflow:ellipsis;padding:10px}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.fa,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.glyphicon,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.ion{width:20px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a{margin:0;padding:10px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>div>img{margin:auto 10px auto auto;width:40px;height:40px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4{padding:0;margin:0 0 0 45px;color:#444;font-size:15px;position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4>small{color:#999;font-size:10px;position:absolute;top:0;right:0}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{margin:0 0 0 45px;font-size:12px;color:#888}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:before{content:" ";display:table}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{clear:both}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{padding:10px}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>h3{font-size:14px;padding:0;margin:0 0 10px;color:#666}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>.progress{padding:0;margin:0}.navbar-nav>.user-menu>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;padding:1px 0 0;border-top-width:0;width:280px}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid;border-color:transparent;border-color:hsla(0,0%,100%,.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;color:#fff;color:hsla(0,0%,100%,.8);font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body{padding:15px;border-bottom:1px solid #f4f4f4;border-top:1px solid #ddd}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after,.navbar-nav>.user-menu>.dropdown-menu>.user-body:before{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-body a{color:#444!important}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff!important;color:#444!important}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f9f9f9;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:before{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#666}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f9f9f9}}.navbar-nav>.user-menu .user-image{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px;margin-top:-2px}@media (max-width:767px){.navbar-nav>.user-menu .user-image{float:none;margin-right:0;margin-top:-8px;line-height:10px}}.open:not(.dropup)>.animated-dropdown-menu{backface-visibility:visible!important;-webkit-animation:flipInX .7s both;-o-animation:flipInX .7s both;animation:flipInX .7s both}@keyframes flipInX{0%{transform:perspective(400px) rotateX(90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateX(-20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotateX(10deg);opacity:1}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotateX(90deg);-webkit-transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotateX(-20deg);-webkit-transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotateX(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media (max-width:991px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.form-control{border-radius:0;box-shadow:none;border-color:#d2d6de}.form-control:focus{border-color:#3c8dbc;box-shadow:none}.form-control:-ms-input-placeholder,.form-control::-moz-placeholder,.form-control::-webkit-input-placeholder{color:#bbb;opacity:1}.form-control:not(select){-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-group.has-success label{color:#00a65a}.form-group.has-success .form-control,.form-group.has-success .input-group-addon{border-color:#00a65a;box-shadow:none}.form-group.has-success .help-block{color:#00a65a}.form-group.has-warning label{color:#f39c12}.form-group.has-warning .form-control,.form-group.has-warning .input-group-addon{border-color:#f39c12;box-shadow:none}.form-group.has-warning .help-block{color:#f39c12}.form-group.has-error label{color:#dd4b39}.form-group.has-error .form-control,.form-group.has-error .input-group-addon{border-color:#dd4b39;box-shadow:none}.form-group.has-error .help-block{color:#dd4b39}.input-group .input-group-addon{border-radius:0;border-color:#d2d6de;background-color:#fff}.btn-group-vertical .btn.btn-flat:first-of-type,.btn-group-vertical .btn.btn-flat:last-of-type{border-radius:0}.icheck>label{padding-left:0}.form-control-feedback.fa{line-height:34px}.form-group-lg .form-control+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fa,.input-lg+.form-control-feedback.fa{line-height:46px}.form-group-sm .form-control+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fa,.input-sm+.form-control-feedback.fa{line-height:30px}.progress,.progress>.progress-bar{-webkit-box-shadow:none;box-shadow:none}.progress,.progress .progress-bar,.progress>.progress-bar,.progress>.progress-bar .progress-bar{border-radius:1px}.progress-sm,.progress.sm{height:10px}.progress-sm,.progress-sm .progress-bar,.progress.sm,.progress.sm .progress-bar{border-radius:1px}.progress-xs,.progress.xs{height:7px}.progress-xs,.progress-xs .progress-bar,.progress.xs,.progress.xs .progress-bar{border-radius:1px}.progress-xxs,.progress.xxs{height:3px}.progress-xxs,.progress-xxs .progress-bar,.progress.xxs,.progress.xxs .progress-bar{border-radius:1px}.progress.vertical{position:relative;width:30px;height:200px;display:inline-block;margin-right:10px}.progress.vertical>.progress-bar{width:100%;position:absolute;bottom:0}.progress.vertical.progress-sm,.progress.vertical.sm{width:20px}.progress.vertical.progress-xs,.progress.vertical.xs{width:10px}.progress.vertical.progress-xxs,.progress.vertical.xxs{width:3px}.progress-group .progress-text{font-weight:600}.progress-group .progress-number{float:right}.table tr>td .progress{margin:0}.progress-bar-light-blue,.progress-bar-primary{background-color:#3c8dbc}.progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.progress-bar-green,.progress-bar-success{background-color:#00a65a}.progress-striped .progress-bar-green,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.progress-bar-aqua,.progress-bar-info{background-color:#00c0ef}.progress-striped .progress-bar-aqua,.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.progress-bar-warning,.progress-bar-yellow{background-color:#f39c12}.progress-striped .progress-bar-warning,.progress-striped .progress-bar-yellow{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.progress-bar-danger,.progress-bar-red{background-color:#dd4b39}.progress-striped .progress-bar-danger,.progress-striped .progress-bar-red{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.small-box{border-radius:2px;position:relative;display:block;margin-bottom:20px;box-shadow:0 1px 1px rgba(0,0,0,.1)}.small-box>.inner{padding:10px}.small-box>.small-box-footer{position:relative;text-align:center;padding:3px 0;color:#fff;color:hsla(0,0%,100%,.8);display:block;z-index:10;background:rgba(0,0,0,.1);text-decoration:none}.small-box>.small-box-footer:hover{color:#fff;background:rgba(0,0,0,.15)}.small-box h3{font-size:38px;font-weight:700;margin:0 0 10px;white-space:nowrap;padding:0}.small-box p{font-size:15px}.small-box p>small{display:block;color:#f9f9f9;font-size:13px;margin-top:5px}.small-box h3,.small-box p{z-index:5}.small-box .icon{-webkit-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;position:absolute;top:-10px;right:10px;z-index:0;font-size:90px;color:rgba(0,0,0,.15)}.small-box:hover{text-decoration:none;color:#f9f9f9}.small-box:hover .icon{font-size:95px}@media (max-width:767px){.small-box{text-align:center}.small-box .icon{display:none}.small-box p{font-size:12px}}.box{position:relative;border-radius:3px;background:#fff;border-top:3px solid #d2d6de;margin-bottom:20px;width:100%;box-shadow:0 1px 1px rgba(0,0,0,.1)}.box.box-primary{border-top-color:#3c8dbc}.box.box-info{border-top-color:#00c0ef}.box.box-danger{border-top-color:#dd4b39}.box.box-warning{border-top-color:#f39c12}.box.box-success{border-top-color:#00a65a}.box.box-default{border-top-color:#d2d6de}.box.collapsed-box .box-body,.box.collapsed-box .box-footer{display:none}.box .nav-stacked>li{border-bottom:1px solid #f4f4f4;margin:0}.box .nav-stacked>li:last-of-type{border-bottom:none}.box.height-control .box-body{max-height:300px;overflow:auto}.box .border-right{border-right:1px solid #f4f4f4}.box .border-left{border-left:1px solid #f4f4f4}.box.box-solid{border-top:0}.box.box-solid>.box-header .btn.btn-default{background:transparent}.box.box-solid>.box-header .btn:hover,.box.box-solid>.box-header a:hover{background:rgba(0,0,0,.1)}.box.box-solid.box-default{border:1px solid #d2d6de}.box.box-solid.box-default>.box-header{color:#444;background:#d2d6de;background-color:#d2d6de}.box.box-solid.box-default>.box-header .btn,.box.box-solid.box-default>.box-header a{color:#444}.box.box-solid.box-primary{border:1px solid #3c8dbc}.box.box-solid.box-primary>.box-header{color:#fff;background:#3c8dbc;background-color:#3c8dbc}.box.box-solid.box-primary>.box-header .btn,.box.box-solid.box-primary>.box-header a{color:#fff}.box.box-solid.box-info{border:1px solid #00c0ef}.box.box-solid.box-info>.box-header{color:#fff;background:#00c0ef;background-color:#00c0ef}.box.box-solid.box-info>.box-header .btn,.box.box-solid.box-info>.box-header a{color:#fff}.box.box-solid.box-danger{border:1px solid #dd4b39}.box.box-solid.box-danger>.box-header{color:#fff;background:#dd4b39;background-color:#dd4b39}.box.box-solid.box-danger>.box-header .btn,.box.box-solid.box-danger>.box-header a{color:#fff}.box.box-solid.box-warning{border:1px solid #f39c12}.box.box-solid.box-warning>.box-header{color:#fff;background:#f39c12;background-color:#f39c12}.box.box-solid.box-warning>.box-header .btn,.box.box-solid.box-warning>.box-header a{color:#fff}.box.box-solid.box-success{border:1px solid #00a65a}.box.box-solid.box-success>.box-header{color:#fff;background:#00a65a;background-color:#00a65a}.box.box-solid.box-success>.box-header .btn,.box.box-solid.box-success>.box-header a{color:#fff}.box.box-solid>.box-header>.box-tools .btn{border:0;box-shadow:none}.box.box-solid[class*=bg]>.box-header{color:#fff}.box .box-group>.box{margin-bottom:5px}.box .knob-label{text-align:center;color:#333;font-weight:100;font-size:12px;margin-bottom:.3em}.box>.loading-img,.box>.overlay,.overlay-wrapper>.loading-img,.overlay-wrapper>.overlay{position:absolute;top:0;left:0;width:100%;height:100%}.box .overlay,.overlay-wrapper .overlay{z-index:50;background:hsla(0,0%,100%,.7);border-radius:3px}.box .overlay>.fa,.overlay-wrapper .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px}.box .overlay.dark,.overlay-wrapper .overlay.dark{background:rgba(0,0,0,.5)}.box-body:after,.box-body:before,.box-footer:after,.box-footer:before,.box-header:after,.box-header:before{content:" ";display:table}.box-body:after,.box-footer:after,.box-header:after{clear:both}.box-header{color:#444;display:block;padding:10px;position:relative}.box-header.with-border{border-bottom:1px solid #f4f4f4}.collapsed-box .box-header.with-border{border-bottom:none}.box-header .box-title,.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{display:inline-block;font-size:18px;margin:0;line-height:1}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{margin-right:5px}.box-header>.box-tools{position:absolute;right:10px;top:5px}.box-header>.box-tools [data-toggle=tooltip]{position:relative}.box-header>.box-tools.pull-right .dropdown-menu{right:0;left:auto}.box-header>.box-tools .dropdown-menu>li>a{color:#444!important}.btn-box-tool{padding:5px;font-size:12px;background:transparent;color:#97a0b3}.btn-box-tool:hover,.open .btn-box-tool{color:#606c84}.btn-box-tool.btn:active{box-shadow:none}.box-body{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;padding:10px}.no-header .box-body{border-top-right-radius:3px;border-top-left-radius:3px}.box-body>.table{margin-bottom:0}.box-body .fc{margin-top:5px}.box-body .full-width-chart{margin:-19px}.box-body.no-padding .full-width-chart{margin:-9px}.box-body .box-pane{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:3px}.box-body .box-pane-right{border-bottom-left-radius:0}.box-body .box-pane-right,.box-footer{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px}.box-footer{border-bottom-left-radius:3px;border-top:1px solid #f4f4f4;padding:10px;background-color:#fff}.chart-legend{margin:10px 0}@media (max-width:991px){.chart-legend>li{float:left;margin-right:10px}}.box-comments{background:#f7f7f7}.box-comments .box-comment{padding:8px 0;border-bottom:1px solid #eee}.box-comments .box-comment:after,.box-comments .box-comment:before{content:" ";display:table}.box-comments .box-comment:after{clear:both}.box-comments .box-comment:last-of-type{border-bottom:0}.box-comments .box-comment:first-of-type{padding-top:0}.box-comments .box-comment img{float:left}.box-comments .comment-text{margin-left:40px;color:#555}.box-comments .username{color:#444;display:block;font-weight:600}.box-comments .text-muted{font-weight:400;font-size:12px}.todo-list{margin:0;padding:0;list-style:none;overflow:auto}.todo-list>li{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:2px;border-left:2px solid #e6e7e8;color:#444}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type=checkbox]{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;margin-left:5px;font-weight:600}.todo-list>li .label{margin-left:10px;font-size:9px}.todo-list>li .tools{display:none;float:right;color:#dd4b39}.todo-list>li .tools>.fa,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{margin-right:5px;cursor:pointer}.todo-list>li:hover .tools{display:inline-block}.todo-list>li.done{color:#999}.todo-list>li.done .text{text-decoration:line-through;font-weight:500}.todo-list>li.done .label{background:#d2d6de!important}.todo-list .danger{border-left-color:#dd4b39}.todo-list .warning{border-left-color:#f39c12}.todo-list .info{border-left-color:#00c0ef}.todo-list .success{border-left-color:#00a65a}.todo-list .primary{border-left-color:#3c8dbc}.todo-list .handle{display:inline-block;cursor:move;margin:0 5px}.chat{padding:5px 20px 5px 10px}.chat .item{margin-bottom:10px}.chat .item:after,.chat .item:before{content:" ";display:table}.chat .item:after{clear:both}.chat .item>img{width:40px;height:40px;border:2px solid transparent;border-radius:50%}.chat .item>.online{border:2px solid #00a65a}.chat .item>.offline{border:2px solid #dd4b39}.chat .item>.message{margin-left:55px;margin-top:-40px}.chat .item>.message>.name{display:block;font-weight:600}.chat .item>.attachment{border-radius:3px;background:#f4f4f4;margin-left:65px;margin-right:15px;padding:10px}.chat .item>.attachment>h4{margin:0 0 5px;font-weight:600;font-size:14px}.chat .item>.attachment>.filename,.chat .item>.attachment>p{font-weight:600;font-size:13px;font-style:italic;margin:0}.chat .item>.attachment:after,.chat .item>.attachment:before{content:" ";display:table}.chat .item>.attachment:after{clear:both}.box-input{max-width:200px}.modal .panel-body{color:#444}.info-box{display:block;min-height:90px;background:#fff;width:100%;box-shadow:0 1px 1px rgba(0,0,0,.1);border-radius:2px;margin-bottom:15px}.info-box small{font-size:14px}.info-box .progress{background:rgba(0,0,0,.2);margin:5px -10px;height:2px}.info-box .progress,.info-box .progress .progress-bar{border-radius:0}.info-box .progress .progress-bar{background:#fff}.info-box-icon{border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px;display:block;float:left;height:90px;width:90px;text-align:center;font-size:45px;line-height:90px;background:rgba(0,0,0,.2)}.info-box-icon>img{max-width:100%}.info-box-content{padding:5px 10px;margin-left:90px}.info-box-number{display:block;font-weight:700;font-size:18px}.info-box-text,.progress-description{display:block;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.info-box-text{text-transform:uppercase}.info-box-more{display:block}.progress-description{margin:0}.timeline{position:relative;margin:0 0 30px;padding:0;list-style:none}.timeline:before{content:"";position:absolute;top:0;bottom:0;width:4px;background:#ddd;left:31px;margin:0;border-radius:2px}.timeline>li{position:relative;margin-right:10px;margin-bottom:15px}.timeline>li:after,.timeline>li:before{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-item{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1);border-radius:3px;margin-top:0;background:#fff;color:#444;margin-left:60px;margin-right:15px;padding:0;position:relative}.timeline>li>.timeline-item>.time{color:#999;float:right;padding:10px;font-size:12px}.timeline>li>.timeline-item>.timeline-header{margin:0;color:#555;border-bottom:1px solid #f4f4f4;padding:10px;font-size:16px;line-height:1.1}.timeline>li>.timeline-item>.timeline-header>a{font-weight:600}.timeline>li>.timeline-item>.timeline-body,.timeline>li>.timeline-item>.timeline-footer{padding:10px}.timeline>li>.fa,.timeline>li>.glyphicon,.timeline>li>.ion{width:30px;height:30px;font-size:15px;line-height:30px;position:absolute;color:#666;background:#d2d6de;border-radius:50%;text-align:center;left:18px;top:0}.timeline>.time-label>span{font-weight:600;padding:5px;display:inline-block;background-color:#fff;border-radius:4px}.timeline-inverse>li>.timeline-item{background:#f0f0f0;border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none}.timeline-inverse>li>.timeline-item>.timeline-header{border-bottom-color:#ddd}.btn{border-radius:3px;-webkit-box-shadow:none;box-shadow:none;border:1px solid transparent}.btn.uppercase{text-transform:uppercase}.btn.btn-flat{border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-width:1px}.btn:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:focus{outline:none}.btn.btn-file{position:relative;overflow:hidden}.btn.btn-file>input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;opacity:0;filter:alpha(opacity=0);outline:none;background:#fff;cursor:inherit;display:block}.btn-default{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-default.hover,.btn-default:active,.btn-default:hover{background-color:#e7e7e7}.btn-primary{background-color:#3c8dbc;border-color:#367fa9}.btn-primary.hover,.btn-primary:active,.btn-primary:hover{background-color:#367fa9}.btn-success{background-color:#00a65a;border-color:#008d4c}.btn-success.hover,.btn-success:active,.btn-success:hover{background-color:#008d4c}.btn-info{background-color:#00c0ef;border-color:#00acd6}.btn-info.hover,.btn-info:active,.btn-info:hover{background-color:#00acd6}.btn-danger{background-color:#dd4b39;border-color:#d73925}.btn-danger.hover,.btn-danger:active,.btn-danger:hover{background-color:#d73925}.btn-warning{background-color:#f39c12;border-color:#e08e0b}.btn-warning.hover,.btn-warning:active,.btn-warning:hover{background-color:#e08e0b}.btn-outline{border:1px solid #fff;background:transparent;color:#fff}.btn-outline:active,.btn-outline:focus,.btn-outline:hover{color:hsla(0,0%,100%,.7);border-color:hsla(0,0%,100%,.7)}.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn[class*=bg-]:hover{-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,.2);box-shadow:inset 0 0 100px rgba(0,0,0,.2)}.btn-app{border-radius:3px;position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;text-align:center;color:#666;border:1px solid #ddd;background-color:#f4f4f4;font-size:12px}.btn-app>.fa,.btn-app>.glyphicon,.btn-app>.ion{font-size:20px;display:block}.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn-app:active,.btn-app:focus{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}.callout{border-radius:3px;margin:0 0 20px;padding:15px 30px 15px 15px;border-left:5px solid #eee}.callout a{color:#fff;text-decoration:underline}.callout a:hover{color:#eee}.callout h4{margin-top:0;font-weight:600}.callout p:last-child{margin-bottom:0}.callout .highlight,.callout code{background-color:#fff}.callout.callout-danger{border-color:#c23321}.callout.callout-warning{border-color:#c87f0a}.callout.callout-info{border-color:#0097bc}.callout.callout-success{border-color:#00733e}.alert{border-radius:3px}.alert h4{font-weight:600}.alert .icon{margin-right:10px}.alert .close{color:#000;opacity:.2;filter:alpha(opacity=20)}.alert .close:hover{opacity:.5;filter:alpha(opacity=50)}.alert a{color:#fff;text-decoration:underline}.alert-success{border-color:#008d4c}.alert-danger,.alert-error{border-color:#d73925}.alert-warning{border-color:#e08e0b}.alert-info{border-color:#00acd6}.nav>li>a:active,.nav>li>a:focus,.nav>li>a:hover{color:#444;background:#f7f7f7}.nav-pills>li>a{border-radius:0;border-top:3px solid transparent;color:#444}.nav-pills>li>a>.fa,.nav-pills>li>a>.glyphicon,.nav-pills>li>a>.ion{margin-right:5px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{border-top-color:#3c8dbc}.nav-pills>li.active>a{font-weight:600}.nav-stacked>li>a{border-radius:0;border-top:0;border-left:3px solid transparent;color:#444}.nav-stacked>li.active>a,.nav-stacked>li.active>a:hover{background:transparent;color:#444;border-top:0;border-left-color:#3c8dbc}.nav-stacked>li.header{border-bottom:1px solid #ddd;color:#777;margin-bottom:10px;padding:5px 10px;text-transform:uppercase}.nav-tabs-custom{margin-bottom:20px;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,.1);border-radius:3px}.nav-tabs-custom>.nav-tabs{margin:0;border-bottom-color:#f4f4f4;border-top-right-radius:3px;border-top-left-radius:3px}.nav-tabs-custom>.nav-tabs>li{border-top:3px solid transparent;margin-bottom:-2px;margin-right:5px}.nav-tabs-custom>.nav-tabs>li.disabled>a{color:#777}.nav-tabs-custom>.nav-tabs>li>a{color:#444;border-radius:0}.nav-tabs-custom>.nav-tabs>li>a.text-muted{color:#999}.nav-tabs-custom>.nav-tabs>li>a,.nav-tabs-custom>.nav-tabs>li>a:hover{background:transparent;margin:0}.nav-tabs-custom>.nav-tabs>li>a:hover{color:#999}.nav-tabs-custom>.nav-tabs>li:not(.active)>a:active,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:focus,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:hover{border-color:transparent}.nav-tabs-custom>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom>.nav-tabs>li.active:hover>a,.nav-tabs-custom>.nav-tabs>li.active>a{background-color:#fff;color:#444}.nav-tabs-custom>.nav-tabs>li.active>a{border-top-color:transparent;border-left-color:#f4f4f4;border-right-color:#f4f4f4}.nav-tabs-custom>.nav-tabs>li:first-of-type{margin-left:0}.nav-tabs-custom>.nav-tabs>li:first-of-type.active>a{border-left-color:transparent}.nav-tabs-custom>.nav-tabs.pull-right{float:none!important}.nav-tabs-custom>.nav-tabs.pull-right>li{float:right}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type{margin-right:0}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type>a{border-left-width:1px}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type.active>a{border-left-color:#f4f4f4;border-right-color:transparent}.nav-tabs-custom>.nav-tabs>li.header{line-height:35px;padding:0 10px;font-size:20px;color:#444}.nav-tabs-custom>.nav-tabs>li.header>.fa,.nav-tabs-custom>.nav-tabs>li.header>.glyphicon,.nav-tabs-custom>.nav-tabs>li.header>.ion{margin-right:5px}.nav-tabs-custom>.tab-content{background:#fff;padding:10px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.nav-tabs-custom .dropdown.open>a:active,.nav-tabs-custom .dropdown.open>a:focus{background:transparent;color:#999}.nav-tabs-custom.tab-primary>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom.tab-info>.nav-tabs>li.active{border-top-color:#00c0ef}.nav-tabs-custom.tab-danger>.nav-tabs>li.active{border-top-color:#dd4b39}.nav-tabs-custom.tab-warning>.nav-tabs>li.active{border-top-color:#f39c12}.nav-tabs-custom.tab-success>.nav-tabs>li.active{border-top-color:#00a65a}.nav-tabs-custom.tab-default>.nav-tabs>li.active{border-top-color:#d2d6de}.pagination>li>a{background:#fafafa;color:#666}.pagination.pagination-flat>li>a{border-radius:0!important}.products-list{list-style:none;margin:0;padding:0}.products-list>.item{border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1);padding:10px 0;background:#fff}.products-list>.item:after,.products-list>.item:before{content:" ";display:table}.products-list>.item:after{clear:both}.products-list .product-img{float:left}.products-list .product-img img{width:50px;height:50px}.products-list .product-info{margin-left:60px}.products-list .product-title{font-weight:600}.products-list .product-description{display:block;color:#999;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.product-list-in-box>.item{-webkit-box-shadow:none;box-shadow:none;border-radius:0;border-bottom:1px solid #f4f4f4}.product-list-in-box>.item:last-of-type{border-bottom-width:0}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{border-top:1px solid #f4f4f4}.table>thead>tr>th{border-bottom:2px solid #f4f4f4}.table tr td .progress{margin-top:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #f4f4f4}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table.no-border,.table.no-border td,.table.no-border th{border:0}table.text-center,table.text-center td,table.text-center th{text-align:center}.table.align th{text-align:left}.table.align td{text-align:right}.label-default{background-color:#d2d6de;color:#444}.direct-chat .box-body{border-bottom-right-radius:0;border-bottom-left-radius:0;position:relative;overflow-x:hidden;padding:0}.direct-chat-messages,.direct-chat.chat-pane-open .direct-chat-contacts{-webkit-transform:translate(0);-ms-transform:translate(0);-o-transform:translate(0);transform:translate(0)}.direct-chat-messages{padding:10px;height:250px;overflow:auto}.direct-chat-msg,.direct-chat-text{display:block}.direct-chat-msg{margin-bottom:10px}.direct-chat-msg:after,.direct-chat-msg:before{content:" ";display:table}.direct-chat-msg:after{clear:both}.direct-chat-contacts,.direct-chat-messages{-webkit-transition:-webkit-transform .5s ease-in-out;-moz-transition:-moz-transform .5s ease-in-out;-o-transition:-o-transform .5s ease-in-out;transition:transform .5s ease-in-out}.direct-chat-text{border-radius:5px;position:relative;padding:5px 10px;background:#d2d6de;border:1px solid #d2d6de;margin:5px 0 0 50px;color:#444}.direct-chat-text:after,.direct-chat-text:before{position:absolute;right:100%;top:15px;border:solid transparent;border-right-color:#d2d6de;content:" ";height:0;width:0;pointer-events:none}.direct-chat-text:after{border-width:5px;margin-top:-5px}.direct-chat-text:before{border-width:6px;margin-top:-6px}.right .direct-chat-text{margin-right:50px;margin-left:0}.right .direct-chat-text:after,.right .direct-chat-text:before{right:auto;left:100%;border-right-color:transparent;border-left-color:#d2d6de}.direct-chat-img{border-radius:50%;float:left;width:40px;height:40px}.right .direct-chat-img{float:right}.direct-chat-info{display:block;margin-bottom:2px;font-size:12px}.direct-chat-name{font-weight:600}.direct-chat-timestamp{color:#999}.direct-chat-contacts-open .direct-chat-contacts{-webkit-transform:translate(0);-ms-transform:translate(0);-o-transform:translate(0);transform:translate(0)}.direct-chat-contacts{-webkit-transform:translate(101%);-ms-transform:translate(101%);-o-transform:translate(101%);transform:translate(101%);position:absolute;top:0;bottom:0;height:250px;width:100%;background:#222d32;color:#fff;overflow:auto}.contacts-list>li{border-bottom:1px solid rgba(0,0,0,.2);padding:10px;margin:0}.contacts-list>li:after,.contacts-list>li:before{content:" ";display:table}.contacts-list>li:after{clear:both}.contacts-list>li:last-of-type{border-bottom:none}.contacts-list-img{border-radius:50%;width:40px;float:left}.contacts-list-info{margin-left:45px;color:#fff}.contacts-list-name,.contacts-list-status{display:block}.contacts-list-name{font-weight:600}.contacts-list-status{font-size:12px}.contacts-list-date{color:#aaa;font-weight:400}.contacts-list-msg{color:#999}.direct-chat-danger .right>.direct-chat-text{background:#dd4b39;border-color:#dd4b39;color:#fff}.direct-chat-danger .right>.direct-chat-text:after,.direct-chat-danger .right>.direct-chat-text:before{border-left-color:#dd4b39}.direct-chat-primary .right>.direct-chat-text{background:#3c8dbc;border-color:#3c8dbc;color:#fff}.direct-chat-primary .right>.direct-chat-text:after,.direct-chat-primary .right>.direct-chat-text:before{border-left-color:#3c8dbc}.direct-chat-warning .right>.direct-chat-text{background:#f39c12;border-color:#f39c12;color:#fff}.direct-chat-warning .right>.direct-chat-text:after,.direct-chat-warning .right>.direct-chat-text:before{border-left-color:#f39c12}.direct-chat-info .right>.direct-chat-text{background:#00c0ef;border-color:#00c0ef;color:#fff}.direct-chat-info .right>.direct-chat-text:after,.direct-chat-info .right>.direct-chat-text:before{border-left-color:#00c0ef}.direct-chat-success .right>.direct-chat-text{background:#00a65a;border-color:#00a65a;color:#fff}.direct-chat-success .right>.direct-chat-text:after,.direct-chat-success .right>.direct-chat-text:before{border-left-color:#00a65a}.users-list>li{width:25%;float:left;padding:10px;text-align:center}.users-list>li img{border-radius:50%;max-width:100%;height:auto}.users-list>li>a:hover,.users-list>li>a:hover .users-list-name{color:#999}.users-list-date,.users-list-name{display:block}.users-list-name{font-weight:600;color:#444;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.users-list-date{color:#999;font-size:12px}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.modal{background:rgba(0,0,0,.3)}.modal-content{border-radius:0;-webkit-box-shadow:0 2px 3px rgba(0,0,0,.125);box-shadow:0 2px 3px rgba(0,0,0,.125);border:0}@media (min-width:768px){.modal-content{-webkit-box-shadow:0 2px 3px rgba(0,0,0,.125);box-shadow:0 2px 3px rgba(0,0,0,.125)}}.modal-header{border-bottom-color:#f4f4f4}.modal-footer{border-top-color:#f4f4f4}.modal-primary .modal-footer,.modal-primary .modal-header{border-color:#307095}.modal-warning .modal-footer,.modal-warning .modal-header{border-color:#c87f0a}.modal-info .modal-footer,.modal-info .modal-header{border-color:#0097bc}.modal-success .modal-footer,.modal-success .modal-header{border-color:#00733e}.modal-danger .modal-footer,.modal-danger .modal-header{border-color:#c23321}.box-widget{border:none;position:relative}.widget-user .widget-user-header{padding:20px;height:120px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user .widget-user-username{margin-top:0;margin-bottom:5px;font-size:25px;font-weight:300;text-shadow:0 1px 1px rgba(0,0,0,.2)}.widget-user .widget-user-desc{margin-top:0}.widget-user .widget-user-image{position:absolute;top:65px;left:50%;margin-left:-45px}.widget-user .widget-user-image>img{width:90px;height:auto;border:3px solid #fff}.widget-user .box-footer{padding-top:30px}.widget-user-2 .widget-user-header{padding:20px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user-2 .widget-user-username{margin-top:5px;margin-bottom:5px;font-size:25px;font-weight:300}.widget-user-2 .widget-user-desc{margin-top:0}.widget-user-2 .widget-user-desc,.widget-user-2 .widget-user-username{margin-left:75px}.widget-user-2 .widget-user-image>img{width:65px;height:auto;float:left}.treeview-menu{display:none;list-style:none;padding:0;margin:0;padding-left:5px}.treeview-menu .treeview-menu{padding-left:20px}.treeview-menu>li{margin:0}.treeview-menu>li>a{padding:5px 5px 5px 15px;display:block;font-size:14px}.treeview-menu>li>a>.fa,.treeview-menu>li>a>.glyphicon,.treeview-menu>li>a>.ion{width:20px}.treeview-menu>li>a>.fa-angle-down,.treeview-menu>li>a>.fa-angle-left,.treeview-menu>li>a>.pull-right-container>.fa-angle-down,.treeview-menu>li>a>.pull-right-container>.fa-angle-left{width:auto}.mailbox-messages>.table{margin:0}.mailbox-controls{padding:5px}.mailbox-controls.with-border,.mailbox-read-info{border-bottom:1px solid #f4f4f4}.mailbox-read-info{padding:10px}.mailbox-read-info h3{font-size:20px;margin:0}.mailbox-read-info h5{margin:0;padding:5px 0 0}.mailbox-read-time{color:#999;font-size:13px}.mailbox-read-message{padding:10px}.mailbox-attachments li{float:left;width:200px;border:1px solid #eee;margin-bottom:10px;margin-right:10px}.mailbox-attachment-name{font-weight:700;color:#666}.mailbox-attachment-icon,.mailbox-attachment-info,.mailbox-attachment-size{display:block}.mailbox-attachment-info{padding:10px;background:#f4f4f4}.mailbox-attachment-size{color:#999;font-size:12px}.mailbox-attachment-icon{text-align:center;font-size:65px;color:#666;padding:20px 10px}.mailbox-attachment-icon.has-img{padding:0}.mailbox-attachment-icon.has-img>img{max-width:100%;height:auto}.lockscreen{background:#d2d6de}.lockscreen-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.lockscreen-logo a{color:#444}.lockscreen-wrapper{max-width:400px;margin:0 auto;margin-top:10%}.lockscreen .lockscreen-name{text-align:center;font-weight:600}.lockscreen-item{border-radius:4px;padding:0;background:#fff;position:relative;margin:10px auto 30px;width:290px}.lockscreen-image{border-radius:50%;position:absolute;left:-10px;top:-25px;background:#fff;padding:5px;z-index:10}.lockscreen-image>img{border-radius:50%;width:70px;height:70px}.lockscreen-credentials{margin-left:70px}.lockscreen-credentials .form-control{border:0}.lockscreen-credentials .btn{background-color:#fff;border:0;padding:0 10px}.lockscreen-footer{margin-top:10px}.login-logo,.register-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.login-logo a,.register-logo a{color:#444}.login-page,.register-page{background:#d2d6de}.login-box,.register-box{width:360px;margin:7% auto}@media (max-width:768px){.login-box,.register-box{width:90%;margin-top:20px}}.login-box-body,.register-box-body{background:#fff;padding:20px;border-top:0;color:#666}.login-box-body .form-control-feedback,.register-box-body .form-control-feedback{color:#777}.login-box-msg,.register-box-msg{margin:0;text-align:center;padding:0 20px 20px}.social-auth-links{margin:10px 0}.error-page{width:600px;margin:20px auto 0}@media (max-width:991px){.error-page{width:100%}}.error-page>.headline{float:left;font-size:100px;font-weight:300}@media (max-width:991px){.error-page>.headline{float:none;text-align:center}}.error-page>.error-content{margin-left:190px;display:block}@media (max-width:991px){.error-page>.error-content{margin-left:0}}.error-page>.error-content>h3{font-weight:300;font-size:25px}@media (max-width:991px){.error-page>.error-content>h3{text-align:center}}.invoice{position:relative;background:#fff;border:1px solid #f4f4f4;padding:20px;margin:10px 25px}.invoice-title{margin-top:0}.profile-user-img{margin:0 auto;width:100px;padding:3px;border:3px solid #d2d6de}.profile-username{font-size:21px;margin-top:5px}.post{border-bottom:1px solid #d2d6de;margin-bottom:15px;padding-bottom:15px;color:#666}.post:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.post .user-block{margin-bottom:15px}.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;border-right:1px solid rgba(0,0,0,.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon>:first-child{border:none;text-align:center;width:100%}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,.2)}.btn-adn.active,.btn-adn.focus,.btn-adn:active,.btn-adn:focus,.btn-adn:hover,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,.2)}.btn-adn.active,.btn-adn:active,.open>.dropdown-toggle.btn-adn{background-image:none}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,.2)}.btn-bitbucket.active,.btn-bitbucket.focus,.btn-bitbucket:active,.btn-bitbucket:focus,.btn-bitbucket:hover,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,.2)}.btn-bitbucket.active,.btn-bitbucket:active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,.2)}.btn-dropbox.active,.btn-dropbox.focus,.btn-dropbox:active,.btn-dropbox:focus,.btn-dropbox:hover,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,.2)}.btn-dropbox.active,.btn-dropbox:active,.open>.dropdown-toggle.btn-dropbox{background-image:none}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,.2)}.btn-facebook.active,.btn-facebook.focus,.btn-facebook:active,.btn-facebook:focus,.btn-facebook:hover,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,.2)}.btn-facebook.active,.btn-facebook:active,.open>.dropdown-toggle.btn-facebook{background-image:none}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,.2)}.btn-flickr.active,.btn-flickr.focus,.btn-flickr:active,.btn-flickr:focus,.btn-flickr:hover,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,.2)}.btn-flickr.active,.btn-flickr:active,.open>.dropdown-toggle.btn-flickr{background-image:none}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,.2)}.btn-foursquare.active,.btn-foursquare.focus,.btn-foursquare:active,.btn-foursquare:focus,.btn-foursquare:hover,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,.2)}.btn-foursquare.active,.btn-foursquare:active,.open>.dropdown-toggle.btn-foursquare{background-image:none}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,.2)}.btn-github.active,.btn-github.focus,.btn-github:active,.btn-github:focus,.btn-github:hover,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,.2)}.btn-github.active,.btn-github:active,.open>.dropdown-toggle.btn-github{background-image:none}.btn-github .badge{color:#444;background-color:#fff}.btn-google{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,.2)}.btn-google.active,.btn-google.focus,.btn-google:active,.btn-google:focus,.btn-google:hover,.open>.dropdown-toggle.btn-google{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,.2)}.btn-google.active,.btn-google:active,.open>.dropdown-toggle.btn-google{background-image:none}.btn-google .badge{color:#dd4b39;background-color:#fff}.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,.2)}.btn-instagram.active,.btn-instagram.focus,.btn-instagram:active,.btn-instagram:focus,.btn-instagram:hover,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,.2)}.btn-instagram.active,.btn-instagram:active,.open>.dropdown-toggle.btn-instagram{background-image:none}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,.2)}.btn-linkedin.active,.btn-linkedin.focus,.btn-linkedin:active,.btn-linkedin:focus,.btn-linkedin:hover,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,.2)}.btn-linkedin.active,.btn-linkedin:active,.open>.dropdown-toggle.btn-linkedin{background-image:none}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,.2)}.btn-microsoft.active,.btn-microsoft.focus,.btn-microsoft:active,.btn-microsoft:focus,.btn-microsoft:hover,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,.2)}.btn-microsoft.active,.btn-microsoft:active,.open>.dropdown-toggle.btn-microsoft{background-image:none}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,.2)}.btn-openid.active,.btn-openid.focus,.btn-openid:active,.btn-openid:focus,.btn-openid:hover,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,.2)}.btn-openid.active,.btn-openid:active,.open>.dropdown-toggle.btn-openid{background-image:none}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,.2)}.btn-pinterest.active,.btn-pinterest.focus,.btn-pinterest:active,.btn-pinterest:focus,.btn-pinterest:hover,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,.2)}.btn-pinterest.active,.btn-pinterest:active,.open>.dropdown-toggle.btn-pinterest{background-image:none}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,.2)}.btn-reddit.active,.btn-reddit.focus,.btn-reddit:active,.btn-reddit:focus,.btn-reddit:hover,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,.2)}.btn-reddit.active,.btn-reddit:active,.open>.dropdown-toggle.btn-reddit{background-image:none}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,.2)}.btn-soundcloud.active,.btn-soundcloud.focus,.btn-soundcloud:active,.btn-soundcloud:focus,.btn-soundcloud:hover,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,.2)}.btn-soundcloud.active,.btn-soundcloud:active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,.2)}.btn-tumblr.active,.btn-tumblr.focus,.btn-tumblr:active,.btn-tumblr:focus,.btn-tumblr:hover,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,.2)}.btn-tumblr.active,.btn-tumblr:active,.open>.dropdown-toggle.btn-tumblr{background-image:none}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,.2)}.btn-twitter.active,.btn-twitter.focus,.btn-twitter:active,.btn-twitter:focus,.btn-twitter:hover,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,.2)}.btn-twitter.active,.btn-twitter:active,.open>.dropdown-toggle.btn-twitter{background-image:none}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,.2)}.btn-vimeo.active,.btn-vimeo.focus,.btn-vimeo:active,.btn-vimeo:focus,.btn-vimeo:hover,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,.2)}.btn-vimeo.active,.btn-vimeo:active,.open>.dropdown-toggle.btn-vimeo{background-image:none}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,.2)}.btn-vk.active,.btn-vk.focus,.btn-vk:active,.btn-vk:focus,.btn-vk:hover,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,.2)}.btn-vk.active,.btn-vk:active,.open>.dropdown-toggle.btn-vk{background-image:none}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,.2)}.btn-yahoo.active,.btn-yahoo.focus,.btn-yahoo:active,.btn-yahoo:focus,.btn-yahoo:hover,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,.2)}.btn-yahoo.active,.btn-yahoo:active,.open>.dropdown-toggle.btn-yahoo{background-image:none}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.fc-button{background:#f4f4f4;background-image:none;color:#444;border-color:#ddd;border-bottom-color:#ddd}.fc-button.hover,.fc-button:active,.fc-button:hover{background-color:#e9e9e9}.fc-header-title h2{font-size:15px;line-height:1.6em;color:#666;margin-left:10px}.fc-header-right{padding-right:10px}.fc-header-left{padding-left:10px}.fc-widget-header{background:#fafafa}.fc-grid{width:100%;border:0}.fc-widget-content:first-of-type,.fc-widget-header:first-of-type{border-left:0;border-right:0}.fc-widget-content:last-of-type,.fc-widget-header:last-of-type{border-right:0}.fc-toolbar{padding:10px;margin:0}.fc-day-number{font-size:20px;font-weight:300;padding-right:10px}.fc-color-picker{list-style:none;margin:0;padding:0}.fc-color-picker>li{float:left;font-size:30px;margin-right:5px;line-height:30px}.fc-color-picker>li .fa{-webkit-transition:-webkit-transform .3s linear;-moz-transition:-moz-transform linear .3s;-o-transition:-o-transform linear .3s;transition:transform .3s linear}.fc-color-picker>li .fa:hover{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);-o-transform:rotate(30deg);transform:rotate(30deg)}#add-new-event{-webkit-transition:all .3s linear;-o-transition:all linear .3s;transition:all .3s linear}.external-event{padding:5px 10px;font-weight:700;margin-bottom:4px;box-shadow:0 1px 1px rgba(0,0,0,.1);text-shadow:0 1px 1px rgba(0,0,0,.1);border-radius:3px;cursor:move}.external-event:hover{box-shadow:inset 0 0 90px rgba(0,0,0,.2)}.select2-container--default.select2-container--focus,.select2-container--default:active,.select2-container--default:focus,.select2-selection.select2-container--focus,.select2-selection:active,.select2-selection:focus{outline:none}.select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #d2d6de;border-radius:0;padding:6px 12px;height:34px}.select2-container--default.select2-container--open{border-color:#3c8dbc}.select2-dropdown{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:#fff}.select2-results__option{padding:6px 12px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;padding-right:0;height:auto;margin-top:-4px}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px}.select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0}.select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #d2d6de}.select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:none}.select2-container--default.select2-container--focus .select2-selection--multiple,.select2-container--default .select2-search--dropdown .select2-search__field{border-color:#3c8dbc!important}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444}.select2-container--default .select2-selection--multiple{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#d2d6de}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:hsla(0,0%,100%,.7)}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff}.select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px}.box .datepicker-inline,.box .datepicker-inline .datepicker-days,.box .datepicker-inline .datepicker-days>table,.box .datepicker-inline>table{width:100%}.box .datepicker-inline .datepicker-days>table td:hover,.box .datepicker-inline .datepicker-days td:hover,.box .datepicker-inline>table td:hover,.box .datepicker-inline td:hover{background-color:hsla(0,0%,100%,.3)}.box .datepicker-inline .datepicker-days>table td.day.new,.box .datepicker-inline .datepicker-days>table td.day.old,.box .datepicker-inline .datepicker-days td.day.new,.box .datepicker-inline .datepicker-days td.day.old,.box .datepicker-inline>table td.day.new,.box .datepicker-inline>table td.day.old,.box .datepicker-inline td.day.new,.box .datepicker-inline td.day.old{color:#777}.pad{padding:10px}.margin{margin:10px}.margin-bottom{margin-bottom:20px}.margin-bottom-none{margin-bottom:0}.margin-r-5{margin-right:5px}.inline{display:inline}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{margin:0;padding:0;font-weight:600;font-size:16px}.description-block>.description-text{text-transform:uppercase}.alert-danger,.alert-error,.alert-info,.alert-success,.alert-warning,.bg-aqua,.bg-aqua-active,.bg-black,.bg-black-active,.bg-blue,.bg-blue-active,.bg-fuchsia,.bg-fuchsia-active,.bg-green,.bg-green-active,.bg-light-blue,.bg-light-blue-active,.bg-lime,.bg-lime-active,.bg-maroon,.bg-maroon-active,.bg-navy,.bg-navy-active,.bg-olive,.bg-olive-active,.bg-orange,.bg-orange-active,.bg-purple,.bg-purple-active,.bg-red,.bg-red-active,.bg-teal,.bg-teal-active,.bg-yellow,.bg-yellow-active,.callout.callout-danger,.callout.callout-info,.callout.callout-success,.callout.callout-warning,.label-danger,.label-info,.label-primary,.label-success,.label-warning,.modal-danger .modal-body,.modal-danger .modal-footer,.modal-danger .modal-header,.modal-info .modal-body,.modal-info .modal-footer,.modal-info .modal-header,.modal-primary .modal-body,.modal-primary .modal-footer,.modal-primary .modal-header,.modal-success .modal-body,.modal-success .modal-footer,.modal-success .modal-header,.modal-warning .modal-body,.modal-warning .modal-footer,.modal-warning .modal-header{color:#fff!important}.bg-gray{color:#000;background-color:#d2d6de!important}.bg-gray-light{background-color:#f7f7f7}.bg-black{background-color:#111!important}.alert-danger,.alert-error,.bg-red,.callout.callout-danger,.label-danger,.modal-danger .modal-body{background-color:#dd4b39!important}.alert-warning,.bg-yellow,.callout.callout-warning,.label-warning,.modal-warning .modal-body{background-color:#f39c12!important}.alert-info,.bg-aqua,.callout.callout-info,.label-info,.modal-info .modal-body{background-color:#00c0ef!important}.bg-blue{background-color:#0073b7!important}.bg-light-blue,.label-primary,.modal-primary .modal-body{background-color:#3c8dbc!important}.alert-success,.bg-green,.callout.callout-success,.label-success,.modal-success .modal-body{background-color:#00a65a!important}.bg-navy{background-color:#001f3f!important}.bg-teal{background-color:#39cccc!important}.bg-olive{background-color:#3d9970!important}.bg-lime{background-color:#01ff70!important}.bg-orange{background-color:#ff851b!important}.bg-fuchsia{background-color:#f012be!important}.bg-purple{background-color:#605ca8!important}.bg-maroon{background-color:#d81b60!important}.bg-gray-active{color:#000;background-color:#b5bbc8!important}.bg-black-active{background-color:#000!important}.bg-red-active,.modal-danger .modal-footer,.modal-danger .modal-header{background-color:#d33724!important}.bg-yellow-active,.modal-warning .modal-footer,.modal-warning .modal-header{background-color:#db8b0b!important}.bg-aqua-active,.modal-info .modal-footer,.modal-info .modal-header{background-color:#00a7d0!important}.bg-blue-active{background-color:#005384!important}.bg-light-blue-active,.modal-primary .modal-footer,.modal-primary .modal-header{background-color:#357ca5!important}.bg-green-active,.modal-success .modal-footer,.modal-success .modal-header{background-color:#008d4c!important}.bg-navy-active{background-color:#001a35!important}.bg-teal-active{background-color:#30bbbb!important}.bg-olive-active{background-color:#368763!important}.bg-lime-active{background-color:#00e765!important}.bg-orange-active{background-color:#ff7701!important}.bg-fuchsia-active{background-color:#db0ead!important}.bg-purple-active{background-color:#555299!important}.bg-maroon-active{background-color:#ca195a!important}[class^=bg-].disabled{opacity:.65;filter:alpha(opacity=65)}.text-red{color:#dd4b39!important}.text-yellow{color:#f39c12!important}.text-aqua{color:#00c0ef!important}.text-blue{color:#0073b7!important}.text-black{color:#111!important}.text-light-blue{color:#3c8dbc!important}.text-green{color:#00a65a!important}.text-gray{color:#d2d6de!important}.text-navy{color:#001f3f!important}.text-teal{color:#39cccc!important}.text-olive{color:#3d9970!important}.text-lime{color:#01ff70!important}.text-orange{color:#ff851b!important}.text-fuchsia{color:#f012be!important}.text-purple{color:#605ca8!important}.text-maroon{color:#d81b60!important}.link-muted{color:#7a869d}.link-muted:focus,.link-muted:hover{color:#606c84}.link-black{color:#666}.link-black:focus,.link-black:hover{color:#999}.hide{display:none!important}.no-border{border:0!important}.no-padding{padding:0!important}.no-margin{margin:0!important}.no-shadow{box-shadow:none!important}.chart-legend,.contacts-list,.list-unstyled,.mailbox-attachments,.users-list{list-style:none;margin:0;padding:0}.list-group-unbordered>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0}.flat{border-radius:0!important}.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}.text-sm{font-size:12px}.jqstooltip{padding:5px!important;width:auto!important;height:auto!important}.bg-teal-gradient{background:#39cccc!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#39cccc),color-stop(1,#7adddd))!important;background:-ms-linear-gradient(bottom,#39cccc,#7adddd)!important;background:-moz-linear-gradient(center bottom,#39cccc 0,#7adddd 100%)!important;background:-o-linear-gradient(#7adddd,#39cccc)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#7adddd",endColorstr="#39cccc",GradientType=0)!important;color:#fff}.bg-light-blue-gradient{background:#3c8dbc!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#3c8dbc),color-stop(1,#67a8ce))!important;background:-ms-linear-gradient(bottom,#3c8dbc,#67a8ce)!important;background:-moz-linear-gradient(center bottom,#3c8dbc 0,#67a8ce 100%)!important;background:-o-linear-gradient(#67a8ce,#3c8dbc)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#67a8ce",endColorstr="#3c8dbc",GradientType=0)!important;color:#fff}.bg-blue-gradient{background:#0073b7!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#0073b7),color-stop(1,#0089db))!important;background:-ms-linear-gradient(bottom,#0073b7,#0089db)!important;background:-moz-linear-gradient(center bottom,#0073b7 0,#0089db 100%)!important;background:-o-linear-gradient(#0089db,#0073b7)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#0089db",endColorstr="#0073b7",GradientType=0)!important;color:#fff}.bg-aqua-gradient{background:#00c0ef!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#00c0ef),color-stop(1,#14d1ff))!important;background:-ms-linear-gradient(bottom,#00c0ef,#14d1ff)!important;background:-moz-linear-gradient(center bottom,#00c0ef 0,#14d1ff 100%)!important;background:-o-linear-gradient(#14d1ff,#00c0ef)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#14d1ff",endColorstr="#00c0ef",GradientType=0)!important;color:#fff}.bg-yellow-gradient{background:#f39c12!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#f39c12),color-stop(1,#f7bc60))!important;background:-ms-linear-gradient(bottom,#f39c12,#f7bc60)!important;background:-moz-linear-gradient(center bottom,#f39c12 0,#f7bc60 100%)!important;background:-o-linear-gradient(#f7bc60,#f39c12)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#f7bc60",endColorstr="#f39c12",GradientType=0)!important;color:#fff}.bg-purple-gradient{background:#605ca8!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#605ca8),color-stop(1,#9491c4))!important;background:-ms-linear-gradient(bottom,#605ca8,#9491c4)!important;background:-moz-linear-gradient(center bottom,#605ca8 0,#9491c4 100%)!important;background:-o-linear-gradient(#9491c4,#605ca8)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#9491c4",endColorstr="#605ca8",GradientType=0)!important;color:#fff}.bg-green-gradient{background:#00a65a!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#00a65a),color-stop(1,#00ca6d))!important;background:-ms-linear-gradient(bottom,#00a65a,#00ca6d)!important;background:-moz-linear-gradient(center bottom,#00a65a 0,#00ca6d 100%)!important;background:-o-linear-gradient(#00ca6d,#00a65a)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00ca6d",endColorstr="#00a65a",GradientType=0)!important;color:#fff}.bg-red-gradient{background:#dd4b39!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#dd4b39),color-stop(1,#e47365))!important;background:-ms-linear-gradient(bottom,#dd4b39,#e47365)!important;background:-moz-linear-gradient(center bottom,#dd4b39 0,#e47365 100%)!important;background:-o-linear-gradient(#e47365,#dd4b39)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#e47365",endColorstr="#dd4b39",GradientType=0)!important;color:#fff}.bg-black-gradient{background:#111!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#111),color-stop(1,#2b2b2b))!important;background:-ms-linear-gradient(bottom,#111,#2b2b2b)!important;background:-moz-linear-gradient(center bottom,#111 0,#2b2b2b 100%)!important;background:-o-linear-gradient(#2b2b2b,#111)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#2b2b2b",endColorstr="#111111",GradientType=0)!important;color:#fff}.bg-maroon-gradient{background:#d81b60!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#d81b60),color-stop(1,#e73f7c))!important;background:-ms-linear-gradient(bottom,#d81b60,#e73f7c)!important;background:-moz-linear-gradient(center bottom,#d81b60 0,#e73f7c 100%)!important;background:-o-linear-gradient(#e73f7c,#d81b60)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#e73f7c",endColorstr="#d81b60",GradientType=0)!important;color:#fff}.description-block .description-icon{font-size:16px}.no-pad-top{padding-top:0}.position-static{position:static!important}.list-header{font-size:15px;padding:10px 4px;font-weight:700;color:#666}.list-seperator{height:1px;background:#f4f4f4;margin:15px 0 9px}.list-link>a{padding:4px;color:#777}.list-link>a:hover{color:#222}.font-light{font-weight:300}.user-block:after,.user-block:before{content:" ";display:table}.user-block:after{clear:both}.user-block img{width:40px;height:40px;float:left}.user-block .comment,.user-block .description,.user-block .username{display:block;margin-left:50px}.user-block .username{font-size:16px;font-weight:600}.user-block .description{color:#999;font-size:13px}.user-block.user-block-sm .comment,.user-block.user-block-sm .description,.user-block.user-block-sm .username{margin-left:40px}.user-block.user-block-sm .username{font-size:14px}.box-comments .box-comment img,.img-lg,.img-md,.img-sm,.user-block.user-block-sm img{float:left}.box-comments .box-comment img,.img-sm,.user-block.user-block-sm img{width:30px!important;height:30px!important}.img-sm+.img-push{margin-left:40px}.img-md{width:60px;height:60px}.img-md+.img-push{margin-left:70px}.img-lg{width:100px;height:100px}.img-lg+.img-push{margin-left:110px}.img-bordered{border:3px solid #d2d6de;padding:3px}.img-bordered-sm{border:2px solid #d2d6de;padding:2px}.attachment-block{border:1px solid #f4f4f4;padding:5px;margin-bottom:10px;background:#f7f7f7}.attachment-block .attachment-img{max-width:100px;max-height:100px;height:auto;float:left}.attachment-block .attachment-pushed{margin-left:110px}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#555}.connectedSortable{min-height:100px}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sort-highlight{background:#f4f4f4;border:1px dashed #ddd;margin-bottom:10px}.full-opacity-hover{opacity:.65;filter:alpha(opacity=65)}.full-opacity-hover:hover{opacity:1;filter:alpha(opacity=100)}.chart{position:relative;overflow:hidden;width:100%}.chart canvas,.chart svg{width:100%!important}@media print{.content-header,.left-side,.main-header,.main-sidebar,.no-print{display:none!important}.content-wrapper,.main-footer,.right-side{margin-left:0!important;min-height:0!important;-webkit-transform:translate(0)!important;-ms-transform:translate(0)!important;-o-transform:translate(0)!important;transform:translate(0)!important}.fixed .content-wrapper,.fixed .right-side{padding-top:0!important}.invoice{width:100%;border:0;margin:0;padding:0}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr td,.table-responsive>.table tr th{white-space:normal!important}}.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav>.active>a,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .left-side,.skin-blue .main-sidebar,.skin-blue .wrapper{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li.active>a,.skin-blue .sidebar-menu>li.menu-open>a,.skin-blue .sidebar-menu>li:hover>a{color:#fff;background:#1e282c}.skin-blue .sidebar-menu>li.active>a{border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-blue .sidebar-menu .treeview-menu>li.active>a,.skin-blue .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px}.skin-blue .sidebar-form .btn,.skin-blue .sidebar-form input[type=text]{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-blue .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type=text]:focus,.skin-blue .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue-light .main-header .navbar{background-color:#3c8dbc}.skin-blue-light .main-header .navbar .nav>li>a{color:#fff}.skin-blue-light .main-header .navbar .nav .open>a,.skin-blue-light .main-header .navbar .nav .open>a:focus,.skin-blue-light .main-header .navbar .nav .open>a:hover,.skin-blue-light .main-header .navbar .nav>.active>a,.skin-blue-light .main-header .navbar .nav>li>a:active,.skin-blue-light .main-header .navbar .nav>li>a:focus,.skin-blue-light .main-header .navbar .nav>li>a:hover,.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue-light .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-blue-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue-light .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue-light .main-header .logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue-light .main-header .logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header li.user-header{background-color:#3c8dbc}.skin-blue-light .content-header{background:transparent}.skin-blue-light .left-side,.skin-blue-light .main-sidebar,.skin-blue-light .wrapper{background-color:#f9fafc}.skin-blue-light .main-sidebar{border-right:1px solid #d2d6de}.skin-blue-light .user-panel>.info,.skin-blue-light .user-panel>.info>a{color:#444}.skin-blue-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-blue-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-blue-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-blue-light .sidebar-menu>li.active>a,.skin-blue-light .sidebar-menu>li:hover>a{color:#000;background:#f4f4f5}.skin-blue-light .sidebar-menu>li.active{border-left-color:#3c8dbc}.skin-blue-light .sidebar-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-blue-light .sidebar a{color:#444}.skin-blue-light .sidebar a:hover{text-decoration:none}.skin-blue-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-blue-light .sidebar-menu .treeview-menu>li.active>a,.skin-blue-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-blue-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px}.skin-blue-light .sidebar-form .btn,.skin-blue-light .sidebar-form input[type=text]{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-blue-light .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue-light .sidebar-form input[type=text]:focus,.skin-blue-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-blue-light .main-footer{border-top-color:#d2d6de}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}.skin-black .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.skin-black .main-header .navbar-toggle{color:#333}.skin-black .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar{background-color:#fff}.skin-black .main-header .navbar .nav>li>a{color:#333}.skin-black .main-header .navbar .nav .open>a,.skin-black .main-header .navbar .nav .open>a:focus,.skin-black .main-header .navbar .nav .open>a:hover,.skin-black .main-header .navbar .nav>.active>a,.skin-black .main-header .navbar .nav>li>a:active,.skin-black .main-header .navbar .nav>li>a:focus,.skin-black .main-header .navbar .nav>li>a:hover{background:#fff;color:#999}.skin-black .main-header .navbar .sidebar-toggle{color:#333}.skin-black .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black .main-header .navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black .main-header .logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black .main-header .logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black .main-header .logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black .main-header .logo:hover{background-color:#1f1f1f}}.skin-black .main-header li.user-header{background-color:#222}.skin-black .content-header{background:transparent;box-shadow:none}.skin-black .left-side,.skin-black .main-sidebar,.skin-black .wrapper{background-color:#222d32}.skin-black .user-panel>.info,.skin-black .user-panel>.info>a{color:#fff}.skin-black .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-black .sidebar-menu>li>a{border-left:3px solid transparent}.skin-black .sidebar-menu>li.active>a,.skin-black .sidebar-menu>li.menu-open>a,.skin-black .sidebar-menu>li:hover>a{color:#fff;background:#1e282c}.skin-black .sidebar-menu>li.active>a{border-left-color:#fff}.skin-black .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-black .sidebar a{color:#b8c7ce}.skin-black .sidebar a:hover{text-decoration:none}.skin-black .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-black .sidebar-menu .treeview-menu>li.active>a,.skin-black .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-black .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px}.skin-black .sidebar-form .btn,.skin-black .sidebar-form input[type=text]{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-black .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black .sidebar-form input[type=text]:focus,.skin-black .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-black .pace .pace-progress{background:#222}.skin-black .pace .pace-activity{border-top-color:#222;border-left-color:#222}.skin-black-light .main-header{border-bottom:1px solid #d2d6de}.skin-black-light .main-header .navbar-toggle{color:#333}.skin-black-light .main-header .navbar-brand{color:#333;border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar{background-color:#fff}.skin-black-light .main-header .navbar .nav>li>a{color:#333}.skin-black-light .main-header .navbar .nav .open>a,.skin-black-light .main-header .navbar .nav .open>a:focus,.skin-black-light .main-header .navbar .nav .open>a:hover,.skin-black-light .main-header .navbar .nav>.active>a,.skin-black-light .main-header .navbar .nav>li>a:active,.skin-black-light .main-header .navbar .nav>li>a:focus,.skin-black-light .main-header .navbar .nav>li>a:hover{background:#fff;color:#999}.skin-black-light .main-header .navbar .sidebar-toggle{color:#333}.skin-black-light .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black-light .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar .navbar-nav>li>a{border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black-light .main-header .navbar .navbar-right>li>a{border-left:1px solid #d2d6de;border-right-width:0}.skin-black-light .main-header .logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #d2d6de}.skin-black-light .main-header .logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black-light .main-header .logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black-light .main-header .logo:hover{background-color:#1f1f1f}}.skin-black-light .main-header li.user-header{background-color:#222}.skin-black-light .content-header{background:transparent;box-shadow:none}.skin-black-light .left-side,.skin-black-light .main-sidebar,.skin-black-light .wrapper{background-color:#f9fafc}.skin-black-light .main-sidebar{border-right:1px solid #d2d6de}.skin-black-light .user-panel>.info,.skin-black-light .user-panel>.info>a{color:#444}.skin-black-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-black-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-black-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-black-light .sidebar-menu>li.active>a,.skin-black-light .sidebar-menu>li:hover>a{color:#000;background:#f4f4f5}.skin-black-light .sidebar-menu>li.active{border-left-color:#fff}.skin-black-light .sidebar-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-black-light .sidebar a{color:#444}.skin-black-light .sidebar a:hover{text-decoration:none}.skin-black-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-black-light .sidebar-menu .treeview-menu>li.active>a,.skin-black-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-black-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px}.skin-black-light .sidebar-form .btn,.skin-black-light .sidebar-form input[type=text]{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-black-light .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black-light .sidebar-form input[type=text]:focus,.skin-black-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-green .main-header .navbar{background-color:#00a65a}.skin-green .main-header .navbar .nav>li>a{color:#fff}.skin-green .main-header .navbar .nav .open>a,.skin-green .main-header .navbar .nav .open>a:focus,.skin-green .main-header .navbar .nav .open>a:hover,.skin-green .main-header .navbar .nav>.active>a,.skin-green .main-header .navbar .nav>li>a:active,.skin-green .main-header .navbar .nav>li>a:focus,.skin-green .main-header .navbar .nav>li>a:hover,.skin-green .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-green .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green .main-header .logo{background-color:#008d4c;color:#fff;border-bottom:0 solid transparent}.skin-green .main-header .logo:hover{background-color:#008749}.skin-green .main-header li.user-header{background-color:#00a65a}.skin-green .content-header{background:transparent}.skin-green .left-side,.skin-green .main-sidebar,.skin-green .wrapper{background-color:#222d32}.skin-green .user-panel>.info,.skin-green .user-panel>.info>a{color:#fff}.skin-green .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-green .sidebar-menu>li>a{border-left:3px solid transparent}.skin-green .sidebar-menu>li.active>a,.skin-green .sidebar-menu>li.menu-open>a,.skin-green .sidebar-menu>li:hover>a{color:#fff;background:#1e282c}.skin-green .sidebar-menu>li.active>a{border-left-color:#00a65a}.skin-green .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-green .sidebar a{color:#b8c7ce}.skin-green .sidebar a:hover{text-decoration:none}.skin-green .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-green .sidebar-menu .treeview-menu>li.active>a,.skin-green .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-green .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px}.skin-green .sidebar-form .btn,.skin-green .sidebar-form input[type=text]{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-green .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green .sidebar-form input[type=text]:focus,.skin-green .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-green-light .main-header .navbar{background-color:#00a65a}.skin-green-light .main-header .navbar .nav>li>a{color:#fff}.skin-green-light .main-header .navbar .nav .open>a,.skin-green-light .main-header .navbar .nav .open>a:focus,.skin-green-light .main-header .navbar .nav .open>a:hover,.skin-green-light .main-header .navbar .nav>.active>a,.skin-green-light .main-header .navbar .nav>li>a:active,.skin-green-light .main-header .navbar .nav>li>a:focus,.skin-green-light .main-header .navbar .nav>li>a:hover,.skin-green-light .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green-light .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-green-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green-light .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green-light .main-header .logo{background-color:#00a65a;color:#fff;border-bottom:0 solid transparent}.skin-green-light .main-header .logo:hover{background-color:#00a157}.skin-green-light .main-header li.user-header{background-color:#00a65a}.skin-green-light .content-header{background:transparent}.skin-green-light .left-side,.skin-green-light .main-sidebar,.skin-green-light .wrapper{background-color:#f9fafc}.skin-green-light .main-sidebar{border-right:1px solid #d2d6de}.skin-green-light .user-panel>.info,.skin-green-light .user-panel>.info>a{color:#444}.skin-green-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-green-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-green-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-green-light .sidebar-menu>li.active>a,.skin-green-light .sidebar-menu>li:hover>a{color:#000;background:#f4f4f5}.skin-green-light .sidebar-menu>li.active{border-left-color:#00a65a}.skin-green-light .sidebar-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-green-light .sidebar a{color:#444}.skin-green-light .sidebar a:hover{text-decoration:none}.skin-green-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-green-light .sidebar-menu .treeview-menu>li.active>a,.skin-green-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-green-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px}.skin-green-light .sidebar-form .btn,.skin-green-light .sidebar-form input[type=text]{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-green-light .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green-light .sidebar-form input[type=text]:focus,.skin-green-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-red .main-header .navbar{background-color:#dd4b39}.skin-red .main-header .navbar .nav>li>a{color:#fff}.skin-red .main-header .navbar .nav .open>a,.skin-red .main-header .navbar .nav .open>a:focus,.skin-red .main-header .navbar .nav .open>a:hover,.skin-red .main-header .navbar .nav>.active>a,.skin-red .main-header .navbar .nav>li>a:active,.skin-red .main-header .navbar .nav>li>a:focus,.skin-red .main-header .navbar .nav>li>a:hover,.skin-red .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-red .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red .main-header .logo{background-color:#d73925;color:#fff;border-bottom:0 solid transparent}.skin-red .main-header .logo:hover{background-color:#d33724}.skin-red .main-header li.user-header{background-color:#dd4b39}.skin-red .content-header{background:transparent}.skin-red .left-side,.skin-red .main-sidebar,.skin-red .wrapper{background-color:#222d32}.skin-red .user-panel>.info,.skin-red .user-panel>.info>a{color:#fff}.skin-red .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-red .sidebar-menu>li>a{border-left:3px solid transparent}.skin-red .sidebar-menu>li.active>a,.skin-red .sidebar-menu>li.menu-open>a,.skin-red .sidebar-menu>li:hover>a{color:#fff;background:#1e282c}.skin-red .sidebar-menu>li.active>a{border-left-color:#dd4b39}.skin-red .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-red .sidebar a{color:#b8c7ce}.skin-red .sidebar a:hover{text-decoration:none}.skin-red .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-red .sidebar-menu .treeview-menu>li.active>a,.skin-red .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-red .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px}.skin-red .sidebar-form .btn,.skin-red .sidebar-form input[type=text]{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-red .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red .sidebar-form input[type=text]:focus,.skin-red .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-red-light .main-header .navbar{background-color:#dd4b39}.skin-red-light .main-header .navbar .nav>li>a{color:#fff}.skin-red-light .main-header .navbar .nav .open>a,.skin-red-light .main-header .navbar .nav .open>a:focus,.skin-red-light .main-header .navbar .nav .open>a:hover,.skin-red-light .main-header .navbar .nav>.active>a,.skin-red-light .main-header .navbar .nav>li>a:active,.skin-red-light .main-header .navbar .nav>li>a:focus,.skin-red-light .main-header .navbar .nav>li>a:hover,.skin-red-light .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red-light .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-red-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red-light .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red-light .main-header .logo{background-color:#dd4b39;color:#fff;border-bottom:0 solid transparent}.skin-red-light .main-header .logo:hover{background-color:#dc4735}.skin-red-light .main-header li.user-header{background-color:#dd4b39}.skin-red-light .content-header{background:transparent}.skin-red-light .left-side,.skin-red-light .main-sidebar,.skin-red-light .wrapper{background-color:#f9fafc}.skin-red-light .main-sidebar{border-right:1px solid #d2d6de}.skin-red-light .user-panel>.info,.skin-red-light .user-panel>.info>a{color:#444}.skin-red-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-red-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-red-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-red-light .sidebar-menu>li.active>a,.skin-red-light .sidebar-menu>li:hover>a{color:#000;background:#f4f4f5}.skin-red-light .sidebar-menu>li.active{border-left-color:#dd4b39}.skin-red-light .sidebar-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-red-light .sidebar a{color:#444}.skin-red-light .sidebar a:hover{text-decoration:none}.skin-red-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-red-light .sidebar-menu .treeview-menu>li.active>a,.skin-red-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-red-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px}.skin-red-light .sidebar-form .btn,.skin-red-light .sidebar-form input[type=text]{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-red-light .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red-light .sidebar-form input[type=text]:focus,.skin-red-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-yellow .main-header .navbar{background-color:#f39c12}.skin-yellow .main-header .navbar .nav>li>a{color:#fff}.skin-yellow .main-header .navbar .nav .open>a,.skin-yellow .main-header .navbar .nav .open>a:focus,.skin-yellow .main-header .navbar .nav .open>a:hover,.skin-yellow .main-header .navbar .nav>.active>a,.skin-yellow .main-header .navbar .nav>li>a:active,.skin-yellow .main-header .navbar .nav>li>a:focus,.skin-yellow .main-header .navbar .nav>li>a:hover,.skin-yellow .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-yellow .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow .main-header .logo{background-color:#e08e0b;color:#fff;border-bottom:0 solid transparent}.skin-yellow .main-header .logo:hover{background-color:#db8b0b}.skin-yellow .main-header li.user-header{background-color:#f39c12}.skin-yellow .content-header{background:transparent}.skin-yellow .left-side,.skin-yellow .main-sidebar,.skin-yellow .wrapper{background-color:#222d32}.skin-yellow .user-panel>.info,.skin-yellow .user-panel>.info>a{color:#fff}.skin-yellow .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-yellow .sidebar-menu>li>a{border-left:3px solid transparent}.skin-yellow .sidebar-menu>li.active>a,.skin-yellow .sidebar-menu>li.menu-open>a,.skin-yellow .sidebar-menu>li:hover>a{color:#fff;background:#1e282c}.skin-yellow .sidebar-menu>li.active>a{border-left-color:#f39c12}.skin-yellow .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-yellow .sidebar a{color:#b8c7ce}.skin-yellow .sidebar a:hover{text-decoration:none}.skin-yellow .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-yellow .sidebar-menu .treeview-menu>li.active>a,.skin-yellow .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-yellow .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px}.skin-yellow .sidebar-form .btn,.skin-yellow .sidebar-form input[type=text]{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-yellow .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow .sidebar-form input[type=text]:focus,.skin-yellow .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-yellow-light .main-header .navbar{background-color:#f39c12}.skin-yellow-light .main-header .navbar .nav>li>a{color:#fff}.skin-yellow-light .main-header .navbar .nav .open>a,.skin-yellow-light .main-header .navbar .nav .open>a:focus,.skin-yellow-light .main-header .navbar .nav .open>a:hover,.skin-yellow-light .main-header .navbar .nav>.active>a,.skin-yellow-light .main-header .navbar .nav>li>a:active,.skin-yellow-light .main-header .navbar .nav>li>a:focus,.skin-yellow-light .main-header .navbar .nav>li>a:hover,.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow-light .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-yellow-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow-light .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow-light .main-header .logo{background-color:#f39c12;color:#fff;border-bottom:0 solid transparent}.skin-yellow-light .main-header .logo:hover{background-color:#f39a0d}.skin-yellow-light .main-header li.user-header{background-color:#f39c12}.skin-yellow-light .content-header{background:transparent}.skin-yellow-light .left-side,.skin-yellow-light .main-sidebar,.skin-yellow-light .wrapper{background-color:#f9fafc}.skin-yellow-light .main-sidebar{border-right:1px solid #d2d6de}.skin-yellow-light .user-panel>.info,.skin-yellow-light .user-panel>.info>a{color:#444}.skin-yellow-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-yellow-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-yellow-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-yellow-light .sidebar-menu>li.active>a,.skin-yellow-light .sidebar-menu>li:hover>a{color:#000;background:#f4f4f5}.skin-yellow-light .sidebar-menu>li.active{border-left-color:#f39c12}.skin-yellow-light .sidebar-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-yellow-light .sidebar a{color:#444}.skin-yellow-light .sidebar a:hover{text-decoration:none}.skin-yellow-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-yellow-light .sidebar-menu .treeview-menu>li.active>a,.skin-yellow-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-yellow-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px}.skin-yellow-light .sidebar-form .btn,.skin-yellow-light .sidebar-form input[type=text]{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-yellow-light .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow-light .sidebar-form input[type=text]:focus,.skin-yellow-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-purple .main-header .navbar{background-color:#605ca8}.skin-purple .main-header .navbar .nav>li>a{color:#fff}.skin-purple .main-header .navbar .nav .open>a,.skin-purple .main-header .navbar .nav .open>a:focus,.skin-purple .main-header .navbar .nav .open>a:hover,.skin-purple .main-header .navbar .nav>.active>a,.skin-purple .main-header .navbar .nav>li>a:active,.skin-purple .main-header .navbar .nav>li>a:focus,.skin-purple .main-header .navbar .nav>li>a:hover,.skin-purple .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-purple .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple .main-header .logo{background-color:#555299;color:#fff;border-bottom:0 solid transparent}.skin-purple .main-header .logo:hover{background-color:#545096}.skin-purple .main-header li.user-header{background-color:#605ca8}.skin-purple .content-header{background:transparent}.skin-purple .left-side,.skin-purple .main-sidebar,.skin-purple .wrapper{background-color:#222d32}.skin-purple .user-panel>.info,.skin-purple .user-panel>.info>a{color:#fff}.skin-purple .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-purple .sidebar-menu>li>a{border-left:3px solid transparent}.skin-purple .sidebar-menu>li.active>a,.skin-purple .sidebar-menu>li.menu-open>a,.skin-purple .sidebar-menu>li:hover>a{color:#fff;background:#1e282c}.skin-purple .sidebar-menu>li.active>a{border-left-color:#605ca8}.skin-purple .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-purple .sidebar a{color:#b8c7ce}.skin-purple .sidebar a:hover{text-decoration:none}.skin-purple .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-purple .sidebar-menu .treeview-menu>li.active>a,.skin-purple .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-purple .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px}.skin-purple .sidebar-form .btn,.skin-purple .sidebar-form input[type=text]{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-purple .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple .sidebar-form input[type=text]:focus,.skin-purple .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-purple-light .main-header .navbar{background-color:#605ca8}.skin-purple-light .main-header .navbar .nav>li>a{color:#fff}.skin-purple-light .main-header .navbar .nav .open>a,.skin-purple-light .main-header .navbar .nav .open>a:focus,.skin-purple-light .main-header .navbar .nav .open>a:hover,.skin-purple-light .main-header .navbar .nav>.active>a,.skin-purple-light .main-header .navbar .nav>li>a:active,.skin-purple-light .main-header .navbar .nav>li>a:focus,.skin-purple-light .main-header .navbar .nav>li>a:hover,.skin-purple-light .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple-light .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-purple-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple-light .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple-light .main-header .logo{background-color:#605ca8;color:#fff;border-bottom:0 solid transparent}.skin-purple-light .main-header .logo:hover{background-color:#5d59a6}.skin-purple-light .main-header li.user-header{background-color:#605ca8}.skin-purple-light .content-header{background:transparent}.skin-purple-light .left-side,.skin-purple-light .main-sidebar,.skin-purple-light .wrapper{background-color:#f9fafc}.skin-purple-light .main-sidebar{border-right:1px solid #d2d6de}.skin-purple-light .user-panel>.info,.skin-purple-light .user-panel>.info>a{color:#444}.skin-purple-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-purple-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-purple-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-purple-light .sidebar-menu>li.active>a,.skin-purple-light .sidebar-menu>li:hover>a{color:#000;background:#f4f4f5}.skin-purple-light .sidebar-menu>li.active{border-left-color:#605ca8}.skin-purple-light .sidebar-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-purple-light .sidebar a{color:#444}.skin-purple-light .sidebar a:hover{text-decoration:none}.skin-purple-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-purple-light .sidebar-menu .treeview-menu>li.active>a,.skin-purple-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-purple-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px}.skin-purple-light .sidebar-form .btn,.skin-purple-light .sidebar-form input[type=text]{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-purple-light .sidebar-form input[type=text]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple-light .sidebar-form input[type=text]:focus,.skin-purple-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.sidebar-menu .treeview-menu>li>a>.fab,.sidebar-menu .treeview-menu>li>a>.fal,.sidebar-menu .treeview-menu>li>a>.far,.sidebar-menu .treeview-menu>li>a>.fas,.sidebar-menu>li>a>.fab,.sidebar-menu>li>a>.fal,.sidebar-menu>li>a>.far,.sidebar-menu>li>a>.fas{width:20px}.main-header .sidebar-toggle{font-family:Font Awesome\ 5 Free;font-weight:900}.login-page form label{padding-left:5px}.icheckbox_square-blue,.iradio_square-blue{display:inline-block;*display:inline;vertical-align:middle;margin:0;padding:0;width:22px;height:22px;background:url(/build/images/blue.png?96f8a905) no-repeat;border:none;cursor:pointer}.icheckbox_square-blue{background-position:0 0}.icheckbox_square-blue.hover{background-position:-24px 0}.icheckbox_square-blue.checked{background-position:-48px 0}.icheckbox_square-blue.disabled{background-position:-72px 0;cursor:default}.icheckbox_square-blue.checked.disabled{background-position:-96px 0}.iradio_square-blue{background-position:-120px 0}.iradio_square-blue.hover{background-position:-144px 0}.iradio_square-blue.checked{background-position:-168px 0}.iradio_square-blue.disabled{background-position:-192px 0;cursor:default}.iradio_square-blue.checked.disabled{background-position:-216px 0}@media (-o-min-device-pixel-ratio:5/4),(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.icheckbox_square-blue,.iradio_square-blue{background-image:url(/build/images/blue@2x.png?2694acfd);-webkit-background-size:240px 24px;background-size:240px 24px}}.error-page{margin-bottom:50px}@media print{.control-sidebar,.sf-toolbar{display:none!important}}.content{padding:15px 0}.content-header h1 small{display:none}@media (min-width:768px){.content-header h1 small{display:inline-block}.content{padding:15px}}td.timesheet-description ul{padding-left:15px}td.timesheet-description p{margin:0}.content-header>.breadcrumb{position:absolute;float:right;background:transparent}.control-sidebar select{color:#555;background-color:#fff}.control-sidebar div.image img.img-circle{max-width:34px}.toolbar form{font-size:14px}.user-panel>.info{left:80px}footer.main-footer{padding:5px;font-size:80%}body.invoice_print{margin:20px}.invoice{margin:0}@media (min-width:768px){.invoice{margin:10px 25px}}.page-header-small{font-size:14px}div.invoice-address{margin-top:30px;margin-bottom:30px}table.invoice-meta th{padding-right:40px}table.invoice-sum th{width:70%}table.invoice-sum td,table.invoice-sum th{text-align:right}#freelancer-invoice{font:16px/1 Open Sans,sans-serif;box-sizing:border-box}#freelancer-invoice h1{font:700 100% sans-serif;letter-spacing:.5em;text-align:center;text-transform:uppercase}#freelancer-invoice h2{font:700 1.5em sans-serif;margin-bottom:1em}#freelancer-invoice table{table-layout:fixed;width:100%;border-collapse:separate;border-spacing:0}#freelancer-invoice header:after{clear:both;content:"";display:table;font-size:1em}#freelancer-invoice header address{float:left;font-style:normal;line-height:1.25;margin:0 1em 1em 0;font-weight:700;font-size:.7em}#freelancer-invoice article address{font-size:1em;float:left}#freelancer-invoice article.address{margin-bottom:1.5em}#freelancer-invoice article.footer{margin-top:60px}#freelancer-invoice article,#freelancer-invoice article address,#freelancer-invoice table.inventory,#freelancer-invoice table.meta{margin:2em 0}#freelancer-invoice article:after{clear:both;content:"";display:table}#freelancer-invoice article h1{clip:rect(0 0 0 0);position:absolute}#freelancer-invoice article p{margin-bottom:20px}#freelancer-invoice table.balance:after,#freelancer-invoice table.meta:after{clear:both;content:"";display:table}#freelancer-invoice table.meta{float:right;width:50%;font-size:90%}#freelancer-invoice table.meta th{text-align:right;font-weight:400}#freelancer-invoice table.meta td{width:120px;text-align:right}#freelancer-invoice table.balance{float:right}#freelancer-invoice table.balance th{text-align:right;font-weight:400}#freelancer-invoice table.balance td{width:140px;text-align:right}#freelancer-invoice table.balance .total{font-weight:700}#freelancer-invoice table.inventory{clear:both;width:100%;margin-top:2em;border-bottom:1px solid #000}#freelancer-invoice table.inventory th{font-weight:700;border-width:0 0 1px;border-bottom:1px solid #000}#freelancer-invoice table.inventory td,#freelancer-invoice table.inventory th{padding:5px}#freelancer-invoice table.inventory td:first-child,#freelancer-invoice table.inventory th:first-child{text-align:left}#freelancer-invoice table.inventory td:nth-child(2),#freelancer-invoice table.inventory td:nth-child(3),#freelancer-invoice table.inventory th:nth-child(2),#freelancer-invoice table.inventory th:nth-child(3){text-align:center;width:20%}#freelancer-invoice table.inventory td:nth-child(4),#freelancer-invoice table.inventory th:nth-child(4){text-align:right;width:20%}#freelancer-invoice footer{margin-top:50px}#freelancer-invoice footer table{border-top:1px solid #000;font-size:.8em;padding-top:5px}#freelancer-invoice footer th{text-align:left;font-weight:700;margin-bottom:10px}#freelancer-invoice footer table th:first-child{width:32%}#freelancer-invoice footer table th:nth-child(3){width:28%}#freelancer-invoice footer td{text-align:left;vertical-align:bottom}#freelancer-invoice aside{position:absolute;top:10in;width:7.5in}#freelancer-invoice aside h1{border:none;border-width:0 0 1px;margin:0 0 1em;border-color:#999;border-bottom-style:solid}#freelancer-invoice aside p{font-size:85%}#freelancer-invoice aside div{margin-top:15px}#freelancer-invoice aside div p{line-height:1.4}#freelancer-invoice aside p span{width:130px;font-weight:700;display:inline-block}@media print{*{-webkit-print-color-adjust:exact}#freelancer-invoice,.invoice,.wrapper,body{margin:0;padding:0}#freelancer-invoice{margin:1em 2em}#freelancer-invoice .add,#freelancer-invoice .cut,#freelancer-invoice span:empty{display:none}}div.dataTables_length label{font-weight:400;text-align:left;white-space:nowrap}div.dataTables_length select{width:75px;display:inline-block}div.dataTables_filter{text-align:right}div.dataTables_filter label{font-weight:400;white-space:nowrap;text-align:left}div.dataTables_filter input{margin-left:.5em;display:inline-block;width:auto}div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}@media screen and (max-width:767px){div.dataTables_filter,div.dataTables_info,div.dataTables_length,div.dataTables_paginate{text-align:center}div.DTTT{margin-bottom:.5em}}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}table.dataTable{clear:both;margin-bottom:0!important;max-width:none!important}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after{position:absolute;top:8px;right:8px;display:block;font-family:Glyphicons Halflings;opacity:.5}table.dataTable thead .sorting:after{opacity:.2;content:"\E150"}table.dataTable thead .sorting_asc:after{content:"\E155"}table.dataTable thead .sorting_desc:after{content:"\E156"}div.dataTables_scrollBody table.dataTable thead .sorting:after,div.dataTables_scrollBody table.dataTable thead .sorting_asc:after,div.dataTables_scrollBody table.dataTable thead .sorting_desc:after{display:none}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}table.dataTable thead>tr>th{padding-right:30px}table.dataTable th:active{outline:none}table.dataTable.table-condensed thead>tr>th{padding-right:20px}table.dataTable.table-condensed thead .sorting:after,table.dataTable.table-condensed thead .sorting_asc:after,table.dataTable.table-condensed thead .sorting_desc:after{top:6px;right:6px}div.dataTables_scrollHead table{margin-bottom:0!important;border-bottom-left-radius:0;border-bottom-right-radius:0}div.dataTables_scrollHead table thead tr:last-child td:first-child,div.dataTables_scrollHead table thead tr:last-child th:first-child{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}div.dataTables_scrollBody table{border-top:none;margin-top:0!important;margin-bottom:0!important}div.dataTables_scrollBody tbody tr:first-child td,div.dataTables_scrollBody tbody tr:first-child th{border-top:none}div.dataTables_scrollFoot table{margin-top:0!important;border-top:none}table.table-bordered.dataTable{border-collapse:separate!important}table.table-bordered thead td,table.table-bordered thead th{border-left-width:0;border-top-width:0}table.table-bordered tbody td,table.table-bordered tbody th,table.table-bordered tfoot td,table.table-bordered tfoot th{border-left-width:0;border-bottom-width:0}table.table-bordered td:last-child,table.table-bordered th:last-child{border-right-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}.table.dataTable tbody tr.active td,.table.dataTable tbody tr.active th{background-color:#08c;color:#fff}.table.dataTable tbody tr.active:hover td,.table.dataTable tbody tr.active:hover th{background-color:#0075b0!important}.table.dataTable tbody tr.active td>a,.table.dataTable tbody tr.active th>a{color:#fff}.table-striped.dataTable tbody tr.active:nth-child(odd) td,.table-striped.dataTable tbody tr.active:nth-child(odd) th{background-color:#017ebc}.popover-content .calendar-entry ul{padding:0 0 0 10px}section.dashboard .info-box .info-box-text{white-space:normal}.navbar-nav>li>a.ddt-large{padding-top:12px;padding-bottom:9px}li.messages-menu ul.menu li .pull-left i{color:#dd4b39}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{overflow:hidden;text-overflow:ellipsis}.navbar-nav .start_record{text-align:center}/*! * FullCalendar v3.9.0 * Docs & License: https://fullcalendar.io/ * (c) 2018 Adam Shaw diff --git a/public/build/manifest.json b/public/build/manifest.json index 3db40ae1..0c3e2603 100644 --- a/public/build/manifest.json +++ b/public/build/manifest.json @@ -1,6 +1,6 @@ { "build/app.js": "/build/app.js?ba9725f5267413a18701", - "build/app.css": "/build/app.css?68655639f068cc8b6eadb4170698a2c5", + "build/app.css": "/build/app.css?b30340309e980dc272f3ca6d1ff64aa2", "build/fonts/fa-regular-400.woff": "/build/fonts/fa-regular-400.woff?d9e29124", "build/images/blue@2x.png": "/build/images/blue@2x.png?2694acfd", "build/fonts/fa-solid-900.woff2": "/build/fonts/fa-solid-900.woff2?e8a92a29", diff --git a/src/Command/KimaiImporterCommand.php b/src/Command/KimaiImporterCommand.php index e44923a4..2a88260f 100644 --- a/src/Command/KimaiImporterCommand.php +++ b/src/Command/KimaiImporterCommand.php @@ -312,18 +312,28 @@ class KimaiImporterCommand extends Command * This is checked against the Kimai version and database revision. * * @param SymfonyStyle $io - * @param $requiredVersion - * @param $requiredRevision + * @param string $requiredVersion + * @param string $requiredRevision * @return bool * @throws \Doctrine\DBAL\DBALException */ protected function checkDatabaseVersion(SymfonyStyle $io, $requiredVersion, $requiredRevision) { - $versionQuery = 'SELECT `value` from ' . $this->dbPrefix . 'configuration WHERE `option` = "version"'; - $revisionQuery = 'SELECT `value` from ' . $this->dbPrefix . 'configuration WHERE `option` = "revision"'; + $version = $this->connection->createQueryBuilder() + ->select('value') + ->from($this->connection->quoteIdentifier($this->dbPrefix . 'configuration')) + ->where('option = :option') + ->setParameter(':option', 'version') + ->execute() + ->fetchColumn(); - $version = $this->getImportConnection()->query($versionQuery)->fetchColumn(); - $revision = $this->getImportConnection()->query($revisionQuery)->fetchColumn(); + $revision = $this->connection->createQueryBuilder() + ->select('value') + ->from($this->connection->quoteIdentifier($this->dbPrefix . 'configuration')) + ->where('option = :option') + ->setParameter(':option', 'revision') + ->execute() + ->fetchColumn(); if (1 == version_compare($requiredVersion, $version)) { $io->error( @@ -378,21 +388,16 @@ class KimaiImporterCommand extends Command } /** - * @param $table + * @param string $table * @return array - * @throws \Doctrine\DBAL\DBALException */ protected function fetchAllFromImport($table) { - return $this->getImportConnection()->query('SELECT * from ' . $this->dbPrefix . $table)->fetchAll(); - } - - /** - * @return \Doctrine\DBAL\Connection - */ - protected function getImportConnection() - { - return $this->connection; + return $this->connection->createQueryBuilder() + ->select('*') + ->from($this->connection->quoteIdentifier($this->dbPrefix . $table)) + ->execute() + ->fetchAll(); } /** @@ -792,7 +797,6 @@ class KimaiImporterCommand extends Command } } - if (!$this->validateImport($io, $activity)) { throw new \Exception('Failed to validate activity: ' . $activity->getName()); } @@ -932,15 +936,15 @@ class KimaiImporterCommand extends Command $io->write('.'); if (0 == $counter % 80) { - $io->writeln(' ('.$counter.'/'.$total.')'); + $io->writeln(' (' . $counter . '/' . $total . ')'); $entityManager->clear(Timesheet::class); } } - for ($i = 0; $i < 80-($counter%80); $i++) { + for ($i = 0; $i < 80 - ($counter % 80); $i++) { $io->write(' '); } - $io->writeln(' ('.$counter.'/'.$total.')'); + $io->writeln(' (' . $counter . '/' . $total . ')'); if ($activityCounter > 0) { $io->success('Created new (previously global) activities during timesheet import: ' . $activityCounter); diff --git a/src/Controller/InvoiceController.php b/src/Controller/InvoiceController.php index 60dfc620..1fe9ccbb 100644 --- a/src/Controller/InvoiceController.php +++ b/src/Controller/InvoiceController.php @@ -76,7 +76,7 @@ class InvoiceController extends AbstractController } /** - * @Route(path="/", name="invoice", methods={"GET", "POST"}) + * @Route(path="/", name="invoice", methods={"GET"}) * * @param Request $request * @return \Symfony\Component\HttpFoundation\Response @@ -102,14 +102,53 @@ class InvoiceController extends AbstractController $model = $this->prepareModel($query, $entries); - $action = null; - if ($query->getTemplate() !== null) { - $action = $this->service->getRendererActionByName($query->getTemplate()->getRenderer()); + return $this->render('invoice/index.html.twig', [ + 'model' => $model, + 'form' => $form->createView(), + ]); + } + + /** + * @Route(path="/print", name="invoice_print", methods={"GET"}) + * + * @param Request $request + * @return \Symfony\Component\HttpFoundation\Response + * @throws \Exception + */ + public function printAction(Request $request) + { + if (!$this->invoiceRepository->hasTemplate()) { + return $this->redirectToRoute('admin_invoice_template_create'); } + $query = $this->getDefaultQuery(); + $form = $this->getToolbarForm($query); + $form->handleRequest($request); + + if (!$form->isSubmitted() || !$form->isValid()) { + return $this->redirectToRoute('invoice'); + } + + /** @var InvoiceQuery $query */ + $query = $form->getData(); + $entries = $this->getEntries($query); + $model = $this->prepareModel($query, $entries); + + $document = $this->service->getDocumentByName($model->getTemplate()->getRenderer()); + if (null === $document) { + throw new \Exception('Unknown invoice document: ' . $model->getTemplate()->getRenderer()); + } + + foreach ($this->service->getRenderer() as $renderer) { + if ($renderer->supports($document)) { + return $renderer->render($document, $model); + } + } + + $this->flashError('Cannot render invoice: ' . $model->getTemplate()->getRenderer() . ' (' . $document->getName() . ')'); + return $this->render('invoice/index.html.twig', [ 'model' => $model, - 'action' => $action, 'form' => $form->createView(), ]); } @@ -142,11 +181,12 @@ class InvoiceController extends AbstractController protected function prepareModel(InvoiceQuery $query, array $entries) { $model = new InvoiceModel(); - $model->setQuery($query); - $model->setEntries($entries); - $model->setCustomer($query->getCustomer()); + $model + ->setQuery($query) + ->setEntries($entries) + ->setCustomer($query->getCustomer()) + ; - $action = null; if ($query->getTemplate() !== null) { $generator = $this->service->getNumberGeneratorByName($query->getTemplate()->getNumberGenerator()); if (null === $generator) { @@ -278,6 +318,9 @@ class InvoiceController extends AbstractController return $this->createForm(InvoiceToolbarForm::class, $query, [ 'action' => $this->generateUrl('invoice', []), 'method' => 'GET', + 'attr' => [ + 'id' => 'invoice-print-form' + ] ]); } diff --git a/src/Controller/InvoicePrintController.php b/src/Controller/InvoicePrintController.php deleted file mode 100644 index 0b4d8dc7..00000000 --- a/src/Controller/InvoicePrintController.php +++ /dev/null @@ -1,54 +0,0 @@ -render('invoice/renderer/invoice.html.twig', [ - 'model' => $model, - ]); - } - - /** - * @param InvoiceModel $model - * @return \Symfony\Component\HttpFoundation\Response - */ - public function printTimesheet(InvoiceModel $model) - { - return $this->render('invoice/renderer/timesheet.html.twig', [ - 'model' => $model, - ]); - } - - /** - * @param InvoiceModel $model - * @return \Symfony\Component\HttpFoundation\Response - */ - public function printFreelancer(InvoiceModel $model) - { - return $this->render('invoice/renderer/freelancer.html.twig', [ - 'model' => $model, - ]); - } -} diff --git a/src/DataFixtures/InvoiceFixtures.php b/src/DataFixtures/InvoiceFixtures.php index a8f3706d..335e065b 100644 --- a/src/DataFixtures/InvoiceFixtures.php +++ b/src/DataFixtures/InvoiceFixtures.php @@ -13,6 +13,7 @@ use App\Entity\InvoiceTemplate; use Doctrine\Bundle\FixturesBundle\Fixture; use Doctrine\Common\Persistence\ObjectManager; use Faker\Factory; +use Faker\Generator; /** * Defines the sample data to load in the database when running the unit and @@ -28,107 +29,92 @@ class InvoiceFixtures extends Fixture */ public function load(ObjectManager $manager) { - $this->loadInvoiceTemplate($manager); - $this->loadFreelancerTemplate($manager); - $this->loadTimesheetTemplate($manager); + foreach ($this->getInvoiceConfigs() as $invoiceConfig) { + $template = new InvoiceTemplate(); + + // name, title, renderer, calculator, numberGenerator, company, vat, dueDays, address, paymentTerms + $template + ->setName($invoiceConfig[0]) + ->setTitle($invoiceConfig[1]) + ->setRenderer($invoiceConfig[2]) + ->setCalculator($invoiceConfig[3]) + ->setNumberGenerator($invoiceConfig[4]) + ->setCompany($invoiceConfig[5]) + ->setVat($invoiceConfig[6]) + ->setDueDays($invoiceConfig[7]) + ->setAddress($invoiceConfig[8]) + ->setPaymentTerms($invoiceConfig[9]) + ; + + $manager->persist($template); + $manager->flush(); + } } - /** - * @param ObjectManager $manager - */ - private function loadInvoiceTemplate(ObjectManager $manager) + private function getInvoiceConfigs() { $faker = Factory::create(); - $template = new InvoiceTemplate(); - $template - ->setName('Invoice') - ->setTitle('Your company name') - ->setCompany($faker->company) - ->setVat(19) - ->setDueDays(30) - ->setRenderer('default') - ->setCalculator('default') - ->setNumberGenerator('default') - ->setPaymentTerms( - 'I would like to thank you for your confidence and will gladly be there for you in the future.' . - PHP_EOL . - 'Please transfer the total amount within 14 days to the given account and use the invoice number ' . - 'as reference.' - ) - ->setAddress( - $faker->streetAddress . PHP_EOL . - $faker->city . ', ' . $faker->stateAbbr . ' ' . $faker->postcode . PHP_EOL . - 'Phone: ' . $faker->phoneNumber . PHP_EOL . - 'Email: ' . $faker->safeEmail - ) + $paymentTerms = + 'I would like to thank you for your confidence and will gladly be there for you in the future.' . + PHP_EOL . + 'Please transfer the total amount within 14 days to the given account and use the invoice number ' . + 'as reference.' ; - $manager->persist($template); - $manager->flush(); + $address = + $faker->streetAddress . PHP_EOL . + $faker->city . ', ' . $faker->stateAbbr . ' ' . $faker->postcode . PHP_EOL . + 'Phone: ' . $faker->phoneNumber . PHP_EOL . + 'Email: ' . $faker->safeEmail + ; + + $paymentTerms_de = + 'Bitte überweisen Sie den Gesamtbetrag innerhalb von 14 Tagen nach Erhalt der Rechnung auf das unten genannte Konto. Verwenden Sie bitte als Betreff Ihrer Überweisung die Rechnungsnummer.' . + PHP_EOL . + PHP_EOL . + 'Ich bedanke mich für das entgegengebrachte Vertrauen. Gerne bin ich auch künftig für Sie da.' . + PHP_EOL . + PHP_EOL . + 'Mit freundlichen Grüßen,' . + PHP_EOL . + 'Max Müller' + ; + + // name, title, renderer, calculator, numberGenerator, company, vat, dueDays, address, paymentTerms + return [ + ['Invoice (HTML)', 'Company name', 'default', 'default', 'default', $faker->company, 19, 30, $address, $paymentTerms], + ['Freelancer (HTML, short)', 'Invoice', 'freelancer', 'short', 'default', $faker->company, 19, 14, $this->generateAddress($faker), $paymentTerms_de], + ['Timesheet (HTML)', 'Timesheet', 'timesheet', 'default', 'default', $faker->company, 19, 7, $this->generateAddress($faker), ''], + ['Company invoice (DOCX)', 'Invoice', 'company', 'default', 'default', 'Kimai Inc.', 19, 14, $this->generateAddress($faker, true), $this->generatePaymentTerms($faker)], + ['Export (CSV, user-group)', 'User-grouped', 'export', 'user', 'default', $faker->company, 7, 28, '', ''], + ['Export (ODS)', 'Spreadsheet', 'open-spreadsheet', 'default', 'default', $faker->company, 19, 14, '', ''], + ['Export (XLSX, user-group)', 'Spreadsheet', 'spreadsheet', 'user', 'default', $faker->company, 13, 10, '', ''], + ]; } - /** - * @param ObjectManager $manager - */ - private function loadFreelancerTemplate(ObjectManager $manager) + protected function generatePaymentTerms(Generator $faker) { - $faker = Factory::create(); - - $template = new InvoiceTemplate(); - $template - ->setName('Freelancer') - ->setTitle('Rechnung') - ->setCompany($faker->company) - ->setVat(19) - ->setDueDays(14) - ->setRenderer('freelancer') - ->setCalculator('short') - ->setNumberGenerator('default') - ->setPaymentTerms( - 'Bitte überweisen Sie den Gesamtbetrag innerhalb von 14 Tagen nach Erhalt der Rechnung auf das unten genannte Konto. Verwenden Sie bitte als Betreff Ihrer Überweisung die Rechnungsnummer.' . - PHP_EOL . - PHP_EOL . - 'Ich bedanke mich für das entgegengebrachte Vertrauen. Gerne bin ich auch künftig für Sie da.' . - PHP_EOL . - PHP_EOL . - 'Mit freundlichen Grüßen,' . - PHP_EOL . - 'Max Müller' - ) - ->setAddress( - $faker->name . ' - ' . $faker->streetAddress . '-' . $faker->postcode . ' ' . $faker->city - ) + return + 'Acme Bank' . PHP_EOL . + 'Account: ' . $faker->bankAccountNumber . PHP_EOL . + 'IBAN: ' . $faker->iban('DE') ; - - $manager->persist($template); - $manager->flush(); } - /** - * @param ObjectManager $manager - */ - private function loadTimesheetTemplate(ObjectManager $manager) + protected function generateAddress(Generator $faker, $lineBreaks = false) { - $faker = Factory::create(); + if (!$lineBreaks) { + return + $faker->name . ' - ' . + $faker->streetAddress . '-' . + $faker->postcode . ' ' . $faker->city; + } - $template = new InvoiceTemplate(); - $template - ->setName('Timesheet') - ->setTitle('Stundenzettel') - ->setCompany($faker->company) - ->setVat(19) - ->setDueDays(14) - ->setRenderer('timesheet') - ->setCalculator('default') - ->setNumberGenerator('default') - ->setPaymentTerms('') - ->setAddress( - $faker->name . ' - ' . $faker->streetAddress . '-' . $faker->postcode . ' ' . $faker->city - ) + return + 'Kimai Inc.' . PHP_EOL . + $faker->streetAddress . PHP_EOL . + $faker->city . ', ' . $faker->stateAbbr . ' ' . $faker->postcode ; - - $manager->persist($template); - $manager->flush(); } } diff --git a/src/DependencyInjection/AppExtension.php b/src/DependencyInjection/AppExtension.php index 3a3f489a..e2a5a766 100644 --- a/src/DependencyInjection/AppExtension.php +++ b/src/DependencyInjection/AppExtension.php @@ -10,7 +10,6 @@ namespace App\DependencyInjection; use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException; -use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface; use Symfony\Component\HttpKernel\DependencyInjection\Extension; @@ -39,10 +38,10 @@ class AppExtension extends Extension implements PrependExtensionInterface $container->setParameter('kimai.theme', $config['theme']); $container->setParameter('kimai.dashboard', $config['dashboard']); $container->setParameter('kimai.widgets', $config['widgets']); + $container->setParameter('kimai.invoice.documents', $config['invoice']['documents']); $this->createUserParameter($config, $container); $this->createTimesheetParameter($config, $container); - $this->createInvoiceParameter($config, $container); } /** @@ -78,25 +77,6 @@ class AppExtension extends Extension implements PrependExtensionInterface $container->setParameter('kimai.timesheet.markdown', $config['timesheet']['markdown_content']); } - /** - * @param array $config - * @param ContainerBuilder $container - */ - private function createInvoiceParameter(array $config, ContainerBuilder $container) - { - $keys = ['renderer', 'calculator', 'number_generator']; - - foreach ($keys as $key) { - if (!isset($config['invoice'][$key]) || 0 === count($config['invoice'][$key])) { - throw new InvalidDefinitionException('Missing invoice configuration: kimai.invoice.' . $key); - } - - $container->setParameter('kimai.invoice.' . $key, $config['invoice'][$key]); - } - - $container->setParameter('kimai.invoice', $config['invoice']); - } - /** * @param ContainerBuilder $container */ diff --git a/src/DependencyInjection/Compiler/InvoiceServiceCompilerPass.php b/src/DependencyInjection/Compiler/InvoiceServiceCompilerPass.php new file mode 100644 index 00000000..90181b3c --- /dev/null +++ b/src/DependencyInjection/Compiler/InvoiceServiceCompilerPass.php @@ -0,0 +1,51 @@ +has(ServiceInvoice::class)) { + return; + } + + $definition = $container->findDefinition(ServiceInvoice::class); + + $taggedRenderer = $container->findTaggedServiceIds(Kernel::TAG_INVOICE_RENDERER); + foreach ($taggedRenderer as $id => $tags) { + $definition->addMethodCall('addRenderer', [new Reference($id)]); + } + + $taggedGenerator = $container->findTaggedServiceIds(Kernel::TAG_INVOICE_NUMBER_GENERATOR); + foreach ($taggedGenerator as $id => $tags) { + $definition->addMethodCall('addNumberGenerator', [new Reference($id)]); + } + + $taggedCalculator = $container->findTaggedServiceIds(Kernel::TAG_INVOICE_CALCULATOR); + foreach ($taggedCalculator as $id => $tags) { + $definition->addMethodCall('addCalculator', [new Reference($id)]); + } + } +} diff --git a/src/DependencyInjection/Compiler/TwigContextCompilerPass.php b/src/DependencyInjection/Compiler/TwigContextCompilerPass.php index e70b1a80..4bfb8ec2 100644 --- a/src/DependencyInjection/Compiler/TwigContextCompilerPass.php +++ b/src/DependencyInjection/Compiler/TwigContextCompilerPass.php @@ -29,5 +29,17 @@ class TwigContextCompilerPass implements CompilerPassInterface $twig->addMethodCall('addGlobal', ['kimai_context', $theme]); $twig->addMethodCall('addGlobal', ['duration_only', $durationOnly]); + + if ($container->hasDefinition('twig.loader.native_filesystem')) { + $definition = $container->getDefinition('twig.loader.native_filesystem'); + + $path = dirname(dirname(dirname(__DIR__))) . DIRECTORY_SEPARATOR; + foreach ($container->getParameter('kimai.invoice.documents') as $invoicePath) { + if (!is_dir($path . $invoicePath)) { + continue; + } + $definition->addMethodCall('addPath', [$path . $invoicePath, 'invoice']); + } + } } } diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 0b89ff02..00cda4af 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -99,6 +99,12 @@ class Configuration implements ConfigurationInterface ->floatNode('factor') ->isRequired() ->defaultValue(1) + ->validate() + ->ifTrue(function ($value) { + return $value <= 0; + }) + ->thenInvalid('A rate factor smaller or equals 0 is not allowed') + ->end() ->end() ->end() ->end() @@ -116,32 +122,15 @@ class Configuration implements ConfigurationInterface $node = $builder->root('invoice'); $node + ->addDefaultsIfNotSet() ->children() - ->arrayNode('renderer') + ->arrayNode('documents') ->requiresAtLeastOneElement() - ->useAttributeAsKey('key') ->isRequired() - ->prototype('scalar')->end() + ->scalarPrototype()->end() ->defaultValue([ - 'default' => 'App\Controller\InvoiceController::invoiceAction', - ]) - ->end() - ->arrayNode('calculator') - ->requiresAtLeastOneElement() - ->useAttributeAsKey('key') - ->isRequired() - ->prototype('scalar')->end() - ->defaultValue([ - 'default' => 'App\Invoice\DefaultCalculator', - ]) - ->end() - ->arrayNode('number_generator') - ->requiresAtLeastOneElement() - ->useAttributeAsKey('key') - ->isRequired() - ->prototype('scalar')->end() - ->defaultValue([ - 'default' => 'App\Invoice\DateNumberGenerator', + 'var/invoices/', + 'templates/invoice/renderer/' ]) ->end() ->end() diff --git a/src/Entity/InvoiceDocument.php b/src/Entity/InvoiceDocument.php new file mode 100644 index 00000000..af131272 --- /dev/null +++ b/src/Entity/InvoiceDocument.php @@ -0,0 +1,52 @@ +file = $file; + } + + /** + * @return string + */ + public function getId() + { + $file = $this->file->getFilename(); + + return substr($file, 0, strpos($file, '.')); + } + + /** + * @return string + */ + public function getName() + { + return basename($this->getFilename()); + } + + /** + * @return string + */ + public function getFilename(): string + { + return $this->file->getRealPath(); + } +} diff --git a/src/Entity/Timesheet.php b/src/Entity/Timesheet.php index 83f0975c..57359187 100644 --- a/src/Entity/Timesheet.php +++ b/src/Entity/Timesheet.php @@ -153,6 +153,8 @@ class Timesheet public function setEnd($end) { $this->end = $end; + + // FIXME test and then remove it, this should not be neccessary if (null === $end) { $this->duration = 0; } diff --git a/src/Form/Type/InvoiceCalculatorType.php b/src/Form/Type/InvoiceCalculatorType.php index 5167574e..b79eb91e 100644 --- a/src/Form/Type/InvoiceCalculatorType.php +++ b/src/Form/Type/InvoiceCalculatorType.php @@ -39,16 +39,17 @@ class InvoiceCalculatorType extends AbstractType public function configureOptions(OptionsResolver $resolver) { $renderer = []; - foreach ($this->service->getCalculator() as $name => $class) { - $renderer[$name] = $name; + foreach ($this->service->getCalculator() as $calculator) { + $renderer[$calculator->getId()] = $calculator->getId(); } $resolver->setDefaults([ 'label' => 'label.invoice_calculator', 'choices' => $renderer, 'choice_label' => function ($renderer) { - return 'invoice_calculator.' . $renderer; - } + return $renderer; + }, + 'translation_domain' => 'invoice-calculator', ]); } diff --git a/src/Form/Type/InvoiceNumberGeneratorType.php b/src/Form/Type/InvoiceNumberGeneratorType.php index 53a264c5..8f20878e 100644 --- a/src/Form/Type/InvoiceNumberGeneratorType.php +++ b/src/Form/Type/InvoiceNumberGeneratorType.php @@ -39,16 +39,17 @@ class InvoiceNumberGeneratorType extends AbstractType public function configureOptions(OptionsResolver $resolver) { $renderer = []; - foreach ($this->service->getNumberGenerator() as $name => $class) { - $renderer[$name] = $name; + foreach ($this->service->getNumberGenerator() as $generator) { + $renderer[$generator->getId()] = $generator->getId(); } $resolver->setDefaults([ 'label' => 'label.invoice_number_generator', 'choices' => $renderer, 'choice_label' => function ($renderer) { - return 'invoice_number_generator.' . $renderer; - } + return $renderer; + }, + 'translation_domain' => 'invoice-numbergenerator', ]); } diff --git a/src/Form/Type/InvoiceRendererType.php b/src/Form/Type/InvoiceRendererType.php index ccf8498b..29c5a53f 100644 --- a/src/Form/Type/InvoiceRendererType.php +++ b/src/Form/Type/InvoiceRendererType.php @@ -38,20 +38,46 @@ class InvoiceRendererType extends AbstractType */ public function configureOptions(OptionsResolver $resolver) { - $renderer = []; - foreach ($this->service->getRenderer() as $name => $action) { - $renderer[$name] = $name; + $documents = []; + foreach ($this->service->getDocuments() as $document) { + foreach ($this->service->getRenderer() as $renderer) { + if ($renderer->supports($document)) { + $documents[$document->getId()] = $document->getName(); + } + } } $resolver->setDefaults([ 'label' => 'label.invoice_renderer', - 'choices' => $renderer, - 'choice_label' => function ($renderer) { - return 'invoice_renderer.' . $renderer; - } + 'choices' => array_flip($documents), + 'group_by' => [$this, 'getGroupBy'], + 'choice_label' => function ($choiceValue, $key, $value) { + return $choiceValue; + }, + 'translation_domain' => 'invoice-renderer', + 'docu_chapter' => 'invoices', ]); } + /** + * @param string $value + * @param string $label + * @param string $index + * @return string + */ + public function getGroupBy($value, $label, $index) + { + $renderer = $label; + + return ucfirst( + substr( + $renderer, + 1 + strrpos($renderer, '.'), + strrpos($renderer, '.') + ) + ); + } + /** * {@inheritdoc} */ diff --git a/src/Invoice/DefaultCalculator.php b/src/Invoice/Calculator/AbstractCalculator.php similarity index 85% rename from src/Invoice/DefaultCalculator.php rename to src/Invoice/Calculator/AbstractCalculator.php index 1b480d80..e2c2c64a 100644 --- a/src/Invoice/DefaultCalculator.php +++ b/src/Invoice/Calculator/AbstractCalculator.php @@ -7,18 +7,12 @@ * file that was distributed with this source code. */ -namespace App\Invoice; +namespace App\Invoice\Calculator; use App\Entity\Timesheet; use App\Model\InvoiceModel; -/** - * Class DefaultCalculator works on all given entries using: - * - the customers currency - * - the invoice template vat rate - * - the entries rate - */ -class DefaultCalculator implements CalculatorInterface +abstract class AbstractCalculator { /** * @var string @@ -33,10 +27,12 @@ class DefaultCalculator implements CalculatorInterface /** * @return Timesheet[] */ - public function getEntries() - { - return $this->model->getEntries(); - } + abstract public function getEntries(); + + /** + * @return string + */ + abstract public function getId(): string; /** * @param InvoiceModel $model diff --git a/src/Invoice/Calculator/AbstractMergedCalculator.php b/src/Invoice/Calculator/AbstractMergedCalculator.php new file mode 100644 index 00000000..69509032 --- /dev/null +++ b/src/Invoice/Calculator/AbstractMergedCalculator.php @@ -0,0 +1,51 @@ +setUser($entry->getUser()); + $timesheet->setFixedRate($entry->getFixedRate()); // FIXME invoice + $timesheet->setHourlyRate($entry->getHourlyRate()); // FIXME invoice + $timesheet->setRate($timesheet->getRate() + $entry->getRate()); + $timesheet->setDuration($timesheet->getDuration() + $entry->getDuration()); + + if (null === $timesheet->getBegin() || $timesheet->getBegin()->getTimestamp() > $entry->getBegin()->getTimestamp()) { + $timesheet->setBegin($entry->getBegin()); + } + + if (null === $timesheet->getEnd() || $timesheet->getEnd()->getTimestamp() < $entry->getEnd()->getTimestamp()) { + $timesheet->setEnd($entry->getEnd()); + } + + if (null !== $this->model->getQuery()->getActivity()) { + $timesheet->setActivity($this->model->getQuery()->getActivity()); + $timesheet->setDescription($this->model->getQuery()->getActivity()->getName()); + } elseif (null !== $this->model->getQuery()->getProject()) { + $timesheet->setDescription($this->model->getQuery()->getProject()->getName()); + } + + if (null === $timesheet->getActivity()) { + $timesheet->setActivity($entry->getActivity()); + } + + if (empty($timesheet->getDescription())) { + $timesheet->setDescription($entry->getActivity()->getName()); + } + } +} diff --git a/src/Invoice/Calculator/DefaultCalculator.php b/src/Invoice/Calculator/DefaultCalculator.php new file mode 100644 index 00000000..ee6718dd --- /dev/null +++ b/src/Invoice/Calculator/DefaultCalculator.php @@ -0,0 +1,38 @@ +model->getEntries(); + } + + /** + * @return string + */ + public function getId(): string + { + return 'default'; + } +} diff --git a/src/Invoice/Calculator/ShortInvoiceCalculator.php b/src/Invoice/Calculator/ShortInvoiceCalculator.php new file mode 100644 index 00000000..e9b82d60 --- /dev/null +++ b/src/Invoice/Calculator/ShortInvoiceCalculator.php @@ -0,0 +1,47 @@ +model->getEntries(); + if (empty($entries)) { + return []; + } + + $timesheet = new Timesheet(); + + foreach ($entries as $entry) { + $this->mergeTimesheets($timesheet, $entry); + } + + return [$timesheet]; + } + + /** + * @return string + */ + public function getId(): string + { + return 'short'; + } +} diff --git a/src/Invoice/Calculator/UserInvoiceCalculator.php b/src/Invoice/Calculator/UserInvoiceCalculator.php new file mode 100644 index 00000000..29be1a44 --- /dev/null +++ b/src/Invoice/Calculator/UserInvoiceCalculator.php @@ -0,0 +1,51 @@ +model->getEntries(); + if (empty($entries)) { + return []; + } + + /** @var Timesheet[] $timesheets */ + $timesheets = []; + + foreach ($entries as $entry) { + if (!isset($timesheets[$entry->getUser()->getId()])) { + $timesheets[$entry->getUser()->getId()] = new Timesheet(); + } + $timesheet = $timesheets[$entry->getUser()->getId()]; + $this->mergeTimesheets($timesheet, $entry); + } + + return array_values($timesheets); + } + + /** + * @return string + */ + public function getId(): string + { + return 'user'; + } +} diff --git a/src/Invoice/CalculatorInterface.php b/src/Invoice/CalculatorInterface.php index 019ddcfa..88736ab8 100644 --- a/src/Invoice/CalculatorInterface.php +++ b/src/Invoice/CalculatorInterface.php @@ -72,4 +72,14 @@ interface CalculatorInterface * @return int */ public function getTimeWorked(): int; + + /** + * Returns the unique ID of this calculator. + * + * Prefix it with your company name followed by a hyphen (e.g. "acme-"), + * if this is a third-party calculator. + * + * @return string + */ + public function getId(): string; } diff --git a/src/Invoice/DateNumberGenerator.php b/src/Invoice/NumberGenerator/DateNumberGenerator.php similarity index 73% rename from src/Invoice/DateNumberGenerator.php rename to src/Invoice/NumberGenerator/DateNumberGenerator.php index 666700ad..a45f99ba 100644 --- a/src/Invoice/DateNumberGenerator.php +++ b/src/Invoice/NumberGenerator/DateNumberGenerator.php @@ -7,8 +7,9 @@ * file that was distributed with this source code. */ -namespace App\Invoice; +namespace App\Invoice\NumberGenerator; +use App\Invoice\NumberGeneratorInterface; use App\Model\InvoiceModel; /** @@ -22,6 +23,14 @@ class DateNumberGenerator implements NumberGeneratorInterface */ protected $model; + /** + * @return string + */ + public function getId(): string + { + return 'default'; + } + /** * @param InvoiceModel $model */ @@ -35,6 +44,6 @@ class DateNumberGenerator implements NumberGeneratorInterface */ public function getInvoiceNumber(): string { - return date('ymd'); + return date('ymd', $this->model->getInvoiceDate()->getTimestamp()); } } diff --git a/src/Invoice/NumberGeneratorInterface.php b/src/Invoice/NumberGeneratorInterface.php index 327e2fc6..471fb49e 100644 --- a/src/Invoice/NumberGeneratorInterface.php +++ b/src/Invoice/NumberGeneratorInterface.php @@ -25,4 +25,14 @@ interface NumberGeneratorInterface * @return string */ public function getInvoiceNumber(): string; + + /** + * Returns the unique ID of this number generator. + * + * Prefix it with your company name followed by a hyphen (e.g. "acme-"), + * if this is a third-party generator. + * + * @return string + */ + public function getId(): string; } diff --git a/src/Invoice/Renderer/AbstractRenderer.php b/src/Invoice/Renderer/AbstractRenderer.php new file mode 100644 index 00000000..d7a3dbcb --- /dev/null +++ b/src/Invoice/Renderer/AbstractRenderer.php @@ -0,0 +1,82 @@ +translator = $translator; + $this->dateExtension = $dateExtension; + $this->extension = $extensions; + } + + /** + * @param \DateTime $date + * @return mixed + */ + protected function getFormattedDateTime(\DateTime $date) + { + return $this->dateExtension->dateShort($date); + } + + /** + * @param $amount + * @return mixed + */ + protected function getFormattedMoney($amount) + { + return $this->extension->money($amount); + } + + /** + * @param \DateTime $date + * @return mixed + */ + protected function getFormattedMonthName(\DateTime $date) + { + return $this->translator->trans($this->dateExtension->monthName($date)); + } + + /** + * @param $seconds + * @return mixed + */ + protected function getFormattedDuration($seconds) + { + return $this->extension->duration($seconds); + } +} diff --git a/src/Invoice/Renderer/AbstractSpreadsheetRenderer.php b/src/Invoice/Renderer/AbstractSpreadsheetRenderer.php new file mode 100644 index 00000000..73002557 --- /dev/null +++ b/src/Invoice/Renderer/AbstractSpreadsheetRenderer.php @@ -0,0 +1,129 @@ +getFilename()); + $worksheet = $spreadsheet->getActiveSheet(); + $entries = $model->getCalculator()->getEntries(); + $replacer = $this->modelToReplacer($model); + $timesheetAmount = count($entries); + $this->addTemplateRows($worksheet, $timesheetAmount); + + $worksheet->setTitle($model->getTemplate()->getTitle()); + + $entryRow = 0; + + foreach ($worksheet->getRowIterator() as $row) { + $timesheet = $entries[$entryRow]; + $sheetValues = false; + foreach ($row->getCellIterator() as $cell) { + $value = $cell->getValue(); + if (stripos($value, '${entry.') !== false) { + if ($sheetValues === false) { + $sheetValues = $this->timesheetToArray($timesheet); + } + $searcher = str_replace('${', '', $value); + $searcher = str_replace('}', '', $searcher); + if (isset($sheetValues[$searcher])) { + $cell->setValue($sheetValues[$searcher]); + } + } elseif (stripos($value, '${') !== false) { + $searcher = str_replace('${', '', $value); + $searcher = str_replace('}', '', $searcher); + if (isset($replacer[$searcher])) { + $cell->setValue($replacer[$searcher]); + } + } + } + + if ($sheetValues !== false && $entryRow < $timesheetAmount - 1) { + $entryRow++; + } + } + + $filename = $this->saveSpreadsheet($spreadsheet); + + return $this->getFileResponse($filename, basename($document->getFilename())); + } + + /** + * @param Worksheet $worksheet + * @param int $timesheets + */ + protected function addTemplateRows(Worksheet $worksheet, int $timesheets) + { + $startRow = null; + $rowCounter = 0; + + foreach ($worksheet->getRowIterator() as $row) { + $cellCounter = 0; + foreach ($row->getCellIterator() as $cell) { + $value = $cell->getValue(); + if (stripos($value, '${entry.') !== false) { + $startRow = $row->getRowIndex(); + $worksheet->insertNewRowBefore($row->getRowIndex(), $timesheets - 1); + break 2; + } + + if ($cellCounter++ >= 10) { + break; + } + } + + if ($rowCounter++ >= 100) { + break; + } + } + + if ($startRow === null) { + throw new \Exception('Invalid invoice document, no template row found.'); + } + + // fill up all new rows with template values + $templateRow = $timesheets + $startRow; + $iterator = $worksheet->getRowIterator($templateRow - 1, $templateRow); + $templateColumns = []; + foreach ($iterator->current()->getCellIterator() as $cell) { + $templateColumns[$cell->getColumn()] = $cell->getValue(); + } + + $iterator = $worksheet->getRowIterator($startRow, $templateRow - 2); + foreach ($iterator as $row) { + foreach ($row->getCellIterator() as $cell) { + $cell->setValue($templateColumns[$cell->getColumn()]); + } + } + } +} diff --git a/src/Invoice/Renderer/CsvRenderer.php b/src/Invoice/Renderer/CsvRenderer.php new file mode 100644 index 00000000..9cb4b7ae --- /dev/null +++ b/src/Invoice/Renderer/CsvRenderer.php @@ -0,0 +1,47 @@ +save($filename); + + return $filename; + } +} diff --git a/src/Invoice/Renderer/DocxRenderer.php b/src/Invoice/Renderer/DocxRenderer.php new file mode 100644 index 00000000..7fbdf519 --- /dev/null +++ b/src/Invoice/Renderer/DocxRenderer.php @@ -0,0 +1,88 @@ +getSettings()->setThemeFontLang(new Language(Language::EN_US)); + + $properties = $phpWord->getDocInfo(); + $properties->setCreator('Kimai 2'); + $properties->setDescription('Created with Kimai 2, the open-source time-tracking software! Get more information at www.kimai.org.'); + $properties->setCreated(time()); + $properties->setModified(time()); + } + */ + + /** + * @param InvoiceDocument $document + * @param InvoiceModel $model + * @return Response + */ + public function render(InvoiceDocument $document, InvoiceModel $model): Response + { + $filename = basename($document->getFilename()); + + $template = new TemplateProcessor($document->getFilename()); + foreach ($this->modelToReplacer($model) as $key => $value) { + $template->setValue($key, $value); + } + + $template->cloneRow('entry.description', count($model->getCalculator()->getEntries())); + $i = 1; + foreach ($model->getCalculator()->getEntries() as $entry) { + $values = $this->timesheetToArray($entry); + foreach ($values as $search => $replace) { + $template->setValue($search . '#' . $i, $replace); + } + $i++; + } + + $cacheFile = $template->save(); + + clearstatcache(true, $cacheFile); + + return $this->getFileResponse(new Stream($cacheFile), $filename); + } + + /** + * @return string[] + */ + protected function getFileExtensions() + { + return ['.docx']; + } + + /** + * @return string + */ + protected function getContentType() + { + return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; + } +} diff --git a/src/Invoice/Renderer/OdsRenderer.php b/src/Invoice/Renderer/OdsRenderer.php new file mode 100644 index 00000000..15427542 --- /dev/null +++ b/src/Invoice/Renderer/OdsRenderer.php @@ -0,0 +1,47 @@ +save($filename); + + return $filename; + } +} diff --git a/src/Invoice/Renderer/RendererTrait.php b/src/Invoice/Renderer/RendererTrait.php new file mode 100644 index 00000000..5adfacbc --- /dev/null +++ b/src/Invoice/Renderer/RendererTrait.php @@ -0,0 +1,180 @@ +getFileExtensions() as $extension) { + if (stripos($document->getFilename(), $extension) !== false) { + return true; + } + } + + return false; + } + + /** + * @param \DateTime $date + * @return mixed + */ + abstract protected function getFormattedDateTime(\DateTime $date); + + /** + * @param $amount + * @return mixed + */ + abstract protected function getFormattedMoney($amount); + + /** + * @param \DateTime $date + * @return mixed + */ + abstract protected function getFormattedMonthName(\DateTime $date); + + /** + * @param $seconds + * @return mixed + */ + abstract protected function getFormattedDuration($seconds); + + /** + * @param InvoiceModel $model + * @return array + */ + protected function modelToReplacer(InvoiceModel $model) + { + return [ + 'invoice.due_date' => $this->getFormattedDateTime($model->getDueDate()), + 'invoice.date' => $this->getFormattedDateTime($model->getInvoiceDate()), + 'invoice.number' => $model->getNumberGenerator()->getInvoiceNumber(), + 'invoice.currency' => $model->getCalculator()->getCurrency(), + 'invoice.vat' => $model->getCalculator()->getVat(), + 'invoice.tax' => $this->getFormattedMoney($model->getCalculator()->getTax()), + 'invoice.total_time' => $this->getFormattedDuration($model->getCalculator()->getTimeWorked()), + 'invoice.total' => $this->getFormattedMoney($model->getCalculator()->getTotal()), + 'invoice.subtotal' => $this->getFormattedMoney($model->getCalculator()->getSubtotal()), + + 'template.name' => $model->getTemplate()->getName(), + 'template.company' => $model->getTemplate()->getCompany(), + 'template.address' => $model->getTemplate()->getAddress(), + 'template.title' => $model->getTemplate()->getTitle(), + 'template.payment_terms' => $model->getTemplate()->getPaymentTerms(), + 'template.due_days' => $model->getTemplate()->getDueDays(), + + 'query.begin' => $this->getFormattedDateTime($model->getQuery()->getBegin()), + 'query.end' => $this->getFormattedDateTime($model->getQuery()->getEnd()), + 'query.month' => $this->getFormattedMonthName($model->getQuery()->getBegin()), + 'query.year' => $model->getQuery()->getBegin()->format('Y'), + + 'customer.address' => $model->getCustomer()->getAddress(), + 'customer.name' => $model->getCustomer()->getName(), + 'customer.contact' => $model->getCustomer()->getContact(), + 'customer.company' => $model->getCustomer()->getCompany(), + 'customer.number' => $model->getCustomer()->getNumber(), + 'customer.country' => $model->getCustomer()->getCountry(), + 'customer.homepage' => $model->getCustomer()->getHomepage(), + 'customer.comment' => $model->getCustomer()->getComment(), + ]; + } + + /** + * @param Timesheet $timesheet + * @return array + */ + protected function timesheetToArray(Timesheet $timesheet) + { + $rate = $timesheet->getRate(); + $hourlyRate = $timesheet->getHourlyRate(); + $amount = $this->getFormattedDuration($timesheet->getDuration()); + $description = $timesheet->getDescription(); + + if (null !== $timesheet->getFixedRate()) { + $rate = $timesheet->getFixedRate(); + $hourlyRate = $timesheet->getFixedRate(); + $amount = 1; + } + + if (empty($description)) { + $description = $timesheet->getActivity()->getName(); + } + + $user = $timesheet->getUser(); + + if (empty($hourlyRate)) { + $hourlyRate = $user->getPreferenceValue(UserPreference::HOURLY_RATE); + } + + $activity = $timesheet->getActivity(); + $project = $activity->getProject(); + $customer = $project->getCustomer(); + + return [ + 'entry.description' => $description, + 'entry.amount' => $amount, + 'entry.rate' => $this->getFormattedMoney($hourlyRate), + 'entry.total' => $this->getFormattedMoney($rate), + 'entry.duration' => $timesheet->getDuration(), + 'entry.begin' => $this->getFormattedDateTime($timesheet->getBegin()), + 'entry.begin_timestamp' => $timesheet->getBegin()->getTimestamp(), + 'entry.end' => $this->getFormattedDateTime($timesheet->getEnd()), + 'entry.end_timestamp' => $timesheet->getEnd()->getTimestamp(), + 'entry.date' => $this->getFormattedDateTime($timesheet->getBegin()), + 'entry.user_id' => $user->getId(), + 'entry.user_name' => $user->getUsername(), + 'entry.user_alias' => $user->getAlias(), + 'entry.activity' => $activity->getName(), + 'entry.activity_id' => $activity->getId(), + 'entry.project' => $project->getName(), + 'entry.project_id' => $project->getId(), + 'entry.customer' => $customer->getName(), + 'entry.customer_id' => $customer->getId(), + ]; + } + + /** + * @param mixed $file + * @param string $filename + * @return BinaryFileResponse + */ + protected function getFileResponse($file, $filename) + { + $response = new BinaryFileResponse($file); + $disposition = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $filename); + + $response->headers->set('Content-Type', $this->getContentType()); + $response->headers->set('Content-Disposition', $disposition); + $response->deleteFileAfterSend(true); + + return $response; + } +} diff --git a/src/Invoice/Renderer/TwigRenderer.php b/src/Invoice/Renderer/TwigRenderer.php new file mode 100644 index 00000000..4adc5d84 --- /dev/null +++ b/src/Invoice/Renderer/TwigRenderer.php @@ -0,0 +1,57 @@ +twig = $twig; + } + + /** + * @param InvoiceDocument $document + * @return bool + */ + public function supports(InvoiceDocument $document): bool + { + return stripos($document->getFilename(), '.twig') !== false; + } + + /** + * @param InvoiceDocument $document + * @param InvoiceModel $model + * @return Response + */ + public function render(InvoiceDocument $document, InvoiceModel $model): Response + { + $content = $this->twig->render('@invoice/' . basename($document->getFilename()), [ + 'model' => $model + ]); + + $response = new Response(); + $response->setContent($content); + + return $response; + } +} diff --git a/src/Invoice/Renderer/XlsxRenderer.php b/src/Invoice/Renderer/XlsxRenderer.php new file mode 100644 index 00000000..21b4df2e --- /dev/null +++ b/src/Invoice/Renderer/XlsxRenderer.php @@ -0,0 +1,47 @@ +save($filename); + + return $filename; + } +} diff --git a/src/Invoice/RendererInterface.php b/src/Invoice/RendererInterface.php new file mode 100644 index 00000000..87d4a032 --- /dev/null +++ b/src/Invoice/RendererInterface.php @@ -0,0 +1,34 @@ +config = $invoiceConfig; + $this->documents = $repository; } /** - * @return array + * @param NumberGeneratorInterface $generator + * @return $this + */ + public function addNumberGenerator(NumberGeneratorInterface $generator) + { + $this->numberGenerator[] = $generator; + + return $this; + } + + /** + * @return NumberGeneratorInterface[] */ public function getNumberGenerator() { - return $this->config['number_generator']; + return $this->numberGenerator; } /** @@ -45,9 +70,9 @@ class ServiceInvoice */ public function getNumberGeneratorByName(string $name) { - foreach ($this->getNumberGenerator() as $key => $class) { - if ($key === $name) { - return new $class(); + foreach ($this->getNumberGenerator() as $generator) { + if ($generator->getId() === $name) { + return $generator; } } @@ -55,11 +80,22 @@ class ServiceInvoice } /** - * @return array + * @param CalculatorInterface $calculator + * @return $this + */ + public function addCalculator(CalculatorInterface $calculator) + { + $this->calculator[] = $calculator; + + return $this; + } + + /** + * @return CalculatorInterface[] */ public function getCalculator() { - return $this->config['calculator']; + return $this->calculator; } /** @@ -68,38 +104,52 @@ class ServiceInvoice */ public function getCalculatorByName(string $name) { - foreach ($this->getCalculator() as $key => $class) { - if ($key === $name) { - return new $class(); + foreach ($this->getCalculator() as $calculator) { + if ($calculator->getId() === $name) { + return $calculator; } } return null; } + /** + * @param string $name + * @return InvoiceDocument|null + */ + public function getDocumentByName(string $name) + { + return $this->documents->findByName($name); + } + /** * Returns an array of invoice renderer, which will consist of a unique name and a controller action. * - * @return array - * @throws \Exception + * @return InvoiceDocument[] */ - public function getRenderer() + public function getDocuments() { - return $this->config['renderer']; + return $this->documents->findAll(); } /** - * @param $renderer - * @return string|null + * @param RendererInterface $renderer + * @return $this */ - public function getRendererActionByName($renderer) + public function addRenderer(RendererInterface $renderer) { - foreach ($this->config['renderer'] as $name => $action) { - if ($name == $renderer) { - return $action; - } - } + $this->renderer[] = $renderer; - return null; + return $this; + } + + /** + * Returns an array of invoice renderer. + * + * @return RendererInterface[] + */ + public function getRenderer() + { + return $this->renderer; } } diff --git a/src/Invoice/ShortInvoiceCalculator.php b/src/Invoice/ShortInvoiceCalculator.php deleted file mode 100644 index c170da61..00000000 --- a/src/Invoice/ShortInvoiceCalculator.php +++ /dev/null @@ -1,44 +0,0 @@ -model->getEntries() as $entry) { - $timesheet->setRate($timesheet->getRate() + $entry->getRate()); - $timesheet->setDuration($timesheet->getDuration() + $entry->getDuration()); - $timesheet->setBegin($entry->getBegin()); - if (null === $timesheet->getActivity()) { - $timesheet->setActivity($entry->getActivity()); - } - } - - if (null !== $this->model->getQuery()->getActivity()) { - $timesheet->setDescription($this->model->getQuery()->getActivity()->getName()); - } elseif (null !== $this->model->getQuery()->getProject()) { - $timesheet->setDescription($this->model->getQuery()->getProject()->getName()); - } - - return [$timesheet]; - } -} diff --git a/src/Kernel.php b/src/Kernel.php index debdd06e..1d555f5b 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -11,8 +11,12 @@ namespace App; use App\DependencyInjection\AppExtension; use App\DependencyInjection\Compiler\DoctrineCompilerPass; +use App\DependencyInjection\Compiler\InvoiceServiceCompilerPass; use App\DependencyInjection\Compiler\TwigContextCompilerPass; -use App\Timesheet\CalculatorInterface; +use App\Invoice\CalculatorInterface as InvoiceCalculator; +use App\Invoice\NumberGeneratorInterface; +use App\Invoice\RendererInterface; +use App\Timesheet\CalculatorInterface as TimesheetCalculator; use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\DependencyInjection\Compiler\PassConfig; @@ -26,6 +30,10 @@ class Kernel extends BaseKernel public const CONFIG_EXTS = '.{php,xml,yaml,yml}'; + public const TAG_INVOICE_RENDERER = 'invoice.renderer'; + public const TAG_INVOICE_NUMBER_GENERATOR = 'invoice.number_generator'; + public const TAG_INVOICE_CALCULATOR = 'invoice.calculator'; + public function getCacheDir() { return $this->getProjectDir() . '/var/cache/' . $this->environment; @@ -38,7 +46,10 @@ class Kernel extends BaseKernel protected function build(ContainerBuilder $container) { - $container->registerForAutoconfiguration(CalculatorInterface::class)->addTag('timesheet.calculator'); + $container->registerForAutoconfiguration(TimesheetCalculator::class)->addTag('timesheet.calculator'); + $container->registerForAutoconfiguration(RendererInterface::class)->addTag(self::TAG_INVOICE_RENDERER); + $container->registerForAutoconfiguration(NumberGeneratorInterface::class)->addTag(self::TAG_INVOICE_NUMBER_GENERATOR); + $container->registerForAutoconfiguration(InvoiceCalculator::class)->addTag(self::TAG_INVOICE_CALCULATOR); } public function registerBundles() @@ -68,6 +79,7 @@ class Kernel extends BaseKernel $container->addCompilerPass(new DoctrineCompilerPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, -1000); $container->addCompilerPass(new TwigContextCompilerPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, -1000); + $container->addCompilerPass(new InvoiceServiceCompilerPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, -1000); } protected function configureRoutes(RouteCollectionBuilder $routes) diff --git a/src/Model/InvoiceModel.php b/src/Model/InvoiceModel.php index 22f5ea4e..b72480a4 100644 --- a/src/Model/InvoiceModel.php +++ b/src/Model/InvoiceModel.php @@ -17,7 +17,8 @@ use App\Invoice\NumberGeneratorInterface; use App\Repository\Query\InvoiceQuery; /** - * Class InvoiceModel is the ONLY value that a renderer template receives for generating the invoice. + * InvoiceModel is the ONLY value that a RendererInterface receives for generating the invoice, + * besides the InvoiceDocument which is used as a "template". */ class InvoiceModel { @@ -51,10 +52,20 @@ class InvoiceModel */ protected $generator; + /** + * @var \DateTime + */ + protected $invoiceDate; + + public function __construct() + { + $this->invoiceDate = new \DateTime(); + } + /** * @return InvoiceQuery */ - public function getQuery(): InvoiceQuery + public function getQuery(): ?InvoiceQuery { return $this->query; } @@ -103,7 +114,7 @@ class InvoiceModel * @param InvoiceTemplate $template * @return InvoiceModel */ - public function setTemplate($template) + public function setTemplate(InvoiceTemplate $template) { $this->template = $template; @@ -132,8 +143,12 @@ class InvoiceModel /** * @return \DateTime */ - public function getDueDate(): \DateTime + public function getDueDate(): ?\DateTime { + if (null === $this->getTemplate()) { + return null; + } + return new \DateTime('+' . $this->getTemplate()->getDueDays() . ' days'); } @@ -142,7 +157,7 @@ class InvoiceModel */ public function getInvoiceDate(): \DateTime { - return new \DateTime(); + return $this->invoiceDate; } /** @@ -160,7 +175,7 @@ class InvoiceModel /** * @return NumberGeneratorInterface */ - public function getNumberGenerator(): NumberGeneratorInterface + public function getNumberGenerator(): ?NumberGeneratorInterface { return $this->generator; } @@ -180,7 +195,7 @@ class InvoiceModel /** * @return CalculatorInterface */ - public function getCalculator(): CalculatorInterface + public function getCalculator(): ?CalculatorInterface { return $this->calculator; } diff --git a/src/Model/Statistic/Month.php b/src/Model/Statistic/Month.php index 2759f80c..e7a0f479 100644 --- a/src/Model/Statistic/Month.php +++ b/src/Model/Statistic/Month.php @@ -10,7 +10,7 @@ namespace App\Model\Statistic; /** - * Yearly statistics + * Monthly statistics */ class Month { @@ -28,11 +28,14 @@ class Month protected $totalRate = 0; /** - * Month constructor. * @param string $month */ - public function __construct($month) + public function __construct(string $month) { + $monthNumber = (int) $month; + if ($monthNumber < 1 || $monthNumber > 12) { + throw new \InvalidArgumentException('Invalid month given, expected 01-12 but given: ' . $monthNumber); + } $this->month = $month; } diff --git a/src/Model/Statistic/Year.php b/src/Model/Statistic/Year.php index d2a4bfb4..dbb72f43 100644 --- a/src/Model/Statistic/Year.php +++ b/src/Model/Statistic/Year.php @@ -21,7 +21,7 @@ class Year /** * @var Month[] */ - protected $months; + protected $months = []; /** * Year constructor. @@ -52,10 +52,10 @@ class Year } /** - * @param $month + * @param int $month * @return null|Month */ - public function getMonth($month) + public function getMonth(int $month) { if (isset($this->months[$month])) { return $this->months[$month]; diff --git a/src/Repository/InvoiceDocumentRepository.php b/src/Repository/InvoiceDocumentRepository.php new file mode 100644 index 00000000..413eed16 --- /dev/null +++ b/src/Repository/InvoiceDocumentRepository.php @@ -0,0 +1,72 @@ +documentDirs = $directories; + } + + /** + * @param string $name + * @return InvoiceDocument|null + */ + public function findByName(string $name) + { + foreach ($this->findAll() as $document) { + if ($document->getId() === $name) { + return $document; + } + } + + return null; + } + + /** + * Returns an array of invoice renderer, which will consist of a unique name and a controller action. + * + * @return InvoiceDocument[] + */ + public function findAll() + { + $base = dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR; + + $documents = []; + + foreach ($this->documentDirs as $searchPath) { + if (!is_dir($base . $searchPath)) { + continue; + } + $finder = Finder::create()->ignoreDotFiles(true)->files()->in($base . $searchPath)->name('*.*'); + foreach ($finder->getIterator() as $file) { + $doc = new InvoiceDocument($file); + // the first found invoice document wins + if (!isset($documents[$doc->getId()])) { + $documents[$doc->getId()] = $doc; + } + } + } + + return $documents; + } +} diff --git a/src/Repository/Query/InvoiceQuery.php b/src/Repository/Query/InvoiceQuery.php index ab021709..d2cad96e 100644 --- a/src/Repository/Query/InvoiceQuery.php +++ b/src/Repository/Query/InvoiceQuery.php @@ -44,23 +44,4 @@ class InvoiceQuery extends TimesheetQuery return $this; } - - /** - * @return InvoiceTemplate[] - */ - public function getTemplates(): array - { - return $this->templates; - } - - /** - * @param InvoiceTemplate[] $templates - * @return InvoiceQuery - */ - public function setTemplates(array $templates) - { - $this->templates = $templates; - - return $this; - } } diff --git a/src/Timesheet/Calculator/RateCalculator.php b/src/Timesheet/Calculator/RateCalculator.php index 7cbed6b4..7fc4a305 100644 --- a/src/Timesheet/Calculator/RateCalculator.php +++ b/src/Timesheet/Calculator/RateCalculator.php @@ -44,6 +44,7 @@ class RateCalculator implements CalculatorInterface $fixedRate = $this->findFixedRate($record); if (null !== $fixedRate) { $record->setRate($fixedRate); + $record->setFixedRate($fixedRate); return; } @@ -51,9 +52,11 @@ class RateCalculator implements CalculatorInterface $hourlyRate = $this->findHourlyRate($record); $factor = $this->getRateFactor($record); - $record->setRate( - $this->calculateRate($record->getDuration(), $hourlyRate, $factor) - ); + $hourlyRate = (float) $hourlyRate * $factor; + $rate = (float) $hourlyRate * ($record->getDuration() / 3600); + + $record->setHourlyRate($hourlyRate); + $record->setRate($rate); } /** @@ -127,11 +130,6 @@ class RateCalculator implements CalculatorInterface $weekday = $record->getEnd()->format('l'); $days = array_map('strtolower', $rateFactor['days']); if (in_array(strtolower($weekday), $days)) { - if ($rateFactor['factor'] <= 0) { - throw new \InvalidArgumentException( - 'A rate factor smaller or equals 0 is not allowed, given: ' . $rateFactor['factor'] - ); - } $factor += $rateFactor['factor']; } } @@ -142,15 +140,4 @@ class RateCalculator implements CalculatorInterface return $factor; } - - /** - * @param int $duration - * @param float $hourlyRate - * @param float $factor - * @return float - */ - protected function calculateRate($duration, $hourlyRate, $factor) - { - return (float) $hourlyRate * ($duration / 3600) * $factor; - } } diff --git a/src/Twig/MarkdownExtension.php b/src/Twig/MarkdownExtension.php index e2146949..2ecc89b9 100644 --- a/src/Twig/MarkdownExtension.php +++ b/src/Twig/MarkdownExtension.php @@ -53,8 +53,12 @@ class MarkdownExtension extends \Twig_Extension * @param string $content * @return string */ - public function timesheetContent(string $content): string + public function timesheetContent($content): string { + if (empty($content)) { + return ''; + } + if ($this->timesheetIsMarkdown) { return $this->markdown->toHtml($content, false); } diff --git a/symfony.lock b/symfony.lock index 6b7f47b1..1901dc65 100644 --- a/symfony.lock +++ b/symfony.lock @@ -161,6 +161,9 @@ "kevinpapst/adminlte-bundle": { "version": "0.3" }, + "markbaker/complex": { + "version": "1.4.6" + }, "monolog/monolog": { "version": "1.23.0" }, @@ -191,6 +194,9 @@ "paragonie/random_compat": { "version": "v2.0.17" }, + "pclzip/pclzip": { + "version": "2.8.2" + }, "phar-io/manifest": { "version": "1.0.1" }, @@ -212,6 +218,15 @@ "phpdocumentor/type-resolver": { "version": "0.4.0" }, + "phpoffice/common": { + "version": "0.2.9" + }, + "phpoffice/phpspreadsheet": { + "version": "1.4.0" + }, + "phpoffice/phpword": { + "version": "0.15.0" + }, "phpoption/phpoption": { "version": "1.5.0" }, @@ -593,6 +608,9 @@ "zendframework/zend-code": { "version": "3.3.0" }, + "zendframework/zend-escaper": { + "version": "2.6.0" + }, "zendframework/zend-eventmanager": { "version": "3.2.0" }, diff --git a/templates/invoice/index.html.twig b/templates/invoice/index.html.twig index db13e340..e1666c10 100644 --- a/templates/invoice/index.html.twig +++ b/templates/invoice/index.html.twig @@ -18,10 +18,33 @@ {% block main %} - {% if model.entries is empty or action is empty %} + {% if model.entries is empty %} {{ widgets.callout('warning', 'invoice.select_filter') }} {% else %} - {{ render(controller(action, {'model': model, 'appRequest': app.request})) }} + + {{ include('invoice/preview.html.twig') }} + +
+
+ +
+
+ {% endif %} {% endblock %} + +{% block javascripts %} + +{% endblock %} diff --git a/templates/invoice/layout.html.twig b/templates/invoice/layout.html.twig new file mode 100644 index 00000000..cb758412 --- /dev/null +++ b/templates/invoice/layout.html.twig @@ -0,0 +1,26 @@ + + + + + + + + + + +
+
+ {% block invoice %}{% endblock %} +
+ {% block print_button %} +
+
+ +
+
+ {% endblock %} +
+ + diff --git a/templates/invoice/preview.html.twig b/templates/invoice/preview.html.twig new file mode 100644 index 00000000..b72736b1 --- /dev/null +++ b/templates/invoice/preview.html.twig @@ -0,0 +1,52 @@ +{% import "macros/widgets.html.twig" as widgets %} +{{ widgets.callout('success', 'invoice.preview') }} + +
+
+
+ + + + + + + + + + + + + {% for entry in model.calculator.entries %} + {% set duration = entry.duration|duration() %} + {% if entry.fixedRate is not null %} + {% set rate = entry.fixedRate %} + {% set duration = 1 %} + {% elseif entry.hourlyRate is not null %} + {% set rate = entry.hourlyRate %} + {% else %} + {% set rate = app.user.getPreferenceValue('hourly_rate') %} + {% endif %} + + + + + + + + + {% endfor %} + +
{{ 'label.date'|trans }}{{ 'invoice.unit_price'|trans }}{{ 'invoice.amount'|trans }}{{ 'invoice.total_rate'|trans }}
{{ entry.begin|date_short }} + {{ rate|money(model.calculator.currency) }} + + {{ duration }} + {{ entry.rate|money(model.calculator.currency) }}
+
+
+
diff --git a/templates/invoice/renderer/company.docx b/templates/invoice/renderer/company.docx new file mode 100644 index 0000000000000000000000000000000000000000..d2c07619014158b3043ce14c32f64626a14b105f GIT binary patch literal 8899 zcma)B1yGe+yQWjRy9K2|y1To(ySuxjJ2xdD9fEY1ba#UwDIp+inhXBtKZoPo>)e-_ zJ)4>RtZ#kKT5mq`Qs5BiATTg6AnbMTWI$dR{L^!^!ebK)Q7qqBvzXmJrJHT#t76WND8Y8M3v2bi2|_gyCy zOEGVlOx&ChAA6bY#gBF=#Yxd|!a+*8W)~P`qOEEx86#>eJe~;`jo|NJW)xU#E}wS| z=JCXiXNW{5<}CVv%1c4RY&%{G?>)W#1Q-a2{QpT1{?jkq>>Q2h|HG28oso-;iLEo8 zyN&gK7)u|sC_0bau~-fFrog(}jRp@A)80>RNe?sDhAEfh04syYiDh|}n5Tgmpb zxq6CM9{1vX@{xjAz#?d%Lq!)&8M6GxZ?1kq-C8R7Zcx3^g}vVZi?owQo?5jd!1c7XCJC!DiVh_t zcF+C(o`h3!odh<`8Pms~ug^|t(<=$#2G4iu3+^KaMMqsq%AG{jnV#a=s7TIazeuyl z6?H|3y9^hEP#t${V`h)GCVaJ2^Luf0fNtfcb~>50q%W|iRPUL(#x`uG(<`vy3u$jOcEHay1s^-k_-XB1GQHmRqdinK-e`kdh#J#f6`4M^jYkO;Xf$ z`Zg(uvZhV20%2$rGs(t=^D&C38PiN5B137BuL=$(--U%W`@+GJ37sUbla^>^NShF| z=A5ewU15lFZhF-75U$D8Xwk8|{m|~v-4;+3{l5GIDYefV@+kNS!J}EE6ZFH9Dw*yg zNzA0emDD=#1>Z9h6S*)Sho9aP8}v_1p#GN$Q#)H{WdlQNlV>VMbu(d0s+mx46kplA=#0JcSd=@>>+lvw5fP+Jqh+;7@yr8OonN~HeMEDF#41EIM< zg;)LkKJHxUg~2RDRXoQ>t$a}p*L<3|#QwA&S=f3i1r9qGeR+{#asE(-8U9w5>asDb z;jC`@O4Cv`1BNjb?w6R_W)mzBeQjp&g>f3MRe*>z>8mBUoL-dg&|Q2=?MRT5pnwUS zo$dTsTw0#f!?-#bE~zy4#cS1#6gxzDgeAQbv|2O_^0NwEy&j5k967*>8&153RaCl| zW@sUkTt7IjT`#jMs4Bc_kp9g3NjubfEu9qD^@p=a2cx)pW ziL5YeskwOPcBkq1LnJ<)-~i?>ZDi5gI@2}Gh+k*WJm@Hah)1 z$$@Wkq(=~htebeBO*nXL@Esn<>+-!3EnyGOOO6aW=O*sBvI3@jD#G|oqs5AUGp`!H5ff5 zeFdxBc=Dq11wbM|g7I0JmpJyi{jZr_qJMVaRnj*&V(ObM0djNoZVOBaX0%n#8_XoZ zxsxPt@rmd1s}*#D72D$;j}gdFzXok6U=q2ASlI*`z0DX@5cebhR>4S`v-+dS>FJ zyN{Qf2h}l?lJ8cp8lRYbo3Vi8M~@X*ae9mfT+05G&7IRlhq-tXszkz9@0dd5JqP`q zfF>XM` ze?&IVF6!tfPFV_nmyO~1K%KA1&w@%wa=%0YH{g#ZvmF=_k^tc$Wd0s3Acv|2Jw@?! z7M+kyTH;b)@v^o%d3l~0?p0c5$L)M1Bn;P%ON8K^3|U?2GKMiU9L|}~go1(4=&16# zB}lDJwfaJvrN?VXO;y)}O7yVGxZXCfkts}IT>5skzk|}MydT#1XDgX}ZBp^QU;!#6 zU_idy`y9aa$EmhNXw$$6><$P_FPM_Iko7QYv^!|XT>XA!5!(J1*8~%+a2>se+n^%^ ztfGRtFo8F9)OTz*)ULKD7!d~9>U2vJ5>*61o*n07J|~XF%Vt=5gvakaL2t2hNqA)l{Ar5XS>B`y@_Mm5xyIpf-BZADtx|b+;Q;yRb zvpG|Sfe6al6HQ5ONgLNaHQ8QfkuI;!+`o(PtMaEw`O>SmKE>q({iK7eTaiv;<4yR0 zAMD{X*ZE*&$`n7tNU54OsJR}S;Kk_#F_kpP%_c1BXzZzm9q>NPs#geFP$%&!k!HOY z`lJX^a_m4@poyVKLG02`4woHNst<)t`WjHC4SD9Q$NwD@qpbd#4p}3nvDRyn|z% z3vAQmtN2fQ;x%u|0cBr1w@VP=U4Cs{*gPeUuptio7$=6flDPROp4jZc>d zAgi;^R>Ag`h8+(6{2~brOAMI>=G$o7b#g&km*wZ~lY?E86L$rcu(eWl_^O|**XPt1 z02HkE+p6@LI^sT`T3upZH#r3?47s9|^%r)IIDS^U|EY#tGFvX_w~#0Ss5afs5shRX ze;-B##kc)~@RWqT0O(vKi((_*@p4#Y zr9<-Pj_w4GEcW zeIj~Vj9Yu;OC>yv={gRS64^2rbizGg_pv9*|08=rrDRf_qq>;1e zaJn6X4U5&*sY;I0w9R7R6dPn0MVTK#7o>OkdE>|?sql?^7BX4%9N(rj6f^K#eWweX)_^k))6M-t4X@m-HbGBn_b~5mp_vR!s$jH?GOWt8`koO82S~ zwf<}Sfb$fl$A#j(y_0r-l1sXpWPMcoZ&b%9*!dU!b;_=?jXeiu9r51KYn?owh9ahr zOw&%Ymio;b189#kYVP=bAV06*=B~i&oseB_fG-Oqr1}=$8@CAUfmsu*poEM^9GLjs zJM4x*i>>TluV|dvn3>6C1xxv$(p^|I&d~RKR^&;BgY+S%=OyJS}6JU&+AVvDc8{jA_2asZ4x)YR!+ z$N-xQk%(->NZn>Ik9j(R<4<}946u3K>FL*g^@j3IRgLvem8J{QpH3b5pR(T0*~F3Y z`OJ^hbnKQG(0$gc_~&#<0u<)*LQ6kt&W6b(FO|k7Zn4MBR?{x?@7F%Ie_wb#p_o)z zF1HQZPqe#Ip`VqC7VnKAt&E}mXEnDYz&!0zIVB!b&FhA+r`}@ZJ&`#F}r8{ zbKjkDB-#=*?fVDu3F*@huaz_nSLxvMf-##c&=e3wvay11Ks|ybCuXoYqDYYrU?eyW zw*`|II+bNep*gUORTXXXbn%f$MQ~U*O0zK)q3f^dZqE}!oFZSVVhNfk!V1=f;wOzP z(mHghy<2S*=u9ySiIbr*gQK65w&ip@X0;N%k8<1=gUhCuT5v=mB=txQT&rv8vL8TA&gs(5Ta}LjM_0B{p50^uoPVZf z?E^|}fJ8b`Ws+Z`6>a%k%ni6Xp}K}7hzSz5$Ym!zn3dBAYOlHN3a&q$$BzCf=BvY; z0P2atS?K|OgC64<(w|0wZ=Ey^1$huqr1`79Tu#?1Pcl~~MZYmxuP#mR3SVO#ujt^a zS2BpAa>JMZVtm6SP`fW(n?4P%VtnZUwx!O{KgD-=fq$`cmg^_a3{~Kud@z(qJub82 zmbO}s$_M8HMHfyWMm%}HkwDpC;s34k zLz3X5kZAKNJ!X)T5y|PW&R6PQd&nx*H+Ji~Uhp3hcy;TbB(jM6n{h9U{DG}3_v~|W z^R5{I?xIB+g&T$?flgdwtyP_Lj2Z&I@ArkI>(a&;I_wMtd!qoU7#OqjbH4Od^HPQJ z4899k++Jb=hYeFA>^Vk-B}UW-o0S!+JlJz(vfLt7as4zj!Ev}$JLh&nQm}k}7SJt# zy>Y*$2;PEIR*Tk1Fml}`J`ujJbJTA8oqEKR2X2<1!8{UOsP1>;f8x2f@uc47>L8&% zgvUI9Jx9-Yn#fbQry;>0;{VH!%uNi8|MH`c%F8j+49Gsa)TEK~tgxDJcs9*~EnugC zaYMfTTkPRoY|*Qsberqx><&|OQ;O9dpSIIE%*LXa+ner7j2$;Nf+r~k=W!$&O$#xb zX$N~6V#|Q!4%r78lKCDIF)Q)QM`eKaJxg)qavcN78fYE%IR}wdNm!`9^uDSzg%Ate zuB+O3SWt@n)&`Lb+1$En?ffdn+~R(++I^TNHtVX!%Y6XNazQ7>1=Xxeck_U&JKdwe zAojdoLLHmD7DE(Q7>~T;NLld&vrM**{Etp%vO|h=tK55uAtw@GzLSBopTZc^9F@_5 zuD(D!w^w(=_u_4Mty`vgIsHr4nm4WzbrIdMZ3LXAr=rv(A$+0TSPIv(!^%8Ii;t%W zkFkbdc2)6mlY4Ra^Ni)i>e-=KY4k{}x%`s2_aniRDXy86sU4++;^?KT&G*mU|T}fo(aU+-?1~WYo0ClBo&4C7NX*K`lXOL*r86l9j$b zfdBk|rzm0PF`O2Asf#n+L<> zGn`=&-;Jks_+%i3Xd@$MClnd76J3WVEi%9er}0Phz8Us^t2^QzQJ{Hd!C=Nc#11b2 zL2jERFsN)6puqkQ>FF~Vx=`paC8<93LAaoOz8N|!(U!8E02%HL_e{_>hMRol z@NSz*>SqtacRJi_q$Q4Cei;QgSsN+VojV^ReC#B+kuWFx>TC56V>k|^jHF<2u!Y^6 zudN?giat1d4>}FcrEpmm5#PfQ1n|?)l3p6%wQ`F>$gx*mH3@nEiiAY5=~<>a%5(&C z&vi-kTR)dUSE<0lqQw|3+BBYG##K`4&V$852>T^tR*3B(SyLc@AWbk*CKd z*UZMMceYb7l`D^~9|BR~Jd{x)J-B)+BDBUfQf+a%@~mC*PBx#GbAjNbs2dGaUGQh= z{2`$o(g}jJ#=>43)7CmyKOXD-otdK4mS&2Y6h}yE4Iy9YEzUT46d=J5Dvn2)Topsx zn5wsL4Yv3avH6EfZ6B5DK&j=#GVNmQObIoM$An@cbQpg}U`fm!OC)Btsa?ow;DoRZ zm+5V(Pi#nV=upN|sSPdm+)fmm=SeO@LqO)Vg%FT&r~o&)A#fFSfOMRx(o`?`_(xn3 zrvYnlwQF~E_X0N<)?>79ormuVRx9O(RHuQU!{-}S53!z;$JkhawuV54K?PnW{3^ke zz0f=HcPN(!1wvp0wdqkM%}$fod(amI{5F(KS~o$*{PaoM1!V6_)fz%y^-l|@kP?lL z(=7>u6-~y!?Iz0rA>n6~LAJPz$GvUK`zC)x3E=v$e0IK0OHe&J!=@ZP+Y;g8t3{{0 zJL6;1Zh}v*B1r-!3B3|^I|Nm=;Ly97rXv~5bdLtJnXFHqc+OIC*FD>96?n4`?M$GcU0%CL)znf0MDxQYyt0ysF zb1vz@3*+WzWvww=55ZV^z~KD2C4atiJ6m(-WS{|g9fM635~T0K$p9P~QnW3g%Uoka z!n2jG>decm+<8JO7EIt4j0n_Pv;<461h)gG8d1V5(~`LMm|tf8LU2wrGiipO!)RVP zlN(#)5DT&6yaweV!aADWZkGs{h|tRP=r32SG|>R*Tas8>iI#%gE<=r4Z7wv$-bP~m z1$+I6W$K!(9%Id}K}@`@a^sz>8Ta|IM9&z5O$BSqj6p-3-XBK@4(#4W~>>6y9mah9dnQa=F4ie)H8j>FD7f%5hmE_s9Z zv70U_*V)y?Z}&cSu5{#`vK^9k(*t|&^$Sb=s zf=v)4@RRo6N+g;jnY0cKQ3YZje2S5>hmtJRafU{~#Z+{J{z>d&qF$f(EoRRN9=FkD z*>Jx*n$kOufOGj6!yYT%baIA8K|4KEG{_P`YwfMr!9XMYCHQlhCGEkc%>9&9N&d+E z^I-gM=8fzee~A#u34^jv`c>!&cgVKa0XfZE1w8V4cxAynnBLKa={aPs6dsDBWuqbq zO#%89)9d@u&2()WXOZ?U4;8?hQPDRP`ogry8nXMtcf2@CoAG#qWlNn&wq4U@XU3$~ zB$m)}mGv9)0hFM|-Xw=fmB=<-X;{<~E3tvy!Qb*+GmPw46Ex`BuTa&q3$diZ9S7q- z!$=?U7Z4~$fLhE~T7oJv6!QlOjMpgiU1~xU-A_W>?C_Uh*wW%BUk(biomwKZ$}n5X zYFX^@8QFdA-*uf4PH%h*TAS${jou9^7Do;eq0_{B?&;~o)lp=UZMsF?CVgg|UHC;q zH8ZP2ZlMZ@()ig*t?zIRwjP2$vj+R&Q|mq)E1VjH8o#`S_(Vu_7#~Huu6_?e9Q4N~ zQVxmt(8LafRoLN1b$3FhZib$h7j9TxYwENA`xv5m#X-91vYF=g3zp$)w}3c0DiK~cfVW+$h=7x@pO=c ze-zf9!;hBGla%x%MCvJf*qb=%JbO`FvXoK~19}MX0WP!x+(L&v2K=bIU$LdwiV^_} zmm*d|(B`p?ZGuVmiz2Oy#4*n<7h6D_^nBhcRec&YCWQV|s#p9>$qpI?Ux)7)n_-I* zBaPc9^}!F5SrJml_O%3Qv;uQkRdLBx9ZeuyuFT=`-gp&3#+6O(WiU_>h+}b_pvWe8 z4Opl&Zx}=mBVcVC*w6p;P{viPkQyuQVLDZrDq)si0`E>9xttPNHfDVLov`KGlJ0}_ zM9l)Y{a4EK@2e4P2&)Or{uyQ~wmr-+rZbI{Z$AaJ-bjdZ|KQdsKr*SJrBf`5K&3mb0@Dmu$#HW%_@vq1;9nna>p-~fsapl}vNqK1x7XaYm8ny-6I&8Y(& z7Xd=5hM-W%JE zcp}+5R+PdCeSALDn5e|TjjD}THS0C$On!|puBka{ew4c81rJ8DyuXf*WnjV6_v!fb zp`Wt{C>T1(KdSpnx%pXj|F^x+;C~0c6kDIw=zoml=}~{urhi}QrC9kK4E{0gr@--R zrI%9e@9>xM+w;KdA2WTruD{^_(l>v{zZ|9g`|;CH8TS|drDXRz{N+sM-;WnV_zV88 z>D%x4m%Zq768gt@p4yGSw*U7W=XdnWzUANOkf+W3Lci!#bFCNBjE_56wmPk$Uw7t5LG`M>`G@?SrE literal 0 HcmV?d00001 diff --git a/templates/invoice/renderer/invoice.html.twig b/templates/invoice/renderer/default.html.twig similarity index 94% rename from templates/invoice/renderer/invoice.html.twig rename to templates/invoice/renderer/default.html.twig index ae937c02..ae6b8ba5 100644 --- a/templates/invoice/renderer/invoice.html.twig +++ b/templates/invoice/renderer/default.html.twig @@ -1,3 +1,6 @@ +{% extends 'invoice/layout.html.twig' %} + +{% block invoice %}
- -
-
- -
-
+{% endblock %} \ No newline at end of file diff --git a/templates/invoice/renderer/export.csv b/templates/invoice/renderer/export.csv new file mode 100644 index 00000000..47cb5ccd --- /dev/null +++ b/templates/invoice/renderer/export.csv @@ -0,0 +1,2 @@ +start_date,start_timestamp,end_date,end_timestamp,duration,username,description,rate,amount,total +${entry.begin},${entry.begin_timestamp},${entry.end},${entry.end_timestamp},${entry.duration},${entry.user_name},${entry.description},${entry.rate},${entry.amount},${entry.total} diff --git a/templates/invoice/renderer/freelancer.html.twig b/templates/invoice/renderer/freelancer.html.twig index 7f20d0b2..1c981bf7 100644 --- a/templates/invoice/renderer/freelancer.html.twig +++ b/templates/invoice/renderer/freelancer.html.twig @@ -1,5 +1,10 @@ {% import "macros/widgets.html.twig" as widgets %} -{# You can overrwite these settings in your config/packages.local.yaml under the key "twig.globals.company" #} + +{% extends 'invoice/layout.html.twig' %} + +{% block invoice %} + +{# You can overwrite these settings in your config/packages.local.yaml under the key "twig.globals.company" #} {% set company = company|default({ name: 'Kimai Inc.', homepage: 'www.kimai.org', @@ -137,11 +142,4 @@ - -
-
- -
-
+{% endblock %} \ No newline at end of file diff --git a/templates/invoice/renderer/open-spreadsheet.ods b/templates/invoice/renderer/open-spreadsheet.ods new file mode 100644 index 0000000000000000000000000000000000000000..fd1d3912a9f0182ef66a230af6b3ebc5d9c186a3 GIT binary patch literal 18571 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 !N0wSZ-zk4RS4 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 literal 0 HcmV?d00001 diff --git a/templates/invoice/renderer/spreadsheet.xlsx b/templates/invoice/renderer/spreadsheet.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..795a1b6545e217d94c4b0cf77c42a0f63d79b68e GIT binary patch literal 5685 zcmaJ_1yG!662)C6NN@-a!JVMN3GVJNxDW0Q!QE}qAb}8qJHg%EA-D$jgWbCem%82l zYwWM-p8EQA_q={`l8{gsU~q77U@}##(qJzP@#(#;Jz&wId)hAk_ixe61M0pwE%Qh~wz#?hmI?ln)#A!RvI8Lnw6-&G$Va2?i;$v=CDWzb2$kT=fTS-)d!oV48#)l8??%^DbE4@ksYDrA8eho{3o9yT zn@+Zl zQkwFE$w|V(85jH2tUMi?8v^X<^WP-~@bnEM8$&sJ8(R>AzO602iyl zTgaZC^(<$lf`xRRd?n&HNga+Qad zeaJK>6QB!Ma?_2wyf9OV>3|(U6V0ulFgY_CUpP@Up{>szp^VA)ltv+*VawOSw}r^+ zs)&qhtA!V&UCd0?mxCaRxJs3S0#!|fK0<{yu@PUMA4c#vb^b!2|_uS${?h&r8+lW+C6A6ezVEkSsluo#?uz)sY&e#P|~O z!xab=?o*Q(>fj>?{RJ>cgzr0!pg z5_R*mC>z<2P0f*E$km2%sMBmSVvuuWsH!|5F)Mu)sl>`G6qy`GFqBvxdJ(eiuyw`} zqTz$WtAm;e33}TUjz<-2q-Sy9Wc~<1z|g>je#LA4N(wm4x1Ed*B)2PHEp>P!cAk`w z`^79ZJHt>B;9+cc7qNOXl zZwTKvm}S;VYT_TQJQ%oFK z8zbU73kug}}<~K)X2u zJX}Xzb3CI%2?cP}eL`mbAIlr#2^|+p29T+~JWsRU2G843r4(PxnFnWeH9L^Wns)pJomVK={Z@bKnc#3-H)`!niQ1$j^&6Trj8j8>n%>KE##C6w)VvlGo1V^1g4owss&Mq^W31PfN?+`X>&7%f(D25 z19$>jmT%@;Y!n^(L%o1m(vu)2S0K@_sS}U+?f2-bkqp1%>3yEQlgpEc&>KM&h6<=8 zgas*hwX(O$$4%k=ZIi$*9x|-S-WId|yA3SEPl87f-#?xCB#WZ7Ls}DG5;QB_n4xWogZKg!#SJ61Y*k=NEA- zx**-W2<{}R`o8_=NeKVjk}$wOYjm)gz&JzD9hP43aO^>0{}3 zUaW{CRhUT#X1Ty6V*MZmC6bA_k4I)~?0i^?K`l^4klA-u71w_s3W)z* z?IXKOMCYYKL>RXlVvzBS`at^4k4{>O);E;~Oz8s$prie;Ey)nUJE7xD=R>;8v3rC7 zYnBc?@4l;#F;}4&*rk3}7V8}Kx?}rjW8f)AD0g8vR>az-V%tU8l_Q$vw}Kfh|n8Jk5mH*pB*2GKuaIM0p=>9DxZ+7|bo?vFIf#`kHX1 z+zX#h>VtN*!yZc|*9asiw4IOA)=DQfe9fopd7;a;us0ia4b16;`HLlyxMCG0+W9D>ebkq49Oq_c#ljVoXXM;sJ1UeGL~Z&0K8S#fQ-eW2X_|bQ8grUmP@=bKY@}9u-jL>@BaG&HFN@l&){$5swm00Zjb8vASG^P8Q zLTV=Mj6%w0M=P1Jsq=Ky=VWm!IRSn=tvgF9d1=Ypto^KD!UVmb=9M>-zE1H`QA^B|b2hzi|8ozrKv%aABtwHk-636+N~IDSv;Tl!kDVq2 zn`@(PIGU+PO)C2hK&81Rs5kY_?T`_jYz#KNnCKL<0vUWw>ipfxH$HeV$J6y=D$}Al zMN)ptN4>*EMew*m*4X0BzBU2DqHP{-D+W_d4f3~4nsJm`1Y3L7!TVZd0d~ahxYP4@ zgsLX$lN`mUV}pkCieKn^?a{}zLF0Dhr{~2q`|A{x=Whty{PFWAeKdO#1;Mh$#cltcGHpSK7FlH zc=y#HmQ1ctkm?ckL&P;jB>y1_jTcj{o!0r+*GFjV+|_HmBH@G?z^y zL;0tRlX}+7mB4v*wTDcG+M*oPi>|Zifhx3)-X(WaL&h>33NDtn$zhLwvS0d|9m9Dj zFfc^SfBNe{{x>~vaJ2;f$qNqD<)hL#0bVV-zIR@M0kn8;1*@bJ#+%ZM_f(3N&fCC+ zN^$XU3Z-xMhPwjZug&U=XVTLIP9pHE+iae0Rp>YMmS}f2G6=IP9Yd!!!bOX@P}ukN zL%TiJ-grhfit1+?QgEtg^O}v6oYmyXyNfPa!O3Svwx&VPQ7N~a-BZj*BXBSXOV?gt z2&$;<6wuxmBtmUPfGZDV!3b=qCfmnTcxZlpJL!@#W1nw!MlrnfFi^#mN<18-8LFjt z?QcuMB;=KPrR~E?4aMJ8CpHyLG01U*Xv`(9R}a#9HSZNYAxdQ{GP{IZ*cEN{#qw;M zwp7|cNE^Ud%X~G*6~BPCejC-<3xz%w_ruLsrKD90wS{W9m$SNhc6$!E?knxhrSHyi zE`qbSXAxRTENxzj5#y1Mr*nB%TkaTR-(+r?T)phkoSPy7_oZ}FPM@#VH)RQvDtMeY&VQHV? zuH4|q=pKdT+AibN&1tmS&gif`BDBgY^W955P;G}Y+Zw{vsnHfKfEAV0iHVD}$(JKj zJcyi39fu;~a>FCu;UJik(wjX182c--vQTjAY*2qy^hOM{!Wi5s={V12zaUY_toc|~ zJ}chG&mW3;u&7Z`U%1K?<4JMtyAiaB%eB386pEhjmn#z|>A35XiNMB+n!pv`c1q0B z6a(I))mUw9^q-5Km<6$XNBUiw7G~P4az%;`dfJsY#X2hg@WkKGk}fnMUMBWP4GW-t6a%=YJ7ZLGznXMrapaC=Xegka?ysyIQ)yR> zYFZ$KLx-_svPn-vqBLx^S;GV`~S&R}?{&gjGS!V%=`f zxQx?jm_5GxX2CUku7WSAdmqqelgKn7Kp($> z7iQfU5ER{ADmnwn#EAb!cBZ-TF7AGwe}C`cq$PKU|CtsY($O(CK!Sl85d2fuqyC~r z|DlQzioMqJjDV&~8mJ{JIvsPoL`c=hXs|^$kovY%ysV18*(Kx4U?!sCus-_(Cf_(?k@h!8{`{z zI~sKd8mbVpBQDptLbKHfE&Ak$7fBDsNL8L%8Tw#VL$qq#$OEMAQxQA40s^mzkhBv? zf+L1d*{Js4BZ)_LEUDyFSXR*n1{9VNM{x|A=%612^rv5!sLts|B%OG8n=150s`utY zn|~WCWSDjCiQ!sPU@l*QTjjyNr1pMqnkV&EXlUw$Y{kgCTXURv$&6Izn;?Bn-Katr z(%`B_L`Y80Bj#+izuQL2LB^KJ9|)eIIG?wFZhF~Io5<^lAf`teuP-^n8mQ_I7_age z5dPf%gFtD30-Tp7uwpxu6GJ8g-*>m_HQPqZPR~IpKkpBiU7a90Wv(N{;(Z4{3@!v3 z<`3b6f^w}3STRET`kxllHyHp(KPYdqLj-5+ndQ93pan|d4{*J;hbEVNgk{Kr1pw7w zY`dafFS;tnPB=VDN-G$_aNToKGacy(4|p|ZiH;kwN5G77;Ul*nJ277|;>yD8Sf!4w z#7Z;EddHUH@A`Rt5L?dq!)61#?;udc{gABMDc+-R_kn<=MYUrW>$zsaTv!e+pOy^k zr@Hz3H6Q({W;BIttQ~;X4!TONwm^{fpDa4QU*{hXR$E z`Y?N=pThXk!ehx^Ugqn(m5yKpymOhnpBPdl1~7vQRhpAT3&&MXySXGh=j$MRmHq0P zi66@(`1_p+b+;pxM(*vzZ{QO=tF=wB(Sx;7QCfx&?$Q~Ib0B_gGPBMBO)PBO@paHq z>+Dx0h!Mjgc|qbTI)P0Tx;8QBt%|_&WB04(={&x;T5GjWb+Fg?yk29g!vwHfzWs8L z!iys|OO(4aWmn&CI@7AclzO~N@!H^LU*oH}hr1EBCp{L4bVx%s*<`cv8baLuaar%l zQ?%K)f93C2#oyOU`3#R2VDDb%2_9AGXL!INFu;B(d@m)gXNB*7?Sk~=UD;! zWjIei^}8PSyZ1}!;aUFqWg1WG*nhqMBL@BM{&K5*)+c`1)l&)nKegib2rsw4=k52G zEj(rEDZ=0E!oSCPNs^v-#b0&-^Jkp@yE*kpIC{xSiy|J$r`lF(1b0t178y7-@vTKUuKU&E2Sz5oCK literal 0 HcmV?d00001 diff --git a/templates/invoice/renderer/timesheet.html.twig b/templates/invoice/renderer/timesheet.html.twig index 3e39b2c7..b462990c 100644 --- a/templates/invoice/renderer/timesheet.html.twig +++ b/templates/invoice/renderer/timesheet.html.twig @@ -1,5 +1,7 @@ {% import "macros/widgets.html.twig" as widgets %} +{% extends 'invoice/layout.html.twig' %} +{% block invoice %}
- -
-
- -
-
+{% endblock %} \ No newline at end of file diff --git a/templates/invoice/templates.html.twig b/templates/invoice/templates.html.twig index 7729905f..44931d95 100644 --- a/templates/invoice/templates.html.twig +++ b/templates/invoice/templates.html.twig @@ -16,7 +16,6 @@ 'title': '', 'due_days': 'hidden-xs', 'vat': 'hidden-xs', - 'invoice_renderer': 'hidden-xs', 'actions': 'alwaysVisible', }) }} @@ -26,7 +25,6 @@ {{ entry.title }} {{ entry.dueDays }} {{ entry.vat }} - {{ "invoice_renderer.#{entry.renderer}"|trans }} {% set actionButtons = {'edit': path('admin_invoice_template_edit', {'id' : entry.id, 'page': page})} %} {% set actionButtons = actionButtons|merge({'trash': path('admin_invoice_template_delete', {'id' : entry.id, 'page': page})}) %} diff --git a/templates/timesheet/index.html.twig b/templates/timesheet/index.html.twig index e5b98f1a..edb75f87 100644 --- a/templates/timesheet/index.html.twig +++ b/templates/timesheet/index.html.twig @@ -58,7 +58,7 @@ {% endif %} {{ widgets.label_activity(entry.activity) }} - {{ entry.description|default('')|desc2html }} + {{ entry.description|desc2html }} {% set actionButtons = {'edit': path('timesheet_edit', {'id' : entry.id, 'page': page})} %} diff --git a/tests/Command/CreateUserCommandTest.php b/tests/Command/CreateUserCommandTest.php index d0a38f94..51af3d38 100644 --- a/tests/Command/CreateUserCommandTest.php +++ b/tests/Command/CreateUserCommandTest.php @@ -7,7 +7,7 @@ * file that was distributed with this source code. */ -namespace App\Tests\Twig; +namespace App\Tests\Command; use App\Command\CreateUserCommand; use App\Entity\User; diff --git a/tests/Controller/ActivityControllerTest.php b/tests/Controller/ActivityControllerTest.php index 6d406b44..dd851e93 100644 --- a/tests/Controller/ActivityControllerTest.php +++ b/tests/Controller/ActivityControllerTest.php @@ -9,8 +9,6 @@ namespace App\Tests\Controller; -use App\Entity\Activity; -use App\Entity\Timesheet; use App\Entity\User; use App\Tests\DataFixtures\TimesheetFixtures; diff --git a/tests/Controller/InvoiceControllerTest.php b/tests/Controller/InvoiceControllerTest.php index fbe990cd..a3deee56 100644 --- a/tests/Controller/InvoiceControllerTest.php +++ b/tests/Controller/InvoiceControllerTest.php @@ -12,6 +12,7 @@ namespace App\Tests\Controller; use App\Entity\InvoiceTemplate; use App\Entity\User; use App\Tests\DataFixtures\InvoiceFixtures; +use App\Tests\DataFixtures\TimesheetFixtures; /** * @coversDefaultClass \App\Controller\InvoiceController @@ -46,7 +47,7 @@ class InvoiceControllerTest extends ControllerBaseTest $node = $client->getCrawler()->filter('div.callout.callout-warning.lead'); $this->assertNotEmpty($node->text()); - $this->assertContains('Before you can create an invoice, you have to select at least a customer filter.', $node->text()); + $this->assertContains('No invoice entries were found based on your selected filters.', $node->text()); } public function testListTemplateAction() @@ -84,10 +85,88 @@ class InvoiceControllerTest extends ControllerBaseTest $this->assertIsRedirect($client, $this->createUrl('/invoice/template')); $client->followRedirect(); $this->assertTrue($client->getResponse()->isSuccessful()); - $this->assertHasFlashSuccess($client); } + public function testPrintAction() + { + $client = $this->getClientForAuthenticatedUser(User::ROLE_TEAMLEAD); + $em = $client->getContainer()->get('doctrine.orm.entity_manager'); + + $fixture = new InvoiceFixtures(); + $this->importFixture($em, $fixture); + + $begin = new \DateTime('first day of this month'); + $end = new \DateTime('last day of this month'); + $fixture = new TimesheetFixtures(); + $fixture + ->setUser($this->getUserByRole($em, User::ROLE_TEAMLEAD)) + ->setAmount(20) + ->setStartDate($begin) + ; + $this->importFixture($em, $fixture); + + $this->request($client, '/invoice/'); + $this->assertTrue($client->getResponse()->isSuccessful()); + + $form = $client->getCrawler()->filter('#invoice-print-form')->form(); + $client->submit($form, [ + 'template' => 1, + 'user' => '', + 'begin' => $begin->format('Y-m-d'), + 'end' => $end->format('Y-m-d'), + 'customer' => 1, + ]); + + $this->assertTrue($client->getResponse()->isSuccessful()); + + $node = $client->getCrawler()->filter('div.callout.callout-warning.lead'); + $this->assertEquals(0, $node->count()); + + $node = $client->getCrawler()->filter('div.callout.callout-success.lead'); + $this->assertNotEmpty($node->text()); + $this->assertContains('This is a preview of the data that will show up in your invoice document.', $node->text()); + + $node = $client->getCrawler()->filter('section.invoice div.table-responsive table.table-striped tbody tr'); + $this->assertEquals(20, $node->count()); + + $form = $client->getCrawler()->filter('#invoice-print-form')->form(); + $form->getFormNode()->setAttribute('action', $this->createUrl('/invoice/print')); + $client->submit($form, [ + 'template' => 1, + 'user' => '', + 'begin' => $begin->format('Y-m-d'), + 'end' => $end->format('Y-m-d'), + 'customer' => 1, + 'project' => 1, + ]); + + $this->assertTrue($client->getResponse()->isSuccessful()); + $node = $client->getCrawler()->filter('body'); + $this->assertEquals(1, $node->count()); + $this->assertEquals('invoice_print', $node->getIterator()[0]->getAttribute('class')); + } + + public function testPrintActionRedirectsToCreateTemplate() + { + $client = $this->getClientForAuthenticatedUser(User::ROLE_TEAMLEAD); + + $this->request($client, '/invoice/print'); + $this->assertIsRedirect($client, '/invoice/template/create'); + } + + public function testPrintActionRedirectsToIndex() + { + $client = $this->getClientForAuthenticatedUser(User::ROLE_TEAMLEAD); + $em = $client->getContainer()->get('doctrine.orm.entity_manager'); + + $fixture = new InvoiceFixtures(); + $this->importFixture($em, $fixture); + + $this->request($client, '/invoice/print'); + $this->assertIsRedirect($client, '/invoice/'); + } + public function testEditTemplateAction() { $client = $this->getClientForAuthenticatedUser(User::ROLE_TEAMLEAD); diff --git a/tests/Controller/SidebarControllerTest.php b/tests/Controller/SidebarControllerTest.php index a658f0e9..3a49a511 100644 --- a/tests/Controller/SidebarControllerTest.php +++ b/tests/Controller/SidebarControllerTest.php @@ -30,7 +30,7 @@ class SidebarControllerTest extends ControllerBaseTest $content = $client->getResponse()->getContent(); $this->assertContains('