From b7c7a5f60d677726bb12a2b038f38a2325939557 Mon Sep 17 00:00:00 2001 From: captainbeer Date: Mon, 22 Oct 2018 16:42:06 +0300 Subject: [PATCH] first commit --- .env.testing | 24 ++++++++++++++++++++++++ .gitignore | 14 ++++++++++++++ .htaccess | 38 ++++++++++++++++++++++++++++++++++++++ Dockerfile | 23 +++++++++++++++++++++++ LICENSE.txt | 674 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Console/Commands/BillReminder.php | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Console/Commands/CompanySeed.php | 47 +++++++++++++++++++++++++++++++++++++++++++++++ app/Console/Commands/Install.php | 232 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Console/Commands/InvoiceReminder.php | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Console/Commands/ModuleDisable.php | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Console/Commands/ModuleEnable.php | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Console/Commands/ModuleInstall.php | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Console/Commands/RecurringCheck.php | 192 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Console/Kernel.php | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Console/Stubs/Modules/command.stub | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Console/Stubs/Modules/composer.stub | 15 +++++++++++++++ app/Console/Stubs/Modules/controller-plain.stub | 9 +++++++++ app/Console/Stubs/Modules/controller.stub | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Console/Stubs/Modules/event.stub | 30 ++++++++++++++++++++++++++++++ app/Console/Stubs/Modules/job.stub | 33 +++++++++++++++++++++++++++++++++ app/Console/Stubs/Modules/json.stub | 19 +++++++++++++++++++ app/Console/Stubs/Modules/listener.stub | 31 +++++++++++++++++++++++++++++++ app/Console/Stubs/Modules/mail.stub | 33 +++++++++++++++++++++++++++++++++ app/Console/Stubs/Modules/middleware.stub | 21 +++++++++++++++++++++ app/Console/Stubs/Modules/migration/add.stub | 32 ++++++++++++++++++++++++++++++++ app/Console/Stubs/Modules/migration/create.stub | 32 ++++++++++++++++++++++++++++++++ app/Console/Stubs/Modules/migration/delete.stub | 32 ++++++++++++++++++++++++++++++++ app/Console/Stubs/Modules/migration/drop.stub | 32 ++++++++++++++++++++++++++++++++ app/Console/Stubs/Modules/migration/plain.stub | 28 ++++++++++++++++++++++++++++ app/Console/Stubs/Modules/model.stub | 10 ++++++++++ app/Console/Stubs/Modules/notification.stub | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Console/Stubs/Modules/provider.stub | 35 +++++++++++++++++++++++++++++++++++ app/Console/Stubs/Modules/request.stub | 30 ++++++++++++++++++++++++++++++ app/Console/Stubs/Modules/route-provider.stub | 41 +++++++++++++++++++++++++++++++++++++++++ app/Console/Stubs/Modules/routes.stub | 6 ++++++ app/Console/Stubs/Modules/scaffold/config.stub | 7 +++++++ app/Console/Stubs/Modules/scaffold/provider.stub | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Console/Stubs/Modules/seeder.stub | 21 +++++++++++++++++++++ app/Console/Stubs/Modules/start.stub | 17 +++++++++++++++++ app/Console/Stubs/Modules/views/index.stub | 9 +++++++++ app/Console/Stubs/Modules/views/master.stub | 12 ++++++++++++ app/Events/AdminMenuCreated.php | 18 ++++++++++++++++++ app/Events/BillCreated.php | 18 ++++++++++++++++++ app/Events/BillUpdated.php | 18 ++++++++++++++++++ app/Events/CompanySwitched.php | 18 ++++++++++++++++++ app/Events/CustomerMenuCreated.php | 18 ++++++++++++++++++ app/Events/InvoiceCreated.php | 18 ++++++++++++++++++ app/Events/InvoicePaid.php | 21 +++++++++++++++++++++ app/Events/InvoicePrinting.php | 18 ++++++++++++++++++ app/Events/InvoiceUpdated.php | 18 ++++++++++++++++++ app/Events/ModuleInstalled.php | 22 ++++++++++++++++++++++ app/Events/PaymentGatewayListing.php | 18 ++++++++++++++++++ app/Events/UpdateFinished.php | 26 ++++++++++++++++++++++++++ app/Exceptions/Handler.php | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Filters/Auth/Permissions.php | 21 +++++++++++++++++++++ app/Filters/Auth/Roles.php | 21 +++++++++++++++++++++ app/Filters/Auth/Users.php | 26 ++++++++++++++++++++++++++ app/Filters/Banking/Accounts.php | 21 +++++++++++++++++++++ app/Filters/Banking/Transactions.php | 31 +++++++++++++++++++++++++++++++ app/Filters/Banking/Transfers.php | 26 ++++++++++++++++++++++++++ app/Filters/Common/Companies.php | 21 +++++++++++++++++++++ app/Filters/Common/Items.php | 26 ++++++++++++++++++++++++++ app/Filters/Customers/Invoices.php | 26 ++++++++++++++++++++++++++ app/Filters/Customers/Payments.php | 31 +++++++++++++++++++++++++++++++ app/Filters/Customers/Transactions.php | 21 +++++++++++++++++++++ app/Filters/Expenses/Bills.php | 31 +++++++++++++++++++++++++++++++ app/Filters/Expenses/Payments.php | 36 ++++++++++++++++++++++++++++++++++++ app/Filters/Expenses/Vendors.php | 21 +++++++++++++++++++++ app/Filters/Incomes/Customers.php | 21 +++++++++++++++++++++ app/Filters/Incomes/Invoices.php | 31 +++++++++++++++++++++++++++++++ app/Filters/Incomes/Revenues.php | 36 ++++++++++++++++++++++++++++++++++++ app/Filters/Settings/Categories.php | 26 ++++++++++++++++++++++++++ app/Filters/Settings/Currencies.php | 21 +++++++++++++++++++++ app/Filters/Settings/Taxes.php | 21 +++++++++++++++++++++ app/Http/Controllers/Api/Auth/Permissions.php | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Api/Auth/Roles.php | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Api/Auth/Users.php | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Api/Banking/Accounts.php | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Api/Banking/Transfers.php | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Api/Common/Companies.php | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Api/Common/Items.php | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Api/Common/Ping.php | 25 +++++++++++++++++++++++++ app/Http/Controllers/Api/Expenses/Bills.php | 204 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Api/Expenses/Payments.php | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Api/Expenses/Vendors.php | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Api/Incomes/Customers.php | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Api/Incomes/InvoicePayments.php | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Api/Incomes/Invoices.php | 360 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Api/Incomes/Revenues.php | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Api/Settings/Categories.php | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Api/Settings/Currencies.php | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Api/Settings/Settings.php | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Api/Settings/Taxes.php | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/ApiController.php | 25 +++++++++++++++++++++++++ app/Http/Controllers/Auth/Forgot.php | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Auth/Login.php | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Auth/Permissions.php | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Auth/Reset.php | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Auth/Roles.php | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Auth/Users.php | 319 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Banking/Accounts.php | 255 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Banking/Transactions.php | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Banking/Transfers.php | 346 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Common/Companies.php | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Common/Dashboard.php | 439 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Common/Import.php | 22 ++++++++++++++++++++++ app/Http/Controllers/Common/Items.php | 399 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Common/Search.php | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Common/Uploads.php | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Controller.php | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Customers/Dashboard.php | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Customers/Invoices.php | 181 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Customers/Payments.php | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Customers/Profile.php | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Customers/Transactions.php | 24 ++++++++++++++++++++++++ app/Http/Controllers/Expenses/Bills.php | 854 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Expenses/Payments.php | 238 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Expenses/Vendors.php | 363 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Incomes/Customers.php | 430 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Incomes/Invoices.php | 991 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Incomes/Revenues.php | 240 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Install/Database.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Install/Language.php | 35 +++++++++++++++++++++++++++++++++++ app/Http/Controllers/Install/Requirements.php | 36 ++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Install/Settings.php | 42 ++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Install/Updates.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Modals/BillPayments.php | 250 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Modals/Categories.php | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Modals/Customers.php | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Modals/InvoicePayments.php | 250 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Modals/Vendors.php | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Modules/Home.php | 36 ++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Modules/Item.php | 305 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Modules/My.php | 29 +++++++++++++++++++++++++++++ app/Http/Controllers/Modules/Tiles.php | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Modules/Token.php | 37 +++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Reports/ExpenseSummary.php | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Reports/IncomeExpenseSummary.php | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Reports/IncomeSummary.php | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Reports/ProfitLoss.php | 195 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Reports/TaxSummary.php | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Settings/Categories.php | 235 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Settings/Currencies.php | 299 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Settings/Modules.php | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Settings/Settings.php | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Controllers/Settings/Taxes.php | 188 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Kernel.php | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Middleware/AddXHeader.php | 27 +++++++++++++++++++++++++++ app/Http/Middleware/AdminMenu.php | 207 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Middleware/ApiCompany.php | 40 ++++++++++++++++++++++++++++++++++++++++ app/Http/Middleware/CanInstall.php | 26 ++++++++++++++++++++++++++ app/Http/Middleware/CustomerMenu.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Middleware/DateFormat.php | 37 +++++++++++++++++++++++++++++++++++++ app/Http/Middleware/EncryptCookies.php | 17 +++++++++++++++++ app/Http/Middleware/LoadCurrencies.php | 29 +++++++++++++++++++++++++++++ app/Http/Middleware/LoadSettings.php | 30 ++++++++++++++++++++++++++++++ app/Http/Middleware/Money.php | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Middleware/RedirectIfAuthenticated.php | 30 ++++++++++++++++++++++++++++++ app/Http/Middleware/RedirectIfNotInstalled.php | 32 ++++++++++++++++++++++++++++++++ app/Http/Middleware/TrimStrings.php | 18 ++++++++++++++++++ app/Http/Middleware/VerifyCsrfToken.php | 17 +++++++++++++++++ app/Http/Requests/Auth/Permission.php | 38 ++++++++++++++++++++++++++++++++++++++ app/Http/Requests/Auth/Role.php | 39 +++++++++++++++++++++++++++++++++++++++ app/Http/Requests/Auth/User.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ app/Http/Requests/Banking/Account.php | 34 ++++++++++++++++++++++++++++++++++ app/Http/Requests/Banking/Transfer.php | 34 ++++++++++++++++++++++++++++++++++ app/Http/Requests/Common/Company.php | 34 ++++++++++++++++++++++++++++++++++ app/Http/Requests/Common/Item.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Requests/Common/TotalItem.php | 42 ++++++++++++++++++++++++++++++++++++++++++ app/Http/Requests/Customer/InvoiceConfirm.php | 30 ++++++++++++++++++++++++++++++ app/Http/Requests/Customer/InvoicePayment.php | 30 ++++++++++++++++++++++++++++++ app/Http/Requests/Customer/Profile.php | 35 +++++++++++++++++++++++++++++++++++ app/Http/Requests/Expense/Bill.php | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Requests/Expense/BillHistory.php | 32 ++++++++++++++++++++++++++++++++ app/Http/Requests/Expense/BillItem.php | 37 +++++++++++++++++++++++++++++++++++++ app/Http/Requests/Expense/BillPayment.php | 45 +++++++++++++++++++++++++++++++++++++++++++++ app/Http/Requests/Expense/BillTotal.php | 33 +++++++++++++++++++++++++++++++++ app/Http/Requests/Expense/Payment.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Requests/Expense/Vendor.php | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Requests/Income/Customer.php | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Requests/Income/Invoice.php | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Requests/Income/InvoiceHistory.php | 32 ++++++++++++++++++++++++++++++++ app/Http/Requests/Income/InvoiceItem.php | 36 ++++++++++++++++++++++++++++++++++++ app/Http/Requests/Income/InvoicePayment.php | 45 +++++++++++++++++++++++++++++++++++++++++++++ app/Http/Requests/Income/InvoiceTotal.php | 33 +++++++++++++++++++++++++++++++++ app/Http/Requests/Income/Revenue.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Requests/Install/Database.php | 32 ++++++++++++++++++++++++++++++++ app/Http/Requests/Install/Setting.php | 33 +++++++++++++++++++++++++++++++++ app/Http/Requests/Module/Module.php | 47 +++++++++++++++++++++++++++++++++++++++++++++++ app/Http/Requests/Request.php | 28 ++++++++++++++++++++++++++++ app/Http/Requests/Setting/Category.php | 32 ++++++++++++++++++++++++++++++++ app/Http/Requests/Setting/Currency.php | 45 +++++++++++++++++++++++++++++++++++++++++++++ app/Http/Requests/Setting/Setting.php | 32 ++++++++++++++++++++++++++++++++ app/Http/Requests/Setting/Tax.php | 31 +++++++++++++++++++++++++++++++ app/Http/ViewComposers/All.php | 26 ++++++++++++++++++++++++++ app/Http/ViewComposers/Header.php | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/ViewComposers/Index.php | 33 +++++++++++++++++++++++++++++++++ app/Http/ViewComposers/Logo.php | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Http/ViewComposers/Menu.php | 33 +++++++++++++++++++++++++++++++++ app/Http/ViewComposers/Modules.php | 35 +++++++++++++++++++++++++++++++++++ app/Http/ViewComposers/Recurring.php | 36 ++++++++++++++++++++++++++++++++++++ app/Http/ViewComposers/Suggestions.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Listeners/Auth/Login.php | 39 +++++++++++++++++++++++++++++++++++++++ app/Listeners/Auth/Logout.php | 20 ++++++++++++++++++++ app/Listeners/Incomes/Invoice/Paid.php | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Listeners/Updates/Listener.php | 31 +++++++++++++++++++++++++++++++ app/Listeners/Updates/Version106.php | 30 ++++++++++++++++++++++++++++++ app/Listeners/Updates/Version107.php | 31 +++++++++++++++++++++++++++++++ app/Listeners/Updates/Version108.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Listeners/Updates/Version109.php | 36 ++++++++++++++++++++++++++++++++++++ app/Listeners/Updates/Version110.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ app/Listeners/Updates/Version112.php | 43 +++++++++++++++++++++++++++++++++++++++++++ app/Listeners/Updates/Version113.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ app/Listeners/Updates/Version119.php | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Listeners/Updates/Version120.php | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Listeners/Updates/Version1210.php | 30 ++++++++++++++++++++++++++++++ app/Listeners/Updates/Version1211.php | 30 ++++++++++++++++++++++++++++++ app/Listeners/Updates/Version126.php | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Listeners/Updates/Version127.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ app/Listeners/Updates/Version129.php | 30 ++++++++++++++++++++++++++++++ app/Models/Auth/Permission.php | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Auth/Role.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Auth/User.php | 193 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Banking/Account.php | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Banking/Transaction.php | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Banking/Transfer.php | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Common/Company.php | 260 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Common/Item.php | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Common/Media.php | 14 ++++++++++++++ app/Models/Common/Recurring.php | 29 +++++++++++++++++++++++++++++ app/Models/Company/Company.php | 8 ++++++++ app/Models/Expense/Bill.php | 197 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Expense/BillHistory.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Expense/BillItem.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Expense/BillPayment.php | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Expense/BillStatus.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Expense/BillTotal.php | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Expense/Payment.php | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Expense/Vendor.php | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Income/Customer.php | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Income/Invoice.php | 199 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Income/InvoiceHistory.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Income/InvoiceItem.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Income/InvoicePayment.php | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Income/InvoiceStatus.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Income/InvoiceTotal.php | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Income/Revenue.php | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Item/Item.php | 8 ++++++++ app/Models/Model.php | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Module/Module.php | 32 ++++++++++++++++++++++++++++++++ app/Models/Module/ModuleHistory.php | 18 ++++++++++++++++++ app/Models/Setting/Category.php | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Setting/Currency.php | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Setting/Setting.php | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Models/Setting/Tax.php | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Notifications/Auth/Reset.php | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Notifications/Common/Item.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Notifications/Expense/Bill.php | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Notifications/Income/Invoice.php | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Observers/Company.php | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Overrides/Illuminate/MessageSelector.php | 254 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Providers/AppServiceProvider.php | 36 ++++++++++++++++++++++++++++++++++++ app/Providers/AuthServiceProvider.php | 30 ++++++++++++++++++++++++++++++ app/Providers/BroadcastServiceProvider.php | 21 +++++++++++++++++++++ app/Providers/EventServiceProvider.php | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Providers/FormServiceProvider.php | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Providers/ObserverServiceProvider.php | 30 ++++++++++++++++++++++++++++++ app/Providers/RouteServiceProvider.php | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Providers/ValidationServiceProvider.php | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Providers/ViewComposerServiceProvider.php | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Scopes/Company.php | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Traits/Currencies.php | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Traits/DateTime.php | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Traits/Incomes.php | 34 ++++++++++++++++++++++++++++++++++ app/Traits/Media.php | 37 +++++++++++++++++++++++++++++++++++++ app/Traits/Modules.php | 438 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Traits/Recurring.php | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Traits/SiteApi.php | 36 ++++++++++++++++++++++++++++++++++++ app/Traits/Uploads.php | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ app/Transformers/Auth/Permission.php | 24 ++++++++++++++++++++++++ app/Transformers/Auth/Role.php | 38 ++++++++++++++++++++++++++++++++++++++ app/Transformers/Auth/User.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ app/Transformers/Banking/Account.php | 32 ++++++++++++++++++++++++++++++++ app/Transformers/Banking/Transfer.php | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ app/Transformers/Common/Company.php | 33 +++++++++++++++++++++++++++++++++ app/Transformers/Common/Item.php | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Transformers/Company/Company.php | 8 ++++++++ app/Transformers/Expense/Bill.php | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Transformers/Expense/BillHistories.php | 27 +++++++++++++++++++++++++++ app/Transformers/Expense/BillItems.php | 32 ++++++++++++++++++++++++++++++++ app/Transformers/Expense/BillPayments.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Transformers/Expense/BillStatus.php | 25 +++++++++++++++++++++++++ app/Transformers/Expense/BillTotals.php | 29 +++++++++++++++++++++++++++++ app/Transformers/Expense/Payment.php | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Transformers/Expense/Vendor.php | 32 ++++++++++++++++++++++++++++++++ app/Transformers/Income/Customer.php | 32 ++++++++++++++++++++++++++++++++ app/Transformers/Income/Invoice.php | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Transformers/Income/InvoiceHistories.php | 27 +++++++++++++++++++++++++++ app/Transformers/Income/InvoiceItems.php | 32 ++++++++++++++++++++++++++++++++ app/Transformers/Income/InvoicePayments.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Transformers/Income/InvoiceStatus.php | 25 +++++++++++++++++++++++++ app/Transformers/Income/InvoiceTotals.php | 29 +++++++++++++++++++++++++++++ app/Transformers/Income/Revenue.php | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Transformers/Item/Item.php | 8 ++++++++ app/Transformers/Setting/Category.php | 27 +++++++++++++++++++++++++++ app/Transformers/Setting/Currency.php | 32 ++++++++++++++++++++++++++++++++ app/Transformers/Setting/Setting.php | 23 +++++++++++++++++++++++ app/Transformers/Setting/Tax.php | 26 ++++++++++++++++++++++++++ app/Utilities/Import.php | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Utilities/ImportFile.php | 29 +++++++++++++++++++++++++++++ app/Utilities/Info.php | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ app/Utilities/Installer.php | 282 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Utilities/Modules.php | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Utilities/Overrider.php | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Utilities/Updater.php | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/Utilities/Versions.php | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ artisan | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ bootstrap/app.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ bootstrap/autoload.php | 28 ++++++++++++++++++++++++++++ bootstrap/cache/.gitignore | 2 ++ config/api.php | 223 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/app.php | 280 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/auth.php | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/broadcasting.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/cache.php | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/charts.php | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/columnsortable.php | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/database.php | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/debugbar.php | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/dotenv-editor.php | 27 +++++++++++++++++++++++++++ config/eloquentfilter.php | 16 ++++++++++++++++ config/excel.php | 704 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/filesystems.php | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/ide-helper.php | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/image.php | 20 ++++++++++++++++++++ config/language.php | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/laratrust.php | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/mail.php | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/mediable.php | 228 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/menus.php | 18 ++++++++++++++++++ config/modules.php | 169 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/money.php | 1808 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/queue.php | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/services.php | 38 ++++++++++++++++++++++++++++++++++++++ config/session.php | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/setting.php | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/version.php | 25 +++++++++++++++++++++++++ config/view.php | 33 +++++++++++++++++++++++++++++++++ database/.gitignore | 1 + database/factories/ItemFacorty.php | 28 ++++++++++++++++++++++++++++ database/factories/ModelFactory.php | 24 ++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_accounts_table.php | 42 ++++++++++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_bills_table.php | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_categories_table.php | 38 ++++++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_companies_table.php | 33 +++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_currencies_table.php | 39 +++++++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_customers_table.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_invoices_table.php | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_items_table.php | 45 +++++++++++++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_jobs_table.php | 38 ++++++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_modules_table.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_notifications_table.php | 35 +++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_password_resets_table.php | 34 ++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_payments_table.php | 45 +++++++++++++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_revenues_table.php | 45 +++++++++++++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_roles_table.php | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_sessions_table.php | 35 +++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_settings_table.php | 36 ++++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_taxes_table.php | 37 +++++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_transfers_table.php | 36 ++++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_users_table.php | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ database/migrations/2017_09_01_000000_create_vendors_table.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ database/migrations/2017_10_11_000000_create_bill_totals_table.php | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ database/migrations/2017_10_11_000000_create_invoice_totals_table.php | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ database/migrations/2017_11_16_000000_create_failed_jobs_table.php | 34 ++++++++++++++++++++++++++++++++++ database/migrations/2017_12_09_000000_add_currency_columns.php | 40 ++++++++++++++++++++++++++++++++++++++++ database/migrations/2017_12_30_000000_create_mediable_tables.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ database/migrations/2018_01_03_000000_drop_attachment_column_bill_payments_table.php | 32 ++++++++++++++++++++++++++++++++ database/migrations/2018_01_03_000000_drop_attachment_column_bills_table.php | 32 ++++++++++++++++++++++++++++++++ database/migrations/2018_01_03_000000_drop_attachment_column_invoice_payments_table.php | 32 ++++++++++++++++++++++++++++++++ database/migrations/2018_01_03_000000_drop_attachment_column_invoices_table.php | 32 ++++++++++++++++++++++++++++++++ database/migrations/2018_01_03_000000_drop_attachment_column_payments_table.php | 32 ++++++++++++++++++++++++++++++++ database/migrations/2018_01_03_000000_drop_attachment_column_revenues_table.php | 32 ++++++++++++++++++++++++++++++++ database/migrations/2018_01_03_000000_drop_picture_column_items_table.php | 32 ++++++++++++++++++++++++++++++++ database/migrations/2018_01_03_000000_drop_picture_column_users_table.php | 32 ++++++++++++++++++++++++++++++++ database/migrations/2018_04_23_000000_add_category_column_invoices_bills.php | 38 ++++++++++++++++++++++++++++++++++++++ database/migrations/2018_04_26_000000_create_recurring_table.php | 37 +++++++++++++++++++++++++++++++++++++ database/migrations/2018_04_30_000000_add_parent_column.php | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ database/migrations/2018_06_23_000000_modify_email_column.php | 41 +++++++++++++++++++++++++++++++++++++++++ database/migrations/2018_06_30_000000_modify_enabled_column.php | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ database/migrations/2018_07_07_000000_modify_date_column.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ database/migrations/2020_01_01_000000_add_locale_column.php | 30 ++++++++++++++++++++++++++++++ database/seeds/Accounts.php | 47 +++++++++++++++++++++++++++++++++++++++++++++++ database/seeds/BillStatuses.php | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ database/seeds/Categories.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ database/seeds/CompanySeeder.php | 23 +++++++++++++++++++++++ database/seeds/Currencies.php | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ database/seeds/DatabaseSeeder.php | 16 ++++++++++++++++ database/seeds/InvoiceStatuses.php | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ database/seeds/Modules.php | 32 ++++++++++++++++++++++++++++++++ database/seeds/Roles.php | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ database/seeds/Settings.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ database/seeds/Taxes.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ database/seeds/TestCompany.php | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 21 +++++++++++++++++++++ index.php | 32 ++++++++++++++++++++++++++++++++ modules/OfflinePayment/Assets/.gitkeep | 0 modules/OfflinePayment/Config/.gitkeep | 0 modules/OfflinePayment/Config/config.php | 7 +++++++ modules/OfflinePayment/Console/.gitkeep | 0 modules/OfflinePayment/Database/Migrations/.gitkeep | 0 modules/OfflinePayment/Database/Migrations/2017_09_19_delete_offline_file.php | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ modules/OfflinePayment/Database/Seeders/.gitkeep | 0 modules/OfflinePayment/Database/Seeders/OfflinePaymentDatabaseSeeder.php | 47 +++++++++++++++++++++++++++++++++++++++++++++++ modules/OfflinePayment/Entities/.gitkeep | 0 modules/OfflinePayment/Events/.gitkeep | 0 modules/OfflinePayment/Events/Handlers/.gitkeep | 0 modules/OfflinePayment/Events/Handlers/OfflinePaymentAdminMenu.php | 28 ++++++++++++++++++++++++++++ modules/OfflinePayment/Events/Handlers/OfflinePaymentGateway.php | 19 +++++++++++++++++++ modules/OfflinePayment/Http/Controllers/.gitkeep | 0 modules/OfflinePayment/Http/Controllers/OfflinePayment.php | 47 +++++++++++++++++++++++++++++++++++++++++++++++ modules/OfflinePayment/Http/Controllers/Settings.php | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ modules/OfflinePayment/Http/Middleware/.gitkeep | 0 modules/OfflinePayment/Http/Requests/.gitkeep | 0 modules/OfflinePayment/Http/Requests/Setting.php | 31 +++++++++++++++++++++++++++++++ modules/OfflinePayment/Http/Requests/SettingDelete.php | 30 ++++++++++++++++++++++++++++++ modules/OfflinePayment/Http/Requests/SettingGet.php | 30 ++++++++++++++++++++++++++++++ modules/OfflinePayment/Http/Requests/Show.php | 30 ++++++++++++++++++++++++++++++ modules/OfflinePayment/Http/routes.php | 12 ++++++++++++ modules/OfflinePayment/Jobs/.gitkeep | 0 modules/OfflinePayment/Mail/.gitkeep | 0 modules/OfflinePayment/Providers/.gitkeep | 0 modules/OfflinePayment/Providers/OfflinePaymentServiceProvider.php | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ modules/OfflinePayment/Repositories/.gitkeep | 0 modules/OfflinePayment/Resources/lang/.gitkeep | 0 modules/OfflinePayment/Resources/lang/en-GB/offlinepayment.php | 16 ++++++++++++++++ modules/OfflinePayment/Resources/views/.gitkeep | 0 modules/OfflinePayment/Resources/views/confirm.blade.php | 7 +++++++ modules/OfflinePayment/Resources/views/edit.blade.php | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ modules/OfflinePayment/Resources/views/show.blade.php | 39 +++++++++++++++++++++++++++++++++++++++ modules/OfflinePayment/Tests/.gitkeep | 0 modules/OfflinePayment/composer.json | 15 +++++++++++++++ modules/OfflinePayment/module.json | 19 +++++++++++++++++++ modules/OfflinePayment/start.php | 17 +++++++++++++++++ modules/PaypalStandard/Assets/.gitkeep | 0 modules/PaypalStandard/Config/.gitkeep | 0 modules/PaypalStandard/Config/config.php | 7 +++++++ modules/PaypalStandard/Console/.gitkeep | 0 modules/PaypalStandard/Database/Migrations/.gitkeep | 0 modules/PaypalStandard/Database/Seeders/.gitkeep | 0 modules/PaypalStandard/Database/Seeders/PaypalStandardDatabaseSeeder.php | 21 +++++++++++++++++++++ modules/PaypalStandard/Entities/.gitkeep | 0 modules/PaypalStandard/Events/.gitkeep | 0 modules/PaypalStandard/Events/Handlers/.gitkeep | 0 modules/PaypalStandard/Events/Handlers/PaypalStandardGateway.php | 23 +++++++++++++++++++++++ modules/PaypalStandard/Http/Controllers/.gitkeep | 0 modules/PaypalStandard/Http/Controllers/PaypalStandard.php | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ modules/PaypalStandard/Http/Middleware/.gitkeep | 0 modules/PaypalStandard/Http/Requests/.gitkeep | 0 modules/PaypalStandard/Http/routes.php | 10 ++++++++++ modules/PaypalStandard/Jobs/.gitkeep | 0 modules/PaypalStandard/Mail/.gitkeep | 0 modules/PaypalStandard/Providers/.gitkeep | 0 modules/PaypalStandard/Providers/PaypalStandardServiceProvider.php | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ modules/PaypalStandard/Repositories/.gitkeep | 0 modules/PaypalStandard/Resources/lang/.gitkeep | 0 modules/PaypalStandard/Resources/lang/en-GB/paypalstandard.php | 17 +++++++++++++++++ modules/PaypalStandard/Resources/views/.gitkeep | 0 modules/PaypalStandard/Resources/views/show.blade.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ modules/PaypalStandard/Tests/.gitkeep | 0 modules/PaypalStandard/composer.json | 15 +++++++++++++++ modules/PaypalStandard/module.json | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ modules/PaypalStandard/start.php | 17 +++++++++++++++++ phpunit.xml | 32 ++++++++++++++++++++++++++++++++ public/css/akaunting-green.css | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/css/app.css | 679 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/css/bootstrap-fancyfile.css | 43 +++++++++++++++++++++++++++++++++++++++++++ public/css/bootstrap3-print-fix.css | 193 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/css/daterangepicker.css | 269 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/css/font-awesome.min.css | 4 ++++ public/css/install.css | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/css/ionicons.min.css | 11 +++++++++++ public/css/modules.css | 4 ++++ public/css/skin-black.css | 15 +++++++++++++++ public/files/import/bills.xlsx | Bin 0 -> 13368 bytes public/files/import/customers.xlsx | Bin 0 -> 9136 bytes public/files/import/invoices.xlsx | Bin 0 -> 13426 bytes public/files/import/items.xlsx | Bin 0 -> 9104 bytes public/files/import/payments.xlsx | Bin 0 -> 9179 bytes public/files/import/revenues.xlsx | Bin 0 -> 9191 bytes public/files/import/vendors.xlsx | Bin 0 -> 9120 bytes public/fonts/FontAwesome.otf | Bin 0 -> 134808 bytes public/fonts/fontawesome-webfont.eot | Bin 0 -> 165742 bytes public/fonts/fontawesome-webfont.svg | 2671 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/fonts/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes public/fonts/fontawesome-webfont.woff | Bin 0 -> 98024 bytes public/fonts/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes public/img/akaunting-logo-green.png | Bin 0 -> 9648 bytes public/img/akaunting-logo-white.png | Bin 0 -> 14135 bytes public/img/company.png | Bin 0 -> 7597 bytes public/img/favicon.ico | Bin 0 -> 99678 bytes public/img/install.jpg | Bin 0 -> 216281 bytes public/img/login.jpg | Bin 0 -> 211860 bytes public/img/maintanance.png | Bin 0 -> 50196 bytes public/js/app.js | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/bootstrap-fancyfile.js | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/chartjs/Chart.min.js | 10 ++++++++++ public/js/daterangepicker/daterangepicker.js | 1653 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/highchart/highcharts.js | 8457 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/jquery/jquery.maskMoney.js | 703 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/af.js | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ar-dz.js | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ar-kw.js | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ar-ly.js | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ar-ma.js | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ar-sa.js | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ar-tn.js | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ar.js | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/az.js | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/be.js | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/bg.js | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/bm.js | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/bn.js | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/bo.js | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/br.js | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/bs.js | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ca.js | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/cs.js | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/cv.js | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/cy.js | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/da.js | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/de-at.js | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/de-ch.js | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/de.js | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/dv.js | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/el.js | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/en-au.js | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/en-ca.js | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/en-gb.js | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/en-ie.js | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/en-nz.js | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/eo.js | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/es-do.js | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/es-us.js | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/es.js | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/et.js | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/eu.js | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/fa.js | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/fi.js | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/fo.js | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/fr-ca.js | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/fr-ch.js | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/fr.js | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/fy.js | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/gd.js | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/gl.js | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/gom-latn.js | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/gu.js | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/he.js | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/hi.js | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/hr.js | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/hu.js | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/hy-am.js | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/id.js | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/is.js | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/it.js | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ja.js | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/jv.js | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ka.js | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/kk.js | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/km.js | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/kn.js | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ko.js | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ky.js | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/lb.js | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/lo.js | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/lt.js | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/lv.js | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/me.js | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/mi.js | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/mk.js | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ml.js | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/mr.js | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ms-my.js | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ms.js | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/my.js | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/nb.js | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ne.js | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/nl-be.js | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/nl.js | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/nn.js | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/pa-in.js | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/pl.js | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/pt-br.js | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/pt.js | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ro.js | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ru.js | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/sd.js | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/se.js | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/si.js | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/sk.js | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/sl.js | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/sq.js | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/sr-cyrl.js | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/sr.js | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ss.js | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/sv.js | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/sw.js | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ta.js | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/te.js | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/tet.js | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/th.js | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/tl-ph.js | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/tlh.js | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/tr.js | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/tzl.js | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/tzm-latn.js | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/tzm.js | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/uk.js | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/ur.js | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/uz-latn.js | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/uz.js | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/vi.js | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/x-pseudo.js | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/yo.js | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/zh-cn.js | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/zh-hk.js | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/locale/zh-tw.js | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/moment/moment.js | 4517 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/assets/js/app.js | 22 ++++++++++++++++++++++ resources/assets/js/bootstrap.js | 40 ++++++++++++++++++++++++++++++++++++++++ resources/assets/js/components/Example.vue | 23 +++++++++++++++++++++++ resources/assets/sass/_variables.scss | 38 ++++++++++++++++++++++++++++++++++++++ resources/assets/sass/app.scss | 9 +++++++++ resources/lang/ar-SA/accounts.php | 14 ++++++++++++++ resources/lang/ar-SA/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/ar-SA/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ar-SA/companies.php | 13 +++++++++++++ resources/lang/ar-SA/currencies.php | 18 ++++++++++++++++++ resources/lang/ar-SA/customers.php | 11 +++++++++++ resources/lang/ar-SA/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/ar-SA/demo.php | 16 ++++++++++++++++ resources/lang/ar-SA/footer.php | 9 +++++++++ resources/lang/ar-SA/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ar-SA/header.php | 15 +++++++++++++++ resources/lang/ar-SA/import.php | 9 +++++++++ resources/lang/ar-SA/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ar-SA/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ar-SA/items.php | 15 +++++++++++++++ resources/lang/ar-SA/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/ar-SA/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ar-SA/notifications.php | 10 ++++++++++ resources/lang/ar-SA/pagination.php | 9 +++++++++ resources/lang/ar-SA/passwords.php | 22 ++++++++++++++++++++++ resources/lang/ar-SA/recurring.php | 20 ++++++++++++++++++++ resources/lang/ar-SA/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/ar-SA/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ar-SA/taxes.php | 8 ++++++++ resources/lang/ar-SA/transfers.php | 12 ++++++++++++ resources/lang/ar-SA/updates.php | 15 +++++++++++++++ resources/lang/ar-SA/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/bg-BG/accounts.php | 14 ++++++++++++++ resources/lang/bg-BG/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/bg-BG/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/bg-BG/companies.php | 13 +++++++++++++ resources/lang/bg-BG/currencies.php | 18 ++++++++++++++++++ resources/lang/bg-BG/customers.php | 11 +++++++++++ resources/lang/bg-BG/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/bg-BG/demo.php | 16 ++++++++++++++++ resources/lang/bg-BG/footer.php | 9 +++++++++ resources/lang/bg-BG/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/bg-BG/header.php | 15 +++++++++++++++ resources/lang/bg-BG/import.php | 9 +++++++++ resources/lang/bg-BG/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/bg-BG/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/bg-BG/items.php | 15 +++++++++++++++ resources/lang/bg-BG/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/bg-BG/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/bg-BG/notifications.php | 10 ++++++++++ resources/lang/bg-BG/pagination.php | 9 +++++++++ resources/lang/bg-BG/passwords.php | 22 ++++++++++++++++++++++ resources/lang/bg-BG/recurring.php | 20 ++++++++++++++++++++ resources/lang/bg-BG/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/bg-BG/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/bg-BG/taxes.php | 8 ++++++++ resources/lang/bg-BG/transfers.php | 12 ++++++++++++ resources/lang/bg-BG/updates.php | 15 +++++++++++++++ resources/lang/bg-BG/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/cs-CZ/accounts.php | 14 ++++++++++++++ resources/lang/cs-CZ/auth.php | 30 ++++++++++++++++++++++++++++++ resources/lang/cs-CZ/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/cs-CZ/companies.php | 13 +++++++++++++ resources/lang/cs-CZ/currencies.php | 18 ++++++++++++++++++ resources/lang/cs-CZ/customers.php | 11 +++++++++++ resources/lang/cs-CZ/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/cs-CZ/demo.php | 17 +++++++++++++++++ resources/lang/cs-CZ/footer.php | 9 +++++++++ resources/lang/cs-CZ/general.php | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/cs-CZ/header.php | 15 +++++++++++++++ resources/lang/cs-CZ/import.php | 9 +++++++++ resources/lang/cs-CZ/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/cs-CZ/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/cs-CZ/items.php | 15 +++++++++++++++ resources/lang/cs-CZ/messages.php | 25 +++++++++++++++++++++++++ resources/lang/cs-CZ/modules.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/cs-CZ/pagination.php | 9 +++++++++ resources/lang/cs-CZ/passwords.php | 22 ++++++++++++++++++++++ resources/lang/cs-CZ/recurring.php | 20 ++++++++++++++++++++ resources/lang/cs-CZ/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/cs-CZ/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/cs-CZ/taxes.php | 8 ++++++++ resources/lang/cs-CZ/transfers.php | 8 ++++++++ resources/lang/cs-CZ/updates.php | 15 +++++++++++++++ resources/lang/cs-CZ/validation.php | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/da-DK/accounts.php | 14 ++++++++++++++ resources/lang/da-DK/auth.php | 30 ++++++++++++++++++++++++++++++ resources/lang/da-DK/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/da-DK/companies.php | 13 +++++++++++++ resources/lang/da-DK/currencies.php | 18 ++++++++++++++++++ resources/lang/da-DK/customers.php | 11 +++++++++++ resources/lang/da-DK/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/da-DK/demo.php | 16 ++++++++++++++++ resources/lang/da-DK/footer.php | 9 +++++++++ resources/lang/da-DK/general.php | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/da-DK/header.php | 15 +++++++++++++++ resources/lang/da-DK/import.php | 9 +++++++++ resources/lang/da-DK/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/da-DK/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/da-DK/items.php | 15 +++++++++++++++ resources/lang/da-DK/messages.php | 25 +++++++++++++++++++++++++ resources/lang/da-DK/modules.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/da-DK/pagination.php | 9 +++++++++ resources/lang/da-DK/passwords.php | 22 ++++++++++++++++++++++ resources/lang/da-DK/recurring.php | 20 ++++++++++++++++++++ resources/lang/da-DK/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/da-DK/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/da-DK/taxes.php | 8 ++++++++ resources/lang/da-DK/transfers.php | 8 ++++++++ resources/lang/da-DK/updates.php | 15 +++++++++++++++ resources/lang/da-DK/validation.php | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/de-DE/accounts.php | 14 ++++++++++++++ resources/lang/de-DE/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/de-DE/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/de-DE/companies.php | 13 +++++++++++++ resources/lang/de-DE/currencies.php | 18 ++++++++++++++++++ resources/lang/de-DE/customers.php | 11 +++++++++++ resources/lang/de-DE/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/de-DE/demo.php | 16 ++++++++++++++++ resources/lang/de-DE/footer.php | 9 +++++++++ resources/lang/de-DE/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/de-DE/header.php | 15 +++++++++++++++ resources/lang/de-DE/import.php | 9 +++++++++ resources/lang/de-DE/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/de-DE/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/de-DE/items.php | 15 +++++++++++++++ resources/lang/de-DE/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/de-DE/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/de-DE/notifications.php | 10 ++++++++++ resources/lang/de-DE/pagination.php | 9 +++++++++ resources/lang/de-DE/passwords.php | 22 ++++++++++++++++++++++ resources/lang/de-DE/recurring.php | 20 ++++++++++++++++++++ resources/lang/de-DE/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/de-DE/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/de-DE/taxes.php | 8 ++++++++ resources/lang/de-DE/transfers.php | 12 ++++++++++++ resources/lang/de-DE/updates.php | 15 +++++++++++++++ resources/lang/de-DE/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/el-GR/accounts.php | 14 ++++++++++++++ resources/lang/el-GR/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/el-GR/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/el-GR/companies.php | 13 +++++++++++++ resources/lang/el-GR/currencies.php | 18 ++++++++++++++++++ resources/lang/el-GR/customers.php | 11 +++++++++++ resources/lang/el-GR/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/el-GR/demo.php | 16 ++++++++++++++++ resources/lang/el-GR/footer.php | 9 +++++++++ resources/lang/el-GR/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/el-GR/header.php | 15 +++++++++++++++ resources/lang/el-GR/import.php | 9 +++++++++ resources/lang/el-GR/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/el-GR/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/el-GR/items.php | 15 +++++++++++++++ resources/lang/el-GR/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/el-GR/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/el-GR/notifications.php | 10 ++++++++++ resources/lang/el-GR/pagination.php | 9 +++++++++ resources/lang/el-GR/passwords.php | 22 ++++++++++++++++++++++ resources/lang/el-GR/recurring.php | 20 ++++++++++++++++++++ resources/lang/el-GR/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/el-GR/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/el-GR/taxes.php | 8 ++++++++ resources/lang/el-GR/transfers.php | 12 ++++++++++++ resources/lang/el-GR/updates.php | 15 +++++++++++++++ resources/lang/el-GR/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/en-GB/accounts.php | 14 ++++++++++++++ resources/lang/en-GB/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/en-GB/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/en-GB/companies.php | 13 +++++++++++++ resources/lang/en-GB/currencies.php | 18 ++++++++++++++++++ resources/lang/en-GB/customers.php | 11 +++++++++++ resources/lang/en-GB/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/en-GB/demo.php | 16 ++++++++++++++++ resources/lang/en-GB/footer.php | 9 +++++++++ resources/lang/en-GB/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/en-GB/header.php | 15 +++++++++++++++ resources/lang/en-GB/import.php | 9 +++++++++ resources/lang/en-GB/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/en-GB/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/en-GB/items.php | 15 +++++++++++++++ resources/lang/en-GB/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/en-GB/modules.php | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/en-GB/notifications.php | 10 ++++++++++ resources/lang/en-GB/pagination.php | 9 +++++++++ resources/lang/en-GB/passwords.php | 22 ++++++++++++++++++++++ resources/lang/en-GB/recurring.php | 20 ++++++++++++++++++++ resources/lang/en-GB/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/en-GB/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/en-GB/taxes.php | 8 ++++++++ resources/lang/en-GB/transfers.php | 12 ++++++++++++ resources/lang/en-GB/updates.php | 15 +++++++++++++++ resources/lang/en-GB/validation.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/es-ES/accounts.php | 14 ++++++++++++++ resources/lang/es-ES/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/es-ES/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/es-ES/companies.php | 13 +++++++++++++ resources/lang/es-ES/currencies.php | 18 ++++++++++++++++++ resources/lang/es-ES/customers.php | 11 +++++++++++ resources/lang/es-ES/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/es-ES/demo.php | 16 ++++++++++++++++ resources/lang/es-ES/footer.php | 9 +++++++++ resources/lang/es-ES/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/es-ES/header.php | 15 +++++++++++++++ resources/lang/es-ES/import.php | 9 +++++++++ resources/lang/es-ES/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/es-ES/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/es-ES/items.php | 15 +++++++++++++++ resources/lang/es-ES/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/es-ES/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/es-ES/pagination.php | 9 +++++++++ resources/lang/es-ES/passwords.php | 22 ++++++++++++++++++++++ resources/lang/es-ES/recurring.php | 20 ++++++++++++++++++++ resources/lang/es-ES/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/es-ES/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/es-ES/taxes.php | 8 ++++++++ resources/lang/es-ES/transfers.php | 12 ++++++++++++ resources/lang/es-ES/updates.php | 15 +++++++++++++++ resources/lang/es-ES/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/es-MX/accounts.php | 14 ++++++++++++++ resources/lang/es-MX/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/es-MX/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/es-MX/companies.php | 13 +++++++++++++ resources/lang/es-MX/currencies.php | 18 ++++++++++++++++++ resources/lang/es-MX/customers.php | 11 +++++++++++ resources/lang/es-MX/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/es-MX/demo.php | 16 ++++++++++++++++ resources/lang/es-MX/footer.php | 9 +++++++++ resources/lang/es-MX/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/es-MX/header.php | 15 +++++++++++++++ resources/lang/es-MX/import.php | 9 +++++++++ resources/lang/es-MX/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/es-MX/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/es-MX/items.php | 15 +++++++++++++++ resources/lang/es-MX/messages.php | 27 +++++++++++++++++++++++++++ resources/lang/es-MX/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/es-MX/pagination.php | 9 +++++++++ resources/lang/es-MX/passwords.php | 22 ++++++++++++++++++++++ resources/lang/es-MX/recurring.php | 20 ++++++++++++++++++++ resources/lang/es-MX/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/es-MX/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/es-MX/taxes.php | 8 ++++++++ resources/lang/es-MX/transfers.php | 12 ++++++++++++ resources/lang/es-MX/updates.php | 15 +++++++++++++++ resources/lang/es-MX/validation.php | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/fa-IR/accounts.php | 14 ++++++++++++++ resources/lang/fa-IR/auth.php | 30 ++++++++++++++++++++++++++++++ resources/lang/fa-IR/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/fa-IR/companies.php | 13 +++++++++++++ resources/lang/fa-IR/currencies.php | 18 ++++++++++++++++++ resources/lang/fa-IR/customers.php | 11 +++++++++++ resources/lang/fa-IR/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/fa-IR/demo.php | 17 +++++++++++++++++ resources/lang/fa-IR/footer.php | 9 +++++++++ resources/lang/fa-IR/general.php | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/fa-IR/header.php | 15 +++++++++++++++ resources/lang/fa-IR/import.php | 9 +++++++++ resources/lang/fa-IR/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/fa-IR/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/fa-IR/items.php | 15 +++++++++++++++ resources/lang/fa-IR/messages.php | 25 +++++++++++++++++++++++++ resources/lang/fa-IR/modules.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/fa-IR/pagination.php | 9 +++++++++ resources/lang/fa-IR/passwords.php | 22 ++++++++++++++++++++++ resources/lang/fa-IR/recurring.php | 20 ++++++++++++++++++++ resources/lang/fa-IR/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/fa-IR/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/fa-IR/taxes.php | 8 ++++++++ resources/lang/fa-IR/transfers.php | 8 ++++++++ resources/lang/fa-IR/updates.php | 15 +++++++++++++++ resources/lang/fa-IR/validation.php | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/fr-FR/accounts.php | 14 ++++++++++++++ resources/lang/fr-FR/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/fr-FR/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/fr-FR/companies.php | 13 +++++++++++++ resources/lang/fr-FR/currencies.php | 18 ++++++++++++++++++ resources/lang/fr-FR/customers.php | 11 +++++++++++ resources/lang/fr-FR/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/fr-FR/demo.php | 16 ++++++++++++++++ resources/lang/fr-FR/footer.php | 9 +++++++++ resources/lang/fr-FR/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/fr-FR/header.php | 15 +++++++++++++++ resources/lang/fr-FR/import.php | 9 +++++++++ resources/lang/fr-FR/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/fr-FR/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/fr-FR/items.php | 15 +++++++++++++++ resources/lang/fr-FR/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/fr-FR/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/fr-FR/notifications.php | 10 ++++++++++ resources/lang/fr-FR/pagination.php | 9 +++++++++ resources/lang/fr-FR/passwords.php | 22 ++++++++++++++++++++++ resources/lang/fr-FR/recurring.php | 20 ++++++++++++++++++++ resources/lang/fr-FR/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/fr-FR/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/fr-FR/taxes.php | 8 ++++++++ resources/lang/fr-FR/transfers.php | 12 ++++++++++++ resources/lang/fr-FR/updates.php | 15 +++++++++++++++ resources/lang/fr-FR/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/he-IL/accounts.php | 14 ++++++++++++++ resources/lang/he-IL/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/he-IL/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/he-IL/companies.php | 13 +++++++++++++ resources/lang/he-IL/currencies.php | 18 ++++++++++++++++++ resources/lang/he-IL/customers.php | 11 +++++++++++ resources/lang/he-IL/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/he-IL/demo.php | 16 ++++++++++++++++ resources/lang/he-IL/footer.php | 9 +++++++++ resources/lang/he-IL/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/he-IL/header.php | 15 +++++++++++++++ resources/lang/he-IL/import.php | 9 +++++++++ resources/lang/he-IL/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/he-IL/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/he-IL/items.php | 15 +++++++++++++++ resources/lang/he-IL/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/he-IL/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/he-IL/notifications.php | 10 ++++++++++ resources/lang/he-IL/pagination.php | 9 +++++++++ resources/lang/he-IL/passwords.php | 22 ++++++++++++++++++++++ resources/lang/he-IL/recurring.php | 20 ++++++++++++++++++++ resources/lang/he-IL/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/he-IL/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/he-IL/taxes.php | 8 ++++++++ resources/lang/he-IL/transfers.php | 12 ++++++++++++ resources/lang/he-IL/updates.php | 15 +++++++++++++++ resources/lang/he-IL/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/hr-HR/accounts.php | 14 ++++++++++++++ resources/lang/hr-HR/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/hr-HR/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/hr-HR/companies.php | 13 +++++++++++++ resources/lang/hr-HR/currencies.php | 18 ++++++++++++++++++ resources/lang/hr-HR/customers.php | 11 +++++++++++ resources/lang/hr-HR/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/hr-HR/demo.php | 16 ++++++++++++++++ resources/lang/hr-HR/footer.php | 9 +++++++++ resources/lang/hr-HR/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/hr-HR/header.php | 15 +++++++++++++++ resources/lang/hr-HR/import.php | 9 +++++++++ resources/lang/hr-HR/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/hr-HR/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/hr-HR/items.php | 15 +++++++++++++++ resources/lang/hr-HR/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/hr-HR/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/hr-HR/notifications.php | 10 ++++++++++ resources/lang/hr-HR/pagination.php | 9 +++++++++ resources/lang/hr-HR/passwords.php | 22 ++++++++++++++++++++++ resources/lang/hr-HR/recurring.php | 20 ++++++++++++++++++++ resources/lang/hr-HR/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/hr-HR/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/hr-HR/taxes.php | 8 ++++++++ resources/lang/hr-HR/transfers.php | 12 ++++++++++++ resources/lang/hr-HR/updates.php | 15 +++++++++++++++ resources/lang/hr-HR/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/id-ID/accounts.php | 14 ++++++++++++++ resources/lang/id-ID/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/id-ID/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/id-ID/companies.php | 13 +++++++++++++ resources/lang/id-ID/currencies.php | 18 ++++++++++++++++++ resources/lang/id-ID/customers.php | 11 +++++++++++ resources/lang/id-ID/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/id-ID/demo.php | 16 ++++++++++++++++ resources/lang/id-ID/footer.php | 9 +++++++++ resources/lang/id-ID/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/id-ID/header.php | 15 +++++++++++++++ resources/lang/id-ID/import.php | 9 +++++++++ resources/lang/id-ID/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/id-ID/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/id-ID/items.php | 15 +++++++++++++++ resources/lang/id-ID/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/id-ID/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/id-ID/notifications.php | 10 ++++++++++ resources/lang/id-ID/pagination.php | 9 +++++++++ resources/lang/id-ID/passwords.php | 22 ++++++++++++++++++++++ resources/lang/id-ID/recurring.php | 20 ++++++++++++++++++++ resources/lang/id-ID/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/id-ID/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/id-ID/taxes.php | 8 ++++++++ resources/lang/id-ID/transfers.php | 12 ++++++++++++ resources/lang/id-ID/updates.php | 15 +++++++++++++++ resources/lang/id-ID/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/it-IT/accounts.php | 14 ++++++++++++++ resources/lang/it-IT/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/it-IT/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/it-IT/companies.php | 13 +++++++++++++ resources/lang/it-IT/currencies.php | 18 ++++++++++++++++++ resources/lang/it-IT/customers.php | 11 +++++++++++ resources/lang/it-IT/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/it-IT/demo.php | 16 ++++++++++++++++ resources/lang/it-IT/footer.php | 9 +++++++++ resources/lang/it-IT/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/it-IT/header.php | 15 +++++++++++++++ resources/lang/it-IT/import.php | 9 +++++++++ resources/lang/it-IT/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/it-IT/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/it-IT/items.php | 15 +++++++++++++++ resources/lang/it-IT/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/it-IT/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/it-IT/notifications.php | 10 ++++++++++ resources/lang/it-IT/pagination.php | 9 +++++++++ resources/lang/it-IT/passwords.php | 22 ++++++++++++++++++++++ resources/lang/it-IT/recurring.php | 20 ++++++++++++++++++++ resources/lang/it-IT/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/it-IT/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/it-IT/taxes.php | 8 ++++++++ resources/lang/it-IT/transfers.php | 12 ++++++++++++ resources/lang/it-IT/updates.php | 15 +++++++++++++++ resources/lang/it-IT/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/lv-LV/accounts.php | 14 ++++++++++++++ resources/lang/lv-LV/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/lv-LV/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/lv-LV/companies.php | 13 +++++++++++++ resources/lang/lv-LV/currencies.php | 18 ++++++++++++++++++ resources/lang/lv-LV/customers.php | 11 +++++++++++ resources/lang/lv-LV/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/lv-LV/demo.php | 16 ++++++++++++++++ resources/lang/lv-LV/footer.php | 9 +++++++++ resources/lang/lv-LV/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/lv-LV/header.php | 15 +++++++++++++++ resources/lang/lv-LV/import.php | 9 +++++++++ resources/lang/lv-LV/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/lv-LV/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/lv-LV/items.php | 15 +++++++++++++++ resources/lang/lv-LV/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/lv-LV/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/lv-LV/notifications.php | 10 ++++++++++ resources/lang/lv-LV/pagination.php | 9 +++++++++ resources/lang/lv-LV/passwords.php | 22 ++++++++++++++++++++++ resources/lang/lv-LV/recurring.php | 20 ++++++++++++++++++++ resources/lang/lv-LV/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/lv-LV/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/lv-LV/taxes.php | 8 ++++++++ resources/lang/lv-LV/transfers.php | 12 ++++++++++++ resources/lang/lv-LV/updates.php | 15 +++++++++++++++ resources/lang/lv-LV/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/nb-NO/accounts.php | 14 ++++++++++++++ resources/lang/nb-NO/auth.php | 30 ++++++++++++++++++++++++++++++ resources/lang/nb-NO/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/nb-NO/companies.php | 13 +++++++++++++ resources/lang/nb-NO/currencies.php | 18 ++++++++++++++++++ resources/lang/nb-NO/customers.php | 11 +++++++++++ resources/lang/nb-NO/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/nb-NO/demo.php | 17 +++++++++++++++++ resources/lang/nb-NO/footer.php | 9 +++++++++ resources/lang/nb-NO/general.php | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/nb-NO/header.php | 15 +++++++++++++++ resources/lang/nb-NO/import.php | 9 +++++++++ resources/lang/nb-NO/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/nb-NO/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/nb-NO/items.php | 15 +++++++++++++++ resources/lang/nb-NO/messages.php | 25 +++++++++++++++++++++++++ resources/lang/nb-NO/modules.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/nb-NO/pagination.php | 9 +++++++++ resources/lang/nb-NO/passwords.php | 22 ++++++++++++++++++++++ resources/lang/nb-NO/recurring.php | 20 ++++++++++++++++++++ resources/lang/nb-NO/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/nb-NO/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/nb-NO/taxes.php | 8 ++++++++ resources/lang/nb-NO/transfers.php | 8 ++++++++ resources/lang/nb-NO/updates.php | 15 +++++++++++++++ resources/lang/nb-NO/validation.php | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/nl-NL/accounts.php | 14 ++++++++++++++ resources/lang/nl-NL/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/nl-NL/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/nl-NL/companies.php | 13 +++++++++++++ resources/lang/nl-NL/currencies.php | 18 ++++++++++++++++++ resources/lang/nl-NL/customers.php | 11 +++++++++++ resources/lang/nl-NL/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/nl-NL/demo.php | 16 ++++++++++++++++ resources/lang/nl-NL/footer.php | 9 +++++++++ resources/lang/nl-NL/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/nl-NL/header.php | 15 +++++++++++++++ resources/lang/nl-NL/import.php | 9 +++++++++ resources/lang/nl-NL/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/nl-NL/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/nl-NL/items.php | 15 +++++++++++++++ resources/lang/nl-NL/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/nl-NL/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/nl-NL/notifications.php | 10 ++++++++++ resources/lang/nl-NL/pagination.php | 9 +++++++++ resources/lang/nl-NL/passwords.php | 22 ++++++++++++++++++++++ resources/lang/nl-NL/recurring.php | 20 ++++++++++++++++++++ resources/lang/nl-NL/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/nl-NL/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/nl-NL/taxes.php | 8 ++++++++ resources/lang/nl-NL/transfers.php | 12 ++++++++++++ resources/lang/nl-NL/updates.php | 15 +++++++++++++++ resources/lang/nl-NL/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/pt-BR/accounts.php | 14 ++++++++++++++ resources/lang/pt-BR/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/pt-BR/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/pt-BR/companies.php | 13 +++++++++++++ resources/lang/pt-BR/currencies.php | 18 ++++++++++++++++++ resources/lang/pt-BR/customers.php | 11 +++++++++++ resources/lang/pt-BR/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/pt-BR/demo.php | 16 ++++++++++++++++ resources/lang/pt-BR/footer.php | 9 +++++++++ resources/lang/pt-BR/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/pt-BR/header.php | 15 +++++++++++++++ resources/lang/pt-BR/import.php | 9 +++++++++ resources/lang/pt-BR/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/pt-BR/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/pt-BR/items.php | 15 +++++++++++++++ resources/lang/pt-BR/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/pt-BR/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/pt-BR/notifications.php | 10 ++++++++++ resources/lang/pt-BR/pagination.php | 9 +++++++++ resources/lang/pt-BR/passwords.php | 22 ++++++++++++++++++++++ resources/lang/pt-BR/recurring.php | 20 ++++++++++++++++++++ resources/lang/pt-BR/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/pt-BR/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/pt-BR/taxes.php | 8 ++++++++ resources/lang/pt-BR/transfers.php | 12 ++++++++++++ resources/lang/pt-BR/updates.php | 15 +++++++++++++++ resources/lang/pt-BR/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/pt-PT/accounts.php | 14 ++++++++++++++ resources/lang/pt-PT/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/pt-PT/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/pt-PT/companies.php | 13 +++++++++++++ resources/lang/pt-PT/currencies.php | 18 ++++++++++++++++++ resources/lang/pt-PT/customers.php | 11 +++++++++++ resources/lang/pt-PT/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/pt-PT/demo.php | 16 ++++++++++++++++ resources/lang/pt-PT/footer.php | 9 +++++++++ resources/lang/pt-PT/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/pt-PT/header.php | 15 +++++++++++++++ resources/lang/pt-PT/import.php | 9 +++++++++ resources/lang/pt-PT/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/pt-PT/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/pt-PT/items.php | 15 +++++++++++++++ resources/lang/pt-PT/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/pt-PT/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/pt-PT/notifications.php | 10 ++++++++++ resources/lang/pt-PT/pagination.php | 9 +++++++++ resources/lang/pt-PT/passwords.php | 22 ++++++++++++++++++++++ resources/lang/pt-PT/recurring.php | 20 ++++++++++++++++++++ resources/lang/pt-PT/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/pt-PT/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/pt-PT/taxes.php | 8 ++++++++ resources/lang/pt-PT/transfers.php | 12 ++++++++++++ resources/lang/pt-PT/updates.php | 15 +++++++++++++++ resources/lang/pt-PT/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ro-RO/accounts.php | 14 ++++++++++++++ resources/lang/ro-RO/auth.php | 40 ++++++++++++++++++++++++++++++++++++++++ resources/lang/ro-RO/bills.php | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ro-RO/companies.php | 13 +++++++++++++ resources/lang/ro-RO/currencies.php | 18 ++++++++++++++++++ resources/lang/ro-RO/customers.php | 11 +++++++++++ resources/lang/ro-RO/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/ro-RO/demo.php | 16 ++++++++++++++++ resources/lang/ro-RO/footer.php | 9 +++++++++ resources/lang/ro-RO/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ro-RO/header.php | 15 +++++++++++++++ resources/lang/ro-RO/import.php | 9 +++++++++ resources/lang/ro-RO/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ro-RO/invoices.php | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ro-RO/items.php | 15 +++++++++++++++ resources/lang/ro-RO/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/ro-RO/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ro-RO/notifications.php | 10 ++++++++++ resources/lang/ro-RO/pagination.php | 9 +++++++++ resources/lang/ro-RO/passwords.php | 22 ++++++++++++++++++++++ resources/lang/ro-RO/recurring.php | 20 ++++++++++++++++++++ resources/lang/ro-RO/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/ro-RO/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ro-RO/taxes.php | 8 ++++++++ resources/lang/ro-RO/transfers.php | 12 ++++++++++++ resources/lang/ro-RO/updates.php | 15 +++++++++++++++ resources/lang/ro-RO/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ru-RU/accounts.php | 14 ++++++++++++++ resources/lang/ru-RU/auth.php | 30 ++++++++++++++++++++++++++++++ resources/lang/ru-RU/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ru-RU/companies.php | 13 +++++++++++++ resources/lang/ru-RU/currencies.php | 18 ++++++++++++++++++ resources/lang/ru-RU/customers.php | 11 +++++++++++ resources/lang/ru-RU/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/ru-RU/demo.php | 17 +++++++++++++++++ resources/lang/ru-RU/footer.php | 9 +++++++++ resources/lang/ru-RU/general.php | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ru-RU/header.php | 15 +++++++++++++++ resources/lang/ru-RU/import.php | 9 +++++++++ resources/lang/ru-RU/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ru-RU/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ru-RU/items.php | 15 +++++++++++++++ resources/lang/ru-RU/messages.php | 25 +++++++++++++++++++++++++ resources/lang/ru-RU/modules.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ru-RU/pagination.php | 9 +++++++++ resources/lang/ru-RU/passwords.php | 22 ++++++++++++++++++++++ resources/lang/ru-RU/recurring.php | 20 ++++++++++++++++++++ resources/lang/ru-RU/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/ru-RU/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/ru-RU/taxes.php | 8 ++++++++ resources/lang/ru-RU/transfers.php | 8 ++++++++ resources/lang/ru-RU/updates.php | 15 +++++++++++++++ resources/lang/ru-RU/validation.php | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/sq-AL/accounts.php | 14 ++++++++++++++ resources/lang/sq-AL/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/sq-AL/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/sq-AL/companies.php | 13 +++++++++++++ resources/lang/sq-AL/currencies.php | 18 ++++++++++++++++++ resources/lang/sq-AL/customers.php | 11 +++++++++++ resources/lang/sq-AL/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/sq-AL/demo.php | 16 ++++++++++++++++ resources/lang/sq-AL/footer.php | 9 +++++++++ resources/lang/sq-AL/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/sq-AL/header.php | 15 +++++++++++++++ resources/lang/sq-AL/import.php | 9 +++++++++ resources/lang/sq-AL/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/sq-AL/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/sq-AL/items.php | 15 +++++++++++++++ resources/lang/sq-AL/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/sq-AL/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/sq-AL/notifications.php | 10 ++++++++++ resources/lang/sq-AL/pagination.php | 9 +++++++++ resources/lang/sq-AL/passwords.php | 22 ++++++++++++++++++++++ resources/lang/sq-AL/recurring.php | 20 ++++++++++++++++++++ resources/lang/sq-AL/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/sq-AL/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/sq-AL/taxes.php | 8 ++++++++ resources/lang/sq-AL/transfers.php | 12 ++++++++++++ resources/lang/sq-AL/updates.php | 15 +++++++++++++++ resources/lang/sq-AL/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/sv-SE/accounts.php | 14 ++++++++++++++ resources/lang/sv-SE/auth.php | 30 ++++++++++++++++++++++++++++++ resources/lang/sv-SE/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/sv-SE/companies.php | 13 +++++++++++++ resources/lang/sv-SE/currencies.php | 19 +++++++++++++++++++ resources/lang/sv-SE/customers.php | 11 +++++++++++ resources/lang/sv-SE/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/sv-SE/demo.php | 17 +++++++++++++++++ resources/lang/sv-SE/footer.php | 9 +++++++++ resources/lang/sv-SE/general.php | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/sv-SE/header.php | 15 +++++++++++++++ resources/lang/sv-SE/import.php | 9 +++++++++ resources/lang/sv-SE/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/sv-SE/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/sv-SE/items.php | 15 +++++++++++++++ resources/lang/sv-SE/messages.php | 25 +++++++++++++++++++++++++ resources/lang/sv-SE/modules.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/sv-SE/pagination.php | 9 +++++++++ resources/lang/sv-SE/passwords.php | 22 ++++++++++++++++++++++ resources/lang/sv-SE/recurring.php | 20 ++++++++++++++++++++ resources/lang/sv-SE/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/sv-SE/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/sv-SE/taxes.php | 8 ++++++++ resources/lang/sv-SE/transfers.php | 8 ++++++++ resources/lang/sv-SE/updates.php | 15 +++++++++++++++ resources/lang/sv-SE/validation.php | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/th-TH/accounts.php | 14 ++++++++++++++ resources/lang/th-TH/auth.php | 30 ++++++++++++++++++++++++++++++ resources/lang/th-TH/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/th-TH/companies.php | 13 +++++++++++++ resources/lang/th-TH/currencies.php | 18 ++++++++++++++++++ resources/lang/th-TH/customers.php | 11 +++++++++++ resources/lang/th-TH/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/th-TH/demo.php | 16 ++++++++++++++++ resources/lang/th-TH/footer.php | 9 +++++++++ resources/lang/th-TH/general.php | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/th-TH/header.php | 15 +++++++++++++++ resources/lang/th-TH/import.php | 9 +++++++++ resources/lang/th-TH/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/th-TH/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/th-TH/items.php | 15 +++++++++++++++ resources/lang/th-TH/messages.php | 25 +++++++++++++++++++++++++ resources/lang/th-TH/modules.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/th-TH/pagination.php | 9 +++++++++ resources/lang/th-TH/passwords.php | 22 ++++++++++++++++++++++ resources/lang/th-TH/recurring.php | 20 ++++++++++++++++++++ resources/lang/th-TH/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/th-TH/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/th-TH/taxes.php | 8 ++++++++ resources/lang/th-TH/transfers.php | 8 ++++++++ resources/lang/th-TH/updates.php | 15 +++++++++++++++ resources/lang/th-TH/validation.php | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/tr-TR/accounts.php | 14 ++++++++++++++ resources/lang/tr-TR/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/tr-TR/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/tr-TR/companies.php | 13 +++++++++++++ resources/lang/tr-TR/currencies.php | 18 ++++++++++++++++++ resources/lang/tr-TR/customers.php | 11 +++++++++++ resources/lang/tr-TR/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/tr-TR/demo.php | 16 ++++++++++++++++ resources/lang/tr-TR/footer.php | 9 +++++++++ resources/lang/tr-TR/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/tr-TR/header.php | 15 +++++++++++++++ resources/lang/tr-TR/import.php | 9 +++++++++ resources/lang/tr-TR/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/tr-TR/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/tr-TR/items.php | 15 +++++++++++++++ resources/lang/tr-TR/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/tr-TR/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/tr-TR/notifications.php | 10 ++++++++++ resources/lang/tr-TR/pagination.php | 9 +++++++++ resources/lang/tr-TR/passwords.php | 22 ++++++++++++++++++++++ resources/lang/tr-TR/recurring.php | 20 ++++++++++++++++++++ resources/lang/tr-TR/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/tr-TR/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/tr-TR/taxes.php | 8 ++++++++ resources/lang/tr-TR/transfers.php | 12 ++++++++++++ resources/lang/tr-TR/updates.php | 15 +++++++++++++++ resources/lang/tr-TR/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/uk-UA/accounts.php | 14 ++++++++++++++ resources/lang/uk-UA/auth.php | 30 ++++++++++++++++++++++++++++++ resources/lang/uk-UA/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/uk-UA/companies.php | 13 +++++++++++++ resources/lang/uk-UA/currencies.php | 18 ++++++++++++++++++ resources/lang/uk-UA/customers.php | 11 +++++++++++ resources/lang/uk-UA/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/uk-UA/demo.php | 17 +++++++++++++++++ resources/lang/uk-UA/footer.php | 9 +++++++++ resources/lang/uk-UA/general.php | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/uk-UA/header.php | 15 +++++++++++++++ resources/lang/uk-UA/import.php | 9 +++++++++ resources/lang/uk-UA/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/uk-UA/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/uk-UA/items.php | 15 +++++++++++++++ resources/lang/uk-UA/messages.php | 25 +++++++++++++++++++++++++ resources/lang/uk-UA/modules.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/uk-UA/pagination.php | 9 +++++++++ resources/lang/uk-UA/passwords.php | 22 ++++++++++++++++++++++ resources/lang/uk-UA/recurring.php | 20 ++++++++++++++++++++ resources/lang/uk-UA/reports.php | 31 +++++++++++++++++++++++++++++++ resources/lang/uk-UA/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/uk-UA/taxes.php | 8 ++++++++ resources/lang/uk-UA/transfers.php | 8 ++++++++ resources/lang/uk-UA/updates.php | 15 +++++++++++++++ resources/lang/uk-UA/validation.php | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/vi-VN/accounts.php | 14 ++++++++++++++ resources/lang/vi-VN/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/vi-VN/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/vi-VN/companies.php | 13 +++++++++++++ resources/lang/vi-VN/currencies.php | 18 ++++++++++++++++++ resources/lang/vi-VN/customers.php | 11 +++++++++++ resources/lang/vi-VN/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/vi-VN/demo.php | 16 ++++++++++++++++ resources/lang/vi-VN/footer.php | 9 +++++++++ resources/lang/vi-VN/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/vi-VN/header.php | 15 +++++++++++++++ resources/lang/vi-VN/import.php | 9 +++++++++ resources/lang/vi-VN/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/vi-VN/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/vi-VN/items.php | 15 +++++++++++++++ resources/lang/vi-VN/messages.php | 27 +++++++++++++++++++++++++++ resources/lang/vi-VN/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/vi-VN/pagination.php | 9 +++++++++ resources/lang/vi-VN/passwords.php | 22 ++++++++++++++++++++++ resources/lang/vi-VN/recurring.php | 21 +++++++++++++++++++++ resources/lang/vi-VN/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/vi-VN/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/vi-VN/taxes.php | 8 ++++++++ resources/lang/vi-VN/transfers.php | 12 ++++++++++++ resources/lang/vi-VN/updates.php | 15 +++++++++++++++ resources/lang/vi-VN/validation.php | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/zh-CN/accounts.php | 14 ++++++++++++++ resources/lang/zh-CN/auth.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/lang/zh-CN/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/zh-CN/companies.php | 13 +++++++++++++ resources/lang/zh-CN/currencies.php | 18 ++++++++++++++++++ resources/lang/zh-CN/customers.php | 11 +++++++++++ resources/lang/zh-CN/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/zh-CN/demo.php | 16 ++++++++++++++++ resources/lang/zh-CN/footer.php | 9 +++++++++ resources/lang/zh-CN/general.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/zh-CN/header.php | 15 +++++++++++++++ resources/lang/zh-CN/import.php | 9 +++++++++ resources/lang/zh-CN/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/zh-CN/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/zh-CN/items.php | 15 +++++++++++++++ resources/lang/zh-CN/messages.php | 29 +++++++++++++++++++++++++++++ resources/lang/zh-CN/modules.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/zh-CN/notifications.php | 10 ++++++++++ resources/lang/zh-CN/pagination.php | 9 +++++++++ resources/lang/zh-CN/passwords.php | 22 ++++++++++++++++++++++ resources/lang/zh-CN/recurring.php | 20 ++++++++++++++++++++ resources/lang/zh-CN/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/zh-CN/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/zh-CN/taxes.php | 8 ++++++++ resources/lang/zh-CN/transfers.php | 12 ++++++++++++ resources/lang/zh-CN/updates.php | 15 +++++++++++++++ resources/lang/zh-CN/validation.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/zh-TW/accounts.php | 14 ++++++++++++++ resources/lang/zh-TW/auth.php | 30 ++++++++++++++++++++++++++++++ resources/lang/zh-TW/bills.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/zh-TW/companies.php | 13 +++++++++++++ resources/lang/zh-TW/currencies.php | 18 ++++++++++++++++++ resources/lang/zh-TW/customers.php | 11 +++++++++++ resources/lang/zh-TW/dashboard.php | 24 ++++++++++++++++++++++++ resources/lang/zh-TW/demo.php | 17 +++++++++++++++++ resources/lang/zh-TW/footer.php | 9 +++++++++ resources/lang/zh-TW/general.php | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/zh-TW/header.php | 15 +++++++++++++++ resources/lang/zh-TW/import.php | 9 +++++++++ resources/lang/zh-TW/install.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/lang/zh-TW/invoices.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/zh-TW/items.php | 15 +++++++++++++++ resources/lang/zh-TW/messages.php | 25 +++++++++++++++++++++++++ resources/lang/zh-TW/modules.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/zh-TW/pagination.php | 9 +++++++++ resources/lang/zh-TW/passwords.php | 22 ++++++++++++++++++++++ resources/lang/zh-TW/recurring.php | 20 ++++++++++++++++++++ resources/lang/zh-TW/reports.php | 30 ++++++++++++++++++++++++++++++ resources/lang/zh-TW/settings.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/lang/zh-TW/taxes.php | 8 ++++++++ resources/lang/zh-TW/transfers.php | 8 ++++++++ resources/lang/zh-TW/updates.php | 15 +++++++++++++++ resources/lang/zh-TW/validation.php | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/auth/forgot/create.blade.php | 32 ++++++++++++++++++++++++++++++++ resources/views/auth/login/create.blade.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/auth/permissions/create.blade.php | 25 +++++++++++++++++++++++++ resources/views/auth/permissions/edit.blade.php | 32 ++++++++++++++++++++++++++++++++ resources/views/auth/permissions/index.blade.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/auth/reset/create.blade.php | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/auth/roles/create.blade.php | 28 ++++++++++++++++++++++++++++ resources/views/auth/roles/edit.blade.php | 34 ++++++++++++++++++++++++++++++++++ resources/views/auth/roles/index.blade.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/auth/users/create.blade.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/auth/users/edit.blade.php | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/auth/users/index.blade.php | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/banking/accounts/create.blade.php | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/banking/accounts/edit.blade.php | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/banking/accounts/index.blade.php | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/banking/transactions/index.blade.php | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/banking/transfers/create.blade.php | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/banking/transfers/edit.blade.php | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/banking/transfers/index.blade.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/common/companies/create.blade.php | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/common/companies/edit.blade.php | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/common/companies/index.blade.php | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/common/dashboard/index.blade.php | 313 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/common/import/create.blade.php | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/common/items/create.blade.php | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/common/items/edit.blade.php | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/common/items/index.blade.php | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/customers/dashboard/index.blade.php | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/customers/invoices/index.blade.php | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/customers/invoices/invoice.blade.php | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/customers/invoices/show.blade.php | 219 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/customers/payments/index.blade.php | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/customers/payments/show.blade.php | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/customers/profile/edit.blade.php | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/customers/transactions/index.blade.php | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/errors/403.blade.php | 13 +++++++++++++ resources/views/expenses/bills/bill.blade.php | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/expenses/bills/create.blade.php | 509 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/expenses/bills/edit.blade.php | 486 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/expenses/bills/index.blade.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/expenses/bills/item.blade.php | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/expenses/bills/show.blade.php | 367 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/expenses/payments/create.blade.php | 206 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/expenses/payments/edit.blade.php | 194 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/expenses/payments/index.blade.php | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/expenses/vendors/create.blade.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/expenses/vendors/edit.blade.php | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/expenses/vendors/index.blade.php | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/expenses/vendors/show.blade.php | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/incomes/customers/create.blade.php | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/incomes/customers/edit.blade.php | 169 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/incomes/customers/index.blade.php | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/incomes/customers/show.blade.php | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/incomes/invoices/create.blade.php | 509 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/incomes/invoices/edit.blade.php | 486 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/incomes/invoices/index.blade.php | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/incomes/invoices/invoice.blade.php | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/incomes/invoices/item.blade.php | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/incomes/invoices/show.blade.php | 380 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/incomes/revenues/create.blade.php | 206 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/incomes/revenues/edit.blade.php | 194 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/incomes/revenues/index.blade.php | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/install/database/create.blade.php | 37 +++++++++++++++++++++++++++++++++++++ resources/views/install/language/create.blade.php | 15 +++++++++++++++ resources/views/install/requirements/show.blade.php | 3 +++ resources/views/install/settings/create.blade.php | 38 ++++++++++++++++++++++++++++++++++++++ resources/views/install/updates/index.blade.php | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/layouts/admin.blade.php | 20 ++++++++++++++++++++ resources/views/layouts/auth.blade.php | 38 ++++++++++++++++++++++++++++++++++++++ resources/views/layouts/bill.blade.php | 15 +++++++++++++++ resources/views/layouts/customer.blade.php | 20 ++++++++++++++++++++ resources/views/layouts/install.blade.php | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/layouts/invoice.blade.php | 15 +++++++++++++++ resources/views/layouts/modules.blade.php | 20 ++++++++++++++++++++ resources/views/layouts/print.blade.php | 16 ++++++++++++++++ resources/views/modals/bills/payment.blade.php | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/modals/categories/create.blade.php | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/modals/customers/create.blade.php | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/modals/invoices/payment.blade.php | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/modals/vendors/create.blade.php | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/modules/home/index.blade.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ resources/views/modules/item/show.blade.php | 324 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/modules/my/index.blade.php | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/modules/tiles/index.blade.php | 38 ++++++++++++++++++++++++++++++++++++++ resources/views/modules/token/create.blade.php | 32 ++++++++++++++++++++++++++++++++ resources/views/partials/admin/content.blade.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/views/partials/admin/footer.blade.php | 10 ++++++++++ resources/views/partials/admin/head.blade.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/partials/admin/header.blade.php | 240 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/partials/admin/menu.blade.php | 43 +++++++++++++++++++++++++++++++++++++++++++ resources/views/partials/admin/pagination.blade.php | 16 ++++++++++++++++ resources/views/partials/auth/head.blade.php | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/partials/bill/head.blade.php | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/partials/customer/content.blade.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/views/partials/customer/footer.blade.php | 7 +++++++ resources/views/partials/customer/head.blade.php | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/partials/customer/header.blade.php | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/partials/customer/menu.blade.php | 12 ++++++++++++ resources/views/partials/customer/pagination.blade.php | 16 ++++++++++++++++ resources/views/partials/form/checkbox_group.blade.php | 14 ++++++++++++++ resources/views/partials/form/delete_button.blade.php | 18 ++++++++++++++++++ resources/views/partials/form/delete_link.blade.php | 20 ++++++++++++++++++++ resources/views/partials/form/email_group.blade.php | 12 ++++++++++++ resources/views/partials/form/file_group.blade.php | 9 +++++++++ resources/views/partials/form/number_group.blade.php | 12 ++++++++++++ resources/views/partials/form/password_group.blade.php | 12 ++++++++++++ resources/views/partials/form/radio_group.blade.php | 20 ++++++++++++++++++++ resources/views/partials/form/recurring.blade.php | 43 +++++++++++++++++++++++++++++++++++++++++++ resources/views/partials/form/save_buttons.blade.php | 10 ++++++++++ resources/views/partials/form/select_group.blade.php | 12 ++++++++++++ resources/views/partials/form/text_group.blade.php | 12 ++++++++++++ resources/views/partials/form/textarea_group.blade.php | 9 +++++++++ resources/views/partials/install/head.blade.php | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/partials/invoice/head.blade.php | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/partials/modules/bar.blade.php | 23 +++++++++++++++++++++++ resources/views/partials/modules/head.blade.php | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/partials/modules/item.blade.php | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/reports/expense_summary/body.blade.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/reports/expense_summary/index.blade.php | 30 ++++++++++++++++++++++++++++++ resources/views/reports/expense_summary/print.blade.php | 7 +++++++ resources/views/reports/income_expense_summary/body.blade.php | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/reports/income_expense_summary/index.blade.php | 30 ++++++++++++++++++++++++++++++ resources/views/reports/income_expense_summary/print.blade.php | 7 +++++++ resources/views/reports/income_summary/body.blade.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/reports/income_summary/index.blade.php | 30 ++++++++++++++++++++++++++++++ resources/views/reports/income_summary/print.blade.php | 7 +++++++ resources/views/reports/profit_loss/body.blade.php | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/reports/profit_loss/index.blade.php | 30 ++++++++++++++++++++++++++++++ resources/views/reports/profit_loss/print.blade.php | 15 +++++++++++++++ resources/views/reports/tax_summary/body.blade.php | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/reports/tax_summary/index.blade.php | 30 ++++++++++++++++++++++++++++++ resources/views/reports/tax_summary/print.blade.php | 15 +++++++++++++++ resources/views/settings/categories/create.blade.php | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/settings/categories/edit.blade.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/settings/categories/index.blade.php | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/settings/currencies/create.blade.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/settings/currencies/edit.blade.php | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/settings/currencies/index.blade.php | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/settings/modules/edit.blade.php | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/settings/settings/edit.blade.php | 308 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/settings/taxes/create.blade.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/views/settings/taxes/edit.blade.php | 39 +++++++++++++++++++++++++++++++++++++++ resources/views/settings/taxes/index.blade.php | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/vendor/consoletvs/charts/chartjs/area.blade.php | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/vendor/consoletvs/charts/chartjs/bar.blade.php | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/vendor/consoletvs/charts/chartjs/donut.blade.php | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/vendor/consoletvs/charts/chartjs/line.blade.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ resources/views/vendor/consoletvs/charts/chartjs/multi/area.blade.php | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/vendor/consoletvs/charts/chartjs/multi/bar.blade.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/vendor/consoletvs/charts/chartjs/multi/line.blade.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/vendor/consoletvs/charts/chartjs/multi/line_print.blade.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/vendor/consoletvs/charts/chartjs/pie.blade.php | 47 +++++++++++++++++++++++++++++++++++++++++++++++ resources/views/vendor/flash/message.blade.php | 28 ++++++++++++++++++++++++++++ resources/views/vendor/flash/modal.blade.php | 19 +++++++++++++++++++ resources/views/vendor/language/flag.blade.php | 1 + resources/views/vendor/language/flags.blade.php | 9 +++++++++ resources/views/vendor/mail/html/button.blade.php | 19 +++++++++++++++++++ resources/views/vendor/mail/html/footer.blade.php | 11 +++++++++++ resources/views/vendor/mail/html/header.blade.php | 7 +++++++ resources/views/vendor/mail/html/layout.blade.php | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/vendor/mail/html/message.blade.php | 27 +++++++++++++++++++++++++++ resources/views/vendor/mail/html/panel.blade.php | 13 +++++++++++++ resources/views/vendor/mail/html/promotion.blade.php | 7 +++++++ resources/views/vendor/mail/html/promotion/button.blade.php | 13 +++++++++++++ resources/views/vendor/mail/html/subcopy.blade.php | 7 +++++++ resources/views/vendor/mail/html/table.blade.php | 3 +++ resources/views/vendor/mail/html/themes/default.css | 285 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/vendor/mail/markdown/button.blade.php | 1 + resources/views/vendor/mail/markdown/footer.blade.php | 1 + resources/views/vendor/mail/markdown/header.blade.php | 1 + resources/views/vendor/mail/markdown/layout.blade.php | 9 +++++++++ resources/views/vendor/mail/markdown/message.blade.php | 27 +++++++++++++++++++++++++++ resources/views/vendor/mail/markdown/panel.blade.php | 1 + resources/views/vendor/mail/markdown/promotion.blade.php | 1 + resources/views/vendor/mail/markdown/promotion/button.blade.php | 1 + resources/views/vendor/mail/markdown/subcopy.blade.php | 1 + resources/views/vendor/mail/markdown/table.blade.php | 1 + resources/views/vendor/notifications/email.blade.php | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/vendor/nwidart/menus/child/dropdown.blade.php | 12 ++++++++++++ resources/views/vendor/nwidart/menus/child/item.blade.php | 11 +++++++++++ resources/views/vendor/nwidart/menus/default.blade.php | 3 +++ resources/views/vendor/nwidart/menus/item/dropdown.blade.php | 15 +++++++++++++++ resources/views/vendor/nwidart/menus/item/item.blade.php | 12 ++++++++++++ resources/views/vendor/nwidart/menus/menu.blade.php | 7 +++++++ resources/views/vendor/nwidart/menus/nav-pills-justified.blade.php | 3 +++ resources/views/vendor/nwidart/menus/nav-pills-stacked.blade.php | 3 +++ resources/views/vendor/nwidart/menus/nav-pills.blade.php | 3 +++ resources/views/vendor/nwidart/menus/nav-tabs-justified.blade.php | 3 +++ resources/views/vendor/nwidart/menus/nav-tabs.blade.php | 3 +++ resources/views/vendor/nwidart/menus/navbar-left.blade.php | 3 +++ resources/views/vendor/nwidart/menus/navbar-right.blade.php | 3 +++ resources/views/vendor/nwidart/menus/style.blade.php | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ resources/views/vendor/pagination/bootstrap-4.blade.php | 36 ++++++++++++++++++++++++++++++++++++ resources/views/vendor/pagination/default.blade.php | 34 ++++++++++++++++++++++++++++++++++ resources/views/vendor/pagination/simple-bootstrap-4.blade.php | 17 +++++++++++++++++ resources/views/vendor/pagination/simple-default.blade.php | 17 +++++++++++++++++ routes/api.php | 42 ++++++++++++++++++++++++++++++++++++++++++ routes/channels.php | 16 ++++++++++++++++ routes/console.php | 18 ++++++++++++++++++ routes/web.php | 250 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ storage/app/.gitignore | 5 +++++ storage/app/public/.gitignore | 2 ++ storage/app/temp/.gitignore | 2 ++ storage/app/uploads/.gitignore | 2 ++ storage/dotenv-editor/.gitignore | 3 +++ storage/fonts/index.html | 1 + storage/framework/.gitignore | 8 ++++++++ storage/framework/cache/.gitignore | 2 ++ storage/framework/sessions/.gitignore | 2 ++ storage/framework/testing/.gitignore | 2 ++ storage/framework/views/.gitignore | 2 ++ storage/logs/.gitignore | 2 ++ tests/CreatesApplication.php | 22 ++++++++++++++++++++++ tests/Feature/Common/ItemsTest.php | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/Feature/ExampleTest.php | 23 +++++++++++++++++++++++ tests/Feature/FeatureTestCase.php | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/Feature/Incomes/CustomersTest.php | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/TestCase.php | 20 ++++++++++++++++++++ tests/Unit/ExampleTest.php | 20 ++++++++++++++++++++ web.config | 23 +++++++++++++++++++++++ 1652 files changed, 107345 insertions(+), 0 deletions(-) create mode 100755 .env.testing create mode 100644 .gitignore create mode 100755 .htaccess create mode 100755 Dockerfile create mode 100755 LICENSE.txt create mode 100755 app/Console/Commands/BillReminder.php create mode 100755 app/Console/Commands/CompanySeed.php create mode 100755 app/Console/Commands/Install.php create mode 100755 app/Console/Commands/InvoiceReminder.php create mode 100755 app/Console/Commands/ModuleDisable.php create mode 100755 app/Console/Commands/ModuleEnable.php create mode 100755 app/Console/Commands/ModuleInstall.php create mode 100755 app/Console/Commands/RecurringCheck.php create mode 100755 app/Console/Kernel.php create mode 100755 app/Console/Stubs/Modules/command.stub create mode 100755 app/Console/Stubs/Modules/composer.stub create mode 100755 app/Console/Stubs/Modules/controller-plain.stub create mode 100755 app/Console/Stubs/Modules/controller.stub create mode 100755 app/Console/Stubs/Modules/event.stub create mode 100755 app/Console/Stubs/Modules/job.stub create mode 100755 app/Console/Stubs/Modules/json.stub create mode 100755 app/Console/Stubs/Modules/listener.stub create mode 100755 app/Console/Stubs/Modules/mail.stub create mode 100755 app/Console/Stubs/Modules/middleware.stub create mode 100755 app/Console/Stubs/Modules/migration/add.stub create mode 100755 app/Console/Stubs/Modules/migration/create.stub create mode 100755 app/Console/Stubs/Modules/migration/delete.stub create mode 100755 app/Console/Stubs/Modules/migration/drop.stub create mode 100755 app/Console/Stubs/Modules/migration/plain.stub create mode 100755 app/Console/Stubs/Modules/model.stub create mode 100755 app/Console/Stubs/Modules/notification.stub create mode 100755 app/Console/Stubs/Modules/provider.stub create mode 100755 app/Console/Stubs/Modules/request.stub create mode 100755 app/Console/Stubs/Modules/route-provider.stub create mode 100755 app/Console/Stubs/Modules/routes.stub create mode 100755 app/Console/Stubs/Modules/scaffold/config.stub create mode 100755 app/Console/Stubs/Modules/scaffold/provider.stub create mode 100755 app/Console/Stubs/Modules/seeder.stub create mode 100755 app/Console/Stubs/Modules/start.stub create mode 100755 app/Console/Stubs/Modules/views/index.stub create mode 100755 app/Console/Stubs/Modules/views/master.stub create mode 100755 app/Events/AdminMenuCreated.php create mode 100755 app/Events/BillCreated.php create mode 100755 app/Events/BillUpdated.php create mode 100755 app/Events/CompanySwitched.php create mode 100755 app/Events/CustomerMenuCreated.php create mode 100755 app/Events/InvoiceCreated.php create mode 100755 app/Events/InvoicePaid.php create mode 100755 app/Events/InvoicePrinting.php create mode 100755 app/Events/InvoiceUpdated.php create mode 100755 app/Events/ModuleInstalled.php create mode 100755 app/Events/PaymentGatewayListing.php create mode 100755 app/Events/UpdateFinished.php create mode 100755 app/Exceptions/Handler.php create mode 100755 app/Filters/Auth/Permissions.php create mode 100755 app/Filters/Auth/Roles.php create mode 100755 app/Filters/Auth/Users.php create mode 100755 app/Filters/Banking/Accounts.php create mode 100755 app/Filters/Banking/Transactions.php create mode 100755 app/Filters/Banking/Transfers.php create mode 100755 app/Filters/Common/Companies.php create mode 100755 app/Filters/Common/Items.php create mode 100755 app/Filters/Customers/Invoices.php create mode 100755 app/Filters/Customers/Payments.php create mode 100755 app/Filters/Customers/Transactions.php create mode 100755 app/Filters/Expenses/Bills.php create mode 100755 app/Filters/Expenses/Payments.php create mode 100755 app/Filters/Expenses/Vendors.php create mode 100755 app/Filters/Incomes/Customers.php create mode 100755 app/Filters/Incomes/Invoices.php create mode 100755 app/Filters/Incomes/Revenues.php create mode 100755 app/Filters/Settings/Categories.php create mode 100755 app/Filters/Settings/Currencies.php create mode 100755 app/Filters/Settings/Taxes.php create mode 100755 app/Http/Controllers/Api/Auth/Permissions.php create mode 100755 app/Http/Controllers/Api/Auth/Roles.php create mode 100755 app/Http/Controllers/Api/Auth/Users.php create mode 100755 app/Http/Controllers/Api/Banking/Accounts.php create mode 100755 app/Http/Controllers/Api/Banking/Transfers.php create mode 100755 app/Http/Controllers/Api/Common/Companies.php create mode 100755 app/Http/Controllers/Api/Common/Items.php create mode 100755 app/Http/Controllers/Api/Common/Ping.php create mode 100755 app/Http/Controllers/Api/Expenses/Bills.php create mode 100755 app/Http/Controllers/Api/Expenses/Payments.php create mode 100755 app/Http/Controllers/Api/Expenses/Vendors.php create mode 100755 app/Http/Controllers/Api/Incomes/Customers.php create mode 100755 app/Http/Controllers/Api/Incomes/InvoicePayments.php create mode 100755 app/Http/Controllers/Api/Incomes/Invoices.php create mode 100755 app/Http/Controllers/Api/Incomes/Revenues.php create mode 100755 app/Http/Controllers/Api/Settings/Categories.php create mode 100755 app/Http/Controllers/Api/Settings/Currencies.php create mode 100755 app/Http/Controllers/Api/Settings/Settings.php create mode 100755 app/Http/Controllers/Api/Settings/Taxes.php create mode 100755 app/Http/Controllers/ApiController.php create mode 100755 app/Http/Controllers/Auth/Forgot.php create mode 100755 app/Http/Controllers/Auth/Login.php create mode 100755 app/Http/Controllers/Auth/Permissions.php create mode 100755 app/Http/Controllers/Auth/Reset.php create mode 100755 app/Http/Controllers/Auth/Roles.php create mode 100755 app/Http/Controllers/Auth/Users.php create mode 100755 app/Http/Controllers/Banking/Accounts.php create mode 100755 app/Http/Controllers/Banking/Transactions.php create mode 100755 app/Http/Controllers/Banking/Transfers.php create mode 100755 app/Http/Controllers/Common/Companies.php create mode 100755 app/Http/Controllers/Common/Dashboard.php create mode 100755 app/Http/Controllers/Common/Import.php create mode 100755 app/Http/Controllers/Common/Items.php create mode 100755 app/Http/Controllers/Common/Search.php create mode 100755 app/Http/Controllers/Common/Uploads.php create mode 100755 app/Http/Controllers/Controller.php create mode 100755 app/Http/Controllers/Customers/Dashboard.php create mode 100755 app/Http/Controllers/Customers/Invoices.php create mode 100755 app/Http/Controllers/Customers/Payments.php create mode 100755 app/Http/Controllers/Customers/Profile.php create mode 100755 app/Http/Controllers/Customers/Transactions.php create mode 100755 app/Http/Controllers/Expenses/Bills.php create mode 100755 app/Http/Controllers/Expenses/Payments.php create mode 100755 app/Http/Controllers/Expenses/Vendors.php create mode 100755 app/Http/Controllers/Incomes/Customers.php create mode 100755 app/Http/Controllers/Incomes/Invoices.php create mode 100755 app/Http/Controllers/Incomes/Revenues.php create mode 100755 app/Http/Controllers/Install/Database.php create mode 100755 app/Http/Controllers/Install/Language.php create mode 100755 app/Http/Controllers/Install/Requirements.php create mode 100755 app/Http/Controllers/Install/Settings.php create mode 100755 app/Http/Controllers/Install/Updates.php create mode 100755 app/Http/Controllers/Modals/BillPayments.php create mode 100755 app/Http/Controllers/Modals/Categories.php create mode 100755 app/Http/Controllers/Modals/Customers.php create mode 100755 app/Http/Controllers/Modals/InvoicePayments.php create mode 100755 app/Http/Controllers/Modals/Vendors.php create mode 100755 app/Http/Controllers/Modules/Home.php create mode 100755 app/Http/Controllers/Modules/Item.php create mode 100755 app/Http/Controllers/Modules/My.php create mode 100755 app/Http/Controllers/Modules/Tiles.php create mode 100755 app/Http/Controllers/Modules/Token.php create mode 100755 app/Http/Controllers/Reports/ExpenseSummary.php create mode 100755 app/Http/Controllers/Reports/IncomeExpenseSummary.php create mode 100755 app/Http/Controllers/Reports/IncomeSummary.php create mode 100755 app/Http/Controllers/Reports/ProfitLoss.php create mode 100755 app/Http/Controllers/Reports/TaxSummary.php create mode 100755 app/Http/Controllers/Settings/Categories.php create mode 100755 app/Http/Controllers/Settings/Currencies.php create mode 100755 app/Http/Controllers/Settings/Modules.php create mode 100755 app/Http/Controllers/Settings/Settings.php create mode 100755 app/Http/Controllers/Settings/Taxes.php create mode 100755 app/Http/Kernel.php create mode 100755 app/Http/Middleware/AddXHeader.php create mode 100755 app/Http/Middleware/AdminMenu.php create mode 100755 app/Http/Middleware/ApiCompany.php create mode 100755 app/Http/Middleware/CanInstall.php create mode 100755 app/Http/Middleware/CustomerMenu.php create mode 100755 app/Http/Middleware/DateFormat.php create mode 100755 app/Http/Middleware/EncryptCookies.php create mode 100755 app/Http/Middleware/LoadCurrencies.php create mode 100755 app/Http/Middleware/LoadSettings.php create mode 100755 app/Http/Middleware/Money.php create mode 100755 app/Http/Middleware/RedirectIfAuthenticated.php create mode 100755 app/Http/Middleware/RedirectIfNotInstalled.php create mode 100755 app/Http/Middleware/TrimStrings.php create mode 100755 app/Http/Middleware/VerifyCsrfToken.php create mode 100755 app/Http/Requests/Auth/Permission.php create mode 100755 app/Http/Requests/Auth/Role.php create mode 100755 app/Http/Requests/Auth/User.php create mode 100755 app/Http/Requests/Banking/Account.php create mode 100755 app/Http/Requests/Banking/Transfer.php create mode 100755 app/Http/Requests/Common/Company.php create mode 100755 app/Http/Requests/Common/Item.php create mode 100755 app/Http/Requests/Common/TotalItem.php create mode 100755 app/Http/Requests/Customer/InvoiceConfirm.php create mode 100755 app/Http/Requests/Customer/InvoicePayment.php create mode 100755 app/Http/Requests/Customer/Profile.php create mode 100755 app/Http/Requests/Expense/Bill.php create mode 100755 app/Http/Requests/Expense/BillHistory.php create mode 100755 app/Http/Requests/Expense/BillItem.php create mode 100755 app/Http/Requests/Expense/BillPayment.php create mode 100755 app/Http/Requests/Expense/BillTotal.php create mode 100755 app/Http/Requests/Expense/Payment.php create mode 100755 app/Http/Requests/Expense/Vendor.php create mode 100755 app/Http/Requests/Income/Customer.php create mode 100755 app/Http/Requests/Income/Invoice.php create mode 100755 app/Http/Requests/Income/InvoiceHistory.php create mode 100755 app/Http/Requests/Income/InvoiceItem.php create mode 100755 app/Http/Requests/Income/InvoicePayment.php create mode 100755 app/Http/Requests/Income/InvoiceTotal.php create mode 100755 app/Http/Requests/Income/Revenue.php create mode 100755 app/Http/Requests/Install/Database.php create mode 100755 app/Http/Requests/Install/Setting.php create mode 100755 app/Http/Requests/Module/Module.php create mode 100755 app/Http/Requests/Request.php create mode 100755 app/Http/Requests/Setting/Category.php create mode 100755 app/Http/Requests/Setting/Currency.php create mode 100755 app/Http/Requests/Setting/Setting.php create mode 100755 app/Http/Requests/Setting/Tax.php create mode 100755 app/Http/ViewComposers/All.php create mode 100755 app/Http/ViewComposers/Header.php create mode 100755 app/Http/ViewComposers/Index.php create mode 100755 app/Http/ViewComposers/Logo.php create mode 100755 app/Http/ViewComposers/Menu.php create mode 100755 app/Http/ViewComposers/Modules.php create mode 100755 app/Http/ViewComposers/Recurring.php create mode 100755 app/Http/ViewComposers/Suggestions.php create mode 100755 app/Listeners/Auth/Login.php create mode 100755 app/Listeners/Auth/Logout.php create mode 100755 app/Listeners/Incomes/Invoice/Paid.php create mode 100755 app/Listeners/Updates/Listener.php create mode 100755 app/Listeners/Updates/Version106.php create mode 100755 app/Listeners/Updates/Version107.php create mode 100755 app/Listeners/Updates/Version108.php create mode 100755 app/Listeners/Updates/Version109.php create mode 100755 app/Listeners/Updates/Version110.php create mode 100755 app/Listeners/Updates/Version112.php create mode 100755 app/Listeners/Updates/Version113.php create mode 100755 app/Listeners/Updates/Version119.php create mode 100755 app/Listeners/Updates/Version120.php create mode 100755 app/Listeners/Updates/Version1210.php create mode 100755 app/Listeners/Updates/Version1211.php create mode 100755 app/Listeners/Updates/Version126.php create mode 100755 app/Listeners/Updates/Version127.php create mode 100755 app/Listeners/Updates/Version129.php create mode 100755 app/Models/Auth/Permission.php create mode 100755 app/Models/Auth/Role.php create mode 100755 app/Models/Auth/User.php create mode 100755 app/Models/Banking/Account.php create mode 100755 app/Models/Banking/Transaction.php create mode 100755 app/Models/Banking/Transfer.php create mode 100755 app/Models/Common/Company.php create mode 100755 app/Models/Common/Item.php create mode 100755 app/Models/Common/Media.php create mode 100755 app/Models/Common/Recurring.php create mode 100755 app/Models/Company/Company.php create mode 100755 app/Models/Expense/Bill.php create mode 100755 app/Models/Expense/BillHistory.php create mode 100755 app/Models/Expense/BillItem.php create mode 100755 app/Models/Expense/BillPayment.php create mode 100755 app/Models/Expense/BillStatus.php create mode 100755 app/Models/Expense/BillTotal.php create mode 100755 app/Models/Expense/Payment.php create mode 100755 app/Models/Expense/Vendor.php create mode 100755 app/Models/Income/Customer.php create mode 100755 app/Models/Income/Invoice.php create mode 100755 app/Models/Income/InvoiceHistory.php create mode 100755 app/Models/Income/InvoiceItem.php create mode 100755 app/Models/Income/InvoicePayment.php create mode 100755 app/Models/Income/InvoiceStatus.php create mode 100755 app/Models/Income/InvoiceTotal.php create mode 100755 app/Models/Income/Revenue.php create mode 100755 app/Models/Item/Item.php create mode 100755 app/Models/Model.php create mode 100755 app/Models/Module/Module.php create mode 100755 app/Models/Module/ModuleHistory.php create mode 100755 app/Models/Setting/Category.php create mode 100755 app/Models/Setting/Currency.php create mode 100755 app/Models/Setting/Setting.php create mode 100755 app/Models/Setting/Tax.php create mode 100755 app/Notifications/Auth/Reset.php create mode 100755 app/Notifications/Common/Item.php create mode 100755 app/Notifications/Expense/Bill.php create mode 100755 app/Notifications/Income/Invoice.php create mode 100755 app/Observers/Company.php create mode 100755 app/Overrides/Illuminate/MessageSelector.php create mode 100755 app/Providers/AppServiceProvider.php create mode 100755 app/Providers/AuthServiceProvider.php create mode 100755 app/Providers/BroadcastServiceProvider.php create mode 100755 app/Providers/EventServiceProvider.php create mode 100755 app/Providers/FormServiceProvider.php create mode 100755 app/Providers/ObserverServiceProvider.php create mode 100755 app/Providers/RouteServiceProvider.php create mode 100755 app/Providers/ValidationServiceProvider.php create mode 100755 app/Providers/ViewComposerServiceProvider.php create mode 100755 app/Scopes/Company.php create mode 100755 app/Traits/Currencies.php create mode 100755 app/Traits/DateTime.php create mode 100755 app/Traits/Incomes.php create mode 100755 app/Traits/Media.php create mode 100755 app/Traits/Modules.php create mode 100755 app/Traits/Recurring.php create mode 100755 app/Traits/SiteApi.php create mode 100755 app/Traits/Uploads.php create mode 100755 app/Transformers/Auth/Permission.php create mode 100755 app/Transformers/Auth/Role.php create mode 100755 app/Transformers/Auth/User.php create mode 100755 app/Transformers/Banking/Account.php create mode 100755 app/Transformers/Banking/Transfer.php create mode 100755 app/Transformers/Common/Company.php create mode 100755 app/Transformers/Common/Item.php create mode 100755 app/Transformers/Company/Company.php create mode 100755 app/Transformers/Expense/Bill.php create mode 100755 app/Transformers/Expense/BillHistories.php create mode 100755 app/Transformers/Expense/BillItems.php create mode 100755 app/Transformers/Expense/BillPayments.php create mode 100755 app/Transformers/Expense/BillStatus.php create mode 100755 app/Transformers/Expense/BillTotals.php create mode 100755 app/Transformers/Expense/Payment.php create mode 100755 app/Transformers/Expense/Vendor.php create mode 100755 app/Transformers/Income/Customer.php create mode 100755 app/Transformers/Income/Invoice.php create mode 100755 app/Transformers/Income/InvoiceHistories.php create mode 100755 app/Transformers/Income/InvoiceItems.php create mode 100755 app/Transformers/Income/InvoicePayments.php create mode 100755 app/Transformers/Income/InvoiceStatus.php create mode 100755 app/Transformers/Income/InvoiceTotals.php create mode 100755 app/Transformers/Income/Revenue.php create mode 100755 app/Transformers/Item/Item.php create mode 100755 app/Transformers/Setting/Category.php create mode 100755 app/Transformers/Setting/Currency.php create mode 100755 app/Transformers/Setting/Setting.php create mode 100755 app/Transformers/Setting/Tax.php create mode 100755 app/Utilities/Import.php create mode 100755 app/Utilities/ImportFile.php create mode 100755 app/Utilities/Info.php create mode 100755 app/Utilities/Installer.php create mode 100755 app/Utilities/Modules.php create mode 100755 app/Utilities/Overrider.php create mode 100755 app/Utilities/Updater.php create mode 100755 app/Utilities/Versions.php create mode 100755 artisan create mode 100755 bootstrap/app.php create mode 100755 bootstrap/autoload.php create mode 100755 bootstrap/cache/.gitignore create mode 100755 config/api.php create mode 100755 config/app.php create mode 100755 config/auth.php create mode 100755 config/broadcasting.php create mode 100755 config/cache.php create mode 100755 config/charts.php create mode 100755 config/columnsortable.php create mode 100755 config/database.php create mode 100755 config/debugbar.php create mode 100755 config/dotenv-editor.php create mode 100755 config/eloquentfilter.php create mode 100755 config/excel.php create mode 100755 config/filesystems.php create mode 100755 config/ide-helper.php create mode 100755 config/image.php create mode 100755 config/language.php create mode 100755 config/laratrust.php create mode 100755 config/mail.php create mode 100755 config/mediable.php create mode 100755 config/menus.php create mode 100755 config/modules.php create mode 100755 config/money.php create mode 100755 config/queue.php create mode 100755 config/services.php create mode 100755 config/session.php create mode 100755 config/setting.php create mode 100755 config/version.php create mode 100755 config/view.php create mode 100755 database/.gitignore create mode 100755 database/factories/ItemFacorty.php create mode 100755 database/factories/ModelFactory.php create mode 100755 database/migrations/2017_09_01_000000_create_accounts_table.php create mode 100755 database/migrations/2017_09_01_000000_create_bills_table.php create mode 100755 database/migrations/2017_09_01_000000_create_categories_table.php create mode 100755 database/migrations/2017_09_01_000000_create_companies_table.php create mode 100755 database/migrations/2017_09_01_000000_create_currencies_table.php create mode 100755 database/migrations/2017_09_01_000000_create_customers_table.php create mode 100755 database/migrations/2017_09_01_000000_create_invoices_table.php create mode 100755 database/migrations/2017_09_01_000000_create_items_table.php create mode 100755 database/migrations/2017_09_01_000000_create_jobs_table.php create mode 100755 database/migrations/2017_09_01_000000_create_modules_table.php create mode 100755 database/migrations/2017_09_01_000000_create_notifications_table.php create mode 100755 database/migrations/2017_09_01_000000_create_password_resets_table.php create mode 100755 database/migrations/2017_09_01_000000_create_payments_table.php create mode 100755 database/migrations/2017_09_01_000000_create_revenues_table.php create mode 100755 database/migrations/2017_09_01_000000_create_roles_table.php create mode 100755 database/migrations/2017_09_01_000000_create_sessions_table.php create mode 100755 database/migrations/2017_09_01_000000_create_settings_table.php create mode 100755 database/migrations/2017_09_01_000000_create_taxes_table.php create mode 100755 database/migrations/2017_09_01_000000_create_transfers_table.php create mode 100755 database/migrations/2017_09_01_000000_create_users_table.php create mode 100755 database/migrations/2017_09_01_000000_create_vendors_table.php create mode 100755 database/migrations/2017_10_11_000000_create_bill_totals_table.php create mode 100755 database/migrations/2017_10_11_000000_create_invoice_totals_table.php create mode 100755 database/migrations/2017_11_16_000000_create_failed_jobs_table.php create mode 100755 database/migrations/2017_12_09_000000_add_currency_columns.php create mode 100755 database/migrations/2017_12_30_000000_create_mediable_tables.php create mode 100755 database/migrations/2018_01_03_000000_drop_attachment_column_bill_payments_table.php create mode 100755 database/migrations/2018_01_03_000000_drop_attachment_column_bills_table.php create mode 100755 database/migrations/2018_01_03_000000_drop_attachment_column_invoice_payments_table.php create mode 100755 database/migrations/2018_01_03_000000_drop_attachment_column_invoices_table.php create mode 100755 database/migrations/2018_01_03_000000_drop_attachment_column_payments_table.php create mode 100755 database/migrations/2018_01_03_000000_drop_attachment_column_revenues_table.php create mode 100755 database/migrations/2018_01_03_000000_drop_picture_column_items_table.php create mode 100755 database/migrations/2018_01_03_000000_drop_picture_column_users_table.php create mode 100755 database/migrations/2018_04_23_000000_add_category_column_invoices_bills.php create mode 100755 database/migrations/2018_04_26_000000_create_recurring_table.php create mode 100755 database/migrations/2018_04_30_000000_add_parent_column.php create mode 100755 database/migrations/2018_06_23_000000_modify_email_column.php create mode 100755 database/migrations/2018_06_30_000000_modify_enabled_column.php create mode 100755 database/migrations/2018_07_07_000000_modify_date_column.php create mode 100755 database/migrations/2020_01_01_000000_add_locale_column.php create mode 100755 database/seeds/Accounts.php create mode 100755 database/seeds/BillStatuses.php create mode 100755 database/seeds/Categories.php create mode 100755 database/seeds/CompanySeeder.php create mode 100755 database/seeds/Currencies.php create mode 100755 database/seeds/DatabaseSeeder.php create mode 100755 database/seeds/InvoiceStatuses.php create mode 100755 database/seeds/Modules.php create mode 100755 database/seeds/Roles.php create mode 100755 database/seeds/Settings.php create mode 100755 database/seeds/Taxes.php create mode 100755 database/seeds/TestCompany.php create mode 100755 docker-compose.yml create mode 100755 index.php create mode 100755 modules/OfflinePayment/Assets/.gitkeep create mode 100755 modules/OfflinePayment/Config/.gitkeep create mode 100755 modules/OfflinePayment/Config/config.php create mode 100755 modules/OfflinePayment/Console/.gitkeep create mode 100755 modules/OfflinePayment/Database/Migrations/.gitkeep create mode 100755 modules/OfflinePayment/Database/Migrations/2017_09_19_delete_offline_file.php create mode 100755 modules/OfflinePayment/Database/Seeders/.gitkeep create mode 100755 modules/OfflinePayment/Database/Seeders/OfflinePaymentDatabaseSeeder.php create mode 100755 modules/OfflinePayment/Entities/.gitkeep create mode 100755 modules/OfflinePayment/Events/.gitkeep create mode 100755 modules/OfflinePayment/Events/Handlers/.gitkeep create mode 100755 modules/OfflinePayment/Events/Handlers/OfflinePaymentAdminMenu.php create mode 100755 modules/OfflinePayment/Events/Handlers/OfflinePaymentGateway.php create mode 100755 modules/OfflinePayment/Http/Controllers/.gitkeep create mode 100755 modules/OfflinePayment/Http/Controllers/OfflinePayment.php create mode 100755 modules/OfflinePayment/Http/Controllers/Settings.php create mode 100755 modules/OfflinePayment/Http/Middleware/.gitkeep create mode 100755 modules/OfflinePayment/Http/Requests/.gitkeep create mode 100755 modules/OfflinePayment/Http/Requests/Setting.php create mode 100755 modules/OfflinePayment/Http/Requests/SettingDelete.php create mode 100755 modules/OfflinePayment/Http/Requests/SettingGet.php create mode 100755 modules/OfflinePayment/Http/Requests/Show.php create mode 100755 modules/OfflinePayment/Http/routes.php create mode 100755 modules/OfflinePayment/Jobs/.gitkeep create mode 100755 modules/OfflinePayment/Mail/.gitkeep create mode 100755 modules/OfflinePayment/Providers/.gitkeep create mode 100755 modules/OfflinePayment/Providers/OfflinePaymentServiceProvider.php create mode 100755 modules/OfflinePayment/Repositories/.gitkeep create mode 100755 modules/OfflinePayment/Resources/lang/.gitkeep create mode 100755 modules/OfflinePayment/Resources/lang/en-GB/offlinepayment.php create mode 100755 modules/OfflinePayment/Resources/views/.gitkeep create mode 100755 modules/OfflinePayment/Resources/views/confirm.blade.php create mode 100755 modules/OfflinePayment/Resources/views/edit.blade.php create mode 100755 modules/OfflinePayment/Resources/views/show.blade.php create mode 100755 modules/OfflinePayment/Tests/.gitkeep create mode 100755 modules/OfflinePayment/composer.json create mode 100755 modules/OfflinePayment/module.json create mode 100755 modules/OfflinePayment/start.php create mode 100755 modules/PaypalStandard/Assets/.gitkeep create mode 100755 modules/PaypalStandard/Config/.gitkeep create mode 100755 modules/PaypalStandard/Config/config.php create mode 100755 modules/PaypalStandard/Console/.gitkeep create mode 100755 modules/PaypalStandard/Database/Migrations/.gitkeep create mode 100755 modules/PaypalStandard/Database/Seeders/.gitkeep create mode 100755 modules/PaypalStandard/Database/Seeders/PaypalStandardDatabaseSeeder.php create mode 100755 modules/PaypalStandard/Entities/.gitkeep create mode 100755 modules/PaypalStandard/Events/.gitkeep create mode 100755 modules/PaypalStandard/Events/Handlers/.gitkeep create mode 100755 modules/PaypalStandard/Events/Handlers/PaypalStandardGateway.php create mode 100755 modules/PaypalStandard/Http/Controllers/.gitkeep create mode 100755 modules/PaypalStandard/Http/Controllers/PaypalStandard.php create mode 100755 modules/PaypalStandard/Http/Middleware/.gitkeep create mode 100755 modules/PaypalStandard/Http/Requests/.gitkeep create mode 100755 modules/PaypalStandard/Http/routes.php create mode 100755 modules/PaypalStandard/Jobs/.gitkeep create mode 100755 modules/PaypalStandard/Mail/.gitkeep create mode 100755 modules/PaypalStandard/Providers/.gitkeep create mode 100755 modules/PaypalStandard/Providers/PaypalStandardServiceProvider.php create mode 100755 modules/PaypalStandard/Repositories/.gitkeep create mode 100755 modules/PaypalStandard/Resources/lang/.gitkeep create mode 100755 modules/PaypalStandard/Resources/lang/en-GB/paypalstandard.php create mode 100755 modules/PaypalStandard/Resources/views/.gitkeep create mode 100755 modules/PaypalStandard/Resources/views/show.blade.php create mode 100755 modules/PaypalStandard/Tests/.gitkeep create mode 100755 modules/PaypalStandard/composer.json create mode 100755 modules/PaypalStandard/module.json create mode 100755 modules/PaypalStandard/start.php create mode 100755 phpunit.xml create mode 100755 public/css/akaunting-green.css create mode 100755 public/css/app.css create mode 100755 public/css/bootstrap-fancyfile.css create mode 100755 public/css/bootstrap3-print-fix.css create mode 100755 public/css/daterangepicker.css create mode 100755 public/css/font-awesome.min.css create mode 100755 public/css/install.css create mode 100755 public/css/ionicons.min.css create mode 100755 public/css/modules.css create mode 100755 public/css/skin-black.css create mode 100755 public/files/import/bills.xlsx create mode 100755 public/files/import/customers.xlsx create mode 100755 public/files/import/invoices.xlsx create mode 100755 public/files/import/items.xlsx create mode 100755 public/files/import/payments.xlsx create mode 100755 public/files/import/revenues.xlsx create mode 100755 public/files/import/vendors.xlsx create mode 100755 public/fonts/FontAwesome.otf create mode 100755 public/fonts/fontawesome-webfont.eot create mode 100755 public/fonts/fontawesome-webfont.svg create mode 100755 public/fonts/fontawesome-webfont.ttf create mode 100755 public/fonts/fontawesome-webfont.woff create mode 100755 public/fonts/fontawesome-webfont.woff2 create mode 100755 public/img/akaunting-logo-green.png create mode 100755 public/img/akaunting-logo-white.png create mode 100755 public/img/company.png create mode 100755 public/img/favicon.ico create mode 100755 public/img/install.jpg create mode 100755 public/img/login.jpg create mode 100755 public/img/maintanance.png create mode 100755 public/js/app.js create mode 100755 public/js/bootstrap-fancyfile.js create mode 100755 public/js/chartjs/Chart.min.js create mode 100755 public/js/daterangepicker/daterangepicker.js create mode 100755 public/js/highchart/highcharts.js create mode 100755 public/js/jquery/jquery.maskMoney.js create mode 100755 public/js/moment/locale/af.js create mode 100755 public/js/moment/locale/ar-dz.js create mode 100755 public/js/moment/locale/ar-kw.js create mode 100755 public/js/moment/locale/ar-ly.js create mode 100755 public/js/moment/locale/ar-ma.js create mode 100755 public/js/moment/locale/ar-sa.js create mode 100755 public/js/moment/locale/ar-tn.js create mode 100755 public/js/moment/locale/ar.js create mode 100755 public/js/moment/locale/az.js create mode 100755 public/js/moment/locale/be.js create mode 100755 public/js/moment/locale/bg.js create mode 100755 public/js/moment/locale/bm.js create mode 100755 public/js/moment/locale/bn.js create mode 100755 public/js/moment/locale/bo.js create mode 100755 public/js/moment/locale/br.js create mode 100755 public/js/moment/locale/bs.js create mode 100755 public/js/moment/locale/ca.js create mode 100755 public/js/moment/locale/cs.js create mode 100755 public/js/moment/locale/cv.js create mode 100755 public/js/moment/locale/cy.js create mode 100755 public/js/moment/locale/da.js create mode 100755 public/js/moment/locale/de-at.js create mode 100755 public/js/moment/locale/de-ch.js create mode 100755 public/js/moment/locale/de.js create mode 100755 public/js/moment/locale/dv.js create mode 100755 public/js/moment/locale/el.js create mode 100755 public/js/moment/locale/en-au.js create mode 100755 public/js/moment/locale/en-ca.js create mode 100755 public/js/moment/locale/en-gb.js create mode 100755 public/js/moment/locale/en-ie.js create mode 100755 public/js/moment/locale/en-nz.js create mode 100755 public/js/moment/locale/eo.js create mode 100755 public/js/moment/locale/es-do.js create mode 100755 public/js/moment/locale/es-us.js create mode 100755 public/js/moment/locale/es.js create mode 100755 public/js/moment/locale/et.js create mode 100755 public/js/moment/locale/eu.js create mode 100755 public/js/moment/locale/fa.js create mode 100755 public/js/moment/locale/fi.js create mode 100755 public/js/moment/locale/fo.js create mode 100755 public/js/moment/locale/fr-ca.js create mode 100755 public/js/moment/locale/fr-ch.js create mode 100755 public/js/moment/locale/fr.js create mode 100755 public/js/moment/locale/fy.js create mode 100755 public/js/moment/locale/gd.js create mode 100755 public/js/moment/locale/gl.js create mode 100755 public/js/moment/locale/gom-latn.js create mode 100755 public/js/moment/locale/gu.js create mode 100755 public/js/moment/locale/he.js create mode 100755 public/js/moment/locale/hi.js create mode 100755 public/js/moment/locale/hr.js create mode 100755 public/js/moment/locale/hu.js create mode 100755 public/js/moment/locale/hy-am.js create mode 100755 public/js/moment/locale/id.js create mode 100755 public/js/moment/locale/is.js create mode 100755 public/js/moment/locale/it.js create mode 100755 public/js/moment/locale/ja.js create mode 100755 public/js/moment/locale/jv.js create mode 100755 public/js/moment/locale/ka.js create mode 100755 public/js/moment/locale/kk.js create mode 100755 public/js/moment/locale/km.js create mode 100755 public/js/moment/locale/kn.js create mode 100755 public/js/moment/locale/ko.js create mode 100755 public/js/moment/locale/ky.js create mode 100755 public/js/moment/locale/lb.js create mode 100755 public/js/moment/locale/lo.js create mode 100755 public/js/moment/locale/lt.js create mode 100755 public/js/moment/locale/lv.js create mode 100755 public/js/moment/locale/me.js create mode 100755 public/js/moment/locale/mi.js create mode 100755 public/js/moment/locale/mk.js create mode 100755 public/js/moment/locale/ml.js create mode 100755 public/js/moment/locale/mr.js create mode 100755 public/js/moment/locale/ms-my.js create mode 100755 public/js/moment/locale/ms.js create mode 100755 public/js/moment/locale/my.js create mode 100755 public/js/moment/locale/nb.js create mode 100755 public/js/moment/locale/ne.js create mode 100755 public/js/moment/locale/nl-be.js create mode 100755 public/js/moment/locale/nl.js create mode 100755 public/js/moment/locale/nn.js create mode 100755 public/js/moment/locale/pa-in.js create mode 100755 public/js/moment/locale/pl.js create mode 100755 public/js/moment/locale/pt-br.js create mode 100755 public/js/moment/locale/pt.js create mode 100755 public/js/moment/locale/ro.js create mode 100755 public/js/moment/locale/ru.js create mode 100755 public/js/moment/locale/sd.js create mode 100755 public/js/moment/locale/se.js create mode 100755 public/js/moment/locale/si.js create mode 100755 public/js/moment/locale/sk.js create mode 100755 public/js/moment/locale/sl.js create mode 100755 public/js/moment/locale/sq.js create mode 100755 public/js/moment/locale/sr-cyrl.js create mode 100755 public/js/moment/locale/sr.js create mode 100755 public/js/moment/locale/ss.js create mode 100755 public/js/moment/locale/sv.js create mode 100755 public/js/moment/locale/sw.js create mode 100755 public/js/moment/locale/ta.js create mode 100755 public/js/moment/locale/te.js create mode 100755 public/js/moment/locale/tet.js create mode 100755 public/js/moment/locale/th.js create mode 100755 public/js/moment/locale/tl-ph.js create mode 100755 public/js/moment/locale/tlh.js create mode 100755 public/js/moment/locale/tr.js create mode 100755 public/js/moment/locale/tzl.js create mode 100755 public/js/moment/locale/tzm-latn.js create mode 100755 public/js/moment/locale/tzm.js create mode 100755 public/js/moment/locale/uk.js create mode 100755 public/js/moment/locale/ur.js create mode 100755 public/js/moment/locale/uz-latn.js create mode 100755 public/js/moment/locale/uz.js create mode 100755 public/js/moment/locale/vi.js create mode 100755 public/js/moment/locale/x-pseudo.js create mode 100755 public/js/moment/locale/yo.js create mode 100755 public/js/moment/locale/zh-cn.js create mode 100755 public/js/moment/locale/zh-hk.js create mode 100755 public/js/moment/locale/zh-tw.js create mode 100755 public/js/moment/moment.js create mode 100755 resources/assets/js/app.js create mode 100755 resources/assets/js/bootstrap.js create mode 100755 resources/assets/js/components/Example.vue create mode 100755 resources/assets/sass/_variables.scss create mode 100755 resources/assets/sass/app.scss create mode 100755 resources/lang/ar-SA/accounts.php create mode 100755 resources/lang/ar-SA/auth.php create mode 100755 resources/lang/ar-SA/bills.php create mode 100755 resources/lang/ar-SA/companies.php create mode 100755 resources/lang/ar-SA/currencies.php create mode 100755 resources/lang/ar-SA/customers.php create mode 100755 resources/lang/ar-SA/dashboard.php create mode 100755 resources/lang/ar-SA/demo.php create mode 100755 resources/lang/ar-SA/footer.php create mode 100755 resources/lang/ar-SA/general.php create mode 100755 resources/lang/ar-SA/header.php create mode 100755 resources/lang/ar-SA/import.php create mode 100755 resources/lang/ar-SA/install.php create mode 100755 resources/lang/ar-SA/invoices.php create mode 100755 resources/lang/ar-SA/items.php create mode 100755 resources/lang/ar-SA/messages.php create mode 100755 resources/lang/ar-SA/modules.php create mode 100755 resources/lang/ar-SA/notifications.php create mode 100755 resources/lang/ar-SA/pagination.php create mode 100755 resources/lang/ar-SA/passwords.php create mode 100755 resources/lang/ar-SA/recurring.php create mode 100755 resources/lang/ar-SA/reports.php create mode 100755 resources/lang/ar-SA/settings.php create mode 100755 resources/lang/ar-SA/taxes.php create mode 100755 resources/lang/ar-SA/transfers.php create mode 100755 resources/lang/ar-SA/updates.php create mode 100755 resources/lang/ar-SA/validation.php create mode 100755 resources/lang/bg-BG/accounts.php create mode 100755 resources/lang/bg-BG/auth.php create mode 100755 resources/lang/bg-BG/bills.php create mode 100755 resources/lang/bg-BG/companies.php create mode 100755 resources/lang/bg-BG/currencies.php create mode 100755 resources/lang/bg-BG/customers.php create mode 100755 resources/lang/bg-BG/dashboard.php create mode 100755 resources/lang/bg-BG/demo.php create mode 100755 resources/lang/bg-BG/footer.php create mode 100755 resources/lang/bg-BG/general.php create mode 100755 resources/lang/bg-BG/header.php create mode 100755 resources/lang/bg-BG/import.php create mode 100755 resources/lang/bg-BG/install.php create mode 100755 resources/lang/bg-BG/invoices.php create mode 100755 resources/lang/bg-BG/items.php create mode 100755 resources/lang/bg-BG/messages.php create mode 100755 resources/lang/bg-BG/modules.php create mode 100755 resources/lang/bg-BG/notifications.php create mode 100755 resources/lang/bg-BG/pagination.php create mode 100755 resources/lang/bg-BG/passwords.php create mode 100755 resources/lang/bg-BG/recurring.php create mode 100755 resources/lang/bg-BG/reports.php create mode 100755 resources/lang/bg-BG/settings.php create mode 100755 resources/lang/bg-BG/taxes.php create mode 100755 resources/lang/bg-BG/transfers.php create mode 100755 resources/lang/bg-BG/updates.php create mode 100755 resources/lang/bg-BG/validation.php create mode 100755 resources/lang/cs-CZ/accounts.php create mode 100755 resources/lang/cs-CZ/auth.php create mode 100755 resources/lang/cs-CZ/bills.php create mode 100755 resources/lang/cs-CZ/companies.php create mode 100755 resources/lang/cs-CZ/currencies.php create mode 100755 resources/lang/cs-CZ/customers.php create mode 100755 resources/lang/cs-CZ/dashboard.php create mode 100755 resources/lang/cs-CZ/demo.php create mode 100755 resources/lang/cs-CZ/footer.php create mode 100755 resources/lang/cs-CZ/general.php create mode 100755 resources/lang/cs-CZ/header.php create mode 100755 resources/lang/cs-CZ/import.php create mode 100755 resources/lang/cs-CZ/install.php create mode 100755 resources/lang/cs-CZ/invoices.php create mode 100755 resources/lang/cs-CZ/items.php create mode 100755 resources/lang/cs-CZ/messages.php create mode 100755 resources/lang/cs-CZ/modules.php create mode 100755 resources/lang/cs-CZ/pagination.php create mode 100755 resources/lang/cs-CZ/passwords.php create mode 100755 resources/lang/cs-CZ/recurring.php create mode 100755 resources/lang/cs-CZ/reports.php create mode 100755 resources/lang/cs-CZ/settings.php create mode 100755 resources/lang/cs-CZ/taxes.php create mode 100755 resources/lang/cs-CZ/transfers.php create mode 100755 resources/lang/cs-CZ/updates.php create mode 100755 resources/lang/cs-CZ/validation.php create mode 100755 resources/lang/da-DK/accounts.php create mode 100755 resources/lang/da-DK/auth.php create mode 100755 resources/lang/da-DK/bills.php create mode 100755 resources/lang/da-DK/companies.php create mode 100755 resources/lang/da-DK/currencies.php create mode 100755 resources/lang/da-DK/customers.php create mode 100755 resources/lang/da-DK/dashboard.php create mode 100755 resources/lang/da-DK/demo.php create mode 100755 resources/lang/da-DK/footer.php create mode 100755 resources/lang/da-DK/general.php create mode 100755 resources/lang/da-DK/header.php create mode 100755 resources/lang/da-DK/import.php create mode 100755 resources/lang/da-DK/install.php create mode 100755 resources/lang/da-DK/invoices.php create mode 100755 resources/lang/da-DK/items.php create mode 100755 resources/lang/da-DK/messages.php create mode 100755 resources/lang/da-DK/modules.php create mode 100755 resources/lang/da-DK/pagination.php create mode 100755 resources/lang/da-DK/passwords.php create mode 100755 resources/lang/da-DK/recurring.php create mode 100755 resources/lang/da-DK/reports.php create mode 100755 resources/lang/da-DK/settings.php create mode 100755 resources/lang/da-DK/taxes.php create mode 100755 resources/lang/da-DK/transfers.php create mode 100755 resources/lang/da-DK/updates.php create mode 100755 resources/lang/da-DK/validation.php create mode 100755 resources/lang/de-DE/accounts.php create mode 100755 resources/lang/de-DE/auth.php create mode 100755 resources/lang/de-DE/bills.php create mode 100755 resources/lang/de-DE/companies.php create mode 100755 resources/lang/de-DE/currencies.php create mode 100755 resources/lang/de-DE/customers.php create mode 100755 resources/lang/de-DE/dashboard.php create mode 100755 resources/lang/de-DE/demo.php create mode 100755 resources/lang/de-DE/footer.php create mode 100755 resources/lang/de-DE/general.php create mode 100755 resources/lang/de-DE/header.php create mode 100755 resources/lang/de-DE/import.php create mode 100755 resources/lang/de-DE/install.php create mode 100755 resources/lang/de-DE/invoices.php create mode 100755 resources/lang/de-DE/items.php create mode 100755 resources/lang/de-DE/messages.php create mode 100755 resources/lang/de-DE/modules.php create mode 100755 resources/lang/de-DE/notifications.php create mode 100755 resources/lang/de-DE/pagination.php create mode 100755 resources/lang/de-DE/passwords.php create mode 100755 resources/lang/de-DE/recurring.php create mode 100755 resources/lang/de-DE/reports.php create mode 100755 resources/lang/de-DE/settings.php create mode 100755 resources/lang/de-DE/taxes.php create mode 100755 resources/lang/de-DE/transfers.php create mode 100755 resources/lang/de-DE/updates.php create mode 100755 resources/lang/de-DE/validation.php create mode 100755 resources/lang/el-GR/accounts.php create mode 100755 resources/lang/el-GR/auth.php create mode 100755 resources/lang/el-GR/bills.php create mode 100755 resources/lang/el-GR/companies.php create mode 100755 resources/lang/el-GR/currencies.php create mode 100755 resources/lang/el-GR/customers.php create mode 100755 resources/lang/el-GR/dashboard.php create mode 100755 resources/lang/el-GR/demo.php create mode 100755 resources/lang/el-GR/footer.php create mode 100755 resources/lang/el-GR/general.php create mode 100755 resources/lang/el-GR/header.php create mode 100755 resources/lang/el-GR/import.php create mode 100755 resources/lang/el-GR/install.php create mode 100755 resources/lang/el-GR/invoices.php create mode 100755 resources/lang/el-GR/items.php create mode 100755 resources/lang/el-GR/messages.php create mode 100755 resources/lang/el-GR/modules.php create mode 100755 resources/lang/el-GR/notifications.php create mode 100755 resources/lang/el-GR/pagination.php create mode 100755 resources/lang/el-GR/passwords.php create mode 100755 resources/lang/el-GR/recurring.php create mode 100755 resources/lang/el-GR/reports.php create mode 100755 resources/lang/el-GR/settings.php create mode 100755 resources/lang/el-GR/taxes.php create mode 100755 resources/lang/el-GR/transfers.php create mode 100755 resources/lang/el-GR/updates.php create mode 100755 resources/lang/el-GR/validation.php create mode 100755 resources/lang/en-GB/accounts.php create mode 100755 resources/lang/en-GB/auth.php create mode 100755 resources/lang/en-GB/bills.php create mode 100755 resources/lang/en-GB/companies.php create mode 100755 resources/lang/en-GB/currencies.php create mode 100755 resources/lang/en-GB/customers.php create mode 100755 resources/lang/en-GB/dashboard.php create mode 100755 resources/lang/en-GB/demo.php create mode 100755 resources/lang/en-GB/footer.php create mode 100755 resources/lang/en-GB/general.php create mode 100755 resources/lang/en-GB/header.php create mode 100755 resources/lang/en-GB/import.php create mode 100755 resources/lang/en-GB/install.php create mode 100755 resources/lang/en-GB/invoices.php create mode 100755 resources/lang/en-GB/items.php create mode 100755 resources/lang/en-GB/messages.php create mode 100755 resources/lang/en-GB/modules.php create mode 100755 resources/lang/en-GB/notifications.php create mode 100755 resources/lang/en-GB/pagination.php create mode 100755 resources/lang/en-GB/passwords.php create mode 100755 resources/lang/en-GB/recurring.php create mode 100755 resources/lang/en-GB/reports.php create mode 100755 resources/lang/en-GB/settings.php create mode 100755 resources/lang/en-GB/taxes.php create mode 100755 resources/lang/en-GB/transfers.php create mode 100755 resources/lang/en-GB/updates.php create mode 100755 resources/lang/en-GB/validation.php create mode 100755 resources/lang/es-ES/accounts.php create mode 100755 resources/lang/es-ES/auth.php create mode 100755 resources/lang/es-ES/bills.php create mode 100755 resources/lang/es-ES/companies.php create mode 100755 resources/lang/es-ES/currencies.php create mode 100755 resources/lang/es-ES/customers.php create mode 100755 resources/lang/es-ES/dashboard.php create mode 100755 resources/lang/es-ES/demo.php create mode 100755 resources/lang/es-ES/footer.php create mode 100755 resources/lang/es-ES/general.php create mode 100755 resources/lang/es-ES/header.php create mode 100755 resources/lang/es-ES/import.php create mode 100755 resources/lang/es-ES/install.php create mode 100755 resources/lang/es-ES/invoices.php create mode 100755 resources/lang/es-ES/items.php create mode 100755 resources/lang/es-ES/messages.php create mode 100755 resources/lang/es-ES/modules.php create mode 100755 resources/lang/es-ES/pagination.php create mode 100755 resources/lang/es-ES/passwords.php create mode 100755 resources/lang/es-ES/recurring.php create mode 100755 resources/lang/es-ES/reports.php create mode 100755 resources/lang/es-ES/settings.php create mode 100755 resources/lang/es-ES/taxes.php create mode 100755 resources/lang/es-ES/transfers.php create mode 100755 resources/lang/es-ES/updates.php create mode 100755 resources/lang/es-ES/validation.php create mode 100755 resources/lang/es-MX/accounts.php create mode 100755 resources/lang/es-MX/auth.php create mode 100755 resources/lang/es-MX/bills.php create mode 100755 resources/lang/es-MX/companies.php create mode 100755 resources/lang/es-MX/currencies.php create mode 100755 resources/lang/es-MX/customers.php create mode 100755 resources/lang/es-MX/dashboard.php create mode 100755 resources/lang/es-MX/demo.php create mode 100755 resources/lang/es-MX/footer.php create mode 100755 resources/lang/es-MX/general.php create mode 100755 resources/lang/es-MX/header.php create mode 100755 resources/lang/es-MX/import.php create mode 100755 resources/lang/es-MX/install.php create mode 100755 resources/lang/es-MX/invoices.php create mode 100755 resources/lang/es-MX/items.php create mode 100755 resources/lang/es-MX/messages.php create mode 100755 resources/lang/es-MX/modules.php create mode 100755 resources/lang/es-MX/pagination.php create mode 100755 resources/lang/es-MX/passwords.php create mode 100755 resources/lang/es-MX/recurring.php create mode 100755 resources/lang/es-MX/reports.php create mode 100755 resources/lang/es-MX/settings.php create mode 100755 resources/lang/es-MX/taxes.php create mode 100755 resources/lang/es-MX/transfers.php create mode 100755 resources/lang/es-MX/updates.php create mode 100755 resources/lang/es-MX/validation.php create mode 100755 resources/lang/fa-IR/accounts.php create mode 100755 resources/lang/fa-IR/auth.php create mode 100755 resources/lang/fa-IR/bills.php create mode 100755 resources/lang/fa-IR/companies.php create mode 100755 resources/lang/fa-IR/currencies.php create mode 100755 resources/lang/fa-IR/customers.php create mode 100755 resources/lang/fa-IR/dashboard.php create mode 100755 resources/lang/fa-IR/demo.php create mode 100755 resources/lang/fa-IR/footer.php create mode 100755 resources/lang/fa-IR/general.php create mode 100755 resources/lang/fa-IR/header.php create mode 100755 resources/lang/fa-IR/import.php create mode 100755 resources/lang/fa-IR/install.php create mode 100755 resources/lang/fa-IR/invoices.php create mode 100755 resources/lang/fa-IR/items.php create mode 100755 resources/lang/fa-IR/messages.php create mode 100755 resources/lang/fa-IR/modules.php create mode 100755 resources/lang/fa-IR/pagination.php create mode 100755 resources/lang/fa-IR/passwords.php create mode 100755 resources/lang/fa-IR/recurring.php create mode 100755 resources/lang/fa-IR/reports.php create mode 100755 resources/lang/fa-IR/settings.php create mode 100755 resources/lang/fa-IR/taxes.php create mode 100755 resources/lang/fa-IR/transfers.php create mode 100755 resources/lang/fa-IR/updates.php create mode 100755 resources/lang/fa-IR/validation.php create mode 100755 resources/lang/fr-FR/accounts.php create mode 100755 resources/lang/fr-FR/auth.php create mode 100755 resources/lang/fr-FR/bills.php create mode 100755 resources/lang/fr-FR/companies.php create mode 100755 resources/lang/fr-FR/currencies.php create mode 100755 resources/lang/fr-FR/customers.php create mode 100755 resources/lang/fr-FR/dashboard.php create mode 100755 resources/lang/fr-FR/demo.php create mode 100755 resources/lang/fr-FR/footer.php create mode 100755 resources/lang/fr-FR/general.php create mode 100755 resources/lang/fr-FR/header.php create mode 100755 resources/lang/fr-FR/import.php create mode 100755 resources/lang/fr-FR/install.php create mode 100755 resources/lang/fr-FR/invoices.php create mode 100755 resources/lang/fr-FR/items.php create mode 100755 resources/lang/fr-FR/messages.php create mode 100755 resources/lang/fr-FR/modules.php create mode 100755 resources/lang/fr-FR/notifications.php create mode 100755 resources/lang/fr-FR/pagination.php create mode 100755 resources/lang/fr-FR/passwords.php create mode 100755 resources/lang/fr-FR/recurring.php create mode 100755 resources/lang/fr-FR/reports.php create mode 100755 resources/lang/fr-FR/settings.php create mode 100755 resources/lang/fr-FR/taxes.php create mode 100755 resources/lang/fr-FR/transfers.php create mode 100755 resources/lang/fr-FR/updates.php create mode 100755 resources/lang/fr-FR/validation.php create mode 100755 resources/lang/he-IL/accounts.php create mode 100755 resources/lang/he-IL/auth.php create mode 100755 resources/lang/he-IL/bills.php create mode 100755 resources/lang/he-IL/companies.php create mode 100755 resources/lang/he-IL/currencies.php create mode 100755 resources/lang/he-IL/customers.php create mode 100755 resources/lang/he-IL/dashboard.php create mode 100755 resources/lang/he-IL/demo.php create mode 100755 resources/lang/he-IL/footer.php create mode 100755 resources/lang/he-IL/general.php create mode 100755 resources/lang/he-IL/header.php create mode 100755 resources/lang/he-IL/import.php create mode 100755 resources/lang/he-IL/install.php create mode 100755 resources/lang/he-IL/invoices.php create mode 100755 resources/lang/he-IL/items.php create mode 100755 resources/lang/he-IL/messages.php create mode 100755 resources/lang/he-IL/modules.php create mode 100755 resources/lang/he-IL/notifications.php create mode 100755 resources/lang/he-IL/pagination.php create mode 100755 resources/lang/he-IL/passwords.php create mode 100755 resources/lang/he-IL/recurring.php create mode 100755 resources/lang/he-IL/reports.php create mode 100755 resources/lang/he-IL/settings.php create mode 100755 resources/lang/he-IL/taxes.php create mode 100755 resources/lang/he-IL/transfers.php create mode 100755 resources/lang/he-IL/updates.php create mode 100755 resources/lang/he-IL/validation.php create mode 100755 resources/lang/hr-HR/accounts.php create mode 100755 resources/lang/hr-HR/auth.php create mode 100755 resources/lang/hr-HR/bills.php create mode 100755 resources/lang/hr-HR/companies.php create mode 100755 resources/lang/hr-HR/currencies.php create mode 100755 resources/lang/hr-HR/customers.php create mode 100755 resources/lang/hr-HR/dashboard.php create mode 100755 resources/lang/hr-HR/demo.php create mode 100755 resources/lang/hr-HR/footer.php create mode 100755 resources/lang/hr-HR/general.php create mode 100755 resources/lang/hr-HR/header.php create mode 100755 resources/lang/hr-HR/import.php create mode 100755 resources/lang/hr-HR/install.php create mode 100755 resources/lang/hr-HR/invoices.php create mode 100755 resources/lang/hr-HR/items.php create mode 100755 resources/lang/hr-HR/messages.php create mode 100755 resources/lang/hr-HR/modules.php create mode 100755 resources/lang/hr-HR/notifications.php create mode 100755 resources/lang/hr-HR/pagination.php create mode 100755 resources/lang/hr-HR/passwords.php create mode 100755 resources/lang/hr-HR/recurring.php create mode 100755 resources/lang/hr-HR/reports.php create mode 100755 resources/lang/hr-HR/settings.php create mode 100755 resources/lang/hr-HR/taxes.php create mode 100755 resources/lang/hr-HR/transfers.php create mode 100755 resources/lang/hr-HR/updates.php create mode 100755 resources/lang/hr-HR/validation.php create mode 100755 resources/lang/id-ID/accounts.php create mode 100755 resources/lang/id-ID/auth.php create mode 100755 resources/lang/id-ID/bills.php create mode 100755 resources/lang/id-ID/companies.php create mode 100755 resources/lang/id-ID/currencies.php create mode 100755 resources/lang/id-ID/customers.php create mode 100755 resources/lang/id-ID/dashboard.php create mode 100755 resources/lang/id-ID/demo.php create mode 100755 resources/lang/id-ID/footer.php create mode 100755 resources/lang/id-ID/general.php create mode 100755 resources/lang/id-ID/header.php create mode 100755 resources/lang/id-ID/import.php create mode 100755 resources/lang/id-ID/install.php create mode 100755 resources/lang/id-ID/invoices.php create mode 100755 resources/lang/id-ID/items.php create mode 100755 resources/lang/id-ID/messages.php create mode 100755 resources/lang/id-ID/modules.php create mode 100755 resources/lang/id-ID/notifications.php create mode 100755 resources/lang/id-ID/pagination.php create mode 100755 resources/lang/id-ID/passwords.php create mode 100755 resources/lang/id-ID/recurring.php create mode 100755 resources/lang/id-ID/reports.php create mode 100755 resources/lang/id-ID/settings.php create mode 100755 resources/lang/id-ID/taxes.php create mode 100755 resources/lang/id-ID/transfers.php create mode 100755 resources/lang/id-ID/updates.php create mode 100755 resources/lang/id-ID/validation.php create mode 100755 resources/lang/it-IT/accounts.php create mode 100755 resources/lang/it-IT/auth.php create mode 100755 resources/lang/it-IT/bills.php create mode 100755 resources/lang/it-IT/companies.php create mode 100755 resources/lang/it-IT/currencies.php create mode 100755 resources/lang/it-IT/customers.php create mode 100755 resources/lang/it-IT/dashboard.php create mode 100755 resources/lang/it-IT/demo.php create mode 100755 resources/lang/it-IT/footer.php create mode 100755 resources/lang/it-IT/general.php create mode 100755 resources/lang/it-IT/header.php create mode 100755 resources/lang/it-IT/import.php create mode 100755 resources/lang/it-IT/install.php create mode 100755 resources/lang/it-IT/invoices.php create mode 100755 resources/lang/it-IT/items.php create mode 100755 resources/lang/it-IT/messages.php create mode 100755 resources/lang/it-IT/modules.php create mode 100755 resources/lang/it-IT/notifications.php create mode 100755 resources/lang/it-IT/pagination.php create mode 100755 resources/lang/it-IT/passwords.php create mode 100755 resources/lang/it-IT/recurring.php create mode 100755 resources/lang/it-IT/reports.php create mode 100755 resources/lang/it-IT/settings.php create mode 100755 resources/lang/it-IT/taxes.php create mode 100755 resources/lang/it-IT/transfers.php create mode 100755 resources/lang/it-IT/updates.php create mode 100755 resources/lang/it-IT/validation.php create mode 100755 resources/lang/lv-LV/accounts.php create mode 100755 resources/lang/lv-LV/auth.php create mode 100755 resources/lang/lv-LV/bills.php create mode 100755 resources/lang/lv-LV/companies.php create mode 100755 resources/lang/lv-LV/currencies.php create mode 100755 resources/lang/lv-LV/customers.php create mode 100755 resources/lang/lv-LV/dashboard.php create mode 100755 resources/lang/lv-LV/demo.php create mode 100755 resources/lang/lv-LV/footer.php create mode 100755 resources/lang/lv-LV/general.php create mode 100755 resources/lang/lv-LV/header.php create mode 100755 resources/lang/lv-LV/import.php create mode 100755 resources/lang/lv-LV/install.php create mode 100755 resources/lang/lv-LV/invoices.php create mode 100755 resources/lang/lv-LV/items.php create mode 100755 resources/lang/lv-LV/messages.php create mode 100755 resources/lang/lv-LV/modules.php create mode 100755 resources/lang/lv-LV/notifications.php create mode 100755 resources/lang/lv-LV/pagination.php create mode 100755 resources/lang/lv-LV/passwords.php create mode 100755 resources/lang/lv-LV/recurring.php create mode 100755 resources/lang/lv-LV/reports.php create mode 100755 resources/lang/lv-LV/settings.php create mode 100755 resources/lang/lv-LV/taxes.php create mode 100755 resources/lang/lv-LV/transfers.php create mode 100755 resources/lang/lv-LV/updates.php create mode 100755 resources/lang/lv-LV/validation.php create mode 100755 resources/lang/nb-NO/accounts.php create mode 100755 resources/lang/nb-NO/auth.php create mode 100755 resources/lang/nb-NO/bills.php create mode 100755 resources/lang/nb-NO/companies.php create mode 100755 resources/lang/nb-NO/currencies.php create mode 100755 resources/lang/nb-NO/customers.php create mode 100755 resources/lang/nb-NO/dashboard.php create mode 100755 resources/lang/nb-NO/demo.php create mode 100755 resources/lang/nb-NO/footer.php create mode 100755 resources/lang/nb-NO/general.php create mode 100755 resources/lang/nb-NO/header.php create mode 100755 resources/lang/nb-NO/import.php create mode 100755 resources/lang/nb-NO/install.php create mode 100755 resources/lang/nb-NO/invoices.php create mode 100755 resources/lang/nb-NO/items.php create mode 100755 resources/lang/nb-NO/messages.php create mode 100755 resources/lang/nb-NO/modules.php create mode 100755 resources/lang/nb-NO/pagination.php create mode 100755 resources/lang/nb-NO/passwords.php create mode 100755 resources/lang/nb-NO/recurring.php create mode 100755 resources/lang/nb-NO/reports.php create mode 100755 resources/lang/nb-NO/settings.php create mode 100755 resources/lang/nb-NO/taxes.php create mode 100755 resources/lang/nb-NO/transfers.php create mode 100755 resources/lang/nb-NO/updates.php create mode 100755 resources/lang/nb-NO/validation.php create mode 100755 resources/lang/nl-NL/accounts.php create mode 100755 resources/lang/nl-NL/auth.php create mode 100755 resources/lang/nl-NL/bills.php create mode 100755 resources/lang/nl-NL/companies.php create mode 100755 resources/lang/nl-NL/currencies.php create mode 100755 resources/lang/nl-NL/customers.php create mode 100755 resources/lang/nl-NL/dashboard.php create mode 100755 resources/lang/nl-NL/demo.php create mode 100755 resources/lang/nl-NL/footer.php create mode 100755 resources/lang/nl-NL/general.php create mode 100755 resources/lang/nl-NL/header.php create mode 100755 resources/lang/nl-NL/import.php create mode 100755 resources/lang/nl-NL/install.php create mode 100755 resources/lang/nl-NL/invoices.php create mode 100755 resources/lang/nl-NL/items.php create mode 100755 resources/lang/nl-NL/messages.php create mode 100755 resources/lang/nl-NL/modules.php create mode 100755 resources/lang/nl-NL/notifications.php create mode 100755 resources/lang/nl-NL/pagination.php create mode 100755 resources/lang/nl-NL/passwords.php create mode 100755 resources/lang/nl-NL/recurring.php create mode 100755 resources/lang/nl-NL/reports.php create mode 100755 resources/lang/nl-NL/settings.php create mode 100755 resources/lang/nl-NL/taxes.php create mode 100755 resources/lang/nl-NL/transfers.php create mode 100755 resources/lang/nl-NL/updates.php create mode 100755 resources/lang/nl-NL/validation.php create mode 100755 resources/lang/pt-BR/accounts.php create mode 100755 resources/lang/pt-BR/auth.php create mode 100755 resources/lang/pt-BR/bills.php create mode 100755 resources/lang/pt-BR/companies.php create mode 100755 resources/lang/pt-BR/currencies.php create mode 100755 resources/lang/pt-BR/customers.php create mode 100755 resources/lang/pt-BR/dashboard.php create mode 100755 resources/lang/pt-BR/demo.php create mode 100755 resources/lang/pt-BR/footer.php create mode 100755 resources/lang/pt-BR/general.php create mode 100755 resources/lang/pt-BR/header.php create mode 100755 resources/lang/pt-BR/import.php create mode 100755 resources/lang/pt-BR/install.php create mode 100755 resources/lang/pt-BR/invoices.php create mode 100755 resources/lang/pt-BR/items.php create mode 100755 resources/lang/pt-BR/messages.php create mode 100755 resources/lang/pt-BR/modules.php create mode 100755 resources/lang/pt-BR/notifications.php create mode 100755 resources/lang/pt-BR/pagination.php create mode 100755 resources/lang/pt-BR/passwords.php create mode 100755 resources/lang/pt-BR/recurring.php create mode 100755 resources/lang/pt-BR/reports.php create mode 100755 resources/lang/pt-BR/settings.php create mode 100755 resources/lang/pt-BR/taxes.php create mode 100755 resources/lang/pt-BR/transfers.php create mode 100755 resources/lang/pt-BR/updates.php create mode 100755 resources/lang/pt-BR/validation.php create mode 100755 resources/lang/pt-PT/accounts.php create mode 100755 resources/lang/pt-PT/auth.php create mode 100755 resources/lang/pt-PT/bills.php create mode 100755 resources/lang/pt-PT/companies.php create mode 100755 resources/lang/pt-PT/currencies.php create mode 100755 resources/lang/pt-PT/customers.php create mode 100755 resources/lang/pt-PT/dashboard.php create mode 100755 resources/lang/pt-PT/demo.php create mode 100755 resources/lang/pt-PT/footer.php create mode 100755 resources/lang/pt-PT/general.php create mode 100755 resources/lang/pt-PT/header.php create mode 100755 resources/lang/pt-PT/import.php create mode 100755 resources/lang/pt-PT/install.php create mode 100755 resources/lang/pt-PT/invoices.php create mode 100755 resources/lang/pt-PT/items.php create mode 100755 resources/lang/pt-PT/messages.php create mode 100755 resources/lang/pt-PT/modules.php create mode 100755 resources/lang/pt-PT/notifications.php create mode 100755 resources/lang/pt-PT/pagination.php create mode 100755 resources/lang/pt-PT/passwords.php create mode 100755 resources/lang/pt-PT/recurring.php create mode 100755 resources/lang/pt-PT/reports.php create mode 100755 resources/lang/pt-PT/settings.php create mode 100755 resources/lang/pt-PT/taxes.php create mode 100755 resources/lang/pt-PT/transfers.php create mode 100755 resources/lang/pt-PT/updates.php create mode 100755 resources/lang/pt-PT/validation.php create mode 100755 resources/lang/ro-RO/accounts.php create mode 100755 resources/lang/ro-RO/auth.php create mode 100755 resources/lang/ro-RO/bills.php create mode 100755 resources/lang/ro-RO/companies.php create mode 100755 resources/lang/ro-RO/currencies.php create mode 100755 resources/lang/ro-RO/customers.php create mode 100755 resources/lang/ro-RO/dashboard.php create mode 100755 resources/lang/ro-RO/demo.php create mode 100755 resources/lang/ro-RO/footer.php create mode 100755 resources/lang/ro-RO/general.php create mode 100755 resources/lang/ro-RO/header.php create mode 100755 resources/lang/ro-RO/import.php create mode 100755 resources/lang/ro-RO/install.php create mode 100755 resources/lang/ro-RO/invoices.php create mode 100755 resources/lang/ro-RO/items.php create mode 100755 resources/lang/ro-RO/messages.php create mode 100755 resources/lang/ro-RO/modules.php create mode 100755 resources/lang/ro-RO/notifications.php create mode 100755 resources/lang/ro-RO/pagination.php create mode 100755 resources/lang/ro-RO/passwords.php create mode 100755 resources/lang/ro-RO/recurring.php create mode 100755 resources/lang/ro-RO/reports.php create mode 100755 resources/lang/ro-RO/settings.php create mode 100755 resources/lang/ro-RO/taxes.php create mode 100755 resources/lang/ro-RO/transfers.php create mode 100755 resources/lang/ro-RO/updates.php create mode 100755 resources/lang/ro-RO/validation.php create mode 100755 resources/lang/ru-RU/accounts.php create mode 100755 resources/lang/ru-RU/auth.php create mode 100755 resources/lang/ru-RU/bills.php create mode 100755 resources/lang/ru-RU/companies.php create mode 100755 resources/lang/ru-RU/currencies.php create mode 100755 resources/lang/ru-RU/customers.php create mode 100755 resources/lang/ru-RU/dashboard.php create mode 100755 resources/lang/ru-RU/demo.php create mode 100755 resources/lang/ru-RU/footer.php create mode 100755 resources/lang/ru-RU/general.php create mode 100755 resources/lang/ru-RU/header.php create mode 100755 resources/lang/ru-RU/import.php create mode 100755 resources/lang/ru-RU/install.php create mode 100755 resources/lang/ru-RU/invoices.php create mode 100755 resources/lang/ru-RU/items.php create mode 100755 resources/lang/ru-RU/messages.php create mode 100755 resources/lang/ru-RU/modules.php create mode 100755 resources/lang/ru-RU/pagination.php create mode 100755 resources/lang/ru-RU/passwords.php create mode 100755 resources/lang/ru-RU/recurring.php create mode 100755 resources/lang/ru-RU/reports.php create mode 100755 resources/lang/ru-RU/settings.php create mode 100755 resources/lang/ru-RU/taxes.php create mode 100755 resources/lang/ru-RU/transfers.php create mode 100755 resources/lang/ru-RU/updates.php create mode 100755 resources/lang/ru-RU/validation.php create mode 100755 resources/lang/sq-AL/accounts.php create mode 100755 resources/lang/sq-AL/auth.php create mode 100755 resources/lang/sq-AL/bills.php create mode 100755 resources/lang/sq-AL/companies.php create mode 100755 resources/lang/sq-AL/currencies.php create mode 100755 resources/lang/sq-AL/customers.php create mode 100755 resources/lang/sq-AL/dashboard.php create mode 100755 resources/lang/sq-AL/demo.php create mode 100755 resources/lang/sq-AL/footer.php create mode 100755 resources/lang/sq-AL/general.php create mode 100755 resources/lang/sq-AL/header.php create mode 100755 resources/lang/sq-AL/import.php create mode 100755 resources/lang/sq-AL/install.php create mode 100755 resources/lang/sq-AL/invoices.php create mode 100755 resources/lang/sq-AL/items.php create mode 100755 resources/lang/sq-AL/messages.php create mode 100755 resources/lang/sq-AL/modules.php create mode 100755 resources/lang/sq-AL/notifications.php create mode 100755 resources/lang/sq-AL/pagination.php create mode 100755 resources/lang/sq-AL/passwords.php create mode 100755 resources/lang/sq-AL/recurring.php create mode 100755 resources/lang/sq-AL/reports.php create mode 100755 resources/lang/sq-AL/settings.php create mode 100755 resources/lang/sq-AL/taxes.php create mode 100755 resources/lang/sq-AL/transfers.php create mode 100755 resources/lang/sq-AL/updates.php create mode 100755 resources/lang/sq-AL/validation.php create mode 100755 resources/lang/sv-SE/accounts.php create mode 100755 resources/lang/sv-SE/auth.php create mode 100755 resources/lang/sv-SE/bills.php create mode 100755 resources/lang/sv-SE/companies.php create mode 100755 resources/lang/sv-SE/currencies.php create mode 100755 resources/lang/sv-SE/customers.php create mode 100755 resources/lang/sv-SE/dashboard.php create mode 100755 resources/lang/sv-SE/demo.php create mode 100755 resources/lang/sv-SE/footer.php create mode 100755 resources/lang/sv-SE/general.php create mode 100755 resources/lang/sv-SE/header.php create mode 100755 resources/lang/sv-SE/import.php create mode 100755 resources/lang/sv-SE/install.php create mode 100755 resources/lang/sv-SE/invoices.php create mode 100755 resources/lang/sv-SE/items.php create mode 100755 resources/lang/sv-SE/messages.php create mode 100755 resources/lang/sv-SE/modules.php create mode 100755 resources/lang/sv-SE/pagination.php create mode 100755 resources/lang/sv-SE/passwords.php create mode 100755 resources/lang/sv-SE/recurring.php create mode 100755 resources/lang/sv-SE/reports.php create mode 100755 resources/lang/sv-SE/settings.php create mode 100755 resources/lang/sv-SE/taxes.php create mode 100755 resources/lang/sv-SE/transfers.php create mode 100755 resources/lang/sv-SE/updates.php create mode 100755 resources/lang/sv-SE/validation.php create mode 100755 resources/lang/th-TH/accounts.php create mode 100755 resources/lang/th-TH/auth.php create mode 100755 resources/lang/th-TH/bills.php create mode 100755 resources/lang/th-TH/companies.php create mode 100755 resources/lang/th-TH/currencies.php create mode 100755 resources/lang/th-TH/customers.php create mode 100755 resources/lang/th-TH/dashboard.php create mode 100755 resources/lang/th-TH/demo.php create mode 100755 resources/lang/th-TH/footer.php create mode 100755 resources/lang/th-TH/general.php create mode 100755 resources/lang/th-TH/header.php create mode 100755 resources/lang/th-TH/import.php create mode 100755 resources/lang/th-TH/install.php create mode 100755 resources/lang/th-TH/invoices.php create mode 100755 resources/lang/th-TH/items.php create mode 100755 resources/lang/th-TH/messages.php create mode 100755 resources/lang/th-TH/modules.php create mode 100755 resources/lang/th-TH/pagination.php create mode 100755 resources/lang/th-TH/passwords.php create mode 100755 resources/lang/th-TH/recurring.php create mode 100755 resources/lang/th-TH/reports.php create mode 100755 resources/lang/th-TH/settings.php create mode 100755 resources/lang/th-TH/taxes.php create mode 100755 resources/lang/th-TH/transfers.php create mode 100755 resources/lang/th-TH/updates.php create mode 100755 resources/lang/th-TH/validation.php create mode 100755 resources/lang/tr-TR/accounts.php create mode 100755 resources/lang/tr-TR/auth.php create mode 100755 resources/lang/tr-TR/bills.php create mode 100755 resources/lang/tr-TR/companies.php create mode 100755 resources/lang/tr-TR/currencies.php create mode 100755 resources/lang/tr-TR/customers.php create mode 100755 resources/lang/tr-TR/dashboard.php create mode 100755 resources/lang/tr-TR/demo.php create mode 100755 resources/lang/tr-TR/footer.php create mode 100755 resources/lang/tr-TR/general.php create mode 100755 resources/lang/tr-TR/header.php create mode 100755 resources/lang/tr-TR/import.php create mode 100755 resources/lang/tr-TR/install.php create mode 100755 resources/lang/tr-TR/invoices.php create mode 100755 resources/lang/tr-TR/items.php create mode 100755 resources/lang/tr-TR/messages.php create mode 100755 resources/lang/tr-TR/modules.php create mode 100755 resources/lang/tr-TR/notifications.php create mode 100755 resources/lang/tr-TR/pagination.php create mode 100755 resources/lang/tr-TR/passwords.php create mode 100755 resources/lang/tr-TR/recurring.php create mode 100755 resources/lang/tr-TR/reports.php create mode 100755 resources/lang/tr-TR/settings.php create mode 100755 resources/lang/tr-TR/taxes.php create mode 100755 resources/lang/tr-TR/transfers.php create mode 100755 resources/lang/tr-TR/updates.php create mode 100755 resources/lang/tr-TR/validation.php create mode 100755 resources/lang/uk-UA/accounts.php create mode 100755 resources/lang/uk-UA/auth.php create mode 100755 resources/lang/uk-UA/bills.php create mode 100755 resources/lang/uk-UA/companies.php create mode 100755 resources/lang/uk-UA/currencies.php create mode 100755 resources/lang/uk-UA/customers.php create mode 100755 resources/lang/uk-UA/dashboard.php create mode 100755 resources/lang/uk-UA/demo.php create mode 100755 resources/lang/uk-UA/footer.php create mode 100755 resources/lang/uk-UA/general.php create mode 100755 resources/lang/uk-UA/header.php create mode 100755 resources/lang/uk-UA/import.php create mode 100755 resources/lang/uk-UA/install.php create mode 100755 resources/lang/uk-UA/invoices.php create mode 100755 resources/lang/uk-UA/items.php create mode 100755 resources/lang/uk-UA/messages.php create mode 100755 resources/lang/uk-UA/modules.php create mode 100755 resources/lang/uk-UA/pagination.php create mode 100755 resources/lang/uk-UA/passwords.php create mode 100755 resources/lang/uk-UA/recurring.php create mode 100755 resources/lang/uk-UA/reports.php create mode 100755 resources/lang/uk-UA/settings.php create mode 100755 resources/lang/uk-UA/taxes.php create mode 100755 resources/lang/uk-UA/transfers.php create mode 100755 resources/lang/uk-UA/updates.php create mode 100755 resources/lang/uk-UA/validation.php create mode 100755 resources/lang/vi-VN/accounts.php create mode 100755 resources/lang/vi-VN/auth.php create mode 100755 resources/lang/vi-VN/bills.php create mode 100755 resources/lang/vi-VN/companies.php create mode 100755 resources/lang/vi-VN/currencies.php create mode 100755 resources/lang/vi-VN/customers.php create mode 100755 resources/lang/vi-VN/dashboard.php create mode 100755 resources/lang/vi-VN/demo.php create mode 100755 resources/lang/vi-VN/footer.php create mode 100755 resources/lang/vi-VN/general.php create mode 100755 resources/lang/vi-VN/header.php create mode 100755 resources/lang/vi-VN/import.php create mode 100755 resources/lang/vi-VN/install.php create mode 100755 resources/lang/vi-VN/invoices.php create mode 100755 resources/lang/vi-VN/items.php create mode 100755 resources/lang/vi-VN/messages.php create mode 100755 resources/lang/vi-VN/modules.php create mode 100755 resources/lang/vi-VN/pagination.php create mode 100755 resources/lang/vi-VN/passwords.php create mode 100755 resources/lang/vi-VN/recurring.php create mode 100755 resources/lang/vi-VN/reports.php create mode 100755 resources/lang/vi-VN/settings.php create mode 100755 resources/lang/vi-VN/taxes.php create mode 100755 resources/lang/vi-VN/transfers.php create mode 100755 resources/lang/vi-VN/updates.php create mode 100755 resources/lang/vi-VN/validation.php create mode 100755 resources/lang/zh-CN/accounts.php create mode 100755 resources/lang/zh-CN/auth.php create mode 100755 resources/lang/zh-CN/bills.php create mode 100755 resources/lang/zh-CN/companies.php create mode 100755 resources/lang/zh-CN/currencies.php create mode 100755 resources/lang/zh-CN/customers.php create mode 100755 resources/lang/zh-CN/dashboard.php create mode 100755 resources/lang/zh-CN/demo.php create mode 100755 resources/lang/zh-CN/footer.php create mode 100755 resources/lang/zh-CN/general.php create mode 100755 resources/lang/zh-CN/header.php create mode 100755 resources/lang/zh-CN/import.php create mode 100755 resources/lang/zh-CN/install.php create mode 100755 resources/lang/zh-CN/invoices.php create mode 100755 resources/lang/zh-CN/items.php create mode 100755 resources/lang/zh-CN/messages.php create mode 100755 resources/lang/zh-CN/modules.php create mode 100755 resources/lang/zh-CN/notifications.php create mode 100755 resources/lang/zh-CN/pagination.php create mode 100755 resources/lang/zh-CN/passwords.php create mode 100755 resources/lang/zh-CN/recurring.php create mode 100755 resources/lang/zh-CN/reports.php create mode 100755 resources/lang/zh-CN/settings.php create mode 100755 resources/lang/zh-CN/taxes.php create mode 100755 resources/lang/zh-CN/transfers.php create mode 100755 resources/lang/zh-CN/updates.php create mode 100755 resources/lang/zh-CN/validation.php create mode 100755 resources/lang/zh-TW/accounts.php create mode 100755 resources/lang/zh-TW/auth.php create mode 100755 resources/lang/zh-TW/bills.php create mode 100755 resources/lang/zh-TW/companies.php create mode 100755 resources/lang/zh-TW/currencies.php create mode 100755 resources/lang/zh-TW/customers.php create mode 100755 resources/lang/zh-TW/dashboard.php create mode 100755 resources/lang/zh-TW/demo.php create mode 100755 resources/lang/zh-TW/footer.php create mode 100755 resources/lang/zh-TW/general.php create mode 100755 resources/lang/zh-TW/header.php create mode 100755 resources/lang/zh-TW/import.php create mode 100755 resources/lang/zh-TW/install.php create mode 100755 resources/lang/zh-TW/invoices.php create mode 100755 resources/lang/zh-TW/items.php create mode 100755 resources/lang/zh-TW/messages.php create mode 100755 resources/lang/zh-TW/modules.php create mode 100755 resources/lang/zh-TW/pagination.php create mode 100755 resources/lang/zh-TW/passwords.php create mode 100755 resources/lang/zh-TW/recurring.php create mode 100755 resources/lang/zh-TW/reports.php create mode 100755 resources/lang/zh-TW/settings.php create mode 100755 resources/lang/zh-TW/taxes.php create mode 100755 resources/lang/zh-TW/transfers.php create mode 100755 resources/lang/zh-TW/updates.php create mode 100755 resources/lang/zh-TW/validation.php create mode 100755 resources/views/auth/forgot/create.blade.php create mode 100755 resources/views/auth/login/create.blade.php create mode 100755 resources/views/auth/permissions/create.blade.php create mode 100755 resources/views/auth/permissions/edit.blade.php create mode 100755 resources/views/auth/permissions/index.blade.php create mode 100755 resources/views/auth/reset/create.blade.php create mode 100755 resources/views/auth/roles/create.blade.php create mode 100755 resources/views/auth/roles/edit.blade.php create mode 100755 resources/views/auth/roles/index.blade.php create mode 100755 resources/views/auth/users/create.blade.php create mode 100755 resources/views/auth/users/edit.blade.php create mode 100755 resources/views/auth/users/index.blade.php create mode 100755 resources/views/banking/accounts/create.blade.php create mode 100755 resources/views/banking/accounts/edit.blade.php create mode 100755 resources/views/banking/accounts/index.blade.php create mode 100755 resources/views/banking/transactions/index.blade.php create mode 100755 resources/views/banking/transfers/create.blade.php create mode 100755 resources/views/banking/transfers/edit.blade.php create mode 100755 resources/views/banking/transfers/index.blade.php create mode 100755 resources/views/common/companies/create.blade.php create mode 100755 resources/views/common/companies/edit.blade.php create mode 100755 resources/views/common/companies/index.blade.php create mode 100755 resources/views/common/dashboard/index.blade.php create mode 100755 resources/views/common/import/create.blade.php create mode 100755 resources/views/common/items/create.blade.php create mode 100755 resources/views/common/items/edit.blade.php create mode 100755 resources/views/common/items/index.blade.php create mode 100755 resources/views/customers/dashboard/index.blade.php create mode 100755 resources/views/customers/invoices/index.blade.php create mode 100755 resources/views/customers/invoices/invoice.blade.php create mode 100755 resources/views/customers/invoices/show.blade.php create mode 100755 resources/views/customers/payments/index.blade.php create mode 100755 resources/views/customers/payments/show.blade.php create mode 100755 resources/views/customers/profile/edit.blade.php create mode 100755 resources/views/customers/transactions/index.blade.php create mode 100755 resources/views/errors/403.blade.php create mode 100755 resources/views/expenses/bills/bill.blade.php create mode 100755 resources/views/expenses/bills/create.blade.php create mode 100755 resources/views/expenses/bills/edit.blade.php create mode 100755 resources/views/expenses/bills/index.blade.php create mode 100755 resources/views/expenses/bills/item.blade.php create mode 100755 resources/views/expenses/bills/show.blade.php create mode 100755 resources/views/expenses/payments/create.blade.php create mode 100755 resources/views/expenses/payments/edit.blade.php create mode 100755 resources/views/expenses/payments/index.blade.php create mode 100755 resources/views/expenses/vendors/create.blade.php create mode 100755 resources/views/expenses/vendors/edit.blade.php create mode 100755 resources/views/expenses/vendors/index.blade.php create mode 100755 resources/views/expenses/vendors/show.blade.php create mode 100755 resources/views/incomes/customers/create.blade.php create mode 100755 resources/views/incomes/customers/edit.blade.php create mode 100755 resources/views/incomes/customers/index.blade.php create mode 100755 resources/views/incomes/customers/show.blade.php create mode 100755 resources/views/incomes/invoices/create.blade.php create mode 100755 resources/views/incomes/invoices/edit.blade.php create mode 100755 resources/views/incomes/invoices/index.blade.php create mode 100755 resources/views/incomes/invoices/invoice.blade.php create mode 100755 resources/views/incomes/invoices/item.blade.php create mode 100755 resources/views/incomes/invoices/show.blade.php create mode 100755 resources/views/incomes/revenues/create.blade.php create mode 100755 resources/views/incomes/revenues/edit.blade.php create mode 100755 resources/views/incomes/revenues/index.blade.php create mode 100755 resources/views/install/database/create.blade.php create mode 100755 resources/views/install/language/create.blade.php create mode 100755 resources/views/install/requirements/show.blade.php create mode 100755 resources/views/install/settings/create.blade.php create mode 100755 resources/views/install/updates/index.blade.php create mode 100755 resources/views/layouts/admin.blade.php create mode 100755 resources/views/layouts/auth.blade.php create mode 100755 resources/views/layouts/bill.blade.php create mode 100755 resources/views/layouts/customer.blade.php create mode 100755 resources/views/layouts/install.blade.php create mode 100755 resources/views/layouts/invoice.blade.php create mode 100755 resources/views/layouts/modules.blade.php create mode 100755 resources/views/layouts/print.blade.php create mode 100755 resources/views/modals/bills/payment.blade.php create mode 100755 resources/views/modals/categories/create.blade.php create mode 100755 resources/views/modals/customers/create.blade.php create mode 100755 resources/views/modals/invoices/payment.blade.php create mode 100755 resources/views/modals/vendors/create.blade.php create mode 100755 resources/views/modules/home/index.blade.php create mode 100755 resources/views/modules/item/show.blade.php create mode 100755 resources/views/modules/my/index.blade.php create mode 100755 resources/views/modules/tiles/index.blade.php create mode 100755 resources/views/modules/token/create.blade.php create mode 100755 resources/views/partials/admin/content.blade.php create mode 100755 resources/views/partials/admin/footer.blade.php create mode 100755 resources/views/partials/admin/head.blade.php create mode 100755 resources/views/partials/admin/header.blade.php create mode 100755 resources/views/partials/admin/menu.blade.php create mode 100755 resources/views/partials/admin/pagination.blade.php create mode 100755 resources/views/partials/auth/head.blade.php create mode 100755 resources/views/partials/bill/head.blade.php create mode 100755 resources/views/partials/customer/content.blade.php create mode 100755 resources/views/partials/customer/footer.blade.php create mode 100755 resources/views/partials/customer/head.blade.php create mode 100755 resources/views/partials/customer/header.blade.php create mode 100755 resources/views/partials/customer/menu.blade.php create mode 100755 resources/views/partials/customer/pagination.blade.php create mode 100755 resources/views/partials/form/checkbox_group.blade.php create mode 100755 resources/views/partials/form/delete_button.blade.php create mode 100755 resources/views/partials/form/delete_link.blade.php create mode 100755 resources/views/partials/form/email_group.blade.php create mode 100755 resources/views/partials/form/file_group.blade.php create mode 100755 resources/views/partials/form/number_group.blade.php create mode 100755 resources/views/partials/form/password_group.blade.php create mode 100755 resources/views/partials/form/radio_group.blade.php create mode 100755 resources/views/partials/form/recurring.blade.php create mode 100755 resources/views/partials/form/save_buttons.blade.php create mode 100755 resources/views/partials/form/select_group.blade.php create mode 100755 resources/views/partials/form/text_group.blade.php create mode 100755 resources/views/partials/form/textarea_group.blade.php create mode 100755 resources/views/partials/install/head.blade.php create mode 100755 resources/views/partials/invoice/head.blade.php create mode 100755 resources/views/partials/modules/bar.blade.php create mode 100755 resources/views/partials/modules/head.blade.php create mode 100755 resources/views/partials/modules/item.blade.php create mode 100755 resources/views/reports/expense_summary/body.blade.php create mode 100755 resources/views/reports/expense_summary/index.blade.php create mode 100755 resources/views/reports/expense_summary/print.blade.php create mode 100755 resources/views/reports/income_expense_summary/body.blade.php create mode 100755 resources/views/reports/income_expense_summary/index.blade.php create mode 100755 resources/views/reports/income_expense_summary/print.blade.php create mode 100755 resources/views/reports/income_summary/body.blade.php create mode 100755 resources/views/reports/income_summary/index.blade.php create mode 100755 resources/views/reports/income_summary/print.blade.php create mode 100755 resources/views/reports/profit_loss/body.blade.php create mode 100755 resources/views/reports/profit_loss/index.blade.php create mode 100755 resources/views/reports/profit_loss/print.blade.php create mode 100755 resources/views/reports/tax_summary/body.blade.php create mode 100755 resources/views/reports/tax_summary/index.blade.php create mode 100755 resources/views/reports/tax_summary/print.blade.php create mode 100755 resources/views/settings/categories/create.blade.php create mode 100755 resources/views/settings/categories/edit.blade.php create mode 100755 resources/views/settings/categories/index.blade.php create mode 100755 resources/views/settings/currencies/create.blade.php create mode 100755 resources/views/settings/currencies/edit.blade.php create mode 100755 resources/views/settings/currencies/index.blade.php create mode 100755 resources/views/settings/modules/edit.blade.php create mode 100755 resources/views/settings/settings/edit.blade.php create mode 100755 resources/views/settings/taxes/create.blade.php create mode 100755 resources/views/settings/taxes/edit.blade.php create mode 100755 resources/views/settings/taxes/index.blade.php create mode 100755 resources/views/vendor/consoletvs/charts/chartjs/area.blade.php create mode 100755 resources/views/vendor/consoletvs/charts/chartjs/bar.blade.php create mode 100755 resources/views/vendor/consoletvs/charts/chartjs/donut.blade.php create mode 100755 resources/views/vendor/consoletvs/charts/chartjs/line.blade.php create mode 100755 resources/views/vendor/consoletvs/charts/chartjs/multi/area.blade.php create mode 100755 resources/views/vendor/consoletvs/charts/chartjs/multi/bar.blade.php create mode 100755 resources/views/vendor/consoletvs/charts/chartjs/multi/line.blade.php create mode 100755 resources/views/vendor/consoletvs/charts/chartjs/multi/line_print.blade.php create mode 100755 resources/views/vendor/consoletvs/charts/chartjs/pie.blade.php create mode 100755 resources/views/vendor/flash/message.blade.php create mode 100755 resources/views/vendor/flash/modal.blade.php create mode 100755 resources/views/vendor/language/flag.blade.php create mode 100755 resources/views/vendor/language/flags.blade.php create mode 100755 resources/views/vendor/mail/html/button.blade.php create mode 100755 resources/views/vendor/mail/html/footer.blade.php create mode 100755 resources/views/vendor/mail/html/header.blade.php create mode 100755 resources/views/vendor/mail/html/layout.blade.php create mode 100755 resources/views/vendor/mail/html/message.blade.php create mode 100755 resources/views/vendor/mail/html/panel.blade.php create mode 100755 resources/views/vendor/mail/html/promotion.blade.php create mode 100755 resources/views/vendor/mail/html/promotion/button.blade.php create mode 100755 resources/views/vendor/mail/html/subcopy.blade.php create mode 100755 resources/views/vendor/mail/html/table.blade.php create mode 100755 resources/views/vendor/mail/html/themes/default.css create mode 100755 resources/views/vendor/mail/markdown/button.blade.php create mode 100755 resources/views/vendor/mail/markdown/footer.blade.php create mode 100755 resources/views/vendor/mail/markdown/header.blade.php create mode 100755 resources/views/vendor/mail/markdown/layout.blade.php create mode 100755 resources/views/vendor/mail/markdown/message.blade.php create mode 100755 resources/views/vendor/mail/markdown/panel.blade.php create mode 100755 resources/views/vendor/mail/markdown/promotion.blade.php create mode 100755 resources/views/vendor/mail/markdown/promotion/button.blade.php create mode 100755 resources/views/vendor/mail/markdown/subcopy.blade.php create mode 100755 resources/views/vendor/mail/markdown/table.blade.php create mode 100755 resources/views/vendor/notifications/email.blade.php create mode 100755 resources/views/vendor/nwidart/menus/child/dropdown.blade.php create mode 100755 resources/views/vendor/nwidart/menus/child/item.blade.php create mode 100755 resources/views/vendor/nwidart/menus/default.blade.php create mode 100755 resources/views/vendor/nwidart/menus/item/dropdown.blade.php create mode 100755 resources/views/vendor/nwidart/menus/item/item.blade.php create mode 100755 resources/views/vendor/nwidart/menus/menu.blade.php create mode 100755 resources/views/vendor/nwidart/menus/nav-pills-justified.blade.php create mode 100755 resources/views/vendor/nwidart/menus/nav-pills-stacked.blade.php create mode 100755 resources/views/vendor/nwidart/menus/nav-pills.blade.php create mode 100755 resources/views/vendor/nwidart/menus/nav-tabs-justified.blade.php create mode 100755 resources/views/vendor/nwidart/menus/nav-tabs.blade.php create mode 100755 resources/views/vendor/nwidart/menus/navbar-left.blade.php create mode 100755 resources/views/vendor/nwidart/menus/navbar-right.blade.php create mode 100755 resources/views/vendor/nwidart/menus/style.blade.php create mode 100755 resources/views/vendor/pagination/bootstrap-4.blade.php create mode 100755 resources/views/vendor/pagination/default.blade.php create mode 100755 resources/views/vendor/pagination/simple-bootstrap-4.blade.php create mode 100755 resources/views/vendor/pagination/simple-default.blade.php create mode 100755 routes/api.php create mode 100755 routes/channels.php create mode 100755 routes/console.php create mode 100755 routes/web.php create mode 100755 storage/app/.gitignore create mode 100755 storage/app/public/.gitignore create mode 100755 storage/app/temp/.gitignore create mode 100755 storage/app/uploads/.gitignore create mode 100755 storage/dotenv-editor/.gitignore create mode 100755 storage/fonts/index.html create mode 100755 storage/framework/.gitignore create mode 100755 storage/framework/cache/.gitignore create mode 100755 storage/framework/sessions/.gitignore create mode 100755 storage/framework/testing/.gitignore create mode 100755 storage/framework/views/.gitignore create mode 100755 storage/logs/.gitignore create mode 100755 tests/CreatesApplication.php create mode 100755 tests/Feature/Common/ItemsTest.php create mode 100755 tests/Feature/ExampleTest.php create mode 100755 tests/Feature/FeatureTestCase.php create mode 100755 tests/Feature/Incomes/CustomersTest.php create mode 100755 tests/TestCase.php create mode 100755 tests/Unit/ExampleTest.php create mode 100755 web.config diff --git a/.env.testing b/.env.testing new file mode 100755 index 0000000..05683b4 --- /dev/null +++ b/.env.testing @@ -0,0 +1,24 @@ +APP_NAME=Akaunting +APP_ENV=testing +APP_LOCALE=en-GB +APP_INSTALLED=false +APP_KEY=base64:xBC+BxlC7sXhYAtpTZv8TYAHqoPgsJaXL0S5Id6BbBc= +APP_DEBUG=true +APP_LOG_LEVEL=debug +APP_URL=http://akaunting.test + +DB_CONNECTION=sqlite +DB_DATABASE=:memory: +DB_PREFIX= + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +SESSION_DRIVER=file +QUEUE_DRIVER=database + +MAIL_DRIVER=mail +MAIL_HOST=localhost +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bcb3d0e --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +/node_modules +/public/hot +/public/storage +/storage/*.key +/vendor +/.idea +/.vagrant +Homestead.json +Homestead.yaml +npm-debug.log +.env +robots.txt +_ide_helper.php +.phpstorm.meta.php \ No newline at end of file diff --git a/.htaccess b/.htaccess new file mode 100755 index 0000000..52fe1ab --- /dev/null +++ b/.htaccess @@ -0,0 +1,38 @@ +# Prevent Directory Listing + + IndexIgnore * + + + + # Prevent Directory Listing + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Prevent Direct Access to Protected Files + + Order deny,allow + Deny from all + + + # Prevent Direct Access To Protected Folders + RewriteRule ^(app|bootstrap|config|database|resources|routes|storage|tests)/(.*) / [L,R=301] + + # Prevent Direct Access To modules/vendor Folders Except Assets + RewriteRule ^(modules|vendor)/(.*)\.((?!ico|gif|jpg|jpeg|png|js|css|less|sass|font|woff|woff2|eot|ttf|svg).)*$ / [L,R=301] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^(.*)/$ /$1 [L,R=301] + + # Handle Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + diff --git a/Dockerfile b/Dockerfile new file mode 100755 index 0000000..1e0f6eb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +FROM php:apache + +RUN apt-get update && apt-get install -y zip libzip-dev libpng-dev \ + && docker-php-ext-install pdo_mysql gd zip \ + && rm -rf /var/lib/apt/lists/* + +# Composer installation. +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer + +# https://getcomposer.org/doc/03-cli.md#composer-allow-superuser +ENV COMPOSER_ALLOW_SUPERUSER=1 +RUN composer global require hirak/prestissimo --prefer-dist --no-progress --no-suggest --classmap-authoritative \ + && composer clear-cache +ENV PATH="${PATH}:/root/.composer/vendor/bin" + +COPY . /var/www/html/ + +# Authorize these folders to be edited +RUN chmod -R 777 /var/www/html/storage +RUN chmod -R 777 /var/www/html/bootstrap/cache + +# Allow rewrite +RUN a2enmod rewrite diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100755 index 0000000..9cecc1d --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/app/Console/Commands/BillReminder.php b/app/Console/Commands/BillReminder.php new file mode 100755 index 0000000..1df9e6a --- /dev/null +++ b/app/Console/Commands/BillReminder.php @@ -0,0 +1,93 @@ + $company->id]); + + // Override settings and currencies + Overrider::load('settings'); + Overrider::load('currencies'); + + $company->setSettings(); + + // Don't send reminders if disabled + if (!$company->send_bill_reminder) { + continue; + } + + $days = explode(',', $company->schedule_bill_days); + + foreach ($days as $day) { + $day = (int) trim($day); + + $this->remind($day, $company); + } + } + + // Unset company_id + session()->forget('company_id'); + } + + protected function remind($day, $company) + { + // Get due date + $date = Date::today()->addDays($day)->toDateString(); + + // Get upcoming bills + $bills = Bill::with('vendor')->accrued()->notPaid()->due($date)->get(); + + foreach ($bills as $bill) { + // Notify all users assigned to this company + foreach ($company->users as $user) { + if (!$user->can('read-notifications')) { + continue; + } + + $user->notify(new Notification($bill)); + } + } + } +} diff --git a/app/Console/Commands/CompanySeed.php b/app/Console/Commands/CompanySeed.php new file mode 100755 index 0000000..200ef4e --- /dev/null +++ b/app/Console/Commands/CompanySeed.php @@ -0,0 +1,47 @@ +laravel->make('CompanySeeder'); + + $seeder = $class->setContainer($this->laravel)->setCommand($this); + + $seeder->__invoke(); + } + +} diff --git a/app/Console/Commands/Install.php b/app/Console/Commands/Install.php new file mode 100755 index 0000000..9f7de98 --- /dev/null +++ b/app/Console/Commands/Install.php @@ -0,0 +1,232 @@ +checkOptions(); + if (!empty($missingOptions) && $this->option(self::OPT_NO_INTERACTION)) { + $this->line('❌ Some options are missing and --no-interaction is present. Please run the following command for more informations :'); + $this->line('❌ php artisan help install'); + $this->line('❌ Missing options are : ' . join(', ', $missingOptions)); + + return self::CMD_ERROR; + } + + $this->line('Setting locale ' . $this->locale); + Session::put(self::OPT_LOCALE, $this->locale); + + $this->prompt(); + + // Create the .env file + Installer::createDefaultEnvFile(); + + $this->line('Creating database tables'); + if (!$this->createDatabaseTables()) { + return self::CMD_ERROR; + } + + $this->line('Creating company'); + Installer::createCompany($this->companyName, $this->companyEmail, $this->locale); + + $this->line('Creating admin'); + Installer::createUser($this->adminEmail, $this->adminPassword, $this->locale); + + $this->line('Applying the final touches'); + Installer::finalTouches(); + + return self::CMD_SUCCESS; + } + + /** + * Check that all options are presents. otherwise returns an array of the missing options + */ + private function checkOptions() + { + $missingOptions = array(); + + $this->locale = $this->option(self::OPT_LOCALE); + if (empty($this->locale)) { + $missingOptions[] = self::OPT_LOCALE; + } + + $this->dbHost = $this->option(self::OPT_DB_HOST); + if (empty($this->dbHost)) { + $missingOptions[] = self::OPT_DB_HOST; + } + + $this->dbPort = $this->option(self::OPT_DB_PORT); + if (empty($this->dbPort)) { + $missingOptions[] = self::OPT_DB_PORT; + } + + $this->dbName = $this->option(self::OPT_DB_NAME); + if (empty($this->dbPort)) { + $missingOptions[] = self::OPT_DB_NAME; + } + + $this->dbUsername = $this->option(self::OPT_DB_USERNAME); + if (empty($this->dbPort)) { + $missingOptions[] = self::OPT_DB_USERNAME; + } + + $this->dbPassword = $this->option(self::OPT_DB_PASSWORD); + if (empty($this->dbPort)) { + $missingOptions[] = self::OPT_DB_PASSWORD; + } + + $this->companyName = $this->option(self::OPT_COMPANY_NAME); + if (empty($this->dbPort)) { + $missingOptions[] = self::OPT_COMPANY_NAME; + } + + $this->companyEmail = $this->option(self::OPT_COMPANY_EMAIL); + if (empty($this->dbPort)) { + $missingOptions[] = self::OPT_COMPANY_EMAIL; + } + + $this->adminEmail = $this->option(self::OPT_ADMIN_EMAIL); + if (empty($this->dbPort)) { + $missingOptions[] = self::OPT_ADMIN_EMAIL; + } + + $this->adminPassword = $this->option(self::OPT_ADMIN_PASSWORD); + if (empty($this->dbPort)) { + $missingOptions[] = self::OPT_ADMIN_PASSWORD; + } + + return $missingOptions; + } + + /** + * Ask the user for data if some options are missing. + */ + private function prompt() + { + if (empty($this->dbHost)) { + $this->dbHost = $this->ask('What is the database host?', 'localhost'); + } + + if (empty($this->dbPort)) { + $this->dbPort = $this->ask('What is the database port?', '3606'); + } + + if (empty($this->dbName)) { + $this->dbName = $this->ask('What is the database name?'); + } + + if (empty($this->dbUsername)) { + $this->dbUsername = $this->ask('What is the database username?'); + } + + if (empty($this->dbPassword)) { + $this->dbPassword = $this->secret('What is the database password?'); + } + + if (empty($this->companyName)) { + $this->companyName = $this->ask('What is the company name?'); + } + + if (empty($this->companyEmail)) { + $this->companyEmail = $this->ask('What is the company contact email?'); + } + + if (empty($this->adminEmail)) { + $this->adminEmail = $this->ask('What is the admin email?', $this->companyEmail); + } + + if (empty($this->adminPassword)) { + $this->adminPassword = $this->secret('What is the admin password?'); + } + } + + private function createDatabaseTables() { + $this->dbHost = $this->option(self::OPT_DB_HOST); + $this->dbPort = $this->option(self::OPT_DB_PORT); + $this->dbName = $this->option(self::OPT_DB_NAME); + $this->dbUsername = $this->option(self::OPT_DB_USERNAME); + $this->dbPassword = $this->option(self::OPT_DB_PASSWORD); + + $this->line('Connecting to database ' . $this->dbName . '@' . $this->dbHost . ':' . $this->dbPort); + + if (!Installer::createDbTables($this->dbHost, $this->dbPort, $this->dbName, $this->dbUsername, $this->dbPassword)) { + $this->error('Error: Could not connect to the database! Please, make sure the details are correct.'); + + return false; + } + + return true; + } +} diff --git a/app/Console/Commands/InvoiceReminder.php b/app/Console/Commands/InvoiceReminder.php new file mode 100755 index 0000000..a2c0972 --- /dev/null +++ b/app/Console/Commands/InvoiceReminder.php @@ -0,0 +1,98 @@ + $company->id]); + + // Override settings and currencies + Overrider::load('settings'); + Overrider::load('currencies'); + + $company->setSettings(); + + // Don't send reminders if disabled + if (!$company->send_invoice_reminder) { + continue; + } + + $days = explode(',', $company->schedule_invoice_days); + + foreach ($days as $day) { + $day = (int) trim($day); + + $this->remind($day, $company); + } + } + + // Unset company_id + session()->forget('company_id'); + } + + protected function remind($day, $company) + { + // Get due date + $date = Date::today()->subDays($day)->toDateString(); + + // Get upcoming bills + $invoices = Invoice::with('customer')->accrued()->notPaid()->due($date)->get(); + + foreach ($invoices as $invoice) { + // Notify the customer + if ($invoice->customer && !empty($invoice->customer_email)) { + $invoice->customer->notify(new Notification($invoice)); + } + + // Notify all users assigned to this company + foreach ($company->users as $user) { + if (!$user->can('read-notifications')) { + continue; + } + + $user->notify(new Notification($invoice)); + } + } + } +} diff --git a/app/Console/Commands/ModuleDisable.php b/app/Console/Commands/ModuleDisable.php new file mode 100755 index 0000000..79fc618 --- /dev/null +++ b/app/Console/Commands/ModuleDisable.php @@ -0,0 +1,78 @@ +argument('alias'); + $company_id = $this->argument('company_id'); + + $model = Module::alias($alias)->companyId($company_id)->first(); + + if (!$model) { + $this->info("Module [{$alias}] not found."); + return; + } + + if ($model->status == 1) { + $model->status = 0; + $model->save(); + + $module = $this->laravel['modules']->findByAlias($alias); + + // Add history + $data = [ + 'company_id' => $company_id, + 'module_id' => $model->id, + 'category' => $module->get('category'), + 'version' => $module->get('version'), + 'description' => trans('modules.disabled', ['module' => $module->get('name')]), + ]; + + ModuleHistory::create($data); + + $this->info("Module [{$alias}] disabled."); + } else { + $this->comment("Module [{$alias}] is already disabled."); + } + } + + /** + * Get the console command arguments. + * + * @return array + */ + protected function getArguments() + { + return array( + array('alias', InputArgument::REQUIRED, 'Module alias.'), + array('company_id', InputArgument::REQUIRED, 'Company ID.'), + ); + } +} diff --git a/app/Console/Commands/ModuleEnable.php b/app/Console/Commands/ModuleEnable.php new file mode 100755 index 0000000..0bb8122 --- /dev/null +++ b/app/Console/Commands/ModuleEnable.php @@ -0,0 +1,78 @@ +argument('alias'); + $company_id = $this->argument('company_id'); + + $model = Module::alias($alias)->companyId($company_id)->first(); + + if (!$model) { + $this->info("Module [{$alias}] not found."); + return; + } + + if ($model->status == 0) { + $model->status = 1; + $model->save(); + + $module = $this->laravel['modules']->findByAlias($alias); + + // Add history + $data = [ + 'company_id' => $company_id, + 'module_id' => $model->id, + 'category' => $module->get('category'), + 'version' => $module->get('version'), + 'description' => trans('modules.enabled', ['module' => $module->get('name')]), + ]; + + ModuleHistory::create($data); + + $this->info("Module [{$alias}] enabled."); + } else { + $this->comment("Module [{$alias}] is already enabled."); + } + } + + /** + * Get the console command arguments. + * + * @return array + */ + protected function getArguments() + { + return array( + array('alias', InputArgument::REQUIRED, 'Module alias.'), + array('company_id', InputArgument::REQUIRED, 'Company ID.'), + ); + } +} diff --git a/app/Console/Commands/ModuleInstall.php b/app/Console/Commands/ModuleInstall.php new file mode 100755 index 0000000..fa428a7 --- /dev/null +++ b/app/Console/Commands/ModuleInstall.php @@ -0,0 +1,78 @@ + $this->argument('company_id'), + 'alias' => strtolower($this->argument('alias')), + 'status' => '1', + ]; + + $model = Module::create($request); + + $module = $this->laravel['modules']->findByAlias($model->alias); + + $company_id = $this->argument('company_id'); + + // Add history + $data = [ + 'company_id' => $company_id, + 'module_id' => $model->id, + 'category' => $module->get('category'), + 'version' => $module->get('version'), + 'description' => trans('modules.installed', ['module' => $module->get('name')]), + ]; + + ModuleHistory::create($data); + + // Update database + $this->call('migrate', ['--force' => true]); + + // Trigger event + event(new ModuleInstalled($model->alias, $company_id)); + + $this->info('Module installed!'); + } + + /** + * Get the console command arguments. + * + * @return array + */ + protected function getArguments() + { + return array( + array('alias', InputArgument::REQUIRED, 'Module alias.'), + array('company_id', InputArgument::REQUIRED, 'Company ID.'), + ); + } +} diff --git a/app/Console/Commands/RecurringCheck.php b/app/Console/Commands/RecurringCheck.php new file mode 100755 index 0000000..8b41c49 --- /dev/null +++ b/app/Console/Commands/RecurringCheck.php @@ -0,0 +1,192 @@ +today = Date::today(); + + // Get all companies + $companies = Company::all(); + + foreach ($companies as $company) { + // Set company id + session(['company_id' => $company->id]); + + // Override settings and currencies + Overrider::load('settings'); + Overrider::load('currencies'); + + $company->setSettings(); + + foreach ($company->recurring as $recur) { + if (!$current = $recur->current()) { + continue; + } + + $current_date = Date::parse($current->format('Y-m-d')); + + // Check if should recur today + if ($this->today->ne($current_date)) { + continue; + } + + $model = $recur->recurable; + + if (!$model) { + continue; + } + + switch ($recur->recurable_type) { + case 'App\Models\Expense\Bill': + $this->recurBill($company, $model); + break; + case 'App\Models\Income\Invoice': + $this->recurInvoice($company, $model); + break; + case 'App\Models\Expense\Payment': + case 'App\Models\Income\Revenue': + $model->cloneable_relations = []; + + // Create new record + $clone = $model->duplicate(); + + $clone->parent_id = $model->id; + $clone->paid_at = $this->today->format('Y-m-d'); + $clone->save(); + + break; + } + } + } + + // Unset company_id + session()->forget('company_id'); + } + + protected function recurInvoice($company, $model) + { + $model->cloneable_relations = ['items', 'totals']; + + // Create new record + $clone = $model->duplicate(); + + // Set original invoice id + $clone->parent_id = $model->id; + + // Days between invoiced and due date + $diff_days = Date::parse($clone->due_at)->diffInDays(Date::parse($clone->invoiced_at)); + + // Update dates + $clone->invoiced_at = $this->today->format('Y-m-d'); + $clone->due_at = $this->today->addDays($diff_days)->format('Y-m-d'); + $clone->save(); + + // Add invoice history + InvoiceHistory::create([ + 'company_id' => session('company_id'), + 'invoice_id' => $clone->id, + 'status_code' => 'draft', + 'notify' => 0, + 'description' => trans('messages.success.added', ['type' => $clone->invoice_number]), + ]); + + // Notify the customer + if ($clone->customer && !empty($clone->customer_email)) { + $clone->customer->notify(new InvoiceNotification($clone)); + } + + // Notify all users assigned to this company + foreach ($company->users as $user) { + if (!$user->can('read-notifications')) { + continue; + } + + $user->notify(new InvoiceNotification($clone)); + } + + // Update next invoice number + $this->increaseNextInvoiceNumber(); + } + + protected function recurBill($company, $model) + { + $model->cloneable_relations = ['items', 'totals']; + + // Create new record + $clone = $model->duplicate(); + + // Set original bill id + $clone->parent_id = $model->id; + + // Days between invoiced and due date + $diff_days = Date::parse($clone->due_at)->diffInDays(Date::parse($clone->invoiced_at)); + + // Update dates + $clone->billed_at = $this->today->format('Y-m-d'); + $clone->due_at = $this->today->addDays($diff_days)->format('Y-m-d'); + $clone->save(); + + // Add bill history + BillHistory::create([ + 'company_id' => session('company_id'), + 'bill_id' => $clone->id, + 'status_code' => 'draft', + 'notify' => 0, + 'description' => trans('messages.success.added', ['type' => $clone->bill_number]), + ]); + + // Notify all users assigned to this company + foreach ($company->users as $user) { + if (!$user->can('read-notifications')) { + continue; + } + + $user->notify(new BillNotification($clone)); + } + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php new file mode 100755 index 0000000..d8f35a8 --- /dev/null +++ b/app/Console/Kernel.php @@ -0,0 +1,53 @@ +command('reminder:invoice')->dailyAt(setting('general.schedule_time', '09:00')); + $schedule->command('reminder:bill')->dailyAt(setting('general.schedule_time', '09:00')); + $schedule->command('recurring:check')->dailyAt(setting('general.schedule_time', '09:00')); + } + + /** + * Register the Closure based commands for the application. + * + * @return void + */ + protected function commands() + { + require base_path('routes/console.php'); + } +} diff --git a/app/Console/Stubs/Modules/command.stub b/app/Console/Stubs/Modules/command.stub new file mode 100755 index 0000000..1537601 --- /dev/null +++ b/app/Console/Stubs/Modules/command.stub @@ -0,0 +1,68 @@ +view('view.name'); + } +} diff --git a/app/Console/Stubs/Modules/middleware.stub b/app/Console/Stubs/Modules/middleware.stub new file mode 100755 index 0000000..954583e --- /dev/null +++ b/app/Console/Stubs/Modules/middleware.stub @@ -0,0 +1,21 @@ +increments('id'); +$FIELDS$ + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('$TABLE$'); + } +} diff --git a/app/Console/Stubs/Modules/migration/delete.stub b/app/Console/Stubs/Modules/migration/delete.stub new file mode 100755 index 0000000..53ec1b3 --- /dev/null +++ b/app/Console/Stubs/Modules/migration/delete.stub @@ -0,0 +1,32 @@ +increments('id'); +$FIELDS$ + $table->timestamps(); + }); + } +} diff --git a/app/Console/Stubs/Modules/migration/plain.stub b/app/Console/Stubs/Modules/migration/plain.stub new file mode 100755 index 0000000..cc014c6 --- /dev/null +++ b/app/Console/Stubs/Modules/migration/plain.stub @@ -0,0 +1,28 @@ +line('The introduction to the notification.') + ->action('Notification Action', 'https://laravel.com') + ->line('Thank you for using our application!'); + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + // + ]; + } +} diff --git a/app/Console/Stubs/Modules/provider.stub b/app/Console/Stubs/Modules/provider.stub new file mode 100755 index 0000000..4fd17be --- /dev/null +++ b/app/Console/Stubs/Modules/provider.stub @@ -0,0 +1,35 @@ +routesAreCached()) { + // require __DIR__ . '/Http/routes.php'; + // } + } +} diff --git a/app/Console/Stubs/Modules/routes.stub b/app/Console/Stubs/Modules/routes.stub new file mode 100755 index 0000000..35865ba --- /dev/null +++ b/app/Console/Stubs/Modules/routes.stub @@ -0,0 +1,6 @@ + 'web', 'prefix' => '$LOWER_NAME$', 'namespace' => '$MODULE_NAMESPACE$\$STUDLY_NAME$\Http\Controllers'], function() +{ + Route::get('/', '$STUDLY_NAME$Controller@index'); +}); diff --git a/app/Console/Stubs/Modules/scaffold/config.stub b/app/Console/Stubs/Modules/scaffold/config.stub new file mode 100755 index 0000000..0547f55 --- /dev/null +++ b/app/Console/Stubs/Modules/scaffold/config.stub @@ -0,0 +1,7 @@ + '$STUDLY_NAME$', + +]; diff --git a/app/Console/Stubs/Modules/scaffold/provider.stub b/app/Console/Stubs/Modules/scaffold/provider.stub new file mode 100755 index 0000000..1ee8297 --- /dev/null +++ b/app/Console/Stubs/Modules/scaffold/provider.stub @@ -0,0 +1,111 @@ +registerTranslations(); + $this->registerConfig(); + $this->registerViews(); + $this->registerFactories(); + } + + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + // + } + + /** + * Register config. + * + * @return void + */ + protected function registerConfig() + { + $this->publishes([ + __DIR__.'/../$PATH_CONFIG$/config.php' => config_path('$LOWER_NAME$.php'), + ], 'config'); + $this->mergeConfigFrom( + __DIR__.'/../$PATH_CONFIG$/config.php', '$LOWER_NAME$' + ); + } + + /** + * Register views. + * + * @return void + */ + public function registerViews() + { + $viewPath = resource_path('views/modules/$LOWER_NAME$'); + + $sourcePath = __DIR__.'/../$PATH_VIEWS$'; + + $this->publishes([ + $sourcePath => $viewPath + ]); + + $this->loadViewsFrom(array_merge(array_map(function ($path) { + return $path . '/modules/$LOWER_NAME$'; + }, \Config::get('view.paths')), [$sourcePath]), '$LOWER_NAME$'); + } + + /** + * Register translations. + * + * @return void + */ + public function registerTranslations() + { + $langPath = resource_path('lang/modules/$LOWER_NAME$'); + + if (is_dir($langPath)) { + $this->loadTranslationsFrom($langPath, '$LOWER_NAME$'); + } else { + $this->loadTranslationsFrom(__DIR__ .'/../$PATH_LANG$', '$LOWER_NAME$'); + } + } + + /** + * Register an additional directory of factories. + * @source https://github.com/sebastiaanluca/laravel-resource-flow/blob/develop/src/Modules/ModuleServiceProvider.php#L66 + */ + public function registerFactories() + { + if (! app()->environment('production')) { + app(Factory::class)->load(__DIR__ . '/Database/factories'); + } + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() + { + return []; + } +} diff --git a/app/Console/Stubs/Modules/seeder.stub b/app/Console/Stubs/Modules/seeder.stub new file mode 100755 index 0000000..dd43490 --- /dev/null +++ b/app/Console/Stubs/Modules/seeder.stub @@ -0,0 +1,21 @@ +call("OthersTableSeeder"); + } +} diff --git a/app/Console/Stubs/Modules/start.stub b/app/Console/Stubs/Modules/start.stub new file mode 100755 index 0000000..140a105 --- /dev/null +++ b/app/Console/Stubs/Modules/start.stub @@ -0,0 +1,17 @@ +routesAreCached()) { + require __DIR__ . '/Http/routes.php'; +} diff --git a/app/Console/Stubs/Modules/views/index.stub b/app/Console/Stubs/Modules/views/index.stub new file mode 100755 index 0000000..4a64852 --- /dev/null +++ b/app/Console/Stubs/Modules/views/index.stub @@ -0,0 +1,9 @@ +@extends('$LOWER_NAME$::layouts.master') + +@section('content') +

Hello World

+ +

+ This view is loaded from module: {!! config('$LOWER_NAME$.name') !!} +

+@stop diff --git a/app/Console/Stubs/Modules/views/master.stub b/app/Console/Stubs/Modules/views/master.stub new file mode 100755 index 0000000..14fd322 --- /dev/null +++ b/app/Console/Stubs/Modules/views/master.stub @@ -0,0 +1,12 @@ + + + + + + + Module $STUDLY_NAME$ + + + @yield('content') + + diff --git a/app/Events/AdminMenuCreated.php b/app/Events/AdminMenuCreated.php new file mode 100755 index 0000000..9883abb --- /dev/null +++ b/app/Events/AdminMenuCreated.php @@ -0,0 +1,18 @@ +menu = $menu; + } +} \ No newline at end of file diff --git a/app/Events/BillCreated.php b/app/Events/BillCreated.php new file mode 100755 index 0000000..fc4881a --- /dev/null +++ b/app/Events/BillCreated.php @@ -0,0 +1,18 @@ +bill = $bill; + } +} \ No newline at end of file diff --git a/app/Events/BillUpdated.php b/app/Events/BillUpdated.php new file mode 100755 index 0000000..21751e1 --- /dev/null +++ b/app/Events/BillUpdated.php @@ -0,0 +1,18 @@ +bill = $bill; + } +} \ No newline at end of file diff --git a/app/Events/CompanySwitched.php b/app/Events/CompanySwitched.php new file mode 100755 index 0000000..3738c8d --- /dev/null +++ b/app/Events/CompanySwitched.php @@ -0,0 +1,18 @@ +company = $company; + } +} \ No newline at end of file diff --git a/app/Events/CustomerMenuCreated.php b/app/Events/CustomerMenuCreated.php new file mode 100755 index 0000000..5766e1b --- /dev/null +++ b/app/Events/CustomerMenuCreated.php @@ -0,0 +1,18 @@ +menu = $menu; + } +} \ No newline at end of file diff --git a/app/Events/InvoiceCreated.php b/app/Events/InvoiceCreated.php new file mode 100755 index 0000000..afa2e3c --- /dev/null +++ b/app/Events/InvoiceCreated.php @@ -0,0 +1,18 @@ +invoice = $invoice; + } +} \ No newline at end of file diff --git a/app/Events/InvoicePaid.php b/app/Events/InvoicePaid.php new file mode 100755 index 0000000..33fab77 --- /dev/null +++ b/app/Events/InvoicePaid.php @@ -0,0 +1,21 @@ +invoice = $invoice; + $this->request = $request; + } +} diff --git a/app/Events/InvoicePrinting.php b/app/Events/InvoicePrinting.php new file mode 100755 index 0000000..f775b69 --- /dev/null +++ b/app/Events/InvoicePrinting.php @@ -0,0 +1,18 @@ +invoice = $invoice; + } +} \ No newline at end of file diff --git a/app/Events/InvoiceUpdated.php b/app/Events/InvoiceUpdated.php new file mode 100755 index 0000000..d9d6fc3 --- /dev/null +++ b/app/Events/InvoiceUpdated.php @@ -0,0 +1,18 @@ +invoice = $invoice; + } +} \ No newline at end of file diff --git a/app/Events/ModuleInstalled.php b/app/Events/ModuleInstalled.php new file mode 100755 index 0000000..b581eb5 --- /dev/null +++ b/app/Events/ModuleInstalled.php @@ -0,0 +1,22 @@ +alias = $alias; + $this->company_id = $company_id; + } +} \ No newline at end of file diff --git a/app/Events/PaymentGatewayListing.php b/app/Events/PaymentGatewayListing.php new file mode 100755 index 0000000..65f1ad8 --- /dev/null +++ b/app/Events/PaymentGatewayListing.php @@ -0,0 +1,18 @@ +gateways = $gateways; + } +} diff --git a/app/Events/UpdateFinished.php b/app/Events/UpdateFinished.php new file mode 100755 index 0000000..d221c60 --- /dev/null +++ b/app/Events/UpdateFinished.php @@ -0,0 +1,26 @@ +alias = $alias; + $this->old = $old; + $this->new = $new; + } +} \ No newline at end of file diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php new file mode 100755 index 0000000..a747e31 --- /dev/null +++ b/app/Exceptions/Handler.php @@ -0,0 +1,65 @@ +expectsJson()) { + return response()->json(['error' => 'Unauthenticated.'], 401); + } + + return redirect()->guest(route('login')); + } +} diff --git a/app/Filters/Auth/Permissions.php b/app/Filters/Auth/Permissions.php new file mode 100755 index 0000000..9ae73cf --- /dev/null +++ b/app/Filters/Auth/Permissions.php @@ -0,0 +1,21 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->whereLike('display_name', $query); + } +} \ No newline at end of file diff --git a/app/Filters/Auth/Roles.php b/app/Filters/Auth/Roles.php new file mode 100755 index 0000000..8eb71d6 --- /dev/null +++ b/app/Filters/Auth/Roles.php @@ -0,0 +1,21 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->whereLike('display_name', $query); + } +} \ No newline at end of file diff --git a/app/Filters/Auth/Users.php b/app/Filters/Auth/Users.php new file mode 100755 index 0000000..950507e --- /dev/null +++ b/app/Filters/Auth/Users.php @@ -0,0 +1,26 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->where('name', 'LIKE', '%' . $query . '%')->orWhere('email', 'LIKE', '%' . $query . '%'); + } + + public function role($id) + { + return $this->related('roles', 'role_id', $id); + } +} \ No newline at end of file diff --git a/app/Filters/Banking/Accounts.php b/app/Filters/Banking/Accounts.php new file mode 100755 index 0000000..df3ae03 --- /dev/null +++ b/app/Filters/Banking/Accounts.php @@ -0,0 +1,21 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->whereLike('name', $query); + } +} \ No newline at end of file diff --git a/app/Filters/Banking/Transactions.php b/app/Filters/Banking/Transactions.php new file mode 100755 index 0000000..8c64cb9 --- /dev/null +++ b/app/Filters/Banking/Transactions.php @@ -0,0 +1,31 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function account($account_id) + { + return $this->where('account_id', $account_id); + } + + public function category($category_id) + { + // No category for bills/invoices + if (in_array($this->getModel()->getTable(), ['bill_payments', 'invoice_payments'])) { + return $this; + } + + return $this->where('category_id', $category_id); + } +} \ No newline at end of file diff --git a/app/Filters/Banking/Transfers.php b/app/Filters/Banking/Transfers.php new file mode 100755 index 0000000..594d4ee --- /dev/null +++ b/app/Filters/Banking/Transfers.php @@ -0,0 +1,26 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function fromAccount($account_id) + { + return $this->where('payments.account_id', $account_id); + } + + public function toAccount($account_id) + { + return $this->related('revenue', 'revenues.account_id', '=', $account_id); + } +} diff --git a/app/Filters/Common/Companies.php b/app/Filters/Common/Companies.php new file mode 100755 index 0000000..0e7944f --- /dev/null +++ b/app/Filters/Common/Companies.php @@ -0,0 +1,21 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->whereLike('domain', $query); + } +} \ No newline at end of file diff --git a/app/Filters/Common/Items.php b/app/Filters/Common/Items.php new file mode 100755 index 0000000..ec3a218 --- /dev/null +++ b/app/Filters/Common/Items.php @@ -0,0 +1,26 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->whereLike('name', $query); + } + + public function category($id) + { + return $this->where('category_id', $id); + } +} diff --git a/app/Filters/Customers/Invoices.php b/app/Filters/Customers/Invoices.php new file mode 100755 index 0000000..3759c82 --- /dev/null +++ b/app/Filters/Customers/Invoices.php @@ -0,0 +1,26 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->whereLike('customer_name', $query); + } + + public function status($status) + { + return $this->where('invoice_status_code', $status); + } +} \ No newline at end of file diff --git a/app/Filters/Customers/Payments.php b/app/Filters/Customers/Payments.php new file mode 100755 index 0000000..4d0fbcf --- /dev/null +++ b/app/Filters/Customers/Payments.php @@ -0,0 +1,31 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->whereLike('description', $query); + } + + public function category($category) + { + return $this->where('category_id', $category); + } + + public function paymentMethod($payment_method) + { + return $this->where('payment_method', $payment_method); + } +} diff --git a/app/Filters/Customers/Transactions.php b/app/Filters/Customers/Transactions.php new file mode 100755 index 0000000..fd6bc1a --- /dev/null +++ b/app/Filters/Customers/Transactions.php @@ -0,0 +1,21 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->whereLike('payment.name', $query)->whereLike('revenue.name', $query); + } +} \ No newline at end of file diff --git a/app/Filters/Expenses/Bills.php b/app/Filters/Expenses/Bills.php new file mode 100755 index 0000000..7055a1e --- /dev/null +++ b/app/Filters/Expenses/Bills.php @@ -0,0 +1,31 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->whereLike('vendor_name', $query); + } + + public function vendor($vendor) + { + return $this->where('vendor_id', $vendor); + } + + public function status($status) + { + return $this->where('bill_status_code', $status); + } +} \ No newline at end of file diff --git a/app/Filters/Expenses/Payments.php b/app/Filters/Expenses/Payments.php new file mode 100755 index 0000000..a9345d4 --- /dev/null +++ b/app/Filters/Expenses/Payments.php @@ -0,0 +1,36 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->whereLike('description', $query); + } + + public function vendor($vendor) + { + return $this->where('vendor_id', $vendor); + } + + public function category($category) + { + return $this->where('category_id', $category); + } + + public function account($account) + { + return $this->where('account_id', $account); + } +} \ No newline at end of file diff --git a/app/Filters/Expenses/Vendors.php b/app/Filters/Expenses/Vendors.php new file mode 100755 index 0000000..b694618 --- /dev/null +++ b/app/Filters/Expenses/Vendors.php @@ -0,0 +1,21 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->where('name', 'LIKE', '%' . $query . '%')->orWhere('email', 'LIKE', '%' . $query . '%'); + } +} \ No newline at end of file diff --git a/app/Filters/Incomes/Customers.php b/app/Filters/Incomes/Customers.php new file mode 100755 index 0000000..8af7266 --- /dev/null +++ b/app/Filters/Incomes/Customers.php @@ -0,0 +1,21 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->where('name', 'LIKE', '%' . $query . '%')->orWhere('email', 'LIKE', '%' . $query . '%'); + } +} diff --git a/app/Filters/Incomes/Invoices.php b/app/Filters/Incomes/Invoices.php new file mode 100755 index 0000000..79e3ef6 --- /dev/null +++ b/app/Filters/Incomes/Invoices.php @@ -0,0 +1,31 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->whereLike('customer_name', $query); + } + + public function customer($customer) + { + return $this->where('customer_id', $customer); + } + + public function status($status) + { + return $this->where('invoice_status_code', $status); + } +} \ No newline at end of file diff --git a/app/Filters/Incomes/Revenues.php b/app/Filters/Incomes/Revenues.php new file mode 100755 index 0000000..f61bcfa --- /dev/null +++ b/app/Filters/Incomes/Revenues.php @@ -0,0 +1,36 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->whereLike('description', $query); + } + + public function customer($customer) + { + return $this->where('customer_id', $customer); + } + + public function category($category) + { + return $this->where('category_id', $category); + } + + public function account($account) + { + return $this->where('account_id', $account); + } +} \ No newline at end of file diff --git a/app/Filters/Settings/Categories.php b/app/Filters/Settings/Categories.php new file mode 100755 index 0000000..ebb50b6 --- /dev/null +++ b/app/Filters/Settings/Categories.php @@ -0,0 +1,26 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->whereLike('name', $query); + } + + public function type($type) + { + return $this->where('type', $type); + } +} diff --git a/app/Filters/Settings/Currencies.php b/app/Filters/Settings/Currencies.php new file mode 100755 index 0000000..ba0db14 --- /dev/null +++ b/app/Filters/Settings/Currencies.php @@ -0,0 +1,21 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->whereLike('name', $query); + } +} diff --git a/app/Filters/Settings/Taxes.php b/app/Filters/Settings/Taxes.php new file mode 100755 index 0000000..d2b56d8 --- /dev/null +++ b/app/Filters/Settings/Taxes.php @@ -0,0 +1,21 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function search($query) + { + return $this->whereLike('name', $query); + } +} diff --git a/app/Http/Controllers/Api/Auth/Permissions.php b/app/Http/Controllers/Api/Auth/Permissions.php new file mode 100755 index 0000000..321ed8b --- /dev/null +++ b/app/Http/Controllers/Api/Auth/Permissions.php @@ -0,0 +1,77 @@ +response->paginator($permissions, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param Permission $permission + * @return \Dingo\Api\Http\Response + */ + public function show(Permission $permission) + { + return $this->response->item($permission, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store(Request $request) + { + $permission = Permission::create($request->all()); + + return $this->response->created(url('api/permissions/'.$permission->id)); + } + + /** + * Update the specified resource in storage. + * + * @param $permission + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function update(Permission $permission, Request $request) + { + $permission->update($request->all()); + + return $this->response->item($permission->fresh(), new Transformer()); + } + + /** + * Remove the specified resource from storage. + * + * @param Permission $permission + * @return \Dingo\Api\Http\Response + */ + public function destroy(Permission $permission) + { + $permission->delete(); + + return $this->response->noContent(); + } +} diff --git a/app/Http/Controllers/Api/Auth/Roles.php b/app/Http/Controllers/Api/Auth/Roles.php new file mode 100755 index 0000000..425e3c4 --- /dev/null +++ b/app/Http/Controllers/Api/Auth/Roles.php @@ -0,0 +1,85 @@ +collect(); + + return $this->response->paginator($roles, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param Role $role + * @return \Dingo\Api\Http\Response + */ + public function show(Role $role) + { + return $this->response->item($role, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store(Request $request) + { + $role = Role::create($request->input()); + + if ($request->has('permissions')) { + $role->permissions()->attach($request->get('permissions')); + } + + return $this->response->created(url('api/roles/'.$role->id)); + } + + /** + * Update the specified resource in storage. + * + * @param $role + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function update(Role $role, Request $request) + { + $role->update($request->all()); + + if ($request->has('permissions')) { + $role->permissions()->attach($request->get('permissions')); + } + + return $this->response->item($role->fresh(), new Transformer()); + } + + /** + * Remove the specified resource from storage. + * + * @param Role $role + * @return \Dingo\Api\Http\Response + */ + public function destroy(Role $role) + { + $role->delete(); + + return $this->response->noContent(); + } +} diff --git a/app/Http/Controllers/Api/Auth/Users.php b/app/Http/Controllers/Api/Auth/Users.php new file mode 100755 index 0000000..59781a3 --- /dev/null +++ b/app/Http/Controllers/Api/Auth/Users.php @@ -0,0 +1,97 @@ +collect(); + + return $this->response->paginator($users, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param int|string $id + * @return \Dingo\Api\Http\Response + */ + public function show($id) + { + // Check if we're querying by id or email + if (is_numeric($id)) { + $user = User::with(['companies', 'roles', 'permissions'])->find($id); + } else { + $user = User::with(['companies', 'roles', 'permissions'])->where('email', $id)->first(); + } + + return $this->response->item($user, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store(Request $request) + { + $user = User::create($request->input()); + + // Attach roles + $user->roles()->attach($request->get('roles')); + + // Attach companies + $user->companies()->attach($request->get('companies')); + + return $this->response->created(url('api/users/'.$user->id)); + } + + /** + * Update the specified resource in storage. + * + * @param $user + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function update(User $user, Request $request) + { + // Except password as we don't want to let the users change a password from this endpoint + $user->update($request->except('password')); + + // Sync roles + $user->roles()->sync($request->get('roles')); + + // Sync companies + $user->companies()->sync($request->get('companies')); + + return $this->response->item($user->fresh(), new Transformer()); + } + + /** + * Remove the specified resource from storage. + * + * @param User $user + * @return \Dingo\Api\Http\Response + */ + public function destroy(User $user) + { + $user->delete(); + + return $this->response->noContent(); + } +} diff --git a/app/Http/Controllers/Api/Banking/Accounts.php b/app/Http/Controllers/Api/Banking/Accounts.php new file mode 100755 index 0000000..b363b8c --- /dev/null +++ b/app/Http/Controllers/Api/Banking/Accounts.php @@ -0,0 +1,77 @@ +response->paginator($accounts, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param Account $account + * @return \Dingo\Api\Http\Response + */ + public function show(Account $account) + { + return $this->response->item($account, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store(Request $request) + { + $account = Account::create($request->all()); + + return $this->response->created(url('api/accounts/'.$account->id)); + } + + /** + * Update the specified resource in storage. + * + * @param $account + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function update(Account $account, Request $request) + { + $account->update($request->all()); + + return $this->response->item($account->fresh(), new Transformer()); + } + + /** + * Remove the specified resource from storage. + * + * @param Account $account + * @return \Dingo\Api\Http\Response + */ + public function destroy(Account $account) + { + $account->delete(); + + return $this->response->noContent(); + } +} diff --git a/app/Http/Controllers/Api/Banking/Transfers.php b/app/Http/Controllers/Api/Banking/Transfers.php new file mode 100755 index 0000000..764da2f --- /dev/null +++ b/app/Http/Controllers/Api/Banking/Transfers.php @@ -0,0 +1,84 @@ +collect('payment.paid_at'); + + return $this->response->paginator($transfers, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param Transfer $transfer + * @return \Dingo\Api\Http\Response + */ + public function show(Transfer $transfer) + { + return $this->response->item($transfer, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store(Request $request) + { + $transfer = Transfer::create($request->all()); + + return $this->response->created(url('api/transfers/'.$transfer->id)); + } + + /** + * Update the specified resource in storage. + * + * @param $transfer + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function update(Transfer $transfer, Request $request) + { + $transfer->update($request->all()); + + return $this->response->item($transfer->fresh(), new Transformer()); + } + + /** + * Remove the specified resource from storage. + * + * @param Transfer $transfer + * @return \Dingo\Api\Http\Response + */ + public function destroy(Transfer $transfer) + { + $payment = Payment::findOrFail($transfer['payment_id']); + $revenue = Revenue::findOrFail($transfer['revenue_id']); + + $transfer->delete(); + $payment->delete(); + $revenue->delete(); + + return $this->response->noContent(); + } +} diff --git a/app/Http/Controllers/Api/Common/Companies.php b/app/Http/Controllers/Api/Common/Companies.php new file mode 100755 index 0000000..fe11e48 --- /dev/null +++ b/app/Http/Controllers/Api/Common/Companies.php @@ -0,0 +1,133 @@ +user()->companies()->get()->sortBy('name'); + + foreach ($companies as $company) { + $company->setSettings(); + } + + return $this->response->collection($companies, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param Company $company + * @return \Dingo\Api\Http\Response + */ + public function show(Company $company) + { + // Check if user can access company + $companies = app('Dingo\Api\Auth\Auth')->user()->companies()->pluck('id')->toArray(); + if (!in_array($company->id, $companies)) { + $this->response->errorUnauthorized(); + } + + $company->setSettings(); + + return $this->response->item($company, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store(Request $request) + { + // Clear settings + setting()->forgetAll(); + + $company = Company::create($request->all()); + + // Create settings + setting()->set([ + 'general.company_name' => $request->get('company_name'), + 'general.company_email' => $request->get('company_email'), + 'general.company_address' => $request->get('company_address'), + 'general.default_currency' => $request->get('default_currency'), + 'general.default_locale' => $request->get('default_locale', 'en-GB'), + ]); + + setting()->setExtraColumns(['company_id' => $company->id]); + + setting()->save(); + + return $this->response->created(url('api/companies/'.$company->id)); + } + + /** + * Update the specified resource in storage. + * + * @param $company + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function update(Company $company, Request $request) + { + // Check if user can access company + $companies = app('Dingo\Api\Auth\Auth')->user()->companies()->pluck('id')->toArray(); + if (!in_array($company->id, $companies)) { + $this->response->errorUnauthorized(); + } + + // Update company + $company->update(['domain' => $request->get('domain')]); + + // Update settings + setting()->forgetAll(); + setting()->setExtraColumns(['company_id' => $company->id]); + setting()->load(true); + + setting()->set([ + 'general.company_name' => $request->get('company_name'), + 'general.company_email' => $request->get('company_email'), + 'general.company_address' => $request->get('company_address'), + 'general.default_currency' => $request->get('default_currency'), + 'general.default_locale' => $request->get('default_locale', 'en-GB'), + ]); + + setting()->save(); + + return $this->response->item($company->fresh(), new Transformer()); + } + + /** + * Remove the specified resource from storage. + * + * @param Company $company + * @return \Dingo\Api\Http\Response + */ + public function destroy(Company $company) + { + // Check if user can access company + $companies = app('Dingo\Api\Auth\Auth')->user()->companies()->pluck('id')->toArray(); + if (!in_array($company->id, $companies)) { + $this->response->errorUnauthorized(); + } + + $company->delete(); + + return $this->response->noContent(); + } +} diff --git a/app/Http/Controllers/Api/Common/Items.php b/app/Http/Controllers/Api/Common/Items.php new file mode 100755 index 0000000..fa869af --- /dev/null +++ b/app/Http/Controllers/Api/Common/Items.php @@ -0,0 +1,84 @@ +collect(); + + return $this->response->paginator($items, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param int|string $id + * @return \Dingo\Api\Http\Response + */ + public function show($id) + { + // Check if we're querying by id or sku + if (is_numeric($id)) { + $item = Item::with(['category', 'tax'])->find($id); + } else { + $item = Item::with(['category', 'tax'])->where('sku', $id)->first(); + } + + return $this->response->item($item, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store(Request $request) + { + $item = Item::create($request->all()); + + return $this->response->created(url('api/items/'.$item->id)); + } + + /** + * Update the specified resource in storage. + * + * @param $item + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function update(Item $item, Request $request) + { + $item->update($request->all()); + + return $this->response->item($item->fresh(), new Transformer()); + } + + /** + * Remove the specified resource from storage. + * + * @param Item $item + * @return \Dingo\Api\Http\Response + */ + public function destroy(Item $item) + { + $item->delete(); + + return $this->response->noContent(); + } +} diff --git a/app/Http/Controllers/Api/Common/Ping.php b/app/Http/Controllers/Api/Common/Ping.php new file mode 100755 index 0000000..4f95f31 --- /dev/null +++ b/app/Http/Controllers/Api/Common/Ping.php @@ -0,0 +1,25 @@ +response->array([ + 'status' => 'ok', + 'timestamp' => Date::now(), + ]); + } +} diff --git a/app/Http/Controllers/Api/Expenses/Bills.php b/app/Http/Controllers/Api/Expenses/Bills.php new file mode 100755 index 0000000..e47a589 --- /dev/null +++ b/app/Http/Controllers/Api/Expenses/Bills.php @@ -0,0 +1,204 @@ +collect(); + + return $this->response->paginator($bills, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param Bill $bill + * @return \Dingo\Api\Http\Response + */ + public function show(Bill $bill) + { + return $this->response->item($bill, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store(Request $request) + { + $bill = Bill::create($request->all()); + + $bill_item = array(); + $bill_item['company_id'] = $request['company_id']; + $bill_item['bill_id'] = $bill->id; + + if ($request['item']) { + foreach ($request['item'] as $item) { + $item_id = 0; + $item_sku = ''; + + if (!empty($item['item_id'])) { + $item_object = Item::find($item['item_id']); + + $item_id = $item['item_id']; + + $item['name'] = $item_object->name; + $item_sku = $item_object->sku; + + // Increase stock (item bought) + $item_object->quantity += $item['quantity']; + $item_object->save(); + } elseif (!empty($item['sku'])) { + $item_sku = $item['sku']; + } + + $tax = $tax_id = 0; + + if (!empty($item['tax_id'])) { + $tax_object = Tax::find($item['tax_id']); + + $tax_id = $item['tax_id']; + + $tax = (($item['price'] * $item['quantity']) / 100) * $tax_object->rate; + } elseif (!empty($item['tax'])) { + $tax = $item['tax']; + } + + $bill_item['item_id'] = $item_id; + $bill_item['name'] = str_limit($item['name'], 180, ''); + $bill_item['sku'] = $item_sku; + $bill_item['quantity'] = $item['quantity']; + $bill_item['price'] = $item['price']; + $bill_item['tax'] = $tax; + $bill_item['tax_id'] = $tax_id; + $bill_item['total'] = ($item['price'] + $bill_item['tax']) * $item['quantity']; + + $request['amount'] += $bill_item['total']; + + BillItem::create($bill_item); + } + } + + $bill->update($request->input()); + + $request['bill_id'] = $bill->id; + $request['status_code'] = $request['bill_status_code']; + $request['notify'] = 0; + $request['description'] = trans('messages.success.added', ['type' => $request['bill_number']]); + + BillHistory::create($request->input()); + + // Fire the event to make it extendible + event(new BillCreated($bill)); + + return $this->response->created(url('api/bills/'.$bill->id)); + } + + /** + * Update the specified resource in storage. + * + * @param $bill + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function update(Bill $bill, Request $request) + { + $bill_item = array(); + $bill_item['company_id'] = $request['company_id']; + $bill_item['bill_id'] = $bill->id; + + if ($request['item']) { + BillItem::where('bill_id', $bill->id)->delete(); + + foreach ($request['item'] as $item) { + $item_id = 0; + $item_sku = ''; + + if (!empty($item['item_id'])) { + $item_object = Item::find($item['item_id']); + + $item_id = $item['item_id']; + + $item['name'] = $item_object->name; + $item_sku = $item_object->sku; + } elseif (!empty($item['sku'])) { + $item_sku = $item['sku']; + } + + $tax = $tax_id = 0; + + if (!empty($item['tax_id'])) { + $tax_object = Tax::find($item['tax_id']); + + $tax_id = $item['tax_id']; + + $tax = (($item['price'] * $item['quantity']) / 100) * $tax_object->rate; + } elseif (!empty($item['tax'])) { + $tax = $item['tax']; + } + + $bill_item['item_id'] = $item_id; + $bill_item['name'] = str_limit($item['name'], 180, ''); + $bill_item['sku'] = $item_sku; + $bill_item['quantity'] = $item['quantity']; + $bill_item['price'] = $item['price']; + $bill_item['tax'] = $tax; + $bill_item['tax_id'] = $tax_id; + $bill_item['total'] = ($item['price'] + $bill_item['tax']) * $item['quantity']; + + $request['amount'] += $bill_item['total']; + + BillItem::create($bill_item); + } + } + + $bill->update($request->input()); + + // Fire the event to make it extendible + event(new BillUpdated($bill)); + + return $this->response->item($bill->fresh(), new Transformer()); + } + + /** + * Remove the specified resource from storage. + * + * @param Bill $bill + * @return \Dingo\Api\Http\Response + */ + public function destroy(Bill $bill) + { + $bill->delete(); + + BillItem::where('bill_id', $bill->id)->delete(); + BillPayment::where('bill_id', $bill->id)->delete(); + BillHistory::where('bill_id', $bill->id)->delete(); + + return $this->response->noContent(); + } +} diff --git a/app/Http/Controllers/Api/Expenses/Payments.php b/app/Http/Controllers/Api/Expenses/Payments.php new file mode 100755 index 0000000..7490fcc --- /dev/null +++ b/app/Http/Controllers/Api/Expenses/Payments.php @@ -0,0 +1,77 @@ +collect(); + + return $this->response->paginator($payments, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param Payment $payment + * @return \Dingo\Api\Http\Response + */ + public function show(Payment $payment) + { + return $this->response->item($payment, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store(Request $request) + { + $payment = Payment::create($request->all()); + + return $this->response->created(url('api/payments/'.$payment->id)); + } + + /** + * Update the specified resource in storage. + * + * @param $payment + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function update(Payment $payment, Request $request) + { + $payment->update($request->all()); + + return $this->response->item($payment->fresh(), new Transformer()); + } + + /** + * Remove the specified resource from storage. + * + * @param Payment $payment + * @return \Dingo\Api\Http\Response + */ + public function destroy(Payment $payment) + { + $payment->delete(); + + return $this->response->noContent(); + } +} diff --git a/app/Http/Controllers/Api/Expenses/Vendors.php b/app/Http/Controllers/Api/Expenses/Vendors.php new file mode 100755 index 0000000..65e210d --- /dev/null +++ b/app/Http/Controllers/Api/Expenses/Vendors.php @@ -0,0 +1,84 @@ +response->paginator($vendors, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param int|string $id + * @return \Dingo\Api\Http\Response + */ + public function show($id) + { + // Check if we're querying by id or email + if (is_numeric($id)) { + $vendor = Vendor::find($id); + } else { + $vendor = Vendor::where('email', $id)->first(); + } + + return $this->response->item($vendor, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store(Request $request) + { + $vendor = Vendor::create($request->all()); + + return $this->response->created(url('api/vendors/'.$vendor->id)); + } + + /** + * Update the specified resource in storage. + * + * @param $vendor + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function update(Vendor $vendor, Request $request) + { + $vendor->update($request->all()); + + return $this->response->item($vendor->fresh(), new Transformer()); + } + + /** + * Remove the specified resource from storage. + * + * @param Vendor $vendor + * @return \Dingo\Api\Http\Response + */ + public function destroy(Vendor $vendor) + { + $vendor->delete(); + + return $this->response->noContent(); + } +} diff --git a/app/Http/Controllers/Api/Incomes/Customers.php b/app/Http/Controllers/Api/Incomes/Customers.php new file mode 100755 index 0000000..0cc37be --- /dev/null +++ b/app/Http/Controllers/Api/Incomes/Customers.php @@ -0,0 +1,84 @@ +response->paginator($customers, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param int|string $id + * @return \Dingo\Api\Http\Response + */ + public function show($id) + { + // Check if we're querying by id or email + if (is_numeric($id)) { + $customer = Customer::find($id); + } else { + $customer = Customer::where('email', $id)->first(); + } + + return $this->response->item($customer, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store(Request $request) + { + $customer = Customer::create($request->all()); + + return $this->response->created(url('api/customers/'.$customer->id)); + } + + /** + * Update the specified resource in storage. + * + * @param $customer + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function update(Customer $customer, Request $request) + { + $customer->update($request->all()); + + return $this->response->item($customer->fresh(), new Transformer()); + } + + /** + * Remove the specified resource from storage. + * + * @param Customer $customer + * @return \Dingo\Api\Http\Response + */ + public function destroy(Customer $customer) + { + $customer->delete(); + + return $this->response->noContent(); + } +} diff --git a/app/Http/Controllers/Api/Incomes/InvoicePayments.php b/app/Http/Controllers/Api/Incomes/InvoicePayments.php new file mode 100755 index 0000000..de4ebe8 --- /dev/null +++ b/app/Http/Controllers/Api/Incomes/InvoicePayments.php @@ -0,0 +1,126 @@ +get(); + + return $this->response->collection($invoice_payments, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param $invoice_id + * @param $id + * @return \Dingo\Api\Http\Response + */ + public function show($invoice_id, $id) + { + $invoice_payment = InvoicePayment::find($id); + + return $this->response->item($invoice_payment, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $invoice_id + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store($invoice_id, Request $request) + { + // Get currency object + $currency = Currency::where('code', $request['currency_code'])->first(); + + $request['currency_code'] = $currency->code; + $request['currency_rate'] = $currency->rate; + + $request['invoice_id'] = $invoice_id; + + $invoice = Invoice::find($invoice_id); + + if ($request['currency_code'] == $invoice->currency_code) { + if ($request['amount'] > $invoice->amount) { + return $this->response->noContent(); + } elseif ($request['amount'] == $invoice->amount) { + $invoice->invoice_status_code = 'paid'; + } else { + $invoice->invoice_status_code = 'partial'; + } + } else { + $request_invoice = new Invoice(); + + $request_invoice->amount = (float) $request['amount']; + $request_invoice->currency_code = $currency->code; + $request_invoice->currency_rate = $currency->rate; + + $amount = $request_invoice->getConvertedAmount(); + + if ($amount > $invoice->amount) { + return $this->response->noContent(); + } elseif ($amount == $invoice->amount) { + $invoice->invoice_status_code = 'paid'; + } else { + $invoice->invoice_status_code = 'partial'; + } + } + + $invoice->save(); + + $invoice_payment = InvoicePayment::create($request->input()); + + $request['status_code'] = $invoice->invoice_status_code; + $request['notify'] = 0; + + $desc_date = Date::parse($request['paid_at'])->format($this->getCompanyDateFormat()); + $desc_amount = money((float) $request['amount'], $request['currency_code'], true)->format(); + $request['description'] = $desc_date . ' ' . $desc_amount; + + InvoiceHistory::create($request->input()); + + return $this->response->created(url('api/invoices/' . $invoice_id . '/payments' . $invoice_payment->id)); + } + + /** + * Remove the specified resource from storage. + * + * @param $invoice_id + * @param $id + * @return \Dingo\Api\Http\Response + */ + public function destroy($invoice_id, $id) + { + $invoice_payment = InvoicePayment::find($id); + + $invoice_payment->delete(); + + return $this->response->noContent(); + } +} diff --git a/app/Http/Controllers/Api/Incomes/Invoices.php b/app/Http/Controllers/Api/Incomes/Invoices.php new file mode 100755 index 0000000..8015e0d --- /dev/null +++ b/app/Http/Controllers/Api/Incomes/Invoices.php @@ -0,0 +1,360 @@ +collect(); + + return $this->response->paginator($invoices, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param $id + * @return \Dingo\Api\Http\Response + */ + public function show($id) + { + // Check if we're querying by id or number + if (is_numeric($id)) { + $invoice = Invoice::find($id); + } else { + $invoice = Invoice::where('invoice_number', $id)->first(); + } + + return $this->response->item($invoice, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store(Request $request) + { + if (empty($request['amount'])) { + $request['amount'] = 0; + } + + $invoice = Invoice::create($request->all()); + + $taxes = []; + $tax_total = 0; + $sub_total = 0; + + $invoice_item = array(); + $invoice_item['company_id'] = $request['company_id']; + $invoice_item['invoice_id'] = $invoice->id; + + if ($request['item']) { + foreach ($request['item'] as $item) { + $item_id = 0; + $item_sku = ''; + + if (!empty($item['item_id'])) { + $item_object = Item::find($item['item_id']); + + $item_id = $item['item_id']; + + $item['name'] = $item_object->name; + $item_sku = $item_object->sku; + + // Decrease stock (item sold) + $item_object->quantity -= $item['quantity']; + $item_object->save(); + + // Notify users if out of stock + if ($item_object->quantity == 0) { + foreach ($item_object->company->users as $user) { + if (!$user->can('read-notifications')) { + continue; + } + + $user->notify(new ItemNotification($item_object)); + } + } + } elseif (!empty($item['sku'])) { + $item_sku = $item['sku']; + } + + $tax = $tax_id = 0; + + if (!empty($item['tax_id'])) { + $tax_object = Tax::find($item['tax_id']); + + $tax_id = $item['tax_id']; + + $tax = (($item['price'] * $item['quantity']) / 100) * $tax_object->rate; + } elseif (!empty($item['tax'])) { + $tax = $item['tax']; + } + + $invoice_item['item_id'] = $item_id; + $invoice_item['name'] = str_limit($item['name'], 180, ''); + $invoice_item['sku'] = $item_sku; + $invoice_item['quantity'] = $item['quantity']; + $invoice_item['price'] = $item['price']; + $invoice_item['tax'] = $tax; + $invoice_item['tax_id'] = $tax_id; + $invoice_item['total'] = $item['price'] * $item['quantity']; + + InvoiceItem::create($invoice_item); + + if (isset($tax_object)) { + if (array_key_exists($tax_object->id, $taxes)) { + $taxes[$tax_object->id]['amount'] += $tax; + } else { + $taxes[$tax_object->id] = [ + 'name' => $tax_object->name, + 'amount' => $tax + ]; + } + } + + $tax_total += $tax; + $sub_total += $invoice_item['total']; + + unset($item_object); + unset($tax_object); + } + } + + if (empty($request['amount'])) { + $request['amount'] = $sub_total + $tax_total; + } + + $invoice->update($request->input()); + + // Add invoice totals + $this->addTotals($invoice, $request, $taxes, $sub_total, $tax_total); + + $request['invoice_id'] = $invoice->id; + $request['status_code'] = $request['invoice_status_code']; + $request['notify'] = 0; + $request['description'] = trans('messages.success.added', ['type' => $request['invoice_number']]); + + InvoiceHistory::create($request->input()); + + // Update next invoice number + $next = setting('general.invoice_number_next', 1) + 1; + setting(['general.invoice_number_next' => $next]); + setting()->save(); + + // Fire the event to make it extendible + event(new InvoiceCreated($invoice)); + + return $this->response->created(url('api/invoices/'.$invoice->id)); + } + + /** + * Update the specified resource in storage. + * + * @param $invoice + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function update(Invoice $invoice, Request $request) + { + $taxes = []; + $tax_total = 0; + $sub_total = 0; + + $invoice_item = array(); + $invoice_item['company_id'] = $request['company_id']; + $invoice_item['invoice_id'] = $invoice->id; + + if ($request['item']) { + InvoiceItem::where('invoice_id', $invoice->id)->delete(); + + foreach ($request['item'] as $item) { + $item_id = 0; + $item_sku = ''; + + if (!empty($item['item_id'])) { + $item_object = Item::find($item['item_id']); + + $item_id = $item['item_id']; + + $item['name'] = $item_object->name; + $item_sku = $item_object->sku; + } elseif (!empty($item['sku'])) { + $item_sku = $item['sku']; + } + + $tax = $tax_id = 0; + + if (!empty($item['tax_id'])) { + $tax_object = Tax::find($item['tax_id']); + + $tax_id = $item['tax_id']; + + $tax = (($item['price'] * $item['quantity']) / 100) * $tax_object->rate; + } elseif (!empty($item['tax'])) { + $tax = $item['tax']; + } + + $invoice_item['item_id'] = $item_id; + $invoice_item['name'] = str_limit($item['name'], 180, ''); + $invoice_item['sku'] = $item_sku; + $invoice_item['quantity'] = $item['quantity']; + $invoice_item['price'] = $item['price']; + $invoice_item['tax'] = $tax; + $invoice_item['tax_id'] = $tax_id; + $invoice_item['total'] = $item['price'] * $item['quantity']; + + $request['amount'] += $invoice_item['total']; + + InvoiceItem::create($invoice_item); + + if (isset($tax_object)) { + if (array_key_exists($tax_object->id, $taxes)) { + $taxes[$tax_object->id]['amount'] += $tax; + } else { + $taxes[$tax_object->id] = [ + 'name' => $tax_object->name, + 'amount' => $tax + ]; + } + } + + $tax_total += $tax; + $sub_total += $invoice_item['total']; + + unset($item_object); + unset($tax_object); + } + } + + if (empty($request['amount'])) { + $request['amount'] = $sub_total + $tax_total; + } + + $invoice->update($request->input()); + + // Delete previous invoice totals + InvoiceTotal::where('invoice_id', $invoice->id)->delete(); + + $this->addTotals($invoice, $request, $taxes, $sub_total, $tax_total); + + // Fire the event to make it extendible + event(new InvoiceUpdated($invoice)); + + return $this->response->item($invoice->fresh(), new Transformer()); + } + + /** + * Remove the specified resource from storage. + * + * @param Invoice $invoice + * @return \Dingo\Api\Http\Response + */ + public function destroy(Invoice $invoice) + { + $invoice->delete(); + + InvoiceItem::where('invoice_id', $invoice->id)->delete(); + InvoicePayment::where('invoice_id', $invoice->id)->delete(); + InvoiceHistory::where('invoice_id', $invoice->id)->delete(); + + return $this->response->noContent(); + } + + protected function addTotals($invoice, $request, $taxes, $sub_total, $tax_total) { + // Add invoice total taxes + if ($request['totals']) { + $sort_order = 1; + + foreach ($request['totals'] as $total) { + if (!empty($total['sort_order'])) { + $sort_order = $total['sort_order']; + } + + $invoice_total = [ + 'company_id' => $request['company_id'], + 'invoice_id' => $invoice->id, + 'code' => $total['code'], + 'name' => $total['name'], + 'amount' => $total['amount'], + 'sort_order' => $sort_order, + ]; + + InvoiceTotal::create($invoice_total); + + if (empty($total['sort_order'])) { + $sort_order++; + } + } + } else { + // Added invoice total sub total + $invoice_sub_total = [ + 'company_id' => $request['company_id'], + 'invoice_id' => $invoice->id, + 'code' => 'sub_total', + 'name' => 'invoices.sub_total', + 'amount' => $sub_total, + 'sort_order' => 1, + ]; + + InvoiceTotal::create($invoice_sub_total); + + $sort_order = 2; + + // Added invoice total taxes + if ($taxes) { + foreach ($taxes as $tax) { + $invoice_tax_total = [ + 'company_id' => $request['company_id'], + 'invoice_id' => $invoice->id, + 'code' => 'tax', + 'name' => $tax['name'], + 'amount' => $tax['amount'], + 'sort_order' => $sort_order, + ]; + + InvoiceTotal::create($invoice_tax_total); + + $sort_order++; + } + } + + // Added invoice total total + $invoice_total = [ + 'company_id' => $request['company_id'], + 'invoice_id' => $invoice->id, + 'code' => 'total', + 'name' => 'invoices.total', + 'amount' => $sub_total + $tax_total, + 'sort_order' => $sort_order, + ]; + + InvoiceTotal::create($invoice_total); + } + } +} diff --git a/app/Http/Controllers/Api/Incomes/Revenues.php b/app/Http/Controllers/Api/Incomes/Revenues.php new file mode 100755 index 0000000..b0a9595 --- /dev/null +++ b/app/Http/Controllers/Api/Incomes/Revenues.php @@ -0,0 +1,77 @@ +collect(); + + return $this->response->paginator($revenues, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param Revenue $revenue + * @return \Dingo\Api\Http\Response + */ + public function show(Revenue $revenue) + { + return $this->response->item($revenue, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store(Request $request) + { + $revenue = Revenue::create($request->all()); + + return $this->response->created(url('api/revenues/'.$revenue->id)); + } + + /** + * Update the specified resource in storage. + * + * @param $revenue + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function update(Revenue $revenue, Request $request) + { + $revenue->update($request->all()); + + return $this->response->item($revenue->fresh(), new Transformer()); + } + + /** + * Remove the specified resource from storage. + * + * @param Revenue $revenue + * @return \Dingo\Api\Http\Response + */ + public function destroy(Revenue $revenue) + { + $revenue->delete(); + + return $this->response->noContent(); + } +} diff --git a/app/Http/Controllers/Api/Settings/Categories.php b/app/Http/Controllers/Api/Settings/Categories.php new file mode 100755 index 0000000..4fc3bd7 --- /dev/null +++ b/app/Http/Controllers/Api/Settings/Categories.php @@ -0,0 +1,77 @@ +response->paginator($categories, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param Category $category + * @return \Dingo\Api\Http\Response + */ + public function show(Category $category) + { + return $this->response->item($category, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store(Request $request) + { + $category = Category::create($request->all()); + + return $this->response->created(url('api/categories/'.$category->id)); + } + + /** + * Update the specified resource in storage. + * + * @param $category + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function update(Category $category, Request $request) + { + $category->update($request->all()); + + return $this->response->item($category->fresh(), new Transformer()); + } + + /** + * Remove the specified resource from storage. + * + * @param Category $category + * @return \Dingo\Api\Http\Response + */ + public function destroy(Category $category) + { + $category->delete(); + + return $this->response->noContent(); + } +} diff --git a/app/Http/Controllers/Api/Settings/Currencies.php b/app/Http/Controllers/Api/Settings/Currencies.php new file mode 100755 index 0000000..2b59b2c --- /dev/null +++ b/app/Http/Controllers/Api/Settings/Currencies.php @@ -0,0 +1,77 @@ +response->paginator($currencies, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param Currency $currency + * @return \Dingo\Api\Http\Response + */ + public function show(Currency $currency) + { + return $this->response->item($currency, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store(Request $request) + { + $currency = Currency::create($request->all()); + + return $this->response->created(url('api/currencies/'.$currency->id)); + } + + /** + * Update the specified resource in storage. + * + * @param $currency + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function update(Currency $currency, Request $request) + { + $currency->update($request->all()); + + return $this->response->item($currency->fresh(), new Transformer()); + } + + /** + * Remove the specified resource from storage. + * + * @param Currency $currency + * @return \Dingo\Api\Http\Response + */ + public function destroy(Currency $currency) + { + $currency->delete(); + + return $this->response->noContent(); + } +} diff --git a/app/Http/Controllers/Api/Settings/Settings.php b/app/Http/Controllers/Api/Settings/Settings.php new file mode 100755 index 0000000..d2a75f1 --- /dev/null +++ b/app/Http/Controllers/Api/Settings/Settings.php @@ -0,0 +1,84 @@ +response->collection($settings, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param int|string $id + * @return \Dingo\Api\Http\Response + */ + public function show($id) + { + // Check if we're querying by id or key + if (is_numeric($id)) { + $setting = Setting::find($id); + } else { + $setting = Setting::where('key', $id)->first(); + } + + return $this->response->item($setting, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store(Request $request) + { + $setting = Setting::create($request->all()); + + return $this->response->created(url('api/settings/'.$setting->id)); + } + + /** + * Update the specified resource in storage. + * + * @param $setting + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function update(Setting $setting, Request $request) + { + $setting->update($request->all()); + + return $this->response->item($setting->fresh(), new Transformer()); + } + + /** + * Remove the specified resource from storage. + * + * @param Setting $setting + * @return \Dingo\Api\Http\Response + */ + public function destroy(Setting $setting) + { + $setting->delete(); + + return $this->response->noContent(); + } +} diff --git a/app/Http/Controllers/Api/Settings/Taxes.php b/app/Http/Controllers/Api/Settings/Taxes.php new file mode 100755 index 0000000..5484e60 --- /dev/null +++ b/app/Http/Controllers/Api/Settings/Taxes.php @@ -0,0 +1,77 @@ +response->paginator($taxes, new Transformer()); + } + + /** + * Display the specified resource. + * + * @param Tax $tax + * @return \Dingo\Api\Http\Response + */ + public function show(Tax $tax) + { + return $this->response->item($tax, new Transformer()); + } + + /** + * Store a newly created resource in storage. + * + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function store(Request $request) + { + $tax = Tax::create($request->all()); + + return $this->response->created(url('api/taxes/'.$tax->id)); + } + + /** + * Update the specified resource in storage. + * + * @param $tax + * @param $request + * @return \Dingo\Api\Http\Response + */ + public function update(Tax $tax, Request $request) + { + $tax->update($request->all()); + + return $this->response->item($tax->fresh(), new Transformer()); + } + + /** + * Remove the specified resource from storage. + * + * @param Tax $tax + * @return \Dingo\Api\Http\Response + */ + public function destroy(Tax $tax) + { + $tax->delete(); + + return $this->response->noContent(); + } +} diff --git a/app/Http/Controllers/ApiController.php b/app/Http/Controllers/ApiController.php new file mode 100755 index 0000000..a1f7574 --- /dev/null +++ b/app/Http/Controllers/ApiController.php @@ -0,0 +1,25 @@ +expectsJson()) { + throw new ResourceException('Validation Error', $errors); + } + + return redirect()->to($this->getRedirectUrl())->withInput($request->input())->withErrors($errors, $this->errorBag()); + } +} diff --git a/app/Http/Controllers/Auth/Forgot.php b/app/Http/Controllers/Auth/Forgot.php new file mode 100755 index 0000000..ccc5b15 --- /dev/null +++ b/app/Http/Controllers/Auth/Forgot.php @@ -0,0 +1,101 @@ +middleware('guest'); + } + + /** + * Display the form to request a password reset link. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + return view('auth.forgot.create'); + } + + /** + * Send a reset link to the given user. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) + { + $this->validateEmail($request); + + // We will send the password reset link to this user. Once we have attempted + // to send the link, we will examine the response then see the message we + // need to show to the user. Finally, we'll send out a proper response. + $response = $this->broker()->sendResetLink( + $request->only('email') + ); + + return $response == Password::RESET_LINK_SENT + ? $this->sendResetLinkResponse($response) + : $this->sendResetLinkFailedResponse($request, $response); + } + + /** + * Get the response for a successful password reset link. + * + * @param string $response + * @return \Illuminate\Http\RedirectResponse + */ + protected function sendResetLinkResponse($response) + { + flash(trans($response))->success(); + + return redirect($this->redirectTo); + } + + /** + * Get the response for a failed password reset link. + * + * @param \Illuminate\Http\Request + * @param string $response + * @return \Illuminate\Http\RedirectResponse + */ + protected function sendResetLinkFailedResponse(Request $request, $response) + { + return redirect($this->redirectTo)->withErrors( + ['email' => trans($response)] + ); + } +} diff --git a/app/Http/Controllers/Auth/Login.php b/app/Http/Controllers/Auth/Login.php new file mode 100755 index 0000000..ea2aabb --- /dev/null +++ b/app/Http/Controllers/Auth/Login.php @@ -0,0 +1,102 @@ +middleware('guest')->except('logout'); + }*/ + public function __construct() + { + $this->middleware('guest', ['except' => 'destroy']); + } + + public function create() + { + return view('auth.login.create'); + } + + public function store() + { + // Attempt to login + if (!auth()->attempt(request(['email', 'password']))) { + flash(trans('auth.failed'))->error(); + + return back(); + } + + // Get user object + $user = auth()->user(); + + // Check if user is enabled + if (!$user->enabled) { + $this->logout(); + + flash(trans('auth.disabled'))->error(); + + return redirect('auth/login'); + } + + // Check if is customer + if ($user->customer) { + $path = session('url.intended', 'customers'); + + // Path must start with 'customers' prefix + if (!str_contains($path, 'customers')) { + $path = 'customers'; + } + + return redirect($path); + } + + return redirect('/'); + } + + public function destroy() + { + $this->logout(); + + return redirect('auth/login'); + } + + public function logout() + { + auth()->logout(); + + // Session destroy is required if stored in database + if (env('SESSION_DRIVER') == 'database') { + $request = app('Illuminate\Http\Request'); + $request->session()->getHandler()->destroy($request->session()->getId()); + } + } +} diff --git a/app/Http/Controllers/Auth/Permissions.php b/app/Http/Controllers/Auth/Permissions.php new file mode 100755 index 0000000..a51392a --- /dev/null +++ b/app/Http/Controllers/Auth/Permissions.php @@ -0,0 +1,102 @@ +all()); + + $message = trans('messages.success.added', ['type' => trans_choice('general.permissions', 1)]); + + flash($message)->success(); + + return redirect('auth/permissions'); + } + + /** + * Show the form for editing the specified resource. + * + * @param Permission $permission + * + * @return Response + */ + public function edit(Permission $permission) + { + return view('auth.permissions.edit', compact('permission')); + } + + /** + * Update the specified resource in storage. + * + * @param Permission $permission + * @param Request $request + * + * @return Response + */ + public function update(Permission $permission, Request $request) + { + // Update permission + $permission->update($request->all()); + + $message = trans('messages.success.updated', ['type' => trans_choice('general.permissions', 1)]); + + flash($message)->success(); + + return redirect('auth/permissions'); + } + + /** + * Remove the specified resource from storage. + * + * @param Permission $permission + * + * @return Response + */ + public function destroy(Permission $permission) + { + $permission->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.permissions', 1)]); + + flash($message)->success(); + + return redirect('auth/permissions'); + } +} diff --git a/app/Http/Controllers/Auth/Reset.php b/app/Http/Controllers/Auth/Reset.php new file mode 100755 index 0000000..5644dde --- /dev/null +++ b/app/Http/Controllers/Auth/Reset.php @@ -0,0 +1,114 @@ +middleware('guest'); + } + + public function create(Request $request, $token = null) + { + return view('auth.reset.create')->with( + ['token' => $token, 'email' => $request->email] + ); + } + + public function store(Request $request) + { + $this->validate($request, $this->rules(), $this->validationErrorMessages()); + + // Here we will attempt to reset the user's password. If it is successful we + // will update the password on an actual user model and persist it to the + // database. Otherwise we will parse the error and return the response. + $response = $this->broker()->reset( + $this->credentials($request), function ($user, $password) { + $this->resetPassword($user, $password); + } + ); + + // If the password was successfully reset, we will redirect the user back to + // the application's home authenticated view. If there is an error we can + // redirect them back to where they came from with their error message. + return $response == Password::PASSWORD_RESET + ? $this->sendResetResponse($response) + : $this->sendResetFailedResponse($request, $response); + } + + /** + * Reset the given user's password. + * + * @param \Illuminate\Contracts\Auth\CanResetPassword $user + * @param string $password + * @return void + */ + protected function resetPassword($user, $password) + { + $user->forceFill([ + 'password' => $password, + 'remember_token' => Str::random(60), + ])->save(); + + $this->guard()->login($user); + } + + /** + * Get the response for a successful password reset. + * + * @param string $response + * @return \Illuminate\Http\RedirectResponse + */ + protected function sendResetResponse($response) + { + flash(trans($response))->success(); + + return redirect($this->redirectTo); + } + + /** + * Get the response for a failed password reset. + * + * @param \Illuminate\Http\Request + * @param string $response + * @return \Illuminate\Http\RedirectResponse + */ + protected function sendResetFailedResponse(Request $request, $response) + { + return redirect()->back() + ->withInput($request->only('email')) + ->withErrors(['email' => trans($response)]); + } +} diff --git a/app/Http/Controllers/Auth/Roles.php b/app/Http/Controllers/Auth/Roles.php new file mode 100755 index 0000000..d371c2b --- /dev/null +++ b/app/Http/Controllers/Auth/Roles.php @@ -0,0 +1,116 @@ +all()); + + // Attach permissions + $role->permissions()->attach($request['permissions']); + + $message = trans('messages.success.added', ['type' => trans_choice('general.roles', 1)]); + + flash($message)->success(); + + return redirect('auth/roles'); + } + + /** + * Show the form for editing the specified resource. + * + * @param Role $role + * + * @return Response + */ + public function edit(Role $role) + { + //$permissions = Permission::all()->sortBy('display_name'); + $permissions = Permission::all(); + + $rolePermissions = $role->permissions->pluck('id', 'id')->toArray(); + + return view('auth.roles.edit', compact('role', 'permissions', 'rolePermissions')); + } + + /** + * Update the specified resource in storage. + * + * @param Role $role + * @param Request $request + * + * @return Response + */ + public function update(Role $role, Request $request) + { + // Update role + $role->update($request->all()); + + // Sync permissions + $role->permissions()->sync($request['permissions']); + + $message = trans('messages.success.updated', ['type' => trans_choice('general.roles', 1)]); + + flash($message)->success(); + + return redirect('auth/roles'); + } + + /** + * Remove the specified resource from storage. + * + * @param Role $role + * + * @return Response + */ + public function destroy(Role $role) + { + $role->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.roles', 1)]); + + flash($message)->success(); + + return redirect('auth/roles'); + } +} diff --git a/app/Http/Controllers/Auth/Users.php b/app/Http/Controllers/Auth/Users.php new file mode 100755 index 0000000..f3d6a69 --- /dev/null +++ b/app/Http/Controllers/Auth/Users.php @@ -0,0 +1,319 @@ +collect(); + + $roles = collect(Role::all()->pluck('display_name', 'id')) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.roles', 2)]), ''); + + return view('auth.users.index', compact('users', 'roles')); + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create() + { + $roles = Role::all()->reject(function ($r) { + return $r->hasPermission('read-customer-panel'); + }); + + $companies = Auth::user()->companies()->get()->sortBy('name'); + + foreach ($companies as $company) { + $company->setSettings(); + } + + return view('auth.users.create', compact('roles', 'companies')); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + // Create user + $user = User::create($request->input()); + + // Upload picture + if ($request->file('picture')) { + $media = $this->getMedia($request->file('picture'), 'users'); + + $user->attachMedia($media, 'picture'); + } + + // Attach roles + $user->roles()->attach($request['roles']); + + // Attach companies + $user->companies()->attach($request['companies']); + + $message = trans('messages.success.added', ['type' => trans_choice('general.users', 1)]); + + flash($message)->success(); + + return redirect('auth/users'); + } + + /** + * Show the form for editing the specified resource. + * + * @param User $user + * + * @return Response + */ + public function edit(User $user) + { + if ($user->customer) { + // Show only roles with customer permission + $roles = Role::all()->reject(function ($r) { + return !$r->hasPermission('read-customer-panel'); + }); + } else { + // Don't show roles with customer permission + $roles = Role::all()->reject(function ($r) { + return $r->hasPermission('read-customer-panel'); + }); + } + + $companies = Auth::user()->companies()->get()->sortBy('name'); + + foreach ($companies as $company) { + $company->setSettings(); + } + + return view('auth.users.edit', compact('user', 'companies', 'roles')); + } + + /** + * Update the specified resource in storage. + * + * @param User $user + * @param Request $request + * + * @return Response + */ + public function update(User $user, Request $request) + { + // Do not reset password if not entered/changed + if (empty($request['password'])) { + unset($request['password']); + unset($request['password_confirmation']); + } + + // Update user + $user->update($request->input()); + + // Upload picture + if ($request->file('picture')) { + $media = $this->getMedia($request->file('picture'), 'users'); + + $user->attachMedia($media, 'picture'); + } + + // Sync roles + $user->roles()->sync($request['roles']); + + // Sync companies + $user->companies()->sync($request['companies']); + + $message = trans('messages.success.updated', ['type' => trans_choice('general.users', 1)]); + + flash($message)->success(); + + return redirect('auth/users'); + } + + /** + * Enable the specified resource. + * + * @param User $user + * + * @return Response + */ + public function enable(User $user) + { + $user->enabled = 1; + $user->save(); + + $message = trans('messages.success.enabled', ['type' => trans_choice('general.users', 1)]); + + flash($message)->success(); + + return redirect()->route('users.index'); + } + + /** + * Disable the specified resource. + * + * @param User $user + * + * @return Response + */ + public function disable(User $user) + { + $user->enabled = 0; + $user->save(); + + $message = trans('messages.success.disabled', ['type' => trans_choice('general.users', 1)]); + + flash($message)->success(); + + return redirect()->route('users.index'); + } + + /** + * Remove the specified resource from storage. + * + * @param User $user + * + * @return Response + */ + public function destroy(User $user) + { + // Can't delete yourself + if ($user->id == \Auth::user()->id) { + $message = trans('auth.error.self_delete'); + + flash($message)->error(); + + return redirect('auth/users'); + } + + $user->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.users', 1)]); + + flash($message)->success(); + + return redirect('auth/users'); + } + + /** + * Mark upcoming bills notifications are read and redirect to bills page. + * + * @param User $user + * + * @return Response + */ + public function readUpcomingBills(User $user) + { + // Mark bill notifications as read + foreach ($user->unreadNotifications as $notification) { + // Not a bill notification + if ($notification->getAttribute('type') != 'App\Notifications\Expense\Bill') { + continue; + } + + $notification->markAsRead(); + } + + // Redirect to bills + return redirect('expenses/bills'); + } + + /** + * Mark overdue invoices notifications are read and redirect to invoices page. + * + * @param User $user + * + * @return Response + */ + public function readOverdueInvoices(User $user) + { + // Mark invoice notifications as read + foreach ($user->unreadNotifications as $notification) { + // Not an invoice notification + if ($notification->getAttribute('type') != 'App\Notifications\Income\Invoice') { + continue; + } + + $notification->markAsRead(); + } + + // Redirect to invoices + return redirect('incomes/invoices'); + } + + /** + * Mark items out of stock notifications are read and redirect to items page. + * + * @param User $user + * + * @return Response + */ + public function readItemsOutOfStock(User $user) + { + // Mark item notifications as read + foreach ($user->unreadNotifications as $notification) { + // Not an item notification + if ($notification->getAttribute('type') != 'App\Notifications\Common\Item') { + continue; + } + + $notification->markAsRead(); + } + + // Redirect to items + return redirect('common/items'); + } + + public function autocomplete(ARequest $request) + { + $user = false; + $data = false; + + $column = $request['column']; + $value = $request['value']; + + if (!empty($column) && !empty($value)) { + switch ($column) { + case 'id': + $user = User::find((int) $value); + break; + case 'email': + $user = User::where('email', $value)->first(); + break; + default: + $user = User::where($column, $value)->first(); + } + + $data = $user; + } elseif (!empty($column) && empty($value)) { + $data = trans('validation.required', ['attribute' => $column]); + } + + return response()->json([ + 'errors' => ($user) ? false : true, + 'success' => ($user) ? true : false, + 'data' => $data + ]); + } +} diff --git a/app/Http/Controllers/Banking/Accounts.php b/app/Http/Controllers/Banking/Accounts.php new file mode 100755 index 0000000..2440014 --- /dev/null +++ b/app/Http/Controllers/Banking/Accounts.php @@ -0,0 +1,255 @@ +pluck('name', 'code'); + + $currency = Currency::where('code', '=', setting('general.default_currency', 'USD'))->first(); + + return view('banking.accounts.create', compact('currencies', 'currency')); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + $account = Account::create($request->all()); + + // Set default account + if ($request['default_account']) { + setting()->set('general.default_account', $account->id); + setting()->save(); + } + + $message = trans('messages.success.added', ['type' => trans_choice('general.accounts', 1)]); + + flash($message)->success(); + + return redirect('banking/accounts'); + } + + /** + * Show the form for editing the specified resource. + * + * @param Account $account + * + * @return Response + */ + public function edit(Account $account) + { + $currencies = Currency::enabled()->pluck('name', 'code'); + + $account->default_account = ($account->id == setting('general.default_account')) ? 1 : 0; + + $currency = Currency::where('code', '=', $account->currency_code)->first(); + + return view('banking.accounts.edit', compact('account', 'currencies', 'currency')); + } + + /** + * Update the specified resource in storage. + * + * @param Account $account + * @param Request $request + * + * @return Response + */ + public function update(Account $account, Request $request) + { + // Check if we can disable it + if (!$request['enabled']) { + if ($account->id == setting('general.default_account')) { + $relationships[] = strtolower(trans_choice('general.companies', 1)); + } + } + + if (empty($relationships)) { + $account->update($request->all()); + + // Set default account + if ($request['default_account']) { + setting()->set('general.default_account', $account->id); + setting()->save(); + } + + $message = trans('messages.success.updated', ['type' => trans_choice('general.accounts', 1)]); + + flash($message)->success(); + + return redirect('banking/accounts'); + } else { + $message = trans('messages.warning.disabled', ['name' => $account->name, 'text' => implode(', ', $relationships)]); + + flash($message)->warning(); + + return redirect('banking/accounts/' . $account->id . '/edit'); + } + } + + /** + * Enable the specified resource. + * + * @param Account $account + * + * @return Response + */ + public function enable(Account $account) + { + $account->enabled = 1; + $account->save(); + + $message = trans('messages.success.enabled', ['type' => trans_choice('general.accounts', 1)]); + + flash($message)->success(); + + return redirect()->route('accounts.index'); + } + + /** + * Disable the specified resource. + * + * @param Account $account + * + * @return Response + */ + public function disable(Account $account) + { + if ($account->id == setting('general.default_account')) { + $relationships[] = strtolower(trans_choice('general.companies', 1)); + } + + if (empty($relationships)) { + $account->enabled = 0; + $account->save(); + + $message = trans('messages.success.disabled', ['type' => trans_choice('general.accounts', 1)]); + + flash($message)->success(); + } else { + $message = trans('messages.warning.disabled', ['name' => $account->name, 'text' => implode(', ', $relationships)]); + + flash($message)->warning(); + + return redirect()->route('accounts.index'); + } + + return redirect()->route('accounts.index'); + } + + /** + * Remove the specified resource from storage. + * + * @param Account $account + * + * @return Response + */ + public function destroy(Account $account) + { + $relationships = $this->countRelationships($account, [ + 'bill_payments' => 'bills', + 'payments' => 'payments', + 'invoice_payments' => 'invoices', + 'revenues' => 'revenues', + ]); + + if ($account->id == setting('general.default_account')) { + $relationships[] = strtolower(trans_choice('general.companies', 1)); + } + + if (empty($relationships)) { + $account->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.accounts', 1)]); + + flash($message)->success(); + } else { + $message = trans('messages.warning.deleted', ['name' => $account->name, 'text' => implode(', ', $relationships)]); + + flash($message)->warning(); + } + + return redirect('banking/accounts'); + } + + public function currency() + { + $account_id = (int) request('account_id'); + + if (empty($account_id)) { + return response()->json([]); + } + + $account = Account::find($account_id); + + if (empty($account)) { + return response()->json([]); + } + + $currency_code = setting('general.default_currency'); + + if (isset($account->currency_code)) { + $currencies = Currency::enabled()->pluck('name', 'code')->toArray(); + + if (array_key_exists($account->currency_code, $currencies)) { + $currency_code = $account->currency_code; + } + } + + // Get currency object + $currency = Currency::where('code', $currency_code)->first(); + + $account->currency_name = $currency->name; + $account->currency_code = $currency_code; + $account->currency_rate = $currency->rate; + + $account->thousands_separator = $currency->thousands_separator; + $account->decimal_mark = $currency->decimal_mark; + $account->precision = (int) $currency->precision; + $account->symbol_first = $currency->symbol_first; + $account->symbol = $currency->symbol; + + return response()->json($account); + } +} diff --git a/app/Http/Controllers/Banking/Transactions.php b/app/Http/Controllers/Banking/Transactions.php new file mode 100755 index 0000000..d108eb7 --- /dev/null +++ b/app/Http/Controllers/Banking/Transactions.php @@ -0,0 +1,100 @@ +pluck('name', 'id')) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.accounts', 2)]), ''); + + $types = collect(['expense' => 'Expense', 'income' => 'Income']) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.types', 2)]), ''); + + $categories = collect(Category::enabled()->type('income')->pluck('name', 'id')) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.categories', 2)]), ''); + + $type = $request->get('type'); + + if ($type != 'income') { + $this->addTransactions(Payment::collect(['paid_at'=> 'desc']), trans_choice('general.expenses', 1)); + $this->addTransactions(BillPayment::collect(['paid_at'=> 'desc']), trans_choice('general.expenses', 1), trans_choice('general.bills', 1)); + } + + if ($type != 'expense') { + $this->addTransactions(Revenue::collect(['paid_at'=> 'desc']), trans_choice('general.incomes', 1)); + $this->addTransactions(InvoicePayment::collect(['paid_at'=> 'desc']), trans_choice('general.incomes', 1), trans_choice('general.invoices', 1)); + } + + $transactions = $this->getTransactions($request); + + return view('banking.transactions.index', compact('transactions', 'accounts', 'types', 'categories')); + } + + /** + * Add items to transactions array. + * + * @param $items + * @param $type + * @param $category + */ + protected function addTransactions($items, $type, $category = null) + { + foreach ($items as $item) { + $data = [ + 'paid_at' => $item->paid_at, + 'account_name' => $item->account->name, + 'type' => $type, + 'description' => $item->description, + 'amount' => $item->amount, + 'currency_code' => $item->currency_code, + ]; + + if (!is_null($category)) { + $data['category_name'] = $category; + } else { + $data['category_name'] = $item->category->name; + } + + $this->transactions[] = (object) $data; + } + } + + protected function getTransactions($request) + { + // Sort items + if (isset($request['sort'])) { + if ($request['order'] == 'asc') { + $f = 'sortBy'; + } else { + $f = 'sortByDesc'; + } + + $transactions = collect($this->transactions)->$f($request['sort']); + } else { + $transactions = collect($this->transactions)->sortByDesc('paid_at'); + } + + return $transactions; + } +} diff --git a/app/Http/Controllers/Banking/Transfers.php b/app/Http/Controllers/Banking/Transfers.php new file mode 100755 index 0000000..e7e42d9 --- /dev/null +++ b/app/Http/Controllers/Banking/Transfers.php @@ -0,0 +1,346 @@ +collect(['payment.paid_at' => 'desc']); + + $accounts = collect(Account::enabled()->orderBy('name')->pluck('name', 'id')) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.accounts', 2)]), ''); + + $transfers = array(); + + foreach ($items as $item) { + $revenue = $item->revenue; + $payment = $item->payment; + + $name = trans('transfers.messages.delete', [ + 'from' => $payment->account->name, + 'to' => $revenue->account->name, + 'amount' => money($payment->amount, $payment->currency_code, true) + ]); + + $transfers[] = (object)[ + 'id' => $item->id, + 'name' => $name, + 'from_account' => $payment->account->name, + 'to_account' => $revenue->account->name, + 'amount' => $payment->amount, + 'currency_code' => $payment->currency_code, + 'paid_at' => $payment->paid_at, + ]; + } + + $special_key = array( + 'payment.name' => 'from_account', + 'revenue.name' => 'to_account', + ); + + if (isset($request['sort']) && array_key_exists($request['sort'], $special_key)) { + $sort_order = array(); + + foreach ($transfers as $key => $value) { + $sort = $request['sort']; + + if (array_key_exists($request['sort'], $special_key)) { + $sort = $special_key[$request['sort']]; + } + + $sort_order[$key] = $value->{$sort}; + } + + $sort_type = (isset($request['order']) && $request['order'] == 'asc') ? SORT_ASC : SORT_DESC; + + array_multisort($sort_order, $sort_type, $transfers); + } + + return view('banking.transfers.index', compact('transfers', 'items', 'accounts')); + } + + /** + * Show the form for viewing the specified resource. + * + * @return Response + */ + public function show() + { + return redirect('banking/transfers'); + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create() + { + $accounts = Account::enabled()->orderBy('name')->pluck('name', 'id'); + + $payment_methods = Modules::getPaymentMethods(); + + $currency = Currency::where('code', '=', setting('general.default_currency', 'USD'))->first(); + + return view('banking.transfers.create', compact('accounts', 'payment_methods', 'currency')); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + $currencies = Currency::enabled()->pluck('rate', 'code')->toArray(); + + $payment_currency_code = Account::where('id', $request['from_account_id'])->pluck('currency_code')->first(); + $revenue_currency_code = Account::where('id', $request['to_account_id'])->pluck('currency_code')->first(); + + $payment_request = [ + 'company_id' => $request['company_id'], + 'account_id' => $request['from_account_id'], + 'paid_at' => $request['transferred_at'], + 'currency_code' => $payment_currency_code, + 'currency_rate' => $currencies[$payment_currency_code], + 'amount' => $request['amount'], + 'vendor_id' => 0, + 'description' => $request['description'], + 'category_id' => Category::transfer(), // Transfer Category ID + 'payment_method' => $request['payment_method'], + 'reference' => $request['reference'], + ]; + + $payment = Payment::create($payment_request); + + // Convert amount if not same currency + if ($payment_currency_code != $revenue_currency_code) { + $default_currency = setting('general.default_currency', 'USD'); + + $default_amount = $request['amount']; + + if ($default_currency != $payment_currency_code) { + $default_amount_model = new Transfer(); + + $default_amount_model->default_currency_code = $default_currency; + $default_amount_model->amount = $request['amount']; + $default_amount_model->currency_code = $payment_currency_code; + $default_amount_model->currency_rate = $currencies[$payment_currency_code]; + + $default_amount = $default_amount_model->getDivideConvertedAmount(); + } + + $transfer_amount = new Transfer(); + + $transfer_amount->default_currency_code = $payment_currency_code; + $transfer_amount->amount = $default_amount; + $transfer_amount->currency_code = $revenue_currency_code; + $transfer_amount->currency_rate = $currencies[$revenue_currency_code]; + + $amount = $transfer_amount->getDynamicConvertedAmount(); + } else { + $amount = $request['amount']; + } + + $revenue_request = [ + 'company_id' => $request['company_id'], + 'account_id' => $request['to_account_id'], + 'paid_at' => $request['transferred_at'], + 'currency_code' => $revenue_currency_code, + 'currency_rate' => $currencies[$revenue_currency_code], + 'amount' => $amount, + 'customer_id' => 0, + 'description' => $request['description'], + 'category_id' => Category::transfer(), // Transfer Category ID + 'payment_method' => $request['payment_method'], + 'reference' => $request['reference'], + ]; + + $revenue = Revenue::create($revenue_request); + + $transfer_request = [ + 'company_id' => $request['company_id'], + 'payment_id' => $payment->id, + 'revenue_id' => $revenue->id, + ]; + + Transfer::create($transfer_request); + + $message = trans('messages.success.added', ['type' => trans_choice('general.transfers', 1)]); + + flash($message)->success(); + + return redirect('banking/transfers'); + } + + /** + * Show the form for editing the specified resource. + * + * @param Request $request + * + * @return Response + */ + public function edit(Transfer $transfer) + { + $payment = Payment::findOrFail($transfer->payment_id); + $revenue = Revenue::findOrFail($transfer->revenue_id); + + $transfer['from_account_id'] = $payment->account_id; + $transfer['to_account_id'] = $revenue->account_id; + $transfer['transferred_at'] = Date::parse($payment->paid_at)->format('Y-m-d'); + $transfer['description'] = $payment->description; + $transfer['amount'] = $payment->amount; + $transfer['payment_method'] = $payment->payment_method; + $transfer['reference'] = $payment->reference; + + $account = Account::find($payment->account_id); + $accounts = Account::enabled()->orderBy('name')->pluck('name', 'id'); + + $payment_methods = Modules::getPaymentMethods(); + + $currency = Currency::where('code', '=', $account->currency_code)->first(); + + return view('banking.transfers.edit', compact('transfer', 'accounts', 'payment_methods', 'currency')); + } + + /** + * Update the specified resource in storage. + * + * @param Transfer $transfer + * @param Request $request + * + * @return Response + */ + public function update(Transfer $transfer, Request $request) + { + $currencies = Currency::enabled()->pluck('rate', 'code')->toArray(); + + $payment_currency_code = Account::where('id', $request['from_account_id'])->pluck('currency_code')->first(); + $revenue_currency_code = Account::where('id', $request['to_account_id'])->pluck('currency_code')->first(); + + $payment = Payment::findOrFail($transfer->payment_id); + $revenue = Revenue::findOrFail($transfer->revenue_id); + + $payment_request = [ + 'company_id' => $request['company_id'], + 'account_id' => $request['from_account_id'], + 'paid_at' => $request['transferred_at'], + 'currency_code' => $payment_currency_code, + 'currency_rate' => $currencies[$payment_currency_code], + 'amount' => $request['amount'], + 'vendor_id' => 0, + 'description' => $request['description'], + 'category_id' => Category::transfer(), // Transfer Category ID + 'payment_method' => $request['payment_method'], + 'reference' => $request['reference'], + ]; + + $payment->update($payment_request); + + // Convert amount if not same currency + if ($payment_currency_code != $revenue_currency_code) { + $default_currency = setting('general.default_currency', 'USD'); + + $default_amount = $request['amount']; + + if ($default_currency != $payment_currency_code) { + $default_amount_model = new Transfer(); + + $default_amount_model->default_currency_code = $default_currency; + $default_amount_model->amount = $request['amount']; + $default_amount_model->currency_code = $payment_currency_code; + $default_amount_model->currency_rate = $currencies[$payment_currency_code]; + + $default_amount = $default_amount_model->getDivideConvertedAmount(); + } + + $transfer_amount = new Transfer(); + + $transfer_amount->default_currency_code = $payment_currency_code; + $transfer_amount->amount = $default_amount; + $transfer_amount->currency_code = $revenue_currency_code; + $transfer_amount->currency_rate = $currencies[$revenue_currency_code]; + + $amount = $transfer_amount->getDynamicConvertedAmount(); + } else { + $amount = $request['amount']; + } + + $revenue_request = [ + 'company_id' => $request['company_id'], + 'account_id' => $request['to_account_id'], + 'paid_at' => $request['transferred_at'], + 'currency_code' => $revenue_currency_code, + 'currency_rate' => $currencies[$revenue_currency_code], + 'amount' => $amount, + 'customer_id' => 0, + 'description' => $request['description'], + 'category_id' => Category::transfer(), // Transfer Category ID + 'payment_method' => $request['payment_method'], + 'reference' => $request['reference'], + ]; + + $revenue->update($revenue_request); + + $transfer_request = [ + 'company_id' => $request['company_id'], + 'payment_id' => $payment->id, + 'revenue_id' => $revenue->id, + ]; + + $transfer->update($transfer_request); + + $message = trans('messages.success.updated', ['type' => trans_choice('general.transfers', 1)]); + + flash($message)->success(); + + return redirect('banking/transfers'); + } + + /** + * Remove the specified resource from storage. + * + * @param Transfer $transfer + * + * @return Response + */ + public function destroy(Transfer $transfer) + { + $payment = Payment::findOrFail($transfer->payment_id); + $revenue = Revenue::findOrFail($transfer->revenue_id); + + $payment->delete(); + $revenue->delete(); + $transfer->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.transfers', 1)]); + + flash($message)->success(); + + return redirect('banking/transfers'); + } +} diff --git a/app/Http/Controllers/Common/Companies.php b/app/Http/Controllers/Common/Companies.php new file mode 100755 index 0000000..9ed22af --- /dev/null +++ b/app/Http/Controllers/Common/Companies.php @@ -0,0 +1,287 @@ +setSettings(); + } + + return view('common.companies.index', compact('companies')); + } + + /** + * Show the form for viewing the specified resource. + * + * @return Response + */ + public function show() + { + return redirect('common/companies'); + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create() + { + $currencies = Currency::enabled()->pluck('name', 'code'); + + return view('common.companies.create', compact('currencies')); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + setting()->forgetAll(); + + // Create company + $company = Company::create($request->input()); + + // Create settings + setting()->set('general.company_name', $request->get('company_name')); + setting()->set('general.company_email', $request->get('company_email')); + setting()->set('general.company_address', $request->get('company_address')); + + if ($request->file('company_logo')) { + $company_logo = $this->getMedia($request->file('company_logo'), 'settings', $company->id); + + if ($company_logo) { + $company->attachMedia($company_logo, 'company_logo'); + + setting()->set('general.company_logo', $company_logo->id); + } + } + + setting()->set('general.default_currency', $request->get('default_currency')); + setting()->set('general.default_locale', session('locale')); + + setting()->setExtraColumns(['company_id' => $company->id]); + setting()->save(); + + // Redirect + $message = trans('messages.success.added', ['type' => trans_choice('general.companies', 1)]); + + flash($message)->success(); + + return redirect('common/companies'); + } + + /** + * Show the form for editing the specified resource. + * + * @param Company $company + * + * @return Response + */ + public function edit(Company $company) + { + // Check if user can edit company + if (!$this->isUserCompany($company)) { + $message = trans('companies.error.not_user_company'); + + flash($message)->error(); + + return redirect('common/companies'); + } + + $company->setSettings(); + + $currencies = Currency::enabled()->pluck('name', 'code'); + + return view('common.companies.edit', compact('company', 'currencies')); + } + + /** + * Update the specified resource in storage. + * + * @param Company $company + * @param Request $request + * + * @return Response + */ + public function update(Company $company, Request $request) + { + // Check if user can update company + if (!$this->isUserCompany($company)) { + $message = trans('companies.error.not_user_company'); + + flash($message)->error(); + + return redirect('common/companies'); + } + + // Update company + $company->update($request->input()); + + // Get the company settings + setting()->forgetAll(); + setting()->setExtraColumns(['company_id' => $company->id]); + setting()->load(true); + + // Update settings + setting()->set('general.company_name', $request->get('company_name')); + setting()->set('general.company_email', $request->get('company_email')); + setting()->set('general.company_address', $request->get('company_address')); + + if ($request->file('company_logo')) { + $company_logo = $this->getMedia($request->file('company_logo'), 'settings', $company->id); + + if ($company_logo) { + $company->attachMedia($company_logo, 'company_logo'); + + setting()->set('general.company_logo', $company_logo->id); + } + } + + setting()->set('general.default_payment_method', 'offlinepayment.cash.1'); + setting()->set('general.default_currency', $request->get('default_currency')); + + setting()->save(); + + // Redirect + $message = trans('messages.success.updated', ['type' => trans_choice('general.companies', 1)]); + + flash($message)->success(); + + return redirect('common/companies'); + } + + /** + * Enable the specified resource. + * + * @param Company $company + * + * @return Response + */ + public function enable(Company $company) + { + $company->enabled = 1; + $company->save(); + + $message = trans('messages.success.enabled', ['type' => trans_choice('general.companies', 1)]); + + flash($message)->success(); + + return redirect()->route('companies.index'); + } + + /** + * Disable the specified resource. + * + * @param Company $company + * + * @return Response + */ + public function disable(Company $company) + { + // Check if user can update company + if (!$this->isUserCompany($company)) { + $message = trans('companies.error.not_user_company'); + + flash($message)->error(); + + return redirect()->route('companies.index'); + } + + $company->enabled = 0; + $company->save(); + + $message = trans('messages.success.disabled', ['type' => trans_choice('general.companies', 1)]); + + flash($message)->success(); + + return redirect()->route('companies.index'); + } + + /** + * Remove the specified resource from storage. + * + * @param Company $company + * + * @return Response + */ + public function destroy(Company $company) + { + // Can't delete active company + if ($company->id == session('company_id')) { + $message = trans('companies.error.delete_active'); + + flash($message)->error(); + + return redirect('common/companies'); + } + + $company->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.companies', 1)]); + + flash($message)->success(); + + return redirect('common/companies'); + } + + /** + * Change the active company. + * + * @param Company $company + * + * @return Response + */ + public function set(Company $company) + { + // Check if user can manage company + if ($this->isUserCompany($company)) { + session(['company_id' => $company->id]); + + event(new CompanySwitched($company)); + } + + return redirect('/'); + } + + /** + * Check user company assignment + * + * @param Company $company + * + * @return boolean + */ + public function isUserCompany(Company $company) + { + $companies = auth()->user()->companies()->pluck('id')->toArray(); + + if (in_array($company->id, $companies)) { + return true; + } + + return false; + } +} diff --git a/app/Http/Controllers/Common/Dashboard.php b/app/Http/Controllers/Common/Dashboard.php new file mode 100755 index 0000000..50ec8bb --- /dev/null +++ b/app/Http/Controllers/Common/Dashboard.php @@ -0,0 +1,439 @@ + [], 'labels' => [], 'values' => []]; + + public $expense_donut = ['colors' => [], 'labels' => [], 'values' => []]; + + /** + * Display a listing of the resource. + * + * @return Response + */ + public function index() + { + $this->today = Date::today(); + + list($total_incomes, $total_expenses, $total_profit) = $this->getTotals(); + + $cashflow = $this->getCashFlow(); + + list($donut_incomes, $donut_expenses) = $this->getDonuts(); + + $accounts = Account::enabled()->take(6)->get(); + + $latest_incomes = $this->getLatestIncomes(); + + $latest_expenses = $this->getLatestExpenses(); + + return view('common.dashboard.index', compact( + 'total_incomes', + 'total_expenses', + 'total_profit', + 'cashflow', + 'donut_incomes', + 'donut_expenses', + 'accounts', + 'latest_incomes', + 'latest_expenses' + )); + } + + public function cashFlow() + { + $this->today = Date::today(); + + $content = $this->getCashFlow()->render(); + + //return response()->setContent($content)->send(); + + echo $content; + } + + private function getTotals() + { + list($incomes_amount, $open_invoice, $overdue_invoice, $expenses_amount, $open_bill, $overdue_bill) = $this->calculateAmounts(); + + $incomes_progress = 100; + + if (!empty($open_invoice) && !empty($overdue_invoice)) { + $incomes_progress = (int) ($open_invoice * 100) / ($open_invoice + $overdue_invoice); + } + + // Totals + $total_incomes = array( + 'total' => $incomes_amount, + 'open_invoice' => money($open_invoice, setting('general.default_currency'), true), + 'overdue_invoice' => money($overdue_invoice, setting('general.default_currency'), true), + 'progress' => $incomes_progress + ); + + $expenses_progress = 100; + + if (!empty($open_bill) && !empty($overdue_bill)) { + $expenses_progress = (int) ($open_bill * 100) / ($open_bill + $overdue_bill); + } + + $total_expenses = array( + 'total' => $expenses_amount, + 'open_bill' => money($open_bill, setting('general.default_currency'), true), + 'overdue_bill' => money($overdue_bill, setting('general.default_currency'), true), + 'progress' => $expenses_progress + ); + + $amount_profit = $incomes_amount - $expenses_amount; + $open_profit = $open_invoice - $open_bill; + $overdue_profit = $overdue_invoice - $overdue_bill; + + $total_progress = 100; + + if (!empty($open_profit) && !empty($overdue_profit)) { + $total_progress = (int) ($open_profit * 100) / ($open_profit + $overdue_profit); + } + + $total_profit = array( + 'total' => $amount_profit, + 'open' => money($open_profit, setting('general.default_currency'), true), + 'overdue' => money($overdue_profit, setting('general.default_currency'), true), + 'progress' => $total_progress + ); + + return array($total_incomes, $total_expenses, $total_profit); + } + + private function getCashFlow() + { + $start = Date::parse(request('start', $this->today->startOfYear()->format('Y-m-d'))); + $end = Date::parse(request('end', $this->today->endOfYear()->format('Y-m-d'))); + $period = request('period', 'month'); + + $start_month = $start->month; + $end_month = $end->month; + + // Monthly + $labels = array(); + + $s = clone $start; + + for ($j = $end_month; $j >= $start_month; $j--) { + $labels[$end_month - $j] = $s->format('M Y'); + + if ($period == 'month') { + $s->addMonth(); + } else { + $s->addMonths(3); + $j -= 2; + } + } + + $income = $this->calculateCashFlowTotals('income', $start, $end, $period); + $expense = $this->calculateCashFlowTotals('expense', $start, $end, $period); + + $profit = $this->calculateCashFlowProfit($income, $expense); + + $chart = Charts::multi('line', 'chartjs') + ->dimensions(0, 300) + ->colors(['#6da252', '#00c0ef', '#F56954']) + ->dataset(trans_choice('general.profits', 1), $profit) + ->dataset(trans_choice('general.incomes', 1), $income) + ->dataset(trans_choice('general.expenses', 1), $expense) + ->labels($labels) + ->credits(false) + ->view('vendor.consoletvs.charts.chartjs.multi.line'); + + return $chart; + } + + private function getDonuts() + { + // Show donut prorated if there is no income + if (array_sum($this->income_donut['values']) == 0) { + foreach ($this->income_donut['values'] as $key => $value) { + $this->income_donut['values'][$key] = 1; + } + } + + // Get 6 categories by amount + $colors = $labels = []; + $values = collect($this->income_donut['values'])->sort()->reverse()->take(6)->all(); + foreach ($values as $id => $val) { + $colors[$id] = $this->income_donut['colors'][$id]; + $labels[$id] = $this->income_donut['labels'][$id]; + } + + $donut_incomes = Charts::create('donut', 'chartjs') + ->colors($colors) + ->labels($labels) + ->values($values) + ->dimensions(0, 160) + ->credits(false) + ->view('vendor.consoletvs.charts.chartjs.donut'); + + // Show donut prorated if there is no expense + if (array_sum($this->expense_donut['values']) == 0) { + foreach ($this->expense_donut['values'] as $key => $value) { + $this->expense_donut['values'][$key] = 1; + } + } + + // Get 6 categories by amount + $colors = $labels = []; + $values = collect($this->expense_donut['values'])->sort()->reverse()->take(6)->all(); + foreach ($values as $id => $val) { + $colors[$id] = $this->expense_donut['colors'][$id]; + $labels[$id] = $this->expense_donut['labels'][$id]; + } + + $donut_expenses = Charts::create('donut', 'chartjs') + ->colors($colors) + ->labels($labels) + ->values($values) + ->dimensions(0, 160) + ->credits(false) + ->view('vendor.consoletvs.charts.chartjs.donut'); + + return array($donut_incomes, $donut_expenses); + } + + private function getLatestIncomes() + { + $invoices = collect(Invoice::orderBy('invoiced_at', 'desc')->accrued()->take(10)->get())->each(function ($item) { + $item->paid_at = $item->invoiced_at; + }); + + $revenues = collect(Revenue::orderBy('paid_at', 'desc')->isNotTransfer()->take(10)->get()); + + $latest = $revenues->merge($invoices)->take(5)->sortByDesc('paid_at'); + + return $latest; + } + + private function getLatestExpenses() + { + $bills = collect(Bill::orderBy('billed_at', 'desc')->accrued()->take(10)->get())->each(function ($item) { + $item->paid_at = $item->billed_at; + }); + + $payments = collect(Payment::orderBy('paid_at', 'desc')->isNotTransfer()->take(10)->get()); + + $latest = $payments->merge($bills)->take(5)->sortByDesc('paid_at'); + + return $latest; + } + + private function calculateAmounts() + { + $incomes_amount = $open_invoice = $overdue_invoice = 0; + $expenses_amount = $open_bill = $overdue_bill = 0; + + // Get categories + $categories = Category::with(['bills', 'invoices', 'payments', 'revenues'])->orWhere('type', 'income')->orWhere('type', 'expense')->enabled()->get(); + + foreach ($categories as $category) { + switch ($category->type) { + case 'income': + $amount = 0; + + // Revenues + foreach ($category->revenues as $revenue) { + $amount += $revenue->getConvertedAmount(); + } + + $incomes_amount += $amount; + + // Invoices + $invoices = $category->invoices()->accrued()->get(); + foreach ($invoices as $invoice) { + list($paid, $open, $overdue) = $this->calculateInvoiceBillTotals($invoice, 'invoice'); + + $incomes_amount += $paid; + $open_invoice += $open; + $overdue_invoice += $overdue; + + $amount += $paid; + } + + $this->addToIncomeDonut($category->color, $amount, $category->name); + + break; + case 'expense': + $amount = 0; + + // Payments + foreach ($category->payments as $payment) { + $amount += $payment->getConvertedAmount(); + } + + $expenses_amount += $amount; + + // Bills + $bills = $category->bills()->accrued()->get(); + foreach ($bills as $bill) { + list($paid, $open, $overdue) = $this->calculateInvoiceBillTotals($bill, 'bill'); + + $expenses_amount += $paid; + $open_bill += $open; + $overdue_bill += $overdue; + + $amount += $paid; + } + + $this->addToExpenseDonut($category->color, $amount, $category->name); + + break; + } + } + + return array($incomes_amount, $open_invoice, $overdue_invoice, $expenses_amount, $open_bill, $overdue_bill); + } + + private function calculateCashFlowTotals($type, $start, $end, $period) + { + $totals = array(); + + if ($type == 'income') { + $m1 = '\App\Models\Income\Revenue'; + $m2 = '\App\Models\Income\InvoicePayment'; + } else { + $m1 = '\App\Models\Expense\Payment'; + $m2 = '\App\Models\Expense\BillPayment'; + } + + $date_format = 'Y-m'; + + if ($period == 'month') { + $n = 1; + $start_date = $start->format($date_format); + $end_date = $end->format($date_format); + $next_date = $start_date; + } else { + $n = 3; + $start_date = $start->quarter; + $end_date = $end->quarter; + $next_date = $start_date; + } + + $s = clone $start; + + //$totals[$start_date] = 0; + while ($next_date <= $end_date) { + $totals[$next_date] = 0; + + if ($period == 'month') { + $next_date = $s->addMonths($n)->format($date_format); + } else { + if (isset($totals[4])) { + break; + } + + $next_date = $s->addMonths($n)->quarter; + } + } + + $items_1 = $m1::whereBetween('paid_at', [$start, $end])->isNotTransfer()->get(); + + $this->setCashFlowTotals($totals, $items_1, $date_format, $period); + + $items_2 = $m2::whereBetween('paid_at', [$start, $end])->get(); + + $this->setCashFlowTotals($totals, $items_2, $date_format, $period); + + return $totals; + } + + private function setCashFlowTotals(&$totals, $items, $date_format, $period) + { + foreach ($items as $item) { + if ($period == 'month') { + $i = Date::parse($item->paid_at)->format($date_format); + } else { + $i = Date::parse($item->paid_at)->quarter; + } + + if (!isset($totals[$i])) { + continue; + } + + $totals[$i] += $item->getConvertedAmount(); + } + } + + private function calculateCashFlowProfit($incomes, $expenses) + { + $profit = []; + + foreach ($incomes as $key => $income) { + if ($income > 0 && $income > $expenses[$key]) { + $profit[$key] = $income - $expenses[$key]; + } else { + $profit[$key] = 0; + } + } + + return $profit; + } + + private function calculateInvoiceBillTotals($item, $type) + { + $paid = $open = $overdue = 0; + + $today = $this->today->toDateString(); + + $paid += $item->getConvertedAmount(); + + $code_field = $type . '_status_code'; + + if ($item->$code_field != 'paid') { + $payments = 0; + + if ($item->$code_field == 'partial') { + foreach ($item->payments as $payment) { + $payments += $payment->getConvertedAmount(); + } + } + + // Check if it's open or overdue invoice + if ($item->due_at > $today) { + $open += $item->getConvertedAmount() - $payments; + } else { + $overdue += $item->getConvertedAmount() - $payments; + } + } + + return array($paid, $open, $overdue); + } + + private function addToIncomeDonut($color, $amount, $text) + { + $this->income_donut['colors'][] = $color; + $this->income_donut['labels'][] = money($amount, setting('general.default_currency'), true)->format() . ' - ' . $text; + $this->income_donut['values'][] = (int) $amount; + } + + private function addToExpenseDonut($color, $amount, $text) + { + $this->expense_donut['colors'][] = $color; + $this->expense_donut['labels'][] = money($amount, setting('general.default_currency'), true)->format() . ' - ' . $text; + $this->expense_donut['values'][] = (int) $amount; + } +} diff --git a/app/Http/Controllers/Common/Import.php b/app/Http/Controllers/Common/Import.php new file mode 100755 index 0000000..3ea718b --- /dev/null +++ b/app/Http/Controllers/Common/Import.php @@ -0,0 +1,22 @@ +collect(); + + $categories = Category::enabled()->orderBy('name')->type('item')->pluck('name', 'id') + ->prepend(trans('general.all_type', ['type' => trans_choice('general.categories', 2)]), ''); + + return view('common.items.index', compact('items', 'categories')); + } + + /** + * Show the form for viewing the specified resource. + * + * @return Response + */ + public function show() + { + return redirect()->route('items.index'); + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create() + { + $categories = Category::enabled()->orderBy('name')->type('item')->pluck('name', 'id'); + + $taxes = Tax::enabled()->orderBy('rate')->get()->pluck('title', 'id'); + + $currency = Currency::where('code', '=', setting('general.default_currency', 'USD'))->first(); + + return view('common.items.create', compact('categories', 'taxes', 'currency')); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + $item = Item::create($request->input()); + + // Upload picture + if ($request->file('picture')) { + $media = $this->getMedia($request->file('picture'), 'items'); + + $item->attachMedia($media, 'picture'); + } + + $message = trans('messages.success.added', ['type' => trans_choice('general.items', 1)]); + + flash($message)->success(); + + return redirect()->route('items.index'); + } + + /** + * Duplicate the specified resource. + * + * @param Item $item + * + * @return Response + */ + public function duplicate(Item $item) + { + $clone = $item->duplicate(); + + $message = trans('messages.success.duplicated', ['type' => trans_choice('general.items', 1)]); + + flash($message)->success(); + + return redirect()->route('items.edit', $item->id); + } + + /** + * Import the specified resource. + * + * @param ImportFile $import + * + * @return Response + */ + public function import(ImportFile $import) + { + if (!Import::createFromFile($import, 'Common\Item')) { + return redirect('common/import/common/items'); + } + + $message = trans('messages.success.imported', ['type' => trans_choice('general.items', 2)]); + + flash($message)->success(); + + return redirect()->route('items.index'); + } + + /** + * Show the form for editing the specified resource. + * + * @param Item $item + * + * @return Response + */ + public function edit(Item $item) + { + $categories = Category::enabled()->orderBy('name')->type('item')->pluck('name', 'id'); + + $taxes = Tax::enabled()->orderBy('rate')->get()->pluck('title', 'id'); + + $currency = Currency::where('code', '=', setting('general.default_currency', 'USD'))->first(); + + return view('common.items.edit', compact('item', 'categories', 'taxes', 'currency')); + } + + /** + * Update the specified resource in storage. + * + * @param Item $item + * @param Request $request + * + * @return Response + */ + public function update(Item $item, Request $request) + { + $item->update($request->input()); + + // Upload picture + if ($request->file('picture')) { + $media = $this->getMedia($request->file('picture'), 'items'); + + $item->attachMedia($media, 'picture'); + } + + $message = trans('messages.success.updated', ['type' => trans_choice('general.items', 1)]); + + flash($message)->success(); + + return redirect()->route('items.index'); + } + + /** + * Enable the specified resource. + * + * @param Item $item + * + * @return Response + */ + public function enable(Item $item) + { + $item->enabled = 1; + $item->save(); + + $message = trans('messages.success.enabled', ['type' => trans_choice('general.items', 1)]); + + flash($message)->success(); + + return redirect()->route('items.index'); + } + + /** + * Disable the specified resource. + * + * @param Item $item + * + * @return Response + */ + public function disable(Item $item) + { + $item->enabled = 0; + $item->save(); + + $message = trans('messages.success.disabled', ['type' => trans_choice('general.items', 1)]); + + flash($message)->success(); + + return redirect()->route('items.index'); + } + + /** + * Remove the specified resource from storage. + * + * @param Item $item + * + * @return Response + */ + public function destroy(Item $item) + { + $relationships = $this->countRelationships($item, [ + 'invoice_items' => 'invoices', + 'bill_items' => 'bills', + ]); + + if (empty($relationships)) { + $item->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.items', 1)]); + + flash($message)->success(); + } else { + $message = trans('messages.warning.deleted', ['name' => $item->name, 'text' => implode(', ', $relationships)]); + + flash($message)->warning(); + } + + return redirect()->route('items.index'); + } + + /** + * Export the specified resource. + * + * @return Response + */ + public function export() + { + \Excel::create('items', function($excel) { + $excel->sheet('items', function($sheet) { + $sheet->fromModel(Item::filter(request()->input())->get()->makeHidden([ + 'id', 'company_id', 'item_id', 'created_at', 'updated_at', 'deleted_at' + ])); + }); + })->download('xlsx'); + } + + public function autocomplete() + { + $type = request('type'); + $query = request('query'); + $currency_code = request('currency_code'); + + if (empty($currency_code) || (strtolower($currency_code) == 'null')) { + $currency_code = setting('general.default_currency'); + } + + $currency = Currency::where('code', $currency_code)->first(); + + $autocomplete = Item::autocomplete([ + 'name' => $query, + 'sku' => $query, + ]); + + if ($type == 'invoice') { + $autocomplete->quantity(); + } + + $items = $autocomplete->get(); + + if ($items) { + foreach ($items as $item) { + $tax = Tax::find($item->tax_id); + + $item_tax_price = 0; + + if (!empty($tax)) { + $item_tax_price = ($item->sale_price / 100) * $tax->rate; + } + + //$item->sale_price = $this->convertPrice($item->sale_price, $currency_code, $currency->rate); + //$item->purchase_price = $this->convertPrice($item->purchase_price, $currency_code, $currency->rate); + + switch ($type) { + case 'bill': + $total = $item->purchase_price + $item_tax_price; + break; + case 'invoice': + default: + $total = $item->sale_price + $item_tax_price; + break; + } + + $item->total = money($total, $currency_code, true)->format(); + } + } + + return response()->json($items); + } + + public function totalItem(TRequest $request) + { + $input_items = $request->input('item'); + $currency_code = $request->input('currency_code'); + $discount = $request->input('discount'); + + if (empty($currency_code)) { + $currency_code = setting('general.default_currency'); + } + + $json = new \stdClass; + + $sub_total = 0; + $tax_total = 0; + + $items = array(); + + if ($input_items) { + foreach ($input_items as $key => $item) { + $price = (double) $item['price']; + $quantity = (double) $item['quantity']; + + $item_tax_total= 0; + $item_sub_total = ($price * $quantity); + + if (!empty($item['tax_id'])) { + $tax = Tax::find($item['tax_id']); + + $item_tax_total = (($price * $quantity) / 100) * $tax->rate; + } + + $sub_total += $item_sub_total; + + // Apply discount to tax + if ($discount) { + $item_tax_total = $item_tax_total - ($item_tax_total * ($discount / 100)); + } + + $tax_total += $item_tax_total; + + $items[$key] = money($item_sub_total, $currency_code, true)->format(); + } + } + + $json->items = $items; + + $json->sub_total = money($sub_total, $currency_code, true)->format(); + + $json->discount_text= trans('invoices.add_discount'); + $json->discount_total = ''; + + $json->tax_total = money($tax_total, $currency_code, true)->format(); + + // Apply discount to total + if ($discount) { + $json->discount_text= trans('invoices.show_discount', ['discount' => $discount]); + $json->discount_total = money($sub_total * ($discount / 100), $currency_code, true)->format(); + + $sub_total = $sub_total - ($sub_total * ($discount / 100)); + } + + $grand_total = $sub_total + $tax_total; + + $json->grand_total = money($grand_total, $currency_code, true)->format(); + + // Get currency object + $currency = Currency::where('code', $currency_code)->first(); + + $json->currency_name = $currency->name; + $json->currency_code = $currency_code; + $json->currency_rate = $currency->rate; + + $json->thousands_separator = $currency->thousands_separator; + $json->decimal_mark = $currency->decimal_mark; + $json->precision = (int) $currency->precision; + $json->symbol_first = $currency->symbol_first; + $json->symbol = $currency->symbol; + + return response()->json($json); + } + + protected function convertPrice($amount, $currency_code, $currency_rate, $format = false, $reverse = false) + { + $item = new Item(); + + $item->amount = $amount; + $item->currency_code = $currency_code; + $item->currency_rate = $currency_rate; + + if ($reverse) { + return $item->getReverseConvertedAmount($format); + } + + return $item->getConvertedAmount($format); + } +} diff --git a/app/Http/Controllers/Common/Search.php b/app/Http/Controllers/Common/Search.php new file mode 100755 index 0000000..d8c6d0f --- /dev/null +++ b/app/Http/Controllers/Common/Search.php @@ -0,0 +1,130 @@ +with('category')->get()->sortBy('name'); + + return view('items.items.index', compact('items')); + } + + /** + * Display a listing of the resource. + * + * @return Response + */ + public function search() + { + $results = array(); + + $keyword = request('keyword'); + + $accounts = Account::enabled()->search($keyword)->get(); + + if ($accounts->count()) { + foreach ($accounts as $account) { + $results[] = (object)[ + 'id' => $account->id, + 'name' => $account->name, + 'type' => trans_choice('general.accounts', 1), + 'color' => '#337ab7', + 'href' => url('banking/accounts/' . $account->id . '/edit'), + ]; + } + } + + $items = Item::enabled()->search($keyword)->get(); + + if ($items->count()) { + foreach ($items as $item) { + $results[] = (object)[ + 'id' => $item->id, + 'name' => $item->name, + 'type' => trans_choice('general.items', 1), + 'color' => '#f5bd65', + 'href' => url('common/items/' . $item->id . '/edit'), + ]; + } + } + + $invoices = Invoice::search($keyword)->get(); + + if ($invoices->count()) { + foreach ($invoices as $invoice) { + $results[] = (object)[ + 'id' => $invoice->id, + 'name' => $invoice->invoice_number . ' - ' . $invoice->customer_name, + 'type' => trans_choice('general.invoices', 1), + 'color' => '#00c0ef', + 'href' => url('incomes/invoices/' . $invoice->id), + ]; + } + } + + //$revenues = Revenue::search($keyword)->get(); + + $customers = Customer::enabled()->search($keyword)->get(); + + if ($customers->count()) { + foreach ($customers as $customer) { + $results[] = (object)[ + 'id' => $customer->id, + 'name' => $customer->name, + 'type' => trans_choice('general.customers', 1), + 'color' => '#03d876', + 'href' => url('incomes/customers/' . $customer->id), + ]; + } + } + + $bills = Bill::search($keyword)->get(); + + if ($bills->count()) { + foreach ($bills as $bill) { + $results[] = (object)[ + 'id' => $bill->id, + 'name' => $bill->bill_number . ' - ' . $bill->vendor_name, + 'type' => trans_choice('general.bills', 1), + 'color' => '#dd4b39', + 'href' => url('expenses/bills/' . $bill->id), + ]; + } + } + + //$payments = Payment::search($keyword)->get(); + + $vendors = Vendor::enabled()->search($keyword)->get(); + + if ($vendors->count()) { + foreach ($vendors as $vendor) { + $results[] = (object)[ + 'id' => $vendor->id, + 'name' => $vendor->name, + 'type' => trans_choice('general.vendors', 1), + 'color' => '#ff8373', + 'href' => url('expenses/vendors/' . $vendor->id), + ]; + } + } + + return response()->json((object) $results); + } +} diff --git a/app/Http/Controllers/Common/Uploads.php b/app/Http/Controllers/Common/Uploads.php new file mode 100755 index 0000000..3c8bb73 --- /dev/null +++ b/app/Http/Controllers/Common/Uploads.php @@ -0,0 +1,115 @@ +getPath($media)) { + return false; + } + + return response()->file($path); + } + + /** + * Download the specified resource. + * + * @param $id + * @return mixed + */ + public function download($id) + { + $media = Media::find($id); + + // Get file path + if (!$path = $this->getPath($media)) { + return false; + } + + return response()->download($path); + } + + /** + * Destroy the specified resource. + * + * @param $id + * @return callable + */ + public function destroy($id, Request $request) + { + $media = Media::find($id); + + // Get file path + if (!$path = $this->getPath($media)) { + $message = trans('messages.warning.deleted', ['name' => $media->basename, 'text' => $media->basename]); + + flash($message)->warning(); + + return back(); + } + + $media->delete(); //will not delete files + + File::delete($path); + + if (!empty($request->input('page'))) { + switch ($request->input('page')) { + case 'setting': + setting()->set($request->input('key'), ''); + + setting()->save(); + break; + default; + } + } + + return back(); + } + + /** + * Get the full path of resource. + * + * @param $media + * @return boolean|string + */ + protected function getPath($media) + { + $path = $media->basename; + + if (!empty($media->directory)) { + $folders = explode('/', $media->directory); + + // Check if company can access media + if ($folders[0] != session('company_id')) { + return false; + } + + $path = $media->directory . '/' . $media->basename; + } + + if (!Storage::exists($path)) { + return false; + } + + $full_path = Storage::path($path); + + return $full_path; + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100755 index 0000000..d050ae3 --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,112 @@ +runningInConsole()) { + return; + } + + $route = app(Route::class); + + // Get the controller array + $arr = array_reverse(explode('\\', explode('@', $route->getAction()['uses'])[0])); + + $controller = ''; + + // Add folder + if (strtolower($arr[1]) != 'controllers') { + $controller .= kebab_case($arr[1]) . '-'; + } + + // Add module + if (isset($arr[3]) && isset($arr[4]) && (strtolower($arr[4]) == 'modules')) { + $controller .= kebab_case($arr[3]) . '-'; + } + + // Add file + $controller .= kebab_case($arr[0]); + + // Skip ACL + $skip = ['common-dashboard', 'customers-dashboard']; + if (in_array($controller, $skip)) { + return; + } + + // Add CRUD permission check + $this->middleware('permission:create-' . $controller)->only(['create', 'store', 'duplicate', 'import']); + $this->middleware('permission:read-' . $controller)->only(['index', 'show', 'edit', 'export']); + $this->middleware('permission:update-' . $controller)->only(['update', 'enable', 'disable']); + $this->middleware('permission:delete-' . $controller)->only('destroy'); + } + + public function countRelationships($model, $relationships) + { + $counter = array(); + + foreach ($relationships as $relationship => $text) { + if ($c = $model->$relationship()->count()) { + $counter[] = $c . ' ' . strtolower(trans_choice('general.' . $text, ($c > 1) ? 2 : 1)); + } + } + + return $counter; + } + + /** + * Check for api token and redirect if empty. + * + * @return mixed + */ + public function checkApiToken() + { + if (setting('general.api_token')) { + return; + } + + redirect('apps/token/create')->send(); + } + + /** + * Mass delete relationships with events being fired. + * + * @param $model + * @param $relationships + * + * @return void + */ + public function deleteRelationships($model, $relationships) + { + foreach ((array) $relationships as $relationship) { + if (empty($model->$relationship)) { + continue; + } + + $items = $model->$relationship->all(); + + if ($items instanceof Collection) { + $items = $items->all(); + } + + foreach ((array) $items as $item) { + $item->delete(); + } + } + } +} diff --git a/app/Http/Controllers/Customers/Dashboard.php b/app/Http/Controllers/Customers/Dashboard.php new file mode 100755 index 0000000..ac3014b --- /dev/null +++ b/app/Http/Controllers/Customers/Dashboard.php @@ -0,0 +1,125 @@ +user()->customer; + + $invoices = Invoice::with('status')->accrued()->where('customer_id', $customer->id)->get(); + + $start = Date::parse(request('start', Date::today()->startOfYear()->format('Y-m-d'))); + $end = Date::parse(request('end', Date::today()->endOfYear()->format('Y-m-d'))); + + $start_month = $start->month; + $end_month = $end->month; + + // Monthly + $labels = []; + + $s = clone $start; + + for ($j = $end_month; $j >= $start_month; $j--) { + $labels[$end_month - $j] = $s->format('M Y'); + + $s->addMonth(); + } + + $unpaid = $paid = $overdue = $partial_paid = []; + + foreach ($invoices as $invoice) { + switch ($invoice->invoice_status_code) { + case 'paid': + $paid[] = $invoice; + break; + case 'partial': + $partial_paid[] = $invoice; + break; + case 'sent': + default: + if (Date::today()->format('Y-m-d') > $invoice->due_at->format('Y-m-d')) { + $overdue[] = $invoice; + } else { + $unpaid[] = $invoice; + } + } + } + + $total = count($unpaid) + count($paid) + count($partial_paid) + count($overdue); + + $progress = [ + 'unpaid' => count($unpaid), + 'paid' => count($paid), + 'overdue' => count($overdue), + 'partially_paid' => count($partial_paid), + 'total' => $total, + ]; + + $unpaid = $this->calculateTotals($unpaid, $start, $end, 'unpaid'); + $paid = $this->calculateTotals($paid, $start, $end, 'paid'); + $partial_paid = $this->calculateTotals($partial_paid, $start, $end, 'partial'); + $overdue = $this->calculateTotals($overdue, $start, $end, 'overdue'); + + $chart = Charts::multi('line', 'chartjs') + ->dimensions(0, 300) + ->colors(['#dd4b39', '#6da252', '#f39c12', '#00c0ef']) + ->dataset(trans('general.unpaid'), $unpaid) + ->dataset(trans('general.paid'), $paid) + ->dataset(trans('general.overdue'), $overdue) + ->dataset(trans('general.partially_paid'), $partial_paid) + ->labels($labels) + ->credits(false) + ->view('vendor.consoletvs.charts.chartjs.multi.line'); + + return view('customers.dashboard.index', compact('customer', 'invoices', 'progress', 'chart')); + } + + private function calculateTotals($items, $start, $end, $type) + { + $totals = []; + + $date_format = 'Y-m'; + + $n = 1; + $start_date = $start->format($date_format); + $end_date = $end->format($date_format); + $next_date = $start_date; + + $s = clone $start; + + while ($next_date <= $end_date) { + $totals[$next_date] = 0; + + $next_date = $s->addMonths($n)->format($date_format); + } + + $this->setTotals($totals, $items, $date_format, $type); + + return $totals; + } + + private function setTotals(&$totals, $items, $date_format, $type) + { + foreach ($items as $item) { + if ($type == 'partial') { + $item->amount = $item->payments()->paid(); + } + + $i = Date::parse($item->paid_at)->format($date_format); + + $totals[$i] += $item->getConvertedAmount(); + } + } +} diff --git a/app/Http/Controllers/Customers/Invoices.php b/app/Http/Controllers/Customers/Invoices.php new file mode 100755 index 0000000..aea447a --- /dev/null +++ b/app/Http/Controllers/Customers/Invoices.php @@ -0,0 +1,181 @@ +accrued()->where('customer_id', auth()->user()->customer->id)->paginate(); + + $status = collect(InvoiceStatus::all()->pluck('name', 'code')) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.statuses', 2)]), ''); + + return view('customers.invoices.index', compact('invoices', 'status')); + } + + /** + * Show the form for viewing the specified resource. + * + * @param Invoice $invoice + * + * @return Response + */ + public function show(Invoice $invoice) + { + $paid = 0; + + foreach ($invoice->payments as $item) { + $amount = $item->amount; + + if ($invoice->currency_code != $item->currency_code) { + $item->default_currency_code = $invoice->currency_code; + + $amount = $item->getDynamicConvertedAmount(); + } + + $paid += $amount; + } + + $invoice->paid = $paid; + + $accounts = Account::enabled()->pluck('name', 'id'); + + $currencies = Currency::enabled()->pluck('name', 'code')->toArray(); + + $account_currency_code = Account::where('id', setting('general.default_account'))->pluck('currency_code')->first(); + + $customers = Customer::enabled()->pluck('name', 'id'); + + $categories = Category::enabled()->type('income')->pluck('name', 'id'); + + $payment_methods = Modules::getPaymentMethods(); + + return view('customers.invoices.show', compact('invoice', 'accounts', 'currencies', 'account_currency_code', 'customers', 'categories', 'payment_methods')); + } + + /** + * Show the form for viewing the specified resource. + * + * @param Invoice $invoice + * + * @return Response + */ + public function printInvoice(Invoice $invoice) + { + $invoice = $this->prepareInvoice($invoice); + + $logo = $this->getLogo(); + + return view($invoice->template_path, compact('invoice', 'logo')); + } + + /** + * Show the form for viewing the specified resource. + * + * @param Invoice $invoice + * + * @return Response + */ + public function pdfInvoice(Invoice $invoice) + { + $invoice = $this->prepareInvoice($invoice); + + $logo = $this->getLogo(); + + $html = view($invoice->template_path, compact('invoice', 'logo'))->render(); + + $pdf = \App::make('dompdf.wrapper'); + $pdf->loadHTML($html); + + //$pdf->setPaper('A4', 'portrait'); + + $file_name = 'invoice_' . time() . '.pdf'; + + return $pdf->download($file_name); + } + + protected function prepareInvoice(Invoice $invoice) + { + $paid = 0; + + foreach ($invoice->payments as $item) { + $amount = $item->amount; + + if ($invoice->currency_code != $item->currency_code) { + $item->default_currency_code = $invoice->currency_code; + + $amount = $item->getDynamicConvertedAmount(); + } + + $paid += $amount; + } + + $invoice->paid = $paid; + + $invoice->template_path = 'incomes.invoices.invoice'; + + event(new InvoicePrinting($invoice)); + + return $invoice; + } + + protected function getLogo() + { + $logo = ''; + + $media_id = setting('general.company_logo'); + + if (setting('general.invoice_logo')) { + $media_id = setting('general.invoice_logo'); + } + + $media = Media::find($media_id); + + if (!empty($media)) { + $path = Storage::path($media->getDiskPath()); + + if (!is_file($path)) { + return $logo; + } + } else { + $path = asset('public/img/company.png'); + } + + $image = Image::make($path)->encode()->getEncoded(); + + if (empty($image)) { + return $logo; + } + + $extension = File::extension($path); + + $logo = 'data:image/' . $extension . ';base64,' . base64_encode($image); + + return $logo; + } +} diff --git a/app/Http/Controllers/Customers/Payments.php b/app/Http/Controllers/Customers/Payments.php new file mode 100755 index 0000000..8ddadde --- /dev/null +++ b/app/Http/Controllers/Customers/Payments.php @@ -0,0 +1,50 @@ +where('customer_id', '=', Auth::user()->customer->id)->paginate(); + + $payment_methods = Modules::getPaymentMethods('all'); + + $categories = collect(Category::enabled()->type('income')->pluck('name', 'id')) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.categories', 2)]), ''); + + $accounts = collect(Account::enabled()->pluck('name', 'id')) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.accounts', 2)]), ''); + + return view('customers.payments.index', compact('payments', 'payment_methods', 'categories', 'accounts')); + } + + /** + * Show the form for viewing the specified resource. + * + * @param Payment $payment + * + * @return Response + */ + public function show(Payment $payment) + { + $payment_methods = Modules::getPaymentMethods(); + + return view('customers.payments.show', compact('payment', 'payment_methods')); + } +} diff --git a/app/Http/Controllers/Customers/Profile.php b/app/Http/Controllers/Customers/Profile.php new file mode 100755 index 0000000..7fea1c0 --- /dev/null +++ b/app/Http/Controllers/Customers/Profile.php @@ -0,0 +1,95 @@ +edit(); + } + + public function show() + { + return $this->edit(); + } + + /** + * Show the form for editing the specified resource. + * + * @return Response + */ + public function edit() + { + $user = auth()->user(); + + return view('customers.profile.edit', compact('user')); + } + + /** + * Update the specified resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function update(Request $request) + { + $user = auth()->user(); + + // Do not reset password if not entered/changed + if (empty($request['password'])) { + unset($request['password']); + unset($request['password_confirmation']); + } + + // Update user + $user->update($request->input()); + + // Upload picture + if ($request->file('picture')) { + $media = $this->getMedia($request->file('picture'), 'users'); + + $user->attachMedia($media, 'picture'); + } + + // Update customer + $user->customer->update($request->input()); + + $message = trans('messages.success.updated', ['type' => trans('auth.profile')]); + + flash($message)->success(); + + return redirect('customers/profile/edit'); + } + + /** + * Mark overdue invoices notifications are read and redirect to invoices page. + * + * @return Response + */ + public function readOverdueInvoices() + { + $user = auth()->user(); + + // Mark invoice notifications as read + foreach ($user->unreadNotifications as $notification) { + // Not an invoice notification + if ($notification->getAttribute('type') != 'App\Notifications\Income\Invoice') { + continue; + } + + $notification->markAsRead(); + } + + // Redirect to invoices + return redirect('customers/invoices'); + } +} diff --git a/app/Http/Controllers/Customers/Transactions.php b/app/Http/Controllers/Customers/Transactions.php new file mode 100755 index 0000000..f04d78a --- /dev/null +++ b/app/Http/Controllers/Customers/Transactions.php @@ -0,0 +1,24 @@ +customer->id, 'revenues'); + + return view('customers.transactions.index', compact('transactions')); + } +} diff --git a/app/Http/Controllers/Expenses/Bills.php b/app/Http/Controllers/Expenses/Bills.php new file mode 100755 index 0000000..9beb38e --- /dev/null +++ b/app/Http/Controllers/Expenses/Bills.php @@ -0,0 +1,854 @@ +collect(['billed_at'=> 'desc']); + + $vendors = collect(Vendor::enabled()->orderBy('name')->pluck('name', 'id')) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.vendors', 2)]), ''); + + $statuses = collect(BillStatus::all()->pluck('name', 'code')) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.statuses', 2)]), ''); + + return view('expenses.bills.index', compact('bills', 'vendors', 'statuses')); + } + + /** + * Show the form for viewing the specified resource. + * + * @param Bill $bill + * + * @return Response + */ + public function show(Bill $bill) + { + $paid = 0; + + // Get Bill Payments + if ($bill->payments->count()) { + $_currencies = Currency::enabled()->pluck('rate', 'code')->toArray(); + + foreach ($bill->payments as $item) { + $default_amount = (double) $item->amount; + + if ($bill->currency_code == $item->currency_code) { + $amount = $default_amount; + } else { + $default_amount_model = new BillPayment(); + + $default_amount_model->default_currency_code = $bill->currency_code; + $default_amount_model->amount = $default_amount; + $default_amount_model->currency_code = $item->currency_code; + $default_amount_model->currency_rate = $_currencies[$item->currency_code]; + + $default_amount = (double) $default_amount_model->getDivideConvertedAmount(); + + $convert_amount = new BillPayment(); + + $convert_amount->default_currency_code = $item->currency_code; + $convert_amount->amount = $default_amount; + $convert_amount->currency_code = $bill->currency_code; + $convert_amount->currency_rate = $_currencies[$bill->currency_code]; + + $amount = (double) $convert_amount->getDynamicConvertedAmount(); + } + + $paid += $amount; + } + } + + $bill->paid = $paid; + + $accounts = Account::enabled()->orderBy('name')->pluck('name', 'id'); + + $currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code')->toArray(); + + $account_currency_code = Account::where('id', setting('general.default_account'))->pluck('currency_code')->first(); + + $vendors = Vendor::enabled()->orderBy('name')->pluck('name', 'id'); + + $categories = Category::enabled()->type('income')->orderBy('name')->pluck('name', 'id'); + + $payment_methods = Modules::getPaymentMethods(); + + return view('expenses.bills.show', compact('bill', 'accounts', 'currencies', 'account_currency_code', 'vendors', 'categories', 'payment_methods')); + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create() + { + $vendors = Vendor::enabled()->orderBy('name')->pluck('name', 'id'); + + $currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code'); + + $currency = Currency::where('code', '=', setting('general.default_currency'))->first(); + + $items = Item::enabled()->orderBy('name')->pluck('name', 'id'); + + $taxes = Tax::enabled()->orderBy('rate')->get()->pluck('title', 'id'); + + $categories = Category::enabled()->type('expense')->orderBy('name')->pluck('name', 'id'); + + return view('expenses.bills.create', compact('vendors', 'currencies', 'currency', 'items', 'taxes', 'categories')); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + $bill = Bill::create($request->input()); + + // Upload attachment + if ($request->file('attachment')) { + $media = $this->getMedia($request->file('attachment'), 'bills'); + + $bill->attachMedia($media, 'attachment'); + } + + $taxes = []; + + $tax_total = 0; + $sub_total = 0; + $discount_total = 0; + $discount = $request['discount']; + + $bill_item = []; + $bill_item['company_id'] = $request['company_id']; + $bill_item['bill_id'] = $bill->id; + + if ($request['item']) { + foreach ($request['item'] as $item) { + unset($tax_object); + $item_sku = ''; + + if (!empty($item['item_id'])) { + $item_object = Item::find($item['item_id']); + + $item['name'] = $item_object->name; + $item_sku = $item_object->sku; + + // Increase stock (item bought) + $item_object->quantity += $item['quantity']; + $item_object->save(); + } + + $tax = $tax_id = 0; + + if (!empty($item['tax_id'])) { + $tax_object = Tax::find($item['tax_id']); + + $tax_id = $item['tax_id']; + + $tax = (((double) $item['price'] * (double) $item['quantity']) / 100) * $tax_object->rate; + + // Apply discount to tax + if ($discount) { + $tax = $tax - ($tax * ($discount / 100)); + } + } + + $bill_item['item_id'] = $item['item_id']; + $bill_item['name'] = str_limit($item['name'], 180, ''); + $bill_item['sku'] = $item_sku; + $bill_item['quantity'] = (double) $item['quantity']; + $bill_item['price'] = (double) $item['price']; + $bill_item['tax'] = $tax; + $bill_item['tax_id'] = $tax_id; + $bill_item['total'] = (double) $item['price'] * (double) $item['quantity']; + + BillItem::create($bill_item); + + // Set taxes + if (isset($tax_object)) { + if (array_key_exists($tax_object->id, $taxes)) { + $taxes[$tax_object->id]['amount'] += $tax; + } else { + $taxes[$tax_object->id] = [ + 'name' => $tax_object->name, + 'amount' => $tax + ]; + } + } + + // Calculate totals + $tax_total += $tax; + $sub_total += $bill_item['total']; + + unset($tax_object); + } + } + + $s_total = $sub_total; + + // Apply discount to total + if ($discount) { + $s_discount = $s_total * ($discount / 100); + $discount_total += $s_discount; + $s_total = $s_total - $s_discount; + } + + $amount = $s_total + $tax_total; + + $request['amount'] = money($amount, $request['currency_code'])->getAmount(); + + $bill->update($request->input()); + + // Add bill totals + $this->addTotals($bill, $request, $taxes, $sub_total, $discount_total, $tax_total); + + // Add bill history + BillHistory::create([ + 'company_id' => session('company_id'), + 'bill_id' => $bill->id, + 'status_code' => 'draft', + 'notify' => 0, + 'description' => trans('messages.success.added', ['type' => $bill->bill_number]), + ]); + + // Recurring + $bill->createRecurring(); + + // Fire the event to make it extendible + event(new BillCreated($bill)); + + $message = trans('messages.success.added', ['type' => trans_choice('general.bills', 1)]); + + flash($message)->success(); + + return redirect('expenses/bills/' . $bill->id); + } + + /** + * Duplicate the specified resource. + * + * @param Bill $bill + * + * @return Response + */ + public function duplicate(Bill $bill) + { + $clone = $bill->duplicate(); + + // Add bill history + BillHistory::create([ + 'company_id' => session('company_id'), + 'bill_id' => $clone->id, + 'status_code' => 'draft', + 'notify' => 0, + 'description' => trans('messages.success.added', ['type' => $clone->bill_number]), + ]); + + $message = trans('messages.success.duplicated', ['type' => trans_choice('general.bills', 1)]); + + flash($message)->success(); + + return redirect('expenses/bills/' . $clone->id . '/edit'); + } + + /** + * Import the specified resource. + * + * @param ImportFile $import + * + * @return Response + */ + public function import(ImportFile $import) + { + $success = true; + + $allowed_sheets = ['bills', 'bill_items', 'bill_histories', 'bill_payments', 'bill_totals']; + + // Loop through all sheets + $import->each(function ($sheet) use (&$success, $allowed_sheets) { + $sheet_title = $sheet->getTitle(); + + if (!in_array($sheet_title, $allowed_sheets)) { + $message = trans('messages.error.import_sheet'); + + flash($message)->error()->important(); + + return false; + } + + $slug = 'Expense\\' . str_singular(studly_case($sheet_title)); + + if (!$success = Import::createFromSheet($sheet, $slug)) { + return false; + } + }); + + if (!$success) { + return redirect('common/import/expenses/bills'); + } + + $message = trans('messages.success.imported', ['type' => trans_choice('general.bills', 2)]); + + flash($message)->success(); + + return redirect('expenses/bills'); + } + + /** + * Show the form for editing the specified resource. + * + * @param Bill $bill + * + * @return Response + */ + public function edit(Bill $bill) + { + $vendors = Vendor::enabled()->orderBy('name')->pluck('name', 'id'); + + $currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code'); + + $currency = Currency::where('code', '=', $bill->currency_code)->first(); + + $items = Item::enabled()->orderBy('name')->pluck('name', 'id'); + + $taxes = Tax::enabled()->orderBy('rate')->get()->pluck('title', 'id'); + + $categories = Category::enabled()->type('expense')->orderBy('name')->pluck('name', 'id'); + + return view('expenses.bills.edit', compact('bill', 'vendors', 'currencies', 'currency', 'items', 'taxes', 'categories')); + } + + /** + * Update the specified resource in storage. + * + * @param Bill $bill + * @param Request $request + * + * @return Response + */ + public function update(Bill $bill, Request $request) + { + $taxes = []; + $tax_total = 0; + $sub_total = 0; + $discount_total = 0; + $discount = $request['discount']; + + $bill_item = []; + $bill_item['company_id'] = $request['company_id']; + $bill_item['bill_id'] = $bill->id; + + if ($request['item']) { + $this->deleteRelationships($bill, 'items'); + + foreach ($request['item'] as $item) { + unset($tax_object); + $item_sku = ''; + + if (!empty($item['item_id'])) { + $item_object = Item::find($item['item_id']); + + $item['name'] = $item_object->name; + $item_sku = $item_object->sku; + } + + $tax = $tax_id = 0; + + if (!empty($item['tax_id'])) { + $tax_object = Tax::find($item['tax_id']); + + $tax_id = $item['tax_id']; + + $tax = (((double) $item['price'] * (double) $item['quantity']) / 100) * $tax_object->rate; + + // Apply discount to tax + if ($discount) { + $tax = $tax - ($tax * ($discount / 100)); + } + } + + $bill_item['item_id'] = $item['item_id']; + $bill_item['name'] = str_limit($item['name'], 180, ''); + $bill_item['sku'] = $item_sku; + $bill_item['quantity'] = (double) $item['quantity']; + $bill_item['price'] = (double) $item['price']; + $bill_item['tax'] = $tax; + $bill_item['tax_id'] = $tax_id; + $bill_item['total'] = (double) $item['price'] * (double) $item['quantity']; + + if (isset($tax_object)) { + if (array_key_exists($tax_object->id, $taxes)) { + $taxes[$tax_object->id]['amount'] += $tax; + } else { + $taxes[$tax_object->id] = [ + 'name' => $tax_object->name, + 'amount' => $tax + ]; + } + } + + $tax_total += $tax; + $sub_total += $bill_item['total']; + + BillItem::create($bill_item); + } + } + + $s_total = $sub_total; + + // Apply discount to total + if ($discount) { + $s_discount = $s_total * ($discount / 100); + $discount_total += $s_discount; + $s_total = $s_total - $s_discount; + } + + $amount = $s_total + $tax_total; + + $request['amount'] = money($amount, $request['currency_code'])->getAmount(); + + $bill->update($request->input()); + + // Upload attachment + if ($request->file('attachment')) { + $media = $this->getMedia($request->file('attachment'), 'bills'); + + $bill->attachMedia($media, 'attachment'); + } + + // Delete previous bill totals + $this->deleteRelationships($bill, 'totals'); + + // Add bill totals + $this->addTotals($bill, $request, $taxes, $sub_total, $discount_total, $tax_total); + + // Recurring + $bill->updateRecurring(); + + // Fire the event to make it extendible + event(new BillUpdated($bill)); + + $message = trans('messages.success.updated', ['type' => trans_choice('general.bills', 1)]); + + flash($message)->success(); + + return redirect('expenses/bills/' . $bill->id); + } + + /** + * Remove the specified resource from storage. + * + * @param Bill $bill + * + * @return Response + */ + public function destroy(Bill $bill) + { + $this->deleteRelationships($bill, ['items', 'histories', 'payments', 'recurring', 'totals']); + $bill->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.bills', 1)]); + + flash($message)->success(); + + return redirect('expenses/bills'); + } + + /** + * Export the specified resource. + * + * @return Response + */ + public function export() + { + \Excel::create('bills', function ($excel) { + $bills = Bill::with(['items', 'histories', 'payments', 'totals'])->filter(request()->input())->get(); + + $excel->sheet('invoices', function ($sheet) use ($bills) { + $sheet->fromModel($bills->makeHidden([ + 'company_id', 'parent_id', 'created_at', 'updated_at', 'deleted_at', 'attachment', 'discount', 'items', 'histories', 'payments', 'totals', 'media' + ])); + }); + + $tables = ['items', 'histories', 'payments', 'totals']; + foreach ($tables as $table) { + $excel->sheet('bill_' . $table, function ($sheet) use ($bills, $table) { + $hidden_fields = ['id', 'company_id', 'created_at', 'updated_at', 'deleted_at', 'title']; + + $i = 1; + + foreach ($bills as $bill) { + $model = $bill->$table->makeHidden($hidden_fields); + + if ($i == 1) { + $sheet->fromModel($model, null, 'A1', false); + } else { + // Don't put multiple heading columns + $sheet->fromModel($model, null, 'A1', false, false); + } + + $i++; + } + }); + } + })->download('xlsx'); + } + + /** + * Mark the bill as received. + * + * @param Bill $bill + * + * @return Response + */ + public function markReceived(Bill $bill) + { + $bill->bill_status_code = 'received'; + $bill->save(); + + flash(trans('bills.messages.received'))->success(); + + return redirect()->back(); + } + + /** + * Print the bill. + * + * @param Bill $bill + * + * @return Response + */ + public function printBill(Bill $bill) + { + $bill = $this->prepareBill($bill); + + return view($bill->template_path, compact('bill')); + } + + /** + * Download the PDF file of bill. + * + * @param Bill $bill + * + * @return Response + */ + public function pdfBill(Bill $bill) + { + $bill = $this->prepareBill($bill); + + $html = view($bill->template_path, compact('bill'))->render(); + + $pdf = \App::make('dompdf.wrapper'); + $pdf->loadHTML($html); + + $file_name = 'bill_' . time() . '.pdf'; + + return $pdf->download($file_name); + } + + /** + * Add payment to the bill. + * + * @param PaymentRequest $request + * + * @return Response + */ + public function payment(PaymentRequest $request) + { + // Get currency object + $currency = Currency::where('code', $request['currency_code'])->first(); + + $request['currency_code'] = $currency->code; + $request['currency_rate'] = $currency->rate; + + $bill = Bill::find($request['bill_id']); + + $total_amount = $bill->amount; + + $amount = (double) $request['amount']; + + if ($request['currency_code'] != $bill->currency_code) { + $request_bill = new Bill(); + + $request_bill->amount = (float) $request['amount']; + $request_bill->currency_code = $currency->code; + $request_bill->currency_rate = $currency->rate; + + $amount = $request_bill->getConvertedAmount(); + } + + if ($bill->payments()->count()) { + $total_amount -= $bill->payments()->paid(); + } + + // For amount cover integer + $multiplier = 1; + + for ($i = 0; $i < $currency->precision; $i++) { + $multiplier *= 10; + } + + $amount *= $multiplier; + $total_amount *= $multiplier; + + if ($amount > $total_amount) { + $message = trans('messages.error.over_payment'); + + return response()->json([ + 'success' => false, + 'error' => true, + 'message' => $message, + ]); + } elseif ($amount == $total_amount) { + $bill->bill_status_code = 'paid'; + } else { + $bill->bill_status_code = 'partial'; + } + + $bill->save(); + + $bill_payment_request = [ + 'company_id' => $request['company_id'], + 'bill_id' => $request['bill_id'], + 'account_id' => $request['account_id'], + 'paid_at' => $request['paid_at'], + 'amount' => $request['amount'], + 'currency_code' => $request['currency_code'], + 'currency_rate' => $request['currency_rate'], + 'description' => $request['description'], + 'payment_method' => $request['payment_method'], + 'reference' => $request['reference'] + ]; + + $bill_payment = BillPayment::create($bill_payment_request); + + // Upload attachment + if ($request->file('attachment')) { + $media = $this->getMedia($request->file('attachment'), 'bills'); + + $bill_payment->attachMedia($media, 'attachment'); + } + + $request['status_code'] = $bill->bill_status_code; + $request['notify'] = 0; + + $desc_amount = money((float) $request['amount'], (string) $request['currency_code'], true)->format(); + + $request['description'] = $desc_amount . ' ' . trans_choice('general.payments', 1); + + BillHistory::create($request->input()); + + $message = trans('messages.success.added', ['type' => trans_choice('general.payments', 1)]); + + return response()->json([ + 'success' => true, + 'error' => false, + 'message' => $message, + ]); + } + + /** + * Remove the specified resource from storage. + * + * @param BillPayment $payment + * + * @return Response + */ + public function paymentDestroy(BillPayment $payment) + { + $bill = Bill::find($payment->bill_id); + + if ($bill->payments()->count() > 1) { + $bill->bill_status_code = 'partial'; + } else { + $bill->bill_status_code = 'received'; + } + + $bill->save(); + + $desc_amount = money((float) $payment->amount, (string) $payment->currency_code, true)->format(); + + $description = $desc_amount . ' ' . trans_choice('general.payments', 1); + + // Add bill history + BillHistory::create([ + 'company_id' => $bill->company_id, + 'bill_id' => $bill->id, + 'status_code' => $bill->bill_status_code, + 'notify' => 0, + 'description' => trans('messages.success.deleted', ['type' => $description]), + ]); + + $payment->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.bills', 1)]); + + flash($message)->success(); + + return redirect()->back(); + } + + public function addItem(ItemRequest $request) + { + if ($request['item_row']) { + $item_row = $request['item_row']; + + $taxes = Tax::enabled()->orderBy('rate')->get()->pluck('title', 'id'); + + $currency = Currency::where('code', '=', $request['currency_code'])->first(); + + // it should be integer for amount mask + $currency->precision = (int) $currency->precision; + + $html = view('expenses.bills.item', compact('item_row', 'taxes', 'currency'))->render(); + + return response()->json([ + 'success' => true, + 'error' => false, + 'data' => [ + 'currency' => $currency + ], + 'message' => 'null', + 'html' => $html, + ]); + } + + return response()->json([ + 'success' => false, + 'error' => true, + 'data' => 'null', + 'message' => trans('issue'), + 'html' => 'null', + ]); + } + + protected function prepareBill(Bill $bill) + { + $paid = 0; + + foreach ($bill->payments as $item) { + $amount = $item->amount; + + if ($bill->currency_code != $item->currency_code) { + $item->default_currency_code = $bill->currency_code; + + $amount = $item->getDynamicConvertedAmount(); + } + + $paid += $amount; + } + + $bill->paid = $paid; + + $bill->template_path = 'expenses.bills.bill'; + + //event(new BillPrinting($bill)); + + return $bill; + } + + protected function addTotals($bill, $request, $taxes, $sub_total, $discount_total, $tax_total) + { + $sort_order = 1; + + // Added bill sub total + BillTotal::create([ + 'company_id' => $request['company_id'], + 'bill_id' => $bill->id, + 'code' => 'sub_total', + 'name' => 'bills.sub_total', + 'amount' => $sub_total, + 'sort_order' => $sort_order, + ]); + + $sort_order++; + + // Added bill discount + if ($discount_total) { + BillTotal::create([ + 'company_id' => $request['company_id'], + 'bill_id' => $bill->id, + 'code' => 'discount', + 'name' => 'bills.discount', + 'amount' => $discount_total, + 'sort_order' => $sort_order, + ]); + + // This is for total + $sub_total = $sub_total - $discount_total; + } + + $sort_order++; + + // Added bill taxes + if ($taxes) { + foreach ($taxes as $tax) { + BillTotal::create([ + 'company_id' => $request['company_id'], + 'bill_id' => $bill->id, + 'code' => 'tax', + 'name' => $tax['name'], + 'amount' => $tax['amount'], + 'sort_order' => $sort_order, + ]); + + $sort_order++; + } + } + + // Added bill total + BillTotal::create([ + 'company_id' => $request['company_id'], + 'bill_id' => $bill->id, + 'code' => 'total', + 'name' => 'bills.total', + 'amount' => $sub_total + $tax_total, + 'sort_order' => $sort_order, + ]); + } +} diff --git a/app/Http/Controllers/Expenses/Payments.php b/app/Http/Controllers/Expenses/Payments.php new file mode 100755 index 0000000..6a7fb1e --- /dev/null +++ b/app/Http/Controllers/Expenses/Payments.php @@ -0,0 +1,238 @@ +isNotTransfer()->collect(['paid_at'=> 'desc']); + + $vendors = collect(Vendor::enabled()->orderBy('name')->pluck('name', 'id')) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.vendors', 2)]), ''); + + $categories = collect(Category::enabled()->type('expense')->orderBy('name')->pluck('name', 'id')) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.categories', 2)]), ''); + + $accounts = collect(Account::enabled()->orderBy('name')->pluck('name', 'id')) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.accounts', 2)]), ''); + + $transfer_cat_id = Category::transfer(); + + return view('expenses.payments.index', compact('payments', 'vendors', 'categories', 'accounts', 'transfer_cat_id')); + } + + /** + * Show the form for viewing the specified resource. + * + * @return Response + */ + public function show() + { + return redirect('expenses/payments'); + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create() + { + $accounts = Account::enabled()->orderBy('name')->pluck('name', 'id'); + + $currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code')->toArray(); + + $account_currency_code = Account::where('id', setting('general.default_account'))->pluck('currency_code')->first(); + + $currency = Currency::where('code', '=', $account_currency_code)->first(); + + $vendors = Vendor::enabled()->orderBy('name')->pluck('name', 'id'); + + $categories = Category::enabled()->type('expense')->orderBy('name')->pluck('name', 'id'); + + $payment_methods = Modules::getPaymentMethods(); + + return view('expenses.payments.create', compact('accounts', 'currencies', 'account_currency_code', 'currency', 'vendors', 'categories', 'payment_methods')); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + $payment = Payment::create($request->input()); + + // Upload attachment + $media = $this->getMedia($request->file('attachment'), 'payments'); + + if ($media) { + $payment->attachMedia($media, 'attachment'); + } + + // Recurring + $payment->createRecurring(); + + $message = trans('messages.success.added', ['type' => trans_choice('general.payments', 1)]); + + flash($message)->success(); + + return redirect('expenses/payments'); + } + + /** + * Duplicate the specified resource. + * + * @param Payment $payment + * + * @return Response + */ + public function duplicate(Payment $payment) + { + $clone = $payment->duplicate(); + + $message = trans('messages.success.duplicated', ['type' => trans_choice('general.payments', 1)]); + + flash($message)->success(); + + return redirect('expenses/payments/' . $clone->id . '/edit'); + } + + /** + * Import the specified resource. + * + * @param ImportFile $import + * + * @return Response + */ + public function import(ImportFile $import) + { + if (!Import::createFromFile($import, 'Expense\Payment')) { + return redirect('common/import/expenses/payments'); + } + + $message = trans('messages.success.imported', ['type' => trans_choice('general.payments', 2)]); + + flash($message)->success(); + + return redirect('expenses/payments'); + } + + /** + * Show the form for editing the specified resource. + * + * @param Payment $payment + * + * @return Response + */ + public function edit(Payment $payment) + { + $accounts = Account::enabled()->orderBy('name')->pluck('name', 'id'); + + $currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code')->toArray(); + + $account_currency_code = Account::where('id', $payment->account_id)->pluck('currency_code')->first(); + + $currency = Currency::where('code', '=', $account_currency_code)->first(); + + $vendors = Vendor::enabled()->orderBy('name')->pluck('name', 'id'); + + $categories = Category::enabled()->type('expense')->orderBy('name')->pluck('name', 'id'); + + $payment_methods = Modules::getPaymentMethods(); + + return view('expenses.payments.edit', compact('payment', 'accounts', 'currencies', 'account_currency_code', 'currency', 'vendors', 'categories', 'payment_methods')); + } + + /** + * Update the specified resource in storage. + * + * @param Payment $payment + * @param Request $request + * + * @return Response + */ + public function update(Payment $payment, Request $request) + { + $payment->update($request->input()); + + // Upload attachment + if ($request->file('attachment')) { + $media = $this->getMedia($request->file('attachment'), 'payments'); + + $payment->attachMedia($media, 'attachment'); + } + + // Recurring + $payment->updateRecurring(); + + $message = trans('messages.success.updated', ['type' => trans_choice('general.payments', 1)]); + + flash($message)->success(); + + return redirect('expenses/payments'); + } + + /** + * Remove the specified resource from storage. + * + * @param Payment $payment + * + * @return Response + */ + public function destroy(Payment $payment) + { + // Can't delete transfer payment + if ($payment->category->id == Category::transfer()) { + return redirect('expenses/payments'); + } + + $payment->recurring()->delete(); + $payment->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.payments', 1)]); + + flash($message)->success(); + + return redirect('expenses/payments'); + } + + /** + * Export the specified resource. + * + * @return Response + */ + public function export() + { + \Excel::create('payments', function($excel) { + $excel->sheet('payments', function($sheet) { + $sheet->fromModel(Payment::filter(request()->input())->get()->makeHidden([ + 'id', 'company_id', 'parent_id', 'created_at', 'updated_at', 'deleted_at' + ])); + }); + })->download('xlsx'); + } +} diff --git a/app/Http/Controllers/Expenses/Vendors.php b/app/Http/Controllers/Expenses/Vendors.php new file mode 100755 index 0000000..d8506dc --- /dev/null +++ b/app/Http/Controllers/Expenses/Vendors.php @@ -0,0 +1,363 @@ + 0, + 'open' => 0, + 'overdue' => 0, + ]; + + $counts = [ + 'bills' => 0, + 'payments' => 0, + ]; + + // Handle bills + $bills = Bill::with(['status', 'payments'])->where('vendor_id', $vendor->id)->get(); + + $counts['bills'] = $bills->count(); + + $bill_payments = []; + + $today = Date::today()->toDateString(); + + foreach ($bills as $item) { + $payments = 0; + + foreach ($item->payments as $payment) { + $payment->category = $item->category; + + $bill_payments[] = $payment; + + $amount = $payment->getConvertedAmount(); + + $amounts['paid'] += $amount; + + $payments += $amount; + } + + if ($item->bill_status_code == 'paid') { + continue; + } + + // Check if it's open or overdue invoice + if ($item->due_at > $today) { + $amounts['open'] += $item->getConvertedAmount() - $payments; + } else { + $amounts['overdue'] += $item->getConvertedAmount() - $payments; + } + } + + // Handle payments + $payments = Payment::with(['account', 'category'])->where('vendor_id', $vendor->id)->get(); + + $counts['payments'] = $payments->count(); + + // Prepare data + $items = collect($payments)->each(function ($item) use (&$amounts) { + $amounts['paid'] += $item->getConvertedAmount(); + }); + + $limit = request('limit', setting('general.list_limit', '25')); + $transactions = $this->paginate($items->merge($bill_payments)->sortByDesc('paid_at'), $limit); + + return view('expenses.vendors.show', compact('vendor', 'counts', 'amounts', 'transactions')); + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create() + { + $currencies = Currency::enabled()->pluck('name', 'code'); + + return view('expenses.vendors.create', compact('currencies')); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + $vendor = Vendor::create($request->all()); + + // Upload logo + if ($request->file('logo')) { + $media = $this->getMedia($request->file('logo'), 'vendors'); + + $vendor->attachMedia($media, 'logo'); + } + + $message = trans('messages.success.added', ['type' => trans_choice('general.vendors', 1)]); + + flash($message)->success(); + + return redirect('expenses/vendors'); + } + + /** + * Duplicate the specified resource. + * + * @param Vendor $vendor + * + * @return Response + */ + public function duplicate(Vendor $vendor) + { + $clone = $vendor->duplicate(); + + $message = trans('messages.success.duplicated', ['type' => trans_choice('general.vendors', 1)]); + + flash($message)->success(); + + return redirect('expenses/vendors/' . $clone->id . '/edit'); + } + + /** + * Import the specified resource. + * + * @param ImportFile $import + * + * @return Response + */ + public function import(ImportFile $import) + { + if (!Import::createFromFile($import, 'Expense\Vendor')) { + return redirect('common/import/expenses/vendors'); + } + + $message = trans('messages.success.imported', ['type' => trans_choice('general.vendors', 2)]); + + flash($message)->success(); + + return redirect('expenses/vendors'); + } + + /** + * Show the form for editing the specified resource. + * + * @param Vendor $vendor + * + * @return Response + */ + public function edit(Vendor $vendor) + { + $currencies = Currency::enabled()->pluck('name', 'code'); + + return view('expenses.vendors.edit', compact('vendor', 'currencies')); + } + + /** + * Update the specified resource in storage. + * + * @param Vendor $vendor + * @param Request $request + * + * @return Response + */ + public function update(Vendor $vendor, Request $request) + { + $vendor->update($request->all()); + + // Upload logo + if ($request->file('logo')) { + $media = $this->getMedia($request->file('logo'), 'vendors'); + + $vendor->attachMedia($media, 'logo'); + } + + $message = trans('messages.success.updated', ['type' => trans_choice('general.vendors', 1)]); + + flash($message)->success(); + + return redirect('expenses/vendors'); + } + + /** + * Enable the specified resource. + * + * @param Vendor $vendor + * + * @return Response + */ + public function enable(Vendor $vendor) + { + $vendor->enabled = 1; + $vendor->save(); + + $message = trans('messages.success.enabled', ['type' => trans_choice('general.vendors', 1)]); + + flash($message)->success(); + + return redirect()->route('vendors.index'); + } + + /** + * Disable the specified resource. + * + * @param Vendor $vendor + * + * @return Response + */ + public function disable(Vendor $vendor) + { + $vendor->enabled = 0; + $vendor->save(); + + $message = trans('messages.success.disabled', ['type' => trans_choice('general.vendors', 1)]); + + flash($message)->success(); + + return redirect()->route('vendors.index'); + } + + /** + * Remove the specified resource from storage. + * + * @param Vendor $vendor + * + * @return Response + */ + public function destroy(Vendor $vendor) + { + $relationships = $this->countRelationships($vendor, [ + 'bills' => 'bills', + 'payments' => 'payments', + ]); + + if (empty($relationships)) { + $vendor->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.vendors', 1)]); + + flash($message)->success(); + } else { + $message = trans('messages.warning.deleted', ['name' => $vendor->name, 'text' => implode(', ', $relationships)]); + + flash($message)->warning(); + } + + return redirect('expenses/vendors'); + } + + /** + * Export the specified resource. + * + * @return Response + */ + public function export() + { + \Excel::create('vendors', function($excel) { + $excel->sheet('vendors', function($sheet) { + $sheet->fromModel(Vendor::filter(request()->input())->get()->makeHidden([ + 'id', 'company_id', 'created_at', 'updated_at', 'deleted_at' + ])); + }); + })->download('xlsx'); + } + + public function currency() + { + $vendor_id = (int) request('vendor_id'); + + if (empty($vendor_id)) { + return response()->json([]); + } + + $vendor = Vendor::find($vendor_id); + + if (empty($vendor)) { + return response()->json([]); + } + + $currency_code = setting('general.default_currency'); + + if (isset($vendor->currency_code)) { + $currencies = Currency::enabled()->pluck('name', 'code')->toArray(); + + if (array_key_exists($vendor->currency_code, $currencies)) { + $currency_code = $vendor->currency_code; + } + } + + // Get currency object + $currency = Currency::where('code', $currency_code)->first(); + + $vendor->currency_code = $currency_code; + $vendor->currency_rate = $currency->rate; + + return response()->json($vendor); + } + + public function vendor(Request $request) + { + $vendor = Vendor::create($request->all()); + + return response()->json($vendor); + } + + /** + * Generate a pagination collection. + * + * @param array|Collection $items + * @param int $perPage + * @param int $page + * @param array $options + * + * @return LengthAwarePaginator + */ + public function paginate($items, $perPage = 15, $page = null, $options = []) + { + $page = $page ?: (Paginator::resolveCurrentPage() ?: 1); + + $items = $items instanceof Collection ? $items : Collection::make($items); + + return new LengthAwarePaginator($items->forPage($page, $perPage), $items->count(), $perPage, $page, $options); + } +} diff --git a/app/Http/Controllers/Incomes/Customers.php b/app/Http/Controllers/Incomes/Customers.php new file mode 100755 index 0000000..8bb67dc --- /dev/null +++ b/app/Http/Controllers/Incomes/Customers.php @@ -0,0 +1,430 @@ + 0, + 'open' => 0, + 'overdue' => 0, + ]; + + $counts = [ + 'invoices' => 0, + 'revenues' => 0, + ]; + + // Handle invoices + $invoices = Invoice::with(['status', 'payments'])->where('customer_id', $customer->id)->get(); + + $counts['invoices'] = $invoices->count(); + + $invoice_payments = []; + + $today = Date::today()->toDateString(); + + foreach ($invoices as $item) { + $payments = 0; + + foreach ($item->payments as $payment) { + $payment->category = $item->category; + + $invoice_payments[] = $payment; + + $amount = $payment->getConvertedAmount(); + + $amounts['paid'] += $amount; + + $payments += $amount; + } + + if ($item->invoice_status_code == 'paid') { + continue; + } + + // Check if it's open or overdue invoice + if ($item->due_at > $today) { + $amounts['open'] += $item->getConvertedAmount() - $payments; + } else { + $amounts['overdue'] += $item->getConvertedAmount() - $payments; + } + } + + // Handle revenues + $revenues = Revenue::with(['account', 'category'])->where('customer_id', $customer->id)->get(); + + $counts['revenues'] = $revenues->count(); + + // Prepare data + $items = collect($revenues)->each(function ($item) use (&$amounts) { + $amounts['paid'] += $item->getConvertedAmount(); + }); + + $limit = request('limit', setting('general.list_limit', '25')); + $transactions = $this->paginate($items->merge($invoice_payments)->sortByDesc('paid_at'), $limit); + + return view('incomes.customers.show', compact('customer', 'counts', 'amounts', 'transactions')); + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create() + { + $currencies = Currency::enabled()->pluck('name', 'code'); + + return view('incomes.customers.create', compact('currencies')); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + if (empty($request->input('create_user'))) { + Customer::create($request->all()); + } else { + // Check if user exist + $user = User::where('email', $request['email'])->first(); + if (!empty($user)) { + $message = trans('messages.error.customer', ['name' => $user->name]); + + flash($message)->error(); + + return redirect()->back()->withInput($request->except('create_user'))->withErrors( + ['email' => trans('customers.error.email')] + ); + } + + // Create user first + $data = $request->all(); + $data['locale'] = setting('general.default_locale', 'en-GB'); + + $user = User::create($data); + $user->roles()->attach(['3']); + $user->companies()->attach([session('company_id')]); + + // Finally create customer + $request['user_id'] = $user->id; + + Customer::create($request->all()); + } + + $message = trans('messages.success.added', ['type' => trans_choice('general.customers', 1)]); + + flash($message)->success(); + + return redirect('incomes/customers'); + } + + /** + * Duplicate the specified resource. + * + * @param Customer $customer + * + * @return Response + */ + public function duplicate(Customer $customer) + { + $clone = $customer->duplicate(); + + $message = trans('messages.success.duplicated', ['type' => trans_choice('general.customers', 1)]); + + flash($message)->success(); + + return redirect('incomes/customers/' . $clone->id . '/edit'); + } + + /** + * Import the specified resource. + * + * @param ImportFile $import + * + * @return Response + */ + public function import(ImportFile $import) + { + if (!Import::createFromFile($import, 'Income\Customer')) { + return redirect('common/import/incomes/customers'); + } + + $message = trans('messages.success.imported', ['type' => trans_choice('general.customers', 2)]); + + flash($message)->success(); + + return redirect('incomes/customers'); + } + + /** + * Show the form for editing the specified resource. + * + * @param Customer $customer + * + * @return Response + */ + public function edit(Customer $customer) + { + $currencies = Currency::enabled()->pluck('name', 'code'); + + return view('incomes.customers.edit', compact('customer', 'currencies')); + } + + /** + * Update the specified resource in storage. + * + * @param Customer $customer + * @param Request $request + * + * @return Response + */ + public function update(Customer $customer, Request $request) + { + if (empty($request->input('create_user'))) { + $customer->update($request->all()); + } else { + // Check if user exist + $user = User::where('email', $request['email'])->first(); + if (!empty($user)) { + $message = trans('messages.error.customer', ['name' => $user->name]); + + flash($message)->error(); + + return redirect()->back()->withInput($request->except('create_user'))->withErrors( + ['email' => trans('customers.error.email')] + ); + } + + // Create user first + $user = User::create($request->all()); + $user->roles()->attach(['3']); + $user->companies()->attach([session('company_id')]); + + $request['user_id'] = $user->id; + + $customer->update($request->all()); + } + + $message = trans('messages.success.updated', ['type' => trans_choice('general.customers', 1)]); + + flash($message)->success(); + + return redirect('incomes/customers'); + } + + /** + * Enable the specified resource. + * + * @param Customer $customer + * + * @return Response + */ + public function enable(Customer $customer) + { + $customer->enabled = 1; + $customer->save(); + + $message = trans('messages.success.enabled', ['type' => trans_choice('general.customers', 1)]); + + flash($message)->success(); + + return redirect()->route('customers.index'); + } + + /** + * Disable the specified resource. + * + * @param Customer $customer + * + * @return Response + */ + public function disable(Customer $customer) + { + $customer->enabled = 0; + $customer->save(); + + $message = trans('messages.success.disabled', ['type' => trans_choice('general.customers', 1)]); + + flash($message)->success(); + + return redirect()->route('customers.index'); + } + + /** + * Remove the specified resource from storage. + * + * @param Customer $customer + * + * @return Response + */ + public function destroy(Customer $customer) + { + $relationships = $this->countRelationships($customer, [ + 'invoices' => 'invoices', + 'revenues' => 'revenues', + ]); + + if (empty($relationships)) { + $customer->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.customers', 1)]); + + flash($message)->success(); + } else { + $message = trans('messages.warning.deleted', ['name' => $customer->name, 'text' => implode(', ', $relationships)]); + + flash($message)->warning(); + } + + return redirect('incomes/customers'); + } + + /** + * Export the specified resource. + * + * @return Response + */ + public function export() + { + \Excel::create('customers', function($excel) { + $excel->sheet('customers', function($sheet) { + $sheet->fromModel(Customer::filter(request()->input())->get()->makeHidden([ + 'id', 'company_id', 'created_at', 'updated_at', 'deleted_at' + ])); + }); + })->download('xlsx'); + } + + public function currency() + { + $customer_id = (int) request('customer_id'); + + if (empty($customer_id)) { + return response()->json([]); + } + + $customer = Customer::find($customer_id); + + if (empty($customer)) { + return response()->json([]); + } + + $currency_code = setting('general.default_currency'); + + if (isset($customer->currency_code)) { + $currencies = Currency::enabled()->pluck('name', 'code')->toArray(); + + if (array_key_exists($customer->currency_code, $currencies)) { + $currency_code = $customer->currency_code; + } + } + + // Get currency object + $currency = Currency::where('code', $currency_code)->first(); + + $customer->currency_name = $currency->name; + $customer->currency_code = $currency_code; + $customer->currency_rate = $currency->rate; + + $customer->thousands_separator = $currency->thousands_separator; + $customer->decimal_mark = $currency->decimal_mark; + $customer->precision = (int) $currency->precision; + $customer->symbol_first = $currency->symbol_first; + $customer->symbol = $currency->symbol; + + return response()->json($customer); + } + + public function customer(Request $request) + { + $customer = Customer::create($request->all()); + + return response()->json($customer); + } + + public function field(FRequest $request) + { + $html = ''; + + if ($request['fields']) { + foreach ($request['fields'] as $field) { + switch ($field) { + case 'password': + $html .= \Form::passwordGroup('password', trans('auth.password.current'), 'key', [], null, 'col-md-6 password'); + break; + case 'password_confirmation': + $html .= \Form::passwordGroup('password_confirmation', trans('auth.password.current_confirm'), 'key', [], null, 'col-md-6 password'); + break; + } + } + } + + $json = [ + 'html' => $html + ]; + + return response()->json($json); + } + + /** + * Generate a pagination collection. + * + * @param array|Collection $items + * @param int $perPage + * @param int $page + * @param array $options + * + * @return LengthAwarePaginator + */ + public function paginate($items, $perPage = 15, $page = null, $options = []) + { + $page = $page ?: (Paginator::resolveCurrentPage() ?: 1); + + $items = $items instanceof Collection ? $items : Collection::make($items); + + return new LengthAwarePaginator($items->forPage($page, $perPage), $items->count(), $perPage, $page, $options); + } +} diff --git a/app/Http/Controllers/Incomes/Invoices.php b/app/Http/Controllers/Incomes/Invoices.php new file mode 100755 index 0000000..4fb9089 --- /dev/null +++ b/app/Http/Controllers/Incomes/Invoices.php @@ -0,0 +1,991 @@ +collect(['invoice_number'=> 'desc']); + + $customers = collect(Customer::enabled()->orderBy('name')->pluck('name', 'id')) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.customers', 2)]), ''); + + $status = collect(InvoiceStatus::all()->pluck('name', 'code')) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.statuses', 2)]), ''); + + return view('incomes.invoices.index', compact('invoices', 'customers', 'status')); + } + + /** + * Show the form for viewing the specified resource. + * + * @param Invoice $invoice + * + * @return Response + */ + public function show(Invoice $invoice) + { + $paid = 0; + + // Get Invoice Payments + if ($invoice->payments->count()) { + $_currencies = Currency::enabled()->pluck('rate', 'code')->toArray(); + + foreach ($invoice->payments as $item) { + $default_amount = $item->amount; + + if ($invoice->currency_code == $item->currency_code) { + $amount = (double)$default_amount; + } else { + $default_amount_model = new InvoicePayment(); + + $default_amount_model->default_currency_code = $invoice->currency_code; + $default_amount_model->amount = $default_amount; + $default_amount_model->currency_code = $item->currency_code; + $default_amount_model->currency_rate = $_currencies[$item->currency_code]; + + $default_amount = (double) $default_amount_model->getDivideConvertedAmount(); + + $convert_amount = new InvoicePayment(); + + $convert_amount->default_currency_code = $item->currency_code; + $convert_amount->amount = $default_amount; + $convert_amount->currency_code = $invoice->currency_code; + $convert_amount->currency_rate = $_currencies[$invoice->currency_code]; + + $amount = (double) $convert_amount->getDynamicConvertedAmount(); + } + + $paid += $amount; + } + } + + $invoice->paid = $paid; + + $accounts = Account::enabled()->orderBy('name')->pluck('name', 'id'); + + $currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code')->toArray(); + + $account_currency_code = Account::where('id', setting('general.default_account'))->pluck('currency_code')->first(); + + $customers = Customer::enabled()->orderBy('name')->pluck('name', 'id'); + + $categories = Category::enabled()->type('income')->orderBy('name')->pluck('name', 'id'); + + $payment_methods = Modules::getPaymentMethods(); + + return view('incomes.invoices.show', compact('invoice', 'accounts', 'currencies', 'account_currency_code', 'customers', 'categories', 'payment_methods')); + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create() + { + $customers = Customer::enabled()->orderBy('name')->pluck('name', 'id'); + + $currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code'); + + $currency = Currency::where('code', '=', setting('general.default_currency'))->first(); + + $items = Item::enabled()->orderBy('name')->pluck('name', 'id'); + + $taxes = Tax::enabled()->orderBy('rate')->get()->pluck('title', 'id'); + + $categories = Category::enabled()->type('income')->orderBy('name')->pluck('name', 'id'); + + $number = $this->getNextInvoiceNumber(); + + return view('incomes.invoices.create', compact('customers', 'currencies', 'currency', 'items', 'taxes', 'categories', 'number')); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + $invoice = Invoice::create($request->input()); + + // Upload attachment + if ($request->file('attachment')) { + $media = $this->getMedia($request->file('attachment'), 'invoices'); + + $invoice->attachMedia($media, 'attachment'); + } + + $taxes = []; + + $tax_total = 0; + $sub_total = 0; + $discount_total = 0; + $discount = $request['discount']; + + $invoice_item = []; + $invoice_item['company_id'] = $request['company_id']; + $invoice_item['invoice_id'] = $invoice->id; + + if ($request['item']) { + foreach ($request['item'] as $item) { + $item_sku = ''; + + if (!empty($item['item_id'])) { + $item_object = Item::find($item['item_id']); + + $item['name'] = $item_object->name; + $item_sku = $item_object->sku; + + // Decrease stock (item sold) + $item_object->quantity -= $item['quantity']; + $item_object->save(); + + // Notify users if out of stock + if ($item_object->quantity == 0) { + foreach ($item_object->company->users as $user) { + if (!$user->can('read-notifications')) { + continue; + } + + $user->notify(new ItemNotification($item_object)); + } + } + } + + $tax = $tax_id = 0; + + if (!empty($item['tax_id'])) { + $tax_object = Tax::find($item['tax_id']); + + $tax_id = $item['tax_id']; + + $tax = (((double) $item['price'] * (double) $item['quantity']) / 100) * $tax_object->rate; + + // Apply discount to tax + if ($discount) { + $tax = $tax - ($tax * ($discount / 100)); + } + } + + $invoice_item['item_id'] = $item['item_id']; + $invoice_item['name'] = str_limit($item['name'], 180, ''); + $invoice_item['sku'] = $item_sku; + $invoice_item['quantity'] = (double) $item['quantity']; + $invoice_item['price'] = (double) $item['price']; + $invoice_item['tax'] = $tax; + $invoice_item['tax_id'] = $tax_id; + $invoice_item['total'] = (double) $item['price'] * (double) $item['quantity']; + + InvoiceItem::create($invoice_item); + + // Set taxes + if (isset($tax_object)) { + if (array_key_exists($tax_object->id, $taxes)) { + $taxes[$tax_object->id]['amount'] += $tax; + } else { + $taxes[$tax_object->id] = [ + 'name' => $tax_object->name, + 'amount' => $tax + ]; + } + } + + // Calculate totals + $tax_total += $tax; + $sub_total += $invoice_item['total']; + + unset($tax_object); + } + } + + $s_total = $sub_total; + + // Apply discount to total + if ($discount) { + $s_discount = $s_total * ($discount / 100); + $discount_total += $s_discount; + $s_total = $s_total - $s_discount; + } + + $amount = $s_total + $tax_total; + + $request['amount'] = money($amount, $request['currency_code'])->getAmount(); + + $invoice->update($request->input()); + + // Add invoice totals + $this->addTotals($invoice, $request, $taxes, $sub_total, $discount_total, $tax_total); + + // Add invoice history + InvoiceHistory::create([ + 'company_id' => session('company_id'), + 'invoice_id' => $invoice->id, + 'status_code' => 'draft', + 'notify' => 0, + 'description' => trans('messages.success.added', ['type' => $invoice->invoice_number]), + ]); + + // Update next invoice number + $this->increaseNextInvoiceNumber(); + + // Recurring + $invoice->createRecurring(); + + // Fire the event to make it extendible + event(new InvoiceCreated($invoice)); + + $message = trans('messages.success.added', ['type' => trans_choice('general.invoices', 1)]); + + flash($message)->success(); + + return redirect('incomes/invoices/' . $invoice->id); + } + + /** + * Duplicate the specified resource. + * + * @param Invoice $invoice + * + * @return Response + */ + public function duplicate(Invoice $invoice) + { + $clone = $invoice->duplicate(); + + // Add invoice history + InvoiceHistory::create([ + 'company_id' => session('company_id'), + 'invoice_id' => $clone->id, + 'status_code' => 'draft', + 'notify' => 0, + 'description' => trans('messages.success.added', ['type' => $clone->invoice_number]), + ]); + + // Update next invoice number + $this->increaseNextInvoiceNumber(); + + $message = trans('messages.success.duplicated', ['type' => trans_choice('general.invoices', 1)]); + + flash($message)->success(); + + return redirect('incomes/invoices/' . $clone->id . '/edit'); + } + + /** + * Import the specified resource. + * + * @param ImportFile $import + * + * @return Response + */ + public function import(ImportFile $import) + { + $success = true; + + $allowed_sheets = ['invoices', 'invoice_items', 'invoice_histories', 'invoice_payments', 'invoice_totals']; + + // Loop through all sheets + $import->each(function ($sheet) use (&$success, $allowed_sheets) { + $sheet_title = $sheet->getTitle(); + + if (!in_array($sheet_title, $allowed_sheets)) { + $message = trans('messages.error.import_sheet'); + + flash($message)->error()->important(); + + return false; + } + + $slug = 'Income\\' . str_singular(studly_case($sheet_title)); + + if (!$success = Import::createFromSheet($sheet, $slug)) { + return false; + } + }); + + if (!$success) { + return redirect('common/import/incomes/invoices'); + } + + $message = trans('messages.success.imported', ['type' => trans_choice('general.invoices', 2)]); + + flash($message)->success(); + + return redirect('incomes/invoices'); + } + + /** + * Show the form for editing the specified resource. + * + * @param Invoice $invoice + * + * @return Response + */ + public function edit(Invoice $invoice) + { + $customers = Customer::enabled()->orderBy('name')->pluck('name', 'id'); + + $currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code'); + + $currency = Currency::where('code', '=', $invoice->currency_code)->first(); + + $items = Item::enabled()->orderBy('name')->pluck('name', 'id'); + + $taxes = Tax::enabled()->orderBy('rate')->get()->pluck('title', 'id'); + + $categories = Category::enabled()->type('income')->orderBy('name')->pluck('name', 'id'); + + return view('incomes.invoices.edit', compact('invoice', 'customers', 'currencies', 'currency', 'items', 'taxes', 'categories')); + } + + /** + * Update the specified resource in storage. + * + * @param Invoice $invoice + * @param Request $request + * + * @return Response + */ + public function update(Invoice $invoice, Request $request) + { + $taxes = []; + $tax_total = 0; + $sub_total = 0; + $discount_total = 0; + $discount = $request['discount']; + + $invoice_item = []; + $invoice_item['company_id'] = $request['company_id']; + $invoice_item['invoice_id'] = $invoice->id; + + if ($request['item']) { + $this->deleteRelationships($invoice, 'items'); + + foreach ($request['item'] as $item) { + unset($tax_object); + $item_sku = ''; + + if (!empty($item['item_id'])) { + $item_object = Item::find($item['item_id']); + + $item['name'] = $item_object->name; + $item_sku = $item_object->sku; + } + + $tax = $tax_id = 0; + + if (!empty($item['tax_id'])) { + $tax_object = Tax::find($item['tax_id']); + + $tax_id = $item['tax_id']; + + $tax = (((double) $item['price'] * (double) $item['quantity']) / 100) * $tax_object->rate; + + // Apply discount to tax + if ($discount) { + $tax = $tax - ($tax * ($discount / 100)); + } + } + + $invoice_item['item_id'] = $item['item_id']; + $invoice_item['name'] = str_limit($item['name'], 180, ''); + $invoice_item['sku'] = $item_sku; + $invoice_item['quantity'] = (double) $item['quantity']; + $invoice_item['price'] = (double) $item['price']; + $invoice_item['tax'] = $tax; + $invoice_item['tax_id'] = $tax_id; + $invoice_item['total'] = (double) $item['price'] * (double) $item['quantity']; + + if (isset($tax_object)) { + if (array_key_exists($tax_object->id, $taxes)) { + $taxes[$tax_object->id]['amount'] += $tax; + } else { + $taxes[$tax_object->id] = [ + 'name' => $tax_object->name, + 'amount' => $tax + ]; + } + } + + $tax_total += $tax; + $sub_total += $invoice_item['total']; + + InvoiceItem::create($invoice_item); + } + } + + $s_total = $sub_total; + + // Apply discount to total + if ($discount) { + $s_discount = $s_total * ($discount / 100); + $discount_total += $s_discount; + $s_total = $s_total - $s_discount; + } + + $amount = $s_total + $tax_total; + + $request['amount'] = money($amount, $request['currency_code'])->getAmount(); + + $invoice->update($request->input()); + + // Upload attachment + if ($request->file('attachment')) { + $media = $this->getMedia($request->file('attachment'), 'invoices'); + + $invoice->attachMedia($media, 'attachment'); + } + + // Delete previous invoice totals + $this->deleteRelationships($invoice, 'totals'); + + // Add invoice totals + $this->addTotals($invoice, $request, $taxes, $sub_total, $discount_total, $tax_total); + + // Recurring + $invoice->updateRecurring(); + + // Fire the event to make it extendible + event(new InvoiceUpdated($invoice)); + + $message = trans('messages.success.updated', ['type' => trans_choice('general.invoices', 1)]); + + flash($message)->success(); + + return redirect('incomes/invoices/' . $invoice->id); + } + + /** + * Remove the specified resource from storage. + * + * @param Invoice $invoice + * + * @return Response + */ + public function destroy(Invoice $invoice) + { + $this->deleteRelationships($invoice, ['items', 'histories', 'payments', 'recurring', 'totals']); + $invoice->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.invoices', 1)]); + + flash($message)->success(); + + return redirect('incomes/invoices'); + } + + /** + * Export the specified resource. + * + * @return Response + */ + public function export() + { + \Excel::create('invoices', function ($excel) { + $invoices = Invoice::with(['items', 'histories', 'payments', 'totals'])->filter(request()->input())->get(); + + $excel->sheet('invoices', function ($sheet) use ($invoices) { + $sheet->fromModel($invoices->makeHidden([ + 'company_id', 'parent_id', 'created_at', 'updated_at', 'deleted_at', 'attachment', 'discount', 'items', 'histories', 'payments', 'totals', 'media' + ])); + }); + + $tables = ['items', 'histories', 'payments', 'totals']; + foreach ($tables as $table) { + $excel->sheet('invoice_' . $table, function ($sheet) use ($invoices, $table) { + $hidden_fields = ['id', 'company_id', 'created_at', 'updated_at', 'deleted_at', 'title']; + + $i = 1; + + foreach ($invoices as $invoice) { + $model = $invoice->$table->makeHidden($hidden_fields); + + if ($i == 1) { + $sheet->fromModel($model, null, 'A1', false); + } else { + // Don't put multiple heading columns + $sheet->fromModel($model, null, 'A1', false, false); + } + + $i++; + } + }); + } + })->download('xlsx'); + } + + /** + * Mark the invoice as sent. + * + * @param Invoice $invoice + * + * @return Response + */ + public function markSent(Invoice $invoice) + { + $invoice->invoice_status_code = 'sent'; + + $invoice->save(); + + // Add invoice history + InvoiceHistory::create([ + 'company_id' => $invoice->company_id, + 'invoice_id' => $invoice->id, + 'status_code' => 'sent', + 'notify' => 0, + 'description' => trans('invoices.mark_sent'), + ]); + + flash(trans('invoices.messages.marked_sent'))->success(); + + return redirect()->back(); + } + + /** + * Download the PDF file of invoice. + * + * @param Invoice $invoice + * + * @return Response + */ + public function emailInvoice(Invoice $invoice) + { + if (empty($invoice->customer_email)) { + return redirect()->back(); + } + + $invoice = $this->prepareInvoice($invoice); + + $html = view($invoice->template_path, compact('invoice'))->render(); + + $pdf = \App::make('dompdf.wrapper'); + $pdf->loadHTML($html); + + $file = storage_path('app/temp/invoice_'.time().'.pdf'); + + $invoice->pdf_path = $file; + + // Save the PDF file into temp folder + $pdf->save($file); + + // Notify the customer + $invoice->customer->notify(new Notification($invoice)); + + // Delete temp file + File::delete($file); + + unset($invoice->paid); + unset($invoice->template_path); + unset($invoice->pdf_path); + + // Mark invoice as sent + if ($invoice->invoice_status_code != 'partial') { + $invoice->invoice_status_code = 'sent'; + + $invoice->save(); + } + + // Add invoice history + InvoiceHistory::create([ + 'company_id' => $invoice->company_id, + 'invoice_id' => $invoice->id, + 'status_code' => 'sent', + 'notify' => 1, + 'description' => trans('invoices.send_mail'), + ]); + + flash(trans('invoices.messages.email_sent'))->success(); + + return redirect()->back(); + } + + /** + * Print the invoice. + * + * @param Invoice $invoice + * + * @return Response + */ + public function printInvoice(Invoice $invoice) + { + $invoice = $this->prepareInvoice($invoice); + + return view($invoice->template_path, compact('invoice')); + } + + /** + * Download the PDF file of invoice. + * + * @param Invoice $invoice + * + * @return Response + */ + public function pdfInvoice(Invoice $invoice) + { + $invoice = $this->prepareInvoice($invoice); + + $html = view($invoice->template_path, compact('invoice'))->render(); + + $pdf = app('dompdf.wrapper'); + $pdf->loadHTML($html); + + //$pdf->setPaper('A4', 'portrait'); + + $file_name = 'invoice_'.time().'.pdf'; + + return $pdf->download($file_name); + } + + /** + * Mark the invoice as paid. + * + * @param Invoice $invoice + * + * @return Response + */ + public function markPaid(Invoice $invoice) + { + $paid = 0; + + foreach ($invoice->payments as $item) { + $amount = $item->amount; + + if ($invoice->currency_code != $item->currency_code) { + $item->default_currency_code = $invoice->currency_code; + + $amount = $item->getDynamicConvertedAmount(); + } + + $paid += $amount; + } + + $amount = $invoice->amount - $paid; + + if (!empty($amount)) { + $request = new PaymentRequest(); + + $request['company_id'] = $invoice->company_id; + $request['invoice_id'] = $invoice->id; + $request['account_id'] = setting('general.default_account'); + $request['payment_method'] = setting('general.default_payment_method', 'offlinepayment.cash.1'); + $request['currency_code'] = $invoice->currency_code; + $request['amount'] = $amount; + $request['paid_at'] = Date::now()->format('Y-m-d'); + $request['_token'] = csrf_token(); + + $this->payment($request); + } else { + $invoice->invoice_status_code = 'paid'; + $invoice->save(); + } + + return redirect()->back(); + } + + /** + * Add payment to the invoice. + * + * @param PaymentRequest $request + * + * @return Response + */ + public function payment(PaymentRequest $request) + { + // Get currency object + $currency = Currency::where('code', $request['currency_code'])->first(); + + $request['currency_code'] = $currency->code; + $request['currency_rate'] = $currency->rate; + + $invoice = Invoice::find($request['invoice_id']); + + $total_amount = $invoice->amount; + + $amount = (double) $request['amount']; + + if ($request['currency_code'] != $invoice->currency_code) { + $request_invoice = new Invoice(); + + $request_invoice->amount = (float) $request['amount']; + $request_invoice->currency_code = $currency->code; + $request_invoice->currency_rate = $currency->rate; + + $amount = $request_invoice->getConvertedAmount(); + } + + if ($invoice->payments()->count()) { + $total_amount -= $invoice->payments()->paid(); + } + + // For amount cover integer + $multiplier = 1; + + for ($i = 0; $i < $currency->precision; $i++) { + $multiplier *= 10; + } + + $amount *= $multiplier; + $total_amount *= $multiplier; + + if ($amount > $total_amount) { + $message = trans('messages.error.over_payment'); + + return response()->json([ + 'success' => false, + 'error' => true, + 'message' => $message, + ]); + } elseif ($amount == $total_amount) { + $invoice->invoice_status_code = 'paid'; + } else { + $invoice->invoice_status_code = 'partial'; + } + + $invoice->save(); + + $invoice_payment_request = [ + 'company_id' => $request['company_id'], + 'invoice_id' => $request['invoice_id'], + 'account_id' => $request['account_id'], + 'paid_at' => $request['paid_at'], + 'amount' => $request['amount'], + 'currency_code' => $request['currency_code'], + 'currency_rate' => $request['currency_rate'], + 'description' => $request['description'], + 'payment_method' => $request['payment_method'], + 'reference' => $request['reference'] + ]; + + $invoice_payment = InvoicePayment::create($invoice_payment_request); + + // Upload attachment + if ($request->file('attachment')) { + $media = $this->getMedia($request->file('attachment'), 'invoices'); + + $invoice_payment->attachMedia($media, 'attachment'); + } + + $request['status_code'] = $invoice->invoice_status_code; + $request['notify'] = 0; + + $desc_amount = money((float) $request['amount'], (string) $request['currency_code'], true)->format(); + + $request['description'] = $desc_amount . ' ' . trans_choice('general.payments', 1); + + InvoiceHistory::create($request->input()); + + $message = trans('messages.success.added', ['type' => trans_choice('general.payments', 1)]); + + return response()->json([ + 'success' => true, + 'error' => false, + 'message' => $message, + ]); + } + + /** + * Remove the specified resource from storage. + * + * @param InvoicePayment $payment + * + * @return Response + */ + public function paymentDestroy(InvoicePayment $payment) + { + $invoice = Invoice::find($payment->invoice_id); + + if ($invoice->payments()->count() > 1) { + $invoice->invoice_status_code = 'partial'; + } else { + $invoice->invoice_status_code = 'sent'; + } + + $invoice->save(); + + $desc_amount = money((float) $payment->amount, (string) $payment->currency_code, true)->format(); + + $description = $desc_amount . ' ' . trans_choice('general.payments', 1); + + // Add invoice history + InvoiceHistory::create([ + 'company_id' => $invoice->company_id, + 'invoice_id' => $invoice->id, + 'status_code' => $invoice->invoice_status_code, + 'notify' => 0, + 'description' => trans('messages.success.deleted', ['type' => $description]), + ]); + + $payment->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.invoices', 1)]); + + flash($message)->success(); + + return redirect()->back(); + } + + public function addItem(ItemRequest $request) + { + if ($request['item_row']) { + $item_row = $request['item_row']; + + $taxes = Tax::enabled()->orderBy('rate')->get()->pluck('title', 'id'); + + $currency = Currency::where('code', '=', $request['currency_code'])->first(); + + // it should be integer for amount mask + $currency->precision = (int) $currency->precision; + + $html = view('incomes.invoices.item', compact('item_row', 'taxes', 'currency'))->render(); + + return response()->json([ + 'success' => true, + 'error' => false, + 'data' => [ + 'currency' => $currency + ], + 'message' => 'null', + 'html' => $html, + ]); + } + + return response()->json([ + 'success' => false, + 'error' => true, + 'data' => 'null', + 'message' => trans('issue'), + 'html' => 'null', + ]); + } + + protected function prepareInvoice(Invoice $invoice) + { + $paid = 0; + + foreach ($invoice->payments as $item) { + $amount = $item->amount; + + if ($invoice->currency_code != $item->currency_code) { + $item->default_currency_code = $invoice->currency_code; + + $amount = $item->getDynamicConvertedAmount(); + } + + $paid += $amount; + } + + $invoice->paid = $paid; + + $invoice->template_path = 'incomes.invoices.invoice'; + + event(new InvoicePrinting($invoice)); + + return $invoice; + } + + protected function addTotals($invoice, $request, $taxes, $sub_total, $discount_total, $tax_total) + { + $sort_order = 1; + + // Added invoice sub total + InvoiceTotal::create([ + 'company_id' => $request['company_id'], + 'invoice_id' => $invoice->id, + 'code' => 'sub_total', + 'name' => 'invoices.sub_total', + 'amount' => $sub_total, + 'sort_order' => $sort_order, + ]); + + $sort_order++; + + // Added invoice discount + if ($discount_total) { + InvoiceTotal::create([ + 'company_id' => $request['company_id'], + 'invoice_id' => $invoice->id, + 'code' => 'discount', + 'name' => 'invoices.discount', + 'amount' => $discount_total, + 'sort_order' => $sort_order, + ]); + + // This is for total + $sub_total = $sub_total - $discount_total; + } + + $sort_order++; + + // Added invoice taxes + if ($taxes) { + foreach ($taxes as $tax) { + InvoiceTotal::create([ + 'company_id' => $request['company_id'], + 'invoice_id' => $invoice->id, + 'code' => 'tax', + 'name' => $tax['name'], + 'amount' => $tax['amount'], + 'sort_order' => $sort_order, + ]); + + $sort_order++; + } + } + + // Added invoice total + InvoiceTotal::create([ + 'company_id' => $request['company_id'], + 'invoice_id' => $invoice->id, + 'code' => 'total', + 'name' => 'invoices.total', + 'amount' => $sub_total + $tax_total, + 'sort_order' => $sort_order, + ]); + } +} diff --git a/app/Http/Controllers/Incomes/Revenues.php b/app/Http/Controllers/Incomes/Revenues.php new file mode 100755 index 0000000..a8a87d5 --- /dev/null +++ b/app/Http/Controllers/Incomes/Revenues.php @@ -0,0 +1,240 @@ +isNotTransfer()->collect(['paid_at'=> 'desc']); + + $customers = collect(Customer::enabled()->orderBy('name')->pluck('name', 'id')) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.customers', 2)]), ''); + + $categories = collect(Category::enabled()->type('income')->orderBy('name')->pluck('name', 'id')) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.categories', 2)]), ''); + + $accounts = collect(Account::enabled()->orderBy('name')->pluck('name', 'id')) + ->prepend(trans('general.all_type', ['type' => trans_choice('general.accounts', 2)]), ''); + + $transfer_cat_id = Category::transfer(); + + return view('incomes.revenues.index', compact('revenues', 'customers', 'categories', 'accounts', 'transfer_cat_id')); + } + + /** + * Show the form for viewing the specified resource. + * + * @return Response + */ + public function show() + { + return redirect('incomes/revenues'); + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create() + { + $accounts = Account::enabled()->orderBy('name')->pluck('name', 'id'); + + $currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code')->toArray(); + + $account_currency_code = Account::where('id', setting('general.default_account'))->pluck('currency_code')->first(); + + $currency = Currency::where('code', '=', $account_currency_code)->first(); + + $customers = Customer::enabled()->orderBy('name')->pluck('name', 'id'); + + $categories = Category::enabled()->type('income')->orderBy('name')->pluck('name', 'id'); + + $payment_methods = Modules::getPaymentMethods(); + + return view('incomes.revenues.create', compact('accounts', 'currencies', 'account_currency_code', 'currency', 'customers', 'categories', 'payment_methods')); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + $revenue = Revenue::create($request->input()); + + // Upload attachment + if ($request->file('attachment')) { + $media = $this->getMedia($request->file('attachment'), 'revenues'); + + $revenue->attachMedia($media, 'attachment'); + } + + // Recurring + $revenue->createRecurring(); + + $message = trans('messages.success.added', ['type' => trans_choice('general.revenues', 1)]); + + flash($message)->success(); + + return redirect('incomes/revenues'); + } + + /** + * Duplicate the specified resource. + * + * @param Revenue $revenue + * + * @return Response + */ + public function duplicate(Revenue $revenue) + { + $clone = $revenue->duplicate(); + + $message = trans('messages.success.duplicated', ['type' => trans_choice('general.revenues', 1)]); + + flash($message)->success(); + + return redirect('incomes/revenues/' . $clone->id . '/edit'); + } + + /** + * Import the specified resource. + * + * @param ImportFile $import + * + * @return Response + */ + public function import(ImportFile $import) + { + if (!Import::createFromFile($import, 'Income\Revenue')) { + return redirect('common/import/incomes/revenues'); + } + + $message = trans('messages.success.imported', ['type' => trans_choice('general.revenues', 2)]); + + flash($message)->success(); + + return redirect('incomes/revenues'); + } + + /** + * Show the form for editing the specified resource. + * + * @param Revenue $revenue + * + * @return Response + */ + public function edit(Revenue $revenue) + { + $accounts = Account::enabled()->orderBy('name')->pluck('name', 'id'); + + $currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code')->toArray(); + + $account_currency_code = Account::where('id', $revenue->account_id)->pluck('currency_code')->first(); + + $currency = Currency::where('code', '=', $account_currency_code)->first(); + + $customers = Customer::enabled()->orderBy('name')->pluck('name', 'id'); + + $categories = Category::enabled()->type('income')->orderBy('name')->pluck('name', 'id'); + + $payment_methods = Modules::getPaymentMethods(); + + return view('incomes.revenues.edit', compact('revenue', 'accounts', 'currencies', 'account_currency_code', 'currency', 'customers', 'categories', 'payment_methods')); + } + + /** + * Update the specified resource in storage. + * + * @param Revenue $revenue + * @param Request $request + * + * @return Response + */ + public function update(Revenue $revenue, Request $request) + { + $revenue->update($request->input()); + + // Upload attachment + if ($request->file('attachment')) { + $media = $this->getMedia($request->file('attachment'), 'revenues'); + + $revenue->attachMedia($media, 'attachment'); + } + + // Recurring + $revenue->updateRecurring(); + + $message = trans('messages.success.updated', ['type' => trans_choice('general.revenues', 1)]); + + flash($message)->success(); + + return redirect('incomes/revenues'); + } + + /** + * Remove the specified resource from storage. + * + * @param Revenue $revenue + * + * @return Response + */ + public function destroy(Revenue $revenue) + { + // Can't delete transfer revenue + if ($revenue->category->id == Category::transfer()) { + return redirect('incomes/revenues'); + } + + $revenue->recurring()->delete(); + $revenue->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.revenues', 1)]); + + flash($message)->success(); + + return redirect('incomes/revenues'); + } + + /** + * Export the specified resource. + * + * @return Response + */ + public function export() + { + \Excel::create('revenues', function($excel) { + $excel->sheet('revenues', function($sheet) { + $sheet->fromModel(Revenue::filter(request()->input())->get()->makeHidden([ + 'id', 'company_id', 'parent_id', 'created_at', 'updated_at', 'deleted_at' + ])); + }); + })->download('xlsx'); + } +} diff --git a/app/Http/Controllers/Install/Database.php b/app/Http/Controllers/Install/Database.php new file mode 100755 index 0000000..ef8bb43 --- /dev/null +++ b/app/Http/Controllers/Install/Database.php @@ -0,0 +1,48 @@ +error()->important(); + + return redirect('install/database')->withInput(); + } + + return redirect('install/settings'); + } +} diff --git a/app/Http/Controllers/Install/Language.php b/app/Http/Controllers/Install/Language.php new file mode 100755 index 0000000..dc21d2c --- /dev/null +++ b/app/Http/Controllers/Install/Language.php @@ -0,0 +1,35 @@ +send(); + } else { + foreach ($requirements as $requirement) { + flash($requirement)->error()->important(); + } + + return view('install.requirements.show'); + } + } +} diff --git a/app/Http/Controllers/Install/Settings.php b/app/Http/Controllers/Install/Settings.php new file mode 100755 index 0000000..4162562 --- /dev/null +++ b/app/Http/Controllers/Install/Settings.php @@ -0,0 +1,42 @@ +get('company_name'), $request->get('company_email'), session('locale')); + + // Create user + Installer::createUser($request->get('user_email'), $request->get('user_password'), session('locale')); + + // Make the final touches + Installer::finalTouches(); + + // Redirect to dashboard + return redirect('auth/login'); + } +} diff --git a/app/Http/Controllers/Install/Updates.php b/app/Http/Controllers/Install/Updates.php new file mode 100755 index 0000000..855050e --- /dev/null +++ b/app/Http/Controllers/Install/Updates.php @@ -0,0 +1,120 @@ +get('alias'); + + if (!isset($updates[$alias])) { + continue; + } + + $m = new \stdClass(); + $m->name = $row->get('name'); + $m->alias = $row->get('alias'); + $m->category = $row->get('category'); + $m->installed = $row->get('version'); + $m->latest = $updates[$alias]; + + $modules[] = $m; + } + } + + return view('install.updates.index', compact('core', 'modules')); + } + + public function changelog() + { + return Versions::changelog(); + } + + /** + * Check for updates. + * + * @return Response + */ + public function check() + { + // Clear cache in order to check for updates + Updater::clear(); + + return redirect()->back(); + } + + /** + * Update the core or modules. + * + * @param $alias + * @param $version + * @return Response + */ + public function update($alias, $version) + { + set_time_limit(600); // 10 minutes + + if (Updater::update($alias, $version)) { + return redirect('install/updates/post/' . $alias . '/' . version('short') . '/' . $version); + } + + flash(trans('updates.error'))->error()->important(); + + return redirect()->back(); + } + + /** + * Final actions post update. + * + * @param $alias + * @param $old + * @param $new + * @return Response + */ + public function post($alias, $old, $new) + { + // Check if the file mirror was successful + if (($alias == 'core') && (version('short') != $new)) { + flash(trans('updates.error'))->error()->important(); + + return redirect('install/updates'); + } + + // Clear cache after update + Artisan::call('cache:clear'); + + event(new UpdateFinished($alias, $old, $new)); + + flash(trans('updates.success'))->success(); + + return redirect('install/updates'); + } +} diff --git a/app/Http/Controllers/Modals/BillPayments.php b/app/Http/Controllers/Modals/BillPayments.php new file mode 100755 index 0000000..0446ea9 --- /dev/null +++ b/app/Http/Controllers/Modals/BillPayments.php @@ -0,0 +1,250 @@ +middleware('permission:create-expenses-bills')->only(['create', 'store', 'duplicate', 'import']); + $this->middleware('permission:read-expenses-bills')->only(['index', 'show', 'edit', 'export']); + $this->middleware('permission:update-expenses-bills')->only(['update', 'enable', 'disable']); + $this->middleware('permission:delete-expenses-bills')->only('destroy'); + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create(Bill $bill) + { + $accounts = Account::enabled()->orderBy('name')->pluck('name', 'id'); + + $currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code')->toArray(); + + $currency = Currency::where('code', setting('general.default_currency'))->first(); + + $account_currency_code = Account::where('id', setting('general.default_account'))->pluck('currency_code')->first(); + + $payment_methods = Modules::getPaymentMethods(); + + $bill->paid = $this->getPaid($bill); + + // Get Bill Totals + foreach ($bill->totals as $bill_total) { + $bill->{$bill_total->code} = $bill_total->amount; + } + + $bill->grand_total = $bill->total; + + if (!empty($paid)) { + $bill->grand_total = $bill->total - $paid; + } + + $html = view('modals.bills.payment', compact('bill', 'accounts', 'account_currency_code', 'currencies', 'currency', 'payment_methods'))->render(); + + return response()->json([ + 'success' => true, + 'error' => false, + 'message' => 'null', + 'html' => $html, + ]); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Bill $bill, Request $request) + { + // Get currency object + $currencies = Currency::enabled()->pluck('rate', 'code')->toArray(); + $currency = Currency::where('code', $request['currency_code'])->first(); + + $request['currency_code'] = $currency->code; + $request['currency_rate'] = $currency->rate; + + $total_amount = $bill->amount; + + $default_amount = (double) $request['amount']; + + if ($bill->currency_code == $request['currency_code']) { + $amount = $default_amount; + } else { + $default_amount_model = new BillPayment(); + + $default_amount_model->default_currency_code = $bill->currency_code; + $default_amount_model->amount = $default_amount; + $default_amount_model->currency_code = $request['currency_code']; + $default_amount_model->currency_rate = $currencies[$request['currency_code']]; + + $default_amount = (double) $default_amount_model->getDivideConvertedAmount(); + + $convert_amount = new BillPayment(); + + $convert_amount->default_currency_code = $request['currency_code']; + $convert_amount->amount = $default_amount; + $convert_amount->currency_code = $bill->currency_code; + $convert_amount->currency_rate = $currencies[$bill->currency_code]; + + $amount = (double) $convert_amount->getDynamicConvertedAmount(); + } + + if ($bill->payments()->count()) { + $total_amount -= $this->getPaid($bill); + } + + // For amount cover integer + $multiplier = 1; + + for ($i = 0; $i < $currency->precision; $i++) { + $multiplier *= 10; + } + + $amount_check = $amount * $multiplier; + $total_amount_check = $total_amount * $multiplier; + + if ($amount_check > $total_amount_check) { + $error_amount = $total_amount; + + if ($bill->currency_code != $request['currency_code']) { + $error_amount_model = new BillPayment(); + + $error_amount_model->default_currency_code = $request['currency_code']; + $error_amount_model->amount = $error_amount; + $error_amount_model->currency_code = $bill->currency_code; + $error_amount_model->currency_rate = $currencies[$bill->currency_code]; + + $error_amount = (double) $error_amount_model->getDivideConvertedAmount(); + + $convert_amount = new BillPayment(); + + $convert_amount->default_currency_code = $bill->currency_code; + $convert_amount->amount = $error_amount; + $convert_amount->currency_code = $request['currency_code']; + $convert_amount->currency_rate = $currencies[$request['currency_code']]; + + $error_amount = (double) $convert_amount->getDynamicConvertedAmount(); + } + + $message = trans('messages.error.over_payment', ['amount' => money($error_amount, $request['currency_code'], true)]); + + return response()->json([ + 'success' => false, + 'error' => true, + 'data' => [ + 'amount' => $error_amount + ], + 'message' => $message, + 'html' => 'null', + ]); + } elseif ($amount == $total_amount) { + $bill->bill_status_code = 'paid'; + } else { + $bill->bill_status_code = 'partial'; + } + + $bill->save(); + + $bill_payment_request = [ + 'company_id' => $request['company_id'], + 'bill_id' => $request['bill_id'], + 'account_id' => $request['account_id'], + 'paid_at' => $request['paid_at'], + 'amount' => $request['amount'], + 'currency_code' => $request['currency_code'], + 'currency_rate' => $request['currency_rate'], + 'description' => $request['description'], + 'payment_method' => $request['payment_method'], + 'reference' => $request['reference'] + ]; + + $bill_payment = BillPayment::create($bill_payment_request); + + // Upload attachment + if ($request->file('attachment')) { + $media = $this->getMedia($request->file('attachment'), 'bills'); + + $bill_payment->attachMedia($media, 'attachment'); + } + + $request['status_code'] = $bill->bill_status_code; + $request['notify'] = 0; + + $desc_amount = money((float) $request['amount'], (string) $request['currency_code'], true)->format(); + + $request['description'] = $desc_amount . ' ' . trans_choice('general.payments', 1); + + BillHistory::create($request->input()); + + $message = trans('messages.success.added', ['type' => trans_choice('general.payments', 1)]); + + return response()->json([ + 'success' => true, + 'error' => false, + 'data' => $bill_payment, + 'message' => $message, + 'html' => 'null', + ]); + } + + protected function getPaid($bill) + { + $paid = 0; + + // Get Bill Payments + if ($bill->payments->count()) { + $_currencies = Currency::enabled()->pluck('rate', 'code')->toArray(); + + foreach ($bill->payments as $item) { + $default_amount = (double) $item->amount; + + if ($bill->currency_code == $item->currency_code) { + $amount = $default_amount; + } else { + $default_amount_model = new BillPayment(); + + $default_amount_model->default_currency_code = $bill->currency_code; + $default_amount_model->amount = $default_amount; + $default_amount_model->currency_code = $item->currency_code; + $default_amount_model->currency_rate = $_currencies[$item->currency_code]; + + $default_amount = (double) $default_amount_model->getDivideConvertedAmount(); + + $convert_amount = new BillPayment(); + + $convert_amount->default_currency_code = $item->currency_code; + $convert_amount->amount = $default_amount; + $convert_amount->currency_code = $bill->currency_code; + $convert_amount->currency_rate = $_currencies[$bill->currency_code]; + + $amount = (double) $convert_amount->getDynamicConvertedAmount(); + } + + $paid += $amount; + } + } + + return $paid; + } +} diff --git a/app/Http/Controllers/Modals/Categories.php b/app/Http/Controllers/Modals/Categories.php new file mode 100755 index 0000000..5fd1891 --- /dev/null +++ b/app/Http/Controllers/Modals/Categories.php @@ -0,0 +1,64 @@ +middleware('permission:create-settings-categories')->only(['create', 'store', 'duplicate', 'import']); + $this->middleware('permission:read-settings-categories')->only(['index', 'show', 'edit', 'export']); + $this->middleware('permission:update-settings-categories')->only(['update', 'enable', 'disable']); + $this->middleware('permission:delete-settings-categories')->only('destroy'); + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create(CRequest $request) + { + $type = $request['type']; + + $html = view('modals.categories.create', compact('currencies', 'type'))->render(); + + return response()->json([ + 'success' => true, + 'error' => false, + 'message' => 'null', + 'html' => $html, + ]); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + $category = Category::create($request->all()); + + $message = trans('messages.success.added', ['type' => trans_choice('general.categories', 1)]); + + return response()->json([ + 'success' => true, + 'error' => false, + 'data' => $category, + 'message' => $message, + 'html' => 'null', + ]); + } +} diff --git a/app/Http/Controllers/Modals/Customers.php b/app/Http/Controllers/Modals/Customers.php new file mode 100755 index 0000000..b0af0b6 --- /dev/null +++ b/app/Http/Controllers/Modals/Customers.php @@ -0,0 +1,74 @@ +middleware('permission:create-incomes-customers')->only(['create', 'store', 'duplicate', 'import']); + $this->middleware('permission:read-incomes-customers')->only(['index', 'show', 'edit', 'export']); + $this->middleware('permission:update-incomes-customers')->only(['update', 'enable', 'disable']); + $this->middleware('permission:delete-incomes-customers')->only('destroy'); + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create() + { + $currencies = Currency::enabled()->pluck('name', 'code'); + + $html = view('modals.customers.create', compact('currencies'))->render(); + + return response()->json([ + 'success' => true, + 'error' => false, + 'message' => 'null', + 'html' => $html, + ]); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + $customer = Customer::create($request->all()); + + $message = trans('messages.success.added', ['type' => trans_choice('general.customers', 1)]); + + return response()->json([ + 'success' => true, + 'error' => false, + 'data' => $customer, + 'message' => $message, + 'html' => 'null', + ]); + } +} diff --git a/app/Http/Controllers/Modals/InvoicePayments.php b/app/Http/Controllers/Modals/InvoicePayments.php new file mode 100755 index 0000000..737dd13 --- /dev/null +++ b/app/Http/Controllers/Modals/InvoicePayments.php @@ -0,0 +1,250 @@ +middleware('permission:create-incomes-invoices')->only(['create', 'store', 'duplicate', 'import']); + $this->middleware('permission:read-incomes-invoices')->only(['index', 'show', 'edit', 'export']); + $this->middleware('permission:update-incomes-invoices')->only(['update', 'enable', 'disable']); + $this->middleware('permission:delete-incomes-invoices')->only('destroy'); + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create(Invoice $invoice) + { + $accounts = Account::enabled()->orderBy('name')->pluck('name', 'id'); + + $currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code')->toArray(); + + $account_currency_code = Account::where('id', setting('general.default_account'))->pluck('currency_code')->first(); + + $currency = Currency::where('code', $account_currency_code)->first(); + + $payment_methods = Modules::getPaymentMethods(); + + $paid = $this->getPaid($invoice); + + // Get Invoice Totals + foreach ($invoice->totals as $invoice_total) { + $invoice->{$invoice_total->code} = $invoice_total->amount; + } + + $invoice->grand_total = $invoice->total; + + if (!empty($paid)) { + $invoice->grand_total = $invoice->total - $paid; + } + + $html = view('modals.invoices.payment', compact('invoice', 'accounts', 'account_currency_code', 'currencies', 'currency', 'payment_methods'))->render(); + + return response()->json([ + 'success' => true, + 'error' => false, + 'message' => 'null', + 'html' => $html, + ]); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Invoice $invoice, Request $request) + { + // Get currency object + $currencies = Currency::enabled()->pluck('rate', 'code')->toArray(); + $currency = Currency::where('code', $request['currency_code'])->first(); + + $request['currency_code'] = $currency->code; + $request['currency_rate'] = $currency->rate; + + $total_amount = $invoice->amount; + + $default_amount = (double) $request['amount']; + + if ($invoice->currency_code == $request['currency_code']) { + $amount = $default_amount; + } else { + $default_amount_model = new InvoicePayment(); + + $default_amount_model->default_currency_code = $invoice->currency_code; + $default_amount_model->amount = $default_amount; + $default_amount_model->currency_code = $request['currency_code']; + $default_amount_model->currency_rate = $currencies[$request['currency_code']]; + + $default_amount = (double) $default_amount_model->getDivideConvertedAmount(); + + $convert_amount = new InvoicePayment(); + + $convert_amount->default_currency_code = $request['currency_code']; + $convert_amount->amount = $default_amount; + $convert_amount->currency_code = $invoice->currency_code; + $convert_amount->currency_rate = $currencies[$invoice->currency_code]; + + $amount = (double) $convert_amount->getDynamicConvertedAmount(); + } + + if ($invoice->payments()->count()) { + $total_amount -= $this->getPaid($invoice); + } + + // For amount cover integer + $multiplier = 1; + + for ($i = 0; $i < $currency->precision; $i++) { + $multiplier *= 10; + } + + $amount_check = $amount * $multiplier; + $total_amount_check = $total_amount * $multiplier; + + if ($amount_check > $total_amount_check) { + $error_amount = $total_amount; + + if ($invoice->currency_code != $request['currency_code']) { + $error_amount_model = new InvoicePayment(); + + $error_amount_model->default_currency_code = $request['currency_code']; + $error_amount_model->amount = $error_amount; + $error_amount_model->currency_code = $invoice->currency_code; + $error_amount_model->currency_rate = $currencies[$invoice->currency_code]; + + $error_amount = (double) $error_amount_model->getDivideConvertedAmount(); + + $convert_amount = new InvoicePayment(); + + $convert_amount->default_currency_code = $invoice->currency_code; + $convert_amount->amount = $error_amount; + $convert_amount->currency_code = $request['currency_code']; + $convert_amount->currency_rate = $currencies[$request['currency_code']]; + + $error_amount = (double) $convert_amount->getDynamicConvertedAmount(); + } + + $message = trans('messages.error.over_payment', ['amount' => money($error_amount, $request['currency_code'],true)]); + + return response()->json([ + 'success' => false, + 'error' => true, + 'data' => [ + 'amount' => $error_amount + ], + 'message' => $message, + 'html' => 'null', + ]); + } elseif ($amount == $total_amount) { + $invoice->invoice_status_code = 'paid'; + } else { + $invoice->invoice_status_code = 'partial'; + } + + $invoice->save(); + + $invoice_payment_request = [ + 'company_id' => $request['company_id'], + 'invoice_id' => $request['invoice_id'], + 'account_id' => $request['account_id'], + 'paid_at' => $request['paid_at'], + 'amount' => $request['amount'], + 'currency_code' => $request['currency_code'], + 'currency_rate' => $request['currency_rate'], + 'description' => $request['description'], + 'payment_method' => $request['payment_method'], + 'reference' => $request['reference'] + ]; + + $invoice_payment = InvoicePayment::create($invoice_payment_request); + + // Upload attachment + if ($request->file('attachment')) { + $media = $this->getMedia($request->file('attachment'), 'invoices'); + + $invoice_payment->attachMedia($media, 'attachment'); + } + + $request['status_code'] = $invoice->invoice_status_code; + $request['notify'] = 0; + + $desc_amount = money((float) $request['amount'], (string) $request['currency_code'], true)->format(); + + $request['description'] = $desc_amount . ' ' . trans_choice('general.payments', 1); + + InvoiceHistory::create($request->input()); + + $message = trans('messages.success.added', ['type' => trans_choice('general.payments', 1)]); + + return response()->json([ + 'success' => true, + 'error' => false, + 'data' => $invoice_payment, + 'message' => $message, + 'html' => 'null', + ]); + } + + protected function getPaid($invoice) + { + $paid = 0; + + // Get Invoice Payments + if ($invoice->payments->count()) { + $_currencies = Currency::enabled()->pluck('rate', 'code')->toArray(); + + foreach ($invoice->payments as $item) { + $default_amount = $item->amount; + + if ($invoice->currency_code == $item->currency_code) { + $amount = (double) $default_amount; + } else { + $default_amount_model = new InvoicePayment(); + + $default_amount_model->default_currency_code = $invoice->currency_code; + $default_amount_model->amount = $default_amount; + $default_amount_model->currency_code = $item->currency_code; + $default_amount_model->currency_rate = $_currencies[$item->currency_code]; + + $default_amount = (double) $default_amount_model->getDivideConvertedAmount(); + + $convert_amount = new InvoicePayment(); + + $convert_amount->default_currency_code = $item->currency_code; + $convert_amount->amount = $default_amount; + $convert_amount->currency_code = $invoice->currency_code; + $convert_amount->currency_rate = $_currencies[$invoice->currency_code]; + + $amount = (double) $convert_amount->getDynamicConvertedAmount(); + } + + $paid += $amount; + } + } + + return $paid; + } +} diff --git a/app/Http/Controllers/Modals/Vendors.php b/app/Http/Controllers/Modals/Vendors.php new file mode 100755 index 0000000..ccafd28 --- /dev/null +++ b/app/Http/Controllers/Modals/Vendors.php @@ -0,0 +1,82 @@ +middleware('permission:create-expenses-vendors')->only(['create', 'store', 'duplicate', 'import']); + $this->middleware('permission:read-expenses-vendors')->only(['index', 'show', 'edit', 'export']); + $this->middleware('permission:update-expenses-vendors')->only(['update', 'enable', 'disable']); + $this->middleware('permission:delete-expenses-vendors')->only('destroy'); + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create() + { + $currencies = Currency::enabled()->pluck('name', 'code'); + + $html = view('modals.vendors.create', compact('currencies'))->render(); + + return response()->json([ + 'success' => true, + 'error' => false, + 'message' => 'null', + 'html' => $html, + ]); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + $vendor = Vendor::create($request->all()); + + // Upload logo + if ($request->file('logo')) { + $media = $this->getMedia($request->file('logo'), 'vendors'); + + $vendor->attachMedia($media, 'logo'); + } + + $message = trans('messages.success.added', ['type' => trans_choice('general.vendors', 1)]); + + return response()->json([ + 'success' => true, + 'error' => false, + 'data' => $vendor, + 'message' => $message, + 'html' => 'null', + ]); + } +} diff --git a/app/Http/Controllers/Modules/Home.php b/app/Http/Controllers/Modules/Home.php new file mode 100755 index 0000000..e1ad914 --- /dev/null +++ b/app/Http/Controllers/Modules/Home.php @@ -0,0 +1,36 @@ +checkApiToken(); + + $data = [ + 'query' => [ + 'limit' => 4 + ] + ]; + + $paid = $this->getPaidModules($data); + $new = $this->getNewModules($data); + $free = $this->getFreeModules($data); + $installed = Module::all()->pluck('status', 'alias')->toArray(); + + return view('modules.home.index', compact('paid', 'new', 'free', 'installed')); + } +} diff --git a/app/Http/Controllers/Modules/Item.php b/app/Http/Controllers/Modules/Item.php new file mode 100755 index 0000000..016e912 --- /dev/null +++ b/app/Http/Controllers/Modules/Item.php @@ -0,0 +1,305 @@ +middleware('permission:create-modules-item')->only(['install']); + $this->middleware('permission:update-modules-item')->only(['update', 'enable', 'disable']); + $this->middleware('permission:delete-modules-item')->only(['uninstall']); + } + + /** + * Show the form for viewing the specified resource. + * + * @param $alias + * + * @return Response + */ + public function show($alias) + { + $this->checkApiToken(); + + $enable = false; + $installed = false; + + $module = $this->getModule($alias); + + if (empty($module)) { + return redirect('apps/home')->send(); + } + + $check = Module::alias($alias)->first(); + + if ($check) { + $installed = true; + + if ($check->status) { + $enable = true; + } + } + + if (request()->get('utm_source')) { + $parameters = request()->all(); + + $character = '?'; + + if (strpos($module->action_url, '?') !== false) { + $character = '&'; + } + + $module->action_url .= $character . http_build_query($parameters); + } + + return view('modules.item.show', compact('module', 'about', 'installed', 'enable')); + } + + /** + * Show the form for viewing the specified resource. + * + * @param $request + * + * @return Response + */ + public function steps(Request $request) + { + $this->checkApiToken(); + + $json = []; + $json['step'] = []; + + $name = $request['name']; + $version = $request['version']; + + // Download + $json['step'][] = [ + 'text' => trans('modules.installation.download', ['module' => $name]), + 'url' => url('apps/download') + ]; + + // Unzip + $json['step'][] = [ + 'text' => trans('modules.installation.unzip', ['module' => $name]), + 'url' => url('apps/unzip') + ]; + + // Download + $json['step'][] = [ + 'text' => trans('modules.installation.install', ['module' => $name]), + 'url' => url('apps/install') + ]; + + return response()->json($json); + } + + /** + * Show the form for viewing the specified resource. + * + * @param $request + * + * @return Response + */ + public function download(Request $request) + { + $this->checkApiToken(); + + $path = $request['path']; + + $version = $request['version']; + + $path .= '/' . $version . '/' . version('short') . '/' . setting('general.api_token'); + + $json = $this->downloadModule($path); + + return response()->json($json); + } + + /** + * Show the form for viewing the specified resource. + * + * @param $request + * + * @return Response + */ + public function unzip(Request $request) + { + $this->checkApiToken(); + + $path = $request['path']; + + $json = $this->unzipModule($path); + + return response()->json($json); + } + + /** + * Show the form for viewing the specified resource. + * + * @param $request + * + * @return Response + */ + public function install(Request $request) + { + $this->checkApiToken(); + + $path = $request['path']; + + $json = $this->installModule($path); + + if ($json['success']) { + $message = trans('modules.installed', ['module' => $json['data']['name']]); + + flash($message)->success(); + } + + return response()->json($json); + } + + public function uninstall($alias) + { + $this->checkApiToken(); + + $json = $this->uninstallModule($alias); + + $module = Module::alias($alias)->first(); + + $data = [ + 'company_id' => session('company_id'), + 'module_id' => $module->id, + 'category' => $json['data']['category'], + 'version' => $json['data']['version'], + 'description' => trans('modules.uninstalled', ['module' => $json['data']['name']]), + ]; + + ModuleHistory::create($data); + + $module->delete(); + + $message = trans('modules.uninstalled', ['module' => $json['data']['name']]); + + flash($message)->success(); + + return redirect('apps/' . $alias)->send(); + } + + public function update($alias) + { + $this->checkApiToken(); + + $json = $this->updateModule($alias); + + $module = Module::alias($alias)->first(); + + $data = [ + 'company_id' => session('company_id'), + 'module_id' => $module->id, + 'category' => $json['data']['category'], + 'version' => $json['data']['version'], + 'description' => trans_choice('modules.updated', $json['data']['name']), + ]; + + ModuleHistory::create($data); + + $message = trans('modules.updated', ['module' => $json['data']['name']]); + + flash($message)->success(); + + return redirect('apps/' . $alias)->send(); + } + + public function enable($alias) + { + $this->checkApiToken(); + + $json = $this->enableModule($alias); + + $module = Module::alias($alias)->first(); + + $data = [ + 'company_id' => session('company_id'), + 'module_id' => $module->id, + 'category' => $json['data']['category'], + 'version' => $json['data']['version'], + 'description' => trans('modules.enabled', ['module' => $json['data']['name']]), + ]; + + $module->status = 1; + + $module->save(); + + ModuleHistory::create($data); + + $message = trans('modules.enabled', ['module' => $json['data']['name']]); + + flash($message)->success(); + + return redirect('apps/' . $alias)->send(); + } + + public function disable($alias) + { + $this->checkApiToken(); + + $json = $this->disableModule($alias); + + $module = Module::alias($alias)->first(); + + $data = [ + 'company_id' => session('company_id'), + 'module_id' => $module->id, + 'category' => $json['data']['category'], + 'version' => $json['data']['version'], + 'description' => trans('modules.disabled', ['module' => $json['data']['name']]), + ]; + + $module->status = 0; + + $module->save(); + + ModuleHistory::create($data); + + $message = trans('modules.disabled', ['module' => $json['data']['name']]); + + flash($message)->success(); + + return redirect('apps/' . $alias)->send(); + } + + /** + * Final actions post update. + * + * @param $alias + * @param $old + * @param $new + * @return Response + */ + public function post($alias) + { + Artisan::call('module:install', ['alias' => $alias, 'company_id' => session('company_id')]); + + $module = LModule::findByAlias($alias); + + $message = trans('modules.installed', ['module' => $module->get('name')]); + + flash($message)->success(); + + return redirect('apps/' . $alias); + } +} diff --git a/app/Http/Controllers/Modules/My.php b/app/Http/Controllers/Modules/My.php new file mode 100755 index 0000000..5d261dc --- /dev/null +++ b/app/Http/Controllers/Modules/My.php @@ -0,0 +1,29 @@ +checkApiToken(); + + $purchased = $this->getMyModules(); + $modules = $this->getInstalledModules(); + $installed = Module::where('company_id', '=', session('company_id'))->pluck('status', 'alias')->toArray(); + + return view('modules.my.index', compact('purchased', 'modules', 'installed')); + } +} diff --git a/app/Http/Controllers/Modules/Tiles.php b/app/Http/Controllers/Modules/Tiles.php new file mode 100755 index 0000000..f910bea --- /dev/null +++ b/app/Http/Controllers/Modules/Tiles.php @@ -0,0 +1,106 @@ +checkApiToken(); + + $data = $this->getModulesByCategory($alias); + + $title = $data->category->name; + $modules = $data->modules; + $installed = Module::all()->pluck('status', 'alias')->toArray(); + + return view('modules.tiles.index', compact('title', 'modules', 'installed')); + } + + /** + * Show the form for viewing the specified resource. + * + * @return Response + */ + public function paidModules() + { + $this->checkApiToken(); + + $title = trans('modules.top_paid'); + $modules = $this->getPaidModules(); + $installed = Module::all()->pluck('status', 'alias')->toArray(); + + return view('modules.tiles.index', compact('title', 'modules', 'installed')); + } + + /** + * Show the form for viewing the specified resource. + * + * @return Response + */ + public function newModules() + { + $this->checkApiToken(); + + $title = trans('modules.new'); + $modules = $this->getNewModules(); + $installed = Module::all()->pluck('status', 'alias')->toArray(); + + return view('modules.tiles.index', compact('title', 'modules', 'installed')); + } + + /** + * Show the form for viewing the specified resource. + * + * @return Response + */ + public function freeModules() + { + $this->checkApiToken(); + + $title = trans('modules.top_free'); + $modules = $this->getFreeModules(); + $installed = Module::all()->pluck('status', 'alias')->toArray(); + + return view('modules.tiles.index', compact('title', 'modules', 'installed')); + } + + /** + * Show the form for viewing the specified resource. + * + * @return Response + */ + public function searchModules(Request $request) + { + $this->checkApiToken(); + + $keyword = $request['keyword']; + + $data = [ + 'query' => [ + 'keyword' => $keyword, + ] + ]; + + $title = trans('modules.search'); + $modules = $this->getSearchModules($data); + $installed = Module::all()->pluck('status', 'alias')->toArray(); + + return view('modules.tiles.index', compact('title', 'modules', 'keyword', 'installed')); + } +} diff --git a/app/Http/Controllers/Modules/Token.php b/app/Http/Controllers/Modules/Token.php new file mode 100755 index 0000000..13e1290 --- /dev/null +++ b/app/Http/Controllers/Modules/Token.php @@ -0,0 +1,37 @@ +set('general.api_token', $request['api_token']); + + setting()->save(); + + return redirect('apps/home'); + } +} diff --git a/app/Http/Controllers/Reports/ExpenseSummary.php b/app/Http/Controllers/Reports/ExpenseSummary.php new file mode 100755 index 0000000..ff19da3 --- /dev/null +++ b/app/Http/Controllers/Reports/ExpenseSummary.php @@ -0,0 +1,134 @@ +type('expense')->pluck('name', 'id')->toArray(); + + // Get year + $year = request('year'); + if (empty($year)) { + $year = Date::now()->year; + } + + // Dates + for ($j = 1; $j <= 12; $j++) { + $dates[$j] = Date::parse($year . '-' . $j)->format('F'); + + $expenses_graph[Date::parse($year . '-' . $j)->format('F-Y')] = 0; + + // Totals + $totals[$dates[$j]] = array( + 'amount' => 0, + 'currency_code' => setting('general.default_currency'), + 'currency_rate' => 1 + ); + + foreach ($categories as $category_id => $category_name) { + $expenses[$category_id][$dates[$j]] = array( + 'category_id' => $category_id, + 'name' => $category_name, + 'amount' => 0, + 'currency_code' => setting('general.default_currency'), + 'currency_rate' => 1 + ); + } + } + + // Bills + switch ($status) { + case 'paid': + $bills = BillPayment::monthsOfYear('paid_at')->get(); + $this->setAmount($expenses_graph, $totals, $expenses, $bills, 'bill', 'paid_at'); + break; + case 'upcoming': + $bills = Bill::accrued()->monthsOfYear('due_at')->get(); + $this->setAmount($expenses_graph, $totals, $expenses, $bills, 'bill', 'due_at'); + break; + default: + $bills = Bill::accrued()->monthsOfYear('billed_at')->get(); + $this->setAmount($expenses_graph, $totals, $expenses, $bills, 'bill', 'billed_at'); + break; + } + + // Payments + if ($status != 'upcoming') { + $payments = Payment::monthsOfYear('paid_at')->isNotTransfer()->get(); + $this->setAmount($expenses_graph, $totals, $expenses, $payments, 'payment', 'paid_at'); + } + + // Check if it's a print or normal request + if (request('print')) { + $chart_template = 'vendor.consoletvs.charts.chartjs.multi.line_print'; + $view_template = 'reports.expense_summary.print'; + } else { + $chart_template = 'vendor.consoletvs.charts.chartjs.multi.line'; + $view_template = 'reports.expense_summary.index'; + } + + // Expenses chart + $chart = Charts::multi('line', 'chartjs') + ->dimensions(0, 300) + ->colors(['#F56954']) + ->dataset(trans_choice('general.expenses', 1), $expenses_graph) + ->labels($dates) + ->credits(false) + ->view($chart_template); + + return view($view_template, compact('chart', 'dates', 'categories', 'expenses', 'totals')); + } + + private function setAmount(&$graph, &$totals, &$expenses, $items, $type, $date_field) + { + foreach ($items as $item) { + if ($item['table'] == 'bill_payments') { + $bill = $item->bill; + + $item->category_id = $bill->category_id; + } + + $date = Date::parse($item->$date_field)->format('F'); + + if (!isset($expenses[$item->category_id])) { + continue; + } + + $amount = $item->getConvertedAmount(); + + // Forecasting + if (($type == 'bill') && ($date_field == 'due_at')) { + foreach ($item->payments as $payment) { + $amount -= $payment->getConvertedAmount(); + } + } + + $expenses[$item->category_id][$date]['amount'] += $amount; + $expenses[$item->category_id][$date]['currency_code'] = $item->currency_code; + $expenses[$item->category_id][$date]['currency_rate'] = $item->currency_rate; + + $graph[Date::parse($item->$date_field)->format('F-Y')] += $amount; + + $totals[$date]['amount'] += $amount; + } + } +} diff --git a/app/Http/Controllers/Reports/IncomeExpenseSummary.php b/app/Http/Controllers/Reports/IncomeExpenseSummary.php new file mode 100755 index 0000000..b09cc7d --- /dev/null +++ b/app/Http/Controllers/Reports/IncomeExpenseSummary.php @@ -0,0 +1,179 @@ +type('income')->pluck('name', 'id')->toArray(); + + $expense_categories = Category::enabled()->type('expense')->pluck('name', 'id')->toArray(); + + // Get year + $year = request('year'); + if (empty($year)) { + $year = Date::now()->year; + } + + // Dates + for ($j = 1; $j <= 12; $j++) { + $dates[$j] = Date::parse($year . '-' . $j)->format('F'); + + $profit_graph[Date::parse($year . '-' . $j)->format('F-Y')] = 0; + + // Totals + $totals[$dates[$j]] = array( + 'amount' => 0, + 'currency_code' => setting('general.default_currency'), + 'currency_rate' => 1 + ); + + foreach ($income_categories as $category_id => $category_name) { + $compares['income'][$category_id][$dates[$j]] = array( + 'category_id' => $category_id, + 'name' => $category_name, + 'amount' => 0, + 'currency_code' => setting('general.default_currency'), + 'currency_rate' => 1 + ); + } + + foreach ($expense_categories as $category_id => $category_name) { + $compares['expense'][$category_id][$dates[$j]] = array( + 'category_id' => $category_id, + 'name' => $category_name, + 'amount' => 0, + 'currency_code' => setting('general.default_currency'), + 'currency_rate' => 1 + ); + } + } + + // Invoices + switch ($status) { + case 'paid': + $invoices = InvoicePayment::monthsOfYear('paid_at')->get(); + $this->setAmount($profit_graph, $totals, $compares, $invoices, 'invoice', 'paid_at'); + break; + case 'upcoming': + $invoices = Invoice::accrued()->monthsOfYear('due_at')->get(); + $this->setAmount($profit_graph, $totals, $compares, $invoices, 'invoice', 'due_at'); + break; + default: + $invoices = Invoice::accrued()->monthsOfYear('invoiced_at')->get(); + $this->setAmount($profit_graph, $totals, $compares, $invoices, 'invoice', 'invoiced_at'); + break; + } + + // Revenues + if ($status != 'upcoming') { + $revenues = Revenue::monthsOfYear('paid_at')->isNotTransfer()->get(); + $this->setAmount($profit_graph, $totals, $compares, $revenues, 'revenue', 'paid_at'); + } + + // Bills + switch ($status) { + case 'paid': + $bills = BillPayment::monthsOfYear('paid_at')->get(); + $this->setAmount($profit_graph, $totals, $compares, $bills, 'bill', 'paid_at'); + break; + case 'upcoming': + $bills = Bill::accrued()->monthsOfYear('due_at')->get(); + $this->setAmount($profit_graph, $totals, $compares, $bills, 'bill', 'due_at'); + break; + default: + $bills = Bill::accrued()->monthsOfYear('billed_at')->get(); + $this->setAmount($profit_graph, $totals, $compares, $bills, 'bill', 'billed_at'); + break; + } + + // Payments + if ($status != 'upcoming') { + $payments = Payment::monthsOfYear('paid_at')->isNotTransfer()->get(); + $this->setAmount($profit_graph, $totals, $compares, $payments, 'payment', 'paid_at'); + } + + // Check if it's a print or normal request + if (request('print')) { + $chart_template = 'vendor.consoletvs.charts.chartjs.multi.line_print'; + $view_template = 'reports.income_expense_summary.print'; + } else { + $chart_template = 'vendor.consoletvs.charts.chartjs.multi.line'; + $view_template = 'reports.income_expense_summary.index'; + } + + // Profit chart + $chart = Charts::multi('line', 'chartjs') + ->dimensions(0, 300) + ->colors(['#6da252']) + ->dataset(trans_choice('general.profits', 1), $profit_graph) + ->labels($dates) + ->credits(false) + ->view($chart_template); + + return view($view_template, compact('chart', 'dates', 'income_categories', 'expense_categories', 'compares', 'totals')); + } + + private function setAmount(&$graph, &$totals, &$compares, $items, $type, $date_field) + { + foreach ($items as $item) { + if ($item['table'] == 'bill_payments' || $item['table'] == 'invoice_payments') { + $type_item = $item->$type; + + $item->category_id = $type_item->category_id; + } + + $date = Date::parse($item->$date_field)->format('F'); + + $group = (($type == 'invoice') || ($type == 'revenue')) ? 'income' : 'expense'; + + if (!isset($compares[$group][$item->category_id])) { + continue; + } + + $amount = $item->getConvertedAmount(); + + // Forecasting + if ((($type == 'invoice') || ($type == 'bill')) && ($date_field == 'due_at')) { + foreach ($item->payments as $payment) { + $amount -= $payment->getConvertedAmount(); + } + } + + $compares[$group][$item->category_id][$date]['amount'] += $amount; + $compares[$group][$item->category_id][$date]['currency_code'] = $item->currency_code; + $compares[$group][$item->category_id][$date]['currency_rate'] = $item->currency_rate; + + if ($group == 'income') { + $graph[Date::parse($item->$date_field)->format('F-Y')] += $amount; + + $totals[$date]['amount'] += $amount; + } else { + $graph[Date::parse($item->$date_field)->format('F-Y')] -= $amount; + + $totals[$date]['amount'] -= $amount; + } + } + } +} diff --git a/app/Http/Controllers/Reports/IncomeSummary.php b/app/Http/Controllers/Reports/IncomeSummary.php new file mode 100755 index 0000000..0d72c6e --- /dev/null +++ b/app/Http/Controllers/Reports/IncomeSummary.php @@ -0,0 +1,134 @@ +type('income')->pluck('name', 'id')->toArray(); + + // Get year + $year = request('year'); + if (empty($year)) { + $year = Date::now()->year; + } + + // Dates + for ($j = 1; $j <= 12; $j++) { + $dates[$j] = Date::parse($year . '-' . $j)->format('F'); + + $incomes_graph[Date::parse($year . '-' . $j)->format('F-Y')] = 0; + + // Totals + $totals[$dates[$j]] = array( + 'amount' => 0, + 'currency_code' => setting('general.default_currency'), + 'currency_rate' => 1 + ); + + foreach ($categories as $category_id => $category_name) { + $incomes[$category_id][$dates[$j]] = array( + 'category_id' => $category_id, + 'name' => $category_name, + 'amount' => 0, + 'currency_code' => setting('general.default_currency'), + 'currency_rate' => 1 + ); + } + } + + // Invoices + switch ($status) { + case 'paid': + $invoices = InvoicePayment::monthsOfYear('paid_at')->get(); + $this->setAmount($incomes_graph, $totals, $incomes, $invoices, 'invoice', 'paid_at'); + break; + case 'upcoming': + $invoices = Invoice::accrued()->monthsOfYear('due_at')->get(); + $this->setAmount($incomes_graph, $totals, $incomes, $invoices, 'invoice', 'due_at'); + break; + default: + $invoices = Invoice::accrued()->monthsOfYear('invoiced_at')->get(); + $this->setAmount($incomes_graph, $totals, $incomes, $invoices, 'invoice', 'invoiced_at'); + break; + } + + // Revenues + if ($status != 'upcoming') { + $revenues = Revenue::monthsOfYear('paid_at')->isNotTransfer()->get(); + $this->setAmount($incomes_graph, $totals, $incomes, $revenues, 'revenue', 'paid_at'); + } + + // Check if it's a print or normal request + if (request('print')) { + $chart_template = 'vendor.consoletvs.charts.chartjs.multi.line_print'; + $view_template = 'reports.income_summary.print'; + } else { + $chart_template = 'vendor.consoletvs.charts.chartjs.multi.line'; + $view_template = 'reports.income_summary.index'; + } + + // Incomes chart + $chart = Charts::multi('line', 'chartjs') + ->dimensions(0, 300) + ->colors(['#00c0ef']) + ->dataset(trans_choice('general.incomes', 1), $incomes_graph) + ->labels($dates) + ->credits(false) + ->view($chart_template); + + return view($view_template, compact('chart', 'dates', 'categories', 'incomes', 'totals')); + } + + private function setAmount(&$graph, &$totals, &$incomes, $items, $type, $date_field) + { + foreach ($items as $item) { + if ($item['table'] == 'invoice_payments') { + $invoice = $item->invoice; + + $item->category_id = $invoice->category_id; + } + + $date = Date::parse($item->$date_field)->format('F'); + + if (!isset($incomes[$item->category_id])) { + continue; + } + + $amount = $item->getConvertedAmount(); + + // Forecasting + if (($type == 'invoice') && ($date_field == 'due_at')) { + foreach ($item->payments as $payment) { + $amount -= $payment->getConvertedAmount(); + } + } + + $incomes[$item->category_id][$date]['amount'] += $amount; + $incomes[$item->category_id][$date]['currency_code'] = $item->currency_code; + $incomes[$item->category_id][$date]['currency_rate'] = $item->currency_rate; + + $graph[Date::parse($item->$date_field)->format('F-Y')] += $amount; + + $totals[$date]['amount'] += $amount; + } + } +} diff --git a/app/Http/Controllers/Reports/ProfitLoss.php b/app/Http/Controllers/Reports/ProfitLoss.php new file mode 100755 index 0000000..96cecdd --- /dev/null +++ b/app/Http/Controllers/Reports/ProfitLoss.php @@ -0,0 +1,195 @@ +type('income')->pluck('name', 'id')->toArray(); + + $expense_categories = Category::enabled()->type('expense')->pluck('name', 'id')->toArray(); + + // Get year + $year = request('year'); + if (empty($year)) { + $year = Date::now()->year; + } + + // Dates + for ($j = 1; $j <= 12; $j++) { + $dates[$j] = Date::parse($year . '-' . $j)->quarter; + + // Totals + $totals[$dates[$j]] = array( + 'amount' => 0, + 'currency_code' => setting('general.default_currency'), + 'currency_rate' => 1 + ); + + foreach ($income_categories as $category_id => $category_name) { + $compares['income'][$category_id][$dates[$j]] = [ + 'category_id' => $category_id, + 'name' => $category_name, + 'amount' => 0, + 'currency_code' => setting('general.default_currency'), + 'currency_rate' => 1 + ]; + } + + foreach ($expense_categories as $category_id => $category_name) { + $compares['expense'][$category_id][$dates[$j]] = [ + 'category_id' => $category_id, + 'name' => $category_name, + 'amount' => 0, + 'currency_code' => setting('general.default_currency'), + 'currency_rate' => 1 + ]; + } + + $j += 2; + } + + $totals['total'] = [ + 'amount' => 0, + 'currency_code' => setting('general.default_currency'), + 'currency_rate' => 1 + ]; + + $gross['income'] = $gross['expense'] = [1 => 0, 2 => 0, 3 => 0, 4 => 0, 'total' => 0]; + + foreach ($income_categories as $category_id => $category_name) { + $compares['income'][$category_id]['total'] = [ + 'category_id' => $category_id, + 'name' => trans_choice('general.totals', 1), + 'amount' => 0, + 'currency_code' => setting('general.default_currency'), + 'currency_rate' => 1 + ]; + } + + foreach ($expense_categories as $category_id => $category_name) { + $compares['expense'][$category_id]['total'] = [ + 'category_id' => $category_id, + 'name' => trans_choice('general.totals', 1), + 'amount' => 0, + 'currency_code' => setting('general.default_currency'), + 'currency_rate' => 1 + ]; + } + + // Invoices + switch ($status) { + case 'paid': + $invoices = InvoicePayment::monthsOfYear('paid_at')->get(); + $this->setAmount($totals, $compares, $invoices, 'invoice', 'paid_at'); + break; + case 'upcoming': + $invoices = Invoice::accrued()->monthsOfYear('due_at')->get(); + $this->setAmount($totals, $compares, $invoices, 'invoice', 'due_at'); + break; + default: + $invoices = Invoice::accrued()->monthsOfYear('invoiced_at')->get(); + $this->setAmount($totals, $compares, $invoices, 'invoice', 'invoiced_at'); + break; + } + + // Revenues + if ($status != 'upcoming') { + $revenues = Revenue::monthsOfYear('paid_at')->isNotTransfer()->get(); + $this->setAmount($totals, $compares, $revenues, 'revenue', 'paid_at'); + } + + // Bills + switch ($status) { + case 'paid': + $bills = BillPayment::monthsOfYear('paid_at')->get(); + $this->setAmount($totals, $compares, $bills, 'bill', 'paid_at'); + break; + case 'upcoming': + $bills = Bill::accrued()->monthsOfYear('due_at')->get(); + $this->setAmount($totals, $compares, $bills, 'bill', 'due_at'); + break; + default: + $bills = Bill::accrued()->monthsOfYear('billed_at')->get(); + $this->setAmount($totals, $compares, $bills, 'bill', 'billed_at'); + break; + } + + // Payments + if ($status != 'upcoming') { + $payments = Payment::monthsOfYear('paid_at')->isNotTransfer()->get(); + $this->setAmount($totals, $compares, $payments, 'payment', 'paid_at'); + } + + // Check if it's a print or normal request + if (request('print')) { + $view_template = 'reports.profit_loss.print'; + } else { + $view_template = 'reports.profit_loss.index'; + } + + return view($view_template, compact('dates', 'income_categories', 'expense_categories', 'compares', 'totals', 'gross')); + } + + private function setAmount(&$totals, &$compares, $items, $type, $date_field) + { + foreach ($items as $item) { + if ($item['table'] == 'bill_payments' || $item['table'] == 'invoice_payments') { + $type_item = $item->$type; + + $item->category_id = $type_item->category_id; + } + + $date = Date::parse($item->$date_field)->quarter; + + $group = (($type == 'invoice') || ($type == 'revenue')) ? 'income' : 'expense'; + + if (!isset($compares[$group][$item->category_id])) { + continue; + } + + $amount = $item->getConvertedAmount(); + + // Forecasting + if ((($type == 'invoice') || ($type == 'bill')) && ($date_field == 'due_at')) { + foreach ($item->payments as $payment) { + $amount -= $payment->getConvertedAmount(); + } + } + + $compares[$group][$item->category_id][$date]['amount'] += $amount; + $compares[$group][$item->category_id][$date]['currency_code'] = $item->currency_code; + $compares[$group][$item->category_id][$date]['currency_rate'] = $item->currency_rate; + $compares[$group][$item->category_id]['total']['amount'] += $amount; + + if ($group == 'income') { + $totals[$date]['amount'] += $amount; + $totals['total']['amount'] += $amount; + } else { + $totals[$date]['amount'] -= $amount; + $totals['total']['amount'] -= $amount; + } + } + } +} diff --git a/app/Http/Controllers/Reports/TaxSummary.php b/app/Http/Controllers/Reports/TaxSummary.php new file mode 100755 index 0000000..5638c05 --- /dev/null +++ b/app/Http/Controllers/Reports/TaxSummary.php @@ -0,0 +1,141 @@ +where('rate', '<>', '0')->pluck('name')->toArray(); + + $taxes = array_combine($t, $t); + + // Get year + $year = request('year'); + if (empty($year)) { + $year = Date::now()->year; + } + + // Dates + for ($j = 1; $j <= 12; $j++) { + $dates[$j] = Date::parse($year . '-' . $j)->format('M'); + + foreach ($taxes as $tax_name) { + $incomes[$tax_name][$dates[$j]] = [ + 'amount' => 0, + 'currency_code' => setting('general.default_currency'), + 'currency_rate' => 1, + ]; + + $expenses[$tax_name][$dates[$j]] = [ + 'amount' => 0, + 'currency_code' => setting('general.default_currency'), + 'currency_rate' => 1, + ]; + + $totals[$tax_name][$dates[$j]] = [ + 'amount' => 0, + 'currency_code' => setting('general.default_currency'), + 'currency_rate' => 1, + ]; + } + } + + switch ($status) { + case 'paid': + // Invoices + $invoices = InvoicePayment::with(['invoice', 'invoice.totals'])->monthsOfYear('paid_at')->get(); + $this->setAmount($incomes, $totals, $invoices, 'invoice', 'paid_at'); + // Bills + $bills = BillPayment::with(['bill', 'bill.totals'])->monthsOfYear('paid_at')->get(); + $this->setAmount($expenses, $totals, $bills, 'bill', 'paid_at'); + break; + case 'upcoming': + // Invoices + $invoices = Invoice::with(['totals'])->accrued()->monthsOfYear('due_at')->get(); + $this->setAmount($incomes, $totals, $invoices, 'invoice', 'due_at'); + // Bills + $bills = Bill::with(['totals'])->accrued()->monthsOfYear('due_at')->get(); + $this->setAmount($expenses, $totals, $bills, 'bill', 'due_at'); + break; + default: + // Invoices + $invoices = Invoice::with(['totals'])->accrued()->monthsOfYear('invoiced_at')->get(); + $this->setAmount($incomes, $totals, $invoices, 'invoice', 'invoiced_at'); + // Bills + $bills = Bill::with(['totals'])->accrued()->monthsOfYear('billed_at')->get(); + $this->setAmount($expenses, $totals, $bills, 'bill', 'billed_at'); + break; + } + + // Check if it's a print or normal request + if (request('print')) { + $view_template = 'reports.tax_summary.print'; + } else { + $view_template = 'reports.tax_summary.index'; + } + + return view($view_template, compact('dates', 'taxes', 'incomes', 'expenses', 'totals')); + } + + private function setAmount(&$items, &$totals, $rows, $type, $date_field) + { + foreach ($rows as $row) { + if ($row['table'] == 'bill_payments' || $row['table'] == 'invoice_payments') { + $type_row = $row->$type; + + $row->category_id = $type_row->category_id; + } + + $date = Date::parse($row->$date_field)->format('M'); + + if ($date_field == 'paid_at') { + $row_totals = $row->$type->totals; + } else { + $row_totals = $row->totals; + } + + foreach ($row_totals as $row_total) { + if ($row_total->code != 'tax') { + continue; + } + + if (!isset($items[$row_total->name])) { + continue; + } + + $amount = $this->convert($row_total->amount, $row->currency_code, $row->currency_rate); + + $items[$row_total->name][$date]['amount'] += $amount; + + if ($type == 'invoice') { + $totals[$row_total->name][$date]['amount'] += $amount; + } else { + $totals[$row_total->name][$date]['amount'] -= $amount; + } + } + } + } +} diff --git a/app/Http/Controllers/Settings/Categories.php b/app/Http/Controllers/Settings/Categories.php new file mode 100755 index 0000000..5b856b9 --- /dev/null +++ b/app/Http/Controllers/Settings/Categories.php @@ -0,0 +1,235 @@ + trans_choice('general.expenses', 1), + 'income' => trans_choice('general.incomes', 1), + 'item' => trans_choice('general.items', 1), + 'other' => trans_choice('general.others', 1), + ])->prepend(trans('general.all_type', ['type' => trans_choice('general.types', 2)]), ''); + + return view('settings.categories.index', compact('categories', 'types', 'transfer_id')); + } + + /** + * Show the form for viewing the specified resource. + * + * @return Response + */ + public function show() + { + return redirect('settings/categories'); + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create() + { + $types = [ + 'expense' => trans_choice('general.expenses', 1), + 'income' => trans_choice('general.incomes', 1), + 'item' => trans_choice('general.items', 1), + 'other' => trans_choice('general.others', 1), + ]; + + return view('settings.categories.create', compact('types')); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + Category::create($request->all()); + + $message = trans('messages.success.added', ['type' => trans_choice('general.categories', 1)]); + + flash($message)->success(); + + return redirect('settings/categories'); + } + + /** + * Show the form for editing the specified resource. + * + * @param Category $category + * + * @return Response + */ + public function edit(Category $category) + { + $types = [ + 'expense' => trans_choice('general.expenses', 1), + 'income' => trans_choice('general.incomes', 1), + 'item' => trans_choice('general.items', 1), + 'other' => trans_choice('general.others', 1), + ]; + + $type_disabled = (Category::where('type', $category->type)->count() == 1) ?: false; + + return view('settings.categories.edit', compact('category', 'types', 'type_disabled')); + } + + /** + * Update the specified resource in storage. + * + * @param Category $category + * @param Request $request + * + * @return Response + */ + public function update(Category $category, Request $request) + { + $relationships = $this->countRelationships($category, [ + 'items' => 'items', + 'invoices' => 'invoices', + 'revenues' => 'revenues', + 'bills' => 'bills', + 'payments' => 'payments', + ]); + + if (empty($relationships) || $request['enabled']) { + $category->update($request->all()); + + $message = trans('messages.success.updated', ['type' => trans_choice('general.categories', 1)]); + + flash($message)->success(); + + return redirect('settings/categories'); + } else { + $message = trans('messages.warning.disabled', ['name' => $category->name, 'text' => implode(', ', $relationships)]); + + flash($message)->warning(); + + return redirect('settings/categories/' . $category->id . '/edit'); + } + } + + /** + * Enable the specified resource. + * + * @param Category $category + * + * @return Response + */ + public function enable(Category $category) + { + $category->enabled = 1; + $category->save(); + + $message = trans('messages.success.enabled', ['type' => trans_choice('general.categories', 1)]); + + flash($message)->success(); + + return redirect()->route('categories.index'); + } + + /** + * Disable the specified resource. + * + * @param Category $category + * + * @return Response + */ + public function disable(Category $category) + { + $relationships = $this->countRelationships($category, [ + 'items' => 'items', + 'invoices' => 'invoices', + 'revenues' => 'revenues', + 'bills' => 'bills', + 'payments' => 'payments', + ]); + + if (empty($relationships)) { + $category->enabled = 0; + $category->save(); + + $message = trans('messages.success.disabled', ['type' => trans_choice('general.categories', 1)]); + + flash($message)->success(); + } else { + $message = trans('messages.warning.disabled', ['name' => $category->name, 'text' => implode(', ', $relationships)]); + + flash($message)->warning(); + + return redirect()->route('categories.index'); + } + + return redirect()->route('categories.index'); + } + + /** + * Remove the specified resource from storage. + * + * @param Category $category + * + * @return Response + */ + public function destroy(Category $category) + { + // Can not delete the last category by type + if (Category::where('type', $category->type)->count() == 1) { + $message = trans('messages.error.last_category', ['type' => strtolower(trans_choice('general.' . $category->type . 's', 1))]); + + flash($message)->warning(); + + return redirect('settings/categories'); + } + + $relationships = $this->countRelationships($category, [ + 'items' => 'items', + 'invoices' => 'invoices', + 'revenues' => 'revenues', + 'bills' => 'bills', + 'payments' => 'payments', + ]); + + if (empty($relationships)) { + $category->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.categories', 1)]); + + flash($message)->success(); + } else { + $message = trans('messages.warning.deleted', ['name' => $category->name, 'text' => implode(', ', $relationships)]); + + flash($message)->warning(); + } + + return redirect('settings/categories'); + } + + public function category(Request $request) + { + $category = Category::create($request->all()); + + return response()->json($category); + } +} diff --git a/app/Http/Controllers/Settings/Currencies.php b/app/Http/Controllers/Settings/Currencies.php new file mode 100755 index 0000000..f7c51b7 --- /dev/null +++ b/app/Http/Controllers/Settings/Currencies.php @@ -0,0 +1,299 @@ +toArray(); + + // Prepare codes + $codes = array(); + $currencies = MoneyCurrency::getCurrencies(); + foreach ($currencies as $key => $item) { + // Don't show if already available + if (in_array($key, $current)) { + continue; + } + + $codes[$key] = $key; + } + + return view('settings.currencies.create', compact('codes')); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + // Force the rate to be 1 for default currency + if ($request['default_currency']) { + $request['rate'] = '1'; + } + + Currency::create($request->all()); + + // Update default currency setting + if ($request['default_currency']) { + setting()->set('general.default_currency', $request['code']); + setting()->save(); + } + + $message = trans('messages.success.added', ['type' => trans_choice('general.currencies', 1)]); + + flash($message)->success(); + + return redirect('settings/currencies'); + } + + /** + * Show the form for editing the specified resource. + * + * @param Currency $currency + * + * @return Response + */ + public function edit(Currency $currency) + { + // Get current currencies + $current = Currency::pluck('code')->toArray(); + + // Prepare codes + $codes = array(); + $currencies = MoneyCurrency::getCurrencies(); + foreach ($currencies as $key => $item) { + // Don't show if already available + if (($key != $currency->code) && in_array($key, $current)) { + continue; + } + + $codes[$key] = $key; + } + + // Set default currency + $currency->default_currency = ($currency->code == setting('general.default_currency')) ? 1 : 0; + + return view('settings.currencies.edit', compact('currency', 'codes')); + } + + /** + * Update the specified resource in storage. + * + * @param Currency $currency + * @param Request $request + * + * @return Response + */ + public function update(Currency $currency, Request $request) + { + // Check if we can disable or change the code + if (!$request['enabled'] || ($currency->code != $request['code'])) { + $relationships = $this->countRelationships($currency, [ + 'accounts' => 'accounts', + 'customers' => 'customers', + 'invoices' => 'invoices', + 'revenues' => 'revenues', + 'bills' => 'bills', + 'payments' => 'payments', + ]); + + if ($currency->code == setting('general.default_currency')) { + $relationships[] = strtolower(trans_choice('general.companies', 1)); + } + } + + if (empty($relationships)) { + // Force the rate to be 1 for default currency + if ($request['default_currency']) { + $request['rate'] = '1'; + } + + $currency->update($request->all()); + + // Update default currency setting + if ($request['default_currency']) { + setting()->set('general.default_currency', $request['code']); + setting()->save(); + } + + $message = trans('messages.success.updated', ['type' => trans_choice('general.currencies', 1)]); + + flash($message)->success(); + + return redirect('settings/currencies'); + } else { + $message = trans('messages.warning.disabled', ['name' => $currency->name, 'text' => implode(', ', $relationships)]); + + flash($message)->warning(); + + return redirect('settings/currencies/' . $currency->id . '/edit'); + } + } + + /** + * Enable the specified resource. + * + * @param Currency $currency + * + * @return Response + */ + public function enable(Currency $currency) + { + $currency->enabled = 1; + $currency->save(); + + $message = trans('messages.success.enabled', ['type' => trans_choice('general.currencies', 1)]); + + flash($message)->success(); + + return redirect()->route('currencies.index'); + } + + /** + * Disable the specified resource. + * + * @param Currency $currency + * + * @return Response + */ + public function disable(Currency $currency) + { + $relationships = $this->countRelationships($currency, [ + 'accounts' => 'accounts', + 'customers' => 'customers', + 'invoices' => 'invoices', + 'revenues' => 'revenues', + 'bills' => 'bills', + 'payments' => 'payments', + ]); + + if ($currency->code == setting('general.default_currency')) { + $relationships[] = strtolower(trans_choice('general.companies', 1)); + } + + if (empty($relationships)) { + $currency->enabled = 0; + $currency->save(); + + $message = trans('messages.success.disabled', ['type' => trans_choice('general.currencies', 1)]); + + flash($message)->success(); + } else { + $message = trans('messages.warning.disabled', ['name' => $currency->name, 'text' => implode(', ', $relationships)]); + + flash($message)->warning(); + + return redirect()->route('currencies.index'); + } + + return redirect()->route('currencies.index'); + } + + /** + * Remove the specified resource from storage. + * + * @param Currency $currency + * + * @return Response + */ + public function destroy(Currency $currency) + { + $relationships = $this->countRelationships($currency, [ + 'accounts' => 'accounts', + 'customers' => 'customers', + 'invoices' => 'invoices', + 'revenues' => 'revenues', + 'bills' => 'bills', + 'payments' => 'payments', + ]); + + if ($currency->code == setting('general.default_currency')) { + $relationships[] = strtolower(trans_choice('general.companies', 1)); + } + + if (empty($relationships)) { + $currency->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.currencies', 1)]); + + flash($message)->success(); + } else { + $message = trans('messages.warning.deleted', ['name' => $currency->name, 'text' => implode(', ', $relationships)]); + + flash($message)->warning(); + } + + return redirect('settings/currencies'); + } + + public function currency() + { + $json = new \stdClass(); + + $code = request('code'); + + // Get currency object + $currency = Currency::where('code', $code)->first(); + + // it should be integer for amount mask + $currency->precision = (int) $currency->precision; + + return response()->json($currency); + } + + public function config() + { + $json = new \stdClass(); + + $code = request('code'); + + if ($code) { + $currency = config('money.' . $code); + $currency['symbol_first'] = $currency['symbol_first'] ? 1 : 0; + + $json = (object) $currency; + } + + return response()->json($json); + } +} diff --git a/app/Http/Controllers/Settings/Modules.php b/app/Http/Controllers/Settings/Modules.php new file mode 100755 index 0000000..ae5a2be --- /dev/null +++ b/app/Http/Controllers/Settings/Modules.php @@ -0,0 +1,61 @@ +pluck('value', 'key');*/ + $setting = Setting::all($alias)->map(function($s) use($alias) { + $s->key = str_replace($alias . '.', '', $s->key); + return $s; + })->pluck('value', 'key'); + + $module = Module::findByAlias($alias); + + return view('settings.modules.edit', compact('setting', 'module')); + } + + /** + * Update the specified resource in storage. + * + * @param $alias + * + * @return Response + */ + public function update($alias) + { + $fields = request()->all(); + + $skip_keys = ['company_id', '_method', '_token']; + + foreach ($fields as $key => $value) { + // Don't process unwanted keys + if (in_array($key, $skip_keys)) { + continue; + } + + setting()->set($alias . '.' . $key, $value); + } + + // Save all settings + setting()->save(); + + $message = trans('messages.success.updated', ['type' => trans_choice('general.settings', 2)]); + + flash($message)->success(); + + return redirect('settings/apps/' . $alias); + } +} diff --git a/app/Http/Controllers/Settings/Settings.php b/app/Http/Controllers/Settings/Settings.php new file mode 100755 index 0000000..59dddca --- /dev/null +++ b/app/Http/Controllers/Settings/Settings.php @@ -0,0 +1,177 @@ +pluck('value', 'key');*/ + $setting = Setting::all()->map(function ($s) { + $s->key = str_replace('general.', '', $s->key); + + return $s; + })->pluck('value', 'key'); + + $company_logo = $setting->pull('company_logo'); + + $setting['company_logo'] = Media::find($company_logo); + + $invoice_logo = $setting->pull('invoice_logo'); + + $setting['invoice_logo'] = Media::find($invoice_logo); + + $timezones = $this->getTimezones(); + + $accounts = Account::enabled()->orderBy('name')->pluck('name', 'id'); + + $currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code'); + + $taxes = Tax::enabled()->orderBy('rate')->get()->pluck('title', 'id'); + + $payment_methods = Modules::getPaymentMethods(); + + $date_formats = [ + 'd M Y' => '31 Dec 2017', + 'd F Y' => '31 December 2017', + 'd m Y' => '31 12 2017', + 'm d Y' => '12 31 2017', + 'Y m d' => '2017 12 31', + ]; + + $date_separators = [ + 'dash' => trans('settings.localisation.date.dash'), + 'slash' => trans('settings.localisation.date.slash'), + 'dot' => trans('settings.localisation.date.dot'), + 'comma' => trans('settings.localisation.date.comma'), + 'space' => trans('settings.localisation.date.space'), + ]; + + $email_protocols = [ + 'mail' => trans('settings.email.php'), + 'smtp' => trans('settings.email.smtp.name'), + 'sendmail' => trans('settings.email.sendmail'), + 'log' => trans('settings.email.log'), + ]; + + $percent_positions = [ + 'before' => trans('settings.localisation.percent.before'), + 'after' => trans('settings.localisation.percent.after'), + ]; + + return view('settings.settings.edit', compact( + 'setting', + 'timezones', + 'accounts', + 'currencies', + 'taxes', + 'payment_methods', + 'date_formats', + 'date_separators', + 'email_protocols', + 'percent_positions' + )); + } + + /** + * Update the specified resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function update(Request $request) + { + $fields = $request->all(); + $company_id = $request->get('company_id'); + + if (empty($company_id)) { + $company_id = session('company_id'); + } + + $company = Company::find($company_id); + + $skip_keys = ['company_id', '_method', '_token']; + $file_keys = ['company_logo', 'invoice_logo']; + + $companies = Company::all()->count(); + + foreach ($fields as $key => $value) { + // Don't process unwanted keys + if (in_array($key, $skip_keys)) { + continue; + } + + // Process file uploads + if (in_array($key, $file_keys)) { + // Upload attachment + if ($request->file($key)) { + $media = $this->getMedia($request->file($key), 'settings'); + + $company->attachMedia($media, $key); + + $value = $media->id; + } + + // Prevent reset + if (empty($value)) { + continue; + } + } + + // If only 1 company + if ($companies == 1) { + $this->oneCompany($key, $value); + } + + setting()->set('general.' . $key, $value); + } + + // Save all settings + setting()->save(); + + $message = trans('messages.success.updated', ['type' => trans_choice('general.settings', 2)]); + + flash($message)->success(); + + return redirect('settings/settings'); + } + + protected function oneCompany($key, $value) + { + switch ($key) { + case 'default_locale': + // Change default locale + Installer::updateEnv([ + 'APP_LOCALE' => $value + ]); + break; + case 'session_handler': + // Change session handler + Installer::updateEnv([ + 'SESSION_DRIVER' => $value + ]); + break; + } + } +} diff --git a/app/Http/Controllers/Settings/Taxes.php b/app/Http/Controllers/Settings/Taxes.php new file mode 100755 index 0000000..89cfa59 --- /dev/null +++ b/app/Http/Controllers/Settings/Taxes.php @@ -0,0 +1,188 @@ +all()); + + $message = trans('messages.success.added', ['type' => trans_choice('general.tax_rates', 1)]); + + flash($message)->success(); + + return redirect('settings/taxes'); + } + + /** + * Show the form for editing the specified resource. + * + * @param Tax $tax + * + * @return Response + */ + public function edit(Tax $tax) + { + return view('settings.taxes.edit', compact('tax')); + } + + /** + * Update the specified resource in storage. + * + * @param Tax $tax + * @param Request $request + * + * @return Response + */ + public function update(Tax $tax, Request $request) + { + $relationships = $this->countRelationships($tax, [ + 'items' => 'items', + 'invoice_items' => 'invoices', + 'bill_items' => 'bills', + ]); + + if (empty($relationships) || $request['enabled']) { + $tax->update($request->all()); + + $message = trans('messages.success.updated', ['type' => trans_choice('general.tax_rates', 1)]); + + flash($message)->success(); + + return redirect('settings/taxes'); + } else { + $message = trans('messages.warning.disabled', ['name' => $tax->name, 'text' => implode(', ', $relationships)]); + + flash($message)->warning(); + + return redirect('settings/taxes/' . $tax->id . '/edit'); + } + } + + /** + * Enable the specified resource. + * + * @param Tax $tax + * + * @return Response + */ + public function enable(Tax $tax) + { + $tax->enabled = 1; + $tax->save(); + + $message = trans('messages.success.enabled', ['type' => trans_choice('general.tax_rates', 1)]); + + flash($message)->success(); + + return redirect()->route('taxes.index'); + } + + /** + * Disable the specified resource. + * + * @param Tax $tax + * + * @return Response + */ + public function disable(Tax $tax) + { + $relationships = $this->countRelationships($tax, [ + 'items' => 'items', + 'invoice_items' => 'invoices', + 'bill_items' => 'bills', + ]); + + if (empty($relationships)) { + $tax->enabled = 0; + $tax->save(); + + $message = trans('messages.success.disabled', ['type' => trans_choice('general.tax_rates', 1)]); + + flash($message)->success(); + } else { + $message = trans('messages.warning.disabled', ['name' => $tax->name, 'text' => implode(', ', $relationships)]); + + flash($message)->warning(); + + return redirect()->route('taxes.index'); + } + + return redirect()->route('taxes.index'); + } + + /** + * Remove the specified resource from storage. + * + * @param Tax $tax + * + * @return Response + */ + public function destroy(Tax $tax) + { + $relationships = $this->countRelationships($tax, [ + 'items' => 'items', + 'invoice_items' => 'invoices', + 'bill_items' => 'bills', + ]); + + if (empty($relationships)) { + $tax->delete(); + + $message = trans('messages.success.deleted', ['type' => trans_choice('general.taxes', 1)]); + + flash($message)->success(); + } else { + $message = trans('messages.warning.deleted', ['name' => $tax->name, 'text' => implode(', ', $relationships)]); + + flash($message)->warning(); + } + + return redirect('settings/taxes'); + } +} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php new file mode 100755 index 0000000..7ce07c8 --- /dev/null +++ b/app/Http/Kernel.php @@ -0,0 +1,97 @@ + [ + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + // \Illuminate\Session\Middleware\AuthenticateSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\VerifyCsrfToken::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + \App\Http\Middleware\RedirectIfNotInstalled::class, + \App\Http\Middleware\AddXHeader::class, + 'company.settings', + 'company.currencies', + ], + + 'admin' => [ + 'web', + 'language', + 'auth', + 'adminmenu', + 'permission:read-admin-panel', + ], + + 'customer' => [ + 'web', + 'language', + 'auth', + 'customermenu', + 'permission:read-customer-panel', + ], + + 'api' => [ + 'api.auth', + 'throttle:60,1', + 'bindings', + 'api.company', + 'permission:read-api', + 'company.settings', + 'company.currencies', + ], + ]; + + /** + * The application's route middleware. + * + * These middleware may be assigned to groups or used individually. + * + * @var array + */ + protected $routeMiddleware = [ + 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'adminmenu' => \App\Http\Middleware\AdminMenu::class, + 'customermenu' => \App\Http\Middleware\CustomerMenu::class, + 'role' => \Laratrust\Middleware\LaratrustRole::class, + 'permission' => \Laratrust\Middleware\LaratrustPermission::class, + 'ability' => \Laratrust\Middleware\LaratrustAbility::class, + 'api.company' => \App\Http\Middleware\ApiCompany::class, + 'install' => \App\Http\Middleware\CanInstall::class, + 'company.settings' => \App\Http\Middleware\LoadSettings::class, + 'company.currencies' => \App\Http\Middleware\LoadCurrencies::class, + 'dateformat' => \App\Http\Middleware\DateFormat::class, + 'money' => \App\Http\Middleware\Money::class, + ]; +} diff --git a/app/Http/Middleware/AddXHeader.php b/app/Http/Middleware/AddXHeader.php new file mode 100755 index 0000000..037fd1e --- /dev/null +++ b/app/Http/Middleware/AddXHeader.php @@ -0,0 +1,27 @@ +header('X-Akaunting', 'Free Accounting Software'); + } + + return $response; + } +} \ No newline at end of file diff --git a/app/Http/Middleware/AdminMenu.php b/app/Http/Middleware/AdminMenu.php new file mode 100755 index 0000000..817204b --- /dev/null +++ b/app/Http/Middleware/AdminMenu.php @@ -0,0 +1,207 @@ +style('adminlte'); + + $user = Auth::user(); + $attr = ['icon' => 'fa fa-angle-double-right']; + + // Dashboard + $menu->add([ + 'url' => '/', + 'title' => trans('general.dashboard'), + 'icon' => 'fa fa-dashboard', + 'order' => 1, + ]); + + // Items + if ($user->can('read-common-items')) { + $menu->add([ + 'url' => 'common/items', + 'title' => trans_choice('general.items', 2), + 'icon' => 'fa fa-cubes', + 'order' => 2, + ]); + } + + // Incomes + if ($user->can(['read-incomes-invoices', 'read-incomes-revenues', 'read-incomes-customers'])) { + $menu->dropdown(trans_choice('general.incomes', 2), function ($sub) use($user, $attr) { + if ($user->can('read-incomes-invoices')) { + $sub->url('incomes/invoices', trans_choice('general.invoices', 2), 1, $attr); + } + + if ($user->can('read-incomes-revenues')) { + $sub->url('incomes/revenues', trans_choice('general.revenues', 2), 2, $attr); + } + + if ($user->can('read-incomes-customers')) { + $sub->url('incomes/customers', trans_choice('general.customers', 2), 3, $attr); + } + }, 3, [ + 'title' => trans_choice('general.incomes', 2), + 'icon' => 'fa fa-money', + ]); + } + + // Expences + if ($user->can(['read-expenses-bills', 'read-expenses-payments', 'read-expenses-vendors'])) { + $menu->dropdown(trans_choice('general.expenses', 2), function ($sub) use($user, $attr) { + if ($user->can('read-expenses-bills')) { + $sub->url('expenses/bills', trans_choice('general.bills', 2), 1, $attr); + } + + if ($user->can('read-expenses-payments')) { + $sub->url('expenses/payments', trans_choice('general.payments', 2), 2, $attr); + } + + if ($user->can('read-expenses-vendors')) { + $sub->url('expenses/vendors', trans_choice('general.vendors', 2), 3, $attr); + } + }, 4, [ + 'title' => trans_choice('general.expenses', 2), + 'icon' => 'fa fa-shopping-cart', + ]); + } + + // Banking + if ($user->can(['read-banking-accounts', 'read-banking-transfers', 'read-banking-transactions'])) { + $menu->dropdown(trans('general.banking'), function ($sub) use($user, $attr) { + if ($user->can('read-banking-accounts')) { + $sub->url('banking/accounts', trans_choice('general.accounts', 2), 1, $attr); + } + + if ($user->can('read-banking-transfers')) { + $sub->url('banking/transfers', trans_choice('general.transfers', 2), 2, $attr); + } + + if ($user->can('read-banking-transactions')) { + $sub->url('banking/transactions', trans_choice('general.transactions', 2), 3, $attr); + } + }, 5, [ + 'title' => trans('general.banking'), + 'icon' => 'fa fa-university', + ]); + } + + // Reports + if ($user->can([ + 'read-reports-income-summary', + 'read-reports-expense-summary', + 'read-reports-income-expense-summary', + 'read-reports-tax-summary', + 'read-reports-profit-loss', + ])) { + $menu->dropdown(trans_choice('general.reports', 2), function ($sub) use($user, $attr) { + if ($user->can('read-reports-income-summary')) { + $sub->url('reports/income-summary', trans('reports.summary.income'), 1, $attr); + } + + if ($user->can('read-reports-expense-summary')) { + $sub->url('reports/expense-summary', trans('reports.summary.expense'), 2, $attr); + } + + if ($user->can('read-reports-income-expense-summary')) { + $sub->url('reports/income-expense-summary', trans('reports.summary.income_expense'), 3, $attr); + } + + if ($user->can('read-reports-tax-summary')) { + $sub->url('reports/tax-summary', trans('reports.summary.tax'), 4, $attr); + } + + if ($user->can('read-reports-profit-loss')) { + $sub->url('reports/profit-loss', trans('reports.profit_loss'), 5, $attr); + } + }, 6, [ + 'title' => trans_choice('general.reports', 2), + 'icon' => 'fa fa-bar-chart', + ]); + } + + // Settings + if ($user->can(['read-settings-settings', 'read-settings-categories', 'read-settings-currencies', 'read-settings-taxes'])) { + $menu->dropdown(trans_choice('general.settings', 2), function ($sub) use($user, $attr) { + if ($user->can('read-settings-settings')) { + $sub->url('settings/settings', trans('general.general'), 1, $attr); + } + + if ($user->can('read-settings-categories')) { + $sub->url('settings/categories', trans_choice('general.categories', 2), 2, $attr); + } + + if ($user->can('read-settings-currencies')) { + $sub->url('settings/currencies', trans_choice('general.currencies', 2), 3, $attr); + } + + if ($user->can('read-settings-taxes')) { + $sub->url('settings/taxes', trans_choice('general.tax_rates', 2), 4, $attr); + } + + // Modules + $modules = Module::all(); + $position = 5; + foreach ($modules as $module) { + if (!$module->status) { + continue; + } + + $m = LaravelModule::findByAlias($module->alias); + + // Check if the module exists and has settings + if (!$m || empty($m->get('settings'))) { + continue; + } + + $sub->url('settings/apps/' . $module->alias, title_case(str_replace('_', ' ', snake_case($m->getName()))), $position, $attr); + + $position++; + } + }, 7, [ + 'title' => trans_choice('general.settings', 2), + 'icon' => 'fa fa-gears', + ]); + } + + // Apps + if ($user->can('read-modules-home')) { + $menu->add([ + 'url' => 'apps/home', + 'title' => trans_choice('general.modules', 2), + 'icon' => 'fa fa-rocket', + 'order' => 8, + ]); + } + + // Fire the event to extend the menu + event(new AdminMenuCreated($menu)); + }); + + return $next($request); + } +} \ No newline at end of file diff --git a/app/Http/Middleware/ApiCompany.php b/app/Http/Middleware/ApiCompany.php new file mode 100755 index 0000000..b054ddd --- /dev/null +++ b/app/Http/Middleware/ApiCompany.php @@ -0,0 +1,40 @@ +get('company_id'); + + if (empty($company_id)) { + return $next($request); + } + + // Check if user can access company + $companies = app('Dingo\Api\Auth\Auth')->user()->companies()->pluck('id')->toArray(); + if (!in_array($company_id, $companies)) { + return $next($request); + } + + // Set company id + session(['company_id' => $company_id]); + + // Set the company settings + setting()->setExtraColumns(['company_id' => $company_id]); + setting()->load(true); + + return $next($request); + } + +} \ No newline at end of file diff --git a/app/Http/Middleware/CanInstall.php b/app/Http/Middleware/CanInstall.php new file mode 100755 index 0000000..1ef2161 --- /dev/null +++ b/app/Http/Middleware/CanInstall.php @@ -0,0 +1,26 @@ +send(); + } +} diff --git a/app/Http/Middleware/CustomerMenu.php b/app/Http/Middleware/CustomerMenu.php new file mode 100755 index 0000000..fdf842a --- /dev/null +++ b/app/Http/Middleware/CustomerMenu.php @@ -0,0 +1,69 @@ +style('adminlte'); + + $user = Auth::user(); + + // Dashboard + $menu->add([ + 'url' => 'customers/', + 'title' => trans('general.dashboard'), + 'icon' => 'fa fa-dashboard', + 'order' => 1, + ]); + + // Invoices + $menu->add([ + 'url' => 'customers/invoices', + 'title' => trans_choice('general.invoices', 2), + 'icon' => 'fa fa-wpforms', + 'order' => 2, + ]); + + // Payments + $menu->add([ + 'url' => 'customers/payments', + 'title' => trans_choice('general.payments', 2), + 'icon' => 'fa fa-money', + 'order' => 3, + ]); + + // Payments + $menu->add([ + 'url' => 'customers/transactions', + 'title' => trans_choice('general.transactions', 2), + 'icon' => 'fa fa-list', + 'order' => 4, + ]); + + // Fire the event to extend the menu + event(new CustomerMenuCreated($menu)); + }); + + return $next($request); + } +} diff --git a/app/Http/Middleware/DateFormat.php b/app/Http/Middleware/DateFormat.php new file mode 100755 index 0000000..b308637 --- /dev/null +++ b/app/Http/Middleware/DateFormat.php @@ -0,0 +1,37 @@ +method() == 'POST') || ($request->method() == 'PATCH')) { + $fields = ['paid_at', 'due_at', 'billed_at', 'invoiced_at']; + + foreach ($fields as $field) { + $date = $request->get($field); + + if (empty($date)) { + continue; + } + + $new_date = Date::parse($date)->format('Y-m-d') . ' ' . Date::now()->format('H:i:s'); + + $request->request->set($field, $new_date); + } + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php new file mode 100755 index 0000000..3aa15f8 --- /dev/null +++ b/app/Http/Middleware/EncryptCookies.php @@ -0,0 +1,17 @@ +method() == 'POST' || $request->method() == 'PATCH') { + $amount = $request->get('amount'); + $bill_number = $request->get('bill_number'); + $invoice_number = $request->get('invoice_number'); + $sale_price = $request->get('sale_price'); + $purchase_price = $request->get('purchase_price'); + $opening_balance = $request->get('opening_balance'); + $currency_code = $request->get('currency_code'); + $items = $request->get('item'); + + if (empty($currency_code)) { + $currency_code = setting('general.default_currency'); + } + + if (!empty($amount)) { + $amount = money($request->get('amount'), $currency_code)->getAmount(); + + $request->request->set('amount', $amount); + } + + if (isset($bill_number) || isset($invoice_number) || !empty($items)) { + if (!empty($items)) { + foreach ($items as $key => $item) { + if (!isset($item['price'])) { + continue; + } + + if (isset($item['currency']) && $item['currency'] != $currency_code) { + $items[$key]['price'] = money($item['price'], $item['currency'])->getAmount(); + } else { + $items[$key]['price'] = money($item['price'], $currency_code)->getAmount(); + } + } + + $request->request->set('item', $items); + } + } + + if (isset($opening_balance)) { + $opening_balance = money($opening_balance, $currency_code)->getAmount(); + + $request->request->set('opening_balance', $opening_balance); + } + + /* check item price use money + if (isset($sale_price)) { + $sale_price = money($sale_price, $currency_code)->getAmount(); + + $request->request->set('sale_price', $sale_price); + } + + if (isset($purchase_price)) { + $purchase_price = money($purchase_price, $currency_code)->getAmount(); + + $request->request->set('purchase_price', $purchase_price); + } + */ + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php new file mode 100755 index 0000000..95d4172 --- /dev/null +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -0,0 +1,30 @@ +check()) { + if (Auth::user()->customer) { + return redirect('/customers'); + } + + return redirect('/'); + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/RedirectIfNotInstalled.php b/app/Http/Middleware/RedirectIfNotInstalled.php new file mode 100755 index 0000000..cff90ac --- /dev/null +++ b/app/Http/Middleware/RedirectIfNotInstalled.php @@ -0,0 +1,32 @@ +getPathInfo(), '/install')) { + return $next($request); + } + + // Not installed, redirect to installation wizard + redirect('install/requirements')->send(); + } +} diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php new file mode 100755 index 0000000..943e9a4 --- /dev/null +++ b/app/Http/Middleware/TrimStrings.php @@ -0,0 +1,18 @@ +getMethod() == 'PATCH') { + $id = $this->role->getAttribute('id'); + } else { + $id = null; + } + + return [ + 'name' => 'required|string|unique:permissions,name,' . $id, + 'display_name' => 'required|string', + ]; + } +} diff --git a/app/Http/Requests/Auth/Role.php b/app/Http/Requests/Auth/Role.php new file mode 100755 index 0000000..31873e5 --- /dev/null +++ b/app/Http/Requests/Auth/Role.php @@ -0,0 +1,39 @@ +getMethod() == 'PATCH') { + $id = $this->role->getAttribute('id'); + } else { + $id = null; + } + + return [ + 'name' => 'required|string|unique:roles,name,' . $id, + 'display_name' => 'required|string', + 'permissions' => 'required' + ]; + } +} diff --git a/app/Http/Requests/Auth/User.php b/app/Http/Requests/Auth/User.php new file mode 100755 index 0000000..a1414f1 --- /dev/null +++ b/app/Http/Requests/Auth/User.php @@ -0,0 +1,44 @@ +getMethod() == 'PATCH') { + $id = $this->user->getAttribute('id'); + $required = ''; + } else { + $id = null; + $required = 'required|'; + } + + return [ + 'name' => 'required|string', + 'email' => 'required|email|unique:users,email,' . $id . ',id,deleted_at,NULL', + 'password' => $required . 'confirmed', + 'companies' => 'required', + 'roles' => 'required', + 'picture' => 'mimes:' . setting('general.file_types') . '|between:0,' . setting('general.file_size') * 1024, + ]; + } +} diff --git a/app/Http/Requests/Banking/Account.php b/app/Http/Requests/Banking/Account.php new file mode 100755 index 0000000..25e0f53 --- /dev/null +++ b/app/Http/Requests/Banking/Account.php @@ -0,0 +1,34 @@ + 'required|string', + 'number' => 'required|string', + 'currency_code' => 'required|string|currency', + 'opening_balance' => 'required', + 'enabled' => 'integer|boolean', + ]; + } +} diff --git a/app/Http/Requests/Banking/Transfer.php b/app/Http/Requests/Banking/Transfer.php new file mode 100755 index 0000000..405d097 --- /dev/null +++ b/app/Http/Requests/Banking/Transfer.php @@ -0,0 +1,34 @@ + 'required|integer', + 'to_account_id' => 'required|integer', + 'amount' => 'required|amount', + 'transferred_at' => 'required|date_format:Y-m-d', + 'payment_method' => 'required|string', + ]; + } +} diff --git a/app/Http/Requests/Common/Company.php b/app/Http/Requests/Common/Company.php new file mode 100755 index 0000000..70c6443 --- /dev/null +++ b/app/Http/Requests/Common/Company.php @@ -0,0 +1,34 @@ + 'required|string', + 'company_name' => 'required|string', + 'company_email' => 'required|email', + 'company_logo' => 'mimes:' . setting('general.file_types') . '|between:0,' . setting('general.file_size') * 1024, + 'default_currency' => 'required|string', + ]; + } +} diff --git a/app/Http/Requests/Common/Item.php b/app/Http/Requests/Common/Item.php new file mode 100755 index 0000000..3b2f4a5 --- /dev/null +++ b/app/Http/Requests/Common/Item.php @@ -0,0 +1,48 @@ +getMethod() == 'PATCH') { + $id = $this->item->getAttribute('id'); + } else { + $id = null; + } + + // Get company id + $company_id = $this->request->get('company_id'); + + return [ + 'name' => 'required|string', + 'sku' => 'required|string|unique:items,NULL,' . $id . ',id,company_id,' . $company_id . ',deleted_at,NULL', + 'sale_price' => 'required', + 'purchase_price' => 'required', + 'quantity' => 'required|integer', + 'tax_id' => 'nullable|integer', + 'category_id' => 'nullable|integer', + 'enabled' => 'integer|boolean', + 'picture' => 'mimes:' . setting('general.file_types') . '|between:0,' . setting('general.file_size') * 1024, + ]; + } +} diff --git a/app/Http/Requests/Common/TotalItem.php b/app/Http/Requests/Common/TotalItem.php new file mode 100755 index 0000000..9e6f816 --- /dev/null +++ b/app/Http/Requests/Common/TotalItem.php @@ -0,0 +1,42 @@ + 'required', + 'item.*.price' => 'required|amount', + 'item.*.currency' => 'required|string|currency', + ]; + } + + public function messages() + { + return [ + 'item.*.quantity.required' => trans('validation.required', ['attribute' => mb_strtolower(trans('invoices.quantity'))]), + 'item.*.price.required' => trans('validation.required', ['attribute' => mb_strtolower(trans('invoices.price'))]), + 'item.*.currency.required' => trans('validation.custom.invalid_currency'), + 'item.*.currency.string' => trans('validation.custom.invalid_currency'), + ]; + } +} diff --git a/app/Http/Requests/Customer/InvoiceConfirm.php b/app/Http/Requests/Customer/InvoiceConfirm.php new file mode 100755 index 0000000..0199f62 --- /dev/null +++ b/app/Http/Requests/Customer/InvoiceConfirm.php @@ -0,0 +1,30 @@ + 'required|string', + ]; + } +} diff --git a/app/Http/Requests/Customer/InvoicePayment.php b/app/Http/Requests/Customer/InvoicePayment.php new file mode 100755 index 0000000..263a75f --- /dev/null +++ b/app/Http/Requests/Customer/InvoicePayment.php @@ -0,0 +1,30 @@ + 'required|string', + ]; + } +} diff --git a/app/Http/Requests/Customer/Profile.php b/app/Http/Requests/Customer/Profile.php new file mode 100755 index 0000000..45b7297 --- /dev/null +++ b/app/Http/Requests/Customer/Profile.php @@ -0,0 +1,35 @@ +user()->getAttribute('id'); + + return [ + 'name' => 'required|string', + 'email' => 'required|email|unique:users,email,' . $id . ',id,deleted_at,NULL', + 'password' => 'confirmed', + 'picture' => 'mimes:' . setting('general.file_types') . '|between:0,' . setting('general.file_size') * 1024, + ]; + } +} diff --git a/app/Http/Requests/Expense/Bill.php b/app/Http/Requests/Expense/Bill.php new file mode 100755 index 0000000..bfcc8aa --- /dev/null +++ b/app/Http/Requests/Expense/Bill.php @@ -0,0 +1,78 @@ +getMethod() == 'PATCH') { + $id = $this->bill->getAttribute('id'); + } else { + $id = null; + } + + // Get company id + $company_id = $this->request->get('company_id'); + + return [ + 'bill_number' => 'required|string|unique:bills,NULL,' . $id . ',id,company_id,' . $company_id . ',deleted_at,NULL', + 'bill_status_code' => 'required|string', + 'billed_at' => 'required|date_format:Y-m-d H:i:s', + 'due_at' => 'required|date_format:Y-m-d H:i:s', + 'amount' => 'required', + 'item.*.name' => 'required|string', + 'item.*.quantity' => 'required', + 'item.*.price' => 'required|amount', + 'item.*.currency' => 'required|string|currency', + 'currency_code' => 'required|string|currency', + 'currency_rate' => 'required', + 'vendor_id' => 'required|integer', + 'vendor_name' => 'required|string', + 'category_id' => 'required|integer', + 'attachment' => 'mimes:' . setting('general.file_types') . '|between:0,' . setting('general.file_size') * 1024, + ]; + } + + public function withValidator($validator) + { + if ($validator->errors()->count()) { + // Set date + $billed_at = Date::parse($this->request->get('billed_at'))->format('Y-m-d'); + $due_at = Date::parse($this->request->get('due_at'))->format('Y-m-d'); + + $this->request->set('billed_at', $billed_at); + $this->request->set('due_at', $due_at); + } + } + + public function messages() + { + return [ + 'item.*.name.required' => trans('validation.required', ['attribute' => mb_strtolower(trans('general.name'))]), + 'item.*.quantity.required' => trans('validation.required', ['attribute' => mb_strtolower(trans('bills.quantity'))]), + 'item.*.price.required' => trans('validation.required', ['attribute' => mb_strtolower(trans('bills.price'))]), + 'item.*.currency.required' => trans('validation.custom.invalid_currency'), + 'item.*.currency.string' => trans('validation.custom.invalid_currency'), + ]; + } +} diff --git a/app/Http/Requests/Expense/BillHistory.php b/app/Http/Requests/Expense/BillHistory.php new file mode 100755 index 0000000..6c58f3d --- /dev/null +++ b/app/Http/Requests/Expense/BillHistory.php @@ -0,0 +1,32 @@ + 'required|integer', + 'status_code' => 'required|string', + 'notify' => 'required|integer', + ]; + } +} diff --git a/app/Http/Requests/Expense/BillItem.php b/app/Http/Requests/Expense/BillItem.php new file mode 100755 index 0000000..316b3b7 --- /dev/null +++ b/app/Http/Requests/Expense/BillItem.php @@ -0,0 +1,37 @@ + 'required|integer', + 'name' => 'required|string', + 'quantity' => 'required|integer', + 'price' => 'required', + 'price' => 'required', + 'total' => 'required', + 'tax' => 'required', + 'tax_id' => 'required', + ]; + } +} diff --git a/app/Http/Requests/Expense/BillPayment.php b/app/Http/Requests/Expense/BillPayment.php new file mode 100755 index 0000000..dd88c4d --- /dev/null +++ b/app/Http/Requests/Expense/BillPayment.php @@ -0,0 +1,45 @@ + 'required|integer', + 'paid_at' => 'required|date_format:Y-m-d H:i:s', + 'amount' => 'required|amount', + 'currency_code' => 'required|string|currency', + 'payment_method' => 'required|string', + 'attachment' => 'mimes:' . setting('general.file_types', 'pdf,jpeg,jpg,png'), + ]; + } + + public function withValidator($validator) + { + if ($validator->errors()->count()) { + $paid_at = Date::parse($this->request->get('paid_at'))->format('Y-m-d'); + + $this->request->set('paid_at', $paid_at); + } + } +} diff --git a/app/Http/Requests/Expense/BillTotal.php b/app/Http/Requests/Expense/BillTotal.php new file mode 100755 index 0000000..657f1fb --- /dev/null +++ b/app/Http/Requests/Expense/BillTotal.php @@ -0,0 +1,33 @@ + 'required|integer', + 'name' => 'required|string', + 'amount' => 'required|amount', + 'sort_order' => 'required|integer', + ]; + } +} diff --git a/app/Http/Requests/Expense/Payment.php b/app/Http/Requests/Expense/Payment.php new file mode 100755 index 0000000..984c13f --- /dev/null +++ b/app/Http/Requests/Expense/Payment.php @@ -0,0 +1,48 @@ + 'required|integer', + 'paid_at' => 'required|date_format:Y-m-d H:i:s', + 'amount' => 'required|amount', + 'currency_code' => 'required|string|currency', + 'currency_rate' => 'required', + 'vendor_id' => 'nullable|integer', + 'category_id' => 'required|integer', + 'payment_method' => 'required|string', + 'attachment' => 'mimes:' . setting('general.file_types') . '|between:0,' . setting('general.file_size') * 1024, + ]; + } + + public function withValidator($validator) + { + if ($validator->errors()->count()) { + $paid_at = Date::parse($this->request->get('paid_at'))->format('Y-m-d'); + + $this->request->set('paid_at', $paid_at); + } + } +} diff --git a/app/Http/Requests/Expense/Vendor.php b/app/Http/Requests/Expense/Vendor.php new file mode 100755 index 0000000..9b4d1ea --- /dev/null +++ b/app/Http/Requests/Expense/Vendor.php @@ -0,0 +1,50 @@ +request->get('company_id'); + + // Check if store or update + if ($this->getMethod() == 'PATCH') { + $id = $this->vendor->getAttribute('id'); + } else { + $id = null; + } + + if (!empty($this->request->get('email'))) { + $email = 'email|unique:vendors,NULL,' . $id . ',id,company_id,' . $company_id . ',deleted_at,NULL'; + } + + return [ + 'user_id' => 'nullable|integer', + 'name' => 'required|string', + 'email' => $email, + 'currency_code' => 'required|string|currency', + 'enabled' => 'integer|boolean', + ]; + } +} diff --git a/app/Http/Requests/Income/Customer.php b/app/Http/Requests/Income/Customer.php new file mode 100755 index 0000000..f57b4ab --- /dev/null +++ b/app/Http/Requests/Income/Customer.php @@ -0,0 +1,56 @@ +request->get('company_id'); + + // Check if store or update + if ($this->getMethod() == 'PATCH') { + $id = $this->customer->getAttribute('id'); + } else { + $id = null; + } + + if (!empty($this->request->get('create_user')) && empty($this->request->get('user_id'))) { + $required = 'required|'; + } + + if (!empty($this->request->get('email'))) { + $email = 'email|unique:customers,NULL,' . $id . ',id,company_id,' . $company_id . ',deleted_at,NULL'; + } + + return [ + 'user_id' => 'nullable|integer', + 'name' => 'required|string', + 'email' => $email, + 'currency_code' => 'required|string|currency', + 'password' => $required . 'confirmed', + 'enabled' => 'integer|boolean', + ]; + } +} diff --git a/app/Http/Requests/Income/Invoice.php b/app/Http/Requests/Income/Invoice.php new file mode 100755 index 0000000..ea61e15 --- /dev/null +++ b/app/Http/Requests/Income/Invoice.php @@ -0,0 +1,78 @@ +getMethod() == 'PATCH') { + $id = $this->invoice->getAttribute('id'); + } else { + $id = null; + } + + // Get company id + $company_id = $this->request->get('company_id'); + + return [ + 'invoice_number' => 'required|string|unique:invoices,NULL,' . $id . ',id,company_id,' . $company_id . ',deleted_at,NULL', + 'invoice_status_code' => 'required|string', + 'invoiced_at' => 'required|date_format:Y-m-d H:i:s', + 'due_at' => 'required|date_format:Y-m-d H:i:s', + 'amount' => 'required', + 'item.*.name' => 'required|string', + 'item.*.quantity' => 'required', + 'item.*.price' => 'required|amount', + 'item.*.currency' => 'required|string|currency', + 'currency_code' => 'required|string|currency', + 'currency_rate' => 'required', + 'customer_id' => 'required|integer', + 'customer_name' => 'required|string', + 'category_id' => 'required|integer', + 'attachment' => 'mimes:' . setting('general.file_types') . '|between:0,' . setting('general.file_size') * 1024, + ]; + } + + public function withValidator($validator) + { + if ($validator->errors()->count()) { + // Set date + $invoiced_at = Date::parse($this->request->get('invoiced_at'))->format('Y-m-d'); + $due_at = Date::parse($this->request->get('due_at'))->format('Y-m-d'); + + $this->request->set('invoiced_at', $invoiced_at); + $this->request->set('due_at', $due_at); + } + } + + public function messages() + { + return [ + 'item.*.name.required' => trans('validation.required', ['attribute' => mb_strtolower(trans('general.name'))]), + 'item.*.quantity.required' => trans('validation.required', ['attribute' => mb_strtolower(trans('invoices.quantity'))]), + 'item.*.price.required' => trans('validation.required', ['attribute' => mb_strtolower(trans('invoices.price'))]), + 'item.*.currency.required' => trans('validation.custom.invalid_currency'), + 'item.*.currency.string' => trans('validation.custom.invalid_currency'), + ]; + } +} diff --git a/app/Http/Requests/Income/InvoiceHistory.php b/app/Http/Requests/Income/InvoiceHistory.php new file mode 100755 index 0000000..6381055 --- /dev/null +++ b/app/Http/Requests/Income/InvoiceHistory.php @@ -0,0 +1,32 @@ + 'required|integer', + 'status_code' => 'required|string', + 'notify' => 'required|integer', + ]; + } +} diff --git a/app/Http/Requests/Income/InvoiceItem.php b/app/Http/Requests/Income/InvoiceItem.php new file mode 100755 index 0000000..77776c2 --- /dev/null +++ b/app/Http/Requests/Income/InvoiceItem.php @@ -0,0 +1,36 @@ + 'required|integer', + 'name' => 'required|string', + 'quantity' => 'required|integer', + 'price' => 'required', + 'total' => 'required', + 'tax' => 'required', + 'tax_id' => 'required', + ]; + } +} diff --git a/app/Http/Requests/Income/InvoicePayment.php b/app/Http/Requests/Income/InvoicePayment.php new file mode 100755 index 0000000..40b11aa --- /dev/null +++ b/app/Http/Requests/Income/InvoicePayment.php @@ -0,0 +1,45 @@ + 'required|integer', + 'paid_at' => 'required|date_format:Y-m-d H:i:s', + 'amount' => 'required|amount', + 'currency_code' => 'required|string|currency', + 'payment_method' => 'required|string', + 'attachment' => 'mimes:jpeg,jpg,png,pdf', + ]; + } + + public function withValidator($validator) + { + if ($validator->errors()->count()) { + $paid_at = Date::parse($this->request->get('paid_at'))->format('Y-m-d'); + + $this->request->set('paid_at', $paid_at); + } + } +} diff --git a/app/Http/Requests/Income/InvoiceTotal.php b/app/Http/Requests/Income/InvoiceTotal.php new file mode 100755 index 0000000..a85cb50 --- /dev/null +++ b/app/Http/Requests/Income/InvoiceTotal.php @@ -0,0 +1,33 @@ + 'required|integer', + 'name' => 'required|string', + 'amount' => 'required|amount', + 'sort_order' => 'required|integer', + ]; + } +} diff --git a/app/Http/Requests/Income/Revenue.php b/app/Http/Requests/Income/Revenue.php new file mode 100755 index 0000000..2aaa61d --- /dev/null +++ b/app/Http/Requests/Income/Revenue.php @@ -0,0 +1,48 @@ + 'required|integer', + 'paid_at' => 'required|date_format:Y-m-d H:i:s', + 'amount' => 'required|amount', + 'currency_code' => 'required|string|currency', + 'currency_rate' => 'required', + 'customer_id' => 'nullable|integer', + 'category_id' => 'required|integer', + 'payment_method' => 'required|string', + 'attachment' => 'mimes:' . setting('general.file_types') . '|between:0,' . setting('general.file_size') * 1024, + ]; + } + + public function withValidator($validator) + { + if ($validator->errors()->count()) { + $paid_at = Date::parse($this->request->get('paid_at'))->format('Y-m-d'); + + $this->request->set('paid_at', $paid_at); + } + } +} diff --git a/app/Http/Requests/Install/Database.php b/app/Http/Requests/Install/Database.php new file mode 100755 index 0000000..9564fca --- /dev/null +++ b/app/Http/Requests/Install/Database.php @@ -0,0 +1,32 @@ + 'required', + 'username' => 'required', + 'database' => 'required' + ]; + } +} diff --git a/app/Http/Requests/Install/Setting.php b/app/Http/Requests/Install/Setting.php new file mode 100755 index 0000000..30d1842 --- /dev/null +++ b/app/Http/Requests/Install/Setting.php @@ -0,0 +1,33 @@ + 'required', + 'company_email' => 'required', + 'user_email' => 'required', + 'user_password' => 'required' + ]; + } +} diff --git a/app/Http/Requests/Module/Module.php b/app/Http/Requests/Module/Module.php new file mode 100755 index 0000000..8eb31b4 --- /dev/null +++ b/app/Http/Requests/Module/Module.php @@ -0,0 +1,47 @@ +extend( + 'check', + function ($attribute, $value, $parameters) { + return $this->checkToken($value); + }, + trans('messages.error.invalid_token') + ); + + } + + /** + * Determine if the user is authorized to make this request. + * + * @return bool + */ + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'api_token' => 'required|string|check', + ]; + } +} diff --git a/app/Http/Requests/Request.php b/app/Http/Requests/Request.php new file mode 100755 index 0000000..65f4ad8 --- /dev/null +++ b/app/Http/Requests/Request.php @@ -0,0 +1,28 @@ +all(); + + // Add active company id + $data['company_id'] = session('company_id'); + + // Reset the request data + $this->getInputSource()->replace($data); + + return parent::getValidatorInstance(); + } +} diff --git a/app/Http/Requests/Setting/Category.php b/app/Http/Requests/Setting/Category.php new file mode 100755 index 0000000..8ba8f67 --- /dev/null +++ b/app/Http/Requests/Setting/Category.php @@ -0,0 +1,32 @@ + 'required|string', + 'type' => 'required|string', + 'color' => 'required|string', + ]; + } +} diff --git a/app/Http/Requests/Setting/Currency.php b/app/Http/Requests/Setting/Currency.php new file mode 100755 index 0000000..3d9f9e6 --- /dev/null +++ b/app/Http/Requests/Setting/Currency.php @@ -0,0 +1,45 @@ +getMethod() == 'PATCH') { + $id = $this->currency->getAttribute('id'); + } else { + $id = null; + } + + // Get company id + $company_id = $this->request->get('company_id'); + + return [ + 'name' => 'required|string', + 'code' => 'required|string|unique:currencies,NULL,' . $id . ',id,company_id,' . $company_id . ',deleted_at,NULL', + 'rate' => 'required', + 'enabled' => 'integer|boolean', + 'default_currency' => 'boolean', + 'symbol_first' => 'nullable|boolean', + ]; + } +} diff --git a/app/Http/Requests/Setting/Setting.php b/app/Http/Requests/Setting/Setting.php new file mode 100755 index 0000000..9f438fe --- /dev/null +++ b/app/Http/Requests/Setting/Setting.php @@ -0,0 +1,32 @@ + 'required|string', + 'company_email' => 'required|email', + 'company_logo' => 'mimes:' . setting('general.file_types', 'pdf,jpeg,jpg,png'), + ]; + } +} diff --git a/app/Http/Requests/Setting/Tax.php b/app/Http/Requests/Setting/Tax.php new file mode 100755 index 0000000..15645d2 --- /dev/null +++ b/app/Http/Requests/Setting/Tax.php @@ -0,0 +1,31 @@ + 'required|string', + 'rate' => 'required|min:0|max:100', + ]; + } +} diff --git a/app/Http/ViewComposers/All.php b/app/Http/ViewComposers/All.php new file mode 100755 index 0000000..afa649a --- /dev/null +++ b/app/Http/ViewComposers/All.php @@ -0,0 +1,26 @@ +with(['date_format' => $this->getCompanyDateFormat()]); + } + } +} diff --git a/app/Http/ViewComposers/Header.php b/app/Http/ViewComposers/Header.php new file mode 100755 index 0000000..2a6d9cb --- /dev/null +++ b/app/Http/ViewComposers/Header.php @@ -0,0 +1,75 @@ +customer()) { + $company = (object)[ + 'company_name' => setting('general.company_name'), + 'company_email' => setting('general.company_email'), + 'company_address' => setting('general.company_address'), + 'company_logo' => setting('general.company_logo'), + ]; + } + + $undereads = $user->unreadNotifications; + + foreach ($undereads as $underead) { + $data = $underead->getAttribute('data'); + + switch ($underead->getAttribute('type')) { + case 'App\Notifications\Expense\Bill': + $bills[$data['bill_id']] = $data['amount']; + $notifications++; + break; + case 'App\Notifications\Income\Invoice': + $invoices[$data['invoice_id']] = $data['amount']; + $notifications++; + break; + case 'App\Notifications\Common\Item': + $items[$data['item_id']] = $data['name']; + $notifications++; + break; + } + } + + $updates = count(Updater::all()); + + $this->loadSuggestions(); + + $view->with([ + 'user' => $user, + 'notifications' => $notifications, + 'bills' => $bills, + 'invoices' => $invoices, + 'items' => $items, + 'company' => $company, + 'updates' => $updates, + ]); + } +} diff --git a/app/Http/ViewComposers/Index.php b/app/Http/ViewComposers/Index.php new file mode 100755 index 0000000..105fb64 --- /dev/null +++ b/app/Http/ViewComposers/Index.php @@ -0,0 +1,33 @@ + '10', '25' => '25', '50' => '50', '100' => '100']; + + $now = Date::now(); + + $this_year = $now->year; + + $years = []; + $y = $now->addYears(2); + for ($i = 0; $i < 10; $i++) { + $years[$y->year] = $y->year; + $y->subYear(); + } + + $view->with(['limits' => $limits, 'this_year' => $this_year, 'years' => $years]); + } +} diff --git a/app/Http/ViewComposers/Logo.php b/app/Http/ViewComposers/Logo.php new file mode 100755 index 0000000..8d3b7f6 --- /dev/null +++ b/app/Http/ViewComposers/Logo.php @@ -0,0 +1,54 @@ +getDiskPath()); + + if (!is_file($path)) { + return $logo; + } + } else { + $path = asset('public/img/company.png'); + } + + $image = Image::make($path)->encode()->getEncoded(); + + if (empty($image)) { + return $logo; + } + + $extension = File::extension($path); + + $logo = 'data:image/' . $extension . ';base64,' . base64_encode($image); + + $view->with(['logo' => $logo]); + } +} diff --git a/app/Http/ViewComposers/Menu.php b/app/Http/ViewComposers/Menu.php new file mode 100755 index 0000000..7c8dd8d --- /dev/null +++ b/app/Http/ViewComposers/Menu.php @@ -0,0 +1,33 @@ +user(); + + // Get all companies + $companies = $user->companies()->enabled()->limit(10)->get()->each(function ($com) { + $com->setSettings(); + })->sortBy('name'); + + // Get customer + if ($user->customer) { + $customer = $user; + } + + $view->with(['companies' => $companies, 'customer' => $customer]); + } +} diff --git a/app/Http/ViewComposers/Modules.php b/app/Http/ViewComposers/Modules.php new file mode 100755 index 0000000..1b02c93 --- /dev/null +++ b/app/Http/ViewComposers/Modules.php @@ -0,0 +1,35 @@ +addHour(6), function () { + return collect($this->getCategories())->pluck('name', 'slug') + ->prepend(trans('general.all_type', ['type' => trans_choice('general.categories', 2)]), ''); + }); + } else { + $categories = collect([ + '' => trans('general.all_type', ['type' => trans_choice('general.categories', 2)]), + ]); + } + + $view->with(['categories' => $categories]); + } +} diff --git a/app/Http/ViewComposers/Recurring.php b/app/Http/ViewComposers/Recurring.php new file mode 100755 index 0000000..81063b1 --- /dev/null +++ b/app/Http/ViewComposers/Recurring.php @@ -0,0 +1,36 @@ + trans('general.no'), + 'daily' => trans('recurring.daily'), + 'weekly' => trans('recurring.weekly'), + 'monthly' => trans('recurring.monthly'), + 'yearly' => trans('recurring.yearly'), + 'custom' => trans('recurring.custom'), + ]; + + $recurring_custom_frequencies = [ + 'daily' => trans('recurring.days'), + 'weekly' => trans('recurring.weeks'), + 'monthly' => trans('recurring.months'), + 'yearly' => trans('recurring.years'), + ]; + + $view->with(['recurring_frequencies' => $recurring_frequencies, 'recurring_custom_frequencies' => $recurring_custom_frequencies]); + } +} diff --git a/app/Http/ViewComposers/Suggestions.php b/app/Http/ViewComposers/Suggestions.php new file mode 100755 index 0000000..f665daf --- /dev/null +++ b/app/Http/ViewComposers/Suggestions.php @@ -0,0 +1,55 @@ +runningInConsole() || !env('APP_INSTALLED')) { + return; + } + + $modules = false; + + $path = Route::current()->uri(); + + if ($path) { + $suggestions = $this->getSuggestions($path); + + if ($suggestions) { + $suggestion_modules = $suggestions->modules; + + foreach ($suggestion_modules as $key => $module) { + $installed = Module::where('company_id', '=', session('company_id'))->where('alias', '=', $module->alias)->first(); + + if ($installed) { + unset($suggestion_modules[$key]); + } + } + + if ($suggestion_modules) { + shuffle($suggestion_modules); + + $modules[] = $suggestion_modules[0]; + } + } + } + + $view->with(['suggestion_modules' => $modules]); + } +} diff --git a/app/Listeners/Auth/Login.php b/app/Listeners/Auth/Login.php new file mode 100755 index 0000000..a2dce9c --- /dev/null +++ b/app/Listeners/Auth/Login.php @@ -0,0 +1,39 @@ +user->companies()->enabled()->first(); + + // Logout if no company assigned + if (!$company) { + app('App\Http\Controllers\Auth\Login')->logout(); + + flash(trans('auth.error.no_company'))->error(); + + return; + } + + // Set company id + session(['company_id' => $company->id]); + + // Save user login time + $event->user->last_logged_in_at = Date::now(); + + $event->user->save(); + } +} diff --git a/app/Listeners/Auth/Logout.php b/app/Listeners/Auth/Logout.php new file mode 100755 index 0000000..48799f8 --- /dev/null +++ b/app/Listeners/Auth/Logout.php @@ -0,0 +1,20 @@ +forget('company_id'); + } +} \ No newline at end of file diff --git a/app/Listeners/Incomes/Invoice/Paid.php b/app/Listeners/Incomes/Invoice/Paid.php new file mode 100755 index 0000000..3aa8863 --- /dev/null +++ b/app/Listeners/Incomes/Invoice/Paid.php @@ -0,0 +1,75 @@ +invoice; + $request = $event->request; + + $request['invoice_id'] = $invoice->id; + $request['account_id'] = setting('general.default_account'); + + if (!isset($request['amount'])) { + $request['amount'] = $invoice->amount; + } + + $request['currency_code'] = $invoice->currency_code; + $request['currency_rate'] = $invoice->currency_rate; + + $request['paid_at'] = Date::parse('now')->format('Y-m-d'); + + if ($request['amount'] > $invoice->amount) { + $message = trans('messages.error.added', ['type' => trans_choice('general.payment', 1)]); + + return [ + 'success' => false, + 'error' => $message, + ]; + } elseif ($request['amount'] == $invoice->amount) { + $invoice->invoice_status_code = 'paid'; + } else { + $invoice->invoice_status_code = 'partial'; + } + + $invoice->save(); + + InvoicePayment::create($request->input()); + + $request['status_code'] = $invoice->invoice_status_code; + + $request['notify'] = 0; + + $desc_date = Date::parse($request['paid_at'])->format($this->getCompanyDateFormat()); + + $desc_amount = money((float) $request['amount'], $request['currency_code'], true)->format(); + + $request['description'] = $desc_date . ' ' . $desc_amount; + + InvoiceHistory::create($request->input()); + + return [ + 'success' => true, + 'error' => false, + ]; + } +} diff --git a/app/Listeners/Updates/Listener.php b/app/Listeners/Updates/Listener.php new file mode 100755 index 0000000..0a2fbf1 --- /dev/null +++ b/app/Listeners/Updates/Listener.php @@ -0,0 +1,31 @@ +alias != static::ALIAS) { + return false; + } + + // Do not apply to the same or newer versions + if (version_compare($event->old, static::VERSION, '>=')) { + return false; + } + + return true; + } +} diff --git a/app/Listeners/Updates/Version106.php b/app/Listeners/Updates/Version106.php new file mode 100755 index 0000000..7f4da50 --- /dev/null +++ b/app/Listeners/Updates/Version106.php @@ -0,0 +1,30 @@ +check($event)) { + return; + } + + // Moved to app directory + File::deleteDirectory(app_path('Http' . DIRECTORY_SEPARATOR .'Transformers')); + } +} diff --git a/app/Listeners/Updates/Version107.php b/app/Listeners/Updates/Version107.php new file mode 100755 index 0000000..acb0014 --- /dev/null +++ b/app/Listeners/Updates/Version107.php @@ -0,0 +1,31 @@ +check($event)) { + return; + } + + $table = env('DB_PREFIX') . 'taxes'; + + DB::statement("ALTER TABLE `$table` MODIFY `rate` DOUBLE(15,4) NOT NULL"); + } +} diff --git a/app/Listeners/Updates/Version108.php b/app/Listeners/Updates/Version108.php new file mode 100755 index 0000000..638a087 --- /dev/null +++ b/app/Listeners/Updates/Version108.php @@ -0,0 +1,90 @@ +check($event)) { + return; + } + + $this->updateSettings(); + $this->updateBills(); + } + + private function updateSettings() + { + // Set new invoice settings + setting(['general.invoice_number_prefix' => setting('general.invoice_prefix', 'INV-')]); + setting(['general.invoice_number_digit' => setting('general.invoice_digit', '5')]); + setting(['general.invoice_number_next' => setting('general.invoice_start', '1')]); + + setting()->forget('general.invoice_prefix'); + setting()->forget('general.invoice_digit'); + setting()->forget('general.invoice_start'); + + setting()->save(); + } + + private function updateBills() + { + // Create new bill statuses + $companies = Company::all(); + + foreach ($companies as $company) { + $rows = [ + [ + 'company_id' => $company->id, + 'name' => trans('bills.status.draft'), + 'code' => 'draft', + ], + [ + 'company_id' => $company->id, + 'name' => trans('bills.status.received'), + 'code' => 'received', + ], + ]; + + foreach ($rows as $row) { + BillStatus::create($row); + } + } + + $bills = Bill::all(); + + foreach ($bills as $bill) { + if (($bill->bill_status_code != 'new') || ($bill->bill_status_code != 'updated')) { + continue; + } + + $bill->bill_status_code = 'draft'; + $bill->save(); + } + + $new = BillStatus::where('code', 'new'); + $new->delete(); + $new->forceDelete(); + + $updated = BillStatus::where('code', 'updated'); + $updated->delete(); + $updated->forceDelete(); + } +} diff --git a/app/Listeners/Updates/Version109.php b/app/Listeners/Updates/Version109.php new file mode 100755 index 0000000..8bcfdce --- /dev/null +++ b/app/Listeners/Updates/Version109.php @@ -0,0 +1,36 @@ +check($event)) { + return; + } + + // Create new bill statuses + $companies = Company::all(); + + foreach ($companies as $company) { + Artisan::call('module:install', ['alias' => 'offlinepayment', 'company_id' => $company->id]); + Artisan::call('module:install', ['alias' => 'paypalstandard', 'company_id' => $company->id]); + } + } +} diff --git a/app/Listeners/Updates/Version110.php b/app/Listeners/Updates/Version110.php new file mode 100755 index 0000000..e8ebe93 --- /dev/null +++ b/app/Listeners/Updates/Version110.php @@ -0,0 +1,48 @@ +check($event)) { + return; + } + + // Create permission + $permission = Permission::firstOrCreate([ + 'name' => 'create-common-import', + 'display_name' => 'Create Common Import', + 'description' => 'Create Common Import', + ]); + + // Attach permission to roles + $roles = Role::all(); + + foreach ($roles as $role) { + $allowed = ['admin', 'manager']; + + if (!in_array($role->name, $allowed)) { + continue; + } + + $role->attachPermission($permission); + } + } +} diff --git a/app/Listeners/Updates/Version112.php b/app/Listeners/Updates/Version112.php new file mode 100755 index 0000000..11cdd1e --- /dev/null +++ b/app/Listeners/Updates/Version112.php @@ -0,0 +1,43 @@ +check($event)) { + return; + } + + $locale = 'en-GB'; + + // Get default locale if only 1 company + if (Company::all()->count() == 1) { + $locale = setting('general.default_locale', 'en-GB'); + } + + // Set default locale + DotenvEditor::setKeys([ + [ + 'key' => 'APP_LOCALE', + 'value' => $locale, + ], + ])->save(); + } +} diff --git a/app/Listeners/Updates/Version113.php b/app/Listeners/Updates/Version113.php new file mode 100755 index 0000000..87e831d --- /dev/null +++ b/app/Listeners/Updates/Version113.php @@ -0,0 +1,44 @@ +check($event)) { + return; + } + + // Update database + Artisan::call('migrate', ['--force' => true]); + + // Update currencies + $currencies = Currency::all(); + + foreach ($currencies as $currency) { + $currency->precision = config('money.' . $currency->code . '.precision'); + $currency->symbol = config('money.' . $currency->code . '.symbol'); + $currency->symbol_first = config('money.' . $currency->code . '.symbol_first') ? 1 : 0; + $currency->decimal_mark = config('money.' . $currency->code . '.decimal_mark'); + $currency->thousands_separator = config('money.' . $currency->code . '.thousands_separator'); + + $currency->save(); + } + } +} diff --git a/app/Listeners/Updates/Version119.php b/app/Listeners/Updates/Version119.php new file mode 100755 index 0000000..908e022 --- /dev/null +++ b/app/Listeners/Updates/Version119.php @@ -0,0 +1,162 @@ +check($event)) { + return; + } + + if (Schema::hasTable('mediables')) { + return; + } + + if (Schema::hasTable('media')) { + Schema::drop('media'); + } + + // Create permission + if (!Permission::where('name', 'delete-common-uploads')->first()) { + $permission = Permission::firstOrCreate([ + 'name' => 'delete-common-uploads', + 'display_name' => 'Delete Common Uploads', + 'description' => 'Delete Common Uploads', + ]); + + // Attach permission to roles + $roles = Role::all(); + + $allowed = ['admin']; + + foreach ($roles as $role) { + if (!in_array($role->name, $allowed)) { + continue; + } + + $role->attachPermission($permission); + } + } + + $data = []; + + $migrations = [ + '\App\Models\Auth\User' => 'picture', + '\App\Models\Common\Item' => 'picture', + '\App\Models\Expense\Bill' => 'attachment', + '\App\Models\Expense\BillPayment' => 'attachment', + '\App\Models\Expense\Payment' => 'attachment', + '\App\Models\Income\Invoice' => 'attachment', + '\App\Models\Income\InvoicePayment' => 'attachment', + '\App\Models\Income\Revenue' => 'attachment', + ]; + + foreach ($migrations as $model => $name) { + if ($model != '\App\Models\Auth\User') { + $items = $model::where('company_id', '<>', '0')->get(); + } else { + $items = $model::all(); + } + + $data[basename($model)] = $items; + } + + // Clear cache after update + Artisan::call('cache:clear'); + + // Update database + Artisan::call('migrate', ['--force' => true]); + + foreach ($migrations as $model => $name) { + $items = $data[basename($model)]; + + foreach ($items as $item) { + if (!$item->$name) { + continue; + } + + $path = explode('uploads/', $item->$name); + + $path = end($path); + + if (!empty($item->company_id) && (strpos($path, $item->company_id . '/') === false)) { + $path = $item->company_id . '/' . $path; + } + + if (!empty($path) && Storage::exists($path)) { + $media = \App\Models\Common\Media::where('filename', '=', pathinfo(basename($path), PATHINFO_FILENAME))->first(); + + if ($media) { + $item->attachMedia($media, $name); + + continue; + } + + $media = MediaUploader::importPath(config('mediable.default_disk'), $path); + + $item->attachMedia($media, $name); + } + } + } + + $settings['company_logo'] = \App\Models\Setting\Setting::where('key', '=', 'general.company_logo')->where('company_id', '<>', '0')->get(); + $settings['invoice_logo'] = \App\Models\Setting\Setting::where('key', '=', 'general.invoice_logo')->where('company_id', '<>', '0')->get(); + + foreach ($settings as $name => $items) { + foreach ($items as $item) { + if (!$item->value) { + continue; + } + + $path = explode('uploads/', $item->value); + + $path = end($path); + + if (!empty($item->company_id) && (strpos($path, $item->company_id . '/') === false)) { + $path = $item->company_id . '/' . $path; + } + + if (!empty($path) && Storage::exists($path)) { + $company = \App\Models\Common\Company::find($item->company_id); + + $media = \App\Models\Common\Media::where('filename', '=', pathinfo(basename($path), PATHINFO_FILENAME))->first(); + + if ($company && !$media) { + $media = MediaUploader::importPath(config('mediable.default_disk'), $path); + + $company->attachMedia($media, $name); + + $item->update(['value' => $media->id]); + } elseif ($media) { + $item->update(['value' => $media->id]); + } else { + $item->update(['value' => '']); + } + } else { + $item->update(['value' => '']); + } + } + } + } +} diff --git a/app/Listeners/Updates/Version120.php b/app/Listeners/Updates/Version120.php new file mode 100755 index 0000000..0b864f3 --- /dev/null +++ b/app/Listeners/Updates/Version120.php @@ -0,0 +1,137 @@ +check($event)) { + return; + } + + $this->updatePermissions(); + + // Update database + Artisan::call('migrate', ['--force' => true]); + + $this->updateInvoicesAndBills(); + + $this->changeQuantityColumn(); + } + + protected function updatePermissions() + { + $permissions = []; + + // Create tax summary permission + $permissions[] = Permission::firstOrCreate([ + 'name' => 'read-reports-tax-summary', + 'display_name' => 'Read Reports Tax Summary', + 'description' => 'Read Reports Tax Summary', + ]); + + // Create profit loss permission + $permissions[] = Permission::firstOrCreate([ + 'name' => 'read-reports-profit-loss', + 'display_name' => 'Read Reports Profit Loss', + 'description' => 'Read Reports Profit Loss', + ]); + + // Attach permission to roles + $roles = Role::all(); + + foreach ($roles as $role) { + $allowed = ['admin', 'manager']; + + if (!in_array($role->name, $allowed)) { + continue; + } + + foreach ($permissions as $permission) { + $role->attachPermission($permission); + } + } + } + + protected function updateInvoicesAndBills() + { + $companies = Company::all(); + + foreach ($companies as $company) { + // Invoices + $invoice_category = Category::create([ + 'company_id' => $company->id, + 'name' => trans_choice('general.invoices', 2), + 'type' => 'income', + 'color' => '#00c0ef', + 'enabled' => '1' + ]); + + foreach ($company->invoices as $invoice) { + $invoice->category_id = $invoice_category->id; + $invoice->save(); + } + + // Bills + $bill_category = Category::create([ + 'company_id' => $company->id, + 'name' => trans_choice('general.bills', 2), + 'type' => 'expense', + 'color' => '#dd4b39', + 'enabled' => '1' + ]); + + foreach ($company->bills as $bill) { + $bill->category_id = $bill_category->id; + $bill->save(); + } + } + } + + protected function changeQuantityColumn() + { + $connection = env('DB_CONNECTION'); + + if ($connection == 'mysql') { + $tables = [ + env('DB_PREFIX') . 'invoice_items', + env('DB_PREFIX') . 'bill_items' + ]; + + foreach ($tables as $table) { + DB::statement("ALTER TABLE `$table` MODIFY `quantity` DOUBLE(7,2) NOT NULL"); + } + } else { + Schema::table('invoice_items', function ($table) { + $table->decimal('quantity', 7, 2)->change(); + }); + + Schema::table('bill_items', function ($table) { + $table->decimal('quantity', 7, 2)->change(); + }); + } + } +} diff --git a/app/Listeners/Updates/Version1210.php b/app/Listeners/Updates/Version1210.php new file mode 100755 index 0000000..7d04d18 --- /dev/null +++ b/app/Listeners/Updates/Version1210.php @@ -0,0 +1,30 @@ +check($event)) { + return; + } + + // Update database + Artisan::call('migrate', ['--force' => true]); + } +} diff --git a/app/Listeners/Updates/Version1211.php b/app/Listeners/Updates/Version1211.php new file mode 100755 index 0000000..5cf0125 --- /dev/null +++ b/app/Listeners/Updates/Version1211.php @@ -0,0 +1,30 @@ +check($event)) { + return; + } + + // Update database + Artisan::call('migrate', ['--force' => true]); + } +} diff --git a/app/Listeners/Updates/Version126.php b/app/Listeners/Updates/Version126.php new file mode 100755 index 0000000..791b53b --- /dev/null +++ b/app/Listeners/Updates/Version126.php @@ -0,0 +1,52 @@ +check($event)) { + return; + } + + $permissions = []; + + // Create permission + $permissions[] = Permission::firstOrCreate([ + 'name' => 'read-modules-my', + 'display_name' => 'Read Modules My', + 'description' => 'Read Modules My', + ]); + + // Attach permission to roles + $roles = Role::all(); + + foreach ($roles as $role) { + $allowed = ['admin', 'manager']; + + if (!in_array($role->name, $allowed)) { + continue; + } + + foreach ($permissions as $permission) { + $role->attachPermission($permission); + } + } + } +} diff --git a/app/Listeners/Updates/Version127.php b/app/Listeners/Updates/Version127.php new file mode 100755 index 0000000..be1fb5b --- /dev/null +++ b/app/Listeners/Updates/Version127.php @@ -0,0 +1,51 @@ +check($event)) { + return; + } + + // Update permissions + $permissions = Permission::all(); + foreach ($permissions as $permission) { + if (strstr($permission->name, '-companies-companies')) { + $permission->name = str_replace('-companies-companies', '-common-companies', $permission->name); + $permission->save(); + } + + if (strstr($permission->name, '-items-items')) { + $permission->name = str_replace('-items-items', '-common-items', $permission->name); + $permission->save(); + } + } + + // Delete folders + $dirs = ['dashboard', 'search', 'companies', 'items']; + foreach ($dirs as $dir) { + File::deleteDirectory(app_path('Filters/' . ucfirst($dir))); + File::deleteDirectory(app_path('Http/Controllers/' . ucfirst($dir))); + File::deleteDirectory(app_path('Http/Requests/' . ucfirst(str_singular($dir)))); + File::deleteDirectory(resource_path('views/' . $dir)); + } + } +} diff --git a/app/Listeners/Updates/Version129.php b/app/Listeners/Updates/Version129.php new file mode 100755 index 0000000..4f2a31d --- /dev/null +++ b/app/Listeners/Updates/Version129.php @@ -0,0 +1,30 @@ +check($event)) { + return; + } + + // Update database + Artisan::call('migrate', ['--force' => true]); + } +} diff --git a/app/Models/Auth/Permission.php b/app/Models/Auth/Permission.php new file mode 100755 index 0000000..4350d59 --- /dev/null +++ b/app/Models/Auth/Permission.php @@ -0,0 +1,70 @@ +currentRouteAction())[0])); + $folder = $arr[1]; + $file = $arr[0]; + } else { + list($folder, $file) = explode('/', Route::current()->uri()); + } + + if (empty($folder) || empty($file)) { + return $this->provideFilter(); + } + + $class = '\App\Filters\\' . ucfirst($folder) .'\\' . ucfirst($file); + + return $this->provideFilter($class); + } + + /** + * Scope to get all rows filtered, sorted and paginated. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param $sort + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeCollect($query, $sort = 'display_name') + { + $request = request(); + + $input = $request->input(); + $limit = $request->get('limit', setting('general.list_limit', '25')); + + return $query->filter($input)->sortable($sort)->paginate($limit); + } +} diff --git a/app/Models/Auth/Role.php b/app/Models/Auth/Role.php new file mode 100755 index 0000000..ebb4a12 --- /dev/null +++ b/app/Models/Auth/Role.php @@ -0,0 +1,69 @@ +currentRouteAction())[0])); + $folder = $arr[1]; + $file = $arr[0]; + } else { + list($folder, $file) = explode('/', Route::current()->uri()); + } + + if (empty($folder) || empty($file)) { + return $this->provideFilter(); + } + + $class = '\App\Filters\\' . ucfirst($folder) .'\\' . ucfirst($file); + + return $this->provideFilter($class); + } + + /** + * Scope to get all rows filtered, sorted and paginated. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param $sort + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeCollect($query, $sort = 'display_name') + { + $request = request(); + + $input = $request->input(); + $limit = $request->get('limit', setting('general.list_limit', '25')); + + return $query->filter($input)->sortable($sort)->paginate($limit); + } +} diff --git a/app/Models/Auth/User.php b/app/Models/Auth/User.php new file mode 100755 index 0000000..ae51bef --- /dev/null +++ b/app/Models/Auth/User.php @@ -0,0 +1,193 @@ +morphToMany('App\Models\Common\Company', 'user', 'user_companies', 'user_id', 'company_id'); + } + + public function customer() + { + return $this->hasOne('App\Models\Income\Customer', 'user_id', 'id'); + } + + /** + * Always capitalize the name when we retrieve it + */ + public function getNameAttribute($value) + { + return ucfirst($value); + } + + /** + * Always return a valid picture when we retrieve it + */ + public function getPictureAttribute($value) + { + // Check if we should use gravatar + if (setting('general.use_gravatar', '0') == '1') { + try { + // Check for gravatar + $url = 'https://www.gravatar.com/avatar/' . md5(strtolower($this->getAttribute('email'))).'?size=90&d=404'; + + $client = new \GuzzleHttp\Client(['verify' => false]); + + $client->request('GET', $url)->getBody()->getContents(); + + $value = $url; + } catch (RequestException $e) { + // 404 Not Found + } + } + + if (!empty($value) && !$this->hasMedia('picture')) { + return $value; + } elseif (!$this->hasMedia('picture')) { + return false; + } + + return $this->getMedia('picture')->last(); + } + + /** + * Always return a valid picture when we retrieve it + */ + public function getLastLoggedInAtAttribute($value) + { + // Date::setLocale('tr'); + + if (!empty($value)) { + return Date::parse($value)->diffForHumans(); + } else { + return trans('auth.never'); + } + } + + /** + * Send reset link to user via email + */ + public function sendPasswordResetNotification($token) + { + $this->notify(new Reset($token)); + } + + /** + * Always capitalize the name when we save it to the database + */ + public function setNameAttribute($value) + { + $this->attributes['name'] = ucfirst($value); + } + + /** + * Always hash the password when we save it to the database + */ + public function setPasswordAttribute($value) + { + $this->attributes['password'] = bcrypt($value); + } + + /** + * Define the filter provider globally. + * + * @return ModelFilter + */ + public function modelFilter() + { + // Check if is api or web + if (Request::is('api/*')) { + $arr = array_reverse(explode('\\', explode('@', app()['api.router']->currentRouteAction())[0])); + $folder = $arr[1]; + $file = $arr[0]; + } else { + list($folder, $file) = explode('/', Route::current()->uri()); + } + + if (empty($folder) || empty($file)) { + return $this->provideFilter(); + } + + //$class = '\App\Filters\Auth\Users'; + + $class = '\App\Filters\\' . ucfirst($folder) . '\\' . ucfirst($file); + + return $this->provideFilter($class); + } + + /** + * Scope to get all rows filtered, sorted and paginated. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param $sort + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeCollect($query, $sort = 'name') + { + $request = request(); + + $input = $request->input(); + $limit = $request->get('limit', setting('general.list_limit', '25')); + + return $query->filter($input)->sortable($sort)->paginate($limit); + } + + /** + * Scope to only include active currencies. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeEnabled($query) + { + return $query->where('enabled', 1); + } +} diff --git a/app/Models/Banking/Account.php b/app/Models/Banking/Account.php new file mode 100755 index 0000000..950ed29 --- /dev/null +++ b/app/Models/Banking/Account.php @@ -0,0 +1,116 @@ + 10, + 'number' => 10, + 'bank_name' => 10, + 'bank_phone' => 5, + 'bank_address' => 2, + ]; + + public function currency() + { + return $this->belongsTo('App\Models\Setting\Currency', 'currency_code', 'code'); + } + + public function invoice_payments() + { + return $this->hasMany('App\Models\Income\InvoicePayment'); + } + + public function revenues() + { + return $this->hasMany('App\Models\Income\Revenue'); + } + + public function bill_payments() + { + return $this->hasMany('App\Models\Expense\BillPayment'); + } + + public function payments() + { + return $this->hasMany('App\Models\Expense\Payment'); + } + + /** + * Convert opening balance to double. + * + * @param string $value + * @return void + */ + public function setOpeningBalanceAttribute($value) + { + $this->attributes['opening_balance'] = (double) $value; + } + + /** + * Get the current balance. + * + * @return string + */ + public function getBalanceAttribute() + { + // Opening Balance + $total = $this->opening_balance; + + // Sum invoices + foreach ($this->invoice_payments as $item) { + $total += $item->amount; + } + + // Sum revenues + foreach ($this->revenues as $item) { + $total += $item->amount; + } + + // Subtract bills + foreach ($this->bill_payments as $item) { + $total -= $item->amount; + } + + // Subtract payments + foreach ($this->payments as $item) { + $total -= $item->amount; + } + + return $total; + } +} diff --git a/app/Models/Banking/Transaction.php b/app/Models/Banking/Transaction.php new file mode 100755 index 0000000..75465d7 --- /dev/null +++ b/app/Models/Banking/Transaction.php @@ -0,0 +1,92 @@ +get(); + + foreach ($bills as $bill) { + $bill_payments = $bill->payments; + + if ($bill_payments) { + foreach ($bill_payments as $bill_payment) { + $transactions[] = (object) [ + 'date' => $bill_payment->paid_at, + 'account' => $bill_payment->account->name, + 'type' => trans('invoices.status.partial'), + 'category' => trans_choice('general.invoices', 1), + 'description' => $bill_payment->description, + 'amount' => $bill_payment->amount, + 'currency_code' => $bill_payment->currency_code, + ]; + } + } + } + + $payments = Payment::where('vendor_id', $user_id)->get(); + + foreach ($payments as $payment) { + $transactions[] = (object) [ + 'date' => $payment->paid_at, + 'account' => $payment->account->name, + 'type' => 'Expense', + 'category' => $payment->category->name, + 'description' => $payment->description, + 'amount' => $payment->amount, + 'currency_code' => $payment->currency_code, + ]; + } + break; + case 'revenues': + $invoices = Invoice::where('customer_id', $user_id)->get(); + + foreach ($invoices as $invoice) { + $invoice_payments = $invoice->payments; + + if ($invoice_payments) { + foreach ($invoice_payments as $invoice_payment) { + $transactions[] = (object) [ + 'date' => $invoice_payment->paid_at, + 'account' => $invoice_payment->account->name, + 'type' => trans('invoices.status.partial'), + 'category' => trans_choice('general.invoices', 1), + 'description' => $invoice_payment->description, + 'amount' => $invoice_payment->amount, + 'currency_code' => $invoice_payment->currency_code, + ]; + } + } + } + + $revenues = Revenue::where('customer_id', $user_id)->get(); + + foreach ($revenues as $revenue) { + $transactions[] = (object) [ + 'date' => $revenue->paid_at, + 'account' => $revenue->account->name, + 'type' => trans_choice('general.payments', 1), + 'category' => $revenue->category->name, + 'description' => $revenue->description, + 'amount' => $revenue->amount, + 'currency_code' => $revenue->currency_code, + ]; + } + break; + } + + return $transactions; + } +} diff --git a/app/Models/Banking/Transfer.php b/app/Models/Banking/Transfer.php new file mode 100755 index 0000000..4f53d01 --- /dev/null +++ b/app/Models/Banking/Transfer.php @@ -0,0 +1,62 @@ +belongsTo('App\Models\Expense\Payment'); + } + + public function paymentAccount() + { + return $this->belongsTo('App\Models\Banking\Account', 'payment.account_id', 'id'); + } + + public function revenue() + { + return $this->belongsTo('App\Models\Income\Revenue'); + } + + public function revenueAccount() + { + return $this->belongsTo('App\Models\Banking\Account', 'revenue.account_id', 'id'); + } + + public function getDynamicConvertedAmount($format = false) + { + return $this->dynamicConvert($this->default_currency_code, $this->amount, $this->currency_code, $this->currency_rate, $format); + } + + public function getReverseConvertedAmount($format = false) + { + return $this->reverseConvert($this->amount, $this->currency_code, $this->currency_rate, $format); + } + + public function getDivideConvertedAmount($format = false) + { + return $this->divide($this->amount, $this->currency_code, $this->currency_rate, $format); + } +} diff --git a/app/Models/Common/Company.php b/app/Models/Common/Company.php new file mode 100755 index 0000000..297c7ab --- /dev/null +++ b/app/Models/Common/Company.php @@ -0,0 +1,260 @@ +hasMany('App\Models\Banking\Account'); + } + + public function bill_histories() + { + return $this->hasMany('App\Models\Expense\BillHistory'); + } + + public function bill_items() + { + return $this->hasMany('App\Models\Expense\BillItem'); + } + + public function bill_payments() + { + return $this->hasMany('App\Models\Expense\BillPayment'); + } + + public function bill_statuses() + { + return $this->hasMany('App\Models\Expense\BillStatus'); + } + + public function bills() + { + return $this->hasMany('App\Models\Expense\Bill'); + } + + public function categories() + { + return $this->hasMany('App\Models\Setting\Category'); + } + + public function currencies() + { + return $this->hasMany('App\Models\Setting\Currency'); + } + + public function customers() + { + return $this->hasMany('App\Models\Income\Customer'); + } + + public function invoice_histories() + { + return $this->hasMany('App\Models\Income\InvoiceHistory'); + } + + public function invoice_items() + { + return $this->hasMany('App\Models\Income\InvoiceItem'); + } + + public function invoice_payments() + { + return $this->hasMany('App\Models\Income\InvoicePayment'); + } + + public function invoice_statuses() + { + return $this->hasMany('App\Models\Income\InvoiceStatus'); + } + + public function invoices() + { + return $this->hasMany('App\Models\Income\Invoice'); + } + + public function items() + { + return $this->hasMany('App\Models\Common\Item'); + } + + public function payments() + { + return $this->hasMany('App\Models\Expense\Payment'); + } + + public function recurring() + { + return $this->hasMany('App\Models\Common\Recurring'); + } + + public function revenues() + { + return $this->hasMany('App\Models\Income\Revenue'); + } + + public function settings() + { + return $this->hasMany('App\Models\Setting\Setting'); + } + + public function taxes() + { + return $this->hasMany('App\Models\Setting\Tax'); + } + + public function transfers() + { + return $this->hasMany('App\Models\Banking\Transfer'); + } + + public function users() + { + return $this->morphedByMany('App\Models\Auth\User', 'user', 'user_companies', 'company_id', 'user_id'); + } + + public function vendors() + { + return $this->hasMany('App\Models\Expense\Vendor'); + } + + public function setSettings() + { + $settings = $this->settings; + + foreach ($settings as $setting) { + list($group, $key) = explode('.', $setting->getAttribute('key')); + + // Load only general settings + if ($group != 'general') { + continue; + } + + $value = $setting->getAttribute('value'); + + if (($key == 'company_logo') && empty($value)) { + $value = 'public/img/company.png'; + } + + $this->setAttribute($key, $value); + } + + // Set default default company logo if empty + if ($this->getAttribute('company_logo') == '') { + $this->setAttribute('company_logo', 'public/img/company.png'); + } + } + + /** + * Define the filter provider globally. + * + * @return ModelFilter + */ + public function modelFilter() + { + list($folder, $file) = explode('/', \Route::current()->uri()); + + if (empty($folder) || empty($file)) { + return $this->provideFilter(); + } + + $class = '\App\Filters\\' . ucfirst($folder) .'\\' . ucfirst($file); + + return $this->provideFilter($class); + } + + /** + * Scope to get all rows filtered, sorted and paginated. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param $sort + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeCollect($query, $sort = 'name') + { + $request = request(); + + $input = $request->input(); + $limit = $request->get('limit', setting('general.list_limit', '25')); + + return Auth::user()->companies()->filter($input)->sortable($sort)->paginate($limit); + } + + /** + * Scope to only include companies of a given enabled value. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeEnabled($query, $value = 1) + { + return $query->where('enabled', $value); + } + + /** + * Sort by company name + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param $direction + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function nameSortable($query, $direction) + { + return $query->join('settings', 'companies.id', '=', 'settings.company_id') + ->where('key', 'general.company_name') + ->orderBy('value', $direction) + ->select('companies.*'); + } + + /** + * Sort by company email + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param $direction + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function emailSortable($query, $direction) + { + return $query->join('settings', 'companies.id', '=', 'settings.company_id') + ->where('key', 'general.company_email') + ->orderBy('value', $direction) + ->select('companies.*'); + } + + /** + * Get the current balance. + * + * @return string + */ + public function getCompanyLogoAttribute() + { + return $this->getMedia('company_logo')->last(); + } +} diff --git a/app/Models/Common/Item.php b/app/Models/Common/Item.php new file mode 100755 index 0000000..04acf3a --- /dev/null +++ b/app/Models/Common/Item.php @@ -0,0 +1,158 @@ + 10, + 'sku' => 5, + 'description' => 2, + ]; + + public function category() + { + return $this->belongsTo('App\Models\Setting\Category'); + } + + public function tax() + { + return $this->belongsTo('App\Models\Setting\Tax'); + } + + public function bill_items() + { + return $this->hasMany('App\Models\Expense\BillItem'); + } + + public function invoice_items() + { + return $this->hasMany('App\Models\Income\InvoiceItem'); + } + + /** + * Convert sale price to double. + * + * @param string $value + * @return void + */ + public function setSalePriceAttribute($value) + { + $this->attributes['sale_price'] = (double) $value; + } + + /** + * Convert purchase price to double. + * + * @param string $value + * @return void + */ + public function setPurchasePriceAttribute($value) + { + $this->attributes['purchase_price'] = (double) $value; + } + + /** + * Get the item id. + * + * @return string + */ + public function getItemIdAttribute() + { + return $this->id; + } + + /** + * Scope autocomplete. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param array $filter + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeAutocomplete($query, $filter) + { + return $query->where(function ($query) use ($filter) { + foreach ($filter as $key => $value) { + $query->orWhere($key, 'LIKE', "%" . $value . "%"); + } + }); + } + + /** + * Scope quantity. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeQuantity($query) + { + return $query->where('quantity', '>', '0'); + } + + /** + * Sort by category name + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param $direction + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function categorySortable($query, $direction) + { + return $query->join('categories', 'categories.id', '=', 'items.category_id') + ->orderBy('name', $direction) + ->select('items.*'); + } + + /** + * Get the current balance. + * + * @return string + */ + public function getPictureAttribute($value) + { + if (!empty($value) && !$this->hasMedia('picture')) { + return $value; + } elseif (!$this->hasMedia('picture')) { + return false; + } + + return $this->getMedia('picture')->last(); + } +} diff --git a/app/Models/Common/Media.php b/app/Models/Common/Media.php new file mode 100755 index 0000000..517b123 --- /dev/null +++ b/app/Models/Common/Media.php @@ -0,0 +1,14 @@ +morphTo(); + } +} diff --git a/app/Models/Company/Company.php b/app/Models/Company/Company.php new file mode 100755 index 0000000..b459f91 --- /dev/null +++ b/app/Models/Company/Company.php @@ -0,0 +1,8 @@ + 10, + 'order_number' => 10, + 'vendor_name' => 10, + 'vendor_email' => 5, + 'vendor_phone' => 2, + 'vendor_address' => 1, + 'notes' => 2, + ]; + + /** + * Clonable relationships. + * + * @var array + */ + public $cloneable_relations = ['items', 'recurring', 'totals']; + + public function category() + { + return $this->belongsTo('App\Models\Setting\Category'); + } + + public function currency() + { + return $this->belongsTo('App\Models\Setting\Currency', 'currency_code', 'code'); + } + + public function histories() + { + return $this->hasMany('App\Models\Expense\BillHistory'); + } + + public function items() + { + return $this->hasMany('App\Models\Expense\BillItem'); + } + + public function payments() + { + return $this->hasMany('App\Models\Expense\BillPayment'); + } + + public function recurring() + { + return $this->morphOne('App\Models\Common\Recurring', 'recurable'); + } + + public function status() + { + return $this->belongsTo('App\Models\Expense\BillStatus', 'bill_status_code', 'code'); + } + + public function totals() + { + return $this->hasMany('App\Models\Expense\BillTotal'); + } + + public function vendor() + { + return $this->belongsTo('App\Models\Expense\Vendor'); + } + + public function scopeDue($query, $date) + { + return $query->where('due_at', '=', $date); + } + + public function scopeLatest($query) + { + return $query->orderBy('paid_at', 'desc'); + } + + public function scopeAccrued($query) + { + return $query->where('bill_status_code', '<>', 'draft'); + } + + public function scopePaid($query) + { + return $query->where('bill_status_code', '=', 'paid'); + } + + public function scopeNotPaid($query) + { + return $query->where('bill_status_code', '<>', 'paid'); + } + + public function onCloning($src, $child = null) + { + $this->bill_status_code = 'draft'; + } + + /** + * Convert amount to double. + * + * @param string $value + * @return void + */ + public function setAmountAttribute($value) + { + $this->attributes['amount'] = (double) $value; + } + + /** + * Convert currency rate to double. + * + * @param string $value + * @return void + */ + public function setCurrencyRateAttribute($value) + { + $this->attributes['currency_rate'] = (double) $value; + } + + /** + * Get the current balance. + * + * @return string + */ + public function getAttachmentAttribute($value) + { + if (!empty($value) && !$this->hasMedia('attachment')) { + return $value; + } elseif (!$this->hasMedia('attachment')) { + return false; + } + + return $this->getMedia('attachment')->last(); + } + + /** + * Get the discount percentage. + * + * @return string + */ + public function getDiscountAttribute() + { + $percent = 0; + + $discount = $this->totals()->where('code', 'discount')->value('amount'); + + if ($discount) { + $sub_total = $this->totals()->where('code', 'sub_total')->value('amount'); + + $percent = number_format((($discount * 100) / $sub_total), 0); + } + + return $percent; + } +} diff --git a/app/Models/Expense/BillHistory.php b/app/Models/Expense/BillHistory.php new file mode 100755 index 0000000..548d99e --- /dev/null +++ b/app/Models/Expense/BillHistory.php @@ -0,0 +1,51 @@ +belongsTo('App\Models\Expense\Bill'); + } + + public function item() + { + return $this->belongsTo('App\Models\Common\Item'); + } + + public function tax() + { + return $this->belongsTo('App\Models\Setting\Tax'); + } + + public function payment() + { + return $this->belongsTo('App\Models\Setting\Payment'); + } + + public function status() + { + return $this->belongsTo('App\Models\Expense\BillStatus', 'status_code', 'code'); + } + + public function getConvertedAmount($format = false) + { + return $this->convert($this->amount, $this->currency_code, $this->currency_rate, $format); + } +} diff --git a/app/Models/Expense/BillItem.php b/app/Models/Expense/BillItem.php new file mode 100755 index 0000000..ae2c026 --- /dev/null +++ b/app/Models/Expense/BillItem.php @@ -0,0 +1,69 @@ +belongsTo('App\Models\Expense\Bill'); + } + + public function item() + { + return $this->belongsTo('App\Models\Common\Item'); + } + + public function tax() + { + return $this->belongsTo('App\Models\Setting\Tax'); + } + + /** + * Convert price to double. + * + * @param string $value + * @return void + */ + public function setPriceAttribute($value) + { + $this->attributes['price'] = (double) $value; + } + + /** + * Convert total to double. + * + * @param string $value + * @return void + */ + public function setTotalAttribute($value) + { + $this->attributes['total'] = (double) $value; + } + + /** + * Convert tax to double. + * + * @param string $value + * @return void + */ + public function setTaxAttribute($value) + { + $this->attributes['tax'] = (double) $value; + } +} diff --git a/app/Models/Expense/BillPayment.php b/app/Models/Expense/BillPayment.php new file mode 100755 index 0000000..b6ba134 --- /dev/null +++ b/app/Models/Expense/BillPayment.php @@ -0,0 +1,109 @@ +belongsTo('App\Models\Banking\Account'); + } + + public function currency() + { + return $this->belongsTo('App\Models\Setting\Currency', 'currency_code', 'code'); + } + + public function bill() + { + return $this->belongsTo('App\Models\Expense\Bill'); + } + + public function item() + { + return $this->belongsTo('App\Models\Common\Item'); + } + + public function tax() + { + return $this->belongsTo('App\Models\Setting\Tax'); + } + + public function scopeLatest($query) + { + return $query->orderBy('paid_at', 'desc'); + } + + /** + * Convert amount to double. + * + * @param string $value + * @return void + */ + public function setAmountAttribute($value) + { + $this->attributes['amount'] = (double) $value; + } + + /** + * Convert currency rate to double. + * + * @param string $value + * @return void + */ + public function setCurrencyRateAttribute($value) + { + $this->attributes['currency_rate'] = (double) $value; + } + + /** + * Scope paid invoice. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopePaid($query) + { + return $query->sum('amount'); + } + + /** + * Get the current balance. + * + * @return string + */ + public function getAttachmentAttribute($value) + { + if (!empty($value) && !$this->hasMedia('attachment')) { + return $value; + } elseif (!$this->hasMedia('attachment')) { + return false; + } + + return $this->getMedia('attachment')->last(); + } + + public function getDivideConvertedAmount($format = false) + { + return $this->divide($this->amount, $this->currency_code, $this->currency_rate, $format); + } +} diff --git a/app/Models/Expense/BillStatus.php b/app/Models/Expense/BillStatus.php new file mode 100755 index 0000000..f138d1f --- /dev/null +++ b/app/Models/Expense/BillStatus.php @@ -0,0 +1,51 @@ +code) { + case 'paid': + $label = 'label-success'; + break; + case 'delete': + $label = 'label-danger'; + break; + case 'partial': + case 'received': + $label = 'label-warning'; + break; + default: + $label = 'bg-aqua'; + break; + } + + return $label; + } +} diff --git a/app/Models/Expense/BillTotal.php b/app/Models/Expense/BillTotal.php new file mode 100755 index 0000000..12b96e5 --- /dev/null +++ b/app/Models/Expense/BillTotal.php @@ -0,0 +1,86 @@ +belongsTo('App\Models\Expense\Bill'); + } + + /** + * Convert amount to double. + * + * @param string $value + * @return void + */ + public function setAmountAttribute($value) + { + $this->attributes['amount'] = (double) $value; + } + + /** + * Get the formatted name. + * + * @return string + */ + public function getTitleAttribute() + { + $title = $this->name; + + $percent = 0; + + switch ($this->code) { + case 'discount': + $title = trans($title); + $percent = $this->bill->discount; + + break; + case 'tax': + $rate = Tax::where('name', $title)->value('rate'); + + if (!empty($rate)) { + $percent = $rate; + } + + break; + } + + if (!empty($percent)) { + $title .= ' ('; + + if (setting('general.percent_position', 'after') == 'after') { + $title .= $percent . '%'; + } else { + $title .= '%' . $percent; + } + + $title .= ')'; + } + + return $title; + } +} diff --git a/app/Models/Expense/Payment.php b/app/Models/Expense/Payment.php new file mode 100755 index 0000000..c4d349e --- /dev/null +++ b/app/Models/Expense/Payment.php @@ -0,0 +1,150 @@ +belongsTo('App\Models\Banking\Account'); + } + + public function category() + { + return $this->belongsTo('App\Models\Setting\Category'); + } + + public function currency() + { + return $this->belongsTo('App\Models\Setting\Currency', 'currency_code', 'code'); + } + + public function recurring() + { + return $this->morphOne('App\Models\Common\Recurring', 'recurable'); + } + + public function transfers() + { + return $this->hasMany('App\Models\Banking\Transfer'); + } + + public function vendor() + { + return $this->belongsTo('App\Models\Expense\Vendor'); + } + + /** + * Get only transfers. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeIsTransfer($query) + { + return $query->where('category_id', '=', Category::transfer()); + } + + /** + * Skip transfers. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeIsNotTransfer($query) + { + return $query->where('category_id', '<>', Category::transfer()); + } + + /** + * Convert amount to double. + * + * @param string $value + * @return void + */ + public function setAmountAttribute($value) + { + $this->attributes['amount'] = (double) $value; + } + + /** + * Convert currency rate to double. + * + * @param string $value + * @return void + */ + public function setCurrencyRateAttribute($value) + { + $this->attributes['currency_rate'] = (double) $value; + } + + public static function scopeLatest($query) + { + return $query->orderBy('paid_at', 'desc'); + } + + /** + * Get the current balance. + * + * @return string + */ + public function getAttachmentAttribute($value) + { + if (!empty($value) && !$this->hasMedia('attachment')) { + return $value; + } elseif (!$this->hasMedia('attachment')) { + return false; + } + + return $this->getMedia('attachment')->last(); + } +} diff --git a/app/Models/Expense/Vendor.php b/app/Models/Expense/Vendor.php new file mode 100755 index 0000000..3c5d246 --- /dev/null +++ b/app/Models/Expense/Vendor.php @@ -0,0 +1,73 @@ + 10, + 'email' => 5, + 'phone' => 2, + 'website' => 2, + 'address' => 1, + ]; + + public function bills() + { + return $this->hasMany('App\Models\Expense\Bill'); + } + + public function payments() + { + return $this->hasMany('App\Models\Expense\Payment'); + } + + public function currency() + { + return $this->belongsTo('App\Models\Setting\Currency', 'currency_code', 'code'); + } + + /** + * Get the current balance. + * + * @return string + */ + public function getLogoAttribute($value) + { + if (!empty($value) && !$this->hasMedia('logo')) { + return $value; + } elseif (!$this->hasMedia('logo')) { + return false; + } + + return $this->getMedia('logo')->last(); + } +} diff --git a/app/Models/Income/Customer.php b/app/Models/Income/Customer.php new file mode 100755 index 0000000..e4aa09a --- /dev/null +++ b/app/Models/Income/Customer.php @@ -0,0 +1,67 @@ + 10, + 'email' => 5, + 'phone' => 2, + 'website' => 2, + 'address' => 1, + ]; + + public function invoices() + { + return $this->hasMany('App\Models\Income\Invoice'); + } + + public function revenues() + { + return $this->hasMany('App\Models\Income\Revenue'); + } + + public function currency() + { + return $this->belongsTo('App\Models\Setting\Currency', 'currency_code', 'code'); + } + + public function user() + { + return $this->belongsTo('App\Models\Auth\User', 'user_id', 'id'); + } + + public function onCloning($src, $child = null) + { + $this->user_id = null; + } +} diff --git a/app/Models/Income/Invoice.php b/app/Models/Income/Invoice.php new file mode 100755 index 0000000..f07e31e --- /dev/null +++ b/app/Models/Income/Invoice.php @@ -0,0 +1,199 @@ + 10, + 'order_number' => 10, + 'customer_name' => 10, + 'customer_email' => 5, + 'customer_phone' => 2, + 'customer_address' => 1, + 'notes' => 2, + ]; + + /** + * Clonable relationships. + * + * @var array + */ + public $cloneable_relations = ['items', 'recurring', 'totals']; + + public function category() + { + return $this->belongsTo('App\Models\Setting\Category'); + } + + public function currency() + { + return $this->belongsTo('App\Models\Setting\Currency', 'currency_code', 'code'); + } + + public function customer() + { + return $this->belongsTo('App\Models\Income\Customer'); + } + + public function items() + { + return $this->hasMany('App\Models\Income\InvoiceItem'); + } + + public function histories() + { + return $this->hasMany('App\Models\Income\InvoiceHistory'); + } + + public function payments() + { + return $this->hasMany('App\Models\Income\InvoicePayment'); + } + + public function recurring() + { + return $this->morphOne('App\Models\Common\Recurring', 'recurable'); + } + + public function status() + { + return $this->belongsTo('App\Models\Income\InvoiceStatus', 'invoice_status_code', 'code'); + } + + public function totals() + { + return $this->hasMany('App\Models\Income\InvoiceTotal'); + } + + public function scopeDue($query, $date) + { + return $query->where('due_at', '=', $date); + } + + public function scopeLatest($query) + { + return $query->orderBy('paid_at', 'desc'); + } + + public function scopeAccrued($query) + { + return $query->where('invoice_status_code', '<>', 'draft'); + } + + public function scopePaid($query) + { + return $query->where('invoice_status_code', '=', 'paid'); + } + + public function scopeNotPaid($query) + { + return $query->where('invoice_status_code', '<>', 'paid'); + } + + public function onCloning($src, $child = null) + { + $this->invoice_status_code = 'draft'; + $this->invoice_number = $this->getNextInvoiceNumber(); + } + + /** + * Convert amount to double. + * + * @param string $value + * @return void + */ + public function setAmountAttribute($value) + { + $this->attributes['amount'] = (double) $value; + } + + /** + * Convert currency rate to double. + * + * @param string $value + * @return void + */ + public function setCurrencyRateAttribute($value) + { + $this->attributes['currency_rate'] = (double) $value; + } + + /** + * Get the current balance. + * + * @return string + */ + public function getAttachmentAttribute($value) + { + if (!empty($value) && !$this->hasMedia('attachment')) { + return $value; + } elseif (!$this->hasMedia('attachment')) { + return false; + } + + return $this->getMedia('attachment')->last(); + } + + /** + * Get the discount percentage. + * + * @return string + */ + public function getDiscountAttribute() + { + $percent = 0; + + $discount = $this->totals()->where('code', 'discount')->value('amount'); + + if ($discount) { + $sub_total = $this->totals()->where('code', 'sub_total')->value('amount'); + + $percent = number_format((($discount * 100) / $sub_total), 0); + } + + return $percent; + } +} diff --git a/app/Models/Income/InvoiceHistory.php b/app/Models/Income/InvoiceHistory.php new file mode 100755 index 0000000..1d61f5b --- /dev/null +++ b/app/Models/Income/InvoiceHistory.php @@ -0,0 +1,51 @@ +belongsTo('App\Models\Income\Invoice'); + } + + public function item() + { + return $this->belongsTo('App\Models\Common\Item'); + } + + public function tax() + { + return $this->belongsTo('App\Models\Setting\Tax'); + } + + public function payment() + { + return $this->belongsTo('App\Models\Setting\Payment'); + } + + public function status() + { + return $this->belongsTo('App\Models\Income\InvoiceStatus', 'status_code', 'code'); + } + + public function getConvertedAmount($format = false) + { + return $this->convert($this->amount, $this->currency_code, $this->currency_rate, $format); + } +} diff --git a/app/Models/Income/InvoiceItem.php b/app/Models/Income/InvoiceItem.php new file mode 100755 index 0000000..c6e50c9 --- /dev/null +++ b/app/Models/Income/InvoiceItem.php @@ -0,0 +1,69 @@ +belongsTo('App\Models\Income\Invoice'); + } + + public function item() + { + return $this->belongsTo('App\Models\Common\Item'); + } + + public function tax() + { + return $this->belongsTo('App\Models\Setting\Tax'); + } + + /** + * Convert price to double. + * + * @param string $value + * @return void + */ + public function setPriceAttribute($value) + { + $this->attributes['price'] = (double) $value; + } + + /** + * Convert total to double. + * + * @param string $value + * @return void + */ + public function setTotalAttribute($value) + { + $this->attributes['total'] = (double) $value; + } + + /** + * Convert tax to double. + * + * @param string $value + * @return void + */ + public function setTaxAttribute($value) + { + $this->attributes['tax'] = (double) $value; + } +} diff --git a/app/Models/Income/InvoicePayment.php b/app/Models/Income/InvoicePayment.php new file mode 100755 index 0000000..02e724a --- /dev/null +++ b/app/Models/Income/InvoicePayment.php @@ -0,0 +1,109 @@ +belongsTo('App\Models\Banking\Account'); + } + + public function currency() + { + return $this->belongsTo('App\Models\Setting\Currency', 'currency_code', 'code'); + } + + public function invoice() + { + return $this->belongsTo('App\Models\Income\Invoice'); + } + + public function item() + { + return $this->belongsTo('App\Models\Common\Item'); + } + + public function tax() + { + return $this->belongsTo('App\Models\Setting\Tax'); + } + + public function scopeLatest($query) + { + return $query->orderBy('paid_at', 'desc'); + } + + /** + * Convert amount to double. + * + * @param string $value + * @return void + */ + public function setAmountAttribute($value) + { + $this->attributes['amount'] = (double) $value; + } + + /** + * Convert currency rate to double. + * + * @param string $value + * @return void + */ + public function setCurrencyRateAttribute($value) + { + $this->attributes['currency_rate'] = (double) $value; + } + + /** + * Scope paid invoice. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopePaid($query) + { + return $query->sum('amount'); + } + + /** + * Get the current balance. + * + * @return string + */ + public function getAttachmentAttribute($value) + { + if (!empty($value) && !$this->hasMedia('attachment')) { + return $value; + } elseif (!$this->hasMedia('attachment')) { + return false; + } + + return $this->getMedia('attachment')->last(); + } + + public function getDivideConvertedAmount($format = false) + { + return $this->divide($this->amount, $this->currency_code, $this->currency_rate, $format); + } +} diff --git a/app/Models/Income/InvoiceStatus.php b/app/Models/Income/InvoiceStatus.php new file mode 100755 index 0000000..10a7bd1 --- /dev/null +++ b/app/Models/Income/InvoiceStatus.php @@ -0,0 +1,51 @@ +code) { + case 'paid': + $label = 'label-success'; + break; + case 'delete': + $label = 'label-danger'; + break; + case 'partial': + case 'sent': + $label = 'label-warning'; + break; + default: + $label = 'bg-aqua'; + break; + } + + return $label; + } +} diff --git a/app/Models/Income/InvoiceTotal.php b/app/Models/Income/InvoiceTotal.php new file mode 100755 index 0000000..30f1549 --- /dev/null +++ b/app/Models/Income/InvoiceTotal.php @@ -0,0 +1,86 @@ +belongsTo('App\Models\Income\Invoice'); + } + + /** + * Convert amount to double. + * + * @param string $value + * @return void + */ + public function setAmountAttribute($value) + { + $this->attributes['amount'] = (double) $value; + } + + /** + * Get the formatted name. + * + * @return string + */ + public function getTitleAttribute() + { + $title = $this->name; + + $percent = 0; + + switch ($this->code) { + case 'discount': + $title = trans($title); + $percent = $this->invoice->discount; + + break; + case 'tax': + $rate = Tax::where('name', $title)->value('rate'); + + if (!empty($rate)) { + $percent = $rate; + } + + break; + } + + if (!empty($percent)) { + $title .= ' ('; + + if (setting('general.percent_position', 'after') == 'after') { + $title .= $percent . '%'; + } else { + $title .= '%' . $percent; + } + + $title .= ')'; + } + + return $title; + } +} diff --git a/app/Models/Income/Revenue.php b/app/Models/Income/Revenue.php new file mode 100755 index 0000000..09cb52f --- /dev/null +++ b/app/Models/Income/Revenue.php @@ -0,0 +1,156 @@ + 10, + 'order_number' => 10, + 'customer_name' => 10, + 'customer_email' => 5, + 'notes' => 2, + ]; + + /** + * Clonable relationships. + * + * @var array + */ + public $cloneable_relations = ['recurring']; + + public function user() + { + return $this->belongsTo('App\Models\Auth\User', 'customer_id', 'id'); + } + + public function account() + { + return $this->belongsTo('App\Models\Banking\Account'); + } + + public function currency() + { + return $this->belongsTo('App\Models\Setting\Currency', 'currency_code', 'code'); + } + + public function category() + { + return $this->belongsTo('App\Models\Setting\Category'); + } + + public function customer() + { + return $this->belongsTo('App\Models\Income\Customer'); + } + + public function recurring() + { + return $this->morphOne('App\Models\Common\Recurring', 'recurable'); + } + + public function transfers() + { + return $this->hasMany('App\Models\Banking\Transfer'); + } + + /** + * Get only transfers. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeIsTransfer($query) + { + return $query->where('category_id', '=', Category::transfer()); + } + + /** + * Skip transfers. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeIsNotTransfer($query) + { + return $query->where('category_id', '<>', Category::transfer()); + } + + /** + * Convert amount to double. + * + * @param string $value + * @return void + */ + public function setAmountAttribute($value) + { + $this->attributes['amount'] = (double) $value; + } + + /** + * Convert currency rate to double. + * + * @param string $value + * @return void + */ + public function setCurrencyRateAttribute($value) + { + $this->attributes['currency_rate'] = (double) $value; + } + + public function scopeLatest($query) + { + return $query->orderBy('paid_at', 'desc'); + } + + /** + * Get the current balance. + * + * @return string + */ + public function getAttachmentAttribute($value) + { + if (!empty($value) && !$this->hasMedia('attachment')) { + return $value; + } elseif (!$this->hasMedia('attachment')) { + return false; + } + + return $this->getMedia('attachment')->last(); + } +} diff --git a/app/Models/Item/Item.php b/app/Models/Item/Item.php new file mode 100755 index 0000000..0a24f75 --- /dev/null +++ b/app/Models/Item/Item.php @@ -0,0 +1,8 @@ +belongsTo('App\Models\Common\Company'); + } + + /** + * Define the filter provider globally. + * + * @return ModelFilter + */ + public function modelFilter() + { + // Check if is api or web + if (Request::is('api/*')) { + $arr = array_reverse(explode('\\', explode('@', app()['api.router']->currentRouteAction())[0])); + $folder = $arr[1]; + $file = $arr[0]; + } else { + list($folder, $file) = explode('/', Route::current()->uri()); + } + + if (empty($folder) || empty($file)) { + return $this->provideFilter(); + } + + $class = '\App\Filters\\' . ucfirst($folder) . '\\' . ucfirst($file); + + return $this->provideFilter($class); + } + + /** + * Scope to only include company data. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param $company_id + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeCompanyId($query, $company_id) + { + return $query->where($this->table . '.company_id', '=', $company_id); + } + + /** + * Scope to get all rows filtered, sorted and paginated. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param $sort + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeCollect($query, $sort = 'name') + { + $request = request(); + + $input = $request->input(); + $limit = $request->get('limit', setting('general.list_limit', '25')); + + return $query->filter($input)->sortable($sort)->paginate($limit); + } + + /** + * Scope to only include active models. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeEnabled($query) + { + return $query->where('enabled', 1); + } + + /** + * Scope to only include passive models. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeDisabled($query) + { + return $query->where('enabled', 0); + } +} diff --git a/app/Models/Module/Module.php b/app/Models/Module/Module.php new file mode 100755 index 0000000..34fe6cd --- /dev/null +++ b/app/Models/Module/Module.php @@ -0,0 +1,32 @@ +where('alias', $alias); + } +} diff --git a/app/Models/Module/ModuleHistory.php b/app/Models/Module/ModuleHistory.php new file mode 100755 index 0000000..6727bb1 --- /dev/null +++ b/app/Models/Module/ModuleHistory.php @@ -0,0 +1,18 @@ +hasMany('App\Models\Expense\Bill'); + } + + public function invoices() + { + return $this->hasMany('App\Models\Income\Invoice'); + } + + public function items() + { + return $this->hasMany('App\Models\Common\Item'); + } + + public function payments() + { + return $this->hasMany('App\Models\Expense\Payment'); + } + + public function revenues() + { + return $this->hasMany('App\Models\Income\Revenue'); + } + + /** + * Scope to only include categories of a given type. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param mixed $type + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeType($query, $type) + { + return $query->where('type', $type); + } + + /** + * Scope transfer category. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeTransfer($query) + { + return $query->where('type', 'other')->pluck('id')->first(); + } +} diff --git a/app/Models/Setting/Currency.php b/app/Models/Setting/Currency.php new file mode 100755 index 0000000..bdba355 --- /dev/null +++ b/app/Models/Setting/Currency.php @@ -0,0 +1,146 @@ +hasMany('App\Models\Banking\Account', 'currency_code', 'code'); + } + + public function customers() + { + return $this->hasMany('App\Models\Income\Customer', 'currency_code', 'code'); + } + + public function invoices() + { + return $this->hasMany('App\Models\Income\Invoice', 'currency_code', 'code'); + } + + public function invoice_payments() + { + return $this->hasMany('App\Models\Income\InvoicePayment', 'currency_code', 'code'); + } + + public function revenues() + { + return $this->hasMany('App\Models\Income\Revenue', 'currency_code', 'code'); + } + + public function bills() + { + return $this->hasMany('App\Models\Expense\Bill', 'currency_code', 'code'); + } + + public function bill_payments() + { + return $this->hasMany('App\Models\Expense\BillPayment', 'currency_code', 'code'); + } + + public function payments() + { + return $this->hasMany('App\Models\Expense\Payment', 'currency_code', 'code'); + } + + /** + * Convert rate to double. + * + * @param string $value + * @return void + */ + public function setRateAttribute($value) + { + $this->attributes['rate'] = (double) $value; + } + + /** + * Get the current precision. + * + * @return string + */ + public function getPrecisionAttribute($value) + { + if (empty($value)) { + return config('money.' . $this->code . '.precision'); + } + + return $value; + } + + /** + * Get the current symbol. + * + * @return string + */ + public function getSymbolAttribute($value) + { + if (empty($value)) { + return config('money.' . $this->code . '.symbol'); + } + + return $value; + } + + /** + * Get the current symbol_first. + * + * @return string + */ + public function getSymbolFirstAttribute($value) + { + if (empty($value)) { + return config('money.' . $this->code . '.symbol_first'); + } + + return $value; + } + + /** + * Get the current decimal_mark. + * + * @return string + */ + public function getDecimalMarkAttribute($value) + { + if (empty($value)) { + return config('money.' . $this->code . '.decimal_mark'); + } + + return $value; + } + + /** + * Get the current thousands_separator. + * + * @return string + */ + public function getThousandsSeparatorAttribute($value) + { + if (empty($value)) { + return config('money.' . $this->code . '.thousands_separator'); + } + + return $value; + } +} diff --git a/app/Models/Setting/Setting.php b/app/Models/Setting/Setting.php new file mode 100755 index 0000000..c025f58 --- /dev/null +++ b/app/Models/Setting/Setting.php @@ -0,0 +1,61 @@ +get(); + } + + /** + * Global company relation. + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function company() + { + return $this->belongsTo('App\Models\Common\Company'); + } + + /** + * Scope to only include company data. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param $company_id + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeCompanyId($query, $company_id) + { + return $query->where($this->table . '.company_id', '=', $company_id); + } +} diff --git a/app/Models/Setting/Tax.php b/app/Models/Setting/Tax.php new file mode 100755 index 0000000..9d19d87 --- /dev/null +++ b/app/Models/Setting/Tax.php @@ -0,0 +1,78 @@ +hasMany('App\Models\Common\Item'); + } + + public function bill_items() + { + return $this->hasMany('App\Models\Expense\BillItem'); + } + + public function invoice_items() + { + return $this->hasMany('App\Models\Income\InvoiceItem'); + } + + /** + * Convert rate to double. + * + * @param string $value + * @return void + */ + public function setRateAttribute($value) + { + $this->attributes['rate'] = (double) $value; + } + + /** + * Get the name including rate. + * + * @return string + */ + public function getTitleAttribute() + { + $title = $this->name . ' ('; + + if (setting('general.percent_position', 'after') == 'after') { + $title .= $this->rate . '%'; + } else { + $title .= '%' . $this->rate; + } + + $title .= ')'; + + return $title; + } +} diff --git a/app/Notifications/Auth/Reset.php b/app/Notifications/Auth/Reset.php new file mode 100755 index 0000000..7353221 --- /dev/null +++ b/app/Notifications/Auth/Reset.php @@ -0,0 +1,53 @@ +token = $token; + } + + /** + * Get the notification's channels. + * + * @param mixed $notifiable + * @return array|string + */ + public function via($notifiable) + { + return ['mail']; + } + + /** + * Build the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + setting(['general.company_name' => config('app.name')]); + + return (new MailMessage) + ->line(trans('auth.notification.message_1')) + ->action(trans('auth.notification.button'), url('auth/reset', $this->token, true)) + ->line(trans('auth.notification.message_2')); + } +} diff --git a/app/Notifications/Common/Item.php b/app/Notifications/Common/Item.php new file mode 100755 index 0000000..208edb6 --- /dev/null +++ b/app/Notifications/Common/Item.php @@ -0,0 +1,69 @@ +item = $item; + } + + /** + * Get the notification's channels. + * + * @param mixed $notifiable + * @return array|string + */ + public function via($notifiable) + { + return ['mail', 'database']; + } + + /** + * Build the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + $message = (new MailMessage) + ->line(trans('items.notification.message', ['name' => $this->item->name])) + ->action(trans('items.notification.button'), url('items/items', $this->item->id, true)); + + // Override per company as Laravel doesn't read config + $message->from(config('mail.from.address'), config('mail.from.name')); + + return $message; + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + 'item_id' => $this->item->id, + 'name' => $this->item->name, + ]; + } +} diff --git a/app/Notifications/Expense/Bill.php b/app/Notifications/Expense/Bill.php new file mode 100755 index 0000000..85fa966 --- /dev/null +++ b/app/Notifications/Expense/Bill.php @@ -0,0 +1,72 @@ +queue = 'high'; + $this->delay = config('queue.connections.database.delay'); + + $this->bill = $bill; + } + + /** + * Get the notification's channels. + * + * @param mixed $notifiable + * @return array|string + */ + public function via($notifiable) + { + return ['mail', 'database']; + } + + /** + * Build the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + $message = (new MailMessage) + ->line('You are receiving this email because you have an upcoming ' . money($this->bill->amount, $this->bill->currency_code, true) . ' bill to ' . $this->bill->vendor_name . ' vendor.') + ->action('Add Payment', url('expenses/bills', $this->bill->id, true)); + + // Override per company as Laravel doesn't read config + $message->from(config('mail.from.address'), config('mail.from.name')); + + return $message; + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + 'bill_id' => $this->bill->id, + 'amount' => $this->bill->amount, + ]; + } +} diff --git a/app/Notifications/Income/Invoice.php b/app/Notifications/Income/Invoice.php new file mode 100755 index 0000000..ad6dd01 --- /dev/null +++ b/app/Notifications/Income/Invoice.php @@ -0,0 +1,82 @@ +queue = 'high'; + $this->delay = config('queue.connections.database.delay'); + + $this->invoice = $invoice; + } + + /** + * Get the notification's channels. + * + * @param mixed $notifiable + * @return array|string + */ + public function via($notifiable) + { + return ['mail', 'database']; + } + + /** + * Build the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + $message = (new MailMessage) + ->line(trans('invoices.notification.message', ['amount' => money($this->invoice->amount, $this->invoice->currency_code, true), 'customer' => $this->invoice->customer_name])); + + // Override per company as Laravel doesn't read config + $message->from(config('mail.from.address'), config('mail.from.name')); + + // Attach the PDF file if available + if (isset($this->invoice->pdf_path)) { + $message->attach($this->invoice->pdf_path, [ + 'mime' => 'application/pdf', + ]); + } + + if ($this->invoice->customer->user) { + $message->action(trans('invoices.notification.button'), url('customers/invoices', $this->invoice->id, true)); + } + + return $message; + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + 'invoice_id' => $this->invoice->id, + 'amount' => $this->invoice->amount, + ]; + } +} diff --git a/app/Observers/Company.php b/app/Observers/Company.php new file mode 100755 index 0000000..11ba47b --- /dev/null +++ b/app/Observers/Company.php @@ -0,0 +1,65 @@ + $company->id + ]); + + // Check if user is logged in + if (!Auth::check()) { + return; + } + + // Attach company to user + Auth::user()->companies()->attach($company->id); + } + + /** + * Listen to the deleted event. + * + * @param Model $company + * @return void + */ + public function deleted(Model $company) + { + $tables = [ + 'accounts', 'bill_histories', 'bill_items', 'bill_payments', 'bill_statuses', 'bills', 'categories', + 'currencies', 'customers', 'invoice_histories', 'invoice_items', 'invoice_payments', 'invoice_statuses', + 'invoices', 'items', 'payments', 'recurring', 'revenues', 'settings', 'taxes', 'transfers', 'vendors', + ]; + + foreach ($tables as $table) { + $this->deleteItems($company, $table); + } + } + + /** + * Delete items in batch. + * + * @param Model $company + * @param $table + * @return void + */ + protected function deleteItems($company, $table) + { + foreach ($company->$table as $item) { + $item->delete(); + } + } +} \ No newline at end of file diff --git a/app/Overrides/Illuminate/MessageSelector.php b/app/Overrides/Illuminate/MessageSelector.php new file mode 100755 index 0000000..66d177b --- /dev/null +++ b/app/Overrides/Illuminate/MessageSelector.php @@ -0,0 +1,254 @@ +extract($segments, $number)) !== null) { + return trim($value); + } + + $segments = $this->stripConditions($segments); + + $pluralIndex = $this->getPluralIndex($locale, $number); + + if (count($segments) == 1 || ! isset($segments[$pluralIndex])) { + return $segments[0]; + } + + return $segments[$pluralIndex]; + } + + /** + * Extract a translation string using inline conditions. + * + * @param array $segments + * @param int $number + * @return mixed + */ + private function extract($segments, $number) + { + foreach ($segments as $part) { + if (! is_null($line = $this->extractFromString($part, $number))) { + return $line; + } + } + } + + /** + * Get the translation string if the condition matches. + * + * @param string $part + * @param int $number + * @return mixed + */ + private function extractFromString($part, $number) + { + preg_match('/^[\{\[]([^\[\]\{\}]*)[\}\]](.*)/s', $part, $matches); + + if (count($matches) != 3) { + return; + } + + $condition = $matches[1]; + + $value = $matches[2]; + + if (Str::contains($condition, ',')) { + list($from, $to) = explode(',', $condition, 2); + + if ($to == '*' && $number >= $from) { + return $value; + } elseif ($from == '*' && $number <= $to) { + return $value; + } elseif ($number >= $from && $number <= $to) { + return $value; + } + } + + return $condition == $number ? $value : null; + } + + /** + * Strip the inline conditions from each segment, just leaving the text. + * + * @param array $segments + * @return array + */ + private function stripConditions($segments) + { + return collect($segments)->map(function ($part) { + return preg_replace('/^[\{\[]([^\[\]\{\}]*)[\}\]]/', '', $part); + })->all(); + } + + /** + * Get the index to use for pluralization. + * + * The plural rules are derived from code of the Zend Framework (2010-09-25), which + * is subject to the new BSD license (http://framework.zend.com/license/new-bsd) + * Copyright (c) 2005-2010 - Zend Technologies USA Inc. (http://www.zend.com) + * + * @param string $locale + * @param int $number + * @return int + */ + public function getPluralIndex($locale, $number) + { + $allowed_langs = config('localizer.allowed_langs'); + + switch ($locale) { + case 'az': + case 'bo': + case 'dz': + case 'id': + case 'id-ID': + case 'ja': + case 'jv': + case 'ka': + case 'km': + case 'kn': + case 'ko': + case 'ms': + case 'th': + case 'tr': + case 'vi': + case 'vi-VN': + case 'zh': + case 'zh-TW': + return 0; + break; + case 'af': + case 'bn': + case 'bg': + case 'bg-BG': + case 'ca': + case 'da': + case 'da-DK': + case 'de': + case 'de-DE': + case 'el': + case 'el-GR': + case 'en': + case 'en-AU': + case 'en-GB': + case 'en-US': + case 'eo': + case 'es': + case 'es-ES': + case 'es-MX': + case 'et': + case 'eu': + case 'fa': + case 'fi': + case 'fo': + case 'fur': + case 'fy': + case 'gl': + case 'gu': + case 'ha': + case 'he': + case 'hu': + case 'is': + case 'it': + case 'it-IT': + case 'ku': + case 'lb': + case 'ml': + case 'mn': + case 'mr': + case 'nah': + case 'nb': + case 'nb-NO': + case 'ne': + case 'nl': + case 'nl-NL': + case 'nn': + case 'no': + case 'om': + case 'or': + case 'pa': + case 'pap': + case 'ps': + case 'pt': + case 'so': + case 'sq': + case 'sq-AL': + case 'sv': + case 'sv-SE': + case 'sw': + case 'ta': + case 'te': + case 'tk': + case 'tr-TR': + case 'ur': + case 'zu': + return ($number == 1) ? 0 : 1; + case 'am': + case 'bh': + case 'fil': + case 'fr': + case 'fr-FR': + case 'gun': + case 'hi': + case 'hy': + case 'ln': + case 'mg': + case 'nso': + case 'pt-BR': + case 'xbr': + case 'ti': + case 'wa': + return (($number == 0) || ($number == 1)) ? 0 : 1; + case 'be': + case 'bs': + case 'hr': + case 'hr-HR': + case 'ru': + case 'ru-RU': + case 'sr': + case 'uk': + return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); + case 'cs': + case 'cs-CZ': + case 'sk': + return ($number == 1) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2); + case 'ga': + return ($number == 1) ? 0 : (($number == 2) ? 1 : 2); + case 'lt': + return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); + case 'sl': + return ($number % 100 == 1) ? 0 : (($number % 100 == 2) ? 1 : ((($number % 100 == 3) || ($number % 100 == 4)) ? 2 : 3)); + case 'mk': + return ($number % 10 == 1) ? 0 : 1; + case 'mt': + return ($number == 1) ? 0 : ((($number == 0) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3)); + case 'lv': + return ($number == 0) ? 0 : ((($number % 10 == 1) && ($number % 100 != 11)) ? 1 : 2); + case 'pl': + return ($number == 1) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 1 : 2); + case 'cy': + return ($number == 1) ? 0 : (($number == 2) ? 1 : ((($number == 8) || ($number == 11)) ? 2 : 3)); + case 'ro': + return ($number == 1) ? 0 : ((($number == 0) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2); + case 'ar': + return ($number == 0) ? 0 : (($number == 1) ? 1 : (($number == 2) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : 5)))); + default: + return 0; + } + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100755 index 0000000..629383f --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,36 @@ +app->register(\Barryvdh\Debugbar\ServiceProvider::class); + } + + if (env('APP_ENV') !== 'production') { + $this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class); + } + } +} diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php new file mode 100755 index 0000000..9784b1a --- /dev/null +++ b/app/Providers/AuthServiceProvider.php @@ -0,0 +1,30 @@ + 'App\Policies\ModelPolicy', + ]; + + /** + * Register any authentication / authorization services. + * + * @return void + */ + public function boot() + { + $this->registerPolicies(); + + // + } +} diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php new file mode 100755 index 0000000..352cce4 --- /dev/null +++ b/app/Providers/BroadcastServiceProvider.php @@ -0,0 +1,21 @@ + [ + 'App\Listeners\Updates\Version106', + 'App\Listeners\Updates\Version107', + 'App\Listeners\Updates\Version108', + 'App\Listeners\Updates\Version109', + 'App\Listeners\Updates\Version110', + 'App\Listeners\Updates\Version112', + 'App\Listeners\Updates\Version113', + 'App\Listeners\Updates\Version119', + 'App\Listeners\Updates\Version120', + 'App\Listeners\Updates\Version126', + 'App\Listeners\Updates\Version127', + 'App\Listeners\Updates\Version129', + 'App\Listeners\Updates\Version1210', + 'App\Listeners\Updates\Version1211', + ], + 'Illuminate\Auth\Events\Login' => [ + 'App\Listeners\Auth\Login', + ], + 'Illuminate\Auth\Events\Logout' => [ + 'App\Listeners\Auth\Logout', + ], + 'App\Events\InvoicePaid' => [ + 'App\Listeners\Incomes\Invoice\Paid', + ], + ]; + + /** + * Register any events for your application. + * + * @return void + */ + public function boot() + { + parent::boot(); + + // + } +} diff --git a/app/Providers/FormServiceProvider.php b/app/Providers/FormServiceProvider.php new file mode 100755 index 0000000..39e66eb --- /dev/null +++ b/app/Providers/FormServiceProvider.php @@ -0,0 +1,80 @@ + ['required' => 'required'], 'value' => null, 'col' => 'col-md-6', + ]); + + Form::component('emailGroup', 'partials.form.email_group', [ + 'name', 'text', 'icon', 'attributes' => ['required' => 'required'], 'value' => null, 'col' => 'col-md-6', + ]); + + Form::component('passwordGroup', 'partials.form.password_group', [ + 'name', 'text', 'icon', 'attributes' => ['required' => 'required'], 'value' => null, 'col' => 'col-md-6', + ]); + + Form::component('numberGroup', 'partials.form.number_group', [ + 'name', 'text', 'icon', 'attributes' => ['required' => 'required'], 'value' => null, 'col' => 'col-md-6', + ]); + + Form::component('selectGroup', 'partials.form.select_group', [ + 'name', 'text', 'icon', 'values', 'selected' => null, 'attributes' => ['required' => 'required'], 'col' => 'col-md-6', + ]); + + Form::component('textareaGroup', 'partials.form.textarea_group', [ + 'name', 'text', 'value' => null, 'attributes' => ['rows' => '3'], 'col' => 'col-md-12', + ]); + + Form::component('radioGroup', 'partials.form.radio_group', [ + 'name', 'text', 'enable' => trans('general.yes'), 'disable' => trans('general.no'), 'attributes' => [], 'col' => 'col-md-6', + ]); + + Form::component('checkboxGroup', 'partials.form.checkbox_group', [ + 'name', 'text', 'items' => [], 'value' => 'name', 'id' => 'id', 'attributes' => ['required' => 'required'], 'col' => 'col-md-12', + ]); + + Form::component('fileGroup', 'partials.form.file_group', [ + 'name', 'text', 'attributes' => [], 'value' => null, 'col' => 'col-md-6', + ]); + + Form::component('deleteButton', 'partials.form.delete_button', [ + 'item', 'url', 'text' => '', 'value' => 'name', 'id' => 'id', + ]); + + Form::component('deleteLink', 'partials.form.delete_link', [ + 'item', 'url', 'text' => '', 'value' => 'name', 'id' => 'id', + ]); + + Form::component('saveButtons', 'partials.form.save_buttons', [ + 'cancel', 'col' => 'col-md-12', + ]); + + Form::component('recurring', 'partials.form.recurring', [ + 'page', 'model' => null, + ]); + } + + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + // + } +} \ No newline at end of file diff --git a/app/Providers/ObserverServiceProvider.php b/app/Providers/ObserverServiceProvider.php new file mode 100755 index 0000000..a0aaef1 --- /dev/null +++ b/app/Providers/ObserverServiceProvider.php @@ -0,0 +1,30 @@ +mapApiRoutes(); + + $this->mapWebRoutes(); + + // + } + + /** + * Define the "web" routes for the application. + * + * These routes all receive session state, CSRF protection, etc. + * + * @return void + */ + protected function mapWebRoutes() + { + Route::middleware('web') + ->namespace($this->namespace) + ->group(base_path('routes/web.php')); + } + + /** + * Define the "api" routes for the application. + * + * These routes are typically stateless. + * + * @return void + */ + protected function mapApiRoutes() + { + Route::prefix('api') + ->middleware('api') + ->namespace($this->namespace) + ->group(base_path('routes/api.php')); + } +} diff --git a/app/Providers/ValidationServiceProvider.php b/app/Providers/ValidationServiceProvider.php new file mode 100755 index 0000000..5771e75 --- /dev/null +++ b/app/Providers/ValidationServiceProvider.php @@ -0,0 +1,66 @@ +pluck('code')->toArray(); + + if (in_array($value, $currencies)) { + $status = true; + } + + $currency_code = $value; + + return $status; + }, + trans('validation.custom.invalid_currency', ['attribute' => $currency_code]) + ); + + $amount = null; + + Validator::extend('amount', function ($attribute, $value, $parameters, $validator) use (&$amount) { + $status = false; + + if ($value > 0) { + $status = true; + } + + $amount = $value; + + return $status; + }, + trans('validation.custom.invalid_amount', ['attribute' => $amount]) + ); + } + + /** + * Register any application services. + * + * @return void + */ + public function register() + { + // + } +} diff --git a/app/Providers/ViewComposerServiceProvider.php b/app/Providers/ViewComposerServiceProvider.php new file mode 100755 index 0000000..689827c --- /dev/null +++ b/app/Providers/ViewComposerServiceProvider.php @@ -0,0 +1,67 @@ +getTable(); + + // Skip for specific tables + $skip_tables = ['companies', 'jobs', 'migrations', 'notifications', 'permissions', 'role_user', 'roles', 'sessions', 'users']; + if (in_array($table, $skip_tables)) { + return; + } + + // Skip if already exists + if ($this->exists($builder, 'company_id')) { + return; + } + + // Apply company scope + $builder->where($table . '.company_id', '=', $company_id); + } + + /** + * Check if scope exists. + * + * @param \Illuminate\Database\Eloquent\Builder $builder + * @param $column + * @return boolean + */ + protected function exists($builder, $column) + { + $query = $builder->getQuery(); + + foreach ((array) $query->wheres as $key => $where) { + if (empty($where) || empty($where['column'])) { + continue; + } + + if (strstr($where['column'], '.')) { + $whr = explode('.', $where['column']); + + $where['column'] = $whr[1]; + } + + if ($where['column'] != $column) { + continue; + } + + return true; + } + + return false; + } +} \ No newline at end of file diff --git a/app/Traits/Currencies.php b/app/Traits/Currencies.php new file mode 100755 index 0000000..ae84cd9 --- /dev/null +++ b/app/Traits/Currencies.php @@ -0,0 +1,77 @@ +convert($default, (double) $rate)->format(); + } else { + $money = Money::$code($amount)->convert($default, (double) $rate)->getAmount(); + } + + return $money; + } + + public function divide($amount, $code, $rate, $format = false) + { + if ($format) { + $money = Money::$code($amount, true)->divide((double) $rate)->format(); + } else { + $money = Money::$code($amount)->divide((double) $rate)->getAmount(); + } + + return $money; + } + + public function reverseConvert($amount, $code, $rate, $format = false) + { + $default = setting('general.default_currency', 'USD'); + + $code = new Currency($code); + + if ($format) { + $money = Money::$default($amount, true)->convert($code, (double) $rate)->format(); + } else { + $money = Money::$default($amount)->convert($code, (double) $rate)->getAmount(); + } + + return $money; + } + + public function dynamicConvert($default, $amount, $code, $rate, $format = false) + { + $code = new Currency($code); + + if ($format) { + $money = Money::$default($amount, true)->convert($code, (double) $rate)->format(); + } else { + $money = Money::$default($amount)->convert($code, (double) $rate)->getAmount(); + } + + return $money; + } + + public function getConvertedAmount($format = false) + { + return $this->convert($this->amount, $this->currency_code, $this->currency_rate, $format); + } + + public function getReverseConvertedAmount($format = false) + { + return $this->reverseConvert($this->amount, $this->currency_code, $this->currency_rate, $format); + } + + public function getDynamicConvertedAmount($format = false) + { + return $this->dynamicConvert($this->default_currency_code, $this->amount, $this->currency_code, $this->currency_rate, $format); + } +} \ No newline at end of file diff --git a/app/Traits/DateTime.php b/app/Traits/DateTime.php new file mode 100755 index 0000000..974fffe --- /dev/null +++ b/app/Traits/DateTime.php @@ -0,0 +1,78 @@ + '-', 'slash' => '/', 'dot' => '.', 'comma' => ',', 'space' => ' ']; + + $date_format = setting('general.date_format', 'd F Y'); + $date_separator = $chars[setting('general.date_separator', 'space')]; + + return str_replace(' ', $date_separator, $date_format); + } + + public function scopeMonthsOfYear($query, $field) + { + $year = request('year'); + + // Get current year if not set + if (empty($year)) { + $year = Date::now()->year; + } + + $start = Date::parse($year . '-01-01')->format('Y-m-d'); + $end = Date::parse($year . '-12-31')->format('Y-m-d'); + + return $query->whereBetween($field, [$start, $end]); + } + + public function getTimezones() + { + // The list of available timezone groups to use. + $use_zones = array('Africa', 'America', 'Antarctica', 'Arctic', 'Asia', 'Atlantic', 'Australia', 'Europe', 'Indian', 'Pacific'); + + // Get the list of time zones from the server. + $zones = \DateTimeZone::listIdentifiers(); + + // Build the group lists. + foreach ($zones as $zone) { + // Time zones not in a group we will ignore. + if (strpos($zone, '/') === false) { + continue; + } + + // Get the group/locale from the timezone. + list ($group, $locale) = explode('/', $zone, 2); + + // Only use known groups. + if (in_array($group, $use_zones)) { + // Initialize the group if necessary. + if (!isset($groups[$group])) { + $groups[$group] = array(); + } + + // Only add options where a locale exists. + if (!empty($locale)) { + $groups[$group][$zone] = str_replace('_', ' ', $locale); + } + } + } + + // Sort the group lists. + ksort($groups); + + return $groups; + } +} \ No newline at end of file diff --git a/app/Traits/Incomes.php b/app/Traits/Incomes.php new file mode 100755 index 0000000..1e2dc80 --- /dev/null +++ b/app/Traits/Incomes.php @@ -0,0 +1,34 @@ + $next]); + setting()->save(); + } +} \ No newline at end of file diff --git a/app/Traits/Media.php b/app/Traits/Media.php new file mode 100755 index 0000000..6f6774b --- /dev/null +++ b/app/Traits/Media.php @@ -0,0 +1,37 @@ + + * + * Whether the model should automatically reload its media relationship after modification. + */ +trait Media +{ + use Mediable; + + /** + * Relationship for all attached media. + * @return \Illuminate\Database\Eloquent\Relations\MorphToMany + */ + public function media() + { + $media = $this->morphToMany(config('mediable.model'), 'mediable') + ->withPivot('tag', 'order') + ->orderBy('order'); + + // Skip deleted media if not detached + if (config('mediable.detach_on_soft_delete') == false) { + $media->whereNull('deleted_at'); + } + + return $media; + } +} diff --git a/app/Traits/Modules.php b/app/Traits/Modules.php new file mode 100755 index 0000000..5ff860f --- /dev/null +++ b/app/Traits/Modules.php @@ -0,0 +1,438 @@ + [ + 'token' => $token, + ] + ]; + + $response = $this->getRemote('token/check', 'POST', $data); + + if ($response && ($response->getStatusCode() == 200)) { + $result = json_decode($response->getBody()); + + return ($result->success) ? true : false; + } + + return false; + } + + public function getModules() + { + $response = $this->getRemote('apps/items'); + + if ($response && ($response->getStatusCode() == 200)) { + return json_decode($response->getBody())->data; + } + + return []; + } + + public function getModule($alias) + { + $response = $this->getRemote('apps/' . $alias); + + if ($response && ($response->getStatusCode() == 200)) { + return json_decode($response->getBody())->data; + } + + return []; + } + + public function getCategories() + { + $response = $this->getRemote('apps/categories'); + + if ($response && ($response->getStatusCode() == 200)) { + return json_decode($response->getBody())->data; + } + + return []; + } + + public function getModulesByCategory($alias) + { + $response = $this->getRemote('apps/categories/' . $alias); + + if ($response && ($response->getStatusCode() == 200)) { + return json_decode($response->getBody())->data; + } + + return []; + } + + public function getMyModules($data = []) + { + $response = $this->getRemote('apps/my', 'GET', $data); + + if ($response && ($response->getStatusCode() == 200)) { + return json_decode($response->getBody())->data; + } + + return []; + } + + public function getInstalledModules($data = []) + { + $company_id = session('company_id'); + + $cache = 'installed.' . $company_id . '.module'; + + $installed = Cache::get($cache); + + if ($installed) { + return $installed; + } + + $installed = []; + $modules = Module::all(); + $installed_modules = MModule::where('company_id', '=', session('company_id'))->pluck('status', 'alias')->toArray(); + + foreach ($modules as $module) { + if (!array_key_exists($module->alias, $installed_modules)) { + continue; + } + + $result = $this->getModule($module->alias); + + if ($result) { + $installed[] = $result; + } + } + + Cache::put($cache, $installed, Date::now()->addHour(6)); + + return $installed; + } + + public function getPaidModules($data = []) + { + $response = $this->getRemote('apps/paid', 'GET', $data); + + if ($response && ($response->getStatusCode() == 200)) { + return json_decode($response->getBody())->data; + } + + return []; + } + + public function getNewModules($data = []) + { + $response = $this->getRemote('apps/new', 'GET', $data); + + if ($response && ($response->getStatusCode() == 200)) { + return json_decode($response->getBody())->data; + } + + return []; + } + + public function getFreeModules($data = []) + { + $response = $this->getRemote('apps/free', 'GET', $data); + + if ($response && ($response->getStatusCode() == 200)) { + return json_decode($response->getBody())->data; + } + + return []; + } + + public function getSearchModules($data = []) + { + $response = $this->getRemote('apps/search', 'GET', $data); + + if ($response && ($response->getStatusCode() == 200)) { + return json_decode($response->getBody())->data; + } + + return []; + } + + public function getCoreVersion() + { + $data['query'] = Info::all(); + + $response = $this->getRemote('core/version', 'GET', $data); + + if ($response && ($response->getStatusCode() == 200)) { + return $response->json(); + } + + return []; + } + + public function downloadModule($path) + { + $response = $this->getRemote($path); + + if ($response && ($response->getStatusCode() == 200)) { + $file = $response->getBody()->getContents(); + + $path = 'temp-' . md5(mt_rand()); + $temp_path = storage_path('app/temp') . '/' . $path; + + $file_path = $temp_path . '/upload.zip'; + + // Create tmp directory + if (!File::isDirectory($temp_path)) { + File::makeDirectory($temp_path); + } + + // Add content to the Zip file + $uploaded = is_int(file_put_contents($file_path, $file)) ? true : false; + + if (!$uploaded) { + return false; + } + + $data = [ + 'path' => $path + ]; + + return [ + 'success' => true, + 'errors' => false, + 'data' => $data, + ]; + } + + return [ + 'success' => false, + 'errors' => true, + 'data' => null, + ]; + } + + public function unzipModule($path) + { + $temp_path = storage_path('app/temp') . '/' . $path; + + $file = $temp_path . '/upload.zip'; + + // Unzip the file + $zip = new ZipArchive(); + + if (!$zip->open($file) || !$zip->extractTo($temp_path)) { + return [ + 'success' => false, + 'errors' => true, + 'data' => null, + ]; + } + + $zip->close(); + + // Remove Zip + File::delete($file); + + $data = [ + 'path' => $path + ]; + + return [ + 'success' => true, + 'errors' => false, + 'data' => $data, + ]; + } + + public function installModule($path) + { + $temp_path = storage_path('app/temp') . '/' . $path; + + $modules_path = base_path() . '/modules'; + + // Create modules directory + if (!File::isDirectory($modules_path)) { + File::makeDirectory($modules_path); + } + + $module = json_decode(file_get_contents($temp_path . '/module.json')); + + $module_path = $modules_path . '/' . $module->name; + + // Create module directory + if (!File::isDirectory($module_path)) { + File::makeDirectory($module_path); + } + + // Move all files/folders from temp path then delete it + File::copyDirectory($temp_path, $module_path); + File::deleteDirectory($temp_path); + + Artisan::call('cache:clear'); + + $data = [ + 'path' => $path, + 'name' => $module->name, + 'alias' => $module->alias + ]; + + return [ + 'success' => true, + 'installed' => url("apps/post/" . $module->alias), + 'errors' => false, + 'data' => $data, + ]; + } + + public function uninstallModule($alias) + { + $module = Module::findByAlias($alias); + + $data = [ + 'name' => $module->get('name'), + 'category' => $module->get('category'), + 'version' => $module->get('version'), + ]; + + $module->delete(); + + Artisan::call('cache:clear'); + + return [ + 'success' => true, + 'errors' => false, + 'data' => $data + ]; + } + + public function enableModule($alias) + { + $module = Module::findByAlias($alias); + + $data = [ + 'name' => $module->get('name'), + 'category' => $module->get('category'), + 'version' => $module->get('version'), + ]; + + $module->enable(); + + Artisan::call('cache:clear'); + + return [ + 'success' => true, + 'errors' => false, + 'data' => $data + ]; + } + + public function disableModule($alias) + { + $module = Module::findByAlias($alias); + + $data = [ + 'name' => $module->get('name'), + 'category' => $module->get('category'), + 'version' => $module->get('version'), + ]; + + $module->disable(); + + Artisan::call('cache:clear'); + + return [ + 'success' => true, + 'errors' => false, + 'data' => $data + ]; + } + + public function loadSuggestions() + { + // Get data from cache + $data = Cache::get('suggestions'); + + if (!empty($data)) { + return $data; + } + + $data = []; + + $url = 'apps/suggestions'; + + $response = $this->getRemote($url, 'GET', ['timeout' => 30, 'referer' => true]); + + // Exception + if ($response instanceof RequestException) { + return false; + } + + // Bad response + if (!$response || ($response->getStatusCode() != 200)) { + return false; + } + + $suggestions = json_decode($response->getBody())->data; + + foreach ($suggestions as $suggestion) { + $data[$suggestion->path] = $suggestion; + } + + Cache::put('suggestions', $data, Date::now()->addHour(6)); + + return $data; + } + + public function getSuggestions($path) + { + // Get data from cache + $data = Cache::get('suggestions'); + + if (empty($data)) { + $data = $this->loadSuggestions(); + } + + if (!empty($data) && array_key_exists($path, $data)) { + return $data[$path]; + } + + return false; + } + + protected function getRemote($path, $method = 'GET', $data = array()) + { + $base = 'https://akaunting.com/api/'; + + $client = new Client(['verify' => false, 'base_uri' => $base]); + + $headers['headers'] = [ + 'Authorization' => 'Bearer ' . setting('general.api_token'), + 'Accept' => 'application/json', + 'Referer' => env('APP_URL'), + 'Akaunting' => version('short'), + ]; + + $data['http_errors'] = false; + + $data = array_merge($data, $headers); + + try { + $result = $client->request($method, $path, $data); + } catch (RequestException $e) { + $result = false; + } + + return $result; + } +} diff --git a/app/Traits/Recurring.php b/app/Traits/Recurring.php new file mode 100755 index 0000000..5e07980 --- /dev/null +++ b/app/Traits/Recurring.php @@ -0,0 +1,150 @@ +get('recurring_frequency') == 'no') { + return; + } + + $frequency = ($request['recurring_frequency'] != 'custom') ? $request['recurring_frequency'] : $request['recurring_custom_frequency']; + $interval = ($request['recurring_frequency'] != 'custom') ? 1 : (int) $request['recurring_interval']; + $started_at = $request->get('paid_at') ?: ($request->get('invoiced_at') ?: $request->get('billed_at')); + + $this->recurring()->create([ + 'company_id' => session('company_id'), + 'frequency' => $frequency, + 'interval' => $interval, + 'started_at' => $started_at, + 'count' => (int) $request['recurring_count'], + ]); + } + + public function updateRecurring() + { + $request = request(); + + if ($request->get('recurring_frequency') == 'no') { + $this->recurring()->delete(); + return; + } + + $frequency = ($request['recurring_frequency'] != 'custom') ? $request['recurring_frequency'] : $request['recurring_custom_frequency']; + $interval = ($request['recurring_frequency'] != 'custom') ? 1 : (int) $request['recurring_interval']; + $started_at = $request->get('paid_at') ?: ($request->get('invoiced_at') ?: $request->get('billed_at')); + + $recurring = $this->recurring(); + + if ($recurring->count()) { + $function = 'update'; + } else { + $function = 'create'; + } + + $recurring->$function([ + 'company_id' => session('company_id'), + 'frequency' => $frequency, + 'interval' => $interval, + 'started_at' => $started_at, + 'count' => (int) $request['recurring_count'], + ]); + } + + public function current() + { + if (!$schedule = $this->schedule()) { + return false; + } + + return $schedule->current()->getStart(); + } + + public function next() + { + if (!$schedule = $this->schedule()) { + return false; + } + + if (!$next = $schedule->next()) { + return false; + } + + return $next->getStart(); + } + + public function first() + { + if (!$schedule = $this->schedule()) { + return false; + } + + return $schedule->first()->getStart(); + } + + public function last() + { + if (!$schedule = $this->schedule()) { + return false; + } + + return $schedule->last()->getStart(); + } + + public function schedule() + { + $config = new ArrayTransformerConfig(); + $config->enableLastDayOfMonthFix(); + + $transformer = new ArrayTransformer(); + $transformer->setConfig($config); + + return $transformer->transform($this->getRule()); + } + + public function getRule() + { + $rule = (new Rule()) + ->setStartDate($this->getRuleStartDate()) + ->setTimezone($this->getRuleTimeZone()) + ->setFreq($this->getRuleFrequency()) + ->setInterval($this->interval); + + // 0 means infinite + if ($this->count != 0) { + $rule->setCount($this->getRuleCount()); + } + + return $rule; + } + + public function getRuleStartDate() + { + return new \DateTime($this->started_at, new \DateTimeZone($this->getRuleTimeZone())); + } + + public function getRuleTimeZone() + { + return setting('general.timezone'); + } + + public function getRuleCount() + { + // Fix for humans + return $this->count + 1; + } + + public function getRuleFrequency() + { + return strtoupper($this->frequency); + } +} \ No newline at end of file diff --git a/app/Traits/SiteApi.php b/app/Traits/SiteApi.php new file mode 100755 index 0000000..3a07eb0 --- /dev/null +++ b/app/Traits/SiteApi.php @@ -0,0 +1,36 @@ + false, 'base_uri' => $base]); + + $headers['headers'] = array( + 'Authorization' => 'Bearer ' . setting('general.api_token'), + 'Accept' => 'application/json', + 'Referer' => env('APP_URL'), + 'Akaunting' => version('short') + ); + + $data['http_errors'] = false; + + $data = array_merge($data, $headers); + + try { + $result = $client->get($url, $data); + } catch (RequestException $e) { + $result = $e; + } + + return $result; + } +} diff --git a/app/Traits/Uploads.php b/app/Traits/Uploads.php new file mode 100755 index 0000000..8adfbd2 --- /dev/null +++ b/app/Traits/Uploads.php @@ -0,0 +1,49 @@ +isValid()) { + return $path; + } + + if (!$company_id) { + $company_id = session('company_id'); + } + + $file_name = $file->getClientOriginalName(); + + // Upload file + $file->storeAs($company_id . '/' . $folder, $file_name); + + // Prepare db path + $path = $folder . '/' . $file_name; + + return $path; + } + + public function getMedia($file, $folder = 'settings', $company_id = null) + { + $path = ''; + + if (!$file || !$file->isValid()) { + return $path; + } + + if (!$company_id) { + $company_id = session('company_id'); + } + + $path = $company_id . '/' . $folder; + + return MediaUploader::fromSource($file)->toDirectory($path)->upload(); + } +} diff --git a/app/Transformers/Auth/Permission.php b/app/Transformers/Auth/Permission.php new file mode 100755 index 0000000..ef04d22 --- /dev/null +++ b/app/Transformers/Auth/Permission.php @@ -0,0 +1,24 @@ + $model->id, + 'name' => $model->display_name, + 'code' => $model->name, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } +} diff --git a/app/Transformers/Auth/Role.php b/app/Transformers/Auth/Role.php new file mode 100755 index 0000000..932a26f --- /dev/null +++ b/app/Transformers/Auth/Role.php @@ -0,0 +1,38 @@ + $model->id, + 'name' => $model->display_name, + 'code' => $model->name, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Collection + */ + public function includePermissions(Model $model) + { + return $this->collection($model->permissions, new Permission()); + } +} diff --git a/app/Transformers/Auth/User.php b/app/Transformers/Auth/User.php new file mode 100755 index 0000000..e7c0983 --- /dev/null +++ b/app/Transformers/Auth/User.php @@ -0,0 +1,48 @@ + $model->id, + 'name' => $model->name, + 'email' => $model->email, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Collection + */ + public function includeCompanies(Model $model) + { + return $this->collection($model->companies, new Company()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Collection + */ + public function includeRoles(Model $model) + { + return $this->collection($model->roles, new Role()); + } +} diff --git a/app/Transformers/Banking/Account.php b/app/Transformers/Banking/Account.php new file mode 100755 index 0000000..2195599 --- /dev/null +++ b/app/Transformers/Banking/Account.php @@ -0,0 +1,32 @@ + $model->id, + 'company_id' => $model->company_id, + 'name' => $model->name, + 'number' => $model->number, + 'currency_code' => $model->currency_code, + 'opening_balance' => $model->opening_balance, + 'current_balance' => $model->balance, + 'bank_name' => $model->bank_name, + 'bank_phone' => $model->bank_phone, + 'bank_address' => $model->bank_address, + 'enabled' => $model->enabled, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } +} diff --git a/app/Transformers/Banking/Transfer.php b/app/Transformers/Banking/Transfer.php new file mode 100755 index 0000000..e55beae --- /dev/null +++ b/app/Transformers/Banking/Transfer.php @@ -0,0 +1,50 @@ + $model->id, + 'company_id' => $model->company_id, + 'payment_id' => $model->payment_id, + 'revenue_id' => $model->revenue_id, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includePayment(Model $model) + { + return $this->item($model->payment, new Payment()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includeRevenue(Model $model) + { + return $this->item($model->revenue, new Revenue()); + } +} diff --git a/app/Transformers/Common/Company.php b/app/Transformers/Common/Company.php new file mode 100755 index 0000000..acfdce7 --- /dev/null +++ b/app/Transformers/Common/Company.php @@ -0,0 +1,33 @@ + $model->id, + 'name' => $model->company_name, + 'email' => $model->company_email, + 'domain' => $model->domain, + 'address' => $model->company_address, + 'logo' => $model->company_logo, + 'default_account' => $model->default_account, + 'default_currency' => $model->default_currency, + 'default_tax' => $model->default_tax, + 'default_payment_method' => $model->default_payment_method, + 'default_language' => $model->default_language, + 'enabled' => $model->enabled, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } +} diff --git a/app/Transformers/Common/Item.php b/app/Transformers/Common/Item.php new file mode 100755 index 0000000..4cc2a68 --- /dev/null +++ b/app/Transformers/Common/Item.php @@ -0,0 +1,66 @@ + $model->id, + 'company_id' => $model->company_id, + 'name' => $model->name, + 'sku' => $model->sku, + 'description' => $model->description, + 'sale_price' => $model->sale_price, + 'purchase_price' => $model->purchase_price, + 'quantity' => $model->quantity, + 'category_id' => $model->category_id, + 'tax_id' => $model->tax_id, + 'picture' => $model->picture, + 'enabled' => $model->enabled, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } + + /** + * @param Model $model + * @return mixed + */ + public function includeTax(Model $model) + { + if (!$model->tax) { + return $this->null(); + } + + return $this->item($model->tax, new Tax()); + } + + /** + * @param Model $model + * @return mixed + */ + public function includeCategory(Model $model) + { + if (!$model->category) { + return $this->null(); + } + + return $this->item($model->category, new Category()); + } +} diff --git a/app/Transformers/Company/Company.php b/app/Transformers/Company/Company.php new file mode 100755 index 0000000..7726c96 --- /dev/null +++ b/app/Transformers/Company/Company.php @@ -0,0 +1,8 @@ + $model->id, + 'company_id' => $model->company_id, + 'bill_number' => $model->bill_number, + 'order_number' => $model->order_number, + 'bill_status_code' => $model->invoice_status_code, + 'billed_at' => $model->billed_at->toIso8601String(), + 'due_at' => $model->due_at->toIso8601String(), + 'amount' => $model->amount, + 'currency_code' => $model->currency_code, + 'currency_rate' => $model->currency_rate, + 'vendor_id' => $model->vendor_id, + 'vendor_name' => $model->vendor_name, + 'vendor_email' => $model->vendor_email, + 'vendor_tax_number' => $model->vendor_tax_number, + 'vendor_phone' => $model->vendor_phone, + 'vendor_address' => $model->vendor_address, + 'notes' => $model->notes, + 'attachment' => $model->attachment, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includeCurrency(Model $model) + { + return $this->item($model->currency, new Currency()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Collection + */ + public function includeHistories(Model $model) + { + return $this->collection($model->histories, new BillHistories()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Collection + */ + public function includeItems(Model $model) + { + return $this->collection($model->items, new BillItems()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Collection + */ + public function includePayments(Model $model) + { + return $this->collection($model->payments, new BillPayments()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includeStatus(Model $model) + { + return $this->item($model->status, new BillStatus()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includeVendor(Model $model) + { + return $this->item($model->vendor, new Vendor()); + } +} diff --git a/app/Transformers/Expense/BillHistories.php b/app/Transformers/Expense/BillHistories.php new file mode 100755 index 0000000..e679bb8 --- /dev/null +++ b/app/Transformers/Expense/BillHistories.php @@ -0,0 +1,27 @@ + $model->id, + 'company_id' => $model->company_id, + 'bill_id' => $model->bill_id, + 'status_code' => $model->status_code, + 'notify' => $model->notify, + 'description' => $model->description, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } +} diff --git a/app/Transformers/Expense/BillItems.php b/app/Transformers/Expense/BillItems.php new file mode 100755 index 0000000..d3488ce --- /dev/null +++ b/app/Transformers/Expense/BillItems.php @@ -0,0 +1,32 @@ + $model->id, + 'company_id' => $model->company_id, + 'bill_id' => $model->bill_id, + 'item_id' => $model->item_id, + 'name' => $model->name, + 'sku' => $model->sku, + 'quantity' => $model->quantity, + 'price' => $model->price, + 'total' => $model->total, + 'tax' => $model->tax, + 'tax_id' => $model->tax_id, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } +} diff --git a/app/Transformers/Expense/BillPayments.php b/app/Transformers/Expense/BillPayments.php new file mode 100755 index 0000000..ed314cc --- /dev/null +++ b/app/Transformers/Expense/BillPayments.php @@ -0,0 +1,58 @@ + $model->id, + 'company_id' => $model->company_id, + 'bill_id' => $model->bill_id, + 'account_id' => $model->account_id, + 'paid_at' => $model->paid_at->toIso8601String(), + 'amount' => $model->amount, + 'currency_code' => $model->currency_code, + 'currency_rate' => $model->currency_rate, + 'description' => $model->description, + 'payment_method' => $model->payment_method, + 'reference' => $model->reference, + 'attachment' => $model->attachment, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includeAccount(Model $model) + { + return $this->item($model->account, new Account()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includeCurrency(Model $model) + { + return $this->item($model->currency, new Currency()); + } +} diff --git a/app/Transformers/Expense/BillStatus.php b/app/Transformers/Expense/BillStatus.php new file mode 100755 index 0000000..216f302 --- /dev/null +++ b/app/Transformers/Expense/BillStatus.php @@ -0,0 +1,25 @@ + $model->id, + 'company_id' => $model->company_id, + 'name' => $model->name, + 'code' => $model->code, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } +} diff --git a/app/Transformers/Expense/BillTotals.php b/app/Transformers/Expense/BillTotals.php new file mode 100755 index 0000000..c51b46c --- /dev/null +++ b/app/Transformers/Expense/BillTotals.php @@ -0,0 +1,29 @@ + $model->id, + 'company_id' => $model->company_id, + 'bill_id' => $model->bill_id, + 'code' => $model->code, + 'name' => $model->name, + 'amount' => $model->amount, + 'sort_order' => $model->sort_order, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } +} diff --git a/app/Transformers/Expense/Payment.php b/app/Transformers/Expense/Payment.php new file mode 100755 index 0000000..41c52e4 --- /dev/null +++ b/app/Transformers/Expense/Payment.php @@ -0,0 +1,83 @@ + $model->id, + 'company_id' => $model->company_id, + 'account_id' => $model->account_id, + 'paid_at' => $model->paid_at->toIso8601String(), + 'amount' => $model->amount, + 'currency_code' => $model->currency_code, + 'currency_rate' => $model->currency_rate, + 'vendor_id' => $model->vendor_id, + 'description' => $model->description, + 'category_id' => $model->category_id, + 'payment_method' => $model->payment_method, + 'reference' => $model->reference, + 'attachment' => $model->attachment, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includeAccount(Model $model) + { + return $this->item($model->account, new Account()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includeCategory(Model $model) + { + return $this->item($model->category, new Category()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includeCurrency(Model $model) + { + return $this->item($model->currency, new Currency()); + } + + /** + * @param Model $model + * @return mixed + */ + public function includeVendor(Model $model) + { + if (!$model->vendor) { + return $this->null(); + } + + return $this->item($model->vendor, new Vendor()); + } +} diff --git a/app/Transformers/Expense/Vendor.php b/app/Transformers/Expense/Vendor.php new file mode 100755 index 0000000..e9f7569 --- /dev/null +++ b/app/Transformers/Expense/Vendor.php @@ -0,0 +1,32 @@ + $model->id, + 'company_id' => $model->company_id, + 'user_id' => $model->user_id, + 'name' => $model->name, + 'email' => $model->email, + 'tax_number' => $model->tax_number, + 'phone' => $model->phone, + 'address' => $model->address, + 'website' => $model->website, + 'currency_code' => $model->currency_code, + 'enabled' => $model->enabled, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } +} diff --git a/app/Transformers/Income/Customer.php b/app/Transformers/Income/Customer.php new file mode 100755 index 0000000..0d9d642 --- /dev/null +++ b/app/Transformers/Income/Customer.php @@ -0,0 +1,32 @@ + $model->id, + 'company_id' => $model->company_id, + 'user_id' => $model->user_id, + 'name' => $model->name, + 'email' => $model->email, + 'tax_number' => $model->tax_number, + 'phone' => $model->phone, + 'address' => $model->address, + 'website' => $model->website, + 'currency_code' => $model->currency_code, + 'enabled' => $model->enabled, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } +} diff --git a/app/Transformers/Income/Invoice.php b/app/Transformers/Income/Invoice.php new file mode 100755 index 0000000..85edca9 --- /dev/null +++ b/app/Transformers/Income/Invoice.php @@ -0,0 +1,104 @@ + $model->id, + 'company_id' => $model->company_id, + 'invoice_number' => $model->invoice_number, + 'order_number' => $model->order_number, + 'invoice_status_code' => $model->invoice_status_code, + 'invoiced_at' => $model->invoiced_at->toIso8601String(), + 'due_at' => $model->due_at->toIso8601String(), + 'amount' => $model->amount, + 'currency_code' => $model->currency_code, + 'currency_rate' => $model->currency_rate, + 'customer_id' => $model->customer_id, + 'customer_name' => $model->customer_name, + 'customer_email' => $model->customer_email, + 'customer_tax_number' => $model->customer_tax_number, + 'customer_phone' => $model->customer_phone, + 'customer_address' => $model->customer_address, + 'notes' => $model->notes, + 'attachment' => $model->attachment, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includeCurrency(Model $model) + { + return $this->item($model->currency, new Currency()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includeCustomer(Model $model) + { + return $this->item($model->customer, new Customer()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Collection + */ + public function includeHistories(Model $model) + { + return $this->collection($model->histories, new InvoiceHistories()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Collection + */ + public function includeItems(Model $model) + { + return $this->collection($model->items, new InvoiceItems()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Collection + */ + public function includePayments(Model $model) + { + return $this->collection($model->payments, new InvoicePayments()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includeStatus(Model $model) + { + return $this->item($model->status, new InvoiceStatus()); + } +} diff --git a/app/Transformers/Income/InvoiceHistories.php b/app/Transformers/Income/InvoiceHistories.php new file mode 100755 index 0000000..8e2ad7b --- /dev/null +++ b/app/Transformers/Income/InvoiceHistories.php @@ -0,0 +1,27 @@ + $model->id, + 'company_id' => $model->company_id, + 'invoice_id' => $model->invoice_id, + 'status_code' => $model->status_code, + 'notify' => $model->notify, + 'description' => $model->description, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } +} diff --git a/app/Transformers/Income/InvoiceItems.php b/app/Transformers/Income/InvoiceItems.php new file mode 100755 index 0000000..8ce9c0f --- /dev/null +++ b/app/Transformers/Income/InvoiceItems.php @@ -0,0 +1,32 @@ + $model->id, + 'company_id' => $model->company_id, + 'invoice_id' => $model->invoice_id, + 'item_id' => $model->item_id, + 'name' => $model->name, + 'sku' => $model->sku, + 'quantity' => $model->quantity, + 'price' => $model->price, + 'total' => $model->total, + 'tax' => $model->tax, + 'tax_id' => $model->tax_id, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } +} diff --git a/app/Transformers/Income/InvoicePayments.php b/app/Transformers/Income/InvoicePayments.php new file mode 100755 index 0000000..4e9cc72 --- /dev/null +++ b/app/Transformers/Income/InvoicePayments.php @@ -0,0 +1,58 @@ + $model->id, + 'company_id' => $model->company_id, + 'invoice_id' => $model->invoice_id, + 'account_id' => $model->account_id, + 'paid_at' => $model->paid_at->toIso8601String(), + 'amount' => $model->amount, + 'currency_code' => $model->currency_code, + 'currency_rate' => $model->currency_rate, + 'description' => $model->description, + 'payment_method' => $model->payment_method, + 'reference' => $model->reference, + 'attachment' => $model->attachment, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includeAccount(Model $model) + { + return $this->item($model->account, new Account()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includeCurrency(Model $model) + { + return $this->item($model->currency, new Currency()); + } +} diff --git a/app/Transformers/Income/InvoiceStatus.php b/app/Transformers/Income/InvoiceStatus.php new file mode 100755 index 0000000..76d029f --- /dev/null +++ b/app/Transformers/Income/InvoiceStatus.php @@ -0,0 +1,25 @@ + $model->id, + 'company_id' => $model->company_id, + 'name' => $model->name, + 'code' => $model->code, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } +} diff --git a/app/Transformers/Income/InvoiceTotals.php b/app/Transformers/Income/InvoiceTotals.php new file mode 100755 index 0000000..025c9b6 --- /dev/null +++ b/app/Transformers/Income/InvoiceTotals.php @@ -0,0 +1,29 @@ + $model->id, + 'company_id' => $model->company_id, + 'invoice_id' => $model->invoice_id, + 'code' => $model->code, + 'name' => $model->name, + 'amount' => $model->amount, + 'sort_order' => $model->sort_order, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } +} diff --git a/app/Transformers/Income/Revenue.php b/app/Transformers/Income/Revenue.php new file mode 100755 index 0000000..daf7f7e --- /dev/null +++ b/app/Transformers/Income/Revenue.php @@ -0,0 +1,83 @@ + $model->id, + 'company_id' => $model->company_id, + 'account_id' => $model->account_id, + 'paid_at' => $model->paid_at->toIso8601String(), + 'amount' => $model->amount, + 'currency_code' => $model->currency_code, + 'currency_rate' => $model->currency_rate, + 'customer_id' => $model->customer_id, + 'description' => $model->description, + 'category_id' => $model->category_id, + 'payment_method' => $model->payment_method, + 'reference' => $model->reference, + 'attachment' => $model->attachment, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includeAccount(Model $model) + { + return $this->item($model->account, new Account()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includeCategory(Model $model) + { + return $this->item($model->category, new Category()); + } + + /** + * @param Model $model + * @return \League\Fractal\Resource\Item + */ + public function includeCurrency(Model $model) + { + return $this->item($model->currency, new Currency()); + } + + /** + * @param Model $model + * @return mixed + */ + public function includeCustomer(Model $model) + { + if (!$model->customer) { + return $this->null(); + } + + return $this->item($model->customer, new Customer()); + } +} diff --git a/app/Transformers/Item/Item.php b/app/Transformers/Item/Item.php new file mode 100755 index 0000000..12948fd --- /dev/null +++ b/app/Transformers/Item/Item.php @@ -0,0 +1,8 @@ + $model->id, + 'company_id' => $model->company_id, + 'name' => $model->name, + 'type' => $model->type, + 'color' => $model->color, + 'enabled' => $model->enabled, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } +} diff --git a/app/Transformers/Setting/Currency.php b/app/Transformers/Setting/Currency.php new file mode 100755 index 0000000..5f235fe --- /dev/null +++ b/app/Transformers/Setting/Currency.php @@ -0,0 +1,32 @@ + $model->id, + 'company_id' => $model->company_id, + 'name' => $model->name, + 'code' => $model->code, + 'rate' => $model->rate, + 'enabled' => $model->enabled, + 'precision' => $model->precision, + 'symbol' => $model->symbol, + 'symbol_first' => $model->symbol_first, + 'decimal_mark' => $model->decimal_mark, + 'thousands_separator' => $model->thousands_separator, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } +} diff --git a/app/Transformers/Setting/Setting.php b/app/Transformers/Setting/Setting.php new file mode 100755 index 0000000..733b061 --- /dev/null +++ b/app/Transformers/Setting/Setting.php @@ -0,0 +1,23 @@ + $model->id, + 'company_id' => $model->company_id, + 'key' => $model->key, + 'value' => $model->value, + ]; + } +} diff --git a/app/Transformers/Setting/Tax.php b/app/Transformers/Setting/Tax.php new file mode 100755 index 0000000..be4deb6 --- /dev/null +++ b/app/Transformers/Setting/Tax.php @@ -0,0 +1,26 @@ + $model->id, + 'company_id' => $model->company_id, + 'name' => $model->name, + 'rate' => $model->rate, + 'enabled' => $model->enabled, + 'created_at' => $model->created_at->toIso8601String(), + 'updated_at' => $model->updated_at->toIso8601String(), + ]; + } +} diff --git a/app/Utilities/Import.php b/app/Utilities/Import.php new file mode 100755 index 0000000..f39aee5 --- /dev/null +++ b/app/Utilities/Import.php @@ -0,0 +1,117 @@ +each(function ($sheet) use (&$success, $slug) { + if (!static::isValidSheetName($sheet, $slug)) { + $message = trans('messages.error.import_sheet'); + + flash($message)->error()->important(); + + return false; + } + + if (!$success = static::createFromSheet($sheet, $slug)) { + return false; + } + }); + + return $success; + } + + public static function createFromSheet($sheet, $slug) + { + $success = true; + + $model = '\App\Models\\' . $slug; + $request = '\App\Http\Requests\\' . $slug; + + if (!class_exists($model) || !class_exists($request)) { + return false; + } + + // Loop through all rows + $sheet->each(function ($row, $index) use ($sheet, &$success, $model, $request) { + $data = static::fixRow($row->toArray()); + + // Set the line values so that request class could validate + request()->merge($data); + + try { + app($request); + + $data['company_id'] = session('company_id'); + + $model::create($data); + } catch (ValidationException $e) { + $message = trans('messages.error.import_column', [ + 'message' => $e->validator->errors()->first(), + 'sheet' => $sheet->getTitle(), + 'line' => $index + 2, + ]); + + flash($message)->error()->important(); + + $success = false; + + // Break the import process + return false; + } + + // Unset added line values + foreach ($data as $key => $value) { + request()->offsetUnset($key); + } + }); + + return $success; + } + + public static function isValidSheetName($sheet, $slug) + { + $t = explode('\\', $slug); + + if (empty($t[1])) { + return false; + } + + if ($sheet->getTitle() != str_plural(snake_case($t[1]))) { + return false; + } + + return true; + } + + protected static function fixRow($data) + { + // Fix the date fields + $date_fields = ['paid_at', 'due_at', 'billed_at', 'invoiced_at']; + foreach ($date_fields as $date_field) { + if (empty($data[$date_field])) { + continue; + } + + $new_date = Date::parse($data[$date_field])->format('Y-m-d') . ' ' . Date::now()->format('H:i:s'); + + $data[$date_field] = $new_date; + } + + // Make enabled field integer + if (isset($data['enabled'])) { + $data['enabled'] = (int) $data['enabled']; + } + + return $data; + } +} \ No newline at end of file diff --git a/app/Utilities/ImportFile.php b/app/Utilities/ImportFile.php new file mode 100755 index 0000000..049c22e --- /dev/null +++ b/app/Utilities/ImportFile.php @@ -0,0 +1,29 @@ +hasFile('import')) { + flash(trans('messages.error.no_file'))->error(); + + redirect()->back()->send(); + } + + $folder = session('company_id') . '/imports'; + + // Upload file + $path = Storage::path($request->file('import')->store($folder)); + + return $path; + } + +} \ No newline at end of file diff --git a/app/Utilities/Info.php b/app/Utilities/Info.php new file mode 100755 index 0000000..1f20c86 --- /dev/null +++ b/app/Utilities/Info.php @@ -0,0 +1,49 @@ +count(); + + return $data; + } + + public static function phpVersion() + { + return phpversion(); + } + + public static function mysqlVersion() + { + if(env('DB_CONNECTION') === 'mysql') + { + return DB::selectOne('select version() as mversion')->mversion; + } + + return "N/A"; + } +} \ No newline at end of file diff --git a/app/Utilities/Installer.php b/app/Utilities/Installer.php new file mode 100755 index 0000000..5d6f811 --- /dev/null +++ b/app/Utilities/Installer.php @@ -0,0 +1,282 @@ + 'Safe Mode']); + } + + if (ini_get('register_globals')) { + $requirements[] = trans('install.requirements.disabled', ['feature' => 'Register Globals']); + } + + if (ini_get('magic_quotes_gpc')) { + $requirements[] = trans('install.requirements.disabled', ['feature' => 'Magic Quotes']); + } + + if (!ini_get('file_uploads')) { + $requirements[] = trans('install.requirements.enabled', ['feature' => 'File Uploads']); + } + + if (!class_exists('PDO')) { + $requirements[] = trans('install.requirements.extension', ['extension' => 'MySQL PDO']); + } + + if (!extension_loaded('openssl')) { + $requirements[] = trans('install.requirements.extension', ['extension' => 'OpenSSL']); + } + + if (!extension_loaded('tokenizer')) { + $requirements[] = trans('install.requirements.extension', ['extension' => 'Tokenizer']); + } + + if (!extension_loaded('mbstring')) { + $requirements[] = trans('install.requirements.extension', ['extension' => 'mbstring']); + } + + if (!extension_loaded('curl')) { + $requirements[] = trans('install.requirements.extension', ['extension' => 'cURL']); + } + + if (!extension_loaded('xml')) { + $requirements[] = trans('install.requirements.extension', ['extension' => 'XML']); + } + + if (!extension_loaded('zip')) { + $requirements[] = trans('install.requirements.extension', ['extension' => 'ZIP']); + } + + if (!extension_loaded('fileinfo')) { + $requirements[] = trans('install.requirements.extension', ['extension' => 'FileInfo']); + } + + if (!is_writable(base_path('storage/app'))) { + $requirements[] = trans('install.requirements.directory', ['directory' => 'storage/app']); + } + + if (!is_writable(base_path('storage/app/uploads'))) { + $requirements[] = trans('install.requirements.directory', ['directory' => 'storage/app/uploads']); + } + + if (!is_writable(base_path('storage/framework'))) { + $requirements[] = trans('install.requirements.directory', ['directory' => 'storage/framework']); + } + + if (!is_writable(base_path('storage/logs'))) { + $requirements[] = trans('install.requirements.directory', ['directory' => 'storage/logs']); + } + + return $requirements; + } + + /** + * Create a default .env file. + * + * @return void + */ + public static function createDefaultEnvFile() + { + // Rename file + if (is_file(base_path('.env.example'))) { + File::move(base_path('.env.example'), base_path('.env')); + } + + // Update .env file + static::updateEnv([ + 'APP_KEY' => 'base64:'.base64_encode(random_bytes(32)), + 'APP_URL' => url('/'), + ]); + } + + public static function createDbTables($host, $port, $database, $username, $password) + { + if (!static::isDbValid($host, $port, $database, $username, $password)) { + return false; + } + + // Set database details + static::saveDbVariables($host, $port, $database, $username, $password); + + // Try to increase the maximum execution time + set_time_limit(300); // 5 minutes + + // Create tables + Artisan::call('migrate', ['--force' => true]); + + // Create Roles + Artisan::call('db:seed', ['--class' => 'Database\Seeds\Roles', '--force' => true]); + + return true; + } + + /** + * Check if the database exists and is accessible. + * + * @param $host + * @param $port + * @param $database + * @param $host + * @param $database + * @param $username + * @param $password + * + * @return bool + */ + public static function isDbValid($host, $port, $database, $username, $password) + { + Config::set('database.connections.install_test', [ + 'host' => $host, + 'port' => $port, + 'database' => $database, + 'username' => $username, + 'password' => $password, + 'driver' => env('DB_CONNECTION', 'mysql'), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + ]); + + try { + DB::connection('install_test')->getPdo(); + } catch (\Exception $e) {; + return false; + } + + // Purge test connection + DB::purge('install_test'); + + return true; + } + + public static function saveDbVariables($host, $port, $database, $username, $password) + { + $prefix = strtolower(str_random(3) . '_'); + + // Update .env file + static::updateEnv([ + 'DB_HOST' => $host, + 'DB_PORT' => $port, + 'DB_DATABASE' => $database, + 'DB_USERNAME' => $username, + 'DB_PASSWORD' => $password, + 'DB_PREFIX' => $prefix, + ]); + + $con = env('DB_CONNECTION', 'mysql'); + + // Change current connection + $db = Config::get('database.connections.' . $con); + + $db['host'] = $host; + $db['database'] = $database; + $db['username'] = $username; + $db['password'] = $password; + $db['prefix'] = $prefix; + + Config::set('database.connections.' . $con, $db); + + DB::purge($con); + DB::reconnect($con); + } + + public static function createCompany($name, $email, $locale) + { + // Create company + $company = Company::create([ + 'domain' => '', + ]); + + // Set settings + setting()->set([ + 'general.company_name' => $name, + 'general.company_email' => $email, + 'general.default_currency' => 'USD', + 'general.default_locale' => $locale, + ]); + setting()->setExtraColumns(['company_id' => $company->id]); + setting()->save(); + } + + public static function createUser($email, $password, $locale) + { + // Create the user + $user = User::create([ + 'name' => '', + 'email' => $email, + 'password' => $password, + 'locale' => $locale, + ]); + + // Attach admin role + $user->roles()->attach('1'); + + // Attach company + $user->companies()->attach('1'); + } + + public static function finalTouches() + { + // Update .env file + static::updateEnv([ + 'APP_LOCALE' => session('locale'), + 'APP_INSTALLED' => 'true', + 'APP_DEBUG' => 'false', + ]); + + // Rename the robots.txt file + try { + File::move(base_path('robots.txt.dist'), base_path('robots.txt')); + } catch (\Exception $e) { + // nothing to do + } + } + + public static function updateEnv($data) + { + if (empty($data) || !is_array($data) || !is_file(base_path('.env'))) { + return false; + } + + $env = file_get_contents(base_path('.env')); + + $env = explode("\n", $env); + + foreach ($data as $data_key => $data_value) { + foreach ($env as $env_key => $env_value) { + $entry = explode('=', $env_value, 2); + + // Check if new or old key + if ($entry[0] == $data_key) { + $env[$env_key] = $data_key . '=' . $data_value; + } else { + $env[$env_key] = $env_value; + } + } + } + + $env = implode("\n", $env); + + file_put_contents(base_path('.env'), $env); + + return true; + } +} diff --git a/app/Utilities/Modules.php b/app/Utilities/Modules.php new file mode 100755 index 0000000..f5495c2 --- /dev/null +++ b/app/Utilities/Modules.php @@ -0,0 +1,75 @@ +user()->customer; + + if ($customer && $type != 'all') { + $payment_methods = Cache::get($cache_customer); + } + + if (!empty($payment_methods)) { + return $payment_methods; + } + + $gateways = []; + $methods = []; + + // Fire the event to extend the menu + $results = event(new PaymentGatewayListing($gateways)); + + foreach ($results as $gateways) { + foreach ($gateways as $gateway) { + if (!isset($gateway['name']) || !isset($gateway['code'])) { + continue; + } + + if (($customer && empty($gateway['customer'])) && $type != 'all') { + continue; + } + + $methods[] = $gateway; + } + } + + $sort_order = []; + + if ($methods) { + foreach ($methods as $key => $value) { + $sort_order[$key] = !empty($value['order']) ? $value['order'] : 0; + } + + array_multisort($sort_order, SORT_ASC, $methods); + + foreach ($methods as $method) { + $payment_methods[$method['code']] = $method['name']; + } + } + + if ($customer) { + Cache::put($cache_customer, $payment_methods, Date::now()->addHour(6)); + } else { + Cache::put($cache_admin, $payment_methods, Date::now()->addHour(6)); + } + + return ($payment_methods) ? $payment_methods : []; + } +} diff --git a/app/Utilities/Overrider.php b/app/Utilities/Overrider.php new file mode 100755 index 0000000..e9bc785 --- /dev/null +++ b/app/Utilities/Overrider.php @@ -0,0 +1,82 @@ +setExtraColumns(['company_id' => static::$company_id]); + setting()->load(true); + + // Timezone + config(['app.timezone' => setting('general.timezone', 'UTC')]); + + // Email + $email_protocol = setting('general.email_protocol', 'mail'); + config(['mail.driver' => $email_protocol]); + config(['mail.from.name' => setting('general.company_name')]); + config(['mail.from.address' => setting('general.company_email')]); + + if ($email_protocol == 'sendmail') { + config(['mail.sendmail' => setting('general.email_sendmail_path')]); + } elseif ($email_protocol == 'smtp') { + config(['mail.host' => setting('general.email_smtp_host')]); + config(['mail.port' => setting('general.email_smtp_port')]); + config(['mail.username' => setting('general.email_smtp_username')]); + config(['mail.password' => setting('general.email_smtp_password')]); + config(['mail.encryption' => setting('general.email_smtp_encryption')]); + } + + // Session + config(['session.lifetime' => setting('general.session_lifetime', '30')]); + + // Locale + if (session('locale') == '') { + //App::setLocale(setting('general.default_language')); + //Session::put('locale', setting('general.default_language')); + config(['app.locale' => setting('general.default_locale')]); + } + } + + protected static function loadCurrencies() + { + $currencies = Currency::all(); + + foreach ($currencies as $currency) { + if (!isset($currency->precision)) { + continue; + } + + config(['money.' . $currency->code . '.precision' => $currency->precision]); + config(['money.' . $currency->code . '.symbol' => $currency->symbol]); + config(['money.' . $currency->code . '.symbol_first' => $currency->symbol_first]); + config(['money.' . $currency->code . '.decimal_mark' => $currency->decimal_mark]); + config(['money.' . $currency->code . '.thousands_separator' => $currency->thousands_separator]); + } + + // Set currencies with new settings + \Akaunting\Money\Currency::setCurrencies(config('money')); + } + +} \ No newline at end of file diff --git a/app/Utilities/Updater.php b/app/Utilities/Updater.php new file mode 100755 index 0000000..6890f10 --- /dev/null +++ b/app/Utilities/Updater.php @@ -0,0 +1,162 @@ +open($file) !== true) || !$zip->extractTo($temp_path)) { + return false; + } + + $zip->close(); + + // Delete zip file + File::delete($file); + + if ($alias == 'core') { + // Move all files/folders from temp path + if (!File::copyDirectory($temp_path, base_path())) { + return false; + } + } else { + // Get module instance + $module = Module::findByAlias($alias); + $model = Model::where('alias', $alias)->first(); + + // Move all files/folders from temp path + if (!File::copyDirectory($temp_path, module_path($module->get('name')))) { + return false; + } + + // Add history + ModelHistory::create([ + 'company_id' => session('company_id'), + 'module_id' => $model->id, + 'category' => $module->get('category'), + 'version' => $version, + 'description' => trans('modules.history.updated', ['module' => $module->get('name')]), + ]); + } + + // Delete temp directory + File::deleteDirectory($temp_path); + + return true; + } + + public static function download($alias, $version) + { + $file = null; + + // Check core first + $info = Info::all(); + + if ($alias == 'core') { + $url = 'core/download/' . $version . '/' . $info['php'] . '/' . $info['mysql']; + } else { + $url = 'apps/' . $alias . '/download/' . $version . '/' . $info['akaunting'] . '/' . $info['token']; + } + + $response = static::getRemote($url, ['timeout' => 50, 'track_redirects' => true]); + + // Exception + if ($response instanceof RequestException) { + return false; + } + + if ($response && ($response->getStatusCode() == 200)) { + $file = $response->getBody()->getContents(); + } + + return $file; + } + + public static function all() + { + // Get data from cache + $data = Cache::get('updates'); + + if (!empty($data)) { + return $data; + } + + // No data in cache, grab them from remote + $data = array(); + + $modules = Module::all(); + + $versions = Versions::latest($modules); + + foreach ($versions as $alias => $version) { + // Modules come as array + if ($alias == 'core') { + if (version_compare(version('short'), $version) != 0) { + $data['core'] = $version; + } + } else { + $module = Module::findByAlias($alias); + + // Up-to-date + if (version_compare($module->get('version'), $version) == 0) { + continue; + } + + $data[$alias] = $version; + } + } + + Cache::put('updates', $data, Date::now()->addHour(6)); + + return $data; + } +} \ No newline at end of file diff --git a/app/Utilities/Versions.php b/app/Utilities/Versions.php new file mode 100755 index 0000000..c55b3e1 --- /dev/null +++ b/app/Utilities/Versions.php @@ -0,0 +1,118 @@ + false]); + + $json = $http->get($url, ['timeout' => 30])->getBody()->getContents(); + + if (empty($json)) { + return $output; + } + + $parsedown = new Parsedown(); + + $releases = json_decode($json); + + foreach ($releases as $release) { + if (version_compare($release->tag_name, version('short'), '<=')) { + continue; + } + + if ($release->prerelease == true) { + continue; + } + + if (empty($release->body)) { + continue; + } + + $output .= '

'.$release->tag_name.'

'; + + $output .= $parsedown->text($release->body); + + $output .= '
'; + } + + return $output; + } + + public static function latest($modules = array()) + { + // Get data from cache + $data = Cache::get('versions'); + + if (!empty($data)) { + return $data; + } + + $info = Info::all(); + + // No data in cache, grab them from remote + $data = array(); + + // Check core first + $url = 'core/version/' . $info['akaunting'] . '/' . $info['php'] . '/' . $info['mysql'] . '/' . $info['companies']; + + $data['core'] = static::getLatestVersion($url); + + // Then modules + foreach ($modules as $module) { + $alias = $module->get('alias'); + $version = $module->get('version'); + + $url = 'apps/' . $alias . '/version/' . $version . '/' . $info['akaunting']; + + $data[$alias] = static::getLatestVersion($url); + } + + Cache::put('versions', $data, Date::now()->addHour(6)); + + return $data; + } + + public static function getLatestVersion($url) + { + $latest = '0.0.0'; + + $response = static::getRemote($url, ['timeout' => 10, 'referer' => true]); + + // Exception + if ($response instanceof RequestException) { + return $latest; + } + + // Bad response + if (!$response || ($response->getStatusCode() != 200)) { + return $latest; + } + + $content = json_decode($response->getBody()); + + // Empty response + if (!is_object($content) || !is_object($content->data)) { + return $latest; + } + + // Get the latest version + $latest = $content->data->latest; + + return $latest; + } +} diff --git a/artisan b/artisan new file mode 100755 index 0000000..df630d0 --- /dev/null +++ b/artisan @@ -0,0 +1,51 @@ +#!/usr/bin/env php +make(Illuminate\Contracts\Console\Kernel::class); + +$status = $kernel->handle( + $input = new Symfony\Component\Console\Input\ArgvInput, + new Symfony\Component\Console\Output\ConsoleOutput +); + +/* +|-------------------------------------------------------------------------- +| Shutdown The Application +|-------------------------------------------------------------------------- +| +| Once Artisan has finished running. We will fire off the shutdown events +| so that any final work may be done by the application before we shut +| down the process. This is the last thing to happen to the request. +| +*/ + +$kernel->terminate($input, $status); + +exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100755 index 0000000..f2801ad --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,55 @@ +singleton( + Illuminate\Contracts\Http\Kernel::class, + App\Http\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Console\Kernel::class, + App\Console\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + App\Exceptions\Handler::class +); + +/* +|-------------------------------------------------------------------------- +| Return The Application +|-------------------------------------------------------------------------- +| +| This script returns the application instance. The instance is given to +| the calling script so we can separate the building of the instances +| from the actual running of the application and sending responses. +| +*/ + +return $app; diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php new file mode 100755 index 0000000..6299833 --- /dev/null +++ b/bootstrap/autoload.php @@ -0,0 +1,28 @@ + env('API_STANDARDS_TREE', 'vnd'), + + /* + |-------------------------------------------------------------------------- + | API Subtype + |-------------------------------------------------------------------------- + | + | Your subtype will follow the standards tree you use when used in the + | "Accept" header to negotiate the content type and version. + | + | For example: Accept: application/x.SUBTYPE.v1+json + | + */ + + 'subtype' => env('API_SUBTYPE', 'api'), + + /* + |-------------------------------------------------------------------------- + | Default API Version + |-------------------------------------------------------------------------- + | + | This is the default version when strict mode is disabled and your API + | is accessed via a web browser. It's also used as the default version + | when generating your APIs documentation. + | + */ + + 'version' => env('API_VERSION', 'v1'), + + /* + |-------------------------------------------------------------------------- + | Default API Prefix + |-------------------------------------------------------------------------- + | + | A default prefix to use for your API routes so you don't have to + | specify it for each group. + | + */ + + 'prefix' => env('API_PREFIX', 'api'), + + /* + |-------------------------------------------------------------------------- + | Default API Domain + |-------------------------------------------------------------------------- + | + | A default domain to use for your API routes so you don't have to + | specify it for each group. + | + */ + + 'domain' => env('API_DOMAIN', null), + + /* + |-------------------------------------------------------------------------- + | Name + |-------------------------------------------------------------------------- + | + | When documenting your API using the API Blueprint syntax you can + | configure a default name to avoid having to manually specify + | one when using the command. + | + */ + + 'name' => env('API_NAME', 'Akaunting'), + + /* + |-------------------------------------------------------------------------- + | Conditional Requests + |-------------------------------------------------------------------------- + | + | Globally enable conditional requests so that an ETag header is added to + | any successful response. Subsequent requests will perform a check and + | will return a 304 Not Modified. This can also be enabled or disabled + | on certain groups or routes. + | + */ + + 'conditionalRequest' => env('API_CONDITIONAL_REQUEST', true), + + /* + |-------------------------------------------------------------------------- + | Strict Mode + |-------------------------------------------------------------------------- + | + | Enabling strict mode will require clients to send a valid Accept header + | with every request. This also voids the default API version, meaning + | your API will not be browsable via a web browser. + | + */ + + 'strict' => env('API_STRICT', false), + + /* + |-------------------------------------------------------------------------- + | Debug Mode + |-------------------------------------------------------------------------- + | + | Enabling debug mode will result in error responses caused by thrown + | exceptions to have a "debug" key that will be populated with + | more detailed information on the exception. + | + */ + + 'debug' => env('API_DEBUG', true), + + /* + |-------------------------------------------------------------------------- + | Generic Error Format + |-------------------------------------------------------------------------- + | + | When some HTTP exceptions are not caught and dealt with the API will + | generate a generic error response in the format provided. Any + | keys that aren't replaced with corresponding values will be + | removed from the final response. + | + */ + + 'errorFormat' => [ + 'message' => ':message', + 'errors' => ':errors', + 'code' => ':code', + 'status_code' => ':status_code', + 'debug' => ':debug', + ], + + /* + |-------------------------------------------------------------------------- + | API Middleware + |-------------------------------------------------------------------------- + | + | Middleware that will be applied globally to all API requests. + | + */ + + 'middleware' => [ + + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Providers + |-------------------------------------------------------------------------- + | + | The authentication providers that should be used when attempting to + | authenticate an incoming API request. + | + */ + + 'auth' => [ + 'basic' => 'Dingo\Api\Auth\Provider\Basic', + ], + + /* + |-------------------------------------------------------------------------- + | Throttling / Rate Limiting + |-------------------------------------------------------------------------- + | + | Consumers of your API can be limited to the amount of requests they can + | make. You can create your own throttles or simply change the default + | throttles. + | + */ + + 'throttling' => [ + + ], + + /* + |-------------------------------------------------------------------------- + | Response Transformer + |-------------------------------------------------------------------------- + | + | Responses can be transformed so that they are easier to format. By + | default a Fractal transformer will be used to transform any + | responses prior to formatting. You can easily replace + | this with your own transformer. + | + */ + + 'transformer' => env('API_TRANSFORMER', Dingo\Api\Transformer\Adapter\Fractal::class), + + /* + |-------------------------------------------------------------------------- + | Response Formats + |-------------------------------------------------------------------------- + | + | Responses can be returned in multiple formats by registering different + | response formatters. You can also customize an existing response + | formatter. + | + */ + + 'defaultFormat' => env('API_DEFAULT_FORMAT', 'json'), + + 'formats' => [ + + 'json' => Dingo\Api\Http\Response\Format\Json::class, + + ], + +]; diff --git a/config/app.php b/config/app.php new file mode 100755 index 0000000..6bedfca --- /dev/null +++ b/config/app.php @@ -0,0 +1,280 @@ + env('APP_NAME', 'Akaunting'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services your application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'local'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => env('APP_DEBUG', true), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. We have gone + | ahead and set this to a sensible default for you out of the box. + | + */ + + 'timezone' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by the translation service provider. You are free to set this value + | to any of the locales which will be supported by the application. + | + */ + + 'locale' => env('APP_LOCALE', 'en-GB'), + + /* + |-------------------------------------------------------------------------- + | Application Fallback Locale + |-------------------------------------------------------------------------- + | + | The fallback locale determines the locale to use when the current one + | is not available. You may change the value to correspond to any of + | the language folders that are provided through your application. + | + */ + + 'fallback_locale' => 'en-GB', + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is used by the Illuminate encrypter service and should be set + | to a random, 32 character string, otherwise these encrypted strings + | will not be safe. Please do this before deploying an application! + | + */ + + 'key' => env('APP_KEY', 'JustAKeyForAkauntingInstallation'), + + 'cipher' => env('APP_CIPHER', 'AES-256-CBC'), + + /* + |-------------------------------------------------------------------------- + | Logging Configuration + |-------------------------------------------------------------------------- + | + | Here you may configure the log settings for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Settings: "single", "daily", "syslog", "errorlog" + | + */ + + 'log' => env('APP_LOG', 'single'), + + 'log_level' => env('APP_LOG_LEVEL', 'debug'), + + /* + |-------------------------------------------------------------------------- + | Autoloaded Service Providers + |-------------------------------------------------------------------------- + | + | The service providers listed here will be automatically loaded on the + | request to your application. Feel free to add your own services to + | this array to grant expanded functionality to your applications. + | + */ + + 'providers' => [ + + /* + * Laravel Framework Service Providers... + */ + Illuminate\Auth\AuthServiceProvider::class, + Illuminate\Broadcasting\BroadcastServiceProvider::class, + Illuminate\Bus\BusServiceProvider::class, + Illuminate\Cache\CacheServiceProvider::class, + Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, + Illuminate\Cookie\CookieServiceProvider::class, + Illuminate\Database\DatabaseServiceProvider::class, + Illuminate\Encryption\EncryptionServiceProvider::class, + Illuminate\Filesystem\FilesystemServiceProvider::class, + Illuminate\Foundation\Providers\FoundationServiceProvider::class, + Illuminate\Hashing\HashServiceProvider::class, + Illuminate\Mail\MailServiceProvider::class, + Illuminate\Notifications\NotificationServiceProvider::class, + Illuminate\Pagination\PaginationServiceProvider::class, + Illuminate\Pipeline\PipelineServiceProvider::class, + Illuminate\Queue\QueueServiceProvider::class, + Illuminate\Redis\RedisServiceProvider::class, + Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, + Illuminate\Session\SessionServiceProvider::class, + Illuminate\Translation\TranslationServiceProvider::class, + Illuminate\Validation\ValidationServiceProvider::class, + Illuminate\View\ViewServiceProvider::class, + + /* + * Package Service Providers... + */ + Laravel\Tinker\TinkerServiceProvider::class, + + /* + * Application Service Providers... + */ + App\Providers\AppServiceProvider::class, + App\Providers\AuthServiceProvider::class, + // App\Providers\BroadcastServiceProvider::class, + App\Providers\EventServiceProvider::class, + App\Providers\FormServiceProvider::class, + App\Providers\ObserverServiceProvider::class, + App\Providers\RouteServiceProvider::class, + App\Providers\ValidationServiceProvider::class, + App\Providers\ViewComposerServiceProvider::class, + + /* + * Vendor Service Providers... + */ + Akaunting\Language\Provider::class, + Akaunting\Money\Provider::class, + Akaunting\Setting\Provider::class, + Akaunting\Version\Provider::class, + Barryvdh\DomPDF\ServiceProvider::class, + Bkwld\Cloner\ServiceProvider::class, + Collective\Html\HtmlServiceProvider::class, + ConsoleTVs\Charts\ChartsServiceProvider::class, + Dingo\Api\Provider\LaravelServiceProvider::class, + EloquentFilter\ServiceProvider::class, + Fideloper\Proxy\TrustedProxyServiceProvider::class, + Intervention\Image\ImageServiceProvider::class, + Jenssegers\Date\DateServiceProvider::class, + Kyslik\ColumnSortable\ColumnSortableServiceProvider::class, + Laracasts\Flash\FlashServiceProvider::class, + Laratrust\LaratrustServiceProvider::class, + Maatwebsite\Excel\ExcelServiceProvider::class, + Nwidart\Menus\MenusServiceProvider::class, + Nwidart\Modules\LaravelModulesServiceProvider::class, + Sofa\Eloquence\ServiceProvider::class, + Plank\Mediable\MediableServiceProvider::class, + + ], + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. However, feel free to register as many as you wish as + | the aliases are "lazy" loaded so they don't hinder performance. + | + */ + + 'aliases' => [ + + 'App' => Illuminate\Support\Facades\App::class, + 'Artisan' => Illuminate\Support\Facades\Artisan::class, + 'Auth' => Illuminate\Support\Facades\Auth::class, + 'Blade' => Illuminate\Support\Facades\Blade::class, + 'Broadcast' => Illuminate\Support\Facades\Broadcast::class, + 'Bus' => Illuminate\Support\Facades\Bus::class, + 'Cache' => Illuminate\Support\Facades\Cache::class, + 'Config' => Illuminate\Support\Facades\Config::class, + 'Cookie' => Illuminate\Support\Facades\Cookie::class, + 'Crypt' => Illuminate\Support\Facades\Crypt::class, + 'DB' => Illuminate\Support\Facades\DB::class, + 'Eloquent' => Illuminate\Database\Eloquent\Model::class, + 'Event' => Illuminate\Support\Facades\Event::class, + 'File' => Illuminate\Support\Facades\File::class, + 'Gate' => Illuminate\Support\Facades\Gate::class, + 'Hash' => Illuminate\Support\Facades\Hash::class, + 'Lang' => Illuminate\Support\Facades\Lang::class, + 'Log' => Illuminate\Support\Facades\Log::class, + 'Mail' => Illuminate\Support\Facades\Mail::class, + 'MediaUploader' => Plank\Mediable\MediaUploaderFacade::class, + 'Notification' => Illuminate\Support\Facades\Notification::class, + 'Password' => Illuminate\Support\Facades\Password::class, + 'Queue' => Illuminate\Support\Facades\Queue::class, + 'Redirect' => Illuminate\Support\Facades\Redirect::class, + 'Redis' => Illuminate\Support\Facades\Redis::class, + 'Request' => Illuminate\Support\Facades\Request::class, + 'Response' => Illuminate\Support\Facades\Response::class, + 'Route' => Illuminate\Support\Facades\Route::class, + 'Schema' => Illuminate\Support\Facades\Schema::class, + 'Session' => Illuminate\Support\Facades\Session::class, + 'Storage' => Illuminate\Support\Facades\Storage::class, + 'URL' => Illuminate\Support\Facades\URL::class, + 'Validator' => Illuminate\Support\Facades\Validator::class, + 'View' => Illuminate\Support\Facades\View::class, + + /* + * Vendor Aliases... + */ + //'Api' => Dingo\Api\Facade\API, + 'Charts' => ConsoleTVs\Charts\Facades\Charts::class, + 'Debugbar' => Barryvdh\Debugbar\Facade::class, + 'Date' => Jenssegers\Date\Date::class, + 'Excel' => Maatwebsite\Excel\Facades\Excel::class, + 'Form' => Collective\Html\FormFacade::class, + 'Html' => Collective\Html\HtmlFacade::class, + 'Image' => Intervention\Image\Facades\Image::class, + 'Language' => Akaunting\Language\Facade::class, + 'Laratrust' => Laratrust\LaratrustFacade::class, + 'Menu' => Nwidart\Menus\Facades\Menu::class, + 'Module' => Nwidart\Modules\Facades\Module::class, + 'PDF' => Barryvdh\DomPDF\Facade::class, + 'Setting' => Akaunting\Setting\Facade::class, + 'Version' => Akaunting\Version\Facade::class, + + ], + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100755 index 0000000..4ca9439 --- /dev/null +++ b/config/auth.php @@ -0,0 +1,102 @@ + [ + 'guard' => 'web', + 'passwords' => 'users', + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | here which uses session storage and the Eloquent user provider. + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | Supported: "session", "token" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + + 'api' => [ + 'driver' => 'token', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | If you have multiple user tables or models you may configure multiple + | sources which represent each model / table. These sources may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => App\Models\Auth\User::class, + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | You may specify multiple password reset configurations if you have more + | than one user table or model in the application and you want to have + | separate password reset settings based on the specific user types. + | + | The expire time is the number of minutes that the reset token should be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => 'password_resets', + 'expire' => 60, + ], + ], + +]; diff --git a/config/broadcasting.php b/config/broadcasting.php new file mode 100755 index 0000000..5eecd2b --- /dev/null +++ b/config/broadcasting.php @@ -0,0 +1,58 @@ + env('BROADCAST_DRIVER', 'null'), + + /* + |-------------------------------------------------------------------------- + | Broadcast Connections + |-------------------------------------------------------------------------- + | + | Here you may define all of the broadcast connections that will be used + | to broadcast events to other systems or over websockets. Samples of + | each available type of connection are provided inside this array. + | + */ + + 'connections' => [ + + 'pusher' => [ + 'driver' => 'pusher', + 'key' => env('PUSHER_APP_KEY'), + 'secret' => env('PUSHER_APP_SECRET'), + 'app_id' => env('PUSHER_APP_ID'), + 'options' => [ + // + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + 'log' => [ + 'driver' => 'log', + ], + + 'null' => [ + 'driver' => 'null', + ], + + ], + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100755 index 0000000..e87f032 --- /dev/null +++ b/config/cache.php @@ -0,0 +1,91 @@ + env('CACHE_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + */ + + 'stores' => [ + + 'apc' => [ + 'driver' => 'apc', + ], + + 'array' => [ + 'driver' => 'array', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'cache', + 'connection' => null, + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing a RAM based store such as APC or Memcached, there might + | be other applications utilizing the same cache. So, we'll specify a + | value to get prefixed to all our keys so we can avoid collisions. + | + */ + + 'prefix' => 'laravel', + +]; diff --git a/config/charts.php b/config/charts.php new file mode 100755 index 0000000..1c33260 --- /dev/null +++ b/config/charts.php @@ -0,0 +1,173 @@ + [ + 'type' => 'line', // The default chart type. + 'library' => 'material', // The default chart library. + 'element_label' => '', // The default chart element label. + 'empty_dataset_label' => 'No Data Set', + 'empty_dataset_value' => 0, + 'title' => '', // Default chart title. + 'height' => 400, // 0 Means it will take 100% of the division height. + 'width' => 0, // 0 Means it will take 100% of the division width. + 'responsive' => false, // Not recommended since all libraries have diferent sizes. + 'background_color' => 'inherit', // The chart division background color. + 'colors' => [], // Default chart colors if using no template is set. + 'one_color' => false, // Only use the first color in all values. + 'template' => 'material', // The default chart color template. + 'legend' => true, // Whether to enable the chart legend (where applicable). + 'x_axis_title' => false, // The title of the x-axis + 'y_axis_title' => null, // The title of the y-axis (When set to null will use element_label value). + 'loader' => [ + 'active' => false, // Determines the if loader is active by default. + 'duration' => 500, // In milliseconds. + 'color' => '#6da252', // Determines the default loader color. + ], + ], + + /* + |-------------------------------------------------------------------------- + | All the color templates available for the charts. + |-------------------------------------------------------------------------- + */ + 'templates' => [ + 'material' => [ + '#2196F3', '#F44336', '#FFC107', + ], + 'red-material' => [ + '#B71C1C', '#F44336', '#E57373', + ], + 'indigo-material' => [ + '#1A237E', '#3F51B5', '#7986CB', + ], + 'blue-material' => [ + '#0D47A1', '#2196F3', '#64B5F6', + ], + 'teal-material' => [ + '#004D40', '#009688', '#4DB6AC', + ], + 'green-material' => [ + '#1B5E20', '#4CAF50', '#81C784', + ], + 'yellow-material' => [ + '#F57F17', '#FFEB3B', '#FFF176', + ], + 'orange-material' => [ + '#E65100', '#FF9800', '#FFB74D', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Assets required by the libraries. + |-------------------------------------------------------------------------- + */ + + 'assets' => [ + 'global' => [ + 'scripts' => [ + //'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js', + ], + ], + + 'canvas-gauges' => [ + 'scripts' => [ + //'https://cdn.rawgit.com/Mikhus/canvas-gauges/gh-pages/download/2.1.2/all/gauge.min.js', + ], + ], + + 'chartist' => [ + 'scripts' => [ + //'https://cdnjs.cloudflare.com/ajax/libs/chartist/0.10.1/chartist.min.js', + ], + 'styles' => [ + //'https://cdnjs.cloudflare.com/ajax/libs/chartist/0.10.1/chartist.min.css', + ], + ], + + 'chartjs' => [ + 'scripts' => [ + env('APP_URL') . '/public/js/chartjs/Chart.min.js', + ], + ], + + 'fusioncharts' => [ + 'scripts' => [ + //'https://static.fusioncharts.com/code/latest/fusioncharts.js', + //'https://static.fusioncharts.com/code/latest/themes/fusioncharts.theme.fint.js', + ], + ], + + 'google' => [ + 'scripts' => [ + //'https://www.google.com/jsapi', + //'https://www.gstatic.com/charts/loader.js', + //"google.charts.load('current', {'packages':['corechart', 'gauge', 'geochart', 'bar', 'line']})", + ], + ], + + 'highcharts' => [ + 'styles' => [ + // The following CSS is not added due to color compatibility errors. + // 'https://cdnjs.cloudflare.com/ajax/libs/highcharts/5.0.7/css/highcharts.css', + ], + 'scripts' => [ + //'https://cdnjs.cloudflare.com/ajax/libs/highcharts/5.0.7/highcharts.js', + //'https://cdnjs.cloudflare.com/ajax/libs/highcharts/5.0.7/js/modules/offline-exporting.js', + //'https://cdnjs.cloudflare.com/ajax/libs/highmaps/5.0.7/js/modules/map.js', + //'https://cdnjs.cloudflare.com/ajax/libs/highmaps/5.0.7/js/modules/data.js', + //'https://code.highcharts.com/mapdata/custom/world.js', + ], + ], + + 'justgage' => [ + 'scripts' => [ + //'https://cdnjs.cloudflare.com/ajax/libs/raphael/2.2.6/raphael.min.js', + //'https://cdnjs.cloudflare.com/ajax/libs/justgage/1.2.2/justgage.min.js', + ], + ], + + 'morris' => [ + 'styles' => [ + //'https://cdnjs.cloudflare.com/ajax/libs/morris.js/0.5.1/morris.css', + ], + 'scripts' => [ + //'https://cdnjs.cloudflare.com/ajax/libs/raphael/2.2.6/raphael.min.js', + //'https://cdnjs.cloudflare.com/ajax/libs/morris.js/0.5.1/morris.min.js', + ], + ], + + 'plottablejs' => [ + 'scripts' => [ + //'https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js', + //'https://cdnjs.cloudflare.com/ajax/libs/plottable.js/2.8.0/plottable.min.js', + ], + 'styles' => [ + //'https://cdnjs.cloudflare.com/ajax/libs/plottable.js/2.2.0/plottable.css', + ], + ], + + 'progressbarjs' => [ + 'scripts' => [ + //'https://cdnjs.cloudflare.com/ajax/libs/progressbar.js/1.0.1/progressbar.min.js', + ], + ], + + 'c3' => [ + 'scripts' => [ + //'https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js', + //'https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.11/c3.min.js', + ], + 'styles' => [ + //'https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.11/c3.min.css', + ], + ], + ], +]; diff --git a/config/columnsortable.php b/config/columnsortable.php new file mode 100755 index 0000000..cb55aa1 --- /dev/null +++ b/config/columnsortable.php @@ -0,0 +1,89 @@ + [ + 'alpha' => [ + 'rows' => ['name', 'customer_name', 'vendor_name', 'display_name', 'company_name', 'domain', 'email', 'description', 'code', 'type', 'status', 'vendor', 'account', 'bill_status_code', 'invoice_status_code'], + 'class' => 'fa fa-sort-alpha', + ], + 'amount' => [ + 'rows' => ['amount', 'price', 'sale_price', 'purchase_price', 'total_price', 'current_balance', 'total_price', 'opening_balance'], + 'class' => 'fa fa-sort-amount' + ], + 'numeric' => [ + 'rows' => ['created_at', 'updated_at', 'paid_at', 'invoiced_at', 'billed_at', 'due_at', 'id', 'quantity', 'rate', 'number', 'invoice_number', 'bill_number'], + 'class' => 'fa fa-sort-numeric' + ], + ], + + /* + defines icon set to use when sorted data is none above (alpha nor amount nor numeric) + */ + 'default_icon_set' => 'fa fa-long-arrow-down sort-icon', + + /* + icon that shows when generating sortable link while column is not sorted + */ + 'sortable_icon' => 'fa fa-long-arrow-down sort-icon', + + /* + generated icon is clickable non-clickable (default) + */ + 'clickable_icon' => false, + + /* + icon and text separator (any string) + in case of 'clickable_icon' => true; separator creates possibility to style icon and anchor-text properly + */ + 'icon_text_separator' => '  ', + + /* + suffix class that is appended when ascending order is applied + */ + 'asc_suffix' => '-asc', + + /* + suffix class that is appended when descending order is applied + */ + 'desc_suffix' => '-desc', + + /* + default anchor class, if value is null none is added + */ + 'anchor_class' => null, + + /* + relation - column separator ex: detail.phone_number means relation "detail" and column "phone_number" + */ + 'uri_relation_column_separator' => '.', + + /* + formatting function applied to name of column, use null to turn formatting off + */ + 'formatting_function' => 'ucfirst', + + /* + inject title parameter in query strings, use null to turn injection off + example: 'inject_title' => 't' will result in ..user/?t="formatted title of sorted column" + */ + 'inject_title_as' => null, + + /* + allow request modification, when default sorting is set but is not in URI (first load) + */ + 'allow_request_modification' => true, + + /* + default order for: $user->sortable('id') usage + */ + 'default_direction' => 'asc', + + /* + default order for non-sorted columns + */ + 'default_direction_unsorted' => 'asc' +]; diff --git a/config/database.php b/config/database.php new file mode 100755 index 0000000..de9839e --- /dev/null +++ b/config/database.php @@ -0,0 +1,118 @@ + env('DB_CONNECTION', 'mysql'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Laravel is shown below to make development simple. + | + | + | All database work in Laravel is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => env('DB_PREFIX', 'ak_'), + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => env('DB_PREFIX', 'ak_'), + 'strict' => true, + 'engine' => null, + 'modes' => [ + //'ONLY_FULL_GROUP_BY', // conflicts with eloquence + 'STRICT_TRANS_TABLES', + 'NO_ZERO_IN_DATE', + 'NO_ZERO_DATE', + 'ERROR_FOR_DIVISION_BY_ZERO', + 'NO_AUTO_CREATE_USER', + 'NO_ENGINE_SUBSTITUTION', + ], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => env('DB_PREFIX', 'ak_'), + 'schema' => 'public', + 'sslmode' => 'prefer', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run in the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer set of commands than a typical key-value systems + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => [ + + 'client' => 'predis', + + 'default' => [ + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'password' => env('REDIS_PASSWORD', null), + 'port' => env('REDIS_PORT', 6379), + 'database' => 0, + ], + + ], + +]; diff --git a/config/debugbar.php b/config/debugbar.php new file mode 100755 index 0000000..b343d32 --- /dev/null +++ b/config/debugbar.php @@ -0,0 +1,170 @@ + true, + + /* + |-------------------------------------------------------------------------- + | Storage settings + |-------------------------------------------------------------------------- + | + | DebugBar stores data for session/ajax requests. + | You can disable this, so the debugbar stores data in headers/session, + | but this can cause problems with large data collectors. + | By default, file storage (in the storage folder) is used. Redis and PDO + | can also be used. For PDO, run the package migrations first. + | + */ + 'storage' => [ + 'enabled' => true, + 'driver' => 'file', // redis, file, pdo, custom + 'path' => storage_path('debugbar'), // For file driver + 'connection' => null, // Leave null for default connection (Redis/PDO) + 'provider' => '' // Instance of StorageInterface for custom driver + ], + + /* + |-------------------------------------------------------------------------- + | Vendors + |-------------------------------------------------------------------------- + | + | Vendor files are included by default, but can be set to false. + | This can also be set to 'js' or 'css', to only include javascript or css vendor files. + | Vendor files are for css: font-awesome (including fonts) and highlight.js (css files) + | and for js: jquery and and highlight.js + | So if you want syntax highlighting, set it to true. + | jQuery is set to not conflict with existing jQuery scripts. + | + */ + + 'include_vendors' => true, + + /* + |-------------------------------------------------------------------------- + | Capture Ajax Requests + |-------------------------------------------------------------------------- + | + | The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors), + | you can use this option to disable sending the data through the headers. + | + */ + + 'capture_ajax' => true, + + /* + |-------------------------------------------------------------------------- + | Clockwork integration + |-------------------------------------------------------------------------- + | + | The Debugbar can emulate the Clockwork headers, so you can use the Chrome + | Extension, without the server-side code. It uses Debugbar collectors instead. + | + */ + 'clockwork' => false, + + /* + |-------------------------------------------------------------------------- + | DataCollectors + |-------------------------------------------------------------------------- + | + | Enable/disable DataCollectors + | + */ + + 'collectors' => [ + 'phpinfo' => true, // Php version + 'messages' => true, // Messages + 'time' => true, // Time Datalogger + 'memory' => true, // Memory usage + 'exceptions' => true, // Exception displayer + 'log' => true, // Logs from Monolog (merged in messages if enabled) + 'db' => true, // Show database (PDO) queries and bindings + 'views' => true, // Views with their data + 'route' => true, // Current route information + 'laravel' => false, // Laravel version and environment + 'events' => false, // All events fired + 'default_request' => false, // Regular or special Symfony request logger + 'symfony_request' => true, // Only one can be enabled.. + 'mail' => true, // Catch mail messages + 'logs' => false, // Add the latest log messages + 'files' => false, // Show the included files + 'config' => false, // Display config settings + 'auth' => false, // Display Laravel authentication status + 'gate' => false, // Display Laravel Gate checks + 'session' => true, // Display session data + ], + + /* + |-------------------------------------------------------------------------- + | Extra options + |-------------------------------------------------------------------------- + | + | Configure some DataCollectors + | + */ + + 'options' => [ + 'auth' => [ + 'show_name' => false, // Also show the users name/email in the debugbar + ], + 'db' => [ + 'with_params' => true, // Render SQL with the parameters substituted + 'timeline' => false, // Add the queries to the timeline + 'backtrace' => false, // EXPERIMENTAL: Use a backtrace to find the origin of the query in your files. + 'explain' => [ // EXPERIMENTAL: Show EXPLAIN output on queries + 'enabled' => false, + 'types' => ['SELECT'], // ['SELECT', 'INSERT', 'UPDATE', 'DELETE']; for MySQL 5.6.3+ + ], + 'hints' => true, // Show hints for common mistakes + ], + 'mail' => [ + 'full_log' => false + ], + 'views' => [ + 'data' => false, //Note: Can slow down the application, because the data can be quite large.. + ], + 'route' => [ + 'label' => true // show complete route on bar + ], + 'logs' => [ + 'file' => null + ], + ], + + /* + |-------------------------------------------------------------------------- + | Inject Debugbar in Response + |-------------------------------------------------------------------------- + | + | Usually, the debugbar is added just before , by listening to the + | Response after the App is done. If you disable this, you have to add them + | in your template yourself. See http://phpdebugbar.com/docs/rendering.html + | + */ + + 'inject' => true, + + /* + |-------------------------------------------------------------------------- + | DebugBar route prefix + |-------------------------------------------------------------------------- + | + | Sometimes you want to set route prefix to be used by DebugBar to load + | its resources from. Usually the need comes from misconfigured web server or + | from trying to overcome bugs like this: http://trac.nginx.org/nginx/ticket/97 + | + */ + 'route_prefix' => '_debugbar', + +]; diff --git a/config/dotenv-editor.php b/config/dotenv-editor.php new file mode 100755 index 0000000..c631842 --- /dev/null +++ b/config/dotenv-editor.php @@ -0,0 +1,27 @@ + false, + + /* + |---------------------------------------------------------------------- + | Backup location + |---------------------------------------------------------------------- + | + | This value is used when you backup your file. This value is the sub + | path from root folder of project application. + */ + + 'backupPath' => base_path('storage/dotenv-editor/backups/') + +); diff --git a/config/eloquentfilter.php b/config/eloquentfilter.php new file mode 100755 index 0000000..030277d --- /dev/null +++ b/config/eloquentfilter.php @@ -0,0 +1,16 @@ + 'App\\Filters\\', + +]; diff --git a/config/excel.php b/config/excel.php new file mode 100755 index 0000000..d7bc5b5 --- /dev/null +++ b/config/excel.php @@ -0,0 +1,704 @@ + [ + + /* + |-------------------------------------------------------------------------- + | Enable/Disable cell caching + |-------------------------------------------------------------------------- + */ + 'enable' => true, + + /* + |-------------------------------------------------------------------------- + | Caching driver + |-------------------------------------------------------------------------- + | + | Set the caching driver + | + | Available methods: + | memory|gzip|serialized|igbinary|discISAM|apc|memcache|temp|wincache|sqlite|sqlite3 + | + */ + 'driver' => 'memory', + + /* + |-------------------------------------------------------------------------- + | Cache settings + |-------------------------------------------------------------------------- + */ + 'settings' => [ + + 'memoryCacheSize' => '32MB', + 'cacheTime' => 600 + + ], + + /* + |-------------------------------------------------------------------------- + | Memcache settings + |-------------------------------------------------------------------------- + */ + 'memcache' => [ + + 'host' => 'localhost', + 'port' => 11211, + + ], + + /* + |-------------------------------------------------------------------------- + | Cache dir (for discISAM) + |-------------------------------------------------------------------------- + */ + + 'dir' => storage_path('cache') + ], + + 'properties' => [ + 'creator' => 'Akaunting', + 'lastModifiedBy' => 'Akaunting', + 'title' => 'Spreadsheet', + 'description' => 'Default spreadsheet export', + 'subject' => 'Spreadsheet export', + 'keywords' => 'akaunting, excel, export', + 'category' => 'Excel', + 'manager' => 'Akaunting', + 'company' => 'Akaunting', + ], + + /* + |-------------------------------------------------------------------------- + | Sheets settings + |-------------------------------------------------------------------------- + */ + 'sheets' => [ + + /* + |-------------------------------------------------------------------------- + | Default page setup + |-------------------------------------------------------------------------- + */ + 'pageSetup' => [ + 'orientation' => 'portrait', + 'paperSize' => '9', + 'scale' => '100', + 'fitToPage' => false, + 'fitToHeight' => true, + 'fitToWidth' => true, + 'columnsToRepeatAtLeft' => ['', ''], + 'rowsToRepeatAtTop' => [0, 0], + 'horizontalCentered' => false, + 'verticalCentered' => false, + 'printArea' => null, + 'firstPageNumber' => null, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Creator + |-------------------------------------------------------------------------- + | + | The default creator of a new Excel file + | + */ + + 'creator' => 'Akaunting', + + 'csv' => [ + /* + |-------------------------------------------------------------------------- + | Delimiter + |-------------------------------------------------------------------------- + | + | The default delimiter which will be used to read out a CSV file + | + */ + + 'delimiter' => ',', + + /* + |-------------------------------------------------------------------------- + | Enclosure + |-------------------------------------------------------------------------- + */ + + 'enclosure' => '"', + + /* + |-------------------------------------------------------------------------- + | Line endings + |-------------------------------------------------------------------------- + */ + + 'line_ending' => "\r\n", + + /* + |-------------------------------------------------------------------------- + | setUseBom + |-------------------------------------------------------------------------- + */ + + 'use_bom' => false + ], + + 'export' => [ + + /* + |-------------------------------------------------------------------------- + | Autosize columns + |-------------------------------------------------------------------------- + | + | Disable/enable column autosize or set the autosizing for + | an array of columns ( array('A', 'B') ) + | + */ + 'autosize' => true, + + /* + |-------------------------------------------------------------------------- + | Autosize method + |-------------------------------------------------------------------------- + | + | --> PHPExcel_Shared_Font::AUTOSIZE_METHOD_APPROX + | The default is based on an estimate, which does its calculation based + | on the number of characters in the cell value (applying any calculation + | and format mask, and allowing for wordwrap and rotation) and with an + | "arbitrary" adjustment based on the font (Arial, Calibri or Verdana, + | defaulting to Calibri if any other font is used) and a proportional + | adjustment for the font size. + | + | --> PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT + | The second method is more accurate, based on actual style formatting as + | well (bold, italic, etc), and is calculated by generating a gd2 imagettf + | bounding box and using its dimensions to determine the size; but this + | method is significantly slower, and its accuracy is still dependent on + | having the appropriate fonts installed. + | + */ + 'autosize-method' => PHPExcel_Shared_Font::AUTOSIZE_METHOD_APPROX, + + /* + |-------------------------------------------------------------------------- + | Auto generate table heading + |-------------------------------------------------------------------------- + | + | If set to true, the array indices (or model attribute names) + | will automatically be used as first row (table heading) + | + */ + 'generate_heading_by_indices' => true, + + /* + |-------------------------------------------------------------------------- + | Auto set alignment on merged cells + |-------------------------------------------------------------------------- + */ + 'merged_cell_alignment' => 'left', + + /* + |-------------------------------------------------------------------------- + | Pre-calculate formulas during export + |-------------------------------------------------------------------------- + */ + 'calculate' => false, + + /* + |-------------------------------------------------------------------------- + | Include Charts during export + |-------------------------------------------------------------------------- + */ + 'includeCharts' => false, + + /* + |-------------------------------------------------------------------------- + | Default sheet settings + |-------------------------------------------------------------------------- + */ + 'sheets' => [ + + /* + |-------------------------------------------------------------------------- + | Default page margin + |-------------------------------------------------------------------------- + | + | 1) When set to false, default margins will be used + | 2) It's possible to enter a single margin which will + | be used for all margins. + | 3) Alternatively you can pass an array with 4 margins + | Default order: array(top, right, bottom, left) + | + */ + 'page_margin' => false, + + /* + |-------------------------------------------------------------------------- + | Value in source array that stands for blank cell + |-------------------------------------------------------------------------- + */ + 'nullValue' => null, + + /* + |-------------------------------------------------------------------------- + | Insert array starting from this cell address as the top left coordinate + |-------------------------------------------------------------------------- + */ + 'startCell' => 'A1', + + /* + |-------------------------------------------------------------------------- + | Apply strict comparison when testing for null values in the array + |-------------------------------------------------------------------------- + */ + 'strictNullComparison' => false + ], + + /* + |-------------------------------------------------------------------------- + | Store settings + |-------------------------------------------------------------------------- + */ + + 'store' => [ + + /* + |-------------------------------------------------------------------------- + | Path + |-------------------------------------------------------------------------- + | + | The path we want to save excel file to + | + */ + 'path' => storage_path('app/exports'), + + /* + |-------------------------------------------------------------------------- + | Return info + |-------------------------------------------------------------------------- + | + | Whether we want to return information about the stored file or not + | + */ + 'returnInfo' => false + + ], + + /* + |-------------------------------------------------------------------------- + | PDF Settings + |-------------------------------------------------------------------------- + */ + 'pdf' => [ + + /* + |-------------------------------------------------------------------------- + | PDF Drivers + |-------------------------------------------------------------------------- + | Supported: DomPDF, tcPDF, mPDF + */ + 'driver' => 'DomPDF', + + /* + |-------------------------------------------------------------------------- + | PDF Driver settings + |-------------------------------------------------------------------------- + */ + 'drivers' => [ + + /* + |-------------------------------------------------------------------------- + | DomPDF settings + |-------------------------------------------------------------------------- + */ + 'DomPDF' => [ + 'path' => base_path('vendor/dompdf/dompdf/') + ], + + /* + |-------------------------------------------------------------------------- + | tcPDF settings + |-------------------------------------------------------------------------- + */ + 'tcPDF' => [ + 'path' => base_path('vendor/tecnick.com/tcpdf/') + ], + + /* + |-------------------------------------------------------------------------- + | mPDF settings + |-------------------------------------------------------------------------- + */ + 'mPDF' => [ + 'path' => base_path('vendor/mpdf/mpdf/') + ], + ] + ] + ], + + 'filters' => [ + /* + |-------------------------------------------------------------------------- + | Register read filters + |-------------------------------------------------------------------------- + */ + + 'registered' => [ + 'chunk' => 'Maatwebsite\Excel\Filters\ChunkReadFilter' + ], + + /* + |-------------------------------------------------------------------------- + | Enable certain filters for every file read + |-------------------------------------------------------------------------- + */ + + 'enabled' => [] + ], + + 'import' => [ + + /* + |-------------------------------------------------------------------------- + | Has heading + |-------------------------------------------------------------------------- + | + | The sheet has a heading (first) row which we can use as attribute names + | + | Options: true|false|slugged|slugged_with_count|ascii|numeric|hashed|trans|original + | + */ + + 'heading' => 'slugged', + + /* + |-------------------------------------------------------------------------- + | First Row with data or heading of data + |-------------------------------------------------------------------------- + | + | If the heading row is not the first row, or the data doesn't start + | on the first row, here you can change the start row. + | + */ + + 'startRow' => 1, + + /* + |-------------------------------------------------------------------------- + | Cell name word separator + |-------------------------------------------------------------------------- + | + | The default separator which is used for the cell names + | Note: only applies to 'heading' settings 'true' && 'slugged' + | + */ + + 'separator' => '_', + + /* + |-------------------------------------------------------------------------- + | Slug whitelisting + |-------------------------------------------------------------------------- + | + | Here you can whitelist certain characters in the slug. + | E.g. user.last_name will not remove . and _ + | Note: only applies to 'heading' settings 'true' && 'slugged' + | + */ + + 'slug_whitelist' => '._', + + /* + |-------------------------------------------------------------------------- + | Include Charts during import + |-------------------------------------------------------------------------- + */ + + 'includeCharts' => false, + + /* + |-------------------------------------------------------------------------- + | Sheet heading conversion + |-------------------------------------------------------------------------- + | + | Convert headings to ASCII + | Note: only applies to 'heading' settings 'true' && 'slugged' + | + */ + + 'to_ascii' => true, + + /* + |-------------------------------------------------------------------------- + | Import encoding + |-------------------------------------------------------------------------- + */ + + 'encoding' => [ + + 'input' => 'UTF-8', + 'output' => 'UTF-8' + + ], + + /* + |-------------------------------------------------------------------------- + | Calculate + |-------------------------------------------------------------------------- + | + | By default cells with formulas will be calculated. + | + */ + + 'calculate' => true, + + /* + |-------------------------------------------------------------------------- + | Ignore empty cells + |-------------------------------------------------------------------------- + | + | By default empty cells are not ignored + | + */ + + 'ignoreEmpty' => true, + + /* + |-------------------------------------------------------------------------- + | Force sheet collection + |-------------------------------------------------------------------------- + | + | For a sheet collection even when there is only 1 sheets. + | When set to false and only 1 sheet found, the parsed file will return + | a row collection instead of a sheet collection. + | When set to true, it will return a sheet collection instead. + | + */ + 'force_sheets_collection' => true, + + /* + |-------------------------------------------------------------------------- + | Date format + |-------------------------------------------------------------------------- + | + | The format dates will be parsed to + | + */ + + 'dates' => [ + + /* + |-------------------------------------------------------------------------- + | Enable/disable date formatting + |-------------------------------------------------------------------------- + */ + 'enabled' => true, + + /* + |-------------------------------------------------------------------------- + | Default date format + |-------------------------------------------------------------------------- + | + | If set to false, a carbon object will return + | + */ + 'format' => false, + + /* + |-------------------------------------------------------------------------- + | Date columns + |-------------------------------------------------------------------------- + */ + 'columns' => [] + ], + + /* + |-------------------------------------------------------------------------- + | Import sheets by config + |-------------------------------------------------------------------------- + */ + 'sheets' => [ + + /* + |-------------------------------------------------------------------------- + | Example sheet + |-------------------------------------------------------------------------- + | + | Example sheet "test" will grab the firstname at cell A2 + | + */ + + 'test' => [ + + 'firstname' => 'A2' + + ] + + ] + ], + + 'views' => [ + + /* + |-------------------------------------------------------------------------- + | Styles + |-------------------------------------------------------------------------- + | + | The default styles which will be used when parsing a view + | + */ + + 'styles' => [ + + /* + |-------------------------------------------------------------------------- + | Table headings + |-------------------------------------------------------------------------- + */ + 'th' => [ + 'font' => [ + 'bold' => true, + 'size' => 12, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Strong tags + |-------------------------------------------------------------------------- + */ + 'strong' => [ + 'font' => [ + 'bold' => true, + 'size' => 12, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Bold tags + |-------------------------------------------------------------------------- + */ + 'b' => [ + 'font' => [ + 'bold' => true, + 'size' => 12, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Italic tags + |-------------------------------------------------------------------------- + */ + 'i' => [ + 'font' => [ + 'italic' => true, + 'size' => 12, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Heading 1 + |-------------------------------------------------------------------------- + */ + 'h1' => [ + 'font' => [ + 'bold' => true, + 'size' => 24, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Heading 2 + |-------------------------------------------------------------------------- + */ + 'h2' => [ + 'font' => [ + 'bold' => true, + 'size' => 18, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Heading 3 + |-------------------------------------------------------------------------- + */ + 'h3' => [ + 'font' => [ + 'bold' => true, + 'size' => 13.5, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Heading 4 + |-------------------------------------------------------------------------- + */ + 'h4' => [ + 'font' => [ + 'bold' => true, + 'size' => 12, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Heading 5 + |-------------------------------------------------------------------------- + */ + 'h5' => [ + 'font' => [ + 'bold' => true, + 'size' => 10, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Heading 6 + |-------------------------------------------------------------------------- + */ + 'h6' => [ + 'font' => [ + 'bold' => true, + 'size' => 7.5, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Hyperlinks + |-------------------------------------------------------------------------- + */ + 'a' => [ + 'font' => [ + 'underline' => true, + 'color' => ['argb' => 'FF0000FF'], + ] + ], + + /* + |-------------------------------------------------------------------------- + | Horizontal rules + |-------------------------------------------------------------------------- + */ + 'hr' => [ + 'borders' => [ + 'bottom' => [ + 'style' => 'thin', + 'color' => ['FF000000'] + ], + ] + ] + ] + + ] + +); diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100755 index 0000000..df225fc --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,75 @@ + 'uploads', + + /* + |-------------------------------------------------------------------------- + | Default Cloud Filesystem Disk + |-------------------------------------------------------------------------- + | + | Many applications store files both locally and in the cloud. For this + | reason, you may specify a default "cloud" driver here. This driver + | will be bound as the Cloud disk implementation in the container. + | + */ + + 'cloud' => 's3', + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Here you may configure as many filesystem "disks" as you wish, and you + | may even configure multiple disks of the same driver. Defaults have + | been setup for each driver as an example of the required options. + | + | Supported Drivers: "local", "ftp", "s3", "rackspace" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + ], + + 'uploads' => [ + 'driver' => 'local', + 'root' => storage_path('app/uploads'), + 'url' => env('APP_URL').'/uploads', + 'visibility' => 'private', + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_KEY'), + 'secret' => env('AWS_SECRET'), + 'region' => env('AWS_REGION'), + 'bucket' => env('AWS_BUCKET'), + ], + + ], + +]; diff --git a/config/ide-helper.php b/config/ide-helper.php new file mode 100755 index 0000000..5350f3a --- /dev/null +++ b/config/ide-helper.php @@ -0,0 +1,168 @@ + '_ide_helper', + 'format' => 'php', + + /* + |-------------------------------------------------------------------------- + | Fluent helpers + |-------------------------------------------------------------------------- + | + | Set to true to generate commonly used Fluent methods + | + */ + + 'include_fluent' => false, + + /* + |-------------------------------------------------------------------------- + | Helper files to include + |-------------------------------------------------------------------------- + | + | Include helper files. By default not included, but can be toggled with the + | -- helpers (-H) option. Extra helper files can be included. + | + */ + + 'include_helpers' => false, + + 'helper_files' => array( + base_path().'/vendor/laravel/framework/src/Illuminate/Support/helpers.php', + ), + + /* + |-------------------------------------------------------------------------- + | Model locations to include + |-------------------------------------------------------------------------- + | + | Define in which directories the ide-helper:models command should look + | for models. + | + */ + + 'model_locations' => array( + 'app', + ), + + + /* + |-------------------------------------------------------------------------- + | Extra classes + |-------------------------------------------------------------------------- + | + | These implementations are not really extended, but called with magic functions + | + */ + + 'extra' => array( + 'Eloquent' => array('Illuminate\Database\Eloquent\Builder', 'Illuminate\Database\Query\Builder'), + 'Session' => array('Illuminate\Session\Store'), + ), + + 'magic' => array( + 'Log' => array( + 'debug' => 'Monolog\Logger::addDebug', + 'info' => 'Monolog\Logger::addInfo', + 'notice' => 'Monolog\Logger::addNotice', + 'warning' => 'Monolog\Logger::addWarning', + 'error' => 'Monolog\Logger::addError', + 'critical' => 'Monolog\Logger::addCritical', + 'alert' => 'Monolog\Logger::addAlert', + 'emergency' => 'Monolog\Logger::addEmergency', + ) + ), + + /* + |-------------------------------------------------------------------------- + | Interface implementations + |-------------------------------------------------------------------------- + | + | These interfaces will be replaced with the implementing class. Some interfaces + | are detected by the helpers, others can be listed below. + | + */ + + 'interfaces' => array( + + ), + + /* + |-------------------------------------------------------------------------- + | Support for custom DB types + |-------------------------------------------------------------------------- + | + | This setting allow you to map any custom database type (that you may have + | created using CREATE TYPE statement or imported using database plugin + | / extension to a Doctrine type. + | + | Each key in this array is a name of the Doctrine2 DBAL Platform. Currently valid names are: + | 'postgresql', 'db2', 'drizzle', 'mysql', 'oracle', 'sqlanywhere', 'sqlite', 'mssql' + | + | This name is returned by getName() method of the specific Doctrine/DBAL/Platforms/AbstractPlatform descendant + | + | The value of the array is an array of type mappings. Key is the name of the custom type, + | (for example, "jsonb" from Postgres 9.4) and the value is the name of the corresponding Doctrine2 type (in + | our case it is 'json_array'. Doctrine types are listed here: + | http://doctrine-dbal.readthedocs.org/en/latest/reference/types.html + | + | So to support jsonb in your models when working with Postgres, just add the following entry to the array below: + | + | "postgresql" => array( + | "jsonb" => "json_array", + | ), + | + */ + 'custom_db_types' => array( + + ), + + /* + |-------------------------------------------------------------------------- + | Support for camel cased models + |-------------------------------------------------------------------------- + | + | There are some Laravel packages (such as Eloquence) that allow for accessing + | Eloquent model properties via camel case, instead of snake case. + | + | Enabling this option will support these packages by saving all model + | properties as camel case, instead of snake case. + | + | For example, normally you would see this: + | + | * @property \Carbon\Carbon $created_at + | * @property \Carbon\Carbon $updated_at + | + | With this enabled, the properties will be this: + | + | * @property \Carbon\Carbon $createdAt + | * @property \Carbon\Carbon $updatedAt + | + | Note, it is currently an all-or-nothing option. + | + */ + 'model_camel_case_properties' => false, + + /* + |-------------------------------------------------------------------------- + | Property Casts + |-------------------------------------------------------------------------- + | + | Cast the given "real type" to the given "type". + | + */ + 'type_overrides' => array( + 'integer' => 'int', + 'boolean' => 'bool', + ), +); diff --git a/config/image.php b/config/image.php new file mode 100755 index 0000000..b106809 --- /dev/null +++ b/config/image.php @@ -0,0 +1,20 @@ + 'gd' + +); diff --git a/config/language.php b/config/language.php new file mode 100755 index 0000000..d5dbc40 --- /dev/null +++ b/config/language.php @@ -0,0 +1,176 @@ + true, + + /* + |-------------------------------------------------------------------------- + | Enable Language Home Route + |-------------------------------------------------------------------------- + | + | This option enable language route to set language and return + | to url('/') + | + */ + 'home' => true, + + /* + |-------------------------------------------------------------------------- + | Carbon Language + |-------------------------------------------------------------------------- + | + | This option the language of carbon library. + | + */ + 'carbon' => true, + + /* + |-------------------------------------------------------------------------- + | Date Language + |-------------------------------------------------------------------------- + | + | This option the language of jenssegers/date library. + | + */ + 'date' => true, + + /* + |-------------------------------------------------------------------------- + | Auto Change Language + |-------------------------------------------------------------------------- + | + | This option allows to change website language to user's + | browser language. + | + */ + 'auto' => true, + + /* + |-------------------------------------------------------------------------- + | Routes Prefix + |-------------------------------------------------------------------------- + | + | This option indicates the prefix for language routes. + | + */ + 'prefix' => 'languages', + + /* + |-------------------------------------------------------------------------- + | Middleware + |-------------------------------------------------------------------------- + | + | This option indicates the middleware to change language. + | + */ + 'middleware' => 'Akaunting\Language\Middleware\SetLocale', + + /* + |-------------------------------------------------------------------------- + | Controller + |-------------------------------------------------------------------------- + | + | This option indicates the controller to be used. + | + */ + 'controller' => 'Akaunting\Language\Controllers\Language', + + /* + |-------------------------------------------------------------------------- + | Flags + |-------------------------------------------------------------------------- + | + | This option indicates the flags features. + | + */ + + 'flags' => ['width' => '22px', 'ul_class' => 'menu', 'li_class' => '', 'img_class' => ''], + + /* + |-------------------------------------------------------------------------- + | Language code mode + |-------------------------------------------------------------------------- + | + | This option indicates the language code to be used, short or long + | + */ + + 'mode' => ['code' => 'long', 'name' => 'native'], + + /* + |-------------------------------------------------------------------------- + | Allowed languages + |-------------------------------------------------------------------------- + | + | This options indicates the allowed languages. + | + */ + + 'allowed' => ['ar-SA', 'bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-GB', 'es-ES', 'es-MX', 'fa-IR', 'fr-FR', 'he-IL', 'hr-HR', 'id-ID', 'it-IT', 'lv-LV', 'nb-NO', 'nl-NL', 'pt-BR', 'pt-PT', 'ro-RO', 'ru-RU', 'sq-AL', 'sv-SE', 'th-TH', 'tr-TR', 'uk-UA', 'vi-VN', 'zh-CN', 'zh-TW'], + + /* + |-------------------------------------------------------------------------- + | All languages + |-------------------------------------------------------------------------- + | + | This option indicates the language codes and names. + | + */ + + 'all' => [ + ['short' => 'ar', 'long' => 'ar-SA', 'english' => 'Arabic', 'native' => 'العربية'], + ['short' => 'bg', 'long' => 'bg-BG', 'english' => 'Bulgarian', 'native' => 'български'], + ['short' => 'bn', 'long' => 'bn-BD', 'english' => 'Bengali', 'native' => 'বাংলা'], + ['short' => 'cn', 'long' => 'zh-CN', 'english' => 'Chinese (S)', 'native' => '简体中文'], + ['short' => 'cs', 'long' => 'cs-CZ', 'english' => 'Czech', 'native' => 'Čeština'], + ['short' => 'da', 'long' => 'da-DK', 'english' => 'Danish', 'native' => 'Dansk'], + ['short' => 'de', 'long' => 'de-DE', 'english' => 'German', 'native' => 'Deutsch'], + ['short' => 'de', 'long' => 'de-AT', 'english' => 'Austrian', 'native' => 'Österreichisches Deutsch'], + ['short' => 'fi', 'long' => 'fi-FI', 'english' => 'Finnish', 'native' => 'Suomi'], + ['short' => 'fr', 'long' => 'fr-FR', 'english' => 'French', 'native' => 'Français'], + ['short' => 'el', 'long' => 'el-GR', 'english' => 'Greek', 'native' => 'Ελληνικά'], + ['short' => 'en', 'long' => 'en-AU', 'english' => 'English (AU)', 'native' => 'English (AU)'], + ['short' => 'en', 'long' => 'en-CA', 'english' => 'English (CA)', 'native' => 'English (CA)'], + ['short' => 'en', 'long' => 'en-GB', 'english' => 'English (GB)', 'native' => 'English (GB)'], + ['short' => 'en', 'long' => 'en-US', 'english' => 'English (US)', 'native' => 'English (US)'], + ['short' => 'es', 'long' => 'es-ES', 'english' => 'Spanish', 'native' => 'Español'], + ['short' => 'et', 'long' => 'et-EE', 'english' => 'Estonian', 'native' => 'Eesti'], + ['short' => 'he', 'long' => 'he-IL', 'english' => 'Hebrew', 'native' => 'עִבְרִית'], + ['short' => 'hi', 'long' => 'hi-IN', 'english' => 'Hindi', 'native' => 'हिन्दी'], + ['short' => 'hr', 'long' => 'hr-HR', 'english' => 'Croatian', 'native' => 'Hrvatski'], + ['short' => 'hu', 'long' => 'hu-HU', 'english' => 'Hungarian', 'native' => 'Magyar'], + ['short' => 'hy', 'long' => 'hy-AM', 'english' => 'Armenian', 'native' => 'Հայերեն'], + ['short' => 'id', 'long' => 'id-ID', 'english' => 'Indonesian', 'native' => 'Bahasa Indonesia'], + ['short' => 'it', 'long' => 'it-IT', 'english' => 'Italian', 'native' => 'Italiano'], + ['short' => 'ir', 'long' => 'fa-IR', 'english' => 'Persian', 'native' => 'فارسی'], + ['short' => 'jp', 'long' => 'ja-JP', 'english' => 'Japanese', 'native' => '日本語'], + ['short' => 'ko', 'long' => 'ko-KR', 'english' => 'Korean', 'native' => '한국어'], + ['short' => 'lt', 'long' => 'lt-LT', 'english' => 'Lithuanian', 'native' => 'Lietuvių'], + ['short' => 'lv', 'long' => 'lv-LV', 'english' => 'Latvian', 'native' => 'Latviešu valoda'], + ['short' => 'ms', 'long' => 'ms-MY', 'english' => 'Malay', 'native' => 'Bahasa Melayu'], + ['short' => 'mx', 'long' => 'es-MX', 'english' => 'Mexico', 'native' => 'Español de México'], + ['short' => 'nb', 'long' => 'nb-NO', 'english' => 'Norwegian', 'native' => 'Norsk Bokmål'], + ['short' => 'nl', 'long' => 'nl-NL', 'english' => 'Dutch', 'native' => 'Nederlands'], + ['short' => 'pl', 'long' => 'pl-PL', 'english' => 'Polish', 'native' => 'Polski'], + ['short' => 'pt-BR', 'long' => 'pt-BR', 'english' => 'Brazilian', 'native' => 'Português do Brasil'], + ['short' => 'pt', 'long' => 'pt-PT', 'english' => 'Portuguese', 'native' => 'Português'], + ['short' => 'ro', 'long' => 'ro-RO', 'english' => 'Romanian', 'native' => 'Română'], + ['short' => 'ru', 'long' => 'ru-RU', 'english' => 'Russian', 'native' => 'Русский'], + ['short' => 'sq', 'long' => 'sq-AL', 'english' => 'Albanian', 'native' => 'Shqip'], + ['short' => 'sv', 'long' => 'sv-SE', 'english' => 'Swedish', 'native' => 'Svenska'], + ['short' => 'th', 'long' => 'th-TH', 'english' => 'Thai', 'native' => 'ไทย'], + ['short' => 'tr', 'long' => 'tr-TR', 'english' => 'Turkish', 'native' => 'Türkçe'], + ['short' => 'tw', 'long' => 'zh-TW', 'english' => 'Chinese (T)', 'native' => '繁體中文'], + ['short' => 'uk', 'long' => 'uk-UA', 'english' => 'Ukrainian', 'native' => 'Українська'], + ['short' => 'vn', 'long' => 'vi-VN', 'english' => 'Vietnamese', 'native' => 'Tiếng Việt'], + ], +]; diff --git a/config/laratrust.php b/config/laratrust.php new file mode 100755 index 0000000..f6c322f --- /dev/null +++ b/config/laratrust.php @@ -0,0 +1,182 @@ + true, + + /* + |-------------------------------------------------------------------------- + | Use teams feature in the package + |-------------------------------------------------------------------------- + | + | Defines if Laratrust will use the teams feature. + | Please check the docs to see what you need to do in case you have the package already configured. + | + */ + 'use_teams' => false, + + /* + |-------------------------------------------------------------------------- + | Laratrust User Models + |-------------------------------------------------------------------------- + | + | This is the array that contains the information of the user models. + | This information is used in the add-trait command, and for the roles and + | permissions relationships with the possible user models. + | + | The key in the array is the name of the relationship inside the roles and permissions. + | + */ + 'user_models' => [ + 'users' => 'App\Models\Auth\User', + ], + + /* + |-------------------------------------------------------------------------- + | Laratrust Models + |-------------------------------------------------------------------------- + | + | These are the models used by Laratrust to define the roles, permissions and teams. + | If you want the Laratrust models to be in a different namespace or + | to have a different name, you can do it here. + | + */ + 'models' => [ + /** + * Role model + */ + 'role' => 'App\Models\Auth\Role', + + /** + * Permission model + */ + 'permission' => 'App\Models\Auth\Permission', + + /** + * Team model + */ + 'team' => 'App\Models\Auth\Team', + + ], + + /* + |-------------------------------------------------------------------------- + | Laratrust Tables + |-------------------------------------------------------------------------- + | + | These are the tables used by Laratrust to store all the authorization data. + | + */ + 'tables' => [ + /** + * Roles table. + */ + 'roles' => 'roles', + + /** + * Permissions table. + */ + 'permissions' => 'permissions', + + /** + * Teams table. + */ + 'teams' => 'teams', + + /** + * Role - User intermediate table. + */ + 'role_user' => 'user_roles', + + /** + * Permission - User intermediate table. + */ + 'permission_user' => 'user_permissions', + + /** + * Permission - Role intermediate table. + */ + 'permission_role' => 'role_permissions', + + ], + + /* + |-------------------------------------------------------------------------- + | Laratrust Foreign Keys + |-------------------------------------------------------------------------- + | + | These are the foreign keys used by laratrust in the intermediate tables. + | + */ + 'foreign_keys' => [ + /** + * User foreign key on Laratrust's role_user and permission_user tables. + */ + 'user' => 'user_id', + + /** + * Role foreign key on Laratrust's role_user and permission_role tables. + */ + 'role' => 'role_id', + + /** + * Role foreign key on Laratrust's permission_user and permission_role tables. + */ + 'permission' => 'permission_id', + + /** + * Role foreign key on Laratrust's role_user and permission_user tables. + */ + 'team' => 'team_id', + + ], + + /* + |-------------------------------------------------------------------------- + | Laratrust Middleware + |-------------------------------------------------------------------------- + | + | This configuration helps to customize the Laratrust middlewares behavior. + | + */ + 'middleware' => [ + /** + * Method to be called in the middleware return case. + * Available: abort|redirect + */ + 'handling' => 'redirect', + + /** + * Parameter passed to the middleware_handling method + */ + 'params' => 'auth/login', + + ], + + /* + |-------------------------------------------------------------------------- + | Laratrust Magic 'can' Method + |-------------------------------------------------------------------------- + | + | Supported cases for the magic can method (Refer to the docs). + | Available: camel_case|snake_case|kebab_case + | + */ + 'magic_can_method_case' => 'kebab_case', +]; diff --git a/config/mail.php b/config/mail.php new file mode 100755 index 0000000..81b215a --- /dev/null +++ b/config/mail.php @@ -0,0 +1,123 @@ + env('MAIL_DRIVER', 'mail'), + + /* + |-------------------------------------------------------------------------- + | SMTP Host Address + |-------------------------------------------------------------------------- + | + | Here you may provide the host address of the SMTP server used by your + | applications. A default option is provided that is compatible with + | the Mailgun mail service which will provide reliable deliveries. + | + */ + + 'host' => env('MAIL_HOST', 'localhost'), + + /* + |-------------------------------------------------------------------------- + | SMTP Host Port + |-------------------------------------------------------------------------- + | + | This is the SMTP port used by your application to deliver e-mails to + | users of the application. Like the host we have set this value to + | stay compatible with the Mailgun e-mail application by default. + | + */ + + 'port' => env('MAIL_PORT', 587), + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all e-mails sent by your application to be sent from + | the same address. Here, you may specify a name and address that is + | used globally for all e-mails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + + /* + |-------------------------------------------------------------------------- + | E-Mail Encryption Protocol + |-------------------------------------------------------------------------- + | + | Here you may specify the encryption protocol that should be used when + | the application send e-mail messages. A sensible default using the + | transport layer security protocol should provide great security. + | + */ + + 'encryption' => env('MAIL_ENCRYPTION', 'tls'), + + /* + |-------------------------------------------------------------------------- + | SMTP Server Username + |-------------------------------------------------------------------------- + | + | If your SMTP server requires a username for authentication, you should + | set it here. This will get used to authenticate with your server on + | connection. You may also set the "password" value below this one. + | + */ + + 'username' => env('MAIL_USERNAME'), + + 'password' => env('MAIL_PASSWORD'), + + /* + |-------------------------------------------------------------------------- + | Sendmail System Path + |-------------------------------------------------------------------------- + | + | When using the "sendmail" driver to send e-mails, we will need to know + | the path to where Sendmail lives on this server. A default path has + | been provided here, which will work well on most of your systems. + | + */ + + 'sendmail' => '/usr/sbin/sendmail -bs', + + /* + |-------------------------------------------------------------------------- + | Markdown Mail Settings + |-------------------------------------------------------------------------- + | + | If you are using Markdown based email rendering, you may configure your + | theme and component paths here, allowing you to customize the design + | of the emails. Or, you may simply stick with the Laravel defaults! + | + */ + + 'markdown' => [ + 'theme' => 'default', + + 'paths' => [ + resource_path('views/vendor/mail'), + ], + ], + +]; diff --git a/config/mediable.php b/config/mediable.php new file mode 100755 index 0000000..9f46822 --- /dev/null +++ b/config/mediable.php @@ -0,0 +1,228 @@ + Plank\Mediable\Media::class, + + /* + * Filesystem disk to use if none is specified + */ + 'default_disk' => 'uploads', + + /* + * Filesystems that can be used for media storage + * + * Uploader will throw an exception if a disk not in this list is selected + */ + 'allowed_disks' => [ + 'uploads', + ], + + /* + * The maximum file size in bytes for a single uploaded file + */ + 'max_size' => 1024 * 1024 * 10, + + /* + * What to do if a duplicate file is uploaded. + * + * Options include: + * + * * `'increment'`: the new file's name is given an incrementing suffix + * * `'replace'` : the old file and media model is deleted + * * `'error'`: an Exception is thrown + */ + 'on_duplicate' => Plank\Mediable\MediaUploader::ON_DUPLICATE_INCREMENT, + + /* + * Reject files unless both their mime and extension are recognized and both match a single aggregate type + */ + 'strict_type_checking' => false, + + /* + * Reject files whose mime type or extension is not recognized + * if true, files will be given a type of `'other'` + */ + 'allow_unrecognized_types' => false, + + /* + * Only allow files with specific MIME type(s) to be uploaded + */ + 'allowed_mime_types' => [], + + /* + * Only allow files with specific file extension(s) to be uploaded + */ + 'allowed_extensions' => [], + + /* + * Only allow files matching specific aggregate type(s) to be uploaded + */ + 'allowed_aggregate_types' => [], + + /* + * List of aggregate types recognized by the application + * + * Each type should list the MIME types and extensions + * that should be recognized for the type + */ + 'aggregate_types' => [ + Plank\Mediable\Media::TYPE_IMAGE => [ + 'mime_types' => [ + 'image/jpeg', + 'image/png', + 'image/gif', + ], + 'extensions' => [ + 'jpg', + 'jpeg', + 'png', + 'gif', + ] + ], + Plank\Mediable\Media::TYPE_IMAGE_VECTOR => [ + 'mime_types' => [ + 'image/svg+xml', + ], + 'extensions' => [ + 'svg', + ] + ], + Plank\Mediable\Media::TYPE_PDF => [ + 'mime_types' => [ + 'application/pdf', + ], + 'extensions' => [ + 'pdf', + ] + ], + Plank\Mediable\Media::TYPE_AUDIO => [ + 'mime_types' => [ + 'audio/aac', + 'audio/ogg', + 'audio/mpeg', + 'audio/mp3', + 'audio/mpeg', + 'audio/wav' + ], + 'extensions' => [ + 'aac', + 'ogg', + 'oga', + 'mp3', + 'wav', + ] + ], + Plank\Mediable\Media::TYPE_VIDEO => [ + 'mime_types' => [ + 'video/mp4', + 'video/mpeg', + 'video/ogg', + 'video/webm' + ], + 'extensions' => [ + 'mp4', + 'm4v', + 'mov', + 'ogv', + 'webm' + ] + ], + Plank\Mediable\Media::TYPE_ARCHIVE => [ + 'mime_types' => [ + 'application/zip', + 'application/x-compressed-zip', + 'multipart/x-zip', + ], + 'extensions' => [ + 'zip', + ] + ], + Plank\Mediable\Media::TYPE_DOCUMENT => [ + 'mime_types' => [ + 'text/plain', + 'application/plain', + 'text/xml', + 'text/json', + 'application/json', + 'application/msword', + 'application/application/vnd.openxmlformats-officedocument.wordprocessingml.document' + ], + 'extensions' => [ + 'doc', + 'docx', + 'txt', + 'text', + 'xml', + 'json', + ] + ], + Plank\Mediable\Media::TYPE_SPREADSHEET => [ + 'mime_types' => [ + 'application/vnd.ms-excel', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + ], + 'extensions' => [ + 'xls', + 'xlsx', + ] + ], + Plank\Mediable\Media::TYPE_PRESENTATION => [ + 'mime_types' => + [ + 'application/vnd.ms-powerpoint', + 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'application/vnd.openxmlformats-officedocument.presentationml.slideshow' + ], + 'extensions' => + [ + 'ppt', + 'pptx', + 'ppsx', + ] + ], + ], + + /* + * List of adapters to use for various source inputs + * + * Adapters can map either to a class or a pattern (regex) + */ + 'source_adapters' => [ + 'class' => [ + Symfony\Component\HttpFoundation\File\UploadedFile::class => Plank\Mediable\SourceAdapters\UploadedFileAdapter::class, + Symfony\Component\HttpFoundation\File\File::class => Plank\Mediable\SourceAdapters\FileAdapter::class, + Psr\Http\Message\StreamInterface::class => Plank\Mediable\SourceAdapters\StreamAdapter::class, + ], + 'pattern' => [ + '^https?://' => Plank\Mediable\SourceAdapters\RemoteUrlAdapter::class, + '^/' => Plank\Mediable\SourceAdapters\LocalPathAdapter::class, + '^[a-zA-Z]:\\' => Plank\Mediable\SourceAdapters\LocalPathAdapter::class + ], + ], + + /* + * List of URL Generators to use for handling various filesystem drivers + * + */ + 'url_generators' => [ + 'local' => Plank\Mediable\UrlGenerators\LocalUrlGenerator::class, + 's3' => Plank\Mediable\UrlGenerators\S3UrlGenerator::class, + ], + + /** + * Should mediable instances automatically reload their media relationships after modification are made to a tag. + * + * If true, will automatically reload media the next time `getMedia()`, `getMediaMatchAll()` or `getAllMediaByTag()` are called. + */ + 'rehydrate_media' => true, + + /** + * Detach associated media when mediable model is soft deleted. + */ + 'detach_on_soft_delete' => false, +]; diff --git a/config/menus.php b/config/menus.php new file mode 100755 index 0000000..51632e4 --- /dev/null +++ b/config/menus.php @@ -0,0 +1,18 @@ + [ + 'navbar' => \Nwidart\Menus\Presenters\Bootstrap\NavbarPresenter::class, + 'navbar-right' => \Nwidart\Menus\Presenters\Bootstrap\NavbarRightPresenter::class, + 'nav-pills' => \Nwidart\Menus\Presenters\Bootstrap\NavPillsPresenter::class, + 'nav-tab' => \Nwidart\Menus\Presenters\Bootstrap\NavTabPresenter::class, + 'sidebar' => \Nwidart\Menus\Presenters\Bootstrap\SidebarMenuPresenter::class, + 'navmenu' => \Nwidart\Menus\Presenters\Bootstrap\NavMenuPresenter::class, + 'adminlte' => \Nwidart\Menus\Presenters\Admin\AdminltePresenter::class, + 'zurbmenu' => \Nwidart\Menus\Presenters\Foundation\ZurbMenuPresenter::class, + ], + + 'ordering' => true, + +]; diff --git a/config/modules.php b/config/modules.php new file mode 100755 index 0000000..9b6d3d6 --- /dev/null +++ b/config/modules.php @@ -0,0 +1,169 @@ + 'Modules', + + /* + |-------------------------------------------------------------------------- + | Module Stubs + |-------------------------------------------------------------------------- + | + | Default module stubs. + | + */ + 'stubs' => [ + 'enabled' => true, + 'path' => base_path() . '/app/Console/Stubs/Modules', + 'files' => [ + 'start' => 'start.php', + 'routes' => 'Http/routes.php', + 'views/index' => 'Resources/views/index.blade.php', + 'views/master' => 'Resources/views/layouts/master.blade.php', + 'scaffold/config' => 'Config/config.php', + 'composer' => 'composer.json', + ], + 'replacements' => [ + 'start' => ['LOWER_NAME'], + 'routes' => ['LOWER_NAME', 'STUDLY_NAME', 'MODULE_NAMESPACE'], + 'json' => ['LOWER_NAME', 'STUDLY_NAME', 'MODULE_NAMESPACE'], + 'views/index' => ['LOWER_NAME'], + 'views/master' => ['STUDLY_NAME'], + 'scaffold/config' => ['STUDLY_NAME'], + 'composer' => [ + 'LOWER_NAME', + 'STUDLY_NAME', + 'VENDOR', + 'AUTHOR_NAME', + 'AUTHOR_EMAIL', + 'MODULE_NAMESPACE', + ], + ], + ], + 'paths' => [ + /* + |-------------------------------------------------------------------------- + | Modules path + |-------------------------------------------------------------------------- + | + | This path used for save the generated module. This path also will added + | automatically to list of scanned folders. + | + */ + 'modules' => base_path('modules'), + + /* + |-------------------------------------------------------------------------- + | Modules assets path + |-------------------------------------------------------------------------- + | + | Here you may update the modules assets path. + | + */ + 'assets' => public_path('public/modules'), + + /* + |-------------------------------------------------------------------------- + | The migrations path + |-------------------------------------------------------------------------- + | + | Where you run 'module:publish-migration' command, where do you publish the + | the migration files? + | + */ + 'migration' => base_path('database/migrations'), + + /* + |-------------------------------------------------------------------------- + | Generator path + |-------------------------------------------------------------------------- + | + | Here you may update the modules generator path. + | + */ + 'generator' => [ + 'assets' => 'Assets', + 'config' => 'Config', + 'command' => 'Console', + 'event' => 'Events', + 'listener' => 'Listeners', + 'migration' => 'Database/Migrations', + 'model' => 'Models', + 'repository' => 'Repositories', + 'seeder' => 'Database/Seeders', + 'controller' => 'Http/Controllers', + 'filter' => 'Http/Middleware', + 'request' => 'Http/Requests', + 'provider' => 'Providers', + 'lang' => 'Resources/lang', + 'views' => 'Resources/views', + 'test' => 'Tests', + 'jobs' => 'Jobs', + 'emails' => 'Mail', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Scan Path + |-------------------------------------------------------------------------- + | + | Here you define which folder will be scanned. By default will scan vendor + | directory. This is useful if you host the package in packagist website. + | + */ + 'scan' => [ + 'enabled' => false, + 'paths' => [ + base_path('vendor/*/*'), + ], + ], + + /* + |-------------------------------------------------------------------------- + | Composer File Template + |-------------------------------------------------------------------------- + | + | Here is the config for composer.json file, generated by this package + | + */ + 'composer' => [ + 'vendor' => 'akaunting', + 'author' => [ + 'name' => 'Akaunting', + 'email' => 'info@akaunting.com', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Caching + |-------------------------------------------------------------------------- + | + | Here is the config for setting up caching feature. + | + */ + 'cache' => [ + 'enabled' => true, + 'key' => 'modules', + 'lifetime' => 60, + ], + + /* + |-------------------------------------------------------------------------- + | Choose what laravel-modules will register as custom namespaces. + | Setting one to false will require to register that part + | in your own Service Provider class. + |-------------------------------------------------------------------------- + */ + 'register' => [ + 'translations' => true, + ], +]; diff --git a/config/money.php b/config/money.php new file mode 100755 index 0000000..f00de57 --- /dev/null +++ b/config/money.php @@ -0,0 +1,1808 @@ + [ + 'name' => 'UAE Dirham', + 'code' => 784, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'د.إ', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'AFN' => [ + 'name' => 'Afghani', + 'code' => 971, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '؋', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'ALL' => [ + 'name' => 'Lek', + 'code' => 8, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'L', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'AMD' => [ + 'name' => 'Armenian Dram', + 'code' => 51, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'դր.', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'ANG' => [ + 'name' => 'Netherlands Antillean Guilder', + 'code' => 532, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'ƒ', + 'symbol_first' => true, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'AOA' => [ + 'name' => 'Kwanza', + 'code' => 973, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Kz', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'ARS' => [ + 'name' => 'Argentine Peso', + 'code' => 32, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'AUD' => [ + 'name' => 'Australian Dollar', + 'code' => 36, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ' ', + ], + + 'AWG' => [ + 'name' => 'Aruban Florin', + 'code' => 533, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'ƒ', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'AZN' => [ + 'name' => 'Azerbaijanian Manat', + 'code' => 944, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₼', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'BAM' => [ + 'name' => 'Convertible Mark', + 'code' => 977, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'КМ', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'BBD' => [ + 'name' => 'Barbados Dollar', + 'code' => 52, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'BDT' => [ + 'name' => 'Taka', + 'code' => 50, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '৳', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'BGN' => [ + 'name' => 'Bulgarian Lev', + 'code' => 975, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'лв', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'BHD' => [ + 'name' => 'Bahraini Dinar', + 'code' => 48, + 'precision' => 3, + 'subunit' => 1000, + 'symbol' => 'ب.د', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'BIF' => [ + 'name' => 'Burundi Franc', + 'code' => 108, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => 'Fr', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'BMD' => [ + 'name' => 'Bermudian Dollar', + 'code' => 60, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'BND' => [ + 'name' => 'Brunei Dollar', + 'code' => 96, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'BOB' => [ + 'name' => 'Boliviano', + 'code' => 68, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Bs.', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'BOV' => [ + 'name' => 'Mvdol', + 'code' => 984, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Bs.', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'BRL' => [ + 'name' => 'Brazilian Real', + 'code' => 986, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'R$', + 'symbol_first' => true, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'BSD' => [ + 'name' => 'Bahamian Dollar', + 'code' => 44, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'BTN' => [ + 'name' => 'Ngultrum', + 'code' => 64, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Nu.', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'BWP' => [ + 'name' => 'Pula', + 'code' => 72, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'P', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'BYR' => [ + 'name' => 'Belarussian Ruble', + 'code' => 974, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => 'Br', + 'symbol_first' => false, + 'decimal_mark' => ',', + 'thousands_separator' => ' ', + ], + + 'BZD' => [ + 'name' => 'Belize Dollar', + 'code' => 84, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'CAD' => [ + 'name' => 'Canadian Dollar', + 'code' => 124, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'CDF' => [ + 'name' => 'Congolese Franc', + 'code' => 976, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Fr', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'CHF' => [ + 'name' => 'Swiss Franc', + 'code' => 756, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'CHF', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'CLF' => [ + 'name' => 'Unidades de fomento', + 'code' => 990, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => 'UF', + 'symbol_first' => true, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'CLP' => [ + 'name' => 'Chilean Peso', + 'code' => 152, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'CNY' => [ + 'name' => 'Yuan Renminbi', + 'code' => 156, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '¥', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'COP' => [ + 'name' => 'Colombian Peso', + 'code' => 170, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'CRC' => [ + 'name' => 'Costa Rican Colon', + 'code' => 188, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₡', + 'symbol_first' => true, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'CUC' => [ + 'name' => 'Peso Convertible', + 'code' => 931, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'CUP' => [ + 'name' => 'Cuban Peso', + 'code' => 192, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'CVE' => [ + 'name' => 'Cape Verde Escudo', + 'code' => 132, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'CZK' => [ + 'name' => 'Czech Koruna', + 'code' => 203, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Kč', + 'symbol_first' => false, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'DJF' => [ + 'name' => 'Djibouti Franc', + 'code' => 262, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => 'Fdj', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'DKK' => [ + 'name' => 'Danish Krone', + 'code' => 208, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'kr', + 'symbol_first' => false, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'DOP' => [ + 'name' => 'Dominican Peso', + 'code' => 214, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'DZD' => [ + 'name' => 'Algerian Dinar', + 'code' => 12, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'د.ج', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'EGP' => [ + 'name' => 'Egyptian Pound', + 'code' => 818, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'ج.م', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'ERN' => [ + 'name' => 'Nakfa', + 'code' => 232, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Nfk', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'ETB' => [ + 'name' => 'Ethiopian Birr', + 'code' => 230, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Br', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'EUR' => [ + 'name' => 'Euro', + 'code' => 978, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '€', + 'symbol_first' => true, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'FJD' => [ + 'name' => 'Fiji Dollar', + 'code' => 242, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'FKP' => [ + 'name' => 'Falkland Islands Pound', + 'code' => 238, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '£', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'GBP' => [ + 'name' => 'Pound Sterling', + 'code' => 826, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '£', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'GEL' => [ + 'name' => 'Lari', + 'code' => 981, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'ლ', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'GHS' => [ + 'name' => 'Ghana Cedi', + 'code' => 936, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₵', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'GIP' => [ + 'name' => 'Gibraltar Pound', + 'code' => 292, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '£', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'GMD' => [ + 'name' => 'Dalasi', + 'code' => 270, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'D', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'GNF' => [ + 'name' => 'Guinea Franc', + 'code' => 324, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => 'Fr', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'GTQ' => [ + 'name' => 'Quetzal', + 'code' => 320, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Q', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'GYD' => [ + 'name' => 'Guyana Dollar', + 'code' => 328, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'HKD' => [ + 'name' => 'Hong Kong Dollar', + 'code' => 344, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'HNL' => [ + 'name' => 'Lempira', + 'code' => 340, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'L', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'HRK' => [ + 'name' => 'Croatian Kuna', + 'code' => 191, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'kn', + 'symbol_first' => true, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'HTG' => [ + 'name' => 'Gourde', + 'code' => 332, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'G', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'HUF' => [ + 'name' => 'Forint', + 'code' => 348, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Ft', + 'symbol_first' => false, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'IDR' => [ + 'name' => 'Rupiah', + 'code' => 360, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Rp', + 'symbol_first' => true, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'ILS' => [ + 'name' => 'New Israeli Sheqel', + 'code' => 376, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₪', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'INR' => [ + 'name' => 'Indian Rupee', + 'code' => 356, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₹', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'IQD' => [ + 'name' => 'Iraqi Dinar', + 'code' => 368, + 'precision' => 3, + 'subunit' => 1000, + 'symbol' => 'ع.د', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'IRR' => [ + 'name' => 'Iranian Rial', + 'code' => 364, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '﷼', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'ISK' => [ + 'name' => 'Iceland Krona', + 'code' => 352, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => 'kr', + 'symbol_first' => true, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'JMD' => [ + 'name' => 'Jamaican Dollar', + 'code' => 388, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'JOD' => [ + 'name' => 'Jordanian Dinar', + 'code' => 400, + 'precision' => 3, + 'subunit' => 100, + 'symbol' => 'د.ا', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'JPY' => [ + 'name' => 'Yen', + 'code' => 392, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => '¥', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'KES' => [ + 'name' => 'Kenyan Shilling', + 'code' => 404, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'KSh', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'KGS' => [ + 'name' => 'Som', + 'code' => 417, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'som', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'KHR' => [ + 'name' => 'Riel', + 'code' => 116, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '៛', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'KMF' => [ + 'name' => 'Comoro Franc', + 'code' => 174, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => 'Fr', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'KPW' => [ + 'name' => 'North Korean Won', + 'code' => 408, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₩', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'KRW' => [ + 'name' => 'Won', + 'code' => 410, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => '₩', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'KWD' => [ + 'name' => 'Kuwaiti Dinar', + 'code' => 414, + 'precision' => 3, + 'subunit' => 1000, + 'symbol' => 'د.ك', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'KYD' => [ + 'name' => 'Cayman Islands Dollar', + 'code' => 136, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'KZT' => [ + 'name' => 'Tenge', + 'code' => 398, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '〒', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'LAK' => [ + 'name' => 'Kip', + 'code' => 418, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₭', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'LBP' => [ + 'name' => 'Lebanese Pound', + 'code' => 422, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'ل.ل', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'LKR' => [ + 'name' => 'Sri Lanka Rupee', + 'code' => 144, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₨', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'LRD' => [ + 'name' => 'Liberian Dollar', + 'code' => 430, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'LSL' => [ + 'name' => 'Loti', + 'code' => 426, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'L', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'LTL' => [ + 'name' => 'Lithuanian Litas', + 'code' => 440, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Lt', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'LVL' => [ + 'name' => 'Latvian Lats', + 'code' => 428, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Ls', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'LYD' => [ + 'name' => 'Libyan Dinar', + 'code' => 434, + 'precision' => 3, + 'subunit' => 1000, + 'symbol' => 'ل.د', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'MAD' => [ + 'name' => 'Moroccan Dirham', + 'code' => 504, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'د.م.', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'MDL' => [ + 'name' => 'Moldovan Leu', + 'code' => 498, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'L', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'MGA' => [ + 'name' => 'Malagasy Ariary', + 'code' => 969, + 'precision' => 2, + 'subunit' => 5, + 'symbol' => 'Ar', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'MKD' => [ + 'name' => 'Denar', + 'code' => 807, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'ден', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'MMK' => [ + 'name' => 'Kyat', + 'code' => 104, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'K', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'MNT' => [ + 'name' => 'Tugrik', + 'code' => 496, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₮', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'MOP' => [ + 'name' => 'Pataca', + 'code' => 446, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'P', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'MRO' => [ + 'name' => 'Ouguiya', + 'code' => 478, + 'precision' => 2, + 'subunit' => 5, + 'symbol' => 'UM', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'MUR' => [ + 'name' => 'Mauritius Rupee', + 'code' => 480, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₨', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'MVR' => [ + 'name' => 'Rufiyaa', + 'code' => 462, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'MVR', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'MWK' => [ + 'name' => 'Kwacha', + 'code' => 454, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'MK', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'MXN' => [ + 'name' => 'Mexican Peso', + 'code' => 484, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'MYR' => [ + 'name' => 'Malaysian Ringgit', + 'code' => 458, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'RM', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'MZN' => [ + 'name' => 'Mozambique Metical', + 'code' => 943, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'MTn', + 'symbol_first' => true, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'NAD' => [ + 'name' => 'Namibia Dollar', + 'code' => 516, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'NGN' => [ + 'name' => 'Naira', + 'code' => 566, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₦', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'NIO' => [ + 'name' => 'Cordoba Oro', + 'code' => 558, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'C$', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'NOK' => [ + 'name' => 'Norwegian Krone', + 'code' => 578, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'kr', + 'symbol_first' => false, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'NPR' => [ + 'name' => 'Nepalese Rupee', + 'code' => 524, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₨', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'NZD' => [ + 'name' => 'New Zealand Dollar', + 'code' => 554, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'OMR' => [ + 'name' => 'Rial Omani', + 'code' => 512, + 'precision' => 3, + 'subunit' => 1000, + 'symbol' => 'ر.ع.', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'PAB' => [ + 'name' => 'Balboa', + 'code' => 590, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'B/.', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'PEN' => [ + 'name' => 'Nuevo Sol', + 'code' => 604, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'S/.', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'PGK' => [ + 'name' => 'Kina', + 'code' => 598, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'K', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'PHP' => [ + 'name' => 'Philippine Peso', + 'code' => 608, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₱', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'PKR' => [ + 'name' => 'Pakistan Rupee', + 'code' => 586, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₨', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'PLN' => [ + 'name' => 'Zloty', + 'code' => 985, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'zł', + 'symbol_first' => false, + 'decimal_mark' => ',', + 'thousands_separator' => ' ', + ], + + 'PYG' => [ + 'name' => 'Guarani', + 'code' => 600, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => '₲', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'QAR' => [ + 'name' => 'Qatari Rial', + 'code' => 634, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'ر.ق', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'RON' => [ + 'name' => 'New Romanian Leu', + 'code' => 946, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Lei', + 'symbol_first' => true, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'RSD' => [ + 'name' => 'Serbian Dinar', + 'code' => 941, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'РСД', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'RUB' => [ + 'name' => 'Russian Ruble', + 'code' => 643, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₽', + 'symbol_first' => false, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'RWF' => [ + 'name' => 'Rwanda Franc', + 'code' => 646, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => 'FRw', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'SAR' => [ + 'name' => 'Saudi Riyal', + 'code' => 682, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'ر.س', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'SBD' => [ + 'name' => 'Solomon Islands Dollar', + 'code' => 90, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'SCR' => [ + 'name' => 'Seychelles Rupee', + 'code' => 690, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₨', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'SDG' => [ + 'name' => 'Sudanese Pound', + 'code' => 938, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '£', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'SEK' => [ + 'name' => 'Swedish Krona', + 'code' => 752, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'kr', + 'symbol_first' => false, + 'decimal_mark' => ',', + 'thousands_separator' => ' ', + ], + + 'SGD' => [ + 'name' => 'Singapore Dollar', + 'code' => 702, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'SHP' => [ + 'name' => 'Saint Helena Pound', + 'code' => 654, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '£', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'SLL' => [ + 'name' => 'Leone', + 'code' => 694, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Le', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'SOS' => [ + 'name' => 'Somali Shilling', + 'code' => 706, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Sh', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'SRD' => [ + 'name' => 'Surinam Dollar', + 'code' => 968, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'SSP' => [ + 'name' => 'South Sudanese Pound', + 'code' => 728, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '£', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'STD' => [ + 'name' => 'Dobra', + 'code' => 678, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Db', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'SVC' => [ + 'name' => 'El Salvador Colon', + 'code' => 222, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₡', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'SYP' => [ + 'name' => 'Syrian Pound', + 'code' => 760, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '£S', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'SZL' => [ + 'name' => 'Lilangeni', + 'code' => 748, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'E', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'THB' => [ + 'name' => 'Baht', + 'code' => 764, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '฿', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'TJS' => [ + 'name' => 'Somoni', + 'code' => 972, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'ЅМ', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'TMT' => [ + 'name' => 'Turkmenistan New Manat', + 'code' => 934, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'T', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'TND' => [ + 'name' => 'Tunisian Dinar', + 'code' => 788, + 'precision' => 3, + 'subunit' => 1000, + 'symbol' => 'د.ت', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'TOP' => [ + 'name' => 'Pa’anga', + 'code' => 776, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'T$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'TRY' => [ + 'name' => 'Turkish Lira', + 'code' => 949, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₺', + 'symbol_first' => true, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'TTD' => [ + 'name' => 'Trinidad and Tobago Dollar', + 'code' => 780, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'TWD' => [ + 'name' => 'New Taiwan Dollar', + 'code' => 901, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'TZS' => [ + 'name' => 'Tanzanian Shilling', + 'code' => 834, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Sh', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'UAH' => [ + 'name' => 'Hryvnia', + 'code' => 980, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '₴', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'UGX' => [ + 'name' => 'Uganda Shilling', + 'code' => 800, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => 'USh', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'USD' => [ + 'name' => 'US Dollar', + 'code' => 840, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'UYU' => [ + 'name' => 'Peso Uruguayo', + 'code' => 858, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'UZS' => [ + 'name' => 'Uzbekistan Sum', + 'code' => 860, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => null, + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'VEF' => [ + 'name' => 'Bolivar', + 'code' => 937, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'Bs F', + 'symbol_first' => true, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'VND' => [ + 'name' => 'Dong', + 'code' => 704, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => '₫', + 'symbol_first' => true, + 'decimal_mark' => ',', + 'thousands_separator' => '.', + ], + + 'VUV' => [ + 'name' => 'Vatu', + 'code' => 548, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => 'Vt', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'WST' => [ + 'name' => 'Tala', + 'code' => 882, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'T', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'XAF' => [ + 'name' => 'CFA Franc BEAC', + 'code' => 950, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => 'Fr', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'XAG' => [ + 'name' => 'Silver', + 'code' => 961, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => 'oz t', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'XAU' => [ + 'name' => 'Gold', + 'code' => 959, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => 'oz t', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'XCD' => [ + 'name' => 'East Caribbean Dollar', + 'code' => 951, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'XDR' => [ + 'name' => 'SDR (Special Drawing Right)', + 'code' => 960, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => 'SDR', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'XOF' => [ + 'name' => 'CFA Franc BCEAO', + 'code' => 952, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => 'Fr', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'XPF' => [ + 'name' => 'CFP Franc', + 'code' => 953, + 'precision' => 0, + 'subunit' => 1, + 'symbol' => 'Fr', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'YER' => [ + 'name' => 'Yemeni Rial', + 'code' => 886, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '﷼', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'ZAR' => [ + 'name' => 'Rand', + 'code' => 710, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'R', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'ZMW' => [ + 'name' => 'Zambian Kwacha', + 'code' => 967, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => 'ZK', + 'symbol_first' => false, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], + + 'ZWL' => [ + 'name' => 'Zimbabwe Dollar', + 'code' => 932, + 'precision' => 2, + 'subunit' => 100, + 'symbol' => '$', + 'symbol_first' => true, + 'decimal_mark' => '.', + 'thousands_separator' => ',', + ], +]; diff --git a/config/queue.php b/config/queue.php new file mode 100755 index 0000000..a7c024d --- /dev/null +++ b/config/queue.php @@ -0,0 +1,86 @@ + env('QUEUE_DRIVER', 'database'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection information for each server that + | is used by your application. A default configuration has been added + | for each back-end shipped with Laravel. You are free to add more. + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'jobs', + 'queue' => 'default', + 'delay' => 2, + 'retry_after' => 90, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => 'localhost', + 'queue' => 'default', + 'retry_after' => 90, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => 'your-public-key', + 'secret' => 'your-secret-key', + 'prefix' => 'https://sqs.us-east-1.amazonaws.com/your-account-id', + 'queue' => 'your-queue-name', + 'region' => 'us-east-1', + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => 'default', + 'retry_after' => 90, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control which database and table are used to store the jobs that + | have failed. You may change them to any database / table you wish. + | + */ + + 'failed' => [ + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100755 index 0000000..4460f0e --- /dev/null +++ b/config/services.php @@ -0,0 +1,38 @@ + [ + 'domain' => env('MAILGUN_DOMAIN'), + 'secret' => env('MAILGUN_SECRET'), + ], + + 'ses' => [ + 'key' => env('SES_KEY'), + 'secret' => env('SES_SECRET'), + 'region' => 'us-east-1', + ], + + 'sparkpost' => [ + 'secret' => env('SPARKPOST_SECRET'), + ], + + 'stripe' => [ + 'model' => App\User::class, + 'key' => env('STRIPE_KEY'), + 'secret' => env('STRIPE_SECRET'), + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100755 index 0000000..cc076ee --- /dev/null +++ b/config/session.php @@ -0,0 +1,179 @@ + env('SESSION_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to immediately expire on the browser closing, set that option. + | + */ + + 'lifetime' => 30, + + 'expire_on_close' => false, + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it is stored. All encryption will be run + | automatically by Laravel and you can use the Session like normal. + | + */ + + 'encrypt' => false, + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When using the native session driver, we need a location where session + | files may be stored. A default has been set for you but a different + | location may be specified. This is only needed for file sessions. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => null, + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table we + | should use to manage the sessions. Of course, a sensible default is + | provided for you; however, you are free to change this as needed. + | + */ + + 'table' => 'sessions', + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | When using the "apc" or "memcached" session drivers, you may specify a + | cache store that should be used for these sessions. This value must + | correspond with one of the application's configured cache stores. + | + */ + + 'store' => null, + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the cookie used to identify a session + | instance by ID. The name specified here will get used every time a + | new session cookie is created by the framework for every driver. + | + */ + + 'cookie' => 'laravel_session', + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application but you are free to change this when necessary. + | + */ + + 'path' => '/', + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | Here you may change the domain of the cookie used to identify a session + | in your application. This will determine which domains the cookie is + | available to in your application. A sensible default has been set. + | + */ + + 'domain' => env('SESSION_DOMAIN', null), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you if it can not be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE', false), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. You are free to modify this option if needed. + | + */ + + 'http_only' => true, + +]; diff --git a/config/setting.php b/config/setting.php new file mode 100755 index 0000000..49f18be --- /dev/null +++ b/config/setting.php @@ -0,0 +1,70 @@ + false, + + /* + |-------------------------------------------------------------------------- + | Setting driver + |-------------------------------------------------------------------------- + | + | Select where to store the settings. + | + | Supported: "database", "json" + | + */ + 'driver' => 'database', + + /* + |-------------------------------------------------------------------------- + | Database driver + |-------------------------------------------------------------------------- + | + | Options for database driver. Enter which connection to use, null means + | the default connection. Set the table and column names. + | + */ + 'database' => [ + 'connection' => null, + 'table' => 'settings', + 'key' => 'key', + 'value' => 'value', + ], + + /* + |-------------------------------------------------------------------------- + | JSON driver + |-------------------------------------------------------------------------- + | + | Options for json driver. Enter the full path to the .json file. + | + */ + 'json' => [ + 'path' => storage_path().'/settings.json', + ], + + /* + |-------------------------------------------------------------------------- + | Override application config values + |-------------------------------------------------------------------------- + | + | If defined, settings package will override these config values. + | + | Sample: + | "app.fallback_locale", + | "app.locale" => "settings.locale", + | + */ + 'override' => [ + + ], +]; diff --git a/config/version.php b/config/version.php new file mode 100755 index 0000000..f2ddd08 --- /dev/null +++ b/config/version.php @@ -0,0 +1,25 @@ + 'Akaunting', + + 'code' => 'Recurring', + + 'major' => '1', + + 'minor' => '2', + + 'patch' => '16', + + 'build' => '', + + 'status' => 'Stable', + + 'date' => '14-September-2018', + + 'time' => '12:30', + + 'zone' => 'GMT +3', + +]; diff --git a/config/view.php b/config/view.php new file mode 100755 index 0000000..2acfd9c --- /dev/null +++ b/config/view.php @@ -0,0 +1,33 @@ + [ + resource_path('views'), + ], + + /* + |-------------------------------------------------------------------------- + | Compiled View Path + |-------------------------------------------------------------------------- + | + | This option determines where all the compiled Blade templates will be + | stored for your application. Typically, this is within the storage + | directory. However, as usual, you are free to change this value. + | + */ + + 'compiled' => realpath(storage_path('framework/views')), + +]; diff --git a/database/.gitignore b/database/.gitignore new file mode 100755 index 0000000..9b1dffd --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +*.sqlite diff --git a/database/factories/ItemFacorty.php b/database/factories/ItemFacorty.php new file mode 100755 index 0000000..0b30dca --- /dev/null +++ b/database/factories/ItemFacorty.php @@ -0,0 +1,28 @@ +define(Item::class, function (Generator $faker) { + /** @var User $user */ + $user = User::first(); + /** @var Company $company */ + $company = $user->companies()->first(); + + return [ + 'name' => $faker->title, + 'sku' => $faker->languageCode, + 'company_id' => $company->id, + 'description' => $faker->text(100), + 'purchase_price' => $faker->randomFloat(2,10,20), + 'sale_price' => $faker->randomFloat(2,10,20), + 'quantity' => $faker->randomNumber(2), + 'category_id' => $company->categories()->first()->id, + 'tax_id' => $company->taxes()->first()->id, + 'enabled' => $this->faker->boolean ? 1 : 0 + ]; +}); diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php new file mode 100755 index 0000000..80aa38c --- /dev/null +++ b/database/factories/ModelFactory.php @@ -0,0 +1,24 @@ +define(\App\Models\Auth\User::class, function (Faker\Generator $faker) { + static $password; + + return [ + 'name' => $faker->name, + 'email' => $faker->unique()->safeEmail, + 'password' => $password ?: $password = bcrypt('secret'), + 'remember_token' => str_random(10), + ]; +}); diff --git a/database/migrations/2017_09_01_000000_create_accounts_table.php b/database/migrations/2017_09_01_000000_create_accounts_table.php new file mode 100755 index 0000000..d95bc1b --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_accounts_table.php @@ -0,0 +1,42 @@ +increments('id'); + $table->integer('company_id'); + $table->string('name'); + $table->string('number'); + $table->string('currency_code'); + $table->double('opening_balance', 15, 4)->default('0.0000'); + $table->string('bank_name')->nullable(); + $table->string('bank_phone')->nullable(); + $table->text('bank_address')->nullable(); + $table->boolean('enabled'); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('accounts'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_bills_table.php b/database/migrations/2017_09_01_000000_create_bills_table.php new file mode 100755 index 0000000..2ba4376 --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_bills_table.php @@ -0,0 +1,116 @@ +increments('id'); + $table->integer('company_id'); + $table->string('bill_number'); + $table->string('order_number')->nullable(); + $table->string('bill_status_code'); + $table->date('billed_at'); + $table->date('due_at'); + $table->double('amount', 15, 4); + $table->string('currency_code'); + $table->double('currency_rate', 15, 8); + $table->integer('vendor_id'); + $table->string('vendor_name'); + $table->string('vendor_email'); + $table->string('vendor_tax_number')->nullable(); + $table->string('vendor_phone')->nullable(); + $table->text('vendor_address')->nullable(); + $table->text('notes')->nullable(); + $table->string('attachment')->nullable(); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + $table->unique(['company_id', 'bill_number', 'deleted_at']); + }); + + Schema::create('bill_items', function (Blueprint $table) { + $table->increments('id'); + $table->integer('company_id'); + $table->integer('bill_id'); + $table->integer('item_id')->nullable(); + $table->string('name'); + $table->string('sku')->nullable(); + $table->double('quantity', 7, 2); + $table->double('price', 15, 4); + $table->double('total', 15, 4); + $table->float('tax', 15, 4)->default('0.0000'); + $table->integer('tax_id'); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + }); + + Schema::create('bill_statuses', function (Blueprint $table) { + $table->increments('id'); + $table->integer('company_id'); + $table->string('name'); + $table->string('code'); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + }); + + Schema::create('bill_payments', function (Blueprint $table) { + $table->increments('id'); + $table->integer('company_id'); + $table->integer('bill_id'); + $table->integer('account_id'); + $table->date('paid_at'); + $table->double('amount', 15, 4); + $table->string('currency_code'); + $table->double('currency_rate', 15, 8); + $table->text('description')->nullable(); + $table->string('payment_method'); + $table->string('reference')->nullable(); + $table->string('attachment')->nullable(); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + }); + + Schema::create('bill_histories', function (Blueprint $table) { + $table->increments('id'); + $table->integer('company_id'); + $table->integer('bill_id'); + $table->string('status_code'); + $table->boolean('notify'); + $table->text('description')->nullable(); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('bills'); + Schema::drop('bill_items'); + Schema::drop('bill_statuses'); + Schema::drop('bill_payments'); + Schema::drop('bill_histories'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_categories_table.php b/database/migrations/2017_09_01_000000_create_categories_table.php new file mode 100755 index 0000000..82a1a2c --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_categories_table.php @@ -0,0 +1,38 @@ +increments('id'); + $table->integer('company_id'); + $table->string('name'); + $table->string('type'); + $table->string('color'); + $table->boolean('enabled'); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('categories'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_companies_table.php b/database/migrations/2017_09_01_000000_create_companies_table.php new file mode 100755 index 0000000..6606fb1 --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_companies_table.php @@ -0,0 +1,33 @@ +increments('id'); + $table->string('domain'); + $table->boolean('enabled')->default(1); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('companies'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_currencies_table.php b/database/migrations/2017_09_01_000000_create_currencies_table.php new file mode 100755 index 0000000..49ca90f --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_currencies_table.php @@ -0,0 +1,39 @@ +increments('id'); + $table->integer('company_id'); + $table->string('name'); + $table->string('code'); + $table->double('rate', 15, 8); + $table->tinyInteger('enabled')->default(0); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + $table->unique(['company_id', 'code', 'deleted_at']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('currencies'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_customers_table.php b/database/migrations/2017_09_01_000000_create_customers_table.php new file mode 100755 index 0000000..0a65a51 --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_customers_table.php @@ -0,0 +1,44 @@ +increments('id'); + $table->integer('company_id'); + $table->integer('user_id')->nullable(); + $table->string('name'); + $table->string('email'); + $table->string('tax_number')->nullable(); + $table->string('phone')->nullable(); + $table->text('address')->nullable(); + $table->string('website')->nullable(); + $table->string('currency_code'); + $table->boolean('enabled'); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + $table->unique(['company_id', 'email', 'deleted_at']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('customers'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_invoices_table.php b/database/migrations/2017_09_01_000000_create_invoices_table.php new file mode 100755 index 0000000..123a2f8 --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_invoices_table.php @@ -0,0 +1,116 @@ +increments('id'); + $table->integer('company_id'); + $table->string('invoice_number'); + $table->string('order_number')->nullable(); + $table->string('invoice_status_code'); + $table->date('invoiced_at'); + $table->date('due_at'); + $table->double('amount', 15, 4); + $table->string('currency_code'); + $table->double('currency_rate', 15, 8); + $table->integer('customer_id'); + $table->string('customer_name'); + $table->string('customer_email'); + $table->string('customer_tax_number')->nullable(); + $table->string('customer_phone')->nullable(); + $table->text('customer_address')->nullable(); + $table->text('notes')->nullable(); + $table->string('attachment')->nullable(); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + $table->unique(['company_id', 'invoice_number', 'deleted_at']); + }); + + Schema::create('invoice_items', function (Blueprint $table) { + $table->increments('id'); + $table->integer('company_id'); + $table->integer('invoice_id'); + $table->integer('item_id')->nullable(); + $table->string('name'); + $table->string('sku')->nullable(); + $table->double('quantity', 7, 2); + $table->double('price', 15, 4); + $table->double('total', 15, 4); + $table->double('tax', 15, 4)->default('0.0000'); + $table->integer('tax_id'); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + }); + + Schema::create('invoice_statuses', function (Blueprint $table) { + $table->increments('id'); + $table->integer('company_id'); + $table->string('name'); + $table->string('code'); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + }); + + Schema::create('invoice_payments', function (Blueprint $table) { + $table->increments('id'); + $table->integer('company_id'); + $table->integer('invoice_id'); + $table->integer('account_id'); + $table->date('paid_at'); + $table->double('amount', 15, 4); + $table->string('currency_code'); + $table->double('currency_rate', 15, 8); + $table->text('description')->nullable(); + $table->string('payment_method'); + $table->string('reference')->nullable(); + $table->string('attachment')->nullable(); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + }); + + Schema::create('invoice_histories', function (Blueprint $table) { + $table->increments('id'); + $table->integer('company_id'); + $table->integer('invoice_id'); + $table->string('status_code'); + $table->boolean('notify'); + $table->text('description')->nullable(); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('invoices'); + Schema::drop('invoice_items'); + Schema::drop('invoice_statuses'); + Schema::drop('invoice_payments'); + Schema::drop('invoice_histories'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_items_table.php b/database/migrations/2017_09_01_000000_create_items_table.php new file mode 100755 index 0000000..d76144a --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_items_table.php @@ -0,0 +1,45 @@ +increments('id'); + $table->integer('company_id'); + $table->string('name'); + $table->string('sku'); + $table->text('description')->nullable(); + $table->double('sale_price', 15, 4); + $table->double('purchase_price', 15, 4); + $table->integer('quantity'); + $table->integer('category_id')->nullable(); + $table->integer('tax_id')->nullable(); + $table->string('picture')->nullable(); + $table->boolean('enabled'); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + $table->unique(['company_id', 'sku', 'deleted_at']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('items'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_jobs_table.php b/database/migrations/2017_09_01_000000_create_jobs_table.php new file mode 100755 index 0000000..ae05432 --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_jobs_table.php @@ -0,0 +1,38 @@ +bigIncrements('id'); + $table->string('queue'); + $table->longText('payload'); + $table->tinyInteger('attempts')->unsigned(); + $table->unsignedInteger('reserved_at')->nullable(); + $table->unsignedInteger('available_at'); + $table->unsignedInteger('created_at'); + + $table->index(['queue', 'reserved_at']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('jobs'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_modules_table.php b/database/migrations/2017_09_01_000000_create_modules_table.php new file mode 100755 index 0000000..1d8f450 --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_modules_table.php @@ -0,0 +1,51 @@ +increments('id'); + $table->integer('company_id'); + $table->string('alias'); + $table->integer('status'); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + $table->unique(['company_id', 'alias', 'deleted_at']); + }); + + Schema::create('module_histories', function (Blueprint $table) { + $table->increments('id'); + $table->integer('company_id'); + $table->integer('module_id'); + $table->string('category'); + $table->string('version'); + $table->text('description')->nullable(); + $table->timestamps(); + $table->softDeletes(); + + $table->index(['company_id', 'module_id']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('modules'); + Schema::drop('module_histories'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_notifications_table.php b/database/migrations/2017_09_01_000000_create_notifications_table.php new file mode 100755 index 0000000..fb16d5b --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_notifications_table.php @@ -0,0 +1,35 @@ +uuid('id')->primary(); + $table->string('type'); + $table->morphs('notifiable'); + $table->text('data'); + $table->timestamp('read_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('notifications'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_password_resets_table.php b/database/migrations/2017_09_01_000000_create_password_resets_table.php new file mode 100755 index 0000000..68e6142 --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_password_resets_table.php @@ -0,0 +1,34 @@ +string('email'); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + + $table->index('email'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('password_resets'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_payments_table.php b/database/migrations/2017_09_01_000000_create_payments_table.php new file mode 100755 index 0000000..8d9ea1b --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_payments_table.php @@ -0,0 +1,45 @@ +increments('id'); + $table->integer('company_id'); + $table->integer('account_id'); + $table->date('paid_at'); + $table->double('amount', 15, 4); + $table->string('currency_code'); + $table->double('currency_rate', 15, 8); + $table->integer('vendor_id')->nullable(); + $table->text('description')->nullable(); + $table->integer('category_id'); + $table->string('payment_method'); + $table->string('reference')->nullable(); + $table->string('attachment')->nullable(); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('payments'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_revenues_table.php b/database/migrations/2017_09_01_000000_create_revenues_table.php new file mode 100755 index 0000000..e87bba2 --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_revenues_table.php @@ -0,0 +1,45 @@ +increments('id'); + $table->integer('company_id'); + $table->integer('account_id'); + $table->date('paid_at'); + $table->double('amount', 15, 4); + $table->string('currency_code'); + $table->double('currency_rate', 15, 8); + $table->integer('customer_id')->nullable(); + $table->text('description')->nullable(); + $table->integer('category_id'); + $table->string('payment_method'); + $table->string('reference')->nullable(); + $table->string('attachment')->nullable(); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('revenues'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_roles_table.php b/database/migrations/2017_09_01_000000_create_roles_table.php new file mode 100755 index 0000000..71b9702 --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_roles_table.php @@ -0,0 +1,89 @@ +increments('id'); + $table->string('name'); + $table->string('display_name'); + $table->string('description')->nullable(); + $table->timestamps(); + + $table->unique('name'); + }); + + // Create table for associating roles to users (Many To Many Polymorphic) + Schema::create('user_roles', function (Blueprint $table) { + $table->integer('user_id')->unsigned(); + $table->integer('role_id')->unsigned(); + $table->string('user_type'); + + $table->foreign('role_id')->references('id')->on('roles') + ->onUpdate('cascade')->onDelete('cascade'); + + $table->primary(['user_id', 'role_id', 'user_type']); + }); + + // Create table for storing permissions + Schema::create('permissions', function (Blueprint $table) { + $table->increments('id'); + $table->string('name'); + $table->string('display_name'); + $table->string('description')->nullable(); + $table->timestamps(); + + $table->unique('name'); + }); + + // Create table for associating permissions to roles (Many-to-Many) + Schema::create('role_permissions', function (Blueprint $table) { + $table->integer('role_id')->unsigned(); + $table->integer('permission_id')->unsigned(); + + $table->foreign('role_id')->references('id')->on('roles') + ->onUpdate('cascade')->onDelete('cascade'); + $table->foreign('permission_id')->references('id')->on('permissions') + ->onUpdate('cascade')->onDelete('cascade'); + + $table->primary(['role_id', 'permission_id']); + }); + + // Create table for associating permissions to users (Many To Many Polymorphic) + Schema::create('user_permissions', function (Blueprint $table) { + $table->integer('user_id')->unsigned(); + $table->integer('permission_id')->unsigned(); + $table->string('user_type'); + + $table->foreign('permission_id')->references('id')->on('permissions') + ->onUpdate('cascade')->onDelete('cascade'); + + $table->primary(['user_id', 'permission_id', 'user_type']); + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // Cascade table first + Schema::dropIfExists('user_permissions'); + Schema::dropIfExists('role_permissions'); + Schema::dropIfExists('permissions'); + Schema::dropIfExists('user_roles'); + Schema::dropIfExists('roles'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_sessions_table.php b/database/migrations/2017_09_01_000000_create_sessions_table.php new file mode 100755 index 0000000..c213297 --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_sessions_table.php @@ -0,0 +1,35 @@ +string('id')->unique(); + $table->unsignedInteger('user_id')->nullable(); + $table->string('ip_address', 45)->nullable(); + $table->text('user_agent')->nullable(); + $table->text('payload'); + $table->integer('last_activity'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('sessions'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_settings_table.php b/database/migrations/2017_09_01_000000_create_settings_table.php new file mode 100755 index 0000000..422920f --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_settings_table.php @@ -0,0 +1,36 @@ +increments('id'); + $table->integer('company_id'); + $table->string('key'); + $table->text('value')->nullable(); + + $table->index('company_id'); + $table->unique(['company_id', 'key']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('settings'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_taxes_table.php b/database/migrations/2017_09_01_000000_create_taxes_table.php new file mode 100755 index 0000000..ca0154e --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_taxes_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->integer('company_id'); + $table->string('name'); + $table->double('rate', 15, 4); + $table->boolean('enabled'); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('taxes'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_transfers_table.php b/database/migrations/2017_09_01_000000_create_transfers_table.php new file mode 100755 index 0000000..f7b35a5 --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_transfers_table.php @@ -0,0 +1,36 @@ +increments('id'); + $table->integer('company_id'); + $table->integer('payment_id'); + $table->integer('revenue_id'); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('transfers'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_users_table.php b/database/migrations/2017_09_01_000000_create_users_table.php new file mode 100755 index 0000000..1a97f41 --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_users_table.php @@ -0,0 +1,52 @@ +increments('id'); + $table->string('name'); + $table->string('email'); + $table->string('password'); + $table->rememberToken(); + $table->string('picture')->nullable(); + $table->timestamp('last_logged_in_at')->nullable(); + $table->boolean('enabled')->default(1); + $table->timestamps(); + $table->softDeletes(); + + $table->unique(['email', 'deleted_at']); + }); + + // Create table for associating companies to users (Many To Many Polymorphic) + Schema::create('user_companies', function (Blueprint $table) { + $table->integer('user_id')->unsigned(); + $table->integer('company_id')->unsigned(); + $table->string('user_type'); + + $table->primary(['user_id', 'company_id', 'user_type']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // Cascade table first + Schema::dropIfExists('user_companies'); + Schema::dropIfExists('users'); + } +} diff --git a/database/migrations/2017_09_01_000000_create_vendors_table.php b/database/migrations/2017_09_01_000000_create_vendors_table.php new file mode 100755 index 0000000..9356325 --- /dev/null +++ b/database/migrations/2017_09_01_000000_create_vendors_table.php @@ -0,0 +1,44 @@ +increments('id'); + $table->integer('company_id'); + $table->integer('user_id')->nullable(); + $table->string('name'); + $table->string('email'); + $table->string('tax_number')->nullable(); + $table->string('phone')->nullable(); + $table->text('address')->nullable(); + $table->string('website')->nullable(); + $table->string('currency_code'); + $table->boolean('enabled'); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + $table->unique(['company_id', 'email', 'deleted_at']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('vendors'); + } +} diff --git a/database/migrations/2017_10_11_000000_create_bill_totals_table.php b/database/migrations/2017_10_11_000000_create_bill_totals_table.php new file mode 100755 index 0000000..d3b8b7a --- /dev/null +++ b/database/migrations/2017_10_11_000000_create_bill_totals_table.php @@ -0,0 +1,139 @@ +increments('id'); + $table->integer('company_id'); + $table->integer('bill_id'); + $table->string('code')->nullable(); + $table->string('name'); + $table->double('amount', 15, 4); + $table->integer('sort_order'); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + }); + + Model::unguard(); + + $companies = Company::all(); + + foreach ($companies as $company) { + $bills = Bill::where('company_id', $company->id)->get(); + + foreach ($bills as $bill) { + $bill_items = BillItem::where('company_id', $company->id)->where('bill_id', $bill->id)->get(); + + $taxes = []; + $tax_total = 0; + $sub_total = 0; + + foreach ($bill_items as $bill_item) { + unset($tax_object); + + $bill_item->total = $bill_item->price * $bill_item->quantity; + + if (!empty($bill_item->tax_id)) { + $tax_object = Tax::where('company_id', $company->id)->where('id', $bill_item->tax_id)->first(); + + $bill_item->tax = (($bill_item->price * $bill_item->quantity) / 100) * $tax_object->rate; + } + + $bill_item->update(); + + if (isset($tax_object)) { + if (array_key_exists($bill_item->tax_id, $taxes)) { + $taxes[$bill_item->tax_id]['amount'] += $bill_item->tax; + } else { + $taxes[$bill_item->tax_id] = [ + 'name' => $tax_object->name, + 'amount' => $bill_item->tax + ]; + } + } + + $tax_total += $bill_item->tax; + $sub_total += $bill_item->price * $bill_item->quantity; + } + + $bill->amount = $sub_total + $tax_total; + + $bill->update(); + + // Added bill total sub total + $bill_sub_total = [ + 'company_id' => $company->id, + 'bill_id' => $bill->id, + 'code' => 'sub_total', + 'name' => 'bills.sub_total', + 'amount' => $sub_total, + 'sort_order' => 1, + ]; + + BillTotal::create($bill_sub_total); + + $sort_order = 2; + + // Added bill total taxes + if ($taxes) { + foreach ($taxes as $tax) { + $bill_tax_total = [ + 'company_id' => $company->id, + 'bill_id' => $bill->id, + 'code' => 'tax', + 'name' => $tax['name'], + 'amount' => $tax['amount'], + 'sort_order' => $sort_order, + ]; + + BillTotal::create($bill_tax_total); + + $sort_order++; + } + } + + // Added bill total total + $bill_total = [ + 'company_id' => $company->id, + 'bill_id' => $bill->id, + 'code' => 'total', + 'name' => 'bills.total', + 'amount' => $sub_total + $tax_total, + 'sort_order' => $sort_order, + ]; + + BillTotal::create($bill_total); + } + } + + Model::reguard(); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('bill_totals'); + } +} diff --git a/database/migrations/2017_10_11_000000_create_invoice_totals_table.php b/database/migrations/2017_10_11_000000_create_invoice_totals_table.php new file mode 100755 index 0000000..639232f --- /dev/null +++ b/database/migrations/2017_10_11_000000_create_invoice_totals_table.php @@ -0,0 +1,139 @@ +increments('id'); + $table->integer('company_id'); + $table->integer('invoice_id'); + $table->string('code')->nullable(); + $table->string('name'); + $table->double('amount', 15, 4); + $table->integer('sort_order'); + $table->timestamps(); + $table->softDeletes(); + + $table->index('company_id'); + }); + + Model::unguard(); + + $companies = Company::all(); + + foreach ($companies as $company) { + $invoices = Invoice::where('company_id', $company->id)->get(); + + foreach ($invoices as $invoice) { + $invoice_items = InvoiceItem::where('company_id', $company->id)->where('invoice_id', $invoice->id)->get(); + + $taxes = []; + $tax_total = 0; + $sub_total = 0; + + foreach ($invoice_items as $invoice_item) { + unset($tax_object); + + $invoice_item->total = $invoice_item->price * $invoice_item->quantity; + + if (!empty($invoice_item->tax_id)) { + $tax_object = Tax::where('company_id', $company->id)->where('id', $invoice_item->tax_id)->first(); + + $invoice_item->tax = (($invoice_item->price * $invoice_item->quantity) / 100) * $tax_object->rate; + } + + $invoice_item->update(); + + if (isset($tax_object)) { + if (array_key_exists($invoice_item->tax_id, $taxes)) { + $taxes[$invoice_item->tax_id]['amount'] += $invoice_item->tax; + } else { + $taxes[$invoice_item->tax_id] = [ + 'name' => $tax_object->name, + 'amount' => $invoice_item->tax + ]; + } + } + + $tax_total += $invoice_item->tax; + $sub_total += $invoice_item->price * $invoice_item->quantity; + } + + $invoice->amount = $sub_total + $tax_total; + + $invoice->update(); + + // Added invoice total sub total + $invoice_sub_total = [ + 'company_id' => $company->id, + 'invoice_id' => $invoice->id, + 'code' => 'sub_total', + 'name' => 'invoices.sub_total', + 'amount' => $sub_total, + 'sort_order' => 1, + ]; + + InvoiceTotal::create($invoice_sub_total); + + $sort_order = 2; + + // Added invoice total taxes + if ($taxes) { + foreach ($taxes as $tax) { + $invoice_tax_total = [ + 'company_id' => $company->id, + 'invoice_id' => $invoice->id, + 'code' => 'tax', + 'name' => $tax['name'], + 'amount' => $tax['amount'], + 'sort_order' => $sort_order, + ]; + + InvoiceTotal::create($invoice_tax_total); + + $sort_order++; + } + } + + // Added invoice total total + $invoice_total = [ + 'company_id' => $company->id, + 'invoice_id' => $invoice->id, + 'code' => 'total', + 'name' => 'invoices.total', + 'amount' => $sub_total + $tax_total, + 'sort_order' => $sort_order, + ]; + + InvoiceTotal::create($invoice_total); + } + } + + Model::reguard(); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('invoice_totals'); + } +} diff --git a/database/migrations/2017_11_16_000000_create_failed_jobs_table.php b/database/migrations/2017_11_16_000000_create_failed_jobs_table.php new file mode 100755 index 0000000..b11a926 --- /dev/null +++ b/database/migrations/2017_11_16_000000_create_failed_jobs_table.php @@ -0,0 +1,34 @@ +bigIncrements('id'); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('failed_jobs'); + } +} diff --git a/database/migrations/2017_12_09_000000_add_currency_columns.php b/database/migrations/2017_12_09_000000_add_currency_columns.php new file mode 100755 index 0000000..1d6aeef --- /dev/null +++ b/database/migrations/2017_12_09_000000_add_currency_columns.php @@ -0,0 +1,40 @@ +string('precision')->nullable(); + $table->string('symbol')->nullable(); + $table->integer('symbol_first')->default(1); + $table->string('decimal_mark')->nullable(); + $table->string('thousands_separator')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('currencies', function ($table) { + $table->dropColumn([ + 'precision', + 'symbol', + 'symbol_first', + 'decimal_mark', + 'thousands_separator', + ]); + }); + } +} diff --git a/database/migrations/2017_12_30_000000_create_mediable_tables.php b/database/migrations/2017_12_30_000000_create_mediable_tables.php new file mode 100755 index 0000000..ec7ed0c --- /dev/null +++ b/database/migrations/2017_12_30_000000_create_mediable_tables.php @@ -0,0 +1,58 @@ +increments('id'); + $table->string('disk', 32); + $table->string('directory', 68); + $table->string('filename', 121); + $table->string('extension', 28); + $table->string('mime_type', 128); + $table->string('aggregate_type', 32); + $table->integer('size')->unsigned(); + $table->timestamps(); + $table->softDeletes(); + + $table->index(['disk', 'directory']); + $table->unique(['disk', 'directory', 'filename', 'extension']); + $table->index('aggregate_type'); + }); + + Schema::create('mediables', function (Blueprint $table) { + $table->integer('media_id')->unsigned(); + $table->string('mediable_type', 152); + $table->integer('mediable_id')->unsigned(); + $table->string('tag', 68); + $table->integer('order')->unsigned(); + + $table->primary(['media_id', 'mediable_type', 'mediable_id', 'tag']); + $table->index(['mediable_id', 'mediable_type']); + $table->index('tag'); + $table->index('order'); + $table->foreign('media_id')->references('id')->on('media')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('mediables'); + Schema::drop('media'); + } +} diff --git a/database/migrations/2018_01_03_000000_drop_attachment_column_bill_payments_table.php b/database/migrations/2018_01_03_000000_drop_attachment_column_bill_payments_table.php new file mode 100755 index 0000000..b756524 --- /dev/null +++ b/database/migrations/2018_01_03_000000_drop_attachment_column_bill_payments_table.php @@ -0,0 +1,32 @@ +dropColumn('attachment'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('bill_payments', function (Blueprint $table) { + $table->string('attachment')->nullable(); + }); + } +} diff --git a/database/migrations/2018_01_03_000000_drop_attachment_column_bills_table.php b/database/migrations/2018_01_03_000000_drop_attachment_column_bills_table.php new file mode 100755 index 0000000..d62157b --- /dev/null +++ b/database/migrations/2018_01_03_000000_drop_attachment_column_bills_table.php @@ -0,0 +1,32 @@ +dropColumn('attachment'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('bills', function (Blueprint $table) { + $table->string('attachment')->nullable(); + }); + } +} diff --git a/database/migrations/2018_01_03_000000_drop_attachment_column_invoice_payments_table.php b/database/migrations/2018_01_03_000000_drop_attachment_column_invoice_payments_table.php new file mode 100755 index 0000000..87ac83f --- /dev/null +++ b/database/migrations/2018_01_03_000000_drop_attachment_column_invoice_payments_table.php @@ -0,0 +1,32 @@ +dropColumn('attachment'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('invoice_payments', function (Blueprint $table) { + $table->string('attachment')->nullable(); + }); + } +} diff --git a/database/migrations/2018_01_03_000000_drop_attachment_column_invoices_table.php b/database/migrations/2018_01_03_000000_drop_attachment_column_invoices_table.php new file mode 100755 index 0000000..be24b7b --- /dev/null +++ b/database/migrations/2018_01_03_000000_drop_attachment_column_invoices_table.php @@ -0,0 +1,32 @@ +dropColumn('attachment'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('invoices', function (Blueprint $table) { + $table->string('attachment')->nullable(); + }); + } +} diff --git a/database/migrations/2018_01_03_000000_drop_attachment_column_payments_table.php b/database/migrations/2018_01_03_000000_drop_attachment_column_payments_table.php new file mode 100755 index 0000000..1cc7fb1 --- /dev/null +++ b/database/migrations/2018_01_03_000000_drop_attachment_column_payments_table.php @@ -0,0 +1,32 @@ +dropColumn('attachment'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('payments', function (Blueprint $table) { + $table->string('attachment')->nullable(); + }); + } +} diff --git a/database/migrations/2018_01_03_000000_drop_attachment_column_revenues_table.php b/database/migrations/2018_01_03_000000_drop_attachment_column_revenues_table.php new file mode 100755 index 0000000..fc890fb --- /dev/null +++ b/database/migrations/2018_01_03_000000_drop_attachment_column_revenues_table.php @@ -0,0 +1,32 @@ +dropColumn('attachment'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('revenues', function (Blueprint $table) { + $table->string('attachment')->nullable(); + }); + } +} diff --git a/database/migrations/2018_01_03_000000_drop_picture_column_items_table.php b/database/migrations/2018_01_03_000000_drop_picture_column_items_table.php new file mode 100755 index 0000000..5afe831 --- /dev/null +++ b/database/migrations/2018_01_03_000000_drop_picture_column_items_table.php @@ -0,0 +1,32 @@ +dropColumn('picture'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('items', function (Blueprint $table) { + $table->string('picture')->nullable(); + }); + } +} diff --git a/database/migrations/2018_01_03_000000_drop_picture_column_users_table.php b/database/migrations/2018_01_03_000000_drop_picture_column_users_table.php new file mode 100755 index 0000000..ed91f68 --- /dev/null +++ b/database/migrations/2018_01_03_000000_drop_picture_column_users_table.php @@ -0,0 +1,32 @@ +dropColumn('picture'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->string('picture')->nullable(); + }); + } +} diff --git a/database/migrations/2018_04_23_000000_add_category_column_invoices_bills.php b/database/migrations/2018_04_23_000000_add_category_column_invoices_bills.php new file mode 100755 index 0000000..c23ed4c --- /dev/null +++ b/database/migrations/2018_04_23_000000_add_category_column_invoices_bills.php @@ -0,0 +1,38 @@ +integer('category_id')->default(); + }); + + Schema::table('bills', function ($table) { + $table->integer('category_id')->default(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('invoices', function ($table) { + $table->dropColumn('category_id'); + }); + + Schema::table('bills', function ($table) { + $table->dropColumn('category_id'); + }); + } +} diff --git a/database/migrations/2018_04_26_000000_create_recurring_table.php b/database/migrations/2018_04_26_000000_create_recurring_table.php new file mode 100755 index 0000000..0057ca0 --- /dev/null +++ b/database/migrations/2018_04_26_000000_create_recurring_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->integer('company_id'); + $table->morphs('recurable'); + $table->string('frequency'); + $table->integer('interval')->default(1); + $table->date('started_at'); + $table->integer('count')->default(0); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('recurring'); + } +} diff --git a/database/migrations/2018_04_30_000000_add_parent_column.php b/database/migrations/2018_04_30_000000_add_parent_column.php new file mode 100755 index 0000000..89ba277 --- /dev/null +++ b/database/migrations/2018_04_30_000000_add_parent_column.php @@ -0,0 +1,54 @@ +integer('parent_id')->default(0); + }); + + Schema::table('revenues', function ($table) { + $table->integer('parent_id')->default(0); + }); + + Schema::table('bills', function ($table) { + $table->integer('parent_id')->default(0); + }); + + Schema::table('payments', function ($table) { + $table->integer('parent_id')->default(0); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('invoices', function ($table) { + $table->dropColumn('parent_id'); + }); + + Schema::table('revenues', function ($table) { + $table->dropColumn('parent_id'); + }); + + Schema::table('bills', function ($table) { + $table->dropColumn('parent_id'); + }); + + Schema::table('payments', function ($table) { + $table->dropColumn('parent_id'); + }); + } +} diff --git a/database/migrations/2018_06_23_000000_modify_email_column.php b/database/migrations/2018_06_23_000000_modify_email_column.php new file mode 100755 index 0000000..7fefdb8 --- /dev/null +++ b/database/migrations/2018_06_23_000000_modify_email_column.php @@ -0,0 +1,41 @@ +string('email')->nullable()->change(); + }); + + Schema::table('invoices', function (Blueprint $table) { + $table->string('customer_email')->nullable()->change(); + }); + + Schema::table('vendors', function (Blueprint $table) { + $table->string('email')->nullable()->change(); + }); + + Schema::table('bills', function (Blueprint $table) { + $table->string('vendor_email')->nullable()->change(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/database/migrations/2018_06_30_000000_modify_enabled_column.php b/database/migrations/2018_06_30_000000_modify_enabled_column.php new file mode 100755 index 0000000..aaf5fb8 --- /dev/null +++ b/database/migrations/2018_06_30_000000_modify_enabled_column.php @@ -0,0 +1,49 @@ +boolean('enabled')->default(1)->change(); + }); + + Schema::table('categories', function (Blueprint $table) { + $table->boolean('enabled')->default(1)->change(); + }); + + Schema::table('currencies', function (Blueprint $table) { + $table->boolean('enabled')->default(1)->change(); + }); + + Schema::table('items', function (Blueprint $table) { + $table->boolean('enabled')->default(1)->change(); + }); + + Schema::table('customers', function (Blueprint $table) { + $table->boolean('enabled')->default(1)->change(); + }); + + Schema::table('vendors', function (Blueprint $table) { + $table->boolean('enabled')->default(1)->change(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/database/migrations/2018_07_07_000000_modify_date_column.php b/database/migrations/2018_07_07_000000_modify_date_column.php new file mode 100755 index 0000000..0e0125a --- /dev/null +++ b/database/migrations/2018_07_07_000000_modify_date_column.php @@ -0,0 +1,55 @@ +dateTime('billed_at')->change(); + $table->dateTime('due_at')->change(); + }); + + Schema::table('bill_payments', function (Blueprint $table) { + $table->dateTime('paid_at')->change(); + }); + + Schema::table('invoices', function (Blueprint $table) { + $table->dateTime('invoiced_at')->change(); + $table->dateTime('due_at')->change(); + }); + + Schema::table('invoice_payments', function (Blueprint $table) { + $table->dateTime('paid_at')->change(); + }); + + Schema::table('payments', function (Blueprint $table) { + $table->dateTime('paid_at')->change(); + }); + + Schema::table('revenues', function (Blueprint $table) { + $table->dateTime('paid_at')->change(); + }); + + Schema::table('recurring', function (Blueprint $table) { + $table->dateTime('started_at')->change(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/database/migrations/2020_01_01_000000_add_locale_column.php b/database/migrations/2020_01_01_000000_add_locale_column.php new file mode 100755 index 0000000..9573162 --- /dev/null +++ b/database/migrations/2020_01_01_000000_add_locale_column.php @@ -0,0 +1,30 @@ +string('locale')->default(config('app.locale')); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function ($table) { + $table->dropColumn('locale'); + }); + } +} diff --git a/database/seeds/Accounts.php b/database/seeds/Accounts.php new file mode 100755 index 0000000..235145e --- /dev/null +++ b/database/seeds/Accounts.php @@ -0,0 +1,47 @@ +create(); + + Model::reguard(); + } + + private function create() + { + $company_id = $this->command->argument('company'); + + $rows = [ + [ + 'company_id' => $company_id, + 'name' => trans('demo.accounts_cash'), + 'number' => '1', + 'currency_code' => 'USD', + 'bank_name' => trans('demo.accounts_cash'), + 'enabled' => '1', + ], + ]; + + foreach ($rows as $row) { + $account = Account::create($row); + + Setting::set('general.default_account', $account->id); + } + } +} diff --git a/database/seeds/BillStatuses.php b/database/seeds/BillStatuses.php new file mode 100755 index 0000000..b52dfe4 --- /dev/null +++ b/database/seeds/BillStatuses.php @@ -0,0 +1,56 @@ +create(); + + Model::reguard(); + } + + private function create() + { + $company_id = $this->command->argument('company'); + + $rows = [ + [ + 'company_id' => $company_id, + 'name' => trans('bills.status.draft'), + 'code' => 'draft', + ], + [ + 'company_id' => $company_id, + 'name' => trans('bills.status.received'), + 'code' => 'received', + ], + [ + 'company_id' => $company_id, + 'name' => trans('bills.status.partial'), + 'code' => 'partial', + ], + [ + 'company_id' => $company_id, + 'name' => trans('bills.status.paid'), + 'code' => 'paid', + ], + ]; + + foreach ($rows as $row) { + BillStatus::create($row); + } + } +} diff --git a/database/seeds/Categories.php b/database/seeds/Categories.php new file mode 100755 index 0000000..3a2afc1 --- /dev/null +++ b/database/seeds/Categories.php @@ -0,0 +1,71 @@ +create(); + + Model::reguard(); + } + + private function create() + { + $company_id = $this->command->argument('company'); + + $rows = [ + [ + 'company_id' => $company_id, + 'name' => trans_choice('general.transfers', 1), + 'type' => 'other', + 'color' => '#605ca8', + 'enabled' => '1' + ], + [ + 'company_id' => $company_id, + 'name' => trans('demo.categories_deposit'), + 'type' => 'income', + 'color' => '#f39c12', + 'enabled' => '1' + ], + [ + 'company_id' => $company_id, + 'name' => trans('demo.categories_sales'), + 'type' => 'income', + 'color' => '#6da252', + 'enabled' => '1' + ], + [ + 'company_id' => $company_id, + 'name' => trans_choice('general.others', 1), + 'type' => 'expense', + 'color' => '#d2d6de', + 'enabled' => '1' + ], + [ + 'company_id' => $company_id, + 'name' => trans('general.general'), + 'type' => 'item', + 'color' => '#00c0ef', + 'enabled' => '1' + ], + ]; + + foreach ($rows as $row) { + Category::create($row); + } + } +} diff --git a/database/seeds/CompanySeeder.php b/database/seeds/CompanySeeder.php new file mode 100755 index 0000000..bbcf49a --- /dev/null +++ b/database/seeds/CompanySeeder.php @@ -0,0 +1,23 @@ +call(Database\Seeds\Accounts::class); + $this->call(Database\Seeds\BillStatuses::class); + $this->call(Database\Seeds\Categories::class); + $this->call(Database\Seeds\Currencies::class); + $this->call(Database\Seeds\InvoiceStatuses::class); + $this->call(Database\Seeds\Modules::class); + $this->call(Database\Seeds\Settings::class); + $this->call(Database\Seeds\Taxes::class); + } +} diff --git a/database/seeds/Currencies.php b/database/seeds/Currencies.php new file mode 100755 index 0000000..ec4457f --- /dev/null +++ b/database/seeds/Currencies.php @@ -0,0 +1,81 @@ +create(); + + Model::reguard(); + } + + private function create() + { + $company_id = $this->command->argument('company'); + + $rows = [ + [ + 'company_id' => $company_id, + 'name' => trans('demo.currencies_usd'), + 'code' => 'USD', + 'rate' => '1.00', + 'enabled' => '1', + 'precision' => config('money.USD.precision'), + 'symbol' => config('money.USD.symbol'), + 'symbol_first' => config('money.USD.symbol_first'), + 'decimal_mark' => config('money.USD.decimal_mark'), + 'thousands_separator' => config('money.USD.thousands_separator'), + ], + [ + 'company_id' => $company_id, + 'name' => trans('demo.currencies_eur'), + 'code' => 'EUR', + 'rate' => '1.25', + 'precision' => config('money.EUR.precision'), + 'symbol' => config('money.EUR.symbol'), + 'symbol_first' => config('money.EUR.symbol_first'), + 'decimal_mark' => config('money.EUR.decimal_mark'), + 'thousands_separator' => config('money.EUR.thousands_separator'), + ], + [ + 'company_id' => $company_id, + 'name' => trans('demo.currencies_gbp'), + 'code' => 'GBP', + 'rate' => '1.60', + 'precision' => config('money.GBP.precision'), + 'symbol' => config('money.GBP.symbol'), + 'symbol_first' => config('money.GBP.symbol_first'), + 'decimal_mark' => config('money.GBP.decimal_mark'), + 'thousands_separator' => config('money.GBP.thousands_separator'), + ], + [ + 'company_id' => $company_id, + 'name' => trans('demo.currencies_try'), + 'code' => 'TRY', + 'rate' => '0.80', + 'precision' => config('money.TRY.precision'), + 'symbol' => config('money.TRY.symbol'), + 'symbol_first' => config('money.TRY.symbol_first'), + 'decimal_mark' => config('money.TRY.decimal_mark'), + 'thousands_separator' => config('money.TRY.thousands_separator'), + ], + ]; + + foreach ($rows as $row) { + Currency::create($row); + } + } +} diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php new file mode 100755 index 0000000..0b788d2 --- /dev/null +++ b/database/seeds/DatabaseSeeder.php @@ -0,0 +1,16 @@ +create(); + + Model::reguard(); + } + + private function create() + { + $company_id = $this->command->argument('company'); + + $rows = [ + [ + 'company_id' => $company_id, + 'name' => trans('invoices.status.draft'), + 'code' => 'draft', + ], + [ + 'company_id' => $company_id, + 'name' => trans('invoices.status.sent'), + 'code' => 'sent', + ], + [ + 'company_id' => $company_id, + 'name' => trans('invoices.status.viewed'), + 'code' => 'viewed', + ], + [ + 'company_id' => $company_id, + 'name' => trans('invoices.status.approved'), + 'code' => 'approved', + ], + [ + 'company_id' => $company_id, + 'name' => trans('invoices.status.partial'), + 'code' => 'partial', + ], + [ + 'company_id' => $company_id, + 'name' => trans('invoices.status.paid'), + 'code' => 'paid', + ], + ]; + + foreach ($rows as $row) { + InvoiceStatus::create($row); + } + } +} diff --git a/database/seeds/Modules.php b/database/seeds/Modules.php new file mode 100755 index 0000000..141be88 --- /dev/null +++ b/database/seeds/Modules.php @@ -0,0 +1,32 @@ +create(); + + Model::reguard(); + } + + private function create() + { + $company_id = $this->command->argument('company'); + + Artisan::call('module:install', ['alias' => 'offlinepayment', 'company_id' => $company_id]); + Artisan::call('module:install', ['alias' => 'paypalstandard', 'company_id' => $company_id]); + } +} diff --git a/database/seeds/Roles.php b/database/seeds/Roles.php new file mode 100755 index 0000000..b6d1b93 --- /dev/null +++ b/database/seeds/Roles.php @@ -0,0 +1,159 @@ +create($this->roles(), $this->map()); + + Model::reguard(); + } + + private function roles() + { + $rows = [ + 'admin' => [ + 'admin-panel' => 'r', + 'api' => 'r', + 'auth-users' => 'c,r,u,d', + 'auth-roles' => 'c,r,u,d', + 'auth-permissions' => 'c,r,u,d', + 'auth-profile' => 'r,u', + 'common-companies' => 'c,r,u,d', + 'common-import' => 'c', + 'common-items' => 'c,r,u,d', + 'common-uploads' => 'd', + 'incomes-invoices' => 'c,r,u,d', + 'incomes-revenues' => 'c,r,u,d', + 'incomes-customers' => 'c,r,u,d', + 'expenses-bills' => 'c,r,u,d', + 'expenses-payments' => 'c,r,u,d', + 'expenses-vendors' => 'c,r,u,d', + 'banking-accounts' => 'c,r,u,d', + 'banking-transfers' => 'c,r,u,d', + 'banking-transactions' => 'r', + 'settings-categories' => 'c,r,u,d', + 'settings-settings' => 'r,u', + 'settings-taxes' => 'c,r,u,d', + 'settings-currencies' => 'c,r,u,d', + 'settings-modules' => 'r,u', + 'modules-home' => 'r', + 'modules-tiles' => 'r', + 'modules-item' => 'c,r,u,d', + 'modules-token' => 'c,u', + 'modules-my' => 'r', + 'install-updates' => 'r,u', + 'notifications' => 'r,u', + 'reports-income-summary' => 'r', + 'reports-expense-summary' => 'r', + 'reports-income-expense-summary' => 'r', + 'reports-profit-loss' => 'r', + 'reports-tax-summary' => 'r', + ], + 'manager' => [ + 'admin-panel' => 'r', + 'auth-profile' => 'r,u', + 'common-companies' => 'c,r,u,d', + 'common-import' => 'c', + 'common-items' => 'c,r,u,d', + 'incomes-invoices' => 'c,r,u,d', + 'incomes-revenues' => 'c,r,u,d', + 'incomes-customers' => 'c,r,u,d', + 'expenses-bills' => 'c,r,u,d', + 'expenses-payments' => 'c,r,u,d', + 'expenses-vendors' => 'c,r,u,d', + 'banking-accounts' => 'c,r,u,d', + 'banking-transfers' => 'c,r,u,d', + 'banking-transactions' => 'r', + 'settings-settings' => 'r,u', + 'settings-categories' => 'c,r,u,d', + 'settings-taxes' => 'c,r,u,d', + 'settings-currencies' => 'c,r,u,d', + 'settings-modules' => 'r,u', + 'install-updates' => 'r,u', + 'notifications' => 'r,u', + 'reports-income-summary' => 'r', + 'reports-expense-summary' => 'r', + 'reports-income-expense-summary' => 'r', + 'reports-profit-loss' => 'r', + 'reports-tax-summary' => 'r', + ], + 'customer' => [ + 'customer-panel' => 'r', + 'customers-invoices' => 'r,u', + 'customers-payments' => 'r,u', + 'customers-transactions' => 'r', + 'customers-profile' => 'r,u', + ], + ]; + + return $rows; + } + + private function map() + { + $rows = [ + 'c' => 'create', + 'r' => 'read', + 'u' => 'update', + 'd' => 'delete' + ]; + + return $rows; + } + + private function create($roles, $map) + { + $mapPermission = collect($map); + + foreach ($roles as $key => $modules) { + // Create a new role + $role = Role::create([ + 'name' => $key, + 'display_name' => ucwords(str_replace("_", " ", $key)), + 'description' => ucwords(str_replace("_", " ", $key)) + ]); + + $this->command->info('Creating Role '. strtoupper($key)); + + // Reading role permission modules + foreach ($modules as $module => $value) { + $permissions = explode(',', $value); + + foreach ($permissions as $p => $perm) { + $permissionValue = $mapPermission->get($perm); + + $moduleName = ucwords(str_replace("-", " ", $module)); + + $permission = Permission::firstOrCreate([ + 'name' => $permissionValue . '-' . $module, + 'display_name' => ucfirst($permissionValue) . ' ' . $moduleName, + 'description' => ucfirst($permissionValue) . ' ' . $moduleName, + ]); + + $this->command->info('Creating Permission to '.$permissionValue.' for '. $moduleName); + + if (!$role->hasPermission($permission->name)) { + $role->attachPermission($permission); + } else { + $this->command->info($key . ': ' . $p . ' ' . $permissionValue . ' already exist'); + } + } + } + } + } +} diff --git a/database/seeds/Settings.php b/database/seeds/Settings.php new file mode 100755 index 0000000..5c27b93 --- /dev/null +++ b/database/seeds/Settings.php @@ -0,0 +1,55 @@ +create(); + + Model::reguard(); + } + + private function create() + { + $company_id = $this->command->argument('company'); + + Setting::set([ + 'general.date_format' => 'd M Y', + 'general.date_separator' => 'space', + 'general.timezone' => 'Europe/London', + 'general.percent_position' => 'after', + 'general.invoice_number_prefix' => 'INV-', + 'general.invoice_number_digit' => '5', + 'general.invoice_number_next' => '1', + 'general.default_payment_method' => 'offlinepayment.cash.1', + 'general.email_protocol' => 'mail', + 'general.email_sendmail_path' => '/usr/sbin/sendmail -bs', + 'general.send_invoice_reminder' => '0', + 'general.schedule_invoice_days' => '1,3,5,10', + 'general.send_bill_reminder' => '0', + 'general.schedule_bill_days' => '10,5,3,1', + 'general.schedule_time' => '09:00', + 'general.admin_theme' => 'skin-green-light', + 'general.list_limit' => '25', + 'general.use_gravatar' => '0', + 'general.session_handler' => 'file', + 'general.session_lifetime' => '30', + 'general.file_size' => '2', + 'general.file_types' => 'pdf,jpeg,jpg,png', + 'offlinepayment.methods' => '[{"code":"offlinepayment.cash.1","name":"Cash","order":"1","description":null},{"code":"offlinepayment.bank_transfer.2","name":"Bank Transfer","order":"2","description":null}]', + ]); + } +} diff --git a/database/seeds/Taxes.php b/database/seeds/Taxes.php new file mode 100755 index 0000000..20b8dda --- /dev/null +++ b/database/seeds/Taxes.php @@ -0,0 +1,55 @@ +create(); + + Model::reguard(); + } + + private function create() + { + $company_id = $this->command->argument('company'); + + $rows = [ + [ + 'company_id' => $company_id, + 'name' => trans('demo.taxes_exempt'), + 'rate' => '0', + 'enabled' => '1' + ], + [ + 'company_id' => $company_id, + 'name' => trans('demo.taxes_normal'), + 'rate' => '5', + 'enabled' => '1' + ], + [ + 'company_id' => $company_id, + 'name' => trans('demo.taxes_sales'), + 'rate' => '15', + 'enabled' => '1' + ], + ]; + + foreach ($rows as $row) { + Tax::create($row); + } + } +} diff --git a/database/seeds/TestCompany.php b/database/seeds/TestCompany.php new file mode 100755 index 0000000..88061a5 --- /dev/null +++ b/database/seeds/TestCompany.php @@ -0,0 +1,75 @@ +call(Roles::class); + + $this->createCompany(); + + $this->createUser(); + + Model::reguard(); + } + + private function createCompany() + { + $rows = [ + [ + 'id' => '1', + 'domain' => 'test.com', + ], + ]; + + foreach ($rows as $row) { + Company::create($row); + } + + Setting::setExtraColumns(['company_id' => '1']); + Setting::set('general.company_name', 'Test Inc.'); + Setting::set('general.company_email', 'info@test.com'); + Setting::set('general.company_address', 'New Street 1254'); + Setting::set('general.default_currency', 'USD'); + Setting::set('general.default_account', '1'); + Setting::set('general.default_payment_method', 'offlinepayment.cash.1'); + Setting::save(); + + $this->command->info('Test company created.'); + } + + public function createUser() + { + // Create user + $user = User::create([ + 'name' => 'Admin', + 'email' => 'admin@akaunting.com', + 'password' => '123456', + 'last_logged_in_at' => Date::now(), + ]); + + // Attach Role + $user->roles()->attach(1); + + // Attach company + $user->companies()->attach(1); + + $this->command->info('Admin user created.'); + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100755 index 0000000..1b3850a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,21 @@ +version: '3' +services: + mysql: + image: mysql:5 + ports: + - 3306:3306 + environment: + MYSQL_ROOT_PASSWORD: akaunting_root_password + MYSQL_DATABASE: akaunting_db + MYSQL_USER: akaunting_admin + MYSQL_PASSWORD: akaunting_password + web: + image: akaunting + volumes: + - ./:/var/www/html + ports: + - 8080:80 + environment: + APP_DEBUG: "true" + links: + - mysql diff --git a/index.php b/index.php new file mode 100755 index 0000000..8dc66a5 --- /dev/null +++ b/index.php @@ -0,0 +1,32 @@ +make(Illuminate\Contracts\Http\Kernel::class); + +$response = $kernel->handle( + $request = Illuminate\Http\Request::capture() +); + +$response->send(); + +$kernel->terminate($request, $response); diff --git a/modules/OfflinePayment/Assets/.gitkeep b/modules/OfflinePayment/Assets/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/OfflinePayment/Assets/.gitkeep diff --git a/modules/OfflinePayment/Config/.gitkeep b/modules/OfflinePayment/Config/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/OfflinePayment/Config/.gitkeep diff --git a/modules/OfflinePayment/Config/config.php b/modules/OfflinePayment/Config/config.php new file mode 100755 index 0000000..f580eb5 --- /dev/null +++ b/modules/OfflinePayment/Config/config.php @@ -0,0 +1,7 @@ + 'OfflinePayment', + +]; diff --git a/modules/OfflinePayment/Console/.gitkeep b/modules/OfflinePayment/Console/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/OfflinePayment/Console/.gitkeep diff --git a/modules/OfflinePayment/Database/Migrations/.gitkeep b/modules/OfflinePayment/Database/Migrations/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/OfflinePayment/Database/Migrations/.gitkeep diff --git a/modules/OfflinePayment/Database/Migrations/2017_09_19_delete_offline_file.php b/modules/OfflinePayment/Database/Migrations/2017_09_19_delete_offline_file.php new file mode 100755 index 0000000..0afa77a --- /dev/null +++ b/modules/OfflinePayment/Database/Migrations/2017_09_19_delete_offline_file.php @@ -0,0 +1,64 @@ +get('version'), '1.0.0') == 0) { + $offline_payments = json_decode(setting('offline.payment.methods'), true); + + if (!empty($offline_payments)) { + $offlinepayment = array(); + + foreach ($offline_payments as $offline_payment) { + $code = explode('.', $offline_payment['code']); + + $offline_payment['code'] = $code[1]; + + $offlinepayment[] = array( + 'code' => 'offlinepayment.' . $code[1] . '.' . $code[2], + 'name' => $offline_payment['name'], + 'customer' => 0, + 'order' => $offline_payment['order'], + 'description' => $offline_payment['description'] + ); + } + + //$company_id = $this->command->argument('company'); + + // Set the active company settings + setting()->setExtraColumns(['company_id' => 1]); + + setting()->set('offlinepayment.methods', json_encode($offlinepayment)); + + setting()->forget('offline.payment.methods'); + + setting()->save(); + } + + $module->delete(); + + Artisan::call('cache:clear'); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} \ No newline at end of file diff --git a/modules/OfflinePayment/Database/Seeders/.gitkeep b/modules/OfflinePayment/Database/Seeders/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/OfflinePayment/Database/Seeders/.gitkeep diff --git a/modules/OfflinePayment/Database/Seeders/OfflinePaymentDatabaseSeeder.php b/modules/OfflinePayment/Database/Seeders/OfflinePaymentDatabaseSeeder.php new file mode 100755 index 0000000..8cd0986 --- /dev/null +++ b/modules/OfflinePayment/Database/Seeders/OfflinePaymentDatabaseSeeder.php @@ -0,0 +1,47 @@ +create(); + + Model::reguard(); + } + + private function create() + { + $methods = array(); + + $methods[] = array( + 'code' => 'offlinepayment.cash.1', + 'name' => 'Cash', + 'customer' => '0', + 'order' => '1', + 'description' => null, + ); + + $methods[] = array( + 'code' => 'offlinepayment.bank_transfer.2', + 'name' => 'Bank Transfer', + 'customer' => '0', + 'order' => '2', + 'description' => null, + ); + + Setting::set('offlinepayment.methods', json_encode($methods)); + } +} diff --git a/modules/OfflinePayment/Entities/.gitkeep b/modules/OfflinePayment/Entities/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/OfflinePayment/Entities/.gitkeep diff --git a/modules/OfflinePayment/Events/.gitkeep b/modules/OfflinePayment/Events/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/OfflinePayment/Events/.gitkeep diff --git a/modules/OfflinePayment/Events/Handlers/.gitkeep b/modules/OfflinePayment/Events/Handlers/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/OfflinePayment/Events/Handlers/.gitkeep diff --git a/modules/OfflinePayment/Events/Handlers/OfflinePaymentAdminMenu.php b/modules/OfflinePayment/Events/Handlers/OfflinePaymentAdminMenu.php new file mode 100755 index 0000000..3ad2fb3 --- /dev/null +++ b/modules/OfflinePayment/Events/Handlers/OfflinePaymentAdminMenu.php @@ -0,0 +1,28 @@ +can(['read-settings-settings', 'read-settings-categories', 'read-settings-currencies', 'read-settings-taxes'])) { + // Add child to existing item + $item = $event->menu->whereTitle(trans_choice('general.settings', 2)); + + $item->url('apps/offlinepayment/settings', trans('offlinepayment::offlinepayment.offlinepayment'), 4, ['icon' => 'fa fa-angle-double-right']); + } + } +} diff --git a/modules/OfflinePayment/Events/Handlers/OfflinePaymentGateway.php b/modules/OfflinePayment/Events/Handlers/OfflinePaymentGateway.php new file mode 100755 index 0000000..eaf12a1 --- /dev/null +++ b/modules/OfflinePayment/Events/Handlers/OfflinePaymentGateway.php @@ -0,0 +1,19 @@ +render(); + + return response()->json([ + 'code' => $gateway['code'], + 'name' => $gateway['name'], + 'description' => $gateway['description'], + 'redirect' => false, + 'html' => $html, + ]); + } +} diff --git a/modules/OfflinePayment/Http/Controllers/Settings.php b/modules/OfflinePayment/Http/Controllers/Settings.php new file mode 100755 index 0000000..b0b14e1 --- /dev/null +++ b/modules/OfflinePayment/Http/Controllers/Settings.php @@ -0,0 +1,144 @@ + $method) { + if ($method['code'] != $request['method']) { + continue; + } + + $method = explode('.', $request['method']); + + $methods[$key]['code'] = 'offlinepayment.' . $request['code'] . '.' . $method[2]; + $methods[$key]['name'] = $request['name']; + $methods[$key]['customer'] = $request['customer']; + $methods[$key]['order'] = $request['order']; + $methods[$key]['description'] = $request['description']; + } + } else { + $methods[] = array( + 'code' => 'offlinepayment.' . $request['code'] . '.' . (count($methods) + 1), + 'name' => $request['name'], + 'customer' => $request['customer'], + 'order' => $request['order'], + 'description' => $request['description'] + ); + } + + // Set Api Token + setting()->set('offlinepayment.methods', json_encode($methods)); + + setting()->save(); + + Artisan::call('cache:clear'); + + return redirect('apps/offlinepayment/settings'); + } + + /** + * Remove the specified resource from storage. + * + * @param GRequest $request + * + * @return Response + */ + public function get(GRequest $request) + { + $data = []; + + $code = $request['code']; + + $methods = json_decode(setting('offlinepayment.methods'), true); + + foreach ($methods as $key => $method) { + if ($method['code'] != $code) { + continue; + } + + $method['title'] = trans('offlinepayment::offlinepayment.edit', ['method' => $method['name']]); + $method['method'] = $code; + + $code = explode('.', $method['code']); + + $method['code'] = $code[1]; + + $data = $method; + + break; + } + + return response()->json([ + 'errors' => false, + 'success' => true, + 'data' => $data + ]); + } + + /** + * Remove the specified resource from storage. + * + * @param DRequest $request + * + * @return Response + */ + public function delete(DRequest $request) + { + $code = $request['code']; + + $methods = json_decode(setting('offlinepayment.methods'), true); + + foreach ($methods as $key => $method) { + if ($method['code'] != $code) { + continue; + } + + unset($methods[$key]); + } + + // Set Api Token + setting()->set('offlinepayment.methods', json_encode($methods)); + + setting()->save(); + + Artisan::call('cache:clear'); + + return response()->json([ + 'errors' => false, + 'success' => true, + ]); + } +} diff --git a/modules/OfflinePayment/Http/Middleware/.gitkeep b/modules/OfflinePayment/Http/Middleware/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/OfflinePayment/Http/Middleware/.gitkeep diff --git a/modules/OfflinePayment/Http/Requests/.gitkeep b/modules/OfflinePayment/Http/Requests/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/OfflinePayment/Http/Requests/.gitkeep diff --git a/modules/OfflinePayment/Http/Requests/Setting.php b/modules/OfflinePayment/Http/Requests/Setting.php new file mode 100755 index 0000000..3d184b2 --- /dev/null +++ b/modules/OfflinePayment/Http/Requests/Setting.php @@ -0,0 +1,31 @@ + 'required|string', + 'code' => 'required|string', + ]; + } +} diff --git a/modules/OfflinePayment/Http/Requests/SettingDelete.php b/modules/OfflinePayment/Http/Requests/SettingDelete.php new file mode 100755 index 0000000..48fb6ba --- /dev/null +++ b/modules/OfflinePayment/Http/Requests/SettingDelete.php @@ -0,0 +1,30 @@ + 'required|string', + ]; + } +} diff --git a/modules/OfflinePayment/Http/Requests/SettingGet.php b/modules/OfflinePayment/Http/Requests/SettingGet.php new file mode 100755 index 0000000..ac48313 --- /dev/null +++ b/modules/OfflinePayment/Http/Requests/SettingGet.php @@ -0,0 +1,30 @@ + 'required|string', + ]; + } +} diff --git a/modules/OfflinePayment/Http/Requests/Show.php b/modules/OfflinePayment/Http/Requests/Show.php new file mode 100755 index 0000000..bfe6ffc --- /dev/null +++ b/modules/OfflinePayment/Http/Requests/Show.php @@ -0,0 +1,30 @@ + 'required|string', + ]; + } +} diff --git a/modules/OfflinePayment/Http/routes.php b/modules/OfflinePayment/Http/routes.php new file mode 100755 index 0000000..553a940 --- /dev/null +++ b/modules/OfflinePayment/Http/routes.php @@ -0,0 +1,12 @@ + ['web', 'auth', 'language', 'adminmenu', 'permission:read-admin-panel'], 'prefix' => 'apps/offlinepayment', 'namespace' => 'Modules\OfflinePayment\Http\Controllers'], function () { + Route::get('settings', 'Settings@edit'); + Route::post('settings', 'Settings@update'); + Route::post('settings/get', 'Settings@get'); + Route::post('settings/delete', 'Settings@delete'); +}); + +Route::group(['middleware' => ['web', 'auth', 'language', 'customermenu', 'permission:read-customer-panel'], 'prefix' => 'customers', 'namespace' => 'Modules\OfflinePayment\Http\Controllers'], function () { + Route::get('invoices/{invoice}/offlinepayment', 'OfflinePayment@show'); +}); diff --git a/modules/OfflinePayment/Jobs/.gitkeep b/modules/OfflinePayment/Jobs/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/OfflinePayment/Jobs/.gitkeep diff --git a/modules/OfflinePayment/Mail/.gitkeep b/modules/OfflinePayment/Mail/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/OfflinePayment/Mail/.gitkeep diff --git a/modules/OfflinePayment/Providers/.gitkeep b/modules/OfflinePayment/Providers/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/OfflinePayment/Providers/.gitkeep diff --git a/modules/OfflinePayment/Providers/OfflinePaymentServiceProvider.php b/modules/OfflinePayment/Providers/OfflinePaymentServiceProvider.php new file mode 100755 index 0000000..9ebaac9 --- /dev/null +++ b/modules/OfflinePayment/Providers/OfflinePaymentServiceProvider.php @@ -0,0 +1,122 @@ +registerTranslations(); + $this->registerConfig(); + $this->registerViews(); + $this->registerFactories(); + + $this->loadMigrationsFrom(__DIR__ . '/../Database/Migrations'); + + $this->app['events']->listen(AdminMenuCreated::class, OfflinePaymentAdminMenu::class); + $this->app['events']->listen(PaymentGatewayListing::class, OfflinePaymentGateway::class); + } + + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + // + } + + /** + * Register config. + * + * @return void + */ + protected function registerConfig() + { + $this->publishes([ + __DIR__.'/../Config/config.php' => config_path('offlinepayment.php'), + ], 'config'); + $this->mergeConfigFrom( + __DIR__.'/../Config/config.php', 'offlinepayment' + ); + } + + /** + * Register views. + * + * @return void + */ + public function registerViews() + { + $viewPath = resource_path('views/modules/offlinepayment'); + + $sourcePath = __DIR__.'/../Resources/views'; + + $this->publishes([ + $sourcePath => $viewPath + ]); + + $this->loadViewsFrom(array_merge(array_map(function ($path) { + return $path . '/modules/offlinepayment'; + }, \Config::get('view.paths')), [$sourcePath]), 'offlinepayment'); + } + + /** + * Register translations. + * + * @return void + */ + public function registerTranslations() + { + $langPath = resource_path('lang/modules/offlinepayment'); + + if (is_dir($langPath)) { + $this->loadTranslationsFrom($langPath, 'offlinepayment'); + } else { + $this->loadTranslationsFrom(__DIR__ .'/../Resources/lang', 'offlinepayment'); + } + } + + /** + * Register an additional directory of factories. + * @source https://github.com/sebastiaanluca/laravel-resource-flow/blob/develop/src/Modules/ModuleServiceProvider.php#L66 + */ + public function registerFactories() + { + if (! app()->environment('production')) { + app(Factory::class)->load(__DIR__ . '/Database/factories'); + } + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() + { + return []; + } +} diff --git a/modules/OfflinePayment/Repositories/.gitkeep b/modules/OfflinePayment/Repositories/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/OfflinePayment/Repositories/.gitkeep diff --git a/modules/OfflinePayment/Resources/lang/.gitkeep b/modules/OfflinePayment/Resources/lang/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/OfflinePayment/Resources/lang/.gitkeep diff --git a/modules/OfflinePayment/Resources/lang/en-GB/offlinepayment.php b/modules/OfflinePayment/Resources/lang/en-GB/offlinepayment.php new file mode 100755 index 0000000..541a5c5 --- /dev/null +++ b/modules/OfflinePayment/Resources/lang/en-GB/offlinepayment.php @@ -0,0 +1,16 @@ + 'Offline Payments', + 'add_new' => 'Add New', + 'edit' => 'Edit: :method', + 'code' => 'Code', + 'customer' => 'Show to Customer', + 'order' => 'Order', + 'payment_gateways' => 'Offline Payment Methods', + + 'confirm' => 'Confirm', + 'loading' => 'Loading', + +]; diff --git a/modules/OfflinePayment/Resources/views/.gitkeep b/modules/OfflinePayment/Resources/views/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/OfflinePayment/Resources/views/.gitkeep diff --git a/modules/OfflinePayment/Resources/views/confirm.blade.php b/modules/OfflinePayment/Resources/views/confirm.blade.php new file mode 100755 index 0000000..7ab1f30 --- /dev/null +++ b/modules/OfflinePayment/Resources/views/confirm.blade.php @@ -0,0 +1,7 @@ +

{{ $gateway['name'] }}

+ +@if ($gateway['description']) +
+ {{ $gateway['description'] }} +
+@endif \ No newline at end of file diff --git a/modules/OfflinePayment/Resources/views/edit.blade.php b/modules/OfflinePayment/Resources/views/edit.blade.php new file mode 100755 index 0000000..c7dfd9b --- /dev/null +++ b/modules/OfflinePayment/Resources/views/edit.blade.php @@ -0,0 +1,183 @@ +@extends('layouts.admin') + +@section('title', trans('offlinepayment::offlinepayment.offlinepayment')) + +@section('content') +
+
+
+
+

{{ trans('offlinepayment::offlinepayment.add_new') }}

+ +
+ + + {!! Form::open(['url' => 'apps/offlinepayment/settings', 'files' => true, 'role' => 'form']) !!} + +
+
+ + {{ Form::textGroup('name', trans('general.name'), 'id-card-o', ['required' => 'required'], null, 'col-md-12') }} + + {{ Form::textGroup('code', trans('offlinepayment::offlinepayment.code'), 'key', ['required' => 'required'], null, 'col-md-12') }} + + {{ Form::radioGroup('customer', trans('offlinepayment::offlinepayment.customer'), '', ['required' => 'required'], 0, 'col-md-12') }} + + {{ Form::textGroup('order', trans('offlinepayment::offlinepayment.order'), 'sort', [], null, 'col-md-12') }} + + {{ Form::textareaGroup('description', trans('general.description')) }} +
+ + + + + + {!! Form::close() !!} +
+ +
+
+ +
+
+

{{ trans('offlinepayment::offlinepayment.payment_gateways') }}

+ +
+ +
+
+ + + + + + + + + + + @if($items) + @foreach($items as $item) + + + + + + + @endforeach + @else + + @endif + +
{{ trans('general.name') }}{{ trans('offlinepayment::offlinepayment.code') }}{{ trans('offlinepayment::offlinepayment.order') }}{{ trans('general.actions') }}
{{ $item->name }}{{ $item->code }}{{ $item->order }} + + +
+
+
+ +
+ +
+
+@endsection + +@push('stylesheet') + +@endpush + +@push('scripts') + +@endpush diff --git a/modules/OfflinePayment/Resources/views/show.blade.php b/modules/OfflinePayment/Resources/views/show.blade.php new file mode 100755 index 0000000..07a691b --- /dev/null +++ b/modules/OfflinePayment/Resources/views/show.blade.php @@ -0,0 +1,39 @@ +

{{ $gateway['name'] }}

+ +@if ($gateway['description']) +
+ {{ $gateway['description'] }} +
+@endif +
+
+ +
+
+ diff --git a/modules/OfflinePayment/Tests/.gitkeep b/modules/OfflinePayment/Tests/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/OfflinePayment/Tests/.gitkeep diff --git a/modules/OfflinePayment/composer.json b/modules/OfflinePayment/composer.json new file mode 100755 index 0000000..1ad3967 --- /dev/null +++ b/modules/OfflinePayment/composer.json @@ -0,0 +1,15 @@ +{ + "name": "akaunting/offlinepayment", + "description": "", + "authors": [ + { + "name": "Akaunting", + "email": "info@akaunting.com" + } + ], + "autoload": { + "psr-4": { + "Modules\\OfflinePayment\\": "" + } + } +} diff --git a/modules/OfflinePayment/module.json b/modules/OfflinePayment/module.json new file mode 100755 index 0000000..d28b9c3 --- /dev/null +++ b/modules/OfflinePayment/module.json @@ -0,0 +1,19 @@ +{ + "name": "OfflinePayment", + "alias": "offlinepayment", + "description": "", + "version": "1.0.0", + "category": "payment-gateways", + "keywords": [], + "active": 1, + "order": 0, + "providers": [ + "Modules\\OfflinePayment\\Providers\\OfflinePaymentServiceProvider" + ], + "aliases": {}, + "files": [ + "start.php" + ], + "requires": [], + "settings": [] +} diff --git a/modules/OfflinePayment/start.php b/modules/OfflinePayment/start.php new file mode 100755 index 0000000..140a105 --- /dev/null +++ b/modules/OfflinePayment/start.php @@ -0,0 +1,17 @@ +routesAreCached()) { + require __DIR__ . '/Http/routes.php'; +} diff --git a/modules/PaypalStandard/Assets/.gitkeep b/modules/PaypalStandard/Assets/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/PaypalStandard/Assets/.gitkeep diff --git a/modules/PaypalStandard/Config/.gitkeep b/modules/PaypalStandard/Config/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/PaypalStandard/Config/.gitkeep diff --git a/modules/PaypalStandard/Config/config.php b/modules/PaypalStandard/Config/config.php new file mode 100755 index 0000000..cdec48c --- /dev/null +++ b/modules/PaypalStandard/Config/config.php @@ -0,0 +1,7 @@ + 'PaypalStandard', + +]; diff --git a/modules/PaypalStandard/Console/.gitkeep b/modules/PaypalStandard/Console/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/PaypalStandard/Console/.gitkeep diff --git a/modules/PaypalStandard/Database/Migrations/.gitkeep b/modules/PaypalStandard/Database/Migrations/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/PaypalStandard/Database/Migrations/.gitkeep diff --git a/modules/PaypalStandard/Database/Seeders/.gitkeep b/modules/PaypalStandard/Database/Seeders/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/PaypalStandard/Database/Seeders/.gitkeep diff --git a/modules/PaypalStandard/Database/Seeders/PaypalStandardDatabaseSeeder.php b/modules/PaypalStandard/Database/Seeders/PaypalStandardDatabaseSeeder.php new file mode 100755 index 0000000..258e3d6 --- /dev/null +++ b/modules/PaypalStandard/Database/Seeders/PaypalStandardDatabaseSeeder.php @@ -0,0 +1,21 @@ +call("OthersTableSeeder"); + } +} diff --git a/modules/PaypalStandard/Entities/.gitkeep b/modules/PaypalStandard/Entities/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/PaypalStandard/Entities/.gitkeep diff --git a/modules/PaypalStandard/Events/.gitkeep b/modules/PaypalStandard/Events/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/PaypalStandard/Events/.gitkeep diff --git a/modules/PaypalStandard/Events/Handlers/.gitkeep b/modules/PaypalStandard/Events/Handlers/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/PaypalStandard/Events/Handlers/.gitkeep diff --git a/modules/PaypalStandard/Events/Handlers/PaypalStandardGateway.php b/modules/PaypalStandard/Events/Handlers/PaypalStandardGateway.php new file mode 100755 index 0000000..e6001a9 --- /dev/null +++ b/modules/PaypalStandard/Events/Handlers/PaypalStandardGateway.php @@ -0,0 +1,23 @@ +customer_name); + + $last_name = array_pop($customer); + $first_name = implode(" ", $customer); + + $invoice->first_name = $first_name; + $invoice->last_name = $last_name; + + $gateway['language'] = \App::getLocale(); + + $html = view('paypalstandard::show', compact('gateway', 'invoice'))->render(); + + return response()->json([ + 'code' => 'paypalstandard', + 'name' => $gateway['name'], + 'description' => trans('paypalstandard::paypalstandard.description'), + 'redirect' => false, + 'html' => $html, + ]); + } + + public function result(Invoice $invoice, Request $request) + { + $success = true; + + switch ($request['payment_status']) { + case 'Completed': + $message = trans('messages.success.added', ['type' => trans_choice('general.customers', 1)]); + break; + case 'Canceled_Reversal': + case 'Denied': + case 'Expired': + case 'Failed': + case 'Pending': + case 'Processed': + case 'Refunded': + case 'Reversed': + case 'Voided': + $message = trans('messages.error.added', ['type' => trans_choice('general.customers', 1)]); + $success = false; + break; + } + + if ($success) { + flash($message)->success(); + } else { + flash($message)->warning(); + } + + $redirect = url('customers/invoices/' . $invoice->id); + + return redirect($redirect); + } + + public function callback(Invoice $invoice, Request $request) + { + $gateway = setting('paypalstandard'); + + $paypal_log = new Logger('Paypal'); + + $paypal_log->pushHandler(new StreamHandler(storage_path('logs/paypal.log')), Logger::INFO); + + if ($invoice) { + $url = 'https://ipnpb.paypal.com/cgi-bin/webscr'; + + if ($gateway['mode'] == 'sandbox') { + $url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'; + } + + $client = new Client(['verify' => false]); + + $paypal_request['cmd'] = '_notify-validate'; + + foreach ($request->toArray() as $key => $value) { + $paypal_request[$key] = urlencode(html_entity_decode($value, ENT_QUOTES, 'UTF-8')); + } + + $result = $client->post($url, $paypal_request); + + if ($result->getStatusCode() != 200) { + $paypal_log->info('PAYPAL_STANDARD :: CURL failed ', $result->getBody()->getContents()); + } else { + $result = $result->getBody()->getContents(); + } + + if ($gateway['debug']) { + $paypal_log->info('PAYPAL_STANDARD :: IPN REQUEST: ', $request->toArray()); + //$paypal_log->info('PAYPAL_STANDARD :: IPN RESULT: ', $result); + } + + if ((strcmp($result, 'VERIFIED') == 0 || strcmp($result, 'UNVERIFIED') == 0) || true) { + switch ($request['payment_status']) { + case 'Completed': + $receiver_match = (strtolower($request['receiver_email']) == strtolower($gateway['email'])); + + $total_paid_match = ((float)$request['mc_gross'] == $invoice->amount); + + if ($receiver_match && $total_paid_match) { + event(new InvoicePaid($invoice, $request->toArray())); + } + + if (!$receiver_match) { + $paypal_log->info('PAYPAL_STANDARD :: RECEIVER EMAIL MISMATCH! ' . strtolower($request['receiver_email'])); + } + + if (!$total_paid_match) { + $paypal_log->info('PAYPAL_STANDARD :: TOTAL PAID MISMATCH! ' . $request['mc_gross']); + } + break; + case 'Canceled_Reversal': + case 'Denied': + case 'Expired': + case 'Failed': + case 'Pending': + case 'Processed': + case 'Refunded': + case 'Reversed': + case 'Voided': + $paypal_log->info('PAYPAL_STANDARD :: NOT COMPLETED ' . $request->toArray()); + break; + } + } else { + $paypal_log->info('PAYPAL_STANDARD :: VERIFIED != 0 || UNVERIFIED != 0 ' . $request->toArray()); + } + } + } +} diff --git a/modules/PaypalStandard/Http/Middleware/.gitkeep b/modules/PaypalStandard/Http/Middleware/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/PaypalStandard/Http/Middleware/.gitkeep diff --git a/modules/PaypalStandard/Http/Requests/.gitkeep b/modules/PaypalStandard/Http/Requests/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/PaypalStandard/Http/Requests/.gitkeep diff --git a/modules/PaypalStandard/Http/routes.php b/modules/PaypalStandard/Http/routes.php new file mode 100755 index 0000000..e229a74 --- /dev/null +++ b/modules/PaypalStandard/Http/routes.php @@ -0,0 +1,10 @@ + ['web', 'auth', 'language', 'customermenu', 'permission:read-customer-panel'], 'prefix' => 'customers', 'namespace' => 'Modules\PaypalStandard\Http\Controllers'], function () { + Route::get('invoices/{invoice}/paypalstandard', 'PaypalStandard@show'); +}); + +Route::group(['prefix' => 'customers', 'namespace' => 'Modules\PaypalStandard\Http\Controllers'], function () { + Route::post('invoices/{invoice}/paypalstandard/result', 'PaypalStandard@result'); + Route::post('invoices/{invoice}/paypalstandard/callback', 'PaypalStandard@callback'); +}); diff --git a/modules/PaypalStandard/Jobs/.gitkeep b/modules/PaypalStandard/Jobs/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/PaypalStandard/Jobs/.gitkeep diff --git a/modules/PaypalStandard/Mail/.gitkeep b/modules/PaypalStandard/Mail/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/PaypalStandard/Mail/.gitkeep diff --git a/modules/PaypalStandard/Providers/.gitkeep b/modules/PaypalStandard/Providers/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/PaypalStandard/Providers/.gitkeep diff --git a/modules/PaypalStandard/Providers/PaypalStandardServiceProvider.php b/modules/PaypalStandard/Providers/PaypalStandardServiceProvider.php new file mode 100755 index 0000000..6d414e2 --- /dev/null +++ b/modules/PaypalStandard/Providers/PaypalStandardServiceProvider.php @@ -0,0 +1,119 @@ +registerTranslations(); + $this->registerConfig(); + $this->registerViews(); + $this->registerFactories(); + + $this->loadMigrationsFrom(__DIR__ . '/../Database/Migrations'); + + $this->app['events']->listen(PaymentGatewayListing::class, PaypalStandardGateway::class); + } + + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + // + } + + /** + * Register config. + * + * @return void + */ + protected function registerConfig() + { + $this->publishes([ + __DIR__.'/../Config/config.php' => config_path('paypalstandard.php'), + ], 'config'); + + $this->mergeConfigFrom( + __DIR__.'/../Config/config.php', 'paypalstandard' + ); + } + + /** + * Register views. + * + * @return void + */ + public function registerViews() + { + $viewPath = resource_path('views/modules/paypalstandard'); + + $sourcePath = __DIR__.'/../Resources/views'; + + $this->publishes([ + $sourcePath => $viewPath + ]); + + $this->loadViewsFrom(array_merge(array_map(function ($path) { + return $path . '/modules/paypalstandard'; + }, \Config::get('view.paths')), [$sourcePath]), 'paypalstandard'); + } + + /** + * Register translations. + * + * @return void + */ + public function registerTranslations() + { + $langPath = resource_path('lang/modules/paypalstandard'); + + if (is_dir($langPath)) { + $this->loadTranslationsFrom($langPath, 'paypalstandard'); + } else { + $this->loadTranslationsFrom(__DIR__ .'/../Resources/lang', 'paypalstandard'); + } + } + + /** + * Register an additional directory of factories. + * @source https://github.com/sebastiaanluca/laravel-resource-flow/blob/develop/src/Modules/ModuleServiceProvider.php#L66 + */ + public function registerFactories() + { + if (! app()->environment('production')) { + app(Factory::class)->load(__DIR__ . '/Database/factories'); + } + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() + { + return []; + } +} diff --git a/modules/PaypalStandard/Repositories/.gitkeep b/modules/PaypalStandard/Repositories/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/PaypalStandard/Repositories/.gitkeep diff --git a/modules/PaypalStandard/Resources/lang/.gitkeep b/modules/PaypalStandard/Resources/lang/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/PaypalStandard/Resources/lang/.gitkeep diff --git a/modules/PaypalStandard/Resources/lang/en-GB/paypalstandard.php b/modules/PaypalStandard/Resources/lang/en-GB/paypalstandard.php new file mode 100755 index 0000000..5fdb3af --- /dev/null +++ b/modules/PaypalStandard/Resources/lang/en-GB/paypalstandard.php @@ -0,0 +1,17 @@ + 'Paypal Standard', + 'email' => 'Email', + 'mode' => 'Mode', + 'debug' => 'Debug', + 'transaction' => 'Transaction', + 'customer' => 'Show to Customer', + 'order' => 'Order', + + 'test_mode' => 'Warning: The payment gateway is in \'Sandbox Mode\'. Your account will not be charged.', + 'description' => 'Pay with PAYPAL', + 'confirm' => 'Confirm', + +]; diff --git a/modules/PaypalStandard/Resources/views/.gitkeep b/modules/PaypalStandard/Resources/views/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/PaypalStandard/Resources/views/.gitkeep diff --git a/modules/PaypalStandard/Resources/views/show.blade.php b/modules/PaypalStandard/Resources/views/show.blade.php new file mode 100755 index 0000000..b465cdc --- /dev/null +++ b/modules/PaypalStandard/Resources/views/show.blade.php @@ -0,0 +1,48 @@ +

{{ $gateway['name'] }}

+ +@if($gateway['mode'] == 'sandbox') +
{{ trans('paypalstandard::paypalstandard.test_mode') }}
+@endif + +
+ {{ trans('paypalstandard::paypalstandard.description') }} +
+ +
+ + + + + @foreach ($invoice->items as $item) + + @if($item->sku) + + @endif + + + + @endforeach + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
diff --git a/modules/PaypalStandard/Tests/.gitkeep b/modules/PaypalStandard/Tests/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/modules/PaypalStandard/Tests/.gitkeep diff --git a/modules/PaypalStandard/composer.json b/modules/PaypalStandard/composer.json new file mode 100755 index 0000000..bd5fcbb --- /dev/null +++ b/modules/PaypalStandard/composer.json @@ -0,0 +1,15 @@ +{ + "name": "akaunting/paypalstandard", + "description": "", + "authors": [ + { + "name": "Akaunting", + "email": "info@akaunting.com" + } + ], + "autoload": { + "psr-4": { + "Modules\\PaypalStandard\\": "" + } + } +} diff --git a/modules/PaypalStandard/module.json b/modules/PaypalStandard/module.json new file mode 100755 index 0000000..6e20215 --- /dev/null +++ b/modules/PaypalStandard/module.json @@ -0,0 +1,85 @@ +{ + "name": "PaypalStandard", + "alias": "paypalstandard", + "description": "", + "version": "1.0.0", + "category": "payment-gateways", + "keywords": [], + "active": 1, + "order": 0, + "providers": [ + "Modules\\PaypalStandard\\Providers\\PaypalStandardServiceProvider" + ], + "aliases": {}, + "files": [ + "start.php" + ], + "requires": [], + "settings": [ + { + "type": "textGroup", + "name": "name", + "title": "general.name", + "icon": "id-card-o", + "attributes": { + "required": "required" + } + }, + { + "type": "textGroup", + "name": "email", + "title": "paypalstandard::paypalstandard.email", + "icon": "envelope-o", + "attributes": { + "required": "required" + } + }, + { + "type": "selectGroup", + "name": "mode", + "title": "paypalstandard::paypalstandard.mode", + "icon": "plane", + "values": { + "live": "Live", + "sandbox": "Sandbox" + }, + "selected": null, + "attributes": {} + }, + { + "type": "selectGroup", + "name": "transaction", + "title": "paypalstandard::paypalstandard.transaction", + "icon": "exchange", + "values": { + "authorization": "Authorization", + "sale": "Sale" + }, + "selected": null, + "attributes": {} + }, + { + "type": "radioGroup", + "name": "customer", + "title": "paypalstandard::paypalstandard.customer", + "enable": "general.yes", + "disable": "general.no", + "attributes": {} + }, + { + "type": "radioGroup", + "name": "debug", + "title": "paypalstandard::paypalstandard.debug", + "enable": "general.yes", + "disable": "general.no", + "attributes": {} + }, + { + "type": "textGroup", + "name": "order", + "title": "paypalstandard::paypalstandard.order", + "icon": "sort", + "attributes": {} + } + ] +} diff --git a/modules/PaypalStandard/start.php b/modules/PaypalStandard/start.php new file mode 100755 index 0000000..140a105 --- /dev/null +++ b/modules/PaypalStandard/start.php @@ -0,0 +1,17 @@ +routesAreCached()) { + require __DIR__ . '/Http/routes.php'; +} diff --git a/phpunit.xml b/phpunit.xml new file mode 100755 index 0000000..9ee3e73 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,32 @@ + + + + + ./tests/Feature + + + + ./tests/Unit + + + + + ./app + + + + + + + + + + diff --git a/public/css/akaunting-green.css b/public/css/akaunting-green.css new file mode 100755 index 0000000..d5bfbc3 --- /dev/null +++ b/public/css/akaunting-green.css @@ -0,0 +1,98 @@ +.nav-tabs-custom>.nav-tabs>li.active { + border-top-color: #6da252; +} + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #6da252 !important; +} + +.form-control:focus { + border-color: #6da252 !important; +} + +#result-search { + border-color: #6da252; +} + +#profit { + background: #6da252; +} + +.info-box .progress .progress-bar.progress-bar-green, .progress-bar-success { + background-color: #6da252; +} + +/* Bootstrap */ +.btn-success { + background-color: #6da252; + border-color: #629149; +} + +.btn-success.hover, .btn-success:hover { + background-color: #629149; +} + +.btn-success.focus, .btn-success:focus { + background-color: #629149; + border-color: #2b4020; +} + +.btn-success.active, .btn-success:active { + background-color: #6da252; + border-color: #629149; +} + +.btn-success.active.focus, .btn-success.active:focus { + background-color: #4c7139; + border-color: #416131; +} + +.bg-green { + background-color: #6da252 !important; +} + +.alert-success { + background-color: #6da252 !important; + border-color: #629149; +} + +.label-success { + background-color: #6da252 !important; +} + +.box.box-success { + border-top-color: #6da252; +} + +.box.box-solid.box-success>.box-header { + background-color: #6da252; +} + +.box.box-solid.box-success { + border-color: #629149; +} + +.text-green { + color: #6da252; +} + +/* AdminLTE green skin */ +.skin-green-light .main-header .navbar { + background-color: #6da252; +} + +.skin-green-light .main-header .navbar .sidebar-toggle:hover { + background-color: #629149; +} + +.skin-green-light .main-header .logo { + background-color: #6da252; +} + +.skin-green-light .main-header li.user-header { + background-color: #6da252; +} + +.skin-green-light .main-header .logo:hover { + background-color: #629149; +} \ No newline at end of file diff --git a/public/css/app.css b/public/css/app.css new file mode 100755 index 0000000..c846722 --- /dev/null +++ b/public/css/app.css @@ -0,0 +1,679 @@ +.logo-lg { + text-align: left; +} + +.logo-image-mini { + margin: 12px 3px 0 0; +} + +.logo-image-lg { + margin: -5px 5px 0 0; +} + +.input-group-addon { + min-width: 41px; +} + +.new-button { + margin-left: 20px; +} + +.content-center { + margin: 0 auto; + max-width : 1300px; +} + +.form-group { + /*max-width: 450px;*/ +} + +.tab-margin { + margin: 25px 0; +} + +.sort-icon { + opacity: 0.5; +} + +.input-filter { + display: inline; + width: inherit; +} + +.title-filter { + margin-right: 10px; +} + +.btn-filter { + margin-bottom: 1px; +} + +.setting-buttons { + /*padding: 15px 0 0 15px; + border-top: 1px solid #f4f4f4;*/ + float: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + border-top: 1px solid #f4f4f4; + padding: 10px; + background-color: #fff; +} + +#sale { + width: 15px; + height: 15px; + background: #00c0ef; + -moz-border-radius: 15px; + -webkit-border-radius: 15px; + border-radius: 15px; +} + +#cost { + width: 15px; + height: 15px; + background: #F56954; + -moz-border-radius: 15px; + -webkit-border-radius: 15px; + border-radius: 15px; +} + +#profit { + width: 15px; + height: 15px; + background: #2FB628; + -moz-border-radius: 15px; + -webkit-border-radius: 15px; + border-radius: 15px; +} + +div.required .control-label:not(span):after, td.required:after { + content: ' *'; + color: #F00; + font-weight: bold; +} + +.form-group .select2-container { + width: 100% !important; +} + +.form-group .select2-container--default .select2-selection--single { + border-radius: 0px; +} + +.form-group .select2-container .select2-selection--single { + height: 34px; + border: 1px solid #d2d6de; +} + +.form-group .select2-container .select2-selection--single .select2-selection__rendered { + padding-left: 0px; +} + +.form-group .select2-container--default .select2-selection--single .select2-selection__placeholder { + color: inherit; +} + +.form-group .select2-container--default .select2-selection--single .select2-selection__arrow { + height: 30px; +} + +.form-group .select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: #555 transparent transparent transparent; +} + +.info-box .progress .progress-bar { + background: inherit; +} + +.info-box .progress .progress-bar.progress-bar-green, .progress-bar-success { + background-color: #00a65a; +} + +.info-box .progress .progress-bar.progress-bar-red, .progress-bar-danger { + background-color: #dd4b39; +} + +.info-box .progress .progress-bar.progress-bar-aqua, .progress-bar-info { + background-color: #00c0ef; +} + +.box.box-success .table.table-bordered { + font-size: 14px; +} + +.info-box-icon i { + margin-top: 20px; +} + +.box.box-success .chart svg, .chart canvas { + width: 96% !important; + margin-left: 25px; +} + +.daily-footer { + margin-left: 5px; + margin-top: 5px; + padding-top: 10px; + border-top: 1px solid #f4f4f4; +} + +.nav-tabs-custom>.nav-tabs>li.active { + border-top-color: #00a65a; +} + +.input-group .btn-group.radio-inline { + padding-left: inherit; +} + +.input-group input[type=file]:focus, input[type=checkbox]:focus, input[type=radio]:focus { + outline: inherit; + outline-offset: 0px; +} + +.input-group .checkbox input[type=checkbox], .checkbox-inline input[type=checkbox], .radio input[type=radio], .radio-inline input[type=radio] { + margin-left: 0px; +} + +.users-image { + float: left; + width: 25px; + height: 25px; + border-radius: 50%; + margin-right: 10px; + margin-top: -2px; +} + +.setting-form .box-footer .col-sm-12 .form-group { + margin-left: 5px; +} + +/* +.setting-form .box-footer .col-sm-12 .form-group a { + margin-left: 10px; +} +*/ + +.col-sm-12 .nav-tabs-custom .tab-content .tab-pane { + overflow: auto; +} + +.fake-input { + /*width: 370px !important;*/ +} + +.navbar-custom-menu .navbar-nav > li > a > i { + line-height: 20px; +} + +.tasks-menu img { + margin: 1px 0 2px 0; +} + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #00a65a !important; + color : #FFFFFF; +} + +.form-control:focus { + border-color: #00a65a !important; +} + +.box.box-success .invoice, .box.box-success .bill { + border: none; + margin: 0; +} + +.bill { + position: relative; + background: #fff; + padding: 20px; +} + +#loading { + position: absolute; + top: 40%; + left: 40%; +} + +#confirm #loading { + position: inherit; + top: 40%; + left: inherit; +} + +#payment-modal .form-group.col-md-6 .help-block { + color : #F00; +} + +.login-page { + background: url('../img/login.jpg') no-repeat center center fixed; + height: 100%; + width: 100%; + padding: 5% 0; + background-size: cover; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; +} + +.login-logo img { + width: 70px; +} + +.user-panel { + min-height: 50px; +} + +.user-panel .pull-left.info.open { + position: fixed; + z-index: 9999; +} + +.user-panel > .image > img { + height: auto; + max-height: 45px; + width: 100%; +} + +.main-header .add-new.nav.navbar-nav i { + margin-top: 3px; + line-height: 17px; +} + +.navbar-nav > .add-new-menu > .dropdown-menu { + width: 465px; + max-height: 180px; + padding: 0 0 0 0; + margin: 0; + top: 100%; +} + +.navbar-nav > .add-new-menu > .dropdown-menu > .list-inline { + margin-left: 0; +} + +.navbar-nav > .add-new-menu > .dropdown-menu > .list-inline > li { + width: 150px; +} + +.navbar-nav > .add-new-menu > .dropdown-menu > .list-inline > li > .list-unstyled > li .menu { + margin: 0; + padding: 0; + list-style: none; + overflow-x: hidden; +} + +.navbar-nav > .add-new-menu > .dropdown-menu > .list-inline > li > .list-unstyled > li.header { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + background-color: #ffffff; + padding: 7px 10px; + border-bottom: 1px solid #f4f4f4; + color: #444444; + font-size: 14px; +} + +.navbar-nav > .add-new-menu > .dropdown-menu > .list-inline > li > .list-unstyled > li > a { + color: #444444; + overflow: hidden; + text-overflow: ellipsis; + padding: 10px; +} + +.navbar-nav > .add-new-menu > .dropdown-menu > .list-inline > li > .list-unstyled > li .menu > li > a { + display: block; + white-space: nowrap; + border-bottom: 1px solid #f4f4f4; + color: #444444; + overflow: hidden; + text-overflow: ellipsis; + padding: 10px; +} + +.navbar-nav > .add-new-menu > .dropdown-menu > .list-inline > li > .list-unstyled > li .menu > li > a:hover { + background: #f4f4f4; + text-decoration: none; +} + +.navbar-nav > .add-new-menu > .dropdown-menu > .list-inline > li > .list-unstyled > 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 #eeeeee; + color: #444 !important; + text-align: center; +} + +.add-new .add-new-menu .menu { + width: 150px; +} + +.live-search { + padding: 5px; +} + +#result-search { + border-color: #00a65a; +} + +#result-search li a:hover { + color: #FFFFFF; + background-color : #00A65A !important; +} + +#result-search li a:hover .live-search .name { + color: #FFFFFF !important; +} + +.live-search .name { + font-size: 14px; + font-weight: bold; +} + +.live-search .type { + font-size: 12px; +} + +.table.table-responsive tbody tr td { + vertical-align: middle; +} + +.form-group.has-error .fancy-file { + margin-bottom: 15px; +} + +ul.add-new.nav.navbar-nav.pull-left { + margin: 0; +} + +.table { + font-weight: 400; + font-size: inherit; +} + +.no-padding-left { + padding-left: 0; +} + +.no-padding-right { + padding-right: 0; +} + +.invoice-header { + padding-bottom: 9px; + margin: 10px 0 20px 0; + border-bottom: 1px solid #eee; +} + +.invoice-company { + padding-left: 23px; +} + +.invoice-logo { + max-width: 430px; + max-height: 120px; + margin-left: -15px; +} + +.login-box-footer { + text-align: center; + margin-top: 30px; + color: #d8d8d8; +} + +.login-box-footer a { + color: #d8d8d8; +} + +.delete-link:hover, .delete-link:focus { + background-color: #e1e3e9 !important; + color: #333 !important; + text-decoration: none !important; + outline: none !important; +} + +.delete-link { + display: block; + padding: 3px 20px; + clear: both; + font-weight: 400; + line-height: 1.42857143; + color: #777; + white-space: nowrap; + width: 100%; + text-align: left; + /* button to link */ + background-color: transparent !important; + border: none; + cursor: pointer; +} + +.table-responsive { + overflow-x: visible; +} + +.margin-top { + margin-top: 20px; +} + +@media only screen and (max-width : 768px) { + .main-header .add-new.nav.navbar-nav i { + margin-top: 3px; + line-height: 27px; + } + + ul.add-new.nav.navbar-nav.pull-left li { + position: initial; + } + + .navbar-nav .open .dropdown-menu { + position: absolute; + } + + .dropdown.add-new-menu.open .dropdown-menu { + background-color: #ffffff; + } + + .invoice-company { + padding-left: 0; + } +} + +@media only screen and (max-width : 480px) { + .main-header .add-new.nav.navbar-nav i { + margin-top: 3px; + line-height: 27px; + } + + ul.add-new.nav.navbar-nav.pull-left li { + position: initial; + } + + .navbar-nav .open .dropdown-menu { + position: absolute; + } + + .navbar-nav > .add-new-menu > .dropdown-menu > .list-inline > li { + width: 120px; + } + + .dropdown.add-new-menu.open .dropdown-menu { + background-color: #ffffff; + } +} + +@media only screen and (min-width : 768px) { + .amount-space { + padding-right: 30px !important; + } +} + +.text-disabled { + opacity: 0.4; +} + +.print-width { + max-width: 1500px; +} + +/* +.tooltip > .tooltip-inner { + background-color: #6da252; +} + +.tooltip.right .tooltip-arrow { + border-right-color: #6da252 !important; +} + +.content-wrapper { + overflow: inherit; +} + +.main-footer { + bottom: 0; + left: 0; + position: fixed; + right: 0; + z-index: 999; +} +*/ + +.progress-bar-green, .progress-bar-success { + background-color: #6da252; +} + +#chart .row { + margin-top: 10px; +} + +#chart .row .col-md-3 .customer-content .progress { + clear: both; + margin-top: 25px; + margin-bottom: 10px; +} + +span.picture, span.attachment { + margin-left: 10px; + vertical-align: middle; +} + +.form-group.col-md-6 input.fake-input.form-control{ + min-width: 150px; +} + +input[type="number"]::-webkit-outer-spin-button, +input[type="number"]::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} +input[type="number"] { + -moz-appearance: textfield; +} + +.btn-icon { + height: 34px; +} + +.form-small #account_id, .form-small .select2.select2-container { + width: 90% !important; + float: left; +} + +.form-small #currency { + width: 10%; +} + +.input-group-recurring { + padding-left: 0 !important; + padding-right: 0 !important; +} + +.popover-content, .discount.box-body, .discount.box-footer { + padding-left: 0 !important; + padding-right: 0 !important; +} + +.discount-description { + margin-top: 6px; + margin-left: -20px; +} + +.user.user-menu, .user.user-menu a.dropdown-toggle { + min-height: 50px; +} + +.module-installed { + position: absolute; + top: 50%; + margin-top: -5px; + margin-left: 10px; +} + +.invoice, .bill { + border: none !important; +} + +#badge div.label { + margin-top: 15px; + width: 180px; + margin-right: -30px; + position: absolute; + right: 0; + font-size: 14px; + z-index: 99; + -moz-transform: rotate(40deg); + -webkit-transform: rotate(40deg); + -ms-transform: rotate(40deg); + -o-transform: rotate(40deg); + transform: rotate(40deg); + border-radius: 0; +} + +#badge .arrow-up { + position: absolute; + right: 0; + margin-right: 100px; + z-index: 999; + margin-top: -43px; + width: 0; + height: 0; + border-left: 25px solid transparent; + border-right: 25px solid transparent; + border-bottom: 19px solid #ecf0f5; +} + +#badge .arrow-right { + position: absolute; + margin-top: 55px; + z-index: 999; + margin-right: -23px; + right: 0; + width: 0; + height: 0; + border-top: 20px solid transparent; + border-bottom: 20px solid transparent; + border-left: 20px solid #ecf0f5; +} + +@-moz-document url-prefix() { + .show-calendar .calendar-table .table-condensed > tbody > tr > td, + .show-calendar .calendar-table .table-condensed > tbody > tr > th, + .show-calendar .calendar-table .table-condensed > tfoot > tr > td, + .show-calendar .calendar-table .table-condensed > tfoot > tr > th, + .show-calendar .calendar-table .table-condensed > thead > tr > td, + .show-calendar .calendar-table .table-condensed > thead > tr > th { + padding: 0; + } +} + +.pull-right.rating { + margin-top: -30px; +} \ No newline at end of file diff --git a/public/css/bootstrap-fancyfile.css b/public/css/bootstrap-fancyfile.css new file mode 100755 index 0000000..039cdd8 --- /dev/null +++ b/public/css/bootstrap-fancyfile.css @@ -0,0 +1,43 @@ +.fancy-file { + display: block; + position: relative; +} + +.fancy-file input[type="file"] { + position: relative; + text-align: right; + -moz-opacity: 0; + filter: alpha(opacity: 0); + opacity: 0; + z-index: 2; + cursor: pointer; +} + +.fancy-file div { + position: absolute; + top: 0px; + left: 0px; + z-index: 1; + height: 36px; +} + +.fancy-file input[type="text"], +.fancy-file button, +.fancy-file .btn { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; +} + +.fancy-file input[type="text"] { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.fancy-file button, +.fancy-file .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} diff --git a/public/css/bootstrap3-print-fix.css b/public/css/bootstrap3-print-fix.css new file mode 100755 index 0000000..ecc5a59 --- /dev/null +++ b/public/css/bootstrap3-print-fix.css @@ -0,0 +1,193 @@ +@media print { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0%; + } + .visible-xs { + display: none !important; + } + .hidden-xs { + display: block !important; + } + table.hidden-xs { + display: table; + } + tr.hidden-xs { + display: table-row !important; + } + th.hidden-xs, + td.hidden-xs { + display: table-cell !important; + } + .hidden-xs.hidden-print { + display: none !important; + } + .hidden-sm { + display: none !important; + } + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} \ No newline at end of file diff --git a/public/css/daterangepicker.css b/public/css/daterangepicker.css new file mode 100755 index 0000000..86f4b77 --- /dev/null +++ b/public/css/daterangepicker.css @@ -0,0 +1,269 @@ +.daterangepicker { + position: absolute; + color: inherit; + background-color: #fff; + border-radius: 4px; + width: 278px; + padding: 4px; + margin-top: 1px; + top: 100px; + left: 20px; + /* Calendars */ } + .daterangepicker:before, .daterangepicker:after { + position: absolute; + display: inline-block; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; } + .daterangepicker:before { + top: -7px; + border-right: 7px solid transparent; + border-left: 7px solid transparent; + border-bottom: 7px solid #ccc; } + .daterangepicker:after { + top: -6px; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; } + .daterangepicker.opensleft:before { + right: 9px; } + .daterangepicker.opensleft:after { + right: 10px; } + .daterangepicker.openscenter:before { + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; } + .daterangepicker.openscenter:after { + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; } + .daterangepicker.opensright:before { + left: 9px; } + .daterangepicker.opensright:after { + left: 10px; } + .daterangepicker.dropup { + margin-top: -5px; } + .daterangepicker.dropup:before { + top: initial; + bottom: -7px; + border-bottom: initial; + border-top: 7px solid #ccc; } + .daterangepicker.dropup:after { + top: initial; + bottom: -6px; + border-bottom: initial; + border-top: 6px solid #fff; } + .daterangepicker.dropdown-menu { + max-width: none; + z-index: 3001; } + .daterangepicker.single .ranges, .daterangepicker.single .calendar { + float: none; } + .daterangepicker.show-calendar .calendar { + display: block; } + .daterangepicker .calendar { + display: none; + max-width: 270px; + margin: 4px; } + .daterangepicker .calendar.single .calendar-table { + border: none; } + .daterangepicker .calendar th, .daterangepicker .calendar td { + white-space: nowrap; + text-align: center; + min-width: 32px; } + .daterangepicker .calendar-table { + border: 1px solid #fff; + padding: 4px; + border-radius: 4px; + background-color: #fff; } + .daterangepicker table { + width: 100%; + margin: 0; } + .daterangepicker td, .daterangepicker th { + text-align: center; + width: 20px; + height: 20px; + border-radius: 4px; + border: 1px solid transparent; + white-space: nowrap; + cursor: pointer; } + .daterangepicker td.available:hover, .daterangepicker th.available:hover { + background-color: #eee; + border-color: transparent; + color: inherit; } + .daterangepicker td.week, .daterangepicker th.week { + font-size: 80%; + color: #ccc; } + .daterangepicker td.off, .daterangepicker td.off.in-range, .daterangepicker td.off.start-date, .daterangepicker td.off.end-date { + background-color: #fff; + border-color: transparent; + color: #999; } + .daterangepicker td.in-range { + background-color: #ebf4f8; + border-color: transparent; + color: #000; + border-radius: 0; } + .daterangepicker td.start-date { + border-radius: 4px 0 0 4px; } + .daterangepicker td.end-date { + border-radius: 0 4px 4px 0; } + .daterangepicker td.start-date.end-date { + border-radius: 4px; } + .daterangepicker td.active, .daterangepicker td.active:hover { + background-color: #357ebd; + border-color: transparent; + color: #fff; } + .daterangepicker th.month { + width: auto; } + .daterangepicker td.disabled, .daterangepicker option.disabled { + color: #999; + cursor: not-allowed; + text-decoration: line-through; } + .daterangepicker select.monthselect, .daterangepicker select.yearselect { + font-size: 12px; + padding: 1px; + height: auto; + margin: 0; + cursor: default; } + .daterangepicker select.monthselect { + margin-right: 2%; + width: 56%; } + .daterangepicker select.yearselect { + width: 40%; } + .daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect { + width: 50px; + margin-bottom: 0; } + .daterangepicker .input-mini { + border: 1px solid #ccc; + border-radius: 4px; + color: #555; + height: 30px; + line-height: 30px; + display: block; + vertical-align: middle; + margin: 0 0 5px 0; + padding: 0 6px 0 28px; + width: 100%; } + .daterangepicker .input-mini.active { + border: 1px solid #08c; + border-radius: 4px; } + .daterangepicker .daterangepicker_input { + position: relative; } + .daterangepicker .daterangepicker_input i { + position: absolute; + left: 8px; + top: 8px; } + .daterangepicker.rtl .input-mini { + padding-right: 28px; + padding-left: 6px; } + .daterangepicker.rtl .daterangepicker_input i { + left: auto; + right: 8px; } + .daterangepicker .calendar-time { + text-align: center; + margin: 5px auto; + line-height: 30px; + position: relative; + padding-left: 28px; } + .daterangepicker .calendar-time select.disabled { + color: #ccc; + cursor: not-allowed; } + +.ranges { + font-size: 11px; + float: none; + margin: 4px; + text-align: left; } + .ranges ul { + list-style: none; + margin: 0 auto; + padding: 0; + width: 100%; } + .ranges li { + font-size: 13px; + background-color: #f5f5f5; + border: 1px solid #f5f5f5; + border-radius: 4px; + color: #08c; + padding: 3px 12px; + margin-bottom: 8px; + cursor: pointer; } + .ranges li:hover { + background-color: #08c; + border: 1px solid #08c; + color: #fff; } + .ranges li.active { + background-color: #08c; + border: 1px solid #08c; + color: #fff; } + +/* Larger Screen Styling */ +@media (min-width: 564px) { + .daterangepicker { + width: auto; } + .daterangepicker .ranges ul { + width: 160px; } + .daterangepicker.single .ranges ul { + width: 100%; } + .daterangepicker.single .calendar.left { + clear: none; } + .daterangepicker.single.ltr .ranges, .daterangepicker.single.ltr .calendar { + float: left; } + .daterangepicker.single.rtl .ranges, .daterangepicker.single.rtl .calendar { + float: right; } + .daterangepicker.ltr { + direction: ltr; + text-align: left; } + .daterangepicker.ltr .calendar.left { + clear: left; + margin-right: 0; } + .daterangepicker.ltr .calendar.left .calendar-table { + border-right: none; + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .daterangepicker.ltr .calendar.right { + margin-left: 0; } + .daterangepicker.ltr .calendar.right .calendar-table { + border-left: none; + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .daterangepicker.ltr .left .daterangepicker_input { + padding-right: 12px; } + .daterangepicker.ltr .calendar.left .calendar-table { + padding-right: 12px; } + .daterangepicker.ltr .ranges, .daterangepicker.ltr .calendar { + float: left; } + .daterangepicker.rtl { + direction: rtl; + text-align: right; } + .daterangepicker.rtl .calendar.left { + clear: right; + margin-left: 0; } + .daterangepicker.rtl .calendar.left .calendar-table { + border-left: none; + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .daterangepicker.rtl .calendar.right { + margin-right: 0; } + .daterangepicker.rtl .calendar.right .calendar-table { + border-right: none; + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .daterangepicker.rtl .left .daterangepicker_input { + padding-left: 12px; } + .daterangepicker.rtl .calendar.left .calendar-table { + padding-left: 12px; } + .daterangepicker.rtl .ranges, .daterangepicker.rtl .calendar { + text-align: right; + float: right; } } +@media (min-width: 730px) { + .daterangepicker .ranges { + width: auto; } + .daterangepicker.ltr .ranges { + float: left; } + .daterangepicker.rtl .ranges { + float: right; } + .daterangepicker .calendar.left { + clear: none !important; } } diff --git a/public/css/font-awesome.min.css b/public/css/font-awesome.min.css new file mode 100755 index 0000000..b7610d2 --- /dev/null +++ b/public/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} \ No newline at end of file diff --git a/public/css/install.css b/public/css/install.css new file mode 100755 index 0000000..fb0a756 --- /dev/null +++ b/public/css/install.css @@ -0,0 +1,163 @@ +.install-image { + position: fixed; + left: 0; + right: 0; + z-index: 1; + + display: block; + background-image: url('../img/install.jpg'); + background-size: cover; + background-repeat: no-repeat; + background-position: center center; + height: 100%; + width: 100%; + + -webkit-filter: grayscale(50%); + -moz-filter: grayscale(50%); + -o-filter: grayscale(50%); + -ms-filter: grayscale(50%); + filter: grayscale(50%); +} + +.install-content { + position: fixed; + left: 0; + right: 0; + z-index: 9999; + margin: 0 auto; + max-width : 450px; +} + +.install-logo { + text-align: center; +} + +.install-logo img { + margin: 25px auto; + width: 70px; +} + +.install-loading-bar { + font-size: 35px; + position: absolute; + z-index: 500; + top: 45px; + left: 7px; + width: 434px; + background: rgb(136, 136, 136); + opacity: 0.2; + -moz-border-radius-bottomleft: 1px; + -moz-border-radius-bottomright: 1px; + border-bottom-left-radius: 1px; + border-bottom-right-radius: 1px; +} + +.install-loading-spin { + font-size: 100px; + position: absolute; + margin: auto; + color: #fff; + padding: 28% 40%; +} + +.table-responsive { + overflow-x: hidden; +} + +div.required .control-label:not(span):after, td.required:after { + content: ' *'; + color: #F00; + font-weight: bold; +} + +.form-group .select2-container { + width: 100% !important; +} + +.form-group .select2-container--default .select2-selection--single { + border-radius: 0px; +} + +.form-group .select2-container .select2-selection--single { + height: 34px; + border: 1px solid #d2d6de; +} + +.form-group .select2-container .select2-selection--single .select2-selection__rendered { + padding-left: 0px; +} + +.form-group .select2-container--default .select2-selection--single .select2-selection__placeholder { + color: inherit; +} + +.form-group .select2-container--default .select2-selection--single .select2-selection__arrow { + height: 30px; +} + +.form-group .select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: #555 transparent transparent transparent; +} + +.info-box .progress .progress-bar { + background: inherit; +} + +.info-box .progress .progress-bar.progress-bar-green, .progress-bar-success { + background-color: #00a65a; +} + +.info-box .progress .progress-bar.progress-bar-red, .progress-bar-danger { + background-color: #dd4b39; +} + +.info-box .progress .progress-bar.progress-bar-aqua, .progress-bar-info { + background-color: #00c0ef; +} + +.box.box-success .table.table-bordered { + font-size: 14px; +} + +.info-box-icon i { + margin-top: 20px; +} + +.box.box-success .chart svg, .chart canvas { + width: 96% !important; + margin-left: 25px; +} + +.nav-tabs-custom>.nav-tabs>li.active { + border-top-color: #00a65a; +} + +.input-group .btn-group.radio-inline { + padding-left: inherit; +} + +.input-group input[type=file]:focus, input[type=checkbox]:focus, input[type=radio]:focus { + outline: inherit; + outline-offset: 0px; +} + +.input-group .checkbox input[type=checkbox], .checkbox-inline input[type=checkbox], .radio input[type=radio], .radio-inline input[type=radio] { + margin-left: 0px; +} + +.navbar-custom-menu .navbar-nav > li > a > i { + line-height: 20px; +} + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #00a65a !important; +} + +.form-control:focus { + border-color: #00a65a !important; +} + +.box.box-solid.box-success { + border: none; + box-shadow: 0 2px 10px rgba(153, 153, 153, 0.5); +} diff --git a/public/css/ionicons.min.css b/public/css/ionicons.min.css new file mode 100755 index 0000000..049b648 --- /dev/null +++ b/public/css/ionicons.min.css @@ -0,0 +1,11 @@ +@charset "UTF-8";/*! + Ionicons, v2.0.0 + Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ + https://twitter.com/benjsperry https://twitter.com/ionicframework + MIT License: https://github.com/driftyco/ionicons + + Android-style icons originally built by Google’s + Material Design Icons: https://github.com/google/material-design-icons + used under CC BY http://creativecommons.org/licenses/by/4.0/ + Modified icons to fit ionicon’s grid from original. +*/@font-face{font-family:"Ionicons";src:url("../fonts/ionicons.eot?v=2.0.0");src:url("../fonts/ionicons.eot?v=2.0.0#iefix") format("embedded-opentype"),url("../fonts/ionicons.ttf?v=2.0.0") format("truetype"),url("../fonts/ionicons.woff?v=2.0.0") format("woff"),url("../fonts/ionicons.svg?v=2.0.0#Ionicons") format("svg");font-weight:normal;font-style:normal}.ion,.ionicons,.ion-alert:before,.ion-alert-circled:before,.ion-android-add:before,.ion-android-add-circle:before,.ion-android-alarm-clock:before,.ion-android-alert:before,.ion-android-apps:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down:before,.ion-android-arrow-dropdown:before,.ion-android-arrow-dropdown-circle:before,.ion-android-arrow-dropleft:before,.ion-android-arrow-dropleft-circle:before,.ion-android-arrow-dropright:before,.ion-android-arrow-dropright-circle:before,.ion-android-arrow-dropup:before,.ion-android-arrow-dropup-circle:before,.ion-android-arrow-forward:before,.ion-android-arrow-up:before,.ion-android-attach:before,.ion-android-bar:before,.ion-android-bicycle:before,.ion-android-boat:before,.ion-android-bookmark:before,.ion-android-bulb:before,.ion-android-bus:before,.ion-android-calendar:before,.ion-android-call:before,.ion-android-camera:before,.ion-android-cancel:before,.ion-android-car:before,.ion-android-cart:before,.ion-android-chat:before,.ion-android-checkbox:before,.ion-android-checkbox-blank:before,.ion-android-checkbox-outline:before,.ion-android-checkbox-outline-blank:before,.ion-android-checkmark-circle:before,.ion-android-clipboard:before,.ion-android-close:before,.ion-android-cloud:before,.ion-android-cloud-circle:before,.ion-android-cloud-done:before,.ion-android-cloud-outline:before,.ion-android-color-palette:before,.ion-android-compass:before,.ion-android-contact:before,.ion-android-contacts:before,.ion-android-contract:before,.ion-android-create:before,.ion-android-delete:before,.ion-android-desktop:before,.ion-android-document:before,.ion-android-done:before,.ion-android-done-all:before,.ion-android-download:before,.ion-android-drafts:before,.ion-android-exit:before,.ion-android-expand:before,.ion-android-favorite:before,.ion-android-favorite-outline:before,.ion-android-film:before,.ion-android-folder:before,.ion-android-folder-open:before,.ion-android-funnel:before,.ion-android-globe:before,.ion-android-hand:before,.ion-android-hangout:before,.ion-android-happy:before,.ion-android-home:before,.ion-android-image:before,.ion-android-laptop:before,.ion-android-list:before,.ion-android-locate:before,.ion-android-lock:before,.ion-android-mail:before,.ion-android-map:before,.ion-android-menu:before,.ion-android-microphone:before,.ion-android-microphone-off:before,.ion-android-more-horizontal:before,.ion-android-more-vertical:before,.ion-android-navigate:before,.ion-android-notifications:before,.ion-android-notifications-none:before,.ion-android-notifications-off:before,.ion-android-open:before,.ion-android-options:before,.ion-android-people:before,.ion-android-person:before,.ion-android-person-add:before,.ion-android-phone-landscape:before,.ion-android-phone-portrait:before,.ion-android-pin:before,.ion-android-plane:before,.ion-android-playstore:before,.ion-android-print:before,.ion-android-radio-button-off:before,.ion-android-radio-button-on:before,.ion-android-refresh:before,.ion-android-remove:before,.ion-android-remove-circle:before,.ion-android-restaurant:before,.ion-android-sad:before,.ion-android-search:before,.ion-android-send:before,.ion-android-settings:before,.ion-android-share:before,.ion-android-share-alt:before,.ion-android-star:before,.ion-android-star-half:before,.ion-android-star-outline:before,.ion-android-stopwatch:before,.ion-android-subway:before,.ion-android-sunny:before,.ion-android-sync:before,.ion-android-textsms:before,.ion-android-time:before,.ion-android-train:before,.ion-android-unlock:before,.ion-android-upload:before,.ion-android-volume-down:before,.ion-android-volume-mute:before,.ion-android-volume-off:before,.ion-android-volume-up:before,.ion-android-walk:before,.ion-android-warning:before,.ion-android-watch:before,.ion-android-wifi:before,.ion-aperture:before,.ion-archive:before,.ion-arrow-down-a:before,.ion-arrow-down-b:before,.ion-arrow-down-c:before,.ion-arrow-expand:before,.ion-arrow-graph-down-left:before,.ion-arrow-graph-down-right:before,.ion-arrow-graph-up-left:before,.ion-arrow-graph-up-right:before,.ion-arrow-left-a:before,.ion-arrow-left-b:before,.ion-arrow-left-c:before,.ion-arrow-move:before,.ion-arrow-resize:before,.ion-arrow-return-left:before,.ion-arrow-return-right:before,.ion-arrow-right-a:before,.ion-arrow-right-b:before,.ion-arrow-right-c:before,.ion-arrow-shrink:before,.ion-arrow-swap:before,.ion-arrow-up-a:before,.ion-arrow-up-b:before,.ion-arrow-up-c:before,.ion-asterisk:before,.ion-at:before,.ion-backspace:before,.ion-backspace-outline:before,.ion-bag:before,.ion-battery-charging:before,.ion-battery-empty:before,.ion-battery-full:before,.ion-battery-half:before,.ion-battery-low:before,.ion-beaker:before,.ion-beer:before,.ion-bluetooth:before,.ion-bonfire:before,.ion-bookmark:before,.ion-bowtie:before,.ion-briefcase:before,.ion-bug:before,.ion-calculator:before,.ion-calendar:before,.ion-camera:before,.ion-card:before,.ion-cash:before,.ion-chatbox:before,.ion-chatbox-working:before,.ion-chatboxes:before,.ion-chatbubble:before,.ion-chatbubble-working:before,.ion-chatbubbles:before,.ion-checkmark:before,.ion-checkmark-circled:before,.ion-checkmark-round:before,.ion-chevron-down:before,.ion-chevron-left:before,.ion-chevron-right:before,.ion-chevron-up:before,.ion-clipboard:before,.ion-clock:before,.ion-close:before,.ion-close-circled:before,.ion-close-round:before,.ion-closed-captioning:before,.ion-cloud:before,.ion-code:before,.ion-code-download:before,.ion-code-working:before,.ion-coffee:before,.ion-compass:before,.ion-compose:before,.ion-connection-bars:before,.ion-contrast:before,.ion-crop:before,.ion-cube:before,.ion-disc:before,.ion-document:before,.ion-document-text:before,.ion-drag:before,.ion-earth:before,.ion-easel:before,.ion-edit:before,.ion-egg:before,.ion-eject:before,.ion-email:before,.ion-email-unread:before,.ion-erlenmeyer-flask:before,.ion-erlenmeyer-flask-bubbles:before,.ion-eye:before,.ion-eye-disabled:before,.ion-female:before,.ion-filing:before,.ion-film-marker:before,.ion-fireball:before,.ion-flag:before,.ion-flame:before,.ion-flash:before,.ion-flash-off:before,.ion-folder:before,.ion-fork:before,.ion-fork-repo:before,.ion-forward:before,.ion-funnel:before,.ion-gear-a:before,.ion-gear-b:before,.ion-grid:before,.ion-hammer:before,.ion-happy:before,.ion-happy-outline:before,.ion-headphone:before,.ion-heart:before,.ion-heart-broken:before,.ion-help:before,.ion-help-buoy:before,.ion-help-circled:before,.ion-home:before,.ion-icecream:before,.ion-image:before,.ion-images:before,.ion-information:before,.ion-information-circled:before,.ion-ionic:before,.ion-ios-alarm:before,.ion-ios-alarm-outline:before,.ion-ios-albums:before,.ion-ios-albums-outline:before,.ion-ios-americanfootball:before,.ion-ios-americanfootball-outline:before,.ion-ios-analytics:before,.ion-ios-analytics-outline:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-left:before,.ion-ios-arrow-right:before,.ion-ios-arrow-thin-down:before,.ion-ios-arrow-thin-left:before,.ion-ios-arrow-thin-right:before,.ion-ios-arrow-thin-up:before,.ion-ios-arrow-up:before,.ion-ios-at:before,.ion-ios-at-outline:before,.ion-ios-barcode:before,.ion-ios-barcode-outline:before,.ion-ios-baseball:before,.ion-ios-baseball-outline:before,.ion-ios-basketball:before,.ion-ios-basketball-outline:before,.ion-ios-bell:before,.ion-ios-bell-outline:before,.ion-ios-body:before,.ion-ios-body-outline:before,.ion-ios-bolt:before,.ion-ios-bolt-outline:before,.ion-ios-book:before,.ion-ios-book-outline:before,.ion-ios-bookmarks:before,.ion-ios-bookmarks-outline:before,.ion-ios-box:before,.ion-ios-box-outline:before,.ion-ios-briefcase:before,.ion-ios-briefcase-outline:before,.ion-ios-browsers:before,.ion-ios-browsers-outline:before,.ion-ios-calculator:before,.ion-ios-calculator-outline:before,.ion-ios-calendar:before,.ion-ios-calendar-outline:before,.ion-ios-camera:before,.ion-ios-camera-outline:before,.ion-ios-cart:before,.ion-ios-cart-outline:before,.ion-ios-chatboxes:before,.ion-ios-chatboxes-outline:before,.ion-ios-chatbubble:before,.ion-ios-chatbubble-outline:before,.ion-ios-checkmark:before,.ion-ios-checkmark-empty:before,.ion-ios-checkmark-outline:before,.ion-ios-circle-filled:before,.ion-ios-circle-outline:before,.ion-ios-clock:before,.ion-ios-clock-outline:before,.ion-ios-close:before,.ion-ios-close-empty:before,.ion-ios-close-outline:before,.ion-ios-cloud:before,.ion-ios-cloud-download:before,.ion-ios-cloud-download-outline:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloud-upload-outline:before,.ion-ios-cloudy:before,.ion-ios-cloudy-night:before,.ion-ios-cloudy-night-outline:before,.ion-ios-cloudy-outline:before,.ion-ios-cog:before,.ion-ios-cog-outline:before,.ion-ios-color-filter:before,.ion-ios-color-filter-outline:before,.ion-ios-color-wand:before,.ion-ios-color-wand-outline:before,.ion-ios-compose:before,.ion-ios-compose-outline:before,.ion-ios-contact:before,.ion-ios-contact-outline:before,.ion-ios-copy:before,.ion-ios-copy-outline:before,.ion-ios-crop:before,.ion-ios-crop-strong:before,.ion-ios-download:before,.ion-ios-download-outline:before,.ion-ios-drag:before,.ion-ios-email:before,.ion-ios-email-outline:before,.ion-ios-eye:before,.ion-ios-eye-outline:before,.ion-ios-fastforward:before,.ion-ios-fastforward-outline:before,.ion-ios-filing:before,.ion-ios-filing-outline:before,.ion-ios-film:before,.ion-ios-film-outline:before,.ion-ios-flag:before,.ion-ios-flag-outline:before,.ion-ios-flame:before,.ion-ios-flame-outline:before,.ion-ios-flask:before,.ion-ios-flask-outline:before,.ion-ios-flower:before,.ion-ios-flower-outline:before,.ion-ios-folder:before,.ion-ios-folder-outline:before,.ion-ios-football:before,.ion-ios-football-outline:before,.ion-ios-game-controller-a:before,.ion-ios-game-controller-a-outline:before,.ion-ios-game-controller-b:before,.ion-ios-game-controller-b-outline:before,.ion-ios-gear:before,.ion-ios-gear-outline:before,.ion-ios-glasses:before,.ion-ios-glasses-outline:before,.ion-ios-grid-view:before,.ion-ios-grid-view-outline:before,.ion-ios-heart:before,.ion-ios-heart-outline:before,.ion-ios-help:before,.ion-ios-help-empty:before,.ion-ios-help-outline:before,.ion-ios-home:before,.ion-ios-home-outline:before,.ion-ios-infinite:before,.ion-ios-infinite-outline:before,.ion-ios-information:before,.ion-ios-information-empty:before,.ion-ios-information-outline:before,.ion-ios-ionic-outline:before,.ion-ios-keypad:before,.ion-ios-keypad-outline:before,.ion-ios-lightbulb:before,.ion-ios-lightbulb-outline:before,.ion-ios-list:before,.ion-ios-list-outline:before,.ion-ios-location:before,.ion-ios-location-outline:before,.ion-ios-locked:before,.ion-ios-locked-outline:before,.ion-ios-loop:before,.ion-ios-loop-strong:before,.ion-ios-medical:before,.ion-ios-medical-outline:before,.ion-ios-medkit:before,.ion-ios-medkit-outline:before,.ion-ios-mic:before,.ion-ios-mic-off:before,.ion-ios-mic-outline:before,.ion-ios-minus:before,.ion-ios-minus-empty:before,.ion-ios-minus-outline:before,.ion-ios-monitor:before,.ion-ios-monitor-outline:before,.ion-ios-moon:before,.ion-ios-moon-outline:before,.ion-ios-more:before,.ion-ios-more-outline:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate:before,.ion-ios-navigate-outline:before,.ion-ios-nutrition:before,.ion-ios-nutrition-outline:before,.ion-ios-paper:before,.ion-ios-paper-outline:before,.ion-ios-paperplane:before,.ion-ios-paperplane-outline:before,.ion-ios-partlysunny:before,.ion-ios-partlysunny-outline:before,.ion-ios-pause:before,.ion-ios-pause-outline:before,.ion-ios-paw:before,.ion-ios-paw-outline:before,.ion-ios-people:before,.ion-ios-people-outline:before,.ion-ios-person:before,.ion-ios-person-outline:before,.ion-ios-personadd:before,.ion-ios-personadd-outline:before,.ion-ios-photos:before,.ion-ios-photos-outline:before,.ion-ios-pie:before,.ion-ios-pie-outline:before,.ion-ios-pint:before,.ion-ios-pint-outline:before,.ion-ios-play:before,.ion-ios-play-outline:before,.ion-ios-plus:before,.ion-ios-plus-empty:before,.ion-ios-plus-outline:before,.ion-ios-pricetag:before,.ion-ios-pricetag-outline:before,.ion-ios-pricetags:before,.ion-ios-pricetags-outline:before,.ion-ios-printer:before,.ion-ios-printer-outline:before,.ion-ios-pulse:before,.ion-ios-pulse-strong:before,.ion-ios-rainy:before,.ion-ios-rainy-outline:before,.ion-ios-recording:before,.ion-ios-recording-outline:before,.ion-ios-redo:before,.ion-ios-redo-outline:before,.ion-ios-refresh:before,.ion-ios-refresh-empty:before,.ion-ios-refresh-outline:before,.ion-ios-reload:before,.ion-ios-reverse-camera:before,.ion-ios-reverse-camera-outline:before,.ion-ios-rewind:before,.ion-ios-rewind-outline:before,.ion-ios-rose:before,.ion-ios-rose-outline:before,.ion-ios-search:before,.ion-ios-search-strong:before,.ion-ios-settings:before,.ion-ios-settings-strong:before,.ion-ios-shuffle:before,.ion-ios-shuffle-strong:before,.ion-ios-skipbackward:before,.ion-ios-skipbackward-outline:before,.ion-ios-skipforward:before,.ion-ios-skipforward-outline:before,.ion-ios-snowy:before,.ion-ios-speedometer:before,.ion-ios-speedometer-outline:before,.ion-ios-star:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-stopwatch:before,.ion-ios-stopwatch-outline:before,.ion-ios-sunny:before,.ion-ios-sunny-outline:before,.ion-ios-telephone:before,.ion-ios-telephone-outline:before,.ion-ios-tennisball:before,.ion-ios-tennisball-outline:before,.ion-ios-thunderstorm:before,.ion-ios-thunderstorm-outline:before,.ion-ios-time:before,.ion-ios-time-outline:before,.ion-ios-timer:before,.ion-ios-timer-outline:before,.ion-ios-toggle:before,.ion-ios-toggle-outline:before,.ion-ios-trash:before,.ion-ios-trash-outline:before,.ion-ios-undo:before,.ion-ios-undo-outline:before,.ion-ios-unlocked:before,.ion-ios-unlocked-outline:before,.ion-ios-upload:before,.ion-ios-upload-outline:before,.ion-ios-videocam:before,.ion-ios-videocam-outline:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-wineglass:before,.ion-ios-wineglass-outline:before,.ion-ios-world:before,.ion-ios-world-outline:before,.ion-ipad:before,.ion-iphone:before,.ion-ipod:before,.ion-jet:before,.ion-key:before,.ion-knife:before,.ion-laptop:before,.ion-leaf:before,.ion-levels:before,.ion-lightbulb:before,.ion-link:before,.ion-load-a:before,.ion-load-b:before,.ion-load-c:before,.ion-load-d:before,.ion-location:before,.ion-lock-combination:before,.ion-locked:before,.ion-log-in:before,.ion-log-out:before,.ion-loop:before,.ion-magnet:before,.ion-male:before,.ion-man:before,.ion-map:before,.ion-medkit:before,.ion-merge:before,.ion-mic-a:before,.ion-mic-b:before,.ion-mic-c:before,.ion-minus:before,.ion-minus-circled:before,.ion-minus-round:before,.ion-model-s:before,.ion-monitor:before,.ion-more:before,.ion-mouse:before,.ion-music-note:before,.ion-navicon:before,.ion-navicon-round:before,.ion-navigate:before,.ion-network:before,.ion-no-smoking:before,.ion-nuclear:before,.ion-outlet:before,.ion-paintbrush:before,.ion-paintbucket:before,.ion-paper-airplane:before,.ion-paperclip:before,.ion-pause:before,.ion-person:before,.ion-person-add:before,.ion-person-stalker:before,.ion-pie-graph:before,.ion-pin:before,.ion-pinpoint:before,.ion-pizza:before,.ion-plane:before,.ion-planet:before,.ion-play:before,.ion-playstation:before,.ion-plus:before,.ion-plus-circled:before,.ion-plus-round:before,.ion-podium:before,.ion-pound:before,.ion-power:before,.ion-pricetag:before,.ion-pricetags:before,.ion-printer:before,.ion-pull-request:before,.ion-qr-scanner:before,.ion-quote:before,.ion-radio-waves:before,.ion-record:before,.ion-refresh:before,.ion-reply:before,.ion-reply-all:before,.ion-ribbon-a:before,.ion-ribbon-b:before,.ion-sad:before,.ion-sad-outline:before,.ion-scissors:before,.ion-search:before,.ion-settings:before,.ion-share:before,.ion-shuffle:before,.ion-skip-backward:before,.ion-skip-forward:before,.ion-social-android:before,.ion-social-android-outline:before,.ion-social-angular:before,.ion-social-angular-outline:before,.ion-social-apple:before,.ion-social-apple-outline:before,.ion-social-bitcoin:before,.ion-social-bitcoin-outline:before,.ion-social-buffer:before,.ion-social-buffer-outline:before,.ion-social-chrome:before,.ion-social-chrome-outline:before,.ion-social-codepen:before,.ion-social-codepen-outline:before,.ion-social-css3:before,.ion-social-css3-outline:before,.ion-social-designernews:before,.ion-social-designernews-outline:before,.ion-social-dribbble:before,.ion-social-dribbble-outline:before,.ion-social-dropbox:before,.ion-social-dropbox-outline:before,.ion-social-euro:before,.ion-social-euro-outline:before,.ion-social-facebook:before,.ion-social-facebook-outline:before,.ion-social-foursquare:before,.ion-social-foursquare-outline:before,.ion-social-freebsd-devil:before,.ion-social-github:before,.ion-social-github-outline:before,.ion-social-google:before,.ion-social-google-outline:before,.ion-social-googleplus:before,.ion-social-googleplus-outline:before,.ion-social-hackernews:before,.ion-social-hackernews-outline:before,.ion-social-html5:before,.ion-social-html5-outline:before,.ion-social-instagram:before,.ion-social-instagram-outline:before,.ion-social-javascript:before,.ion-social-javascript-outline:before,.ion-social-linkedin:before,.ion-social-linkedin-outline:before,.ion-social-markdown:before,.ion-social-nodejs:before,.ion-social-octocat:before,.ion-social-pinterest:before,.ion-social-pinterest-outline:before,.ion-social-python:before,.ion-social-reddit:before,.ion-social-reddit-outline:before,.ion-social-rss:before,.ion-social-rss-outline:before,.ion-social-sass:before,.ion-social-skype:before,.ion-social-skype-outline:before,.ion-social-snapchat:before,.ion-social-snapchat-outline:before,.ion-social-tumblr:before,.ion-social-tumblr-outline:before,.ion-social-tux:before,.ion-social-twitch:before,.ion-social-twitch-outline:before,.ion-social-twitter:before,.ion-social-twitter-outline:before,.ion-social-usd:before,.ion-social-usd-outline:before,.ion-social-vimeo:before,.ion-social-vimeo-outline:before,.ion-social-whatsapp:before,.ion-social-whatsapp-outline:before,.ion-social-windows:before,.ion-social-windows-outline:before,.ion-social-wordpress:before,.ion-social-wordpress-outline:before,.ion-social-yahoo:before,.ion-social-yahoo-outline:before,.ion-social-yen:before,.ion-social-yen-outline:before,.ion-social-youtube:before,.ion-social-youtube-outline:before,.ion-soup-can:before,.ion-soup-can-outline:before,.ion-speakerphone:before,.ion-speedometer:before,.ion-spoon:before,.ion-star:before,.ion-stats-bars:before,.ion-steam:before,.ion-stop:before,.ion-thermometer:before,.ion-thumbsdown:before,.ion-thumbsup:before,.ion-toggle:before,.ion-toggle-filled:before,.ion-transgender:before,.ion-trash-a:before,.ion-trash-b:before,.ion-trophy:before,.ion-tshirt:before,.ion-tshirt-outline:before,.ion-umbrella:before,.ion-university:before,.ion-unlocked:before,.ion-upload:before,.ion-usb:before,.ion-videocamera:before,.ion-volume-high:before,.ion-volume-low:before,.ion-volume-medium:before,.ion-volume-mute:before,.ion-wand:before,.ion-waterdrop:before,.ion-wifi:before,.ion-wineglass:before,.ion-woman:before,.ion-wrench:before,.ion-xbox:before{display:inline-block;font-family:"Ionicons";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-alert:before{content:"\f101"}.ion-alert-circled:before{content:"\f100"}.ion-android-add:before{content:"\f2c7"}.ion-android-add-circle:before{content:"\f359"}.ion-android-alarm-clock:before{content:"\f35a"}.ion-android-alert:before{content:"\f35b"}.ion-android-apps:before{content:"\f35c"}.ion-android-archive:before{content:"\f2c9"}.ion-android-arrow-back:before{content:"\f2ca"}.ion-android-arrow-down:before{content:"\f35d"}.ion-android-arrow-dropdown:before{content:"\f35f"}.ion-android-arrow-dropdown-circle:before{content:"\f35e"}.ion-android-arrow-dropleft:before{content:"\f361"}.ion-android-arrow-dropleft-circle:before{content:"\f360"}.ion-android-arrow-dropright:before{content:"\f363"}.ion-android-arrow-dropright-circle:before{content:"\f362"}.ion-android-arrow-dropup:before{content:"\f365"}.ion-android-arrow-dropup-circle:before{content:"\f364"}.ion-android-arrow-forward:before{content:"\f30f"}.ion-android-arrow-up:before{content:"\f366"}.ion-android-attach:before{content:"\f367"}.ion-android-bar:before{content:"\f368"}.ion-android-bicycle:before{content:"\f369"}.ion-android-boat:before{content:"\f36a"}.ion-android-bookmark:before{content:"\f36b"}.ion-android-bulb:before{content:"\f36c"}.ion-android-bus:before{content:"\f36d"}.ion-android-calendar:before{content:"\f2d1"}.ion-android-call:before{content:"\f2d2"}.ion-android-camera:before{content:"\f2d3"}.ion-android-cancel:before{content:"\f36e"}.ion-android-car:before{content:"\f36f"}.ion-android-cart:before{content:"\f370"}.ion-android-chat:before{content:"\f2d4"}.ion-android-checkbox:before{content:"\f374"}.ion-android-checkbox-blank:before{content:"\f371"}.ion-android-checkbox-outline:before{content:"\f373"}.ion-android-checkbox-outline-blank:before{content:"\f372"}.ion-android-checkmark-circle:before{content:"\f375"}.ion-android-clipboard:before{content:"\f376"}.ion-android-close:before{content:"\f2d7"}.ion-android-cloud:before{content:"\f37a"}.ion-android-cloud-circle:before{content:"\f377"}.ion-android-cloud-done:before{content:"\f378"}.ion-android-cloud-outline:before{content:"\f379"}.ion-android-color-palette:before{content:"\f37b"}.ion-android-compass:before{content:"\f37c"}.ion-android-contact:before{content:"\f2d8"}.ion-android-contacts:before{content:"\f2d9"}.ion-android-contract:before{content:"\f37d"}.ion-android-create:before{content:"\f37e"}.ion-android-delete:before{content:"\f37f"}.ion-android-desktop:before{content:"\f380"}.ion-android-document:before{content:"\f381"}.ion-android-done:before{content:"\f383"}.ion-android-done-all:before{content:"\f382"}.ion-android-download:before{content:"\f2dd"}.ion-android-drafts:before{content:"\f384"}.ion-android-exit:before{content:"\f385"}.ion-android-expand:before{content:"\f386"}.ion-android-favorite:before{content:"\f388"}.ion-android-favorite-outline:before{content:"\f387"}.ion-android-film:before{content:"\f389"}.ion-android-folder:before{content:"\f2e0"}.ion-android-folder-open:before{content:"\f38a"}.ion-android-funnel:before{content:"\f38b"}.ion-android-globe:before{content:"\f38c"}.ion-android-hand:before{content:"\f2e3"}.ion-android-hangout:before{content:"\f38d"}.ion-android-happy:before{content:"\f38e"}.ion-android-home:before{content:"\f38f"}.ion-android-image:before{content:"\f2e4"}.ion-android-laptop:before{content:"\f390"}.ion-android-list:before{content:"\f391"}.ion-android-locate:before{content:"\f2e9"}.ion-android-lock:before{content:"\f392"}.ion-android-mail:before{content:"\f2eb"}.ion-android-map:before{content:"\f393"}.ion-android-menu:before{content:"\f394"}.ion-android-microphone:before{content:"\f2ec"}.ion-android-microphone-off:before{content:"\f395"}.ion-android-more-horizontal:before{content:"\f396"}.ion-android-more-vertical:before{content:"\f397"}.ion-android-navigate:before{content:"\f398"}.ion-android-notifications:before{content:"\f39b"}.ion-android-notifications-none:before{content:"\f399"}.ion-android-notifications-off:before{content:"\f39a"}.ion-android-open:before{content:"\f39c"}.ion-android-options:before{content:"\f39d"}.ion-android-people:before{content:"\f39e"}.ion-android-person:before{content:"\f3a0"}.ion-android-person-add:before{content:"\f39f"}.ion-android-phone-landscape:before{content:"\f3a1"}.ion-android-phone-portrait:before{content:"\f3a2"}.ion-android-pin:before{content:"\f3a3"}.ion-android-plane:before{content:"\f3a4"}.ion-android-playstore:before{content:"\f2f0"}.ion-android-print:before{content:"\f3a5"}.ion-android-radio-button-off:before{content:"\f3a6"}.ion-android-radio-button-on:before{content:"\f3a7"}.ion-android-refresh:before{content:"\f3a8"}.ion-android-remove:before{content:"\f2f4"}.ion-android-remove-circle:before{content:"\f3a9"}.ion-android-restaurant:before{content:"\f3aa"}.ion-android-sad:before{content:"\f3ab"}.ion-android-search:before{content:"\f2f5"}.ion-android-send:before{content:"\f2f6"}.ion-android-settings:before{content:"\f2f7"}.ion-android-share:before{content:"\f2f8"}.ion-android-share-alt:before{content:"\f3ac"}.ion-android-star:before{content:"\f2fc"}.ion-android-star-half:before{content:"\f3ad"}.ion-android-star-outline:before{content:"\f3ae"}.ion-android-stopwatch:before{content:"\f2fd"}.ion-android-subway:before{content:"\f3af"}.ion-android-sunny:before{content:"\f3b0"}.ion-android-sync:before{content:"\f3b1"}.ion-android-textsms:before{content:"\f3b2"}.ion-android-time:before{content:"\f3b3"}.ion-android-train:before{content:"\f3b4"}.ion-android-unlock:before{content:"\f3b5"}.ion-android-upload:before{content:"\f3b6"}.ion-android-volume-down:before{content:"\f3b7"}.ion-android-volume-mute:before{content:"\f3b8"}.ion-android-volume-off:before{content:"\f3b9"}.ion-android-volume-up:before{content:"\f3ba"}.ion-android-walk:before{content:"\f3bb"}.ion-android-warning:before{content:"\f3bc"}.ion-android-watch:before{content:"\f3bd"}.ion-android-wifi:before{content:"\f305"}.ion-aperture:before{content:"\f313"}.ion-archive:before{content:"\f102"}.ion-arrow-down-a:before{content:"\f103"}.ion-arrow-down-b:before{content:"\f104"}.ion-arrow-down-c:before{content:"\f105"}.ion-arrow-expand:before{content:"\f25e"}.ion-arrow-graph-down-left:before{content:"\f25f"}.ion-arrow-graph-down-right:before{content:"\f260"}.ion-arrow-graph-up-left:before{content:"\f261"}.ion-arrow-graph-up-right:before{content:"\f262"}.ion-arrow-left-a:before{content:"\f106"}.ion-arrow-left-b:before{content:"\f107"}.ion-arrow-left-c:before{content:"\f108"}.ion-arrow-move:before{content:"\f263"}.ion-arrow-resize:before{content:"\f264"}.ion-arrow-return-left:before{content:"\f265"}.ion-arrow-return-right:before{content:"\f266"}.ion-arrow-right-a:before{content:"\f109"}.ion-arrow-right-b:before{content:"\f10a"}.ion-arrow-right-c:before{content:"\f10b"}.ion-arrow-shrink:before{content:"\f267"}.ion-arrow-swap:before{content:"\f268"}.ion-arrow-up-a:before{content:"\f10c"}.ion-arrow-up-b:before{content:"\f10d"}.ion-arrow-up-c:before{content:"\f10e"}.ion-asterisk:before{content:"\f314"}.ion-at:before{content:"\f10f"}.ion-backspace:before{content:"\f3bf"}.ion-backspace-outline:before{content:"\f3be"}.ion-bag:before{content:"\f110"}.ion-battery-charging:before{content:"\f111"}.ion-battery-empty:before{content:"\f112"}.ion-battery-full:before{content:"\f113"}.ion-battery-half:before{content:"\f114"}.ion-battery-low:before{content:"\f115"}.ion-beaker:before{content:"\f269"}.ion-beer:before{content:"\f26a"}.ion-bluetooth:before{content:"\f116"}.ion-bonfire:before{content:"\f315"}.ion-bookmark:before{content:"\f26b"}.ion-bowtie:before{content:"\f3c0"}.ion-briefcase:before{content:"\f26c"}.ion-bug:before{content:"\f2be"}.ion-calculator:before{content:"\f26d"}.ion-calendar:before{content:"\f117"}.ion-camera:before{content:"\f118"}.ion-card:before{content:"\f119"}.ion-cash:before{content:"\f316"}.ion-chatbox:before{content:"\f11b"}.ion-chatbox-working:before{content:"\f11a"}.ion-chatboxes:before{content:"\f11c"}.ion-chatbubble:before{content:"\f11e"}.ion-chatbubble-working:before{content:"\f11d"}.ion-chatbubbles:before{content:"\f11f"}.ion-checkmark:before{content:"\f122"}.ion-checkmark-circled:before{content:"\f120"}.ion-checkmark-round:before{content:"\f121"}.ion-chevron-down:before{content:"\f123"}.ion-chevron-left:before{content:"\f124"}.ion-chevron-right:before{content:"\f125"}.ion-chevron-up:before{content:"\f126"}.ion-clipboard:before{content:"\f127"}.ion-clock:before{content:"\f26e"}.ion-close:before{content:"\f12a"}.ion-close-circled:before{content:"\f128"}.ion-close-round:before{content:"\f129"}.ion-closed-captioning:before{content:"\f317"}.ion-cloud:before{content:"\f12b"}.ion-code:before{content:"\f271"}.ion-code-download:before{content:"\f26f"}.ion-code-working:before{content:"\f270"}.ion-coffee:before{content:"\f272"}.ion-compass:before{content:"\f273"}.ion-compose:before{content:"\f12c"}.ion-connection-bars:before{content:"\f274"}.ion-contrast:before{content:"\f275"}.ion-crop:before{content:"\f3c1"}.ion-cube:before{content:"\f318"}.ion-disc:before{content:"\f12d"}.ion-document:before{content:"\f12f"}.ion-document-text:before{content:"\f12e"}.ion-drag:before{content:"\f130"}.ion-earth:before{content:"\f276"}.ion-easel:before{content:"\f3c2"}.ion-edit:before{content:"\f2bf"}.ion-egg:before{content:"\f277"}.ion-eject:before{content:"\f131"}.ion-email:before{content:"\f132"}.ion-email-unread:before{content:"\f3c3"}.ion-erlenmeyer-flask:before{content:"\f3c5"}.ion-erlenmeyer-flask-bubbles:before{content:"\f3c4"}.ion-eye:before{content:"\f133"}.ion-eye-disabled:before{content:"\f306"}.ion-female:before{content:"\f278"}.ion-filing:before{content:"\f134"}.ion-film-marker:before{content:"\f135"}.ion-fireball:before{content:"\f319"}.ion-flag:before{content:"\f279"}.ion-flame:before{content:"\f31a"}.ion-flash:before{content:"\f137"}.ion-flash-off:before{content:"\f136"}.ion-folder:before{content:"\f139"}.ion-fork:before{content:"\f27a"}.ion-fork-repo:before{content:"\f2c0"}.ion-forward:before{content:"\f13a"}.ion-funnel:before{content:"\f31b"}.ion-gear-a:before{content:"\f13d"}.ion-gear-b:before{content:"\f13e"}.ion-grid:before{content:"\f13f"}.ion-hammer:before{content:"\f27b"}.ion-happy:before{content:"\f31c"}.ion-happy-outline:before{content:"\f3c6"}.ion-headphone:before{content:"\f140"}.ion-heart:before{content:"\f141"}.ion-heart-broken:before{content:"\f31d"}.ion-help:before{content:"\f143"}.ion-help-buoy:before{content:"\f27c"}.ion-help-circled:before{content:"\f142"}.ion-home:before{content:"\f144"}.ion-icecream:before{content:"\f27d"}.ion-image:before{content:"\f147"}.ion-images:before{content:"\f148"}.ion-information:before{content:"\f14a"}.ion-information-circled:before{content:"\f149"}.ion-ionic:before{content:"\f14b"}.ion-ios-alarm:before{content:"\f3c8"}.ion-ios-alarm-outline:before{content:"\f3c7"}.ion-ios-albums:before{content:"\f3ca"}.ion-ios-albums-outline:before{content:"\f3c9"}.ion-ios-americanfootball:before{content:"\f3cc"}.ion-ios-americanfootball-outline:before{content:"\f3cb"}.ion-ios-analytics:before{content:"\f3ce"}.ion-ios-analytics-outline:before{content:"\f3cd"}.ion-ios-arrow-back:before{content:"\f3cf"}.ion-ios-arrow-down:before{content:"\f3d0"}.ion-ios-arrow-forward:before{content:"\f3d1"}.ion-ios-arrow-left:before{content:"\f3d2"}.ion-ios-arrow-right:before{content:"\f3d3"}.ion-ios-arrow-thin-down:before{content:"\f3d4"}.ion-ios-arrow-thin-left:before{content:"\f3d5"}.ion-ios-arrow-thin-right:before{content:"\f3d6"}.ion-ios-arrow-thin-up:before{content:"\f3d7"}.ion-ios-arrow-up:before{content:"\f3d8"}.ion-ios-at:before{content:"\f3da"}.ion-ios-at-outline:before{content:"\f3d9"}.ion-ios-barcode:before{content:"\f3dc"}.ion-ios-barcode-outline:before{content:"\f3db"}.ion-ios-baseball:before{content:"\f3de"}.ion-ios-baseball-outline:before{content:"\f3dd"}.ion-ios-basketball:before{content:"\f3e0"}.ion-ios-basketball-outline:before{content:"\f3df"}.ion-ios-bell:before{content:"\f3e2"}.ion-ios-bell-outline:before{content:"\f3e1"}.ion-ios-body:before{content:"\f3e4"}.ion-ios-body-outline:before{content:"\f3e3"}.ion-ios-bolt:before{content:"\f3e6"}.ion-ios-bolt-outline:before{content:"\f3e5"}.ion-ios-book:before{content:"\f3e8"}.ion-ios-book-outline:before{content:"\f3e7"}.ion-ios-bookmarks:before{content:"\f3ea"}.ion-ios-bookmarks-outline:before{content:"\f3e9"}.ion-ios-box:before{content:"\f3ec"}.ion-ios-box-outline:before{content:"\f3eb"}.ion-ios-briefcase:before{content:"\f3ee"}.ion-ios-briefcase-outline:before{content:"\f3ed"}.ion-ios-browsers:before{content:"\f3f0"}.ion-ios-browsers-outline:before{content:"\f3ef"}.ion-ios-calculator:before{content:"\f3f2"}.ion-ios-calculator-outline:before{content:"\f3f1"}.ion-ios-calendar:before{content:"\f3f4"}.ion-ios-calendar-outline:before{content:"\f3f3"}.ion-ios-camera:before{content:"\f3f6"}.ion-ios-camera-outline:before{content:"\f3f5"}.ion-ios-cart:before{content:"\f3f8"}.ion-ios-cart-outline:before{content:"\f3f7"}.ion-ios-chatboxes:before{content:"\f3fa"}.ion-ios-chatboxes-outline:before{content:"\f3f9"}.ion-ios-chatbubble:before{content:"\f3fc"}.ion-ios-chatbubble-outline:before{content:"\f3fb"}.ion-ios-checkmark:before{content:"\f3ff"}.ion-ios-checkmark-empty:before{content:"\f3fd"}.ion-ios-checkmark-outline:before{content:"\f3fe"}.ion-ios-circle-filled:before{content:"\f400"}.ion-ios-circle-outline:before{content:"\f401"}.ion-ios-clock:before{content:"\f403"}.ion-ios-clock-outline:before{content:"\f402"}.ion-ios-close:before{content:"\f406"}.ion-ios-close-empty:before{content:"\f404"}.ion-ios-close-outline:before{content:"\f405"}.ion-ios-cloud:before{content:"\f40c"}.ion-ios-cloud-download:before{content:"\f408"}.ion-ios-cloud-download-outline:before{content:"\f407"}.ion-ios-cloud-outline:before{content:"\f409"}.ion-ios-cloud-upload:before{content:"\f40b"}.ion-ios-cloud-upload-outline:before{content:"\f40a"}.ion-ios-cloudy:before{content:"\f410"}.ion-ios-cloudy-night:before{content:"\f40e"}.ion-ios-cloudy-night-outline:before{content:"\f40d"}.ion-ios-cloudy-outline:before{content:"\f40f"}.ion-ios-cog:before{content:"\f412"}.ion-ios-cog-outline:before{content:"\f411"}.ion-ios-color-filter:before{content:"\f414"}.ion-ios-color-filter-outline:before{content:"\f413"}.ion-ios-color-wand:before{content:"\f416"}.ion-ios-color-wand-outline:before{content:"\f415"}.ion-ios-compose:before{content:"\f418"}.ion-ios-compose-outline:before{content:"\f417"}.ion-ios-contact:before{content:"\f41a"}.ion-ios-contact-outline:before{content:"\f419"}.ion-ios-copy:before{content:"\f41c"}.ion-ios-copy-outline:before{content:"\f41b"}.ion-ios-crop:before{content:"\f41e"}.ion-ios-crop-strong:before{content:"\f41d"}.ion-ios-download:before{content:"\f420"}.ion-ios-download-outline:before{content:"\f41f"}.ion-ios-drag:before{content:"\f421"}.ion-ios-email:before{content:"\f423"}.ion-ios-email-outline:before{content:"\f422"}.ion-ios-eye:before{content:"\f425"}.ion-ios-eye-outline:before{content:"\f424"}.ion-ios-fastforward:before{content:"\f427"}.ion-ios-fastforward-outline:before{content:"\f426"}.ion-ios-filing:before{content:"\f429"}.ion-ios-filing-outline:before{content:"\f428"}.ion-ios-film:before{content:"\f42b"}.ion-ios-film-outline:before{content:"\f42a"}.ion-ios-flag:before{content:"\f42d"}.ion-ios-flag-outline:before{content:"\f42c"}.ion-ios-flame:before{content:"\f42f"}.ion-ios-flame-outline:before{content:"\f42e"}.ion-ios-flask:before{content:"\f431"}.ion-ios-flask-outline:before{content:"\f430"}.ion-ios-flower:before{content:"\f433"}.ion-ios-flower-outline:before{content:"\f432"}.ion-ios-folder:before{content:"\f435"}.ion-ios-folder-outline:before{content:"\f434"}.ion-ios-football:before{content:"\f437"}.ion-ios-football-outline:before{content:"\f436"}.ion-ios-game-controller-a:before{content:"\f439"}.ion-ios-game-controller-a-outline:before{content:"\f438"}.ion-ios-game-controller-b:before{content:"\f43b"}.ion-ios-game-controller-b-outline:before{content:"\f43a"}.ion-ios-gear:before{content:"\f43d"}.ion-ios-gear-outline:before{content:"\f43c"}.ion-ios-glasses:before{content:"\f43f"}.ion-ios-glasses-outline:before{content:"\f43e"}.ion-ios-grid-view:before{content:"\f441"}.ion-ios-grid-view-outline:before{content:"\f440"}.ion-ios-heart:before{content:"\f443"}.ion-ios-heart-outline:before{content:"\f442"}.ion-ios-help:before{content:"\f446"}.ion-ios-help-empty:before{content:"\f444"}.ion-ios-help-outline:before{content:"\f445"}.ion-ios-home:before{content:"\f448"}.ion-ios-home-outline:before{content:"\f447"}.ion-ios-infinite:before{content:"\f44a"}.ion-ios-infinite-outline:before{content:"\f449"}.ion-ios-information:before{content:"\f44d"}.ion-ios-information-empty:before{content:"\f44b"}.ion-ios-information-outline:before{content:"\f44c"}.ion-ios-ionic-outline:before{content:"\f44e"}.ion-ios-keypad:before{content:"\f450"}.ion-ios-keypad-outline:before{content:"\f44f"}.ion-ios-lightbulb:before{content:"\f452"}.ion-ios-lightbulb-outline:before{content:"\f451"}.ion-ios-list:before{content:"\f454"}.ion-ios-list-outline:before{content:"\f453"}.ion-ios-location:before{content:"\f456"}.ion-ios-location-outline:before{content:"\f455"}.ion-ios-locked:before{content:"\f458"}.ion-ios-locked-outline:before{content:"\f457"}.ion-ios-loop:before{content:"\f45a"}.ion-ios-loop-strong:before{content:"\f459"}.ion-ios-medical:before{content:"\f45c"}.ion-ios-medical-outline:before{content:"\f45b"}.ion-ios-medkit:before{content:"\f45e"}.ion-ios-medkit-outline:before{content:"\f45d"}.ion-ios-mic:before{content:"\f461"}.ion-ios-mic-off:before{content:"\f45f"}.ion-ios-mic-outline:before{content:"\f460"}.ion-ios-minus:before{content:"\f464"}.ion-ios-minus-empty:before{content:"\f462"}.ion-ios-minus-outline:before{content:"\f463"}.ion-ios-monitor:before{content:"\f466"}.ion-ios-monitor-outline:before{content:"\f465"}.ion-ios-moon:before{content:"\f468"}.ion-ios-moon-outline:before{content:"\f467"}.ion-ios-more:before{content:"\f46a"}.ion-ios-more-outline:before{content:"\f469"}.ion-ios-musical-note:before{content:"\f46b"}.ion-ios-musical-notes:before{content:"\f46c"}.ion-ios-navigate:before{content:"\f46e"}.ion-ios-navigate-outline:before{content:"\f46d"}.ion-ios-nutrition:before{content:"\f470"}.ion-ios-nutrition-outline:before{content:"\f46f"}.ion-ios-paper:before{content:"\f472"}.ion-ios-paper-outline:before{content:"\f471"}.ion-ios-paperplane:before{content:"\f474"}.ion-ios-paperplane-outline:before{content:"\f473"}.ion-ios-partlysunny:before{content:"\f476"}.ion-ios-partlysunny-outline:before{content:"\f475"}.ion-ios-pause:before{content:"\f478"}.ion-ios-pause-outline:before{content:"\f477"}.ion-ios-paw:before{content:"\f47a"}.ion-ios-paw-outline:before{content:"\f479"}.ion-ios-people:before{content:"\f47c"}.ion-ios-people-outline:before{content:"\f47b"}.ion-ios-person:before{content:"\f47e"}.ion-ios-person-outline:before{content:"\f47d"}.ion-ios-personadd:before{content:"\f480"}.ion-ios-personadd-outline:before{content:"\f47f"}.ion-ios-photos:before{content:"\f482"}.ion-ios-photos-outline:before{content:"\f481"}.ion-ios-pie:before{content:"\f484"}.ion-ios-pie-outline:before{content:"\f483"}.ion-ios-pint:before{content:"\f486"}.ion-ios-pint-outline:before{content:"\f485"}.ion-ios-play:before{content:"\f488"}.ion-ios-play-outline:before{content:"\f487"}.ion-ios-plus:before{content:"\f48b"}.ion-ios-plus-empty:before{content:"\f489"}.ion-ios-plus-outline:before{content:"\f48a"}.ion-ios-pricetag:before{content:"\f48d"}.ion-ios-pricetag-outline:before{content:"\f48c"}.ion-ios-pricetags:before{content:"\f48f"}.ion-ios-pricetags-outline:before{content:"\f48e"}.ion-ios-printer:before{content:"\f491"}.ion-ios-printer-outline:before{content:"\f490"}.ion-ios-pulse:before{content:"\f493"}.ion-ios-pulse-strong:before{content:"\f492"}.ion-ios-rainy:before{content:"\f495"}.ion-ios-rainy-outline:before{content:"\f494"}.ion-ios-recording:before{content:"\f497"}.ion-ios-recording-outline:before{content:"\f496"}.ion-ios-redo:before{content:"\f499"}.ion-ios-redo-outline:before{content:"\f498"}.ion-ios-refresh:before{content:"\f49c"}.ion-ios-refresh-empty:before{content:"\f49a"}.ion-ios-refresh-outline:before{content:"\f49b"}.ion-ios-reload:before{content:"\f49d"}.ion-ios-reverse-camera:before{content:"\f49f"}.ion-ios-reverse-camera-outline:before{content:"\f49e"}.ion-ios-rewind:before{content:"\f4a1"}.ion-ios-rewind-outline:before{content:"\f4a0"}.ion-ios-rose:before{content:"\f4a3"}.ion-ios-rose-outline:before{content:"\f4a2"}.ion-ios-search:before{content:"\f4a5"}.ion-ios-search-strong:before{content:"\f4a4"}.ion-ios-settings:before{content:"\f4a7"}.ion-ios-settings-strong:before{content:"\f4a6"}.ion-ios-shuffle:before{content:"\f4a9"}.ion-ios-shuffle-strong:before{content:"\f4a8"}.ion-ios-skipbackward:before{content:"\f4ab"}.ion-ios-skipbackward-outline:before{content:"\f4aa"}.ion-ios-skipforward:before{content:"\f4ad"}.ion-ios-skipforward-outline:before{content:"\f4ac"}.ion-ios-snowy:before{content:"\f4ae"}.ion-ios-speedometer:before{content:"\f4b0"}.ion-ios-speedometer-outline:before{content:"\f4af"}.ion-ios-star:before{content:"\f4b3"}.ion-ios-star-half:before{content:"\f4b1"}.ion-ios-star-outline:before{content:"\f4b2"}.ion-ios-stopwatch:before{content:"\f4b5"}.ion-ios-stopwatch-outline:before{content:"\f4b4"}.ion-ios-sunny:before{content:"\f4b7"}.ion-ios-sunny-outline:before{content:"\f4b6"}.ion-ios-telephone:before{content:"\f4b9"}.ion-ios-telephone-outline:before{content:"\f4b8"}.ion-ios-tennisball:before{content:"\f4bb"}.ion-ios-tennisball-outline:before{content:"\f4ba"}.ion-ios-thunderstorm:before{content:"\f4bd"}.ion-ios-thunderstorm-outline:before{content:"\f4bc"}.ion-ios-time:before{content:"\f4bf"}.ion-ios-time-outline:before{content:"\f4be"}.ion-ios-timer:before{content:"\f4c1"}.ion-ios-timer-outline:before{content:"\f4c0"}.ion-ios-toggle:before{content:"\f4c3"}.ion-ios-toggle-outline:before{content:"\f4c2"}.ion-ios-trash:before{content:"\f4c5"}.ion-ios-trash-outline:before{content:"\f4c4"}.ion-ios-undo:before{content:"\f4c7"}.ion-ios-undo-outline:before{content:"\f4c6"}.ion-ios-unlocked:before{content:"\f4c9"}.ion-ios-unlocked-outline:before{content:"\f4c8"}.ion-ios-upload:before{content:"\f4cb"}.ion-ios-upload-outline:before{content:"\f4ca"}.ion-ios-videocam:before{content:"\f4cd"}.ion-ios-videocam-outline:before{content:"\f4cc"}.ion-ios-volume-high:before{content:"\f4ce"}.ion-ios-volume-low:before{content:"\f4cf"}.ion-ios-wineglass:before{content:"\f4d1"}.ion-ios-wineglass-outline:before{content:"\f4d0"}.ion-ios-world:before{content:"\f4d3"}.ion-ios-world-outline:before{content:"\f4d2"}.ion-ipad:before{content:"\f1f9"}.ion-iphone:before{content:"\f1fa"}.ion-ipod:before{content:"\f1fb"}.ion-jet:before{content:"\f295"}.ion-key:before{content:"\f296"}.ion-knife:before{content:"\f297"}.ion-laptop:before{content:"\f1fc"}.ion-leaf:before{content:"\f1fd"}.ion-levels:before{content:"\f298"}.ion-lightbulb:before{content:"\f299"}.ion-link:before{content:"\f1fe"}.ion-load-a:before{content:"\f29a"}.ion-load-b:before{content:"\f29b"}.ion-load-c:before{content:"\f29c"}.ion-load-d:before{content:"\f29d"}.ion-location:before{content:"\f1ff"}.ion-lock-combination:before{content:"\f4d4"}.ion-locked:before{content:"\f200"}.ion-log-in:before{content:"\f29e"}.ion-log-out:before{content:"\f29f"}.ion-loop:before{content:"\f201"}.ion-magnet:before{content:"\f2a0"}.ion-male:before{content:"\f2a1"}.ion-man:before{content:"\f202"}.ion-map:before{content:"\f203"}.ion-medkit:before{content:"\f2a2"}.ion-merge:before{content:"\f33f"}.ion-mic-a:before{content:"\f204"}.ion-mic-b:before{content:"\f205"}.ion-mic-c:before{content:"\f206"}.ion-minus:before{content:"\f209"}.ion-minus-circled:before{content:"\f207"}.ion-minus-round:before{content:"\f208"}.ion-model-s:before{content:"\f2c1"}.ion-monitor:before{content:"\f20a"}.ion-more:before{content:"\f20b"}.ion-mouse:before{content:"\f340"}.ion-music-note:before{content:"\f20c"}.ion-navicon:before{content:"\f20e"}.ion-navicon-round:before{content:"\f20d"}.ion-navigate:before{content:"\f2a3"}.ion-network:before{content:"\f341"}.ion-no-smoking:before{content:"\f2c2"}.ion-nuclear:before{content:"\f2a4"}.ion-outlet:before{content:"\f342"}.ion-paintbrush:before{content:"\f4d5"}.ion-paintbucket:before{content:"\f4d6"}.ion-paper-airplane:before{content:"\f2c3"}.ion-paperclip:before{content:"\f20f"}.ion-pause:before{content:"\f210"}.ion-person:before{content:"\f213"}.ion-person-add:before{content:"\f211"}.ion-person-stalker:before{content:"\f212"}.ion-pie-graph:before{content:"\f2a5"}.ion-pin:before{content:"\f2a6"}.ion-pinpoint:before{content:"\f2a7"}.ion-pizza:before{content:"\f2a8"}.ion-plane:before{content:"\f214"}.ion-planet:before{content:"\f343"}.ion-play:before{content:"\f215"}.ion-playstation:before{content:"\f30a"}.ion-plus:before{content:"\f218"}.ion-plus-circled:before{content:"\f216"}.ion-plus-round:before{content:"\f217"}.ion-podium:before{content:"\f344"}.ion-pound:before{content:"\f219"}.ion-power:before{content:"\f2a9"}.ion-pricetag:before{content:"\f2aa"}.ion-pricetags:before{content:"\f2ab"}.ion-printer:before{content:"\f21a"}.ion-pull-request:before{content:"\f345"}.ion-qr-scanner:before{content:"\f346"}.ion-quote:before{content:"\f347"}.ion-radio-waves:before{content:"\f2ac"}.ion-record:before{content:"\f21b"}.ion-refresh:before{content:"\f21c"}.ion-reply:before{content:"\f21e"}.ion-reply-all:before{content:"\f21d"}.ion-ribbon-a:before{content:"\f348"}.ion-ribbon-b:before{content:"\f349"}.ion-sad:before{content:"\f34a"}.ion-sad-outline:before{content:"\f4d7"}.ion-scissors:before{content:"\f34b"}.ion-search:before{content:"\f21f"}.ion-settings:before{content:"\f2ad"}.ion-share:before{content:"\f220"}.ion-shuffle:before{content:"\f221"}.ion-skip-backward:before{content:"\f222"}.ion-skip-forward:before{content:"\f223"}.ion-social-android:before{content:"\f225"}.ion-social-android-outline:before{content:"\f224"}.ion-social-angular:before{content:"\f4d9"}.ion-social-angular-outline:before{content:"\f4d8"}.ion-social-apple:before{content:"\f227"}.ion-social-apple-outline:before{content:"\f226"}.ion-social-bitcoin:before{content:"\f2af"}.ion-social-bitcoin-outline:before{content:"\f2ae"}.ion-social-buffer:before{content:"\f229"}.ion-social-buffer-outline:before{content:"\f228"}.ion-social-chrome:before{content:"\f4db"}.ion-social-chrome-outline:before{content:"\f4da"}.ion-social-codepen:before{content:"\f4dd"}.ion-social-codepen-outline:before{content:"\f4dc"}.ion-social-css3:before{content:"\f4df"}.ion-social-css3-outline:before{content:"\f4de"}.ion-social-designernews:before{content:"\f22b"}.ion-social-designernews-outline:before{content:"\f22a"}.ion-social-dribbble:before{content:"\f22d"}.ion-social-dribbble-outline:before{content:"\f22c"}.ion-social-dropbox:before{content:"\f22f"}.ion-social-dropbox-outline:before{content:"\f22e"}.ion-social-euro:before{content:"\f4e1"}.ion-social-euro-outline:before{content:"\f4e0"}.ion-social-facebook:before{content:"\f231"}.ion-social-facebook-outline:before{content:"\f230"}.ion-social-foursquare:before{content:"\f34d"}.ion-social-foursquare-outline:before{content:"\f34c"}.ion-social-freebsd-devil:before{content:"\f2c4"}.ion-social-github:before{content:"\f233"}.ion-social-github-outline:before{content:"\f232"}.ion-social-google:before{content:"\f34f"}.ion-social-google-outline:before{content:"\f34e"}.ion-social-googleplus:before{content:"\f235"}.ion-social-googleplus-outline:before{content:"\f234"}.ion-social-hackernews:before{content:"\f237"}.ion-social-hackernews-outline:before{content:"\f236"}.ion-social-html5:before{content:"\f4e3"}.ion-social-html5-outline:before{content:"\f4e2"}.ion-social-instagram:before{content:"\f351"}.ion-social-instagram-outline:before{content:"\f350"}.ion-social-javascript:before{content:"\f4e5"}.ion-social-javascript-outline:before{content:"\f4e4"}.ion-social-linkedin:before{content:"\f239"}.ion-social-linkedin-outline:before{content:"\f238"}.ion-social-markdown:before{content:"\f4e6"}.ion-social-nodejs:before{content:"\f4e7"}.ion-social-octocat:before{content:"\f4e8"}.ion-social-pinterest:before{content:"\f2b1"}.ion-social-pinterest-outline:before{content:"\f2b0"}.ion-social-python:before{content:"\f4e9"}.ion-social-reddit:before{content:"\f23b"}.ion-social-reddit-outline:before{content:"\f23a"}.ion-social-rss:before{content:"\f23d"}.ion-social-rss-outline:before{content:"\f23c"}.ion-social-sass:before{content:"\f4ea"}.ion-social-skype:before{content:"\f23f"}.ion-social-skype-outline:before{content:"\f23e"}.ion-social-snapchat:before{content:"\f4ec"}.ion-social-snapchat-outline:before{content:"\f4eb"}.ion-social-tumblr:before{content:"\f241"}.ion-social-tumblr-outline:before{content:"\f240"}.ion-social-tux:before{content:"\f2c5"}.ion-social-twitch:before{content:"\f4ee"}.ion-social-twitch-outline:before{content:"\f4ed"}.ion-social-twitter:before{content:"\f243"}.ion-social-twitter-outline:before{content:"\f242"}.ion-social-usd:before{content:"\f353"}.ion-social-usd-outline:before{content:"\f352"}.ion-social-vimeo:before{content:"\f245"}.ion-social-vimeo-outline:before{content:"\f244"}.ion-social-whatsapp:before{content:"\f4f0"}.ion-social-whatsapp-outline:before{content:"\f4ef"}.ion-social-windows:before{content:"\f247"}.ion-social-windows-outline:before{content:"\f246"}.ion-social-wordpress:before{content:"\f249"}.ion-social-wordpress-outline:before{content:"\f248"}.ion-social-yahoo:before{content:"\f24b"}.ion-social-yahoo-outline:before{content:"\f24a"}.ion-social-yen:before{content:"\f4f2"}.ion-social-yen-outline:before{content:"\f4f1"}.ion-social-youtube:before{content:"\f24d"}.ion-social-youtube-outline:before{content:"\f24c"}.ion-soup-can:before{content:"\f4f4"}.ion-soup-can-outline:before{content:"\f4f3"}.ion-speakerphone:before{content:"\f2b2"}.ion-speedometer:before{content:"\f2b3"}.ion-spoon:before{content:"\f2b4"}.ion-star:before{content:"\f24e"}.ion-stats-bars:before{content:"\f2b5"}.ion-steam:before{content:"\f30b"}.ion-stop:before{content:"\f24f"}.ion-thermometer:before{content:"\f2b6"}.ion-thumbsdown:before{content:"\f250"}.ion-thumbsup:before{content:"\f251"}.ion-toggle:before{content:"\f355"}.ion-toggle-filled:before{content:"\f354"}.ion-transgender:before{content:"\f4f5"}.ion-trash-a:before{content:"\f252"}.ion-trash-b:before{content:"\f253"}.ion-trophy:before{content:"\f356"}.ion-tshirt:before{content:"\f4f7"}.ion-tshirt-outline:before{content:"\f4f6"}.ion-umbrella:before{content:"\f2b7"}.ion-university:before{content:"\f357"}.ion-unlocked:before{content:"\f254"}.ion-upload:before{content:"\f255"}.ion-usb:before{content:"\f2b8"}.ion-videocamera:before{content:"\f256"}.ion-volume-high:before{content:"\f257"}.ion-volume-low:before{content:"\f258"}.ion-volume-medium:before{content:"\f259"}.ion-volume-mute:before{content:"\f25a"}.ion-wand:before{content:"\f358"}.ion-waterdrop:before{content:"\f25b"}.ion-wifi:before{content:"\f25c"}.ion-wineglass:before{content:"\f2b9"}.ion-woman:before{content:"\f25d"}.ion-wrench:before{content:"\f2ba"}.ion-xbox:before{content:"\f30c"} \ No newline at end of file diff --git a/public/css/modules.css b/public/css/modules.css new file mode 100755 index 0000000..e594dd9 --- /dev/null +++ b/public/css/modules.css @@ -0,0 +1,4 @@ +.item-image { + max-width: 225px; + width: 100%; +} \ No newline at end of file diff --git a/public/css/skin-black.css b/public/css/skin-black.css new file mode 100755 index 0000000..9706d50 --- /dev/null +++ b/public/css/skin-black.css @@ -0,0 +1,15 @@ +.skin-black .main-sidebar, .skin-black .left-side { + background-color: #2f4050; +} + +.skin-black .sidebar-menu>li:hover>a, .skin-black .sidebar-menu>li.active>a { + background: #293846; +} + +.skin-black .sidebar-menu>li>.treeview-menu { + background: #293846; +} + +.skin-black .sidebar-form input[type="text"], .skin-black .sidebar-form .btn { + background-color: #415365; +} \ No newline at end of file diff --git a/public/files/import/bills.xlsx b/public/files/import/bills.xlsx new file mode 100755 index 0000000..0780741 Binary files /dev/null and b/public/files/import/bills.xlsx differ diff --git a/public/files/import/customers.xlsx b/public/files/import/customers.xlsx new file mode 100755 index 0000000..b481ac6 Binary files /dev/null and b/public/files/import/customers.xlsx differ diff --git a/public/files/import/invoices.xlsx b/public/files/import/invoices.xlsx new file mode 100755 index 0000000..b6c2f6f Binary files /dev/null and b/public/files/import/invoices.xlsx differ diff --git a/public/files/import/items.xlsx b/public/files/import/items.xlsx new file mode 100755 index 0000000..cc43dce Binary files /dev/null and b/public/files/import/items.xlsx differ diff --git a/public/files/import/payments.xlsx b/public/files/import/payments.xlsx new file mode 100755 index 0000000..c7c9e1a Binary files /dev/null and b/public/files/import/payments.xlsx differ diff --git a/public/files/import/revenues.xlsx b/public/files/import/revenues.xlsx new file mode 100755 index 0000000..e740bdf Binary files /dev/null and b/public/files/import/revenues.xlsx differ diff --git a/public/files/import/vendors.xlsx b/public/files/import/vendors.xlsx new file mode 100755 index 0000000..61fcd83 Binary files /dev/null and b/public/files/import/vendors.xlsx differ diff --git a/public/fonts/FontAwesome.otf b/public/fonts/FontAwesome.otf new file mode 100755 index 0000000..401ec0f Binary files /dev/null and b/public/fonts/FontAwesome.otf differ diff --git a/public/fonts/fontawesome-webfont.eot b/public/fonts/fontawesome-webfont.eot new file mode 100755 index 0000000..e9f60ca Binary files /dev/null and b/public/fonts/fontawesome-webfont.eot differ diff --git a/public/fonts/fontawesome-webfont.svg b/public/fonts/fontawesome-webfont.svg new file mode 100755 index 0000000..855c845 --- /dev/null +++ b/public/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/fonts/fontawesome-webfont.ttf b/public/fonts/fontawesome-webfont.ttf new file mode 100755 index 0000000..35acda2 Binary files /dev/null and b/public/fonts/fontawesome-webfont.ttf differ diff --git a/public/fonts/fontawesome-webfont.woff b/public/fonts/fontawesome-webfont.woff new file mode 100755 index 0000000..400014a Binary files /dev/null and b/public/fonts/fontawesome-webfont.woff differ diff --git a/public/fonts/fontawesome-webfont.woff2 b/public/fonts/fontawesome-webfont.woff2 new file mode 100755 index 0000000..4d13fc6 Binary files /dev/null and b/public/fonts/fontawesome-webfont.woff2 differ diff --git a/public/img/akaunting-logo-green.png b/public/img/akaunting-logo-green.png new file mode 100755 index 0000000..866a169 Binary files /dev/null and b/public/img/akaunting-logo-green.png differ diff --git a/public/img/akaunting-logo-white.png b/public/img/akaunting-logo-white.png new file mode 100755 index 0000000..a97bebf Binary files /dev/null and b/public/img/akaunting-logo-white.png differ diff --git a/public/img/company.png b/public/img/company.png new file mode 100755 index 0000000..601fd27 Binary files /dev/null and b/public/img/company.png differ diff --git a/public/img/favicon.ico b/public/img/favicon.ico new file mode 100755 index 0000000..3170742 Binary files /dev/null and b/public/img/favicon.ico differ diff --git a/public/img/install.jpg b/public/img/install.jpg new file mode 100755 index 0000000..692fe6f Binary files /dev/null and b/public/img/install.jpg differ diff --git a/public/img/login.jpg b/public/img/login.jpg new file mode 100755 index 0000000..f68f57e Binary files /dev/null and b/public/img/login.jpg differ diff --git a/public/img/maintanance.png b/public/img/maintanance.png new file mode 100755 index 0000000..602c527 Binary files /dev/null and b/public/img/maintanance.png differ diff --git a/public/js/app.js b/public/js/app.js new file mode 100755 index 0000000..589cbb2 --- /dev/null +++ b/public/js/app.js @@ -0,0 +1,287 @@ +$(document).ready(function () { + // Live Search + $.fn.liveSearch = function (option) { + return this.each(function () { + this.timer = null; + this.items = new Array(); + + $.extend(this, option); + + $(this).attr('autocomplete', 'off'); + + // Blur + $(this).on('blur', function () { + setTimeout(function (object) { + object.hide(); + }, 200, this); + }); + + // Keydown + $(this).on('input', function (event) { + this.request(); + }); + + // Show + this.show = function () { + var pos = $('#live-search').position(); + + $(this).parent().parent().siblings('ul.dropdown-menu').css({ + top : pos.top + $('#live-search').height(), + width: $('#live-search').width(), + left: pos.left + }); + + $(this).parent().parent().siblings('ul.dropdown-menu').show(); + }; + + // Hide + this.hide = function () { + $(this).parent().parent().siblings('ul.dropdown-menu').hide(); + }; + + // Request + this.request = function () { + clearTimeout(this.timer); + + this.timer = setTimeout(function (object) { + object.source($(object).val(), $.proxy(object.response, object)); + }, 200, this); + }; + + // Response + this.response = function (json) { + html = ''; + + if (json.length) { + for (i = 0; i < json.length; i++) { + this.items[json[i]['id']] = json[i]; + } + + var count = json.length; + + for (i = 0; i < count; i++) { + html += '
  • '; + html += ' '; + html += ' '; + html += ' '; + html += '
  • '; + } + } + + if (html) { + this.show(); + } else { + this.hide(); + } + + $(this).parent().parent().siblings('ul.dropdown-menu').html(html); + }; + + $(this).parent().parent().after(''); + $(this).parent().parent().siblings('ul.dropdown-menu').delegate('a', 'click', $.proxy(this.click, this)); + }); + }; + + $('input[name=\'live-search\']').liveSearch({ + 'source': function (request, response) { + if (request != '' && request.length > 2) { + $.ajax({ + url : url_search, + type : 'GET', + dataType: 'JSON', + data : 'keyword=' + $(this).val(), + success : function (json) { + response($.map(json, function (item) { + return { + id : item.id, + name : item.name, + type : item.type, + color: item.color, + href : item.href + } + })); + } + }); + } else { + $('#live-search > .dropdown-menu').hide(); + } + } + }); + + last_radio = ''; + + $("input:radio").each(function () { + if ($(this).parent().parent().hasClass('radio-inline')) { + input_name = $(this).attr("name"); + input_value = $(this).attr("value"); + input_text = $(this).text(); + input_checked = $(this).is(':checked'); + + enable_class = 'btn-default'; + disable_class = 'btn-default'; + + if (last_radio == input_name) { + return; + } + + last_radio = input_name; + + if ($(':radio[name="' + input_name + '"]').length != 2) { + return; + } + + if ((input_value != 0) && (input_value != 1)) { + return; + } + + if ((input_text.localeCompare(text_yes) == 1) && (input_text.localeCompare(text_no) == 1)) { + return; + } + + if (input_value == 1 && input_checked == true) { + enable_class = 'btn-success active'; + } else { + disable_class = 'btn-danger active'; + } + + $('#' + input_name + '_1').removeClass('btn-default').addClass(enable_class); + $('#' + input_name + '_0').removeClass('btn-default').addClass(disable_class); + } + }); + + $(document).on('click', '.btn-group label:not(.active)', function (e) { + disable_label = $(this); + disable_input = $('#' + disable_label.attr('id') + ' :input'); + + if (disable_input.attr('type') != 'radio') { + return; + } + + if (!disable_input.is(':checked')) { + enable_input = $('input[name="' + disable_input.attr('name') + '"]:checked'); + enable_label = enable_input.parent(); + + enable_label.removeClass('btn-success active'); + enable_label.removeClass('btn-danger active'); + + enable_input.removeAttr('checked'); + enable_label.addClass('btn btn-default'); + + disable_label.removeClass('btn-default'); + + if (disable_input.val() == 0) { + disable_label.addClass('btn-danger active'); + } else { + disable_label.addClass('btn-success active'); + } + + disable_input.attr('checked', 'checked'); + + enable_input.trigger('change'); + disable_input.trigger('change'); + } + }); + + if (document.getElementById('recurring_frequency')) { + $(".input-group-recurring #recurring_frequency").select2(); + $('.input-group-recurring #recurring_frequency').trigger('change'); + } +}); + +function confirmDelete(form_id, title, message, button_cancel, button_delete) { + $('#confirm-modal').remove(); + + var html = ''; + + html += ''; + + $('body').append(html); + + $('#confirm-modal').modal('show'); +} + +$(document).on('click', '.popup', function(e) { + e.preventDefault(); + + $('#modal-popup').remove(); + + var element = this; + + $.ajax({ + url: $(element).attr('href'), + type: 'get', + dataType: 'html', + success: function(data) { + html = ''; + + this.parentEl = (options.parentEl && $(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl); + this.container = $(options.template).appendTo(this.parentEl); + + // + // handle all the possible options overriding defaults + // + + if (typeof options.locale === 'object') { + + if (typeof options.locale.direction === 'string') + this.locale.direction = options.locale.direction; + + if (typeof options.locale.format === 'string') + this.locale.format = options.locale.format; + + if (typeof options.locale.separator === 'string') + this.locale.separator = options.locale.separator; + + if (typeof options.locale.daysOfWeek === 'object') + this.locale.daysOfWeek = options.locale.daysOfWeek.slice(); + + if (typeof options.locale.monthNames === 'object') + this.locale.monthNames = options.locale.monthNames.slice(); + + if (typeof options.locale.firstDay === 'number') + this.locale.firstDay = options.locale.firstDay; + + if (typeof options.locale.applyLabel === 'string') + this.locale.applyLabel = options.locale.applyLabel; + + if (typeof options.locale.cancelLabel === 'string') + this.locale.cancelLabel = options.locale.cancelLabel; + + if (typeof options.locale.weekLabel === 'string') + this.locale.weekLabel = options.locale.weekLabel; + + if (typeof options.locale.customRangeLabel === 'string'){ + //Support unicode chars in the custom range name. + var elem = document.createElement('textarea'); + elem.innerHTML = options.locale.customRangeLabel; + var rangeHtml = elem.value; + this.locale.customRangeLabel = rangeHtml; + } + } + this.container.addClass(this.locale.direction); + + if (typeof options.startDate === 'string') + this.startDate = moment(options.startDate, this.locale.format); + + if (typeof options.endDate === 'string') + this.endDate = moment(options.endDate, this.locale.format); + + if (typeof options.minDate === 'string') + this.minDate = moment(options.minDate, this.locale.format); + + if (typeof options.maxDate === 'string') + this.maxDate = moment(options.maxDate, this.locale.format); + + if (typeof options.startDate === 'object') + this.startDate = moment(options.startDate); + + if (typeof options.endDate === 'object') + this.endDate = moment(options.endDate); + + if (typeof options.minDate === 'object') + this.minDate = moment(options.minDate); + + if (typeof options.maxDate === 'object') + this.maxDate = moment(options.maxDate); + + // sanity check for bad options + if (this.minDate && this.startDate.isBefore(this.minDate)) + this.startDate = this.minDate.clone(); + + // sanity check for bad options + if (this.maxDate && this.endDate.isAfter(this.maxDate)) + this.endDate = this.maxDate.clone(); + + if (typeof options.applyClass === 'string') + this.applyClass = options.applyClass; + + if (typeof options.cancelClass === 'string') + this.cancelClass = options.cancelClass; + + if (typeof options.dateLimit === 'object') + this.dateLimit = options.dateLimit; + + if (typeof options.opens === 'string') + this.opens = options.opens; + + if (typeof options.drops === 'string') + this.drops = options.drops; + + if (typeof options.showWeekNumbers === 'boolean') + this.showWeekNumbers = options.showWeekNumbers; + + if (typeof options.showISOWeekNumbers === 'boolean') + this.showISOWeekNumbers = options.showISOWeekNumbers; + + if (typeof options.buttonClasses === 'string') + this.buttonClasses = options.buttonClasses; + + if (typeof options.buttonClasses === 'object') + this.buttonClasses = options.buttonClasses.join(' '); + + if (typeof options.showDropdowns === 'boolean') + this.showDropdowns = options.showDropdowns; + + if (typeof options.showCustomRangeLabel === 'boolean') + this.showCustomRangeLabel = options.showCustomRangeLabel; + + if (typeof options.singleDatePicker === 'boolean') { + this.singleDatePicker = options.singleDatePicker; + if (this.singleDatePicker) + this.endDate = this.startDate.clone(); + } + + if (typeof options.timePicker === 'boolean') + this.timePicker = options.timePicker; + + if (typeof options.timePickerSeconds === 'boolean') + this.timePickerSeconds = options.timePickerSeconds; + + if (typeof options.timePickerIncrement === 'number') + this.timePickerIncrement = options.timePickerIncrement; + + if (typeof options.timePicker24Hour === 'boolean') + this.timePicker24Hour = options.timePicker24Hour; + + if (typeof options.autoApply === 'boolean') + this.autoApply = options.autoApply; + + if (typeof options.autoUpdateInput === 'boolean') + this.autoUpdateInput = options.autoUpdateInput; + + if (typeof options.linkedCalendars === 'boolean') + this.linkedCalendars = options.linkedCalendars; + + if (typeof options.isInvalidDate === 'function') + this.isInvalidDate = options.isInvalidDate; + + if (typeof options.isCustomDate === 'function') + this.isCustomDate = options.isCustomDate; + + if (typeof options.alwaysShowCalendars === 'boolean') + this.alwaysShowCalendars = options.alwaysShowCalendars; + + // update day names order to firstDay + if (this.locale.firstDay != 0) { + var iterator = this.locale.firstDay; + while (iterator > 0) { + this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()); + iterator--; + } + } + + var start, end, range; + + //if no start/end dates set, check if an input element contains initial values + if (typeof options.startDate === 'undefined' && typeof options.endDate === 'undefined') { + if ($(this.element).is('input[type=text]')) { + var val = $(this.element).val(), + split = val.split(this.locale.separator); + + start = end = null; + + if (split.length == 2) { + start = moment(split[0], this.locale.format); + end = moment(split[1], this.locale.format); + } else if (this.singleDatePicker && val !== "") { + start = moment(val, this.locale.format); + end = moment(val, this.locale.format); + } + if (start !== null && end !== null) { + this.setStartDate(start); + this.setEndDate(end); + } + } + } + + if (typeof options.ranges === 'object') { + for (range in options.ranges) { + + if (typeof options.ranges[range][0] === 'string') + start = moment(options.ranges[range][0], this.locale.format); + else + start = moment(options.ranges[range][0]); + + if (typeof options.ranges[range][1] === 'string') + end = moment(options.ranges[range][1], this.locale.format); + else + end = moment(options.ranges[range][1]); + + // If the start or end date exceed those allowed by the minDate or dateLimit + // options, shorten the range to the allowable period. + if (this.minDate && start.isBefore(this.minDate)) + start = this.minDate.clone(); + + var maxDate = this.maxDate; + if (this.dateLimit && maxDate && start.clone().add(this.dateLimit).isAfter(maxDate)) + maxDate = start.clone().add(this.dateLimit); + if (maxDate && end.isAfter(maxDate)) + end = maxDate.clone(); + + // If the end of the range is before the minimum or the start of the range is + // after the maximum, don't display this range option at all. + if ((this.minDate && end.isBefore(this.minDate, this.timepicker ? 'minute' : 'day')) + || (maxDate && start.isAfter(maxDate, this.timepicker ? 'minute' : 'day'))) + continue; + + //Support unicode chars in the range names. + var elem = document.createElement('textarea'); + elem.innerHTML = range; + var rangeHtml = elem.value; + + this.ranges[rangeHtml] = [start, end]; + } + + var list = '
      '; + for (range in this.ranges) { + list += '
    • ' + range + '
    • '; + } + if (this.showCustomRangeLabel) { + list += '
    • ' + this.locale.customRangeLabel + '
    • '; + } + list += '
    '; + this.container.find('.ranges').prepend(list); + } + + if (typeof cb === 'function') { + this.callback = cb; + } + + if (!this.timePicker) { + this.startDate = this.startDate.startOf('day'); + this.endDate = this.endDate.endOf('day'); + this.container.find('.calendar-time').hide(); + } + + //can't be used together for now + if (this.timePicker && this.autoApply) + this.autoApply = false; + + if (this.autoApply && typeof options.ranges !== 'object') { + this.container.find('.ranges').hide(); + } else if (this.autoApply) { + this.container.find('.applyBtn, .cancelBtn').addClass('hide'); + } + + if (this.singleDatePicker) { + this.container.addClass('single'); + this.container.find('.calendar.left').addClass('single'); + this.container.find('.calendar.left').show(); + this.container.find('.calendar.right').hide(); + this.container.find('.daterangepicker_input input, .daterangepicker_input > i').hide(); + if (this.timePicker) { + this.container.find('.ranges ul').hide(); + } else { + this.container.find('.ranges').hide(); + } + } + + if ((typeof options.ranges === 'undefined' && !this.singleDatePicker) || this.alwaysShowCalendars) { + this.container.addClass('show-calendar'); + } + + this.container.addClass('opens' + this.opens); + + //swap the position of the predefined ranges if opens right + if (typeof options.ranges !== 'undefined' && this.opens == 'right') { + this.container.find('.ranges').prependTo( this.container.find('.calendar.left').parent() ); + } + + //apply CSS classes and labels to buttons + this.container.find('.applyBtn, .cancelBtn').addClass(this.buttonClasses); + if (this.applyClass.length) + this.container.find('.applyBtn').addClass(this.applyClass); + if (this.cancelClass.length) + this.container.find('.cancelBtn').addClass(this.cancelClass); + this.container.find('.applyBtn').html(this.locale.applyLabel); + this.container.find('.cancelBtn').html(this.locale.cancelLabel); + + // + // event listeners + // + + this.container.find('.calendar') + .on('click.daterangepicker', '.prev', $.proxy(this.clickPrev, this)) + .on('click.daterangepicker', '.next', $.proxy(this.clickNext, this)) + .on('mousedown.daterangepicker', 'td.available', $.proxy(this.clickDate, this)) + .on('mouseenter.daterangepicker', 'td.available', $.proxy(this.hoverDate, this)) + .on('mouseleave.daterangepicker', 'td.available', $.proxy(this.updateFormInputs, this)) + .on('change.daterangepicker', 'select.yearselect', $.proxy(this.monthOrYearChanged, this)) + .on('change.daterangepicker', 'select.monthselect', $.proxy(this.monthOrYearChanged, this)) + .on('change.daterangepicker', 'select.hourselect,select.minuteselect,select.secondselect,select.ampmselect', $.proxy(this.timeChanged, this)) + .on('click.daterangepicker', '.daterangepicker_input input', $.proxy(this.showCalendars, this)) + .on('focus.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsFocused, this)) + .on('blur.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsBlurred, this)) + .on('change.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsChanged, this)) + .on('keydown.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsKeydown, this)); + + this.container.find('.ranges') + .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this)) + .on('click.daterangepicker', 'button.cancelBtn', $.proxy(this.clickCancel, this)) + .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this)) + .on('mouseenter.daterangepicker', 'li', $.proxy(this.hoverRange, this)) + .on('mouseleave.daterangepicker', 'li', $.proxy(this.updateFormInputs, this)); + + if (this.element.is('input') || this.element.is('button')) { + this.element.on({ + 'click.daterangepicker': $.proxy(this.show, this), + 'focus.daterangepicker': $.proxy(this.show, this), + 'keyup.daterangepicker': $.proxy(this.elementChanged, this), + 'keydown.daterangepicker': $.proxy(this.keydown, this) //IE 11 compatibility + }); + } else { + this.element.on('click.daterangepicker', $.proxy(this.toggle, this)); + this.element.on('keydown.daterangepicker', $.proxy(this.toggle, this)); + } + + // + // if attached to a text input, set the initial value + // + + if (this.element.is('input') && !this.singleDatePicker && this.autoUpdateInput) { + this.element.val(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format)); + this.element.trigger('change'); + } else if (this.element.is('input') && this.autoUpdateInput) { + this.element.val(this.startDate.format(this.locale.format)); + this.element.trigger('change'); + } + + }; + + DateRangePicker.prototype = { + + constructor: DateRangePicker, + + setStartDate: function(startDate) { + if (typeof startDate === 'string') + this.startDate = moment(startDate, this.locale.format); + + if (typeof startDate === 'object') + this.startDate = moment(startDate); + + if (!this.timePicker) + this.startDate = this.startDate.startOf('day'); + + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + + if (this.minDate && this.startDate.isBefore(this.minDate)) { + this.startDate = this.minDate.clone(); + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + } + + if (this.maxDate && this.startDate.isAfter(this.maxDate)) { + this.startDate = this.maxDate.clone(); + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.floor(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + } + + if (!this.isShowing) + this.updateElement(); + + this.updateMonthsInView(); + }, + + setEndDate: function(endDate) { + if (typeof endDate === 'string') + this.endDate = moment(endDate, this.locale.format); + + if (typeof endDate === 'object') + this.endDate = moment(endDate); + + if (!this.timePicker) + this.endDate = this.endDate.add(1,'d').startOf('day').subtract(1,'second'); + + if (this.timePicker && this.timePickerIncrement) + this.endDate.minute(Math.round(this.endDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + + if (this.endDate.isBefore(this.startDate)) + this.endDate = this.startDate.clone(); + + if (this.maxDate && this.endDate.isAfter(this.maxDate)) + this.endDate = this.maxDate.clone(); + + if (this.dateLimit && this.startDate.clone().add(this.dateLimit).isBefore(this.endDate)) + this.endDate = this.startDate.clone().add(this.dateLimit); + + this.previousRightTime = this.endDate.clone(); + + if (!this.isShowing) + this.updateElement(); + + this.updateMonthsInView(); + }, + + isInvalidDate: function() { + return false; + }, + + isCustomDate: function() { + return false; + }, + + updateView: function() { + if (this.timePicker) { + this.renderTimePicker('left'); + this.renderTimePicker('right'); + if (!this.endDate) { + this.container.find('.right .calendar-time select').attr('disabled', 'disabled').addClass('disabled'); + } else { + this.container.find('.right .calendar-time select').removeAttr('disabled').removeClass('disabled'); + } + } + if (this.endDate) { + this.container.find('input[name="daterangepicker_end"]').removeClass('active'); + this.container.find('input[name="daterangepicker_start"]').addClass('active'); + } else { + this.container.find('input[name="daterangepicker_end"]').addClass('active'); + this.container.find('input[name="daterangepicker_start"]').removeClass('active'); + } + this.updateMonthsInView(); + this.updateCalendars(); + this.updateFormInputs(); + }, + + updateMonthsInView: function() { + if (this.endDate) { + + //if both dates are visible already, do nothing + if (!this.singleDatePicker && this.leftCalendar.month && this.rightCalendar.month && + (this.startDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.startDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM')) + && + (this.endDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.endDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM')) + ) { + return; + } + + this.leftCalendar.month = this.startDate.clone().date(2); + if (!this.linkedCalendars && (this.endDate.month() != this.startDate.month() || this.endDate.year() != this.startDate.year())) { + this.rightCalendar.month = this.endDate.clone().date(2); + } else { + this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month'); + } + + } else { + if (this.leftCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM') && this.rightCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM')) { + this.leftCalendar.month = this.startDate.clone().date(2); + this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month'); + } + } + if (this.maxDate && this.linkedCalendars && !this.singleDatePicker && this.rightCalendar.month > this.maxDate) { + this.rightCalendar.month = this.maxDate.clone().date(2); + this.leftCalendar.month = this.maxDate.clone().date(2).subtract(1, 'month'); + } + }, + + updateCalendars: function() { + + if (this.timePicker) { + var hour, minute, second; + if (this.endDate) { + hour = parseInt(this.container.find('.left .hourselect').val(), 10); + minute = parseInt(this.container.find('.left .minuteselect').val(), 10); + second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0; + if (!this.timePicker24Hour) { + var ampm = this.container.find('.left .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + } else { + hour = parseInt(this.container.find('.right .hourselect').val(), 10); + minute = parseInt(this.container.find('.right .minuteselect').val(), 10); + second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0; + if (!this.timePicker24Hour) { + var ampm = this.container.find('.right .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + } + this.leftCalendar.month.hour(hour).minute(minute).second(second); + this.rightCalendar.month.hour(hour).minute(minute).second(second); + } + + this.renderCalendar('left'); + this.renderCalendar('right'); + + //highlight any predefined range matching the current start and end dates + this.container.find('.ranges li').removeClass('active'); + if (this.endDate == null) return; + + this.calculateChosenLabel(); + }, + + renderCalendar: function(side) { + + // + // Build the matrix of dates that will populate the calendar + // + + var calendar = side == 'left' ? this.leftCalendar : this.rightCalendar; + var month = calendar.month.month(); + var year = calendar.month.year(); + var hour = calendar.month.hour(); + var minute = calendar.month.minute(); + var second = calendar.month.second(); + var daysInMonth = moment([year, month]).daysInMonth(); + var firstDay = moment([year, month, 1]); + var lastDay = moment([year, month, daysInMonth]); + var lastMonth = moment(firstDay).subtract(1, 'month').month(); + var lastYear = moment(firstDay).subtract(1, 'month').year(); + var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth(); + var dayOfWeek = firstDay.day(); + + //initialize a 6 rows x 7 columns array for the calendar + var calendar = []; + calendar.firstDay = firstDay; + calendar.lastDay = lastDay; + + for (var i = 0; i < 6; i++) { + calendar[i] = []; + } + + //populate the calendar with date objects + var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1; + if (startDay > daysInLastMonth) + startDay -= 7; + + if (dayOfWeek == this.locale.firstDay) + startDay = daysInLastMonth - 6; + + var curDate = moment([lastYear, lastMonth, startDay, 12, minute, second]); + + var col, row; + for (var i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add(24, 'hour')) { + if (i > 0 && col % 7 === 0) { + col = 0; + row++; + } + calendar[row][col] = curDate.clone().hour(hour).minute(minute).second(second); + curDate.hour(12); + + if (this.minDate && calendar[row][col].format('YYYY-MM-DD') == this.minDate.format('YYYY-MM-DD') && calendar[row][col].isBefore(this.minDate) && side == 'left') { + calendar[row][col] = this.minDate.clone(); + } + + if (this.maxDate && calendar[row][col].format('YYYY-MM-DD') == this.maxDate.format('YYYY-MM-DD') && calendar[row][col].isAfter(this.maxDate) && side == 'right') { + calendar[row][col] = this.maxDate.clone(); + } + + } + + //make the calendar object available to hoverDate/clickDate + if (side == 'left') { + this.leftCalendar.calendar = calendar; + } else { + this.rightCalendar.calendar = calendar; + } + + // + // Display the calendar + // + + var minDate = side == 'left' ? this.minDate : this.startDate; + var maxDate = this.maxDate; + var selected = side == 'left' ? this.startDate : this.endDate; + var arrow = this.locale.direction == 'ltr' ? {left: 'chevron-left', right: 'chevron-right'} : {left: 'chevron-right', right: 'chevron-left'}; + + var html = ''; + html += ''; + html += ''; + + // add empty cell for week number + if (this.showWeekNumbers || this.showISOWeekNumbers) + html += ''; + + if ((!minDate || minDate.isBefore(calendar.firstDay)) && (!this.linkedCalendars || side == 'left')) { + html += ''; + } else { + html += ''; + } + + var dateHtml = this.locale.monthNames[calendar[1][1].month()] + calendar[1][1].format(" YYYY"); + + if (this.showDropdowns) { + var currentMonth = calendar[1][1].month(); + var currentYear = calendar[1][1].year(); + var maxYear = (maxDate && maxDate.year()) || (currentYear + 5); + var minYear = (minDate && minDate.year()) || (currentYear - 50); + var inMinYear = currentYear == minYear; + var inMaxYear = currentYear == maxYear; + + var monthHtml = '"; + + var yearHtml = ''; + + dateHtml = monthHtml + yearHtml; + } + + html += ''; + if ((!maxDate || maxDate.isAfter(calendar.lastDay)) && (!this.linkedCalendars || side == 'right' || this.singleDatePicker)) { + html += ''; + } else { + html += ''; + } + + html += ''; + html += ''; + + // add week number label + if (this.showWeekNumbers || this.showISOWeekNumbers) + html += ''; + + $.each(this.locale.daysOfWeek, function(index, dayOfWeek) { + html += ''; + }); + + html += ''; + html += ''; + html += ''; + + //adjust maxDate to reflect the dateLimit setting in order to + //grey out end dates beyond the dateLimit + if (this.endDate == null && this.dateLimit) { + var maxLimit = this.startDate.clone().add(this.dateLimit).endOf('day'); + if (!maxDate || maxLimit.isBefore(maxDate)) { + maxDate = maxLimit; + } + } + + for (var row = 0; row < 6; row++) { + html += ''; + + // add week number + if (this.showWeekNumbers) + html += ''; + else if (this.showISOWeekNumbers) + html += ''; + + for (var col = 0; col < 7; col++) { + + var classes = []; + + //highlight today's date + if (calendar[row][col].isSame(new Date(), "day")) + classes.push('today'); + + //highlight weekends + if (calendar[row][col].isoWeekday() > 5) + classes.push('weekend'); + + //grey out the dates in other months displayed at beginning and end of this calendar + if (calendar[row][col].month() != calendar[1][1].month()) + classes.push('off'); + + //don't allow selection of dates before the minimum date + if (this.minDate && calendar[row][col].isBefore(this.minDate, 'day')) + classes.push('off', 'disabled'); + + //don't allow selection of dates after the maximum date + if (maxDate && calendar[row][col].isAfter(maxDate, 'day')) + classes.push('off', 'disabled'); + + //don't allow selection of date if a custom function decides it's invalid + if (this.isInvalidDate(calendar[row][col])) + classes.push('off', 'disabled'); + + //highlight the currently selected start date + if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD')) + classes.push('active', 'start-date'); + + //highlight the currently selected end date + if (this.endDate != null && calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD')) + classes.push('active', 'end-date'); + + //highlight dates in-between the selected dates + if (this.endDate != null && calendar[row][col] > this.startDate && calendar[row][col] < this.endDate) + classes.push('in-range'); + + //apply custom classes for this date + var isCustom = this.isCustomDate(calendar[row][col]); + if (isCustom !== false) { + if (typeof isCustom === 'string') + classes.push(isCustom); + else + Array.prototype.push.apply(classes, isCustom); + } + + var cname = '', disabled = false; + for (var i = 0; i < classes.length; i++) { + cname += classes[i] + ' '; + if (classes[i] == 'disabled') + disabled = true; + } + if (!disabled) + cname += 'available'; + + html += ''; + + } + html += ''; + } + + html += ''; + html += '
    ' + dateHtml + '
    ' + this.locale.weekLabel + '' + dayOfWeek + '
    ' + calendar[row][0].week() + '' + calendar[row][0].isoWeek() + '' + calendar[row][col].date() + '
    '; + + this.container.find('.calendar.' + side + ' .calendar-table').html(html); + + }, + + renderTimePicker: function(side) { + + // Don't bother updating the time picker if it's currently disabled + // because an end date hasn't been clicked yet + if (side == 'right' && !this.endDate) return; + + var html, selected, minDate, maxDate = this.maxDate; + + if (this.dateLimit && (!this.maxDate || this.startDate.clone().add(this.dateLimit).isAfter(this.maxDate))) + maxDate = this.startDate.clone().add(this.dateLimit); + + if (side == 'left') { + selected = this.startDate.clone(); + minDate = this.minDate; + } else if (side == 'right') { + selected = this.endDate.clone(); + minDate = this.startDate; + + //Preserve the time already selected + var timeSelector = this.container.find('.calendar.right .calendar-time div'); + if (timeSelector.html() != '') { + + selected.hour(timeSelector.find('.hourselect option:selected').val() || selected.hour()); + selected.minute(timeSelector.find('.minuteselect option:selected').val() || selected.minute()); + selected.second(timeSelector.find('.secondselect option:selected').val() || selected.second()); + + if (!this.timePicker24Hour) { + var ampm = timeSelector.find('.ampmselect option:selected').val(); + if (ampm === 'PM' && selected.hour() < 12) + selected.hour(selected.hour() + 12); + if (ampm === 'AM' && selected.hour() === 12) + selected.hour(0); + } + + } + + if (selected.isBefore(this.startDate)) + selected = this.startDate.clone(); + + if (maxDate && selected.isAfter(maxDate)) + selected = maxDate.clone(); + + } + + // + // hours + // + + html = ' '; + + // + // minutes + // + + html += ': '; + + // + // seconds + // + + if (this.timePickerSeconds) { + html += ': '; + } + + // + // AM/PM + // + + if (!this.timePicker24Hour) { + html += ''; + } + + this.container.find('.calendar.' + side + ' .calendar-time div').html(html); + + }, + + updateFormInputs: function() { + + //ignore mouse movements while an above-calendar text input has focus + if (this.container.find('input[name=daterangepicker_start]').is(":focus") || this.container.find('input[name=daterangepicker_end]').is(":focus")) + return; + + this.container.find('input[name=daterangepicker_start]').val(this.startDate.format(this.locale.format)); + if (this.endDate) + this.container.find('input[name=daterangepicker_end]').val(this.endDate.format(this.locale.format)); + + if (this.singleDatePicker || (this.endDate && (this.startDate.isBefore(this.endDate) || this.startDate.isSame(this.endDate)))) { + this.container.find('button.applyBtn').removeAttr('disabled'); + } else { + this.container.find('button.applyBtn').attr('disabled', 'disabled'); + } + + }, + + move: function() { + var parentOffset = { top: 0, left: 0 }, + containerTop; + var parentRightEdge = $(window).width(); + if (!this.parentEl.is('body')) { + parentOffset = { + top: this.parentEl.offset().top - this.parentEl.scrollTop(), + left: this.parentEl.offset().left - this.parentEl.scrollLeft() + }; + parentRightEdge = this.parentEl[0].clientWidth + this.parentEl.offset().left; + } + + if (this.drops == 'up') + containerTop = this.element.offset().top - this.container.outerHeight() - parentOffset.top; + else + containerTop = this.element.offset().top + this.element.outerHeight() - parentOffset.top; + this.container[this.drops == 'up' ? 'addClass' : 'removeClass']('dropup'); + + if (this.opens == 'left') { + this.container.css({ + top: containerTop, + right: parentRightEdge - this.element.offset().left - this.element.outerWidth(), + left: 'auto' + }); + if (this.container.offset().left < 0) { + this.container.css({ + right: 'auto', + left: 9 + }); + } + } else if (this.opens == 'center') { + this.container.css({ + top: containerTop, + left: this.element.offset().left - parentOffset.left + this.element.outerWidth() / 2 + - this.container.outerWidth() / 2, + right: 'auto' + }); + if (this.container.offset().left < 0) { + this.container.css({ + right: 'auto', + left: 9 + }); + } + } else { + this.container.css({ + top: containerTop, + left: this.element.offset().left - parentOffset.left, + right: 'auto' + }); + if (this.container.offset().left + this.container.outerWidth() > $(window).width()) { + this.container.css({ + left: 'auto', + right: 0 + }); + } + } + }, + + show: function(e) { + if (this.isShowing) return; + + // Create a click proxy that is private to this instance of datepicker, for unbinding + this._outsideClickProxy = $.proxy(function(e) { this.outsideClick(e); }, this); + + // Bind global datepicker mousedown for hiding and + $(document) + .on('mousedown.daterangepicker', this._outsideClickProxy) + // also support mobile devices + .on('touchend.daterangepicker', this._outsideClickProxy) + // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them + .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy) + // and also close when focus changes to outside the picker (eg. tabbing between controls) + .on('focusin.daterangepicker', this._outsideClickProxy); + + // Reposition the picker if the window is resized while it's open + $(window).on('resize.daterangepicker', $.proxy(function(e) { this.move(e); }, this)); + + this.oldStartDate = this.startDate.clone(); + this.oldEndDate = this.endDate.clone(); + this.previousRightTime = this.endDate.clone(); + + this.updateView(); + this.container.show(); + this.move(); + this.element.trigger('show.daterangepicker', this); + this.isShowing = true; + }, + + hide: function(e) { + if (!this.isShowing) return; + + //incomplete date selection, revert to last values + if (!this.endDate) { + this.startDate = this.oldStartDate.clone(); + this.endDate = this.oldEndDate.clone(); + } + + //if a new date range was selected, invoke the user callback function + if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) + this.callback(this.startDate, this.endDate, this.chosenLabel); + + //if picker is attached to a text input, update it + this.updateElement(); + + $(document).off('.daterangepicker'); + $(window).off('.daterangepicker'); + this.container.hide(); + this.element.trigger('hide.daterangepicker', this); + this.isShowing = false; + }, + + toggle: function(e) { + if (this.isShowing) { + this.hide(); + } else { + this.show(); + } + }, + + outsideClick: function(e) { + var target = $(e.target); + // if the page is clicked anywhere except within the daterangerpicker/button + // itself then call this.hide() + if ( + // ie modal dialog fix + e.type == "focusin" || + target.closest(this.element).length || + target.closest(this.container).length || + target.closest('.calendar-table').length + ) return; + this.hide(); + this.element.trigger('outsideClick.daterangepicker', this); + }, + + showCalendars: function() { + this.container.addClass('show-calendar'); + this.move(); + this.element.trigger('showCalendar.daterangepicker', this); + }, + + hideCalendars: function() { + this.container.removeClass('show-calendar'); + this.element.trigger('hideCalendar.daterangepicker', this); + }, + + hoverRange: function(e) { + + //ignore mouse movements while an above-calendar text input has focus + if (this.container.find('input[name=daterangepicker_start]').is(":focus") || this.container.find('input[name=daterangepicker_end]').is(":focus")) + return; + + var label = e.target.getAttribute('data-range-key'); + + if (label == this.locale.customRangeLabel) { + this.updateView(); + } else { + var dates = this.ranges[label]; + this.container.find('input[name=daterangepicker_start]').val(dates[0].format(this.locale.format)); + this.container.find('input[name=daterangepicker_end]').val(dates[1].format(this.locale.format)); + } + + }, + + clickRange: function(e) { + var label = e.target.getAttribute('data-range-key'); + this.chosenLabel = label; + if (label == this.locale.customRangeLabel) { + this.showCalendars(); + } else { + var dates = this.ranges[label]; + this.startDate = dates[0]; + this.endDate = dates[1]; + + if (!this.timePicker) { + this.startDate.startOf('day'); + this.endDate.endOf('day'); + } + + if (!this.alwaysShowCalendars) + this.hideCalendars(); + this.clickApply(); + } + }, + + clickPrev: function(e) { + var cal = $(e.target).parents('.calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.subtract(1, 'month'); + if (this.linkedCalendars) + this.rightCalendar.month.subtract(1, 'month'); + } else { + this.rightCalendar.month.subtract(1, 'month'); + } + this.updateCalendars(); + }, + + clickNext: function(e) { + var cal = $(e.target).parents('.calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.add(1, 'month'); + } else { + this.rightCalendar.month.add(1, 'month'); + if (this.linkedCalendars) + this.leftCalendar.month.add(1, 'month'); + } + this.updateCalendars(); + }, + + hoverDate: function(e) { + + //ignore mouse movements while an above-calendar text input has focus + //if (this.container.find('input[name=daterangepicker_start]').is(":focus") || this.container.find('input[name=daterangepicker_end]').is(":focus")) + // return; + + //ignore dates that can't be selected + if (!$(e.target).hasClass('available')) return; + + //have the text inputs above calendars reflect the date being hovered over + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.calendar'); + var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col]; + + if (this.endDate && !this.container.find('input[name=daterangepicker_start]').is(":focus")) { + this.container.find('input[name=daterangepicker_start]').val(date.format(this.locale.format)); + } else if (!this.endDate && !this.container.find('input[name=daterangepicker_end]').is(":focus")) { + this.container.find('input[name=daterangepicker_end]').val(date.format(this.locale.format)); + } + + //highlight the dates between the start date and the date being hovered as a potential end date + var leftCalendar = this.leftCalendar; + var rightCalendar = this.rightCalendar; + var startDate = this.startDate; + if (!this.endDate) { + this.container.find('.calendar tbody td').each(function(index, el) { + + //skip week numbers, only look at dates + if ($(el).hasClass('week')) return; + + var title = $(el).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(el).parents('.calendar'); + var dt = cal.hasClass('left') ? leftCalendar.calendar[row][col] : rightCalendar.calendar[row][col]; + + if ((dt.isAfter(startDate) && dt.isBefore(date)) || dt.isSame(date, 'day')) { + $(el).addClass('in-range'); + } else { + $(el).removeClass('in-range'); + } + + }); + } + + }, + + clickDate: function(e) { + + if (!$(e.target).hasClass('available')) return; + + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.calendar'); + var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col]; + + // + // this function needs to do a few things: + // * alternate between selecting a start and end date for the range, + // * if the time picker is enabled, apply the hour/minute/second from the select boxes to the clicked date + // * if autoapply is enabled, and an end date was chosen, apply the selection + // * if single date picker mode, and time picker isn't enabled, apply the selection immediately + // * if one of the inputs above the calendars was focused, cancel that manual input + // + + if (this.endDate || date.isBefore(this.startDate, 'day')) { //picking start + if (this.timePicker) { + var hour = parseInt(this.container.find('.left .hourselect').val(), 10); + if (!this.timePicker24Hour) { + var ampm = this.container.find('.left .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + var minute = parseInt(this.container.find('.left .minuteselect').val(), 10); + var second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0; + date = date.clone().hour(hour).minute(minute).second(second); + } + this.endDate = null; + this.setStartDate(date.clone()); + } else if (!this.endDate && date.isBefore(this.startDate)) { + //special case: clicking the same date for start/end, + //but the time of the end date is before the start date + this.setEndDate(this.startDate.clone()); + } else { // picking end + if (this.timePicker) { + var hour = parseInt(this.container.find('.right .hourselect').val(), 10); + if (!this.timePicker24Hour) { + var ampm = this.container.find('.right .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + var minute = parseInt(this.container.find('.right .minuteselect').val(), 10); + var second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0; + date = date.clone().hour(hour).minute(minute).second(second); + } + this.setEndDate(date.clone()); + if (this.autoApply) { + this.calculateChosenLabel(); + this.clickApply(); + } + } + + if (this.singleDatePicker) { + this.setEndDate(this.startDate); + if (!this.timePicker) + this.clickApply(); + } + + this.updateView(); + + //This is to cancel the blur event handler if the mouse was in one of the inputs + e.stopPropagation(); + + }, + + calculateChosenLabel: function () { + var customRange = true; + var i = 0; + for (var range in this.ranges) { + if (this.timePicker) { + var format = this.timePickerSeconds ? "YYYY-MM-DD hh:mm:ss" : "YYYY-MM-DD hh:mm"; + //ignore times when comparing dates if time picker seconds is not enabled + if (this.startDate.format(format) == this.ranges[range][0].format(format) && this.endDate.format(format) == this.ranges[range][1].format(format)) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').html(); + break; + } + } else { + //ignore times when comparing dates if time picker is not enabled + if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').html(); + break; + } + } + i++; + } + if (customRange) { + if (this.showCustomRangeLabel) { + this.chosenLabel = this.container.find('.ranges li:last').addClass('active').html(); + } else { + this.chosenLabel = null; + } + this.showCalendars(); + } + }, + + clickApply: function(e) { + this.hide(); + this.element.trigger('apply.daterangepicker', this); + }, + + clickCancel: function(e) { + this.startDate = this.oldStartDate; + this.endDate = this.oldEndDate; + this.hide(); + this.element.trigger('cancel.daterangepicker', this); + }, + + monthOrYearChanged: function(e) { + var isLeft = $(e.target).closest('.calendar').hasClass('left'), + leftOrRight = isLeft ? 'left' : 'right', + cal = this.container.find('.calendar.'+leftOrRight); + + // Month must be Number for new moment versions + var month = parseInt(cal.find('.monthselect').val(), 10); + var year = cal.find('.yearselect').val(); + + if (!isLeft) { + if (year < this.startDate.year() || (year == this.startDate.year() && month < this.startDate.month())) { + month = this.startDate.month(); + year = this.startDate.year(); + } + } + + if (this.minDate) { + if (year < this.minDate.year() || (year == this.minDate.year() && month < this.minDate.month())) { + month = this.minDate.month(); + year = this.minDate.year(); + } + } + + if (this.maxDate) { + if (year > this.maxDate.year() || (year == this.maxDate.year() && month > this.maxDate.month())) { + month = this.maxDate.month(); + year = this.maxDate.year(); + } + } + + if (isLeft) { + this.leftCalendar.month.month(month).year(year); + if (this.linkedCalendars) + this.rightCalendar.month = this.leftCalendar.month.clone().add(1, 'month'); + } else { + this.rightCalendar.month.month(month).year(year); + if (this.linkedCalendars) + this.leftCalendar.month = this.rightCalendar.month.clone().subtract(1, 'month'); + } + this.updateCalendars(); + }, + + timeChanged: function(e) { + + var cal = $(e.target).closest('.calendar'), + isLeft = cal.hasClass('left'); + + var hour = parseInt(cal.find('.hourselect').val(), 10); + var minute = parseInt(cal.find('.minuteselect').val(), 10); + var second = this.timePickerSeconds ? parseInt(cal.find('.secondselect').val(), 10) : 0; + + if (!this.timePicker24Hour) { + var ampm = cal.find('.ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + + if (isLeft) { + var start = this.startDate.clone(); + start.hour(hour); + start.minute(minute); + start.second(second); + this.setStartDate(start); + if (this.singleDatePicker) { + this.endDate = this.startDate.clone(); + } else if (this.endDate && this.endDate.format('YYYY-MM-DD') == start.format('YYYY-MM-DD') && this.endDate.isBefore(start)) { + this.setEndDate(start.clone()); + } + } else if (this.endDate) { + var end = this.endDate.clone(); + end.hour(hour); + end.minute(minute); + end.second(second); + this.setEndDate(end); + } + + //update the calendars so all clickable dates reflect the new time component + this.updateCalendars(); + + //update the form inputs above the calendars with the new time + this.updateFormInputs(); + + //re-render the time pickers because changing one selection can affect what's enabled in another + this.renderTimePicker('left'); + this.renderTimePicker('right'); + + }, + + formInputsChanged: function(e) { + var isRight = $(e.target).closest('.calendar').hasClass('right'); + var start = moment(this.container.find('input[name="daterangepicker_start"]').val(), this.locale.format); + var end = moment(this.container.find('input[name="daterangepicker_end"]').val(), this.locale.format); + + if (start.isValid() && end.isValid()) { + + if (isRight && end.isBefore(start)) + start = end.clone(); + + this.setStartDate(start); + this.setEndDate(end); + + if (isRight) { + this.container.find('input[name="daterangepicker_start"]').val(this.startDate.format(this.locale.format)); + } else { + this.container.find('input[name="daterangepicker_end"]').val(this.endDate.format(this.locale.format)); + } + + } + + this.updateView(); + }, + + formInputsFocused: function(e) { + + // Highlight the focused input + this.container.find('input[name="daterangepicker_start"], input[name="daterangepicker_end"]').removeClass('active'); + $(e.target).addClass('active'); + + // Set the state such that if the user goes back to using a mouse, + // the calendars are aware we're selecting the end of the range, not + // the start. This allows someone to edit the end of a date range without + // re-selecting the beginning, by clicking on the end date input then + // using the calendar. + var isRight = $(e.target).closest('.calendar').hasClass('right'); + if (isRight) { + this.endDate = null; + this.setStartDate(this.startDate.clone()); + this.updateView(); + } + + }, + + formInputsBlurred: function(e) { + + // this function has one purpose right now: if you tab from the first + // text input to the second in the UI, the endDate is nulled so that + // you can click another, but if you tab out without clicking anything + // or changing the input value, the old endDate should be retained + + if (!this.endDate) { + var val = this.container.find('input[name="daterangepicker_end"]').val(); + var end = moment(val, this.locale.format); + if (end.isValid()) { + this.setEndDate(end); + this.updateView(); + } + } + + }, + + formInputsKeydown: function(e) { + // This function ensures that if the 'enter' key was pressed in the input, then the calendars + // are updated with the startDate and endDate. + // This behaviour is automatic in Chrome/Firefox/Edge but not in IE 11 hence why this exists. + // Other browsers and versions of IE are untested and the behaviour is unknown. + if (e.keyCode === 13) { + // Prevent the calendar from being updated twice on Chrome/Firefox/Edge + e.preventDefault(); + this.formInputsChanged(e); + } + }, + + + elementChanged: function() { + if (!this.element.is('input')) return; + if (!this.element.val().length) return; + + var dateString = this.element.val().split(this.locale.separator), + start = null, + end = null; + + if (dateString.length === 2) { + start = moment(dateString[0], this.locale.format); + end = moment(dateString[1], this.locale.format); + } + + if (this.singleDatePicker || start === null || end === null) { + start = moment(this.element.val(), this.locale.format); + end = start; + } + + if (!start.isValid() || !end.isValid()) return; + + this.setStartDate(start); + this.setEndDate(end); + this.updateView(); + }, + + keydown: function(e) { + //hide on tab or enter + if ((e.keyCode === 9) || (e.keyCode === 13)) { + this.hide(); + } + + //hide on esc and prevent propagation + if (e.keyCode === 27) { + e.preventDefault(); + e.stopPropagation(); + + this.hide(); + } + }, + + updateElement: function() { + if (this.element.is('input') && !this.singleDatePicker && this.autoUpdateInput) { + this.element.val(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format)); + this.element.trigger('change'); + } else if (this.element.is('input') && this.autoUpdateInput) { + this.element.val(this.startDate.format(this.locale.format)); + this.element.trigger('change'); + } + }, + + remove: function() { + this.container.remove(); + this.element.off('.daterangepicker'); + this.element.removeData(); + } + + }; + + $.fn.daterangepicker = function(options, callback) { + var implementOptions = $.extend(true, {}, $.fn.daterangepicker.defaultOptions, options); + this.each(function() { + var el = $(this); + if (el.data('daterangepicker')) + el.data('daterangepicker').remove(); + el.data('daterangepicker', new DateRangePicker(el, implementOptions, callback)); + }); + return this; + }; + + return DateRangePicker; + +})); \ No newline at end of file diff --git a/public/js/highchart/highcharts.js b/public/js/highchart/highcharts.js new file mode 100755 index 0000000..df61de7 --- /dev/null +++ b/public/js/highchart/highcharts.js @@ -0,0 +1,8457 @@ +/* + Highcharts JS v5.0.7 (2017-01-17) + + (c) 2009-2016 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(L, a) { + "object" === typeof module && module.exports ? module.exports = L.document ? a(L) : a : L.Highcharts = a(L) +})("undefined" !== typeof window ? window : this, function(L) { + L = function() { + var a = window, + B = a.document, + A = a.navigator && a.navigator.userAgent || "", + H = B && B.createElementNS && !!B.createElementNS("http://www.w3.org/2000/svg", "svg").createSVGRect, + G = /(edge|msie|trident)/i.test(A) && !window.opera, + r = !H, + g = /Firefox/.test(A), + f = g && 4 > parseInt(A.split("Firefox/")[1], 10); + return a.Highcharts ? a.Highcharts.error(16, !0) : { + product: "Highcharts", + version: "5.0.7", + deg2rad: 2 * Math.PI / 360, + doc: B, + hasBidiBug: f, + hasTouch: B && void 0 !== B.documentElement.ontouchstart, + isMS: G, + isWebKit: /AppleWebKit/.test(A), + isFirefox: g, + isTouchDevice: /(Mobile|Android|Windows Phone)/.test(A), + SVG_NS: "http://www.w3.org/2000/svg", + chartCount: 0, + seriesTypes: {}, + symbolSizes: {}, + svg: H, + vml: r, + win: a, + charts: [], + marginNames: ["plotTop", "marginRight", "marginBottom", "plotLeft"], + noop: function() {} + } + }(); + (function(a) { + var B = [], + A = a.charts, + H = a.doc, + G = a.win; + a.error = function(r, g) { + r = a.isNumber(r) ? "Highcharts error #" + + r + ": www.highcharts.com/errors/" + r : r; + if (g) throw Error(r); + G.console && console.log(r) + }; + a.Fx = function(a, g, f) { + this.options = g; + this.elem = a; + this.prop = f + }; + a.Fx.prototype = { + dSetter: function() { + var a = this.paths[0], + g = this.paths[1], + f = [], + u = this.now, + l = a.length, + q; + if (1 === u) f = this.toD; + else if (l === g.length && 1 > u) + for (; l--;) q = parseFloat(a[l]), f[l] = isNaN(q) ? a[l] : u * parseFloat(g[l] - q) + q; + else f = g; + this.elem.attr("d", f, null, !0) + }, + update: function() { + var a = this.elem, + g = this.prop, + f = this.now, + u = this.options.step; + if (this[g + "Setter"]) this[g + + "Setter"](); + else a.attr ? a.element && a.attr(g, f, null, !0) : a.style[g] = f + this.unit; + u && u.call(a, f, this) + }, + run: function(a, g, f) { + var r = this, + l = function(a) { + return l.stopped ? !1 : r.step(a) + }, + q; + this.startTime = +new Date; + this.start = a; + this.end = g; + this.unit = f; + this.now = this.start; + this.pos = 0; + l.elem = this.elem; + l.prop = this.prop; + l() && 1 === B.push(l) && (l.timerId = setInterval(function() { + for (q = 0; q < B.length; q++) B[q]() || B.splice(q--, 1); + B.length || clearInterval(l.timerId) + }, 13)) + }, + step: function(a) { + var r = +new Date, + f, u = this.options; + f = this.elem; + var l = u.complete, + q = u.duration, + d = u.curAnim, + b; + if (f.attr && !f.element) f = !1; + else if (a || r >= q + this.startTime) { + this.now = this.end; + this.pos = 1; + this.update(); + a = d[this.prop] = !0; + for (b in d) !0 !== d[b] && (a = !1); + a && l && l.call(f); + f = !1 + } else this.pos = u.easing((r - this.startTime) / q), this.now = this.start + (this.end - this.start) * this.pos, this.update(), f = !0; + return f + }, + initPath: function(r, g, f) { + function u(a) { + var e, b; + for (n = a.length; n--;) e = "M" === a[n] || "L" === a[n], b = /[a-zA-Z]/.test(a[n + 3]), e && b && a.splice(n + 1, 0, a[n + 1], a[n + 2], a[n + 1], a[n + + 2]) + } + + function l(a, e) { + for (; a.length < m;) { + a[0] = e[m - a.length]; + var b = a.slice(0, t); + [].splice.apply(a, [0, 0].concat(b)); + E && (b = a.slice(a.length - t), [].splice.apply(a, [a.length, 0].concat(b)), n--) + } + a[0] = "M" + } + + function q(a, e) { + for (var b = (m - a.length) / t; 0 < b && b--;) c = a.slice().splice(a.length / z - t, t * z), c[0] = e[m - t - b * t], C && (c[t - 6] = c[t - 2], c[t - 5] = c[t - 1]), [].splice.apply(a, [a.length / z, 0].concat(c)), E && b-- + } + g = g || ""; + var d, b = r.startX, + p = r.endX, + C = -1 < g.indexOf("C"), + t = C ? 7 : 3, + m, c, n; + g = g.split(" "); + f = f.slice(); + var E = r.isArea, + z = E ? 2 : 1, + e; + C && (u(g), u(f)); + if (b && p) { + for (n = 0; n < b.length; n++) + if (b[n] === p[0]) { + d = n; + break + } else if (b[0] === p[p.length - b.length + n]) { + d = n; + e = !0; + break + } + void 0 === d && (g = []) + } + g.length && a.isNumber(d) && (m = f.length + d * z * t, e ? (l(g, f), q(f, g)) : (l(f, g), q(g, f))); + return [g, f] + } + }; + a.extend = function(a, g) { + var f; + a || (a = {}); + for (f in g) a[f] = g[f]; + return a + }; + a.merge = function() { + var r, g = arguments, + f, u = {}, + l = function(q, d) { + var b, p; + "object" !== typeof q && (q = {}); + for (p in d) d.hasOwnProperty(p) && (b = d[p], a.isObject(b, !0) && "renderTo" !== p && "number" !== typeof b.nodeType ? + q[p] = l(q[p] || {}, b) : q[p] = d[p]); + return q + }; + !0 === g[0] && (u = g[1], g = Array.prototype.slice.call(g, 2)); + f = g.length; + for (r = 0; r < f; r++) u = l(u, g[r]); + return u + }; + a.pInt = function(a, g) { + return parseInt(a, g || 10) + }; + a.isString = function(a) { + return "string" === typeof a + }; + a.isArray = function(a) { + a = Object.prototype.toString.call(a); + return "[object Array]" === a || "[object Array Iterator]" === a + }; + a.isObject = function(r, g) { + return r && "object" === typeof r && (!g || !a.isArray(r)) + }; + a.isNumber = function(a) { + return "number" === typeof a && !isNaN(a) + }; + a.erase = + function(a, g) { + for (var f = a.length; f--;) + if (a[f] === g) { + a.splice(f, 1); + break + } + }; + a.defined = function(a) { + return void 0 !== a && null !== a + }; + a.attr = function(r, g, f) { + var u, l; + if (a.isString(g)) a.defined(f) ? r.setAttribute(g, f) : r && r.getAttribute && (l = r.getAttribute(g)); + else if (a.defined(g) && a.isObject(g)) + for (u in g) r.setAttribute(u, g[u]); + return l + }; + a.splat = function(r) { + return a.isArray(r) ? r : [r] + }; + a.syncTimeout = function(a, g, f) { + if (g) return setTimeout(a, g, f); + a.call(0, f) + }; + a.pick = function() { + var a = arguments, + g, f, u = a.length; + for (g = + 0; g < u; g++) + if (f = a[g], void 0 !== f && null !== f) return f + }; + a.css = function(r, g) { + a.isMS && !a.svg && g && void 0 !== g.opacity && (g.filter = "alpha(opacity\x3d" + 100 * g.opacity + ")"); + a.extend(r.style, g) + }; + a.createElement = function(r, g, f, u, l) { + r = H.createElement(r); + var q = a.css; + g && a.extend(r, g); + l && q(r, { + padding: 0, + border: "none", + margin: 0 + }); + f && q(r, f); + u && u.appendChild(r); + return r + }; + a.extendClass = function(r, g) { + var f = function() {}; + f.prototype = new r; + a.extend(f.prototype, g); + return f + }; + a.pad = function(a, g, f) { + return Array((g || 2) + 1 - String(a).length).join(f || + 0) + a + }; + a.relativeLength = function(a, g) { + return /%$/.test(a) ? g * parseFloat(a) / 100 : parseFloat(a) + }; + a.wrap = function(a, g, f) { + var r = a[g]; + a[g] = function() { + var a = Array.prototype.slice.call(arguments), + q = arguments, + d = this; + d.proceed = function() { + r.apply(d, arguments.length ? arguments : q) + }; + a.unshift(r); + a = f.apply(this, a); + d.proceed = null; + return a + } + }; + a.getTZOffset = function(r) { + var g = a.Date; + return 6E4 * (g.hcGetTimezoneOffset && g.hcGetTimezoneOffset(r) || g.hcTimezoneOffset || 0) + }; + a.dateFormat = function(r, g, f) { + if (!a.defined(g) || isNaN(g)) return a.defaultOptions.lang.invalidDate || + ""; + r = a.pick(r, "%Y-%m-%d %H:%M:%S"); + var u = a.Date, + l = new u(g - a.getTZOffset(g)), + q, d = l[u.hcGetHours](), + b = l[u.hcGetDay](), + p = l[u.hcGetDate](), + C = l[u.hcGetMonth](), + t = l[u.hcGetFullYear](), + m = a.defaultOptions.lang, + c = m.weekdays, + n = m.shortWeekdays, + E = a.pad, + u = a.extend({ + a: n ? n[b] : c[b].substr(0, 3), + A: c[b], + d: E(p), + e: E(p, 2, " "), + w: b, + b: m.shortMonths[C], + B: m.months[C], + m: E(C + 1), + y: t.toString().substr(2, 2), + Y: t, + H: E(d), + k: d, + I: E(d % 12 || 12), + l: d % 12 || 12, + M: E(l[u.hcGetMinutes]()), + p: 12 > d ? "AM" : "PM", + P: 12 > d ? "am" : "pm", + S: E(l.getSeconds()), + L: E(Math.round(g % + 1E3), 3) + }, a.dateFormats); + for (q in u) + for (; - 1 !== r.indexOf("%" + q);) r = r.replace("%" + q, "function" === typeof u[q] ? u[q](g) : u[q]); + return f ? r.substr(0, 1).toUpperCase() + r.substr(1) : r + }; + a.formatSingle = function(r, g) { + var f = /\.([0-9])/, + u = a.defaultOptions.lang; + /f$/.test(r) ? (f = (f = r.match(f)) ? f[1] : -1, null !== g && (g = a.numberFormat(g, f, u.decimalPoint, -1 < r.indexOf(",") ? u.thousandsSep : ""))) : g = a.dateFormat(r, g); + return g + }; + a.format = function(r, g) { + for (var f = "{", u = !1, l, q, d, b, p = [], C; r;) { + f = r.indexOf(f); + if (-1 === f) break; + l = r.slice(0, + f); + if (u) { + l = l.split(":"); + q = l.shift().split("."); + b = q.length; + C = g; + for (d = 0; d < b; d++) C = C[q[d]]; + l.length && (C = a.formatSingle(l.join(":"), C)); + p.push(C) + } else p.push(l); + r = r.slice(f + 1); + f = (u = !u) ? "}" : "{" + } + p.push(r); + return p.join("") + }; + a.getMagnitude = function(a) { + return Math.pow(10, Math.floor(Math.log(a) / Math.LN10)) + }; + a.normalizeTickInterval = function(r, g, f, u, l) { + var q, d = r; + f = a.pick(f, 1); + q = r / f; + g || (g = l ? [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] : [1, 2, 2.5, 5, 10], !1 === u && (1 === f ? g = a.grep(g, function(a) { + return 0 === a % 1 + }) : .1 >= f && (g = [1 / f]))); + for (u = 0; u < g.length && !(d = g[u], l && d * f >= r || !l && q <= (g[u] + (g[u + 1] || g[u])) / 2); u++); + return d = a.correctFloat(d * f, -Math.round(Math.log(.001) / Math.LN10)) + }; + a.stableSort = function(a, g) { + var f = a.length, + r, l; + for (l = 0; l < f; l++) a[l].safeI = l; + a.sort(function(a, d) { + r = g(a, d); + return 0 === r ? a.safeI - d.safeI : r + }); + for (l = 0; l < f; l++) delete a[l].safeI + }; + a.arrayMin = function(a) { + for (var g = a.length, f = a[0]; g--;) a[g] < f && (f = a[g]); + return f + }; + a.arrayMax = function(a) { + for (var g = a.length, f = a[0]; g--;) a[g] > f && (f = a[g]); + return f + }; + a.destroyObjectProperties = + function(a, g) { + for (var f in a) a[f] && a[f] !== g && a[f].destroy && a[f].destroy(), delete a[f] + }; + a.discardElement = function(r) { + var g = a.garbageBin; + g || (g = a.createElement("div")); + r && g.appendChild(r); + g.innerHTML = "" + }; + a.correctFloat = function(a, g) { + return parseFloat(a.toPrecision(g || 14)) + }; + a.setAnimation = function(r, g) { + g.renderer.globalAnimation = a.pick(r, g.options.chart.animation, !0) + }; + a.animObject = function(r) { + return a.isObject(r) ? a.merge(r) : { + duration: r ? 500 : 0 + } + }; + a.timeUnits = { + millisecond: 1, + second: 1E3, + minute: 6E4, + hour: 36E5, + day: 864E5, + week: 6048E5, + month: 24192E5, + year: 314496E5 + }; + a.numberFormat = function(r, g, f, u) { + r = +r || 0; + g = +g; + var l = a.defaultOptions.lang, + q = (r.toString().split(".")[1] || "").length, + d, b; - 1 === g ? g = Math.min(q, 20) : a.isNumber(g) || (g = 2); + b = (Math.abs(r) + Math.pow(10, -Math.max(g, q) - 1)).toFixed(g); + q = String(a.pInt(b)); + d = 3 < q.length ? q.length % 3 : 0; + f = a.pick(f, l.decimalPoint); + u = a.pick(u, l.thousandsSep); + r = (0 > r ? "-" : "") + (d ? q.substr(0, d) + u : ""); + r += q.substr(d).replace(/(\d{3})(?=\d)/g, "$1" + u); + g && (r += f + b.slice(-g)); + return r + }; + Math.easeInOutSine = + function(a) { + return -.5 * (Math.cos(Math.PI * a) - 1) + }; + a.getStyle = function(r, g) { + return "width" === g ? Math.min(r.offsetWidth, r.scrollWidth) - a.getStyle(r, "padding-left") - a.getStyle(r, "padding-right") : "height" === g ? Math.min(r.offsetHeight, r.scrollHeight) - a.getStyle(r, "padding-top") - a.getStyle(r, "padding-bottom") : (r = G.getComputedStyle(r, void 0)) && a.pInt(r.getPropertyValue(g)) + }; + a.inArray = function(a, g) { + return g.indexOf ? g.indexOf(a) : [].indexOf.call(g, a) + }; + a.grep = function(a, g) { + return [].filter.call(a, g) + }; + a.find = function(a, + g) { + return [].find.call(a, g) + }; + a.map = function(a, g) { + for (var f = [], u = 0, l = a.length; u < l; u++) f[u] = g.call(a[u], a[u], u, a); + return f + }; + a.offset = function(a) { + var g = H.documentElement; + a = a.getBoundingClientRect(); + return { + top: a.top + (G.pageYOffset || g.scrollTop) - (g.clientTop || 0), + left: a.left + (G.pageXOffset || g.scrollLeft) - (g.clientLeft || 0) + } + }; + a.stop = function(a, g) { + for (var f = B.length; f--;) B[f].elem !== a || g && g !== B[f].prop || (B[f].stopped = !0) + }; + a.each = function(a, g, f) { + return Array.prototype.forEach.call(a, g, f) + }; + a.addEvent = function(r, + g, f) { + function u(a) { + a.target = a.srcElement || G; + f.call(r, a) + } + var l = r.hcEvents = r.hcEvents || {}; + r.addEventListener ? r.addEventListener(g, f, !1) : r.attachEvent && (r.hcEventsIE || (r.hcEventsIE = {}), r.hcEventsIE[f.toString()] = u, r.attachEvent("on" + g, u)); + l[g] || (l[g] = []); + l[g].push(f); + return function() { + a.removeEvent(r, g, f) + } + }; + a.removeEvent = function(r, g, f) { + function u(a, b) { + r.removeEventListener ? r.removeEventListener(a, b, !1) : r.attachEvent && (b = r.hcEventsIE[b.toString()], r.detachEvent("on" + a, b)) + } + + function l() { + var a, b; + if (r.nodeName) + for (b in g ? + (a = {}, a[g] = !0) : a = d, a) + if (d[b]) + for (a = d[b].length; a--;) u(b, d[b][a]) + } + var q, d = r.hcEvents, + b; + d && (g ? (q = d[g] || [], f ? (b = a.inArray(f, q), -1 < b && (q.splice(b, 1), d[g] = q), u(g, f)) : (l(), d[g] = [])) : (l(), r.hcEvents = {})) + }; + a.fireEvent = function(r, g, f, u) { + var l; + l = r.hcEvents; + var q, d; + f = f || {}; + if (H.createEvent && (r.dispatchEvent || r.fireEvent)) l = H.createEvent("Events"), l.initEvent(g, !0, !0), a.extend(l, f), r.dispatchEvent ? r.dispatchEvent(l) : r.fireEvent(g, l); + else if (l) + for (l = l[g] || [], q = l.length, f.target || a.extend(f, { + preventDefault: function() { + f.defaultPrevented = !0 + }, + target: r, + type: g + }), g = 0; g < q; g++)(d = l[g]) && !1 === d.call(r, f) && f.preventDefault(); + u && !f.defaultPrevented && u(f) + }; + a.animate = function(r, g, f) { + var u, l = "", + q, d, b; + a.isObject(f) || (u = arguments, f = { + duration: u[2], + easing: u[3], + complete: u[4] + }); + a.isNumber(f.duration) || (f.duration = 400); + f.easing = "function" === typeof f.easing ? f.easing : Math[f.easing] || Math.easeInOutSine; + f.curAnim = a.merge(g); + for (b in g) a.stop(r, b), d = new a.Fx(r, f, b), q = null, "d" === b ? (d.paths = d.initPath(r, r.d, g.d), d.toD = g.d, u = 0, q = 1) : r.attr ? u = r.attr(b) : (u = parseFloat(a.getStyle(r, + b)) || 0, "opacity" !== b && (l = "px")), q || (q = g[b]), q.match && q.match("px") && (q = q.replace(/px/g, "")), d.run(u, q, l) + }; + a.seriesType = function(r, g, f, u, l) { + var q = a.getOptions(), + d = a.seriesTypes; + q.plotOptions[r] = a.merge(q.plotOptions[g], f); + d[r] = a.extendClass(d[g] || function() {}, u); + d[r].prototype.type = r; + l && (d[r].prototype.pointClass = a.extendClass(a.Point, l)); + return d[r] + }; + a.uniqueKey = function() { + var a = Math.random().toString(36).substring(2, 9), + g = 0; + return function() { + return "highcharts-" + a + "-" + g++ + } + }(); + G.jQuery && (G.jQuery.fn.highcharts = + function() { + var r = [].slice.call(arguments); + if (this[0]) return r[0] ? (new(a[a.isString(r[0]) ? r.shift() : "Chart"])(this[0], r[0], r[1]), this) : A[a.attr(this[0], "data-highcharts-chart")] + }); + H && !H.defaultView && (a.getStyle = function(r, g) { + var f = { + width: "clientWidth", + height: "clientHeight" + }[g]; + if (r.style[g]) return a.pInt(r.style[g]); + "opacity" === g && (g = "filter"); + if (f) return r.style.zoom = 1, Math.max(r[f] - 2 * a.getStyle(r, "padding"), 0); + r = r.currentStyle[g.replace(/\-(\w)/g, function(a, l) { + return l.toUpperCase() + })]; + "filter" === + g && (r = r.replace(/alpha\(opacity=([0-9]+)\)/, function(a, l) { + return l / 100 + })); + return "" === r ? 1 : a.pInt(r) + }); + Array.prototype.forEach || (a.each = function(a, g, f) { + for (var u = 0, l = a.length; u < l; u++) + if (!1 === g.call(f, a[u], u, a)) return u + }); + Array.prototype.indexOf || (a.inArray = function(a, g) { + var f, u = 0; + if (g) + for (f = g.length; u < f; u++) + if (g[u] === a) return u; + return -1 + }); + Array.prototype.filter || (a.grep = function(a, g) { + for (var f = [], u = 0, l = a.length; u < l; u++) g(a[u], u) && f.push(a[u]); + return f + }); + Array.prototype.find || (a.find = function(a, g) { + var f, + u = a.length; + for (f = 0; f < u; f++) + if (g(a[f], f)) return a[f] + }) + })(L); + (function(a) { + var B = a.each, + A = a.isNumber, + H = a.map, + G = a.merge, + r = a.pInt; + a.Color = function(g) { + if (!(this instanceof a.Color)) return new a.Color(g); + this.init(g) + }; + a.Color.prototype = { + parsers: [{ + regex: /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/, + parse: function(a) { + return [r(a[1]), r(a[2]), r(a[3]), parseFloat(a[4], 10)] + } + }, { + regex: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/, + parse: function(a) { + return [r(a[1], + 16), r(a[2], 16), r(a[3], 16), 1] + } + }, { + regex: /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/, + parse: function(a) { + return [r(a[1]), r(a[2]), r(a[3]), 1] + } + }], + names: { + white: "#ffffff", + black: "#000000" + }, + init: function(g) { + var f, u, l, q; + if ((this.input = g = this.names[g] || g) && g.stops) this.stops = H(g.stops, function(d) { + return new a.Color(d[1]) + }); + else + for (l = this.parsers.length; l-- && !u;) q = this.parsers[l], (f = q.regex.exec(g)) && (u = q.parse(f)); + this.rgba = u || [] + }, + get: function(a) { + var f = this.input, + g = this.rgba, + l; + this.stops ? + (l = G(f), l.stops = [].concat(l.stops), B(this.stops, function(f, d) { + l.stops[d] = [l.stops[d][0], f.get(a)] + })) : l = g && A(g[0]) ? "rgb" === a || !a && 1 === g[3] ? "rgb(" + g[0] + "," + g[1] + "," + g[2] + ")" : "a" === a ? g[3] : "rgba(" + g.join(",") + ")" : f; + return l + }, + brighten: function(a) { + var f, g = this.rgba; + if (this.stops) B(this.stops, function(l) { + l.brighten(a) + }); + else if (A(a) && 0 !== a) + for (f = 0; 3 > f; f++) g[f] += r(255 * a), 0 > g[f] && (g[f] = 0), 255 < g[f] && (g[f] = 255); + return this + }, + setOpacity: function(a) { + this.rgba[3] = a; + return this + } + }; + a.color = function(g) { + return new a.Color(g) + } + })(L); + (function(a) { + var B, A, H = a.addEvent, + G = a.animate, + r = a.attr, + g = a.charts, + f = a.color, + u = a.css, + l = a.createElement, + q = a.defined, + d = a.deg2rad, + b = a.destroyObjectProperties, + p = a.doc, + C = a.each, + t = a.extend, + m = a.erase, + c = a.grep, + n = a.hasTouch, + E = a.inArray, + z = a.isArray, + e = a.isFirefox, + x = a.isMS, + F = a.isObject, + w = a.isString, + h = a.isWebKit, + y = a.merge, + J = a.noop, + K = a.pick, + I = a.pInt, + k = a.removeEvent, + D = a.stop, + P = a.svg, + N = a.SVG_NS, + S = a.symbolSizes, + O = a.win; + B = a.SVGElement = function() { + return this + }; + B.prototype = { + opacity: 1, + SVG_NS: N, + textProps: "direction fontSize fontWeight fontFamily fontStyle color lineHeight width textDecoration textOverflow textOutline".split(" "), + init: function(a, k) { + this.element = "span" === k ? l(k) : p.createElementNS(this.SVG_NS, k); + this.renderer = a + }, + animate: function(v, k, e) { + k = a.animObject(K(k, this.renderer.globalAnimation, !0)); + 0 !== k.duration ? (e && (k.complete = e), G(this, v, k)) : this.attr(v, null, e); + return this + }, + colorGradient: function(v, k, e) { + var b = this.renderer, + h, D, c, x, M, m, n, d, F, t, p, w = [], + l; + v.linearGradient ? D = "linearGradient" : v.radialGradient && (D = "radialGradient"); + if (D) { + c = v[D]; + M = b.gradients; + n = v.stops; + t = e.radialReference; + z(c) && (v[D] = c = { + x1: c[0], + y1: c[1], + x2: c[2], + y2: c[3], + gradientUnits: "userSpaceOnUse" + }); + "radialGradient" === D && t && !q(c.gradientUnits) && (x = c, c = y(c, b.getRadialAttr(t, x), { + gradientUnits: "userSpaceOnUse" + })); + for (p in c) "id" !== p && w.push(p, c[p]); + for (p in n) w.push(n[p]); + w = w.join(","); + M[w] ? t = M[w].attr("id") : (c.id = t = a.uniqueKey(), M[w] = m = b.createElement(D).attr(c).add(b.defs), m.radAttr = x, m.stops = [], C(n, function(v) { + 0 === v[1].indexOf("rgba") ? (h = a.color(v[1]), d = h.get("rgb"), F = h.get("a")) : (d = v[1], F = 1); + v = b.createElement("stop").attr({ + offset: v[0], + "stop-color": d, + "stop-opacity": F + }).add(m); + m.stops.push(v) + })); + l = "url(" + b.url + "#" + t + ")"; + e.setAttribute(k, l); + e.gradient = w; + v.toString = function() { + return l + } + } + }, + applyTextOutline: function(a) { + var v = this.element, + k, e, b, c; - 1 !== a.indexOf("contrast") && (a = a.replace(/contrast/g, this.renderer.getContrast(v.style.fill))); + this.fakeTS = !0; + this.ySetter = this.xSetter; + k = [].slice.call(v.getElementsByTagName("tspan")); + a = a.split(" "); + e = a[a.length - 1]; + (b = a[0]) && "none" !== b && (b = b.replace(/(^[\d\.]+)(.*?)$/g, function(a, v, k) { + return 2 * v + k + }), C(k, function(a) { + "highcharts-text-outline" === + a.getAttribute("class") && m(k, v.removeChild(a)) + }), c = v.firstChild, C(k, function(a, k) { + 0 === k && (a.setAttribute("x", v.getAttribute("x")), k = v.getAttribute("y"), a.setAttribute("y", k || 0), null === k && v.setAttribute("y", 0)); + a = a.cloneNode(1); + r(a, { + "class": "highcharts-text-outline", + fill: e, + stroke: e, + "stroke-width": b, + "stroke-linejoin": "round" + }); + v.insertBefore(a, c) + })) + }, + attr: function(a, k, e, b) { + var v, c = this.element, + h, x = this, + M; + "string" === typeof a && void 0 !== k && (v = a, a = {}, a[v] = k); + if ("string" === typeof a) x = (this[a + "Getter"] || + this._defaultGetter).call(this, a, c); + else { + for (v in a) k = a[v], M = !1, b || D(this, v), this.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(v) && (h || (this.symbolAttr(a), h = !0), M = !0), !this.rotation || "x" !== v && "y" !== v || (this.doTransform = !0), M || (M = this[v + "Setter"] || this._defaultSetter, M.call(this, k, v, c), this.shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(v) && this.updateShadows(v, k, M)); + this.doTransform && (this.updateTransform(), this.doTransform = !1) + } + e && e(); + return x + }, + updateShadows: function(a, + k, e) { + for (var v = this.shadows, b = v.length; b--;) e.call(v[b], "height" === a ? Math.max(k - (v[b].cutHeight || 0), 0) : "d" === a ? this.d : k, a, v[b]) + }, + addClass: function(a, k) { + var v = this.attr("class") || ""; - 1 === v.indexOf(a) && (k || (a = (v + (v ? " " : "") + a).replace(" ", " ")), this.attr("class", a)); + return this + }, + hasClass: function(a) { + return -1 !== r(this.element, "class").indexOf(a) + }, + removeClass: function(a) { + r(this.element, "class", (r(this.element, "class") || "").replace(a, "")); + return this + }, + symbolAttr: function(a) { + var v = this; + C("x y r start end width height innerR anchorX anchorY".split(" "), + function(k) { + v[k] = K(a[k], v[k]) + }); + v.attr({ + d: v.renderer.symbols[v.symbolName](v.x, v.y, v.width, v.height, v) + }) + }, + clip: function(a) { + return this.attr("clip-path", a ? "url(" + this.renderer.url + "#" + a.id + ")" : "none") + }, + crisp: function(a, k) { + var v, e = {}, + b; + k = k || a.strokeWidth || 0; + b = Math.round(k) % 2 / 2; + a.x = Math.floor(a.x || this.x || 0) + b; + a.y = Math.floor(a.y || this.y || 0) + b; + a.width = Math.floor((a.width || this.width || 0) - 2 * b); + a.height = Math.floor((a.height || this.height || 0) - 2 * b); + q(a.strokeWidth) && (a.strokeWidth = k); + for (v in a) this[v] !== a[v] && + (this[v] = e[v] = a[v]); + return e + }, + css: function(a) { + var v = this.styles, + k = {}, + e = this.element, + b, c, h = ""; + b = !v; + var D = ["textOverflow", "width"]; + a && a.color && (a.fill = a.color); + if (v) + for (c in a) a[c] !== v[c] && (k[c] = a[c], b = !0); + if (b) { + b = this.textWidth = a && a.width && "text" === e.nodeName.toLowerCase() && I(a.width) || this.textWidth; + v && (a = t(v, k)); + this.styles = a; + b && !P && this.renderer.forExport && delete a.width; + if (x && !P) u(this.element, a); + else { + v = function(a, v) { + return "-" + v.toLowerCase() + }; + for (c in a) - 1 === E(c, D) && (h += c.replace(/([A-Z])/g, v) + + ":" + a[c] + ";"); + h && r(e, "style", h) + } + this.added && (b && this.renderer.buildText(this), a && a.textOutline && this.applyTextOutline(a.textOutline)) + } + return this + }, + strokeWidth: function() { + return this["stroke-width"] || 0 + }, + on: function(a, k) { + var v = this, + e = v.element; + n && "click" === a ? (e.ontouchstart = function(a) { + v.touchEventFired = Date.now(); + a.preventDefault(); + k.call(e, a) + }, e.onclick = function(a) { + (-1 === O.navigator.userAgent.indexOf("Android") || 1100 < Date.now() - (v.touchEventFired || 0)) && k.call(e, a) + }) : e["on" + a] = k; + return this + }, + setRadialReference: function(a) { + var v = + this.renderer.gradients[this.element.gradient]; + this.element.radialReference = a; + v && v.radAttr && v.animate(this.renderer.getRadialAttr(a, v.radAttr)); + return this + }, + translate: function(a, k) { + return this.attr({ + translateX: a, + translateY: k + }) + }, + invert: function(a) { + this.inverted = a; + this.updateTransform(); + return this + }, + updateTransform: function() { + var a = this.translateX || 0, + k = this.translateY || 0, + e = this.scaleX, + b = this.scaleY, + c = this.inverted, + h = this.rotation, + D = this.element; + c && (a += this.width, k += this.height); + a = ["translate(" + a + "," + + k + ")" + ]; + c ? a.push("rotate(90) scale(-1,1)") : h && a.push("rotate(" + h + " " + (D.getAttribute("x") || 0) + " " + (D.getAttribute("y") || 0) + ")"); + (q(e) || q(b)) && a.push("scale(" + K(e, 1) + " " + K(b, 1) + ")"); + a.length && D.setAttribute("transform", a.join(" ")) + }, + toFront: function() { + var a = this.element; + a.parentNode.appendChild(a); + return this + }, + align: function(a, k, e) { + var v, b, c, h, D = {}; + b = this.renderer; + c = b.alignedObjects; + var x, y; + if (a) { + if (this.alignOptions = a, this.alignByTranslate = k, !e || w(e)) this.alignTo = v = e || "renderer", m(c, this), c.push(this), + e = null + } else a = this.alignOptions, k = this.alignByTranslate, v = this.alignTo; + e = K(e, b[v], b); + v = a.align; + b = a.verticalAlign; + c = (e.x || 0) + (a.x || 0); + h = (e.y || 0) + (a.y || 0); + "right" === v ? x = 1 : "center" === v && (x = 2); + x && (c += (e.width - (a.width || 0)) / x); + D[k ? "translateX" : "x"] = Math.round(c); + "bottom" === b ? y = 1 : "middle" === b && (y = 2); + y && (h += (e.height - (a.height || 0)) / y); + D[k ? "translateY" : "y"] = Math.round(h); + this[this.placed ? "animate" : "attr"](D); + this.placed = !0; + this.alignAttr = D; + return this + }, + getBBox: function(a, k) { + var v, e = this.renderer, + b, c = this.element, + h = this.styles, + D, x = this.textStr, + m, y = e.cache, + n = e.cacheKeys, + F; + k = K(k, this.rotation); + b = k * d; + D = h && h.fontSize; + void 0 !== x && (F = x.toString(), -1 === F.indexOf("\x3c") && (F = F.replace(/[0-9]/g, "0")), F += ["", k || 0, D, h && h.width, h && h.textOverflow].join()); + F && !a && (v = y[F]); + if (!v) { + if (c.namespaceURI === this.SVG_NS || e.forExport) { + try { + (m = this.fakeTS && function(a) { + C(c.querySelectorAll(".highcharts-text-outline"), function(v) { + v.style.display = a + }) + }) && m("none"), v = c.getBBox ? t({}, c.getBBox()) : { + width: c.offsetWidth, + height: c.offsetHeight + }, + m && m("") + } catch (W) {} + if (!v || 0 > v.width) v = { + width: 0, + height: 0 + } + } else v = this.htmlGetBBox(); + e.isSVG && (a = v.width, e = v.height, h && "11px" === h.fontSize && 17 === Math.round(e) && (v.height = e = 14), k && (v.width = Math.abs(e * Math.sin(b)) + Math.abs(a * Math.cos(b)), v.height = Math.abs(e * Math.cos(b)) + Math.abs(a * Math.sin(b)))); + if (F && 0 < v.height) { + for (; 250 < n.length;) delete y[n.shift()]; + y[F] || n.push(F); + y[F] = v + } + } + return v + }, + show: function(a) { + return this.attr({ + visibility: a ? "inherit" : "visible" + }) + }, + hide: function() { + return this.attr({ + visibility: "hidden" + }) + }, + fadeOut: function(a) { + var v = this; + v.animate({ + opacity: 0 + }, { + duration: a || 150, + complete: function() { + v.attr({ + y: -9999 + }) + } + }) + }, + add: function(a) { + var v = this.renderer, + k = this.element, + e; + a && (this.parentGroup = a); + this.parentInverted = a && a.inverted; + void 0 !== this.textStr && v.buildText(this); + this.added = !0; + if (!a || a.handleZ || this.zIndex) e = this.zIndexSetter(); + e || (a ? a.element : v.box).appendChild(k); + if (this.onAdd) this.onAdd(); + return this + }, + safeRemoveChild: function(a) { + var v = a.parentNode; + v && v.removeChild(a) + }, + destroy: function() { + var a = + this.element || {}, + k = this.renderer.isSVG && "SPAN" === a.nodeName && this.parentGroup, + e, b; + a.onclick = a.onmouseout = a.onmouseover = a.onmousemove = a.point = null; + D(this); + this.clipPath && (this.clipPath = this.clipPath.destroy()); + if (this.stops) { + for (b = 0; b < this.stops.length; b++) this.stops[b] = this.stops[b].destroy(); + this.stops = null + } + this.safeRemoveChild(a); + for (this.destroyShadows(); k && k.div && 0 === k.div.childNodes.length;) a = k.parentGroup, this.safeRemoveChild(k.div), delete k.div, k = a; + this.alignTo && m(this.renderer.alignedObjects, + this); + for (e in this) delete this[e]; + return null + }, + shadow: function(a, k, e) { + var v = [], + b, c, h = this.element, + D, x, m, y; + if (!a) this.destroyShadows(); + else if (!this.shadows) { + x = K(a.width, 3); + m = (a.opacity || .15) / x; + y = this.parentInverted ? "(-1,-1)" : "(" + K(a.offsetX, 1) + ", " + K(a.offsetY, 1) + ")"; + for (b = 1; b <= x; b++) c = h.cloneNode(0), D = 2 * x + 1 - 2 * b, r(c, { + isShadow: "true", + stroke: a.color || "#000000", + "stroke-opacity": m * b, + "stroke-width": D, + transform: "translate" + y, + fill: "none" + }), e && (r(c, "height", Math.max(r(c, "height") - D, 0)), c.cutHeight = D), k ? + k.element.appendChild(c) : h.parentNode.insertBefore(c, h), v.push(c); + this.shadows = v + } + return this + }, + destroyShadows: function() { + C(this.shadows || [], function(a) { + this.safeRemoveChild(a) + }, this); + this.shadows = void 0 + }, + xGetter: function(a) { + "circle" === this.element.nodeName && ("x" === a ? a = "cx" : "y" === a && (a = "cy")); + return this._defaultGetter(a) + }, + _defaultGetter: function(a) { + a = K(this[a], this.element ? this.element.getAttribute(a) : null, 0); + /^[\-0-9\.]+$/.test(a) && (a = parseFloat(a)); + return a + }, + dSetter: function(a, k, e) { + a && a.join && (a = + a.join(" ")); + /(NaN| {2}|^$)/.test(a) && (a = "M 0 0"); + e.setAttribute(k, a); + this[k] = a + }, + dashstyleSetter: function(a) { + var v, k = this["stroke-width"]; + "inherit" === k && (k = 1); + if (a = a && a.toLowerCase()) { + a = a.replace("shortdashdotdot", "3,1,1,1,1,1,").replace("shortdashdot", "3,1,1,1").replace("shortdot", "1,1,").replace("shortdash", "3,1,").replace("longdash", "8,3,").replace(/dot/g, "1,3,").replace("dash", "4,3,").replace(/,$/, "").split(","); + for (v = a.length; v--;) a[v] = I(a[v]) * k; + a = a.join(",").replace(/NaN/g, "none"); + this.element.setAttribute("stroke-dasharray", + a) + } + }, + alignSetter: function(a) { + this.element.setAttribute("text-anchor", { + left: "start", + center: "middle", + right: "end" + }[a]) + }, + opacitySetter: function(a, k, e) { + this[k] = a; + e.setAttribute(k, a) + }, + titleSetter: function(a) { + var v = this.element.getElementsByTagName("title")[0]; + v || (v = p.createElementNS(this.SVG_NS, "title"), this.element.appendChild(v)); + v.firstChild && v.removeChild(v.firstChild); + v.appendChild(p.createTextNode(String(K(a), "").replace(/<[^>]*>/g, ""))) + }, + textSetter: function(a) { + a !== this.textStr && (delete this.bBox, + this.textStr = a, this.added && this.renderer.buildText(this)) + }, + fillSetter: function(a, k, e) { + "string" === typeof a ? e.setAttribute(k, a) : a && this.colorGradient(a, k, e) + }, + visibilitySetter: function(a, k, e) { + "inherit" === a ? e.removeAttribute(k) : e.setAttribute(k, a) + }, + zIndexSetter: function(a, k) { + var v = this.renderer, + e = this.parentGroup, + b = (e || v).element || v.box, + c, h = this.element, + D; + c = this.added; + var x; + q(a) && (h.zIndex = a, a = +a, this[k] === a && (c = !1), this[k] = a); + if (c) { + (a = this.zIndex) && e && (e.handleZ = !0); + k = b.childNodes; + for (x = 0; x < k.length && + !D; x++) e = k[x], c = e.zIndex, e !== h && (I(c) > a || !q(a) && q(c) || 0 > a && !q(c) && b !== v.box) && (b.insertBefore(h, e), D = !0); + D || b.appendChild(h) + } + return D + }, + _defaultSetter: function(a, k, e) { + e.setAttribute(k, a) + } + }; + B.prototype.yGetter = B.prototype.xGetter; + B.prototype.translateXSetter = B.prototype.translateYSetter = B.prototype.rotationSetter = B.prototype.verticalAlignSetter = B.prototype.scaleXSetter = B.prototype.scaleYSetter = function(a, k) { + this[k] = a; + this.doTransform = !0 + }; + B.prototype["stroke-widthSetter"] = B.prototype.strokeSetter = function(a, + k, e) { + this[k] = a; + this.stroke && this["stroke-width"] ? (B.prototype.fillSetter.call(this, this.stroke, "stroke", e), e.setAttribute("stroke-width", this["stroke-width"]), this.hasStroke = !0) : "stroke-width" === k && 0 === a && this.hasStroke && (e.removeAttribute("stroke"), this.hasStroke = !1) + }; + A = a.SVGRenderer = function() { + this.init.apply(this, arguments) + }; + A.prototype = { + Element: B, + SVG_NS: N, + init: function(a, k, b, c, D, x) { + var v; + c = this.createElement("svg").attr({ + version: "1.1", + "class": "highcharts-root" + }).css(this.getStyle(c)); + v = c.element; + a.appendChild(v); - 1 === a.innerHTML.indexOf("xmlns") && r(v, "xmlns", this.SVG_NS); + this.isSVG = !0; + this.box = v; + this.boxWrapper = c; + this.alignedObjects = []; + this.url = (e || h) && p.getElementsByTagName("base").length ? O.location.href.replace(/#.*?$/, "").replace(/<[^>]*>/g, "").replace(/([\('\)])/g, "\\$1").replace(/ /g, "%20") : ""; + this.createElement("desc").add().element.appendChild(p.createTextNode("Created with Highcharts 5.0.7")); + this.defs = this.createElement("defs").add(); + this.allowHTML = x; + this.forExport = D; + this.gradients = {}; + this.cache = {}; + this.cacheKeys = []; + this.imgCount = 0; + this.setSize(k, b, !1); + var m; + e && a.getBoundingClientRect && (k = function() { + u(a, { + left: 0, + top: 0 + }); + m = a.getBoundingClientRect(); + u(a, { + left: Math.ceil(m.left) - m.left + "px", + top: Math.ceil(m.top) - m.top + "px" + }) + }, k(), this.unSubPixelFix = H(O, "resize", k)) + }, + getStyle: function(a) { + return this.style = t({ + fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif', + fontSize: "12px" + }, a) + }, + setStyle: function(a) { + this.boxWrapper.css(this.getStyle(a)) + }, + isHidden: function() { + return !this.boxWrapper.getBBox().width + }, + destroy: function() { + var a = this.defs; + this.box = null; + this.boxWrapper = this.boxWrapper.destroy(); + b(this.gradients || {}); + this.gradients = null; + a && (this.defs = a.destroy()); + this.unSubPixelFix && this.unSubPixelFix(); + return this.alignedObjects = null + }, + createElement: function(a) { + var k = new this.Element; + k.init(this, a); + return k + }, + draw: J, + getRadialAttr: function(a, k) { + return { + cx: a[0] - a[2] / 2 + k.cx * a[2], + cy: a[1] - a[2] / 2 + k.cy * a[2], + r: k.r * a[2] + } + }, + buildText: function(a) { + var k = a.element, + v = this, + e = v.forExport, + b = K(a.textStr, "").toString(), + h = -1 !== b.indexOf("\x3c"), + D = k.childNodes, + x, m, y, n, F = r(k, "x"), + d = a.styles, + t = a.textWidth, + w = d && d.lineHeight, + l = d && d.textOutline, + z = d && "ellipsis" === d.textOverflow, + f = d && "nowrap" === d.whiteSpace, + E = d && d.fontSize, + q, g = D.length, + d = t && !a.added && this.box, + J = function(a) { + var e; + e = /(px|em)$/.test(a && a.style.fontSize) ? a.style.fontSize : E || v.style.fontSize || 12; + return w ? I(w) : v.fontMetrics(e, a.getAttribute("style") ? a : k).h + }; + q = [b, z, f, w, l, E, t].join(); + if (q !== a.textCache) { + for (a.textCache = q; g--;) k.removeChild(D[g]); + h || l || z || t || -1 !== + b.indexOf(" ") ? (x = /<.*class="([^"]+)".*>/, m = /<.*style="([^"]+)".*>/, y = /<.*href="(http[^"]+)".*>/, d && d.appendChild(k), b = h ? b.replace(/<(b|strong)>/g, '\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g, '\x3cspan style\x3d"font-style:italic"\x3e').replace(//g, "\x3c/span\x3e").split(//g) : [b], b = c(b, function(a) { + return "" !== a + }), C(b, function(b, c) { + var h, D = 0; + b = b.replace(/^\s+|\s+$/g, "").replace(//g, "\x3c/span\x3e|||"); + h = b.split("|||"); + C(h, function(b) { + if ("" !== b || 1 === h.length) { + var d = {}, + w = p.createElementNS(v.SVG_NS, "tspan"), + l, E; + x.test(b) && (l = b.match(x)[1], r(w, "class", l)); + m.test(b) && (E = b.match(m)[1].replace(/(;| |^)color([ :])/, "$1fill$2"), r(w, "style", E)); + y.test(b) && !e && (r(w, "onclick", 'location.href\x3d"' + b.match(y)[1] + '"'), u(w, { + cursor: "pointer" + })); + b = (b.replace(/<(.|\n)*?>/g, "") || " ").replace(/</g, "\x3c").replace(/>/g, "\x3e"); + if (" " !== b) { + w.appendChild(p.createTextNode(b)); + D ? d.dx = 0 : c && null !== F && (d.x = F); + r(w, d); + k.appendChild(w); + !D && c && (!P && e && u(w, { + display: "block" + }), r(w, "dy", J(w))); + if (t) { + d = b.replace(/([^\^])-/g, "$1- ").split(" "); + l = 1 < h.length || c || 1 < d.length && !f; + for (var q, g, M = [], C = J(w), K = a.rotation, I = b, Q = I.length; + (l || z) && (d.length || M.length);) a.rotation = 0, q = a.getBBox(!0), g = q.width, !P && v.forExport && (g = v.measureSpanWidth(w.firstChild.data, a.styles)), q = g > t, void 0 === n && (n = q), z && n ? (Q /= 2, "" === I || !q && .5 > Q ? d = [] : (I = b.substring(0, I.length + (q ? -1 : 1) * Math.ceil(Q)), d = [I + (3 < t ? "\u2026" : "")], w.removeChild(w.firstChild))) : + q && 1 !== d.length ? (w.removeChild(w.firstChild), M.unshift(d.pop())) : (d = M, M = [], d.length && !f && (w = p.createElementNS(N, "tspan"), r(w, { + dy: C, + x: F + }), E && r(w, "style", E), k.appendChild(w)), g > t && (t = g)), d.length && w.appendChild(p.createTextNode(d.join(" ").replace(/- /g, "-"))); + a.rotation = K + } + D++ + } + } + }) + }), n && a.attr("title", a.textStr), d && d.removeChild(k), l && a.applyTextOutline && a.applyTextOutline(l)) : k.appendChild(p.createTextNode(b.replace(/</g, "\x3c").replace(/>/g, "\x3e"))) + } + }, + getContrast: function(a) { + a = f(a).rgba; + return 510 < + a[0] + a[1] + a[2] ? "#000000" : "#FFFFFF" + }, + button: function(a, k, e, b, c, h, D, m, d) { + var v = this.label(a, k, e, d, null, null, null, null, "button"), + n = 0; + v.attr(y({ + padding: 8, + r: 2 + }, c)); + var F, w, p, l; + c = y({ + fill: "#f7f7f7", + stroke: "#cccccc", + "stroke-width": 1, + style: { + color: "#333333", + cursor: "pointer", + fontWeight: "normal" + } + }, c); + F = c.style; + delete c.style; + h = y(c, { + fill: "#e6e6e6" + }, h); + w = h.style; + delete h.style; + D = y(c, { + fill: "#e6ebf5", + style: { + color: "#000000", + fontWeight: "bold" + } + }, D); + p = D.style; + delete D.style; + m = y(c, { + style: { + color: "#cccccc" + } + }, m); + l = m.style; + delete m.style; + H(v.element, x ? "mouseover" : "mouseenter", function() { + 3 !== n && v.setState(1) + }); + H(v.element, x ? "mouseout" : "mouseleave", function() { + 3 !== n && v.setState(n) + }); + v.setState = function(a) { + 1 !== a && (v.state = n = a); + v.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-" + ["normal", "hover", "pressed", "disabled"][a || 0]); + v.attr([c, h, D, m][a || 0]).css([F, w, p, l][a || 0]) + }; + v.attr(c).css(t({ + cursor: "default" + }, F)); + return v.on("click", function(a) { + 3 !== n && b.call(v, a) + }) + }, + crispLine: function(a, + k) { + a[1] === a[4] && (a[1] = a[4] = Math.round(a[1]) - k % 2 / 2); + a[2] === a[5] && (a[2] = a[5] = Math.round(a[2]) + k % 2 / 2); + return a + }, + path: function(a) { + var k = { + fill: "none" + }; + z(a) ? k.d = a : F(a) && t(k, a); + return this.createElement("path").attr(k) + }, + circle: function(a, k, e) { + a = F(a) ? a : { + x: a, + y: k, + r: e + }; + k = this.createElement("circle"); + k.xSetter = k.ySetter = function(a, k, e) { + e.setAttribute("c" + k, a) + }; + return k.attr(a) + }, + arc: function(a, k, e, b, c, h) { + F(a) && (k = a.y, e = a.r, b = a.innerR, c = a.start, h = a.end, a = a.x); + a = this.symbol("arc", a || 0, k || 0, e || 0, e || 0, { + innerR: b || + 0, + start: c || 0, + end: h || 0 + }); + a.r = e; + return a + }, + rect: function(a, k, e, b, c, h) { + c = F(a) ? a.r : c; + var v = this.createElement("rect"); + a = F(a) ? a : void 0 === a ? {} : { + x: a, + y: k, + width: Math.max(e, 0), + height: Math.max(b, 0) + }; + void 0 !== h && (a.strokeWidth = h, a = v.crisp(a)); + a.fill = "none"; + c && (a.r = c); + v.rSetter = function(a, k, e) { + r(e, { + rx: a, + ry: a + }) + }; + return v.attr(a) + }, + setSize: function(a, k, e) { + var b = this.alignedObjects, + v = b.length; + this.width = a; + this.height = k; + for (this.boxWrapper.animate({ + width: a, + height: k + }, { + step: function() { + this.attr({ + viewBox: "0 0 " + this.attr("width") + + " " + this.attr("height") + }) + }, + duration: K(e, !0) ? void 0 : 0 + }); v--;) b[v].align() + }, + g: function(a) { + var k = this.createElement("g"); + return a ? k.attr({ + "class": "highcharts-" + a + }) : k + }, + image: function(a, k, e, b, c) { + var v = { + preserveAspectRatio: "none" + }; + 1 < arguments.length && t(v, { + x: k, + y: e, + width: b, + height: c + }); + v = this.createElement("image").attr(v); + v.element.setAttributeNS ? v.element.setAttributeNS("http://www.w3.org/1999/xlink", "href", a) : v.element.setAttribute("hc-svg-href", a); + return v + }, + symbol: function(a, k, e, b, c, h) { + var v = this, + D, x = this.symbols[a], + m = q(k) && x && this.symbols[a](Math.round(k), Math.round(e), b, c, h), + y = /^url\((.*?)\)$/, + d, n; + x ? (D = this.path(m), D.attr("fill", "none"), t(D, { + symbolName: a, + x: k, + y: e, + width: b, + height: c + }), h && t(D, h)) : y.test(a) && (d = a.match(y)[1], D = this.image(d), D.imgwidth = K(S[d] && S[d].width, h && h.width), D.imgheight = K(S[d] && S[d].height, h && h.height), n = function() { + D.attr({ + width: D.width, + height: D.height + }) + }, C(["width", "height"], function(a) { + D[a + "Setter"] = function(a, k) { + var e = {}, + b = this["img" + k], + v = "width" === k ? "translateX" : "translateY"; + this[k] = a; + q(b) && (this.element && this.element.setAttribute(k, b), this.alignByTranslate || (e[v] = ((this[k] || 0) - b) / 2, this.attr(e))) + } + }), q(k) && D.attr({ + x: k, + y: e + }), D.isImg = !0, q(D.imgwidth) && q(D.imgheight) ? n() : (D.attr({ + width: 0, + height: 0 + }), l("img", { + onload: function() { + var a = g[v.chartIndex]; + 0 === this.width && (u(this, { + position: "absolute", + top: "-999em" + }), p.body.appendChild(this)); + S[d] = { + width: this.width, + height: this.height + }; + D.imgwidth = this.width; + D.imgheight = this.height; + D.element && n(); + this.parentNode && this.parentNode.removeChild(this); + v.imgCount--; + if (!v.imgCount && a && a.onload) a.onload() + }, + src: d + }), this.imgCount++)); + return D + }, + symbols: { + circle: function(a, k, e, b) { + return this.arc(a + e / 2, k + b / 2, e / 2, b / 2, { + start: 0, + end: 2 * Math.PI, + open: !1 + }) + }, + square: function(a, k, e, b) { + return ["M", a, k, "L", a + e, k, a + e, k + b, a, k + b, "Z"] + }, + triangle: function(a, k, e, b) { + return ["M", a + e / 2, k, "L", a + e, k + b, a, k + b, "Z"] + }, + "triangle-down": function(a, k, e, b) { + return ["M", a, k, "L", a + e, k, a + e / 2, k + b, "Z"] + }, + diamond: function(a, k, e, b) { + return ["M", a + e / 2, k, "L", a + e, k + b / 2, a + e / 2, k + b, a, k + b / 2, "Z"] + }, + arc: function(a, + k, e, b, c) { + var v = c.start, + h = c.r || e, + D = c.r || b || e, + x = c.end - .001; + e = c.innerR; + b = c.open; + var m = Math.cos(v), + d = Math.sin(v), + y = Math.cos(x), + x = Math.sin(x); + c = c.end - v < Math.PI ? 0 : 1; + h = ["M", a + h * m, k + D * d, "A", h, D, 0, c, 1, a + h * y, k + D * x]; + q(e) && h.push(b ? "M" : "L", a + e * y, k + e * x, "A", e, e, 0, c, 0, a + e * m, k + e * d); + h.push(b ? "" : "Z"); + return h + }, + callout: function(a, k, e, b, c) { + var h = Math.min(c && c.r || 0, e, b), + D = h + 6, + v = c && c.anchorX; + c = c && c.anchorY; + var x; + x = ["M", a + h, k, "L", a + e - h, k, "C", a + e, k, a + e, k, a + e, k + h, "L", a + e, k + b - h, "C", a + e, k + b, a + e, k + b, a + e - h, k + b, "L", a + h, k + b, "C", + a, k + b, a, k + b, a, k + b - h, "L", a, k + h, "C", a, k, a, k, a + h, k + ]; + v && v > e ? c > k + D && c < k + b - D ? x.splice(13, 3, "L", a + e, c - 6, a + e + 6, c, a + e, c + 6, a + e, k + b - h) : x.splice(13, 3, "L", a + e, b / 2, v, c, a + e, b / 2, a + e, k + b - h) : v && 0 > v ? c > k + D && c < k + b - D ? x.splice(33, 3, "L", a, c + 6, a - 6, c, a, c - 6, a, k + h) : x.splice(33, 3, "L", a, b / 2, v, c, a, b / 2, a, k + h) : c && c > b && v > a + D && v < a + e - D ? x.splice(23, 3, "L", v + 6, k + b, v, k + b + 6, v - 6, k + b, a + h, k + b) : c && 0 > c && v > a + D && v < a + e - D && x.splice(3, 3, "L", v - 6, k, v, k - 6, v + 6, k, e - h, k); + return x + } + }, + clipRect: function(k, e, b, c) { + var h = a.uniqueKey(), + D = this.createElement("clipPath").attr({ + id: h + }).add(this.defs); + k = this.rect(k, e, b, c, 0).add(D); + k.id = h; + k.clipPath = D; + k.count = 0; + return k + }, + text: function(a, k, e, b) { + var c = !P && this.forExport, + h = {}; + if (b && (this.allowHTML || !this.forExport)) return this.html(a, k, e); + h.x = Math.round(k || 0); + e && (h.y = Math.round(e)); + if (a || 0 === a) h.text = a; + a = this.createElement("text").attr(h); + c && a.css({ + position: "absolute" + }); + b || (a.xSetter = function(a, k, e) { + var b = e.getElementsByTagName("tspan"), + c, h = e.getAttribute(k), + D; + for (D = 0; D < b.length; D++) c = b[D], c.getAttribute(k) === h && c.setAttribute(k, a); + e.setAttribute(k, + a) + }); + return a + }, + fontMetrics: function(a, k) { + a = a || k && k.style && k.style.fontSize || this.style && this.style.fontSize; + a = /px/.test(a) ? I(a) : /em/.test(a) ? parseFloat(a) * (k ? this.fontMetrics(null, k.parentNode).f : 16) : 12; + k = 24 > a ? a + 3 : Math.round(1.2 * a); + return { + h: k, + b: Math.round(.8 * k), + f: a + } + }, + rotCorr: function(a, k, e) { + var b = a; + k && e && (b = Math.max(b * Math.cos(k * d), 4)); + return { + x: -a / 3 * Math.sin(k * d), + y: b + } + }, + label: function(a, e, b, c, h, D, x, m, d) { + var v = this, + n = v.g("button" !== d && "label"), + F = n.text = v.text("", 0, 0, x).attr({ + zIndex: 1 + }), + w, p, l = 0, + z = 3, + E = 0, + f, g, J, K, P, N = {}, + I, u, r = /^url\((.*?)\)$/.test(c), + M = r, + S, Q, R, O; + d && n.addClass("highcharts-" + d); + M = r; + S = function() { + return (I || 0) % 2 / 2 + }; + Q = function() { + var a = F.element.style, + k = {}; + p = (void 0 === f || void 0 === g || P) && q(F.textStr) && F.getBBox(); + n.width = (f || p.width || 0) + 2 * z + E; + n.height = (g || p.height || 0) + 2 * z; + u = z + v.fontMetrics(a && a.fontSize, F).b; + M && (w || (n.box = w = v.symbols[c] || r ? v.symbol(c) : v.rect(), w.addClass(("button" === d ? "" : "highcharts-label-box") + (d ? " highcharts-" + d + "-box" : "")), w.add(n), a = S(), k.x = a, k.y = (m ? -u : 0) + a), k.width = + Math.round(n.width), k.height = Math.round(n.height), w.attr(t(k, N)), N = {}) + }; + R = function() { + var a = E + z, + k; + k = m ? 0 : u; + q(f) && p && ("center" === P || "right" === P) && (a += { + center: .5, + right: 1 + }[P] * (f - p.width)); + if (a !== F.x || k !== F.y) F.attr("x", a), void 0 !== k && F.attr("y", k); + F.x = a; + F.y = k + }; + O = function(a, k) { + w ? w.attr(a, k) : N[a] = k + }; + n.onAdd = function() { + F.add(n); + n.attr({ + text: a || 0 === a ? a : "", + x: e, + y: b + }); + w && q(h) && n.attr({ + anchorX: h, + anchorY: D + }) + }; + n.widthSetter = function(a) { + f = a + }; + n.heightSetter = function(a) { + g = a + }; + n["text-alignSetter"] = function(a) { + P = a + }; + n.paddingSetter = function(a) { + q(a) && a !== z && (z = n.padding = a, R()) + }; + n.paddingLeftSetter = function(a) { + q(a) && a !== E && (E = a, R()) + }; + n.alignSetter = function(a) { + a = { + left: 0, + center: .5, + right: 1 + }[a]; + a !== l && (l = a, p && n.attr({ + x: J + })) + }; + n.textSetter = function(a) { + void 0 !== a && F.textSetter(a); + Q(); + R() + }; + n["stroke-widthSetter"] = function(a, k) { + a && (M = !0); + I = this["stroke-width"] = a; + O(k, a) + }; + n.strokeSetter = n.fillSetter = n.rSetter = function(a, k) { + "fill" === k && a && (M = !0); + O(k, a) + }; + n.anchorXSetter = function(a, k) { + h = a; + O(k, Math.round(a) - S() - J) + }; + n.anchorYSetter = + function(a, k) { + D = a; + O(k, a - K) + }; + n.xSetter = function(a) { + n.x = a; + l && (a -= l * ((f || p.width) + 2 * z)); + J = Math.round(a); + n.attr("translateX", J) + }; + n.ySetter = function(a) { + K = n.y = Math.round(a); + n.attr("translateY", K) + }; + var V = n.css; + return t(n, { + css: function(a) { + if (a) { + var k = {}; + a = y(a); + C(n.textProps, function(e) { + void 0 !== a[e] && (k[e] = a[e], delete a[e]) + }); + F.css(k) + } + return V.call(n, a) + }, + getBBox: function() { + return { + width: p.width + 2 * z, + height: p.height + 2 * z, + x: p.x - z, + y: p.y - z + } + }, + shadow: function(a) { + a && (Q(), w && w.shadow(a)); + return n + }, + destroy: function() { + k(n.element, + "mouseenter"); + k(n.element, "mouseleave"); + F && (F = F.destroy()); + w && (w = w.destroy()); + B.prototype.destroy.call(n); + n = v = Q = R = O = null + } + }) + } + }; + a.Renderer = A + })(L); + (function(a) { + var B = a.attr, + A = a.createElement, + H = a.css, + G = a.defined, + r = a.each, + g = a.extend, + f = a.isFirefox, + u = a.isMS, + l = a.isWebKit, + q = a.pInt, + d = a.SVGRenderer, + b = a.win, + p = a.wrap; + g(a.SVGElement.prototype, { + htmlCss: function(a) { + var b = this.element; + if (b = a && "SPAN" === b.tagName && a.width) delete a.width, this.textWidth = b, this.updateTransform(); + a && "ellipsis" === a.textOverflow && (a.whiteSpace = + "nowrap", a.overflow = "hidden"); + this.styles = g(this.styles, a); + H(this.element, a); + return this + }, + htmlGetBBox: function() { + var a = this.element; + "text" === a.nodeName && (a.style.position = "absolute"); + return { + x: a.offsetLeft, + y: a.offsetTop, + width: a.offsetWidth, + height: a.offsetHeight + } + }, + htmlUpdateTransform: function() { + if (this.added) { + var a = this.renderer, + b = this.element, + m = this.translateX || 0, + c = this.translateY || 0, + n = this.x || 0, + d = this.y || 0, + p = this.textAlign || "left", + e = { + left: 0, + center: .5, + right: 1 + }[p], + x = this.styles; + H(b, { + marginLeft: m, + marginTop: c + }); + this.shadows && r(this.shadows, function(a) { + H(a, { + marginLeft: m + 1, + marginTop: c + 1 + }) + }); + this.inverted && r(b.childNodes, function(e) { + a.invertChild(e, b) + }); + if ("SPAN" === b.tagName) { + var F = this.rotation, + w = q(this.textWidth), + h = x && x.whiteSpace, + y = [F, p, b.innerHTML, this.textWidth, this.textAlign].join(); + y !== this.cTT && (x = a.fontMetrics(b.style.fontSize).b, G(F) && this.setSpanRotation(F, e, x), H(b, { + width: "", + whiteSpace: h || "nowrap" + }), b.offsetWidth > w && /[ \-]/.test(b.textContent || b.innerText) && H(b, { + width: w + "px", + display: "block", + whiteSpace: h || + "normal" + }), this.getSpanCorrection(b.offsetWidth, x, e, F, p)); + H(b, { + left: n + (this.xCorr || 0) + "px", + top: d + (this.yCorr || 0) + "px" + }); + l && (x = b.offsetHeight); + this.cTT = y + } + } else this.alignOnAdd = !0 + }, + setSpanRotation: function(a, d, m) { + var c = {}, + n = u ? "-ms-transform" : l ? "-webkit-transform" : f ? "MozTransform" : b.opera ? "-o-transform" : ""; + c[n] = c.transform = "rotate(" + a + "deg)"; + c[n + (f ? "Origin" : "-origin")] = c.transformOrigin = 100 * d + "% " + m + "px"; + H(this.element, c) + }, + getSpanCorrection: function(a, b, m) { + this.xCorr = -a * m; + this.yCorr = -b + } + }); + g(d.prototype, { + html: function(a, b, m) { + var c = this.createElement("span"), + n = c.element, + d = c.renderer, + l = d.isSVG, + e = function(a, e) { + r(["opacity", "visibility"], function(b) { + p(a, b + "Setter", function(a, b, c, x) { + a.call(this, b, c, x); + e[c] = b + }) + }) + }; + c.textSetter = function(a) { + a !== n.innerHTML && delete this.bBox; + n.innerHTML = this.textStr = a; + c.htmlUpdateTransform() + }; + l && e(c, c.element.style); + c.xSetter = c.ySetter = c.alignSetter = c.rotationSetter = function(a, e) { + "align" === e && (e = "textAlign"); + c[e] = a; + c.htmlUpdateTransform() + }; + c.attr({ + text: a, + x: Math.round(b), + y: Math.round(m) + }).css({ + fontFamily: this.style.fontFamily, + fontSize: this.style.fontSize, + position: "absolute" + }); + n.style.whiteSpace = "nowrap"; + c.css = c.htmlCss; + l && (c.add = function(a) { + var b, x = d.box.parentNode, + h = []; + if (this.parentGroup = a) { + if (b = a.div, !b) { + for (; a;) h.push(a), a = a.parentGroup; + r(h.reverse(), function(a) { + var n, m = B(a.element, "class"); + m && (m = { + className: m + }); + b = a.div = a.div || A("div", m, { + position: "absolute", + left: (a.translateX || 0) + "px", + top: (a.translateY || 0) + "px", + display: a.display, + opacity: a.opacity, + pointerEvents: a.styles && + a.styles.pointerEvents + }, b || x); + n = b.style; + g(a, { + on: function() { + c.on.apply({ + element: h[0].div + }, arguments); + return a + }, + translateXSetter: function(e, k) { + n.left = e + "px"; + a[k] = e; + a.doTransform = !0 + }, + translateYSetter: function(e, k) { + n.top = e + "px"; + a[k] = e; + a.doTransform = !0 + } + }); + e(a, n) + }) + } + } else b = x; + b.appendChild(n); + c.added = !0; + c.alignOnAdd && c.htmlUpdateTransform(); + return c + }); + return c + } + }) + })(L); + (function(a) { + var B, A, H = a.createElement, + G = a.css, + r = a.defined, + g = a.deg2rad, + f = a.discardElement, + u = a.doc, + l = a.each, + q = a.erase, + d = a.extend; + B = a.extendClass; + var b = a.isArray, + p = a.isNumber, + C = a.isObject, + t = a.merge; + A = a.noop; + var m = a.pick, + c = a.pInt, + n = a.SVGElement, + E = a.SVGRenderer, + z = a.win; + a.svg || (A = { + docMode8: u && 8 === u.documentMode, + init: function(a, b) { + var e = ["\x3c", b, ' filled\x3d"f" stroked\x3d"f"'], + c = ["position: ", "absolute", ";"], + h = "div" === b; + ("shape" === b || h) && c.push("left:0;top:0;width:1px;height:1px;"); + c.push("visibility: ", h ? "hidden" : "visible"); + e.push(' style\x3d"', c.join(""), '"/\x3e'); + b && (e = h || "span" === b || "img" === b ? e.join("") : a.prepVML(e), this.element = H(e)); + this.renderer = + a + }, + add: function(a) { + var e = this.renderer, + b = this.element, + c = e.box, + h = a && a.inverted, + c = a ? a.element || a : c; + a && (this.parentGroup = a); + h && e.invertChild(b, c); + c.appendChild(b); + this.added = !0; + this.alignOnAdd && !this.deferUpdateTransform && this.updateTransform(); + if (this.onAdd) this.onAdd(); + this.className && this.attr("class", this.className); + return this + }, + updateTransform: n.prototype.htmlUpdateTransform, + setSpanRotation: function() { + var a = this.rotation, + b = Math.cos(a * g), + c = Math.sin(a * g); + G(this.element, { + filter: a ? ["progid:DXImageTransform.Microsoft.Matrix(M11\x3d", + b, ", M12\x3d", -c, ", M21\x3d", c, ", M22\x3d", b, ", sizingMethod\x3d'auto expand')" + ].join("") : "none" + }) + }, + getSpanCorrection: function(a, b, c, n, h) { + var e = n ? Math.cos(n * g) : 1, + x = n ? Math.sin(n * g) : 0, + d = m(this.elemHeight, this.element.offsetHeight), + F; + this.xCorr = 0 > e && -a; + this.yCorr = 0 > x && -d; + F = 0 > e * x; + this.xCorr += x * b * (F ? 1 - c : c); + this.yCorr -= e * b * (n ? F ? c : 1 - c : 1); + h && "left" !== h && (this.xCorr -= a * c * (0 > e ? -1 : 1), n && (this.yCorr -= d * c * (0 > x ? -1 : 1)), G(this.element, { + textAlign: h + })) + }, + pathToVML: function(a) { + for (var b = a.length, e = []; b--;) p(a[b]) ? e[b] = + Math.round(10 * a[b]) - 5 : "Z" === a[b] ? e[b] = "x" : (e[b] = a[b], !a.isArc || "wa" !== a[b] && "at" !== a[b] || (e[b + 5] === e[b + 7] && (e[b + 7] += a[b + 7] > a[b + 5] ? 1 : -1), e[b + 6] === e[b + 8] && (e[b + 8] += a[b + 8] > a[b + 6] ? 1 : -1))); + return e.join(" ") || "x" + }, + clip: function(a) { + var b = this, + e; + a ? (e = a.members, q(e, b), e.push(b), b.destroyClip = function() { + q(e, b) + }, a = a.getCSS(b)) : (b.destroyClip && b.destroyClip(), a = { + clip: b.docMode8 ? "inherit" : "rect(auto)" + }); + return b.css(a) + }, + css: n.prototype.htmlCss, + safeRemoveChild: function(a) { + a.parentNode && f(a) + }, + destroy: function() { + this.destroyClip && + this.destroyClip(); + return n.prototype.destroy.apply(this) + }, + on: function(a, b) { + this.element["on" + a] = function() { + var a = z.event; + a.target = a.srcElement; + b(a) + }; + return this + }, + cutOffPath: function(a, b) { + var e; + a = a.split(/[ ,]/); + e = a.length; + if (9 === e || 11 === e) a[e - 4] = a[e - 2] = c(a[e - 2]) - 10 * b; + return a.join(" ") + }, + shadow: function(a, b, n) { + var e = [], + h, d = this.element, + x = this.renderer, + p, F = d.style, + k, D = d.path, + l, t, z, f; + D && "string" !== typeof D.value && (D = "x"); + t = D; + if (a) { + z = m(a.width, 3); + f = (a.opacity || .15) / z; + for (h = 1; 3 >= h; h++) l = 2 * z + 1 - 2 * h, n && + (t = this.cutOffPath(D.value, l + .5)), k = ['\x3cshape isShadow\x3d"true" strokeweight\x3d"', l, '" filled\x3d"false" path\x3d"', t, '" coordsize\x3d"10 10" style\x3d"', d.style.cssText, '" /\x3e'], p = H(x.prepVML(k), null, { + left: c(F.left) + m(a.offsetX, 1), + top: c(F.top) + m(a.offsetY, 1) + }), n && (p.cutOff = l + 1), k = ['\x3cstroke color\x3d"', a.color || "#000000", '" opacity\x3d"', f * h, '"/\x3e'], H(x.prepVML(k), null, null, p), b ? b.element.appendChild(p) : d.parentNode.insertBefore(p, d), e.push(p); + this.shadows = e + } + return this + }, + updateShadows: A, + setAttr: function(a, b) { + this.docMode8 ? this.element[a] = b : this.element.setAttribute(a, b) + }, + classSetter: function(a) { + (this.added ? this.element : this).className = a + }, + dashstyleSetter: function(a, b, c) { + (c.getElementsByTagName("stroke")[0] || H(this.renderer.prepVML(["\x3cstroke/\x3e"]), null, null, c))[b] = a || "solid"; + this[b] = a + }, + dSetter: function(a, b, c) { + var e = this.shadows; + a = a || []; + this.d = a.join && a.join(" "); + c.path = a = this.pathToVML(a); + if (e) + for (c = e.length; c--;) e[c].path = e[c].cutOff ? this.cutOffPath(a, e[c].cutOff) : a; + this.setAttr(b, + a) + }, + fillSetter: function(a, b, c) { + var e = c.nodeName; + "SPAN" === e ? c.style.color = a : "IMG" !== e && (c.filled = "none" !== a, this.setAttr("fillcolor", this.renderer.color(a, c, b, this))) + }, + "fill-opacitySetter": function(a, b, c) { + H(this.renderer.prepVML(["\x3c", b.split("-")[0], ' opacity\x3d"', a, '"/\x3e']), null, null, c) + }, + opacitySetter: A, + rotationSetter: function(a, b, c) { + c = c.style; + this[b] = c[b] = a; + c.left = -Math.round(Math.sin(a * g) + 1) + "px"; + c.top = Math.round(Math.cos(a * g)) + "px" + }, + strokeSetter: function(a, b, c) { + this.setAttr("strokecolor", + this.renderer.color(a, c, b, this)) + }, + "stroke-widthSetter": function(a, b, c) { + c.stroked = !!a; + this[b] = a; + p(a) && (a += "px"); + this.setAttr("strokeweight", a) + }, + titleSetter: function(a, b) { + this.setAttr(b, a) + }, + visibilitySetter: function(a, b, c) { + "inherit" === a && (a = "visible"); + this.shadows && l(this.shadows, function(c) { + c.style[b] = a + }); + "DIV" === c.nodeName && (a = "hidden" === a ? "-999em" : 0, this.docMode8 || (c.style[b] = a ? "visible" : "hidden"), b = "top"); + c.style[b] = a + }, + xSetter: function(a, b, c) { + this[b] = a; + "x" === b ? b = "left" : "y" === b && (b = "top"); + this.updateClipping ? + (this[b] = a, this.updateClipping()) : c.style[b] = a + }, + zIndexSetter: function(a, b, c) { + c.style[b] = a + } + }, A["stroke-opacitySetter"] = A["fill-opacitySetter"], a.VMLElement = A = B(n, A), A.prototype.ySetter = A.prototype.widthSetter = A.prototype.heightSetter = A.prototype.xSetter, A = { + Element: A, + isIE8: -1 < z.navigator.userAgent.indexOf("MSIE 8.0"), + init: function(a, b, c) { + var e, h; + this.alignedObjects = []; + e = this.createElement("div").css({ + position: "relative" + }); + h = e.element; + a.appendChild(e.element); + this.isVML = !0; + this.box = h; + this.boxWrapper = + e; + this.gradients = {}; + this.cache = {}; + this.cacheKeys = []; + this.imgCount = 0; + this.setSize(b, c, !1); + if (!u.namespaces.hcv) { + u.namespaces.add("hcv", "urn:schemas-microsoft-com:vml"); + try { + u.createStyleSheet().cssText = "hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } " + } catch (y) { + u.styleSheets[0].cssText += "hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } " + } + } + }, + isHidden: function() { + return !this.box.offsetWidth + }, + clipRect: function(a, b, c, n) { + var e = this.createElement(), + m = C(a); + return d(e, { + members: [], + count: 0, + left: (m ? a.x : a) + 1, + top: (m ? a.y : b) + 1, + width: (m ? a.width : c) - 1, + height: (m ? a.height : n) - 1, + getCSS: function(a) { + var b = a.element, + c = b.nodeName, + k = a.inverted, + e = this.top - ("shape" === c ? b.offsetTop : 0), + h = this.left, + b = h + this.width, + n = e + this.height, + e = { + clip: "rect(" + Math.round(k ? h : e) + "px," + Math.round(k ? n : b) + "px," + Math.round(k ? b : n) + "px," + Math.round(k ? e : h) + "px)" + }; + !k && a.docMode8 && "DIV" === c && d(e, { + width: b + "px", + height: n + "px" + }); + return e + }, + updateClipping: function() { + l(e.members, + function(a) { + a.element && a.css(e.getCSS(a)) + }) + } + }) + }, + color: function(b, c, n, m) { + var e = this, + d, x = /^rgba/, + p, t, k = "none"; + b && b.linearGradient ? t = "gradient" : b && b.radialGradient && (t = "pattern"); + if (t) { + var D, w, z = b.linearGradient || b.radialGradient, + f, E, v, q, g, F = ""; + b = b.stops; + var C, u = [], + r = function() { + p = ['\x3cfill colors\x3d"' + u.join(",") + '" opacity\x3d"', v, '" o:opacity2\x3d"', E, '" type\x3d"', t, '" ', F, 'focus\x3d"100%" method\x3d"any" /\x3e']; + H(e.prepVML(p), null, null, c) + }; + f = b[0]; + C = b[b.length - 1]; + 0 < f[0] && b.unshift([0, f[1]]); + 1 > + C[0] && b.push([1, C[1]]); + l(b, function(k, b) { + x.test(k[1]) ? (d = a.color(k[1]), D = d.get("rgb"), w = d.get("a")) : (D = k[1], w = 1); + u.push(100 * k[0] + "% " + D); + b ? (v = w, q = D) : (E = w, g = D) + }); + if ("fill" === n) + if ("gradient" === t) n = z.x1 || z[0] || 0, b = z.y1 || z[1] || 0, f = z.x2 || z[2] || 0, z = z.y2 || z[3] || 0, F = 'angle\x3d"' + (90 - 180 * Math.atan((z - b) / (f - n)) / Math.PI) + '"', r(); + else { + var k = z.r, + A = 2 * k, + B = 2 * k, + G = z.cx, + U = z.cy, + L = c.radialReference, + T, k = function() { + L && (T = m.getBBox(), G += (L[0] - T.x) / T.width - .5, U += (L[1] - T.y) / T.height - .5, A *= L[2] / T.width, B *= L[2] / T.height); + F = + 'src\x3d"' + a.getOptions().global.VMLRadialGradientURL + '" size\x3d"' + A + "," + B + '" origin\x3d"0.5,0.5" position\x3d"' + G + "," + U + '" color2\x3d"' + g + '" '; + r() + }; + m.added ? k() : m.onAdd = k; + k = q + } + else k = D + } else x.test(b) && "IMG" !== c.tagName ? (d = a.color(b), m[n + "-opacitySetter"](d.get("a"), n, c), k = d.get("rgb")) : (k = c.getElementsByTagName(n), k.length && (k[0].opacity = 1, k[0].type = "solid"), k = b); + return k + }, + prepVML: function(a) { + var b = this.isIE8; + a = a.join(""); + b ? (a = a.replace("/\x3e", ' xmlns\x3d"urn:schemas-microsoft-com:vml" /\x3e'), a = -1 === a.indexOf('style\x3d"') ? a.replace("/\x3e", ' style\x3d"display:inline-block;behavior:url(#default#VML);" /\x3e') : a.replace('style\x3d"', 'style\x3d"display:inline-block;behavior:url(#default#VML);')) : a = a.replace("\x3c", "\x3chcv:"); + return a + }, + text: E.prototype.html, + path: function(a) { + var c = { + coordsize: "10 10" + }; + b(a) ? c.d = a : C(a) && d(c, a); + return this.createElement("shape").attr(c) + }, + circle: function(a, b, c) { + var e = this.symbol("circle"); + C(a) && (c = a.r, b = a.y, a = a.x); + e.isCircle = !0; + e.r = c; + return e.attr({ + x: a, + y: b + }) + }, + g: function(a) { + var b; + a && (b = { + className: "highcharts-" + a, + "class": "highcharts-" + a + }); + return this.createElement("div").attr(b) + }, + image: function(a, b, c, n, h) { + var e = this.createElement("img").attr({ + src: a + }); + 1 < arguments.length && e.attr({ + x: b, + y: c, + width: n, + height: h + }); + return e + }, + createElement: function(a) { + return "rect" === a ? this.symbol(a) : E.prototype.createElement.call(this, a) + }, + invertChild: function(a, b) { + var e = this; + b = b.style; + var n = "IMG" === a.tagName && a.style; + G(a, { + flip: "x", + left: c(b.width) - (n ? c(n.top) : 1), + top: c(b.height) - (n ? c(n.left) : 1), + rotation: -90 + }); + l(a.childNodes, function(b) { + e.invertChild(b, a) + }) + }, + symbols: { + arc: function(a, b, c, n, h) { + var e = h.start, + m = h.end, + d = h.r || c || n; + c = h.innerR; + n = Math.cos(e); + var p = Math.sin(e), + k = Math.cos(m), + D = Math.sin(m); + if (0 === m - e) return ["x"]; + e = ["wa", a - d, b - d, a + d, b + d, a + d * n, b + d * p, a + d * k, b + d * D]; + h.open && !c && e.push("e", "M", a, b); + e.push("at", a - c, b - c, a + c, b + c, a + c * k, b + c * D, a + c * n, b + c * p, "x", "e"); + e.isArc = !0; + return e + }, + circle: function(a, b, c, n, h) { + h && r(h.r) && (c = n = 2 * h.r); + h && h.isCircle && (a -= c / 2, b -= n / 2); + return ["wa", a, b, a + c, b + n, a + c, b + n / 2, a + c, b + n / 2, "e"] + }, + rect: function(a, b, c, n, h) { + return E.prototype.symbols[r(h) && h.r ? "callout" : "square"].call(0, a, b, c, n, h) + } + } + }, a.VMLRenderer = B = function() { + this.init.apply(this, arguments) + }, B.prototype = t(E.prototype, A), a.Renderer = B); + E.prototype.measureSpanWidth = function(a, b) { + var c = u.createElement("span"); + a = u.createTextNode(a); + c.appendChild(a); + G(c, b); + this.box.appendChild(c); + b = c.offsetWidth; + f(c); + return b + } + })(L); + (function(a) { + function B() { + var l = a.defaultOptions.global, + f = u.moment; + if (l.timezone) { + if (f) return function(a) { + return -f.tz(a, + l.timezone).utcOffset() + }; + a.error(25) + } + return l.useUTC && l.getTimezoneOffset + } + + function A() { + var l = a.defaultOptions.global, + q, d = l.useUTC, + b = d ? "getUTC" : "get", + p = d ? "setUTC" : "set"; + a.Date = q = l.Date || u.Date; + q.hcTimezoneOffset = d && l.timezoneOffset; + q.hcGetTimezoneOffset = B(); + q.hcMakeTime = function(a, b, m, c, n, p) { + var l; + d ? (l = q.UTC.apply(0, arguments), l += r(l)) : l = (new q(a, b, f(m, 1), f(c, 0), f(n, 0), f(p, 0))).getTime(); + return l + }; + G("Minutes Hours Day Date Month FullYear".split(" "), function(a) { + q["hcGet" + a] = b + a + }); + G("Milliseconds Seconds Minutes Hours Date Month FullYear".split(" "), + function(a) { + q["hcSet" + a] = p + a + }) + } + var H = a.color, + G = a.each, + r = a.getTZOffset, + g = a.merge, + f = a.pick, + u = a.win; + a.defaultOptions = { + colors: "#00C0EF #F56954 #2FB628 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" "), + symbols: ["circle", "diamond", "square", "triangle", "triangle-down"], + lang: { + loading: "Loading...", + months: "January February March April May June July August September October November December".split(" "), + shortMonths: "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "), + weekdays: "Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "), + decimalPoint: ".", + numericSymbols: "kMGTPE".split(""), + resetZoom: "Reset zoom", + resetZoomTitle: "Reset zoom level 1:1", + thousandsSep: " " + }, + global: { + useUTC: !0, + VMLRadialGradientURL: "http://code.highcharts.com/5.0.7/gfx/vml-radial-gradient.png" + }, + chart: { + borderRadius: 0, + defaultSeriesType: "line", + ignoreHiddenSeries: !0, + spacing: [10, 10, 15, 10], + resetZoomButton: { + theme: { + zIndex: 20 + }, + position: { + align: "right", + x: -10, + y: 10 + } + }, + width: null, + height: null, + borderColor: "#335cad", + backgroundColor: "#ffffff", + plotBorderColor: "#cccccc" + }, + title: { + text: "Chart title", + align: "center", + margin: 15, + widthAdjust: -44 + }, + subtitle: { + text: "", + align: "center", + widthAdjust: -44 + }, + plotOptions: {}, + labels: { + style: { + position: "absolute", + color: "#333333" + } + }, + legend: { + enabled: !0, + align: "center", + layout: "horizontal", + labelFormatter: function() { + return this.name + }, + borderColor: "#999999", + borderRadius: 0, + navigation: { + activeColor: "#003399", + inactiveColor: "#cccccc" + }, + itemStyle: { + color: "#333333", + fontSize: "12px", + fontWeight: "bold" + }, + itemHoverStyle: { + color: "#000000" + }, + itemHiddenStyle: { + color: "#cccccc" + }, + shadow: !1, + itemCheckboxStyle: { + position: "absolute", + width: "13px", + height: "13px" + }, + squareSymbol: !0, + symbolPadding: 5, + verticalAlign: "bottom", + x: 0, + y: 0, + title: { + style: { + fontWeight: "bold" + } + } + }, + loading: { + labelStyle: { + fontWeight: "bold", + position: "relative", + top: "45%" + }, + style: { + position: "absolute", + backgroundColor: "#ffffff", + opacity: .5, + textAlign: "center" + } + }, + tooltip: { + enabled: !0, + animation: a.svg, + borderRadius: 3, + dateTimeLabelFormats: { + millisecond: "%A, %b %e, %H:%M:%S.%L", + second: "%A, %b %e, %H:%M:%S", + minute: "%A, %b %e, %H:%M", + hour: "%A, %b %e, %H:%M", + day: "%A, %b %e, %Y", + week: "Week from %A, %b %e, %Y", + month: "%B %Y", + year: "%Y" + }, + footerFormat: "", + padding: 8, + snap: a.isTouchDevice ? 25 : 10, + backgroundColor: H("#f7f7f7").setOpacity(.85).get(), + borderWidth: 1, + headerFormat: '\x3cspan style\x3d"font-size: 10px"\x3e{point.key}\x3c/span\x3e\x3cbr/\x3e', + pointFormat: '\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e', + shadow: !0, + style: { + color: "#333333", + cursor: "default", + fontSize: "12px", + pointerEvents: "none", + whiteSpace: "nowrap" + } + }, + credits: { + enabled: !0, + href: "http://www.highcharts.com", + position: { + align: "right", + x: -10, + verticalAlign: "bottom", + y: -5 + }, + style: { + cursor: "pointer", + color: "#999999", + fontSize: "9px" + }, + text: "" + } + }; + a.setOptions = function(l) { + a.defaultOptions = g(!0, a.defaultOptions, l); + A(); + return a.defaultOptions + }; + a.getOptions = function() { + return a.defaultOptions + }; + a.defaultPlotOptions = a.defaultOptions.plotOptions; + A() + })(L); + (function(a) { + var B = a.arrayMax, + A = a.arrayMin, + H = a.defined, + G = a.destroyObjectProperties, + r = a.each, + g = a.erase, + f = a.merge, + u = a.pick; + a.PlotLineOrBand = function(a, f) { + this.axis = + a; + f && (this.options = f, this.id = f.id) + }; + a.PlotLineOrBand.prototype = { + render: function() { + var a = this, + q = a.axis, + d = q.horiz, + b = a.options, + p = b.label, + g = a.label, + t = b.to, + m = b.from, + c = b.value, + n = H(m) && H(t), + E = H(c), + z = a.svgElem, + e = !z, + x = [], + F, w = b.color, + h = u(b.zIndex, 0), + y = b.events, + x = { + "class": "highcharts-plot-" + (n ? "band " : "line ") + (b.className || "") + }, + J = {}, + K = q.chart.renderer, + I = n ? "bands" : "lines", + k = q.log2lin; + q.isLog && (m = k(m), t = k(t), c = k(c)); + E ? (x = { + stroke: w, + "stroke-width": b.width + }, b.dashStyle && (x.dashstyle = b.dashStyle)) : n && (w && (x.fill = + w), b.borderWidth && (x.stroke = b.borderColor, x["stroke-width"] = b.borderWidth)); + J.zIndex = h; + I += "-" + h; + (w = q[I]) || (q[I] = w = K.g("plot-" + I).attr(J).add()); + e && (a.svgElem = z = K.path().attr(x).add(w)); + if (E) x = q.getPlotLinePath(c, z.strokeWidth()); + else if (n) x = q.getPlotBandPath(m, t, b); + else return; + if (e && x && x.length) { + if (z.attr({ + d: x + }), y) + for (F in b = function(b) { + z.on(b, function(k) { + y[b].apply(a, [k]) + }) + }, y) b(F) + } else z && (x ? (z.show(), z.animate({ + d: x + })) : (z.hide(), g && (a.label = g = g.destroy()))); + p && H(p.text) && x && x.length && 0 < q.width && + 0 < q.height && !x.flat ? (p = f({ + align: d && n && "center", + x: d ? !n && 4 : 10, + verticalAlign: !d && n && "middle", + y: d ? n ? 16 : 10 : n ? 6 : -4, + rotation: d && !n && 90 + }, p), this.renderLabel(p, x, n, h)) : g && g.hide(); + return a + }, + renderLabel: function(a, f, d, b) { + var p = this.label, + l = this.axis.chart.renderer; + p || (p = { + align: a.textAlign || a.align, + rotation: a.rotation, + "class": "highcharts-plot-" + (d ? "band" : "line") + "-label " + (a.className || "") + }, p.zIndex = b, this.label = p = l.text(a.text, 0, 0, a.useHTML).attr(p).add(), p.css(a.style)); + b = [f[1], f[4], d ? f[6] : f[1]]; + f = [f[2], f[5], + d ? f[7] : f[2] + ]; + d = A(b); + l = A(f); + p.align(a, !1, { + x: d, + y: l, + width: B(b) - d, + height: B(f) - l + }); + p.show() + }, + destroy: function() { + g(this.axis.plotLinesAndBands, this); + delete this.axis; + G(this) + } + }; + a.AxisPlotLineOrBandExtension = { + getPlotBandPath: function(a, f) { + f = this.getPlotLinePath(f, null, null, !0); + (a = this.getPlotLinePath(a, null, null, !0)) && f ? (a.flat = a.toString() === f.toString(), a.push(f[4], f[5], f[1], f[2], "z")) : a = null; + return a + }, + addPlotBand: function(a) { + return this.addPlotBandOrLine(a, "plotBands") + }, + addPlotLine: function(a) { + return this.addPlotBandOrLine(a, + "plotLines") + }, + addPlotBandOrLine: function(f, g) { + var d = (new a.PlotLineOrBand(this, f)).render(), + b = this.userOptions; + d && (g && (b[g] = b[g] || [], b[g].push(f)), this.plotLinesAndBands.push(d)); + return d + }, + removePlotBandOrLine: function(a) { + for (var f = this.plotLinesAndBands, d = this.options, b = this.userOptions, p = f.length; p--;) f[p].id === a && f[p].destroy(); + r([d.plotLines || [], b.plotLines || [], d.plotBands || [], b.plotBands || []], function(b) { + for (p = b.length; p--;) b[p].id === a && g(b, b[p]) + }) + } + } + })(L); + (function(a) { + var B = a.correctFloat, + A = + a.defined, + H = a.destroyObjectProperties, + G = a.isNumber, + r = a.merge, + g = a.pick, + f = a.deg2rad; + a.Tick = function(a, f, g, d) { + this.axis = a; + this.pos = f; + this.type = g || ""; + this.isNew = !0; + g || d || this.addLabel() + }; + a.Tick.prototype = { + addLabel: function() { + var a = this.axis, + f = a.options, + q = a.chart, + d = a.categories, + b = a.names, + p = this.pos, + C = f.labels, + t = a.tickPositions, + m = p === t[0], + c = p === t[t.length - 1], + b = d ? g(d[p], b[p], p) : p, + d = this.label, + t = t.info, + n; + a.isDatetimeAxis && t && (n = f.dateTimeLabelFormats[t.higherRanks[p] || t.unitName]); + this.isFirst = m; + this.isLast = + c; + f = a.labelFormatter.call({ + axis: a, + chart: q, + isFirst: m, + isLast: c, + dateTimeLabelFormat: n, + value: a.isLog ? B(a.lin2log(b)) : b + }); + A(d) ? d && d.attr({ + text: f + }) : (this.labelLength = (this.label = d = A(f) && C.enabled ? q.renderer.text(f, 0, 0, C.useHTML).css(r(C.style)).add(a.labelGroup) : null) && d.getBBox().width, this.rotation = 0) + }, + getLabelSize: function() { + return this.label ? this.label.getBBox()[this.axis.horiz ? "height" : "width"] : 0 + }, + handleOverflow: function(a) { + var l = this.axis, + q = a.x, + d = l.chart.chartWidth, + b = l.chart.spacing, + p = g(l.labelLeft, + Math.min(l.pos, b[3])), + b = g(l.labelRight, Math.max(l.pos + l.len, d - b[1])), + C = this.label, + t = this.rotation, + m = { + left: 0, + center: .5, + right: 1 + }[l.labelAlign], + c = C.getBBox().width, + n = l.getSlotWidth(), + E = n, + z = 1, + e, x = {}; + if (t) 0 > t && q - m * c < p ? e = Math.round(q / Math.cos(t * f) - p) : 0 < t && q + m * c > b && (e = Math.round((d - q) / Math.cos(t * f))); + else if (d = q + (1 - m) * c, q - m * c < p ? E = a.x + E * (1 - m) - p : d > b && (E = b - a.x + E * m, z = -1), E = Math.min(n, E), E < n && "center" === l.labelAlign && (a.x += z * (n - E - m * (n - Math.min(c, E)))), c > E || l.autoRotation && (C.styles || {}).width) e = E; + e && (x.width = + e, (l.options.labels.style || {}).textOverflow || (x.textOverflow = "ellipsis"), C.css(x)) + }, + getPosition: function(a, f, g, d) { + var b = this.axis, + p = b.chart, + l = d && p.oldChartHeight || p.chartHeight; + return { + x: a ? b.translate(f + g, null, null, d) + b.transB : b.left + b.offset + (b.opposite ? (d && p.oldChartWidth || p.chartWidth) - b.right - b.left : 0), + y: a ? l - b.bottom + b.offset - (b.opposite ? b.height : 0) : l - b.translate(f + g, null, null, d) - b.transB + } + }, + getLabelPosition: function(a, g, q, d, b, p, C, t) { + var m = this.axis, + c = m.transA, + n = m.reversed, + E = m.staggerLines, + z = m.tickRotCorr || { + x: 0, + y: 0 + }, + e = b.y; + A(e) || (e = 0 === m.side ? q.rotation ? -8 : -q.getBBox().height : 2 === m.side ? z.y + 8 : Math.cos(q.rotation * f) * (z.y - q.getBBox(!1, 0).height / 2)); + a = a + b.x + z.x - (p && d ? p * c * (n ? -1 : 1) : 0); + g = g + e - (p && !d ? p * c * (n ? 1 : -1) : 0); + E && (q = C / (t || 1) % E, m.opposite && (q = E - q - 1), g += m.labelOffset / E * q); + return { + x: a, + y: Math.round(g) + } + }, + getMarkPath: function(a, f, g, d, b, p) { + return p.crispLine(["M", a, f, "L", a + (b ? 0 : -g), f + (b ? g : 0)], d) + }, + render: function(a, f, q) { + var d = this.axis, + b = d.options, + p = d.chart.renderer, + l = d.horiz, + t = this.type, + m = this.label, + c = this.pos, + n = b.labels, + E = this.gridLine, + z = t ? t + "Tick" : "tick", + e = d.tickSize(z), + x = this.mark, + F = !x, + w = n.step, + h = {}, + y = !0, + J = d.tickmarkOffset, + K = this.getPosition(l, c, J, f), + I = K.x, + K = K.y, + k = l && I === d.pos + d.len || !l && K === d.pos ? -1 : 1, + D = t ? t + "Grid" : "grid", + P = b[D + "LineWidth"], + N = b[D + "LineColor"], + r = b[D + "LineDashStyle"], + D = g(b[z + "Width"], !t && d.isXAxis ? 1 : 0), + z = b[z + "Color"]; + q = g(q, 1); + this.isActive = !0; + E || (h.stroke = N, h["stroke-width"] = P, r && (h.dashstyle = r), t || (h.zIndex = 1), f && (h.opacity = 0), this.gridLine = E = p.path().attr(h).addClass("highcharts-" + (t ? + t + "-" : "") + "grid-line").add(d.gridGroup)); + if (!f && E && (c = d.getPlotLinePath(c + J, E.strokeWidth() * k, f, !0))) E[this.isNew ? "attr" : "animate"]({ + d: c, + opacity: q + }); + e && (d.opposite && (e[0] = -e[0]), F && (this.mark = x = p.path().addClass("highcharts-" + (t ? t + "-" : "") + "tick").add(d.axisGroup), x.attr({ + stroke: z, + "stroke-width": D + })), x[F ? "attr" : "animate"]({ + d: this.getMarkPath(I, K, e[0], x.strokeWidth() * k, l, p), + opacity: q + })); + m && G(I) && (m.xy = K = this.getLabelPosition(I, K, m, l, n, J, a, w), this.isFirst && !this.isLast && !g(b.showFirstLabel, 1) || this.isLast && + !this.isFirst && !g(b.showLastLabel, 1) ? y = !1 : !l || d.isRadial || n.step || n.rotation || f || 0 === q || this.handleOverflow(K), w && a % w && (y = !1), y && G(K.y) ? (K.opacity = q, m[this.isNew ? "attr" : "animate"](K)) : m.attr("y", -9999), this.isNew = !1) + }, + destroy: function() { + H(this, this.axis) + } + } + })(L); + (function(a) { + var B = a.addEvent, + A = a.animObject, + H = a.arrayMax, + G = a.arrayMin, + r = a.AxisPlotLineOrBandExtension, + g = a.color, + f = a.correctFloat, + u = a.defaultOptions, + l = a.defined, + q = a.deg2rad, + d = a.destroyObjectProperties, + b = a.each, + p = a.extend, + C = a.fireEvent, + t = a.format, + m = a.getMagnitude, + c = a.grep, + n = a.inArray, + E = a.isArray, + z = a.isNumber, + e = a.isString, + x = a.merge, + F = a.normalizeTickInterval, + w = a.pick, + h = a.PlotLineOrBand, + y = a.removeEvent, + J = a.splat, + K = a.syncTimeout, + I = a.Tick; + a.Axis = function() { + this.init.apply(this, arguments) + }; + a.Axis.prototype = { + defaultOptions: { + dateTimeLabelFormats: { + millisecond: "%H:%M:%S.%L", + second: "%H:%M:%S", + minute: "%H:%M", + hour: "%H:%M", + day: "%e. %b", + week: "%e. %b", + month: "%b '%y", + year: "%Y" + }, + endOnTick: !1, + labels: { + enabled: !0, + style: { + color: "#666666", + cursor: "default", + fontSize: "11px" + }, + x: 0 + }, + minPadding: .01, + maxPadding: .01, + minorTickLength: 2, + minorTickPosition: "outside", + startOfWeek: 1, + startOnTick: !1, + tickLength: 10, + tickmarkPlacement: "between", + tickPixelInterval: 100, + tickPosition: "outside", + title: { + align: "middle", + style: { + color: "#666666" + } + }, + type: "linear", + minorGridLineColor: "#f2f2f2", + minorGridLineWidth: 1, + minorTickColor: "#999999", + lineColor: "#ccd6eb", + lineWidth: 1, + gridLineColor: "#e6e6e6", + tickColor: "#ccd6eb" + }, + defaultYAxisOptions: { + endOnTick: !0, + tickPixelInterval: 72, + showLastLabel: !0, + labels: { + x: -8 + }, + maxPadding: .05, + minPadding: .05, + startOnTick: !0, + title: { + rotation: 270, + text: "Values" + }, + stackLabels: { + enabled: !1, + formatter: function() { + return a.numberFormat(this.total, -1) + }, + style: { + fontSize: "11px", + fontWeight: "bold", + color: "#000000", + textOutline: "1px contrast" + } + }, + gridLineWidth: 1, + lineWidth: 0 + }, + defaultLeftAxisOptions: { + labels: { + x: -15 + }, + title: { + rotation: 270 + } + }, + defaultRightAxisOptions: { + labels: { + x: 15 + }, + title: { + rotation: 90 + } + }, + defaultBottomAxisOptions: { + labels: { + autoRotation: [-45], + x: 0 + }, + title: { + rotation: 0 + } + }, + defaultTopAxisOptions: { + labels: { + autoRotation: [-45], + x: 0 + }, + title: { + rotation: 0 + } + }, + init: function(a, b) { + var k = b.isX; + this.chart = a; + this.horiz = a.inverted ? !k : k; + this.isXAxis = k; + this.coll = this.coll || (k ? "xAxis" : "yAxis"); + this.opposite = b.opposite; + this.side = b.side || (this.horiz ? this.opposite ? 0 : 2 : this.opposite ? 1 : 3); + this.setOptions(b); + var c = this.options, + e = c.type; + this.labelFormatter = c.labels.formatter || this.defaultLabelFormatter; + this.userOptions = b; + this.minPixelPadding = 0; + this.reversed = c.reversed; + this.visible = !1 !== c.visible; + this.zoomEnabled = !1 !== c.zoomEnabled; + this.hasNames = + "category" === e || !0 === c.categories; + this.categories = c.categories || this.hasNames; + this.names = this.names || []; + this.isLog = "logarithmic" === e; + this.isDatetimeAxis = "datetime" === e; + this.isLinked = l(c.linkedTo); + this.ticks = {}; + this.labelEdge = []; + this.minorTicks = {}; + this.plotLinesAndBands = []; + this.alternateBands = {}; + this.len = 0; + this.minRange = this.userMinRange = c.minRange || c.maxZoom; + this.range = c.range; + this.offset = c.offset || 0; + this.stacks = {}; + this.oldStacks = {}; + this.stacksTouched = 0; + this.min = this.max = null; + this.crosshair = w(c.crosshair, + J(a.options.tooltip.crosshairs)[k ? 0 : 1], !1); + var h; + b = this.options.events; - 1 === n(this, a.axes) && (k ? a.axes.splice(a.xAxis.length, 0, this) : a.axes.push(this), a[this.coll].push(this)); + this.series = this.series || []; + a.inverted && k && void 0 === this.reversed && (this.reversed = !0); + this.removePlotLine = this.removePlotBand = this.removePlotBandOrLine; + for (h in b) B(this, h, b[h]); + this.isLog && (this.val2lin = this.log2lin, this.lin2val = this.lin2log) + }, + setOptions: function(a) { + this.options = x(this.defaultOptions, "yAxis" === this.coll && this.defaultYAxisOptions, [this.defaultTopAxisOptions, this.defaultRightAxisOptions, this.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side], x(u[this.coll], a)) + }, + defaultLabelFormatter: function() { + var b = this.axis, + c = this.value, + e = b.categories, + h = this.dateTimeLabelFormat, + n = u.lang, + d = n.numericSymbols, + n = n.numericSymbolMagnitude || 1E3, + v = d && d.length, + m, f = b.options.labels.format, + b = b.isLog ? c : b.tickInterval; + if (f) m = t(f, this); + else if (e) m = c; + else if (h) m = a.dateFormat(h, c); + else if (v && 1E3 <= b) + for (; v-- && void 0 === m;) e = Math.pow(n, v + 1), b >= + e && 0 === 10 * c % e && null !== d[v] && 0 !== c && (m = a.numberFormat(c / e, -1) + d[v]); + void 0 === m && (m = 1E4 <= Math.abs(c) ? a.numberFormat(c, -1) : a.numberFormat(c, -1, void 0, "")); + return m + }, + getSeriesExtremes: function() { + var a = this, + e = a.chart; + a.hasVisibleSeries = !1; + a.dataMin = a.dataMax = a.threshold = null; + a.softThreshold = !a.isXAxis; + a.buildStacks && a.buildStacks(); + b(a.series, function(b) { + if (b.visible || !e.options.chart.ignoreHiddenSeries) { + var k = b.options, + h = k.threshold, + D; + a.hasVisibleSeries = !0; + a.isLog && 0 >= h && (h = null); + if (a.isXAxis) k = b.xData, + k.length && (b = G(k), z(b) || b instanceof Date || (k = c(k, function(a) { + return z(a) + }), b = G(k)), a.dataMin = Math.min(w(a.dataMin, k[0]), b), a.dataMax = Math.max(w(a.dataMax, k[0]), H(k))); + else if (b.getExtremes(), D = b.dataMax, b = b.dataMin, l(b) && l(D) && (a.dataMin = Math.min(w(a.dataMin, b), b), a.dataMax = Math.max(w(a.dataMax, D), D)), l(h) && (a.threshold = h), !k.softThreshold || a.isLog) a.softThreshold = !1 + } + }) + }, + translate: function(a, b, c, e, h, n) { + var k = this.linkedParent || this, + D = 1, + m = 0, + d = e ? k.oldTransA : k.transA; + e = e ? k.oldMin : k.min; + var f = k.minPixelPadding; + h = (k.isOrdinal || k.isBroken || k.isLog && h) && k.lin2val; + d || (d = k.transA); + c && (D *= -1, m = k.len); + k.reversed && (D *= -1, m -= D * (k.sector || k.len)); + b ? (a = (a * D + m - f) / d + e, h && (a = k.lin2val(a))) : (h && (a = k.val2lin(a)), a = D * (a - e) * d + m + D * f + (z(n) ? d * n : 0)); + return a + }, + toPixels: function(a, b) { + return this.translate(a, !1, !this.horiz, null, !0) + (b ? 0 : this.pos) + }, + toValue: function(a, b) { + return this.translate(a - (b ? 0 : this.pos), !0, !this.horiz, null, !0) + }, + getPlotLinePath: function(a, b, c, e, h) { + var k = this.chart, + D = this.left, + n = this.top, + m, d, f = c && k.oldChartHeight || + k.chartHeight, + p = c && k.oldChartWidth || k.chartWidth, + y; + m = this.transB; + var t = function(a, b, k) { + if (a < b || a > k) e ? a = Math.min(Math.max(b, a), k) : y = !0; + return a + }; + h = w(h, this.translate(a, null, null, c)); + a = c = Math.round(h + m); + m = d = Math.round(f - h - m); + z(h) ? this.horiz ? (m = n, d = f - this.bottom, a = c = t(a, D, D + this.width)) : (a = D, c = p - this.right, m = d = t(m, n, n + this.height)) : y = !0; + return y && !e ? null : k.renderer.crispLine(["M", a, m, "L", c, d], b || 1) + }, + getLinearTickPositions: function(a, b, c) { + var k, e = f(Math.floor(b / a) * a), + h = f(Math.ceil(c / a) * a), + D = []; + if (b === + c && z(b)) return [b]; + for (b = e; b <= h;) { + D.push(b); + b = f(b + a); + if (b === k) break; + k = b + } + return D + }, + getMinorTickPositions: function() { + var a = this.options, + b = this.tickPositions, + c = this.minorTickInterval, + e = [], + h, n = this.pointRangePadding || 0; + h = this.min - n; + var n = this.max + n, + m = n - h; + if (m && m / c < this.len / 3) + if (this.isLog) + for (n = b.length, h = 1; h < n; h++) e = e.concat(this.getLogTickPositions(c, b[h - 1], b[h], !0)); + else if (this.isDatetimeAxis && "auto" === a.minorTickInterval) e = e.concat(this.getTimeTicks(this.normalizeTimeTickInterval(c), h, n, a.startOfWeek)); + else + for (b = h + (b[0] - h) % c; b <= n && b !== e[0]; b += c) e.push(b); + 0 !== e.length && this.trimTicks(e, a.startOnTick, a.endOnTick); + return e + }, + adjustForMinRange: function() { + var a = this.options, + c = this.min, + e = this.max, + h, n = this.dataMax - this.dataMin >= this.minRange, + m, v, d, f, p, y; + this.isXAxis && void 0 === this.minRange && !this.isLog && (l(a.min) || l(a.max) ? this.minRange = null : (b(this.series, function(a) { + f = a.xData; + for (v = p = a.xIncrement ? 1 : f.length - 1; 0 < v; v--) + if (d = f[v] - f[v - 1], void 0 === m || d < m) m = d + }), this.minRange = Math.min(5 * m, this.dataMax - this.dataMin))); + e - c < this.minRange && (y = this.minRange, h = (y - e + c) / 2, h = [c - h, w(a.min, c - h)], n && (h[2] = this.isLog ? this.log2lin(this.dataMin) : this.dataMin), c = H(h), e = [c + y, w(a.max, c + y)], n && (e[2] = this.isLog ? this.log2lin(this.dataMax) : this.dataMax), e = G(e), e - c < y && (h[0] = e - y, h[1] = w(a.min, e - y), c = H(h))); + this.min = c; + this.max = e + }, + getClosest: function() { + var a; + this.categories ? a = 1 : b(this.series, function(b) { + var k = b.closestPointRange, + c = b.visible || !b.chart.options.chart.ignoreHiddenSeries; + !b.noSharedTooltip && l(k) && c && (a = l(a) ? Math.min(a, k) : k) + }); + return a + }, + nameToX: function(a) { + var b = E(this.categories), + k = b ? this.categories : this.names, + c = a.options.x, + e; + a.series.requireSorting = !1; + l(c) || (c = !1 === this.options.uniqueNames ? a.series.autoIncrement() : n(a.name, k)); - 1 === c ? b || (e = k.length) : e = c; + this.names[e] = a.name; + return e + }, + updateNames: function() { + var a = this; + 0 < this.names.length && (this.names.length = 0, this.minRange = void 0, b(this.series || [], function(k) { + k.xIncrement = null; + if (!k.points || k.isDirtyData) k.processData(), k.generatePoints(); + b(k.points, function(b, c) { + var e; + b.options && (e = a.nameToX(b), e !== b.x && (b.x = e, k.xData[c] = e)) + }) + })) + }, + setAxisTranslation: function(a) { + var k = this, + c = k.max - k.min, + h = k.axisPointRange || 0, + n, m = 0, + d = 0, + f = k.linkedParent, + y = !!k.categories, + p = k.transA, + t = k.isXAxis; + if (t || y || h) n = k.getClosest(), f ? (m = f.minPointOffset, d = f.pointRangePadding) : b(k.series, function(a) { + var b = y ? 1 : t ? w(a.options.pointRange, n, 0) : k.axisPointRange || 0; + a = a.options.pointPlacement; + h = Math.max(h, b); + k.single || (m = Math.max(m, e(a) ? 0 : b / 2), d = Math.max(d, "on" === a ? 0 : b)) + }), f = k.ordinalSlope && n ? k.ordinalSlope / + n : 1, k.minPointOffset = m *= f, k.pointRangePadding = d *= f, k.pointRange = Math.min(h, c), t && (k.closestPointRange = n); + a && (k.oldTransA = p); + k.translationSlope = k.transA = p = k.len / (c + d || 1); + k.transB = k.horiz ? k.left : k.bottom; + k.minPixelPadding = p * m + }, + minFromRange: function() { + return this.max - this.range + }, + setTickInterval: function(k) { + var c = this, + e = c.chart, + h = c.options, + n = c.isLog, + d = c.log2lin, + v = c.isDatetimeAxis, + y = c.isXAxis, + p = c.isLinked, + t = h.maxPadding, + x = h.minPadding, + g = h.tickInterval, + E = h.tickPixelInterval, + q = c.categories, + J = c.threshold, + K = c.softThreshold, + I, r, u, A; + v || q || p || this.getTickAmount(); + u = w(c.userMin, h.min); + A = w(c.userMax, h.max); + p ? (c.linkedParent = e[c.coll][h.linkedTo], e = c.linkedParent.getExtremes(), c.min = w(e.min, e.dataMin), c.max = w(e.max, e.dataMax), h.type !== c.linkedParent.options.type && a.error(11, 1)) : (!K && l(J) && (c.dataMin >= J ? (I = J, x = 0) : c.dataMax <= J && (r = J, t = 0)), c.min = w(u, I, c.dataMin), c.max = w(A, r, c.dataMax)); + n && (!k && 0 >= Math.min(c.min, w(c.dataMin, c.min)) && a.error(10, 1), c.min = f(d(c.min), 15), c.max = f(d(c.max), 15)); + c.range && l(c.max) && + (c.userMin = c.min = u = Math.max(c.min, c.minFromRange()), c.userMax = A = c.max, c.range = null); + C(c, "foundExtremes"); + c.beforePadding && c.beforePadding(); + c.adjustForMinRange(); + !(q || c.axisPointRange || c.usePercentage || p) && l(c.min) && l(c.max) && (d = c.max - c.min) && (!l(u) && x && (c.min -= d * x), !l(A) && t && (c.max += d * t)); + z(h.floor) ? c.min = Math.max(c.min, h.floor) : z(h.softMin) && (c.min = Math.min(c.min, h.softMin)); + z(h.ceiling) ? c.max = Math.min(c.max, h.ceiling) : z(h.softMax) && (c.max = Math.max(c.max, h.softMax)); + K && l(c.dataMin) && (J = J || 0, !l(u) && + c.min < J && c.dataMin >= J ? c.min = J : !l(A) && c.max > J && c.dataMax <= J && (c.max = J)); + c.tickInterval = c.min === c.max || void 0 === c.min || void 0 === c.max ? 1 : p && !g && E === c.linkedParent.options.tickPixelInterval ? g = c.linkedParent.tickInterval : w(g, this.tickAmount ? (c.max - c.min) / Math.max(this.tickAmount - 1, 1) : void 0, q ? 1 : (c.max - c.min) * E / Math.max(c.len, E)); + y && !k && b(c.series, function(a) { + a.processData(c.min !== c.oldMin || c.max !== c.oldMax) + }); + c.setAxisTranslation(!0); + c.beforeSetTickPositions && c.beforeSetTickPositions(); + c.postProcessTickInterval && + (c.tickInterval = c.postProcessTickInterval(c.tickInterval)); + c.pointRange && !g && (c.tickInterval = Math.max(c.pointRange, c.tickInterval)); + k = w(h.minTickInterval, c.isDatetimeAxis && c.closestPointRange); + !g && c.tickInterval < k && (c.tickInterval = k); + v || n || g || (c.tickInterval = F(c.tickInterval, null, m(c.tickInterval), w(h.allowDecimals, !(.5 < c.tickInterval && 5 > c.tickInterval && 1E3 < c.max && 9999 > c.max)), !!this.tickAmount)); + this.tickAmount || (c.tickInterval = c.unsquish()); + this.setTickPositions() + }, + setTickPositions: function() { + var a = + this.options, + b, c = a.tickPositions, + e = a.tickPositioner, + h = a.startOnTick, + n = a.endOnTick, + m; + this.tickmarkOffset = this.categories && "between" === a.tickmarkPlacement && 1 === this.tickInterval ? .5 : 0; + this.minorTickInterval = "auto" === a.minorTickInterval && this.tickInterval ? this.tickInterval / 5 : a.minorTickInterval; + this.tickPositions = b = c && c.slice(); + !b && (b = this.isDatetimeAxis ? this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval, a.units), this.min, this.max, a.startOfWeek, this.ordinalPositions, this.closestPointRange, !0) : this.isLog ? this.getLogTickPositions(this.tickInterval, this.min, this.max) : this.getLinearTickPositions(this.tickInterval, this.min, this.max), b.length > this.len && (b = [b[0], b.pop()]), this.tickPositions = b, e && (e = e.apply(this, [this.min, this.max]))) && (this.tickPositions = b = e); + this.trimTicks(b, h, n); + this.isLinked || (this.min === this.max && l(this.min) && !this.tickAmount && (m = !0, this.min -= .5, this.max += .5), this.single = m, c || e || this.adjustTickAmount()) + }, + trimTicks: function(a, b, c) { + var k = a[0], + e = a[a.length - 1], + h = this.minPointOffset || + 0; + if (!this.isLinked) { + if (b) this.min = k; + else + for (; this.min - h > a[0];) a.shift(); + if (c) this.max = e; + else + for (; this.max + h < a[a.length - 1];) a.pop(); + 0 === a.length && l(k) && a.push((e + k) / 2) + } + }, + alignToOthers: function() { + var a = {}, + c, e = this.options; + !1 === this.chart.options.chart.alignTicks || !1 === e.alignTicks || this.isLog || b(this.chart[this.coll], function(b) { + var k = b.options, + k = [b.horiz ? k.left : k.top, k.width, k.height, k.pane].join(); + b.series.length && (a[k] ? c = !0 : a[k] = 1) + }); + return c + }, + getTickAmount: function() { + var a = this.options, + b = a.tickAmount, + c = a.tickPixelInterval; + !l(a.tickInterval) && this.len < c && !this.isRadial && !this.isLog && a.startOnTick && a.endOnTick && (b = 2); + !b && this.alignToOthers() && (b = Math.ceil(this.len / c) + 1); + 4 > b && (this.finalTickAmt = b, b = 5); + this.tickAmount = b + }, + adjustTickAmount: function() { + var a = this.tickInterval, + b = this.tickPositions, + c = this.tickAmount, + e = this.finalTickAmt, + h = b && b.length; + if (h < c) { + for (; b.length < c;) b.push(f(b[b.length - 1] + a)); + this.transA *= (h - 1) / (c - 1); + this.max = b[b.length - 1] + } else h > c && (this.tickInterval *= 2, this.setTickPositions()); + if (l(e)) { + for (a = c = b.length; a--;)(3 === e && 1 === a % 2 || 2 >= e && 0 < a && a < c - 1) && b.splice(a, 1); + this.finalTickAmt = void 0 + } + }, + setScale: function() { + var a, c; + this.oldMin = this.min; + this.oldMax = this.max; + this.oldAxisLength = this.len; + this.setAxisSize(); + c = this.len !== this.oldAxisLength; + b(this.series, function(b) { + if (b.isDirtyData || b.isDirty || b.xAxis.isDirty) a = !0 + }); + c || a || this.isLinked || this.forceRedraw || this.userMin !== this.oldUserMin || this.userMax !== this.oldUserMax || this.alignToOthers() ? (this.resetStacks && this.resetStacks(), this.forceRedraw = !1, this.getSeriesExtremes(), this.setTickInterval(), this.oldUserMin = this.userMin, this.oldUserMax = this.userMax, this.isDirty || (this.isDirty = c || this.min !== this.oldMin || this.max !== this.oldMax)) : this.cleanStacks && this.cleanStacks() + }, + setExtremes: function(a, c, e, h, n) { + var k = this, + m = k.chart; + e = w(e, !0); + b(k.series, function(a) { + delete a.kdTree + }); + n = p(n, { + min: a, + max: c + }); + C(k, "setExtremes", n, function() { + k.userMin = a; + k.userMax = c; + k.eventArgs = n; + e && m.redraw(h) + }) + }, + zoom: function(a, b) { + var c = this.dataMin, + k = this.dataMax, + e = this.options, + h = Math.min(c, w(e.min, c)), + e = Math.max(k, w(e.max, k)); + if (a !== this.min || b !== this.max) this.allowZoomOutside || (l(c) && (a < h && (a = h), a > e && (a = e)), l(k) && (b < h && (b = h), b > e && (b = e))), this.displayBtn = void 0 !== a || void 0 !== b, this.setExtremes(a, b, !1, void 0, { + trigger: "zoom" + }); + return !0 + }, + setAxisSize: function() { + var a = this.chart, + b = this.options, + c = b.offsets || [0, 0, 0, 0], + e = this.horiz, + h = w(b.width, a.plotWidth - c[3] + c[1]), + n = w(b.height, a.plotHeight - c[0] + c[2]), + m = w(b.top, a.plotTop + c[0]), + b = w(b.left, a.plotLeft + c[3]), + c = /%$/; + c.test(n) && (n = + Math.round(parseFloat(n) / 100 * a.plotHeight)); + c.test(m) && (m = Math.round(parseFloat(m) / 100 * a.plotHeight + a.plotTop)); + this.left = b; + this.top = m; + this.width = h; + this.height = n; + this.bottom = a.chartHeight - n - m; + this.right = a.chartWidth - h - b; + this.len = Math.max(e ? h : n, 0); + this.pos = e ? b : m + }, + getExtremes: function() { + var a = this.isLog, + b = this.lin2log; + return { + min: a ? f(b(this.min)) : this.min, + max: a ? f(b(this.max)) : this.max, + dataMin: this.dataMin, + dataMax: this.dataMax, + userMin: this.userMin, + userMax: this.userMax + } + }, + getThreshold: function(a) { + var b = + this.isLog, + c = this.lin2log, + k = b ? c(this.min) : this.min, + b = b ? c(this.max) : this.max; + null === a ? a = k : k > a ? a = k : b < a && (a = b); + return this.translate(a, 0, 1, 0, 1) + }, + autoLabelAlign: function(a) { + a = (w(a, 0) - 90 * this.side + 720) % 360; + return 15 < a && 165 > a ? "right" : 195 < a && 345 > a ? "left" : "center" + }, + tickSize: function(a) { + var b = this.options, + c = b[a + "Length"], + k = w(b[a + "Width"], "tick" === a && this.isXAxis ? 1 : 0); + if (k && c) return "inside" === b[a + "Position"] && (c = -c), [c, k] + }, + labelMetrics: function() { + return this.chart.renderer.fontMetrics(this.options.labels.style && + this.options.labels.style.fontSize, this.ticks[0] && this.ticks[0].label) + }, + unsquish: function() { + var a = this.options.labels, + c = this.horiz, + e = this.tickInterval, + h = e, + n = this.len / (((this.categories ? 1 : 0) + this.max - this.min) / e), + m, d = a.rotation, + f = this.labelMetrics(), + p, y = Number.MAX_VALUE, + t, x = function(a) { + a /= n || 1; + a = 1 < a ? Math.ceil(a) : 1; + return a * e + }; + c ? (t = !a.staggerLines && !a.step && (l(d) ? [d] : n < w(a.autoRotationLimit, 80) && a.autoRotation)) && b(t, function(a) { + var b; + if (a === d || a && -90 <= a && 90 >= a) p = x(Math.abs(f.h / Math.sin(q * a))), b = p + + Math.abs(a / 360), b < y && (y = b, m = a, h = p) + }) : a.step || (h = x(f.h)); + this.autoRotation = t; + this.labelRotation = w(m, d); + return h + }, + getSlotWidth: function() { + var a = this.chart, + b = this.horiz, + c = this.options.labels, + e = Math.max(this.tickPositions.length - (this.categories ? 0 : 1), 1), + h = a.margin[3]; + return b && 2 > (c.step || 0) && !c.rotation && (this.staggerLines || 1) * this.len / e || !b && (h && h - a.spacing[3] || .33 * a.chartWidth) + }, + renderUnsquish: function() { + var a = this.chart, + c = a.renderer, + h = this.tickPositions, + n = this.ticks, + m = this.options.labels, + d = this.horiz, + v = this.getSlotWidth(), + f = Math.max(1, Math.round(v - 2 * (m.padding || 5))), + p = {}, + y = this.labelMetrics(), + t = m.style && m.style.textOverflow, + g, z = 0, + E, w; + e(m.rotation) || (p.rotation = m.rotation || 0); + b(h, function(a) { + (a = n[a]) && a.labelLength > z && (z = a.labelLength) + }); + this.maxLabelLength = z; + if (this.autoRotation) z > f && z > y.h ? p.rotation = this.labelRotation : this.labelRotation = 0; + else if (v && (g = { + width: f + "px" + }, !t)) + for (g.textOverflow = "clip", E = h.length; !d && E--;) + if (w = h[E], f = n[w].label) f.styles && "ellipsis" === f.styles.textOverflow ? f.css({ + textOverflow: "clip" + }) : + n[w].labelLength > v && f.css({ + width: v + "px" + }), f.getBBox().height > this.len / h.length - (y.h - y.f) && (f.specCss = { + textOverflow: "ellipsis" + }); + p.rotation && (g = { + width: (z > .5 * a.chartHeight ? .33 * a.chartHeight : a.chartHeight) + "px" + }, t || (g.textOverflow = "ellipsis")); + if (this.labelAlign = m.align || this.autoLabelAlign(this.labelRotation)) p.align = this.labelAlign; + b(h, function(a) { + var b = (a = n[a]) && a.label; + b && (b.attr(p), g && b.css(x(g, b.specCss)), delete b.specCss, a.rotation = p.rotation) + }); + this.tickRotCorr = c.rotCorr(y.b, this.labelRotation || + 0, 0 !== this.side) + }, + hasData: function() { + return this.hasVisibleSeries || l(this.min) && l(this.max) && !!this.tickPositions + }, + addTitle: function(a) { + var b = this.chart.renderer, + c = this.horiz, + k = this.opposite, + e = this.options.title, + h; + this.axisTitle || ((h = e.textAlign) || (h = (c ? { + low: "left", + middle: "center", + high: "right" + } : { + low: k ? "right" : "left", + middle: "center", + high: k ? "left" : "right" + })[e.align]), this.axisTitle = b.text(e.text, 0, 0, e.useHTML).attr({ + zIndex: 7, + rotation: e.rotation || 0, + align: h + }).addClass("highcharts-axis-title").css(e.style).add(this.axisGroup), + this.axisTitle.isNew = !0); + this.axisTitle[a ? "show" : "hide"](!0) + }, + generateTick: function(a) { + var b = this.ticks; + b[a] ? b[a].addLabel() : b[a] = new I(this, a) + }, + getOffset: function() { + var a = this, + c = a.chart, + e = c.renderer, + h = a.options, + n = a.tickPositions, + m = a.ticks, + d = a.horiz, + f = a.side, + p = c.inverted ? [1, 0, 3, 2][f] : f, + y, t, x = 0, + g, z = 0, + E = h.title, + q = h.labels, + F = 0, + J = c.axisOffset, + c = c.clipOffset, + K = [-1, 1, 1, -1][f], + C, I = h.className, + r = a.axisParent, + u = this.tickSize("tick"); + y = a.hasData(); + a.showAxis = t = y || w(h.showEmpty, !0); + a.staggerLines = a.horiz && q.staggerLines; + a.axisGroup || (a.gridGroup = e.g("grid").attr({ + zIndex: h.gridZIndex || 1 + }).addClass("highcharts-" + this.coll.toLowerCase() + "-grid " + (I || "")).add(r), a.axisGroup = e.g("axis").attr({ + zIndex: h.zIndex || 2 + }).addClass("highcharts-" + this.coll.toLowerCase() + " " + (I || "")).add(r), a.labelGroup = e.g("axis-labels").attr({ + zIndex: q.zIndex || 7 + }).addClass("highcharts-" + a.coll.toLowerCase() + "-labels " + (I || "")).add(r)); + if (y || a.isLinked) b(n, function(b, c) { + a.generateTick(b, c) + }), a.renderUnsquish(), !1 === q.reserveSpace || 0 !== f && 2 !== f && { + 1: "left", + 3: "right" + }[f] !== a.labelAlign && "center" !== a.labelAlign || b(n, function(a) { + F = Math.max(m[a].getLabelSize(), F) + }), a.staggerLines && (F *= a.staggerLines, a.labelOffset = F * (a.opposite ? -1 : 1)); + else + for (C in m) m[C].destroy(), delete m[C]; + E && E.text && !1 !== E.enabled && (a.addTitle(t), t && (x = a.axisTitle.getBBox()[d ? "height" : "width"], g = E.offset, z = l(g) ? 0 : w(E.margin, d ? 5 : 10))); + a.renderLine(); + a.offset = K * w(h.offset, J[f]); + a.tickRotCorr = a.tickRotCorr || { + x: 0, + y: 0 + }; + e = 0 === f ? -a.labelMetrics().h : 2 === f ? a.tickRotCorr.y : 0; + z = Math.abs(F) + + z; + F && (z = z - e + K * (d ? w(q.y, a.tickRotCorr.y + 8 * K) : q.x)); + a.axisTitleMargin = w(g, z); + J[f] = Math.max(J[f], a.axisTitleMargin + x + K * a.offset, z, y && n.length && u ? u[0] : 0); + h = h.offset ? 0 : 2 * Math.floor(a.axisLine.strokeWidth() / 2); + c[p] = Math.max(c[p], h) + }, + getLinePath: function(a) { + var b = this.chart, + c = this.opposite, + k = this.offset, + e = this.horiz, + h = this.left + (c ? this.width : 0) + k, + k = b.chartHeight - this.bottom - (c ? this.height : 0) + k; + c && (a *= -1); + return b.renderer.crispLine(["M", e ? this.left : h, e ? k : this.top, "L", e ? b.chartWidth - this.right : h, e ? k : b.chartHeight - + this.bottom + ], a) + }, + renderLine: function() { + this.axisLine || (this.axisLine = this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup), this.axisLine.attr({ + stroke: this.options.lineColor, + "stroke-width": this.options.lineWidth, + zIndex: 7 + })) + }, + getTitlePosition: function() { + var a = this.horiz, + b = this.left, + c = this.top, + e = this.len, + h = this.options.title, + n = a ? b : c, + m = this.opposite, + d = this.offset, + f = h.x || 0, + p = h.y || 0, + y = this.chart.renderer.fontMetrics(h.style && h.style.fontSize, this.axisTitle).f, + e = { + low: n + (a ? 0 : e), + middle: n + e / 2, + high: n + (a ? e : 0) + }[h.align], + b = (a ? c + this.height : b) + (a ? 1 : -1) * (m ? -1 : 1) * this.axisTitleMargin + (2 === this.side ? y : 0); + return { + x: a ? e + f : b + (m ? this.width : 0) + d + f, + y: a ? b + p - (m ? this.height : 0) + d : e + p + } + }, + renderMinorTick: function(a) { + var b = this.chart.hasRendered && z(this.oldMin), + c = this.minorTicks; + c[a] || (c[a] = new I(this, a, "minor")); + b && c[a].isNew && c[a].render(null, !0); + c[a].render(null, !1, 1) + }, + renderTick: function(a, b) { + var c = this.isLinked, + e = this.ticks, + k = this.chart.hasRendered && z(this.oldMin); + if (!c || a >= this.min && a <= this.max) e[a] || + (e[a] = new I(this, a)), k && e[a].isNew && e[a].render(b, !0, .1), e[a].render(b) + }, + render: function() { + var a = this, + c = a.chart, + e = a.options, + n = a.isLog, + m = a.lin2log, + d = a.isLinked, + v = a.tickPositions, + f = a.axisTitle, + p = a.ticks, + y = a.minorTicks, + t = a.alternateBands, + x = e.stackLabels, + z = e.alternateGridColor, + g = a.tickmarkOffset, + E = a.axisLine, + w = a.showAxis, + l = A(c.renderer.globalAnimation), + q, F; + a.labelEdge.length = 0; + a.overlap = !1; + b([p, y, t], function(a) { + for (var b in a) a[b].isActive = !1 + }); + if (a.hasData() || d) a.minorTickInterval && !a.categories && b(a.getMinorTickPositions(), + function(b) { + a.renderMinorTick(b) + }), v.length && (b(v, function(b, c) { + a.renderTick(b, c) + }), g && (0 === a.min || a.single) && (p[-1] || (p[-1] = new I(a, -1, null, !0)), p[-1].render(-1))), z && b(v, function(b, e) { + F = void 0 !== v[e + 1] ? v[e + 1] + g : a.max - g; + 0 === e % 2 && b < a.max && F <= a.max + (c.polar ? -g : g) && (t[b] || (t[b] = new h(a)), q = b + g, t[b].options = { + from: n ? m(q) : q, + to: n ? m(F) : F, + color: z + }, t[b].render(), t[b].isActive = !0) + }), a._addedPlotLB || (b((e.plotLines || []).concat(e.plotBands || []), function(b) { + a.addPlotBandOrLine(b) + }), a._addedPlotLB = !0); + b([p, y, t], + function(a) { + var b, e, h = [], + k = l.duration; + for (b in a) a[b].isActive || (a[b].render(b, !1, 0), a[b].isActive = !1, h.push(b)); + K(function() { + for (e = h.length; e--;) a[h[e]] && !a[h[e]].isActive && (a[h[e]].destroy(), delete a[h[e]]) + }, a !== t && c.hasRendered && k ? k : 0) + }); + E && (E[E.isPlaced ? "animate" : "attr"]({ + d: this.getLinePath(E.strokeWidth()) + }), E.isPlaced = !0, E[w ? "show" : "hide"](!0)); + f && w && (f[f.isNew ? "attr" : "animate"](a.getTitlePosition()), f.isNew = !1); + x && x.enabled && a.renderStackTotals(); + a.isDirty = !1 + }, + redraw: function() { + this.visible && + (this.render(), b(this.plotLinesAndBands, function(a) { + a.render() + })); + b(this.series, function(a) { + a.isDirty = !0 + }) + }, + keepProps: "extKey hcEvents names series userMax userMin".split(" "), + destroy: function(a) { + var c = this, + e = c.stacks, + h, k = c.plotLinesAndBands, + m; + a || y(c); + for (h in e) d(e[h]), e[h] = null; + b([c.ticks, c.minorTicks, c.alternateBands], function(a) { + d(a) + }); + if (k) + for (a = k.length; a--;) k[a].destroy(); + b("stackTotalGroup axisLine axisTitle axisGroup gridGroup labelGroup cross".split(" "), function(a) { + c[a] && (c[a] = c[a].destroy()) + }); + for (m in c) c.hasOwnProperty(m) && -1 === n(m, c.keepProps) && delete c[m] + }, + drawCrosshair: function(a, b) { + var c, e = this.crosshair, + h = w(e.snap, !0), + k, n = this.cross; + a || (a = this.cross && this.cross.e); + this.crosshair && !1 !== (l(b) || !h) ? (h ? l(b) && (k = this.isXAxis ? b.plotX : this.len - b.plotY) : k = a && (this.horiz ? a.chartX - this.pos : this.len - a.chartY + this.pos), l(k) && (c = this.getPlotLinePath(b && (this.isXAxis ? b.x : w(b.stackY, b.y)), null, null, null, k) || null), l(c) ? (b = this.categories && !this.isRadial, n || (this.cross = n = this.chart.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-" + + (b ? "category " : "thin ") + e.className).attr({ + zIndex: w(e.zIndex, 2) + }).add(), n.attr({ + stroke: e.color || (b ? g("#ccd6eb").setOpacity(.25).get() : "#cccccc"), + "stroke-width": w(e.width, 1) + }), e.dashStyle && n.attr({ + dashstyle: e.dashStyle + })), n.show().attr({ + d: c + }), b && !e.width && n.attr({ + "stroke-width": this.transA + }), this.cross.e = a) : this.hideCrosshair()) : this.hideCrosshair() + }, + hideCrosshair: function() { + this.cross && this.cross.hide() + } + }; + p(a.Axis.prototype, r) + })(L); + (function(a) { + var B = a.Axis, + A = a.Date, + H = a.dateFormat, + G = a.defaultOptions, + r = a.defined, + g = a.each, + f = a.extend, + u = a.getMagnitude, + l = a.getTZOffset, + q = a.normalizeTickInterval, + d = a.pick, + b = a.timeUnits; + B.prototype.getTimeTicks = function(a, q, t, m) { + var c = [], + n = {}, + p = G.global.useUTC, + z, e = new A(q - l(q)), + x = A.hcMakeTime, + F = a.unitRange, + w = a.count, + h; + if (r(q)) { + e[A.hcSetMilliseconds](F >= b.second ? 0 : w * Math.floor(e.getMilliseconds() / w)); + if (F >= b.second) e[A.hcSetSeconds](F >= b.minute ? 0 : w * Math.floor(e.getSeconds() / w)); + if (F >= b.minute) e[A.hcSetMinutes](F >= b.hour ? 0 : w * Math.floor(e[A.hcGetMinutes]() / w)); + if (F >= b.hour) e[A.hcSetHours](F >= + b.day ? 0 : w * Math.floor(e[A.hcGetHours]() / w)); + if (F >= b.day) e[A.hcSetDate](F >= b.month ? 1 : w * Math.floor(e[A.hcGetDate]() / w)); + F >= b.month && (e[A.hcSetMonth](F >= b.year ? 0 : w * Math.floor(e[A.hcGetMonth]() / w)), z = e[A.hcGetFullYear]()); + if (F >= b.year) e[A.hcSetFullYear](z - z % w); + if (F === b.week) e[A.hcSetDate](e[A.hcGetDate]() - e[A.hcGetDay]() + d(m, 1)); + z = e[A.hcGetFullYear](); + m = e[A.hcGetMonth](); + var y = e[A.hcGetDate](), + J = e[A.hcGetHours](); + if (A.hcTimezoneOffset || A.hcGetTimezoneOffset) h = (!p || !!A.hcGetTimezoneOffset) && (t - q > 4 * b.month || + l(q) !== l(t)), e = e.getTime(), e = new A(e + l(e)); + p = e.getTime(); + for (q = 1; p < t;) c.push(p), p = F === b.year ? x(z + q * w, 0) : F === b.month ? x(z, m + q * w) : !h || F !== b.day && F !== b.week ? h && F === b.hour ? x(z, m, y, J + q * w) : p + F * w : x(z, m, y + q * w * (F === b.day ? 1 : 7)), q++; + c.push(p); + F <= b.hour && 1E4 > c.length && g(c, function(a) { + 0 === a % 18E5 && "000000000" === H("%H%M%S%L", a) && (n[a] = "day") + }) + } + c.info = f(a, { + higherRanks: n, + totalRange: F * w + }); + return c + }; + B.prototype.normalizeTimeTickInterval = function(a, d) { + var f = d || [ + ["millisecond", [1, 2, 5, 10, 20, 25, 50, 100, 200, 500]], + ["second", [1, 2, 5, 10, 15, 30]], + ["minute", [1, 2, 5, 10, 15, 30]], + ["hour", [1, 2, 3, 4, 6, 8, 12]], + ["day", [1, 2]], + ["week", [1, 2]], + ["month", [1, 2, 3, 4, 6]], + ["year", null] + ]; + d = f[f.length - 1]; + var m = b[d[0]], + c = d[1], + n; + for (n = 0; n < f.length && !(d = f[n], m = b[d[0]], c = d[1], f[n + 1] && a <= (m * c[c.length - 1] + b[f[n + 1][0]]) / 2); n++); + m === b.year && a < 5 * m && (c = [1, 2, 5]); + a = q(a / m, c, "year" === d[0] ? Math.max(u(a / m), 1) : 1); + return { + unitRange: m, + count: a, + unitName: d[0] + } + } + })(L); + (function(a) { + var B = a.Axis, + A = a.getMagnitude, + H = a.map, + G = a.normalizeTickInterval, + r = a.pick; + B.prototype.getLogTickPositions = + function(a, f, u, l) { + var g = this.options, + d = this.len, + b = this.lin2log, + p = this.log2lin, + C = []; + l || (this._minorAutoInterval = null); + if (.5 <= a) a = Math.round(a), C = this.getLinearTickPositions(a, f, u); + else if (.08 <= a) + for (var d = Math.floor(f), t, m, c, n, E, g = .3 < a ? [1, 2, 4] : .15 < a ? [1, 2, 4, 6, 8] : [1, 2, 3, 4, 5, 6, 7, 8, 9]; d < u + 1 && !E; d++) + for (m = g.length, t = 0; t < m && !E; t++) c = p(b(d) * g[t]), c > f && (!l || n <= u) && void 0 !== n && C.push(n), n > u && (E = !0), n = c; + else f = b(f), u = b(u), a = g[l ? "minorTickInterval" : "tickInterval"], a = r("auto" === a ? null : a, this._minorAutoInterval, + g.tickPixelInterval / (l ? 5 : 1) * (u - f) / ((l ? d / this.tickPositions.length : d) || 1)), a = G(a, null, A(a)), C = H(this.getLinearTickPositions(a, f, u), p), l || (this._minorAutoInterval = a / 5); + l || (this.tickInterval = a); + return C + }; + B.prototype.log2lin = function(a) { + return Math.log(a) / Math.LN10 + }; + B.prototype.lin2log = function(a) { + return Math.pow(10, a) + } + })(L); + (function(a) { + var B = a.dateFormat, + A = a.each, + H = a.extend, + G = a.format, + r = a.isNumber, + g = a.map, + f = a.merge, + u = a.pick, + l = a.splat, + q = a.syncTimeout, + d = a.timeUnits; + a.Tooltip = function() { + this.init.apply(this, + arguments) + }; + a.Tooltip.prototype = { + init: function(a, d) { + this.chart = a; + this.options = d; + this.crosshairs = []; + this.now = { + x: 0, + y: 0 + }; + this.isHidden = !0; + this.split = d.split && !a.inverted; + this.shared = d.shared || this.split + }, + cleanSplit: function(a) { + A(this.chart.series, function(b) { + var d = b && b.tt; + d && (!d.isActive || a ? b.tt = d.destroy() : d.isActive = !1) + }) + }, + getLabel: function() { + var a = this.chart.renderer, + d = this.options; + this.label || (this.split ? this.label = a.g("tooltip") : (this.label = a.label("", 0, 0, d.shape || "callout", null, null, d.useHTML, + null, "tooltip").attr({ + padding: d.padding, + r: d.borderRadius + }), this.label.attr({ + fill: d.backgroundColor, + "stroke-width": d.borderWidth + }).css(d.style).shadow(d.shadow)), this.label.attr({ + zIndex: 8 + }).add()); + return this.label + }, + update: function(a) { + this.destroy(); + this.init(this.chart, f(!0, this.options, a)) + }, + destroy: function() { + this.label && (this.label = this.label.destroy()); + this.split && this.tt && (this.cleanSplit(this.chart, !0), this.tt = this.tt.destroy()); + clearTimeout(this.hideTimer); + clearTimeout(this.tooltipTimeout) + }, + move: function(a, d, f, t) { + var b = this, + c = b.now, + n = !1 !== b.options.animation && !b.isHidden && (1 < Math.abs(a - c.x) || 1 < Math.abs(d - c.y)), + p = b.followPointer || 1 < b.len; + H(c, { + x: n ? (2 * c.x + a) / 3 : a, + y: n ? (c.y + d) / 2 : d, + anchorX: p ? void 0 : n ? (2 * c.anchorX + f) / 3 : f, + anchorY: p ? void 0 : n ? (c.anchorY + t) / 2 : t + }); + b.getLabel().attr(c); + n && (clearTimeout(this.tooltipTimeout), this.tooltipTimeout = setTimeout(function() { + b && b.move(a, d, f, t) + }, 32)) + }, + hide: function(a) { + var b = this; + clearTimeout(this.hideTimer); + a = u(a, this.options.hideDelay, 500); + this.isHidden || (this.hideTimer = + q(function() { + b.getLabel()[a ? "fadeOut" : "hide"](); + b.isHidden = !0 + }, a)) + }, + getAnchor: function(a, d) { + var b, f = this.chart, + m = f.inverted, + c = f.plotTop, + n = f.plotLeft, + p = 0, + z = 0, + e, x; + a = l(a); + b = a[0].tooltipPos; + this.followPointer && d && (void 0 === d.chartX && (d = f.pointer.normalize(d)), b = [d.chartX - f.plotLeft, d.chartY - c]); + b || (A(a, function(a) { + e = a.series.yAxis; + x = a.series.xAxis; + p += a.plotX + (!m && x ? x.left - n : 0); + z += (a.plotLow ? (a.plotLow + a.plotHigh) / 2 : a.plotY) + (!m && e ? e.top - c : 0) + }), p /= a.length, z /= a.length, b = [m ? f.plotWidth - z : p, this.shared && + !m && 1 < a.length && d ? d.chartY - c : m ? f.plotHeight - p : z + ]); + return g(b, Math.round) + }, + getPosition: function(a, d, f) { + var b = this.chart, + m = this.distance, + c = {}, + n = f.h || 0, + p, z = ["y", b.chartHeight, d, f.plotY + b.plotTop, b.plotTop, b.plotTop + b.plotHeight], + e = ["x", b.chartWidth, a, f.plotX + b.plotLeft, b.plotLeft, b.plotLeft + b.plotWidth], + x = !this.followPointer && u(f.ttBelow, !b.inverted === !!f.negative), + g = function(a, b, e, h, d, f) { + var k = e < h - m, + y = h + m + e < b, + p = h - m - e; + h += m; + if (x && y) c[a] = h; + else if (!x && k) c[a] = p; + else if (k) c[a] = Math.min(f - e, 0 > p - n ? p : p - n); + else if (y) c[a] = Math.max(d, h + n + e > b ? h : h + n); + else return !1 + }, + w = function(a, b, e, h) { + var k; + h < m || h > b - m ? k = !1 : c[a] = h < e / 2 ? 1 : h > b - e / 2 ? b - e - 2 : h - e / 2; + return k + }, + h = function(a) { + var b = z; + z = e; + e = b; + p = a + }, + y = function() { + !1 !== g.apply(0, z) ? !1 !== w.apply(0, e) || p || (h(!0), y()) : p ? c.x = c.y = 0 : (h(!0), y()) + }; + (b.inverted || 1 < this.len) && h(); + y(); + return c + }, + defaultFormatter: function(a) { + var b = this.points || l(this), + d; + d = [a.tooltipFooterHeaderFormatter(b[0])]; + d = d.concat(a.bodyFormatter(b)); + d.push(a.tooltipFooterHeaderFormatter(b[0], !0)); + return d + }, + refresh: function(a, + d) { + var b = this.chart, + f, m = this.options, + c, n, p = {}, + z = []; + f = m.formatter || this.defaultFormatter; + var p = b.hoverPoints, + e = this.shared; + clearTimeout(this.hideTimer); + this.followPointer = l(a)[0].series.tooltipOptions.followPointer; + n = this.getAnchor(a, d); + d = n[0]; + c = n[1]; + !e || a.series && a.series.noSharedTooltip ? p = a.getLabelConfig() : (b.hoverPoints = a, p && A(p, function(a) { + a.setState() + }), A(a, function(a) { + a.setState("hover"); + z.push(a.getLabelConfig()) + }), p = { + x: a[0].category, + y: a[0].y + }, p.points = z, a = a[0]); + this.len = z.length; + p = f.call(p, + this); + e = a.series; + this.distance = u(e.tooltipOptions.distance, 16); + !1 === p ? this.hide() : (f = this.getLabel(), this.isHidden && f.attr({ + opacity: 1 + }).show(), this.split ? this.renderSplit(p, b.hoverPoints) : (f.attr({ + text: p && p.join ? p.join("") : p + }), f.removeClass(/highcharts-color-[\d]+/g).addClass("highcharts-color-" + u(a.colorIndex, e.colorIndex)), f.attr({ + stroke: m.borderColor || a.color || e.color || "#666666" + }), this.updatePosition({ + plotX: d, + plotY: c, + negative: a.negative, + ttBelow: a.ttBelow, + h: n[2] || 0 + })), this.isHidden = !1) + }, + renderSplit: function(b, + d) { + var f = this, + p = [], + m = this.chart, + c = m.renderer, + n = !0, + g = this.options, + z, e = this.getLabel(); + A(b.slice(0, d.length + 1), function(a, b) { + b = d[b - 1] || { + isHeader: !0, + plotX: d[0].plotX + }; + var x = b.series || f, + h = x.tt, + y = b.series || {}, + t = "highcharts-color-" + u(b.colorIndex, y.colorIndex, "none"); + h || (x.tt = h = c.label(null, null, null, "callout").addClass("highcharts-tooltip-box " + t).attr({ + padding: g.padding, + r: g.borderRadius, + fill: g.backgroundColor, + stroke: b.color || y.color || "#333333", + "stroke-width": g.borderWidth + }).add(e)); + h.isActive = !0; + h.attr({ + text: a + }); + h.css(g.style); + a = h.getBBox(); + y = a.width + h.strokeWidth(); + b.isHeader ? (z = a.height, y = Math.max(0, Math.min(b.plotX + m.plotLeft - y / 2, m.chartWidth - y))) : y = b.plotX + m.plotLeft - u(g.distance, 16) - y; + 0 > y && (n = !1); + a = (b.series && b.series.yAxis && b.series.yAxis.pos) + (b.plotY || 0); + a -= m.plotTop; + p.push({ + target: b.isHeader ? m.plotHeight + z : a, + rank: b.isHeader ? 1 : 0, + size: x.tt.getBBox().height + 1, + point: b, + x: y, + tt: h + }) + }); + this.cleanSplit(); + a.distribute(p, m.plotHeight + z); + A(p, function(a) { + var b = a.point, + c = b.series; + a.tt.attr({ + visibility: void 0 === + a.pos ? "hidden" : "inherit", + x: n || b.isHeader ? a.x : b.plotX + m.plotLeft + u(g.distance, 16), + y: a.pos + m.plotTop, + anchorX: b.isHeader ? b.plotX + m.plotLeft : b.plotX + c.xAxis.pos, + anchorY: b.isHeader ? a.pos + m.plotTop - 15 : b.plotY + c.yAxis.pos + }) + }) + }, + updatePosition: function(a) { + var b = this.chart, + d = this.getLabel(), + d = (this.options.positioner || this.getPosition).call(this, d.width, d.height, a); + this.move(Math.round(d.x), Math.round(d.y || 0), a.plotX + b.plotLeft, a.plotY + b.plotTop) + }, + getDateFormat: function(a, f, g, t) { + var b = B("%m-%d %H:%M:%S.%L", + f), + c, n, p = { + millisecond: 15, + second: 12, + minute: 9, + hour: 6, + day: 3 + }, + z = "millisecond"; + for (n in d) { + if (a === d.week && +B("%w", f) === g && "00:00:00.000" === b.substr(6)) { + n = "week"; + break + } + if (d[n] > a) { + n = z; + break + } + if (p[n] && b.substr(p[n]) !== "01-01 00:00:00.000".substr(p[n])) break; + "week" !== n && (z = n) + } + n && (c = t[n]); + return c + }, + getXDateFormat: function(a, d, f) { + d = d.dateTimeLabelFormats; + var b = f && f.closestPointRange; + return (b ? this.getDateFormat(b, a.x, f.options.startOfWeek, d) : d.day) || d.year + }, + tooltipFooterHeaderFormatter: function(a, d) { + var b = d ? "footer" : + "header"; + d = a.series; + var f = d.tooltipOptions, + m = f.xDateFormat, + c = d.xAxis, + n = c && "datetime" === c.options.type && r(a.key), + b = f[b + "Format"]; + n && !m && (m = this.getXDateFormat(a, f, c)); + n && m && (b = b.replace("{point.key}", "{point.key:" + m + "}")); + return G(b, { + point: a, + series: d + }) + }, + bodyFormatter: function(a) { + return g(a, function(a) { + var b = a.series.tooltipOptions; + return (b.pointFormatter || a.point.tooltipFormatter).call(a.point, b.pointFormat) + }) + } + } + })(L); + (function(a) { + var B = a.addEvent, + A = a.attr, + H = a.charts, + G = a.color, + r = a.css, + g = a.defined, + f = + a.doc, + u = a.each, + l = a.extend, + q = a.fireEvent, + d = a.offset, + b = a.pick, + p = a.removeEvent, + C = a.splat, + t = a.Tooltip, + m = a.win; + a.Pointer = function(a, b) { + this.init(a, b) + }; + a.Pointer.prototype = { + init: function(a, d) { + this.options = d; + this.chart = a; + this.runChartClick = d.chart.events && !!d.chart.events.click; + this.pinchDown = []; + this.lastValidTouch = {}; + t && d.tooltip.enabled && (a.tooltip = new t(a, d.tooltip), this.followTouchMove = b(d.tooltip.followTouchMove, !0)); + this.setDOMEvents() + }, + zoomOption: function(a) { + var c = this.chart, + d = c.options.chart, + m = d.zoomType || + "", + c = c.inverted; + /touch/.test(a.type) && (m = b(d.pinchType, m)); + this.zoomX = a = /x/.test(m); + this.zoomY = m = /y/.test(m); + this.zoomHor = a && !c || m && c; + this.zoomVert = m && !c || a && c; + this.hasZoom = a || m + }, + normalize: function(a, b) { + var c, n; + a = a || m.event; + a.target || (a.target = a.srcElement); + n = a.touches ? a.touches.length ? a.touches.item(0) : a.changedTouches[0] : a; + b || (this.chartPosition = b = d(this.chart.container)); + void 0 === n.pageX ? (c = Math.max(a.x, a.clientX - b.left), b = a.y) : (c = n.pageX - b.left, b = n.pageY - b.top); + return l(a, { + chartX: Math.round(c), + chartY: Math.round(b) + }) + }, + getCoordinates: function(a) { + var b = { + xAxis: [], + yAxis: [] + }; + u(this.chart.axes, function(c) { + b[c.isXAxis ? "xAxis" : "yAxis"].push({ + axis: c, + value: c.toValue(a[c.horiz ? "chartX" : "chartY"]) + }) + }); + return b + }, + runPointActions: function(c) { + var d = this.chart, + m = d.series, + p = d.tooltip, + e = p ? p.shared : !1, + g = !0, + t = d.hoverPoint, + w = d.hoverSeries, + h, y, l, q = [], + r; + if (!e && !w) + for (h = 0; h < m.length; h++) + if (m[h].directTouch || !m[h].options.stickyTracking) m = []; + w && (e ? w.noSharedTooltip : w.directTouch) && t ? q = [t] : (e || !w || w.options.stickyTracking || + (m = [w]), u(m, function(a) { + y = a.noSharedTooltip && e; + l = !e && a.directTouch; + a.visible && !y && !l && b(a.options.enableMouseTracking, !0) && (r = a.searchPoint(c, !y && 1 === a.kdDimensions)) && r.series && q.push(r) + }), q.sort(function(a, b) { + var c = a.distX - b.distX, + h = a.dist - b.dist, + k = (b.series.group && b.series.group.zIndex) - (a.series.group && a.series.group.zIndex); + return 0 !== c && e ? c : 0 !== h ? h : 0 !== k ? k : a.series.index > b.series.index ? -1 : 1 + })); + if (e) + for (h = q.length; h--;)(q[h].x !== q[0].x || q[h].series.noSharedTooltip) && q.splice(h, 1); + if (q[0] && (q[0] !== + this.prevKDPoint || p && p.isHidden)) { + if (e && !q[0].series.noSharedTooltip) { + for (h = 0; h < q.length; h++) q[h].onMouseOver(c, q[h] !== (w && w.directTouch && t || q[0])); + q.length && p && p.refresh(q.sort(function(a, b) { + return a.series.index - b.series.index + }), c) + } else if (p && p.refresh(q[0], c), !w || !w.directTouch) q[0].onMouseOver(c); + this.prevKDPoint = q[0]; + g = !1 + } + g && (m = w && w.tooltipOptions.followPointer, p && m && !p.isHidden && (m = p.getAnchor([{}], c), p.updatePosition({ + plotX: m[0], + plotY: m[1] + }))); + this.unDocMouseMove || (this.unDocMouseMove = B(f, + "mousemove", + function(b) { + if (H[a.hoverChartIndex]) H[a.hoverChartIndex].pointer.onDocumentMouseMove(b) + })); + u(e ? q : [b(t, q[0])], function(a) { + u(d.axes, function(b) { + (!a || a.series && a.series[b.coll] === b) && b.drawCrosshair(c, a) + }) + }) + }, + reset: function(a, b) { + var c = this.chart, + d = c.hoverSeries, + e = c.hoverPoint, + n = c.hoverPoints, + m = c.tooltip, + f = m && m.shared ? n : e; + a && f && u(C(f), function(b) { + b.series.isCartesian && void 0 === b.plotX && (a = !1) + }); + if (a) m && f && (m.refresh(f), e && (e.setState(e.state, !0), u(c.axes, function(a) { + a.crosshair && a.drawCrosshair(null, + e) + }))); + else { + if (e) e.onMouseOut(); + n && u(n, function(a) { + a.setState() + }); + if (d) d.onMouseOut(); + m && m.hide(b); + this.unDocMouseMove && (this.unDocMouseMove = this.unDocMouseMove()); + u(c.axes, function(a) { + a.hideCrosshair() + }); + this.hoverX = this.prevKDPoint = c.hoverPoints = c.hoverPoint = null + } + }, + scaleGroups: function(a, b) { + var c = this.chart, + d; + u(c.series, function(e) { + d = a || e.getPlotBox(); + e.xAxis && e.xAxis.zoomEnabled && e.group && (e.group.attr(d), e.markerGroup && (e.markerGroup.attr(d), e.markerGroup.clip(b ? c.clipRect : null)), e.dataLabelsGroup && + e.dataLabelsGroup.attr(d)) + }); + c.clipRect.attr(b || c.clipBox) + }, + dragStart: function(a) { + var b = this.chart; + b.mouseIsDown = a.type; + b.cancelClick = !1; + b.mouseDownX = this.mouseDownX = a.chartX; + b.mouseDownY = this.mouseDownY = a.chartY + }, + drag: function(a) { + var b = this.chart, + c = b.options.chart, + d = a.chartX, + e = a.chartY, + m = this.zoomHor, + f = this.zoomVert, + p = b.plotLeft, + h = b.plotTop, + y = b.plotWidth, + g = b.plotHeight, + t, q = this.selectionMarker, + k = this.mouseDownX, + l = this.mouseDownY, + r = c.panKey && a[c.panKey + "Key"]; + q && q.touch || (d < p ? d = p : d > p + y && (d = p + y), e < + h ? e = h : e > h + g && (e = h + g), this.hasDragged = Math.sqrt(Math.pow(k - d, 2) + Math.pow(l - e, 2)), 10 < this.hasDragged && (t = b.isInsidePlot(k - p, l - h), b.hasCartesianSeries && (this.zoomX || this.zoomY) && t && !r && !q && (this.selectionMarker = q = b.renderer.rect(p, h, m ? 1 : y, f ? 1 : g, 0).attr({ + fill: c.selectionMarkerFill || G("#335cad").setOpacity(.25).get(), + "class": "highcharts-selection-marker", + zIndex: 7 + }).add()), q && m && (d -= k, q.attr({ + width: Math.abs(d), + x: (0 < d ? 0 : d) + k + })), q && f && (d = e - l, q.attr({ + height: Math.abs(d), + y: (0 < d ? 0 : d) + l + })), t && !q && c.panning && b.pan(a, + c.panning))) + }, + drop: function(a) { + var b = this, + c = this.chart, + d = this.hasPinched; + if (this.selectionMarker) { + var e = { + originalEvent: a, + xAxis: [], + yAxis: [] + }, + m = this.selectionMarker, + f = m.attr ? m.attr("x") : m.x, + p = m.attr ? m.attr("y") : m.y, + h = m.attr ? m.attr("width") : m.width, + y = m.attr ? m.attr("height") : m.height, + t; + if (this.hasDragged || d) u(c.axes, function(c) { + if (c.zoomEnabled && g(c.min) && (d || b[{ + xAxis: "zoomX", + yAxis: "zoomY" + }[c.coll]])) { + var m = c.horiz, + k = "touchend" === a.type ? c.minPixelPadding : 0, + n = c.toValue((m ? f : p) + k), + m = c.toValue((m ? f + h : p + + y) - k); + e[c.coll].push({ + axis: c, + min: Math.min(n, m), + max: Math.max(n, m) + }); + t = !0 + } + }), t && q(c, "selection", e, function(a) { + c.zoom(l(a, d ? { + animation: !1 + } : null)) + }); + this.selectionMarker = this.selectionMarker.destroy(); + d && this.scaleGroups() + } + c && (r(c.container, { + cursor: c._cursor + }), c.cancelClick = 10 < this.hasDragged, c.mouseIsDown = this.hasDragged = this.hasPinched = !1, this.pinchDown = []) + }, + onContainerMouseDown: function(a) { + a = this.normalize(a); + this.zoomOption(a); + a.preventDefault && a.preventDefault(); + this.dragStart(a) + }, + onDocumentMouseUp: function(b) { + H[a.hoverChartIndex] && + H[a.hoverChartIndex].pointer.drop(b) + }, + onDocumentMouseMove: function(a) { + var b = this.chart, + c = this.chartPosition; + a = this.normalize(a, c); + !c || this.inClass(a.target, "highcharts-tracker") || b.isInsidePlot(a.chartX - b.plotLeft, a.chartY - b.plotTop) || this.reset() + }, + onContainerMouseLeave: function(b) { + var c = H[a.hoverChartIndex]; + c && (b.relatedTarget || b.toElement) && (c.pointer.reset(), c.pointer.chartPosition = null) + }, + onContainerMouseMove: function(b) { + var c = this.chart; + g(a.hoverChartIndex) && H[a.hoverChartIndex] && H[a.hoverChartIndex].mouseIsDown || + (a.hoverChartIndex = c.index); + b = this.normalize(b); + b.returnValue = !1; + "mousedown" === c.mouseIsDown && this.drag(b); + !this.inClass(b.target, "highcharts-tracker") && !c.isInsidePlot(b.chartX - c.plotLeft, b.chartY - c.plotTop) || c.openMenu || this.runPointActions(b) + }, + inClass: function(a, b) { + for (var c; a;) { + if (c = A(a, "class")) { + if (-1 !== c.indexOf(b)) return !0; + if (-1 !== c.indexOf("highcharts-container")) return !1 + } + a = a.parentNode + } + }, + onTrackerMouseOut: function(a) { + var b = this.chart.hoverSeries; + a = a.relatedTarget || a.toElement; + if (!(!b || !a || + b.options.stickyTracking || this.inClass(a, "highcharts-tooltip") || this.inClass(a, "highcharts-series-" + b.index) && this.inClass(a, "highcharts-tracker"))) b.onMouseOut() + }, + onContainerClick: function(a) { + var b = this.chart, + c = b.hoverPoint, + d = b.plotLeft, + e = b.plotTop; + a = this.normalize(a); + b.cancelClick || (c && this.inClass(a.target, "highcharts-tracker") ? (q(c.series, "click", l(a, { + point: c + })), b.hoverPoint && c.firePointEvent("click", a)) : (l(a, this.getCoordinates(a)), b.isInsidePlot(a.chartX - d, a.chartY - e) && q(b, "click", a))) + }, + setDOMEvents: function() { + var b = + this, + d = b.chart.container; + d.onmousedown = function(a) { + b.onContainerMouseDown(a) + }; + d.onmousemove = function(a) { + b.onContainerMouseMove(a) + }; + d.onclick = function(a) { + b.onContainerClick(a) + }; + B(d, "mouseleave", b.onContainerMouseLeave); + 1 === a.chartCount && B(f, "mouseup", b.onDocumentMouseUp); + a.hasTouch && (d.ontouchstart = function(a) { + b.onContainerTouchStart(a) + }, d.ontouchmove = function(a) { + b.onContainerTouchMove(a) + }, 1 === a.chartCount && B(f, "touchend", b.onDocumentTouchEnd)) + }, + destroy: function() { + var b; + p(this.chart.container, "mouseleave", + this.onContainerMouseLeave); + a.chartCount || (p(f, "mouseup", this.onDocumentMouseUp), p(f, "touchend", this.onDocumentTouchEnd)); + clearInterval(this.tooltipTimeout); + for (b in this) this[b] = null + } + } + })(L); + (function(a) { + var B = a.charts, + A = a.each, + H = a.extend, + G = a.map, + r = a.noop, + g = a.pick; + H(a.Pointer.prototype, { + pinchTranslate: function(a, g, l, q, d, b) { + this.zoomHor && this.pinchTranslateDirection(!0, a, g, l, q, d, b); + this.zoomVert && this.pinchTranslateDirection(!1, a, g, l, q, d, b) + }, + pinchTranslateDirection: function(a, g, l, q, d, b, p, r) { + var f = + this.chart, + m = a ? "x" : "y", + c = a ? "X" : "Y", + n = "chart" + c, + E = a ? "width" : "height", + z = f["plot" + (a ? "Left" : "Top")], + e, x, F = r || 1, + w = f.inverted, + h = f.bounds[a ? "h" : "v"], + y = 1 === g.length, + J = g[0][n], + u = l[0][n], + I = !y && g[1][n], + k = !y && l[1][n], + D; + l = function() { + !y && 20 < Math.abs(J - I) && (F = r || Math.abs(u - k) / Math.abs(J - I)); + x = (z - u) / F + J; + e = f["plot" + (a ? "Width" : "Height")] / F + }; + l(); + g = x; + g < h.min ? (g = h.min, D = !0) : g + e > h.max && (g = h.max - e, D = !0); + D ? (u -= .8 * (u - p[m][0]), y || (k -= .8 * (k - p[m][1])), l()) : p[m] = [u, k]; + w || (b[m] = x - z, b[E] = e); + b = w ? 1 / F : F; + d[E] = e; + d[m] = g; + q[w ? a ? "scaleY" : + "scaleX" : "scale" + c] = F; + q["translate" + c] = b * z + (u - b * J) + }, + pinch: function(a) { + var f = this, + l = f.chart, + q = f.pinchDown, + d = a.touches, + b = d.length, + p = f.lastValidTouch, + C = f.hasZoom, + t = f.selectionMarker, + m = {}, + c = 1 === b && (f.inClass(a.target, "highcharts-tracker") && l.runTrackerClick || f.runChartClick), + n = {}; + 1 < b && (f.initiated = !0); + C && f.initiated && !c && a.preventDefault(); + G(d, function(a) { + return f.normalize(a) + }); + "touchstart" === a.type ? (A(d, function(a, b) { + q[b] = { + chartX: a.chartX, + chartY: a.chartY + } + }), p.x = [q[0].chartX, q[1] && q[1].chartX], p.y = [q[0].chartY, + q[1] && q[1].chartY + ], A(l.axes, function(a) { + if (a.zoomEnabled) { + var b = l.bounds[a.horiz ? "h" : "v"], + c = a.minPixelPadding, + d = a.toPixels(g(a.options.min, a.dataMin)), + m = a.toPixels(g(a.options.max, a.dataMax)), + f = Math.max(d, m); + b.min = Math.min(a.pos, Math.min(d, m) - c); + b.max = Math.max(a.pos + a.len, f + c) + } + }), f.res = !0) : f.followTouchMove && 1 === b ? this.runPointActions(f.normalize(a)) : q.length && (t || (f.selectionMarker = t = H({ + destroy: r, + touch: !0 + }, l.plotBox)), f.pinchTranslate(q, d, m, t, n, p), f.hasPinched = C, f.scaleGroups(m, n), f.res && (f.res = !1, this.reset(!1, 0))) + }, + touch: function(f, r) { + var l = this.chart, + q, d; + if (l.index !== a.hoverChartIndex) this.onContainerMouseLeave({ + relatedTarget: !0 + }); + a.hoverChartIndex = l.index; + 1 === f.touches.length ? (f = this.normalize(f), (d = l.isInsidePlot(f.chartX - l.plotLeft, f.chartY - l.plotTop)) && !l.openMenu ? (r && this.runPointActions(f), "touchmove" === f.type && (r = this.pinchDown, q = r[0] ? 4 <= Math.sqrt(Math.pow(r[0].chartX - f.chartX, 2) + Math.pow(r[0].chartY - f.chartY, 2)) : !1), g(q, !0) && this.pinch(f)) : r && this.reset()) : 2 === f.touches.length && + this.pinch(f) + }, + onContainerTouchStart: function(a) { + this.zoomOption(a); + this.touch(a, !0) + }, + onContainerTouchMove: function(a) { + this.touch(a) + }, + onDocumentTouchEnd: function(f) { + B[a.hoverChartIndex] && B[a.hoverChartIndex].pointer.drop(f) + } + }) + })(L); + (function(a) { + var B = a.addEvent, + A = a.charts, + H = a.css, + G = a.doc, + r = a.extend, + g = a.noop, + f = a.Pointer, + u = a.removeEvent, + l = a.win, + q = a.wrap; + if (l.PointerEvent || l.MSPointerEvent) { + var d = {}, + b = !!l.PointerEvent, + p = function() { + var a, b = []; + b.item = function(a) { + return this[a] + }; + for (a in d) d.hasOwnProperty(a) && + b.push({ + pageX: d[a].pageX, + pageY: d[a].pageY, + target: d[a].target + }); + return b + }, + C = function(b, d, c, f) { + "touch" !== b.pointerType && b.pointerType !== b.MSPOINTER_TYPE_TOUCH || !A[a.hoverChartIndex] || (f(b), f = A[a.hoverChartIndex].pointer, f[d]({ + type: c, + target: b.currentTarget, + preventDefault: g, + touches: p() + })) + }; + r(f.prototype, { + onContainerPointerDown: function(a) { + C(a, "onContainerTouchStart", "touchstart", function(a) { + d[a.pointerId] = { + pageX: a.pageX, + pageY: a.pageY, + target: a.currentTarget + } + }) + }, + onContainerPointerMove: function(a) { + C(a, "onContainerTouchMove", + "touchmove", + function(a) { + d[a.pointerId] = { + pageX: a.pageX, + pageY: a.pageY + }; + d[a.pointerId].target || (d[a.pointerId].target = a.currentTarget) + }) + }, + onDocumentPointerUp: function(a) { + C(a, "onDocumentTouchEnd", "touchend", function(a) { + delete d[a.pointerId] + }) + }, + batchMSEvents: function(a) { + a(this.chart.container, b ? "pointerdown" : "MSPointerDown", this.onContainerPointerDown); + a(this.chart.container, b ? "pointermove" : "MSPointerMove", this.onContainerPointerMove); + a(G, b ? "pointerup" : "MSPointerUp", this.onDocumentPointerUp) + } + }); + q(f.prototype, + "init", + function(a, b, c) { + a.call(this, b, c); + this.hasZoom && H(b.container, { + "-ms-touch-action": "none", + "touch-action": "none" + }) + }); + q(f.prototype, "setDOMEvents", function(a) { + a.apply(this); + (this.hasZoom || this.followTouchMove) && this.batchMSEvents(B) + }); + q(f.prototype, "destroy", function(a) { + this.batchMSEvents(u); + a.call(this) + }) + } + })(L); + (function(a) { + var B, A = a.addEvent, + H = a.css, + G = a.discardElement, + r = a.defined, + g = a.each, + f = a.extend, + u = a.isFirefox, + l = a.marginNames, + q = a.merge, + d = a.pick, + b = a.setAnimation, + p = a.stableSort, + C = a.win, + t = a.wrap; + B = a.Legend = function(a, b) { + this.init(a, b) + }; + B.prototype = { + init: function(a, b) { + this.chart = a; + this.setOptions(b); + b.enabled && (this.render(), A(this.chart, "endResize", function() { + this.legend.positionCheckboxes() + })) + }, + setOptions: function(a) { + var b = d(a.padding, 8); + this.options = a; + this.itemStyle = a.itemStyle; + this.itemHiddenStyle = q(this.itemStyle, a.itemHiddenStyle); + this.itemMarginTop = a.itemMarginTop || 0; + this.initialItemX = this.padding = b; + this.initialItemY = b - 5; + this.itemHeight = this.maxItemWidth = 0; + this.symbolWidth = d(a.symbolWidth, + 16); + this.pages = [] + }, + update: function(a, b) { + var c = this.chart; + this.setOptions(q(!0, this.options, a)); + this.destroy(); + c.isDirtyLegend = c.isDirtyBox = !0; + d(b, !0) && c.redraw() + }, + colorizeItem: function(a, b) { + a.legendGroup[b ? "removeClass" : "addClass"]("highcharts-legend-item-hidden"); + var c = this.options, + d = a.legendItem, + m = a.legendLine, + e = a.legendSymbol, + f = this.itemHiddenStyle.color, + c = b ? c.itemStyle.color : f, + p = b ? a.color || f : f, + g = a.options && a.options.marker, + h = { + fill: p + }, + y; + d && d.css({ + fill: c, + color: c + }); + m && m.attr({ + stroke: p + }); + if (e) { + if (g && + e.isMarker && (h = a.pointAttribs(), !b)) + for (y in h) h[y] = f; + e.attr(h) + } + }, + positionItem: function(a) { + var b = this.options, + d = b.symbolPadding, + b = !b.rtl, + m = a._legendItemPos, + f = m[0], + m = m[1], + e = a.checkbox; + (a = a.legendGroup) && a.element && a.translate(b ? f : this.legendWidth - f - 2 * d - 4, m); + e && (e.x = f, e.y = m) + }, + destroyItem: function(a) { + var b = a.checkbox; + g(["legendItem", "legendLine", "legendSymbol", "legendGroup"], function(b) { + a[b] && (a[b] = a[b].destroy()) + }); + b && G(a.checkbox) + }, + destroy: function() { + function a(a) { + this[a] && (this[a] = this[a].destroy()) + } + g(this.getAllItems(), function(b) { + g(["legendItem", "legendGroup"], a, b) + }); + g(["box", "title", "group"], a, this); + this.display = null + }, + positionCheckboxes: function(a) { + var b = this.group && this.group.alignAttr, + d, m = this.clipHeight || this.legendHeight, + f = this.titleHeight; + b && (d = b.translateY, g(this.allItems, function(c) { + var e = c.checkbox, + n; + e && (n = d + f + e.y + (a || 0) + 3, H(e, { + left: b.translateX + c.checkboxOffset + e.x - 20 + "px", + top: n + "px", + display: n > d - 6 && n < d + m - 6 ? "" : "none" + })) + })) + }, + renderTitle: function() { + var a = this.padding, + b = this.options.title, + d = 0; + b.text && (this.title || (this.title = this.chart.renderer.label(b.text, a - 3, a - 4, null, null, null, null, null, "legend-title").attr({ + zIndex: 1 + }).css(b.style).add(this.group)), a = this.title.getBBox(), d = a.height, this.offsetWidth = a.width, this.contentGroup.attr({ + translateY: d + })); + this.titleHeight = d + }, + setText: function(b) { + var c = this.options; + b.legendItem.attr({ + text: c.labelFormat ? a.format(c.labelFormat, b) : c.labelFormatter.call(b) + }) + }, + renderItem: function(a) { + var b = this.chart, + f = b.renderer, + m = this.options, + p = "horizontal" === + m.layout, + e = this.symbolWidth, + g = m.symbolPadding, + l = this.itemStyle, + t = this.itemHiddenStyle, + h = this.padding, + y = p ? d(m.itemDistance, 20) : 0, + J = !m.rtl, + r = m.width, + I = m.itemMarginBottom || 0, + k = this.itemMarginTop, + u = this.initialItemX, + C = a.legendItem, + N = !a.series, + A = !N && a.series.drawLegendSymbol ? a.series : a, + B = A.options, + B = this.createCheckboxForItem && B && B.showCheckbox, + v = m.useHTML; + C || (a.legendGroup = f.g("legend-item").addClass("highcharts-" + A.type + "-series highcharts-color-" + a.colorIndex + (a.options.className ? " " + a.options.className : + "") + (N ? " highcharts-series-" + a.index : "")).attr({ + zIndex: 1 + }).add(this.scrollGroup), a.legendItem = C = f.text("", J ? e + g : -g, this.baseline || 0, v).css(q(a.visible ? l : t)).attr({ + align: J ? "left" : "right", + zIndex: 2 + }).add(a.legendGroup), this.baseline || (l = l.fontSize, this.fontMetrics = f.fontMetrics(l, C), this.baseline = this.fontMetrics.f + 3 + k, C.attr("y", this.baseline)), this.symbolHeight = m.symbolHeight || this.fontMetrics.f, A.drawLegendSymbol(this, a), this.setItemEvents && this.setItemEvents(a, C, v), B && this.createCheckboxForItem(a)); + this.colorizeItem(a, a.visible); + this.setText(a); + f = C.getBBox(); + e = a.checkboxOffset = m.itemWidth || a.legendItemWidth || e + g + f.width + y + (B ? 20 : 0); + this.itemHeight = g = Math.round(a.legendItemHeight || f.height); + p && this.itemX - u + e > (r || b.chartWidth - 2 * h - u - m.x) && (this.itemX = u, this.itemY += k + this.lastLineHeight + I, this.lastLineHeight = 0); + this.maxItemWidth = Math.max(this.maxItemWidth, e); + this.lastItemY = k + this.itemY + I; + this.lastLineHeight = Math.max(g, this.lastLineHeight); + a._legendItemPos = [this.itemX, this.itemY]; + p ? this.itemX += e : + (this.itemY += k + g + I, this.lastLineHeight = g); + this.offsetWidth = r || Math.max((p ? this.itemX - u - y : e) + h, this.offsetWidth) + }, + getAllItems: function() { + var a = []; + g(this.chart.series, function(b) { + var c = b && b.options; + b && d(c.showInLegend, r(c.linkedTo) ? !1 : void 0, !0) && (a = a.concat(b.legendItems || ("point" === c.legendType ? b.data : b))) + }); + return a + }, + adjustMargins: function(a, b) { + var c = this.chart, + f = this.options, + m = f.align.charAt(0) + f.verticalAlign.charAt(0) + f.layout.charAt(0); + f.floating || g([/(lth|ct|rth)/, /(rtv|rm|rbv)/, /(rbh|cb|lbh)/, + /(lbv|lm|ltv)/ + ], function(e, n) { + e.test(m) && !r(a[n]) && (c[l[n]] = Math.max(c[l[n]], c.legend[(n + 1) % 2 ? "legendHeight" : "legendWidth"] + [1, -1, -1, 1][n] * f[n % 2 ? "x" : "y"] + d(f.margin, 12) + b[n])) + }) + }, + render: function() { + var a = this, + b = a.chart, + d = b.renderer, + q = a.group, + l, e, t, r, w = a.box, + h = a.options, + y = a.padding; + a.itemX = a.initialItemX; + a.itemY = a.initialItemY; + a.offsetWidth = 0; + a.lastItemY = 0; + q || (a.group = q = d.g("legend").attr({ + zIndex: 7 + }).add(), a.contentGroup = d.g().attr({ + zIndex: 1 + }).add(q), a.scrollGroup = d.g().add(a.contentGroup)); + a.renderTitle(); + l = a.getAllItems(); + p(l, function(a, b) { + return (a.options && a.options.legendIndex || 0) - (b.options && b.options.legendIndex || 0) + }); + h.reversed && l.reverse(); + a.allItems = l; + a.display = e = !!l.length; + a.lastLineHeight = 0; + g(l, function(b) { + a.renderItem(b) + }); + t = (h.width || a.offsetWidth) + y; + r = a.lastItemY + a.lastLineHeight + a.titleHeight; + r = a.handleOverflow(r); + r += y; + w || (a.box = w = d.rect().addClass("highcharts-legend-box").attr({ + r: h.borderRadius + }).add(q), w.isNew = !0); + w.attr({ + stroke: h.borderColor, + "stroke-width": h.borderWidth || 0, + fill: h.backgroundColor || + "none" + }).shadow(h.shadow); + 0 < t && 0 < r && (w[w.isNew ? "attr" : "animate"](w.crisp({ + x: 0, + y: 0, + width: t, + height: r + }, w.strokeWidth())), w.isNew = !1); + w[e ? "show" : "hide"](); + a.legendWidth = t; + a.legendHeight = r; + g(l, function(b) { + a.positionItem(b) + }); + e && q.align(f({ + width: t, + height: r + }, h), !0, "spacingBox"); + b.isResizing || this.positionCheckboxes() + }, + handleOverflow: function(a) { + var b = this, + f = this.chart, + m = f.renderer, + p = this.options, + e = p.y, + f = f.spacingBox.height + ("top" === p.verticalAlign ? -e : e) - this.padding, + e = p.maxHeight, + q, l = this.clipRect, + t = p.navigation, + h = d(t.animation, !0), + y = t.arrowSize || 12, + r = this.nav, + u = this.pages, + I = this.padding, + k, D = this.allItems, + C = function(a) { + a ? l.attr({ + height: a + }) : l && (b.clipRect = l.destroy(), b.contentGroup.clip()); + b.contentGroup.div && (b.contentGroup.div.style.clip = a ? "rect(" + I + "px,9999px," + (I + a) + "px,0)" : "auto") + }; + "horizontal" !== p.layout || "middle" === p.verticalAlign || p.floating || (f /= 2); + e && (f = Math.min(f, e)); + u.length = 0; + a > f && !1 !== t.enabled ? (this.clipHeight = q = Math.max(f - 20 - this.titleHeight - I, 0), this.currentPage = d(this.currentPage, 1), this.fullHeight = + a, g(D, function(a, b) { + var c = a._legendItemPos[1]; + a = Math.round(a.legendItem.getBBox().height); + var e = u.length; + if (!e || c - u[e - 1] > q && (k || c) !== u[e - 1]) u.push(k || c), e++; + b === D.length - 1 && c + a - u[e - 1] > q && u.push(c); + c !== k && (k = c) + }), l || (l = b.clipRect = m.clipRect(0, I, 9999, 0), b.contentGroup.clip(l)), C(q), r || (this.nav = r = m.g().attr({ + zIndex: 1 + }).add(this.group), this.up = m.symbol("triangle", 0, 0, y, y).on("click", function() { + b.scroll(-1, h) + }).add(r), this.pager = m.text("", 15, 10).addClass("highcharts-legend-navigation").css(t.style).add(r), + this.down = m.symbol("triangle-down", 0, 0, y, y).on("click", function() { + b.scroll(1, h) + }).add(r)), b.scroll(0), a = f) : r && (C(), r.hide(), this.scrollGroup.attr({ + translateY: 1 + }), this.clipHeight = 0); + return a + }, + scroll: function(a, c) { + var d = this.pages, + f = d.length; + a = this.currentPage + a; + var m = this.clipHeight, + e = this.options.navigation, + p = this.pager, + g = this.padding; + a > f && (a = f); + 0 < a && (void 0 !== c && b(c, this.chart), this.nav.attr({ + translateX: g, + translateY: m + this.padding + 7 + this.titleHeight, + visibility: "visible" + }), this.up.attr({ + "class": 1 === + a ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active" + }), p.attr({ + text: a + "/" + f + }), this.down.attr({ + x: 18 + this.pager.getBBox().width, + "class": a === f ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active" + }), this.up.attr({ + fill: 1 === a ? e.inactiveColor : e.activeColor + }).css({ + cursor: 1 === a ? "default" : "pointer" + }), this.down.attr({ + fill: a === f ? e.inactiveColor : e.activeColor + }).css({ + cursor: a === f ? "default" : "pointer" + }), c = -d[a - 1] + this.initialItemY, this.scrollGroup.animate({ + translateY: c + }), this.currentPage = + a, this.positionCheckboxes(c)) + } + }; + a.LegendSymbolMixin = { + drawRectangle: function(a, b) { + var c = a.symbolHeight, + f = a.options.squareSymbol; + b.legendSymbol = this.chart.renderer.rect(f ? (a.symbolWidth - c) / 2 : 0, a.baseline - c + 1, f ? c : a.symbolWidth, c, d(a.options.symbolRadius, c / 2)).addClass("highcharts-point").attr({ + zIndex: 3 + }).add(b.legendGroup) + }, + drawLineMarker: function(a) { + var b = this.options, + f = b.marker, + m = a.symbolWidth, + p = a.symbolHeight, + e = p / 2, + g = this.chart.renderer, + l = this.legendGroup; + a = a.baseline - Math.round(.3 * a.fontMetrics.b); + var t; + t = { + "stroke-width": b.lineWidth || 0 + }; + b.dashStyle && (t.dashstyle = b.dashStyle); + this.legendLine = g.path(["M", 0, a, "L", m, a]).addClass("highcharts-graph").attr(t).add(l); + f && !1 !== f.enabled && (b = Math.min(d(f.radius, e), e), 0 === this.symbol.indexOf("url") && (f = q(f, { + width: p, + height: p + }), b = 0), this.legendSymbol = f = g.symbol(this.symbol, m / 2 - b, a - b, 2 * b, 2 * b, f).addClass("highcharts-point").add(l), f.isMarker = !0) + } + }; + (/Trident\/7\.0/.test(C.navigator.userAgent) || u) && t(B.prototype, "positionItem", function(a, b) { + var c = this, + d = function() { + b._legendItemPos && + a.call(c, b) + }; + d(); + setTimeout(d) + }) + })(L); + (function(a) { + var B = a.addEvent, + A = a.animate, + H = a.animObject, + G = a.attr, + r = a.doc, + g = a.Axis, + f = a.createElement, + u = a.defaultOptions, + l = a.discardElement, + q = a.charts, + d = a.css, + b = a.defined, + p = a.each, + C = a.extend, + t = a.find, + m = a.fireEvent, + c = a.getStyle, + n = a.grep, + E = a.isNumber, + z = a.isObject, + e = a.isString, + x = a.Legend, + F = a.marginNames, + w = a.merge, + h = a.Pointer, + y = a.pick, + J = a.pInt, + K = a.removeEvent, + I = a.seriesTypes, + k = a.splat, + D = a.svg, + P = a.syncTimeout, + N = a.win, + S = a.Renderer, + O = a.Chart = function() { + this.getArgs.apply(this, + arguments) + }; + a.chart = function(a, b, c) { + return new O(a, b, c) + }; + O.prototype = { + callbacks: [], + getArgs: function() { + var a = [].slice.call(arguments); + if (e(a[0]) || a[0].nodeName) this.renderTo = a.shift(); + this.init(a[0], a[1]) + }, + init: function(b, c) { + var e, h = b.series; + b.series = null; + e = w(u, b); + e.series = b.series = h; + this.userOptions = b; + this.respRules = []; + b = e.chart; + h = b.events; + this.margin = []; + this.spacing = []; + this.bounds = { + h: {}, + v: {} + }; + this.callback = c; + this.isResizing = 0; + this.options = e; + this.axes = []; + this.series = []; + this.hasCartesianSeries = b.showAxes; + var d; + this.index = q.length; + q.push(this); + a.chartCount++; + if (h) + for (d in h) B(this, d, h[d]); + this.xAxis = []; + this.yAxis = []; + this.pointCount = this.colorCounter = this.symbolCounter = 0; + this.firstRender() + }, + initSeries: function(b) { + var c = this.options.chart; + (c = I[b.type || c.type || c.defaultSeriesType]) || a.error(17, !0); + c = new c; + c.init(this, b); + return c + }, + orderSeries: function(a) { + var b = this.series; + for (a = a || 0; a < b.length; a++) b[a] && (b[a].index = a, b[a].name = b[a].name || "Series " + (b[a].index + 1)) + }, + isInsidePlot: function(a, b, c) { + var e = c ? + b : a; + a = c ? a : b; + return 0 <= e && e <= this.plotWidth && 0 <= a && a <= this.plotHeight + }, + redraw: function(b) { + var c = this.axes, + e = this.series, + h = this.pointer, + d = this.legend, + k = this.isDirtyLegend, + f, n, y = this.hasCartesianSeries, + g = this.isDirtyBox, + v = e.length, + l = v, + q = this.renderer, + t = q.isHidden(), + w = []; + this.setResponsive && this.setResponsive(!1); + a.setAnimation(b, this); + t && this.cloneRenderTo(); + for (this.layOutTitles(); l--;) + if (b = e[l], b.options.stacking && (f = !0, b.isDirty)) { + n = !0; + break + } + if (n) + for (l = v; l--;) b = e[l], b.options.stacking && (b.isDirty = !0); + p(e, function(a) { + a.isDirty && "point" === a.options.legendType && (a.updateTotals && a.updateTotals(), k = !0); + a.isDirtyData && m(a, "updatedData") + }); + k && d.options.enabled && (d.render(), this.isDirtyLegend = !1); + f && this.getStacks(); + y && p(c, function(a) { + a.updateNames(); + a.setScale() + }); + this.getMargins(); + y && (p(c, function(a) { + a.isDirty && (g = !0) + }), p(c, function(a) { + var b = a.min + "," + a.max; + a.extKey !== b && (a.extKey = b, w.push(function() { + m(a, "afterSetExtremes", C(a.eventArgs, a.getExtremes())); + delete a.eventArgs + })); + (g || f) && a.redraw() + })); + g && this.drawChartBox(); + m(this, "predraw"); + p(e, function(a) { + (g || a.isDirty) && a.visible && a.redraw(); + a.isDirtyData = !1 + }); + h && h.reset(!0); + q.draw(); + m(this, "redraw"); + m(this, "render"); + t && this.cloneRenderTo(!0); + p(w, function(a) { + a.call() + }) + }, + get: function(a) { + function b(b) { + return b.id === a || b.options && b.options.id === a + } + var c, e = this.series, + h; + c = t(this.axes, b) || t(this.series, b); + for (h = 0; !c && h < e.length; h++) c = t(e[h].points || [], b); + return c + }, + getAxes: function() { + var a = this, + b = this.options, + c = b.xAxis = k(b.xAxis || {}), + b = b.yAxis = k(b.yAxis || {}); + p(c, function(a, b) { + a.index = b; + a.isX = !0 + }); + p(b, function(a, b) { + a.index = b + }); + c = c.concat(b); + p(c, function(b) { + new g(a, b) + }) + }, + getSelectedPoints: function() { + var a = []; + p(this.series, function(b) { + a = a.concat(n(b.points || [], function(a) { + return a.selected + })) + }); + return a + }, + getSelectedSeries: function() { + return n(this.series, function(a) { + return a.selected + }) + }, + setTitle: function(a, b, c) { + var e = this, + h = e.options, + d; + d = h.title = w({ + style: { + color: "#333333", + fontSize: h.isStock ? "16px" : "18px" + } + }, h.title, a); + h = h.subtitle = w({ + style: { + color: "#666666" + } + }, + h.subtitle, b); + p([ + ["title", a, d], + ["subtitle", b, h] + ], function(a, b) { + var c = a[0], + h = e[c], + d = a[1]; + a = a[2]; + h && d && (e[c] = h = h.destroy()); + a && a.text && !h && (e[c] = e.renderer.text(a.text, 0, 0, a.useHTML).attr({ + align: a.align, + "class": "highcharts-" + c, + zIndex: a.zIndex || 4 + }).add(), e[c].update = function(a) { + e.setTitle(!b && a, b && a) + }, e[c].css(a.style)) + }); + e.layOutTitles(c) + }, + layOutTitles: function(a) { + var b = 0, + c, e = this.renderer, + h = this.spacingBox; + p(["title", "subtitle"], function(a) { + var c = this[a], + d = this.options[a], + k; + c && (k = d.style.fontSize, + k = e.fontMetrics(k, c).b, c.css({ + width: (d.width || h.width + d.widthAdjust) + "px" + }).align(C({ + y: b + k + ("title" === a ? -3 : 2) + }, d), !1, "spacingBox"), d.floating || d.verticalAlign || (b = Math.ceil(b + c.getBBox().height))) + }, this); + c = this.titleOffset !== b; + this.titleOffset = b; + !this.isDirtyBox && c && (this.isDirtyBox = c, this.hasRendered && y(a, !0) && this.isDirtyBox && this.redraw()) + }, + getChartSize: function() { + var a = this.options.chart, + e = a.width, + a = a.height, + h = this.renderToClone || this.renderTo; + b(e) || (this.containerWidth = c(h, "width")); + b(a) || (this.containerHeight = + c(h, "height")); + this.chartWidth = Math.max(0, e || this.containerWidth || 600); + this.chartHeight = Math.max(0, a || this.containerHeight || 400) + }, + cloneRenderTo: function(a) { + var b = this.renderToClone, + c = this.container; + if (a) { + if (b) { + for (; b.childNodes.length;) this.renderTo.appendChild(b.firstChild); + l(b); + delete this.renderToClone + } + } else c && c.parentNode === this.renderTo && this.renderTo.removeChild(c), this.renderToClone = b = this.renderTo.cloneNode(0), d(b, { + position: "absolute", + top: "-9999px", + display: "block" + }), b.style.setProperty && + b.style.setProperty("display", "block", "important"), r.body.appendChild(b), c && b.appendChild(c) + }, + setClassName: function(a) { + this.container.className = "highcharts-container " + (a || "") + }, + getContainer: function() { + var b, c = this.options, + h = c.chart, + d, k; + b = this.renderTo; + var m = a.uniqueKey(), + n; + b || (this.renderTo = b = h.renderTo); + e(b) && (this.renderTo = b = r.getElementById(b)); + b || a.error(13, !0); + d = J(G(b, "data-highcharts-chart")); + E(d) && q[d] && q[d].hasRendered && q[d].destroy(); + G(b, "data-highcharts-chart", this.index); + b.innerHTML = ""; + h.skipClone || b.offsetWidth || this.cloneRenderTo(); + this.getChartSize(); + d = this.chartWidth; + k = this.chartHeight; + n = C({ + position: "relative", + overflow: "hidden", + width: d + "px", + height: k + "px", + textAlign: "left", + lineHeight: "normal", + zIndex: 0, + "-webkit-tap-highlight-color": "rgba(0,0,0,0)" + }, h.style); + this.container = b = f("div", { + id: m + }, n, this.renderToClone || b); + this._cursor = b.style.cursor; + this.renderer = new(a[h.renderer] || S)(b, d, k, null, h.forExport, c.exporting && c.exporting.allowHTML); + this.setClassName(h.className); + this.renderer.setStyle(h.style); + this.renderer.chartIndex = this.index + }, + getMargins: function(a) { + var c = this.spacing, + e = this.margin, + h = this.titleOffset; + this.resetMargins(); + h && !b(e[0]) && (this.plotTop = Math.max(this.plotTop, h + this.options.title.margin + c[0])); + this.legend.display && this.legend.adjustMargins(e, c); + this.extraMargin && (this[this.extraMargin.type] = (this[this.extraMargin.type] || 0) + this.extraMargin.value); + this.extraTopMargin && (this.plotTop += this.extraTopMargin); + a || this.getAxisMargins() + }, + getAxisMargins: function() { + var a = this, + c = a.axisOffset = [0, 0, 0, 0], + e = a.margin; + a.hasCartesianSeries && p(a.axes, function(a) { + a.visible && a.getOffset() + }); + p(F, function(h, d) { + b(e[d]) || (a[h] += c[d]) + }); + a.setChartSize() + }, + reflow: function(a) { + var e = this, + h = e.options.chart, + d = e.renderTo, + k = b(h.width), + f = h.width || c(d, "width"), + h = h.height || c(d, "height"), + d = a ? a.target : N; + if (!k && !e.isPrinting && f && h && (d === N || d === r)) { + if (f !== e.containerWidth || h !== e.containerHeight) clearTimeout(e.reflowTimeout), e.reflowTimeout = P(function() { + e.container && e.setSize(void 0, void 0, !1) + }, a ? 100 : 0); + e.containerWidth = + f; + e.containerHeight = h + } + }, + initReflow: function() { + var a = this, + b; + b = B(N, "resize", function(b) { + a.reflow(b) + }); + B(a, "destroy", b) + }, + setSize: function(b, c, e) { + var h = this, + k = h.renderer; + h.isResizing += 1; + a.setAnimation(e, h); + h.oldChartHeight = h.chartHeight; + h.oldChartWidth = h.chartWidth; + void 0 !== b && (h.options.chart.width = b); + void 0 !== c && (h.options.chart.height = c); + h.getChartSize(); + b = k.globalAnimation; + (b ? A : d)(h.container, { + width: h.chartWidth + "px", + height: h.chartHeight + "px" + }, b); + h.setChartSize(!0); + k.setSize(h.chartWidth, h.chartHeight, + e); + p(h.axes, function(a) { + a.isDirty = !0; + a.setScale() + }); + h.isDirtyLegend = !0; + h.isDirtyBox = !0; + h.layOutTitles(); + h.getMargins(); + h.redraw(e); + h.oldChartHeight = null; + m(h, "resize"); + P(function() { + h && m(h, "endResize", null, function() { + --h.isResizing + }) + }, H(b).duration) + }, + setChartSize: function(a) { + var b = this.inverted, + c = this.renderer, + e = this.chartWidth, + h = this.chartHeight, + d = this.options.chart, + k = this.spacing, + f = this.clipOffset, + m, n, y, g; + this.plotLeft = m = Math.round(this.plotLeft); + this.plotTop = n = Math.round(this.plotTop); + this.plotWidth = + y = Math.max(0, Math.round(e - m - this.marginRight)); + this.plotHeight = g = Math.max(0, Math.round(h - n - this.marginBottom)); + this.plotSizeX = b ? g : y; + this.plotSizeY = b ? y : g; + this.plotBorderWidth = d.plotBorderWidth || 0; + this.spacingBox = c.spacingBox = { + x: k[3], + y: k[0], + width: e - k[3] - k[1], + height: h - k[0] - k[2] + }; + this.plotBox = c.plotBox = { + x: m, + y: n, + width: y, + height: g + }; + e = 2 * Math.floor(this.plotBorderWidth / 2); + b = Math.ceil(Math.max(e, f[3]) / 2); + c = Math.ceil(Math.max(e, f[0]) / 2); + this.clipBox = { + x: b, + y: c, + width: Math.floor(this.plotSizeX - Math.max(e, f[1]) / + 2 - b), + height: Math.max(0, Math.floor(this.plotSizeY - Math.max(e, f[2]) / 2 - c)) + }; + a || p(this.axes, function(a) { + a.setAxisSize(); + a.setAxisTranslation() + }) + }, + resetMargins: function() { + var a = this, + b = a.options.chart; + p(["margin", "spacing"], function(c) { + var e = b[c], + h = z(e) ? e : [e, e, e, e]; + p(["Top", "Right", "Bottom", "Left"], function(e, d) { + a[c][d] = y(b[c + e], h[d]) + }) + }); + p(F, function(b, c) { + a[b] = y(a.margin[c], a.spacing[c]) + }); + a.axisOffset = [0, 0, 0, 0]; + a.clipOffset = [0, 0, 0, 0] + }, + drawChartBox: function() { + var a = this.options.chart, + b = this.renderer, + c = + this.chartWidth, + e = this.chartHeight, + h = this.chartBackground, + d = this.plotBackground, + k = this.plotBorder, + f, m = this.plotBGImage, + n = a.backgroundColor, + p = a.plotBackgroundColor, + y = a.plotBackgroundImage, + g, l = this.plotLeft, + q = this.plotTop, + t = this.plotWidth, + w = this.plotHeight, + x = this.plotBox, + r = this.clipRect, + z = this.clipBox, + J = "animate"; + h || (this.chartBackground = h = b.rect().addClass("highcharts-background").add(), J = "attr"); + f = a.borderWidth || 0; + g = f + (a.shadow ? 8 : 0); + n = { + fill: n || "none" + }; + if (f || h["stroke-width"]) n.stroke = a.borderColor, + n["stroke-width"] = f; + h.attr(n).shadow(a.shadow); + h[J]({ + x: g / 2, + y: g / 2, + width: c - g - f % 2, + height: e - g - f % 2, + r: a.borderRadius + }); + J = "animate"; + d || (J = "attr", this.plotBackground = d = b.rect().addClass("highcharts-plot-background").add()); + d[J](x); + d.attr({ + fill: p || "none" + }).shadow(a.plotShadow); + y && (m ? m.animate(x) : this.plotBGImage = b.image(y, l, q, t, w).add()); + r ? r.animate({ + width: z.width, + height: z.height + }) : this.clipRect = b.clipRect(z); + J = "animate"; + k || (J = "attr", this.plotBorder = k = b.rect().addClass("highcharts-plot-border").attr({ + zIndex: 1 + }).add()); + k.attr({ + stroke: a.plotBorderColor, + "stroke-width": a.plotBorderWidth || 0, + fill: "none" + }); + k[J](k.crisp({ + x: l, + y: q, + width: t, + height: w + }, -k.strokeWidth())); + this.isDirtyBox = !1 + }, + propFromSeries: function() { + var a = this, + b = a.options.chart, + c, e = a.options.series, + h, d; + p(["inverted", "angular", "polar"], function(k) { + c = I[b.type || b.defaultSeriesType]; + d = b[k] || c && c.prototype[k]; + for (h = e && e.length; !d && h--;)(c = I[e[h].type]) && c.prototype[k] && (d = !0); + a[k] = d + }) + }, + linkSeries: function() { + var a = this, + b = a.series; + p(b, function(a) { + a.linkedSeries.length = + 0 + }); + p(b, function(b) { + var c = b.options.linkedTo; + e(c) && (c = ":previous" === c ? a.series[b.index - 1] : a.get(c)) && c.linkedParent !== b && (c.linkedSeries.push(b), b.linkedParent = c, b.visible = y(b.options.visible, c.options.visible, b.visible)) + }) + }, + renderSeries: function() { + p(this.series, function(a) { + a.translate(); + a.render() + }) + }, + renderLabels: function() { + var a = this, + b = a.options.labels; + b.items && p(b.items, function(c) { + var e = C(b.style, c.style), + h = J(e.left) + a.plotLeft, + d = J(e.top) + a.plotTop + 12; + delete e.left; + delete e.top; + a.renderer.text(c.html, + h, d).attr({ + zIndex: 2 + }).css(e).add() + }) + }, + render: function() { + var a = this.axes, + b = this.renderer, + c = this.options, + e, h, d; + this.setTitle(); + this.legend = new x(this, c.legend); + this.getStacks && this.getStacks(); + this.getMargins(!0); + this.setChartSize(); + c = this.plotWidth; + e = this.plotHeight -= 21; + p(a, function(a) { + a.setScale() + }); + this.getAxisMargins(); + h = 1.1 < c / this.plotWidth; + d = 1.05 < e / this.plotHeight; + if (h || d) p(a, function(a) { + (a.horiz && h || !a.horiz && d) && a.setTickInterval(!0) + }), this.getMargins(); + this.drawChartBox(); + this.hasCartesianSeries && + p(a, function(a) { + a.visible && a.render() + }); + this.seriesGroup || (this.seriesGroup = b.g("series-group").attr({ + zIndex: 3 + }).add()); + this.renderSeries(); + this.renderLabels(); + this.addCredits(); + this.setResponsive && this.setResponsive(); + this.hasRendered = !0 + }, + addCredits: function(a) { + var b = this; + a = w(!0, this.options.credits, a); + a.enabled && !this.credits && (this.credits = this.renderer.text(a.text + (this.mapCredits || ""), 0, 0).addClass("highcharts-credits").on("click", function() { + a.href && (N.location.href = a.href) + }).attr({ + align: a.position.align, + zIndex: 8 + }).css(a.style).add().align(a.position), this.credits.update = function(a) { + b.credits = b.credits.destroy(); + b.addCredits(a) + }) + }, + destroy: function() { + var b = this, + c = b.axes, + e = b.series, + h = b.container, + d, k = h && h.parentNode; + m(b, "destroy"); + q[b.index] = void 0; + a.chartCount--; + b.renderTo.removeAttribute("data-highcharts-chart"); + K(b); + for (d = c.length; d--;) c[d] = c[d].destroy(); + this.scroller && this.scroller.destroy && this.scroller.destroy(); + for (d = e.length; d--;) e[d] = e[d].destroy(); + p("title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer".split(" "), + function(a) { + var c = b[a]; + c && c.destroy && (b[a] = c.destroy()) + }); + h && (h.innerHTML = "", K(h), k && l(h)); + for (d in b) delete b[d] + }, + isReadyToRender: function() { + var a = this; + return D || N != N.top || "complete" === r.readyState ? !0 : (r.attachEvent("onreadystatechange", function() { + r.detachEvent("onreadystatechange", a.firstRender); + "complete" === r.readyState && a.firstRender() + }), !1) + }, + firstRender: function() { + var a = this, + b = a.options; + if (a.isReadyToRender()) { + a.getContainer(); + m(a, "init"); + a.resetMargins(); + a.setChartSize(); + a.propFromSeries(); + a.getAxes(); + p(b.series || [], function(b) { + a.initSeries(b) + }); + a.linkSeries(); + m(a, "beforeRender"); + h && (a.pointer = new h(a, b)); + a.render(); + if (!a.renderer.imgCount && a.onload) a.onload(); + a.cloneRenderTo(!0) + } + }, + onload: function() { + p([this.callback].concat(this.callbacks), function(a) { + a && void 0 !== this.index && a.apply(this, [this]) + }, this); + m(this, "load"); + m(this, "render"); + b(this.index) && !1 !== this.options.chart.reflow && this.initReflow(); + this.onload = null + } + } + })(L); + (function(a) { + var B, A = a.each, + H = a.extend, + G = a.erase, + r = a.fireEvent, + g = a.format, + f = a.isArray, + u = a.isNumber, + l = a.pick, + q = a.removeEvent; + B = a.Point = function() {}; + B.prototype = { + init: function(a, b, f) { + this.series = a; + this.color = a.color; + this.applyOptions(b, f); + a.options.colorByPoint ? (b = a.options.colors || a.chart.options.colors, this.color = this.color || b[a.colorCounter], b = b.length, f = a.colorCounter, a.colorCounter++, a.colorCounter === b && (a.colorCounter = 0)) : f = a.colorIndex; + this.colorIndex = l(this.colorIndex, f); + a.chart.pointCount++; + return this + }, + applyOptions: function(a, b) { + var d = this.series, + f = d.options.pointValKey || + d.pointValKey; + a = B.prototype.optionsToObject.call(this, a); + H(this, a); + this.options = this.options ? H(this.options, a) : a; + a.group && delete this.group; + f && (this.y = this[f]); + this.isNull = l(this.isValid && !this.isValid(), null === this.x || !u(this.y, !0)); + this.selected && (this.state = "select"); + "name" in this && void 0 === b && d.xAxis && d.xAxis.hasNames && (this.x = d.xAxis.nameToX(this)); + void 0 === this.x && d && (this.x = void 0 === b ? d.autoIncrement(this) : b); + return this + }, + optionsToObject: function(a) { + var b = {}, + d = this.series, + g = d.options.keys, + l = g || d.pointArrayMap || ["y"], + m = l.length, + c = 0, + n = 0; + if (u(a) || null === a) b[l[0]] = a; + else if (f(a)) + for (!g && a.length > m && (d = typeof a[0], "string" === d ? b.name = a[0] : "number" === d && (b.x = a[0]), c++); n < m;) g && void 0 === a[c] || (b[l[n]] = a[c]), c++, n++; + else "object" === typeof a && (b = a, a.dataLabels && (d._hasPointLabels = !0), a.marker && (d._hasPointMarkers = !0)); + return b + }, + getClassName: function() { + return "highcharts-point" + (this.selected ? " highcharts-point-select" : "") + (this.negative ? " highcharts-negative" : "") + (this.isNull ? " highcharts-null-point" : + "") + (void 0 !== this.colorIndex ? " highcharts-color-" + this.colorIndex : "") + (this.options.className ? " " + this.options.className : "") + (this.zone && this.zone.className ? " " + this.zone.className.replace("highcharts-negative", "") : "") + }, + getZone: function() { + var a = this.series, + b = a.zones, + a = a.zoneAxis || "y", + f = 0, + g; + for (g = b[f]; this[a] >= g.value;) g = b[++f]; + g && g.color && !this.options.color && (this.color = g.color); + return g + }, + destroy: function() { + var a = this.series.chart, + b = a.hoverPoints, + f; + a.pointCount--; + b && (this.setState(), G(b, this), b.length || + (a.hoverPoints = null)); + if (this === a.hoverPoint) this.onMouseOut(); + if (this.graphic || this.dataLabel) q(this), this.destroyElements(); + this.legendItem && a.legend.destroyItem(this); + for (f in this) this[f] = null + }, + destroyElements: function() { + for (var a = ["graphic", "dataLabel", "dataLabelUpper", "connector", "shadowGroup"], b, f = 6; f--;) b = a[f], this[b] && (this[b] = this[b].destroy()) + }, + getLabelConfig: function() { + return { + x: this.category, + y: this.y, + color: this.color, + colorIndex: this.colorIndex, + key: this.name || this.category, + series: this.series, + point: this, + percentage: this.percentage, + total: this.total || this.stackTotal + } + }, + tooltipFormatter: function(a) { + var b = this.series, + d = b.tooltipOptions, + f = l(d.valueDecimals, ""), + q = d.valuePrefix || "", + m = d.valueSuffix || ""; + A(b.pointArrayMap || ["y"], function(b) { + b = "{point." + b; + if (q || m) a = a.replace(b + "}", q + b + "}" + m); + a = a.replace(b + "}", b + ":,." + f + "f}") + }); + return g(a, { + point: this, + series: this.series + }) + }, + firePointEvent: function(a, b, f) { + var d = this, + g = this.series.options; + (g.point.events[a] || d.options && d.options.events && d.options.events[a]) && + this.importEvents(); + "click" === a && g.allowPointSelect && (f = function(a) { + d.select && d.select(null, a.ctrlKey || a.metaKey || a.shiftKey) + }); + r(this, a, b, f) + }, + visible: !0 + } + })(L); + (function(a) { + var B = a.addEvent, + A = a.animObject, + H = a.arrayMax, + G = a.arrayMin, + r = a.correctFloat, + g = a.Date, + f = a.defaultOptions, + u = a.defaultPlotOptions, + l = a.defined, + q = a.each, + d = a.erase, + b = a.extend, + p = a.fireEvent, + C = a.grep, + t = a.isArray, + m = a.isNumber, + c = a.isString, + n = a.merge, + E = a.pick, + z = a.removeEvent, + e = a.splat, + x = a.SVGElement, + F = a.syncTimeout, + w = a.win; + a.Series = a.seriesType("line", + null, { + lineWidth: 2, + allowPointSelect: !1, + showCheckbox: !1, + animation: { + duration: 1E3 + }, + events: {}, + marker: { + lineWidth: 0, + lineColor: "#ffffff", + radius: 4, + states: { + hover: { + animation: { + duration: 50 + }, + enabled: !0, + radiusPlus: 2, + lineWidthPlus: 1 + }, + select: { + fillColor: "#cccccc", + lineColor: "#000000", + lineWidth: 2 + } + } + }, + point: { + events: {} + }, + dataLabels: { + align: "center", + formatter: function() { + return null === this.y ? "" : a.numberFormat(this.y, -1) + }, + style: { + fontSize: "11px", + fontWeight: "bold", + color: "contrast", + textOutline: "1px contrast" + }, + verticalAlign: "bottom", + x: 0, + y: 0, + padding: 5 + }, + cropThreshold: 300, + pointRange: 0, + softThreshold: !0, + states: { + hover: { + lineWidthPlus: 1, + marker: {}, + halo: { + size: 10, + opacity: .25 + } + }, + select: { + marker: {} + } + }, + stickyTracking: !0, + turboThreshold: 1E3 + }, { + isCartesian: !0, + pointClass: a.Point, + sorted: !0, + requireSorting: !0, + directTouch: !1, + axisTypes: ["xAxis", "yAxis"], + colorCounter: 0, + parallelArrays: ["x", "y"], + coll: "series", + init: function(a, c) { + var e = this, + h, d, k = a.series, + f; + e.chart = a; + e.options = c = e.setOptions(c); + e.linkedSeries = []; + e.bindAxes(); + b(e, { + name: c.name, + state: "", + visible: !1 !== + c.visible, + selected: !0 === c.selected + }); + d = c.events; + for (h in d) B(e, h, d[h]); + if (d && d.click || c.point && c.point.events && c.point.events.click || c.allowPointSelect) a.runTrackerClick = !0; + e.getColor(); + e.getSymbol(); + q(e.parallelArrays, function(a) { + e[a + "Data"] = [] + }); + e.setData(c.data, !1); + e.isCartesian && (a.hasCartesianSeries = !0); + k.length && (f = k[k.length - 1]); + e._i = E(f && f._i, -1) + 1; + a.orderSeries(this.insert(k)) + }, + insert: function(a) { + var b = this.options.index, + c; + if (m(b)) { + for (c = a.length; c--;) + if (b >= E(a[c].options.index, a[c]._i)) { + a.splice(c + + 1, 0, this); + break + } - 1 === c && a.unshift(this); + c += 1 + } else a.push(this); + return E(c, a.length - 1) + }, + bindAxes: function() { + var b = this, + c = b.options, + e = b.chart, + d; + q(b.axisTypes || [], function(h) { + q(e[h], function(a) { + d = a.options; + if (c[h] === d.index || void 0 !== c[h] && c[h] === d.id || void 0 === c[h] && 0 === d.index) b.insert(a.series), b[h] = a, a.isDirty = !0 + }); + b[h] || b.optionalAxis === h || a.error(18, !0) + }) + }, + updateParallelArrays: function(a, b) { + var c = a.series, + e = arguments, + h = m(b) ? function(e) { + var h = "y" === e && c.toYData ? c.toYData(a) : a[e]; + c[e + "Data"][b] = + h + } : function(a) { + Array.prototype[b].apply(c[a + "Data"], Array.prototype.slice.call(e, 2)) + }; + q(c.parallelArrays, h) + }, + autoIncrement: function() { + var a = this.options, + b = this.xIncrement, + c, e = a.pointIntervalUnit, + b = E(b, a.pointStart, 0); + this.pointInterval = c = E(this.pointInterval, a.pointInterval, 1); + e && (a = new g(b), "day" === e ? a = +a[g.hcSetDate](a[g.hcGetDate]() + c) : "month" === e ? a = +a[g.hcSetMonth](a[g.hcGetMonth]() + c) : "year" === e && (a = +a[g.hcSetFullYear](a[g.hcGetFullYear]() + c)), c = a - b); + this.xIncrement = b + c; + return b + }, + setOptions: function(a) { + var b = + this.chart, + c = b.options.plotOptions, + b = b.userOptions || {}, + e = b.plotOptions || {}, + h = c[this.type]; + this.userOptions = a; + c = n(h, c.series, a); + this.tooltipOptions = n(f.tooltip, f.plotOptions[this.type].tooltip, b.tooltip, e.series && e.series.tooltip, e[this.type] && e[this.type].tooltip, a.tooltip); + null === h.marker && delete c.marker; + this.zoneAxis = c.zoneAxis; + a = this.zones = (c.zones || []).slice(); + !c.negativeColor && !c.negativeFillColor || c.zones || a.push({ + value: c[this.zoneAxis + "Threshold"] || c.threshold || 0, + className: "highcharts-negative", + color: c.negativeColor, + fillColor: c.negativeFillColor + }); + a.length && l(a[a.length - 1].value) && a.push({ + color: this.color, + fillColor: this.fillColor + }); + return c + }, + getCyclic: function(a, b, c) { + var e, h = this.chart, + d = this.userOptions, + f = a + "Index", + n = a + "Counter", + m = c ? c.length : E(h.options.chart[a + "Count"], h[a + "Count"]); + b || (e = E(d[f], d["_" + f]), l(e) || (h.series.length || (h[n] = 0), d["_" + f] = e = h[n] % m, h[n] += 1), c && (b = c[e])); + void 0 !== e && (this[f] = e); + this[a] = b + }, + getColor: function() { + this.options.colorByPoint ? this.options.color = null : this.getCyclic("color", + this.options.color || u[this.type].color, this.chart.options.colors) + }, + getSymbol: function() { + this.getCyclic("symbol", this.options.marker.symbol, this.chart.options.symbols) + }, + drawLegendSymbol: a.LegendSymbolMixin.drawLineMarker, + setData: function(b, e, d, f) { + var h = this, + k = h.points, + n = k && k.length || 0, + g, p = h.options, + y = h.chart, + l = null, + w = h.xAxis, + x = p.turboThreshold, + r = this.xData, + z = this.yData, + F = (g = h.pointArrayMap) && g.length; + b = b || []; + g = b.length; + e = E(e, !0); + if (!1 !== f && g && n === g && !h.cropped && !h.hasGroupedData && h.visible) q(b, function(a, + b) { + k[b].update && a !== p.data[b] && k[b].update(a, !1, null, !1) + }); + else { + h.xIncrement = null; + h.colorCounter = 0; + q(this.parallelArrays, function(a) { + h[a + "Data"].length = 0 + }); + if (x && g > x) { + for (d = 0; null === l && d < g;) l = b[d], d++; + if (m(l)) + for (d = 0; d < g; d++) r[d] = this.autoIncrement(), z[d] = b[d]; + else if (t(l)) + if (F) + for (d = 0; d < g; d++) l = b[d], r[d] = l[0], z[d] = l.slice(1, F + 1); + else + for (d = 0; d < g; d++) l = b[d], r[d] = l[0], z[d] = l[1]; + else a.error(12) + } else + for (d = 0; d < g; d++) void 0 !== b[d] && (l = { + series: h + }, h.pointClass.prototype.applyOptions.apply(l, [b[d]]), h.updateParallelArrays(l, + d)); + c(z[0]) && a.error(14, !0); + h.data = []; + h.options.data = h.userOptions.data = b; + for (d = n; d--;) k[d] && k[d].destroy && k[d].destroy(); + w && (w.minRange = w.userMinRange); + h.isDirty = y.isDirtyBox = !0; + h.isDirtyData = !!k; + d = !1 + } + "point" === p.legendType && (this.processData(), this.generatePoints()); + e && y.redraw(d) + }, + processData: function(b) { + var c = this.xData, + e = this.yData, + h = c.length, + d; + d = 0; + var k, f, n = this.xAxis, + m, g = this.options; + m = g.cropThreshold; + var p = this.getExtremesFromAll || g.getExtremesFromAll, + l = this.isCartesian, + g = n && n.val2lin, + q = n && + n.isLog, + t, w; + if (l && !this.isDirty && !n.isDirty && !this.yAxis.isDirty && !b) return !1; + n && (b = n.getExtremes(), t = b.min, w = b.max); + if (l && this.sorted && !p && (!m || h > m || this.forceCrop)) + if (c[h - 1] < t || c[0] > w) c = [], e = []; + else if (c[0] < t || c[h - 1] > w) d = this.cropData(this.xData, this.yData, t, w), c = d.xData, e = d.yData, d = d.start, k = !0; + for (m = c.length || 1; --m;) h = q ? g(c[m]) - g(c[m - 1]) : c[m] - c[m - 1], 0 < h && (void 0 === f || h < f) ? f = h : 0 > h && this.requireSorting && a.error(15); + this.cropped = k; + this.cropStart = d; + this.processedXData = c; + this.processedYData = e; + this.closestPointRange = + f + }, + cropData: function(a, b, c, e) { + var h = a.length, + d = 0, + f = h, + n = E(this.cropShoulder, 1), + m; + for (m = 0; m < h; m++) + if (a[m] >= c) { + d = Math.max(0, m - n); + break + } + for (c = m; c < h; c++) + if (a[c] > e) { + f = c + n; + break + } + return { + xData: a.slice(d, f), + yData: b.slice(d, f), + start: d, + end: f + } + }, + generatePoints: function() { + var a = this.options.data, + b = this.data, + c, d = this.processedXData, + f = this.processedYData, + k = this.pointClass, + n = d.length, + m = this.cropStart || 0, + g, p = this.hasGroupedData, + l, q = [], + t; + b || p || (b = [], b.length = a.length, b = this.data = b); + for (t = 0; t < n; t++) g = m + t, p ? (l = (new k).init(this, [d[t]].concat(e(f[t]))), l.dataGroup = this.groupMap[t]) : (l = b[g]) || void 0 === a[g] || (b[g] = l = (new k).init(this, a[g], d[t])), l.index = g, q[t] = l; + if (b && (n !== (c = b.length) || p)) + for (t = 0; t < c; t++) t !== m || p || (t += n), b[t] && (b[t].destroyElements(), b[t].plotX = void 0); + this.data = b; + this.points = q + }, + getExtremes: function(a) { + var b = this.yAxis, + c = this.processedXData, + e, h = [], + d = 0; + e = this.xAxis.getExtremes(); + var f = e.min, + n = e.max, + g, p, l, q; + a = a || this.stackedYData || this.processedYData || []; + e = a.length; + for (q = 0; q < e; q++) + if (p = c[q], l = a[q], g = (m(l, !0) || + t(l)) && (!b.isLog || l.length || 0 < l), p = this.getExtremesFromAll || this.options.getExtremesFromAll || this.cropped || (c[q + 1] || p) >= f && (c[q - 1] || p) <= n, g && p) + if (g = l.length) + for (; g--;) null !== l[g] && (h[d++] = l[g]); + else h[d++] = l; + this.dataMin = G(h); + this.dataMax = H(h) + }, + translate: function() { + this.processedXData || this.processData(); + this.generatePoints(); + var a = this.options, + b = a.stacking, + c = this.xAxis, + e = c.categories, + d = this.yAxis, + k = this.points, + f = k.length, + n = !!this.modifyValue, + g = a.pointPlacement, + p = "between" === g || m(g), + q = a.threshold, + t = a.startFromThreshold ? q : 0, + w, x, z, F, u = Number.MAX_VALUE; + "between" === g && (g = .5); + m(g) && (g *= E(a.pointRange || c.pointRange)); + for (a = 0; a < f; a++) { + var C = k[a], + A = C.x, + B = C.y; + x = C.low; + var H = b && d.stacks[(this.negStacks && B < (t ? 0 : q) ? "-" : "") + this.stackKey], + G; + d.isLog && null !== B && 0 >= B && (C.isNull = !0); + C.plotX = w = r(Math.min(Math.max(-1E5, c.translate(A, 0, 0, 0, 1, g, "flags" === this.type)), 1E5)); + b && this.visible && !C.isNull && H && H[A] && (F = this.getStackIndicator(F, A, this.index), G = H[A], B = G.points[F.key], x = B[0], B = B[1], x === t && F.key === H[A].base && + (x = E(q, d.min)), d.isLog && 0 >= x && (x = null), C.total = C.stackTotal = G.total, C.percentage = G.total && C.y / G.total * 100, C.stackY = B, G.setOffset(this.pointXOffset || 0, this.barW || 0)); + C.yBottom = l(x) ? d.translate(x, 0, 1, 0, 1) : null; + n && (B = this.modifyValue(B, C)); + C.plotY = x = "number" === typeof B && Infinity !== B ? Math.min(Math.max(-1E5, d.translate(B, 0, 1, 0, 1)), 1E5) : void 0; + C.isInside = void 0 !== x && 0 <= x && x <= d.len && 0 <= w && w <= c.len; + C.clientX = p ? r(c.translate(A, 0, 0, 0, 1, g)) : w; + C.negative = C.y < (q || 0); + C.category = e && void 0 !== e[C.x] ? e[C.x] : C.x; + C.isNull || + (void 0 !== z && (u = Math.min(u, Math.abs(w - z))), z = w); + C.zone = this.zones.length && C.getZone() + } + this.closestPointRangePx = u + }, + getValidPoints: function(a, b) { + var c = this.chart; + return C(a || this.points || [], function(a) { + return b && !c.isInsidePlot(a.plotX, a.plotY, c.inverted) ? !1 : !a.isNull + }) + }, + setClip: function(a) { + var b = this.chart, + c = this.options, + e = b.renderer, + d = b.inverted, + h = this.clipBox, + f = h || b.clipBox, + n = this.sharedClipKey || ["_sharedClip", a && a.duration, a && a.easing, f.height, c.xAxis, c.yAxis].join(), + m = b[n], + g = b[n + "m"]; + m || (a && (f.width = + 0, b[n + "m"] = g = e.clipRect(-99, d ? -b.plotLeft : -b.plotTop, 99, d ? b.chartWidth : b.chartHeight)), b[n] = m = e.clipRect(f), m.count = { + length: 0 + }); + a && !m.count[this.index] && (m.count[this.index] = !0, m.count.length += 1); + !1 !== c.clip && (this.group.clip(a || h ? m : b.clipRect), this.markerGroup.clip(g), this.sharedClipKey = n); + a || (m.count[this.index] && (delete m.count[this.index], --m.count.length), 0 === m.count.length && n && b[n] && (h || (b[n] = b[n].destroy()), b[n + "m"] && (this.markerGroup.clip(), b[n + "m"] = b[n + "m"].destroy()))) + }, + animate: function(a) { + var b = + this.chart, + c = A(this.options.animation), + e; + a ? this.setClip(c) : (e = this.sharedClipKey, (a = b[e]) && a.animate({ + width: b.plotSizeX + }, c), b[e + "m"] && b[e + "m"].animate({ + width: b.plotSizeX + 99 + }, c), this.animate = null) + }, + afterAnimate: function() { + this.setClip(); + p(this, "afterAnimate") + }, + drawPoints: function() { + var a = this.points, + b = this.chart, + c, e, d, k, f = this.options.marker, + n, g, p, l, q = this.markerGroup, + t = E(f.enabled, this.xAxis.isRadial ? !0 : null, this.closestPointRangePx > 2 * f.radius); + if (!1 !== f.enabled || this._hasPointMarkers) + for (e = 0; e < a.length; e++) d = + a[e], c = d.plotY, k = d.graphic, n = d.marker || {}, g = !!d.marker, p = t && void 0 === n.enabled || n.enabled, l = d.isInside, p && m(c) && null !== d.y ? (c = E(n.symbol, this.symbol), d.hasImage = 0 === c.indexOf("url"), p = this.markerAttribs(d, d.selected && "select"), k ? k[l ? "show" : "hide"](!0).animate(p) : l && (0 < p.width || d.hasImage) && (d.graphic = k = b.renderer.symbol(c, p.x, p.y, p.width, p.height, g ? n : f).add(q)), k && k.attr(this.pointAttribs(d, d.selected && "select")), k && k.addClass(d.getClassName(), !0)) : k && (d.graphic = k.destroy()) + }, + markerAttribs: function(a, + b) { + var c = this.options.marker, + e = a.marker || {}, + d = E(e.radius, c.radius); + b && (c = c.states[b], b = e.states && e.states[b], d = E(b && b.radius, c && c.radius, d + (c && c.radiusPlus || 0))); + a.hasImage && (d = 0); + a = { + x: Math.floor(a.plotX) - d, + y: a.plotY - d + }; + d && (a.width = a.height = 2 * d); + return a + }, + pointAttribs: function(a, b) { + var c = this.options.marker, + e = a && a.options, + d = e && e.marker || {}, + h = this.color, + f = e && e.color, + n = a && a.color, + e = E(d.lineWidth, c.lineWidth); + a = a && a.zone && a.zone.color; + h = f || a || n || h; + a = d.fillColor || c.fillColor || h; + h = d.lineColor || c.lineColor || + h; + b && (c = c.states[b], b = d.states && d.states[b] || {}, e = E(b.lineWidth, c.lineWidth, e + E(b.lineWidthPlus, c.lineWidthPlus, 0)), a = b.fillColor || c.fillColor || a, h = b.lineColor || c.lineColor || h); + return { + stroke: h, + "stroke-width": e, + fill: a + } + }, + destroy: function() { + var a = this, + b = a.chart, + c = /AppleWebKit\/533/.test(w.navigator.userAgent), + e, f = a.data || [], + k, n, m; + p(a, "destroy"); + z(a); + q(a.axisTypes || [], function(b) { + (m = a[b]) && m.series && (d(m.series, a), m.isDirty = m.forceRedraw = !0) + }); + a.legendItem && a.chart.legend.destroyItem(a); + for (e = f.length; e--;)(k = + f[e]) && k.destroy && k.destroy(); + a.points = null; + clearTimeout(a.animationTimeout); + for (n in a) a[n] instanceof x && !a[n].survive && (e = c && "group" === n ? "hide" : "destroy", a[n][e]()); + b.hoverSeries === a && (b.hoverSeries = null); + d(b.series, a); + b.orderSeries(); + for (n in a) delete a[n] + }, + getGraphPath: function(a, b, c) { + var e = this, + d = e.options, + h = d.step, + f, n = [], + m = [], + g; + a = a || e.points; + (f = a.reversed) && a.reverse(); + (h = { + right: 1, + center: 2 + }[h] || h && 3) && f && (h = 4 - h); + !d.connectNulls || b || c || (a = this.getValidPoints(a)); + q(a, function(f, k) { + var p = f.plotX, + q = f.plotY, + t = a[k - 1]; + (f.leftCliff || t && t.rightCliff) && !c && (g = !0); + f.isNull && !l(b) && 0 < k ? g = !d.connectNulls : f.isNull && !b ? g = !0 : (0 === k || g ? k = ["M", f.plotX, f.plotY] : e.getPointSpline ? k = e.getPointSpline(a, f, k) : h ? (k = 1 === h ? ["L", t.plotX, q] : 2 === h ? ["L", (t.plotX + p) / 2, t.plotY, "L", (t.plotX + p) / 2, q] : ["L", p, t.plotY], k.push("L", p, q)) : k = ["L", p, q], m.push(f.x), h && m.push(f.x), n.push.apply(n, k), g = !1) + }); + n.xMap = m; + return e.graphPath = n + }, + drawGraph: function() { + var a = this, + b = this.options, + c = (this.gappedPath || this.getGraphPath).call(this), + e = [ + ["graph", "highcharts-graph", b.lineColor || this.color, b.dashStyle] + ]; + q(this.zones, function(c, d) { + e.push(["zone-graph-" + d, "highcharts-graph highcharts-zone-graph-" + d + " " + (c.className || ""), c.color || a.color, c.dashStyle || b.dashStyle]) + }); + q(e, function(e, d) { + var h = e[0], + f = a[h]; + f ? (f.endX = c.xMap, f.animate({ + d: c + })) : c.length && (a[h] = a.chart.renderer.path(c).addClass(e[1]).attr({ + zIndex: 1 + }).add(a.group), f = { + stroke: e[2], + "stroke-width": b.lineWidth, + fill: a.fillGraph && a.color || "none" + }, e[3] ? f.dashstyle = e[3] : "square" !== b.linecap && + (f["stroke-linecap"] = f["stroke-linejoin"] = "round"), f = a[h].attr(f).shadow(2 > d && b.shadow)); + f && (f.startX = c.xMap, f.isArea = c.isArea) + }) + }, + applyZones: function() { + var a = this, + b = this.chart, + c = b.renderer, + e = this.zones, + d, f, n = this.clips || [], + m, g = this.graph, + p = this.area, + l = Math.max(b.chartWidth, b.chartHeight), + t = this[(this.zoneAxis || "y") + "Axis"], + w, x, r = b.inverted, + z, F, u, C, A = !1; + e.length && (g || p) && t && void 0 !== t.min && (x = t.reversed, z = t.horiz, g && g.hide(), p && p.hide(), w = t.getExtremes(), q(e, function(e, h) { + d = x ? z ? b.plotWidth : 0 : z ? 0 : + t.toPixels(w.min); + d = Math.min(Math.max(E(f, d), 0), l); + f = Math.min(Math.max(Math.round(t.toPixels(E(e.value, w.max), !0)), 0), l); + A && (d = f = t.toPixels(w.max)); + F = Math.abs(d - f); + u = Math.min(d, f); + C = Math.max(d, f); + t.isXAxis ? (m = { + x: r ? C : u, + y: 0, + width: F, + height: l + }, z || (m.x = b.plotHeight - m.x)) : (m = { + x: 0, + y: r ? C : u, + width: l, + height: F + }, z && (m.y = b.plotWidth - m.y)); + r && c.isVML && (m = t.isXAxis ? { + x: 0, + y: x ? u : C, + height: m.width, + width: b.chartWidth + } : { + x: m.y - b.plotLeft - b.spacingBox.x, + y: 0, + width: m.height, + height: b.chartHeight + }); + n[h] ? n[h].animate(m) : (n[h] = + c.clipRect(m), g && a["zone-graph-" + h].clip(n[h]), p && a["zone-area-" + h].clip(n[h])); + A = e.value > w.max + }), this.clips = n) + }, + invertGroups: function(a) { + function b() { + q(["group", "markerGroup"], function(b) { + c[b] && (c[b].width = c.yAxis.len, c[b].height = c.xAxis.len, c[b].invert(a)) + }) + } + var c = this, + e; + c.xAxis && (e = B(c.chart, "resize", b), B(c, "destroy", e), b(a), c.invertGroups = b) + }, + plotGroup: function(a, b, c, e, d) { + var h = this[a], + f = !h; + f && (this[a] = h = this.chart.renderer.g(b).attr({ + zIndex: e || .1 + }).add(d), h.addClass("highcharts-series-" + this.index + + " highcharts-" + this.type + "-series highcharts-color-" + this.colorIndex + " " + (this.options.className || ""))); + h.attr({ + visibility: c + })[f ? "attr" : "animate"](this.getPlotBox()); + return h + }, + getPlotBox: function() { + var a = this.chart, + b = this.xAxis, + c = this.yAxis; + a.inverted && (b = c, c = this.xAxis); + return { + translateX: b ? b.left : a.plotLeft, + translateY: c ? c.top : a.plotTop, + scaleX: 1, + scaleY: 1 + } + }, + render: function() { + var a = this, + b = a.chart, + c, e = a.options, + d = !!a.animate && b.renderer.isSVG && A(e.animation).duration, + f = a.visible ? "inherit" : "hidden", + n = + e.zIndex, + m = a.hasRendered, + g = b.seriesGroup, + p = b.inverted; + c = a.plotGroup("group", "series", f, n, g); + a.markerGroup = a.plotGroup("markerGroup", "markers", f, n, g); + d && a.animate(!0); + c.inverted = a.isCartesian ? p : !1; + a.drawGraph && (a.drawGraph(), a.applyZones()); + a.drawDataLabels && a.drawDataLabels(); + a.visible && a.drawPoints(); + a.drawTracker && !1 !== a.options.enableMouseTracking && a.drawTracker(); + a.invertGroups(p); + !1 === e.clip || a.sharedClipKey || m || c.clip(b.clipRect); + d && a.animate(); + m || (a.animationTimeout = F(function() { + a.afterAnimate() + }, + d)); + a.isDirty = !1; + a.hasRendered = !0 + }, + redraw: function() { + var a = this.chart, + b = this.isDirty || this.isDirtyData, + c = this.group, + e = this.xAxis, + d = this.yAxis; + c && (a.inverted && c.attr({ + width: a.plotWidth, + height: a.plotHeight + }), c.animate({ + translateX: E(e && e.left, a.plotLeft), + translateY: E(d && d.top, a.plotTop) + })); + this.translate(); + this.render(); + b && delete this.kdTree + }, + kdDimensions: 1, + kdAxisArray: ["clientX", "plotY"], + searchPoint: function(a, b) { + var c = this.xAxis, + e = this.yAxis, + d = this.chart.inverted; + return this.searchKDTree({ + clientX: d ? + c.len - a.chartY + c.pos : a.chartX - c.pos, + plotY: d ? e.len - a.chartX + e.pos : a.chartY - e.pos + }, b) + }, + buildKDTree: function() { + function a(c, e, d) { + var h, f; + if (f = c && c.length) return h = b.kdAxisArray[e % d], c.sort(function(a, b) { + return a[h] - b[h] + }), f = Math.floor(f / 2), { + point: c[f], + left: a(c.slice(0, f), e + 1, d), + right: a(c.slice(f + 1), e + 1, d) + } + } + this.buildingKdTree = !0; + var b = this, + c = b.kdDimensions; + delete b.kdTree; + F(function() { + b.kdTree = a(b.getValidPoints(null, !b.directTouch), c, c); + b.buildingKdTree = !1 + }, b.options.kdNow ? 0 : 1) + }, + searchKDTree: function(a, + b) { + function c(a, b, k, n) { + var m = b.point, + g = e.kdAxisArray[k % n], + p, t, q = m; + t = l(a[d]) && l(m[d]) ? Math.pow(a[d] - m[d], 2) : null; + p = l(a[h]) && l(m[h]) ? Math.pow(a[h] - m[h], 2) : null; + p = (t || 0) + (p || 0); + m.dist = l(p) ? Math.sqrt(p) : Number.MAX_VALUE; + m.distX = l(t) ? Math.sqrt(t) : Number.MAX_VALUE; + g = a[g] - m[g]; + p = 0 > g ? "left" : "right"; + t = 0 > g ? "right" : "left"; + b[p] && (p = c(a, b[p], k + 1, n), q = p[f] < q[f] ? p : m); + b[t] && Math.sqrt(g * g) < q[f] && (a = c(a, b[t], k + 1, n), q = a[f] < q[f] ? a : q); + return q + } + var e = this, + d = this.kdAxisArray[0], + h = this.kdAxisArray[1], + f = b ? "distX" : "dist"; + this.kdTree || this.buildingKdTree || this.buildKDTree(); + if (this.kdTree) return c(a, this.kdTree, this.kdDimensions, this.kdDimensions) + } + }) + })(L); + (function(a) { + function B(a, d, b, f, g) { + var p = a.chart.inverted; + this.axis = a; + this.isNegative = b; + this.options = d; + this.x = f; + this.total = null; + this.points = {}; + this.stack = g; + this.rightCliff = this.leftCliff = 0; + this.alignOptions = { + align: d.align || (p ? b ? "left" : "right" : "center"), + verticalAlign: d.verticalAlign || (p ? "middle" : b ? "bottom" : "top"), + y: l(d.y, p ? 4 : b ? 14 : -6), + x: l(d.x, p ? b ? -6 : 6 : 0) + }; + this.textAlign = + d.textAlign || (p ? b ? "right" : "left" : "center") + } + var A = a.Axis, + H = a.Chart, + G = a.correctFloat, + r = a.defined, + g = a.destroyObjectProperties, + f = a.each, + u = a.format, + l = a.pick; + a = a.Series; + B.prototype = { + destroy: function() { + g(this, this.axis) + }, + render: function(a) { + var d = this.options, + b = d.format, + b = b ? u(b, this) : d.formatter.call(this); + this.label ? this.label.attr({ + text: b, + visibility: "hidden" + }) : this.label = this.axis.chart.renderer.text(b, null, null, d.useHTML).css(d.style).attr({ + align: this.textAlign, + rotation: d.rotation, + visibility: "hidden" + }).add(a) + }, + setOffset: function(a, d) { + var b = this.axis, + f = b.chart, + g = f.inverted, + l = b.reversed, + l = this.isNegative && !l || !this.isNegative && l, + m = b.translate(b.usePercentage ? 100 : this.total, 0, 0, 0, 1), + b = b.translate(0), + b = Math.abs(m - b); + a = f.xAxis[0].translate(this.x) + a; + var c = f.plotHeight, + g = { + x: g ? l ? m : m - b : a, + y: g ? c - a - d : l ? c - m - b : c - m, + width: g ? b : d, + height: g ? d : b + }; + if (d = this.label) d.align(this.alignOptions, null, g), g = d.alignAttr, d[!1 === this.options.crop || f.isInsidePlot(g.x, g.y) ? "show" : "hide"](!0) + } + }; + H.prototype.getStacks = function() { + var a = this; + f(a.yAxis, function(a) { + a.stacks && a.hasVisibleSeries && (a.oldStacks = a.stacks) + }); + f(a.series, function(d) { + !d.options.stacking || !0 !== d.visible && !1 !== a.options.chart.ignoreHiddenSeries || (d.stackKey = d.type + l(d.options.stack, "")) + }) + }; + A.prototype.buildStacks = function() { + var a = this.series, + d, b = l(this.options.reversedStacks, !0), + f = a.length, + g; + if (!this.isXAxis) { + this.usePercentage = !1; + for (g = f; g--;) a[b ? g : f - g - 1].setStackedPoints(); + for (g = f; g--;) d = a[b ? g : f - g - 1], d.setStackCliffs && d.setStackCliffs(); + if (this.usePercentage) + for (g = + 0; g < f; g++) a[g].setPercentStacks() + } + }; + A.prototype.renderStackTotals = function() { + var a = this.chart, + d = a.renderer, + b = this.stacks, + f, g, l = this.stackTotalGroup; + l || (this.stackTotalGroup = l = d.g("stack-labels").attr({ + visibility: "visible", + zIndex: 6 + }).add()); + l.translate(a.plotLeft, a.plotTop); + for (f in b) + for (g in a = b[f], a) a[g].render(l) + }; + A.prototype.resetStacks = function() { + var a = this.stacks, + d, b; + if (!this.isXAxis) + for (d in a) + for (b in a[d]) a[d][b].touched < this.stacksTouched ? (a[d][b].destroy(), delete a[d][b]) : (a[d][b].total = + null, a[d][b].cum = null) + }; + A.prototype.cleanStacks = function() { + var a, d, b; + if (!this.isXAxis) + for (d in this.oldStacks && (a = this.stacks = this.oldStacks), a) + for (b in a[d]) a[d][b].cum = a[d][b].total + }; + a.prototype.setStackedPoints = function() { + if (this.options.stacking && (!0 === this.visible || !1 === this.chart.options.chart.ignoreHiddenSeries)) { + var a = this.processedXData, + d = this.processedYData, + b = [], + f = d.length, + g = this.options, + t = g.threshold, + m = g.startFromThreshold ? t : 0, + c = g.stack, + g = g.stacking, + n = this.stackKey, + u = "-" + n, + z = this.negStacks, + e = this.yAxis, + x = e.stacks, + F = e.oldStacks, + w, h, y, A, K, I, k; + e.stacksTouched += 1; + for (K = 0; K < f; K++) I = a[K], k = d[K], w = this.getStackIndicator(w, I, this.index), A = w.key, y = (h = z && k < (m ? 0 : t)) ? u : n, x[y] || (x[y] = {}), x[y][I] || (F[y] && F[y][I] ? (x[y][I] = F[y][I], x[y][I].total = null) : x[y][I] = new B(e, e.options.stackLabels, h, I, c)), y = x[y][I], null !== k && (y.points[A] = y.points[this.index] = [l(y.cum, m)], r(y.cum) || (y.base = A), y.touched = e.stacksTouched, 0 < w.index && !1 === this.singleStacks && (y.points[A][0] = y.points[this.index + "," + I + ",0"][0])), "percent" === + g ? (h = h ? n : u, z && x[h] && x[h][I] ? (h = x[h][I], y.total = h.total = Math.max(h.total, y.total) + Math.abs(k) || 0) : y.total = G(y.total + (Math.abs(k) || 0))) : y.total = G(y.total + (k || 0)), y.cum = l(y.cum, m) + (k || 0), null !== k && (y.points[A].push(y.cum), b[K] = y.cum); + "percent" === g && (e.usePercentage = !0); + this.stackedYData = b; + e.oldStacks = {} + } + }; + a.prototype.setPercentStacks = function() { + var a = this, + d = a.stackKey, + b = a.yAxis.stacks, + g = a.processedXData, + l; + f([d, "-" + d], function(d) { + for (var f = g.length, c, n; f--;) + if (c = g[f], l = a.getStackIndicator(l, c, a.index, + d), c = (n = b[d] && b[d][c]) && n.points[l.key]) n = n.total ? 100 / n.total : 0, c[0] = G(c[0] * n), c[1] = G(c[1] * n), a.stackedYData[f] = c[1] + }) + }; + a.prototype.getStackIndicator = function(a, d, b, f) { + !r(a) || a.x !== d || f && a.key !== f ? a = { + x: d, + index: 0, + key: f + } : a.index++; + a.key = [b, d, a.index].join(); + return a + } + })(L); + (function(a) { + var B = a.addEvent, + A = a.animate, + H = a.Axis, + G = a.createElement, + r = a.css, + g = a.defined, + f = a.each, + u = a.erase, + l = a.extend, + q = a.fireEvent, + d = a.inArray, + b = a.isNumber, + p = a.isObject, + C = a.merge, + t = a.pick, + m = a.Point, + c = a.Series, + n = a.seriesTypes, + E = a.setAnimation, + z = a.splat; + l(a.Chart.prototype, { + addSeries: function(a, b, c) { + var e, d = this; + a && (b = t(b, !0), q(d, "addSeries", { + options: a + }, function() { + e = d.initSeries(a); + d.isDirtyLegend = !0; + d.linkSeries(); + b && d.redraw(c) + })); + return e + }, + addAxis: function(a, b, c, d) { + var e = b ? "xAxis" : "yAxis", + f = this.options; + a = C(a, { + index: this[e].length, + isX: b + }); + new H(this, a); + f[e] = z(f[e] || {}); + f[e].push(a); + t(c, !0) && this.redraw(d) + }, + showLoading: function(a) { + var b = this, + c = b.options, + e = b.loadingDiv, + d = c.loading, + f = function() { + e && r(e, { + left: b.plotLeft + "px", + top: b.plotTop + + "px", + width: b.plotWidth + "px", + height: b.plotHeight + "px" + }) + }; + e || (b.loadingDiv = e = G("div", { + className: "highcharts-loading highcharts-loading-hidden" + }, null, b.container), b.loadingSpan = G("span", { + className: "highcharts-loading-inner" + }, null, e), B(b, "redraw", f)); + e.className = "highcharts-loading"; + b.loadingSpan.innerHTML = a || c.lang.loading; + r(e, l(d.style, { + zIndex: 10 + })); + r(b.loadingSpan, d.labelStyle); + b.loadingShown || (r(e, { + opacity: 0, + display: "" + }), A(e, { + opacity: d.style.opacity || .5 + }, { + duration: d.showDuration || 0 + })); + b.loadingShown = !0; + f() + }, + hideLoading: function() { + var a = this.options, + b = this.loadingDiv; + b && (b.className = "highcharts-loading highcharts-loading-hidden", A(b, { + opacity: 0 + }, { + duration: a.loading.hideDuration || 100, + complete: function() { + r(b, { + display: "none" + }) + } + })); + this.loadingShown = !1 + }, + propsRequireDirtyBox: "backgroundColor borderColor borderWidth margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "), + propsRequireUpdateSeries: "chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions".split(" "), + update: function(a, c) { + var e, n = { + credits: "addCredits", + title: "setTitle", + subtitle: "setSubtitle" + }, + h = a.chart, + m, p; + if (h) { + C(!0, this.options.chart, h); + "className" in h && this.setClassName(h.className); + if ("inverted" in h || "polar" in h) this.propFromSeries(), m = !0; + for (e in h) h.hasOwnProperty(e) && (-1 !== d("chart." + e, this.propsRequireUpdateSeries) && (p = !0), -1 !== d(e, this.propsRequireDirtyBox) && (this.isDirtyBox = !0)); + "style" in h && this.renderer.setStyle(h.style) + } + for (e in a) { + if (this[e] && "function" === typeof this[e].update) this[e].update(a[e], !1); + else if ("function" === typeof this[n[e]]) this[n[e]](a[e]); + "chart" !== e && -1 !== d(e, this.propsRequireUpdateSeries) && (p = !0) + } + a.colors && (this.options.colors = a.colors); + a.plotOptions && C(!0, this.options.plotOptions, a.plotOptions); + f(["xAxis", "yAxis", "series"], function(b) { + a[b] && f(z(a[b]), function(a, c) { + (c = g(a.id) && this.get(a.id) || this[b][c]) && c.coll === b && c.update(a, !1) + }, this) + }, this); + m && f(this.axes, function(a) { + a.update({}, !1) + }); + p && f(this.series, function(a) { + a.update({}, !1) + }); + a.loading && C(!0, this.options.loading, a.loading); + e = h && h.width; + h = h && h.height; + b(e) && e !== this.chartWidth || b(h) && h !== this.chartHeight ? this.setSize(e, h) : t(c, !0) && this.redraw() + }, + setSubtitle: function(a) { + this.setTitle(void 0, a) + } + }); + l(m.prototype, { + update: function(a, b, c, d) { + function e() { + f.applyOptions(a); + null === f.y && n && (f.graphic = n.destroy()); + p(a, !0) && (n && n.element && a && a.marker && a.marker.symbol && (f.graphic = n.destroy()), + a && a.dataLabels && f.dataLabel && (f.dataLabel = f.dataLabel.destroy())); + m = f.index; + g.updateParallelArrays(f, m); + l.data[m] = p(l.data[m], !0) ? f.options : a; + g.isDirty = g.isDirtyData = !0; + !g.fixedBox && g.hasCartesianSeries && (k.isDirtyBox = !0); + "point" === l.legendType && (k.isDirtyLegend = !0); + b && k.redraw(c) + } + var f = this, + g = f.series, + n = f.graphic, + m, k = g.chart, + l = g.options; + b = t(b, !0); + !1 === d ? e() : f.firePointEvent("update", { + options: a + }, e) + }, + remove: function(a, b) { + this.series.removePoint(d(this, this.series.data), a, b) + } + }); + l(c.prototype, { + addPoint: function(a, + b, c, d) { + var e = this.options, + f = this.data, + g = this.chart, + n = this.xAxis, + n = n && n.hasNames && n.names, + m = e.data, + k, p, l = this.xData, + q, w; + b = t(b, !0); + k = { + series: this + }; + this.pointClass.prototype.applyOptions.apply(k, [a]); + w = k.x; + q = l.length; + if (this.requireSorting && w < l[q - 1]) + for (p = !0; q && l[q - 1] > w;) q--; + this.updateParallelArrays(k, "splice", q, 0, 0); + this.updateParallelArrays(k, q); + n && k.name && (n[w] = k.name); + m.splice(q, 0, a); + p && (this.data.splice(q, 0, null), this.processData()); + "point" === e.legendType && this.generatePoints(); + c && (f[0] && f[0].remove ? + f[0].remove(!1) : (f.shift(), this.updateParallelArrays(k, "shift"), m.shift())); + this.isDirtyData = this.isDirty = !0; + b && g.redraw(d) + }, + removePoint: function(a, b, c) { + var e = this, + d = e.data, + f = d[a], + g = e.points, + n = e.chart, + m = function() { + g && g.length === d.length && g.splice(a, 1); + d.splice(a, 1); + e.options.data.splice(a, 1); + e.updateParallelArrays(f || { + series: e + }, "splice", a, 1); + f && f.destroy(); + e.isDirty = !0; + e.isDirtyData = !0; + b && n.redraw() + }; + E(c, n); + b = t(b, !0); + f ? f.firePointEvent("remove", null, m) : m() + }, + remove: function(a, b, c) { + function e() { + d.destroy(); + f.isDirtyLegend = f.isDirtyBox = !0; + f.linkSeries(); + t(a, !0) && f.redraw(b) + } + var d = this, + f = d.chart; + !1 !== c ? q(d, "remove", null, e) : e() + }, + update: function(a, b) { + var c = this, + e = this.chart, + d = this.userOptions, + g = this.type, + m = a.type || d.type || e.options.chart.type, + p = n[g].prototype, + q = ["group", "markerGroup", "dataLabelsGroup"], + k; + if (m && m !== g || void 0 !== a.zIndex) q.length = 0; + f(q, function(a) { + q[a] = c[a]; + delete c[a] + }); + a = C(d, { + animation: !1, + index: this.index, + pointStart: this.xData[0] + }, { + data: this.options.data + }, a); + this.remove(!1, null, !1); + for (k in p) this[k] = + void 0; + l(this, n[m || g].prototype); + f(q, function(a) { + c[a] = q[a] + }); + this.init(e, a); + e.linkSeries(); + t(b, !0) && e.redraw(!1) + } + }); + l(H.prototype, { + update: function(a, b) { + var c = this.chart; + a = c.options[this.coll][this.options.index] = C(this.userOptions, a); + this.destroy(!0); + this.init(c, l(a, { + events: void 0 + })); + c.isDirtyBox = !0; + t(b, !0) && c.redraw() + }, + remove: function(a) { + for (var b = this.chart, c = this.coll, e = this.series, d = e.length; d--;) e[d] && e[d].remove(!1); + u(b.axes, this); + u(b[c], this); + b.options[c].splice(this.options.index, 1); + f(b[c], + function(a, b) { + a.options.index = b + }); + this.destroy(); + b.isDirtyBox = !0; + t(a, !0) && b.redraw() + }, + setTitle: function(a, b) { + this.update({ + title: a + }, b) + }, + setCategories: function(a, b) { + this.update({ + categories: a + }, b) + } + }) + })(L); + (function(a) { + var B = a.color, + A = a.each, + H = a.map, + G = a.pick, + r = a.Series, + g = a.seriesType; + g("area", "line", { + softThreshold: !1, + threshold: 0 + }, { + singleStacks: !1, + getStackPoints: function() { + var a = [], + g = [], + l = this.xAxis, + q = this.yAxis, + d = q.stacks[this.stackKey], + b = {}, + p = this.points, + r = this.index, + t = q.series, + m = t.length, + c, n = G(q.options.reversedStacks, !0) ? 1 : -1, + E, z; + if (this.options.stacking) { + for (E = 0; E < p.length; E++) b[p[E].x] = p[E]; + for (z in d) null !== d[z].total && g.push(z); + g.sort(function(a, b) { + return a - b + }); + c = H(t, function() { + return this.visible + }); + A(g, function(e, f) { + var p = 0, + t, h; + if (b[e] && !b[e].isNull) a.push(b[e]), A([-1, 1], function(a) { + var p = 1 === a ? "rightNull" : "leftNull", + l = 0, + q = d[g[f + a]]; + if (q) + for (E = r; 0 <= E && E < m;) t = q.points[E], t || (E === r ? b[e][p] = !0 : c[E] && (h = d[e].points[E]) && (l -= h[1] - h[0])), E += n; + b[e][1 === a ? "rightCliff" : "leftCliff"] = l + }); + else { + for (E = r; 0 <= E && E < m;) { + if (t = + d[e].points[E]) { + p = t[1]; + break + } + E += n + } + p = q.toPixels(p, !0); + a.push({ + isNull: !0, + plotX: l.toPixels(e, !0), + plotY: p, + yBottom: p + }) + } + }) + } + return a + }, + getGraphPath: function(a) { + var f = r.prototype.getGraphPath, + g = this.options, + q = g.stacking, + d = this.yAxis, + b, p, C = [], + t = [], + m = this.index, + c, n = d.stacks[this.stackKey], + E = g.threshold, + z = d.getThreshold(g.threshold), + e, g = g.connectNulls || "percent" === q, + x = function(b, e, f) { + var h = a[b]; + b = q && n[h.x].points[m]; + var g = h[f + "Null"] || 0; + f = h[f + "Cliff"] || 0; + var p, l, h = !0; + f || g ? (p = (g ? b[0] : b[1]) + f, l = b[0] + f, h = !!g) : !q && + a[e] && a[e].isNull && (p = l = E); + void 0 !== p && (t.push({ + plotX: c, + plotY: null === p ? z : d.getThreshold(p), + isNull: h + }), C.push({ + plotX: c, + plotY: null === l ? z : d.getThreshold(l), + doCurve: !1 + })) + }; + a = a || this.points; + q && (a = this.getStackPoints()); + for (b = 0; b < a.length; b++) + if (p = a[b].isNull, c = G(a[b].rectPlotX, a[b].plotX), e = G(a[b].yBottom, z), !p || g) g || x(b, b - 1, "left"), p && !q && g || (t.push(a[b]), C.push({ + x: b, + plotX: c, + plotY: e + })), g || x(b, b + 1, "right"); + b = f.call(this, t, !0, !0); + C.reversed = !0; + p = f.call(this, C, !0, !0); + p.length && (p[0] = "L"); + p = b.concat(p); + f = + f.call(this, t, !1, g); + p.xMap = b.xMap; + this.areaPath = p; + return f + }, + drawGraph: function() { + this.areaPath = []; + r.prototype.drawGraph.apply(this); + var a = this, + g = this.areaPath, + l = this.options, + q = [ + ["area", "highcharts-area", this.color, l.fillColor] + ]; + A(this.zones, function(d, b) { + q.push(["zone-area-" + b, "highcharts-area highcharts-zone-area-" + b + " " + d.className, d.color || a.color, d.fillColor || l.fillColor]) + }); + A(q, function(d) { + var b = d[0], + f = a[b]; + f ? (f.endX = g.xMap, f.animate({ + d: g + })) : (f = a[b] = a.chart.renderer.path(g).addClass(d[1]).attr({ + fill: G(d[3], + B(d[2]).setOpacity(G(l.fillOpacity, .75)).get()), + zIndex: 0 + }).add(a.group), f.isArea = !0); + f.startX = g.xMap; + f.shiftUnit = l.step ? 2 : 1 + }) + }, + drawLegendSymbol: a.LegendSymbolMixin.drawRectangle + }) + })(L); + (function(a) { + var B = a.pick; + a = a.seriesType; + a("spline", "line", {}, { + getPointSpline: function(a, H, G) { + var r = H.plotX, + g = H.plotY, + f = a[G - 1]; + G = a[G + 1]; + var u, l, q, d; + if (f && !f.isNull && !1 !== f.doCurve && G && !G.isNull && !1 !== G.doCurve) { + a = f.plotY; + q = G.plotX; + G = G.plotY; + var b = 0; + u = (1.5 * r + f.plotX) / 2.5; + l = (1.5 * g + a) / 2.5; + q = (1.5 * r + q) / 2.5; + d = (1.5 * g + G) / 2.5; + q !== u && (b = (d - l) * (q - r) / (q - u) + g - d); + l += b; + d += b; + l > a && l > g ? (l = Math.max(a, g), d = 2 * g - l) : l < a && l < g && (l = Math.min(a, g), d = 2 * g - l); + d > G && d > g ? (d = Math.max(G, g), l = 2 * g - d) : d < G && d < g && (d = Math.min(G, g), l = 2 * g - d); + H.rightContX = q; + H.rightContY = d + } + H = ["C", B(f.rightContX, f.plotX), B(f.rightContY, f.plotY), B(u, r), B(l, g), r, g]; + f.rightContX = f.rightContY = null; + return H + } + }) + })(L); + (function(a) { + var B = a.seriesTypes.area.prototype, + A = a.seriesType; + A("areaspline", "spline", a.defaultPlotOptions.area, { + getStackPoints: B.getStackPoints, + getGraphPath: B.getGraphPath, + setStackCliffs: B.setStackCliffs, + drawGraph: B.drawGraph, + drawLegendSymbol: a.LegendSymbolMixin.drawRectangle + }) + })(L); + (function(a) { + var B = a.animObject, + A = a.color, + H = a.each, + G = a.extend, + r = a.isNumber, + g = a.merge, + f = a.pick, + u = a.Series, + l = a.seriesType, + q = a.svg; + l("column", "line", { + borderRadius: 0, + groupPadding: .2, + marker: null, + pointPadding: .1, + minPointLength: 0, + cropThreshold: 50, + pointRange: null, + states: { + hover: { + halo: !1, + brightness: .1, + shadow: !1 + }, + select: { + color: "#cccccc", + borderColor: "#000000", + shadow: !1 + } + }, + dataLabels: { + align: null, + verticalAlign: null, + y: null + }, + softThreshold: !1, + startFromThreshold: !0, + stickyTracking: !1, + tooltip: { + distance: 6 + }, + threshold: 0, + borderColor: "#ffffff" + }, { + cropShoulder: 0, + directTouch: !0, + trackerGroups: ["group", "dataLabelsGroup"], + negStacks: !0, + init: function() { + u.prototype.init.apply(this, arguments); + var a = this, + b = a.chart; + b.hasRendered && H(b.series, function(b) { + b.type === a.type && (b.isDirty = !0) + }) + }, + getColumnMetrics: function() { + var a = this, + b = a.options, + g = a.xAxis, + l = a.yAxis, + t = g.reversed, + m, c = {}, + n = 0; + !1 === b.grouping ? n = 1 : H(a.chart.series, function(b) { + var e = + b.options, + d = b.yAxis, + f; + b.type === a.type && b.visible && l.len === d.len && l.pos === d.pos && (e.stacking ? (m = b.stackKey, void 0 === c[m] && (c[m] = n++), f = c[m]) : !1 !== e.grouping && (f = n++), b.columnIndex = f) + }); + var q = Math.min(Math.abs(g.transA) * (g.ordinalSlope || b.pointRange || g.closestPointRange || g.tickInterval || 1), g.len), + r = q * b.groupPadding, + e = (q - 2 * r) / (n || 1), + b = Math.min(b.maxPointWidth || g.len, f(b.pointWidth, e * (1 - 2 * b.pointPadding))); + a.columnMetrics = { + width: b, + offset: (e - b) / 2 + (r + ((a.columnIndex || 0) + (t ? 1 : 0)) * e - q / 2) * (t ? -1 : 1) + }; + return a.columnMetrics + }, + crispCol: function(a, b, f, g) { + var d = this.chart, + m = this.borderWidth, + c = -(m % 2 ? .5 : 0), + m = m % 2 ? .5 : 1; + d.inverted && d.renderer.isVML && (m += 1); + f = Math.round(a + f) + c; + a = Math.round(a) + c; + g = Math.round(b + g) + m; + c = .5 >= Math.abs(b) && .5 < g; + b = Math.round(b) + m; + g -= b; + c && g && (--b, g += 1); + return { + x: a, + y: b, + width: f - a, + height: g + } + }, + translate: function() { + var a = this, + b = a.chart, + g = a.options, + l = a.dense = 2 > a.closestPointRange * a.xAxis.transA, + l = a.borderWidth = f(g.borderWidth, l ? 0 : 1), + t = a.yAxis, + m = a.translatedThreshold = t.getThreshold(g.threshold), + c = f(g.minPointLength, + 5), + n = a.getColumnMetrics(), + q = n.width, + r = a.barW = Math.max(q, 1 + 2 * l), + e = a.pointXOffset = n.offset; + b.inverted && (m -= .5); + g.pointPadding && (r = Math.ceil(r)); + u.prototype.translate.apply(a); + H(a.points, function(d) { + var g = f(d.yBottom, m), + n = 999 + Math.abs(g), + n = Math.min(Math.max(-n, d.plotY), t.len + n), + h = d.plotX + e, + l = r, + p = Math.min(n, g), + z, x = Math.max(n, g) - p; + Math.abs(x) < c && c && (x = c, z = !t.reversed && !d.negative || t.reversed && d.negative, p = Math.abs(p - m) > c ? g - c : m - (z ? c : 0)); + d.barX = h; + d.pointWidth = q; + d.tooltipPos = b.inverted ? [t.len + t.pos - b.plotLeft - + n, a.xAxis.len - h - l / 2, x + ] : [h + l / 2, n + t.pos - b.plotTop, x]; + d.shapeType = "rect"; + d.shapeArgs = a.crispCol.apply(a, d.isNull ? [d.plotX, t.len / 2, 0, 0] : [h, p, l, x]) + }) + }, + getSymbol: a.noop, + drawLegendSymbol: a.LegendSymbolMixin.drawRectangle, + drawGraph: function() { + this.group[this.dense ? "addClass" : "removeClass"]("highcharts-dense-data") + }, + pointAttribs: function(a, b) { + var d = this.options, + f, g = this.pointAttrToOptions || {}; + f = g.stroke || "borderColor"; + var m = g["stroke-width"] || "borderWidth", + c = a && a.color || this.color, + n = a[f] || d[f] || this.color || + c, + l = a[m] || d[m] || this[m] || 0, + g = d.dashStyle; + a && this.zones.length && (c = (c = a.getZone()) && c.color || a.options.color || this.color); + b && (a = d.states[b], b = a.brightness, c = a.color || void 0 !== b && A(c).brighten(a.brightness).get() || c, n = a[f] || n, l = a[m] || l, g = a.dashStyle || g); + f = { + fill: c, + stroke: n, + "stroke-width": l + }; + d.borderRadius && (f.r = d.borderRadius); + g && (f.dashstyle = g); + return f + }, + drawPoints: function() { + var a = this, + b = this.chart, + f = a.options, + l = b.renderer, + t = f.animationLimit || 250, + m; + H(a.points, function(c) { + var d = c.graphic; + if (r(c.plotY) && + null !== c.y) { + m = c.shapeArgs; + if (d) d[b.pointCount < t ? "animate" : "attr"](g(m)); + else c.graphic = d = l[c.shapeType](m).attr({ + "class": c.getClassName() + }).add(c.group || a.group); + d.attr(a.pointAttribs(c, c.selected && "select")).shadow(f.shadow, null, f.stacking && !f.borderRadius) + } else d && (c.graphic = d.destroy()) + }) + }, + animate: function(a) { + var b = this, + d = this.yAxis, + f = b.options, + g = this.chart.inverted, + m = {}; + q && (a ? (m.scaleY = .001, a = Math.min(d.pos + d.len, Math.max(d.pos, d.toPixels(f.threshold))), g ? m.translateX = a - d.len : m.translateY = a, b.group.attr(m)) : + (m[g ? "translateX" : "translateY"] = d.pos, b.group.animate(m, G(B(b.options.animation), { + step: function(a, d) { + b.group.attr({ + scaleY: Math.max(.001, d.pos) + }) + } + })), b.animate = null)) + }, + remove: function() { + var a = this, + b = a.chart; + b.hasRendered && H(b.series, function(b) { + b.type === a.type && (b.isDirty = !0) + }); + u.prototype.remove.apply(a, arguments) + } + }) + })(L); + (function(a) { + a = a.seriesType; + a("bar", "column", null, { + inverted: !0 + }) + })(L); + (function(a) { + var B = a.Series; + a = a.seriesType; + a("scatter", "line", { + lineWidth: 0, + marker: { + enabled: !0 + }, + tooltip: { + headerFormat: '\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cspan style\x3d"font-size: 0.85em"\x3e {series.name}\x3c/span\x3e\x3cbr/\x3e', + pointFormat: "x: \x3cb\x3e{point.x}\x3c/b\x3e\x3cbr/\x3ey: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e" + } + }, { + sorted: !1, + requireSorting: !1, + noSharedTooltip: !0, + trackerGroups: ["group", "markerGroup", "dataLabelsGroup"], + takeOrdinalPosition: !1, + kdDimensions: 2, + drawGraph: function() { + this.options.lineWidth && B.prototype.drawGraph.call(this) + } + }) + })(L); + (function(a) { + var B = a.pick, + A = a.relativeLength; + a.CenteredSeriesMixin = { + getCenter: function() { + var a = this.options, + G = this.chart, + r = 2 * (a.slicedOffset || 0), + g = G.plotWidth - 2 * r, + G = G.plotHeight - + 2 * r, + f = a.center, + f = [B(f[0], "50%"), B(f[1], "50%"), a.size || "100%", a.innerSize || 0], + u = Math.min(g, G), + l, q; + for (l = 0; 4 > l; ++l) q = f[l], a = 2 > l || 2 === l && /%$/.test(q), f[l] = A(q, [g, G, u, f[2]][l]) + (a ? r : 0); + f[3] > f[2] && (f[3] = f[2]); + return f + } + } + })(L); + (function(a) { + var B = a.addEvent, + A = a.defined, + H = a.each, + G = a.extend, + r = a.inArray, + g = a.noop, + f = a.pick, + u = a.Point, + l = a.Series, + q = a.seriesType, + d = a.setAnimation; + q("pie", "line", { + center: [null, null], + clip: !1, + colorByPoint: !0, + dataLabels: { + distance: 30, + enabled: !0, + formatter: function() { + return null === this.y ? + void 0 : this.point.name + }, + x: 0 + }, + ignoreHiddenPoint: !0, + legendType: "point", + marker: null, + size: null, + showInLegend: !1, + slicedOffset: 10, + stickyTracking: !1, + tooltip: { + followPointer: !0 + }, + borderColor: "#ffffff", + borderWidth: 1, + states: { + hover: { + brightness: .1, + shadow: !1 + } + } + }, { + isCartesian: !1, + requireSorting: !1, + directTouch: !0, + noSharedTooltip: !0, + trackerGroups: ["group", "dataLabelsGroup"], + axisTypes: [], + pointAttribs: a.seriesTypes.column.prototype.pointAttribs, + animate: function(a) { + var b = this, + d = b.points, + f = b.startAngleRad; + a || (H(d, function(a) { + var c = + a.graphic, + d = a.shapeArgs; + c && (c.attr({ + r: a.startR || b.center[3] / 2, + start: f, + end: f + }), c.animate({ + r: d.r, + start: d.start, + end: d.end + }, b.options.animation)) + }), b.animate = null) + }, + updateTotals: function() { + var a, d = 0, + f = this.points, + g = f.length, + m, c = this.options.ignoreHiddenPoint; + for (a = 0; a < g; a++) m = f[a], 0 > m.y && (m.y = null), d += c && !m.visible ? 0 : m.y; + this.total = d; + for (a = 0; a < g; a++) m = f[a], m.percentage = 0 < d && (m.visible || !c) ? m.y / d * 100 : 0, m.total = d + }, + generatePoints: function() { + l.prototype.generatePoints.call(this); + this.updateTotals() + }, + translate: function(a) { + this.generatePoints(); + var b = 0, + d = this.options, + g = d.slicedOffset, + m = g + (d.borderWidth || 0), + c, n, l, q = d.startAngle || 0, + e = this.startAngleRad = Math.PI / 180 * (q - 90), + q = (this.endAngleRad = Math.PI / 180 * (f(d.endAngle, q + 360) - 90)) - e, + r = this.points, + u = d.dataLabels.distance, + d = d.ignoreHiddenPoint, + w, h = r.length, + y; + a || (this.center = a = this.getCenter()); + this.getX = function(b, c) { + l = Math.asin(Math.min((b - a[1]) / (a[2] / 2 + u), 1)); + return a[0] + (c ? -1 : 1) * Math.cos(l) * (a[2] / 2 + u) + }; + for (w = 0; w < h; w++) { + y = r[w]; + c = e + b * q; + if (!d || y.visible) b += y.percentage / 100; + n = e + b * q; + y.shapeType = + "arc"; + y.shapeArgs = { + x: a[0], + y: a[1], + r: a[2] / 2, + innerR: a[3] / 2, + start: Math.round(1E3 * c) / 1E3, + end: Math.round(1E3 * n) / 1E3 + }; + l = (n + c) / 2; + l > 1.5 * Math.PI ? l -= 2 * Math.PI : l < -Math.PI / 2 && (l += 2 * Math.PI); + y.slicedTranslation = { + translateX: Math.round(Math.cos(l) * g), + translateY: Math.round(Math.sin(l) * g) + }; + c = Math.cos(l) * a[2] / 2; + n = Math.sin(l) * a[2] / 2; + y.tooltipPos = [a[0] + .7 * c, a[1] + .7 * n]; + y.half = l < -Math.PI / 2 || l > Math.PI / 2 ? 1 : 0; + y.angle = l; + m = Math.min(m, u / 5); + y.labelPos = [a[0] + c + Math.cos(l) * u, a[1] + n + Math.sin(l) * u, a[0] + c + Math.cos(l) * m, a[1] + n + Math.sin(l) * + m, a[0] + c, a[1] + n, 0 > u ? "center" : y.half ? "right" : "left", l + ] + } + }, + drawGraph: null, + drawPoints: function() { + var a = this, + d = a.chart.renderer, + f, g, m, c, n = a.options.shadow; + n && !a.shadowGroup && (a.shadowGroup = d.g("shadow").add(a.group)); + H(a.points, function(b) { + if (null !== b.y) { + g = b.graphic; + c = b.shapeArgs; + f = b.sliced ? b.slicedTranslation : {}; + var l = b.shadowGroup; + n && !l && (l = b.shadowGroup = d.g("shadow").add(a.shadowGroup)); + l && l.attr(f); + m = a.pointAttribs(b, b.selected && "select"); + g ? g.setRadialReference(a.center).attr(m).animate(G(c, f)) : (b.graphic = + g = d[b.shapeType](c).addClass(b.getClassName()).setRadialReference(a.center).attr(f).add(a.group), b.visible || g.attr({ + visibility: "hidden" + }), g.attr(m).attr({ + "stroke-linejoin": "round" + }).shadow(n, l)) + } + }) + }, + searchPoint: g, + sortByAngle: function(a, d) { + a.sort(function(a, b) { + return void 0 !== a.angle && (b.angle - a.angle) * d + }) + }, + drawLegendSymbol: a.LegendSymbolMixin.drawRectangle, + getCenter: a.CenteredSeriesMixin.getCenter, + getSymbol: g + }, { + init: function() { + u.prototype.init.apply(this, arguments); + var a = this, + d; + a.name = f(a.name, "Slice"); + d = function(b) { + a.slice("select" === b.type) + }; + B(a, "select", d); + B(a, "unselect", d); + return a + }, + setVisible: function(a, d) { + var b = this, + g = b.series, + m = g.chart, + c = g.options.ignoreHiddenPoint; + d = f(d, c); + a !== b.visible && (b.visible = b.options.visible = a = void 0 === a ? !b.visible : a, g.options.data[r(b, g.data)] = b.options, H(["graphic", "dataLabel", "connector", "shadowGroup"], function(c) { + if (b[c]) b[c][a ? "show" : "hide"](!0) + }), b.legendItem && m.legend.colorizeItem(b, a), a || "hover" !== b.state || b.setState(""), c && (g.isDirty = !0), d && m.redraw()) + }, + slice: function(a, g, l) { + var b = this.series; + d(l, b.chart); + f(g, !0); + this.sliced = this.options.sliced = a = A(a) ? a : !this.sliced; + b.options.data[r(this, b.data)] = this.options; + a = a ? this.slicedTranslation : { + translateX: 0, + translateY: 0 + }; + this.graphic.animate(a); + this.shadowGroup && this.shadowGroup.animate(a) + }, + haloPath: function(a) { + var b = this.shapeArgs; + return this.sliced || !this.visible ? [] : this.series.chart.renderer.symbols.arc(b.x, b.y, b.r + a, b.r + a, { + innerR: this.shapeArgs.r, + start: b.start, + end: b.end + }) + } + }) + })(L); + (function(a) { + var B = + a.addEvent, + A = a.arrayMax, + H = a.defined, + G = a.each, + r = a.extend, + g = a.format, + f = a.map, + u = a.merge, + l = a.noop, + q = a.pick, + d = a.relativeLength, + b = a.Series, + p = a.seriesTypes, + C = a.stableSort; + a.distribute = function(a, b) { + function c(a, b) { + return a.target - b.target + } + var d, g = !0, + m = a, + e = [], + l; + l = 0; + for (d = a.length; d--;) l += a[d].size; + if (l > b) { + C(a, function(a, b) { + return (b.rank || 0) - (a.rank || 0) + }); + for (l = d = 0; l <= b;) l += a[d].size, d++; + e = a.splice(d - 1, a.length) + } + C(a, c); + for (a = f(a, function(a) { + return { + size: a.size, + targets: [a.target] + } + }); g;) { + for (d = a.length; d--;) g = + a[d], l = (Math.min.apply(0, g.targets) + Math.max.apply(0, g.targets)) / 2, g.pos = Math.min(Math.max(0, l - g.size / 2), b - g.size); + d = a.length; + for (g = !1; d--;) 0 < d && a[d - 1].pos + a[d - 1].size > a[d].pos && (a[d - 1].size += a[d].size, a[d - 1].targets = a[d - 1].targets.concat(a[d].targets), a[d - 1].pos + a[d - 1].size > b && (a[d - 1].pos = b - a[d - 1].size), a.splice(d, 1), g = !0) + } + d = 0; + G(a, function(a) { + var b = 0; + G(a.targets, function() { + m[d].pos = a.pos + b; + b += m[d].size; + d++ + }) + }); + m.push.apply(m, e); + C(m, c) + }; + b.prototype.drawDataLabels = function() { + var a = this, + b = a.options, + c = b.dataLabels, + d = a.points, + f, l, e = a.hasRendered || 0, + p, r, w = q(c.defer, !0), + h = a.chart.renderer; + if (c.enabled || a._hasPointLabels) a.dlProcessOptions && a.dlProcessOptions(c), r = a.plotGroup("dataLabelsGroup", "data-labels", w && !e ? "hidden" : "visible", c.zIndex || 6), w && (r.attr({ + opacity: +e + }), e || B(a, "afterAnimate", function() { + a.visible && r.show(!0); + r[b.animation ? "animate" : "attr"]({ + opacity: 1 + }, { + duration: 200 + }) + })), l = c, G(d, function(e) { + var d, m = e.dataLabel, + n, k, t, z = e.connector, + w = !m, + x; + f = e.dlOptions || e.options && e.options.dataLabels; + if (d = q(f && f.enabled, l.enabled) && null !== e.y) + for (k in c = u(l, f), n = e.getLabelConfig(), p = c.format ? g(c.format, n) : c.formatter.call(n, c), x = c.style, t = c.rotation, x.color = q(c.color, x.color, a.color, "#000000"), "contrast" === x.color && (x.color = c.inside || 0 > c.distance || b.stacking ? h.getContrast(e.color || a.color) : "#000000"), b.cursor && (x.cursor = b.cursor), n = { + fill: c.backgroundColor, + stroke: c.borderColor, + "stroke-width": c.borderWidth, + r: c.borderRadius || 0, + rotation: t, + padding: c.padding, + zIndex: 1 + }, n) void 0 === n[k] && delete n[k]; + !m || + d && H(p) ? d && H(p) && (m ? n.text = p : (m = e.dataLabel = h[t ? "text" : "label"](p, 0, -9999, c.shape, null, null, c.useHTML, null, "data-label"), m.addClass("highcharts-data-label-color-" + e.colorIndex + " " + (c.className || "") + (c.useHTML ? "highcharts-tracker" : ""))), m.attr(n), m.css(x).shadow(c.shadow), m.added || m.add(r), a.alignDataLabel(e, m, c, null, w)) : (e.dataLabel = m.destroy(), z && (e.connector = z.destroy())) + }) + }; + b.prototype.alignDataLabel = function(a, b, c, d, f) { + var g = this.chart, + e = g.inverted, + m = q(a.plotX, -9999), + n = q(a.plotY, -9999), + l = b.getBBox(), + h, p = c.rotation, + t = c.align, + u = this.visible && (a.series.forceDL || g.isInsidePlot(m, Math.round(n), e) || d && g.isInsidePlot(m, e ? d.x + 1 : d.y + d.height - 1, e)), + E = "justify" === q(c.overflow, "justify"); + u && (h = c.style.fontSize, h = g.renderer.fontMetrics(h, b).b, d = r({ + x: e ? g.plotWidth - n : m, + y: Math.round(e ? g.plotHeight - m : n), + width: 0, + height: 0 + }, d), r(c, { + width: l.width, + height: l.height + }), p ? (E = !1, e = g.renderer.rotCorr(h, p), e = { + x: d.x + c.x + d.width / 2 + e.x, + y: d.y + c.y + { + top: 0, + middle: .5, + bottom: 1 + }[c.verticalAlign] * d.height + }, b[f ? "attr" : "animate"](e).attr({ + align: t + }), + m = (p + 720) % 360, m = 180 < m && 360 > m, "left" === t ? e.y -= m ? l.height : 0 : "center" === t ? (e.x -= l.width / 2, e.y -= l.height / 2) : "right" === t && (e.x -= l.width, e.y -= m ? 0 : l.height)) : (b.align(c, null, d), e = b.alignAttr), E ? this.justifyDataLabel(b, c, e, l, d, f) : q(c.crop, !0) && (u = g.isInsidePlot(e.x, e.y) && g.isInsidePlot(e.x + l.width, e.y + l.height)), c.shape && !p && b.attr({ + anchorX: a.plotX, + anchorY: a.plotY + })); + u || (b.attr({ + y: -9999 + }), b.placed = !1) + }; + b.prototype.justifyDataLabel = function(a, b, c, d, f, g) { + var e = this.chart, + m = b.align, + n = b.verticalAlign, + l, h, p = a.box ? + 0 : a.padding || 0; + l = c.x + p; + 0 > l && ("right" === m ? b.align = "left" : b.x = -l, h = !0); + l = c.x + d.width - p; + l > e.plotWidth && ("left" === m ? b.align = "right" : b.x = e.plotWidth - l, h = !0); + l = c.y + p; + 0 > l && ("bottom" === n ? b.verticalAlign = "top" : b.y = -l, h = !0); + l = c.y + d.height - p; + l > e.plotHeight && ("top" === n ? b.verticalAlign = "bottom" : b.y = e.plotHeight - l, h = !0); + h && (a.placed = !g, a.align(b, null, f)) + }; + p.pie && (p.pie.prototype.drawDataLabels = function() { + var d = this, + g = d.data, + c, l = d.chart, + p = d.options.dataLabels, + r = q(p.connectorPadding, 10), + e = q(p.connectorWidth, 1), + u = + l.plotWidth, + F = l.plotHeight, + w, h = p.distance, + y = d.center, + C = y[2] / 2, + B = y[1], + H = 0 < h, + k, D, L, N, S = [ + [], + [] + ], + O, v, M, Q, R = [0, 0, 0, 0]; + d.visible && (p.enabled || d._hasPointLabels) && (b.prototype.drawDataLabels.apply(d), G(g, function(a) { + a.dataLabel && a.visible && (S[a.half].push(a), a.dataLabel._pos = null) + }), G(S, function(b, e) { + var g, m, n = b.length, + q, t, z; + if (n) + for (d.sortByAngle(b, e - .5), 0 < h && (g = Math.max(0, B - C - h), m = Math.min(B + C + h, l.plotHeight), q = f(b, function(a) { + if (a.dataLabel) return z = a.dataLabel.getBBox().height || 21, { + target: a.labelPos[1] - + g + z / 2, + size: z, + rank: a.y + } + }), a.distribute(q, m + z - g)), Q = 0; Q < n; Q++) c = b[Q], L = c.labelPos, k = c.dataLabel, M = !1 === c.visible ? "hidden" : "inherit", t = L[1], q ? void 0 === q[Q].pos ? M = "hidden" : (N = q[Q].size, v = g + q[Q].pos) : v = t, O = p.justify ? y[0] + (e ? -1 : 1) * (C + h) : d.getX(v < g + 2 || v > m - 2 ? t : v, e), k._attr = { + visibility: M, + align: L[6] + }, k._pos = { + x: O + p.x + ({ + left: r, + right: -r + }[L[6]] || 0), + y: v + p.y - 10 + }, L.x = O, L.y = v, null === d.options.size && (D = k.width, O - D < r ? R[3] = Math.max(Math.round(D - O + r), R[3]) : O + D > u - r && (R[1] = Math.max(Math.round(O + D - u + r), R[1])), 0 > v - N / 2 ? R[0] = + Math.max(Math.round(-v + N / 2), R[0]) : v + N / 2 > F && (R[2] = Math.max(Math.round(v + N / 2 - F), R[2]))) + }), 0 === A(R) || this.verifyDataLabelOverflow(R)) && (this.placeDataLabels(), H && e && G(this.points, function(a) { + var b; + w = a.connector; + if ((k = a.dataLabel) && k._pos && a.visible) { + M = k._attr.visibility; + if (b = !w) a.connector = w = l.renderer.path().addClass("highcharts-data-label-connector highcharts-color-" + a.colorIndex).add(d.dataLabelsGroup), w.attr({ + "stroke-width": e, + stroke: p.connectorColor || a.color || "#666666" + }); + w[b ? "attr" : "animate"]({ + d: d.connectorPath(a.labelPos) + }); + w.attr("visibility", M) + } else w && (a.connector = w.destroy()) + })) + }, p.pie.prototype.connectorPath = function(a) { + var b = a.x, + c = a.y; + return q(this.options.dataLabels.softConnector, !0) ? ["M", b + ("left" === a[6] ? 5 : -5), c, "C", b, c, 2 * a[2] - a[4], 2 * a[3] - a[5], a[2], a[3], "L", a[4], a[5]] : ["M", b + ("left" === a[6] ? 5 : -5), c, "L", a[2], a[3], "L", a[4], a[5]] + }, p.pie.prototype.placeDataLabels = function() { + G(this.points, function(a) { + var b = a.dataLabel; + b && a.visible && ((a = b._pos) ? (b.attr(b._attr), b[b.moved ? "animate" : "attr"](a), b.moved = !0) : b && b.attr({ + y: -9999 + })) + }) + }, + p.pie.prototype.alignDataLabel = l, p.pie.prototype.verifyDataLabelOverflow = function(a) { + var b = this.center, + c = this.options, + f = c.center, + g = c.minSize || 80, + l, e; + null !== f[0] ? l = Math.max(b[2] - Math.max(a[1], a[3]), g) : (l = Math.max(b[2] - a[1] - a[3], g), b[0] += (a[3] - a[1]) / 2); + null !== f[1] ? l = Math.max(Math.min(l, b[2] - Math.max(a[0], a[2])), g) : (l = Math.max(Math.min(l, b[2] - a[0] - a[2]), g), b[1] += (a[0] - a[2]) / 2); + l < b[2] ? (b[2] = l, b[3] = Math.min(d(c.innerSize || 0, l), l), this.translate(b), this.drawDataLabels && this.drawDataLabels()) : e = !0; + return e + }); + p.column && (p.column.prototype.alignDataLabel = function(a, d, c, f, g) { + var l = this.chart.inverted, + e = a.series, + m = a.dlBox || a.shapeArgs, + n = q(a.below, a.plotY > q(this.translatedThreshold, e.yAxis.len)), + p = q(c.inside, !!this.options.stacking); + m && (f = u(m), 0 > f.y && (f.height += f.y, f.y = 0), m = f.y + f.height - e.yAxis.len, 0 < m && (f.height -= m), l && (f = { + x: e.yAxis.len - f.y - f.height, + y: e.xAxis.len - f.x - f.width, + width: f.height, + height: f.width + }), p || (l ? (f.x += n ? 0 : f.width, f.width = 0) : (f.y += n ? f.height : 0, f.height = 0))); + c.align = q(c.align, !l || p ? "center" : + n ? "right" : "left"); + c.verticalAlign = q(c.verticalAlign, l || p ? "middle" : n ? "top" : "bottom"); + b.prototype.alignDataLabel.call(this, a, d, c, f, g) + }) + })(L); + (function(a) { + var B = a.Chart, + A = a.each, + H = a.pick, + G = a.addEvent; + B.prototype.callbacks.push(function(a) { + function g() { + var f = []; + A(a.series, function(a) { + var g = a.options.dataLabels, + q = a.dataLabelCollections || ["dataLabel"]; + (g.enabled || a._hasPointLabels) && !g.allowOverlap && a.visible && A(q, function(d) { + A(a.points, function(a) { + a[d] && (a[d].labelrank = H(a.labelrank, a.shapeArgs && a.shapeArgs.height), + f.push(a[d])) + }) + }) + }); + a.hideOverlappingLabels(f) + } + g(); + G(a, "redraw", g) + }); + B.prototype.hideOverlappingLabels = function(a) { + var g = a.length, + f, r, l, q, d, b, p, C, t, m = function(a, b, d, f, e, g, l, m) { + return !(e > a + d || e + l < a || g > b + f || g + m < b) + }; + for (r = 0; r < g; r++) + if (f = a[r]) f.oldOpacity = f.opacity, f.newOpacity = 1; + a.sort(function(a, b) { + return (b.labelrank || 0) - (a.labelrank || 0) + }); + for (r = 0; r < g; r++) + for (l = a[r], f = r + 1; f < g; ++f) + if (q = a[f], l && q && l.placed && q.placed && 0 !== l.newOpacity && 0 !== q.newOpacity && (d = l.alignAttr, b = q.alignAttr, p = l.parentGroup, C = q.parentGroup, + t = 2 * (l.box ? 0 : l.padding), d = m(d.x + p.translateX, d.y + p.translateY, l.width - t, l.height - t, b.x + C.translateX, b.y + C.translateY, q.width - t, q.height - t)))(l.labelrank < q.labelrank ? l : q).newOpacity = 0; + A(a, function(a) { + var b, c; + a && (c = a.newOpacity, a.oldOpacity !== c && a.placed && (c ? a.show(!0) : b = function() { + a.hide() + }, a.alignAttr.opacity = c, a[a.isOld ? "animate" : "attr"](a.alignAttr, null, b)), a.isOld = !0) + }) + } + })(L); + (function(a) { + var B = a.addEvent, + A = a.Chart, + H = a.createElement, + G = a.css, + r = a.defaultOptions, + g = a.defaultPlotOptions, + f = a.each, + u = + a.extend, + l = a.fireEvent, + q = a.hasTouch, + d = a.inArray, + b = a.isObject, + p = a.Legend, + C = a.merge, + t = a.pick, + m = a.Point, + c = a.Series, + n = a.seriesTypes, + E = a.svg; + a = a.TrackerMixin = { + drawTrackerPoint: function() { + var a = this, + b = a.chart, + c = b.pointer, + d = function(a) { + for (var c = a.target, e; c && !e;) e = c.point, c = c.parentNode; + if (void 0 !== e && e !== b.hoverPoint) e.onMouseOver(a) + }; + f(a.points, function(a) { + a.graphic && (a.graphic.element.point = a); + a.dataLabel && (a.dataLabel.div ? a.dataLabel.div.point = a : a.dataLabel.element.point = a) + }); + a._hasTracking || (f(a.trackerGroups, + function(b) { + if (a[b]) { + a[b].addClass("highcharts-tracker").on("mouseover", d).on("mouseout", function(a) { + c.onTrackerMouseOut(a) + }); + if (q) a[b].on("touchstart", d); + a.options.cursor && a[b].css(G).css({ + cursor: a.options.cursor + }) + } + }), a._hasTracking = !0) + }, + drawTrackerGraph: function() { + var a = this, + b = a.options, + c = b.trackByArea, + d = [].concat(c ? a.areaPath : a.graphPath), + g = d.length, + h = a.chart, + l = h.pointer, + m = h.renderer, + n = h.options.tooltip.snap, + p = a.tracker, + k, r = function() { + if (h.hoverSeries !== a) a.onMouseOver() + }, + t = "rgba(192,192,192," + + (E ? .0001 : .002) + ")"; + if (g && !c) + for (k = g + 1; k--;) "M" === d[k] && d.splice(k + 1, 0, d[k + 1] - n, d[k + 2], "L"), (k && "M" === d[k] || k === g) && d.splice(k, 0, "L", d[k - 2] + n, d[k - 1]); + p ? p.attr({ + d: d + }) : a.graph && (a.tracker = m.path(d).attr({ + "stroke-linejoin": "round", + visibility: a.visible ? "visible" : "hidden", + stroke: t, + fill: c ? t : "none", + "stroke-width": a.graph.strokeWidth() + (c ? 0 : 2 * n), + zIndex: 2 + }).add(a.group), f([a.tracker, a.markerGroup], function(a) { + a.addClass("highcharts-tracker").on("mouseover", r).on("mouseout", function(a) { + l.onTrackerMouseOut(a) + }); + b.cursor && a.css({ + cursor: b.cursor + }); + if (q) a.on("touchstart", r) + })) + } + }; + n.column && (n.column.prototype.drawTracker = a.drawTrackerPoint); + n.pie && (n.pie.prototype.drawTracker = a.drawTrackerPoint); + n.scatter && (n.scatter.prototype.drawTracker = a.drawTrackerPoint); + u(p.prototype, { + setItemEvents: function(a, b, c) { + var e = this, + d = e.chart, + f = "highcharts-legend-" + (a.series ? "point" : "series") + "-active"; + (c ? b : a.legendGroup).on("mouseover", function() { + a.setState("hover"); + d.seriesGroup.addClass(f); + b.css(e.options.itemHoverStyle) + }).on("mouseout", + function() { + b.css(a.visible ? e.itemStyle : e.itemHiddenStyle); + d.seriesGroup.removeClass(f); + a.setState() + }).on("click", function(b) { + var c = function() { + a.setVisible && a.setVisible() + }; + b = { + browserEvent: b + }; + a.firePointEvent ? a.firePointEvent("legendItemClick", b, c) : l(a, "legendItemClick", b, c) + }) + }, + createCheckboxForItem: function(a) { + a.checkbox = H("input", { + type: "checkbox", + checked: a.selected, + defaultChecked: a.selected + }, this.options.itemCheckboxStyle, this.chart.container); + B(a.checkbox, "click", function(b) { + l(a.series || a, "checkboxClick", { + checked: b.target.checked, + item: a + }, function() { + a.select() + }) + }) + } + }); + r.legend.itemStyle.cursor = "pointer"; + u(A.prototype, { + showResetZoom: function() { + var a = this, + b = r.lang, + c = a.options.chart.resetZoomButton, + d = c.theme, + f = d.states, + g = "chart" === c.relativeTo ? null : "plotBox"; + this.resetZoomButton = a.renderer.button(b.resetZoom, null, null, function() { + a.zoomOut() + }, d, f && f.hover).attr({ + align: c.position.align, + title: b.resetZoomTitle + }).addClass("highcharts-reset-zoom").add().align(c.position, !1, g) + }, + zoomOut: function() { + var a = this; + l(a, "selection", { + resetSelection: !0 + }, function() { + a.zoom() + }) + }, + zoom: function(a) { + var c, d = this.pointer, + g = !1, + l; + !a || a.resetSelection ? f(this.axes, function(a) { + c = a.zoom() + }) : f(a.xAxis.concat(a.yAxis), function(a) { + var b = a.axis; + d[b.isXAxis ? "zoomX" : "zoomY"] && (c = b.zoom(a.min, a.max), b.displayBtn && (g = !0)) + }); + l = this.resetZoomButton; + g && !l ? this.showResetZoom() : !g && b(l) && (this.resetZoomButton = l.destroy()); + c && this.redraw(t(this.options.chart.animation, a && a.animation, 100 > this.pointCount)) + }, + pan: function(a, b) { + var c = this, + d = c.hoverPoints, + e; + d && f(d, function(a) { + a.setState() + }); + f("xy" === b ? [1, 0] : [1], function(b) { + b = c[b ? "xAxis" : "yAxis"][0]; + var d = b.horiz, + f = a[d ? "chartX" : "chartY"], + d = d ? "mouseDownX" : "mouseDownY", + g = c[d], + h = (b.pointRange || 0) / 2, + k = b.getExtremes(), + l = b.toValue(g - f, !0) + h, + h = b.toValue(g + b.len - f, !0) - h, + m = h < l, + g = m ? h : l, + l = m ? l : h, + h = Math.min(k.dataMin, k.min) - g, + k = l - Math.max(k.dataMax, k.max); + b.series.length && 0 > h && 0 > k && (b.setExtremes(g, l, !1, !1, { + trigger: "pan" + }), e = !0); + c[d] = f + }); + e && c.redraw(!1); + G(c.container, { + cursor: "move" + }) + } + }); + u(m.prototype, { + select: function(a, + b) { + var c = this, + e = c.series, + g = e.chart; + a = t(a, !c.selected); + c.firePointEvent(a ? "select" : "unselect", { + accumulate: b + }, function() { + c.selected = c.options.selected = a; + e.options.data[d(c, e.data)] = c.options; + c.setState(a && "select"); + b || f(g.getSelectedPoints(), function(a) { + a.selected && a !== c && (a.selected = a.options.selected = !1, e.options.data[d(a, e.data)] = a.options, a.setState(""), a.firePointEvent("unselect")) + }) + }) + }, + onMouseOver: function(a, b) { + var c = this.series, + d = c.chart, + e = d.tooltip, + f = d.hoverPoint; + if (this.series) { + if (!b) { + if (f && + f !== this) f.onMouseOut(); + if (d.hoverSeries !== c) c.onMouseOver(); + d.hoverPoint = this + }!e || e.shared && !c.noSharedTooltip ? e || this.setState("hover") : (this.setState("hover"), e.refresh(this, a)); + this.firePointEvent("mouseOver") + } + }, + onMouseOut: function() { + var a = this.series.chart, + b = a.hoverPoints; + this.firePointEvent("mouseOut"); + b && -1 !== d(this, b) || (this.setState(), a.hoverPoint = null) + }, + importEvents: function() { + if (!this.hasImportedEvents) { + var a = C(this.series.options.point, this.options).events, + b; + this.events = a; + for (b in a) B(this, + b, a[b]); + this.hasImportedEvents = !0 + } + }, + setState: function(a, b) { + var c = Math.floor(this.plotX), + d = this.plotY, + e = this.series, + f = e.options.states[a] || {}, + l = g[e.type].marker && e.options.marker, + m = l && !1 === l.enabled, + n = l && l.states && l.states[a] || {}, + p = !1 === n.enabled, + k = e.stateMarkerGraphic, + q = this.marker || {}, + r = e.chart, + z = e.halo, + C, A = l && e.markerAttribs; + a = a || ""; + if (!(a === this.state && !b || this.selected && "select" !== a || !1 === f.enabled || a && (p || m && !1 === n.enabled) || a && q.states && q.states[a] && !1 === q.states[a].enabled)) { + A && (C = e.markerAttribs(this, + a)); + if (this.graphic) this.state && this.graphic.removeClass("highcharts-point-" + this.state), a && this.graphic.addClass("highcharts-point-" + a), this.graphic.attr(e.pointAttribs(this, a)), C && this.graphic.animate(C, t(r.options.chart.animation, n.animation, l.animation)), k && k.hide(); + else { + if (a && n) { + l = q.symbol || e.symbol; + k && k.currentSymbol !== l && (k = k.destroy()); + if (k) k[b ? "animate" : "attr"]({ + x: C.x, + y: C.y + }); + else l && (e.stateMarkerGraphic = k = r.renderer.symbol(l, C.x, C.y, C.width, C.height).add(e.markerGroup), k.currentSymbol = + l); + k && k.attr(e.pointAttribs(this, a)) + } + k && (k[a && r.isInsidePlot(c, d, r.inverted) ? "show" : "hide"](), k.element.point = this) + }(c = f.halo) && c.size ? (z || (e.halo = z = r.renderer.path().add(A ? e.markerGroup : e.group)), z[b ? "animate" : "attr"]({ + d: this.haloPath(c.size) + }), z.attr({ + "class": "highcharts-halo highcharts-color-" + t(this.colorIndex, e.colorIndex) + }), z.point = this, z.attr(u({ + fill: this.color || e.color, + "fill-opacity": c.opacity, + zIndex: -1 + }, c.attributes))) : z && z.point && z.point.haloPath && z.animate({ + d: z.point.haloPath(0) + }); + this.state = + a + } + }, + haloPath: function(a) { + return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX) - a, this.plotY - a, 2 * a, 2 * a) + } + }); + u(c.prototype, { + onMouseOver: function() { + var a = this.chart, + b = a.hoverSeries; + if (b && b !== this) b.onMouseOut(); + this.options.events.mouseOver && l(this, "mouseOver"); + this.setState("hover"); + a.hoverSeries = this + }, + onMouseOut: function() { + var a = this.options, + b = this.chart, + c = b.tooltip, + d = b.hoverPoint; + b.hoverSeries = null; + if (d) d.onMouseOut(); + this && a.events.mouseOut && l(this, "mouseOut"); + !c || a.stickyTracking || + c.shared && !this.noSharedTooltip || c.hide(); + this.setState() + }, + setState: function(a) { + var b = this, + c = b.options, + d = b.graph, + g = c.states, + h = c.lineWidth, + c = 0; + a = a || ""; + if (b.state !== a && (f([b.group, b.markerGroup], function(c) { + c && (b.state && c.removeClass("highcharts-series-" + b.state), a && c.addClass("highcharts-series-" + a)) + }), b.state = a, !g[a] || !1 !== g[a].enabled) && (a && (h = g[a].lineWidth || h + (g[a].lineWidthPlus || 0)), d && !d.dashstyle)) + for (g = { + "stroke-width": h + }, d.attr(g); b["zone-graph-" + c];) b["zone-graph-" + c].attr(g), c += 1 + }, + setVisible: function(a, + b) { + var c = this, + d = c.chart, + e = c.legendItem, + g, m = d.options.chart.ignoreHiddenSeries, + n = c.visible; + g = (c.visible = a = c.options.visible = c.userOptions.visible = void 0 === a ? !n : a) ? "show" : "hide"; + f(["group", "dataLabelsGroup", "markerGroup", "tracker", "tt"], function(a) { + if (c[a]) c[a][g]() + }); + if (d.hoverSeries === c || (d.hoverPoint && d.hoverPoint.series) === c) c.onMouseOut(); + e && d.legend.colorizeItem(c, a); + c.isDirty = !0; + c.options.stacking && f(d.series, function(a) { + a.options.stacking && a.visible && (a.isDirty = !0) + }); + f(c.linkedSeries, function(b) { + b.setVisible(a, !1) + }); + m && (d.isDirtyBox = !0); + !1 !== b && d.redraw(); + l(c, g) + }, + show: function() { + this.setVisible(!0) + }, + hide: function() { + this.setVisible(!1) + }, + select: function(a) { + this.selected = a = void 0 === a ? !this.selected : a; + this.checkbox && (this.checkbox.checked = a); + l(this, a ? "select" : "unselect") + }, + drawTracker: a.drawTrackerGraph + }) + })(L); + (function(a) { + var B = a.Chart, + A = a.each, + H = a.inArray, + G = a.isObject, + r = a.pick, + g = a.splat; + B.prototype.setResponsive = function(a) { + var f = this.options.responsive; + f && f.rules && A(f.rules, function(f) { + this.matchResponsiveRule(f, + a) + }, this) + }; + B.prototype.matchResponsiveRule = function(f, g) { + var l = this.respRules, + q = f.condition, + d; + d = q.callback || function() { + return this.chartWidth <= r(q.maxWidth, Number.MAX_VALUE) && this.chartHeight <= r(q.maxHeight, Number.MAX_VALUE) && this.chartWidth >= r(q.minWidth, 0) && this.chartHeight >= r(q.minHeight, 0) + }; + void 0 === f._id && (f._id = a.uniqueKey()); + d = d.call(this); + !l[f._id] && d ? f.chartOptions && (l[f._id] = this.currentOptions(f.chartOptions), this.update(f.chartOptions, g)) : l[f._id] && !d && (this.update(l[f._id], g), delete l[f._id]) + }; + B.prototype.currentOptions = function(a) { + function f(a, d, b, l) { + var p, q; + for (p in a) + if (!l && -1 < H(p, ["series", "xAxis", "yAxis"])) + for (a[p] = g(a[p]), b[p] = [], q = 0; q < a[p].length; q++) b[p][q] = {}, f(a[p][q], d[p][q], b[p][q], l + 1); + else G(a[p]) ? (b[p] = {}, f(a[p], d[p] || {}, b[p], l + 1)) : b[p] = d[p] || null + } + var l = {}; + f(a, this.options, l, 0); + return l + } + })(L); + return L +}); \ No newline at end of file diff --git a/public/js/jquery/jquery.maskMoney.js b/public/js/jquery/jquery.maskMoney.js new file mode 100755 index 0000000..eab07df --- /dev/null +++ b/public/js/jquery/jquery.maskMoney.js @@ -0,0 +1,703 @@ +(function ($) { + "use strict"; + if (!$.browser) { + $.browser = {}; + $.browser.mozilla = /mozilla/.test(navigator.userAgent.toLowerCase()) && !/webkit/.test(navigator.userAgent.toLowerCase()); + $.browser.webkit = /webkit/.test(navigator.userAgent.toLowerCase()); + $.browser.opera = /opera/.test(navigator.userAgent.toLowerCase()); + $.browser.msie = /msie/.test(navigator.userAgent.toLowerCase()); + $.browser.device = /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase()); + } + + var defaultOptions = { + prefix: "", + suffix: "", + affixesStay: true, + thousands: ",", + decimal: ".", + precision: 2, + allowZero: false, + allowNegative: false, + doubleClickSelection: true, + allowEmpty: false, + bringCaretAtEndOnFocus: true + }, + methods = { + destroy: function () { + $(this).unbind(".maskMoney"); + + if ($.browser.msie) { + this.onpaste = null; + } + + return this; + }, + applyMask: function (value) { + var $input = $(this); + + // data-* api + var settings = $input.data("settings"); + + return maskValue(value, settings); + }, + mask: function (value) { + return this.each(function () { + var $this = $(this); + + if (typeof value === "number") { + $this.val(value); + } + + return $this.trigger("mask"); + }); + }, + unmasked: function () { + return this.map(function () { + var value = ($(this).val() || "0"), + isNegative = value.indexOf("-") !== -1, + decimalPart; + + // get the last position of the array that is a number(coercion makes "" to be evaluated as false) + $(value.split(/\D/).reverse()).each(function (index, element) { + if (element) { + decimalPart = element; + + return false; + } + }); + + value = value.replace(/\D/g, ""); + value = value.replace(new RegExp(decimalPart + "$"), "." + decimalPart); + + if (isNegative) { + value = "-" + value; + } + + return parseFloat(value); + }); + }, + unmaskedWithOptions: function () { + return this.map(function () { + var value = ($(this).val() || "0"), + settings = $(this).data("settings") || defaultOptions, + regExp = new RegExp((settings.thousandsForUnmasked || settings.thousands), "g"); + + value = value.replace(regExp, ""); + + return parseFloat(value); + }); + }, + init: function (parameters) { + // the default options should not be shared with others + parameters = $.extend($.extend({}, defaultOptions), parameters); + + return this.each(function () { + var $input = $(this), settings, + onFocusValue; + + // data-* api + settings = $.extend({}, parameters); + settings = $.extend(settings, $input.data()); + + // Store settings for use with the applyMask method. + $input.data("settings", settings); + + function getInputSelection() { + var el = $input.get(0), + start = 0, + end = 0, + normalizedValue, + range, + textInputRange, + len, + endRange; + + if (typeof el.selectionStart === "number" && typeof el.selectionEnd === "number") { + start = el.selectionStart; + end = el.selectionEnd; + } else { + range = document.selection.createRange(); + + if (range && range.parentElement() === el) { + len = el.value.length; + normalizedValue = el.value.replace(/\r\n/g, "\n"); + + // Create a working TextRange that lives only in the input + textInputRange = el.createTextRange(); + textInputRange.moveToBookmark(range.getBookmark()); + + // Check if the start and end of the selection are at the very end + // of the input, since moveStart/moveEnd doesn't return what we want + // in those cases + endRange = el.createTextRange(); + endRange.collapse(false); + + if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) { + start = end = len; + } else { + start = -textInputRange.moveStart("character", -len); + start += normalizedValue.slice(0, start).split("\n").length - 1; + + if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) { + end = len; + } else { + end = -textInputRange.moveEnd("character", -len); + end += normalizedValue.slice(0, end).split("\n").length - 1; + } + } + } + } + + return { + start: start, + end: end + }; + } // getInputSelection + + function canInputMoreNumbers() { + var haventReachedMaxLength = !($input.val().length >= $input.attr("maxlength") && $input.attr("maxlength") >= 0), + selection = getInputSelection(), + start = selection.start, + end = selection.end, + haveNumberSelected = (selection.start !== selection.end && $input.val().substring(start, end).match(/\d/)) ? true : false, + startWithZero = ($input.val().substring(0, 1) === "0"); + + return haventReachedMaxLength || haveNumberSelected || startWithZero; + } + + function setCursorPosition(pos) { + // Do not set the position if + // the we're formatting on blur. + // This is because we do not want + // to refocus on the control after + // the blur. + if (!!settings.formatOnBlur) { + return; + } + + $input.each(function (index, elem) { + if (elem.setSelectionRange) { + elem.focus(); + + elem.setSelectionRange(pos, pos); + } else if (elem.createTextRange) { + var range = elem.createTextRange(); + + range.collapse(true); + + range.moveEnd("character", pos); + range.moveStart("character", pos); + + range.select(); + } + }); + } + + function maskAndPosition(startPos) { + var originalLen = $input.val().length, + newLen; + + //$input.val(maskValue($input.val(), settings)); + + newLen = $input.val().length; + + // If the we're using the reverse option, + // do not put the cursor at the end of + // the input. The reverse option allows + // the user to input text from left to right. + if (!settings.reverse) { + startPos = startPos - (originalLen - newLen); + } + + setCursorPosition(startPos); + } + + function mask() { + var value = $input.val(); + + if (settings.allowEmpty && value === "") { + return; + } + + var isNumber = !isNaN(value); + var decimalPointIndex = isNumber ? value.indexOf(".") : value.indexOf(settings.decimal); + + if (settings.precision > 0) { + if (decimalPointIndex < 0) { + value += settings.decimal + new Array(settings.precision + 1).join(0); + } else { + // If the following decimal part dosen't have enough length against the precision, it needs to be filled with zeros. + var integerPart = value.slice(0, decimalPointIndex), + decimalPart = value.slice(decimalPointIndex + 1); + + var decimalPartLength = decimalPart.length; + + if (decimalPartLength > settings.precision) { + decimalPartLength = settings.precision; + } + + value = integerPart + settings.decimal + decimalPart + + new Array((settings.precision + 1) - decimalPartLength).join(0); + } + } else if (decimalPointIndex > 0) { + // if the precision is 0, discard the decimal part + value = value.slice(0, decimalPointIndex); + } + + $input.val(maskValue(value, settings)); + } + + function changeSign() { + var inputValue = $input.val(); + + if (settings.allowNegative) { + if (inputValue !== "" && inputValue.charAt(0) === "-") { + return inputValue.replace("-", ""); + } else { + return "-" + inputValue; + } + } else { + return inputValue; + } + } + + function preventDefault(e) { + if (e.preventDefault) { //standard browsers + e.preventDefault(); + } else { // old internet explorer + e.returnValue = false; + } + } + + function fixMobile() { + if ($.browser.device) { + $input.attr("type", "tel"); + } + } + + function keypressEvent(e) { + e = e || window.event; + + var key = e.which || e.charCode || e.keyCode, + decimalKeyCode = settings.decimal.charCodeAt(0); + + //added to handle an IE "special" event + if (key === undefined) { + return false; + } + + // any key except the numbers 0-9. if we're using settings.reverse, + // allow the user to input the decimal key + if ((key != decimalKeyCode) && (key < 48 || key > 57) && (key !== decimalKeyCode || !settings.reverse)) { + return handleAllKeysExceptNumericalDigits(key, e); + } else if (!canInputMoreNumbers()) { + return false; + } else { + if (key === decimalKeyCode && shouldPreventDecimalKey()) { + return false; + } + + if (settings.formatOnBlur) { + return true; + } + + preventDefault(e); + + applyMask(e); + + return false; + } + } + + function shouldPreventDecimalKey() { + // If all text is selected, we can accept the decimal + // key because it will replace everything. + if (isAllTextSelected()) { + return false; + } + + return alreadyContainsDecimal(); + } + + function isAllTextSelected() { + var length = $input.val().length; + var selection = getInputSelection(); + + // This should if all text is selected or if the + // input is empty. + return selection.start === 0 && selection.end === length; + } + + function alreadyContainsDecimal() { + return $input.val().indexOf(settings.decimal) > -1; + } + + function applyMask(e) { + e = e || window.event; + + decimalKeyCode = settings.decimal.charCodeAt(0); + + var key = e.which || e.charCode || e.keyCode, + keyPressedChar = "", + selection, + startPos, + endPos, + value, + decimalKeyCode = settings.decimal.charCodeAt(0); + + if (key == decimalKeyCode) { + keyPressedChar = String.fromCharCode(key); + } + + if (key >= 48 && key <= 57) { + keyPressedChar = String.fromCharCode(key); + } + + selection = getInputSelection(); + + startPos = selection.start; + endPos = selection.end; + + value = $input.val(); + + $input.val(value.substring(0, startPos) + keyPressedChar + value.substring(endPos, value.length)); + + maskAndPosition(startPos + 1); + } + + function handleAllKeysExceptNumericalDigits(key, e) { + var decimalKeyCode = settings.decimal.charCodeAt(0); + + // -(minus) key + if (key === 45) { + $input.val(changeSign()); + + return false; + // +(plus) key + } else if (key === 43) { + $input.val($input.val().replace("-", "")); + + return false; + // enter key or tab key + } else if (key === 13 || key === 9) { + return true; + } else if ($.browser.mozilla && (key === 37 || key === 39) && e.charCode === 0) { + // needed for left arrow key or right arrow key with firefox + // the charCode part is to avoid allowing "%"(e.charCode 0, e.keyCode 37) + return true; + } else if (key == decimalKeyCode) { + preventDefault(e); + + return false; + } else { // any other key with keycode less than 48 and greater than 57 + preventDefault(e); + + return true; + } + } + + function keydownEvent(e) { + e = e || window.event; + + var key = e.which || e.charCode || e.keyCode, + selection, + startPos, + endPos, + value, + lastNumber; + + //needed to handle an IE "special" event + if (key === undefined) { + return false; + } + + selection = getInputSelection(); + + startPos = selection.start; + endPos = selection.end; + + if (key === 8 || key === 46 || key === 63272) { // backspace or delete key (with special case for safari) + preventDefault(e); + + value = $input.val(); + + // not a selection + if (startPos === endPos) { + // backspace + if (key === 8) { + if (settings.suffix === "") { + startPos -= 1; + } else { + // needed to find the position of the last number to be erased + lastNumber = value.split("").reverse().join("").search(/\d/); + startPos = value.length - lastNumber - 1; + endPos = startPos + 1; + } + //delete + } else { + endPos += 1; + } + } + + $input.val(value.substring(0, startPos) + value.substring(endPos, value.length)); + + maskAndPosition(startPos); + + return false; + } else if (key === 9) { // tab key + return true; + } else { // any other key + return true; + } + } + + function focusEvent() { + onFocusValue = $input.val(); + + mask(); + + var input = $input.get(0), + textRange; + + if (!!settings.selectAllOnFocus) { + input.select(); + } else if (input.createTextRange && settings.bringCaretAtEndOnFocus) { + textRange = input.createTextRange(); + + textRange.collapse(false); // set the cursor at the end of the input + textRange.select(); + } + } + + function focusoutEvent() { + onFocusValue = $input.val(); + + mask(); + + var input = $input.get(0), + textRange; + + if (!!settings.selectAllOnFocus) { + input.select(); + } else if (input.createTextRange && settings.bringCaretAtEndOnFocus) { + textRange = input.createTextRange(); + + textRange.collapse(false); // set the cursor at the end of the input + textRange.select(); + } + } + + function cutPasteEvent() { + setTimeout(function () { + mask(); + }, 0); + } + + function getDefaultMask() { + var n = parseFloat("0") / Math.pow(10, settings.precision); + + return (n.toFixed(settings.precision)).replace(new RegExp("\\.", "g"), settings.decimal); + } + + function blurEvent(e) { + if ($.browser.msie) { + keypressEvent(e); + } + + if (!!settings.formatOnBlur && $input.val() !== onFocusValue) { + applyMask(e); + } + + if ($input.val() === "" && settings.allowEmpty) { + $input.val(""); + } else if ($input.val() === "" || $input.val() === setSymbol(getDefaultMask(), settings)) { + if (!settings.allowZero) { + $input.val(""); + } else if (!settings.affixesStay) { + $input.val(getDefaultMask()); + } else { + $input.val(setSymbol(getDefaultMask(), settings)); + } + } else { + if (!settings.affixesStay) { + var newValue = $input.val().replace(settings.prefix, "").replace(settings.suffix, ""); + + $input.val(newValue); + } + } + + if ($input.val() !== onFocusValue) { + $input.change(); + } + } + + function clickEvent() { + var input = $input.get(0), + length; + + if (!!settings.selectAllOnFocus) { + // selectAllOnFocus will be handled by + // the focus event. The focus event is + // also fired when the input is clicked. + return; + } else if (input.setSelectionRange && settings.bringCaretAtEndOnFocus) { + length = $input.val().length; + + //input.setSelectionRange(length, length); + } else { + $input.val($input.val()); + } + } + + function doubleClickEvent() { + var input = $input.get(0), + start, + length; + + if (input.setSelectionRange && settings.bringCaretAtEndOnFocus) { + length = $input.val().length; + + start = settings.doubleClickSelection ? 0 : length; + + //input.setSelectionRange(start, length); + } else { + $input.val($input.val()); + } + } + + fixMobile(); + + $input.unbind(".maskMoney"); + $input.bind("keypress.maskMoney", keypressEvent); + $input.bind("keydown.maskMoney", keydownEvent); + $input.bind("blur.maskMoney", blurEvent); + $input.bind("focus.maskMoney", focusEvent); + $input.bind("focusout.maskMoney", focusoutEvent); + $input.bind("click.maskMoney", clickEvent); + $input.bind("dblclick.maskMoney", doubleClickEvent); + $input.bind("cut.maskMoney", cutPasteEvent); + $input.bind("paste.maskMoney", cutPasteEvent); + $input.bind("mask.maskMoney", mask); + }); + } + }; + + function setSymbol(value, settings) { + var operator = ""; + + if (value.indexOf("-") > -1) { + value = value.replace("-", ""); + operator = "-"; + } + + if (value.indexOf(settings.prefix) > -1) { + value = value.replace(settings.prefix, ""); + } + + if (value.indexOf(settings.suffix) > -1) { + value = value.replace(settings.suffix, ""); + } + + return operator + settings.prefix + value + settings.suffix; + } + + function maskValue(value, settings) { + if (settings.allowEmpty && value === "") { + return ""; + } + + if (!!settings.reverse) { + return maskValueReverse(value, settings); + } + + return maskValueStandard(value, settings); + } + + function maskValueStandard(value, settings) { + var negative = (value.indexOf("-") > -1 && settings.allowNegative) ? "-" : "", + onlyNumbers = value.replace(/[^0-9]/g, ""), + input_precision = value.length - value.lastIndexOf(settings.decimal) - 1, + integerPart = onlyNumbers.slice(0, onlyNumbers.length - input_precision), + newValue, + decimalPart, + leadingZeros; + + newValue = buildIntegerPart(integerPart, negative, settings); + + if (settings.precision > 0) { + if(!isNaN(value) && value.indexOf(".")){ + var precision = value.substr(value.indexOf(".") + 1); + + onlyNumbers += new Array((settings.precision + 1) - precision.length).join(0); + + integerPart = onlyNumbers.slice(0, onlyNumbers.length - input_precision); + + newValue = buildIntegerPart(integerPart, negative, settings); + } + + decimalPart = onlyNumbers.slice(onlyNumbers.length - input_precision, (onlyNumbers.length - input_precision) + settings.precision); + + leadingZeros = new Array((settings.precision + 1) - decimalPart.length).join(0); + + newValue += settings.decimal + leadingZeros + decimalPart; + } + + return setSymbol(newValue, settings); + } + + function maskValueReverse(value, settings) { + var negative = (value.indexOf("-") > -1 && settings.allowNegative) ? "-" : "", + valueWithoutSymbol = value.replace(settings.prefix, "").replace(settings.suffix, ""), + integerPart = valueWithoutSymbol.split(settings.decimal)[0], + newValue, + decimalPart = ""; + + if (integerPart === "") { + integerPart = "0"; + } + + newValue = buildIntegerPart(integerPart, negative, settings); + + if (settings.precision > 0) { + var arr = valueWithoutSymbol.split(settings.decimal); + + if (arr.length > 1) { + decimalPart = arr[1]; + } + + newValue += settings.decimal + decimalPart; + + var rounded = Number.parseFloat((integerPart + "." + decimalPart)).toFixed(settings.precision); + + var roundedDecimalPart = rounded.toString().split(settings.decimal)[1]; + + newValue = newValue.split(settings.decimal)[0] + "." + roundedDecimalPart; + } + + return setSymbol(newValue, settings); + } + + function buildIntegerPart(integerPart, negative, settings) { + // remove initial zeros + integerPart = integerPart.replace(/^0*/g, ""); + + // put settings.thousands every 3 chars + integerPart = integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, settings.thousands); + + if (integerPart === "") { + integerPart = "0"; + } + + return negative + integerPart; + } + + $.fn.maskMoney = function (method) { + if (methods[method]) { + return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); + } else if (typeof method === "object" || !method) { + return methods.init.apply(this, arguments); + } else { + $.error("Method " + method + " does not exist on jQuery.maskMoney"); + } + }; +})(window.jQuery || window.Zepto); diff --git a/public/js/moment/locale/af.js b/public/js/moment/locale/af.js new file mode 100755 index 0000000..a89257f --- /dev/null +++ b/public/js/moment/locale/af.js @@ -0,0 +1,73 @@ +//! moment.js locale configuration +//! locale : Afrikaans [af] +//! author : Werner Mollentze : https://github.com/wernerm + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var af = moment.defineLocale('af', { + months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), + weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), + weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), + meridiemParse: /vm|nm/i, + isPM : function (input) { + return /^nm$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'vm' : 'VM'; + } else { + return isLower ? 'nm' : 'NM'; + } + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Vandag om] LT', + nextDay : '[Môre om] LT', + nextWeek : 'dddd [om] LT', + lastDay : '[Gister om] LT', + lastWeek : '[Laas] dddd [om] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'oor %s', + past : '%s gelede', + s : '\'n paar sekondes', + m : '\'n minuut', + mm : '%d minute', + h : '\'n uur', + hh : '%d ure', + d : '\'n dag', + dd : '%d dae', + M : '\'n maand', + MM : '%d maande', + y : '\'n jaar', + yy : '%d jaar' + }, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter + }, + week : { + dow : 1, // Maandag is die eerste dag van die week. + doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. + } +}); + +return af; + +}))); diff --git a/public/js/moment/locale/ar-dz.js b/public/js/moment/locale/ar-dz.js new file mode 100755 index 0000000..f394594 --- /dev/null +++ b/public/js/moment/locale/ar-dz.js @@ -0,0 +1,59 @@ +//! moment.js locale configuration +//! locale : Arabic (Algeria) [ar-dz] +//! author : Noureddine LOUAHEDJ : https://github.com/noureddineme + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var arDz = moment.defineLocale('ar-dz', { + months : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + monthsShort : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'أح_إث_ثلا_أر_خم_جم_سب'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 4 // The week that contains Jan 1st is the first week of the year. + } +}); + +return arDz; + +}))); diff --git a/public/js/moment/locale/ar-kw.js b/public/js/moment/locale/ar-kw.js new file mode 100755 index 0000000..93c7dd5 --- /dev/null +++ b/public/js/moment/locale/ar-kw.js @@ -0,0 +1,59 @@ +//! moment.js locale configuration +//! locale : Arabic (Kuwait) [ar-kw] +//! author : Nusret Parlak: https://github.com/nusretparlak + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var arKw = moment.defineLocale('ar-kw', { + months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } +}); + +return arKw; + +}))); diff --git a/public/js/moment/locale/ar-ly.js b/public/js/moment/locale/ar-ly.js new file mode 100755 index 0000000..2d548df --- /dev/null +++ b/public/js/moment/locale/ar-ly.js @@ -0,0 +1,126 @@ +//! moment.js locale configuration +//! locale : Arabic (Lybia) [ar-ly] +//! author : Ali Hmer: https://github.com/kikoanis + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var symbolMap = { + '1': '1', + '2': '2', + '3': '3', + '4': '4', + '5': '5', + '6': '6', + '7': '7', + '8': '8', + '9': '9', + '0': '0' +}; +var pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; +}; +var plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] +}; +var pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; +}; +var months = [ + 'يناير', + 'فبراير', + 'مارس', + 'أبريل', + 'مايو', + 'يونيو', + 'يوليو', + 'أغسطس', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر' +]; + +var arLy = moment.defineLocale('ar-ly', { + months : months, + monthsShort : months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'D/\u200FM/\u200FYYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ص|م/, + isPM : function (input) { + return 'م' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'م'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } +}); + +return arLy; + +}))); diff --git a/public/js/moment/locale/ar-ma.js b/public/js/moment/locale/ar-ma.js new file mode 100755 index 0000000..cbd810b --- /dev/null +++ b/public/js/moment/locale/ar-ma.js @@ -0,0 +1,60 @@ +//! moment.js locale configuration +//! locale : Arabic (Morocco) [ar-ma] +//! author : ElFadili Yassine : https://github.com/ElFadiliY +//! author : Abdel Said : https://github.com/abdelsaid + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var arMa = moment.defineLocale('ar-ma', { + months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } +}); + +return arMa; + +}))); diff --git a/public/js/moment/locale/ar-sa.js b/public/js/moment/locale/ar-sa.js new file mode 100755 index 0000000..dccd0d8 --- /dev/null +++ b/public/js/moment/locale/ar-sa.js @@ -0,0 +1,105 @@ +//! moment.js locale configuration +//! locale : Arabic (Saudi Arabia) [ar-sa] +//! author : Suhail Alkowaileet : https://github.com/xsoh + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var symbolMap = { + '1': '١', + '2': '٢', + '3': '٣', + '4': '٤', + '5': '٥', + '6': '٦', + '7': '٧', + '8': '٨', + '9': '٩', + '0': '٠' +}; +var numberMap = { + '١': '1', + '٢': '2', + '٣': '3', + '٤': '4', + '٥': '5', + '٦': '6', + '٧': '7', + '٨': '8', + '٩': '9', + '٠': '0' +}; + +var arSa = moment.defineLocale('ar-sa', { + months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ص|م/, + isPM : function (input) { + return 'م' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'م'; + } + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } +}); + +return arSa; + +}))); diff --git a/public/js/moment/locale/ar-tn.js b/public/js/moment/locale/ar-tn.js new file mode 100755 index 0000000..5f0d38b --- /dev/null +++ b/public/js/moment/locale/ar-tn.js @@ -0,0 +1,59 @@ +//! moment.js locale configuration +//! locale : Arabic (Tunisia) [ar-tn] +//! author : Nader Toukabri : https://github.com/naderio + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var arTn = moment.defineLocale('ar-tn', { + months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd D MMMM YYYY HH:mm' + }, + calendar: { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'في %s', + past: 'منذ %s', + s: 'ثوان', + m: 'دقيقة', + mm: '%d دقائق', + h: 'ساعة', + hh: '%d ساعات', + d: 'يوم', + dd: '%d أيام', + M: 'شهر', + MM: '%d أشهر', + y: 'سنة', + yy: '%d سنوات' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return arTn; + +}))); diff --git a/public/js/moment/locale/ar.js b/public/js/moment/locale/ar.js new file mode 100755 index 0000000..ae09617 --- /dev/null +++ b/public/js/moment/locale/ar.js @@ -0,0 +1,142 @@ +//! moment.js locale configuration +//! locale : Arabic [ar] +//! author : Abdel Said: https://github.com/abdelsaid +//! author : Ahmed Elkhatib +//! author : forabi https://github.com/forabi + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var symbolMap = { + '1': '١', + '2': '٢', + '3': '٣', + '4': '٤', + '5': '٥', + '6': '٦', + '7': '٧', + '8': '٨', + '9': '٩', + '0': '٠' +}; +var numberMap = { + '١': '1', + '٢': '2', + '٣': '3', + '٤': '4', + '٥': '5', + '٦': '6', + '٧': '7', + '٨': '8', + '٩': '9', + '٠': '0' +}; +var pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; +}; +var plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] +}; +var pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; +}; +var months = [ + 'كانون الثاني يناير', + 'شباط فبراير', + 'آذار مارس', + 'نيسان أبريل', + 'أيار مايو', + 'حزيران يونيو', + 'تموز يوليو', + 'آب أغسطس', + 'أيلول سبتمبر', + 'تشرين الأول أكتوبر', + 'تشرين الثاني نوفمبر', + 'كانون الأول ديسمبر' +]; + +var ar = moment.defineLocale('ar', { + months : months, + monthsShort : months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'D/\u200FM/\u200FYYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ص|م/, + isPM : function (input) { + return 'م' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'م'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } +}); + +return ar; + +}))); diff --git a/public/js/moment/locale/az.js b/public/js/moment/locale/az.js new file mode 100755 index 0000000..56021b4 --- /dev/null +++ b/public/js/moment/locale/az.js @@ -0,0 +1,105 @@ +//! moment.js locale configuration +//! locale : Azerbaijani [az] +//! author : topchiyev : https://github.com/topchiyev + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var suffixes = { + 1: '-inci', + 5: '-inci', + 8: '-inci', + 70: '-inci', + 80: '-inci', + 2: '-nci', + 7: '-nci', + 20: '-nci', + 50: '-nci', + 3: '-üncü', + 4: '-üncü', + 100: '-üncü', + 6: '-ncı', + 9: '-uncu', + 10: '-uncu', + 30: '-uncu', + 60: '-ıncı', + 90: '-ıncı' +}; + +var az = moment.defineLocale('az', { + months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), + monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), + weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'), + weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), + weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[sabah saat] LT', + nextWeek : '[gələn həftə] dddd [saat] LT', + lastDay : '[dünən] LT', + lastWeek : '[keçən həftə] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s əvvəl', + s : 'birneçə saniyyə', + m : 'bir dəqiqə', + mm : '%d dəqiqə', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir il', + yy : '%d il' + }, + meridiemParse: /gecə|səhər|gündüz|axşam/, + isPM : function (input) { + return /^(gündüz|axşam)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'gecə'; + } else if (hour < 12) { + return 'səhər'; + } else if (hour < 17) { + return 'gündüz'; + } else { + return 'axşam'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '-ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return az; + +}))); diff --git a/public/js/moment/locale/be.js b/public/js/moment/locale/be.js new file mode 100755 index 0000000..83025fd --- /dev/null +++ b/public/js/moment/locale/be.js @@ -0,0 +1,134 @@ +//! moment.js locale configuration +//! locale : Belarusian [be] +//! author : Dmitry Demidov : https://github.com/demidov91 +//! author: Praleska: http://praleska.pro/ +//! Author : Menelion Elensúle : https://github.com/Oire + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); +} +function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', + 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', + 'dd': 'дзень_дні_дзён', + 'MM': 'месяц_месяцы_месяцаў', + 'yy': 'год_гады_гадоў' + }; + if (key === 'm') { + return withoutSuffix ? 'хвіліна' : 'хвіліну'; + } + else if (key === 'h') { + return withoutSuffix ? 'гадзіна' : 'гадзіну'; + } + else { + return number + ' ' + plural(format[key], +number); + } +} + +var be = moment.defineLocale('be', { + months : { + format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'), + standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_') + }, + monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'), + weekdays : { + format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'), + standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'), + isFormat: /\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/ + }, + weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), + weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., HH:mm', + LLLL : 'dddd, D MMMM YYYY г., HH:mm' + }, + calendar : { + sameDay: '[Сёння ў] LT', + nextDay: '[Заўтра ў] LT', + lastDay: '[Учора ў] LT', + nextWeek: function () { + return '[У] dddd [ў] LT'; + }, + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return '[У мінулую] dddd [ў] LT'; + case 1: + case 2: + case 4: + return '[У мінулы] dddd [ў] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'праз %s', + past : '%s таму', + s : 'некалькі секунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : relativeTimeWithPlural, + hh : relativeTimeWithPlural, + d : 'дзень', + dd : relativeTimeWithPlural, + M : 'месяц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночы|раніцы|дня|вечара/, + isPM : function (input) { + return /^(дня|вечара)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночы'; + } else if (hour < 12) { + return 'раніцы'; + } else if (hour < 17) { + return 'дня'; + } else { + return 'вечара'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}-(і|ы|га)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы'; + case 'D': + return number + '-га'; + default: + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return be; + +}))); diff --git a/public/js/moment/locale/bg.js b/public/js/moment/locale/bg.js new file mode 100755 index 0000000..ee06d19 --- /dev/null +++ b/public/js/moment/locale/bg.js @@ -0,0 +1,90 @@ +//! moment.js locale configuration +//! locale : Bulgarian [bg] +//! author : Krasen Borisov : https://github.com/kraz + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var bg = moment.defineLocale('bg', { + months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'), + monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'), + weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'), + weekdaysShort : 'нед_пон_вто_сря_чет_пет_съб'.split('_'), + weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[Днес в] LT', + nextDay : '[Утре в] LT', + nextWeek : 'dddd [в] LT', + lastDay : '[Вчера в] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[В изминалата] dddd [в] LT'; + case 1: + case 2: + case 4: + case 5: + return '[В изминалия] dddd [в] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'след %s', + past : 'преди %s', + s : 'няколко секунди', + m : 'минута', + mm : '%d минути', + h : 'час', + hh : '%d часа', + d : 'ден', + dd : '%d дни', + M : 'месец', + MM : '%d месеца', + y : 'година', + yy : '%d години' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return bg; + +}))); diff --git a/public/js/moment/locale/bm.js b/public/js/moment/locale/bm.js new file mode 100755 index 0000000..1de2b5e --- /dev/null +++ b/public/js/moment/locale/bm.js @@ -0,0 +1,59 @@ +//! moment.js locale configuration +//! locale : Bambara [bm] +//! author : Estelle Comment : https://github.com/estellecomment + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + +// Language contact person : Abdoufata Kane : https://github.com/abdoufata + +var bm = moment.defineLocale('bm', { + months : 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split('_'), + monthsShort : 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'), + weekdays : 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'), + weekdaysShort : 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'), + weekdaysMin : 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'MMMM [tile] D [san] YYYY', + LLL : 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm', + LLLL : 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm' + }, + calendar : { + sameDay : '[Bi lɛrɛ] LT', + nextDay : '[Sini lɛrɛ] LT', + nextWeek : 'dddd [don lɛrɛ] LT', + lastDay : '[Kunu lɛrɛ] LT', + lastWeek : 'dddd [tɛmɛnen lɛrɛ] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s kɔnɔ', + past : 'a bɛ %s bɔ', + s : 'sanga dama dama', + m : 'miniti kelen', + mm : 'miniti %d', + h : 'lɛrɛ kelen', + hh : 'lɛrɛ %d', + d : 'tile kelen', + dd : 'tile %d', + M : 'kalo kelen', + MM : 'kalo %d', + y : 'san kelen', + yy : 'san %d' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return bm; + +}))); diff --git a/public/js/moment/locale/bn.js b/public/js/moment/locale/bn.js new file mode 100755 index 0000000..b6f942a --- /dev/null +++ b/public/js/moment/locale/bn.js @@ -0,0 +1,119 @@ +//! moment.js locale configuration +//! locale : Bengali [bn] +//! author : Kaushik Gandhi : https://github.com/kaushikgandhi + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var symbolMap = { + '1': '১', + '2': '২', + '3': '৩', + '4': '৪', + '5': '৫', + '6': '৬', + '7': '৭', + '8': '৮', + '9': '৯', + '0': '০' +}; +var numberMap = { + '১': '1', + '২': '2', + '৩': '3', + '৪': '4', + '৫': '5', + '৬': '6', + '৭': '7', + '৮': '8', + '৯': '9', + '০': '0' +}; + +var bn = moment.defineLocale('bn', { + months : 'জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'), + monthsShort : 'জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'), + weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'), + weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'), + weekdaysMin : 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'), + longDateFormat : { + LT : 'A h:mm সময়', + LTS : 'A h:mm:ss সময়', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm সময়', + LLLL : 'dddd, D MMMM YYYY, A h:mm সময়' + }, + calendar : { + sameDay : '[আজ] LT', + nextDay : '[আগামীকাল] LT', + nextWeek : 'dddd, LT', + lastDay : '[গতকাল] LT', + lastWeek : '[গত] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s পরে', + past : '%s আগে', + s : 'কয়েক সেকেন্ড', + m : 'এক মিনিট', + mm : '%d মিনিট', + h : 'এক ঘন্টা', + hh : '%d ঘন্টা', + d : 'এক দিন', + dd : '%d দিন', + M : 'এক মাস', + MM : '%d মাস', + y : 'এক বছর', + yy : '%d বছর' + }, + preparse: function (string) { + return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ((meridiem === 'রাত' && hour >= 4) || + (meridiem === 'দুপুর' && hour < 5) || + meridiem === 'বিকাল') { + return hour + 12; + } else { + return hour; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'রাত'; + } else if (hour < 10) { + return 'সকাল'; + } else if (hour < 17) { + return 'দুপুর'; + } else if (hour < 20) { + return 'বিকাল'; + } else { + return 'রাত'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } +}); + +return bn; + +}))); diff --git a/public/js/moment/locale/bo.js b/public/js/moment/locale/bo.js new file mode 100755 index 0000000..eb6db47 --- /dev/null +++ b/public/js/moment/locale/bo.js @@ -0,0 +1,119 @@ +//! moment.js locale configuration +//! locale : Tibetan [bo] +//! author : Thupten N. Chakrishar : https://github.com/vajradog + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var symbolMap = { + '1': '༡', + '2': '༢', + '3': '༣', + '4': '༤', + '5': '༥', + '6': '༦', + '7': '༧', + '8': '༨', + '9': '༩', + '0': '༠' +}; +var numberMap = { + '༡': '1', + '༢': '2', + '༣': '3', + '༤': '4', + '༥': '5', + '༦': '6', + '༧': '7', + '༨': '8', + '༩': '9', + '༠': '0' +}; + +var bo = moment.defineLocale('bo', { + months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), + weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm', + LLLL : 'dddd, D MMMM YYYY, A h:mm' + }, + calendar : { + sameDay : '[དི་རིང] LT', + nextDay : '[སང་ཉིན] LT', + nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', + lastDay : '[ཁ་སང] LT', + lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ལ་', + past : '%s སྔན་ལ', + s : 'ལམ་སང', + m : 'སྐར་མ་གཅིག', + mm : '%d སྐར་མ', + h : 'ཆུ་ཚོད་གཅིག', + hh : '%d ཆུ་ཚོད', + d : 'ཉིན་གཅིག', + dd : '%d ཉིན་', + M : 'ཟླ་བ་གཅིག', + MM : '%d ཟླ་བ', + y : 'ལོ་གཅིག', + yy : '%d ལོ' + }, + preparse: function (string) { + return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ((meridiem === 'མཚན་མོ' && hour >= 4) || + (meridiem === 'ཉིན་གུང' && hour < 5) || + meridiem === 'དགོང་དག') { + return hour + 12; + } else { + return hour; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'མཚན་མོ'; + } else if (hour < 10) { + return 'ཞོགས་ཀས'; + } else if (hour < 17) { + return 'ཉིན་གུང'; + } else if (hour < 20) { + return 'དགོང་དག'; + } else { + return 'མཚན་མོ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } +}); + +return bo; + +}))); diff --git a/public/js/moment/locale/br.js b/public/js/moment/locale/br.js new file mode 100755 index 0000000..7233063 --- /dev/null +++ b/public/js/moment/locale/br.js @@ -0,0 +1,108 @@ +//! moment.js locale configuration +//! locale : Breton [br] +//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +function relativeTimeWithMutation(number, withoutSuffix, key) { + var format = { + 'mm': 'munutenn', + 'MM': 'miz', + 'dd': 'devezh' + }; + return number + ' ' + mutation(format[key], number); +} +function specialMutationForYears(number) { + switch (lastNumber(number)) { + case 1: + case 3: + case 4: + case 5: + case 9: + return number + ' bloaz'; + default: + return number + ' vloaz'; + } +} +function lastNumber(number) { + if (number > 9) { + return lastNumber(number % 10); + } + return number; +} +function mutation(text, number) { + if (number === 2) { + return softMutation(text); + } + return text; +} +function softMutation(text) { + var mutationTable = { + 'm': 'v', + 'b': 'v', + 'd': 'z' + }; + if (mutationTable[text.charAt(0)] === undefined) { + return text; + } + return mutationTable[text.charAt(0)] + text.substring(1); +} + +var br = moment.defineLocale('br', { + months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), + monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), + weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), + weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), + weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'h[e]mm A', + LTS : 'h[e]mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [a viz] MMMM YYYY', + LLL : 'D [a viz] MMMM YYYY h[e]mm A', + LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A' + }, + calendar : { + sameDay : '[Hiziv da] LT', + nextDay : '[Warc\'hoazh da] LT', + nextWeek : 'dddd [da] LT', + lastDay : '[Dec\'h da] LT', + lastWeek : 'dddd [paset da] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'a-benn %s', + past : '%s \'zo', + s : 'un nebeud segondennoù', + m : 'ur vunutenn', + mm : relativeTimeWithMutation, + h : 'un eur', + hh : '%d eur', + d : 'un devezh', + dd : relativeTimeWithMutation, + M : 'ur miz', + MM : relativeTimeWithMutation, + y : 'ur bloaz', + yy : specialMutationForYears + }, + dayOfMonthOrdinalParse: /\d{1,2}(añ|vet)/, + ordinal : function (number) { + var output = (number === 1) ? 'añ' : 'vet'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return br; + +}))); diff --git a/public/js/moment/locale/bs.js b/public/js/moment/locale/bs.js new file mode 100755 index 0000000..760a786 --- /dev/null +++ b/public/js/moment/locale/bs.js @@ -0,0 +1,143 @@ +//! moment.js locale configuration +//! locale : Bosnian [bs] +//! author : Nedim Cholich : https://github.com/frontyard +//! based on (hr) translation by Bojan Marković + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } +} + +var bs = moment.defineLocale('bs', { + months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[jučer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[prošlu] dddd [u] LT'; + case 6: + return '[prošle] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prošli] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return bs; + +}))); diff --git a/public/js/moment/locale/ca.js b/public/js/moment/locale/ca.js new file mode 100755 index 0000000..8064a5d --- /dev/null +++ b/public/js/moment/locale/ca.js @@ -0,0 +1,88 @@ +//! moment.js locale configuration +//! locale : Catalan [ca] +//! author : Juan G. Hurtado : https://github.com/juanghurtado + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var ca = moment.defineLocale('ca', { + months : { + standalone: 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), + format: 'de gener_de febrer_de març_d\'abril_de maig_de juny_de juliol_d\'agost_de setembre_d\'octubre_de novembre_de desembre'.split('_'), + isFormat: /D[oD]?(\s)+MMMM/ + }, + monthsShort : 'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split('_'), + monthsParseExact : true, + weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), + weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), + weekdaysMin : 'dg_dl_dt_dc_dj_dv_ds'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [de] YYYY', + ll : 'D MMM YYYY', + LLL : 'D MMMM [de] YYYY [a les] H:mm', + lll : 'D MMM YYYY, H:mm', + LLLL : 'dddd D MMMM [de] YYYY [a les] H:mm', + llll : 'ddd D MMM YYYY, H:mm' + }, + calendar : { + sameDay : function () { + return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextDay : function () { + return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastDay : function () { + return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'd\'aquí %s', + past : 'fa %s', + s : 'uns segons', + m : 'un minut', + mm : '%d minuts', + h : 'una hora', + hh : '%d hores', + d : 'un dia', + dd : '%d dies', + M : 'un mes', + MM : '%d mesos', + y : 'un any', + yy : '%d anys' + }, + dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/, + ordinal : function (number, period) { + var output = (number === 1) ? 'r' : + (number === 2) ? 'n' : + (number === 3) ? 'r' : + (number === 4) ? 't' : 'è'; + if (period === 'w' || period === 'W') { + output = 'a'; + } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return ca; + +}))); diff --git a/public/js/moment/locale/cs.js b/public/js/moment/locale/cs.js new file mode 100755 index 0000000..952dc49 --- /dev/null +++ b/public/js/moment/locale/cs.js @@ -0,0 +1,172 @@ +//! moment.js locale configuration +//! locale : Czech [cs] +//! author : petrbela : https://github.com/petrbela + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'); +var monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'); +function plural(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); +} +function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'den' : 'dnem'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'měsíce' : 'měsíců'); + } else { + return result + 'měsíci'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; + } +} + +var cs = moment.defineLocale('cs', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (červenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + shortMonthsParse : (function (monthsShort) { + var i, _shortMonthsParse = []; + for (i = 0; i < 12; i++) { + _shortMonthsParse[i] = new RegExp('^' + monthsShort[i] + '$', 'i'); + } + return _shortMonthsParse; + }(monthsShort)), + longMonthsParse : (function (months) { + var i, _longMonthsParse = []; + for (i = 0; i < 12; i++) { + _longMonthsParse[i] = new RegExp('^' + months[i] + '$', 'i'); + } + return _longMonthsParse; + }(months)), + weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'), + weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'), + weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd D. MMMM YYYY H:mm', + l : 'D. M. YYYY' + }, + calendar : { + sameDay: '[dnes v] LT', + nextDay: '[zítra v] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v neděli v] LT'; + case 1: + case 2: + return '[v] dddd [v] LT'; + case 3: + return '[ve středu v] LT'; + case 4: + return '[ve čtvrtek v] LT'; + case 5: + return '[v pátek v] LT'; + case 6: + return '[v sobotu v] LT'; + } + }, + lastDay: '[včera v] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulou neděli v] LT'; + case 1: + case 2: + return '[minulé] dddd [v] LT'; + case 3: + return '[minulou středu v] LT'; + case 4: + case 5: + return '[minulý] dddd [v] LT'; + case 6: + return '[minulou sobotu v] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'před %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse : /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return cs; + +}))); diff --git a/public/js/moment/locale/cv.js b/public/js/moment/locale/cv.js new file mode 100755 index 0000000..6d20779 --- /dev/null +++ b/public/js/moment/locale/cv.js @@ -0,0 +1,63 @@ +//! moment.js locale configuration +//! locale : Chuvash [cv] +//! author : Anatoly Mironov : https://github.com/mirontoli + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var cv = moment.defineLocale('cv', { + months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'), + monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'), + weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'), + weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'), + weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', + LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]', + LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm', + LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm' + }, + calendar : { + sameDay: '[Паян] LT [сехетре]', + nextDay: '[Ыран] LT [сехетре]', + lastDay: '[Ӗнер] LT [сехетре]', + nextWeek: '[Ҫитес] dddd LT [сехетре]', + lastWeek: '[Иртнӗ] dddd LT [сехетре]', + sameElse: 'L' + }, + relativeTime : { + future : function (output) { + var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран'; + return output + affix; + }, + past : '%s каялла', + s : 'пӗр-ик ҫеккунт', + m : 'пӗр минут', + mm : '%d минут', + h : 'пӗр сехет', + hh : '%d сехет', + d : 'пӗр кун', + dd : '%d кун', + M : 'пӗр уйӑх', + MM : '%d уйӑх', + y : 'пӗр ҫул', + yy : '%d ҫул' + }, + dayOfMonthOrdinalParse: /\d{1,2}-мӗш/, + ordinal : '%d-мӗш', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return cv; + +}))); diff --git a/public/js/moment/locale/cy.js b/public/js/moment/locale/cy.js new file mode 100755 index 0000000..c570c22 --- /dev/null +++ b/public/js/moment/locale/cy.js @@ -0,0 +1,81 @@ +//! moment.js locale configuration +//! locale : Welsh [cy] +//! author : Robert Allen : https://github.com/robgallen +//! author : https://github.com/ryangreaves + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var cy = moment.defineLocale('cy', { + months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), + monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), + weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), + weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), + weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), + weekdaysParseExact : true, + // time formats are the same as en-gb + longDateFormat: { + LT: 'HH:mm', + LTS : 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd, D MMMM YYYY HH:mm' + }, + calendar: { + sameDay: '[Heddiw am] LT', + nextDay: '[Yfory am] LT', + nextWeek: 'dddd [am] LT', + lastDay: '[Ddoe am] LT', + lastWeek: 'dddd [diwethaf am] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'mewn %s', + past: '%s yn ôl', + s: 'ychydig eiliadau', + m: 'munud', + mm: '%d munud', + h: 'awr', + hh: '%d awr', + d: 'diwrnod', + dd: '%d diwrnod', + M: 'mis', + MM: '%d mis', + y: 'blwyddyn', + yy: '%d flynedd' + }, + dayOfMonthOrdinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, + // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh + ordinal: function (number) { + var b = number, + output = '', + lookup = [ + '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed + 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed + ]; + if (b > 20) { + if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { + output = 'fed'; // not 30ain, 70ain or 90ain + } else { + output = 'ain'; + } + } else if (b > 0) { + output = lookup[b]; + } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return cy; + +}))); diff --git a/public/js/moment/locale/da.js b/public/js/moment/locale/da.js new file mode 100755 index 0000000..42d5f16 --- /dev/null +++ b/public/js/moment/locale/da.js @@ -0,0 +1,60 @@ +//! moment.js locale configuration +//! locale : Danish [da] +//! author : Ulrik Nielsen : https://github.com/mrbase + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var da = moment.defineLocale('da', { + months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd [d.] D. MMMM YYYY [kl.] HH:mm' + }, + calendar : { + sameDay : '[i dag kl.] LT', + nextDay : '[i morgen kl.] LT', + nextWeek : 'på dddd [kl.] LT', + lastDay : '[i går kl.] LT', + lastWeek : '[i] dddd[s kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'få sekunder', + m : 'et minut', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dage', + M : 'en måned', + MM : '%d måneder', + y : 'et år', + yy : '%d år' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return da; + +}))); diff --git a/public/js/moment/locale/de-at.js b/public/js/moment/locale/de-at.js new file mode 100755 index 0000000..8755e42 --- /dev/null +++ b/public/js/moment/locale/de-at.js @@ -0,0 +1,79 @@ +//! moment.js locale configuration +//! locale : German (Austria) [de-at] +//! author : lluchs : https://github.com/lluchs +//! author: Menelion Elensúle: https://github.com/Oire +//! author : Martin Groller : https://github.com/MadMG +//! author : Mikolaj Dadela : https://github.com/mik01aj + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; +} + +var deAt = moment.defineLocale('de-at', { + months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd, D. MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return deAt; + +}))); diff --git a/public/js/moment/locale/de-ch.js b/public/js/moment/locale/de-ch.js new file mode 100755 index 0000000..45de05e --- /dev/null +++ b/public/js/moment/locale/de-ch.js @@ -0,0 +1,78 @@ +//! moment.js locale configuration +//! locale : German (Switzerland) [de-ch] +//! author : sschueller : https://github.com/sschueller + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +// based on: https://www.bk.admin.ch/dokumentation/sprachen/04915/05016/index.html?lang=de# + +function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; +} + +var deCh = moment.defineLocale('de-ch', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT: 'HH.mm', + LTS: 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH.mm', + LLLL : 'dddd, D. MMMM YYYY HH.mm' + }, + calendar : { + sameDay: '[heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return deCh; + +}))); diff --git a/public/js/moment/locale/de.js b/public/js/moment/locale/de.js new file mode 100755 index 0000000..f0978a3 --- /dev/null +++ b/public/js/moment/locale/de.js @@ -0,0 +1,78 @@ +//! moment.js locale configuration +//! locale : German [de] +//! author : lluchs : https://github.com/lluchs +//! author: Menelion Elensúle: https://github.com/Oire +//! author : Mikolaj Dadela : https://github.com/mik01aj + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; +} + +var de = moment.defineLocale('de', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd, D. MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return de; + +}))); diff --git a/public/js/moment/locale/dv.js b/public/js/moment/locale/dv.js new file mode 100755 index 0000000..065df78 --- /dev/null +++ b/public/js/moment/locale/dv.js @@ -0,0 +1,100 @@ +//! moment.js locale configuration +//! locale : Maldivian [dv] +//! author : Jawish Hameed : https://github.com/jawish + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var months = [ + 'ޖެނުއަރީ', + 'ފެބްރުއަރީ', + 'މާރިޗު', + 'އޭޕްރީލު', + 'މޭ', + 'ޖޫން', + 'ޖުލައި', + 'އޯގަސްޓު', + 'ސެޕްޓެމްބަރު', + 'އޮކްޓޯބަރު', + 'ނޮވެމްބަރު', + 'ޑިސެމްބަރު' +]; +var weekdays = [ + 'އާދިއްތަ', + 'ހޯމަ', + 'އަންގާރަ', + 'ބުދަ', + 'ބުރާސްފަތި', + 'ހުކުރު', + 'ހޮނިހިރު' +]; + +var dv = moment.defineLocale('dv', { + months : months, + monthsShort : months, + weekdays : weekdays, + weekdaysShort : weekdays, + weekdaysMin : 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'), + longDateFormat : { + + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'D/M/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /މކ|މފ/, + isPM : function (input) { + return 'މފ' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'މކ'; + } else { + return 'މފ'; + } + }, + calendar : { + sameDay : '[މިއަދު] LT', + nextDay : '[މާދަމާ] LT', + nextWeek : 'dddd LT', + lastDay : '[އިއްޔެ] LT', + lastWeek : '[ފާއިތުވި] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ތެރޭގައި %s', + past : 'ކުރިން %s', + s : 'ސިކުންތުކޮޅެއް', + m : 'މިނިޓެއް', + mm : 'މިނިޓު %d', + h : 'ގަޑިއިރެއް', + hh : 'ގަޑިއިރު %d', + d : 'ދުވަހެއް', + dd : 'ދުވަސް %d', + M : 'މަހެއް', + MM : 'މަސް %d', + y : 'އަހަރެއް', + yy : 'އަހަރު %d' + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/,/g, '،'); + }, + week : { + dow : 7, // Sunday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } +}); + +return dv; + +}))); diff --git a/public/js/moment/locale/el.js b/public/js/moment/locale/el.js new file mode 100755 index 0000000..af1ab2c --- /dev/null +++ b/public/js/moment/locale/el.js @@ -0,0 +1,100 @@ +//! moment.js locale configuration +//! locale : Greek [el] +//! author : Aggelos Karalias : https://github.com/mehiel + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + +function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; +} + + +var el = moment.defineLocale('el', { + monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'), + monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'), + months : function (momentToFormat, format) { + if (!momentToFormat) { + return this._monthsNominativeEl; + } else if (typeof format === 'string' && /D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' + return this._monthsGenitiveEl[momentToFormat.month()]; + } else { + return this._monthsNominativeEl[momentToFormat.month()]; + } + }, + monthsShort : 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'), + weekdays : 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'), + weekdaysShort : 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'), + weekdaysMin : 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'), + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'μμ' : 'ΜΜ'; + } else { + return isLower ? 'πμ' : 'ΠΜ'; + } + }, + isPM : function (input) { + return ((input + '').toLowerCase()[0] === 'μ'); + }, + meridiemParse : /[ΠΜ]\.?Μ?\.?/i, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendarEl : { + sameDay : '[Σήμερα {}] LT', + nextDay : '[Αύριο {}] LT', + nextWeek : 'dddd [{}] LT', + lastDay : '[Χθες {}] LT', + lastWeek : function () { + switch (this.day()) { + case 6: + return '[το προηγούμενο] dddd [{}] LT'; + default: + return '[την προηγούμενη] dddd [{}] LT'; + } + }, + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendarEl[key], + hours = mom && mom.hours(); + if (isFunction(output)) { + output = output.apply(mom); + } + return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); + }, + relativeTime : { + future : 'σε %s', + past : '%s πριν', + s : 'λίγα δευτερόλεπτα', + m : 'ένα λεπτό', + mm : '%d λεπτά', + h : 'μία ώρα', + hh : '%d ώρες', + d : 'μία μέρα', + dd : '%d μέρες', + M : 'ένας μήνας', + MM : '%d μήνες', + y : 'ένας χρόνος', + yy : '%d χρόνια' + }, + dayOfMonthOrdinalParse: /\d{1,2}η/, + ordinal: '%dη', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4st is the first week of the year. + } +}); + +return el; + +}))); diff --git a/public/js/moment/locale/en-au.js b/public/js/moment/locale/en-au.js new file mode 100755 index 0000000..e8a8fdc --- /dev/null +++ b/public/js/moment/locale/en-au.js @@ -0,0 +1,67 @@ +//! moment.js locale configuration +//! locale : English (Australia) [en-au] +//! author : Jared Morse : https://github.com/jarcoal + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var enAu = moment.defineLocale('en-au', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return enAu; + +}))); diff --git a/public/js/moment/locale/en-ca.js b/public/js/moment/locale/en-ca.js new file mode 100755 index 0000000..3629bf1 --- /dev/null +++ b/public/js/moment/locale/en-ca.js @@ -0,0 +1,63 @@ +//! moment.js locale configuration +//! locale : English (Canada) [en-ca] +//! author : Jonathan Abourbih : https://github.com/jonbca + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var enCa = moment.defineLocale('en-ca', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'YYYY-MM-DD', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY h:mm A', + LLLL : 'dddd, MMMM D, YYYY h:mm A' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } +}); + +return enCa; + +}))); diff --git a/public/js/moment/locale/en-gb.js b/public/js/moment/locale/en-gb.js new file mode 100755 index 0000000..fe48a78 --- /dev/null +++ b/public/js/moment/locale/en-gb.js @@ -0,0 +1,67 @@ +//! moment.js locale configuration +//! locale : English (United Kingdom) [en-gb] +//! author : Chris Gedrim : https://github.com/chrisgedrim + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var enGb = moment.defineLocale('en-gb', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return enGb; + +}))); diff --git a/public/js/moment/locale/en-ie.js b/public/js/moment/locale/en-ie.js new file mode 100755 index 0000000..bb0ccce --- /dev/null +++ b/public/js/moment/locale/en-ie.js @@ -0,0 +1,67 @@ +//! moment.js locale configuration +//! locale : English (Ireland) [en-ie] +//! author : Chris Cartlidge : https://github.com/chriscartlidge + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var enIe = moment.defineLocale('en-ie', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return enIe; + +}))); diff --git a/public/js/moment/locale/en-nz.js b/public/js/moment/locale/en-nz.js new file mode 100755 index 0000000..7005231 --- /dev/null +++ b/public/js/moment/locale/en-nz.js @@ -0,0 +1,67 @@ +//! moment.js locale configuration +//! locale : English (New Zealand) [en-nz] +//! author : Luke McGregor : https://github.com/lukemcgregor + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var enNz = moment.defineLocale('en-nz', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return enNz; + +}))); diff --git a/public/js/moment/locale/eo.js b/public/js/moment/locale/eo.js new file mode 100755 index 0000000..8001c83 --- /dev/null +++ b/public/js/moment/locale/eo.js @@ -0,0 +1,73 @@ +//! moment.js locale configuration +//! locale : Esperanto [eo] +//! author : Colin Dean : https://github.com/colindean +//! author : Mia Nordentoft Imperatori : https://github.com/miestasmia +//! comment : miestasmia corrected the translation by colindean + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var eo = moment.defineLocale('eo', { + months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'), + weekdays : 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'), + weekdaysShort : 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'), + weekdaysMin : 'di_lu_ma_me_ĵa_ve_sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'D[-a de] MMMM, YYYY', + LLL : 'D[-a de] MMMM, YYYY HH:mm', + LLLL : 'dddd, [la] D[-a de] MMMM, YYYY HH:mm' + }, + meridiemParse: /[ap]\.t\.m/i, + isPM: function (input) { + return input.charAt(0).toLowerCase() === 'p'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'p.t.m.' : 'P.T.M.'; + } else { + return isLower ? 'a.t.m.' : 'A.T.M.'; + } + }, + calendar : { + sameDay : '[Hodiaŭ je] LT', + nextDay : '[Morgaŭ je] LT', + nextWeek : 'dddd [je] LT', + lastDay : '[Hieraŭ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'post %s', + past : 'antaŭ %s', + s : 'sekundoj', + m : 'minuto', + mm : '%d minutoj', + h : 'horo', + hh : '%d horoj', + d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo + dd : '%d tagoj', + M : 'monato', + MM : '%d monatoj', + y : 'jaro', + yy : '%d jaroj' + }, + dayOfMonthOrdinalParse: /\d{1,2}a/, + ordinal : '%da', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return eo; + +}))); diff --git a/public/js/moment/locale/es-do.js b/public/js/moment/locale/es-do.js new file mode 100755 index 0000000..9aa0535 --- /dev/null +++ b/public/js/moment/locale/es-do.js @@ -0,0 +1,91 @@ +//! moment.js locale configuration +//! locale : Spanish (Dominican Republic) [es-do] + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'); +var monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + +var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; +var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; + +var esDo = moment.defineLocale('es-do', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortDot; + } else if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + monthsRegex: monthsRegex, + monthsShortRegex: monthsRegex, + monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, + monthsShortStrictRegex: /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, + monthsParse: monthsParse, + longMonthsParse: monthsParse, + shortMonthsParse: monthsParse, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY h:mm A', + LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return esDo; + +}))); diff --git a/public/js/moment/locale/es-us.js b/public/js/moment/locale/es-us.js new file mode 100755 index 0000000..c7d2f97 --- /dev/null +++ b/public/js/moment/locale/es-us.js @@ -0,0 +1,83 @@ +//! moment.js locale configuration +//! locale : Spanish (United States) [es-us] +//! author : bustta : https://github.com/bustta + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'); +var monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + +var esUs = moment.defineLocale('es-us', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortDot; + } else if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + monthsParseExact : true, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'MM/DD/YYYY', + LL : 'MMMM [de] D [de] YYYY', + LLL : 'MMMM [de] D [de] YYYY H:mm', + LLLL : 'dddd, MMMM [de] D [de] YYYY H:mm' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } +}); + +return esUs; + +}))); diff --git a/public/js/moment/locale/es.js b/public/js/moment/locale/es.js new file mode 100755 index 0000000..9fce89d --- /dev/null +++ b/public/js/moment/locale/es.js @@ -0,0 +1,92 @@ +//! moment.js locale configuration +//! locale : Spanish [es] +//! author : Julio Napurí : https://github.com/julionc + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'); +var monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + +var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; +var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; + +var es = moment.defineLocale('es', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortDot; + } else if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + monthsRegex : monthsRegex, + monthsShortRegex : monthsRegex, + monthsStrictRegex : /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, + monthsShortStrictRegex : /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY H:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return es; + +}))); diff --git a/public/js/moment/locale/et.js b/public/js/moment/locale/et.js new file mode 100755 index 0000000..3a759e9 --- /dev/null +++ b/public/js/moment/locale/et.js @@ -0,0 +1,80 @@ +//! moment.js locale configuration +//! locale : Estonian [et] +//! author : Henry Kehlmann : https://github.com/madhenry +//! improvements : Illimar Tambek : https://github.com/ragulka + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], + 'm' : ['ühe minuti', 'üks minut'], + 'mm': [number + ' minuti', number + ' minutit'], + 'h' : ['ühe tunni', 'tund aega', 'üks tund'], + 'hh': [number + ' tunni', number + ' tundi'], + 'd' : ['ühe päeva', 'üks päev'], + 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], + 'MM': [number + ' kuu', number + ' kuud'], + 'y' : ['ühe aasta', 'aasta', 'üks aasta'], + 'yy': [number + ' aasta', number + ' aastat'] + }; + if (withoutSuffix) { + return format[key][2] ? format[key][2] : format[key][1]; + } + return isFuture ? format[key][0] : format[key][1]; +} + +var et = moment.defineLocale('et', { + months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), + monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), + weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), + weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), + weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s pärast', + past : '%s tagasi', + s : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : '%d päeva', + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return et; + +}))); diff --git a/public/js/moment/locale/eu.js b/public/js/moment/locale/eu.js new file mode 100755 index 0000000..e2021cf --- /dev/null +++ b/public/js/moment/locale/eu.js @@ -0,0 +1,66 @@ +//! moment.js locale configuration +//! locale : Basque [eu] +//! author : Eneko Illarramendi : https://github.com/eillarra + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var eu = moment.defineLocale('eu', { + months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), + monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), + monthsParseExact : true, + weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), + weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), + weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY[ko] MMMM[ren] D[a]', + LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm', + LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm', + l : 'YYYY-M-D', + ll : 'YYYY[ko] MMM D[a]', + lll : 'YYYY[ko] MMM D[a] HH:mm', + llll : 'ddd, YYYY[ko] MMM D[a] HH:mm' + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : '%s barru', + past : 'duela %s', + s : 'segundo batzuk', + m : 'minutu bat', + mm : '%d minutu', + h : 'ordu bat', + hh : '%d ordu', + d : 'egun bat', + dd : '%d egun', + M : 'hilabete bat', + MM : '%d hilabete', + y : 'urte bat', + yy : '%d urte' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return eu; + +}))); diff --git a/public/js/moment/locale/fa.js b/public/js/moment/locale/fa.js new file mode 100755 index 0000000..e6e5619 --- /dev/null +++ b/public/js/moment/locale/fa.js @@ -0,0 +1,107 @@ +//! moment.js locale configuration +//! locale : Persian [fa] +//! author : Ebrahim Byagowi : https://github.com/ebraminio + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var symbolMap = { + '1': '۱', + '2': '۲', + '3': '۳', + '4': '۴', + '5': '۵', + '6': '۶', + '7': '۷', + '8': '۸', + '9': '۹', + '0': '۰' +}; +var numberMap = { + '۱': '1', + '۲': '2', + '۳': '3', + '۴': '4', + '۵': '5', + '۶': '6', + '۷': '7', + '۸': '8', + '۹': '9', + '۰': '0' +}; + +var fa = moment.defineLocale('fa', { + months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + meridiemParse: /قبل از ظهر|بعد از ظهر/, + isPM: function (input) { + return /بعد از ظهر/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'قبل از ظهر'; + } else { + return 'بعد از ظهر'; + } + }, + calendar : { + sameDay : '[امروز ساعت] LT', + nextDay : '[فردا ساعت] LT', + nextWeek : 'dddd [ساعت] LT', + lastDay : '[دیروز ساعت] LT', + lastWeek : 'dddd [پیش] [ساعت] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'در %s', + past : '%s پیش', + s : 'چند ثانیه', + m : 'یک دقیقه', + mm : '%d دقیقه', + h : 'یک ساعت', + hh : '%d ساعت', + d : 'یک روز', + dd : '%d روز', + M : 'یک ماه', + MM : '%d ماه', + y : 'یک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/[۰-۹]/g, function (match) { + return numberMap[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, + dayOfMonthOrdinalParse: /\d{1,2}م/, + ordinal : '%dم', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } +}); + +return fa; + +}))); diff --git a/public/js/moment/locale/fi.js b/public/js/moment/locale/fi.js new file mode 100755 index 0000000..3eeef5c --- /dev/null +++ b/public/js/moment/locale/fi.js @@ -0,0 +1,107 @@ +//! moment.js locale configuration +//! locale : Finnish [fi] +//! author : Tarmo Aidantausta : https://github.com/bleadof + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '); +var numbersFuture = [ + 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbersPast[7], numbersPast[8], numbersPast[9] + ]; +function translate(number, withoutSuffix, key, isFuture) { + var result = ''; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; + break; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; + break; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; + break; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; + break; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; + break; + } + result = verbalNumber(number, isFuture) + ' ' + result; + return result; +} +function verbalNumber(number, isFuture) { + return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; +} + +var fi = moment.defineLocale('fi', { + months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), + monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), + weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), + weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), + weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'Do MMMM[ta] YYYY', + LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm', + LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm', + l : 'D.M.YYYY', + ll : 'Do MMM YYYY', + lll : 'Do MMM YYYY, [klo] HH.mm', + llll : 'ddd, Do MMM YYYY, [klo] HH.mm' + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s päästä', + past : '%s sitten', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return fi; + +}))); diff --git a/public/js/moment/locale/fo.js b/public/js/moment/locale/fo.js new file mode 100755 index 0000000..eec43bc --- /dev/null +++ b/public/js/moment/locale/fo.js @@ -0,0 +1,60 @@ +//! moment.js locale configuration +//! locale : Faroese [fo] +//! author : Ragnar Johannesen : https://github.com/ragnar123 + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var fo = moment.defineLocale('fo', { + months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), + weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), + weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D. MMMM, YYYY HH:mm' + }, + calendar : { + sameDay : '[Í dag kl.] LT', + nextDay : '[Í morgin kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[Í gjár kl.] LT', + lastWeek : '[síðstu] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'um %s', + past : '%s síðani', + s : 'fá sekund', + m : 'ein minutt', + mm : '%d minuttir', + h : 'ein tími', + hh : '%d tímar', + d : 'ein dagur', + dd : '%d dagar', + M : 'ein mánaði', + MM : '%d mánaðir', + y : 'eitt ár', + yy : '%d ár' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return fo; + +}))); diff --git a/public/js/moment/locale/fr-ca.js b/public/js/moment/locale/fr-ca.js new file mode 100755 index 0000000..49e61d2 --- /dev/null +++ b/public/js/moment/locale/fr-ca.js @@ -0,0 +1,74 @@ +//! moment.js locale configuration +//! locale : French (Canada) [fr-ca] +//! author : Jonathan Abourbih : https://github.com/jonbca + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var frCa = moment.defineLocale('fr-ca', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, + ordinal : function (number, period) { + switch (period) { + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'D': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); + + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); + } + } +}); + +return frCa; + +}))); diff --git a/public/js/moment/locale/fr-ch.js b/public/js/moment/locale/fr-ch.js new file mode 100755 index 0000000..38bf858 --- /dev/null +++ b/public/js/moment/locale/fr-ch.js @@ -0,0 +1,78 @@ +//! moment.js locale configuration +//! locale : French (Switzerland) [fr-ch] +//! author : Gaspard Bucher : https://github.com/gaspard + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var frCh = moment.defineLocale('fr-ch', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, + ordinal : function (number, period) { + switch (period) { + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'D': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); + + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return frCh; + +}))); diff --git a/public/js/moment/locale/fr.js b/public/js/moment/locale/fr.js new file mode 100755 index 0000000..7e4cfbc --- /dev/null +++ b/public/js/moment/locale/fr.js @@ -0,0 +1,83 @@ +//! moment.js locale configuration +//! locale : French [fr] +//! author : John Fischer : https://github.com/jfroffice + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var fr = moment.defineLocale('fr', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|)/, + ordinal : function (number, period) { + switch (period) { + // TODO: Return 'e' when day of month > 1. Move this case inside + // block for masculine words below. + // See https://github.com/moment/moment/issues/3375 + case 'D': + return number + (number === 1 ? 'er' : ''); + + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); + + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return fr; + +}))); diff --git a/public/js/moment/locale/fy.js b/public/js/moment/locale/fy.js new file mode 100755 index 0000000..2ed7d5b --- /dev/null +++ b/public/js/moment/locale/fy.js @@ -0,0 +1,75 @@ +//! moment.js locale configuration +//! locale : Frisian [fy] +//! author : Robin van der Vliet : https://github.com/robin0van0der0v + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'); +var monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); + +var fy = moment.defineLocale('fy', { + months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + monthsParseExact : true, + weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), + weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), + weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[hjoed om] LT', + nextDay: '[moarn om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[juster om] LT', + lastWeek: '[ôfrûne] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'oer %s', + past : '%s lyn', + s : 'in pear sekonden', + m : 'ien minút', + mm : '%d minuten', + h : 'ien oere', + hh : '%d oeren', + d : 'ien dei', + dd : '%d dagen', + M : 'ien moanne', + MM : '%d moannen', + y : 'ien jier', + yy : '%d jierren' + }, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return fy; + +}))); diff --git a/public/js/moment/locale/gd.js b/public/js/moment/locale/gd.js new file mode 100755 index 0000000..af9eec8 --- /dev/null +++ b/public/js/moment/locale/gd.js @@ -0,0 +1,76 @@ +//! moment.js locale configuration +//! locale : Scottish Gaelic [gd] +//! author : Jon Ashdown : https://github.com/jonashdown + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var months = [ + 'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd' +]; + +var monthsShort = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh']; + +var weekdays = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne']; + +var weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis']; + +var weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa']; + +var gd = moment.defineLocale('gd', { + months : months, + monthsShort : monthsShort, + monthsParseExact : true, + weekdays : weekdays, + weekdaysShort : weekdaysShort, + weekdaysMin : weekdaysMin, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[An-diugh aig] LT', + nextDay : '[A-màireach aig] LT', + nextWeek : 'dddd [aig] LT', + lastDay : '[An-dè aig] LT', + lastWeek : 'dddd [seo chaidh] [aig] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ann an %s', + past : 'bho chionn %s', + s : 'beagan diogan', + m : 'mionaid', + mm : '%d mionaidean', + h : 'uair', + hh : '%d uairean', + d : 'latha', + dd : '%d latha', + M : 'mìos', + MM : '%d mìosan', + y : 'bliadhna', + yy : '%d bliadhna' + }, + dayOfMonthOrdinalParse : /\d{1,2}(d|na|mh)/, + ordinal : function (number) { + var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return gd; + +}))); diff --git a/public/js/moment/locale/gl.js b/public/js/moment/locale/gl.js new file mode 100755 index 0000000..e894db7 --- /dev/null +++ b/public/js/moment/locale/gl.js @@ -0,0 +1,77 @@ +//! moment.js locale configuration +//! locale : Galician [gl] +//! author : Juan G. Hurtado : https://github.com/juanghurtado + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var gl = moment.defineLocale('gl', { + months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'), + monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mé_xo_ve_sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY H:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' + }, + calendar : { + sameDay : function () { + return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str.indexOf('un') === 0) { + return 'n' + str; + } + return 'en ' + str; + }, + past : 'hai %s', + s : 'uns segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'unha hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un ano', + yy : '%d anos' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return gl; + +}))); diff --git a/public/js/moment/locale/gom-latn.js b/public/js/moment/locale/gom-latn.js new file mode 100755 index 0000000..084b4b2 --- /dev/null +++ b/public/js/moment/locale/gom-latn.js @@ -0,0 +1,122 @@ +//! moment.js locale configuration +//! locale : Konkani Latin script [gom-latn] +//! author : The Discoverer : https://github.com/WikiDiscoverer + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's': ['thodde secondanim', 'thodde second'], + 'm': ['eka mintan', 'ek minute'], + 'mm': [number + ' mintanim', number + ' mintam'], + 'h': ['eka horan', 'ek hor'], + 'hh': [number + ' horanim', number + ' hor'], + 'd': ['eka disan', 'ek dis'], + 'dd': [number + ' disanim', number + ' dis'], + 'M': ['eka mhoinean', 'ek mhoino'], + 'MM': [number + ' mhoineanim', number + ' mhoine'], + 'y': ['eka vorsan', 'ek voros'], + 'yy': [number + ' vorsanim', number + ' vorsam'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; +} + +var gomLatn = moment.defineLocale('gom-latn', { + months : 'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split('_'), + monthsShort : 'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son\'var'.split('_'), + weekdaysShort : 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'), + weekdaysMin : 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'A h:mm [vazta]', + LTS : 'A h:mm:ss [vazta]', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY A h:mm [vazta]', + LLLL : 'dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]', + llll: 'ddd, D MMM YYYY, A h:mm [vazta]' + }, + calendar : { + sameDay: '[Aiz] LT', + nextDay: '[Faleam] LT', + nextWeek: '[Ieta to] dddd[,] LT', + lastDay: '[Kal] LT', + lastWeek: '[Fatlo] dddd[,] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s', + past : '%s adim', + s : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse : /\d{1,2}(er)/, + ordinal : function (number, period) { + switch (period) { + // the ordinal 'er' only applies to day of the month + case 'D': + return number + 'er'; + default: + case 'M': + case 'Q': + case 'DDD': + case 'd': + case 'w': + case 'W': + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + }, + meridiemParse: /rati|sokalli|donparam|sanje/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'rati') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'sokalli') { + return hour; + } else if (meridiem === 'donparam') { + return hour > 12 ? hour : hour + 12; + } else if (meridiem === 'sanje') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'rati'; + } else if (hour < 12) { + return 'sokalli'; + } else if (hour < 16) { + return 'donparam'; + } else if (hour < 20) { + return 'sanje'; + } else { + return 'rati'; + } + } +}); + +return gomLatn; + +}))); diff --git a/public/js/moment/locale/gu.js b/public/js/moment/locale/gu.js new file mode 100755 index 0000000..1a13fc4 --- /dev/null +++ b/public/js/moment/locale/gu.js @@ -0,0 +1,124 @@ +//! moment.js locale configuration +//! locale : Gujarati [gu] +//! author : Kaushik Thanki : https://github.com/Kaushik1987 + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var symbolMap = { + '1': '૧', + '2': '૨', + '3': '૩', + '4': '૪', + '5': '૫', + '6': '૬', + '7': '૭', + '8': '૮', + '9': '૯', + '0': '૦' + }; +var numberMap = { + '૧': '1', + '૨': '2', + '૩': '3', + '૪': '4', + '૫': '5', + '૬': '6', + '૭': '7', + '૮': '8', + '૯': '9', + '૦': '0' + }; + +var gu = moment.defineLocale('gu', { + months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split('_'), + monthsShort: 'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split('_'), + monthsParseExact: true, + weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split('_'), + weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'), + weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'), + longDateFormat: { + LT: 'A h:mm વાગ્યે', + LTS: 'A h:mm:ss વાગ્યે', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY, A h:mm વાગ્યે', + LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે' + }, + calendar: { + sameDay: '[આજ] LT', + nextDay: '[કાલે] LT', + nextWeek: 'dddd, LT', + lastDay: '[ગઇકાલે] LT', + lastWeek: '[પાછલા] dddd, LT', + sameElse: 'L' + }, + relativeTime: { + future: '%s મા', + past: '%s પેહલા', + s: 'અમુક પળો', + m: 'એક મિનિટ', + mm: '%d મિનિટ', + h: 'એક કલાક', + hh: '%d કલાક', + d: 'એક દિવસ', + dd: '%d દિવસ', + M: 'એક મહિનો', + MM: '%d મહિનો', + y: 'એક વર્ષ', + yy: '%d વર્ષ' + }, + preparse: function (string) { + return string.replace(/[૧૨૩૪૫૬૭૮૯૦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Gujarati notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati. + meridiemParse: /રાત|બપોર|સવાર|સાંજ/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'રાત') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'સવાર') { + return hour; + } else if (meridiem === 'બપોર') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'સાંજ') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) { + if (hour < 4) { + return 'રાત'; + } else if (hour < 10) { + return 'સવાર'; + } else if (hour < 17) { + return 'બપોર'; + } else if (hour < 20) { + return 'સાંજ'; + } else { + return 'રાત'; + } + }, + week: { + dow: 0, // Sunday is the first day of the week. + doy: 6 // The week that contains Jan 1st is the first week of the year. + } +}); + +return gu; + +}))); diff --git a/public/js/moment/locale/he.js b/public/js/moment/locale/he.js new file mode 100755 index 0000000..e884381 --- /dev/null +++ b/public/js/moment/locale/he.js @@ -0,0 +1,99 @@ +//! moment.js locale configuration +//! locale : Hebrew [he] +//! author : Tomer Cohen : https://github.com/tomer +//! author : Moshe Simantov : https://github.com/DevelopmentIL +//! author : Tal Ater : https://github.com/TalAter + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var he = moment.defineLocale('he', { + months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'), + monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'), + weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), + weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), + weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [ב]MMMM YYYY', + LLL : 'D [ב]MMMM YYYY HH:mm', + LLLL : 'dddd, D [ב]MMMM YYYY HH:mm', + l : 'D/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd, D MMM YYYY HH:mm' + }, + calendar : { + sameDay : '[היום ב־]LT', + nextDay : '[מחר ב־]LT', + nextWeek : 'dddd [בשעה] LT', + lastDay : '[אתמול ב־]LT', + lastWeek : '[ביום] dddd [האחרון בשעה] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'בעוד %s', + past : 'לפני %s', + s : 'מספר שניות', + m : 'דקה', + mm : '%d דקות', + h : 'שעה', + hh : function (number) { + if (number === 2) { + return 'שעתיים'; + } + return number + ' שעות'; + }, + d : 'יום', + dd : function (number) { + if (number === 2) { + return 'יומיים'; + } + return number + ' ימים'; + }, + M : 'חודש', + MM : function (number) { + if (number === 2) { + return 'חודשיים'; + } + return number + ' חודשים'; + }, + y : 'שנה', + yy : function (number) { + if (number === 2) { + return 'שנתיים'; + } else if (number % 10 === 0 && number !== 10) { + return number + ' שנה'; + } + return number + ' שנים'; + } + }, + meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i, + isPM : function (input) { + return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 5) { + return 'לפנות בוקר'; + } else if (hour < 10) { + return 'בבוקר'; + } else if (hour < 12) { + return isLower ? 'לפנה"צ' : 'לפני הצהריים'; + } else if (hour < 18) { + return isLower ? 'אחה"צ' : 'אחרי הצהריים'; + } else { + return 'בערב'; + } + } +}); + +return he; + +}))); diff --git a/public/js/moment/locale/hi.js b/public/js/moment/locale/hi.js new file mode 100755 index 0000000..58afc6b --- /dev/null +++ b/public/js/moment/locale/hi.js @@ -0,0 +1,124 @@ +//! moment.js locale configuration +//! locale : Hindi [hi] +//! author : Mayank Singhal : https://github.com/mayanksinghal + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' +}; +var numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' +}; + +var hi = moment.defineLocale('hi', { + months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'), + monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'), + monthsParseExact: true, + weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), + longDateFormat : { + LT : 'A h:mm बजे', + LTS : 'A h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm बजे', + LLLL : 'dddd, D MMMM YYYY, A h:mm बजे' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[कल] LT', + nextWeek : 'dddd, LT', + lastDay : '[कल] LT', + lastWeek : '[पिछले] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s में', + past : '%s पहले', + s : 'कुछ ही क्षण', + m : 'एक मिनट', + mm : '%d मिनट', + h : 'एक घंटा', + hh : '%d घंटे', + d : 'एक दिन', + dd : '%d दिन', + M : 'एक महीने', + MM : '%d महीने', + y : 'एक वर्ष', + yy : '%d वर्ष' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + meridiemParse: /रात|सुबह|दोपहर|शाम/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सुबह') { + return hour; + } else if (meridiem === 'दोपहर') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'शाम') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'रात'; + } else if (hour < 10) { + return 'सुबह'; + } else if (hour < 17) { + return 'दोपहर'; + } else if (hour < 20) { + return 'शाम'; + } else { + return 'रात'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } +}); + +return hi; + +}))); diff --git a/public/js/moment/locale/hr.js b/public/js/moment/locale/hr.js new file mode 100755 index 0000000..5caeec8 --- /dev/null +++ b/public/js/moment/locale/hr.js @@ -0,0 +1,145 @@ +//! moment.js locale configuration +//! locale : Croatian [hr] +//! author : Bojan Marković : https://github.com/bmarkovic + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } +} + +var hr = moment.defineLocale('hr', { + months : { + format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'), + standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_') + }, + monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), + monthsParseExact: true, + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[jučer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[prošlu] dddd [u] LT'; + case 6: + return '[prošle] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prošli] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return hr; + +}))); diff --git a/public/js/moment/locale/hu.js b/public/js/moment/locale/hu.js new file mode 100755 index 0000000..8460392 --- /dev/null +++ b/public/js/moment/locale/hu.js @@ -0,0 +1,108 @@ +//! moment.js locale configuration +//! locale : Hungarian [hu] +//! author : Adam Brunner : https://github.com/adambrunner + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' '); +function translate(number, withoutSuffix, key, isFuture) { + var num = number; + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); + } + return ''; +} +function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; +} + +var hu = moment.defineLocale('hu', { + months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), + monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), + weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'), + weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), + weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY. MMMM D.', + LLL : 'YYYY. MMMM D. H:mm', + LLLL : 'YYYY. MMMM D., dddd H:mm' + }, + meridiemParse: /de|du/i, + isPM: function (input) { + return input.charAt(1).toLowerCase() === 'u'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower === true ? 'de' : 'DE'; + } else { + return isLower === true ? 'du' : 'DU'; + } + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : '%s múlva', + past : '%s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return hu; + +}))); diff --git a/public/js/moment/locale/hy-am.js b/public/js/moment/locale/hy-am.js new file mode 100755 index 0000000..0b76845 --- /dev/null +++ b/public/js/moment/locale/hy-am.js @@ -0,0 +1,95 @@ +//! moment.js locale configuration +//! locale : Armenian [hy-am] +//! author : Armendarabyan : https://github.com/armendarabyan + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var hyAm = moment.defineLocale('hy-am', { + months : { + format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'), + standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_') + }, + monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'), + weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'), + weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), + weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY թ.', + LLL : 'D MMMM YYYY թ., HH:mm', + LLLL : 'dddd, D MMMM YYYY թ., HH:mm' + }, + calendar : { + sameDay: '[այսօր] LT', + nextDay: '[վաղը] LT', + lastDay: '[երեկ] LT', + nextWeek: function () { + return 'dddd [օրը ժամը] LT'; + }, + lastWeek: function () { + return '[անցած] dddd [օրը ժամը] LT'; + }, + sameElse: 'L' + }, + relativeTime : { + future : '%s հետո', + past : '%s առաջ', + s : 'մի քանի վայրկյան', + m : 'րոպե', + mm : '%d րոպե', + h : 'ժամ', + hh : '%d ժամ', + d : 'օր', + dd : '%d օր', + M : 'ամիս', + MM : '%d ամիս', + y : 'տարի', + yy : '%d տարի' + }, + meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/, + isPM: function (input) { + return /^(ցերեկվա|երեկոյան)$/.test(input); + }, + meridiem : function (hour) { + if (hour < 4) { + return 'գիշերվա'; + } else if (hour < 12) { + return 'առավոտվա'; + } else if (hour < 17) { + return 'ցերեկվա'; + } else { + return 'երեկոյան'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/, + ordinal: function (number, period) { + switch (period) { + case 'DDD': + case 'w': + case 'W': + case 'DDDo': + if (number === 1) { + return number + '-ին'; + } + return number + '-րդ'; + default: + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return hyAm; + +}))); diff --git a/public/js/moment/locale/id.js b/public/js/moment/locale/id.js new file mode 100755 index 0000000..a1cfb18 --- /dev/null +++ b/public/js/moment/locale/id.js @@ -0,0 +1,83 @@ +//! moment.js locale configuration +//! locale : Indonesian [id] +//! author : Mohammad Satrio Utomo : https://github.com/tyok +//! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var id = moment.defineLocale('id', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|siang|sore|malam/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'siang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sore' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lalu', + s : 'beberapa detik', + m : 'semenit', + mm : '%d menit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return id; + +}))); diff --git a/public/js/moment/locale/is.js b/public/js/moment/locale/is.js new file mode 100755 index 0000000..541b270 --- /dev/null +++ b/public/js/moment/locale/is.js @@ -0,0 +1,127 @@ +//! moment.js locale configuration +//! locale : Icelandic [is] +//! author : Hinrik Örn Sigurðsson : https://github.com/hinrik + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +function plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; +} +function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } +} + +var is = moment.defineLocale('is', { + months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), + weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), + weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), + weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] H:mm', + LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm' + }, + calendar : { + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'eftir %s', + past : 'fyrir %s síðan', + s : translate, + m : translate, + mm : translate, + h : 'klukkustund', + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return is; + +}))); diff --git a/public/js/moment/locale/it.js b/public/js/moment/locale/it.js new file mode 100755 index 0000000..f3079cb --- /dev/null +++ b/public/js/moment/locale/it.js @@ -0,0 +1,70 @@ +//! moment.js locale configuration +//! locale : Italian [it] +//! author : Lorenzo : https://github.com/aliem +//! author: Mattia Larentis: https://github.com/nostalgiaz + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var it = moment.defineLocale('it', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'), + weekdaysShort : 'dom_lun_mar_mer_gio_ven_sab'.split('_'), + weekdaysMin : 'do_lu_ma_me_gi_ve_sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return it; + +}))); diff --git a/public/js/moment/locale/ja.js b/public/js/moment/locale/ja.js new file mode 100755 index 0000000..b2e6553 --- /dev/null +++ b/public/js/moment/locale/ja.js @@ -0,0 +1,80 @@ +//! moment.js locale configuration +//! locale : Japanese [ja] +//! author : LI Long : https://github.com/baryon + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var ja = moment.defineLocale('ja', { + months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'), + weekdaysShort : '日_月_火_水_木_金_土'.split('_'), + weekdaysMin : '日_月_火_水_木_金_土'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日 HH:mm', + LLLL : 'YYYY年M月D日 HH:mm dddd', + l : 'YYYY/MM/DD', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日 HH:mm dddd' + }, + meridiemParse: /午前|午後/i, + isPM : function (input) { + return input === '午後'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return '午前'; + } else { + return '午後'; + } + }, + calendar : { + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : '[来週]dddd LT', + lastDay : '[昨日] LT', + lastWeek : '[前週]dddd LT', + sameElse : 'L' + }, + dayOfMonthOrdinalParse : /\d{1,2}日/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '日'; + default: + return number; + } + }, + relativeTime : { + future : '%s後', + past : '%s前', + s : '数秒', + m : '1分', + mm : '%d分', + h : '1時間', + hh : '%d時間', + d : '1日', + dd : '%d日', + M : '1ヶ月', + MM : '%dヶ月', + y : '1年', + yy : '%d年' + } +}); + +return ja; + +}))); diff --git a/public/js/moment/locale/jv.js b/public/js/moment/locale/jv.js new file mode 100755 index 0000000..5b939e0 --- /dev/null +++ b/public/js/moment/locale/jv.js @@ -0,0 +1,83 @@ +//! moment.js locale configuration +//! locale : Javanese [jv] +//! author : Rony Lantip : https://github.com/lantip +//! reference: http://jv.wikipedia.org/wiki/Basa_Jawa + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var jv = moment.defineLocale('jv', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'), + weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /enjing|siyang|sonten|ndalu/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'enjing') { + return hour; + } else if (meridiem === 'siyang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sonten' || meridiem === 'ndalu') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'enjing'; + } else if (hours < 15) { + return 'siyang'; + } else if (hours < 19) { + return 'sonten'; + } else { + return 'ndalu'; + } + }, + calendar : { + sameDay : '[Dinten puniko pukul] LT', + nextDay : '[Mbenjang pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kala wingi pukul] LT', + lastWeek : 'dddd [kepengker pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'wonten ing %s', + past : '%s ingkang kepengker', + s : 'sawetawis detik', + m : 'setunggal menit', + mm : '%d menit', + h : 'setunggal jam', + hh : '%d jam', + d : 'sedinten', + dd : '%d dinten', + M : 'sewulan', + MM : '%d wulan', + y : 'setaun', + yy : '%d taun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return jv; + +}))); diff --git a/public/js/moment/locale/ka.js b/public/js/moment/locale/ka.js new file mode 100755 index 0000000..2a95638 --- /dev/null +++ b/public/js/moment/locale/ka.js @@ -0,0 +1,89 @@ +//! moment.js locale configuration +//! locale : Georgian [ka] +//! author : Irakli Janiashvili : https://github.com/irakli-janiashvili + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var ka = moment.defineLocale('ka', { + months : { + standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'), + format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_') + }, + monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'), + weekdays : { + standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'), + format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'), + isFormat: /(წინა|შემდეგ)/ + }, + weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'), + weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendar : { + sameDay : '[დღეს] LT[-ზე]', + nextDay : '[ხვალ] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინა] dddd LT-ზე', + sameElse : 'L' + }, + relativeTime : { + future : function (s) { + return (/(წამი|წუთი|საათი|წელი)/).test(s) ? + s.replace(/ი$/, 'ში') : + s + 'ში'; + }, + past : function (s) { + if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, 'ის უკან'); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, 'წლის უკან'); + } + }, + s : 'რამდენიმე წამი', + m : 'წუთი', + mm : '%d წუთი', + h : 'საათი', + hh : '%d საათი', + d : 'დღე', + dd : '%d დღე', + M : 'თვე', + MM : '%d თვე', + y : 'წელი', + yy : '%d წელი' + }, + dayOfMonthOrdinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, + ordinal : function (number) { + if (number === 0) { + return number; + } + if (number === 1) { + return number + '-ლი'; + } + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return 'მე-' + number; + } + return number + '-ე'; + }, + week : { + dow : 1, + doy : 7 + } +}); + +return ka; + +}))); diff --git a/public/js/moment/locale/kk.js b/public/js/moment/locale/kk.js new file mode 100755 index 0000000..777a529 --- /dev/null +++ b/public/js/moment/locale/kk.js @@ -0,0 +1,87 @@ +//! moment.js locale configuration +//! locale : Kazakh [kk] +//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var suffixes = { + 0: '-ші', + 1: '-ші', + 2: '-ші', + 3: '-ші', + 4: '-ші', + 5: '-ші', + 6: '-шы', + 7: '-ші', + 8: '-ші', + 9: '-шы', + 10: '-шы', + 20: '-шы', + 30: '-шы', + 40: '-шы', + 50: '-ші', + 60: '-шы', + 70: '-ші', + 80: '-ші', + 90: '-шы', + 100: '-ші' +}; + +var kk = moment.defineLocale('kk', { + months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'), + monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'), + weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'), + weekdaysShort : 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'), + weekdaysMin : 'жк_дй_сй_ср_бй_жм_сн'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Бүгін сағат] LT', + nextDay : '[Ертең сағат] LT', + nextWeek : 'dddd [сағат] LT', + lastDay : '[Кеше сағат] LT', + lastWeek : '[Өткен аптаның] dddd [сағат] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ішінде', + past : '%s бұрын', + s : 'бірнеше секунд', + m : 'бір минут', + mm : '%d минут', + h : 'бір сағат', + hh : '%d сағат', + d : 'бір күн', + dd : '%d күн', + M : 'бір ай', + MM : '%d ай', + y : 'бір жыл', + yy : '%d жыл' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ші|шы)/, + ordinal : function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (suffixes[number] || suffixes[a] || suffixes[b]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return kk; + +}))); diff --git a/public/js/moment/locale/km.js b/public/js/moment/locale/km.js new file mode 100755 index 0000000..71482a7 --- /dev/null +++ b/public/js/moment/locale/km.js @@ -0,0 +1,58 @@ +//! moment.js locale configuration +//! locale : Cambodian [km] +//! author : Kruy Vanna : https://github.com/kruyvanna + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var km = moment.defineLocale('km', { + months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'), + monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'), + weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'), + weekdaysShort: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'), + weekdaysMin: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS : 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd, D MMMM YYYY HH:mm' + }, + calendar: { + sameDay: '[ថ្ងៃនេះ ម៉ោង] LT', + nextDay: '[ស្អែក ម៉ោង] LT', + nextWeek: 'dddd [ម៉ោង] LT', + lastDay: '[ម្សិលមិញ ម៉ោង] LT', + lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT', + sameElse: 'L' + }, + relativeTime: { + future: '%sទៀត', + past: '%sមុន', + s: 'ប៉ុន្មានវិនាទី', + m: 'មួយនាទី', + mm: '%d នាទី', + h: 'មួយម៉ោង', + hh: '%d ម៉ោង', + d: 'មួយថ្ងៃ', + dd: '%d ថ្ងៃ', + M: 'មួយខែ', + MM: '%d ខែ', + y: 'មួយឆ្នាំ', + yy: '%d ឆ្នាំ' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return km; + +}))); diff --git a/public/js/moment/locale/kn.js b/public/js/moment/locale/kn.js new file mode 100755 index 0000000..aeacafa --- /dev/null +++ b/public/js/moment/locale/kn.js @@ -0,0 +1,126 @@ +//! moment.js locale configuration +//! locale : Kannada [kn] +//! author : Rajeev Naik : https://github.com/rajeevnaikte + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var symbolMap = { + '1': '೧', + '2': '೨', + '3': '೩', + '4': '೪', + '5': '೫', + '6': '೬', + '7': '೭', + '8': '೮', + '9': '೯', + '0': '೦' +}; +var numberMap = { + '೧': '1', + '೨': '2', + '೩': '3', + '೪': '4', + '೫': '5', + '೬': '6', + '೭': '7', + '೮': '8', + '೯': '9', + '೦': '0' +}; + +var kn = moment.defineLocale('kn', { + months : 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split('_'), + monthsShort : 'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬ_ಅಕ್ಟೋಬ_ನವೆಂಬ_ಡಿಸೆಂಬ'.split('_'), + monthsParseExact: true, + weekdays : 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split('_'), + weekdaysShort : 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'), + weekdaysMin : 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm', + LLLL : 'dddd, D MMMM YYYY, A h:mm' + }, + calendar : { + sameDay : '[ಇಂದು] LT', + nextDay : '[ನಾಳೆ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ನಿನ್ನೆ] LT', + lastWeek : '[ಕೊನೆಯ] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ನಂತರ', + past : '%s ಹಿಂದೆ', + s : 'ಕೆಲವು ಕ್ಷಣಗಳು', + m : 'ಒಂದು ನಿಮಿಷ', + mm : '%d ನಿಮಿಷ', + h : 'ಒಂದು ಗಂಟೆ', + hh : '%d ಗಂಟೆ', + d : 'ಒಂದು ದಿನ', + dd : '%d ದಿನ', + M : 'ಒಂದು ತಿಂಗಳು', + MM : '%d ತಿಂಗಳು', + y : 'ಒಂದು ವರ್ಷ', + yy : '%d ವರ್ಷ' + }, + preparse: function (string) { + return string.replace(/[೧೨೩೪೫೬೭೮೯೦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'ರಾತ್ರಿ') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'ಬೆಳಿಗ್ಗೆ') { + return hour; + } else if (meridiem === 'ಮಧ್ಯಾಹ್ನ') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'ಸಂಜೆ') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ರಾತ್ರಿ'; + } else if (hour < 10) { + return 'ಬೆಳಿಗ್ಗೆ'; + } else if (hour < 17) { + return 'ಮಧ್ಯಾಹ್ನ'; + } else if (hour < 20) { + return 'ಸಂಜೆ'; + } else { + return 'ರಾತ್ರಿ'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}(ನೇ)/, + ordinal : function (number) { + return number + 'ನೇ'; + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } +}); + +return kn; + +}))); diff --git a/public/js/moment/locale/ko.js b/public/js/moment/locale/ko.js new file mode 100755 index 0000000..8ac7913 --- /dev/null +++ b/public/js/moment/locale/ko.js @@ -0,0 +1,83 @@ +//! moment.js locale configuration +//! locale : Korean [ko] +//! author : Kyungwook, Park : https://github.com/kyungw00k +//! author : Jeeeyul Lee + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var ko = moment.defineLocale('ko', { + months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), + monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), + weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'), + weekdaysShort : '일_월_화_수_목_금_토'.split('_'), + weekdaysMin : '일_월_화_수_목_금_토'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'YYYY.MM.DD', + LL : 'YYYY년 MMMM D일', + LLL : 'YYYY년 MMMM D일 A h:mm', + LLLL : 'YYYY년 MMMM D일 dddd A h:mm', + l : 'YYYY.MM.DD', + ll : 'YYYY년 MMMM D일', + lll : 'YYYY년 MMMM D일 A h:mm', + llll : 'YYYY년 MMMM D일 dddd A h:mm' + }, + calendar : { + sameDay : '오늘 LT', + nextDay : '내일 LT', + nextWeek : 'dddd LT', + lastDay : '어제 LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s 후', + past : '%s 전', + s : '몇 초', + ss : '%d초', + m : '1분', + mm : '%d분', + h : '한 시간', + hh : '%d시간', + d : '하루', + dd : '%d일', + M : '한 달', + MM : '%d달', + y : '일 년', + yy : '%d년' + }, + dayOfMonthOrdinalParse : /\d{1,2}(일|월|주)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '일'; + case 'M': + return number + '월'; + case 'w': + case 'W': + return number + '주'; + default: + return number; + } + }, + meridiemParse : /오전|오후/, + isPM : function (token) { + return token === '오후'; + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + } +}); + +return ko; + +}))); diff --git a/public/js/moment/locale/ky.js b/public/js/moment/locale/ky.js new file mode 100755 index 0000000..ae4053a --- /dev/null +++ b/public/js/moment/locale/ky.js @@ -0,0 +1,88 @@ +//! moment.js locale configuration +//! locale : Kyrgyz [ky] +//! author : Chyngyz Arystan uulu : https://github.com/chyngyz + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + +var suffixes = { + 0: '-чү', + 1: '-чи', + 2: '-чи', + 3: '-чү', + 4: '-чү', + 5: '-чи', + 6: '-чы', + 7: '-чи', + 8: '-чи', + 9: '-чу', + 10: '-чу', + 20: '-чы', + 30: '-чу', + 40: '-чы', + 50: '-чү', + 60: '-чы', + 70: '-чи', + 80: '-чи', + 90: '-чу', + 100: '-чү' +}; + +var ky = moment.defineLocale('ky', { + months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'), + monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'), + weekdaysShort : 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'), + weekdaysMin : 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Бүгүн саат] LT', + nextDay : '[Эртең саат] LT', + nextWeek : 'dddd [саат] LT', + lastDay : '[Кече саат] LT', + lastWeek : '[Өткен аптанын] dddd [күнү] [саат] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ичинде', + past : '%s мурун', + s : 'бирнече секунд', + m : 'бир мүнөт', + mm : '%d мүнөт', + h : 'бир саат', + hh : '%d саат', + d : 'бир күн', + dd : '%d күн', + M : 'бир ай', + MM : '%d ай', + y : 'бир жыл', + yy : '%d жыл' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(чи|чы|чү|чу)/, + ordinal : function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (suffixes[number] || suffixes[a] || suffixes[b]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return ky; + +}))); diff --git a/public/js/moment/locale/lb.js b/public/js/moment/locale/lb.js new file mode 100755 index 0000000..56c1803 --- /dev/null +++ b/public/js/moment/locale/lb.js @@ -0,0 +1,137 @@ +//! moment.js locale configuration +//! locale : Luxembourgish [lb] +//! author : mweimerskirch : https://github.com/mweimerskirch +//! author : David Raison : https://github.com/kwisatz + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eng Minutt', 'enger Minutt'], + 'h': ['eng Stonn', 'enger Stonn'], + 'd': ['een Dag', 'engem Dag'], + 'M': ['ee Mount', 'engem Mount'], + 'y': ['ee Joer', 'engem Joer'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; +} +function processFutureTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'a ' + string; + } + return 'an ' + string; +} +function processPastTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'viru ' + string; + } + return 'virun ' + string; +} +/** + * Returns true if the word before the given number loses the '-n' ending. + * e.g. 'an 10 Deeg' but 'a 5 Deeg' + * + * @param number {integer} + * @returns {boolean} + */ +function eifelerRegelAppliesToNumber(number) { + number = parseInt(number, 10); + if (isNaN(number)) { + return false; + } + if (number < 0) { + // Negative Number --> always true + return true; + } else if (number < 10) { + // Only 1 digit + if (4 <= number && number <= 7) { + return true; + } + return false; + } else if (number < 100) { + // 2 digits + var lastDigit = number % 10, firstDigit = number / 10; + if (lastDigit === 0) { + return eifelerRegelAppliesToNumber(firstDigit); + } + return eifelerRegelAppliesToNumber(lastDigit); + } else if (number < 10000) { + // 3 or 4 digits --> recursively check first digit + while (number >= 10) { + number = number / 10; + } + return eifelerRegelAppliesToNumber(number); + } else { + // Anything larger than 4 digits: recursively check first n-3 digits + number = number / 1000; + return eifelerRegelAppliesToNumber(number); + } +} + +var lb = moment.defineLocale('lb', { + months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), + weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), + weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'H:mm [Auer]', + LTS: 'H:mm:ss [Auer]', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm [Auer]', + LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]' + }, + calendar: { + sameDay: '[Haut um] LT', + sameElse: 'L', + nextDay: '[Muer um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gëschter um] LT', + lastWeek: function () { + // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule + switch (this.day()) { + case 2: + case 4: + return '[Leschten] dddd [um] LT'; + default: + return '[Leschte] dddd [um] LT'; + } + } + }, + relativeTime : { + future : processFutureTime, + past : processPastTime, + s : 'e puer Sekonnen', + m : processRelativeTime, + mm : '%d Minutten', + h : processRelativeTime, + hh : '%d Stonnen', + d : processRelativeTime, + dd : '%d Deeg', + M : processRelativeTime, + MM : '%d Méint', + y : processRelativeTime, + yy : '%d Joer' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal: '%d.', + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return lb; + +}))); diff --git a/public/js/moment/locale/lo.js b/public/js/moment/locale/lo.js new file mode 100755 index 0000000..8e5cdbd --- /dev/null +++ b/public/js/moment/locale/lo.js @@ -0,0 +1,70 @@ +//! moment.js locale configuration +//! locale : Lao [lo] +//! author : Ryan Hart : https://github.com/ryanhart2 + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var lo = moment.defineLocale('lo', { + months : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), + monthsShort : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), + weekdays : 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), + weekdaysShort : 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), + weekdaysMin : 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'ວັນdddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/, + isPM: function (input) { + return input === 'ຕອນແລງ'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ຕອນເຊົ້າ'; + } else { + return 'ຕອນແລງ'; + } + }, + calendar : { + sameDay : '[ມື້ນີ້ເວລາ] LT', + nextDay : '[ມື້ອື່ນເວລາ] LT', + nextWeek : '[ວັນ]dddd[ໜ້າເວລາ] LT', + lastDay : '[ມື້ວານນີ້ເວລາ] LT', + lastWeek : '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ອີກ %s', + past : '%sຜ່ານມາ', + s : 'ບໍ່ເທົ່າໃດວິນາທີ', + m : '1 ນາທີ', + mm : '%d ນາທີ', + h : '1 ຊົ່ວໂມງ', + hh : '%d ຊົ່ວໂມງ', + d : '1 ມື້', + dd : '%d ມື້', + M : '1 ເດືອນ', + MM : '%d ເດືອນ', + y : '1 ປີ', + yy : '%d ປີ' + }, + dayOfMonthOrdinalParse: /(ທີ່)\d{1,2}/, + ordinal : function (number) { + return 'ທີ່' + number; + } +}); + +return lo; + +}))); diff --git a/public/js/moment/locale/lt.js b/public/js/moment/locale/lt.js new file mode 100755 index 0000000..d2fb760 --- /dev/null +++ b/public/js/moment/locale/lt.js @@ -0,0 +1,117 @@ +//! moment.js locale configuration +//! locale : Lithuanian [lt] +//! author : Mindaugas Mozūras : https://github.com/mmozuras + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var units = { + 'm' : 'minutė_minutės_minutę', + 'mm': 'minutės_minučių_minutes', + 'h' : 'valanda_valandos_valandą', + 'hh': 'valandos_valandų_valandas', + 'd' : 'diena_dienos_dieną', + 'dd': 'dienos_dienų_dienas', + 'M' : 'mėnuo_mėnesio_mėnesį', + 'MM': 'mėnesiai_mėnesių_mėnesius', + 'y' : 'metai_metų_metus', + 'yy': 'metai_metų_metus' +}; +function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return 'kelios sekundės'; + } else { + return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; + } +} +function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); +} +function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); +} +function forms(key) { + return units[key].split('_'); +} +function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; + } else { + return result + (special(number) ? forms(key)[1] : forms(key)[2]); + } + } +} +var lt = moment.defineLocale('lt', { + months : { + format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'), + standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'), + isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/ + }, + monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), + weekdays : { + format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'), + standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'), + isFormat: /dddd HH:mm/ + }, + weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'), + weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY [m.] MMMM D [d.]', + LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', + LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]', + l : 'YYYY-MM-DD', + ll : 'YYYY [m.] MMMM D [d.]', + lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', + llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]' + }, + calendar : { + sameDay : '[Šiandien] LT', + nextDay : '[Rytoj] LT', + nextWeek : 'dddd LT', + lastDay : '[Vakar] LT', + lastWeek : '[Praėjusį] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'po %s', + past : 'prieš %s', + s : translateSeconds, + m : translateSingular, + mm : translate, + h : translateSingular, + hh : translate, + d : translateSingular, + dd : translate, + M : translateSingular, + MM : translate, + y : translateSingular, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}-oji/, + ordinal : function (number) { + return number + '-oji'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return lt; + +}))); diff --git a/public/js/moment/locale/lv.js b/public/js/moment/locale/lv.js new file mode 100755 index 0000000..e2d9887 --- /dev/null +++ b/public/js/moment/locale/lv.js @@ -0,0 +1,97 @@ +//! moment.js locale configuration +//! locale : Latvian [lv] +//! author : Kristaps Karlsons : https://github.com/skakri +//! author : Jānis Elmeris : https://github.com/JanisE + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var units = { + 'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), + 'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), + 'h': 'stundas_stundām_stunda_stundas'.split('_'), + 'hh': 'stundas_stundām_stunda_stundas'.split('_'), + 'd': 'dienas_dienām_diena_dienas'.split('_'), + 'dd': 'dienas_dienām_diena_dienas'.split('_'), + 'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), + 'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), + 'y': 'gada_gadiem_gads_gadi'.split('_'), + 'yy': 'gada_gadiem_gads_gadi'.split('_') +}; +/** + * @param withoutSuffix boolean true = a length of time; false = before/after a period of time. + */ +function format(forms, number, withoutSuffix) { + if (withoutSuffix) { + // E.g. "21 minūte", "3 minūtes". + return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3]; + } else { + // E.g. "21 minūtes" as in "pēc 21 minūtes". + // E.g. "3 minūtēm" as in "pēc 3 minūtēm". + return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1]; + } +} +function relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + format(units[key], number, withoutSuffix); +} +function relativeTimeWithSingular(number, withoutSuffix, key) { + return format(units[key], number, withoutSuffix); +} +function relativeSeconds(number, withoutSuffix) { + return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm'; +} + +var lv = moment.defineLocale('lv', { + months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'), + weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY.', + LL : 'YYYY. [gada] D. MMMM', + LLL : 'YYYY. [gada] D. MMMM, HH:mm', + LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm' + }, + calendar : { + sameDay : '[Šodien pulksten] LT', + nextDay : '[Rīt pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[Pagājušā] dddd [pulksten] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'pēc %s', + past : 'pirms %s', + s : relativeSeconds, + m : relativeTimeWithSingular, + mm : relativeTimeWithPlural, + h : relativeTimeWithSingular, + hh : relativeTimeWithPlural, + d : relativeTimeWithSingular, + dd : relativeTimeWithPlural, + M : relativeTimeWithSingular, + MM : relativeTimeWithPlural, + y : relativeTimeWithSingular, + yy : relativeTimeWithPlural + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return lv; + +}))); diff --git a/public/js/moment/locale/me.js b/public/js/moment/locale/me.js new file mode 100755 index 0000000..07ed6ca --- /dev/null +++ b/public/js/moment/locale/me.js @@ -0,0 +1,111 @@ +//! moment.js locale configuration +//! locale : Montenegrin [me] +//! author : Miodrag Nikač : https://github.com/miodragnikac + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var translator = { + words: { //Different grammatical cases + m: ['jedan minut', 'jednog minuta'], + mm: ['minut', 'minuta', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mjesec', 'mjeseca', 'mjeseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } +}; + +var me = moment.defineLocale('me', { + months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), + monthsParseExact : true, + weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), + weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), + weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'H:mm', + LTS : 'H:mm:ss', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm', + LLLL: 'dddd, D. MMMM YYYY H:mm' + }, + calendar: { + sameDay: '[danas u] LT', + nextDay: '[sjutra u] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juče u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[prošle] [nedjelje] [u] LT', + '[prošlog] [ponedjeljka] [u] LT', + '[prošlog] [utorka] [u] LT', + '[prošle] [srijede] [u] LT', + '[prošlog] [četvrtka] [u] LT', + '[prošlog] [petka] [u] LT', + '[prošle] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'nekoliko sekundi', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mjesec', + MM : translator.translate, + y : 'godinu', + yy : translator.translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return me; + +}))); diff --git a/public/js/moment/locale/mi.js b/public/js/moment/locale/mi.js new file mode 100755 index 0000000..c5cce37 --- /dev/null +++ b/public/js/moment/locale/mi.js @@ -0,0 +1,64 @@ +//! moment.js locale configuration +//! locale : Maori [mi] +//! author : John Corrigan : https://github.com/johnideal + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var mi = moment.defineLocale('mi', { + months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'), + monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'), + monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i, + weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'), + weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), + weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY [i] HH:mm', + LLLL: 'dddd, D MMMM YYYY [i] HH:mm' + }, + calendar: { + sameDay: '[i teie mahana, i] LT', + nextDay: '[apopo i] LT', + nextWeek: 'dddd [i] LT', + lastDay: '[inanahi i] LT', + lastWeek: 'dddd [whakamutunga i] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'i roto i %s', + past: '%s i mua', + s: 'te hēkona ruarua', + m: 'he meneti', + mm: '%d meneti', + h: 'te haora', + hh: '%d haora', + d: 'he ra', + dd: '%d ra', + M: 'he marama', + MM: '%d marama', + y: 'he tau', + yy: '%d tau' + }, + dayOfMonthOrdinalParse: /\d{1,2}º/, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return mi; + +}))); diff --git a/public/js/moment/locale/mk.js b/public/js/moment/locale/mk.js new file mode 100755 index 0000000..cdfb1e1 --- /dev/null +++ b/public/js/moment/locale/mk.js @@ -0,0 +1,90 @@ +//! moment.js locale configuration +//! locale : Macedonian [mk] +//! author : Borislav Mickov : https://github.com/B0k0 + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var mk = moment.defineLocale('mk', { + months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'), + monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'), + weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'), + weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'), + weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[Денес во] LT', + nextDay : '[Утре во] LT', + nextWeek : '[Во] dddd [во] LT', + lastDay : '[Вчера во] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Изминатата] dddd [во] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Изминатиот] dddd [во] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'после %s', + past : 'пред %s', + s : 'неколку секунди', + m : 'минута', + mm : '%d минути', + h : 'час', + hh : '%d часа', + d : 'ден', + dd : '%d дена', + M : 'месец', + MM : '%d месеци', + y : 'година', + yy : '%d години' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return mk; + +}))); diff --git a/public/js/moment/locale/ml.js b/public/js/moment/locale/ml.js new file mode 100755 index 0000000..e5f52e9 --- /dev/null +++ b/public/js/moment/locale/ml.js @@ -0,0 +1,81 @@ +//! moment.js locale configuration +//! locale : Malayalam [ml] +//! author : Floyd Pink : https://github.com/floydpink + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var ml = moment.defineLocale('ml', { + months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'), + monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'), + monthsParseExact : true, + weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'), + weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'), + weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'), + longDateFormat : { + LT : 'A h:mm -നു', + LTS : 'A h:mm:ss -നു', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm -നു', + LLLL : 'dddd, D MMMM YYYY, A h:mm -നു' + }, + calendar : { + sameDay : '[ഇന്ന്] LT', + nextDay : '[നാളെ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ഇന്നലെ] LT', + lastWeek : '[കഴിഞ്ഞ] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s കഴിഞ്ഞ്', + past : '%s മുൻപ്', + s : 'അൽപ നിമിഷങ്ങൾ', + m : 'ഒരു മിനിറ്റ്', + mm : '%d മിനിറ്റ്', + h : 'ഒരു മണിക്കൂർ', + hh : '%d മണിക്കൂർ', + d : 'ഒരു ദിവസം', + dd : '%d ദിവസം', + M : 'ഒരു മാസം', + MM : '%d മാസം', + y : 'ഒരു വർഷം', + yy : '%d വർഷം' + }, + meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ((meridiem === 'രാത്രി' && hour >= 4) || + meridiem === 'ഉച്ച കഴിഞ്ഞ്' || + meridiem === 'വൈകുന്നേരം') { + return hour + 12; + } else { + return hour; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'രാത്രി'; + } else if (hour < 12) { + return 'രാവിലെ'; + } else if (hour < 17) { + return 'ഉച്ച കഴിഞ്ഞ്'; + } else if (hour < 20) { + return 'വൈകുന്നേരം'; + } else { + return 'രാത്രി'; + } + } +}); + +return ml; + +}))); diff --git a/public/js/moment/locale/mr.js b/public/js/moment/locale/mr.js new file mode 100755 index 0000000..abe1024 --- /dev/null +++ b/public/js/moment/locale/mr.js @@ -0,0 +1,159 @@ +//! moment.js locale configuration +//! locale : Marathi [mr] +//! author : Harshad Kale : https://github.com/kalehv +//! author : Vivek Athalye : https://github.com/vnathalye + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' +}; +var numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' +}; + +function relativeTimeMr(number, withoutSuffix, string, isFuture) +{ + var output = ''; + if (withoutSuffix) { + switch (string) { + case 's': output = 'काही सेकंद'; break; + case 'm': output = 'एक मिनिट'; break; + case 'mm': output = '%d मिनिटे'; break; + case 'h': output = 'एक तास'; break; + case 'hh': output = '%d तास'; break; + case 'd': output = 'एक दिवस'; break; + case 'dd': output = '%d दिवस'; break; + case 'M': output = 'एक महिना'; break; + case 'MM': output = '%d महिने'; break; + case 'y': output = 'एक वर्ष'; break; + case 'yy': output = '%d वर्षे'; break; + } + } + else { + switch (string) { + case 's': output = 'काही सेकंदां'; break; + case 'm': output = 'एका मिनिटा'; break; + case 'mm': output = '%d मिनिटां'; break; + case 'h': output = 'एका तासा'; break; + case 'hh': output = '%d तासां'; break; + case 'd': output = 'एका दिवसा'; break; + case 'dd': output = '%d दिवसां'; break; + case 'M': output = 'एका महिन्या'; break; + case 'MM': output = '%d महिन्यां'; break; + case 'y': output = 'एका वर्षा'; break; + case 'yy': output = '%d वर्षां'; break; + } + } + return output.replace(/%d/i, number); +} + +var mr = moment.defineLocale('mr', { + months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'), + monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'), + monthsParseExact : true, + weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), + longDateFormat : { + LT : 'A h:mm वाजता', + LTS : 'A h:mm:ss वाजता', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm वाजता', + LLLL : 'dddd, D MMMM YYYY, A h:mm वाजता' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[उद्या] LT', + nextWeek : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future: '%sमध्ये', + past: '%sपूर्वी', + s: relativeTimeMr, + m: relativeTimeMr, + mm: relativeTimeMr, + h: relativeTimeMr, + hh: relativeTimeMr, + d: relativeTimeMr, + dd: relativeTimeMr, + M: relativeTimeMr, + MM: relativeTimeMr, + y: relativeTimeMr, + yy: relativeTimeMr + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात्री') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सकाळी') { + return hour; + } else if (meridiem === 'दुपारी') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'सायंकाळी') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) { + if (hour < 4) { + return 'रात्री'; + } else if (hour < 10) { + return 'सकाळी'; + } else if (hour < 17) { + return 'दुपारी'; + } else if (hour < 20) { + return 'सायंकाळी'; + } else { + return 'रात्री'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } +}); + +return mr; + +}))); diff --git a/public/js/moment/locale/ms-my.js b/public/js/moment/locale/ms-my.js new file mode 100755 index 0000000..0cb403d --- /dev/null +++ b/public/js/moment/locale/ms-my.js @@ -0,0 +1,83 @@ +//! moment.js locale configuration +//! locale : Malay [ms-my] +//! note : DEPRECATED, the correct one is [ms] +//! author : Weldan Jamili : https://github.com/weldan + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var msMy = moment.defineLocale('ms-my', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return msMy; + +}))); diff --git a/public/js/moment/locale/ms.js b/public/js/moment/locale/ms.js new file mode 100755 index 0000000..4d4afff --- /dev/null +++ b/public/js/moment/locale/ms.js @@ -0,0 +1,82 @@ +//! moment.js locale configuration +//! locale : Malay [ms] +//! author : Weldan Jamili : https://github.com/weldan + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var ms = moment.defineLocale('ms', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return ms; + +}))); diff --git a/public/js/moment/locale/my.js b/public/js/moment/locale/my.js new file mode 100755 index 0000000..32d67e2 --- /dev/null +++ b/public/js/moment/locale/my.js @@ -0,0 +1,96 @@ +//! moment.js locale configuration +//! locale : Burmese [my] +//! author : Squar team, mysquar.com +//! author : David Rossellat : https://github.com/gholadr +//! author : Tin Aung Lin : https://github.com/thanyawzinmin + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var symbolMap = { + '1': '၁', + '2': '၂', + '3': '၃', + '4': '၄', + '5': '၅', + '6': '၆', + '7': '၇', + '8': '၈', + '9': '၉', + '0': '၀' +}; +var numberMap = { + '၁': '1', + '၂': '2', + '၃': '3', + '၄': '4', + '၅': '5', + '၆': '6', + '၇': '7', + '၈': '8', + '၉': '9', + '၀': '0' +}; + +var my = moment.defineLocale('my', { + months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'), + monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), + weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'), + weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd D MMMM YYYY HH:mm' + }, + calendar: { + sameDay: '[ယနေ.] LT [မှာ]', + nextDay: '[မနက်ဖြန်] LT [မှာ]', + nextWeek: 'dddd LT [မှာ]', + lastDay: '[မနေ.က] LT [မှာ]', + lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]', + sameElse: 'L' + }, + relativeTime: { + future: 'လာမည့် %s မှာ', + past: 'လွန်ခဲ့သော %s က', + s: 'စက္ကန်.အနည်းငယ်', + m: 'တစ်မိနစ်', + mm: '%d မိနစ်', + h: 'တစ်နာရီ', + hh: '%d နာရီ', + d: 'တစ်ရက်', + dd: '%d ရက်', + M: 'တစ်လ', + MM: '%d လ', + y: 'တစ်နှစ်', + yy: '%d နှစ်' + }, + preparse: function (string) { + return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 1st is the first week of the year. + } +}); + +return my; + +}))); diff --git a/public/js/moment/locale/nb.js b/public/js/moment/locale/nb.js new file mode 100755 index 0000000..2cfe374 --- /dev/null +++ b/public/js/moment/locale/nb.js @@ -0,0 +1,63 @@ +//! moment.js locale configuration +//! locale : Norwegian Bokmål [nb] +//! authors : Espen Hovlandsdal : https://github.com/rexxars +//! Sigurd Gartmann : https://github.com/sigurdga + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var nb = moment.defineLocale('nb', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'), + monthsParseExact : true, + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] HH:mm', + LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i går kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'noen sekunder', + m : 'ett minutt', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dager', + M : 'en måned', + MM : '%d måneder', + y : 'ett år', + yy : '%d år' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return nb; + +}))); diff --git a/public/js/moment/locale/ne.js b/public/js/moment/locale/ne.js new file mode 100755 index 0000000..a35947a --- /dev/null +++ b/public/js/moment/locale/ne.js @@ -0,0 +1,123 @@ +//! moment.js locale configuration +//! locale : Nepalese [ne] +//! author : suvash : https://github.com/suvash + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' +}; +var numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' +}; + +var ne = moment.defineLocale('ne', { + months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'), + monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'), + monthsParseExact : true, + weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'), + weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'), + weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'Aको h:mm बजे', + LTS : 'Aको h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, Aको h:mm बजे', + LLLL : 'dddd, D MMMM YYYY, Aको h:mm बजे' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /राति|बिहान|दिउँसो|साँझ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'राति') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'बिहान') { + return hour; + } else if (meridiem === 'दिउँसो') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'साँझ') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return 'राति'; + } else if (hour < 12) { + return 'बिहान'; + } else if (hour < 16) { + return 'दिउँसो'; + } else if (hour < 20) { + return 'साँझ'; + } else { + return 'राति'; + } + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[भोलि] LT', + nextWeek : '[आउँदो] dddd[,] LT', + lastDay : '[हिजो] LT', + lastWeek : '[गएको] dddd[,] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%sमा', + past : '%s अगाडि', + s : 'केही क्षण', + m : 'एक मिनेट', + mm : '%d मिनेट', + h : 'एक घण्टा', + hh : '%d घण्टा', + d : 'एक दिन', + dd : '%d दिन', + M : 'एक महिना', + MM : '%d महिना', + y : 'एक बर्ष', + yy : '%d बर्ष' + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } +}); + +return ne; + +}))); diff --git a/public/js/moment/locale/nl-be.js b/public/js/moment/locale/nl-be.js new file mode 100755 index 0000000..d640f0c --- /dev/null +++ b/public/js/moment/locale/nl-be.js @@ -0,0 +1,88 @@ +//! moment.js locale configuration +//! locale : Dutch (Belgium) [nl-be] +//! author : Joris Röling : https://github.com/jorisroling +//! author : Jacob Middag : https://github.com/middagj + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'); +var monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + +var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; +var monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; + +var nlBe = moment.defineLocale('nl-be', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + + monthsRegex: monthsRegex, + monthsShortRegex: monthsRegex, + monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i, + monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, + + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' + }, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return nlBe; + +}))); diff --git a/public/js/moment/locale/nl.js b/public/js/moment/locale/nl.js new file mode 100755 index 0000000..12c9994 --- /dev/null +++ b/public/js/moment/locale/nl.js @@ -0,0 +1,88 @@ +//! moment.js locale configuration +//! locale : Dutch [nl] +//! author : Joris Röling : https://github.com/jorisroling +//! author : Jacob Middag : https://github.com/middagj + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'); +var monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + +var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; +var monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; + +var nl = moment.defineLocale('nl', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + + monthsRegex: monthsRegex, + monthsShortRegex: monthsRegex, + monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i, + monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, + + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' + }, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return nl; + +}))); diff --git a/public/js/moment/locale/nn.js b/public/js/moment/locale/nn.js new file mode 100755 index 0000000..90dda8c --- /dev/null +++ b/public/js/moment/locale/nn.js @@ -0,0 +1,60 @@ +//! moment.js locale configuration +//! locale : Nynorsk [nn] +//! author : https://github.com/mechuwind + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var nn = moment.defineLocale('nn', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), + weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'), + weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] H:mm', + LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' + }, + calendar : { + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I går klokka] LT', + lastWeek: '[Føregåande] dddd [klokka] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s sidan', + s : 'nokre sekund', + m : 'eit minutt', + mm : '%d minutt', + h : 'ein time', + hh : '%d timar', + d : 'ein dag', + dd : '%d dagar', + M : 'ein månad', + MM : '%d månader', + y : 'eit år', + yy : '%d år' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return nn; + +}))); diff --git a/public/js/moment/locale/pa-in.js b/public/js/moment/locale/pa-in.js new file mode 100755 index 0000000..6dec8d1 --- /dev/null +++ b/public/js/moment/locale/pa-in.js @@ -0,0 +1,124 @@ +//! moment.js locale configuration +//! locale : Punjabi (India) [pa-in] +//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var symbolMap = { + '1': '੧', + '2': '੨', + '3': '੩', + '4': '੪', + '5': '੫', + '6': '੬', + '7': '੭', + '8': '੮', + '9': '੯', + '0': '੦' +}; +var numberMap = { + '੧': '1', + '੨': '2', + '੩': '3', + '੪': '4', + '੫': '5', + '੬': '6', + '੭': '7', + '੮': '8', + '੯': '9', + '੦': '0' +}; + +var paIn = moment.defineLocale('pa-in', { + // There are months name as per Nanakshahi Calender but they are not used as rigidly in modern Punjabi. + months : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), + monthsShort : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), + weekdays : 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'), + weekdaysShort : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), + weekdaysMin : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), + longDateFormat : { + LT : 'A h:mm ਵਜੇ', + LTS : 'A h:mm:ss ਵਜੇ', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm ਵਜੇ', + LLLL : 'dddd, D MMMM YYYY, A h:mm ਵਜੇ' + }, + calendar : { + sameDay : '[ਅਜ] LT', + nextDay : '[ਕਲ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ਕਲ] LT', + lastWeek : '[ਪਿਛਲੇ] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ਵਿੱਚ', + past : '%s ਪਿਛਲੇ', + s : 'ਕੁਝ ਸਕਿੰਟ', + m : 'ਇਕ ਮਿੰਟ', + mm : '%d ਮਿੰਟ', + h : 'ਇੱਕ ਘੰਟਾ', + hh : '%d ਘੰਟੇ', + d : 'ਇੱਕ ਦਿਨ', + dd : '%d ਦਿਨ', + M : 'ਇੱਕ ਮਹੀਨਾ', + MM : '%d ਮਹੀਨੇ', + y : 'ਇੱਕ ਸਾਲ', + yy : '%d ਸਾਲ' + }, + preparse: function (string) { + return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Punjabi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi. + meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'ਰਾਤ') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'ਸਵੇਰ') { + return hour; + } else if (meridiem === 'ਦੁਪਹਿਰ') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'ਸ਼ਾਮ') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ਰਾਤ'; + } else if (hour < 10) { + return 'ਸਵੇਰ'; + } else if (hour < 17) { + return 'ਦੁਪਹਿਰ'; + } else if (hour < 20) { + return 'ਸ਼ਾਮ'; + } else { + return 'ਰਾਤ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } +}); + +return paIn; + +}))); diff --git a/public/js/moment/locale/pl.js b/public/js/moment/locale/pl.js new file mode 100755 index 0000000..db466b6 --- /dev/null +++ b/public/js/moment/locale/pl.js @@ -0,0 +1,124 @@ +//! moment.js locale configuration +//! locale : Polish [pl] +//! author : Rafal Hirsz : https://github.com/evoL + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'); +var monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_'); +function plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); +} +function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'minuta' : 'minutę'; + case 'mm': + return result + (plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinę'; + case 'hh': + return result + (plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural(number) ? 'miesiące' : 'miesięcy'); + case 'yy': + return result + (plural(number) ? 'lata' : 'lat'); + } +} + +var pl = moment.defineLocale('pl', { + months : function (momentToFormat, format) { + if (!momentToFormat) { + return monthsNominative; + } else if (format === '') { + // Hack: if format empty we know this is used to generate + // RegExp by moment. Give then back both valid forms of months + // in RegExp ready format. + return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')'; + } else if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), + weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'), + weekdaysShort : 'ndz_pon_wt_śr_czw_pt_sob'.split('_'), + weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Dziś o] LT', + nextDay: '[Jutro o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[W niedzielę o] LT'; + + case 2: + return '[We wtorek o] LT'; + + case 3: + return '[W środę o] LT'; + + case 6: + return '[W sobotę o] LT'; + + default: + return '[W] dddd [o] LT'; + } + }, + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszłą niedzielę o] LT'; + case 3: + return '[W zeszłą środę o] LT'; + case 6: + return '[W zeszłą sobotę o] LT'; + default: + return '[W zeszły] dddd [o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : '%s temu', + s : 'kilka sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : '1 dzień', + dd : '%d dni', + M : 'miesiąc', + MM : translate, + y : 'rok', + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return pl; + +}))); diff --git a/public/js/moment/locale/pt-br.js b/public/js/moment/locale/pt-br.js new file mode 100755 index 0000000..478b207 --- /dev/null +++ b/public/js/moment/locale/pt-br.js @@ -0,0 +1,62 @@ +//! moment.js locale configuration +//! locale : Portuguese (Brazil) [pt-br] +//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var ptBr = moment.defineLocale('pt-br', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), + weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), + weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY [às] HH:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : '%s atrás', + s : 'poucos segundos', + ss : '%d segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + dayOfMonthOrdinalParse: /\d{1,2}º/, + ordinal : '%dº' +}); + +return ptBr; + +}))); diff --git a/public/js/moment/locale/pt.js b/public/js/moment/locale/pt.js new file mode 100755 index 0000000..3d8ee7e --- /dev/null +++ b/public/js/moment/locale/pt.js @@ -0,0 +1,65 @@ +//! moment.js locale configuration +//! locale : Portuguese [pt] +//! author : Jefferson : https://github.com/jalex79 + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var pt = moment.defineLocale('pt', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), + weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), + weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY HH:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : 'há %s', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + dayOfMonthOrdinalParse: /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return pt; + +}))); diff --git a/public/js/moment/locale/ro.js b/public/js/moment/locale/ro.js new file mode 100755 index 0000000..8a0cd75 --- /dev/null +++ b/public/js/moment/locale/ro.js @@ -0,0 +1,75 @@ +//! moment.js locale configuration +//! locale : Romanian [ro] +//! author : Vlad Gurdiga : https://github.com/gurdiga +//! author : Valentin Agachi : https://github.com/avaly + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'minute', + 'hh': 'ore', + 'dd': 'zile', + 'MM': 'luni', + 'yy': 'ani' + }, + separator = ' '; + if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { + separator = ' de '; + } + return number + separator + format[key]; +} + +var ro = moment.defineLocale('ro', { + months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), + monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'), + weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), + weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay: '[azi la] LT', + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'peste %s', + past : '%s în urmă', + s : 'câteva secunde', + m : 'un minut', + mm : relativeTimeWithPlural, + h : 'o oră', + hh : relativeTimeWithPlural, + d : 'o zi', + dd : relativeTimeWithPlural, + M : 'o lună', + MM : relativeTimeWithPlural, + y : 'un an', + yy : relativeTimeWithPlural + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return ro; + +}))); diff --git a/public/js/moment/locale/ru.js b/public/js/moment/locale/ru.js new file mode 100755 index 0000000..356a0fa --- /dev/null +++ b/public/js/moment/locale/ru.js @@ -0,0 +1,183 @@ +//! moment.js locale configuration +//! locale : Russian [ru] +//! author : Viktorminator : https://github.com/Viktorminator +//! Author : Menelion Elensúle : https://github.com/Oire +//! author : Коренберг Марк : https://github.com/socketpair + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); +} +function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', + 'hh': 'час_часа_часов', + 'dd': 'день_дня_дней', + 'MM': 'месяц_месяца_месяцев', + 'yy': 'год_года_лет' + }; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural(format[key], +number); + } +} +var monthsParse = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i]; + +// http://new.gramota.ru/spravka/rules/139-prop : § 103 +// Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637 +// CLDR data: http://www.unicode.org/cldr/charts/28/summary/ru.html#1753 +var ru = moment.defineLocale('ru', { + months : { + format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'), + standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_') + }, + monthsShort : { + // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ? + format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'), + standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_') + }, + weekdays : { + standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'), + format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'), + isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/ + }, + weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), + weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + + // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки + monthsRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, + + // копия предыдущего + monthsShortRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, + + // полные названия с падежами + monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i, + + // Выражение, которое соотвествует только сокращённым формам + monthsShortStrictRegex: /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., HH:mm', + LLLL : 'dddd, D MMMM YYYY г., HH:mm' + }, + calendar : { + sameDay: '[Сегодня в] LT', + nextDay: '[Завтра в] LT', + lastDay: '[Вчера в] LT', + nextWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[В следующее] dddd [в] LT'; + case 1: + case 2: + case 4: + return '[В следующий] dddd [в] LT'; + case 3: + case 5: + case 6: + return '[В следующую] dddd [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd [в] LT'; + } else { + return '[В] dddd [в] LT'; + } + } + }, + lastWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[В прошлое] dddd [в] LT'; + case 1: + case 2: + case 4: + return '[В прошлый] dddd [в] LT'; + case 3: + case 5: + case 6: + return '[В прошлую] dddd [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd [в] LT'; + } else { + return '[В] dddd [в] LT'; + } + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'через %s', + past : '%s назад', + s : 'несколько секунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'час', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'месяц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночи|утра|дня|вечера/i, + isPM : function (input) { + return /^(дня|вечера)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночи'; + } else if (hour < 12) { + return 'утра'; + } else if (hour < 17) { + return 'дня'; + } else { + return 'вечера'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}-(й|го|я)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-я'; + default: + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return ru; + +}))); diff --git a/public/js/moment/locale/sd.js b/public/js/moment/locale/sd.js new file mode 100755 index 0000000..0fcf7e1 --- /dev/null +++ b/public/js/moment/locale/sd.js @@ -0,0 +1,98 @@ +//! moment.js locale configuration +//! locale : Sindhi [sd] +//! author : Narain Sagar : https://github.com/narainsagar + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var months = [ + 'جنوري', + 'فيبروري', + 'مارچ', + 'اپريل', + 'مئي', + 'جون', + 'جولاءِ', + 'آگسٽ', + 'سيپٽمبر', + 'آڪٽوبر', + 'نومبر', + 'ڊسمبر' +]; +var days = [ + 'آچر', + 'سومر', + 'اڱارو', + 'اربع', + 'خميس', + 'جمع', + 'ڇنڇر' +]; + +var sd = moment.defineLocale('sd', { + months : months, + monthsShort : months, + weekdays : days, + weekdaysShort : days, + weekdaysMin : days, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd، D MMMM YYYY HH:mm' + }, + meridiemParse: /صبح|شام/, + isPM : function (input) { + return 'شام' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'صبح'; + } + return 'شام'; + }, + calendar : { + sameDay : '[اڄ] LT', + nextDay : '[سڀاڻي] LT', + nextWeek : 'dddd [اڳين هفتي تي] LT', + lastDay : '[ڪالهه] LT', + lastWeek : '[گزريل هفتي] dddd [تي] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s پوء', + past : '%s اڳ', + s : 'چند سيڪنڊ', + m : 'هڪ منٽ', + mm : '%d منٽ', + h : 'هڪ ڪلاڪ', + hh : '%d ڪلاڪ', + d : 'هڪ ڏينهن', + dd : '%d ڏينهن', + M : 'هڪ مهينو', + MM : '%d مهينا', + y : 'هڪ سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/,/g, '،'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return sd; + +}))); diff --git a/public/js/moment/locale/se.js b/public/js/moment/locale/se.js new file mode 100755 index 0000000..d44d0df --- /dev/null +++ b/public/js/moment/locale/se.js @@ -0,0 +1,61 @@ +//! moment.js locale configuration +//! locale : Northern Sami [se] +//! authors : Bård Rolstad Henriksen : https://github.com/karamell + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + +var se = moment.defineLocale('se', { + months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'), + monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'), + weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'), + weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'), + weekdaysMin : 's_v_m_g_d_b_L'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'MMMM D. [b.] YYYY', + LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm', + LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm' + }, + calendar : { + sameDay: '[otne ti] LT', + nextDay: '[ihttin ti] LT', + nextWeek: 'dddd [ti] LT', + lastDay: '[ikte ti] LT', + lastWeek: '[ovddit] dddd [ti] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s geažes', + past : 'maŋit %s', + s : 'moadde sekunddat', + m : 'okta minuhta', + mm : '%d minuhtat', + h : 'okta diimmu', + hh : '%d diimmut', + d : 'okta beaivi', + dd : '%d beaivvit', + M : 'okta mánnu', + MM : '%d mánut', + y : 'okta jahki', + yy : '%d jagit' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return se; + +}))); diff --git a/public/js/moment/locale/si.js b/public/js/moment/locale/si.js new file mode 100755 index 0000000..f5c124e --- /dev/null +++ b/public/js/moment/locale/si.js @@ -0,0 +1,71 @@ +//! moment.js locale configuration +//! locale : Sinhalese [si] +//! author : Sampath Sitinamaluwa : https://github.com/sampathsris + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +/*jshint -W100*/ +var si = moment.defineLocale('si', { + months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'), + monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'), + weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'), + weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'), + weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'a h:mm', + LTS : 'a h:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY MMMM D', + LLL : 'YYYY MMMM D, a h:mm', + LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss' + }, + calendar : { + sameDay : '[අද] LT[ට]', + nextDay : '[හෙට] LT[ට]', + nextWeek : 'dddd LT[ට]', + lastDay : '[ඊයේ] LT[ට]', + lastWeek : '[පසුගිය] dddd LT[ට]', + sameElse : 'L' + }, + relativeTime : { + future : '%sකින්', + past : '%sකට පෙර', + s : 'තත්පර කිහිපය', + m : 'මිනිත්තුව', + mm : 'මිනිත්තු %d', + h : 'පැය', + hh : 'පැය %d', + d : 'දිනය', + dd : 'දින %d', + M : 'මාසය', + MM : 'මාස %d', + y : 'වසර', + yy : 'වසර %d' + }, + dayOfMonthOrdinalParse: /\d{1,2} වැනි/, + ordinal : function (number) { + return number + ' වැනි'; + }, + meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./, + isPM : function (input) { + return input === 'ප.ව.' || input === 'පස් වරු'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'ප.ව.' : 'පස් වරු'; + } else { + return isLower ? 'පෙ.ව.' : 'පෙර වරු'; + } + } +}); + +return si; + +}))); diff --git a/public/js/moment/locale/sk.js b/public/js/moment/locale/sk.js new file mode 100755 index 0000000..aa61da6 --- /dev/null +++ b/public/js/moment/locale/sk.js @@ -0,0 +1,150 @@ +//! moment.js locale configuration +//! locale : Slovak [sk] +//! author : Martin Minka : https://github.com/k2s +//! based on work of petrbela : https://github.com/petrbela + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'); +var monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); +function plural(n) { + return (n > 1) && (n < 5); +} +function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; + } +} + +var sk = moment.defineLocale('sk', { + months : months, + monthsShort : monthsShort, + weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'), + weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'), + weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd D. MMMM YYYY H:mm' + }, + calendar : { + sameDay: '[dnes o] LT', + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo štvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[včera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pred %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return sk; + +}))); diff --git a/public/js/moment/locale/sl.js b/public/js/moment/locale/sl.js new file mode 100755 index 0000000..e74b3a1 --- /dev/null +++ b/public/js/moment/locale/sl.js @@ -0,0 +1,162 @@ +//! moment.js locale configuration +//! locale : Slovenian [sl] +//! author : Robert Sedovšek : https://github.com/sedovsek + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +function processRelativeTime(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami'; + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += withoutSuffix ? 'minuta' : 'minuto'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'minuti' : 'minutama'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'minute' : 'minutami'; + } else { + result += withoutSuffix || isFuture ? 'minut' : 'minutami'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += withoutSuffix ? 'ura' : 'uro'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'uri' : 'urama'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'ure' : 'urami'; + } else { + result += withoutSuffix || isFuture ? 'ur' : 'urami'; + } + return result; + case 'd': + return withoutSuffix || isFuture ? 'en dan' : 'enim dnem'; + case 'dd': + if (number === 1) { + result += withoutSuffix || isFuture ? 'dan' : 'dnem'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'dni' : 'dnevoma'; + } else { + result += withoutSuffix || isFuture ? 'dni' : 'dnevi'; + } + return result; + case 'M': + return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem'; + case 'MM': + if (number === 1) { + result += withoutSuffix || isFuture ? 'mesec' : 'mesecem'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'meseca' : 'mesecema'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'mesece' : 'meseci'; + } else { + result += withoutSuffix || isFuture ? 'mesecev' : 'meseci'; + } + return result; + case 'y': + return withoutSuffix || isFuture ? 'eno leto' : 'enim letom'; + case 'yy': + if (number === 1) { + result += withoutSuffix || isFuture ? 'leto' : 'letom'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'leti' : 'letoma'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'leta' : 'leti'; + } else { + result += withoutSuffix || isFuture ? 'let' : 'leti'; + } + return result; + } +} + +var sl = moment.defineLocale('sl', { + months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'), + weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'), + weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[včeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + return '[prejšnjo] [nedeljo] [ob] LT'; + case 3: + return '[prejšnjo] [sredo] [ob] LT'; + case 6: + return '[prejšnjo] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejšnji] dddd [ob] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'čez %s', + past : 'pred %s', + s : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return sl; + +}))); diff --git a/public/js/moment/locale/sq.js b/public/js/moment/locale/sq.js new file mode 100755 index 0000000..b92dc17 --- /dev/null +++ b/public/js/moment/locale/sq.js @@ -0,0 +1,70 @@ +//! moment.js locale configuration +//! locale : Albanian [sq] +//! author : Flakërim Ismani : https://github.com/flakerimi +//! author : Menelion Elensúle : https://github.com/Oire +//! author : Oerd Cukalla : https://github.com/oerd + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var sq = moment.defineLocale('sq', { + months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), + monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), + weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), + weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), + weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), + weekdaysParseExact : true, + meridiemParse: /PD|MD/, + isPM: function (input) { + return input.charAt(0) === 'M'; + }, + meridiem : function (hours, minutes, isLower) { + return hours < 12 ? 'PD' : 'MD'; + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Sot në] LT', + nextDay : '[Nesër në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'në %s', + past : '%s më parë', + s : 'disa sekonda', + m : 'një minutë', + mm : '%d minuta', + h : 'një orë', + hh : '%d orë', + d : 'një ditë', + dd : '%d ditë', + M : 'një muaj', + MM : '%d muaj', + y : 'një vit', + yy : '%d vite' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return sq; + +}))); diff --git a/public/js/moment/locale/sr-cyrl.js b/public/js/moment/locale/sr-cyrl.js new file mode 100755 index 0000000..3007819 --- /dev/null +++ b/public/js/moment/locale/sr-cyrl.js @@ -0,0 +1,110 @@ +//! moment.js locale configuration +//! locale : Serbian Cyrillic [sr-cyrl] +//! author : Milan Janačković : https://github.com/milan-j + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var translator = { + words: { //Different grammatical cases + m: ['један минут', 'једне минуте'], + mm: ['минут', 'минуте', 'минута'], + h: ['један сат', 'једног сата'], + hh: ['сат', 'сата', 'сати'], + dd: ['дан', 'дана', 'дана'], + MM: ['месец', 'месеца', 'месеци'], + yy: ['година', 'године', 'година'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } +}; + +var srCyrl = moment.defineLocale('sr-cyrl', { + months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'), + monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'), + monthsParseExact: true, + weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'), + weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'), + weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'H:mm', + LTS : 'H:mm:ss', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm', + LLLL: 'dddd, D. MMMM YYYY H:mm' + }, + calendar: { + sameDay: '[данас у] LT', + nextDay: '[сутра у] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[у] [недељу] [у] LT'; + case 3: + return '[у] [среду] [у] LT'; + case 6: + return '[у] [суботу] [у] LT'; + case 1: + case 2: + case 4: + case 5: + return '[у] dddd [у] LT'; + } + }, + lastDay : '[јуче у] LT', + lastWeek : function () { + var lastWeekDays = [ + '[прошле] [недеље] [у] LT', + '[прошлог] [понедељка] [у] LT', + '[прошлог] [уторка] [у] LT', + '[прошле] [среде] [у] LT', + '[прошлог] [четвртка] [у] LT', + '[прошлог] [петка] [у] LT', + '[прошле] [суботе] [у] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'за %s', + past : 'пре %s', + s : 'неколико секунди', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'дан', + dd : translator.translate, + M : 'месец', + MM : translator.translate, + y : 'годину', + yy : translator.translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return srCyrl; + +}))); diff --git a/public/js/moment/locale/sr.js b/public/js/moment/locale/sr.js new file mode 100755 index 0000000..90778a9 --- /dev/null +++ b/public/js/moment/locale/sr.js @@ -0,0 +1,110 @@ +//! moment.js locale configuration +//! locale : Serbian [sr] +//! author : Milan Janačković : https://github.com/milan-j + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var translator = { + words: { //Different grammatical cases + m: ['jedan minut', 'jedne minute'], + mm: ['minut', 'minute', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mesec', 'meseca', 'meseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } +}; + +var sr = moment.defineLocale('sr', { + months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'), + weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'), + weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'H:mm', + LTS : 'H:mm:ss', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm', + LLLL: 'dddd, D. MMMM YYYY H:mm' + }, + calendar: { + sameDay: '[danas u] LT', + nextDay: '[sutra u] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[u] [nedelju] [u] LT'; + case 3: + return '[u] [sredu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juče u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[prošle] [nedelje] [u] LT', + '[prošlog] [ponedeljka] [u] LT', + '[prošlog] [utorka] [u] LT', + '[prošle] [srede] [u] LT', + '[prošlog] [četvrtka] [u] LT', + '[prošlog] [petka] [u] LT', + '[prošle] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pre %s', + s : 'nekoliko sekundi', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mesec', + MM : translator.translate, + y : 'godinu', + yy : translator.translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return sr; + +}))); diff --git a/public/js/moment/locale/ss.js b/public/js/moment/locale/ss.js new file mode 100755 index 0000000..e89e2db --- /dev/null +++ b/public/js/moment/locale/ss.js @@ -0,0 +1,89 @@ +//! moment.js locale configuration +//! locale : siSwati [ss] +//! author : Nicolai Davies : https://github.com/nicolaidavies + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + +var ss = moment.defineLocale('ss', { + months : "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split('_'), + monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'), + weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'), + weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'), + weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendar : { + sameDay : '[Namuhla nga] LT', + nextDay : '[Kusasa nga] LT', + nextWeek : 'dddd [nga] LT', + lastDay : '[Itolo nga] LT', + lastWeek : 'dddd [leliphelile] [nga] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'nga %s', + past : 'wenteka nga %s', + s : 'emizuzwana lomcane', + m : 'umzuzu', + mm : '%d emizuzu', + h : 'lihora', + hh : '%d emahora', + d : 'lilanga', + dd : '%d emalanga', + M : 'inyanga', + MM : '%d tinyanga', + y : 'umnyaka', + yy : '%d iminyaka' + }, + meridiemParse: /ekuseni|emini|entsambama|ebusuku/, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'ekuseni'; + } else if (hours < 15) { + return 'emini'; + } else if (hours < 19) { + return 'entsambama'; + } else { + return 'ebusuku'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'ekuseni') { + return hour; + } else if (meridiem === 'emini') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') { + if (hour === 0) { + return 0; + } + return hour + 12; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}/, + ordinal : '%d', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return ss; + +}))); diff --git a/public/js/moment/locale/sv.js b/public/js/moment/locale/sv.js new file mode 100755 index 0000000..1aa7660 --- /dev/null +++ b/public/js/moment/locale/sv.js @@ -0,0 +1,69 @@ +//! moment.js locale configuration +//! locale : Swedish [sv] +//! author : Jens Alm : https://github.com/ulmus + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var sv = moment.defineLocale('sv', { + months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), + weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'), + weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [kl.] HH:mm', + LLLL : 'dddd D MMMM YYYY [kl.] HH:mm', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd D MMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[Igår] LT', + nextWeek: '[På] dddd LT', + lastWeek: '[I] dddd[s] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'för %s sedan', + s : 'några sekunder', + m : 'en minut', + mm : '%d minuter', + h : 'en timme', + hh : '%d timmar', + d : 'en dag', + dd : '%d dagar', + M : 'en månad', + MM : '%d månader', + y : 'ett år', + yy : '%d år' + }, + dayOfMonthOrdinalParse: /\d{1,2}(e|a)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return sv; + +}))); diff --git a/public/js/moment/locale/sw.js b/public/js/moment/locale/sw.js new file mode 100755 index 0000000..9ed314f --- /dev/null +++ b/public/js/moment/locale/sw.js @@ -0,0 +1,59 @@ +//! moment.js locale configuration +//! locale : Swahili [sw] +//! author : Fahad Kassim : https://github.com/fadsel + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var sw = moment.defineLocale('sw', { + months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'), + weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'), + weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[leo saa] LT', + nextDay : '[kesho saa] LT', + nextWeek : '[wiki ijayo] dddd [saat] LT', + lastDay : '[jana] LT', + lastWeek : '[wiki iliyopita] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s baadaye', + past : 'tokea %s', + s : 'hivi punde', + m : 'dakika moja', + mm : 'dakika %d', + h : 'saa limoja', + hh : 'masaa %d', + d : 'siku moja', + dd : 'masiku %d', + M : 'mwezi mmoja', + MM : 'miezi %d', + y : 'mwaka mmoja', + yy : 'miaka %d' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return sw; + +}))); diff --git a/public/js/moment/locale/ta.js b/public/js/moment/locale/ta.js new file mode 100755 index 0000000..d9d2555 --- /dev/null +++ b/public/js/moment/locale/ta.js @@ -0,0 +1,130 @@ +//! moment.js locale configuration +//! locale : Tamil [ta] +//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404 + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var symbolMap = { + '1': '௧', + '2': '௨', + '3': '௩', + '4': '௪', + '5': '௫', + '6': '௬', + '7': '௭', + '8': '௮', + '9': '௯', + '0': '௦' +}; +var numberMap = { + '௧': '1', + '௨': '2', + '௩': '3', + '௪': '4', + '௫': '5', + '௬': '6', + '௭': '7', + '௮': '8', + '௯': '9', + '௦': '0' +}; + +var ta = moment.defineLocale('ta', { + months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), + monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), + weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'), + weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'), + weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, HH:mm', + LLLL : 'dddd, D MMMM YYYY, HH:mm' + }, + calendar : { + sameDay : '[இன்று] LT', + nextDay : '[நாளை] LT', + nextWeek : 'dddd, LT', + lastDay : '[நேற்று] LT', + lastWeek : '[கடந்த வாரம்] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s இல்', + past : '%s முன்', + s : 'ஒரு சில விநாடிகள்', + m : 'ஒரு நிமிடம்', + mm : '%d நிமிடங்கள்', + h : 'ஒரு மணி நேரம்', + hh : '%d மணி நேரம்', + d : 'ஒரு நாள்', + dd : '%d நாட்கள்', + M : 'ஒரு மாதம்', + MM : '%d மாதங்கள்', + y : 'ஒரு வருடம்', + yy : '%d ஆண்டுகள்' + }, + dayOfMonthOrdinalParse: /\d{1,2}வது/, + ordinal : function (number) { + return number + 'வது'; + }, + preparse: function (string) { + return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // refer http://ta.wikipedia.org/s/1er1 + meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/, + meridiem : function (hour, minute, isLower) { + if (hour < 2) { + return ' யாமம்'; + } else if (hour < 6) { + return ' வைகறை'; // வைகறை + } else if (hour < 10) { + return ' காலை'; // காலை + } else if (hour < 14) { + return ' நண்பகல்'; // நண்பகல் + } else if (hour < 18) { + return ' எற்பாடு'; // எற்பாடு + } else if (hour < 22) { + return ' மாலை'; // மாலை + } else { + return ' யாமம்'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'யாமம்') { + return hour < 2 ? hour : hour + 12; + } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { + return hour; + } else if (meridiem === 'நண்பகல்') { + return hour >= 10 ? hour : hour + 12; + } else { + return hour + 12; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } +}); + +return ta; + +}))); diff --git a/public/js/moment/locale/te.js b/public/js/moment/locale/te.js new file mode 100755 index 0000000..fe33904 --- /dev/null +++ b/public/js/moment/locale/te.js @@ -0,0 +1,89 @@ +//! moment.js locale configuration +//! locale : Telugu [te] +//! author : Krishna Chaitanya Thota : https://github.com/kcthota + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var te = moment.defineLocale('te', { + months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'), + monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'), + monthsParseExact : true, + weekdays : 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'), + weekdaysShort : 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'), + weekdaysMin : 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm', + LLLL : 'dddd, D MMMM YYYY, A h:mm' + }, + calendar : { + sameDay : '[నేడు] LT', + nextDay : '[రేపు] LT', + nextWeek : 'dddd, LT', + lastDay : '[నిన్న] LT', + lastWeek : '[గత] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s లో', + past : '%s క్రితం', + s : 'కొన్ని క్షణాలు', + m : 'ఒక నిమిషం', + mm : '%d నిమిషాలు', + h : 'ఒక గంట', + hh : '%d గంటలు', + d : 'ఒక రోజు', + dd : '%d రోజులు', + M : 'ఒక నెల', + MM : '%d నెలలు', + y : 'ఒక సంవత్సరం', + yy : '%d సంవత్సరాలు' + }, + dayOfMonthOrdinalParse : /\d{1,2}వ/, + ordinal : '%dవ', + meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'రాత్రి') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'ఉదయం') { + return hour; + } else if (meridiem === 'మధ్యాహ్నం') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'సాయంత్రం') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'రాత్రి'; + } else if (hour < 10) { + return 'ఉదయం'; + } else if (hour < 17) { + return 'మధ్యాహ్నం'; + } else if (hour < 20) { + return 'సాయంత్రం'; + } else { + return 'రాత్రి'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } +}); + +return te; + +}))); diff --git a/public/js/moment/locale/tet.js b/public/js/moment/locale/tet.js new file mode 100755 index 0000000..c9c2928 --- /dev/null +++ b/public/js/moment/locale/tet.js @@ -0,0 +1,68 @@ +//! moment.js locale configuration +//! locale : Tetun Dili (East Timor) [tet] +//! author : Joshua Brooks : https://github.com/joshbrooks +//! author : Onorio De J. Afonso : https://github.com/marobo + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var tet = moment.defineLocale('tet', { + months : 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juniu_Juliu_Augustu_Setembru_Outubru_Novembru_Dezembru'.split('_'), + monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Aug_Set_Out_Nov_Dez'.split('_'), + weekdays : 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sexta_Sabadu'.split('_'), + weekdaysShort : 'Dom_Seg_Ters_Kua_Kint_Sext_Sab'.split('_'), + weekdaysMin : 'Do_Seg_Te_Ku_Ki_Sex_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Ohin iha] LT', + nextDay: '[Aban iha] LT', + nextWeek: 'dddd [iha] LT', + lastDay: '[Horiseik iha] LT', + lastWeek: 'dddd [semana kotuk] [iha] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'iha %s', + past : '%s liuba', + s : 'minutu balun', + m : 'minutu ida', + mm : 'minutus %d', + h : 'horas ida', + hh : 'horas %d', + d : 'loron ida', + dd : 'loron %d', + M : 'fulan ida', + MM : 'fulan %d', + y : 'tinan ida', + yy : 'tinan %d' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return tet; + +}))); diff --git a/public/js/moment/locale/th.js b/public/js/moment/locale/th.js new file mode 100755 index 0000000..17ec0f1 --- /dev/null +++ b/public/js/moment/locale/th.js @@ -0,0 +1,67 @@ +//! moment.js locale configuration +//! locale : Thai [th] +//! author : Kridsada Thanabulpong : https://github.com/sirn + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var th = moment.defineLocale('th', { + months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'), + monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'), + monthsParseExact: true, + weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'), + weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference + weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY เวลา H:mm', + LLLL : 'วันddddที่ D MMMM YYYY เวลา H:mm' + }, + meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/, + isPM: function (input) { + return input === 'หลังเที่ยง'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ก่อนเที่ยง'; + } else { + return 'หลังเที่ยง'; + } + }, + calendar : { + sameDay : '[วันนี้ เวลา] LT', + nextDay : '[พรุ่งนี้ เวลา] LT', + nextWeek : 'dddd[หน้า เวลา] LT', + lastDay : '[เมื่อวานนี้ เวลา] LT', + lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'อีก %s', + past : '%sที่แล้ว', + s : 'ไม่กี่วินาที', + m : '1 นาที', + mm : '%d นาที', + h : '1 ชั่วโมง', + hh : '%d ชั่วโมง', + d : '1 วัน', + dd : '%d วัน', + M : '1 เดือน', + MM : '%d เดือน', + y : '1 ปี', + yy : '%d ปี' + } +}); + +return th; + +}))); diff --git a/public/js/moment/locale/tl-ph.js b/public/js/moment/locale/tl-ph.js new file mode 100755 index 0000000..f66b022 --- /dev/null +++ b/public/js/moment/locale/tl-ph.js @@ -0,0 +1,62 @@ +//! moment.js locale configuration +//! locale : Tagalog (Philippines) [tl-ph] +//! author : Dan Hagman : https://github.com/hagmandan + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var tlPh = moment.defineLocale('tl-ph', { + months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), + monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), + weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), + weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), + weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'MM/D/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY HH:mm', + LLLL : 'dddd, MMMM DD, YYYY HH:mm' + }, + calendar : { + sameDay: 'LT [ngayong araw]', + nextDay: '[Bukas ng] LT', + nextWeek: 'LT [sa susunod na] dddd', + lastDay: 'LT [kahapon]', + lastWeek: 'LT [noong nakaraang] dddd', + sameElse: 'L' + }, + relativeTime : { + future : 'sa loob ng %s', + past : '%s ang nakalipas', + s : 'ilang segundo', + m : 'isang minuto', + mm : '%d minuto', + h : 'isang oras', + hh : '%d oras', + d : 'isang araw', + dd : '%d araw', + M : 'isang buwan', + MM : '%d buwan', + y : 'isang taon', + yy : '%d taon' + }, + dayOfMonthOrdinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return tlPh; + +}))); diff --git a/public/js/moment/locale/tlh.js b/public/js/moment/locale/tlh.js new file mode 100755 index 0000000..7c3123c --- /dev/null +++ b/public/js/moment/locale/tlh.js @@ -0,0 +1,120 @@ +//! moment.js locale configuration +//! locale : Klingon [tlh] +//! author : Dominika Kruk : https://github.com/amaranthrose + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_'); + +function translateFuture(output) { + var time = output; + time = (output.indexOf('jaj') !== -1) ? + time.slice(0, -3) + 'leS' : + (output.indexOf('jar') !== -1) ? + time.slice(0, -3) + 'waQ' : + (output.indexOf('DIS') !== -1) ? + time.slice(0, -3) + 'nem' : + time + ' pIq'; + return time; +} + +function translatePast(output) { + var time = output; + time = (output.indexOf('jaj') !== -1) ? + time.slice(0, -3) + 'Hu’' : + (output.indexOf('jar') !== -1) ? + time.slice(0, -3) + 'wen' : + (output.indexOf('DIS') !== -1) ? + time.slice(0, -3) + 'ben' : + time + ' ret'; + return time; +} + +function translate(number, withoutSuffix, string, isFuture) { + var numberNoun = numberAsNoun(number); + switch (string) { + case 'mm': + return numberNoun + ' tup'; + case 'hh': + return numberNoun + ' rep'; + case 'dd': + return numberNoun + ' jaj'; + case 'MM': + return numberNoun + ' jar'; + case 'yy': + return numberNoun + ' DIS'; + } +} + +function numberAsNoun(number) { + var hundred = Math.floor((number % 1000) / 100), + ten = Math.floor((number % 100) / 10), + one = number % 10, + word = ''; + if (hundred > 0) { + word += numbersNouns[hundred] + 'vatlh'; + } + if (ten > 0) { + word += ((word !== '') ? ' ' : '') + numbersNouns[ten] + 'maH'; + } + if (one > 0) { + word += ((word !== '') ? ' ' : '') + numbersNouns[one]; + } + return (word === '') ? 'pagh' : word; +} + +var tlh = moment.defineLocale('tlh', { + months : 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'), + monthsShort : 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'), + monthsParseExact : true, + weekdays : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), + weekdaysShort : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), + weekdaysMin : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[DaHjaj] LT', + nextDay: '[wa’leS] LT', + nextWeek: 'LLL', + lastDay: '[wa’Hu’] LT', + lastWeek: 'LLL', + sameElse: 'L' + }, + relativeTime : { + future : translateFuture, + past : translatePast, + s : 'puS lup', + m : 'wa’ tup', + mm : translate, + h : 'wa’ rep', + hh : translate, + d : 'wa’ jaj', + dd : translate, + M : 'wa’ jar', + MM : translate, + y : 'wa’ DIS', + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return tlh; + +}))); diff --git a/public/js/moment/locale/tr.js b/public/js/moment/locale/tr.js new file mode 100755 index 0000000..911e8d1 --- /dev/null +++ b/public/js/moment/locale/tr.js @@ -0,0 +1,90 @@ +//! moment.js locale configuration +//! locale : Turkish [tr] +//! authors : Erhan Gundogan : https://github.com/erhangundogan, +//! Burak Yiğit Kaya: https://github.com/BYK + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var suffixes = { + 1: '\'inci', + 5: '\'inci', + 8: '\'inci', + 70: '\'inci', + 80: '\'inci', + 2: '\'nci', + 7: '\'nci', + 20: '\'nci', + 50: '\'nci', + 3: '\'üncü', + 4: '\'üncü', + 100: '\'üncü', + 6: '\'ncı', + 9: '\'uncu', + 10: '\'uncu', + 30: '\'uncu', + 60: '\'ıncı', + 90: '\'ıncı' +}; + +var tr = moment.defineLocale('tr', { + months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'), + monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'), + weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'), + weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[gelecek] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s önce', + s : 'birkaç saniye', + m : 'bir dakika', + mm : '%d dakika', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir yıl', + yy : '%d yıl' + }, + dayOfMonthOrdinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '\'ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return tr; + +}))); diff --git a/public/js/moment/locale/tzl.js b/public/js/moment/locale/tzl.js new file mode 100755 index 0000000..978fcb4 --- /dev/null +++ b/public/js/moment/locale/tzl.js @@ -0,0 +1,91 @@ +//! moment.js locale configuration +//! locale : Talossan [tzl] +//! author : Robin van der Vliet : https://github.com/robin0van0der0v +//! author : Iustì Canun + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +// After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals. +// This is currently too difficult (maybe even impossible) to add. +var tzl = moment.defineLocale('tzl', { + months : 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'), + monthsShort : 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'), + weekdays : 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'), + weekdaysShort : 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'), + weekdaysMin : 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM [dallas] YYYY', + LLL : 'D. MMMM [dallas] YYYY HH.mm', + LLLL : 'dddd, [li] D. MMMM [dallas] YYYY HH.mm' + }, + meridiemParse: /d\'o|d\'a/i, + isPM : function (input) { + return 'd\'o' === input.toLowerCase(); + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'd\'o' : 'D\'O'; + } else { + return isLower ? 'd\'a' : 'D\'A'; + } + }, + calendar : { + sameDay : '[oxhi à] LT', + nextDay : '[demà à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[ieiri à] LT', + lastWeek : '[sür el] dddd [lasteu à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'osprei %s', + past : 'ja%s', + s : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's': ['viensas secunds', '\'iensas secunds'], + 'm': ['\'n míut', '\'iens míut'], + 'mm': [number + ' míuts', '' + number + ' míuts'], + 'h': ['\'n þora', '\'iensa þora'], + 'hh': [number + ' þoras', '' + number + ' þoras'], + 'd': ['\'n ziua', '\'iensa ziua'], + 'dd': [number + ' ziuas', '' + number + ' ziuas'], + 'M': ['\'n mes', '\'iens mes'], + 'MM': [number + ' mesen', '' + number + ' mesen'], + 'y': ['\'n ar', '\'iens ar'], + 'yy': [number + ' ars', '' + number + ' ars'] + }; + return isFuture ? format[key][0] : (withoutSuffix ? format[key][0] : format[key][1]); +} + +return tzl; + +}))); diff --git a/public/js/moment/locale/tzm-latn.js b/public/js/moment/locale/tzm-latn.js new file mode 100755 index 0000000..4d742c5 --- /dev/null +++ b/public/js/moment/locale/tzm-latn.js @@ -0,0 +1,58 @@ +//! moment.js locale configuration +//! locale : Central Atlas Tamazight Latin [tzm-latn] +//! author : Abdel Said : https://github.com/abdelsaid + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var tzmLatn = moment.defineLocale('tzm-latn', { + months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), + weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), + weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[asdkh g] LT', + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dadkh s yan %s', + past : 'yan %s', + s : 'imik', + m : 'minuḍ', + mm : '%d minuḍ', + h : 'saɛa', + hh : '%d tassaɛin', + d : 'ass', + dd : '%d ossan', + M : 'ayowr', + MM : '%d iyyirn', + y : 'asgas', + yy : '%d isgasn' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } +}); + +return tzmLatn; + +}))); diff --git a/public/js/moment/locale/tzm.js b/public/js/moment/locale/tzm.js new file mode 100755 index 0000000..1d1c260 --- /dev/null +++ b/public/js/moment/locale/tzm.js @@ -0,0 +1,58 @@ +//! moment.js locale configuration +//! locale : Central Atlas Tamazight [tzm] +//! author : Abdel Said : https://github.com/abdelsaid + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var tzm = moment.defineLocale('tzm', { + months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), + monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), + weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[ⴰⵙⴷⵅ ⴴ] LT', + nextDay: '[ⴰⵙⴽⴰ ⴴ] LT', + nextWeek: 'dddd [ⴴ] LT', + lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT', + lastWeek: 'dddd [ⴴ] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s', + past : 'ⵢⴰⵏ %s', + s : 'ⵉⵎⵉⴽ', + m : 'ⵎⵉⵏⵓⴺ', + mm : '%d ⵎⵉⵏⵓⴺ', + h : 'ⵙⴰⵄⴰ', + hh : '%d ⵜⴰⵙⵙⴰⵄⵉⵏ', + d : 'ⴰⵙⵙ', + dd : '%d oⵙⵙⴰⵏ', + M : 'ⴰⵢoⵓⵔ', + MM : '%d ⵉⵢⵢⵉⵔⵏ', + y : 'ⴰⵙⴳⴰⵙ', + yy : '%d ⵉⵙⴳⴰⵙⵏ' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } +}); + +return tzm; + +}))); diff --git a/public/js/moment/locale/uk.js b/public/js/moment/locale/uk.js new file mode 100755 index 0000000..1aff8c1 --- /dev/null +++ b/public/js/moment/locale/uk.js @@ -0,0 +1,151 @@ +//! moment.js locale configuration +//! locale : Ukrainian [uk] +//! author : zemlanin : https://github.com/zemlanin +//! Author : Menelion Elensúle : https://github.com/Oire + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); +} +function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин', + 'hh': withoutSuffix ? 'година_години_годин' : 'годину_години_годин', + 'dd': 'день_дні_днів', + 'MM': 'місяць_місяці_місяців', + 'yy': 'рік_роки_років' + }; + if (key === 'm') { + return withoutSuffix ? 'хвилина' : 'хвилину'; + } + else if (key === 'h') { + return withoutSuffix ? 'година' : 'годину'; + } + else { + return number + ' ' + plural(format[key], +number); + } +} +function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_') + }; + + if (!m) { + return weekdays['nominative']; + } + + var nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + return weekdays[nounCase][m.day()]; +} +function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; +} + +var uk = moment.defineLocale('uk', { + months : { + 'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'), + 'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_') + }, + monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), + weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY р.', + LLL : 'D MMMM YYYY р., HH:mm', + LLLL : 'dddd, D MMMM YYYY р., HH:mm' + }, + calendar : { + sameDay: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'за %s', + past : '%s тому', + s : 'декілька секунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'годину', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'місяць', + MM : relativeTimeWithPlural, + y : 'рік', + yy : relativeTimeWithPlural + }, + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + meridiemParse: /ночі|ранку|дня|вечора/, + isPM: function (input) { + return /^(дня|вечора)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночі'; + } else if (hour < 12) { + return 'ранку'; + } else if (hour < 17) { + return 'дня'; + } else { + return 'вечора'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}-(й|го)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return number + '-й'; + case 'D': + return number + '-го'; + default: + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return uk; + +}))); diff --git a/public/js/moment/locale/ur.js b/public/js/moment/locale/ur.js new file mode 100755 index 0000000..4cf1c07 --- /dev/null +++ b/public/js/moment/locale/ur.js @@ -0,0 +1,99 @@ +//! moment.js locale configuration +//! locale : Urdu [ur] +//! author : Sawood Alam : https://github.com/ibnesayeed +//! author : Zack : https://github.com/ZackVision + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var months = [ + 'جنوری', + 'فروری', + 'مارچ', + 'اپریل', + 'مئی', + 'جون', + 'جولائی', + 'اگست', + 'ستمبر', + 'اکتوبر', + 'نومبر', + 'دسمبر' +]; +var days = [ + 'اتوار', + 'پیر', + 'منگل', + 'بدھ', + 'جمعرات', + 'جمعہ', + 'ہفتہ' +]; + +var ur = moment.defineLocale('ur', { + months : months, + monthsShort : months, + weekdays : days, + weekdaysShort : days, + weekdaysMin : days, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd، D MMMM YYYY HH:mm' + }, + meridiemParse: /صبح|شام/, + isPM : function (input) { + return 'شام' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'صبح'; + } + return 'شام'; + }, + calendar : { + sameDay : '[آج بوقت] LT', + nextDay : '[کل بوقت] LT', + nextWeek : 'dddd [بوقت] LT', + lastDay : '[گذشتہ روز بوقت] LT', + lastWeek : '[گذشتہ] dddd [بوقت] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s بعد', + past : '%s قبل', + s : 'چند سیکنڈ', + m : 'ایک منٹ', + mm : '%d منٹ', + h : 'ایک گھنٹہ', + hh : '%d گھنٹے', + d : 'ایک دن', + dd : '%d دن', + M : 'ایک ماہ', + MM : '%d ماہ', + y : 'ایک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/,/g, '،'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return ur; + +}))); diff --git a/public/js/moment/locale/uz-latn.js b/public/js/moment/locale/uz-latn.js new file mode 100755 index 0000000..21463b7 --- /dev/null +++ b/public/js/moment/locale/uz-latn.js @@ -0,0 +1,58 @@ +//! moment.js locale configuration +//! locale : Uzbek Latin [uz-latn] +//! author : Rasulbek Mirzayev : github.com/Rasulbeeek + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var uzLatn = moment.defineLocale('uz-latn', { + months : 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split('_'), + monthsShort : 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'), + weekdays : 'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split('_'), + weekdaysShort : 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'), + weekdaysMin : 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'D MMMM YYYY, dddd HH:mm' + }, + calendar : { + sameDay : '[Bugun soat] LT [da]', + nextDay : '[Ertaga] LT [da]', + nextWeek : 'dddd [kuni soat] LT [da]', + lastDay : '[Kecha soat] LT [da]', + lastWeek : '[O\'tgan] dddd [kuni soat] LT [da]', + sameElse : 'L' + }, + relativeTime : { + future : 'Yaqin %s ichida', + past : 'Bir necha %s oldin', + s : 'soniya', + m : 'bir daqiqa', + mm : '%d daqiqa', + h : 'bir soat', + hh : '%d soat', + d : 'bir kun', + dd : '%d kun', + M : 'bir oy', + MM : '%d oy', + y : 'bir yil', + yy : '%d yil' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + +return uzLatn; + +}))); diff --git a/public/js/moment/locale/uz.js b/public/js/moment/locale/uz.js new file mode 100755 index 0000000..378461e --- /dev/null +++ b/public/js/moment/locale/uz.js @@ -0,0 +1,58 @@ +//! moment.js locale configuration +//! locale : Uzbek [uz] +//! author : Sardor Muminov : https://github.com/muminoff + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var uz = moment.defineLocale('uz', { + months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), + monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), + weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), + weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'D MMMM YYYY, dddd HH:mm' + }, + calendar : { + sameDay : '[Бугун соат] LT [да]', + nextDay : '[Эртага] LT [да]', + nextWeek : 'dddd [куни соат] LT [да]', + lastDay : '[Кеча соат] LT [да]', + lastWeek : '[Утган] dddd [куни соат] LT [да]', + sameElse : 'L' + }, + relativeTime : { + future : 'Якин %s ичида', + past : 'Бир неча %s олдин', + s : 'фурсат', + m : 'бир дакика', + mm : '%d дакика', + h : 'бир соат', + hh : '%d соат', + d : 'бир кун', + dd : '%d кун', + M : 'бир ой', + MM : '%d ой', + y : 'бир йил', + yy : '%d йил' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 4th is the first week of the year. + } +}); + +return uz; + +}))); diff --git a/public/js/moment/locale/vi.js b/public/js/moment/locale/vi.js new file mode 100755 index 0000000..1adacc3 --- /dev/null +++ b/public/js/moment/locale/vi.js @@ -0,0 +1,79 @@ +//! moment.js locale configuration +//! locale : Vietnamese [vi] +//! author : Bang Nguyen : https://github.com/bangnk + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var vi = moment.defineLocale('vi', { + months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), + monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), + monthsParseExact : true, + weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'), + weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysParseExact : true, + meridiemParse: /sa|ch/i, + isPM : function (input) { + return /^ch$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'sa' : 'SA'; + } else { + return isLower ? 'ch' : 'CH'; + } + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [năm] YYYY', + LLL : 'D MMMM [năm] YYYY HH:mm', + LLLL : 'dddd, D MMMM [năm] YYYY HH:mm', + l : 'DD/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd, D MMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Hôm nay lúc] LT', + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tới lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s tới', + past : '%s trước', + s : 'vài giây', + m : 'một phút', + mm : '%d phút', + h : 'một giờ', + hh : '%d giờ', + d : 'một ngày', + dd : '%d ngày', + M : 'một tháng', + MM : '%d tháng', + y : 'một năm', + yy : '%d năm' + }, + dayOfMonthOrdinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return vi; + +}))); diff --git a/public/js/moment/locale/x-pseudo.js b/public/js/moment/locale/x-pseudo.js new file mode 100755 index 0000000..b906e16 --- /dev/null +++ b/public/js/moment/locale/x-pseudo.js @@ -0,0 +1,68 @@ +//! moment.js locale configuration +//! locale : Pseudo [x-pseudo] +//! author : Andrew Hood : https://github.com/andrewhood125 + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var xPseudo = moment.defineLocale('x-pseudo', { + months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'), + monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'), + monthsParseExact : true, + weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'), + weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'), + weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[T~ódá~ý át] LT', + nextDay : '[T~ómó~rró~w át] LT', + nextWeek : 'dddd [át] LT', + lastDay : '[Ý~ést~érdá~ý át] LT', + lastWeek : '[L~ást] dddd [át] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'í~ñ %s', + past : '%s á~gó', + s : 'á ~féw ~sécó~ñds', + m : 'á ~míñ~úté', + mm : '%d m~íñú~tés', + h : 'á~ñ hó~úr', + hh : '%d h~óúrs', + d : 'á ~dáý', + dd : '%d d~áýs', + M : 'á ~móñ~th', + MM : '%d m~óñt~hs', + y : 'á ~ýéár', + yy : '%d ý~éárs' + }, + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return xPseudo; + +}))); diff --git a/public/js/moment/locale/yo.js b/public/js/moment/locale/yo.js new file mode 100755 index 0000000..ec28a91 --- /dev/null +++ b/public/js/moment/locale/yo.js @@ -0,0 +1,60 @@ +//! moment.js locale configuration +//! locale : Yoruba Nigeria [yo] +//! author : Atolagbe Abisoye : https://github.com/andela-batolagbe + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var yo = moment.defineLocale('yo', { + months : 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'), + monthsShort : 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'), + weekdays : 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'), + weekdaysShort : 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'), + weekdaysMin : 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendar : { + sameDay : '[Ònì ni] LT', + nextDay : '[Ọ̀la ni] LT', + nextWeek : 'dddd [Ọsẹ̀ tón\'bọ] [ni] LT', + lastDay : '[Àna ni] LT', + lastWeek : 'dddd [Ọsẹ̀ tólọ́] [ni] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ní %s', + past : '%s kọjá', + s : 'ìsẹjú aayá die', + m : 'ìsẹjú kan', + mm : 'ìsẹjú %d', + h : 'wákati kan', + hh : 'wákati %d', + d : 'ọjọ́ kan', + dd : 'ọjọ́ %d', + M : 'osù kan', + MM : 'osù %d', + y : 'ọdún kan', + yy : 'ọdún %d' + }, + dayOfMonthOrdinalParse : /ọjọ́\s\d{1,2}/, + ordinal : 'ọjọ́ %d', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return yo; + +}))); diff --git a/public/js/moment/locale/zh-cn.js b/public/js/moment/locale/zh-cn.js new file mode 100755 index 0000000..005e941 --- /dev/null +++ b/public/js/moment/locale/zh-cn.js @@ -0,0 +1,111 @@ +//! moment.js locale configuration +//! locale : Chinese (China) [zh-cn] +//! author : suupic : https://github.com/suupic +//! author : Zeno Zeng : https://github.com/zenozeng + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var zhCn = moment.defineLocale('zh-cn', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY年MMMD日', + LL : 'YYYY年MMMD日', + LLL : 'YYYY年MMMD日Ah点mm分', + LLLL : 'YYYY年MMMD日ddddAh点mm分', + l : 'YYYY年MMMD日', + ll : 'YYYY年MMMD日', + lll : 'YYYY年MMMD日 HH:mm', + llll : 'YYYY年MMMD日dddd HH:mm' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || + meridiem === '上午') { + return hour; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } else { + // '中午' + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + dayOfMonthOrdinalParse: /\d{1,2}(日|月|周)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '日'; + case 'M': + return number + '月'; + case 'w': + case 'W': + return number + '周'; + default: + return number; + } + }, + relativeTime : { + future : '%s内', + past : '%s前', + s : '几秒', + m : '1 分钟', + mm : '%d 分钟', + h : '1 小时', + hh : '%d 小时', + d : '1 天', + dd : '%d 天', + M : '1 个月', + MM : '%d 个月', + y : '1 年', + yy : '%d 年' + }, + week : { + // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return zhCn; + +}))); diff --git a/public/js/moment/locale/zh-hk.js b/public/js/moment/locale/zh-hk.js new file mode 100755 index 0000000..5ded143 --- /dev/null +++ b/public/js/moment/locale/zh-hk.js @@ -0,0 +1,105 @@ +//! moment.js locale configuration +//! locale : Chinese (Hong Kong) [zh-hk] +//! author : Ben : https://github.com/ben-lin +//! author : Chris Lam : https://github.com/hehachris +//! author : Konstantin : https://github.com/skfd + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var zhHk = moment.defineLocale('zh-hk', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY年MMMD日', + LL : 'YYYY年MMMD日', + LLL : 'YYYY年MMMD日 HH:mm', + LLLL : 'YYYY年MMMD日dddd HH:mm', + l : 'YYYY年MMMD日', + ll : 'YYYY年MMMD日', + lll : 'YYYY年MMMD日 HH:mm', + llll : 'YYYY年MMMD日dddd HH:mm' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { + return hour; + } else if (meridiem === '中午') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + '日'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%s內', + past : '%s前', + s : '幾秒', + m : '1 分鐘', + mm : '%d 分鐘', + h : '1 小時', + hh : '%d 小時', + d : '1 天', + dd : '%d 天', + M : '1 個月', + MM : '%d 個月', + y : '1 年', + yy : '%d 年' + } +}); + +return zhHk; + +}))); diff --git a/public/js/moment/locale/zh-tw.js b/public/js/moment/locale/zh-tw.js new file mode 100755 index 0000000..50a6b6a --- /dev/null +++ b/public/js/moment/locale/zh-tw.js @@ -0,0 +1,104 @@ +//! moment.js locale configuration +//! locale : Chinese (Taiwan) [zh-tw] +//! author : Ben : https://github.com/ben-lin +//! author : Chris Lam : https://github.com/hehachris + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var zhTw = moment.defineLocale('zh-tw', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY年MMMD日', + LL : 'YYYY年MMMD日', + LLL : 'YYYY年MMMD日 HH:mm', + LLLL : 'YYYY年MMMD日dddd HH:mm', + l : 'YYYY年MMMD日', + ll : 'YYYY年MMMD日', + lll : 'YYYY年MMMD日 HH:mm', + llll : 'YYYY年MMMD日dddd HH:mm' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { + return hour; + } else if (meridiem === '中午') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + '日'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%s內', + past : '%s前', + s : '幾秒', + m : '1 分鐘', + mm : '%d 分鐘', + h : '1 小時', + hh : '%d 小時', + d : '1 天', + dd : '%d 天', + M : '1 個月', + MM : '%d 個月', + y : '1 年', + yy : '%d 年' + } +}); + +return zhTw; + +}))); diff --git a/public/js/moment/moment.js b/public/js/moment/moment.js new file mode 100755 index 0000000..a8485e5 --- /dev/null +++ b/public/js/moment/moment.js @@ -0,0 +1,4517 @@ +//! moment.js +//! version : 2.19.4 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + global.moment = factory() +}(this, (function () { 'use strict'; + +var hookCallback; + +function hooks () { + return hookCallback.apply(null, arguments); +} + +// This is done to register the method called with moment() +// without creating circular dependencies. +function setHookCallback (callback) { + hookCallback = callback; +} + +function isArray(input) { + return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; +} + +function isObject(input) { + // IE8 will treat undefined and null as object if it wasn't for + // input != null + return input != null && Object.prototype.toString.call(input) === '[object Object]'; +} + +function isObjectEmpty(obj) { + if (Object.getOwnPropertyNames) { + return (Object.getOwnPropertyNames(obj).length === 0); + } else { + var k; + for (k in obj) { + if (obj.hasOwnProperty(k)) { + return false; + } + } + return true; + } +} + +function isUndefined(input) { + return input === void 0; +} + +function isNumber(input) { + return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; +} + +function isDate(input) { + return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; +} + +function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; +} + +function hasOwnProp(a, b) { + return Object.prototype.hasOwnProperty.call(a, b); +} + +function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; +} + +function createUTC (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, true).utc(); +} + +function defaultParsingFlags() { + // We need to deep clone this object. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso : false, + parsedDateParts : [], + meridiem : null, + rfc2822 : false, + weekdayMismatch : false + }; +} + +function getParsingFlags(m) { + if (m._pf == null) { + m._pf = defaultParsingFlags(); + } + return m._pf; +} + +var some; +if (Array.prototype.some) { + some = Array.prototype.some; +} else { + some = function (fun) { + var t = Object(this); + var len = t.length >>> 0; + + for (var i = 0; i < len; i++) { + if (i in t && fun.call(this, t[i], i, t)) { + return true; + } + } + + return false; + }; +} + +function isValid(m) { + if (m._isValid == null) { + var flags = getParsingFlags(m); + var parsedParts = some.call(flags.parsedDateParts, function (i) { + return i != null; + }); + var isNowValid = !isNaN(m._d.getTime()) && + flags.overflow < 0 && + !flags.empty && + !flags.invalidMonth && + !flags.invalidWeekday && + !flags.weekdayMismatch && + !flags.nullInput && + !flags.invalidFormat && + !flags.userInvalidated && + (!flags.meridiem || (flags.meridiem && parsedParts)); + + if (m._strict) { + isNowValid = isNowValid && + flags.charsLeftOver === 0 && + flags.unusedTokens.length === 0 && + flags.bigHour === undefined; + } + + if (Object.isFrozen == null || !Object.isFrozen(m)) { + m._isValid = isNowValid; + } + else { + return isNowValid; + } + } + return m._isValid; +} + +function createInvalid (flags) { + var m = createUTC(NaN); + if (flags != null) { + extend(getParsingFlags(m), flags); + } + else { + getParsingFlags(m).userInvalidated = true; + } + + return m; +} + +// Plugins that add properties should also add the key here (null value), +// so we can properly clone ourselves. +var momentProperties = hooks.momentProperties = []; + +function copyConfig(to, from) { + var i, prop, val; + + if (!isUndefined(from._isAMomentObject)) { + to._isAMomentObject = from._isAMomentObject; + } + if (!isUndefined(from._i)) { + to._i = from._i; + } + if (!isUndefined(from._f)) { + to._f = from._f; + } + if (!isUndefined(from._l)) { + to._l = from._l; + } + if (!isUndefined(from._strict)) { + to._strict = from._strict; + } + if (!isUndefined(from._tzm)) { + to._tzm = from._tzm; + } + if (!isUndefined(from._isUTC)) { + to._isUTC = from._isUTC; + } + if (!isUndefined(from._offset)) { + to._offset = from._offset; + } + if (!isUndefined(from._pf)) { + to._pf = getParsingFlags(from); + } + if (!isUndefined(from._locale)) { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i = 0; i < momentProperties.length; i++) { + prop = momentProperties[i]; + val = from[prop]; + if (!isUndefined(val)) { + to[prop] = val; + } + } + } + + return to; +} + +var updateInProgress = false; + +// Moment prototype object +function Moment(config) { + copyConfig(this, config); + this._d = new Date(config._d != null ? config._d.getTime() : NaN); + if (!this.isValid()) { + this._d = new Date(NaN); + } + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + hooks.updateOffset(this); + updateInProgress = false; + } +} + +function isMoment (obj) { + return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); +} + +function absFloor (number) { + if (number < 0) { + // -0 -> 0 + return Math.ceil(number) || 0; + } else { + return Math.floor(number); + } +} + +function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + value = absFloor(coercedNumber); + } + + return value; +} + +// compare two arrays, return the number of differences +function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; +} + +function warn(msg) { + if (hooks.suppressDeprecationWarnings === false && + (typeof console !== 'undefined') && console.warn) { + console.warn('Deprecation warning: ' + msg); + } +} + +function deprecate(msg, fn) { + var firstTime = true; + + return extend(function () { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(null, msg); + } + if (firstTime) { + var args = []; + var arg; + for (var i = 0; i < arguments.length; i++) { + arg = ''; + if (typeof arguments[i] === 'object') { + arg += '\n[' + i + '] '; + for (var key in arguments[0]) { + arg += key + ': ' + arguments[0][key] + ', '; + } + arg = arg.slice(0, -2); // Remove trailing comma and space + } else { + arg = arguments[i]; + } + args.push(arg); + } + warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); +} + +var deprecations = {}; + +function deprecateSimple(name, msg) { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(name, msg); + } + if (!deprecations[name]) { + warn(msg); + deprecations[name] = true; + } +} + +hooks.suppressDeprecationWarnings = false; +hooks.deprecationHandler = null; + +function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; +} + +function set (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (isFunction(prop)) { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + this._config = config; + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. + // TODO: Remove "ordinalParse" fallback in next major release. + this._dayOfMonthOrdinalParseLenient = new RegExp( + (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + + '|' + (/\d{1,2}/).source); +} + +function mergeConfigs(parentConfig, childConfig) { + var res = extend({}, parentConfig), prop; + for (prop in childConfig) { + if (hasOwnProp(childConfig, prop)) { + if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { + res[prop] = {}; + extend(res[prop], parentConfig[prop]); + extend(res[prop], childConfig[prop]); + } else if (childConfig[prop] != null) { + res[prop] = childConfig[prop]; + } else { + delete res[prop]; + } + } + } + for (prop in parentConfig) { + if (hasOwnProp(parentConfig, prop) && + !hasOwnProp(childConfig, prop) && + isObject(parentConfig[prop])) { + // make sure changes to properties don't modify parent config + res[prop] = extend({}, res[prop]); + } + } + return res; +} + +function Locale(config) { + if (config != null) { + this.set(config); + } +} + +var keys; + +if (Object.keys) { + keys = Object.keys; +} else { + keys = function (obj) { + var i, res = []; + for (i in obj) { + if (hasOwnProp(obj, i)) { + res.push(i); + } + } + return res; + }; +} + +var defaultCalendar = { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' +}; + +function calendar (key, mom, now) { + var output = this._calendar[key] || this._calendar['sameElse']; + return isFunction(output) ? output.call(mom, now) : output; +} + +var defaultLongDateFormat = { + LTS : 'h:mm:ss A', + LT : 'h:mm A', + L : 'MM/DD/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY h:mm A', + LLLL : 'dddd, MMMM D, YYYY h:mm A' +}; + +function longDateFormat (key) { + var format = this._longDateFormat[key], + formatUpper = this._longDateFormat[key.toUpperCase()]; + + if (format || !formatUpper) { + return format; + } + + this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + + return this._longDateFormat[key]; +} + +var defaultInvalidDate = 'Invalid date'; + +function invalidDate () { + return this._invalidDate; +} + +var defaultOrdinal = '%d'; +var defaultDayOfMonthOrdinalParse = /\d{1,2}/; + +function ordinal (number) { + return this._ordinal.replace('%d', number); +} + +var defaultRelativeTime = { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' +}; + +function relativeTime (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (isFunction(output)) ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); +} + +function pastFuture (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return isFunction(format) ? format(output) : format.replace(/%s/i, output); +} + +var aliases = {}; + +function addUnitAlias (unit, shorthand) { + var lowerCase = unit.toLowerCase(); + aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; +} + +function normalizeUnits(units) { + return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; +} + +function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; +} + +var priorities = {}; + +function addUnitPriority(unit, priority) { + priorities[unit] = priority; +} + +function getPrioritizedUnits(unitsObj) { + var units = []; + for (var u in unitsObj) { + units.push({unit: u, priority: priorities[u]}); + } + units.sort(function (a, b) { + return a.priority - b.priority; + }); + return units; +} + +function zeroFill(number, targetLength, forceSign) { + var absNumber = '' + Math.abs(number), + zerosToFill = targetLength - absNumber.length, + sign = number >= 0; + return (sign ? (forceSign ? '+' : '') : '-') + + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; +} + +var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; + +var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; + +var formatFunctions = {}; + +var formatTokenFunctions = {}; + +// token: 'M' +// padded: ['MM', 2] +// ordinal: 'Mo' +// callback: function () { this.month() + 1 } +function addFormatToken (token, padded, ordinal, callback) { + var func = callback; + if (typeof callback === 'string') { + func = function () { + return this[callback](); + }; + } + if (token) { + formatTokenFunctions[token] = func; + } + if (padded) { + formatTokenFunctions[padded[0]] = function () { + return zeroFill(func.apply(this, arguments), padded[1], padded[2]); + }; + } + if (ordinal) { + formatTokenFunctions[ordinal] = function () { + return this.localeData().ordinal(func.apply(this, arguments), token); + }; + } +} + +function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); +} + +function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = '', i; + for (i = 0; i < length; i++) { + output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; + } + return output; + }; +} + +// format date using native date object +function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); + + return formatFunctions[format](m); +} + +function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; +} + +var match1 = /\d/; // 0 - 9 +var match2 = /\d\d/; // 00 - 99 +var match3 = /\d{3}/; // 000 - 999 +var match4 = /\d{4}/; // 0000 - 9999 +var match6 = /[+-]?\d{6}/; // -999999 - 999999 +var match1to2 = /\d\d?/; // 0 - 99 +var match3to4 = /\d\d\d\d?/; // 999 - 9999 +var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 +var match1to3 = /\d{1,3}/; // 0 - 999 +var match1to4 = /\d{1,4}/; // 0 - 9999 +var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 + +var matchUnsigned = /\d+/; // 0 - inf +var matchSigned = /[+-]?\d+/; // -inf - inf + +var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z +var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z + +var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 + +// any word (or two) characters or numbers including two/three word month in arabic. +// includes scottish gaelic two word and hyphenated months +var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; + + +var regexes = {}; + +function addRegexToken (token, regex, strictRegex) { + regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { + return (isStrict && strictRegex) ? strictRegex : regex; + }; +} + +function getParseRegexForToken (token, config) { + if (!hasOwnProp(regexes, token)) { + return new RegExp(unescapeFormat(token)); + } + + return regexes[token](config._strict, config._locale); +} + +// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript +function unescapeFormat(s) { + return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + })); +} + +function regexEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); +} + +var tokens = {}; + +function addParseToken (token, callback) { + var i, func = callback; + if (typeof token === 'string') { + token = [token]; + } + if (isNumber(callback)) { + func = function (input, array) { + array[callback] = toInt(input); + }; + } + for (i = 0; i < token.length; i++) { + tokens[token[i]] = func; + } +} + +function addWeekParseToken (token, callback) { + addParseToken(token, function (input, array, config, token) { + config._w = config._w || {}; + callback(input, config._w, config, token); + }); +} + +function addTimeToArrayFromToken(token, input, config) { + if (input != null && hasOwnProp(tokens, token)) { + tokens[token](input, config._a, config, token); + } +} + +var YEAR = 0; +var MONTH = 1; +var DATE = 2; +var HOUR = 3; +var MINUTE = 4; +var SECOND = 5; +var MILLISECOND = 6; +var WEEK = 7; +var WEEKDAY = 8; + +// FORMATTING + +addFormatToken('Y', 0, 0, function () { + var y = this.year(); + return y <= 9999 ? '' + y : '+' + y; +}); + +addFormatToken(0, ['YY', 2], 0, function () { + return this.year() % 100; +}); + +addFormatToken(0, ['YYYY', 4], 0, 'year'); +addFormatToken(0, ['YYYYY', 5], 0, 'year'); +addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); + +// ALIASES + +addUnitAlias('year', 'y'); + +// PRIORITIES + +addUnitPriority('year', 1); + +// PARSING + +addRegexToken('Y', matchSigned); +addRegexToken('YY', match1to2, match2); +addRegexToken('YYYY', match1to4, match4); +addRegexToken('YYYYY', match1to6, match6); +addRegexToken('YYYYYY', match1to6, match6); + +addParseToken(['YYYYY', 'YYYYYY'], YEAR); +addParseToken('YYYY', function (input, array) { + array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); +}); +addParseToken('YY', function (input, array) { + array[YEAR] = hooks.parseTwoDigitYear(input); +}); +addParseToken('Y', function (input, array) { + array[YEAR] = parseInt(input, 10); +}); + +// HELPERS + +function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; +} + +function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; +} + +// HOOKS + +hooks.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); +}; + +// MOMENTS + +var getSetYear = makeGetSet('FullYear', true); + +function getIsLeapYear () { + return isLeapYear(this.year()); +} + +function makeGetSet (unit, keepTime) { + return function (value) { + if (value != null) { + set$1(this, unit, value); + hooks.updateOffset(this, keepTime); + return this; + } else { + return get(this, unit); + } + }; +} + +function get (mom, unit) { + return mom.isValid() ? + mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; +} + +function set$1 (mom, unit, value) { + if (mom.isValid() && !isNaN(value)) { + if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); + } + else { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } +} + +// MOMENTS + +function stringGet (units) { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](); + } + return this; +} + + +function stringSet (units, value) { + if (typeof units === 'object') { + units = normalizeObjectUnits(units); + var prioritized = getPrioritizedUnits(units); + for (var i = 0; i < prioritized.length; i++) { + this[prioritized[i].unit](units[prioritized[i].unit]); + } + } else { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](value); + } + } + return this; +} + +function mod(n, x) { + return ((n % x) + x) % x; +} + +var indexOf; + +if (Array.prototype.indexOf) { + indexOf = Array.prototype.indexOf; +} else { + indexOf = function (o) { + // I know + var i; + for (i = 0; i < this.length; ++i) { + if (this[i] === o) { + return i; + } + } + return -1; + }; +} + +function daysInMonth(year, month) { + if (isNaN(year) || isNaN(month)) { + return NaN; + } + var modMonth = mod(month, 12); + year += (month - modMonth) / 12; + return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); +} + +// FORMATTING + +addFormatToken('M', ['MM', 2], 'Mo', function () { + return this.month() + 1; +}); + +addFormatToken('MMM', 0, 0, function (format) { + return this.localeData().monthsShort(this, format); +}); + +addFormatToken('MMMM', 0, 0, function (format) { + return this.localeData().months(this, format); +}); + +// ALIASES + +addUnitAlias('month', 'M'); + +// PRIORITY + +addUnitPriority('month', 8); + +// PARSING + +addRegexToken('M', match1to2); +addRegexToken('MM', match1to2, match2); +addRegexToken('MMM', function (isStrict, locale) { + return locale.monthsShortRegex(isStrict); +}); +addRegexToken('MMMM', function (isStrict, locale) { + return locale.monthsRegex(isStrict); +}); + +addParseToken(['M', 'MM'], function (input, array) { + array[MONTH] = toInt(input) - 1; +}); + +addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { + var month = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (month != null) { + array[MONTH] = month; + } else { + getParsingFlags(config).invalidMonth = input; + } +}); + +// LOCALES + +var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; +var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); +function localeMonths (m, format) { + if (!m) { + return isArray(this._months) ? this._months : + this._months['standalone']; + } + return isArray(this._months) ? this._months[m.month()] : + this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; +} + +var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); +function localeMonthsShort (m, format) { + if (!m) { + return isArray(this._monthsShort) ? this._monthsShort : + this._monthsShort['standalone']; + } + return isArray(this._monthsShort) ? this._monthsShort[m.month()] : + this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; +} + +function handleStrictParse(monthName, format, strict) { + var i, ii, mom, llc = monthName.toLocaleLowerCase(); + if (!this._monthsParse) { + // this is not used + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + for (i = 0; i < 12; ++i) { + mom = createUTC([2000, i]); + this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); + this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } +} + +function localeMonthsParse (monthName, format, strict) { + var i, mom, regex; + + if (this._monthsParseExact) { + return handleStrictParse.call(this, monthName, format, strict); + } + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + // TODO: add sorting + // Sorting makes sure if one month (or abbr) is a prefix of another + // see sorting in computeMonthsParse + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } +} + +// MOMENTS + +function setMonth (mom, value) { + var dayOfMonth; + + if (!mom.isValid()) { + // No op + return mom; + } + + if (typeof value === 'string') { + if (/^\d+$/.test(value)) { + value = toInt(value); + } else { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (!isNumber(value)) { + return mom; + } + } + } + + dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; +} + +function getSetMonth (value) { + if (value != null) { + setMonth(this, value); + hooks.updateOffset(this, true); + return this; + } else { + return get(this, 'Month'); + } +} + +function getDaysInMonth () { + return daysInMonth(this.year(), this.month()); +} + +var defaultMonthsShortRegex = matchWord; +function monthsShortRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsShortStrictRegex; + } else { + return this._monthsShortRegex; + } + } else { + if (!hasOwnProp(this, '_monthsShortRegex')) { + this._monthsShortRegex = defaultMonthsShortRegex; + } + return this._monthsShortStrictRegex && isStrict ? + this._monthsShortStrictRegex : this._monthsShortRegex; + } +} + +var defaultMonthsRegex = matchWord; +function monthsRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsStrictRegex; + } else { + return this._monthsRegex; + } + } else { + if (!hasOwnProp(this, '_monthsRegex')) { + this._monthsRegex = defaultMonthsRegex; + } + return this._monthsStrictRegex && isStrict ? + this._monthsStrictRegex : this._monthsRegex; + } +} + +function computeMonthsParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var shortPieces = [], longPieces = [], mixedPieces = [], + i, mom; + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + shortPieces.push(this.monthsShort(mom, '')); + longPieces.push(this.months(mom, '')); + mixedPieces.push(this.months(mom, '')); + mixedPieces.push(this.monthsShort(mom, '')); + } + // Sorting makes sure if one month (or abbr) is a prefix of another it + // will match the longer piece. + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 12; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + } + for (i = 0; i < 24; i++) { + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._monthsShortRegex = this._monthsRegex; + this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); +} + +function createDate (y, m, d, h, M, s, ms) { + // can't just apply() to create a date: + // https://stackoverflow.com/q/181348 + var date = new Date(y, m, d, h, M, s, ms); + + // the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { + date.setFullYear(y); + } + return date; +} + +function createUTCDate (y) { + var date = new Date(Date.UTC.apply(null, arguments)); + + // the Date.UTC function remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { + date.setUTCFullYear(y); + } + return date; +} + +// start-of-first-week - start-of-year +function firstWeekOffset(year, dow, doy) { + var // first-week day -- which january is always in the first week (4 for iso, 1 for other) + fwd = 7 + dow - doy, + // first-week day local weekday -- which local weekday is fwd + fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; + + return -fwdlw + fwd - 1; +} + +// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday +function dayOfYearFromWeeks(year, week, weekday, dow, doy) { + var localWeekday = (7 + weekday - dow) % 7, + weekOffset = firstWeekOffset(year, dow, doy), + dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, + resYear, resDayOfYear; + + if (dayOfYear <= 0) { + resYear = year - 1; + resDayOfYear = daysInYear(resYear) + dayOfYear; + } else if (dayOfYear > daysInYear(year)) { + resYear = year + 1; + resDayOfYear = dayOfYear - daysInYear(year); + } else { + resYear = year; + resDayOfYear = dayOfYear; + } + + return { + year: resYear, + dayOfYear: resDayOfYear + }; +} + +function weekOfYear(mom, dow, doy) { + var weekOffset = firstWeekOffset(mom.year(), dow, doy), + week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, + resWeek, resYear; + + if (week < 1) { + resYear = mom.year() - 1; + resWeek = week + weeksInYear(resYear, dow, doy); + } else if (week > weeksInYear(mom.year(), dow, doy)) { + resWeek = week - weeksInYear(mom.year(), dow, doy); + resYear = mom.year() + 1; + } else { + resYear = mom.year(); + resWeek = week; + } + + return { + week: resWeek, + year: resYear + }; +} + +function weeksInYear(year, dow, doy) { + var weekOffset = firstWeekOffset(year, dow, doy), + weekOffsetNext = firstWeekOffset(year + 1, dow, doy); + return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; +} + +// FORMATTING + +addFormatToken('w', ['ww', 2], 'wo', 'week'); +addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); + +// ALIASES + +addUnitAlias('week', 'w'); +addUnitAlias('isoWeek', 'W'); + +// PRIORITIES + +addUnitPriority('week', 5); +addUnitPriority('isoWeek', 5); + +// PARSING + +addRegexToken('w', match1to2); +addRegexToken('ww', match1to2, match2); +addRegexToken('W', match1to2); +addRegexToken('WW', match1to2, match2); + +addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { + week[token.substr(0, 1)] = toInt(input); +}); + +// HELPERS + +// LOCALES + +function localeWeek (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; +} + +var defaultLocaleWeek = { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. +}; + +function localeFirstDayOfWeek () { + return this._week.dow; +} + +function localeFirstDayOfYear () { + return this._week.doy; +} + +// MOMENTS + +function getSetWeek (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); +} + +function getSetISOWeek (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); +} + +// FORMATTING + +addFormatToken('d', 0, 'do', 'day'); + +addFormatToken('dd', 0, 0, function (format) { + return this.localeData().weekdaysMin(this, format); +}); + +addFormatToken('ddd', 0, 0, function (format) { + return this.localeData().weekdaysShort(this, format); +}); + +addFormatToken('dddd', 0, 0, function (format) { + return this.localeData().weekdays(this, format); +}); + +addFormatToken('e', 0, 0, 'weekday'); +addFormatToken('E', 0, 0, 'isoWeekday'); + +// ALIASES + +addUnitAlias('day', 'd'); +addUnitAlias('weekday', 'e'); +addUnitAlias('isoWeekday', 'E'); + +// PRIORITY +addUnitPriority('day', 11); +addUnitPriority('weekday', 11); +addUnitPriority('isoWeekday', 11); + +// PARSING + +addRegexToken('d', match1to2); +addRegexToken('e', match1to2); +addRegexToken('E', match1to2); +addRegexToken('dd', function (isStrict, locale) { + return locale.weekdaysMinRegex(isStrict); +}); +addRegexToken('ddd', function (isStrict, locale) { + return locale.weekdaysShortRegex(isStrict); +}); +addRegexToken('dddd', function (isStrict, locale) { + return locale.weekdaysRegex(isStrict); +}); + +addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { + var weekday = config._locale.weekdaysParse(input, token, config._strict); + // if we didn't get a weekday name, mark the date as invalid + if (weekday != null) { + week.d = weekday; + } else { + getParsingFlags(config).invalidWeekday = input; + } +}); + +addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { + week[token] = toInt(input); +}); + +// HELPERS + +function parseWeekday(input, locale) { + if (typeof input !== 'string') { + return input; + } + + if (!isNaN(input)) { + return parseInt(input, 10); + } + + input = locale.weekdaysParse(input); + if (typeof input === 'number') { + return input; + } + + return null; +} + +function parseIsoWeekday(input, locale) { + if (typeof input === 'string') { + return locale.weekdaysParse(input) % 7 || 7; + } + return isNaN(input) ? null : input; +} + +// LOCALES + +var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); +function localeWeekdays (m, format) { + if (!m) { + return isArray(this._weekdays) ? this._weekdays : + this._weekdays['standalone']; + } + return isArray(this._weekdays) ? this._weekdays[m.day()] : + this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; +} + +var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); +function localeWeekdaysShort (m) { + return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; +} + +var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); +function localeWeekdaysMin (m) { + return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; +} + +function handleStrictParse$1(weekdayName, format, strict) { + var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._shortWeekdaysParse = []; + this._minWeekdaysParse = []; + + for (i = 0; i < 7; ++i) { + mom = createUTC([2000, 1]).day(i); + this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); + this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); + this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } +} + +function localeWeekdaysParse (weekdayName, format, strict) { + var i, mom, regex; + + if (this._weekdaysParseExact) { + return handleStrictParse$1.call(this, weekdayName, format, strict); + } + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._minWeekdaysParse = []; + this._shortWeekdaysParse = []; + this._fullWeekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + + mom = createUTC([2000, 1]).day(i); + if (strict && !this._fullWeekdaysParse[i]) { + this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i'); + this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i'); + this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i'); + } + if (!this._weekdaysParse[i]) { + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } +} + +// MOMENTS + +function getSetDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } +} + +function getSetLocaleDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); +} + +function getSetISODayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + + if (input != null) { + var weekday = parseIsoWeekday(input, this.localeData()); + return this.day(this.day() % 7 ? weekday : weekday - 7); + } else { + return this.day() || 7; + } +} + +var defaultWeekdaysRegex = matchWord; +function weekdaysRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysStrictRegex; + } else { + return this._weekdaysRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysRegex')) { + this._weekdaysRegex = defaultWeekdaysRegex; + } + return this._weekdaysStrictRegex && isStrict ? + this._weekdaysStrictRegex : this._weekdaysRegex; + } +} + +var defaultWeekdaysShortRegex = matchWord; +function weekdaysShortRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysShortStrictRegex; + } else { + return this._weekdaysShortRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysShortRegex')) { + this._weekdaysShortRegex = defaultWeekdaysShortRegex; + } + return this._weekdaysShortStrictRegex && isStrict ? + this._weekdaysShortStrictRegex : this._weekdaysShortRegex; + } +} + +var defaultWeekdaysMinRegex = matchWord; +function weekdaysMinRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysMinStrictRegex; + } else { + return this._weekdaysMinRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysMinRegex')) { + this._weekdaysMinRegex = defaultWeekdaysMinRegex; + } + return this._weekdaysMinStrictRegex && isStrict ? + this._weekdaysMinStrictRegex : this._weekdaysMinRegex; + } +} + + +function computeWeekdaysParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], + i, mom, minp, shortp, longp; + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, 1]).day(i); + minp = this.weekdaysMin(mom, ''); + shortp = this.weekdaysShort(mom, ''); + longp = this.weekdays(mom, ''); + minPieces.push(minp); + shortPieces.push(shortp); + longPieces.push(longp); + mixedPieces.push(minp); + mixedPieces.push(shortp); + mixedPieces.push(longp); + } + // Sorting makes sure if one weekday (or abbr) is a prefix of another it + // will match the longer piece. + minPieces.sort(cmpLenRev); + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 7; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._weekdaysShortRegex = this._weekdaysRegex; + this._weekdaysMinRegex = this._weekdaysRegex; + + this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); +} + +// FORMATTING + +function hFormat() { + return this.hours() % 12 || 12; +} + +function kFormat() { + return this.hours() || 24; +} + +addFormatToken('H', ['HH', 2], 0, 'hour'); +addFormatToken('h', ['hh', 2], 0, hFormat); +addFormatToken('k', ['kk', 2], 0, kFormat); + +addFormatToken('hmm', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); +}); + +addFormatToken('hmmss', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); +}); + +addFormatToken('Hmm', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2); +}); + +addFormatToken('Hmmss', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); +}); + +function meridiem (token, lowercase) { + addFormatToken(token, 0, 0, function () { + return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); + }); +} + +meridiem('a', true); +meridiem('A', false); + +// ALIASES + +addUnitAlias('hour', 'h'); + +// PRIORITY +addUnitPriority('hour', 13); + +// PARSING + +function matchMeridiem (isStrict, locale) { + return locale._meridiemParse; +} + +addRegexToken('a', matchMeridiem); +addRegexToken('A', matchMeridiem); +addRegexToken('H', match1to2); +addRegexToken('h', match1to2); +addRegexToken('k', match1to2); +addRegexToken('HH', match1to2, match2); +addRegexToken('hh', match1to2, match2); +addRegexToken('kk', match1to2, match2); + +addRegexToken('hmm', match3to4); +addRegexToken('hmmss', match5to6); +addRegexToken('Hmm', match3to4); +addRegexToken('Hmmss', match5to6); + +addParseToken(['H', 'HH'], HOUR); +addParseToken(['k', 'kk'], function (input, array, config) { + var kInput = toInt(input); + array[HOUR] = kInput === 24 ? 0 : kInput; +}); +addParseToken(['a', 'A'], function (input, array, config) { + config._isPm = config._locale.isPM(input); + config._meridiem = input; +}); +addParseToken(['h', 'hh'], function (input, array, config) { + array[HOUR] = toInt(input); + getParsingFlags(config).bigHour = true; +}); +addParseToken('hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + getParsingFlags(config).bigHour = true; +}); +addParseToken('hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + getParsingFlags(config).bigHour = true; +}); +addParseToken('Hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); +}); +addParseToken('Hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); +}); + +// LOCALES + +function localeIsPM (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); +} + +var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; +function localeMeridiem (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } +} + + +// MOMENTS + +// Setting the hour should keep the time, because the user explicitly +// specified which hour he wants. So trying to maintain the same hour (in +// a new timezone) makes sense. Adding/subtracting hours does not follow +// this rule. +var getSetHour = makeGetSet('Hours', true); + +// months +// week +// weekdays +// meridiem +var baseConfig = { + calendar: defaultCalendar, + longDateFormat: defaultLongDateFormat, + invalidDate: defaultInvalidDate, + ordinal: defaultOrdinal, + dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, + relativeTime: defaultRelativeTime, + + months: defaultLocaleMonths, + monthsShort: defaultLocaleMonthsShort, + + week: defaultLocaleWeek, + + weekdays: defaultLocaleWeekdays, + weekdaysMin: defaultLocaleWeekdaysMin, + weekdaysShort: defaultLocaleWeekdaysShort, + + meridiemParse: defaultLocaleMeridiemParse +}; + +// internal storage for locale config files +var locales = {}; +var localeFamilies = {}; +var globalLocale; + +function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; +} + +// pick the locale from the array +// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each +// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root +function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return null; +} + +function loadLocale(name) { + var oldLocale = null; + // TODO: Find a better way to register and load all the locales in Node + if (!locales[name] && (typeof module !== 'undefined') && + module && module.exports) { + try { + oldLocale = globalLocale._abbr; + var aliasedRequire = require; + aliasedRequire('./locale/' + name); + getSetGlobalLocale(oldLocale); + } catch (e) {} + } + return locales[name]; +} + +// This function will load locale and then set the global locale. If +// no arguments are passed in, it will simply return the current global +// locale key. +function getSetGlobalLocale (key, values) { + var data; + if (key) { + if (isUndefined(values)) { + data = getLocale(key); + } + else { + data = defineLocale(key, values); + } + + if (data) { + // moment.duration._locale = moment._locale = data; + globalLocale = data; + } + } + + return globalLocale._abbr; +} + +function defineLocale (name, config) { + if (config !== null) { + var parentConfig = baseConfig; + config.abbr = name; + if (locales[name] != null) { + deprecateSimple('defineLocaleOverride', + 'use moment.updateLocale(localeName, config) to change ' + + 'an existing locale. moment.defineLocale(localeName, ' + + 'config) should only be used for creating a new locale ' + + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); + parentConfig = locales[name]._config; + } else if (config.parentLocale != null) { + if (locales[config.parentLocale] != null) { + parentConfig = locales[config.parentLocale]._config; + } else { + if (!localeFamilies[config.parentLocale]) { + localeFamilies[config.parentLocale] = []; + } + localeFamilies[config.parentLocale].push({ + name: name, + config: config + }); + return null; + } + } + locales[name] = new Locale(mergeConfigs(parentConfig, config)); + + if (localeFamilies[name]) { + localeFamilies[name].forEach(function (x) { + defineLocale(x.name, x.config); + }); + } + + // backwards compat for now: also set the locale + // make sure we set the locale AFTER all child locales have been + // created, so we won't end up with the child locale set. + getSetGlobalLocale(name); + + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } +} + +function updateLocale(name, config) { + if (config != null) { + var locale, tmpLocale, parentConfig = baseConfig; + // MERGE + tmpLocale = loadLocale(name); + if (tmpLocale != null) { + parentConfig = tmpLocale._config; + } + config = mergeConfigs(parentConfig, config); + locale = new Locale(config); + locale.parentLocale = locales[name]; + locales[name] = locale; + + // backwards compat for now: also set the locale + getSetGlobalLocale(name); + } else { + // pass null for config to unupdate, useful for tests + if (locales[name] != null) { + if (locales[name].parentLocale != null) { + locales[name] = locales[name].parentLocale; + } else if (locales[name] != null) { + delete locales[name]; + } + } + } + return locales[name]; +} + +// returns locale data +function getLocale (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return globalLocale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); +} + +function listLocales() { + return keys(locales); +} + +function checkOverflow (m) { + var overflow; + var a = m._a; + + if (a && getParsingFlags(m).overflow === -2) { + overflow = + a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : + a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : + a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : + a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : + a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : + a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { + overflow = WEEK; + } + if (getParsingFlags(m)._overflowWeekday && overflow === -1) { + overflow = WEEKDAY; + } + + getParsingFlags(m).overflow = overflow; + } + + return m; +} + +// Pick the first defined of two or three arguments. +function defaults(a, b, c) { + if (a != null) { + return a; + } + if (b != null) { + return b; + } + return c; +} + +function currentDateArray(config) { + // hooks is actually the exported moment object + var nowValue = new Date(hooks.now()); + if (config._useUTC) { + return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; + } + return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; +} + +// convert an array to a date. +// the array should mirror the parameters below +// note: all values past the year are optional and will default to the lowest possible value. +// [year, month, day , hour, minute, second, millisecond] +function configFromArray (config) { + var i, date, input = [], currentDate, expectedWeekday, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear != null) { + yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { + getParsingFlags(config)._overflowDayOfYear = true; + } + + date = createUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); + expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); + + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + + // check for mismatching day of week + if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { + getParsingFlags(config).weekdayMismatch = true; + } +} + +function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); + week = defaults(w.W, 1); + weekday = defaults(w.E, 1); + if (weekday < 1 || weekday > 7) { + weekdayOverflow = true; + } + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + var curWeek = weekOfYear(createLocal(), dow, doy); + + weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); + + // Default to current week. + week = defaults(w.w, curWeek.week); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < 0 || weekday > 6) { + weekdayOverflow = true; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + if (w.e < 0 || w.e > 6) { + weekdayOverflow = true; + } + } else { + // default to begining of week + weekday = dow; + } + } + if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { + getParsingFlags(config)._overflowWeeks = true; + } else if (weekdayOverflow != null) { + getParsingFlags(config)._overflowWeekday = true; + } else { + temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } +} + +// iso 8601 regex +// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) +var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; +var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; + +var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; + +var isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], + ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], + ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], + ['GGGG-[W]WW', /\d{4}-W\d\d/, false], + ['YYYY-DDD', /\d{4}-\d{3}/], + ['YYYY-MM', /\d{4}-\d\d/, false], + ['YYYYYYMMDD', /[+-]\d{10}/], + ['YYYYMMDD', /\d{8}/], + // YYYYMM is NOT allowed by the standard + ['GGGG[W]WWE', /\d{4}W\d{3}/], + ['GGGG[W]WW', /\d{4}W\d{2}/, false], + ['YYYYDDD', /\d{7}/] +]; + +// iso time formats and regexes +var isoTimes = [ + ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], + ['HH:mm:ss', /\d\d:\d\d:\d\d/], + ['HH:mm', /\d\d:\d\d/], + ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], + ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], + ['HHmmss', /\d\d\d\d\d\d/], + ['HHmm', /\d\d\d\d/], + ['HH', /\d\d/] +]; + +var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; + +// date from iso format +function configFromISO(config) { + var i, l, + string = config._i, + match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), + allowTime, dateFormat, timeFormat, tzFormat; + + if (match) { + getParsingFlags(config).iso = true; + + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(match[1])) { + dateFormat = isoDates[i][0]; + allowTime = isoDates[i][2] !== false; + break; + } + } + if (dateFormat == null) { + config._isValid = false; + return; + } + if (match[3]) { + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(match[3])) { + // match[2] should be 'T' or space + timeFormat = (match[2] || ' ') + isoTimes[i][0]; + break; + } + } + if (timeFormat == null) { + config._isValid = false; + return; + } + } + if (!allowTime && timeFormat != null) { + config._isValid = false; + return; + } + if (match[4]) { + if (tzRegex.exec(match[4])) { + tzFormat = 'Z'; + } else { + config._isValid = false; + return; + } + } + config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); + configFromStringAndFormat(config); + } else { + config._isValid = false; + } +} + +// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 +var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; + +function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = [ + untruncateYear(yearStr), + defaultLocaleMonthsShort.indexOf(monthStr), + parseInt(dayStr, 10), + parseInt(hourStr, 10), + parseInt(minuteStr, 10) + ]; + + if (secondStr) { + result.push(parseInt(secondStr, 10)); + } + + return result; +} + +function untruncateYear(yearStr) { + var year = parseInt(yearStr, 10); + if (year <= 49) { + return 2000 + year; + } else if (year <= 999) { + return 1900 + year; + } + return year; +} + +function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').trim(); +} + +function checkWeekday(weekdayStr, parsedInput, config) { + if (weekdayStr) { + // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. + var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), + weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); + if (weekdayProvided !== weekdayActual) { + getParsingFlags(config).weekdayMismatch = true; + config._isValid = false; + return false; + } + } + return true; +} + +var obsOffsets = { + UT: 0, + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 +}; + +function calculateOffset(obsOffset, militaryOffset, numOffset) { + if (obsOffset) { + return obsOffsets[obsOffset]; + } else if (militaryOffset) { + // the only allowed military tz is Z + return 0; + } else { + var hm = parseInt(numOffset, 10); + var m = hm % 100, h = (hm - m) / 100; + return h * 60 + m; + } +} + +// date and time from ref 2822 format +function configFromRFC2822(config) { + var match = rfc2822.exec(preprocessRFC2822(config._i)); + if (match) { + var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); + if (!checkWeekday(match[1], parsedArray, config)) { + return; + } + + config._a = parsedArray; + config._tzm = calculateOffset(match[8], match[9], match[10]); + + config._d = createUTCDate.apply(null, config._a); + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + + getParsingFlags(config).rfc2822 = true; + } else { + config._isValid = false; + } +} + +// date from iso format or fallback +function configFromString(config) { + var matched = aspNetJsonRegex.exec(config._i); + + if (matched !== null) { + config._d = new Date(+matched[1]); + return; + } + + configFromISO(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } + + configFromRFC2822(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } + + // Final attempt, use Input Fallback + hooks.createFromInputFallback(config); +} + +hooks.createFromInputFallback = deprecate( + 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + + 'discouraged and will be removed in an upcoming major release. Please refer to ' + + 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } +); + +// constant that refers to the ISO standard +hooks.ISO_8601 = function () {}; + +// constant that refers to the RFC 2822 form +hooks.RFC_2822 = function () {}; + +// date from string and format string +function configFromStringAndFormat(config) { + // TODO: Move this to another part of the creation flow to prevent circular deps + if (config._f === hooks.ISO_8601) { + configFromISO(config); + return; + } + if (config._f === hooks.RFC_2822) { + configFromRFC2822(config); + return; + } + config._a = []; + getParsingFlags(config).empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + // console.log('token', token, 'parsedInput', parsedInput, + // 'regex', getParseRegexForToken(token, config)); + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + getParsingFlags(config).unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + getParsingFlags(config).empty = false; + } + else { + getParsingFlags(config).unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + getParsingFlags(config).unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + getParsingFlags(config).unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (config._a[HOUR] <= 12 && + getParsingFlags(config).bigHour === true && + config._a[HOUR] > 0) { + getParsingFlags(config).bigHour = undefined; + } + + getParsingFlags(config).parsedDateParts = config._a.slice(0); + getParsingFlags(config).meridiem = config._meridiem; + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); + + configFromArray(config); + checkOverflow(config); +} + + +function meridiemFixWrap (locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // this is not supposed to happen + return hour; + } +} + +// date from string and array of format strings +function configFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + getParsingFlags(config).invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._f = config._f[i]; + configFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += getParsingFlags(tempConfig).charsLeftOver; + + //or tokens + currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; + + getParsingFlags(tempConfig).score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); +} + +function configFromObject(config) { + if (config._d) { + return; + } + + var i = normalizeObjectUnits(config._i); + config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { + return obj && parseInt(obj, 10); + }); + + configFromArray(config); +} + +function createFromConfig (config) { + var res = new Moment(checkOverflow(prepareConfig(config))); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; +} + +function prepareConfig (config) { + var input = config._i, + format = config._f; + + config._locale = config._locale || getLocale(config._l); + + if (input === null || (format === undefined && input === '')) { + return createInvalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (isMoment(input)) { + return new Moment(checkOverflow(input)); + } else if (isDate(input)) { + config._d = input; + } else if (isArray(format)) { + configFromStringAndArray(config); + } else if (format) { + configFromStringAndFormat(config); + } else { + configFromInput(config); + } + + if (!isValid(config)) { + config._d = null; + } + + return config; +} + +function configFromInput(config) { + var input = config._i; + if (isUndefined(input)) { + config._d = new Date(hooks.now()); + } else if (isDate(input)) { + config._d = new Date(input.valueOf()); + } else if (typeof input === 'string') { + configFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + configFromArray(config); + } else if (isObject(input)) { + configFromObject(config); + } else if (isNumber(input)) { + // from milliseconds + config._d = new Date(input); + } else { + hooks.createFromInputFallback(config); + } +} + +function createLocalOrUTC (input, format, locale, strict, isUTC) { + var c = {}; + + if (locale === true || locale === false) { + strict = locale; + locale = undefined; + } + + if ((isObject(input) && isObjectEmpty(input)) || + (isArray(input) && input.length === 0)) { + input = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c._isAMomentObject = true; + c._useUTC = c._isUTC = isUTC; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + + return createFromConfig(c); +} + +function createLocal (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, false); +} + +var prototypeMin = deprecate( + 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other < this ? this : other; + } else { + return createInvalid(); + } + } +); + +var prototypeMax = deprecate( + 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other > this ? this : other; + } else { + return createInvalid(); + } + } +); + +// Pick a moment m from moments so that m[fn](other) is true for all +// other. This relies on the function fn to be transitive. +// +// moments should either be an array of moment objects or an array, whose +// first element is an array of moment objects. +function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return createLocal(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (!moments[i].isValid() || moments[i][fn](res)) { + res = moments[i]; + } + } + return res; +} + +// TODO: Use [].sort instead? +function min () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); +} + +function max () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); +} + +var now = function () { + return Date.now ? Date.now() : +(new Date()); +}; + +var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; + +function isDurationValid(m) { + for (var key in m) { + if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { + return false; + } + } + + var unitHasDecimal = false; + for (var i = 0; i < ordering.length; ++i) { + if (m[ordering[i]]) { + if (unitHasDecimal) { + return false; // only allow non-integers for smallest unit + } + if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { + unitHasDecimal = true; + } + } + } + + return true; +} + +function isValid$1() { + return this._isValid; +} + +function createInvalid$1() { + return createDuration(NaN); +} + +function Duration (duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + this._isValid = isDurationValid(normalizedInput); + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible to translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = getLocale(); + + this._bubble(); +} + +function isDuration (obj) { + return obj instanceof Duration; +} + +function absRound (number) { + if (number < 0) { + return Math.round(-1 * number) * -1; + } else { + return Math.round(number); + } +} + +// FORMATTING + +function offset (token, separator) { + addFormatToken(token, 0, 0, function () { + var offset = this.utcOffset(); + var sign = '+'; + if (offset < 0) { + offset = -offset; + sign = '-'; + } + return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); + }); +} + +offset('Z', ':'); +offset('ZZ', ''); + +// PARSING + +addRegexToken('Z', matchShortOffset); +addRegexToken('ZZ', matchShortOffset); +addParseToken(['Z', 'ZZ'], function (input, array, config) { + config._useUTC = true; + config._tzm = offsetFromString(matchShortOffset, input); +}); + +// HELPERS + +// timezone chunker +// '+10:00' > ['10', '00'] +// '-1530' > ['-15', '30'] +var chunkOffset = /([\+\-]|\d\d)/gi; + +function offsetFromString(matcher, string) { + var matches = (string || '').match(matcher); + + if (matches === null) { + return null; + } + + var chunk = matches[matches.length - 1] || []; + var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; + var minutes = +(parts[1] * 60) + toInt(parts[2]); + + return minutes === 0 ? + 0 : + parts[0] === '+' ? minutes : -minutes; +} + +// Return a moment from input, that is local/utc/zone equivalent to model. +function cloneWithOffset(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); + // Use low-level api, because this fn is low-level api. + res._d.setTime(res._d.valueOf() + diff); + hooks.updateOffset(res, false); + return res; + } else { + return createLocal(input).local(); + } +} + +function getDateOffset (m) { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(m._d.getTimezoneOffset() / 15) * 15; +} + +// HOOKS + +// This function will be called whenever a moment is mutated. +// It is intended to keep the offset in sync with the timezone. +hooks.updateOffset = function () {}; + +// MOMENTS + +// keepLocalTime = true means only change the timezone, without +// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> +// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset +// +0200, so we adjust the time as needed, to be valid. +// +// Keeping the time actually adds/subtracts (one hour) +// from the actual represented time. That is why we call updateOffset +// a second time. In case it wants us to change the offset again +// _changeInProgress == true case, then we have to adjust, because +// there is no such time in the given timezone. +function getSetOffset (input, keepLocalTime, keepMinutes) { + var offset = this._offset || 0, + localAdjust; + if (!this.isValid()) { + return input != null ? this : NaN; + } + if (input != null) { + if (typeof input === 'string') { + input = offsetFromString(matchShortOffset, input); + if (input === null) { + return this; + } + } else if (Math.abs(input) < 16 && !keepMinutes) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = getDateOffset(this); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addSubtract(this, createDuration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + hooks.updateOffset(this, true); + this._changeInProgress = null; + } + } + return this; + } else { + return this._isUTC ? offset : getDateOffset(this); + } +} + +function getSetZone (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } +} + +function setOffsetToUTC (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); +} + +function setOffsetToLocal (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(getDateOffset(this), 'm'); + } + } + return this; +} + +function setOffsetToParsedOffset () { + if (this._tzm != null) { + this.utcOffset(this._tzm, false, true); + } else if (typeof this._i === 'string') { + var tZone = offsetFromString(matchOffset, this._i); + if (tZone != null) { + this.utcOffset(tZone); + } + else { + this.utcOffset(0, true); + } + } + return this; +} + +function hasAlignedHourOffset (input) { + if (!this.isValid()) { + return false; + } + input = input ? createLocal(input).utcOffset() : 0; + + return (this.utcOffset() - input) % 60 === 0; +} + +function isDaylightSavingTime () { + return ( + this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset() + ); +} + +function isDaylightSavingTimeShifted () { + if (!isUndefined(this._isDSTShifted)) { + return this._isDSTShifted; + } + + var c = {}; + + copyConfig(c, this); + c = prepareConfig(c); + + if (c._a) { + var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); + this._isDSTShifted = this.isValid() && + compareArrays(c._a, other.toArray()) > 0; + } else { + this._isDSTShifted = false; + } + + return this._isDSTShifted; +} + +function isLocal () { + return this.isValid() ? !this._isUTC : false; +} + +function isUtcOffset () { + return this.isValid() ? this._isUTC : false; +} + +function isUtc () { + return this.isValid() ? this._isUTC && this._offset === 0 : false; +} + +// ASP.NET json date format regex +var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; + +// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html +// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere +// and further modified to allow for strings containing both week and day +var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; + +function createDuration (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + diffRes; + + if (isDuration(input)) { + duration = { + ms : input._milliseconds, + d : input._days, + M : input._months + }; + } else if (isNumber(input)) { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y : 0, + d : toInt(match[DATE]) * sign, + h : toInt(match[HOUR]) * sign, + m : toInt(match[MINUTE]) * sign, + s : toInt(match[SECOND]) * sign, + ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match + }; + } else if (!!(match = isoRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1; + duration = { + y : parseIso(match[2], sign), + M : parseIso(match[3], sign), + w : parseIso(match[4], sign), + d : parseIso(match[5], sign), + h : parseIso(match[6], sign), + m : parseIso(match[7], sign), + s : parseIso(match[8], sign) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; +} + +createDuration.fn = Duration.prototype; +createDuration.invalid = createInvalid$1; + +function parseIso (inp, sign) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; +} + +function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; +} + +function momentsDifference(base, other) { + var res; + if (!(base.isValid() && other.isValid())) { + return {milliseconds: 0, months: 0}; + } + + other = cloneWithOffset(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; +} + +// TODO: remove 'name' arg after deprecation is removed +function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = createDuration(val, period); + addSubtract(this, dur, direction); + return this; + }; +} + +function addSubtract (mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = absRound(duration._days), + months = absRound(duration._months); + + if (!mom.isValid()) { + // No op + return; + } + + updateOffset = updateOffset == null ? true : updateOffset; + + if (months) { + setMonth(mom, get(mom, 'Month') + months * isAdding); + } + if (days) { + set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); + } + if (milliseconds) { + mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); + } + if (updateOffset) { + hooks.updateOffset(mom, days || months); + } +} + +var add = createAdder(1, 'add'); +var subtract = createAdder(-1, 'subtract'); + +function getCalendarFormat(myMoment, now) { + var diff = myMoment.diff(now, 'days', true); + return diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; +} + +function calendar$1 (time, formats) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're local/utc/offset or not. + var now = time || createLocal(), + sod = cloneWithOffset(now, this).startOf('day'), + format = hooks.calendarFormat(this, sod) || 'sameElse'; + + var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); + + return this.format(output || this.localeData().calendar(format, this, createLocal(now))); +} + +function clone () { + return new Moment(this); +} + +function isAfter (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() > localInput.valueOf(); + } else { + return localInput.valueOf() < this.clone().startOf(units).valueOf(); + } +} + +function isBefore (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() < localInput.valueOf(); + } else { + return this.clone().endOf(units).valueOf() < localInput.valueOf(); + } +} + +function isBetween (from, to, units, inclusivity) { + inclusivity = inclusivity || '()'; + return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && + (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); +} + +function isSame (input, units) { + var localInput = isMoment(input) ? input : createLocal(input), + inputMs; + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() === localInput.valueOf(); + } else { + inputMs = localInput.valueOf(); + return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); + } +} + +function isSameOrAfter (input, units) { + return this.isSame(input, units) || this.isAfter(input,units); +} + +function isSameOrBefore (input, units) { + return this.isSame(input, units) || this.isBefore(input,units); +} + +function diff (input, units, asFloat) { + var that, + zoneDelta, + delta, output; + + if (!this.isValid()) { + return NaN; + } + + that = cloneWithOffset(input, this); + + if (!that.isValid()) { + return NaN; + } + + zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; + + units = normalizeUnits(units); + + switch (units) { + case 'year': output = monthDiff(this, that) / 12; break; + case 'month': output = monthDiff(this, that); break; + case 'quarter': output = monthDiff(this, that) / 3; break; + case 'second': output = (this - that) / 1e3; break; // 1000 + case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 + case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 + case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst + case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst + default: output = this - that; + } + + return asFloat ? output : absFloor(output); +} + +function monthDiff (a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + //check for negative zero, return zero if negative zero + return -(wholeMonthDiff + adjust) || 0; +} + +hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; +hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; + +function toString () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); +} + +function toISOString() { + if (!this.isValid()) { + return null; + } + var m = this.clone().utc(); + if (m.year() < 0 || m.year() > 9999) { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + if (isFunction(Date.prototype.toISOString)) { + // native implementation is ~50x faster, use it when we can + return this.toDate().toISOString(); + } + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); +} + +/** + * Return a human readable representation of a moment that can + * also be evaluated to get a new moment which is the same + * + * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects + */ +function inspect () { + if (!this.isValid()) { + return 'moment.invalid(/* ' + this._i + ' */)'; + } + var func = 'moment'; + var zone = ''; + if (!this.isLocal()) { + func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; + zone = 'Z'; + } + var prefix = '[' + func + '("]'; + var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; + var datetime = '-MM-DD[T]HH:mm:ss.SSS'; + var suffix = zone + '[")]'; + + return this.format(prefix + year + datetime + suffix); +} + +function format (inputString) { + if (!inputString) { + inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; + } + var output = formatMoment(this, inputString); + return this.localeData().postformat(output); +} + +function from (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } +} + +function fromNow (withoutSuffix) { + return this.from(createLocal(), withoutSuffix); +} + +function to (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } +} + +function toNow (withoutSuffix) { + return this.to(createLocal(), withoutSuffix); +} + +// If passed a locale key, it will set the locale for this +// instance. Otherwise, it will return the locale configuration +// variables for this instance. +function locale (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = getLocale(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } +} + +var lang = deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } +); + +function localeData () { + return this._locale; +} + +function startOf (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + case 'date': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } + if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; +} + +function endOf (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + + // 'date' is an alias for 'day', so it should be considered as such. + if (units === 'date') { + units = 'day'; + } + + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); +} + +function valueOf () { + return this._d.valueOf() - ((this._offset || 0) * 60000); +} + +function unix () { + return Math.floor(this.valueOf() / 1000); +} + +function toDate () { + return new Date(this.valueOf()); +} + +function toArray () { + var m = this; + return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; +} + +function toObject () { + var m = this; + return { + years: m.year(), + months: m.month(), + date: m.date(), + hours: m.hours(), + minutes: m.minutes(), + seconds: m.seconds(), + milliseconds: m.milliseconds() + }; +} + +function toJSON () { + // new Date(NaN).toJSON() === null + return this.isValid() ? this.toISOString() : null; +} + +function isValid$2 () { + return isValid(this); +} + +function parsingFlags () { + return extend({}, getParsingFlags(this)); +} + +function invalidAt () { + return getParsingFlags(this).overflow; +} + +function creationData() { + return { + input: this._i, + format: this._f, + locale: this._locale, + isUTC: this._isUTC, + strict: this._strict + }; +} + +// FORMATTING + +addFormatToken(0, ['gg', 2], 0, function () { + return this.weekYear() % 100; +}); + +addFormatToken(0, ['GG', 2], 0, function () { + return this.isoWeekYear() % 100; +}); + +function addWeekYearFormatToken (token, getter) { + addFormatToken(0, [token, token.length], 0, getter); +} + +addWeekYearFormatToken('gggg', 'weekYear'); +addWeekYearFormatToken('ggggg', 'weekYear'); +addWeekYearFormatToken('GGGG', 'isoWeekYear'); +addWeekYearFormatToken('GGGGG', 'isoWeekYear'); + +// ALIASES + +addUnitAlias('weekYear', 'gg'); +addUnitAlias('isoWeekYear', 'GG'); + +// PRIORITY + +addUnitPriority('weekYear', 1); +addUnitPriority('isoWeekYear', 1); + + +// PARSING + +addRegexToken('G', matchSigned); +addRegexToken('g', matchSigned); +addRegexToken('GG', match1to2, match2); +addRegexToken('gg', match1to2, match2); +addRegexToken('GGGG', match1to4, match4); +addRegexToken('gggg', match1to4, match4); +addRegexToken('GGGGG', match1to6, match6); +addRegexToken('ggggg', match1to6, match6); + +addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { + week[token.substr(0, 2)] = toInt(input); +}); + +addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { + week[token] = hooks.parseTwoDigitYear(input); +}); + +// MOMENTS + +function getSetWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, + this.week(), + this.weekday(), + this.localeData()._week.dow, + this.localeData()._week.doy); +} + +function getSetISOWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, this.isoWeek(), this.isoWeekday(), 1, 4); +} + +function getISOWeeksInYear () { + return weeksInYear(this.year(), 1, 4); +} + +function getWeeksInYear () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); +} + +function getSetWeekYearHelper(input, week, weekday, dow, doy) { + var weeksTarget; + if (input == null) { + return weekOfYear(this, dow, doy).year; + } else { + weeksTarget = weeksInYear(input, dow, doy); + if (week > weeksTarget) { + week = weeksTarget; + } + return setWeekAll.call(this, input, week, weekday, dow, doy); + } +} + +function setWeekAll(weekYear, week, weekday, dow, doy) { + var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), + date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); + + this.year(date.getUTCFullYear()); + this.month(date.getUTCMonth()); + this.date(date.getUTCDate()); + return this; +} + +// FORMATTING + +addFormatToken('Q', 0, 'Qo', 'quarter'); + +// ALIASES + +addUnitAlias('quarter', 'Q'); + +// PRIORITY + +addUnitPriority('quarter', 7); + +// PARSING + +addRegexToken('Q', match1); +addParseToken('Q', function (input, array) { + array[MONTH] = (toInt(input) - 1) * 3; +}); + +// MOMENTS + +function getSetQuarter (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); +} + +// FORMATTING + +addFormatToken('D', ['DD', 2], 'Do', 'date'); + +// ALIASES + +addUnitAlias('date', 'D'); + +// PRIOROITY +addUnitPriority('date', 9); + +// PARSING + +addRegexToken('D', match1to2); +addRegexToken('DD', match1to2, match2); +addRegexToken('Do', function (isStrict, locale) { + // TODO: Remove "ordinalParse" fallback in next major release. + return isStrict ? + (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : + locale._dayOfMonthOrdinalParseLenient; +}); + +addParseToken(['D', 'DD'], DATE); +addParseToken('Do', function (input, array) { + array[DATE] = toInt(input.match(match1to2)[0]); +}); + +// MOMENTS + +var getSetDayOfMonth = makeGetSet('Date', true); + +// FORMATTING + +addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); + +// ALIASES + +addUnitAlias('dayOfYear', 'DDD'); + +// PRIORITY +addUnitPriority('dayOfYear', 4); + +// PARSING + +addRegexToken('DDD', match1to3); +addRegexToken('DDDD', match3); +addParseToken(['DDD', 'DDDD'], function (input, array, config) { + config._dayOfYear = toInt(input); +}); + +// HELPERS + +// MOMENTS + +function getSetDayOfYear (input) { + var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); +} + +// FORMATTING + +addFormatToken('m', ['mm', 2], 0, 'minute'); + +// ALIASES + +addUnitAlias('minute', 'm'); + +// PRIORITY + +addUnitPriority('minute', 14); + +// PARSING + +addRegexToken('m', match1to2); +addRegexToken('mm', match1to2, match2); +addParseToken(['m', 'mm'], MINUTE); + +// MOMENTS + +var getSetMinute = makeGetSet('Minutes', false); + +// FORMATTING + +addFormatToken('s', ['ss', 2], 0, 'second'); + +// ALIASES + +addUnitAlias('second', 's'); + +// PRIORITY + +addUnitPriority('second', 15); + +// PARSING + +addRegexToken('s', match1to2); +addRegexToken('ss', match1to2, match2); +addParseToken(['s', 'ss'], SECOND); + +// MOMENTS + +var getSetSecond = makeGetSet('Seconds', false); + +// FORMATTING + +addFormatToken('S', 0, 0, function () { + return ~~(this.millisecond() / 100); +}); + +addFormatToken(0, ['SS', 2], 0, function () { + return ~~(this.millisecond() / 10); +}); + +addFormatToken(0, ['SSS', 3], 0, 'millisecond'); +addFormatToken(0, ['SSSS', 4], 0, function () { + return this.millisecond() * 10; +}); +addFormatToken(0, ['SSSSS', 5], 0, function () { + return this.millisecond() * 100; +}); +addFormatToken(0, ['SSSSSS', 6], 0, function () { + return this.millisecond() * 1000; +}); +addFormatToken(0, ['SSSSSSS', 7], 0, function () { + return this.millisecond() * 10000; +}); +addFormatToken(0, ['SSSSSSSS', 8], 0, function () { + return this.millisecond() * 100000; +}); +addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { + return this.millisecond() * 1000000; +}); + + +// ALIASES + +addUnitAlias('millisecond', 'ms'); + +// PRIORITY + +addUnitPriority('millisecond', 16); + +// PARSING + +addRegexToken('S', match1to3, match1); +addRegexToken('SS', match1to3, match2); +addRegexToken('SSS', match1to3, match3); + +var token; +for (token = 'SSSS'; token.length <= 9; token += 'S') { + addRegexToken(token, matchUnsigned); +} + +function parseMs(input, array) { + array[MILLISECOND] = toInt(('0.' + input) * 1000); +} + +for (token = 'S'; token.length <= 9; token += 'S') { + addParseToken(token, parseMs); +} +// MOMENTS + +var getSetMillisecond = makeGetSet('Milliseconds', false); + +// FORMATTING + +addFormatToken('z', 0, 0, 'zoneAbbr'); +addFormatToken('zz', 0, 0, 'zoneName'); + +// MOMENTS + +function getZoneAbbr () { + return this._isUTC ? 'UTC' : ''; +} + +function getZoneName () { + return this._isUTC ? 'Coordinated Universal Time' : ''; +} + +var proto = Moment.prototype; + +proto.add = add; +proto.calendar = calendar$1; +proto.clone = clone; +proto.diff = diff; +proto.endOf = endOf; +proto.format = format; +proto.from = from; +proto.fromNow = fromNow; +proto.to = to; +proto.toNow = toNow; +proto.get = stringGet; +proto.invalidAt = invalidAt; +proto.isAfter = isAfter; +proto.isBefore = isBefore; +proto.isBetween = isBetween; +proto.isSame = isSame; +proto.isSameOrAfter = isSameOrAfter; +proto.isSameOrBefore = isSameOrBefore; +proto.isValid = isValid$2; +proto.lang = lang; +proto.locale = locale; +proto.localeData = localeData; +proto.max = prototypeMax; +proto.min = prototypeMin; +proto.parsingFlags = parsingFlags; +proto.set = stringSet; +proto.startOf = startOf; +proto.subtract = subtract; +proto.toArray = toArray; +proto.toObject = toObject; +proto.toDate = toDate; +proto.toISOString = toISOString; +proto.inspect = inspect; +proto.toJSON = toJSON; +proto.toString = toString; +proto.unix = unix; +proto.valueOf = valueOf; +proto.creationData = creationData; + +// Year +proto.year = getSetYear; +proto.isLeapYear = getIsLeapYear; + +// Week Year +proto.weekYear = getSetWeekYear; +proto.isoWeekYear = getSetISOWeekYear; + +// Quarter +proto.quarter = proto.quarters = getSetQuarter; + +// Month +proto.month = getSetMonth; +proto.daysInMonth = getDaysInMonth; + +// Week +proto.week = proto.weeks = getSetWeek; +proto.isoWeek = proto.isoWeeks = getSetISOWeek; +proto.weeksInYear = getWeeksInYear; +proto.isoWeeksInYear = getISOWeeksInYear; + +// Day +proto.date = getSetDayOfMonth; +proto.day = proto.days = getSetDayOfWeek; +proto.weekday = getSetLocaleDayOfWeek; +proto.isoWeekday = getSetISODayOfWeek; +proto.dayOfYear = getSetDayOfYear; + +// Hour +proto.hour = proto.hours = getSetHour; + +// Minute +proto.minute = proto.minutes = getSetMinute; + +// Second +proto.second = proto.seconds = getSetSecond; + +// Millisecond +proto.millisecond = proto.milliseconds = getSetMillisecond; + +// Offset +proto.utcOffset = getSetOffset; +proto.utc = setOffsetToUTC; +proto.local = setOffsetToLocal; +proto.parseZone = setOffsetToParsedOffset; +proto.hasAlignedHourOffset = hasAlignedHourOffset; +proto.isDST = isDaylightSavingTime; +proto.isLocal = isLocal; +proto.isUtcOffset = isUtcOffset; +proto.isUtc = isUtc; +proto.isUTC = isUtc; + +// Timezone +proto.zoneAbbr = getZoneAbbr; +proto.zoneName = getZoneName; + +// Deprecations +proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); +proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); +proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); +proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); +proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); + +function createUnix (input) { + return createLocal(input * 1000); +} + +function createInZone () { + return createLocal.apply(null, arguments).parseZone(); +} + +function preParsePostFormat (string) { + return string; +} + +var proto$1 = Locale.prototype; + +proto$1.calendar = calendar; +proto$1.longDateFormat = longDateFormat; +proto$1.invalidDate = invalidDate; +proto$1.ordinal = ordinal; +proto$1.preparse = preParsePostFormat; +proto$1.postformat = preParsePostFormat; +proto$1.relativeTime = relativeTime; +proto$1.pastFuture = pastFuture; +proto$1.set = set; + +// Month +proto$1.months = localeMonths; +proto$1.monthsShort = localeMonthsShort; +proto$1.monthsParse = localeMonthsParse; +proto$1.monthsRegex = monthsRegex; +proto$1.monthsShortRegex = monthsShortRegex; + +// Week +proto$1.week = localeWeek; +proto$1.firstDayOfYear = localeFirstDayOfYear; +proto$1.firstDayOfWeek = localeFirstDayOfWeek; + +// Day of Week +proto$1.weekdays = localeWeekdays; +proto$1.weekdaysMin = localeWeekdaysMin; +proto$1.weekdaysShort = localeWeekdaysShort; +proto$1.weekdaysParse = localeWeekdaysParse; + +proto$1.weekdaysRegex = weekdaysRegex; +proto$1.weekdaysShortRegex = weekdaysShortRegex; +proto$1.weekdaysMinRegex = weekdaysMinRegex; + +// Hours +proto$1.isPM = localeIsPM; +proto$1.meridiem = localeMeridiem; + +function get$1 (format, index, field, setter) { + var locale = getLocale(); + var utc = createUTC().set(setter, index); + return locale[field](utc, format); +} + +function listMonthsImpl (format, index, field) { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + + if (index != null) { + return get$1(format, index, field, 'month'); + } + + var i; + var out = []; + for (i = 0; i < 12; i++) { + out[i] = get$1(format, i, field, 'month'); + } + return out; +} + +// () +// (5) +// (fmt, 5) +// (fmt) +// (true) +// (true, 5) +// (true, fmt, 5) +// (true, fmt) +function listWeekdaysImpl (localeSorted, format, index, field) { + if (typeof localeSorted === 'boolean') { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } else { + format = localeSorted; + index = format; + localeSorted = false; + + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } + + var locale = getLocale(), + shift = localeSorted ? locale._week.dow : 0; + + if (index != null) { + return get$1(format, (index + shift) % 7, field, 'day'); + } + + var i; + var out = []; + for (i = 0; i < 7; i++) { + out[i] = get$1(format, (i + shift) % 7, field, 'day'); + } + return out; +} + +function listMonths (format, index) { + return listMonthsImpl(format, index, 'months'); +} + +function listMonthsShort (format, index) { + return listMonthsImpl(format, index, 'monthsShort'); +} + +function listWeekdays (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); +} + +function listWeekdaysShort (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); +} + +function listWeekdaysMin (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); +} + +getSetGlobalLocale('en', { + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } +}); + +// Side effect imports +hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); +hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); + +var mathAbs = Math.abs; + +function abs () { + var data = this._data; + + this._milliseconds = mathAbs(this._milliseconds); + this._days = mathAbs(this._days); + this._months = mathAbs(this._months); + + data.milliseconds = mathAbs(data.milliseconds); + data.seconds = mathAbs(data.seconds); + data.minutes = mathAbs(data.minutes); + data.hours = mathAbs(data.hours); + data.months = mathAbs(data.months); + data.years = mathAbs(data.years); + + return this; +} + +function addSubtract$1 (duration, input, value, direction) { + var other = createDuration(input, value); + + duration._milliseconds += direction * other._milliseconds; + duration._days += direction * other._days; + duration._months += direction * other._months; + + return duration._bubble(); +} + +// supports only 2.0-style add(1, 's') or add(duration) +function add$1 (input, value) { + return addSubtract$1(this, input, value, 1); +} + +// supports only 2.0-style subtract(1, 's') or subtract(duration) +function subtract$1 (input, value) { + return addSubtract$1(this, input, value, -1); +} + +function absCeil (number) { + if (number < 0) { + return Math.floor(number); + } else { + return Math.ceil(number); + } +} + +function bubble () { + var milliseconds = this._milliseconds; + var days = this._days; + var months = this._months; + var data = this._data; + var seconds, minutes, hours, years, monthsFromDays; + + // if we have a mix of positive and negative values, bubble down first + // check: https://github.com/moment/moment/issues/2166 + if (!((milliseconds >= 0 && days >= 0 && months >= 0) || + (milliseconds <= 0 && days <= 0 && months <= 0))) { + milliseconds += absCeil(monthsToDays(months) + days) * 864e5; + days = 0; + months = 0; + } + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absFloor(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absFloor(seconds / 60); + data.minutes = minutes % 60; + + hours = absFloor(minutes / 60); + data.hours = hours % 24; + + days += absFloor(hours / 24); + + // convert days to months + monthsFromDays = absFloor(daysToMonths(days)); + months += monthsFromDays; + days -= absCeil(monthsToDays(monthsFromDays)); + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + + return this; +} + +function daysToMonths (days) { + // 400 years have 146097 days (taking into account leap year rules) + // 400 years have 12 months === 4800 + return days * 4800 / 146097; +} + +function monthsToDays (months) { + // the reverse of daysToMonths + return months * 146097 / 4800; +} + +function as (units) { + if (!this.isValid()) { + return NaN; + } + var days; + var months; + var milliseconds = this._milliseconds; + + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + milliseconds / 864e5; + months = this._months + daysToMonths(days); + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(monthsToDays(this._months)); + switch (units) { + case 'week' : return days / 7 + milliseconds / 6048e5; + case 'day' : return days + milliseconds / 864e5; + case 'hour' : return days * 24 + milliseconds / 36e5; + case 'minute' : return days * 1440 + milliseconds / 6e4; + case 'second' : return days * 86400 + milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 864e5) + milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } +} + +// TODO: Use this.as('ms')? +function valueOf$1 () { + if (!this.isValid()) { + return NaN; + } + return ( + this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6 + ); +} + +function makeAs (alias) { + return function () { + return this.as(alias); + }; +} + +var asMilliseconds = makeAs('ms'); +var asSeconds = makeAs('s'); +var asMinutes = makeAs('m'); +var asHours = makeAs('h'); +var asDays = makeAs('d'); +var asWeeks = makeAs('w'); +var asMonths = makeAs('M'); +var asYears = makeAs('y'); + +function clone$1 () { + return createDuration(this); +} + +function get$2 (units) { + units = normalizeUnits(units); + return this.isValid() ? this[units + 's']() : NaN; +} + +function makeGetter(name) { + return function () { + return this.isValid() ? this._data[name] : NaN; + }; +} + +var milliseconds = makeGetter('milliseconds'); +var seconds = makeGetter('seconds'); +var minutes = makeGetter('minutes'); +var hours = makeGetter('hours'); +var days = makeGetter('days'); +var months = makeGetter('months'); +var years = makeGetter('years'); + +function weeks () { + return absFloor(this.days() / 7); +} + +var round = Math.round; +var thresholds = { + ss: 44, // a few seconds to seconds + s : 45, // seconds to minute + m : 45, // minutes to hour + h : 22, // hours to day + d : 26, // days to month + M : 11 // months to year +}; + +// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize +function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); +} + +function relativeTime$1 (posNegDuration, withoutSuffix, locale) { + var duration = createDuration(posNegDuration).abs(); + var seconds = round(duration.as('s')); + var minutes = round(duration.as('m')); + var hours = round(duration.as('h')); + var days = round(duration.as('d')); + var months = round(duration.as('M')); + var years = round(duration.as('y')); + + var a = seconds <= thresholds.ss && ['s', seconds] || + seconds < thresholds.s && ['ss', seconds] || + minutes <= 1 && ['m'] || + minutes < thresholds.m && ['mm', minutes] || + hours <= 1 && ['h'] || + hours < thresholds.h && ['hh', hours] || + days <= 1 && ['d'] || + days < thresholds.d && ['dd', days] || + months <= 1 && ['M'] || + months < thresholds.M && ['MM', months] || + years <= 1 && ['y'] || ['yy', years]; + + a[2] = withoutSuffix; + a[3] = +posNegDuration > 0; + a[4] = locale; + return substituteTimeAgo.apply(null, a); +} + +// This function allows you to set the rounding function for relative time strings +function getSetRelativeTimeRounding (roundingFunction) { + if (roundingFunction === undefined) { + return round; + } + if (typeof(roundingFunction) === 'function') { + round = roundingFunction; + return true; + } + return false; +} + +// This function allows you to set a threshold for relative time strings +function getSetRelativeTimeThreshold (threshold, limit) { + if (thresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return thresholds[threshold]; + } + thresholds[threshold] = limit; + if (threshold === 's') { + thresholds.ss = limit - 1; + } + return true; +} + +function humanize (withSuffix) { + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + + var locale = this.localeData(); + var output = relativeTime$1(this, !withSuffix, locale); + + if (withSuffix) { + output = locale.pastFuture(+this, output); + } + + return locale.postformat(output); +} + +var abs$1 = Math.abs; + +function sign(x) { + return ((x > 0) - (x < 0)) || +x; +} + +function toISOString$1() { + // for ISO strings we do not use the normal bubbling rules: + // * milliseconds bubble up until they become hours + // * days do not bubble at all + // * months bubble up until they become years + // This is because there is no context-free conversion between hours and days + // (think of clock changes) + // and also not between days and months (28-31 days per month) + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + + var seconds = abs$1(this._milliseconds) / 1000; + var days = abs$1(this._days); + var months = abs$1(this._months); + var minutes, hours, years; + + // 3600 seconds -> 60 minutes -> 1 hour + minutes = absFloor(seconds / 60); + hours = absFloor(minutes / 60); + seconds %= 60; + minutes %= 60; + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var Y = years; + var M = months; + var D = days; + var h = hours; + var m = minutes; + var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; + var total = this.asSeconds(); + + if (!total) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + var totalSign = total < 0 ? '-' : ''; + var ymSign = sign(this._months) !== sign(total) ? '-' : ''; + var daysSign = sign(this._days) !== sign(total) ? '-' : ''; + var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; + + return totalSign + 'P' + + (Y ? ymSign + Y + 'Y' : '') + + (M ? ymSign + M + 'M' : '') + + (D ? daysSign + D + 'D' : '') + + ((h || m || s) ? 'T' : '') + + (h ? hmsSign + h + 'H' : '') + + (m ? hmsSign + m + 'M' : '') + + (s ? hmsSign + s + 'S' : ''); +} + +var proto$2 = Duration.prototype; + +proto$2.isValid = isValid$1; +proto$2.abs = abs; +proto$2.add = add$1; +proto$2.subtract = subtract$1; +proto$2.as = as; +proto$2.asMilliseconds = asMilliseconds; +proto$2.asSeconds = asSeconds; +proto$2.asMinutes = asMinutes; +proto$2.asHours = asHours; +proto$2.asDays = asDays; +proto$2.asWeeks = asWeeks; +proto$2.asMonths = asMonths; +proto$2.asYears = asYears; +proto$2.valueOf = valueOf$1; +proto$2._bubble = bubble; +proto$2.clone = clone$1; +proto$2.get = get$2; +proto$2.milliseconds = milliseconds; +proto$2.seconds = seconds; +proto$2.minutes = minutes; +proto$2.hours = hours; +proto$2.days = days; +proto$2.weeks = weeks; +proto$2.months = months; +proto$2.years = years; +proto$2.humanize = humanize; +proto$2.toISOString = toISOString$1; +proto$2.toString = toISOString$1; +proto$2.toJSON = toISOString$1; +proto$2.locale = locale; +proto$2.localeData = localeData; + +// Deprecations +proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); +proto$2.lang = lang; + +// Side effect imports + +// FORMATTING + +addFormatToken('X', 0, 0, 'unix'); +addFormatToken('x', 0, 0, 'valueOf'); + +// PARSING + +addRegexToken('x', matchSigned); +addRegexToken('X', matchTimestamp); +addParseToken('X', function (input, array, config) { + config._d = new Date(parseFloat(input, 10) * 1000); +}); +addParseToken('x', function (input, array, config) { + config._d = new Date(toInt(input)); +}); + +// Side effect imports + + +hooks.version = '2.19.4'; + +setHookCallback(createLocal); + +hooks.fn = proto; +hooks.min = min; +hooks.max = max; +hooks.now = now; +hooks.utc = createUTC; +hooks.unix = createUnix; +hooks.months = listMonths; +hooks.isDate = isDate; +hooks.locale = getSetGlobalLocale; +hooks.invalid = createInvalid; +hooks.duration = createDuration; +hooks.isMoment = isMoment; +hooks.weekdays = listWeekdays; +hooks.parseZone = createInZone; +hooks.localeData = getLocale; +hooks.isDuration = isDuration; +hooks.monthsShort = listMonthsShort; +hooks.weekdaysMin = listWeekdaysMin; +hooks.defineLocale = defineLocale; +hooks.updateLocale = updateLocale; +hooks.locales = listLocales; +hooks.weekdaysShort = listWeekdaysShort; +hooks.normalizeUnits = normalizeUnits; +hooks.relativeTimeRounding = getSetRelativeTimeRounding; +hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; +hooks.calendarFormat = getCalendarFormat; +hooks.prototype = proto; + +return hooks; + +}))); \ No newline at end of file diff --git a/resources/assets/js/app.js b/resources/assets/js/app.js new file mode 100755 index 0000000..c1620c1 --- /dev/null +++ b/resources/assets/js/app.js @@ -0,0 +1,22 @@ + +/** + * First we will load all of this project's JavaScript dependencies which + * includes Vue and other libraries. It is a great starting point when + * building robust, powerful web applications using Vue and Laravel. + */ + +require('./bootstrap'); + +window.Vue = require('vue'); + +/** + * Next, we will create a fresh Vue application instance and attach it to + * the page. Then, you may begin adding components to this application + * or customize the JavaScript scaffolding to fit your unique needs. + */ + +Vue.component('example', require('./components/Example.vue')); + +const app = new Vue({ + el: '#app' +}); diff --git a/resources/assets/js/bootstrap.js b/resources/assets/js/bootstrap.js new file mode 100755 index 0000000..b5d2602 --- /dev/null +++ b/resources/assets/js/bootstrap.js @@ -0,0 +1,40 @@ + +window._ = require('lodash'); + +/** + * We'll load jQuery and the Bootstrap jQuery plugin which provides support + * for JavaScript based Bootstrap features such as modals and tabs. This + * code may be modified to fit the specific needs of your application. + */ + +try { + window.$ = window.jQuery = require('jquery'); + + require('bootstrap-sass'); +} catch (e) {} + +/** + * We'll load the axios HTTP library which allows us to easily issue requests + * to our Laravel back-end. This library automatically handles sending the + * CSRF token as a header based on the value of the "XSRF" token cookie. + */ + +window.axios = require('axios'); + +window.axios.defaults.headers.common['X-CSRF-TOKEN'] = window.Laravel.csrfToken; +window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; + +/** + * Echo exposes an expressive API for subscribing to channels and listening + * for events that are broadcast by Laravel. Echo and event broadcasting + * allows your team to easily build robust real-time web applications. + */ + +// import Echo from 'laravel-echo' + +// window.Pusher = require('pusher-js'); + +// window.Echo = new Echo({ +// broadcaster: 'pusher', +// key: 'your-pusher-key' +// }); diff --git a/resources/assets/js/components/Example.vue b/resources/assets/js/components/Example.vue new file mode 100755 index 0000000..601e61c --- /dev/null +++ b/resources/assets/js/components/Example.vue @@ -0,0 +1,23 @@ + + + diff --git a/resources/assets/sass/_variables.scss b/resources/assets/sass/_variables.scss new file mode 100755 index 0000000..53202ac --- /dev/null +++ b/resources/assets/sass/_variables.scss @@ -0,0 +1,38 @@ + +// Body +$body-bg: #f5f8fa; + +// Borders +$laravel-border-color: darken($body-bg, 10%); +$list-group-border: $laravel-border-color; +$navbar-default-border: $laravel-border-color; +$panel-default-border: $laravel-border-color; +$panel-inner-border: $laravel-border-color; + +// Brands +$brand-primary: #3097D1; +$brand-info: #8eb4cb; +$brand-success: #2ab27b; +$brand-warning: #cbb956; +$brand-danger: #bf5329; + +// Typography +$icon-font-path: "~bootstrap-sass/assets/fonts/bootstrap/"; +$font-family-sans-serif: "Raleway", sans-serif; +$font-size-base: 14px; +$line-height-base: 1.6; +$text-color: #636b6f; + +// Navbar +$navbar-default-bg: #fff; + +// Buttons +$btn-default-color: $text-color; + +// Inputs +$input-border: lighten($text-color, 40%); +$input-border-focus: lighten($brand-primary, 25%); +$input-color-placeholder: lighten($text-color, 30%); + +// Panels +$panel-default-heading-bg: #fff; diff --git a/resources/assets/sass/app.scss b/resources/assets/sass/app.scss new file mode 100755 index 0000000..35ce2dc --- /dev/null +++ b/resources/assets/sass/app.scss @@ -0,0 +1,9 @@ + +// Fonts +@import url(https://fonts.googleapis.com/css?family=Raleway:300,400,600); + +// Variables +@import "variables"; + +// Bootstrap +@import "node_modules/bootstrap-sass/assets/stylesheets/bootstrap"; diff --git a/resources/lang/ar-SA/accounts.php b/resources/lang/ar-SA/accounts.php new file mode 100755 index 0000000..b3d2d31 --- /dev/null +++ b/resources/lang/ar-SA/accounts.php @@ -0,0 +1,14 @@ + 'اسم الحساب', + 'number' => 'الرقم', + 'opening_balance' => 'الرصيد الافتتاحي', + 'current_balance' => 'الرصيد الحالي', + 'bank_name' => 'اسم البنك', + 'bank_phone' => 'هاتف البنك', + 'bank_address' => 'عنوان البنك', + 'default_account' => 'الحساب الافتراضي', + +]; diff --git a/resources/lang/ar-SA/auth.php b/resources/lang/ar-SA/auth.php new file mode 100755 index 0000000..f9e836b --- /dev/null +++ b/resources/lang/ar-SA/auth.php @@ -0,0 +1,39 @@ + 'الملف الشخصي', + 'logout' => 'تسجيل خروج', + 'login' => 'تسجيل دخول', + 'login_to' => 'تسجيل دخول لبدء جلسة العمل الخاصة بك', + 'remember_me' => 'تذكرني', + 'forgot_password' => 'نسيت كلمة المرور', + 'reset_password' => 'إعادة تعيين كلمة المرور', + 'enter_email' => 'أدخل عنوان بريدك الإلكتروني', + 'current_email' => 'البريد الإلكتروني الحالي', + 'reset' => 'إعادة تعيين', + 'never' => 'أبداً', + + 'password' => [ + 'current' => 'كلمة المرور', + 'current_confirm' => 'تأكيد كلمة المرور', + 'new' => 'كلمة المرور الجديدة', + 'new_confirm' => 'تأكيد كلمة المرور الجديدة', + ], + + 'error' => [ + 'self_delete' => 'خطأ: لا يمكن حذف نفسك!', + 'no_company' => 'خطأ: لم يتم تعيين أية شركة إلى حسابك، من فضلك تواصل مع مسؤول النظام.', + ], + + 'failed' => 'بيانات الاعتماد هذه غير متطابقة مع البيانات المسجلة لدينا.', + 'disabled' => 'هذا الحساب غير مفعّل. من فضلك تواصل مع مسؤول النظام.', + 'throttle' => 'عدد كبير جداً من محاولات تسجيل الدخول. يرجى إعادة المحاولة خلال :seconds ثواني.', + + 'notification' => [ + 'message_1' => 'تم إرسال هذه الرسالة لإبلاغك بوجود طلب إعادة كلمة المرور على الحساب الخاص بك.', + 'message_2' => 'لا داعي لاتخاذ أي إجراء إذا لم تقم بطلب إعادة كلمة المرور.', + 'button' => 'إعادة تعيين كلمة المرور', + ], + +]; diff --git a/resources/lang/ar-SA/bills.php b/resources/lang/ar-SA/bills.php new file mode 100755 index 0000000..4c25cd3 --- /dev/null +++ b/resources/lang/ar-SA/bills.php @@ -0,0 +1,46 @@ + 'رقم فاتورة الشراء', + 'bill_date' => 'تاريخ فاتورة الشراء', + 'total_price' => 'السعر الإجمالي', + 'due_date' => 'تاريخ التسليم', + 'order_number' => 'رقم الطلب', + 'bill_from' => 'فاتورة الشراء من', + + 'quantity' => 'الكمية', + 'price' => 'السعر', + 'sub_total' => 'المبلغ الإجمالي', + 'discount' => 'خصم', + 'tax_total' => 'إجمالي الضريبة', + 'total' => 'المجموع', + + 'item_name' => 'اسم الصنف|أسماء الأصناف', + + 'show_discount' => 'خصم :discount%', + 'add_discount' => 'إضافة خصم', + 'discount_desc' => 'من المجموع الجزئي', + + 'payment_due' => 'استحقاق الدفع', + 'amount_due' => 'استحقاق المبلغ', + 'paid' => 'مدفوع', + 'histories' => 'سجلات', + 'payments' => 'المدفوعات', + 'add_payment' => 'إضافة مدفوعات', + 'mark_received' => 'تحديد كمستلم', + 'download_pdf' => 'تحميل PDF', + 'send_mail' => 'إرسال بريد إلكتروني', + + 'status' => [ + 'draft' => 'مسودة', + 'received' => 'مستلم', + 'partial' => 'جزئي', + 'paid' => 'مدفوع', + ], + + 'messages' => [ + 'received' => 'تم تحويل فاتورة الشراء إلى فاتورة مستلمة بنجاح!', + ], + +]; diff --git a/resources/lang/ar-SA/companies.php b/resources/lang/ar-SA/companies.php new file mode 100755 index 0000000..d9e72f7 --- /dev/null +++ b/resources/lang/ar-SA/companies.php @@ -0,0 +1,13 @@ + 'اسم النطاق', + 'logo' => 'الشعار', + 'manage' => 'إدارة الشركات', + 'all' => 'كل الشركات', + 'error' => [ + 'delete_active' => 'خطأ: لا يمكن حذف شركة مفعلة، من فضلك، غير حالة الشركة أولاً!', + ], + +]; diff --git a/resources/lang/ar-SA/currencies.php b/resources/lang/ar-SA/currencies.php new file mode 100755 index 0000000..4e26bef --- /dev/null +++ b/resources/lang/ar-SA/currencies.php @@ -0,0 +1,18 @@ + 'كود', + 'rate' => 'القيمة', + 'default' => 'العملة الافتراضية', + 'decimal_mark' => 'علامة عشرية', + 'thousands_separator' => 'فاصل الآلاف', + 'precision' => 'الدقة', + 'symbol' => [ + 'symbol' => 'الرمز', + 'position' => 'مكان الرمز', + 'before' => 'قبل القيمة', + 'after' => 'بعد القيمة', + ] + +]; diff --git a/resources/lang/ar-SA/customers.php b/resources/lang/ar-SA/customers.php new file mode 100755 index 0000000..2054a6d --- /dev/null +++ b/resources/lang/ar-SA/customers.php @@ -0,0 +1,11 @@ + 'السماح بتسجيل الدخول؟', + 'user_created' => 'تم إنشاء المستخدم', + + 'error' => [ + 'email' => 'البريد الإلكتروني مسجل مسبقاً.' + ] +]; diff --git a/resources/lang/ar-SA/dashboard.php b/resources/lang/ar-SA/dashboard.php new file mode 100755 index 0000000..dfe40ce --- /dev/null +++ b/resources/lang/ar-SA/dashboard.php @@ -0,0 +1,24 @@ + 'إجمالي الدخل', + 'receivables' => 'المستحقات', + 'open_invoices' => 'الفواتير المفتوحة', + 'overdue_invoices' => 'الفواتير المتأخرة', + 'total_expenses' => 'إجمالي المصروفات', + 'payables' => 'إمكانية الدفع', + 'open_bills' => 'فواتير مفتوحة', + 'overdue_bills' => 'فواتير متأخرة', + 'total_profit' => 'إجمالي الربح', + 'open_profit' => 'الربح المفتوح', + 'overdue_profit' => 'الربح المتأخر', + 'cash_flow' => 'التدفق المالي', + 'no_profit_loss' => 'لا توجد أرباح خاسرة', + 'incomes_by_category' => 'الدخل حسب الفئة', + 'expenses_by_category' => 'المصروفات حسب الفئة', + 'account_balance' => 'رصيد حساب', + 'latest_incomes' => 'آخر الإيرادات', + 'latest_expenses' => 'آخر المصروفات', + +]; diff --git a/resources/lang/ar-SA/demo.php b/resources/lang/ar-SA/demo.php new file mode 100755 index 0000000..96371e7 --- /dev/null +++ b/resources/lang/ar-SA/demo.php @@ -0,0 +1,16 @@ + 'نقدي', + 'categories_deposit' => 'إيداع', + 'categories_sales' => 'المبيعات', + 'currencies_usd' => 'دولار أمريكي', + 'currencies_eur' => 'يورو', + 'currencies_gbp' => 'جنيه استرليني', + 'currencies_try' => 'ليرة تركية', + 'taxes_exempt' => 'الإعفاء الضريبي', + 'taxes_normal' => 'الضريبة العادية', + 'taxes_sales' => 'ضريبة المبيعات', + +]; diff --git a/resources/lang/ar-SA/footer.php b/resources/lang/ar-SA/footer.php new file mode 100755 index 0000000..6ce14d9 --- /dev/null +++ b/resources/lang/ar-SA/footer.php @@ -0,0 +1,9 @@ + 'إصدار', + 'powered' => 'بواسطة أكاونتينج', + 'software' => 'برنامج محاسبي مجاني', + +]; diff --git a/resources/lang/ar-SA/general.php b/resources/lang/ar-SA/general.php new file mode 100755 index 0000000..f5426da --- /dev/null +++ b/resources/lang/ar-SA/general.php @@ -0,0 +1,121 @@ + 'الصنف|الأصناف', + 'incomes' => 'إيراد|إيرادات', + 'invoices' => 'الفاتورة|الفواتير', + 'revenues' => 'الدخل|الدخل', + 'customers' => 'العميل|العملاء', + 'expenses' => 'المصروف|المصروفات', + 'bills' => 'فاتورة الشراء|فواتير الشراء', + 'payments' => 'الدفع|المدفوعات', + 'vendors' => 'المورد|الموردين', + 'accounts' => 'الحساب|الحسابات', + 'transfers' => 'التحويل|التحويلات', + 'transactions' => 'العملية|العمليات', + 'reports' => 'التقرير|التقارير', + 'settings' => 'الإعداد|الإعدادات', + 'categories' => 'الفئة|الفئات', + 'currencies' => 'العملة|العملات', + 'tax_rates' => 'معدل الضريبة|معدلات الضرائب', + 'users' => 'المستخدم|المستخدمين', + 'roles' => 'الوظيفة|الوظائف', + 'permissions' => 'الصلاحية|الصلاحيات', + 'modules' => 'التطبيق|التطبيقات', + 'companies' => 'الشركة|الشركات', + 'profits' => 'الربح|الأرباح', + 'taxes' => 'الضريبة|الضرائب', + 'logos' => 'الشعار|الشعارات', + 'pictures' => 'الصورة|الصور', + 'types' => 'النوع|الأنواع', + 'payment_methods' => 'طريقة الدفع|طرق الدفع', + 'compares' => 'الإيراد مقابل المصروف|الإيرادات مقابل المصروفات', + 'notes' => 'ملحوظة|الملاحظات', + 'totals' => 'المجموع|المجاميع', + 'languages' => 'اللغة|اللغات', + 'updates' => 'التحديث|التحديثات', + 'numbers' => 'الرقم|الأرقام', + 'statuses' => 'الحالة|الحالات', + 'others' => 'الأخرى|الأخريات', + + 'dashboard' => 'لوحة التحكم', + 'banking' => 'الخدمات المصرفية', + 'general' => 'عام', + 'no_records' => 'لا توجد سجلات.', + 'date' => 'تاريخ', + 'amount' => 'المبلغ', + 'enabled' => 'مفعل', + 'disabled' => 'معطل', + 'yes' => 'نعم', + 'no' => 'لا', + 'na' => 'غير متاح', + 'daily' => 'يومي', + 'monthly' => 'شهري', + 'quarterly' => 'ربع سنوي', + 'yearly' => 'سنوي', + 'add' => 'إضافة', + 'add_new' => 'إضافة جديد', + 'show' => 'عرض', + 'edit' => 'تعديل', + 'delete' => 'حذف', + 'send' => 'إرسال', + 'download' => 'تحميل', + 'delete_confirm' => 'تأكيد حذف :name :type؟', + 'name' => 'الاسم', + 'email' => 'البريد الإلكتروني', + 'tax_number' => 'رقم الضريبة', + 'phone' => 'رقم الهاتف', + 'address' => 'العنوان', + 'website' => 'الموقع الإلكتروني', + 'actions' => 'الإجراءات', + 'description' => 'الوصف', + 'manage' => 'إدارة', + 'code' => 'الرمز', + 'alias' => 'اسم مستعار', + 'balance' => 'الرصيد', + 'reference' => 'مرجع', + 'attachment' => 'المرفق', + 'change' => 'تغيير', + 'switch' => 'تبديل', + 'color' => 'اللون', + 'save' => 'حفظ', + 'cancel' => 'إلغاء', + 'from' => 'من', + 'to' => 'إلى', + 'print' => 'طباعة', + 'search' => 'بحث', + 'search_placeholder' => 'اكتب للبحث..', + 'filter' => 'تصفية', + 'help' => 'مساعدة', + 'all' => 'الكل', + 'all_type' => 'الكل :type', + 'upcoming' => 'القادمة', + 'created' => 'تم إنشاؤه', + 'id' => 'رقم الهوية', + 'more_actions' => 'المزيد من الإجراءات', + 'duplicate' => 'تكرار', + 'unpaid' => 'غير مدفوع', + 'paid' => 'مدفوع', + 'overdue' => 'متأخر', + 'partially' => 'جزئي', + 'partially_paid' => 'مدفوع جزئياً', + 'export' => 'تصدير', + 'enable' => 'تفعيل', + 'disable' => 'تعطيل', + + 'title' => [ + 'new' => 'إضافة :type', + 'edit' => 'تعديل :type', + ], + + 'form' => [ + 'enter' => 'إدخال :field', + 'select' => [ + 'field' => '-اختر :field-', + 'file' => 'اختر ملفاً', + ], + 'no_file_selected' => 'لم يتم اختيار أي ملف...', + ], + +]; diff --git a/resources/lang/ar-SA/header.php b/resources/lang/ar-SA/header.php new file mode 100755 index 0000000..bd257ed --- /dev/null +++ b/resources/lang/ar-SA/header.php @@ -0,0 +1,15 @@ + 'تغيير اللغة', + 'last_login' => 'آخر تسجيل دخول :time', + 'notifications' => [ + 'counter' => '{0} ليس لديك تنبيهات|{1} لديك :count تنبيهات|[2,*] لديك :count تنبيهات', + 'overdue_invoices' => '{1} :count فاتورة متأخرة|[2,*] :count فواتير متأخرة', + 'upcoming_bills' => '{1} :count فاتورة بيع قادمة|[2,*] :count فواتير بيع قادمة', + 'items_stock' => '{1} :count منتج غير متوفر|[2,*] :count منتجات غير متوفرة', + 'view_all' => 'عرض الكل' + ], + +]; diff --git a/resources/lang/ar-SA/import.php b/resources/lang/ar-SA/import.php new file mode 100755 index 0000000..88def32 --- /dev/null +++ b/resources/lang/ar-SA/import.php @@ -0,0 +1,9 @@ + 'استيراد', + 'title' => 'استيراد :type', + 'message' => 'أنواع الملفات المسموحة: XLS, XLSX. من فضلك قم بتحميل ملفاً لرؤية مثال على ذلك.', + +]; diff --git a/resources/lang/ar-SA/install.php b/resources/lang/ar-SA/install.php new file mode 100755 index 0000000..405f8cb --- /dev/null +++ b/resources/lang/ar-SA/install.php @@ -0,0 +1,44 @@ + 'التالي', + 'refresh' => 'تحديث', + + 'steps' => [ + 'requirements' => 'من فضلك، تواصل مع مزود خدمة الاستضافة لديك لإصلاح الأخطاء!', + 'language' => 'الخطوة 1/3: اختيار اللغة', + 'database' => 'الخطوة 2/3: إعداد قاعدة البيانات', + 'settings' => 'الخطوة 3/3: معلومات الشركة ومسؤول النظام', + ], + + 'language' => [ + 'select' => 'اختر اللغة', + ], + + 'requirements' => [ + 'enabled' => 'يجب تفعيل :feature!', + 'disabled' => 'يجب تعطيل :feature!', + 'extension' => 'يجب تثبيت وتشغيل ملحق :extension!', + 'directory' => 'يجب منح صلاحية الكتابة على مجلد :directory!', + ], + + 'database' => [ + 'hostname' => 'اسم المستضيف', + 'username' => 'اسم المستخدم', + 'password' => 'كلمة المرور', + 'name' => 'قاعدة البيانات', + ], + + 'settings' => [ + 'company_name' => 'اسم الشركة', + 'company_email' => 'البريد الإلكتروني للشركة', + 'admin_email' => 'البريد الإلكتروني لمسؤول النظام', + 'admin_password' => 'كلمة مرور مسؤول النظام', + ], + + 'error' => [ + 'connection' => 'خطأ: لا يمكن الاتصال بقاعدة البيانات! من فضلك، تأكد من صحة المعلومات.', + ], + +]; diff --git a/resources/lang/ar-SA/invoices.php b/resources/lang/ar-SA/invoices.php new file mode 100755 index 0000000..2b3627c --- /dev/null +++ b/resources/lang/ar-SA/invoices.php @@ -0,0 +1,55 @@ + 'رقم فاتورة البيع', + 'invoice_date' => 'تاريخ فاتورة البيع', + 'total_price' => 'السعر الإجمالي', + 'due_date' => 'تاريخ الاستحقاق', + 'order_number' => 'رقم الطلب', + 'bill_to' => 'فاتورة الشراء إلى', + + 'quantity' => 'الكمية', + 'price' => 'السعر', + 'sub_total' => 'المجموع الجزئي', + 'discount' => 'الخصم', + 'tax_total' => 'إجمالي الضريبة', + 'total' => 'الإجمالي', + + 'item_name' => 'اسم الصنف|أسماء الأصناف', + + 'show_discount' => 'خصم :discount%', + 'add_discount' => 'إضافة خصم', + 'discount_desc' => 'من المجموع الجزئي', + + 'payment_due' => 'استحقاق الدفع', + 'paid' => 'مدفوع', + 'histories' => 'سجلات', + 'payments' => 'المدفوعات', + 'add_payment' => 'إضافة مدفوعات', + 'mark_paid' => 'التحديد كمدفوع', + 'mark_sent' => 'التحديد كمرسل', + 'download_pdf' => 'تحميل PDF', + 'send_mail' => 'إرسال بريد إلكتروني', + + 'status' => [ + 'draft' => 'مسودة', + 'sent' => 'تم الإرسال', + 'viewed' => 'المشاهدات', + 'approved' => 'تمت الموافقة', + 'partial' => 'جزئي', + 'paid' => 'مدفوع', + ], + + 'messages' => [ + 'email_sent' => 'تم إرسال الفاتورة بنجاح!', + 'marked_sent' => 'تم تحديد الفاتورة كفاتورة مرسلة بنجاح!', + 'email_required' => 'لا يوجد عنوان البريد إلكتروني لهذا العميل!', + ], + + 'notification' => [ + 'message' => 'قمت باستلام هذه الرسالة لأنه لديك فاتورة قادمة بقيمة :amount للعميل :customer.', + 'button' => 'الدفع الآن', + ], + +]; diff --git a/resources/lang/ar-SA/items.php b/resources/lang/ar-SA/items.php new file mode 100755 index 0000000..61b5bf1 --- /dev/null +++ b/resources/lang/ar-SA/items.php @@ -0,0 +1,15 @@ + 'الكمية|الكميات', + 'sales_price' => 'سعر البيع', + 'purchase_price' => 'سعر الشراء', + 'sku' => 'رمز SKU', + + 'notification' => [ + 'message' => 'تم إرسال هذه الرسالة لإبلاغك بأن :name قد نفد من المخزون.', + 'button' => 'عرض الآن', + ], + +]; diff --git a/resources/lang/ar-SA/messages.php b/resources/lang/ar-SA/messages.php new file mode 100755 index 0000000..a69086a --- /dev/null +++ b/resources/lang/ar-SA/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => 'تم إضافة :type!', + 'updated' => 'تم تحديث :type!', + 'deleted' => 'تم حذف :type!', + 'duplicated' => 'تم نسخ :type!', + 'imported' => 'تم استيراد :type!', + 'enabled' => 'تم تفعيل :type!', + 'disabled' => 'تم تعطيل :type!', + ], + 'error' => [ + 'over_payment' => 'خطأ: لم تتم إضافة الدفع! القيمة المتبقية تجاوزت المجموع.', + 'not_user_company' => 'خطأ: غير مسموح لك بإدارة هذه الشركة!', + 'customer' => 'خطأ: لم تتم إضافة المستخدم! :name يستخدم هذا البريد الإلكتروني مسبقاً.', + 'no_file' => 'خطأ: لم يتم تحديد أي ملف!', + 'last_category' => 'خطأ: لا يمكن حذف آخر فئة من :type!', + 'invalid_token' => 'خطأ: رمز الوصول المدخل غير صحيح!', + 'import_column' => 'خطأ: :message اسم الورقة: :sheet. رقم السطر: :line.', + 'import_sheet' => 'خطأ: اسم الورقة غير صحيح. من فضلك، راجع ملف العينة.', + ], + 'warning' => [ + 'deleted' => 'تنبيه: لا يمكنك حذف :name لأنه لديه :text مرتبط به.', + 'disabled' => 'تنبيه: لا يمكنك تعطيل :name لأنه لديه :text مرتبط به.', + ], + +]; diff --git a/resources/lang/ar-SA/modules.php b/resources/lang/ar-SA/modules.php new file mode 100755 index 0000000..5bc800f --- /dev/null +++ b/resources/lang/ar-SA/modules.php @@ -0,0 +1,58 @@ + 'رمز API', + 'api_token' => 'رمز الوصول', + 'my_apps' => 'تطبيقاتي', + 'top_paid' => 'أعلى المدفوعات', + 'new' => 'جديد', + 'top_free' => 'المجانيات الأعلى', + 'free' => 'مجاناً', + 'search' => 'بحث', + 'install' => 'تثبيت', + 'buy_now' => 'الشراء الآن', + 'token_link' => 'اضغط هنا للحصول على رمز الوصول الخاص بك API.', + 'no_apps' => 'لا توجد تطبيقات فى هذه الفئة حتى الآن.', + 'developer' => 'هل أنت مطوّر؟ هنا يمكنك أن تتعلم كيفية إنشاء تطبيق وبدء البيع من اليوم!', + + 'about' => 'حول', + + 'added' => 'تمت الإضافة', + 'updated' => 'تم التحديث', + 'compatibility' => 'التوافق', + + 'installed' => 'تم تثبيت :module', + 'uninstalled' => 'تم إلغاء تثبيت :module', + //'updated' => ':module updated', + 'enabled' => 'تم تفعيل :module', + 'disabled' => 'تم تعطيل :module', + + 'tab' => [ + 'installation' => 'التثبيت', + 'faq' => 'الأسئلة الشائعة', + 'changelog' => 'سجل التغييرات', + ], + + 'installation' => [ + 'header' => 'تثبيت التطبيق', + 'download' => 'جاري تحميل ملف :module.', + 'unzip' => 'جاري استخراج ملفات :module.', + 'install' => 'جاري تثبيت ملفات :module.', + ], + + 'badge' => [ + 'installed' => 'مثبت', + ], + + 'button' => [ + 'uninstall' => 'إلغاء التثبيت', + 'disable' => 'تعطيل', + 'enable' => 'تفعيل', + ], + + 'my' => [ + 'purchased' => 'التي تم شراؤها', + 'installed' => 'التي تم تثبيتها', + ], +]; diff --git a/resources/lang/ar-SA/notifications.php b/resources/lang/ar-SA/notifications.php new file mode 100755 index 0000000..01e4250 --- /dev/null +++ b/resources/lang/ar-SA/notifications.php @@ -0,0 +1,10 @@ + 'المعذرة...', + 'hello' => 'مرحباً!', + 'salutation' => 'مع التحية،
    :company_name', + 'subcopy' => 'إذا كنت تواجه مشكلة في الضغط على زر ":text"، يمكنك نسخ ولصق الرابط أدناه إلى المتصفح الخاص بك: [:url](:url)', + +]; diff --git a/resources/lang/ar-SA/pagination.php b/resources/lang/ar-SA/pagination.php new file mode 100755 index 0000000..2508548 --- /dev/null +++ b/resources/lang/ar-SA/pagination.php @@ -0,0 +1,9 @@ + '« السابق', + 'next' => 'التالي »', + 'showing' => 'عرض :first إلى :last من :total :type', + +]; diff --git a/resources/lang/ar-SA/passwords.php b/resources/lang/ar-SA/passwords.php new file mode 100755 index 0000000..a01efea --- /dev/null +++ b/resources/lang/ar-SA/passwords.php @@ -0,0 +1,22 @@ + 'كلمة المرور يجب أن تتكون من ستة خانات على الأقل وتكون متطابقة مع خانة التأكيد.', + 'reset' => 'تمت إعادة تعيين كلمة المرور!', + 'sent' => 'تم إرسال تفاصيل استعادة كلمة المرور الخاصة بك إلى بريدك الإلكتروني!', + 'token' => 'رمز استعادة كلمة المرور الذي أدخلته غير صحيح.', + 'user' => "لم يتم العثور على أي حساب بهذا البريد الإلكتروني.", + +]; diff --git a/resources/lang/ar-SA/recurring.php b/resources/lang/ar-SA/recurring.php new file mode 100755 index 0000000..c340aaa --- /dev/null +++ b/resources/lang/ar-SA/recurring.php @@ -0,0 +1,20 @@ + 'متكرر', + 'every' => 'كل', + 'period' => 'فترة', + 'times' => 'عدد المرات', + 'daily' => 'يومي', + 'weekly' => 'أسبوعي', + 'monthly' => 'شهري', + 'yearly' => 'سنوي', + 'custom' => 'مُخصّص', + 'days' => 'يوم (أيام)', + 'weeks' => 'أسبوع (أسابيع)', + 'months' => 'شهر (أشهر)', + 'years' => 'سنة (سنوات)', + 'message' => 'هذه :type متكررة و :type التالية سيتم إنشاؤها تلقائياً في تاريخ :date', + +]; diff --git a/resources/lang/ar-SA/reports.php b/resources/lang/ar-SA/reports.php new file mode 100755 index 0000000..e6c8008 --- /dev/null +++ b/resources/lang/ar-SA/reports.php @@ -0,0 +1,30 @@ + 'هذه السنة', + 'previous_year' => 'السنة الماضية', + 'this_quarter' => 'هذا الربع', + 'previous_quarter' => 'الربع السابق', + 'last_12_months' => 'آخر 12 شهر', + 'profit_loss' => 'الربح والخسارة', + 'gross_profit' => 'إجمالي الربح', + 'net_profit' => 'صافي الربح', + 'total_expenses' => 'إجمالي المصروفات', + 'net' => 'صافي الدخل', + + 'summary' => [ + 'income' => 'ملخص الإيرادات', + 'expense' => 'ملخص المصروفات', + 'income_expense' => 'الإيرادات مقابل المصروفات', + 'tax' => 'ملخص الضرائب', + ], + + 'quarter' => [ + '1' => 'يناير-مارس', + '2' => 'أبريل-يونيو', + '3' => 'يوليو-سبتمبر', + '4' => 'أكتوبر-ديسمبر', + ], + +]; diff --git a/resources/lang/ar-SA/settings.php b/resources/lang/ar-SA/settings.php new file mode 100755 index 0000000..f2bd4c8 --- /dev/null +++ b/resources/lang/ar-SA/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'الاسم', + 'email' => 'البريد الإلكتروني', + 'phone' => 'رقم الهاتف', + 'address' => 'العنوان', + 'logo' => 'الشعار', + ], + 'localisation' => [ + 'tab' => 'المنطقة', + 'date' => [ + 'format' => 'صيغة التاريخ', + 'separator' => 'فاصل التاريخ', + 'dash' => 'شَرطة (-)', + 'dot' => 'نقطة (.)', + 'comma' => 'فاصلة (,)', + 'slash' => 'خط مائل (/)', + 'space' => 'مسافة ( )', + ], + 'timezone' => 'التوقيت', + 'percent' => [ + 'title' => 'مكان النسبة (%)', + 'before' => 'قبل الرقم', + 'after' => 'بعد الرقم', + ], + ], + 'invoice' => [ + 'tab' => 'فاتورة الشراء', + 'prefix' => 'بادئة الرقم', + 'digit' => 'عدد الأرقام', + 'next' => 'الرقم التالي', + 'logo' => 'الشعار', + ], + 'default' => [ + 'tab' => 'الافتراضي', + 'account' => 'الحساب الافتراضي', + 'currency' => 'العملة الافتراضية', + 'tax' => 'معدل الضريبة الافتراضي', + 'payment' => 'طريقة الدفع الافتراضية', + 'language' => 'اللغة الافتراضية', + ], + 'email' => [ + 'protocol' => 'بروتوكول', + 'php' => 'بريد PHP', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'مُضيف SMTP', + 'port' => 'منفذ SMTP', + 'username' => 'اسم مستخدم SMTP', + 'password' => 'كلمة مرور SMTP', + 'encryption' => 'نوع تشفير SMTP', + 'none' => 'لا يوجد', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'مسار Sendmail', + 'log' => 'سجل الرسائل الإلكترونية', + ], + 'scheduling' => [ + 'tab' => 'الجدول الزمني', + 'send_invoice' => 'إرسال تذكير لفاتورة البيع', + 'invoice_days' => 'إرسال بعد ميعاد الاستحقاق بأيام', + 'send_bill' => 'إرسال تذكير لفاتورة الشراء', + 'bill_days' => 'إرسال قبل ميعاد الاستحقاق بأيام', + 'cron_command' => 'أمر التكرار', + 'schedule_time' => 'ساعة البدء', + ], + 'appearance' => [ + 'tab' => 'الظهور', + 'theme' => 'القالب', + 'light' => 'فاتح', + 'dark' => 'داكن', + 'list_limit' => 'عدد النتائج في كل صفحة', + 'use_gravatar' => 'استخدام Gravatar', + ], + 'system' => [ + 'tab' => 'النظام', + 'session' => [ + 'lifetime' => 'مدة الجلسة (بالدقائق)', + 'handler' => 'معالج الجلسة', + 'file' => 'ملف', + 'database' => 'قاعدة البيانات', + ], + 'file_size' => 'الحجم الأقصى للملف (بالميجابايت)', + 'file_types' => 'أنواع الملفات المسموحة', + ], + +]; diff --git a/resources/lang/ar-SA/taxes.php b/resources/lang/ar-SA/taxes.php new file mode 100755 index 0000000..ed0603e --- /dev/null +++ b/resources/lang/ar-SA/taxes.php @@ -0,0 +1,8 @@ + 'المعدل', + 'rate_percent' => 'المعدل (%)', + +]; diff --git a/resources/lang/ar-SA/transfers.php b/resources/lang/ar-SA/transfers.php new file mode 100755 index 0000000..db2163e --- /dev/null +++ b/resources/lang/ar-SA/transfers.php @@ -0,0 +1,12 @@ + 'من حساب', + 'to_account' => 'إلى حساب', + + 'messages' => [ + 'delete' => ':from إلى :to (:amount)', + ], + +]; diff --git a/resources/lang/ar-SA/updates.php b/resources/lang/ar-SA/updates.php new file mode 100755 index 0000000..71f2e0d --- /dev/null +++ b/resources/lang/ar-SA/updates.php @@ -0,0 +1,15 @@ + 'الإصدار المثبت', + 'latest_version' => 'أحدث إصدار', + 'update' => 'تحديث أكاونتينج إلى إصدار :version', + 'changelog' => 'سجل التغييرات', + 'check' => 'التحقق', + 'new_core' => 'يتوفر إصدار أحدث من أكاونتينج.', + 'latest_core' => 'تهانينا! لديك أحدث إصدار من أكاونتينج. سيتم تلقائياً تطبيق التحديثات الأمنية المستقبلية.', + 'success' => 'اكتمل التثبيت بنجاح.', + 'error' => 'لقد فشلت عملية التحديث، من فضلك، حاول مرة أخرى.', + +]; diff --git a/resources/lang/ar-SA/validation.php b/resources/lang/ar-SA/validation.php new file mode 100755 index 0000000..3985272 --- /dev/null +++ b/resources/lang/ar-SA/validation.php @@ -0,0 +1,120 @@ + 'يجب أن يتم القبول على خانة :attribute.', + 'active_url' => 'خانة :attribute تحتوي على رابط غير صحيح.', + 'after' => 'يجب على خانة :attribute أن تكون تاريخًا لاحقًا للتاريخ :date.', + 'after_or_equal' => 'يجب على خانة :attribute أن تكون تاريخًا لاحقًا أو مطابقًا للتاريخ :date.', + 'alpha' => 'يجب أن تحتوي خانة :attribute على أحرف فقط.', + 'alpha_dash' => 'يجب أن تحتوي خانة :attribute على أحرف وأرقام وشرطات فقط.', + 'alpha_num' => 'يجب أن تحتوي خانة :attribute على أحرف وأرقام فقط.', + 'array' => 'يجب أن تكون خانة :attribute من نوع مصفوفة.', + 'before' => 'يجب على خانة :attribute أن تكون تاريخًا سابقًا للتاريخ :date.', + 'before_or_equal' => 'يجب على خانة :attribute أن تكون تاريخًا سابقًا أو مطابقًا للتاريخ :date.', + 'between' => [ + 'numeric' => 'يجب أن تكون قيمة :attribute بين :min و :max.', + 'file' => 'يجب أن تكون خانة :attribute بين :min و :max كيلوبايت.', + 'string' => 'يجب أن تكون عدد حروف النّص :attribute بين :min و :max.', + 'array' => 'يجب أن تحتوي خانة :attribute على عدد من العناصر بين :min و :max.', + ], + 'boolean' => 'يجب أن تكون قيمة :attribute إما صحيحًا أو خاطئًا.', + 'confirmed' => 'خانة التأكيد غير متطابقة مع خانة :attribute.', + 'date' => 'خانة :attribute ليست تاريخًا صحيحًا.', + 'date_format' => 'خانة :attribute غير متوافقة مع التنسيق :format.', + 'different' => 'يجب أن تكون الخانتان :attribute و :other مُختلفتان.', + 'digits' => 'يجب أن تحتوي خانة :attribute على عدد :digits من الأرقام.', + 'digits_between' => 'يجب أن تحتوي خانة :attribute على عدد من الأرقام بين :min و :max.', + 'dimensions' => 'خانة :attribute تحتوي على أبعاد صورة غير صالحة.', + 'distinct' => 'خانة :attribute تحتوي على قيمة مكررة.', + 'email' => 'يجب أن تحتوي خانة :attribute على عنوان بريد إلكتروني صحيح.', + 'exists' => 'الخانة المحددة :attribute غير صالحة.', + 'file' => 'يجب أن تحتوي خانة :attribute على ملف.', + 'filled' => 'يجب أن تحتوي خانة :attribute على قيمة.', + 'image' => 'يجب أن تكون خانة :attribute عبارة عن صورة.', + 'in' => 'الخانة المحددة :attribute غير صالحة.', + 'in_array' => 'خانة :attribute غير موجود في :other.', + 'integer' => 'يجب أن تحتوي خانة :attribute على عددًا صحيحًا.', + 'ip' => 'يجب أن تحتوي خانة :attribute على عنوان IP صحيحًا.', + 'json' => 'يجب أن تحتوي خانة :attribute على نصًا صحيحًا من نوع JSON.', + 'max' => [ + 'numeric' => 'يجب أن تكون قيمة :attribute مساوية أو أصغر من :max.', + 'file' => 'خانة :attribute يجب ألا تكون أكبر من :max كيلوبايت.', + 'string' => 'يجب ألا تتجاوز خانة :attribute على عدد أكبر من :max من الأحرف.', + 'array' => 'يجب ألا تتجاوز خانة :attribute على أكثر من :max من العناصر.', + ], + 'mimes' => 'يجب أن تكون خانة :attribute ملفًا من النوع: :values.', + 'mimetypes' => 'يجب أن تكون خانة :attribute ملفًا من النوع: :values.', + 'min' => [ + 'numeric' => 'يجب أن تكون قيمة :attribute مساوية أو أكبر من :min.', + 'file' => 'يجب أن يكون حجم الملف :attribute على الأقل :min كيلوبايت.', + 'string' => 'يجب أن تحتوي خانة :attribute على عدد :min من الأحرف على الأقل.', + 'array' => 'يجب أن تحتوي خانة :attribute على عدد :min من العناصر على الأقل.', + ], + 'not_in' => 'الخانة المحددة :attribute غير صالحة.', + 'numeric' => 'يجب أن تحتوي خانة :attribute على عددًا صحيحًا.', + 'present' => 'يجب أن تكون خانة :attribute موجوداً.', + 'regex' => 'صيغة :attribute غير صحيحة.', + 'required' => 'الخانة :attribute إلزامية.', + 'required_if' => 'الخانة :attribute إلزامية إذا كانت خانة :other تساوي :value.', + 'required_unless' => 'الخانة :attribute تكون إلزامية ما لم تكن خانة :other تحتوي على :values.', + 'required_with' => 'الخانة :attribute إلزامية إذا توفّر :values.', + 'required_with_all' => 'الخانة :attribute إلزامية إذا توفّر :values.', + 'required_without' => 'الخانة :attribute إلزامية إذا لم يتوفّر :values.', + 'required_without_all' => 'الخانة :attribute إلزامية إذا لم يتوفّر أياً من :values.', + 'same' => 'يجب أن تتطابق خانة :attribute مع :other.', + 'size' => [ + 'numeric' => 'يجب أن تكون قيمة خانة :attribute مساوية للعدد :size.', + 'file' => 'يجب أن يكون حجم الملف :attribute يساوي :size كيلوبايت.', + 'string' => 'يجب أن يحتوي خانة :attribute على :size حرف/أحرف.', + 'array' => 'يجب أن تحتوي خانة :attribute على :size من العناصر.', + ], + 'string' => 'يجب أن تكون خانة :attribute نصًا.', + 'timezone' => 'يجب أن تكون خانة :attribute نطاقًا زمنيًا صحيحًا.', + 'unique' => 'قيمة :attribute مُستخدمة من قبل.', + 'uploaded' => 'فشل في رفع :attribute.', + 'url' => 'صيغة :attribute غير صحيحة.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'رسالة مخصصة', + ], + 'invalid_currency' => 'رمز خانة :attribute غير صحيحة.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/bg-BG/accounts.php b/resources/lang/bg-BG/accounts.php new file mode 100755 index 0000000..5c29d90 --- /dev/null +++ b/resources/lang/bg-BG/accounts.php @@ -0,0 +1,14 @@ + 'Oрганизация', + 'number' => 'Номер', + 'opening_balance' => 'Начално салдо', + 'current_balance' => 'Текущо салдо', + 'bank_name' => 'Име на банка', + 'bank_phone' => 'Телефон на банка', + 'bank_address' => 'Адрес на банката', + 'default_account' => 'Акаунт по подразбиране', + +]; diff --git a/resources/lang/bg-BG/auth.php b/resources/lang/bg-BG/auth.php new file mode 100755 index 0000000..402f51a --- /dev/null +++ b/resources/lang/bg-BG/auth.php @@ -0,0 +1,39 @@ + 'Профил', + 'logout' => 'Изход', + 'login' => 'Вход', + 'login_to' => 'Влезте, за да стартирате сесия', + 'remember_me' => 'Запомни ме', + 'forgot_password' => 'Забравих си паролата', + 'reset_password' => 'Възстановяване на парола', + 'enter_email' => 'Въведете е-мейл адрес', + 'current_email' => 'Текущ имейл адрес', + 'reset' => 'Възстановяване', + 'never' => 'никога', + + 'password' => [ + 'current' => 'Парола', + 'current_confirm' => 'Потвърждение на паролата', + 'new' => 'Нова парола', + 'new_confirm' => 'Потвърждение на паролата', + ], + + 'error' => [ + 'self_delete' => 'Грешка: Не може да изтриете себе си!', + 'no_company' => 'Грешка: Няма компания, добавена към вашия акаунт. Моля, обърнете се към системния администратор.', + ], + + 'failed' => 'Неуспешно удостоверяване на потребител.', + 'disabled' => 'Този акаунт е забранен. Моля обърнете се към системния администратор.', + 'throttle' => 'Твърде много опити за логин. Моля, опитайте отново след :seconds секунди.', + + 'notification' => [ + 'message_1' => 'Вие получавате този имейл, защото сме получили искане за нулиране на паролата за вашия акаунт.', + 'message_2' => 'Ако не поискате възстановяване на паролата, не са позволени по-нататъчни действия.', + 'button' => 'Възстановяване на парола', + ], + +]; diff --git a/resources/lang/bg-BG/bills.php b/resources/lang/bg-BG/bills.php new file mode 100755 index 0000000..34df438 --- /dev/null +++ b/resources/lang/bg-BG/bills.php @@ -0,0 +1,46 @@ + 'Фактура Номер', + 'bill_date' => 'Дата фактура', + 'total_price' => 'Обща цена', + 'due_date' => 'Падежна дата', + 'order_number' => 'Номер на поръчка', + 'bill_from' => 'Фактура от', + + 'quantity' => 'Количество', + 'price' => 'Цена', + 'sub_total' => 'Междинна сума', + 'discount' => 'Отстъпка', + 'tax_total' => 'Общо данък', + 'total' => 'Общо', + + 'item_name' => 'Име на артикул | Имена на артикули', + + 'show_discount' => ':discount% отстъпка', + 'add_discount' => 'Добави отстъпка', + 'discount_desc' => 'на междинна сума', + + 'payment_due' => 'Дължимото плащане', + 'amount_due' => 'Дължимата сума', + 'paid' => 'Платени', + 'histories' => 'История', + 'payments' => 'Плащания', + 'add_payment' => 'Добавяне на плащане', + 'mark_received' => 'Отбелязване като получено', + 'download_pdf' => 'Изтегляне на PDF', + 'send_mail' => 'Изпращане на имейл', + + 'status' => [ + 'draft' => 'Чернова', + 'received' => 'Получено', + 'partial' => 'Частичен', + 'paid' => 'Платен', + ], + + 'messages' => [ + 'received' => 'Фактура, отбелязана като платена!', + ], + +]; diff --git a/resources/lang/bg-BG/companies.php b/resources/lang/bg-BG/companies.php new file mode 100755 index 0000000..4b38f3b --- /dev/null +++ b/resources/lang/bg-BG/companies.php @@ -0,0 +1,13 @@ + 'Домейн', + 'logo' => 'Лого', + 'manage' => 'Управление на фирми', + 'all' => 'Всички фирми', + 'error' => [ + 'delete_active' => 'Грешка: Невъзможно изтриване на активна компания, моля, първо я променете!', + ], + +]; diff --git a/resources/lang/bg-BG/currencies.php b/resources/lang/bg-BG/currencies.php new file mode 100755 index 0000000..8272f98 --- /dev/null +++ b/resources/lang/bg-BG/currencies.php @@ -0,0 +1,18 @@ + 'Код', + 'rate' => 'Курс', + 'default' => 'Валута по подразбиране', + 'decimal_mark' => 'Десетичен знак', + 'thousands_separator' => 'Разделител за хилядни', + 'precision' => 'Точност', + 'symbol' => [ + 'symbol' => 'Символ', + 'position' => 'Символ позиция', + 'before' => 'Преди сума', + 'after' => 'След сума', + ] + +]; diff --git a/resources/lang/bg-BG/customers.php b/resources/lang/bg-BG/customers.php new file mode 100755 index 0000000..e795ea9 --- /dev/null +++ b/resources/lang/bg-BG/customers.php @@ -0,0 +1,11 @@ + 'Разрешавате ли достъп?', + 'user_created' => 'Създаден потребител', + + 'error' => [ + 'email' => 'Този имейл вече е бил регистриран.' + ] +]; diff --git a/resources/lang/bg-BG/dashboard.php b/resources/lang/bg-BG/dashboard.php new file mode 100755 index 0000000..d0709bb --- /dev/null +++ b/resources/lang/bg-BG/dashboard.php @@ -0,0 +1,24 @@ + 'Общо приходи', + 'receivables' => 'Вземания', + 'open_invoices' => 'Отворени фактури', + 'overdue_invoices' => 'Просрочени фактури', + 'total_expenses' => 'Общо разходи', + 'payables' => 'Задължения', + 'open_bills' => 'Отворени задължения', + 'overdue_bills' => 'Просрочени задължения', + 'total_profit' => 'Обща печалба', + 'open_profit' => 'Отвори печалба', + 'overdue_profit' => 'Закъсняла печалба', + 'cash_flow' => 'Паричен поток', + 'no_profit_loss' => 'Няма печалба загуба', + 'incomes_by_category' => 'Приходи по категория', + 'expenses_by_category' => 'Разходи по категория', + 'account_balance' => 'Салдо', + 'latest_incomes' => 'Последни приходи', + 'latest_expenses' => 'Последни разходи', + +]; diff --git a/resources/lang/bg-BG/demo.php b/resources/lang/bg-BG/demo.php new file mode 100755 index 0000000..3c798a2 --- /dev/null +++ b/resources/lang/bg-BG/demo.php @@ -0,0 +1,16 @@ + 'В брой', + 'categories_deposit' => 'Депозит', + 'categories_sales' => 'Продажби', + 'currencies_usd' => 'Американски долар', + 'currencies_eur' => 'Евро', + 'currencies_gbp' => 'Британска лира', + 'currencies_try' => 'Турска лира', + 'taxes_exempt' => 'Освободени от данъци', + 'taxes_normal' => 'Нормален данък', + 'taxes_sales' => 'Данък продажби', + +]; diff --git a/resources/lang/bg-BG/footer.php b/resources/lang/bg-BG/footer.php new file mode 100755 index 0000000..8b50bb5 --- /dev/null +++ b/resources/lang/bg-BG/footer.php @@ -0,0 +1,9 @@ + 'Версия', + 'powered' => 'С подкрепата на Akaunting', + 'software' => 'Безплатен счетоводен софтуер', + +]; diff --git a/resources/lang/bg-BG/general.php b/resources/lang/bg-BG/general.php new file mode 100755 index 0000000..10aff9b --- /dev/null +++ b/resources/lang/bg-BG/general.php @@ -0,0 +1,121 @@ + 'Стока | Стоки', + 'incomes' => 'Приход | Приходи', + 'invoices' => 'Фактура | Фактури', + 'revenues' => 'Приходи | Приходи', + 'customers' => 'Клиент | Клиенти', + 'expenses' => 'Разход| Разходи', + 'bills' => 'Фактура| Фактура', + 'payments' => 'Плащане | Плащания', + 'vendors' => 'Доставчик | Доставчици', + 'accounts' => 'Сметка | Сметки', + 'transfers' => 'Трансфер | Трансфери', + 'transactions' => 'Транзакция | Транзакции', + 'reports' => 'Доклад | Доклади', + 'settings' => 'Настройка | Настройки', + 'categories' => 'Категория | Категории', + 'currencies' => 'Валута | Валути', + 'tax_rates' => 'Данък | Данъци', + 'users' => 'Потребител | Потребители', + 'roles' => 'Роля | Роли', + 'permissions' => 'Позволение | Позволения', + 'modules' => 'Добавка | Добавки', + 'companies' => 'Компания | Компании', + 'profits' => 'Печалба | Печалби', + 'taxes' => 'Данък | Данъци', + 'logos' => 'Лого | Лога', + 'pictures' => 'Снимка | Снимки', + 'types' => 'Тип | Видове', + 'payment_methods' => 'Метод на плащане | Начини на плащане', + 'compares' => 'Приход срещу разход | Приходи срещу разходи', + 'notes' => 'Бележка | Бележки', + 'totals' => 'Общо | Общи суми', + 'languages' => 'Език | Езици', + 'updates' => 'Актуализация | Актуализации', + 'numbers' => 'Номер | Числа', + 'statuses' => 'Статус | Статуси', + 'others' => 'Други|други', + + 'dashboard' => 'Табло', + 'banking' => 'Банкиране', + 'general' => 'Общи', + 'no_records' => 'Няма записи.', + 'date' => 'Дата', + 'amount' => 'Сума', + 'enabled' => 'Включен', + 'disabled' => 'Изключен', + 'yes' => 'Да', + 'no' => 'Не', + 'na' => 'Не е достъпно', + 'daily' => 'Дневно', + 'monthly' => 'Месечно', + 'quarterly' => 'На тримесечие', + 'yearly' => 'Годишно', + 'add' => 'Добави', + 'add_new' => 'Добави нов', + 'show' => 'Покажи', + 'edit' => 'Редактиране', + 'delete' => 'Изтрий', + 'send' => 'Изпрати', + 'download' => 'Изтегли', + 'delete_confirm' => 'Потвърждаване на изтриване :name :type?', + 'name' => 'Име', + 'email' => 'Имейл', + 'tax_number' => 'Данъчен номер', + 'phone' => 'Телефон', + 'address' => 'Адрес', + 'website' => 'Сайт', + 'actions' => 'Действия', + 'description' => 'Описание', + 'manage' => 'Управление', + 'code' => 'Код', + 'alias' => 'Псевдоним', + 'balance' => 'Баланс', + 'reference' => 'Референция', + 'attachment' => 'Прикачен файл', + 'change' => 'Промени', + 'switch' => 'Превключи', + 'color' => 'Цвят', + 'save' => 'Запиши', + 'cancel' => 'Отмени', + 'from' => 'От', + 'to' => 'До', + 'print' => 'Печат', + 'search' => 'Търси', + 'search_placeholder' => 'Пиши да търсиш..', + 'filter' => 'Филтър', + 'help' => 'Помощ', + 'all' => 'Всички', + 'all_type' => 'Всички :type', + 'upcoming' => 'Приближаващ', + 'created' => 'Създаден', + 'id' => 'ID', + 'more_actions' => 'Още действия', + 'duplicate' => 'Дублиране', + 'unpaid' => 'Неплатени', + 'paid' => 'Платени', + 'overdue' => 'Прослочени', + 'partially' => 'Частичен', + 'partially_paid' => 'Частично платено', + 'export' => 'Експорт', + 'enable' => 'Включи', + 'disable' => 'Изключи', + + 'title' => [ + 'new' => 'Нов :type', + 'edit' => 'Редактирай :type', + ], + + 'form' => [ + 'enter' => 'Въведи :field', + 'select' => [ + 'field' => '- Избери :field -', + 'file' => 'Изберете файл', + ], + 'no_file_selected' => 'Не е избран файл...', + ], + +]; diff --git a/resources/lang/bg-BG/header.php b/resources/lang/bg-BG/header.php new file mode 100755 index 0000000..211b195 --- /dev/null +++ b/resources/lang/bg-BG/header.php @@ -0,0 +1,15 @@ + 'Промяна на езика', + 'last_login' => 'Последно влизане :time', + 'notifications' => [ + 'counter' => '{0} Нямате известия|{1} Имате :count ново известие|[2,*] Имате :count нови известия', + 'overdue_invoices' => '{1} :count просрочено вземане|[2,*] :count просрочени вземания', + 'upcoming_bills' => '{1} :count наближаваща фактура|[2,*] :count наближаващи фактури', + 'items_stock' => '{1} :count стока без наличност|[2,*] :count стоки без наличност', + 'view_all' => 'Вижте всички' + ], + +]; diff --git a/resources/lang/bg-BG/import.php b/resources/lang/bg-BG/import.php new file mode 100755 index 0000000..9de2c28 --- /dev/null +++ b/resources/lang/bg-BG/import.php @@ -0,0 +1,9 @@ + 'Импортиране', + 'title' => 'Импортиране :type', + 'message' => 'Разрешени формати: CSV, XLS. Моля, изтегли примерен файл.', + +]; diff --git a/resources/lang/bg-BG/install.php b/resources/lang/bg-BG/install.php new file mode 100755 index 0000000..818a371 --- /dev/null +++ b/resources/lang/bg-BG/install.php @@ -0,0 +1,44 @@ + 'Следващ', + 'refresh' => 'Обновяване', + + 'steps' => [ + 'requirements' => 'Моля обърнете се към вашия хостинг доставчик да поправите грешките!', + 'language' => 'Стъпка 1/3: Избор на език', + 'database' => 'Стъпка 2/3: Избор на база данни', + 'settings' => 'Стъпка 3/3: Детайли на компанията и администратора', + ], + + 'language' => [ + 'select' => 'Изберете език', + ], + + 'requirements' => [ + 'enabled' => ':feature трябва да бъде активирана!', + 'disabled' => ':feature трябва да бъде дезактивирана!', + 'extension' => ':extension разширението трябва да бъде заредено!', + 'directory' => ':directory директорията трябва да е с разрешение за промяна!', + ], + + 'database' => [ + 'hostname' => 'Име на хост', + 'username' => 'Потребителско име', + 'password' => 'Парола', + 'name' => 'База данни', + ], + + 'settings' => [ + 'company_name' => 'Име на компанията', + 'company_email' => 'Имейл на компанията', + 'admin_email' => 'Администраторски имейл', + 'admin_password' => 'Администраторска парола', + ], + + 'error' => [ + 'connection' => 'Грешка: Не можа да се свърже с базата данни! Моля, уверете се, че данните са правилни.', + ], + +]; diff --git a/resources/lang/bg-BG/invoices.php b/resources/lang/bg-BG/invoices.php new file mode 100755 index 0000000..19ef404 --- /dev/null +++ b/resources/lang/bg-BG/invoices.php @@ -0,0 +1,55 @@ + 'Номер на фактура', + 'invoice_date' => 'Дата на фактура', + 'total_price' => 'Обща цена', + 'due_date' => 'Падежна дата', + 'order_number' => 'Номер на поръчка', + 'bill_to' => 'Издадена на', + + 'quantity' => 'Количество', + 'price' => 'Цена', + 'sub_total' => 'Междинна сума', + 'discount' => 'Отстъпка', + 'tax_total' => 'Общо данък', + 'total' => 'Общо', + + 'item_name' => 'Име на артикул | Имена на артикули', + + 'show_discount' => ':discount% отстъпка', + 'add_discount' => 'Добави отстъпка', + 'discount_desc' => 'на междинна сума', + + 'payment_due' => 'Дължимото плащане', + 'paid' => 'Платен', + 'histories' => 'История', + 'payments' => 'Плащания', + 'add_payment' => 'Добавяне на плащане', + 'mark_paid' => 'Отбележи като платено', + 'mark_sent' => 'Маркирай като изпратено', + 'download_pdf' => 'Изтегляне на PDF', + 'send_mail' => 'Изпращане на имейл', + + 'status' => [ + 'draft' => 'Чернова', + 'sent' => 'Изпратено', + 'viewed' => 'Разгледани', + 'approved' => 'Одобрени', + 'partial' => 'Частичен', + 'paid' => 'Платен', + ], + + 'messages' => [ + 'email_sent' => 'И-мейла беше изпратен успешно!', + 'marked_sent' => 'Фактурата беше изпратена успешно!', + 'email_required' => 'Няма имейл адрес за този клиент!', + ], + + 'notification' => [ + 'message' => 'Вие получавате този имейл, защото имате предстояща фактура за плащане на стойност :amount на :customer.', + 'button' => 'Плати сега', + ], + +]; diff --git a/resources/lang/bg-BG/items.php b/resources/lang/bg-BG/items.php new file mode 100755 index 0000000..f5db258 --- /dev/null +++ b/resources/lang/bg-BG/items.php @@ -0,0 +1,15 @@ + 'Количество | Количества', + 'sales_price' => 'Продажна цена', + 'purchase_price' => 'Покупна цена', + 'sku' => 'SKU', + + 'notification' => [ + 'message' => 'Вие получавате този имейл, защото :name е на изчерпване.', + 'button' => 'Покажи сега', + ], + +]; diff --git a/resources/lang/bg-BG/messages.php b/resources/lang/bg-BG/messages.php new file mode 100755 index 0000000..7a39131 --- /dev/null +++ b/resources/lang/bg-BG/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => ':type добавен!', + 'updated' => ':type променен!', + 'deleted' => ':type изтрит!', + 'duplicated' => ':type дублиран!', + 'imported' => ':type импортиран!', + 'enabled' => ':type включен!', + 'disabled' => ':type изключен!', + ], + 'error' => [ + 'over_payment' => 'Грешка: Плащането не е добавено! Сумата преминава общата сума.', + 'not_user_company' => 'Грешка: Не ви е позволено да управлявате тази компания!', + 'customer' => 'Грешка: Потребителят не е създаден! :name вече използва този имейл адрес.', + 'no_file' => 'Грешка: Няма избран файл!', + 'last_category' => 'Грешка: Не може да изтриете последния :type категория!', + 'invalid_token' => 'Грешка: Маркера е невалиден!', + 'import_column' => 'Грешк: :message Sheet name: :sheet. Line number: :line.', + 'import_sheet' => 'Грешка: Невалидно име. Моля, прегледайте примерния файл.', + ], + 'warning' => [ + 'deleted' => 'Предупреждение: Не ви е позволено да изтриете :name, защото има :text свързан.', + 'disabled' => 'Предупреждение: Не ви е позволено да деактивирате :name, защото има :text свързан.', + ], + +]; diff --git a/resources/lang/bg-BG/modules.php b/resources/lang/bg-BG/modules.php new file mode 100755 index 0000000..e5ccea6 --- /dev/null +++ b/resources/lang/bg-BG/modules.php @@ -0,0 +1,58 @@ + 'API Token', + 'api_token' => 'Token', + 'my_apps' => 'Моите приложения', + 'top_paid' => 'Топ платени', + 'new' => 'Нов', + 'top_free' => 'Топ безплатни', + 'free' => 'БЕЗПЛАТНО', + 'search' => 'Търси', + 'install' => 'Инсталирай', + 'buy_now' => 'Купете сега', + 'token_link' => 'Натиснете тук за да получите Вашия API token.', + 'no_apps' => 'Все още няма приложения в тази категория.', + 'developer' => 'Вие сте разработчик? Тук можете да научите как да създадете приложение и да започнете да продавате днес!', + + 'about' => 'Относно', + + 'added' => 'Добавено', + 'updated' => 'Обновено', + 'compatibility' => 'Съвместимост', + + 'installed' => ':module инсталиран', + 'uninstalled' => ':module деинсталиран', + //'updated' => ':module updated', + 'enabled' => ':module включен', + 'disabled' => ':module изключен', + + 'tab' => [ + 'installation' => 'Инсталация', + 'faq' => 'ЧЗВ', + 'changelog' => 'Списък на промените', + ], + + 'installation' => [ + 'header' => 'Инсталиране на приложение', + 'download' => 'Изтегляне :module файл.', + 'unzip' => 'Извличане :module файлове.', + 'install' => 'Инсталиране :module файлове.', + ], + + 'badge' => [ + 'installed' => 'Инсталирано', + ], + + 'button' => [ + 'uninstall' => 'Деинсталирай', + 'disable' => 'Изключи', + 'enable' => 'Активирай', + ], + + 'my' => [ + 'purchased' => 'Закупени', + 'installed' => 'Инсталирани', + ], +]; diff --git a/resources/lang/bg-BG/notifications.php b/resources/lang/bg-BG/notifications.php new file mode 100755 index 0000000..a6dbe6f --- /dev/null +++ b/resources/lang/bg-BG/notifications.php @@ -0,0 +1,10 @@ + 'Опа!', + 'hello' => 'Здравейте!', + 'salutation' => 'Поздрави,
    :company_name', + 'subcopy' => 'Ако срещате проблеми при щракване върху бутона ":text", копирайте и поставете URL-долу във вашия уеб браузър: [: url](:url)', + +]; diff --git a/resources/lang/bg-BG/pagination.php b/resources/lang/bg-BG/pagination.php new file mode 100755 index 0000000..5c22e0f --- /dev/null +++ b/resources/lang/bg-BG/pagination.php @@ -0,0 +1,9 @@ + '« Предишна', + 'next' => 'Следваща »', + 'showing' => 'Показване на :first до :last от общо :total :type', + +]; diff --git a/resources/lang/bg-BG/passwords.php b/resources/lang/bg-BG/passwords.php new file mode 100755 index 0000000..bc8de29 --- /dev/null +++ b/resources/lang/bg-BG/passwords.php @@ -0,0 +1,22 @@ + 'Паролата трябва да бъде поне шест знака и да съвпада.', + 'reset' => 'Паролата е ресетната!', + 'sent' => 'Изпратено е напомняне за вашата парола!', + 'token' => 'Този токен за ресет на парола е невалиден.', + 'user' => "Потребител с такъв e-mail адрес не може да бъде открит.", + +]; diff --git a/resources/lang/bg-BG/recurring.php b/resources/lang/bg-BG/recurring.php new file mode 100755 index 0000000..636129b --- /dev/null +++ b/resources/lang/bg-BG/recurring.php @@ -0,0 +1,20 @@ + 'Повтарящи се', + 'every' => 'Всеки', + 'period' => 'Период', + 'times' => 'Пъти', + 'daily' => 'Дневно', + 'weekly' => 'Седмично', + 'monthly' => 'Месечно', + 'yearly' => 'Годишно', + 'custom' => 'По избор', + 'days' => 'Ден (дни)', + 'weeks' => 'Седмица(и)', + 'months' => 'Месец(и)', + 'years' => 'Година(и)', + 'message' => 'Това е повтарящ се :type и следващия :type ще се генерира автоматично на :date', + +]; diff --git a/resources/lang/bg-BG/reports.php b/resources/lang/bg-BG/reports.php new file mode 100755 index 0000000..a9402c1 --- /dev/null +++ b/resources/lang/bg-BG/reports.php @@ -0,0 +1,30 @@ + 'Текущата година', + 'previous_year' => 'Миналата година', + 'this_quarter' => 'Текущото тримесечие', + 'previous_quarter' => 'Предходното тримесечие', + 'last_12_months' => 'Последните 12 месеца', + 'profit_loss' => 'Печалба & загуба', + 'gross_profit' => 'Брутна печалба', + 'net_profit' => 'Нетна печалба', + 'total_expenses' => 'Общо разходи', + 'net' => 'НЕТНО', + + 'summary' => [ + 'income' => 'Приходи', + 'expense' => 'Разходи', + 'income_expense' => 'Приходи срещу разходи', + 'tax' => 'Данъчни Резюме', + ], + + 'quarter' => [ + '1' => 'Ян-Мар', + '2' => 'Април-юни', + '3' => 'Юли-септември', + '4' => 'Октомври-декември', + ], + +]; diff --git a/resources/lang/bg-BG/settings.php b/resources/lang/bg-BG/settings.php new file mode 100755 index 0000000..48e4474 --- /dev/null +++ b/resources/lang/bg-BG/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Име', + 'email' => 'Имейл', + 'phone' => 'Телефон', + 'address' => 'Адрес', + 'logo' => 'Лого', + ], + 'localisation' => [ + 'tab' => 'Локализиране', + 'date' => [ + 'format' => 'Формат на датата', + 'separator' => 'Разделител за дата', + 'dash' => 'Тире (-)', + 'dot' => 'Точка (.)', + 'comma' => 'Запетая (,)', + 'slash' => 'Наклонена черта (/)', + 'space' => 'Празно място ( )', + ], + 'timezone' => 'Часова зона', + 'percent' => [ + 'title' => 'Процент (%) Позиция', + 'before' => 'Преди номер', + 'after' => 'След номер', + ], + ], + 'invoice' => [ + 'tab' => 'Фактура', + 'prefix' => 'Префикс', + 'digit' => 'Брой цифри', + 'next' => 'Следващия номер', + 'logo' => 'Лого', + ], + 'default' => [ + 'tab' => 'По подразбиране', + 'account' => 'Акаунт по подразбиране', + 'currency' => 'Валута по подразбиране', + 'tax' => 'Данъчна ставка по подразбиране', + 'payment' => 'Начин на плащане по подразбиране', + 'language' => 'Език по подразбиране', + ], + 'email' => [ + 'protocol' => 'Протокол', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP хост', + 'port' => 'SMTP порт', + 'username' => 'SMTP потребител', + 'password' => 'SMTP парола', + 'encryption' => 'SMTP сигурност', + 'none' => 'Няма', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Път към Sendmail', + 'log' => 'Лог имейли', + ], + 'scheduling' => [ + 'tab' => 'График на дейностите', + 'send_invoice' => 'Изпрати напомняне за фактура', + 'invoice_days' => 'Изпрати след забавени дни', + 'send_bill' => 'Изпрати напомняне за фактура', + 'bill_days' => 'Изпрати преди забавени дни', + 'cron_command' => 'Грешна команда', + 'schedule_time' => 'Час за стартиране', + ], + 'appearance' => [ + 'tab' => 'Външен вид', + 'theme' => 'Тема', + 'light' => 'Светла', + 'dark' => 'Тъмна', + 'list_limit' => 'Резултати на страница', + 'use_gravatar' => 'Използвай Gravatar', + ], + 'system' => [ + 'tab' => 'Система', + 'session' => [ + 'lifetime' => 'Сесия живот (минути)', + 'handler' => 'Управление на сесиите', + 'file' => 'Файл', + 'database' => 'База данни', + ], + 'file_size' => 'Макс размер на файл (МБ)', + 'file_types' => 'Разрешени типове файлове', + ], + +]; diff --git a/resources/lang/bg-BG/taxes.php b/resources/lang/bg-BG/taxes.php new file mode 100755 index 0000000..1552e6e --- /dev/null +++ b/resources/lang/bg-BG/taxes.php @@ -0,0 +1,8 @@ + 'Данък', + 'rate_percent' => 'Ставка (%)', + +]; diff --git a/resources/lang/bg-BG/transfers.php b/resources/lang/bg-BG/transfers.php new file mode 100755 index 0000000..7e70fdd --- /dev/null +++ b/resources/lang/bg-BG/transfers.php @@ -0,0 +1,12 @@ + 'От сметка', + 'to_account' => 'Към сметка', + + 'messages' => [ + 'delete' => ':from до :to (:amount)', + ], + +]; diff --git a/resources/lang/bg-BG/updates.php b/resources/lang/bg-BG/updates.php new file mode 100755 index 0000000..a8e567c --- /dev/null +++ b/resources/lang/bg-BG/updates.php @@ -0,0 +1,15 @@ + 'Инсталирана версия', + 'latest_version' => 'Последна версия', + 'update' => 'Актуализиране на Akaunting до :version версия', + 'changelog' => 'Списък на промените', + 'check' => 'Проверете', + 'new_core' => 'Актуализирана версия на Akaunting е налична.', + 'latest_core' => 'Поздравления! Вие имате последната версия на Akaunting. Бъдещите актуализации ще се прилагат автоматично.', + 'success' => 'Процес на актуализиране е завършен успешно.', + 'error' => 'Процес на актуализиране беше прекъснат, моля, опитайте отново.', + +]; diff --git a/resources/lang/bg-BG/validation.php b/resources/lang/bg-BG/validation.php new file mode 100755 index 0000000..96e42b4 --- /dev/null +++ b/resources/lang/bg-BG/validation.php @@ -0,0 +1,120 @@ + 'Трябва да приемете :attribute.', + 'active_url' => 'Полето :attribute не е валиден URL адрес.', + 'after' => 'Полето :attribute трябва да бъде дата след :date.', + 'after_or_equal' => 'Полето :attribute трябва да бъде дата след или равна на :date.', + 'alpha' => 'Полето :attribute трябва да съдържа само букви.', + 'alpha_dash' => 'Полето :attribute трябва да съдържа само букви, цифри, долна черта и тире.', + 'alpha_num' => 'Полето :attribute трябва да съдържа само букви и цифри.', + 'array' => 'Полето :attribute трябва да бъде масив.', + 'before' => 'Полето :attribute трябва да бъде дата преди :date.', + 'before_or_equal' => 'Полето :attribute трябва да бъде дата преди или равна на :date.', + 'between' => [ + 'numeric' => 'Полето :attribute трябва да бъде между :min и :max.', + 'file' => 'Полето :attribute трябва да бъде между :min и :max килобайта.', + 'string' => 'Полето :attribute трябва да бъде между :min и :max знака.', + 'array' => 'Полето :attribute трябва да има между :min - :max елемента.', + ], + 'boolean' => 'Полето :attribute трябва да съдържа Да или Не', + 'confirmed' => 'Полето :attribute не е потвърдено.', + 'date' => 'Полето :attribute не е валидна дата.', + 'date_format' => 'Полето :attribute не е във формат :format.', + 'different' => 'Полетата :attribute и :other трябва да са различни.', + 'digits' => 'Полето :attribute трябва да има :digits цифри.', + 'digits_between' => 'Полето :attribute трябва да има между :min и :max цифри.', + 'dimensions' => 'Невалидни размери за снимка :attribute.', + 'distinct' => 'Данните в полето :attribute се дублират.', + 'email' => 'Полето :attribute е в невалиден формат.', + 'exists' => 'Избранато поле :attribute вече съществува.', + 'file' => ':attribute трябва да е файл.', + 'filled' => 'Полето :attribute е задължително.', + 'image' => 'Полето :attribute трябва да бъде изображение.', + 'in' => 'Избраното поле :attribute е невалидно.', + 'in_array' => 'Полето :attribute не съществува в :other.', + 'integer' => 'Полето :attribute трябва да бъде цяло число.', + 'ip' => 'Полето :attribute трябва да бъде IP адрес.', + 'json' => 'Полето :attribute трябва да бъде JSON низ.', + 'max' => [ + 'numeric' => 'Полето :attribute трябва да бъде по-малко от :max.', + 'file' => 'Полето :attribute трябва да бъде по-малко от :max килобайта.', + 'string' => 'Полето :attribute трябва да бъде по-малко от :max знака.', + 'array' => 'Полето :attribute трябва да има по-малко от :max елемента.', + ], + 'mimes' => 'Полето :attribute трябва да бъде файл от тип: :values.', + 'mimetypes' => 'Полето :attribute трябва да бъде файл от тип: :values.', + 'min' => [ + 'numeric' => 'Полето :attribute трябва да бъде минимум :min.', + 'file' => 'Полето :attribute трябва да бъде минимум :min килобайта.', + 'string' => 'Полето :attribute трябва да бъде минимум :min знака.', + 'array' => 'Полето :attribute трябва има минимум :min елемента.', + ], + 'not_in' => 'Избраното поле :attribute е невалидно.', + 'numeric' => 'Полето :attribute трябва да бъде число.', + 'present' => 'Полето :attribute трябва да съествува.', + 'regex' => 'Полето :attribute е в невалиден формат.', + 'required' => 'Полето :attribute е задължително.', + 'required_if' => 'Полето :attribute се изисква, когато :other е :value.', + 'required_unless' => 'Полето :attribute е задължително освен ако :other е в :values.', + 'required_with' => 'Полето :attribute се изисква, когато :values има стойност.', + 'required_with_all' => 'Полето :attribute е задължително, когато :values имат стойност.', + 'required_without' => 'Полето :attribute се изисква, когато :values няма стойност.', + 'required_without_all' => 'Полето :attribute се изисква, когато никое от полетата :values няма стойност.', + 'same' => 'Полетата :attribute и :other трябва да съвпадат.', + 'size' => [ + 'numeric' => 'Полето :attribute трябва да бъде :size.', + 'file' => 'Полето :attribute трябва да бъде :size килобайта.', + 'string' => 'Полето :attribute трябва да бъде :size знака.', + 'array' => 'Полето :attribute трябва да има :size елемента.', + ], + 'string' => 'Полето :attribute трябва да бъде знаков низ.', + 'timezone' => 'Полето :attribute трябва да съдържа валидна часова зона.', + 'unique' => 'Полето :attribute вече съществува.', + 'uploaded' => 'Неуспешно качване на :attribute.', + 'url' => 'Полето :attribute е в невалиден формат.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + 'invalid_currency' => ':attribute код е невалиден.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/cs-CZ/accounts.php b/resources/lang/cs-CZ/accounts.php new file mode 100755 index 0000000..4f6863c --- /dev/null +++ b/resources/lang/cs-CZ/accounts.php @@ -0,0 +1,14 @@ + 'Název účtu', + 'number' => 'Číslo', + 'opening_balance' => 'Počáteční zůstatek', + 'current_balance' => 'Aktuální zůstatek', + 'bank_name' => 'Název banky', + 'bank_phone' => 'Telefon do banky', + 'bank_address' => 'Adresa banky', + 'default_account' => 'Výchozí účet', + +]; diff --git a/resources/lang/cs-CZ/auth.php b/resources/lang/cs-CZ/auth.php new file mode 100755 index 0000000..0ec7d09 --- /dev/null +++ b/resources/lang/cs-CZ/auth.php @@ -0,0 +1,30 @@ + 'Profil', + 'logout' => 'Odhlásit', + 'login' => 'Přihlášení', + 'login_to' => 'Přihlasit se a začít relaci', + 'remember_me' => 'Pamatuj si mě', + 'forgot_password' => 'Zapoměl jsem heslo', + 'reset_password' => 'Reset hesla', + 'enter_email' => 'Zadejte svou emailovou adresu', + 'current_email' => 'Aktuální email', + 'reset' => 'Resetovat', + 'never' => 'nikdy', + 'password' => [ + 'current' => 'Heslo', + 'current_confirm' => 'Potvrzení hesla', + 'new' => 'Nové heslo', + 'new_confirm' => 'Potvrzení nového hesla', + ], + 'error' => [ + 'self_delete' => 'Chyba: nemůžeš smazat sám sebe!' + ], + + 'failed' => 'Tyto přihlašovací údaje neodpovídají žadnému záznamu.', + 'disabled' => 'Tento účet je zakázán. Obraťte se na správce systému.', + 'throttle' => 'Příliš mnoho pokusů o přihlášení. Zkuste to prosím znovu za :seconds vteřin.', + +]; diff --git a/resources/lang/cs-CZ/bills.php b/resources/lang/cs-CZ/bills.php new file mode 100755 index 0000000..e95ad8e --- /dev/null +++ b/resources/lang/cs-CZ/bills.php @@ -0,0 +1,46 @@ + 'Účet číslo', + 'bill_date' => 'Datum účtu', + 'total_price' => 'Celková cena', + 'due_date' => 'Datum splatnosti', + 'order_number' => 'Číslo objednávky', + 'bill_from' => 'Platba od', + + 'quantity' => 'Množství', + 'price' => 'Cena', + 'sub_total' => 'Mezisoučet', + 'discount' => 'Discount', + 'tax_total' => 'Dph celkem', + 'total' => 'Celkem', + + 'item_name' => 'Jméno položky | Jméno položek', + + 'show_discount' => ':discount% Discount', + 'add_discount' => 'Add Discount', + 'discount_desc' => 'of subtotal', + + 'payment_due' => 'Splatnost platby', + 'amount_due' => 'Dlužná částka', + 'paid' => 'Zaplaceno', + 'histories' => 'Historie', + 'payments' => 'Platby', + 'add_payment' => 'Přidat platbu', + 'mark_received' => 'Označ za přijatou', + 'download_pdf' => 'Stáhnout PDF', + 'send_mail' => 'Poslat email', + + 'status' => [ + 'draft' => 'Koncept', + 'received' => 'Přijato', + 'partial' => 'Častečná', + 'paid' => 'Zaplaceno', + ], + + 'messages' => [ + 'received' => 'Bylo úspěšně označeno jako přijaté!', + ], + +]; diff --git a/resources/lang/cs-CZ/companies.php b/resources/lang/cs-CZ/companies.php new file mode 100755 index 0000000..d08a5a4 --- /dev/null +++ b/resources/lang/cs-CZ/companies.php @@ -0,0 +1,13 @@ + 'Doména', + 'logo' => 'Logo', + 'manage' => 'Správa společností', + 'all' => 'Všechny společnosti', + 'error' => [ + 'delete_active' => 'Chyba: Nejde smazat aktivní společnost. Nejdřív ji změnte!', + ], + +]; diff --git a/resources/lang/cs-CZ/currencies.php b/resources/lang/cs-CZ/currencies.php new file mode 100755 index 0000000..9fc1feb --- /dev/null +++ b/resources/lang/cs-CZ/currencies.php @@ -0,0 +1,18 @@ + 'Kód', + 'rate' => 'Kurz', + 'default' => 'Výchozí měna', + 'decimal_mark' => 'Desetinná značka', + 'thousands_separator' => 'Oddělovač tisíců', + 'precision' => 'Přesnost', + 'symbol' => [ + 'symbol' => 'Symbol', + 'position' => 'Pozice symbolu', + 'before' => 'Před částkou', + 'after' => 'Za částkou', + ] + +]; diff --git a/resources/lang/cs-CZ/customers.php b/resources/lang/cs-CZ/customers.php new file mode 100755 index 0000000..f1c255d --- /dev/null +++ b/resources/lang/cs-CZ/customers.php @@ -0,0 +1,11 @@ + 'Povolit přihlášení?', + 'user_created' => 'Uživatel vytvořen', + + 'error' => [ + 'email' => 'Tato emailová adresa je už obsazena.' + ] +]; diff --git a/resources/lang/cs-CZ/dashboard.php b/resources/lang/cs-CZ/dashboard.php new file mode 100755 index 0000000..f9b5e83 --- /dev/null +++ b/resources/lang/cs-CZ/dashboard.php @@ -0,0 +1,24 @@ + 'Celkové příjmy', + 'receivables' => 'Pohledávky', + 'open_invoices' => 'Otevřené faktury', + 'overdue_invoices' => 'Nezaplacené pohledávky', + 'total_expenses' => 'Celkové výdaje', + 'payables' => 'Závazky', + 'open_bills' => 'Otevřené směnky', + 'overdue_bills' => 'Faktury po splatnosti', + 'total_profit' => 'Celkový zisk', + 'open_profit' => 'Zisk', + 'overdue_profit' => 'Zisk po splatnosti', + 'cash_flow' => 'Peněžní tok', + 'no_profit_loss' => 'No Profil Loss', + 'incomes_by_category' => 'Příjmy podle kategorie', + 'expenses_by_category' => 'Výdaje podle kategorie', + 'account_balance' => 'Zůstatek na účtu', + 'latest_incomes' => 'Poslední příjmy', + 'latest_expenses' => 'Nejnovější výdaje', + +]; diff --git a/resources/lang/cs-CZ/demo.php b/resources/lang/cs-CZ/demo.php new file mode 100755 index 0000000..d78a812 --- /dev/null +++ b/resources/lang/cs-CZ/demo.php @@ -0,0 +1,17 @@ + 'Hotovost', + 'categories_uncat' => 'Bez kategorie', + 'categories_deposit' => 'Vklad', + 'categories_sales' => 'Prodeje', + 'currencies_usd' => 'Americký dolar', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Britská libra', + 'currencies_try' => 'Turecká Lira', + 'taxes_exempt' => 'Osvobození od daně', + 'taxes_normal' => 'Normální daň', + 'taxes_sales' => 'DPH', + +]; diff --git a/resources/lang/cs-CZ/footer.php b/resources/lang/cs-CZ/footer.php new file mode 100755 index 0000000..1d7a1bb --- /dev/null +++ b/resources/lang/cs-CZ/footer.php @@ -0,0 +1,9 @@ + 'Verze', + 'powered' => 'Powered By Akaunting', + 'software' => 'Učetní software zdarma', + +]; diff --git a/resources/lang/cs-CZ/general.php b/resources/lang/cs-CZ/general.php new file mode 100755 index 0000000..7d13278 --- /dev/null +++ b/resources/lang/cs-CZ/general.php @@ -0,0 +1,117 @@ + 'Položka | Položky', + 'incomes' => 'Příjem | Příjmy', + 'invoices' => 'Faktura | Faktury', + 'revenues' => 'Příjem | Příjmy', + 'customers' => 'Zákazník | Zákazníci', + 'expenses' => 'Výdaj | Výdaje', + 'bills' => 'Faktura | Faktury', + 'payments' => 'Platba | Platby', + 'vendors' => 'Dodavatel | Dodavatelé', + 'accounts' => 'Účet | Účty', + 'transfers' => 'Převod | Převody', + 'transactions' => 'Transakce | Transakce', + 'reports' => 'Hlášení | Hlášení', + 'settings' => 'Nastavení | Nastavení', + 'categories' => 'Kategorie |Kategorie', + 'currencies' => 'Měna | Měny', + 'tax_rates' => 'Sazba daně | Daňové sazby', + 'users' => 'Uživatel | Uživatelé', + 'roles' => 'Role | Role', + 'permissions' => 'Oprávnění | Oprávnění', + 'modules' => 'Aplikace | Aplikace', + 'companies' => 'Společnost | Společnosti', + 'profits' => 'Zisk | Zisky', + 'taxes' => 'Daň | Daně', + 'logos' => 'Logo|Logos', + 'pictures' => 'Obrázek | Obrázky', + 'types' => 'Typ | Typy', + 'payment_methods' => 'Způsob platby | Způsoby platby', + 'compares' => 'Příjmy vs Výdaje | Příjmy vs Výdaje', + 'notes' => 'Poznámka | Poznámky', + 'totals' => 'Celkem | Celkem', + 'languages' => 'Jazyk | Jazyky', + 'updates' => 'Aktualizace | Aktualizace', + 'numbers' => 'Číslo | Čísla', + 'statuses' => 'Stav | Stav', + 'others' => 'Other|Others', + + 'dashboard' => 'Ovládací panel', + 'banking' => 'Bankovnictví', + 'general' => 'Obecné', + 'no_records' => 'Žádné záznamy.', + 'date' => 'Datum', + 'amount' => 'Částka', + 'enabled' => 'Povoleno', + 'disabled' => 'Zakázáno', + 'yes' => 'Ano', + 'no' => 'Ne', + 'na' => 'Neuvedeno', + 'daily' => 'Denně', + 'monthly' => 'Měsíčně', + 'quarterly' => 'Čtvrtletně', + 'yearly' => 'Ročně', + 'add' => 'Přidat', + 'add_new' => 'Přidat nové', + 'show' => 'Zobrazit', + 'edit' => 'Upravit', + 'delete' => 'Smazat', + 'send' => 'Odeslat', + 'download' => 'Stáhnout', + 'delete_confirm' => 'Potvrzení smazaní :name :type?', + 'name' => 'Jméno', + 'email' => 'E-mail', + 'tax_number' => 'Daňové číslo', + 'phone' => 'Telefon', + 'address' => 'Adresa', + 'website' => 'Webové stránky', + 'actions' => 'Akce', + 'description' => 'Popis', + 'manage' => 'Spravovat', + 'code' => 'Kód', + 'alias' => 'Alias', + 'balance' => 'Bilance', + 'reference' => 'Reference', + 'attachment' => 'Příloha', + 'change' => 'Změnit', + 'switch' => 'Přepnout', + 'color' => 'Barva', + 'save' => 'Uložit', + 'cancel' => 'Storno', + 'from' => 'Od', + 'to' => 'Pro', + 'print' => 'Tisk', + 'search' => 'Hledat', + 'search_placeholder' => 'Piš pro hledání...', + 'filter' => 'Filtrovat', + 'help' => 'Nápověda', + 'all' => 'Vše', + 'all_type' => 'Všechny: type', + 'upcoming' => 'Nadcházející', + 'created' => 'Vytvořeno', + 'id' => 'ID', + 'more_actions' => 'Další akce', + 'duplicate' => 'Duplikovat', + 'unpaid' => 'Neuhrazeno', + 'paid' => 'Uhrazeno', + 'overdue' => 'Po splatnosti', + 'partially' => 'Částečně', + 'partially_paid' => 'Částečně zaplaceno', + + 'title' => [ + 'new' => 'Nová(ý) :type', + 'edit' => 'Upravit :type', + ], + 'form' => [ + 'enter' => 'Vyplň :field', + 'select' => [ + 'field' => '- Vyber :field -', + 'file' => 'Vybrat soubor', + ], + 'no_file_selected' => 'Nebyl vybrán žádný soubor...', + ], + +]; diff --git a/resources/lang/cs-CZ/header.php b/resources/lang/cs-CZ/header.php new file mode 100755 index 0000000..08dc8be --- /dev/null +++ b/resources/lang/cs-CZ/header.php @@ -0,0 +1,15 @@ + 'Zvolit jazyk', + 'last_login' => 'Poslední přihlášení: čas', + 'notifications' => [ + 'counter' => '{0} Nemáš žádné oznámení|{1} Máš :count oznámení|[2,*] Máš :count oznámení', + 'overdue_invoices' => '{1} :count faktura po splatnosti|[2,*] :count faktury po splatnosti', + 'upcoming_bills' => '{1} :count blížící se faktura|[2,*] :count blížící se faktury', + 'items_stock' => '{1} :count položka není skladem|[2,*] :count položek není skladem', + 'view_all' => 'Zobrazit vše' + ], + +]; diff --git a/resources/lang/cs-CZ/import.php b/resources/lang/cs-CZ/import.php new file mode 100755 index 0000000..af7c616 --- /dev/null +++ b/resources/lang/cs-CZ/import.php @@ -0,0 +1,9 @@ + 'Importovat', + 'title' => 'Import :type', + 'message' => 'Povolené typy: CSV, XLS. Prosím, stáhni si vzorový soubor.', + +]; diff --git a/resources/lang/cs-CZ/install.php b/resources/lang/cs-CZ/install.php new file mode 100755 index 0000000..2a64a8d --- /dev/null +++ b/resources/lang/cs-CZ/install.php @@ -0,0 +1,44 @@ + 'Další', + 'refresh' => 'Aktualizovat', + + 'steps' => [ + 'requirements' => 'Prosím splň následující požadavky!', + 'language' => 'Krok 1/3: Výběr jazyka', + 'database' => 'Krok 2/3: Nastavení databáze', + 'settings' => 'Krok 3/3: Údaje o společnosti a administrátorovi', + ], + + 'language' => [ + 'select' => 'Zvolte jazyk', + ], + + 'requirements' => [ + 'enabled' => 'Musíš povolit :feature!', + 'disabled' => 'Musiš vypnout :feature!', + 'extension' => 'Musíš zavést rozšíření:extension!', + 'directory' => 'Do složky:directory se musí dát zapisovat!', + ], + + 'database' => [ + 'hostname' => 'Název hostitele', + 'username' => 'Uživatelské jméno', + 'password' => 'Heslo', + 'name' => 'Databáze', + ], + + 'settings' => [ + 'company_name' => 'Název společnosti', + 'company_email' => 'Email společnosti', + 'admin_email' => 'Email administratora', + 'admin_password' => 'Heslo administrátora', + ], + + 'error' => [ + 'connection' => 'Chyba: Nelze se připojit k databázi! Prosím ujistěte se, že údaje jsou správné.', + ], + +]; diff --git a/resources/lang/cs-CZ/invoices.php b/resources/lang/cs-CZ/invoices.php new file mode 100755 index 0000000..76949ad --- /dev/null +++ b/resources/lang/cs-CZ/invoices.php @@ -0,0 +1,55 @@ + 'Číslo faktury', + 'invoice_date' => 'Datum faktury', + 'total_price' => 'Celková cena', + 'due_date' => 'Datum splatnosti', + 'order_number' => 'Číslo objednávky', + 'bill_to' => 'Faktura pro', + + 'quantity' => 'Množství', + 'price' => 'Cena', + 'sub_total' => 'Mezisoučet', + 'discount' => 'Discount', + 'tax_total' => 'Daň celkem', + 'total' => 'Celkem', + + 'item_name' => 'Jméno položky | Jméno položek', + + 'show_discount' => ':discount% Discount', + 'add_discount' => 'Add Discount', + 'discount_desc' => 'of subtotal', + + 'payment_due' => 'Splatnost platby', + 'paid' => 'Zaplaceno', + 'histories' => 'Historie', + 'payments' => 'Platby', + 'add_payment' => 'Přidat platbu', + 'mark_paid' => 'Označit jako zaplaceno', + 'mark_sent' => 'Označit odesláno', + 'download_pdf' => 'Stáhnout PDF', + 'send_mail' => 'Poslat email', + + 'status' => [ + 'draft' => 'Koncept', + 'sent' => 'Odesláno', + 'viewed' => 'Zobrazeno', + 'approved' => 'Schváleno', + 'partial' => 'Častečná', + 'paid' => 'Zaplaceno', + ], + + 'messages' => [ + 'email_sent' => 'Fakturační email byl úspěšně odeslán!', + 'marked_sent' => 'Faktura byla úspěšně označena jako odeslaná!', + 'email_required' => 'Zákazník nemá uvedenou emailovou adresu!', + ], + + 'notification' => [ + 'message' => 'Obdželi jste tento email protože máte fakturovat :amount zákazníkovi :customer.', + 'button' => 'Zaplatit', + ], + +]; diff --git a/resources/lang/cs-CZ/items.php b/resources/lang/cs-CZ/items.php new file mode 100755 index 0000000..6a413b9 --- /dev/null +++ b/resources/lang/cs-CZ/items.php @@ -0,0 +1,15 @@ + 'Množství | Množství', + 'sales_price' => 'Prodejní cena', + 'purchase_price' => 'Nákupní cena', + 'sku' => 'SKU', + + 'notification' => [ + 'message' => 'Dostáváš tento email, protože :name brzo dojde.', + 'button' => 'Zobrazit', + ], + +]; diff --git a/resources/lang/cs-CZ/messages.php b/resources/lang/cs-CZ/messages.php new file mode 100755 index 0000000..88346a7 --- /dev/null +++ b/resources/lang/cs-CZ/messages.php @@ -0,0 +1,25 @@ + [ + 'added' => ':type přidán!', + 'updated' => ':type aktualizováno!', + 'deleted' => ':type odstraněno!', + 'duplicated' => ':type duplikováno!', + 'imported' => ':type importováno!', + ], + 'error' => [ + 'over_payment' => 'Error: Payment not added! Amount passes the total.', + 'not_user_company' => 'Chyba: nemůžeš provádět správu společností!', + 'customer' => 'Error: User not created! :name already uses this email address.', + 'no_file' => 'Chyba: Nebyl vybrán žádný soubor!', + 'last_category' => 'Error: Can not delete the last :type category!', + 'invalid_token' => 'Error: The token entered is invalid!', + ], + 'warning' => [ + 'deleted' => 'Upozornění: Nemůžeš odstranit :name protože je spojená s :text.', + 'disabled' => 'Upozornění: Nemůžeš vypnout :name protože je spojená s :text.', + ], + +]; diff --git a/resources/lang/cs-CZ/modules.php b/resources/lang/cs-CZ/modules.php new file mode 100755 index 0000000..92acbd0 --- /dev/null +++ b/resources/lang/cs-CZ/modules.php @@ -0,0 +1,48 @@ + 'API Token', + 'api_token' => 'Token', + 'top_paid' => 'Nejlépe prodávané', + 'new' => 'Nové', + 'top_free' => 'Nejlepší zdarma', + 'free' => 'ZDARMA', + 'search' => 'Search', + 'install' => 'Instalovat', + 'buy_now' => 'Koupit', + 'token_link' => 'Klikni sem pro získání tokenu k API.', + 'no_apps' => 'V této kategorii zatím nejsou žádné aplikace.', + 'developer' => 'Jste vývojář? Zde se můžete naučit jak vytvořit aplikaci a začít hned prodávat!', + + 'about' => 'O aplikaci', + + 'added' => 'Přidáno', + 'updated' => 'Aktualizováno', + 'compatibility' => 'Kompatibilita', + + 'installed' => ':module nainstalován', + 'uninstalled' => ':module odinstalováno', + //'updated' => ':module updated', + 'enabled' => ':module povolen', + 'disabled' => ':module zakázán', + + 'tab' => [ + 'installation' => 'Instalace', + 'faq' => 'ČKD', + 'changelog' => 'Seznam změn', + ], + + 'installation' => [ + 'header' => 'Instalace aplikace', + 'download' => 'Stahuji soubor :module.', + 'unzip' => 'Rozbaluji soubory :module.', + 'install' => 'Instaluji soubory :module.', + ], + + 'button' => [ + 'uninstall' => 'Odinstalovat', + 'disable' => 'Zakázat', + 'enable' => 'Povolit', + ], +]; diff --git a/resources/lang/cs-CZ/pagination.php b/resources/lang/cs-CZ/pagination.php new file mode 100755 index 0000000..5ea7071 --- /dev/null +++ b/resources/lang/cs-CZ/pagination.php @@ -0,0 +1,9 @@ + '« předchozí', + 'next' => 'další »', + 'showing' => 'Zobrazuji :first z :last z celkem :total :type', + +]; diff --git a/resources/lang/cs-CZ/passwords.php b/resources/lang/cs-CZ/passwords.php new file mode 100755 index 0000000..b0c7f99 --- /dev/null +++ b/resources/lang/cs-CZ/passwords.php @@ -0,0 +1,22 @@ + 'Heslo musí obsahovat alespoň 6 znaků a musí se shodovat s ověřením.', + 'reset' => 'Heslo bylo obnoveno!', + 'sent' => 'E-mail s instrukcemi k obnovení hesla byl odeslán!', + 'token' => 'Klíč pro obnovu hesla je nesprávný.', + 'user' => "Nepodařilo se najít uživatele s touto e-mailovou adresou.", + +]; diff --git a/resources/lang/cs-CZ/recurring.php b/resources/lang/cs-CZ/recurring.php new file mode 100755 index 0000000..92099c7 --- /dev/null +++ b/resources/lang/cs-CZ/recurring.php @@ -0,0 +1,20 @@ + 'Recurring', + 'every' => 'Every', + 'period' => 'Period', + 'times' => 'Times', + 'daily' => 'Daily', + 'weekly' => 'Weekly', + 'monthly' => 'Monthly', + 'yearly' => 'Yearly', + 'custom' => 'Custom', + 'days' => 'Day(s)', + 'weeks' => 'Week(s)', + 'months' => 'Month(s)', + 'years' => 'Year(s)', + 'message' => 'This is a recurring :type and the next :type will be automatically generated at :date', + +]; diff --git a/resources/lang/cs-CZ/reports.php b/resources/lang/cs-CZ/reports.php new file mode 100755 index 0000000..c1cb551 --- /dev/null +++ b/resources/lang/cs-CZ/reports.php @@ -0,0 +1,30 @@ + 'Tento rok', + 'previous_year' => 'Předchozí rok', + 'this_quarter' => 'Aktuální čtvrtletí', + 'previous_quarter' => 'Předchozí čtvrtletí', + 'last_12_months' => 'Posledních 12 měsíců', + 'profit_loss' => 'Profit & Loss', + 'gross_profit' => 'Gross Profit', + 'net_profit' => 'Net Profit', + 'total_expenses' => 'Total Expenses', + 'net' => 'NET', + + 'summary' => [ + 'income' => 'Přehled příjmů', + 'expense' => 'Přehled výdajů', + 'income_expense' => 'Příjmy vs Výdaje', + 'tax' => 'Tax Summary', + ], + + 'quarter' => [ + '1' => 'Jan-Mar', + '2' => 'Apr-Jun', + '3' => 'Jul-Sep', + '4' => 'Oct-Dec', + ], + +]; diff --git a/resources/lang/cs-CZ/settings.php b/resources/lang/cs-CZ/settings.php new file mode 100755 index 0000000..0ac5a78 --- /dev/null +++ b/resources/lang/cs-CZ/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Jméno', + 'email' => 'E-mail', + 'phone' => 'Telefon', + 'address' => 'Adresa', + 'logo' => 'Logo', + ], + 'localisation' => [ + 'tab' => 'Lokalizace', + 'date' => [ + 'format' => 'Formát data', + 'separator' => 'Oddělovač data', + 'dash' => 'Pomlčka (-)', + 'dot' => 'Tečka (.)', + 'comma' => 'Čárka ()', + 'slash' => 'Lomítko (/)', + 'space' => 'Mezera ( )', + ], + 'timezone' => 'Časové pásmo', + 'percent' => [ + 'title' => 'Percent (%) Position', + 'before' => 'Before Number', + 'after' => 'After Number', + ], + ], + 'invoice' => [ + 'tab' => 'Faktura', + 'prefix' => 'Předpona předčísli', + 'digit' => 'Předčíslí', + 'next' => 'Další číslo', + 'logo' => 'Logo', + ], + 'default' => [ + 'tab' => 'Výchozí', + 'account' => 'Výchozí účet', + 'currency' => 'Výchozí měna', + 'tax' => 'Výchozí daňová sazba', + 'payment' => 'Výchozí způsob platby', + 'language' => 'Výchozí jazyk', + ], + 'email' => [ + 'protocol' => 'Protokol', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP hostitel', + 'port' => 'SMTP port', + 'username' => 'SMTP uživatelské jméno', + 'password' => 'Heslo SMTP', + 'encryption' => 'Zabezpečení SMTP', + 'none' => 'Žádný', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Sendmail cesta', + 'log' => 'Log e-mailů', + ], + 'scheduling' => [ + 'tab' => 'Plánování', + 'send_invoice' => 'Odesílat upozornění o fakturách', + 'invoice_days' => 'Odeslat po splatnosti', + 'send_bill' => 'Odeslat upomínku', + 'bill_days' => 'Odeslat před splatností', + 'cron_command' => 'Příkaz Cronu', + 'schedule_time' => 'Hodina spuštění', + ], + 'appearance' => [ + 'tab' => 'Vzhled', + 'theme' => 'Téma', + 'light' => 'Světlý', + 'dark' => 'Tmavý', + 'list_limit' => 'Záznamů na stránku', + 'use_gravatar' => 'Použít Gravatar', + ], + 'system' => [ + 'tab' => 'Systém', + 'session' => [ + 'lifetime' => 'Životnost relace (minuty)', + 'handler' => 'Popisovač relace', + 'file' => 'Soubor', + 'database' => 'Databáze', + ], + 'file_size' => 'Max. velikost souboru (MB)', + 'file_types' => 'Povolené typy souborů', + ], + +]; diff --git a/resources/lang/cs-CZ/taxes.php b/resources/lang/cs-CZ/taxes.php new file mode 100755 index 0000000..0e73ebb --- /dev/null +++ b/resources/lang/cs-CZ/taxes.php @@ -0,0 +1,8 @@ + 'Sazba', + 'rate_percent' => 'Sazba (%)', + +]; diff --git a/resources/lang/cs-CZ/transfers.php b/resources/lang/cs-CZ/transfers.php new file mode 100755 index 0000000..61dde05 --- /dev/null +++ b/resources/lang/cs-CZ/transfers.php @@ -0,0 +1,8 @@ + 'Z účtu', + 'to_account' => 'Na účet', + +]; diff --git a/resources/lang/cs-CZ/updates.php b/resources/lang/cs-CZ/updates.php new file mode 100755 index 0000000..0a72319 --- /dev/null +++ b/resources/lang/cs-CZ/updates.php @@ -0,0 +1,15 @@ + 'Nainstalovaná verze', + 'latest_version' => 'Nejnovější verze', + 'update' => 'Aktualizovat Akaunting na: verze', + 'changelog' => 'Seznam změn', + 'check' => 'Zkontrolovat', + 'new_core' => 'K dispozici je aktualizovaná verze z Akaunting.', + 'latest_core' => 'Blahopřejeme! Máte nejnovější verzi Akaunting. Budoucí aktualizace bude nainstalována automaticky.', + 'success' => 'Proces aktualizace byl úspěšně dokončen.', + 'error' => 'Proces aktualizace se nezdařil, prosím, zkuste to znovu.', + +]; diff --git a/resources/lang/cs-CZ/validation.php b/resources/lang/cs-CZ/validation.php new file mode 100755 index 0000000..cba34a3 --- /dev/null +++ b/resources/lang/cs-CZ/validation.php @@ -0,0 +1,119 @@ + ':attribute musí být přijat.', + 'active_url' => ':attribute není platnou URL adresou.', + 'after' => ':attribute musí být datum po :date.', + 'after_or_equal' => ':attribute musí být datum po nebo rovné :date.', + 'alpha' => ':attribute může obsahovat pouze písmena.', + 'alpha_dash' => ':attribute může obsahovat pouze písmena, číslice, pomlčky a podtržítka. České znaky (á, é, í, ó, ú, ů, ž, š, č, ř, ď, ť, ň) nejsou podporovány.', + 'alpha_num' => ':attribute může obsahovat pouze písmena a číslice.', + 'array' => ':attribute musí být pole.', + 'before' => ':attribute musí být datum před :date.', + 'before_or_equal' => ':attribute musí být datum před nebo rovné :date.', + 'between' => [ + 'numeric' => ':attribute musí být hodnota mezi :min a :max.', + 'file' => ':attribute musí být větší než :min a menší než :max Kilobytů.', + 'string' => ':attribute musí být delší než :min a kratší než :max znaků.', + 'array' => ':attribute musí obsahovat nejméně :min a nesmí obsahovat více než :max prvků.', + ], + 'boolean' => ':attribute musí být true nebo false', + 'confirmed' => ':attribute nebylo odsouhlaseno.', + 'date' => ':attribute musí být platné datum.', + 'date_format' => ':attribute není platný formát data podle :format.', + 'different' => ':attribute a :other se musí lišit.', + 'digits' => ':attribute musí být :digits pozic dlouhé.', + 'digits_between' => ':attribute musí být dlouhé nejméně :min a nejvíce :max pozic.', + 'dimensions' => ':attribute má neplatné rozměry.', + 'distinct' => ':attribute má duplicitní hodnotu.', + 'email' => ':attribute není platný formát.', + 'exists' => 'Zvolená hodnota pro :attribute není platná.', + 'file' => ':attribute musí být soubor.', + 'filled' => ':attribute musí být vyplněno.', + 'image' => ':attribute musí být obrázek.', + 'in' => 'Zvolená hodnota pro :attribute je neplatná.', + 'in_array' => ':attribute není obsažen v :other.', + 'integer' => ':attribute musí být celé číslo.', + 'ip' => ':attribute musí být platnou IP adresou.', + 'json' => ':attribute musí být platný JSON řetězec.', + 'max' => [ + 'numeric' => ':attribute musí být nižší než :max.', + 'file' => ':attribute musí být menší než :max Kilobytů.', + 'string' => ':attribute musí být kratší než :max znaků.', + 'array' => ':attribute nesmí obsahovat více než :max prvků.', + ], + 'mimes' => ':attribute musí být jeden z následujících datových typů :values.', + 'mimetypes' => ':attribute musí být jeden z následujících datových typů :values.', + 'min' => [ + 'numeric' => ':attribute musí být větší než :min.', + 'file' => ':attribute musí být větší než :min Kilobytů.', + 'string' => ':attribute musí být delší než :min znaků.', + 'array' => ':attribute musí obsahovat více než :min prvků.', + ], + 'not_in' => 'Zvolená hodnota pro :attribute je neplatná.', + 'numeric' => ':attribute musí být číslo.', + 'present' => ':attribute musí být vyplněno.', + 'regex' => ':attribute nemá správný formát.', + 'required' => ':attribute musí být vyplněno.', + 'required_if' => ':attribute musí být vyplněno pokud :other je :value.', + 'required_unless' => ':attribute musí být vyplněno dokud :other je v :values.', + 'required_with' => ':attribute musí být vyplněno pokud :values je vyplněno.', + 'required_with_all' => ':attribute musí být vyplněno pokud :values je zvoleno.', + 'required_without' => ':attribute musí být vyplněno pokud :values není vyplněno.', + 'required_without_all' => ':attribute musí být vyplněno pokud není žádné z :values zvoleno.', + 'same' => ':attribute a :other se musí shodovat.', + 'size' => [ + 'numeric' => ':attribute musí být přesně :size.', + 'file' => ':attribute musí mít přesně :size Kilobytů.', + 'string' => ':attribute musí být přesně :size znaků dlouhý.', + 'array' => ':attribute musí obsahovat právě :size prvků.', + ], + 'string' => ':attribute musí být řetězec znaků.', + 'timezone' => ':attribute musí být platná časová zóna.', + 'unique' => ':attribute musí být unikátní.', + 'uploaded' => 'Nahrávání :attribute se nezdařilo.', + 'url' => 'Formát :attribute je neplatný.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/da-DK/accounts.php b/resources/lang/da-DK/accounts.php new file mode 100755 index 0000000..afe6adc --- /dev/null +++ b/resources/lang/da-DK/accounts.php @@ -0,0 +1,14 @@ + 'Kontonavn', + 'number' => 'Nummer', + 'opening_balance' => 'Åbningsbalancen', + 'current_balance' => 'Nuværende saldo', + 'bank_name' => 'Banknavn', + 'bank_phone' => 'Telefon nr. til bank', + 'bank_address' => 'Bank adresse', + 'default_account' => 'Standard konto', + +]; diff --git a/resources/lang/da-DK/auth.php b/resources/lang/da-DK/auth.php new file mode 100755 index 0000000..f6745d3 --- /dev/null +++ b/resources/lang/da-DK/auth.php @@ -0,0 +1,30 @@ + 'Profil', + 'logout' => 'Log ud', + 'login' => 'Log ind', + 'login_to' => 'Log ind for at starte din session', + 'remember_me' => 'Husk mig', + 'forgot_password' => 'Jeg har glemt min adgangskode', + 'reset_password' => 'Nulstil adgangskode', + 'enter_email' => 'Indtast din mailadresse', + 'current_email' => 'Nuværende E-mail', + 'reset' => 'Nulstil', + 'never' => 'aldrig', + 'password' => [ + 'current' => 'Adgangskode', + 'current_confirm' => 'Bekræft adgangskode', + 'new' => 'Ny adgangskode', + 'new_confirm' => 'Bekræftelse af ny adgangskode', + ], + 'error' => [ + 'self_delete' => 'Fejl: du Kan ikke slette dig selv!' + ], + + 'failed' => 'Disse legitimationsoplysninger passer ikke i vores database.', + 'disabled' => 'Denne konto er deaktiveret. Kontakt systemadministratoren.', + 'throttle' => 'For mange login forsøg. Prøv igen i :seconds sekunder.', + +]; diff --git a/resources/lang/da-DK/bills.php b/resources/lang/da-DK/bills.php new file mode 100755 index 0000000..0168bfd --- /dev/null +++ b/resources/lang/da-DK/bills.php @@ -0,0 +1,46 @@ + 'Faktura nummer', + 'bill_date' => 'Faktura dato', + 'total_price' => 'Total pris', + 'due_date' => 'Forfaldsdato', + 'order_number' => 'Ordrenummer', + 'bill_from' => 'Faktura fra', + + 'quantity' => 'Antal', + 'price' => 'Pris', + 'sub_total' => 'Subtotal', + 'discount' => 'Rabat', + 'tax_total' => 'Moms i alt', + 'total' => 'I alt', + + 'item_name' => 'Punkt navn | Varenavne', + + 'show_discount' => ':discount% Rabat', + 'add_discount' => 'Tilføj rabat', + 'discount_desc' => 'subtotal', + + 'payment_due' => 'Betalingsfrist', + 'amount_due' => 'Forfaldent beløb', + 'paid' => 'Betalt', + 'histories' => 'Historik', + 'payments' => 'Betalinger', + 'add_payment' => 'Tilføj betaling', + 'mark_received' => 'Modtagelse godkendt', + 'download_pdf' => 'Download som PDF', + 'send_mail' => 'Send e-mail', + + 'status' => [ + 'draft' => 'Udkast', + 'received' => 'Modtaget', + 'partial' => 'Delvis', + 'paid' => 'Betalt', + ], + + 'messages' => [ + 'received' => 'Regning registreret som modtaget!', + ], + +]; diff --git a/resources/lang/da-DK/companies.php b/resources/lang/da-DK/companies.php new file mode 100755 index 0000000..7128209 --- /dev/null +++ b/resources/lang/da-DK/companies.php @@ -0,0 +1,13 @@ + 'Domæne', + 'logo' => 'Logo', + 'manage' => 'Administrer virksomheder', + 'all' => 'Alle virksomheder', + 'error' => [ + 'delete_active' => 'Fejl: Kan ikke slette aktiv virksomhed! ændre dette først!', + ], + +]; diff --git a/resources/lang/da-DK/currencies.php b/resources/lang/da-DK/currencies.php new file mode 100755 index 0000000..20e6d46 --- /dev/null +++ b/resources/lang/da-DK/currencies.php @@ -0,0 +1,18 @@ + 'Kode', + 'rate' => 'Sats', + 'default' => 'Standardvaluta', + 'decimal_mark' => 'Decimalseparator', + 'thousands_separator' => 'Tusinder Separator', + 'precision' => 'Præcision', + 'symbol' => [ + 'symbol' => 'Symbol', + 'position' => 'Symbol Position', + 'before' => 'Før beløbet', + 'after' => 'Efter beløb', + ] + +]; diff --git a/resources/lang/da-DK/customers.php b/resources/lang/da-DK/customers.php new file mode 100755 index 0000000..17c37f6 --- /dev/null +++ b/resources/lang/da-DK/customers.php @@ -0,0 +1,11 @@ + 'Tillad login?', + 'user_created' => 'Bruger oprettet', + + 'error' => [ + 'email' => 'Denne mail er allerede registreret.' + ] +]; diff --git a/resources/lang/da-DK/dashboard.php b/resources/lang/da-DK/dashboard.php new file mode 100755 index 0000000..ced8365 --- /dev/null +++ b/resources/lang/da-DK/dashboard.php @@ -0,0 +1,24 @@ + 'Samlede indkomster', + 'receivables' => 'Tilgodehavender', + 'open_invoices' => 'Åbne fakturaer', + 'overdue_invoices' => 'Forfaldne fakturaer', + 'total_expenses' => 'Udgifter i alt', + 'payables' => 'Kreditorstyring', + 'open_bills' => 'Åben regninger', + 'overdue_bills' => 'Forfaldne regninger', + 'total_profit' => 'Samlet overskud', + 'open_profit' => 'Kommende overskud', + 'overdue_profit' => 'Forfalden overskud', + 'cash_flow' => 'Pengestrøm', + 'no_profit_loss' => 'Ingen fortjeneste eller tab', + 'incomes_by_category' => 'Indkomst efter kategori', + 'expenses_by_category' => 'Udgifter efter kategori', + 'account_balance' => 'Saldo', + 'latest_incomes' => 'Seneste indkomster', + 'latest_expenses' => 'Seneste udgifter', + +]; diff --git a/resources/lang/da-DK/demo.php b/resources/lang/da-DK/demo.php new file mode 100755 index 0000000..afcdab9 --- /dev/null +++ b/resources/lang/da-DK/demo.php @@ -0,0 +1,16 @@ + 'Kontant', + 'categories_deposit' => 'Indsæt', + 'categories_sales' => 'Salg', + 'currencies_usd' => 'Amerikanske Dollar', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Britiske pund', + 'currencies_try' => 'Tyrkiske Lira', + 'taxes_exempt' => 'Fritaget for moms', + 'taxes_normal' => 'Normal moms', + 'taxes_sales' => 'Salgs moms', + +]; diff --git a/resources/lang/da-DK/footer.php b/resources/lang/da-DK/footer.php new file mode 100755 index 0000000..e0d7d48 --- /dev/null +++ b/resources/lang/da-DK/footer.php @@ -0,0 +1,9 @@ + 'Version', + 'powered' => 'Drevet af Akaunting', + 'software' => 'Gratis regnskabs Software', + +]; diff --git a/resources/lang/da-DK/general.php b/resources/lang/da-DK/general.php new file mode 100755 index 0000000..eb78daf --- /dev/null +++ b/resources/lang/da-DK/general.php @@ -0,0 +1,117 @@ + 'Vare|Elementer', + 'incomes' => 'Indkomst|Indkomster', + 'invoices' => 'Faktura|Fakturaer', + 'revenues' => 'Indtægt|Indtægter', + 'customers' => 'Kunde|Kunder', + 'expenses' => 'Udgift|Udgifter', + 'bills' => 'Regning|Regninger', + 'payments' => 'Betaling|Betalinger', + 'vendors' => 'Kreditor|Kreditorer', + 'accounts' => 'Konto|Konti', + 'transfers' => 'Overføre|Overførsler', + 'transactions' => 'Transaktion|Transaktioner', + 'reports' => 'Rapport|Rapporter', + 'settings' => 'Indstilling|Indstillinger', + 'categories' => 'Kategori|Kategorier', + 'currencies' => 'Valuta|Valutaer', + 'tax_rates' => 'Momssats|Momssatser', + 'users' => 'Bruger|Brugere', + 'roles' => 'Rolle|Roller', + 'permissions' => 'Tilladelse|Tilladelser', + 'modules' => 'App|Apps', + 'companies' => 'Virksomhed|Virksomheder', + 'profits' => 'Overskud|Overskud', + 'taxes' => 'Moms|Moms', + 'logos' => 'Logo|Logoer', + 'pictures' => 'Billede|Billeder', + 'types' => 'Type|Typer', + 'payment_methods' => 'Betalingsmetode|Betalingsmetoder', + 'compares' => 'Indkomst vs Udgifter|Indkomster vs Udgifter', + 'notes' => 'Note|Noter', + 'totals' => 'Total|Totaler', + 'languages' => 'Sprog|Sprog', + 'updates' => 'Opdatering|Opdateringer', + 'numbers' => 'Nummer|Numre', + 'statuses' => 'Status|Statusser', + 'others' => 'Andre | Andre', + + 'dashboard' => 'Oversigt', + 'banking' => 'Bank', + 'general' => 'Generelt', + 'no_records' => 'Ingen poster', + 'date' => 'Dato', + 'amount' => 'Beløb', + 'enabled' => 'Aktiveret', + 'disabled' => 'Deaktiveret', + 'yes' => 'Ja', + 'no' => 'Nej', + 'na' => 'Ikke tilgængeligt', + 'daily' => 'Dagligt', + 'monthly' => 'Månedlig', + 'quarterly' => 'Kvartalsvis', + 'yearly' => 'Årlig', + 'add' => 'Tilføj', + 'add_new' => 'Tilføj ny', + 'show' => 'Vis', + 'edit' => 'Rediger', + 'delete' => 'Slet', + 'send' => 'Send', + 'download' => 'Download', + 'delete_confirm' => 'Bekræft sletning :name :type?', + 'name' => 'Navn', + 'email' => 'E-mail', + 'tax_number' => 'Moms nummer', + 'phone' => 'Telefon', + 'address' => 'Adresse', + 'website' => 'Hjemmeside', + 'actions' => 'Handlinger:', + 'description' => 'Beskrivelse', + 'manage' => 'Administrér', + 'code' => 'Kode', + 'alias' => 'Alias', + 'balance' => 'Balance', + 'reference' => 'Reference', + 'attachment' => 'Bilag', + 'change' => 'Ændre', + 'switch' => 'Skift', + 'color' => 'Farve', + 'save' => 'Gem', + 'cancel' => 'Annullér', + 'from' => 'Fra:', + 'to' => 'Til', + 'print' => 'Udskriv', + 'search' => 'Søg', + 'search_placeholder' => 'Skriv for at søge..', + 'filter' => 'Filter', + 'help' => 'Hjælp!', + 'all' => 'Alt', + 'all_type' => 'Alle :type', + 'upcoming' => 'Kommende', + 'created' => 'Oprettet', + 'id' => 'ID', + 'more_actions' => 'Flere handlinger', + 'duplicate' => 'Dublet', + 'unpaid' => 'Ikke betalt', + 'paid' => 'Betalt', + 'overdue' => 'Forfalden', + 'partially' => 'Delvist', + 'partially_paid' => 'Delvist betalt', + + 'title' => [ + 'new' => 'Ny :type', + 'edit' => 'Rediger :type', + ], + 'form' => [ + 'enter' => 'Indtast: :field', + 'select' => [ + 'field' => '- Vælg :field -', + 'file' => 'Vælg fil', + ], + 'no_file_selected' => 'Ingen fil valgt...', + ], + +]; diff --git a/resources/lang/da-DK/header.php b/resources/lang/da-DK/header.php new file mode 100755 index 0000000..16cd4bc --- /dev/null +++ b/resources/lang/da-DK/header.php @@ -0,0 +1,15 @@ + 'Skift sprog', + 'last_login' => 'Sidste login :time', + 'notifications' => [ + 'counter' => '{0} du har ingen notifikationer|{1} du har :count notifikationer|[2, *] Du har :count notifikationer', + 'overdue_invoices' => '{1} :count forfalden regning|[2,*] :count forfaldne regninger', + 'upcoming_bills' => '{1} :count kommende regning|[2,*] :count kommende regninger', + 'items_stock' => '{1} :count vare ikke på lager|[2,*] :count varer ikke på lager', + 'view_all' => 'Vis alle' + ], + +]; diff --git a/resources/lang/da-DK/import.php b/resources/lang/da-DK/import.php new file mode 100755 index 0000000..4762e2e --- /dev/null +++ b/resources/lang/da-DK/import.php @@ -0,0 +1,9 @@ + 'Importer', + 'title' => 'Import :type', + 'message' => 'Tilladte filtyper: CSV, XLS. Venligst, download eksempelfilen.', + +]; diff --git a/resources/lang/da-DK/install.php b/resources/lang/da-DK/install.php new file mode 100755 index 0000000..7451d19 --- /dev/null +++ b/resources/lang/da-DK/install.php @@ -0,0 +1,44 @@ + 'Næste', + 'refresh' => 'Opdatér', + + 'steps' => [ + 'requirements' => 'Venligst, opfyld følgende krav!', + 'language' => 'Trin 1/3: Valg af sprog', + 'database' => 'Trin 2/3: Database opsætning', + 'settings' => 'Trin 3/3: Virksomhed og Admin detaljer', + ], + + 'language' => [ + 'select' => 'Vælg sprog', + ], + + 'requirements' => [ + 'enabled' => ':feature skal være aktiveret!', + 'disabled' => ':feature skal være deaktiveret!', + 'extension' => ':extension udvidelse skal være indlæst!', + 'directory' => ':directory folderen skal være skrivbar!', + ], + + 'database' => [ + 'hostname' => 'Hostnavn', + 'username' => 'Brugernavn', + 'password' => 'Adgangskode', + 'name' => 'Database', + ], + + 'settings' => [ + 'company_name' => 'Firmanavn', + 'company_email' => 'Firma E-mail', + 'admin_email' => 'Administrator e-mail', + 'admin_password' => 'Admin Password', + ], + + 'error' => [ + 'connection' => 'Error: Kunne ikke forbinde til databasen! Kontroller, at oplysningerne er korrekte.', + ], + +]; diff --git a/resources/lang/da-DK/invoices.php b/resources/lang/da-DK/invoices.php new file mode 100755 index 0000000..7eacf37 --- /dev/null +++ b/resources/lang/da-DK/invoices.php @@ -0,0 +1,55 @@ + 'Faktura nummer', + 'invoice_date' => 'Faktura dato', + 'total_price' => 'Total pris', + 'due_date' => 'Forfaldsdato', + 'order_number' => 'Ordrenummer', + 'bill_to' => 'Faktura til', + + 'quantity' => 'Antal', + 'price' => 'Pris', + 'sub_total' => 'Subtotal', + 'discount' => 'Rabat', + 'tax_total' => 'Moms i alt', + 'total' => 'I alt', + + 'item_name' => 'Vare navn|Vare navne', + + 'show_discount' => ':discount% Rabat', + 'add_discount' => 'Tilføj rabat', + 'discount_desc' => 'subtotal', + + 'payment_due' => 'Betalingsfrist', + 'paid' => 'Betalt', + 'histories' => 'Historik', + 'payments' => 'Betalinger', + 'add_payment' => 'Tilføj betaling', + 'mark_paid' => 'Marker som betalt', + 'mark_sent' => 'Marker som sendt', + 'download_pdf' => 'Download som PDF', + 'send_mail' => 'Send e-mail', + + 'status' => [ + 'draft' => 'Kladde', + 'sent' => 'Sendt', + 'viewed' => 'Vist', + 'approved' => 'Godkendt', + 'partial' => 'Delvist', + 'paid' => 'Betalt', + ], + + 'messages' => [ + 'email_sent' => 'E-maiil med faktura er afsendt!', + 'marked_sent' => 'Faktura markeret som sendt!', + 'email_required' => 'Ingen e-mail-adresse for denne kunde!', + ], + + 'notification' => [ + 'message' => 'Du modtager denne e-mail, fordi du har en faktura på :amount til :customer kunde.', + 'button' => 'Betal nu', + ], + +]; diff --git a/resources/lang/da-DK/items.php b/resources/lang/da-DK/items.php new file mode 100755 index 0000000..612773e --- /dev/null +++ b/resources/lang/da-DK/items.php @@ -0,0 +1,15 @@ + 'Mængde|Mængder', + 'sales_price' => 'Salgspris', + 'purchase_price' => 'Købspris', + 'sku' => 'Varenummer', + + 'notification' => [ + 'message' => 'Du modtager denne e-mail, fordi følgende vare snart ikke er på lager længere. :name.', + 'button' => 'Vis nu', + ], + +]; diff --git a/resources/lang/da-DK/messages.php b/resources/lang/da-DK/messages.php new file mode 100755 index 0000000..f3b2344 --- /dev/null +++ b/resources/lang/da-DK/messages.php @@ -0,0 +1,25 @@ + [ + 'added' => ':type tilføjet!', + 'updated' => ':type opdateret!', + 'deleted' => ':type slettet!', + 'duplicated' => ':type duplikeret!', + 'imported' => ':type importeret!', + ], + 'error' => [ + 'over_payment' => 'Fejl: Betaling ikke tilføjet! Beløbet overskrider total porisen.', + 'not_user_company' => 'Fejl: Du har ikke tilladelse til at kontrollere denne virksomhed!', + 'customer' => 'Fejl: Brugeren ikke oprettet! :name bruger allerede denne e-mail.', + 'no_file' => 'Fejl: Ingen fil valgt!', + 'last_category' => 'Fejl: Kan ikke slette sidste :type kategori!', + 'invalid_token' => 'Fejl: Token indtastet er ugyldig!', + ], + 'warning' => [ + 'deleted' => 'Advarsel: Du har ikke tilladelse tiil at slette :name fordi den er :text relateret.', + 'disabled' => 'Advarsel: Du har ikke tilladelse tiil at deaktivere :name fordi den er :text relateret.', + ], + +]; diff --git a/resources/lang/da-DK/modules.php b/resources/lang/da-DK/modules.php new file mode 100755 index 0000000..3d46997 --- /dev/null +++ b/resources/lang/da-DK/modules.php @@ -0,0 +1,48 @@ + 'API Token', + 'api_token' => 'Token', + 'top_paid' => 'Top betalt', + 'new' => 'Ny', + 'top_free' => 'Top gratis', + 'free' => 'GRATIS', + 'search' => 'Søg', + 'install' => 'Installer', + 'buy_now' => 'Køb nu', + 'token_link' => 'Klik her for at få din API-token.', + 'no_apps' => 'Der er ingen apps i denne kategori endnu.', + 'developer' => 'Er du udvikler? her kan du lære hvordan du opretter en app og begynde at sælge i dag!', + + 'about' => 'Om', + + 'added' => 'Tilføjet', + 'updated' => 'Opdateret', + 'compatibility' => 'Kompatibilitet', + + 'installed' => ':module installeret', + 'uninstalled' => ':module afinstalleret', + //'updated' => ':module updated', + 'enabled' => ':module aktiveret', + 'disabled' => ':module deaktiveret', + + 'tab' => [ + 'installation' => 'Installation', + 'faq' => 'FAQ', + 'changelog' => 'Ændringslog', + ], + + 'installation' => [ + 'header' => 'App installation', + 'download' => 'Downloading :modul filen.', + 'unzip' => 'Udpakker :module filer.', + 'install' => 'Installere :module filer.', + ], + + 'button' => [ + 'uninstall' => 'Afinstaller', + 'disable' => 'Deaktiver', + 'enable' => 'Aktivér', + ], +]; diff --git a/resources/lang/da-DK/pagination.php b/resources/lang/da-DK/pagination.php new file mode 100755 index 0000000..bae42ea --- /dev/null +++ b/resources/lang/da-DK/pagination.php @@ -0,0 +1,9 @@ + '« Forrige', + 'next' => 'Næste »', + 'showing' => 'Viser :first til :last af :total :type', + +]; diff --git a/resources/lang/da-DK/passwords.php b/resources/lang/da-DK/passwords.php new file mode 100755 index 0000000..91a810f --- /dev/null +++ b/resources/lang/da-DK/passwords.php @@ -0,0 +1,22 @@ + 'Adgangskoder skal være mindst 6 tegn og matche.', + 'reset' => 'Din adgangskode er blevet nulstillet!', + 'sent' => 'Vi har sendt dig en e-mail med reset password link!', + 'token' => 'Denne adgangskodes nulstillings token er ugyldig.', + 'user' => "Vi kan ikke finde en bruger med den e-mail adresse.", + +]; diff --git a/resources/lang/da-DK/recurring.php b/resources/lang/da-DK/recurring.php new file mode 100755 index 0000000..3c26a8f --- /dev/null +++ b/resources/lang/da-DK/recurring.php @@ -0,0 +1,20 @@ + 'Tilbagevendende', + 'every' => 'Hver', + 'period' => 'Periode', + 'times' => 'Tid', + 'daily' => 'Daglig', + 'weekly' => 'Ugentlig', + 'monthly' => 'Månedlig', + 'yearly' => 'Årlig', + 'custom' => 'Tilpasset', + 'days' => 'Dag(e)', + 'weeks' => 'Uge(r)', + 'months' => 'Måned(er)', + 'years' => 'År', + 'message' => 'Dette er en tilbagevendende :type og den næste vil blive autogenereret den :date', + +]; diff --git a/resources/lang/da-DK/reports.php b/resources/lang/da-DK/reports.php new file mode 100755 index 0000000..2c031f1 --- /dev/null +++ b/resources/lang/da-DK/reports.php @@ -0,0 +1,30 @@ + 'Dette år', + 'previous_year' => 'Forrige år', + 'this_quarter' => 'Dette kvartal', + 'previous_quarter' => 'Foregående kvartal', + 'last_12_months' => 'Seneste 12 måneder', + 'profit_loss' => 'Resultatopgørelse', + 'gross_profit' => 'Bruttofortjeneste', + 'net_profit' => 'Nettoresultat', + 'total_expenses' => 'Udgifter i alt', + 'net' => 'Netto', + + 'summary' => [ + 'income' => 'Indkomst Resumé', + 'expense' => 'Udgift Resumé', + 'income_expense' => 'Indkomst vs udgift', + 'tax' => 'Moms oversigt', + ], + + 'quarter' => [ + '1' => 'Jan-Mar', + '2' => 'Apr-Jun', + '3' => 'Jul-Sep', + '4' => 'Okt-Dec', + ], + +]; diff --git a/resources/lang/da-DK/settings.php b/resources/lang/da-DK/settings.php new file mode 100755 index 0000000..dd68207 --- /dev/null +++ b/resources/lang/da-DK/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Navn', + 'email' => 'E-mail', + 'phone' => 'Telefon', + 'address' => 'Adresse', + 'logo' => 'Logo', + ], + 'localisation' => [ + 'tab' => 'Lokalisering', + 'date' => [ + 'format' => 'Datoformat', + 'separator' => 'Datoseparator', + 'dash' => 'Bindestreg (-)', + 'dot' => 'Punktum (.)', + 'comma' => 'Komma (,)', + 'slash' => 'Skråstreg (/)', + 'space' => 'Mellemrum ( )', + ], + 'timezone' => 'Tidszone', + 'percent' => [ + 'title' => 'Procent (%) Position', + 'before' => 'Før nummer', + 'after' => 'Efter nummer', + ], + ], + 'invoice' => [ + 'tab' => 'Faktura', + 'prefix' => 'Nummerpræfiks', + 'digit' => 'Antal cifre', + 'next' => 'Næste nummer', + 'logo' => 'Logo', + ], + 'default' => [ + 'tab' => 'Standarder', + 'account' => 'Standard konto', + 'currency' => 'Standardvaluta', + 'tax' => 'Standard moms procent', + 'payment' => 'Standardbetalingsmetode', + 'language' => 'Standardsprog', + ], + 'email' => [ + 'protocol' => 'Protokol', + 'php' => 'PHP mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP Host', + 'port' => 'SMTP Port', + 'username' => 'SMTP Brugernavn', + 'password' => 'SMTP adgangskode', + 'encryption' => 'SMTP sikkerhed', + 'none' => 'Ingen', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Sendmail sti', + 'log' => 'Log E-mails', + ], + 'scheduling' => [ + 'tab' => 'Planlægger', + 'send_invoice' => 'Send faktura påmindelse', + 'invoice_days' => 'Send efter forfalds dato', + 'send_bill' => 'Send regningens påmindelse', + 'bill_days' => 'Send før forfalds dage', + 'cron_command' => 'Cron kommando', + 'schedule_time' => 'Timer at køre', + ], + 'appearance' => [ + 'tab' => 'Udseende', + 'theme' => 'Theme', + 'light' => 'Lys', + 'dark' => 'Mørk', + 'list_limit' => 'Poster pr. side', + 'use_gravatar' => 'Bruge Gravatar', + ], + 'system' => [ + 'tab' => 'System', + 'session' => [ + 'lifetime' => 'Session levetid (minutter)', + 'handler' => 'Sessionsbehandler', + 'file' => 'Fil', + 'database' => 'Database', + ], + 'file_size' => 'Maximum filstørrelse (MB)', + 'file_types' => 'Tilladte filtyper', + ], + +]; diff --git a/resources/lang/da-DK/taxes.php b/resources/lang/da-DK/taxes.php new file mode 100755 index 0000000..0ff1ac9 --- /dev/null +++ b/resources/lang/da-DK/taxes.php @@ -0,0 +1,8 @@ + 'Sats', + 'rate_percent' => 'Sats (%)', + +]; diff --git a/resources/lang/da-DK/transfers.php b/resources/lang/da-DK/transfers.php new file mode 100755 index 0000000..5de0931 --- /dev/null +++ b/resources/lang/da-DK/transfers.php @@ -0,0 +1,8 @@ + 'Fra konto', + 'to_account' => 'Til konto', + +]; diff --git a/resources/lang/da-DK/updates.php b/resources/lang/da-DK/updates.php new file mode 100755 index 0000000..d8b0f33 --- /dev/null +++ b/resources/lang/da-DK/updates.php @@ -0,0 +1,15 @@ + 'Installeret version', + 'latest_version' => 'Seneste version', + 'update' => 'Opdatere Akaunting til :version version', + 'changelog' => 'Ændringslog', + 'check' => 'Kontrollér', + 'new_core' => 'Der findes en opdateret version af Akaunting.', + 'latest_core' => 'Tillykke! Du har nu den nyeste version af Akaunting. Fremtidige sikkerhedsopdateringer installeres automatisk.', + 'success' => 'Opdateringen er gennemført.', + 'error' => 'Opdateringen er fejlet, prøv igen.', + +]; diff --git a/resources/lang/da-DK/validation.php b/resources/lang/da-DK/validation.php new file mode 100755 index 0000000..c851a4a --- /dev/null +++ b/resources/lang/da-DK/validation.php @@ -0,0 +1,119 @@ + ':attribute skal være accepteret.', + 'active_url' => ':attribute er ikke en gyldig URL.', + 'after' => ':attribute skal være en dato efter :date.', + 'after_or_equal' => ':attribute skal være en dato før eller lig med :date.', + 'alpha' => ':attribute må kun indeholde bogstaver.', + 'alpha_dash' => ':attribute må kun indeholde bogstaver, tal eller bindestreger.', + 'alpha_num' => ':attribute må kun indeholde bogstaver eller tal.', + 'array' => ':attribute skal være en matrix.', + 'before' => ':attribute skal være en dato før :date.', + 'before_or_equal' => ':attribute skal være en dato før eller lig med :date.', + 'between' => [ + 'numeric' => ':attribute skal være imellem :min og :max.', + 'file' => ':attribute skal være imellem :min - :max kilobytes.', + 'string' => ':attribute skal være imellem :min - :max tegn.', + 'array' => ':attribute skal have mellem: min og: maks. Emner.', + ], + 'boolean' => ':attribute skal være enabled eller disabled.', + 'confirmed' => ':attribute valget stemmer ikke overens.', + 'date' => ':attribute er ikke en gyldig dato.', + 'date_format' => ':attribute svarer ikke til formatet :format.', + 'different' => ':attribute og :other skal være forskellige.', + 'digits' => ':attribute skal være :digits cifre.', + 'digits_between' => ':attribute skal være imellem :min og :max cifre.', + 'dimensions' => ':attribute har ugyldige billeddimensioner.', + 'distinct' => ':attribute har en duplikatværdi.', + 'email' => ':attribute skal være en gyldig email adresse.', + 'exists' => 'Det valgte :attribute er ugyldigt.', + 'file' => ':attribute skal være en fil.', + 'filled' => ':attribute skal have en værdi.', + 'image' => ':attribute skal være et billede.', + 'in' => 'Det valgte :attribute er ugyldigt.', + 'in_array' => ':attribute findes ikke i :other.', + 'integer' => ':attribute skal være et heltal.', + 'ip' => ':attribute skal være en gyldig IP adresse.', + 'json' => ':attribute skal være en gyldig JSON-streng.', + 'max' => [ + 'numeric' => ':attribute må ikke overstige :max.', + 'file' => ':attribute må ikke overstige :max. kilobytes.', + 'string' => ':attribute må ikke overstige :max. tegn.', + 'array' => ':attribute må ikke overstige :max. antal.', + ], + 'mimes' => ':attribute skal være en fil af typen: :values.', + 'mimetypes' => ':attribute skal være en fil af typen: :values.', + 'min' => [ + 'numeric' => ':attribute skal mindst være :min.', + 'file' => ':attribute skal mindst være :min kilobytes.', + 'string' => ':attribute skal mindst være :min tegn.', + 'array' => ':attribute skal have mindst :min styk.', + ], + 'not_in' => 'Det valgte :attribute er ugyldigt.', + 'numeric' => ':attribute skal være et tal.', + 'present' => ':attribute feltet er krævet.', + 'regex' => ':attribute formatet er ugylidgt.', + 'required' => ':attribute feltet er påkrævet.', + 'required_if' => ':attribute feltet er krævet når :other er :value.', + 'required_unless' => ':attribute feltet er påkrævet, med mindre :other er :value.', + 'required_with' => ':attribute er påkrævet, når :values er til stede.', + 'required_with_all' => ':attribute er påkrævet, når :values er til stede.', + 'required_without' => ':attribute er påkrævet, når :values ikke er tilstede.', + 'required_without_all' => ':attribute er påkrævet, når ingen af :values er tilstede.', + 'same' => ':attribute og :other skal være ens.', + 'size' => [ + 'numeric' => ':attribute skal være :size.', + 'file' => ':attribute skal være :size kilobytes.', + 'string' => ':attribute skal være :size tegn.', + 'array' => ':attribute skal indeholde :size antal.', + ], + 'string' => ':attribute skal være en streng.', + 'timezone' => ':attribute skal være en gyldig zone.', + 'unique' => ':attribute er allerede taget.', + 'uploaded' => ':attribute kunne ikke uploades.', + 'url' => ':attribute formatet er ugylidgt.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'brugerdefineret besked', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/de-DE/accounts.php b/resources/lang/de-DE/accounts.php new file mode 100755 index 0000000..849c8dc --- /dev/null +++ b/resources/lang/de-DE/accounts.php @@ -0,0 +1,14 @@ + 'Konto', + 'number' => 'Nummer', + 'opening_balance' => 'Start Guthaben', + 'current_balance' => 'Aktuelles Guthaben', + 'bank_name' => 'Bankname', + 'bank_phone' => 'Bank Telefonnummer', + 'bank_address' => 'Bank Adresse', + 'default_account' => 'Standardkonto', + +]; diff --git a/resources/lang/de-DE/auth.php b/resources/lang/de-DE/auth.php new file mode 100755 index 0000000..669d4bb --- /dev/null +++ b/resources/lang/de-DE/auth.php @@ -0,0 +1,39 @@ + 'Profil', + 'logout' => 'Abmelden', + 'login' => 'Anmelden', + 'login_to' => 'Anmelden, um Ihre Sitzung zu starten', + 'remember_me' => 'Angemeldet bleiben', + 'forgot_password' => 'Ich habe mein Passwort vergessen', + 'reset_password' => 'Passwort zurücksetzen', + 'enter_email' => 'Geben Sie Ihre E-Mail-Adresse ein', + 'current_email' => 'Aktuelle E-Mail', + 'reset' => 'Zurücksetzen', + 'never' => 'niemals', + + 'password' => [ + 'current' => 'Passwort', + 'current_confirm' => 'Passwortbestätigung', + 'new' => 'Neues Passwort', + 'new_confirm' => 'Passwortbestätigung', + ], + + 'error' => [ + 'self_delete' => 'Fehler: Sie können sich nicht selbst löschen!', + 'no_company' => 'Fehler: Ihrem Konto wurde kein Unternehmen zugewiesen. Bitte kontaktieren Sie den Systemadministrator.', + ], + + 'failed' => 'Diese Anmeldeinformationen entsprechen nicht unseren Aufzeichnungen.', + 'disabled' => 'Dieses Konto ist deaktiviert! Bitte kontaktieren Sie den Systemadministrator.', + 'throttle' => 'Zu viele fehlgeschlagene Anmeldeversuche. Bitte versuchen Sie es erneut in :seconds Sekunden.', + + 'notification' => [ + 'message_1' => 'Sie erhalten diese E-Mail, da Sie das Passwort für Ihr Konto zurücksetzen lassen wollen.', + 'message_2' => 'Falls Sie keine Anfrage für das Zurücksetzen ihres Passwort gestellt haben, ist keine weitere Aktion erforderlich.', + 'button' => 'Passwort zurücksetzen', + ], + +]; diff --git a/resources/lang/de-DE/bills.php b/resources/lang/de-DE/bills.php new file mode 100755 index 0000000..c8aeb95 --- /dev/null +++ b/resources/lang/de-DE/bills.php @@ -0,0 +1,46 @@ + 'Rechnungsnummer', + 'bill_date' => 'Rechnungsdatum', + 'total_price' => 'Gesamtpreis', + 'due_date' => 'Fälligkeitsdatum', + 'order_number' => 'Bestellnummer', + 'bill_from' => 'Rechnung vom', + + 'quantity' => 'Menge', + 'price' => 'Preis', + 'sub_total' => 'Zwischensumme', + 'discount' => 'Rabatt', + 'tax_total' => 'Steuern Gesamt', + 'total' => 'Gesamt', + + 'item_name' => 'Artikel-Name|Artikel-Namen', + + 'show_discount' => ':discount % Rabatt', + 'add_discount' => 'füge Rabatt hinzu', + 'discount_desc' => 'Zwischensumme', + + 'payment_due' => 'Fälligkeit der Zahlung', + 'amount_due' => 'Fälliger Betrag', + 'paid' => 'Bezahlt', + 'histories' => 'Historie', + 'payments' => 'Zahlungen', + 'add_payment' => 'Zahlung hinzufügen', + 'mark_received' => 'Als erhalten markieren', + 'download_pdf' => 'Als PDF herunterladen', + 'send_mail' => 'E-Mail senden', + + 'status' => [ + 'draft' => 'Entwurf', + 'received' => 'Erhalten', + 'partial' => 'Teilweise', + 'paid' => 'Bezahlt', + ], + + 'messages' => [ + 'received' => 'Rechnung als erfolgreich erhalten markiert!', + ], + +]; diff --git a/resources/lang/de-DE/companies.php b/resources/lang/de-DE/companies.php new file mode 100755 index 0000000..db948f7 --- /dev/null +++ b/resources/lang/de-DE/companies.php @@ -0,0 +1,13 @@ + 'Domain', + 'logo' => 'Logo', + 'manage' => 'Unternehmen verwalten', + 'all' => 'Alle Unternehmen', + 'error' => [ + 'delete_active' => 'Fehler: Das aktive Unternehmen kann nicht gelöscht werden. Bitte zunächst wechseln!', + ], + +]; diff --git a/resources/lang/de-DE/currencies.php b/resources/lang/de-DE/currencies.php new file mode 100755 index 0000000..735a57e --- /dev/null +++ b/resources/lang/de-DE/currencies.php @@ -0,0 +1,18 @@ + 'Kürzel', + 'rate' => 'Kurs', + 'default' => 'Standardwährung', + 'decimal_mark' => 'Dezimaltrennzeichen', + 'thousands_separator' => 'Tausendertrennzeichen', + 'precision' => 'Genauigkeit', + 'symbol' => [ + 'symbol' => 'Symbol', + 'position' => 'Symbolposition', + 'before' => 'Vor dem Betrag', + 'after' => 'Nach dem Betrag', + ] + +]; diff --git a/resources/lang/de-DE/customers.php b/resources/lang/de-DE/customers.php new file mode 100755 index 0000000..9025828 --- /dev/null +++ b/resources/lang/de-DE/customers.php @@ -0,0 +1,11 @@ + 'Login erlauben?', + 'user_created' => 'Benutzer angelegt', + + 'error' => [ + 'email' => 'Diese Email ist bereits in Benutzung.' + ] +]; diff --git a/resources/lang/de-DE/dashboard.php b/resources/lang/de-DE/dashboard.php new file mode 100755 index 0000000..73b7934 --- /dev/null +++ b/resources/lang/de-DE/dashboard.php @@ -0,0 +1,24 @@ + 'Gesamteinnahmen', + 'receivables' => 'Forderungen', + 'open_invoices' => 'Offene Rechnungen', + 'overdue_invoices' => 'Überfällige Rechnungen', + 'total_expenses' => 'Gesamtausgaben', + 'payables' => 'Verbindlichkeiten', + 'open_bills' => 'Offene Rechnungen', + 'overdue_bills' => 'Überfällige Rechnungen', + 'total_profit' => 'Gesamtgewinn', + 'open_profit' => 'Offener Gewinn', + 'overdue_profit' => 'Überfälliger Gewinn', + 'cash_flow' => 'Cash Flow', + 'no_profit_loss' => 'Kein Gewinn-Verlust', + 'incomes_by_category' => 'Einkommen nach Kategorie', + 'expenses_by_category' => 'Ausgaben nach Kategorie', + 'account_balance' => 'Kontostand', + 'latest_incomes' => 'Neuestes Einkommen', + 'latest_expenses' => 'Letzte Ausgaben', + +]; diff --git a/resources/lang/de-DE/demo.php b/resources/lang/de-DE/demo.php new file mode 100755 index 0000000..a826c71 --- /dev/null +++ b/resources/lang/de-DE/demo.php @@ -0,0 +1,16 @@ + 'Bar', + 'categories_deposit' => 'Einzahlen', + 'categories_sales' => 'Verkäufe', + 'currencies_usd' => 'US-Dollar', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Britisches Pfund', + 'currencies_try' => 'Türkische Lira', + 'taxes_exempt' => 'Steuerbefreit', + 'taxes_normal' => 'Normale Steuer', + 'taxes_sales' => 'Umsatzsteuer', + +]; diff --git a/resources/lang/de-DE/footer.php b/resources/lang/de-DE/footer.php new file mode 100755 index 0000000..84a73ee --- /dev/null +++ b/resources/lang/de-DE/footer.php @@ -0,0 +1,9 @@ + 'Version', + 'powered' => 'Powered By Akaunting', + 'software' => 'Kostenlose Buchhaltungssoftware', + +]; diff --git a/resources/lang/de-DE/general.php b/resources/lang/de-DE/general.php new file mode 100755 index 0000000..64339be --- /dev/null +++ b/resources/lang/de-DE/general.php @@ -0,0 +1,121 @@ + 'Artikel|Artikel', + 'incomes' => 'Einkommen|Einkommen', + 'invoices' => 'Rechnung|Rechnungen', + 'revenues' => 'Einnahme|Einnahmen', + 'customers' => 'Kunde|Kunden', + 'expenses' => 'Ausgabe| Ausgaben', + 'bills' => 'Rechnung|Rechnungen', + 'payments' => 'Zahlung|Zahlungen', + 'vendors' => 'Kreditor|Kreditoren', + 'accounts' => 'Konto|Konten', + 'transfers' => 'Übertragung|Übertragungen', + 'transactions' => 'Transaktion|Transaktionen', + 'reports' => 'Bericht|Berichte', + 'settings' => 'Einstellung|Einstellungen', + 'categories' => 'Kategorie|Kategorien', + 'currencies' => 'Währung|Währungen', + 'tax_rates' => 'Steuersatz|Steuersätze', + 'users' => 'Benutzer | Benutzer', + 'roles' => 'Rolle|Rollen', + 'permissions' => 'Berechtigung|Berechtigungen', + 'modules' => 'App|Apps', + 'companies' => 'Unternehmen|Unternehmen', + 'profits' => 'Gewinn|Gewinne', + 'taxes' => 'Steuer|Steuern', + 'logos' => 'Logo|Logos', + 'pictures' => 'Bild|Bilder', + 'types' => 'Typ|Typen', + 'payment_methods' => 'Zahlungsmethode|Zahlungsmethoden', + 'compares' => 'Einkommen vs Kosten|Einkommen vs Kosten', + 'notes' => 'Notiz|Notizen', + 'totals' => 'Summe|Summen', + 'languages' => 'Sprache|Sprachen', + 'updates' => 'Aktualisierung|Aktualisierungen', + 'numbers' => 'Nummer|Nummern', + 'statuses' => 'Status|Stati', + 'others' => 'Anderer|Andere', + + 'dashboard' => 'Kontrollzentrum', + 'banking' => 'Bankwesen', + 'general' => 'Allgemein', + 'no_records' => 'Keine Einträge.', + 'date' => 'Datum', + 'amount' => 'Betrag', + 'enabled' => 'Aktiviert', + 'disabled' => 'Deaktiviert', + 'yes' => 'Ja', + 'no' => 'Nein', + 'na' => 'N/V', + 'daily' => 'Täglich', + 'monthly' => 'Monatlich', + 'quarterly' => 'Vierteljährlich', + 'yearly' => 'Jährlich', + 'add' => 'Hinzufügen', + 'add_new' => 'Neu anlegen', + 'show' => 'Anzeigen', + 'edit' => 'Bearbeiten', + 'delete' => 'Löschen', + 'send' => 'Senden', + 'download' => 'Herunterladen', + 'delete_confirm' => 'Löschen bestätigen :name :type?', + 'name' => 'Name', + 'email' => 'E-Mail', + 'tax_number' => 'Steuernummer', + 'phone' => 'Telefon', + 'address' => 'Adresse', + 'website' => 'Webseite', + 'actions' => 'Aktionen', + 'description' => 'Beschreibung', + 'manage' => 'Verwalten', + 'code' => 'Kürzel', + 'alias' => 'Alias', + 'balance' => 'Kontostand', + 'reference' => 'Referenz', + 'attachment' => 'Anhang', + 'change' => 'Ändern', + 'switch' => 'Wechseln', + 'color' => 'Farbe', + 'save' => 'Speichern', + 'cancel' => 'Abbrechen', + 'from' => 'Von', + 'to' => 'An', + 'print' => 'Drucken', + 'search' => 'Suchen', + 'search_placeholder' => 'Suchbegriff eingeben..', + 'filter' => 'Filter', + 'help' => 'Hilfe', + 'all' => 'Alle', + 'all_type' => 'Alle :type', + 'upcoming' => 'Anstehend', + 'created' => 'Erstellt', + 'id' => 'ID', + 'more_actions' => 'Weitere Aktionen', + 'duplicate' => 'Duplizieren', + 'unpaid' => 'Zahlung offen', + 'paid' => 'Bezahlt', + 'overdue' => 'Überfällig', + 'partially' => 'Teilweise', + 'partially_paid' => 'Teilweise bezahlt', + 'export' => 'Exportieren', + 'enable' => 'Aktivieren', + 'disable' => 'Deaktivieren', + + 'title' => [ + 'new' => 'Neu :type', + 'edit' => 'Bearbeiten :type', + ], + + 'form' => [ + 'enter' => 'Geben Sie :field an', + 'select' => [ + 'field' => '- Auswählen :field -', + 'file' => 'Datei auswählen', + ], + 'no_file_selected' => 'Keine Datei ausgewählt...', + ], + +]; diff --git a/resources/lang/de-DE/header.php b/resources/lang/de-DE/header.php new file mode 100755 index 0000000..61cb150 --- /dev/null +++ b/resources/lang/de-DE/header.php @@ -0,0 +1,15 @@ + 'Sprache ändern', + 'last_login' => 'Letzter Login :time', + 'notifications' => [ + 'counter' => '{0} Sie haben keine Benachrichtigungen|{1} Sie haben :count Benachrichtigung|[2,*] Sie haben :count Benachrichtigungen', + 'overdue_invoices' => '{1} :count überfällige Rechnung|[2,*] :count überfällige Rechnungen', + 'upcoming_bills' => '{1} :count bevorstehende Rechnung|[2,*] :count bevorstehende Rechnungen', + 'items_stock' => '{1}:count Artikel ausverkauft|[2,*]:count Artikel ausverkauft', + 'view_all' => 'Alle anzeigen' + ], + +]; diff --git a/resources/lang/de-DE/import.php b/resources/lang/de-DE/import.php new file mode 100755 index 0000000..42b16f5 --- /dev/null +++ b/resources/lang/de-DE/import.php @@ -0,0 +1,9 @@ + 'Importieren', + 'title' => ':type importieren', + 'message' => 'Erlaubte Datei-Typen: XLS, XLSX. Bitte, hier die Beispieldatei herunterladen.', + +]; diff --git a/resources/lang/de-DE/install.php b/resources/lang/de-DE/install.php new file mode 100755 index 0000000..5fd816e --- /dev/null +++ b/resources/lang/de-DE/install.php @@ -0,0 +1,44 @@ + 'Nächste', + 'refresh' => 'Aktualisieren', + + 'steps' => [ + 'requirements' => 'Bitte wenden Sie sich an Ihren Hosting-Dienstleister um die Fehler beheben zu lassen!', + 'language' => 'Schritt 1/3: Sprachauswahl', + 'database' => 'Schritt 2/3: Datenbank-Setup', + 'settings' => 'Schritt 3/3: Unternehmen und Admin-Details', + ], + + 'language' => [ + 'select' => 'Sprache wählen', + ], + + 'requirements' => [ + 'enabled' => ':feature muss aktiviert sein!', + 'disabled' => ':feature muss deaktiviert sein!', + 'extension' => ':extension Erweiterung muss installiert und geladen sein!', + 'directory' => ':directory Verzeichnis muss schreibbar sein!', + ], + + 'database' => [ + 'hostname' => 'Hostname', + 'username' => 'Benutzername', + 'password' => 'Passwort', + 'name' => 'Datenbank', + ], + + 'settings' => [ + 'company_name' => 'Unternehmensname', + 'company_email' => 'Unternehmens E-Mail-Adresse', + 'admin_email' => 'Administrator E-Mail-Adresse', + 'admin_password' => 'Admin Passwort', + ], + + 'error' => [ + 'connection' => 'Fehler: Es konnte keine Verbindung zur Datenbank hergestellt werden! Stellen Sie sicher, dass die Angaben korrekt sind.', + ], + +]; diff --git a/resources/lang/de-DE/invoices.php b/resources/lang/de-DE/invoices.php new file mode 100755 index 0000000..22865cb --- /dev/null +++ b/resources/lang/de-DE/invoices.php @@ -0,0 +1,55 @@ + 'Rechnungsnummer', + 'invoice_date' => 'Rechnungsdatum', + 'total_price' => 'Gesamtpreis', + 'due_date' => 'Fälligkeitsdatum', + 'order_number' => 'Bestellnummer', + 'bill_to' => 'Rechnung an', + + 'quantity' => 'Betrag', + 'price' => 'Preis', + 'sub_total' => 'Zwischensumme', + 'discount' => 'Rabatt', + 'tax_total' => 'Steuern Gesamt', + 'total' => 'Gesamt', + + 'item_name' => 'Artikelname|Artikel Namen', + + 'show_discount' => ':discount % Rabatt', + 'add_discount' => 'füge Rabatt hinzu', + 'discount_desc' => 'Zwischensumme', + + 'payment_due' => 'Fälligkeit der Zahlung', + 'paid' => 'Bezahlt', + 'histories' => 'Historie', + 'payments' => 'Zahlungen', + 'add_payment' => 'Zahlung hinzufügen', + 'mark_paid' => 'Als bezahlt markieren', + 'mark_sent' => 'Als gesendet markieren', + 'download_pdf' => 'PDF herunterladen', + 'send_mail' => 'E-Mail senden', + + 'status' => [ + 'draft' => 'Entwurf', + 'sent' => 'Gesendet', + 'viewed' => 'Angesehen', + 'approved' => 'Bestätigt', + 'partial' => 'Teilweise', + 'paid' => 'Bezahlt', + ], + + 'messages' => [ + 'email_sent' => 'Rechnungsemail wurde erfolgreich versendet!', + 'marked_sent' => 'Rechnung als erfolgreich versendet markiert!', + 'email_required' => 'Es existiert keine E-Mailadresse zu diesem Kunden!', + ], + + 'notification' => [ + 'message' => 'Sie erhalten diese Email, da eine Rechnung in Höhe von :amount für den Kunden :customer ansteht.', + 'button' => 'Jetzt bezahlen', + ], + +]; diff --git a/resources/lang/de-DE/items.php b/resources/lang/de-DE/items.php new file mode 100755 index 0000000..3b26afe --- /dev/null +++ b/resources/lang/de-DE/items.php @@ -0,0 +1,15 @@ + 'Menge|Mengen', + 'sales_price' => 'Verkaufspreis', + 'purchase_price' => 'Einkaufspreis', + 'sku' => 'Artikelnummer', + + 'notification' => [ + 'message' => 'Sie erhalten diese E-Mail, da :name nur noch begrenzt verfügbar ist.', + 'button' => 'Jetzt ansehen', + ], + +]; diff --git a/resources/lang/de-DE/messages.php b/resources/lang/de-DE/messages.php new file mode 100755 index 0000000..de129a1 --- /dev/null +++ b/resources/lang/de-DE/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => ':type hinzugefügt!', + 'updated' => ':type aktualisiert!', + 'deleted' => ':type gelöscht!', + 'duplicated' => ':type dupliziert!', + 'imported' => ':type importiert!', + 'enabled' => ':type aktiviert!', + 'disabled' => ':type deaktiviert!', + ], + 'error' => [ + 'over_payment' => 'Fehler: Zahlung wurde nicht hinzugefügt! Betrag überschreitet die Gesamtsumme.', + 'not_user_company' => 'Fehler: Sie haben nicht die Berechtigung um diese Firma zu verwalten!', + 'customer' => 'Fehler: User wurde nicht angelegt! :name benutzt schon diese Email-Adresse.', + 'no_file' => 'Fehler: Keine Datei ausgewählt!', + 'last_category' => 'Fehler: Kann die letzte Kategorie :type nicht löschen!', + 'invalid_token' => 'Fehler: Der eingegebene Token ist ungültig!', + 'import_column' => 'Fehler: :message Name des Blattes: :sheet. Zeilennummer: :line.', + 'import_sheet' => 'Fehler: Name des Blattes ist nicht gültig. Bitte die Beispieldatei überprüfen.', + ], + 'warning' => [ + 'deleted' => 'Warnung: Sie dürfen :name nicht löschen, da :text dazu in Bezug steht.', + 'disabled' => 'Warnung: Sie dürfen :name nicht deaktivieren, da :text dazu in Bezug steht.', + ], + +]; diff --git a/resources/lang/de-DE/modules.php b/resources/lang/de-DE/modules.php new file mode 100755 index 0000000..8a257ba --- /dev/null +++ b/resources/lang/de-DE/modules.php @@ -0,0 +1,58 @@ + 'API Token', + 'api_token' => 'Token', + 'my_apps' => 'Meine Apps', + 'top_paid' => 'Top bezahlt', + 'new' => 'Neu', + 'top_free' => 'Top kostenlos', + 'free' => 'Kostenlos', + 'search' => 'Suchen', + 'install' => 'Installieren', + 'buy_now' => 'Jetzt kaufen', + 'token_link' => 'Hier klicken um Ihren API Token zu erhalten.', + 'no_apps' => 'Bisher existieren noch keine Apps in dieser Kategorie.', + 'developer' => 'Sind sie ein Entwickler? Hier lernen Sie wie Sie eine App erzeugen und verkaufen können!', + + 'about' => 'Über', + + 'added' => 'Hinzugefügt', + 'updated' => 'Aktualisiert', + 'compatibility' => 'Kompatibilität', + + 'installed' => ':module installiert', + 'uninstalled' => ':module deinstalliert', + //'updated' => ':module updated', + 'enabled' => ':module aktiviert', + 'disabled' => ':module deaktiviert', + + 'tab' => [ + 'installation' => 'Installation', + 'faq' => 'Häufige Fragen / FAQ', + 'changelog' => 'Changelog', + ], + + 'installation' => [ + 'header' => 'App Installation', + 'download' => 'Lade :module Dateien herunter.', + 'unzip' => 'Extrahiere :module Dateien.', + 'install' => 'Installiere :module Dateien.', + ], + + 'badge' => [ + 'installed' => 'Installiert', + ], + + 'button' => [ + 'uninstall' => 'Deinstallieren', + 'disable' => 'Deaktivieren', + 'enable' => 'Aktivieren', + ], + + 'my' => [ + 'purchased' => 'Gekauft', + 'installed' => 'Installiert', + ], +]; diff --git a/resources/lang/de-DE/notifications.php b/resources/lang/de-DE/notifications.php new file mode 100755 index 0000000..551dffa --- /dev/null +++ b/resources/lang/de-DE/notifications.php @@ -0,0 +1,10 @@ + 'Hoppala!', + 'hello' => 'Hallo!', + 'salutation' => 'Mit freundlichen Grüßen,
    :company_name', + 'subcopy' => 'Wenn Sie Probleme damit haben den „:text“ Button zu drücken, kopieren Sie bitte die nachfolgende URL in Ihren Webbrowser. [:url](:url)', + +]; diff --git a/resources/lang/de-DE/pagination.php b/resources/lang/de-DE/pagination.php new file mode 100755 index 0000000..326e00e --- /dev/null +++ b/resources/lang/de-DE/pagination.php @@ -0,0 +1,9 @@ + '« Vorherige', + 'next' => 'Nächste »', + 'showing' => 'Zeige :first bis :last von :total :type', + +]; diff --git a/resources/lang/de-DE/passwords.php b/resources/lang/de-DE/passwords.php new file mode 100755 index 0000000..6b225f1 --- /dev/null +++ b/resources/lang/de-DE/passwords.php @@ -0,0 +1,22 @@ + 'Das Passwort muss mindestens sechs Zeichen haben und mit der Bestätigung übereinstimmen.', + 'reset' => 'Ihr Passwort wurde zurückgesetzt!', + 'sent' => 'Wir haben den Link zum zurücksetzen des Kennworts per E-Mail gesendet!', + 'token' => 'Das Token um das Passwort zurückzusetzen ist ungültig.', + 'user' => "Einen Benutzer mit dieser E-Mail-Adresse wurde nicht gefunden.", + +]; diff --git a/resources/lang/de-DE/recurring.php b/resources/lang/de-DE/recurring.php new file mode 100755 index 0000000..bd90a49 --- /dev/null +++ b/resources/lang/de-DE/recurring.php @@ -0,0 +1,20 @@ + 'Wiederkehrend', + 'every' => 'Jeden', + 'period' => 'Zeitraum', + 'times' => 'mal', + 'daily' => 'Täglich', + 'weekly' => 'Wöchentlich', + 'monthly' => 'Monatlich', + 'yearly' => 'Jährlich', + 'custom' => 'Benutzerdefiniert', + 'days' => 'Tag(e)', + 'weeks' => 'Woche(n)', + 'months' => 'Monat(e)', + 'years' => 'Jahr(e)', + 'message' => 'Dies ist ein sich wiederholender :type und der nächste :type wird automatisch am :date erzeugt', + +]; diff --git a/resources/lang/de-DE/reports.php b/resources/lang/de-DE/reports.php new file mode 100755 index 0000000..91646b6 --- /dev/null +++ b/resources/lang/de-DE/reports.php @@ -0,0 +1,30 @@ + 'Dieses Jahr', + 'previous_year' => 'Vorheriges Jahr', + 'this_quarter' => 'Dieses Quartal', + 'previous_quarter' => 'Letztes Quartal', + 'last_12_months' => 'Die letzten 12 Monate', + 'profit_loss' => 'Gewinn & Verlust', + 'gross_profit' => 'Bruttoertrag', + 'net_profit' => 'Reingewinn', + 'total_expenses' => 'Gesamtausgaben', + 'net' => 'Netto', + + 'summary' => [ + 'income' => 'Einkommensübersicht', + 'expense' => 'Ausgabenübersicht', + 'income_expense' => 'Einkommen vs Ausgaben', + 'tax' => 'Steuerzusammenfassung', + ], + + 'quarter' => [ + '1' => 'Jan-Mär', + '2' => 'Apr-Jun', + '3' => 'Jul-Sep', + '4' => 'Okt-Dez', + ], + +]; diff --git a/resources/lang/de-DE/settings.php b/resources/lang/de-DE/settings.php new file mode 100755 index 0000000..3773fe4 --- /dev/null +++ b/resources/lang/de-DE/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Name', + 'email' => 'E-Mail', + 'phone' => 'Telefon', + 'address' => 'Adresse', + 'logo' => 'Logo', + ], + 'localisation' => [ + 'tab' => 'Lokalisation', + 'date' => [ + 'format' => 'Datumsformat', + 'separator' => 'Datumstrennzeichen', + 'dash' => 'Bindestrich (-)', + 'dot' => 'Punkt (.)', + 'comma' => 'Komma (,)', + 'slash' => 'Schrägstrich (/)', + 'space' => 'Leerzeichen ( )', + ], + 'timezone' => 'Zeitzone', + 'percent' => [ + 'title' => 'Position des Prozent (%)', + 'before' => 'Vor der Zahl', + 'after' => 'Nach der Zahl', + ], + ], + 'invoice' => [ + 'tab' => 'Rechnung', + 'prefix' => 'Zahlenprefix', + 'digit' => 'Nachkommastellen', + 'next' => 'Nächste Nummer', + 'logo' => 'Logo', + ], + 'default' => [ + 'tab' => 'Standardeinstellungen', + 'account' => 'Standardkonto', + 'currency' => 'Standardwährung', + 'tax' => 'Standard-Steuersatz', + 'payment' => 'Standard-Zahlungsmethode', + 'language' => 'Standardsprache', + ], + 'email' => [ + 'protocol' => 'Protokoll', + 'php' => 'PHP-Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP Server', + 'port' => 'SMTP-Port', + 'username' => 'SMTP Benutzername', + 'password' => 'SMTP-Passwort', + 'encryption' => 'SMTP-Sicherheit', + 'none' => 'Keine', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Sendmail Pfad', + 'log' => 'Protokoll E-Mails', + ], + 'scheduling' => [ + 'tab' => 'Zeitpläne', + 'send_invoice' => 'Erinnerung für Kundenrechnung senden', + 'invoice_days' => 'Senden nach Fälligkeit (Tage)', + 'send_bill' => 'Erinnerung für Ausgabenrechung senden', + 'bill_days' => 'Senden vor Fälligkeit (Tage)', + 'cron_command' => 'Cron-Befehl', + 'schedule_time' => 'Stunde (Laufzeit)', + ], + 'appearance' => [ + 'tab' => 'Darstellung', + 'theme' => 'Theme', + 'light' => 'Light', + 'dark' => 'Dark', + 'list_limit' => 'Datensätze pro Seite', + 'use_gravatar' => 'Gravatar verwenden', + ], + 'system' => [ + 'tab' => 'System', + 'session' => [ + 'lifetime' => 'Sitzungsdauer (Minuten)', + 'handler' => 'Session-Verwaltung', + 'file' => 'Datei', + 'database' => 'Datenbank', + ], + 'file_size' => 'Max. Dateigröße (MB)', + 'file_types' => 'Erlaubte Dateitypen', + ], + +]; diff --git a/resources/lang/de-DE/taxes.php b/resources/lang/de-DE/taxes.php new file mode 100755 index 0000000..f239d9c --- /dev/null +++ b/resources/lang/de-DE/taxes.php @@ -0,0 +1,8 @@ + 'Steuersatz', + 'rate_percent' => 'Steuersatz (%)', + +]; diff --git a/resources/lang/de-DE/transfers.php b/resources/lang/de-DE/transfers.php new file mode 100755 index 0000000..ba3235d --- /dev/null +++ b/resources/lang/de-DE/transfers.php @@ -0,0 +1,12 @@ + 'Von Konto', + 'to_account' => 'Auf Konto', + + 'messages' => [ + 'delete' => ':from nach :to (:amount)', + ], + +]; diff --git a/resources/lang/de-DE/updates.php b/resources/lang/de-DE/updates.php new file mode 100755 index 0000000..de37e3d --- /dev/null +++ b/resources/lang/de-DE/updates.php @@ -0,0 +1,15 @@ + 'Installierte Version', + 'latest_version' => 'Neueste Version', + 'update' => 'Update Akaunting auf Version :version', + 'changelog' => 'Changelog', + 'check' => 'Prüfen', + 'new_core' => 'Eine aktualisierte Version von Akaunting ist verfügbar.', + 'latest_core' => 'Glückwunsch! Sie nutzen die aktuellste Version von Akaunting. Zukünftige Sicherheitsupdates werden automatisch angewendet.', + 'success' => 'Der Updateprozess wurde erfolgreich ausgeführt.', + 'error' => 'Updateprozess fehlgeschlagen, bitte erneut versuchen.', + +]; diff --git a/resources/lang/de-DE/validation.php b/resources/lang/de-DE/validation.php new file mode 100755 index 0000000..d08d2ed --- /dev/null +++ b/resources/lang/de-DE/validation.php @@ -0,0 +1,120 @@ + 'Das Feld :attribute muss akzeptiert werden.', + 'active_url' => ':attribute ist keine valide URL.', + 'after' => ':attribute muss ein Datum nach dem :date sein.', + 'after_or_equal' => ':attribute muss ein Datum nach oder gleich dem :date sein.', + 'alpha' => ':attribute darf nur aus Buchstaben bestehen.', + 'alpha_dash' => ':attribute darf nur aus Buchstaben, Zahlen und Gedankenstrichen bestehen.', + 'alpha_num' => ':attribute darf nur aus Buchstaben und Zahlen bestehen.', + 'array' => ':attribute muss ein Array sein.', + 'before' => ':attribute muss ein Datum vor dem :date sein.', + 'before_or_equal' => ':attribute muss ein Datum vor oder gleich dem :date sein.', + 'between' => [ + 'numeric' => ':attribute muss zwischen :min und :max liegen.', + 'file' => ':attribute darf nur zwischen :min und :max kilobytes groß sein.', + 'string' => ':attribute muss mindestens :min und maximal :max Zeichen enthalten.', + 'array' => ':attribute soll mindestens :min und darf maximal :max Stellen haben.', + ], + 'boolean' => ':attribute muss Wahr oder Falsch sein.', + 'confirmed' => ':attribute Bestätigung stimmt nicht überein.', + 'date' => ':attribute ist kein gültiges Datum.', + 'date_format' => ':attribute passt nicht zur :format Formatierung.', + 'different' => ':attribute und :other müssen sich unterscheiden.', + 'digits' => ':attribute muss :digits Stellen haben.', + 'digits_between' => ':attribute soll mindestens :min und darf maximal :max Stellen haben.', + 'dimensions' => ':attribute hat ungültige Bildabmessungen.', + 'distinct' => ':attribute hat einen doppelten Wert.', + 'email' => ':attribute Attribut muss eine gültige E-Mail-Adresse sein.', + 'exists' => 'Das ausgewählte :attribute ist ungültig.', + 'file' => ':attribute muss eine Datei sein.', + 'filled' => ':attribute Feld muss einen Wert haben.', + 'image' => ':attribute muss ein Bild sein.', + 'in' => 'Das ausgewählte :attribute ist ungültig.', + 'in_array' => ':attribute Feld existiert nicht in :other.', + 'integer' => ':attribute muss ein Integer-Wert (Ganz-Zahl) sein.', + 'ip' => ':attribute muss eine gültige IP Adresse sein.', + 'json' => ':attribute muss eine gültiger JSON-String sein.', + 'max' => [ + 'numeric' => ':attribute darf nicht größer als :max sein.', + 'file' => ':attribute darf nicht größer als :max Kilobyte sein.', + 'string' => ':attribute darf nicht mehr als :max Zeichen sein.', + 'array' => ':attribute darf nicht mehr als :max Werte haben.', + ], + 'mimes' => ':attribute muss eine Datei des Typs :values sein.', + 'mimetypes' => ':attribute muss eine Datei des Typs :values sein.', + 'min' => [ + 'numeric' => ':attribute muss mindestens :min sein.', + 'file' => ':attribute muss mindestens :min Kilobyte groß sein.', + 'string' => ':attribute benötigt mindestens :min Zeichen.', + 'array' => ':attribute muss mindestens :min Artikel haben.', + ], + 'not_in' => 'Das ausgewählte :attribute ist ungültig.', + 'numeric' => ':attribute muss eine Zahl sein.', + 'present' => ':attribute Feld muss vorhanden sein.', + 'regex' => ':attribute Format ist ungültig.', + 'required' => ':attribute Feld muss ausgefüllt sein.', + 'required_if' => ':attribute wird benötigt wenn :other :value entspricht.', + 'required_unless' => ':attribute wird benötigt es sei denn :other ist in :values .', + 'required_with' => ':attribute wird benötigt wenn :values vorhanden ist.', + 'required_with_all' => ':attribute wird benötigt wenn :values vorhanden ist.', + 'required_without' => ':attribute wird benötigt wenn :values nicht vorhanden ist.', + 'required_without_all' => ':attribute wird benötigt wenn keine :values vorhanden sind.', + 'same' => ':attribute und :other müssen übereinstimmen.', + 'size' => [ + 'numeric' => ':attribute muss :size groß sein.', + 'file' => ':attribute muss :size Kilobyte groß sein.', + 'string' => ':attribute muss :size Zeichen haben.', + 'array' => ':attribute muss :size Artikel enthalten.', + ], + 'string' => ':attribute muss ein String sein.', + 'timezone' => ':attribute muss eine valide Zone sein.', + 'unique' => ':attribute wird schon benutzt.', + 'uploaded' => ':attribute Fehler beim Hochladen.', + 'url' => ':attribute Format ist ungültig.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'eigene Nachricht', + ], + 'invalid_currency' => 'Das :attribute Kürzel ist ungültig.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/el-GR/accounts.php b/resources/lang/el-GR/accounts.php new file mode 100755 index 0000000..aefe53a --- /dev/null +++ b/resources/lang/el-GR/accounts.php @@ -0,0 +1,14 @@ + 'Όνομα Λογαριασμού', + 'number' => 'Αριθμός', + 'opening_balance' => 'Εναρκτήριο υπόλοιπο', + 'current_balance' => 'Τρέχον υπόλοιπο', + 'bank_name' => 'Όνομα τράπεζας', + 'bank_phone' => 'Τηλέφωνο τράπεζας', + 'bank_address' => 'Διεύθυνση τράπεζας', + 'default_account' => 'Προεπιλεγμένος λογαριασμός', + +]; diff --git a/resources/lang/el-GR/auth.php b/resources/lang/el-GR/auth.php new file mode 100755 index 0000000..c555ba6 --- /dev/null +++ b/resources/lang/el-GR/auth.php @@ -0,0 +1,39 @@ + 'Προφίλ', + 'logout' => 'Αποσύνδεση', + 'login' => 'Σύνδεση', + 'login_to' => 'Συνδεθείτε για να ξεκινήσετε την περίοδο λειτουργίας σας', + 'remember_me' => 'Να με θυμάσαι', + 'forgot_password' => 'Ξέχασα τον κωδικό μου', + 'reset_password' => 'Επαναφορά κωδικού πρόσβασης', + 'enter_email' => 'Εισάγετε τη διεύθυνση ηλεκτρονικού ταχυδρομείου σας', + 'current_email' => 'Τρέχον ηλεκτρονικό ταχυδρομείο', + 'reset' => 'Επαναφορά', + 'never' => 'ποτέ', + + 'password' => [ + 'current' => 'Κωδικός πρόσβασης', + 'current_confirm' => 'Επιβεβαίωση κωδικού', + 'new' => 'Νέος κωδικός πρόσβασης', + 'new_confirm' => 'Επιβεβαίωση νέου κωδικού', + ], + + 'error' => [ + 'self_delete' => 'Σφάλμα: Δεν μπορείτε να διαγράψετε τον εαυτό σας!', + 'no_company' => 'Σφάλμα: Δεν έχει ανατεθεί κάποια εταιρία στο λογαριασμό σας. Παρακαλώ, επικοινωνήστε με το διαχειριστή του συστήματος.', + ], + + 'failed' => 'Αυτά τα στοιχεία εισόδου δεν επαληθεύονται από τις εγγραφές μας.', + 'disabled' => 'Αυτός ο λογαριασμός είναι απενεργοποιημένος. Παρακαλώ, επικοινωνήστε με το διαχειριστή του συστήματος.', + 'throttle' => 'Ξεπεράσατε τις επιτρεπόμενες απόπειρες σύνδεσης. Παρακαλώ δοκιμάστε ξανά σε :seconds δευτερόλεπτα.', + + 'notification' => [ + 'message_1' => 'Λαμβάνεται αυτό το μήνυμα επειδή ζητήσατε την επαναφορά του συνθηματικού για το λογαριασμό σας.', + 'message_2' => 'Αν δεν ζητήσατε την επαναφορά του συνθηματικού, δεν απαιτείται κάποια περαιτέρω ενέργεια.', + 'button' => 'Επαναφορά συνθηματικού', + ], + +]; diff --git a/resources/lang/el-GR/bills.php b/resources/lang/el-GR/bills.php new file mode 100755 index 0000000..c36423f --- /dev/null +++ b/resources/lang/el-GR/bills.php @@ -0,0 +1,46 @@ + 'Αριθμό λογαριασμού', + 'bill_date' => 'Ημερομηνία Λογαριασμού', + 'total_price' => 'Συνολική Τιμή', + 'due_date' => 'Ημ/νία παράδοσης', + 'order_number' => 'Αριθμός παραγγελίας', + 'bill_from' => 'Λογαριασμός από', + + 'quantity' => 'Ποσότητα', + 'price' => 'Τιμή', + 'sub_total' => 'Μερικό Σύνολο', + 'discount' => 'Έκπτωση', + 'tax_total' => 'Συνολικό ΦΠΑ', + 'total' => 'Σύνολο', + + 'item_name' => 'Όνομα/ονόματα Αντικειμένου', + + 'show_discount' => ':discount % Έκπτωση', + 'add_discount' => 'Προσθήκη έκπτωσης', + 'discount_desc' => 'του μερικού συνόλου', + + 'payment_due' => 'Προθεσμία εξόφλησης', + 'amount_due' => 'Οφειλόμενο ποσό', + 'paid' => 'Πληρωτέο', + 'histories' => 'Ιστορικό', + 'payments' => 'Πληρωμές', + 'add_payment' => 'Προσθήκη πληρωμής', + 'mark_received' => 'Ειλημμένη σημείωση', + 'download_pdf' => 'Λήψη PDF', + 'send_mail' => 'Αποστολή Email', + + 'status' => [ + 'draft' => 'Προσχέδιο', + 'received' => 'Ληφθέντα', + 'partial' => 'Μερική', + 'paid' => 'Πληρωμένο', + ], + + 'messages' => [ + 'received' => 'Λογαριασμός που σημειώθηκε ότι ελήφθη επιτυχώς!', + ], + +]; diff --git a/resources/lang/el-GR/companies.php b/resources/lang/el-GR/companies.php new file mode 100755 index 0000000..c2e2db3 --- /dev/null +++ b/resources/lang/el-GR/companies.php @@ -0,0 +1,13 @@ + 'Ιστοσελίδα', + 'logo' => 'Λογότυπο', + 'manage' => 'Διαχείριση εταιρειών', + 'all' => 'Όλες οι εταιρείες', + 'error' => [ + 'delete_active' => 'Σφάλμα: Δεν μπορείτε να διαγράψετε μια ενεργή εταιρεία, παρακαλώ πρέπει πρώτα να την τροποποιήσετε!', + ], + +]; diff --git a/resources/lang/el-GR/currencies.php b/resources/lang/el-GR/currencies.php new file mode 100755 index 0000000..624a79f --- /dev/null +++ b/resources/lang/el-GR/currencies.php @@ -0,0 +1,18 @@ + 'Κωδικός', + 'rate' => 'Ποσοστό', + 'default' => 'Προεπιλεγμένο νόμισμα', + 'decimal_mark' => 'Υποδιαστολή', + 'thousands_separator' => 'Σύμβολο διαχωρισμού χιλιάδων', + 'precision' => 'Ακρίβεια', + 'symbol' => [ + 'symbol' => 'Σύμβολο', + 'position' => 'Θέση συμβόλου', + 'before' => 'Πριν από το ποσό', + 'after' => 'Μετά από το ποσό', + ] + +]; diff --git a/resources/lang/el-GR/customers.php b/resources/lang/el-GR/customers.php new file mode 100755 index 0000000..0584232 --- /dev/null +++ b/resources/lang/el-GR/customers.php @@ -0,0 +1,11 @@ + 'Να επιτρέπεται η είσοδος;', + 'user_created' => 'Ο χρήστης δημιουργήθηκε', + + 'error' => [ + 'email' => 'Το email αυτό χρησιμοποιείται ήδη.' + ] +]; diff --git a/resources/lang/el-GR/dashboard.php b/resources/lang/el-GR/dashboard.php new file mode 100755 index 0000000..d0e202b --- /dev/null +++ b/resources/lang/el-GR/dashboard.php @@ -0,0 +1,24 @@ + 'Συνολικά έσοδα', + 'receivables' => 'Εισπρακτέα', + 'open_invoices' => 'Εκκρεμή τιμολόγια', + 'overdue_invoices' => 'Εκπρόθεσμα τιμολόγια', + 'total_expenses' => 'Συνολικά έξοδα', + 'payables' => 'Πληρωτέα', + 'open_bills' => 'Εκκρεμείς λογαριασμοί', + 'overdue_bills' => 'Εκπρόθεσμοι λογαριασμοί', + 'total_profit' => 'Συνολικό κέρδος', + 'open_profit' => 'Εκκρεμές κέρδος', + 'overdue_profit' => 'Εκπρόθεσμο κέρδος', + 'cash_flow' => 'Ταμειακή ροή', + 'no_profit_loss' => 'Καμία απώλεια κέρδους', + 'incomes_by_category' => 'Έσοδα κατά κατηγορία', + 'expenses_by_category' => 'Έξοδα ανά κατηγορία', + 'account_balance' => 'Υπόλοιπο λογαριασμού', + 'latest_incomes' => 'Τελευταία Έσοδα', + 'latest_expenses' => 'Τελευταία έξοδα', + +]; diff --git a/resources/lang/el-GR/demo.php b/resources/lang/el-GR/demo.php new file mode 100755 index 0000000..c2d07eb --- /dev/null +++ b/resources/lang/el-GR/demo.php @@ -0,0 +1,16 @@ + 'Μετρητά', + 'categories_deposit' => 'Κατάθεση', + 'categories_sales' => 'Πωλήσεις', + 'currencies_usd' => 'Δολάριο ΗΠΑ', + 'currencies_eur' => 'Ευρώ', + 'currencies_gbp' => 'Βρετανική Λίρα', + 'currencies_try' => 'Τουρκική Λίρα', + 'taxes_exempt' => 'Φοροαπαλλαγή', + 'taxes_normal' => 'Κανονικό ΦΠΑ', + 'taxes_sales' => 'ΦΠΑ πωλήσεων', + +]; diff --git a/resources/lang/el-GR/footer.php b/resources/lang/el-GR/footer.php new file mode 100755 index 0000000..94192e9 --- /dev/null +++ b/resources/lang/el-GR/footer.php @@ -0,0 +1,9 @@ + 'Έκδοση', + 'powered' => 'Powered By Akaunting', + 'software' => 'Δωρεάν λογισμικό λογιστικής', + +]; diff --git a/resources/lang/el-GR/general.php b/resources/lang/el-GR/general.php new file mode 100755 index 0000000..bbb179a --- /dev/null +++ b/resources/lang/el-GR/general.php @@ -0,0 +1,121 @@ + 'Προϊόν|Προϊόντα', + 'incomes' => 'Έσοδα|Εισοδήματα', + 'invoices' => 'Τιμολόγιο|Τιμολόγια', + 'revenues' => 'Έσοδο|Έσοδα', + 'customers' => 'Πελάτης|Πελάτες', + 'expenses' => 'Έξοδο|Έξοδα', + 'bills' => 'Λογαριασμός|Λογαριασμοί', + 'payments' => 'Πληρωμή|Πληρωμές', + 'vendors' => 'Προμηθευτής|Προμηθευτές', + 'accounts' => 'Λογαριασμός|Λογαριασμοί', + 'transfers' => 'Μεταφορά|Μεταφορές', + 'transactions' => 'Συναλλαγή|Συναλλαγές', + 'reports' => 'Αναφορά|Αναφορές', + 'settings' => 'Ρύθμιση|Ρυθμίσεις', + 'categories' => 'Κατηγορία|Κατηγορίες', + 'currencies' => 'Νόμισμα|Νομίσματα', + 'tax_rates' => 'Φορολογικός συντελεστής|Φορολογικοί συντελεστές', + 'users' => 'Χρήστης|Χρήστες', + 'roles' => 'Ρόλος|Ρόλοι', + 'permissions' => 'Δικαίωμα|Δικαιώματα', + 'modules' => 'Εφαρμογή|Εφαρμογές', + 'companies' => 'Εταιρία|Εταιρίες', + 'profits' => 'Κέρδος|Κέρδη', + 'taxes' => 'Φόρος|Φόροι', + 'logos' => 'Λογότυπο|Λογότυπα', + 'pictures' => 'Εικόνα|Εικόνες', + 'types' => 'Τύπος|Τύποι', + 'payment_methods' => 'Μέθοδος πληρωμής|Μέθοδοι πληρωμής', + 'compares' => 'Έσοδο προς Έξοδο|Έσοδα προς Έξοδα', + 'notes' => 'Σημείωση|Σημειώσεις', + 'totals' => 'Σύνολο|Σύνολα', + 'languages' => 'Γλώσσα|Γλώσσες', + 'updates' => 'Ενημέρωση|Ενημερώσεις', + 'numbers' => 'Αριθμός|Αριθμοί', + 'statuses' => 'Κατάσταση|Καταστάσεις', + 'others' => 'Άλλο|Άλλα', + + 'dashboard' => 'Πίνακας ελέγχου', + 'banking' => 'Τράπεζες', + 'general' => 'Γενικά', + 'no_records' => 'Καμία εγγραφή.', + 'date' => 'Ημερομηνία', + 'amount' => 'Ποσό', + 'enabled' => 'Eνεργό', + 'disabled' => 'Ανενεργό', + 'yes' => 'Ναι', + 'no' => 'Όχι', + 'na' => 'Μη Διαθέσιμο', + 'daily' => 'Ημερήσια', + 'monthly' => 'Μηνιαία', + 'quarterly' => 'Τριμηνιαία', + 'yearly' => 'Ετήσια', + 'add' => 'Προσθήκη', + 'add_new' => 'Προσθήκη νέου', + 'show' => 'Εμφάνιση', + 'edit' => 'Επεξεργασία', + 'delete' => 'Διαγραφή', + 'send' => 'Αποστολή', + 'download' => 'Λήψη', + 'delete_confirm' => 'Επιβεβαίωση διαγραφής :name :type;', + 'name' => 'Όνομα', + 'email' => 'Email', + 'tax_number' => 'Ονομασία ΦΠΑ', + 'phone' => 'Τηλέφωνο', + 'address' => 'Διεύθυνση', + 'website' => 'Ιστοσελίδα', + 'actions' => 'Ενέργειες', + 'description' => 'Περιγραφή', + 'manage' => 'Διαχείριση', + 'code' => 'Κωδικός', + 'alias' => 'Ψευδώνυμο', + 'balance' => 'Υπόλοιπο', + 'reference' => 'Αναφορά', + 'attachment' => 'Συνημμένο', + 'change' => 'Αλλαγή', + 'switch' => 'Αλλαγή', + 'color' => 'Χρώμα', + 'save' => 'Αποθήκευση', + 'cancel' => 'Ακύρωση', + 'from' => 'Από', + 'to' => 'Προς', + 'print' => 'Εκτύπωση', + 'search' => 'Αναζήτηση', + 'search_placeholder' => 'Αναζήτηση..', + 'filter' => 'Φίλτρο', + 'help' => 'Βοήθεια', + 'all' => 'Όλα', + 'all_type' => 'Όλα :type', + 'upcoming' => 'Επερχόμενα', + 'created' => 'Δημιουργήθηκε', + 'id' => 'Α/Α', + 'more_actions' => 'Περίσσότερες ενέργειες', + 'duplicate' => 'Αντιγραφή', + 'unpaid' => 'Ανεξόφλητο', + 'paid' => 'Εξοφλημένα', + 'overdue' => 'Εκπρόθεσμο', + 'partially' => 'Μερικό', + 'partially_paid' => 'Μερικώς εξοφλημένα', + 'export' => 'Εξαγωγή', + 'enable' => 'Ενεργοποίηση', + 'disable' => 'Απενεργοποίηση', + + 'title' => [ + 'new' => 'Νέο :type', + 'edit' => 'Επεξεργασία :type', + ], + + 'form' => [ + 'enter' => 'Πληκτρολογήστε :field', + 'select' => [ + 'field' => 'Επίλέξτε :field', + 'file' => 'Επιλογή αρχείου', + ], + 'no_file_selected' => 'Δεν έχει επιλεχθεί αρχείο...', + ], + +]; diff --git a/resources/lang/el-GR/header.php b/resources/lang/el-GR/header.php new file mode 100755 index 0000000..ef189a1 --- /dev/null +++ b/resources/lang/el-GR/header.php @@ -0,0 +1,15 @@ + 'Αλλαγή γλώσσας', + 'last_login' => 'Τελευταία είσοδος :time', + 'notifications' => [ + 'counter' => '{0} Δεν έχετε καμία ειδοποίηση |{1} Έχετε :count ειδοποίηση| [2 *] Έχετε :count ειδοποιήσεις', + 'overdue_invoices' => '{1} :count εκπρόθεσμο τιμολόγιο | [2 *] :count εκπρόθεσμα τιμολόγια', + 'upcoming_bills' => '{1} :count επερχόμενος λογαριασμός | [2 *] :count επερχόμενοι λογαριασμοί', + 'items_stock' => '{1} :count προϊόν έχει εξαντληθεί|[2,*] :count έχουν εξαντληθεί', + 'view_all' => 'Προβολή Όλων' + ], + +]; diff --git a/resources/lang/el-GR/import.php b/resources/lang/el-GR/import.php new file mode 100755 index 0000000..1fb9536 --- /dev/null +++ b/resources/lang/el-GR/import.php @@ -0,0 +1,9 @@ + 'Εισαγωγή', + 'title' => 'Εισαγωγή :type', + 'message' => 'Επιτρεπόμενοι τύποι αρχείων: XLS, XLSX. Παρακαλούμε, Κατεβάστε το διαθέσιμο παράδειγμα.', + +]; diff --git a/resources/lang/el-GR/install.php b/resources/lang/el-GR/install.php new file mode 100755 index 0000000..559d7f8 --- /dev/null +++ b/resources/lang/el-GR/install.php @@ -0,0 +1,44 @@ + 'Επόμενο', + 'refresh' => 'Ανανέωση', + + 'steps' => [ + 'requirements' => 'Παρακαλούμε, επικοινωνήστε με τον πάροχο σας για να διορθώσετε τα σφάλματα!', + 'language' => 'Βήμα 1/3: Επιλογή Γλώσσας', + 'database' => 'Βήμα 2/3: Ρύθμιση Βάσης Δεδομένων', + 'settings' => 'Βήμα 3/3: Στοιχεία Εταιρείας και Διαχειριστή', + ], + + 'language' => [ + 'select' => 'Επιλέξτε γλώσσα', + ], + + 'requirements' => [ + 'enabled' => ':feature πρέπει να ενεργοποιηθεί!', + 'disabled' => ':feature πρέπει να απενεργοποιηθεί!', + 'extension' => 'H επέκταση :extension πρέπει να εγκατασταθεί και να φορτωθεί!', + 'directory' => 'Ο φάκελος :directory πρέπει να είναι εγγράψιμος!', + ], + + 'database' => [ + 'hostname' => 'Όνομα κεντρικού υπολογιστή', + 'username' => 'Όνομα χρήστη', + 'password' => 'Συνθηματικό', + 'name' => 'Βάση δεδομένων', + ], + + 'settings' => [ + 'company_name' => 'Επωνυμία Εταιρείας', + 'company_email' => 'Ηλεκτρονική Διεύθυνση Εταιρίας', + 'admin_email' => 'Ηλεκτρονική Διεύθυνση Διαχειριστή', + 'admin_password' => 'Συνθηματικό Διαχειριστή', + ], + + 'error' => [ + 'connection' => 'Σφάλμα: Η σύνδεση με τη βάση δεδομένων δεν ήταν δυνατή! Παρακαλούμε, βεβαιωθείτε ότι τα στοιχεία είναι σωστά.', + ], + +]; diff --git a/resources/lang/el-GR/invoices.php b/resources/lang/el-GR/invoices.php new file mode 100755 index 0000000..6979509 --- /dev/null +++ b/resources/lang/el-GR/invoices.php @@ -0,0 +1,55 @@ + 'Αριθμός Τιμολογίου', + 'invoice_date' => 'Ημερομηνία Τιμολογίου', + 'total_price' => 'Συνολική Τιμή', + 'due_date' => 'Ημ/νία Προθεσμίας Πληρωμής', + 'order_number' => 'Αριθμός παραγγελίας', + 'bill_to' => 'Πληρωτέες σε', + + 'quantity' => 'Ποσότητα', + 'price' => 'Τιμή', + 'sub_total' => 'Μερικό Σύνολο', + 'discount' => 'Έκπτωση', + 'tax_total' => 'Σύνολο φόρου', + 'total' => 'Σύνολο', + + 'item_name' => 'Όνομα Προϊόντος|Ονόματα Προϊόντων', + + 'show_discount' => ':discount % Έκπτωση', + 'add_discount' => 'Προσθήκη έκπτωσης', + 'discount_desc' => 'του μερικού συνόλου', + + 'payment_due' => 'Ημ/νία Προθεσμίας Πληρωμής', + 'paid' => 'Εξοφλημένο', + 'histories' => 'Ιστορικό', + 'payments' => 'Πληρωμές', + 'add_payment' => 'Προσθήκη Πληρωμής', + 'mark_paid' => 'Σημείωσε ως Εξοφλημένο', + 'mark_sent' => 'Σημείωσε ως Απεσταλμένο', + 'download_pdf' => 'Λήψη PDF', + 'send_mail' => 'Αποστολή email Μηνύματος', + + 'status' => [ + 'draft' => 'Προσχέδιο', + 'sent' => 'Απεσταλμένο', + 'viewed' => 'Έχει ανοιχτεί', + 'approved' => 'Έχει εγκριθεί', + 'partial' => 'Μερικώς εξοφλημένο', + 'paid' => 'Εξοφλημένο', + ], + + 'messages' => [ + 'email_sent' => 'Το τιμολόγιο εστάλει με επιτυχία μέσω email!', + 'marked_sent' => 'Το τιμολόγιο επισημάνθηκε με επιτυχία ως σταλμένο!', + 'email_required' => 'Δεν υπάρχει διεύθυνση email για αυτόν τον πελάτη!', + ], + + 'notification' => [ + 'message' => 'Λαμβάνετε αυτό το μήνυμα επειδή έχετε ένα επερχόμενο τιμολόγιο αξίας :amount προς τον/την πελάτη :customer.', + 'button' => 'Εξόφληση τώρα', + ], + +]; diff --git a/resources/lang/el-GR/items.php b/resources/lang/el-GR/items.php new file mode 100755 index 0000000..be5522e --- /dev/null +++ b/resources/lang/el-GR/items.php @@ -0,0 +1,15 @@ + 'Ποσότητα | Ποσότητες', + 'sales_price' => 'Τιμή Πώλησης', + 'purchase_price' => 'Τιμή αγοράς', + 'sku' => 'Μονάδες Προϊόντος σε Απόθεμα', + + 'notification' => [ + 'message' => 'Λαμβάνετε αυτό το μήνυμα επειδή το : υπ\' αριθμ. προϊόν εξαντλείται.', + 'button' => 'Δείτε τώρα', + ], + +]; diff --git a/resources/lang/el-GR/messages.php b/resources/lang/el-GR/messages.php new file mode 100755 index 0000000..e7763a4 --- /dev/null +++ b/resources/lang/el-GR/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => ':type προστέθηκε!', + 'updated' => ':type ενημερώθηκε!', + 'deleted' => ':type διεγράφη!', + 'duplicated' => ':type αντιγράφηκε!', + 'imported' => ':type εισήχθη!', + 'enabled' => ':type ενεργοποιήθηκε!', + 'disabled' => ':type απενεργοποιήθηκε!', + ], + 'error' => [ + 'over_payment' => 'Σφάλμα: Η πληρωμή δεν προστέθηκε! Το ποσό ξεπερνάει το σύνολο.', + 'not_user_company' => 'Σφάλμα: Δεν επιτρέπεται να διαχειριστείτε αυτή την εταιρεία!', + 'customer' => 'Σφάλμα: Ο χρήστης δεν δημιουργήθηκε! Ο/Η :name χρησιμοποιεί ήδη αυτό το email.', + 'no_file' => 'Σφάλμα: Δεν έχετε επιλέξει αρχείο!', + 'last_category' => 'Σφάλμα: Δεν μπορείτε να διαγράψετε την τελευταία κατηγορία :type!', + 'invalid_token' => 'Σφάλμα: Το κλειδί που εισάγατε είναι δεν είναι έγκυρο!', + 'import_column' => 'Σφάλμα: :message Φύλλο: :sheet. Γραμμή: :line.', + 'import_sheet' => 'Σφάλμα: Το όνομα του φύλλου δεν είναι έγκυρο. Παρακαλώ συμβουλευτείτε το διαθέσιμο παράδειγμα.', + ], + 'warning' => [ + 'deleted' => 'Προειδοποίηση: Δεν επιτρέπεται να διαγράψετε το :name, επειδή έχει :text που σχετίζονται.', + 'disabled' => 'Προειδοποίηση: Δεν επιτρέπεται να απενεργοποιήσετε το :name, επειδή έχει :text που σχετίζονται.', + ], + +]; diff --git a/resources/lang/el-GR/modules.php b/resources/lang/el-GR/modules.php new file mode 100755 index 0000000..a73649a --- /dev/null +++ b/resources/lang/el-GR/modules.php @@ -0,0 +1,58 @@ + 'Κλειδί API', + 'api_token' => 'Κλειδί', + 'my_apps' => 'Οι εφαρμογές μου', + 'top_paid' => 'Κορυφαία επί πληρωμή Προϊόντα', + 'new' => 'Νέο', + 'top_free' => 'Κορυφαία δωρεάν Προϊόντα', + 'free' => 'ΔΩΡΕΑΝ', + 'search' => 'Αναζήτηση', + 'install' => 'Εγκατάσταση', + 'buy_now' => 'Αγοράστε τώρα', + 'token_link' => ' κάντε κλικ εδώ για να λάβετε το προσωπικό σας κλειδί API.', + 'no_apps' => 'Δεν υπάρχουν εφαρμογές σε αυτή την κατηγορία, ακόμα.', + 'developer' => 'Είστε προγραμματιστής; εδώ μπορείτε να μάθετε πώς μπορείτε να δημιουργήσετε μια εφαρμογή και να αρχίσετε να την πουλάτε σήμερα κιόλας!', + + 'about' => 'Σχετικά με', + + 'added' => 'Έχει προστεθεί', + 'updated' => 'Ενημερώθηκε', + 'compatibility' => 'Συμβατότητα', + + 'installed' => 'τo :module εγκαταστάθηκε', + 'uninstalled' => 'τo :module απεγκαταστάθηκε', + //'updated' => ':module updated', + 'enabled' => 'τo :module ενεργοποιήθηκε', + 'disabled' => 'τo :module απενεργοποιήθηκε', + + 'tab' => [ + 'installation' => 'Εγκατάσταση', + 'faq' => 'Συχνές ερωτήσεις (FAQ)', + 'changelog' => 'Αρχείο καταγραφής αλλαγών', + ], + + 'installation' => [ + 'header' => 'Εγκατάσταση εφαρμογής', + 'download' => 'Λήψη αρχείου :module.', + 'unzip' => 'Εξαγωγή :όνομα αρχείου.', + 'install' => 'Εγκατάσταση :όνομα αρχείου.', + ], + + 'badge' => [ + 'installed' => 'Εγκατεστημένο', + ], + + 'button' => [ + 'uninstall' => 'Απεγκατάσταση', + 'disable' => 'Απενεργοποίηση', + 'enable' => 'Ενεργοποίηση', + ], + + 'my' => [ + 'purchased' => 'Αγορασμένο', + 'installed' => 'Εγκατεστημένα', + ], +]; diff --git a/resources/lang/el-GR/notifications.php b/resources/lang/el-GR/notifications.php new file mode 100755 index 0000000..4783472 --- /dev/null +++ b/resources/lang/el-GR/notifications.php @@ -0,0 +1,10 @@ + 'Ουπς!', + 'hello' => 'Γεια σας!', + 'salutation' => 'Με εκτίμηση,
    :company_name', + 'subcopy' => 'Εάν το πλήκτρο ":text" δεν λειτουργεί, μπορείτε να αντιγράψετε και επικολλήσετε τη παρακάτω διεύθυνση URL σε ένα νέο παράθυρο του προγράμματος περιήγησης: [:url](:url)', + +]; diff --git a/resources/lang/el-GR/pagination.php b/resources/lang/el-GR/pagination.php new file mode 100755 index 0000000..7032c03 --- /dev/null +++ b/resources/lang/el-GR/pagination.php @@ -0,0 +1,9 @@ + '« Προηγούμενη', + 'next' => 'Επόμενη »', + 'showing' => 'Εμφάνιση :first έως :last από :total :type', + +]; diff --git a/resources/lang/el-GR/passwords.php b/resources/lang/el-GR/passwords.php new file mode 100755 index 0000000..a85247d --- /dev/null +++ b/resources/lang/el-GR/passwords.php @@ -0,0 +1,22 @@ + 'Το συνθηματικό πρέπει να αποτελείται από τουλάχιστον έξι χαρακτήρες και να ταιριάζει με την επαλήθευση.', + 'reset' => 'Έχει γίνει επαναφορά του συνθηματικού!', + 'sent' => 'Η υπενθύμιση του συνθηματικού εστάλη στην ηλεκτρονική σας διεύθυνση!', + 'token' => 'Το κλειδί επαναφοράς του συνθηματικού σας δεν είναι έγκυρο.', + 'user' => "Δεν βρέθηκε χρήστης με τη συγκεκριμένη ηλεκτρονική διεύθυνση.", + +]; diff --git a/resources/lang/el-GR/recurring.php b/resources/lang/el-GR/recurring.php new file mode 100755 index 0000000..e912f7b --- /dev/null +++ b/resources/lang/el-GR/recurring.php @@ -0,0 +1,20 @@ + 'Επαναλαμβανόμενα', + 'every' => 'Κάθε', + 'period' => 'Περίοδος', + 'times' => 'Φορές', + 'daily' => 'Ημερήσια', + 'weekly' => 'Εβδομαδιαία', + 'monthly' => 'Μηνιαία', + 'yearly' => 'Ετήσια', + 'custom' => 'Προσαρμογή', + 'days' => 'Ημέρα(ες)', + 'weeks' => 'Εβδομάδα(ες)', + 'months' => 'Μήνα(ες)', + 'years' => 'Έτος(η)', + 'message' => 'Αυτό είναι ένα επαναλαμβανόμενο :type και το επόμενο :type θα δημιουργηθεί αυτόματα στις :date', + +]; diff --git a/resources/lang/el-GR/reports.php b/resources/lang/el-GR/reports.php new file mode 100755 index 0000000..504ae14 --- /dev/null +++ b/resources/lang/el-GR/reports.php @@ -0,0 +1,30 @@ + 'Φέτος', + 'previous_year' => 'Προηγούμενο έτος', + 'this_quarter' => 'Αυτό το τρίμηνο', + 'previous_quarter' => 'Προηγούμενο τρίμηνο', + 'last_12_months' => 'Τελευταίοι 12 μήνες', + 'profit_loss' => 'Κέρδη και Ζημίες', + 'gross_profit' => 'Μικτό Κέρδος', + 'net_profit' => 'Καθαρό Κέρδος', + 'total_expenses' => 'Συνολικά Έξοδα', + 'net' => 'Καθαρά', + + 'summary' => [ + 'income' => 'Σύνοψη εσόδων', + 'expense' => 'Σύνοψη εξόδων', + 'income_expense' => 'Έσοδα με έξοδα', + 'tax' => 'Σύνοψη φόρων', + ], + + 'quarter' => [ + '1' => 'Ιαν-Μαρ', + '2' => 'Απρ-Ιουν', + '3' => 'Ιουλ-Σεπ', + '4' => 'Οκτ-Δεκ', + ], + +]; diff --git a/resources/lang/el-GR/settings.php b/resources/lang/el-GR/settings.php new file mode 100755 index 0000000..b4e6ed0 --- /dev/null +++ b/resources/lang/el-GR/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Όνομα', + 'email' => 'Διεύθυνση ηλ. ταχυδρομείου', + 'phone' => 'Τηλέφωνο', + 'address' => 'Διεύθυνση', + 'logo' => 'Λογότυπο', + ], + 'localisation' => [ + 'tab' => 'Τοπική προσαρμογή', + 'date' => [ + 'format' => 'Μορφοποίηση Ημερομηνίας', + 'separator' => 'Διαχωριστικό ημερομηνίας', + 'dash' => 'Παύλα (-)', + 'dot' => 'Τελεία (.)', + 'comma' => 'Κόμμα (,)', + 'slash' => 'Πλαγιοκάθετος (/)', + 'space' => 'Κενό ( )', + ], + 'timezone' => 'Ζώνη ώρας', + 'percent' => [ + 'title' => 'Θέση συμβόλου ποσοστού (%)', + 'before' => 'Πριν από τον αριθμό', + 'after' => 'Μετά από τον αριθμό', + ], + ], + 'invoice' => [ + 'tab' => 'Τιμολόγιο', + 'prefix' => 'Πρόθεμα αριθμού', + 'digit' => 'Αριθμός ψηφίων', + 'next' => 'Επόμενος αριθμός', + 'logo' => 'Λογότυπο', + ], + 'default' => [ + 'tab' => 'Προεπιλογές', + 'account' => 'Προεπιλεγμένος λογαριασμός', + 'currency' => 'Προεπιλεγμένο νόμισμα', + 'tax' => 'Προεπιλεγμένη φορολογικός συντελεστής', + 'payment' => 'Προεπιλεγμένη μέθοδος πληρωμής', + 'language' => 'Προεπιλεγμένη Γλώσσα', + ], + 'email' => [ + 'protocol' => 'Πρωτόκολλο', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'Διακομιστής SMTP', + 'port' => 'Θύρα SMTP', + 'username' => 'Όνομα Χρήστη SMTP', + 'password' => 'Συνθηματικό SMTP', + 'encryption' => 'Ασφάλεια SMTP', + 'none' => 'Κανένα', + ], + 'sendmail' => 'Απεσταλμένα μηνύματα', + 'sendmail_path' => 'Διαδρομή προς Απεσταλμένα Μηνύματα', + 'log' => 'Αρχείο καταγραφής ηλεκτρονικών μηνυμάτων', + ], + 'scheduling' => [ + 'tab' => 'Χρονοδιαγραμα', + 'send_invoice' => 'Υπενθύμιση αποστολής τιμολογίου', + 'invoice_days' => 'Αποστολή μετά από πόσες μέρες πρέπει να εξοφληθεί', + 'send_bill' => 'Αποστολή υπενθύμισης Λογαριασμού', + 'bill_days' => 'Αποστολή πριν από πόσες μέρες θα έπρεπε να είχε εξοφληθεί', + 'cron_command' => 'Προγραμματισμένη Εντολή', + 'schedule_time' => 'Ώρα εκτέλεσης', + ], + 'appearance' => [ + 'tab' => 'Εμφάνιση', + 'theme' => 'Θέμα', + 'light' => 'Φωτεινό', + 'dark' => 'Σκοτεινό', + 'list_limit' => 'Εγγραφές ανά σελίδα', + 'use_gravatar' => 'Χρήση gravatar', + ], + 'system' => [ + 'tab' => 'Σύστημα', + 'session' => [ + 'lifetime' => 'Διάρκεια συνεδρίας (λεπτά)', + 'handler' => 'Διαχειριστής συνεδρίας', + 'file' => 'Αρχείο', + 'database' => 'Βάση δεδομένων', + ], + 'file_size' => 'Μέγιστο μέγεθος αρχείου (MB)', + 'file_types' => 'Επιτρεπόμενα αρχεία', + ], + +]; diff --git a/resources/lang/el-GR/taxes.php b/resources/lang/el-GR/taxes.php new file mode 100755 index 0000000..efa93a4 --- /dev/null +++ b/resources/lang/el-GR/taxes.php @@ -0,0 +1,8 @@ + 'Συντελεστής', + 'rate_percent' => 'Συντελεστής (%)', + +]; diff --git a/resources/lang/el-GR/transfers.php b/resources/lang/el-GR/transfers.php new file mode 100755 index 0000000..b079dae --- /dev/null +++ b/resources/lang/el-GR/transfers.php @@ -0,0 +1,12 @@ + 'Από λογαριασμό', + 'to_account' => 'Προς λογαριασμό', + + 'messages' => [ + 'delete' => ':from προς :to (:amount)', + ], + +]; diff --git a/resources/lang/el-GR/updates.php b/resources/lang/el-GR/updates.php new file mode 100755 index 0000000..3bd9e85 --- /dev/null +++ b/resources/lang/el-GR/updates.php @@ -0,0 +1,15 @@ + 'Εγκατεστημένη έκδοση', + 'latest_version' => 'Τελευταία έκδοση', + 'update' => 'Ενημέρωση Akaunting στην έκδοση :version', + 'changelog' => 'Αρχείο καταγραφής αλλαγών', + 'check' => 'Έλεγχος', + 'new_core' => 'Διατίθεται μια ενημερωμένη έκδοση του Akaunting.', + 'latest_core' => 'Συγχαρητήρια! Έχετε την τελευταία έκδοση του Akaunting. Οι μελλοντικές ενημερώσεις ασφαλείας θα εφαρμόζονται αυτόματα.', + 'success' => 'Η ενημέρωση έχει ολοκληρωθεί επιτυχώς.', + 'error' => 'Η ενημέρωση απέτυχε. Παρακαλώ προσπαθήστε ξανά.', + +]; diff --git a/resources/lang/el-GR/validation.php b/resources/lang/el-GR/validation.php new file mode 100755 index 0000000..56cdb3e --- /dev/null +++ b/resources/lang/el-GR/validation.php @@ -0,0 +1,120 @@ + 'Το πεδίο :attribute πρέπει να γίνει αποδεκτό.', + 'active_url' => 'Το πεδίο :attribute δεν είναι αποδεκτή διεύθυνση URL.', + 'after' => 'Το πεδίο :attribute πρέπει να είναι μία ημερομηνία μετά από :date.', + 'after_or_equal' => 'Το πεδίο :attribute πρέπει να είναι μία ημερομηνία ίδια ή μετά από :date.', + 'alpha' => 'Το πεδίο :attribute μπορεί να περιέχει μόνο γράμματα.', + 'alpha_dash' => 'Το πεδίο :attribute μπορεί να περιέχει μόνο γράμματα, αριθμούς, και παύλες.', + 'alpha_num' => 'Το πεδίο :attribute μπορεί να περιέχει μόνο γράμματα και αριθμούς.', + 'array' => 'Το πεδίο :attribute πρέπει να είναι ένας πίνακας.', + 'before' => 'Το πεδίο :attribute πρέπει να είναι μία ημερομηνία πριν από :date.', + 'before_or_equal' => 'Το πεδίο :attribute πρέπει να είναι μία ημερομηνία ίδια ή πριν από :date.', + 'between' => [ + 'numeric' => 'Το πεδίο :attribute πρέπει να είναι μεταξύ :min - :max.', + 'file' => 'Το πεδίο :attribute πρέπει να είναι μεταξύ :min - :max kilobytes.', + 'string' => 'Το πεδίο :attribute πρέπει να είναι μεταξύ :min - :max χαρακτήρες.', + 'array' => 'Το πεδίο :attribute πρέπει να έχει μεταξύ :min - :max αντικείμενα.', + ], + 'boolean' => 'Το πεδίο :attribute πρέπει να είναι true ή false.', + 'confirmed' => 'Η επιβεβαίωση του :attribute δεν ταιριάζει.', + 'date' => 'Το πεδίο :attribute δεν είναι έγκυρη ημερομηνία.', + 'date_format' => 'Το πεδίο :attribute δεν είναι της μορφής :format.', + 'different' => 'Το πεδίο :attribute και :other πρέπει να είναι διαφορετικά.', + 'digits' => 'Το πεδίο :attribute πρέπει να είναι :digits ψηφία.', + 'digits_between' => 'Το πεδίο :attribute πρέπει να είναι μεταξύ :min και :max ψηφία.', + 'dimensions' => 'Το πεδίο :attribute περιέχει μη έγκυρες διαστάσεις εικόνας.', + 'distinct' => 'Το πεδίο :attribute περιέχει δύο φορές την ίδια τιμή.', + 'email' => 'Το πεδίο :attribute πρέπει να είναι μία έγκυρη διεύθυνση email.', + 'exists' => 'Το επιλεγμένο :attribute δεν είναι έγκυρο.', + 'file' => 'Το πεδίο :attribute πρέπει να είναι αρχείο.', + 'filled' => 'To πεδίο :attribute είναι απαραίτητο.', + 'image' => 'Το πεδίο :attribute πρέπει να είναι εικόνα.', + 'in' => 'Το επιλεγμένο :attribute δεν είναι έγκυρο.', + 'in_array' => 'Το πεδίο :attribute δεν υπάρχει σε :other.', + 'integer' => 'Το πεδίο :attribute πρέπει να είναι ακέραιος.', + 'ip' => 'Το πεδίο :attribute πρέπει να είναι μία έγκυρη διεύθυνση IP.', + 'json' => 'Το πεδίο :attribute πρέπει να είναι μία έγκυρη συμβολοσειρά JSON.', + 'max' => [ + 'numeric' => 'Το πεδίο :attribute δεν μπορεί να είναι μεγαλύτερο από :max.', + 'file' => 'Το πεδίο :attribute δεν μπορεί να είναι μεγαλύτερό :max kilobytes.', + 'string' => 'Το πεδίο :attribute δεν μπορεί να έχει περισσότερους από :max χαρακτήρες.', + 'array' => 'Το πεδίο :attribute δεν μπορεί να έχει περισσότερα από :max αντικείμενα.', + ], + 'mimes' => 'Το πεδίο :attribute πρέπει να είναι αρχείο τύπου: :values.', + 'mimetypes' => 'Το πεδίο :attribute πρέπει να είναι αρχείο τύπου: :values.', + 'min' => [ + 'numeric' => 'Το πεδίο :attribute πρέπει να είναι τουλάχιστον :min.', + 'file' => 'Το πεδίο :attribute πρέπει να είναι τουλάχιστον :min kilobytes.', + 'string' => 'Το πεδίο :attribute πρέπει να έχει τουλάχιστον :min χαρακτήρες.', + 'array' => 'Το πεδίο :attribute πρέπει να έχει τουλάχιστον :min αντικείμενα.', + ], + 'not_in' => 'Το επιλεγμένο :attribute δεν είναι αποδεκτό.', + 'numeric' => 'Το πεδίο :attribute πρέπει να είναι αριθμός.', + 'present' => 'Το πεδίο :attribute πρέπει να υπάρχει.', + 'regex' => 'Η μορφή του :attribute δεν είναι αποδεκτή.', + 'required' => 'Το πεδίο :attribute είναι απαραίτητο.', + 'required_if' => 'Το πεδίο :attribute είναι απαραίτητο όταν το πεδίο :other είναι :value.', + 'required_unless' => 'Το πεδίο :attribute είναι απαραίτητο εκτός αν το πεδίο :other εμπεριέχει :values.', + 'required_with' => 'Το πεδίο :attribute είναι απαραίτητο όταν υπάρχει :values.', + 'required_with_all' => 'Το πεδίο :attribute είναι απαραίτητο όταν υπάρχουν :values.', + 'required_without' => 'Το πεδίο :attribute είναι απαραίτητο όταν δεν υπάρχει :values.', + 'required_without_all' => 'Το πεδίο :attribute είναι απαραίτητο όταν δεν υπάρχει κανένα από :values.', + 'same' => 'Τα πεδία :attribute και :other πρέπει να είναι ίδια.', + 'size' => [ + 'numeric' => 'Το πεδίο :attribute πρέπει να είναι :size.', + 'file' => 'Το πεδίο :attribute πρέπει να είναι :size kilobytes.', + 'string' => 'Το πεδίο :attribute πρέπει να είναι :size χαρακτήρες.', + 'array' => 'Το πεδίο :attribute πρέπει να περιέχει :size αντικείμενα.', + ], + 'string' => 'Το πεδίο :attribute πρέπει να είναι αλφαριθμητικό.', + 'timezone' => 'Το πεδίο :attribute πρέπει να είναι μία έγκυρη ζώνη ώρας.', + 'unique' => 'Το πεδίο :attribute έχει ήδη εκχωρηθεί.', + 'uploaded' => 'Η μεταφόρτωση του πεδίου :attribute απέτυχε.', + 'url' => 'Το πεδίο :attribute δεν είναι έγκυρη διεύθυνση URL.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'προσαρμοσμένο-μήνυμα', + ], + 'invalid_currency' => 'Το πεδίο :attribute δεν είναι έγκυρος κωδικός νομίσματος.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/en-GB/accounts.php b/resources/lang/en-GB/accounts.php new file mode 100755 index 0000000..98b9c65 --- /dev/null +++ b/resources/lang/en-GB/accounts.php @@ -0,0 +1,14 @@ + 'Account Name', + 'number' => 'Number', + 'opening_balance' => 'Opening Balance', + 'current_balance' => 'Current Balance', + 'bank_name' => 'Bank Name', + 'bank_phone' => 'Bank Phone', + 'bank_address' => 'Bank Address', + 'default_account' => 'Default Account', + +]; diff --git a/resources/lang/en-GB/auth.php b/resources/lang/en-GB/auth.php new file mode 100755 index 0000000..70bb873 --- /dev/null +++ b/resources/lang/en-GB/auth.php @@ -0,0 +1,39 @@ + 'Profile', + 'logout' => 'Logout', + 'login' => 'Login', + 'login_to' => 'Login to start your session', + 'remember_me' => 'Remember Me', + 'forgot_password' => 'I forgot my password', + 'reset_password' => 'Reset Password', + 'enter_email' => 'Enter Your Email Address', + 'current_email' => 'Current Email', + 'reset' => 'Reset', + 'never' => 'never', + + 'password' => [ + 'current' => 'Password', + 'current_confirm' => 'Password Confirmation', + 'new' => 'New Password', + 'new_confirm' => 'New Password Confirmation', + ], + + 'error' => [ + 'self_delete' => 'Error: Can not delete yourself!', + 'no_company' => 'Error: No company assigned to your account. Please, contact the system administrator.', + ], + + 'failed' => 'These credentials do not match our records.', + 'disabled' => 'This account is disabled. Please, contact the system administrator.', + 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', + + 'notification' => [ + 'message_1' => 'You are receiving this email because we received a password reset request for your account.', + 'message_2' => 'If you did not request a password reset, no further action is required.', + 'button' => 'Reset Password', + ], + +]; diff --git a/resources/lang/en-GB/bills.php b/resources/lang/en-GB/bills.php new file mode 100755 index 0000000..b8832c9 --- /dev/null +++ b/resources/lang/en-GB/bills.php @@ -0,0 +1,46 @@ + 'Bill Number', + 'bill_date' => 'Bill Date', + 'total_price' => 'Total Price', + 'due_date' => 'Due Date', + 'order_number' => 'Order Number', + 'bill_from' => 'Bill From', + + 'quantity' => 'Quantity', + 'price' => 'Price', + 'sub_total' => 'Subtotal', + 'discount' => 'Discount', + 'tax_total' => 'Tax Total', + 'total' => 'Total', + + 'item_name' => 'Item Name|Item Names', + + 'show_discount' => ':discount% Discount', + 'add_discount' => 'Add Discount', + 'discount_desc' => 'of subtotal', + + 'payment_due' => 'Payment Due', + 'amount_due' => 'Amount Due', + 'paid' => 'Paid', + 'histories' => 'Histories', + 'payments' => 'Payments', + 'add_payment' => 'Add Payment', + 'mark_received' => 'Mark Received', + 'download_pdf' => 'Download PDF', + 'send_mail' => 'Send Email', + + 'status' => [ + 'draft' => 'Draft', + 'received' => 'Received', + 'partial' => 'Partial', + 'paid' => 'Paid', + ], + + 'messages' => [ + 'received' => 'Bill marked as received successfully!', + ], + +]; diff --git a/resources/lang/en-GB/companies.php b/resources/lang/en-GB/companies.php new file mode 100755 index 0000000..5d80cac --- /dev/null +++ b/resources/lang/en-GB/companies.php @@ -0,0 +1,13 @@ + 'Domain', + 'logo' => 'Logo', + 'manage' => 'Manage Companies', + 'all' => 'All Companies', + 'error' => [ + 'delete_active' => 'Error: Can not delete active company, please, change it first!', + ], + +]; diff --git a/resources/lang/en-GB/currencies.php b/resources/lang/en-GB/currencies.php new file mode 100755 index 0000000..959079f --- /dev/null +++ b/resources/lang/en-GB/currencies.php @@ -0,0 +1,18 @@ + 'Code', + 'rate' => 'Rate', + 'default' => 'Default Currency', + 'decimal_mark' => 'Decimal Mark', + 'thousands_separator' => 'Thousands Separator', + 'precision' => 'Precision', + 'symbol' => [ + 'symbol' => 'Symbol', + 'position' => 'Symbol Position', + 'before' => 'Before Amount', + 'after' => 'After Amount', + ] + +]; diff --git a/resources/lang/en-GB/customers.php b/resources/lang/en-GB/customers.php new file mode 100755 index 0000000..cad4bc8 --- /dev/null +++ b/resources/lang/en-GB/customers.php @@ -0,0 +1,11 @@ + 'Allow Login?', + 'user_created' => 'User Created', + + 'error' => [ + 'email' => 'The email has already been taken.' + ] +]; diff --git a/resources/lang/en-GB/dashboard.php b/resources/lang/en-GB/dashboard.php new file mode 100755 index 0000000..147f4b6 --- /dev/null +++ b/resources/lang/en-GB/dashboard.php @@ -0,0 +1,24 @@ + 'Total Incomes', + 'receivables' => 'Receivables', + 'open_invoices' => 'Open Invoices', + 'overdue_invoices' => 'Overdue Invoices', + 'total_expenses' => 'Total Expenses', + 'payables' => 'Payables', + 'open_bills' => 'Open Bills', + 'overdue_bills' => 'Overdue Bills', + 'total_profit' => 'Total Profit', + 'open_profit' => 'Open Profit', + 'overdue_profit' => 'Overdue Profit', + 'cash_flow' => 'Cash Flow', + 'no_profit_loss' => 'No Profit Loss', + 'incomes_by_category' => 'Incomes By Category', + 'expenses_by_category' => 'Expenses By Category', + 'account_balance' => 'Account Balance', + 'latest_incomes' => 'Latest Incomes', + 'latest_expenses' => 'Latest Expenses', + +]; diff --git a/resources/lang/en-GB/demo.php b/resources/lang/en-GB/demo.php new file mode 100755 index 0000000..e2447ce --- /dev/null +++ b/resources/lang/en-GB/demo.php @@ -0,0 +1,16 @@ + 'Cash', + 'categories_deposit' => 'Deposit', + 'categories_sales' => 'Sales', + 'currencies_usd' => 'US Dollar', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'British Pound', + 'currencies_try' => 'Turkish Lira', + 'taxes_exempt' => 'Tax Exempt', + 'taxes_normal' => 'Normal Tax', + 'taxes_sales' => 'Sales Tax', + +]; diff --git a/resources/lang/en-GB/footer.php b/resources/lang/en-GB/footer.php new file mode 100755 index 0000000..e099c6a --- /dev/null +++ b/resources/lang/en-GB/footer.php @@ -0,0 +1,9 @@ + 'Version', + 'powered' => 'Powered By Akaunting', + 'software' => 'Free Accounting Software', + +]; diff --git a/resources/lang/en-GB/general.php b/resources/lang/en-GB/general.php new file mode 100755 index 0000000..8d289c4 --- /dev/null +++ b/resources/lang/en-GB/general.php @@ -0,0 +1,121 @@ + 'Item|Items', + 'incomes' => 'Income|Incomes', + 'invoices' => 'Invoice|Invoices', + 'revenues' => 'Revenue|Revenues', + 'customers' => 'Customer|Customers', + 'expenses' => 'Expense|Expenses', + 'bills' => 'Bill|Bills', + 'payments' => 'Payment|Payments', + 'vendors' => 'Vendor|Vendors', + 'accounts' => 'Account|Accounts', + 'transfers' => 'Transfer|Transfers', + 'transactions' => 'Transaction|Transactions', + 'reports' => 'Report|Reports', + 'settings' => 'Setting|Settings', + 'categories' => 'Category|Categories', + 'currencies' => 'Currency|Currencies', + 'tax_rates' => 'Tax Rate|Tax Rates', + 'users' => 'User|Users', + 'roles' => 'Role|Roles', + 'permissions' => 'Permission|Permissions', + 'modules' => 'App|Apps', + 'companies' => 'Company|Companies', + 'profits' => 'Profit|Profits', + 'taxes' => 'Tax|Taxes', + 'logos' => 'Logo|Logos', + 'pictures' => 'Picture|Pictures', + 'types' => 'Type|Types', + 'payment_methods' => 'Payment Method|Payment Methods', + 'compares' => 'Income vs Expense|Incomes vs Expenses', + 'notes' => 'Note|Notes', + 'totals' => 'Total|Totals', + 'languages' => 'Language|Languages', + 'updates' => 'Update|Updates', + 'numbers' => 'Number|Numbers', + 'statuses' => 'Status|Statuses', + 'others' => 'Other|Others', + + 'dashboard' => 'Dashboard', + 'banking' => 'Banking', + 'general' => 'General', + 'no_records' => 'No records.', + 'date' => 'Date', + 'amount' => 'Amount', + 'enabled' => 'Enabled', + 'disabled' => 'Disabled', + 'yes' => 'Yes', + 'no' => 'No', + 'na' => 'N/A', + 'daily' => 'Daily', + 'monthly' => 'Monthly', + 'quarterly' => 'Quarterly', + 'yearly' => 'Yearly', + 'add' => 'Add', + 'add_new' => 'Add New', + 'show' => 'Show', + 'edit' => 'Edit', + 'delete' => 'Delete', + 'send' => 'Send', + 'download' => 'Download', + 'delete_confirm' => 'Confirm delete :name :type?', + 'name' => 'Name', + 'email' => 'Email', + 'tax_number' => 'Tax Number', + 'phone' => 'Phone', + 'address' => 'Address', + 'website' => 'Website', + 'actions' => 'Actions', + 'description' => 'Description', + 'manage' => 'Manage', + 'code' => 'Code', + 'alias' => 'Alias', + 'balance' => 'Balance', + 'reference' => 'Reference', + 'attachment' => 'Attachment', + 'change' => 'Change', + 'switch' => 'Switch', + 'color' => 'Colour', + 'save' => 'Save', + 'cancel' => 'Cancel', + 'from' => 'From', + 'to' => 'To', + 'print' => 'Print', + 'search' => 'Search', + 'search_placeholder' => 'Type to search..', + 'filter' => 'Filter', + 'help' => 'Help', + 'all' => 'All', + 'all_type' => 'All :type', + 'upcoming' => 'Upcoming', + 'created' => 'Created', + 'id' => 'ID', + 'more_actions' => 'More Actions', + 'duplicate' => 'Duplicate', + 'unpaid' => 'Unpaid', + 'paid' => 'Paid', + 'overdue' => 'Overdue', + 'partially' => 'Partially', + 'partially_paid' => 'Partially Paid', + 'export' => 'Export', + 'enable' => 'Enable', + 'disable' => 'Disable', + + 'title' => [ + 'new' => 'New :type', + 'edit' => 'Edit :type', + ], + + 'form' => [ + 'enter' => 'Enter :field', + 'select' => [ + 'field' => '- Select :field -', + 'file' => 'Select File', + ], + 'no_file_selected' => 'No file selected...', + ], + +]; diff --git a/resources/lang/en-GB/header.php b/resources/lang/en-GB/header.php new file mode 100755 index 0000000..6f57b79 --- /dev/null +++ b/resources/lang/en-GB/header.php @@ -0,0 +1,15 @@ + 'Change Language', + 'last_login' => 'Last login :time', + 'notifications' => [ + 'counter' => '{0} You have no notification|{1} You have :count notification|[2,*] You have :count notifications', + 'overdue_invoices' => '{1} :count overdue invoice|[2,*] :count overdue invoices', + 'upcoming_bills' => '{1} :count upcoming bill|[2,*] :count upcoming bills', + 'items_stock' => '{1} :count item out of stock|[2,*] :count items out of stock', + 'view_all' => 'View All' + ], + +]; diff --git a/resources/lang/en-GB/import.php b/resources/lang/en-GB/import.php new file mode 100755 index 0000000..d4a326e --- /dev/null +++ b/resources/lang/en-GB/import.php @@ -0,0 +1,9 @@ + 'Import', + 'title' => 'Import :type', + 'message' => 'Allowed file types: XLS, XLSX. Please, download the sample file.', + +]; diff --git a/resources/lang/en-GB/install.php b/resources/lang/en-GB/install.php new file mode 100755 index 0000000..04a9fe8 --- /dev/null +++ b/resources/lang/en-GB/install.php @@ -0,0 +1,44 @@ + 'Next', + 'refresh' => 'Refresh', + + 'steps' => [ + 'requirements' => 'Please, ask your hosting provider to fix the errors!', + 'language' => 'Step 1/3 : Language Selection', + 'database' => 'Step 2/3 : Database Setup', + 'settings' => 'Step 3/3 : Company and Admin Details', + ], + + 'language' => [ + 'select' => 'Select Language', + ], + + 'requirements' => [ + 'enabled' => ':feature needs to be enabled!', + 'disabled' => ':feature needs to be disabled!', + 'extension' => ':extension extension needs to be installed and loaded!', + 'directory' => ':directory directory needs to be writable!', + ], + + 'database' => [ + 'hostname' => 'Hostname', + 'username' => 'Username', + 'password' => 'Password', + 'name' => 'Database', + ], + + 'settings' => [ + 'company_name' => 'Company Name', + 'company_email' => 'Company Email', + 'admin_email' => 'Admin Email', + 'admin_password' => 'Admin Password', + ], + + 'error' => [ + 'connection' => 'Error: Could not connect to the database! Please, make sure the details are correct.', + ], + +]; diff --git a/resources/lang/en-GB/invoices.php b/resources/lang/en-GB/invoices.php new file mode 100755 index 0000000..66e7518 --- /dev/null +++ b/resources/lang/en-GB/invoices.php @@ -0,0 +1,55 @@ + 'Invoice Number', + 'invoice_date' => 'Invoice Date', + 'total_price' => 'Total Price', + 'due_date' => 'Due Date', + 'order_number' => 'Order Number', + 'bill_to' => 'Bill To', + + 'quantity' => 'Quantity', + 'price' => 'Price', + 'sub_total' => 'Subtotal', + 'discount' => 'Discount', + 'tax_total' => 'Tax Total', + 'total' => 'Total', + + 'item_name' => 'Item Name|Item Names', + + 'show_discount' => ':discount% Discount', + 'add_discount' => 'Add Discount', + 'discount_desc' => 'of subtotal', + + 'payment_due' => 'Payment Due', + 'paid' => 'Paid', + 'histories' => 'Histories', + 'payments' => 'Payments', + 'add_payment' => 'Add Payment', + 'mark_paid' => 'Mark Paid', + 'mark_sent' => 'Mark Sent', + 'download_pdf' => 'Download PDF', + 'send_mail' => 'Send Email', + + 'status' => [ + 'draft' => 'Draft', + 'sent' => 'Sent', + 'viewed' => 'Viewed', + 'approved' => 'Approved', + 'partial' => 'Partial', + 'paid' => 'Paid', + ], + + 'messages' => [ + 'email_sent' => 'Invoice email has been sent successfully!', + 'marked_sent' => 'Invoice marked as sent successfully!', + 'email_required' => 'No email address for this customer!', + ], + + 'notification' => [ + 'message' => 'You are receiving this email because you have an upcoming :amount invoice to :customer customer.', + 'button' => 'Pay Now', + ], + +]; diff --git a/resources/lang/en-GB/items.php b/resources/lang/en-GB/items.php new file mode 100755 index 0000000..eba79c4 --- /dev/null +++ b/resources/lang/en-GB/items.php @@ -0,0 +1,15 @@ + 'Quantity|Quantities', + 'sales_price' => 'Sale Price', + 'purchase_price' => 'Purchase Price', + 'sku' => 'SKU', + + 'notification' => [ + 'message' => 'You are receiving this email because the :name is running out of stock.', + 'button' => 'View Now', + ], + +]; diff --git a/resources/lang/en-GB/messages.php b/resources/lang/en-GB/messages.php new file mode 100755 index 0000000..2ed9699 --- /dev/null +++ b/resources/lang/en-GB/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => ':type added!', + 'updated' => ':type updated!', + 'deleted' => ':type deleted!', + 'duplicated' => ':type duplicated!', + 'imported' => ':type imported!', + 'enabled' => ':type enabled!', + 'disabled' => ':type disabled!', + ], + 'error' => [ + 'over_payment' => 'Error: Payment not added! Amount passes the total. You don\'t should max add amount: :amount', + 'not_user_company' => 'Error: You are not allowed to manage this company!', + 'customer' => 'Error: User not created! :name already uses this email address.', + 'no_file' => 'Error: No file selected!', + 'last_category' => 'Error: Can not delete the last :type category!', + 'invalid_token' => 'Error: The token entered is invalid!', + 'import_column' => 'Error: :message Sheet name: :sheet. Line number: :line.', + 'import_sheet' => 'Error: Sheet name is not valid. Please, check the sample file.', + ], + 'warning' => [ + 'deleted' => 'Warning: You are not allowed to delete :name because it has :text related.', + 'disabled' => 'Warning: You are not allowed to disable :name because it has :text related.', + ], + +]; diff --git a/resources/lang/en-GB/modules.php b/resources/lang/en-GB/modules.php new file mode 100755 index 0000000..ce62fd3 --- /dev/null +++ b/resources/lang/en-GB/modules.php @@ -0,0 +1,66 @@ + 'API Token', + 'api_token' => 'Token', + 'my_apps' => 'My Apps', + 'top_paid' => 'Top Paid', + 'new' => 'New', + 'top_free' => 'Top Free', + 'free' => 'FREE', + 'search' => 'Search', + 'install' => 'Install', + 'buy_now' => 'Buy Now', + 'token_link' => 'Click here to get your API token.', + 'no_apps' => 'There are no apps in this category, yet.', + 'developer' => 'Are you a developer? Here you can learn how to create an app and start selling today!', + + 'about' => 'About', + + 'added' => 'Added', + 'updated' => 'Updated', + 'compatibility' => 'Compatibility', + + 'installed' => ':module installed', + 'uninstalled' => ':module uninstalled', + //'updated' => ':module updated', + 'enabled' => ':module enabled', + 'disabled' => ':module disabled', + + 'tab' => [ + 'installation' => 'Installation', + 'faq' => 'FAQ', + 'changelog' => 'Changelog', + 'reviews' => 'Reviews', + ], + + 'installation' => [ + 'header' => 'App Installation', + 'download' => 'Downloading :module file.', + 'unzip' => 'Extracting :module files.', + 'install' => 'Installing :module files.', + ], + + 'badge' => [ + 'installed' => 'Installed', + ], + + 'button' => [ + 'uninstall' => 'Uninstall', + 'disable' => 'Disable', + 'enable' => 'Enable', + ], + + 'my' => [ + 'purchased' => 'Purchased', + 'installed' => 'Installed', + ], + + 'reviews' => [ + 'button' => [ + 'add' => 'Add a Review' + ], + 'na' => 'There are no reviews.' + ] +]; diff --git a/resources/lang/en-GB/notifications.php b/resources/lang/en-GB/notifications.php new file mode 100755 index 0000000..88c2f9d --- /dev/null +++ b/resources/lang/en-GB/notifications.php @@ -0,0 +1,10 @@ + 'Whoops!', + 'hello' => 'Hello!', + 'salutation' => 'Regards,
    :company_name', + 'subcopy' => 'If you’re having trouble clicking the ":text" button, copy and paste the URL below into your web browser: [:url](:url)', + +]; diff --git a/resources/lang/en-GB/pagination.php b/resources/lang/en-GB/pagination.php new file mode 100755 index 0000000..e5b501e --- /dev/null +++ b/resources/lang/en-GB/pagination.php @@ -0,0 +1,9 @@ + '« Previous', + 'next' => 'Next »', + 'showing' => 'Showing :first to :last of :total :type', + +]; diff --git a/resources/lang/en-GB/passwords.php b/resources/lang/en-GB/passwords.php new file mode 100755 index 0000000..e5544d2 --- /dev/null +++ b/resources/lang/en-GB/passwords.php @@ -0,0 +1,22 @@ + 'Passwords must be at least six characters and match the confirmation.', + 'reset' => 'Your password has been reset!', + 'sent' => 'We have e-mailed your password reset link!', + 'token' => 'This password reset token is invalid.', + 'user' => "We can't find a user with that e-mail address.", + +]; diff --git a/resources/lang/en-GB/recurring.php b/resources/lang/en-GB/recurring.php new file mode 100755 index 0000000..92099c7 --- /dev/null +++ b/resources/lang/en-GB/recurring.php @@ -0,0 +1,20 @@ + 'Recurring', + 'every' => 'Every', + 'period' => 'Period', + 'times' => 'Times', + 'daily' => 'Daily', + 'weekly' => 'Weekly', + 'monthly' => 'Monthly', + 'yearly' => 'Yearly', + 'custom' => 'Custom', + 'days' => 'Day(s)', + 'weeks' => 'Week(s)', + 'months' => 'Month(s)', + 'years' => 'Year(s)', + 'message' => 'This is a recurring :type and the next :type will be automatically generated at :date', + +]; diff --git a/resources/lang/en-GB/reports.php b/resources/lang/en-GB/reports.php new file mode 100755 index 0000000..a0e1f3a --- /dev/null +++ b/resources/lang/en-GB/reports.php @@ -0,0 +1,30 @@ + 'This Year', + 'previous_year' => 'Previous Year', + 'this_quarter' => 'This Quarter', + 'previous_quarter' => 'Previous Quarter', + 'last_12_months' => 'Last 12 Months', + 'profit_loss' => 'Profit & Loss', + 'gross_profit' => 'Gross Profit', + 'net_profit' => 'Net Profit', + 'total_expenses' => 'Total Expenses', + 'net' => 'NET', + + 'summary' => [ + 'income' => 'Income Summary', + 'expense' => 'Expense Summary', + 'income_expense' => 'Income vs Expense', + 'tax' => 'Tax Summary', + ], + + 'quarter' => [ + '1' => 'Jan-Mar', + '2' => 'Apr-Jun', + '3' => 'Jul-Sep', + '4' => 'Oct-Dec', + ], + +]; diff --git a/resources/lang/en-GB/settings.php b/resources/lang/en-GB/settings.php new file mode 100755 index 0000000..20e7cc2 --- /dev/null +++ b/resources/lang/en-GB/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Name', + 'email' => 'Email', + 'phone' => 'Phone', + 'address' => 'Address', + 'logo' => 'Logo', + ], + 'localisation' => [ + 'tab' => 'Localisation', + 'date' => [ + 'format' => 'Date Format', + 'separator' => 'Date Separator', + 'dash' => 'Dash (-)', + 'dot' => 'Dot (.)', + 'comma' => 'Comma (,)', + 'slash' => 'Slash (/)', + 'space' => 'Space ( )', + ], + 'timezone' => 'Time Zone', + 'percent' => [ + 'title' => 'Percent (%) Position', + 'before' => 'Before Number', + 'after' => 'After Number', + ], + ], + 'invoice' => [ + 'tab' => 'Invoice', + 'prefix' => 'Number Prefix', + 'digit' => 'Number Digit', + 'next' => 'Next Number', + 'logo' => 'Logo', + ], + 'default' => [ + 'tab' => 'Defaults', + 'account' => 'Default Account', + 'currency' => 'Default Currency', + 'tax' => 'Default Tax Rate', + 'payment' => 'Default Payment Method', + 'language' => 'Default Language', + ], + 'email' => [ + 'protocol' => 'Protocol', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP Host', + 'port' => 'SMTP Port', + 'username' => 'SMTP Username', + 'password' => 'SMTP Password', + 'encryption' => 'SMTP Security', + 'none' => 'None', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Sendmail Path', + 'log' => 'Log Emails', + ], + 'scheduling' => [ + 'tab' => 'Scheduling', + 'send_invoice' => 'Send Invoice Reminder', + 'invoice_days' => 'Send After Due Days', + 'send_bill' => 'Send Bill Reminder', + 'bill_days' => 'Send Before Due Days', + 'cron_command' => 'Cron Command', + 'schedule_time' => 'Hour To Run', + ], + 'appearance' => [ + 'tab' => 'Appearance', + 'theme' => 'Theme', + 'light' => 'Light', + 'dark' => 'Dark', + 'list_limit' => 'Records Per Page', + 'use_gravatar' => 'Use Gravatar', + ], + 'system' => [ + 'tab' => 'System', + 'session' => [ + 'lifetime' => 'Session Lifetime (Minutes)', + 'handler' => 'Session Handler', + 'file' => 'File', + 'database' => 'Database', + ], + 'file_size' => 'Max File Size (MB)', + 'file_types' => 'Allowed File Types', + ], + +]; diff --git a/resources/lang/en-GB/taxes.php b/resources/lang/en-GB/taxes.php new file mode 100755 index 0000000..cb774d1 --- /dev/null +++ b/resources/lang/en-GB/taxes.php @@ -0,0 +1,8 @@ + 'Rate', + 'rate_percent' => 'Rate (%)', + +]; diff --git a/resources/lang/en-GB/transfers.php b/resources/lang/en-GB/transfers.php new file mode 100755 index 0000000..f79af31 --- /dev/null +++ b/resources/lang/en-GB/transfers.php @@ -0,0 +1,12 @@ + 'From Account', + 'to_account' => 'To Account', + + 'messages' => [ + 'delete' => ':from to :to (:amount)', + ], + +]; diff --git a/resources/lang/en-GB/updates.php b/resources/lang/en-GB/updates.php new file mode 100755 index 0000000..e649eb6 --- /dev/null +++ b/resources/lang/en-GB/updates.php @@ -0,0 +1,15 @@ + 'Installed Version', + 'latest_version' => 'Latest Version', + 'update' => 'Update Akaunting to :version version', + 'changelog' => 'Changelog', + 'check' => 'Check', + 'new_core' => 'An updated version of Akaunting is available.', + 'latest_core' => 'Congratulations! You have the latest version of Akaunting. Future security updates will be applied automatically.', + 'success' => 'Update process has been completed successfully.', + 'error' => 'Update process has failed, please, try again.', + +]; diff --git a/resources/lang/en-GB/validation.php b/resources/lang/en-GB/validation.php new file mode 100755 index 0000000..40731ce --- /dev/null +++ b/resources/lang/en-GB/validation.php @@ -0,0 +1,121 @@ + 'The :attribute must be accepted.', + 'active_url' => 'The :attribute is not a valid URL.', + 'after' => 'The :attribute must be a date after :date.', + 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', + 'alpha' => 'The :attribute may only contain letters.', + 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', + 'alpha_num' => 'The :attribute may only contain letters and numbers.', + 'array' => 'The :attribute must be an array.', + 'before' => 'The :attribute must be a date before :date.', + 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'between' => [ + 'numeric' => 'The :attribute must be between :min and :max.', + 'file' => 'The :attribute must be between :min and :max kilobytes.', + 'string' => 'The :attribute must be between :min and :max characters.', + 'array' => 'The :attribute must have between :min and :max items.', + ], + 'boolean' => 'The :attribute field must be true or false.', + 'confirmed' => 'The :attribute confirmation does not match.', + 'date' => 'The :attribute is not a valid date.', + 'date_format' => 'The :attribute does not match the format :format.', + 'different' => 'The :attribute and :other must be different.', + 'digits' => 'The :attribute must be :digits digits.', + 'digits_between' => 'The :attribute must be between :min and :max digits.', + 'dimensions' => 'The :attribute has invalid image dimensions.', + 'distinct' => 'The :attribute field has a duplicate value.', + 'email' => 'The :attribute must be a valid email address.', + 'exists' => 'The selected :attribute is invalid.', + 'file' => 'The :attribute must be a file.', + 'filled' => 'The :attribute field must have a value.', + 'image' => 'The :attribute must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'in_array' => 'The :attribute field does not exist in :other.', + 'integer' => 'The :attribute must be an integer.', + 'ip' => 'The :attribute must be a valid IP address.', + 'json' => 'The :attribute must be a valid JSON string.', + 'max' => [ + 'numeric' => 'The :attribute may not be greater than :max.', + 'file' => 'The :attribute may not be greater than :max kilobytes.', + 'string' => 'The :attribute may not be greater than :max characters.', + 'array' => 'The :attribute may not have more than :max items.', + ], + 'mimes' => 'The :attribute must be a file of type: :values.', + 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'min' => [ + 'numeric' => 'The :attribute must be at least :min.', + 'file' => 'The :attribute must be at least :min kilobytes.', + 'string' => 'The :attribute must be at least :min characters.', + 'array' => 'The :attribute must have at least :min items.', + ], + 'not_in' => 'The selected :attribute is invalid.', + 'numeric' => 'The :attribute must be a number.', + 'present' => 'The :attribute field must be present.', + 'regex' => 'The :attribute format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_unless' => 'The :attribute field is required unless :other is in :values.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values is present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'same' => 'The :attribute and :other must match.', + 'size' => [ + 'numeric' => 'The :attribute must be :size.', + 'file' => 'The :attribute must be :size kilobytes.', + 'string' => 'The :attribute must be :size characters.', + 'array' => 'The :attribute must contain :size items.', + ], + 'string' => 'The :attribute must be a string.', + 'timezone' => 'The :attribute must be a valid zone.', + 'unique' => 'The :attribute has already been taken.', + 'uploaded' => 'The :attribute failed to upload.', + 'url' => 'The :attribute format is invalid.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + 'invalid_currency' => 'The :attribute code is invalid.', + 'invalid_amount' => 'The amount :attribute is invalid.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/es-ES/accounts.php b/resources/lang/es-ES/accounts.php new file mode 100755 index 0000000..4cd3eef --- /dev/null +++ b/resources/lang/es-ES/accounts.php @@ -0,0 +1,14 @@ + 'Nombre de Cuenta', + 'number' => 'Número', + 'opening_balance' => 'Saldo de apertura', + 'current_balance' => 'Saldo actual', + 'bank_name' => 'Nombre del Banco', + 'bank_phone' => 'Teléfono Banco', + 'bank_address' => 'Dirección del Banco', + 'default_account' => 'Cuenta Predeterminada', + +]; diff --git a/resources/lang/es-ES/auth.php b/resources/lang/es-ES/auth.php new file mode 100755 index 0000000..c106c78 --- /dev/null +++ b/resources/lang/es-ES/auth.php @@ -0,0 +1,39 @@ + 'Perfil', + 'logout' => 'Salir', + 'login' => 'Iniciar sesión', + 'login_to' => 'Inicia sesión para empezar', + 'remember_me' => 'Recordarme', + 'forgot_password' => 'Olvidé mi contraseña', + 'reset_password' => 'Restablecer Contraseña', + 'enter_email' => 'Introduce tu dirección de correo', + 'current_email' => 'Correo electrónico actual', + 'reset' => 'Resetear', + 'never' => 'nunca', + + 'password' => [ + 'current' => 'Actual', + 'current_confirm' => 'Confirmar contraseña', + 'new' => 'Nueva contraseña', + 'new_confirm' => 'Confirmar contraseña', + ], + + 'error' => [ + 'self_delete' => 'Error: No puede eliminarse usted mismo!', + 'no_company' => 'Error: No hay compañías asignadas a su cuenta. Por favor contacte al administrador del sistema.', + ], + + 'failed' => 'Estas credenciales no coinciden con nuestros registros.', + 'disabled' => 'Esta cuenta está inhabilitada. Por favor, póngase en contacto con el administrador del sistema.', + 'throttle' => 'Demasiados intentos fallidos de inicio de sesión. Por favor vuelva a intentarlo después de %s segundos.', + + 'notification' => [ + 'message_1' => 'Ha recibido este correo porque hemos recibido una solicitud de recuperación de contraseña para su cuenta.', + 'message_2' => 'Si no solicitó un restablecimiento de contraseña, no es necesaria ninguna acción de su parte.', + 'button' => 'Restablecer Contraseña', + ], + +]; diff --git a/resources/lang/es-ES/bills.php b/resources/lang/es-ES/bills.php new file mode 100755 index 0000000..986ed5b --- /dev/null +++ b/resources/lang/es-ES/bills.php @@ -0,0 +1,46 @@ + 'Nº de Recibo', + 'bill_date' => 'Fecha Recibo', + 'total_price' => 'Precio Total', + 'due_date' => 'Fecha de vencimiento', + 'order_number' => 'Número de pedido', + 'bill_from' => 'Recibo de', + + 'quantity' => 'Cantidad', + 'price' => 'Precio', + 'sub_total' => 'Subtotal', + 'discount' => 'Descuento', + 'tax_total' => 'Total Impuestos', + 'total' => 'Total ', + + 'item_name' => 'Nombre del artículo | Nombres de artículo', + + 'show_discount' => ':discount% Descuento', + 'add_discount' => 'Agregar Descuento', + 'discount_desc' => 'de subtotal', + + 'payment_due' => 'Vencimiento de pago', + 'amount_due' => 'Importe Vencido', + 'paid' => 'Pagado', + 'histories' => 'Historial', + 'payments' => 'Pagos', + 'add_payment' => 'Añadir pago', + 'mark_received' => 'Marcar como recibido', + 'download_pdf' => 'Descargar PDF', + 'send_mail' => 'Enviar Email', + + 'status' => [ + 'draft' => 'Borrador', + 'received' => 'Recibido', + 'partial' => 'Parcial', + 'paid' => 'Pagado', + ], + + 'messages' => [ + 'received' => 'Recibo marcado como recibido con éxito!', + ], + +]; diff --git a/resources/lang/es-ES/companies.php b/resources/lang/es-ES/companies.php new file mode 100755 index 0000000..509e045 --- /dev/null +++ b/resources/lang/es-ES/companies.php @@ -0,0 +1,13 @@ + 'Dominio', + 'logo' => 'Logo', + 'manage' => 'Gestionar empresas', + 'all' => 'Todas las empresas', + 'error' => [ + 'delete_active' => 'Error: No puede eliminar la empresa activa, por favor, cámbiela antes!', + ], + +]; diff --git a/resources/lang/es-ES/currencies.php b/resources/lang/es-ES/currencies.php new file mode 100755 index 0000000..fb3cab4 --- /dev/null +++ b/resources/lang/es-ES/currencies.php @@ -0,0 +1,18 @@ + 'Código', + 'rate' => 'Cotización', + 'default' => 'Moneda Predeterminada', + 'decimal_mark' => 'Punto decimal', + 'thousands_separator' => 'Separador de miles', + 'precision' => 'Precisión', + 'symbol' => [ + 'symbol' => 'Símbolo', + 'position' => 'Posición de Símbolo', + 'before' => 'Antes del importe', + 'after' => 'Despues del importe', + ] + +]; diff --git a/resources/lang/es-ES/customers.php b/resources/lang/es-ES/customers.php new file mode 100755 index 0000000..15cfa07 --- /dev/null +++ b/resources/lang/es-ES/customers.php @@ -0,0 +1,11 @@ + '¿Permitir inicio de sesión?', + 'user_created' => 'Usuario Creado', + + 'error' => [ + 'email' => 'Ese email ya está en uso.' + ] +]; diff --git a/resources/lang/es-ES/dashboard.php b/resources/lang/es-ES/dashboard.php new file mode 100755 index 0000000..66e1d65 --- /dev/null +++ b/resources/lang/es-ES/dashboard.php @@ -0,0 +1,24 @@ + 'Total ingresos', + 'receivables' => 'Cuentas por cobrar', + 'open_invoices' => 'Facturas pendientes', + 'overdue_invoices' => 'Facturas vencidas', + 'total_expenses' => 'Total de gastos', + 'payables' => 'Cuentas por pagar', + 'open_bills' => 'Facturas Pendientes', + 'overdue_bills' => 'Facturas Vencidas', + 'total_profit' => 'Ingresos Totales', + 'open_profit' => 'Ingresos Pendientes', + 'overdue_profit' => 'Ingresos Vencidos', + 'cash_flow' => 'Flujo de efectivo', + 'no_profit_loss' => 'No hay pérdidas', + 'incomes_by_category' => 'Ingresos por categoría', + 'expenses_by_category' => 'Gastos por categoría', + 'account_balance' => 'Saldo de la cuenta', + 'latest_incomes' => 'Últimos ingresos', + 'latest_expenses' => 'Últimos gastos', + +]; diff --git a/resources/lang/es-ES/demo.php b/resources/lang/es-ES/demo.php new file mode 100755 index 0000000..2ed427c --- /dev/null +++ b/resources/lang/es-ES/demo.php @@ -0,0 +1,16 @@ + 'Efectivo', + 'categories_deposit' => 'Depósito', + 'categories_sales' => 'Ventas', + 'currencies_usd' => 'Dólar EEUU', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Libra esterlina', + 'currencies_try' => 'Libra turca', + 'taxes_exempt' => 'Exentos de impuestos', + 'taxes_normal' => 'Impuesto Normal', + 'taxes_sales' => 'Impuesto sobre Ventas', + +]; diff --git a/resources/lang/es-ES/footer.php b/resources/lang/es-ES/footer.php new file mode 100755 index 0000000..1a535ed --- /dev/null +++ b/resources/lang/es-ES/footer.php @@ -0,0 +1,9 @@ + 'Versión', + 'powered' => 'Powered By Akaunting', + 'software' => 'Software de Contabilidad Libre', + +]; diff --git a/resources/lang/es-ES/general.php b/resources/lang/es-ES/general.php new file mode 100755 index 0000000..2b4ce62 --- /dev/null +++ b/resources/lang/es-ES/general.php @@ -0,0 +1,121 @@ + 'Artículo|Artículos', + 'incomes' => 'Ingresos|Ingresos', + 'invoices' => 'Factura|Facturas', + 'revenues' => 'Ingresos|Ingresos', + 'customers' => 'Cliente|Clientes', + 'expenses' => 'Gastos|Gastos', + 'bills' => 'Recibo|Recibos', + 'payments' => 'Pago|Pagos', + 'vendors' => 'Proveedor|Proveedores', + 'accounts' => 'Cuenta|Cuentas', + 'transfers' => 'Transferencia|Transferencias', + 'transactions' => 'Transacción|Transacciones', + 'reports' => 'Informe|Informes', + 'settings' => 'Ajuste|Ajustes', + 'categories' => 'Categoría|Categorías', + 'currencies' => 'Moneda|Monedas', + 'tax_rates' => 'Tasa de impuestos|Tasas de impuestos', + 'users' => 'Usuario|Usuarios', + 'roles' => 'Rol|Roles', + 'permissions' => 'Permiso|Permisos', + 'modules' => 'App|Apps', + 'companies' => 'Empresa|Empresas', + 'profits' => 'Beneficio|Beneficios', + 'taxes' => 'Impuestos|Impuestos', + 'logos' => 'Logo|Logos', + 'pictures' => 'Imagen|Imágenes', + 'types' => 'Tipo|Tipos', + 'payment_methods' => 'Forma de pago|Formas de pago', + 'compares' => 'Ingreso vs Gasto|Ingresos vs Gastos', + 'notes' => 'Nota|Notas', + 'totals' => 'Total|Totales', + 'languages' => 'Idioma|Idiomas', + 'updates' => 'Actualización|Actualizaciones', + 'numbers' => 'Número|Números', + 'statuses' => 'Estado|Estados', + 'others' => 'Otro|Otros', + + 'dashboard' => 'Panel de Control', + 'banking' => 'Banking', + 'general' => 'General', + 'no_records' => 'No hay registros.', + 'date' => 'Fecha', + 'amount' => 'Importe', + 'enabled' => 'Activo', + 'disabled' => 'Deshabilitado', + 'yes' => 'Sí', + 'no' => 'No', + 'na' => 'N/D', + 'daily' => 'Diario', + 'monthly' => 'Mensual', + 'quarterly' => 'Trimestral', + 'yearly' => 'Anual', + 'add' => 'Añadir', + 'add_new' => 'Agregar Nuevo', + 'show' => 'Mostrar', + 'edit' => 'Editar', + 'delete' => 'Borrar', + 'send' => 'Enviar', + 'download' => 'Descargar', + 'delete_confirm' => 'Confirma el borrado de :name :type?', + 'name' => 'Nombre', + 'email' => 'Correo electrónico', + 'tax_number' => 'CIF/NIF', + 'phone' => 'Teléfono', + 'address' => 'Dirección', + 'website' => 'Página web', + 'actions' => 'Acciones', + 'description' => 'Descripción', + 'manage' => 'Administrar', + 'code' => 'Código', + 'alias' => 'Alias', + 'balance' => 'Saldo', + 'reference' => 'Referencia', + 'attachment' => 'Adjunto', + 'change' => 'Cambiar', + 'switch' => 'Cambiar', + 'color' => 'Color', + 'save' => 'Guardar', + 'cancel' => 'Cancelar', + 'from' => 'De ', + 'to' => 'Para', + 'print' => 'Imprimir', + 'search' => 'Buscar', + 'search_placeholder' => 'Escriba para buscar..', + 'filter' => 'Filtro', + 'help' => 'Ayuda', + 'all' => 'Todos', + 'all_type' => 'Todos :type', + 'upcoming' => 'Próximos', + 'created' => 'Creado', + 'id' => 'ID', + 'more_actions' => 'Más acciones', + 'duplicate' => 'Duplicar', + 'unpaid' => 'No Pagado', + 'paid' => 'Pagado', + 'overdue' => 'Vencido', + 'partially' => 'Parcialmente', + 'partially_paid' => 'Parcialmente pagado', + 'export' => 'Exportar', + 'enable' => 'Habilitar', + 'disable' => 'Deshabilitar', + + 'title' => [ + 'new' => 'Nuevo :type', + 'edit' => 'Editar :type', + ], + + 'form' => [ + 'enter' => 'Ingrese :field', + 'select' => [ + 'field' => '- Seleccione :field -', + 'file' => 'Seleccionar archivo', + ], + 'no_file_selected' => 'Ningún archivo seleccionado...', + ], + +]; diff --git a/resources/lang/es-ES/header.php b/resources/lang/es-ES/header.php new file mode 100755 index 0000000..7077bdd --- /dev/null +++ b/resources/lang/es-ES/header.php @@ -0,0 +1,15 @@ + 'Cambiar idioma', + 'last_login' => 'Último ingreso :time', + 'notifications' => [ + 'counter' => '{0} No tiene notificaciones |{1} Tiene :count notificación | [2,*] Tiene :count notificaciones', + 'overdue_invoices' => '{1} :count factura vencida | [2,*] :count facturas vencidas', + 'upcoming_bills' => '{1} :count recibo por vencer|[2,*] :count recibos por vencer', + 'items_stock' => '{1} :count artículo sin stock|[2,*] :count artículos sin stock', + 'view_all' => 'Ver todas' + ], + +]; diff --git a/resources/lang/es-ES/import.php b/resources/lang/es-ES/import.php new file mode 100755 index 0000000..38e8db0 --- /dev/null +++ b/resources/lang/es-ES/import.php @@ -0,0 +1,9 @@ + 'Importar', + 'title' => 'Importar :type', + 'message' => 'Formatos permitidos: XLS, XLSX. Por favor, descargue el archivo de ejemplo.', + +]; diff --git a/resources/lang/es-ES/install.php b/resources/lang/es-ES/install.php new file mode 100755 index 0000000..6d0e7df --- /dev/null +++ b/resources/lang/es-ES/install.php @@ -0,0 +1,44 @@ + 'Siguiente', + 'refresh' => 'Actualizar', + + 'steps' => [ + 'requirements' => 'Por favor, cumpla los siguientes requisitos!', + 'language' => 'Paso 1/3: Selección de idioma', + 'database' => 'Paso 2/3: Configuración de la base de datos', + 'settings' => 'Paso 3/3: Detalles de la Empresa y el Administrador', + ], + + 'language' => [ + 'select' => 'Seleccione el idioma', + ], + + 'requirements' => [ + 'enabled' => ':feature debe estar habilitado!', + 'disabled' => ':feature debe estar deshabilitado!', + 'extension' => 'La extensión :extension debe estar cargada!', + 'directory' => 'El directorio :directorio necesita tener permiso de escritura!', + ], + + 'database' => [ + 'hostname' => 'Nombre del servidor', + 'username' => 'Nombre de usuario', + 'password' => 'Contraseña', + 'name' => 'Base de datos', + ], + + 'settings' => [ + 'company_name' => 'Nombre de la empresa', + 'company_email' => 'Correo electrónico de la Empresa', + 'admin_email' => 'Correo electrónico del Administrador', + 'admin_password' => 'Contraseña de Administrador', + ], + + 'error' => [ + 'connection' => 'Error: No se pudo conectar a la base de datos! Por favor, asegúrese de que los datos son correctos.', + ], + +]; diff --git a/resources/lang/es-ES/invoices.php b/resources/lang/es-ES/invoices.php new file mode 100755 index 0000000..854d9c5 --- /dev/null +++ b/resources/lang/es-ES/invoices.php @@ -0,0 +1,55 @@ + 'Número de Factura', + 'invoice_date' => 'Fecha de Factura', + 'total_price' => 'Precio Total', + 'due_date' => 'Fecha de vencimiento', + 'order_number' => 'Nº Pedido', + 'bill_to' => 'Facturar a', + + 'quantity' => 'Cantidad', + 'price' => 'Precio', + 'sub_total' => 'Subtotal', + 'discount' => 'Descuento', + 'tax_total' => 'Total Impuestos', + 'total' => 'Total ', + + 'item_name' => 'Nombre del artículo | Nombres de artículo', + + 'show_discount' => ':discount% Descuento', + 'add_discount' => 'Agregar Descuento', + 'discount_desc' => 'de subtotal', + + 'payment_due' => 'Vencimiento de pago', + 'paid' => 'Pagado', + 'histories' => 'Historias', + 'payments' => 'Pagos', + 'add_payment' => 'Añadir pago', + 'mark_paid' => 'Marcar Como Pagada', + 'mark_sent' => 'Marcar Como Enviada', + 'download_pdf' => 'Descargar PDF', + 'send_mail' => 'Enviar Email', + + 'status' => [ + 'draft' => 'Borrador', + 'sent' => 'Enviado', + 'viewed' => 'Visto', + 'approved' => 'Aprobado', + 'partial' => 'Parcial', + 'paid' => 'Pagado', + ], + + 'messages' => [ + 'email_sent' => 'El email de la factura se ha enviado correctamente!', + 'marked_sent' => 'Factura marcada como enviada con éxito!', + 'email_required' => 'Ninguna dirección de correo electrónico para este cliente!', + ], + + 'notification' => [ + 'message' => 'Usted está recibiendo este correo electrónico porque usted tiene una factura de :amount para el cliente :cliente .', + 'button' => 'Pagar Ahora', + ], + +]; diff --git a/resources/lang/es-ES/items.php b/resources/lang/es-ES/items.php new file mode 100755 index 0000000..242ff5e --- /dev/null +++ b/resources/lang/es-ES/items.php @@ -0,0 +1,15 @@ + 'Cantidad | Cantidades', + 'sales_price' => 'Precio de Venta', + 'purchase_price' => 'Precio de Compra', + 'sku' => 'SKU', + + 'notification' => [ + 'message' => 'Usted está recibiendo este correo electrónico porque el producto :name se está quedando sin stock.', + 'button' => 'Ver ahora', + ], + +]; diff --git a/resources/lang/es-ES/messages.php b/resources/lang/es-ES/messages.php new file mode 100755 index 0000000..005913f --- /dev/null +++ b/resources/lang/es-ES/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => ':type creado!', + 'updated' => ':type actualizado!', + 'deleted' => ':type borrado!', + 'duplicated' => ': type duplicado!', + 'imported' => ':type importado!', + 'enabled' => ':type habilitado!', + 'disabled' => ':type deshabilitado!', + ], + 'error' => [ + 'over_payment' => 'Error: Pago no añadido! Importe mayor que el total.', + 'not_user_company' => 'Error: No tiene permisos para administrar esta empresa!', + 'customer' => 'Error: Usuario no creado! :name ya utiliza esta dirección de correo electrónico.', + 'no_file' => 'Error: Ningún archivo seleccionado!', + 'last_category' => 'Error: No puede eliminar la última :type categoría!', + 'invalid_token' => 'Error: El token introducido es inválido!', + 'import_column' => 'Error: :message nombre de la hoja :sheet. Número de línea: :line.', + 'import_sheet' => 'Error: Nombre de la hoja no es válido. Por favor, verifique el archivo de ejemplo.', + ], + 'warning' => [ + 'deleted' => 'Advertencia: No puede borrar :name porque tiene :text relacionado.', + 'disabled' => 'Advertencia: No se permite desactivar :name porque tiene :text relacionado.', + ], + +]; diff --git a/resources/lang/es-ES/modules.php b/resources/lang/es-ES/modules.php new file mode 100755 index 0000000..5091834 --- /dev/null +++ b/resources/lang/es-ES/modules.php @@ -0,0 +1,58 @@ + 'API Token', + 'api_token' => 'Token', + 'my_apps' => 'Mis aplicaciones', + 'top_paid' => 'Top de pago', + 'new' => 'Nuevo', + 'top_free' => 'Top gratis', + 'free' => 'GRATIS', + 'search' => 'Buscar', + 'install' => 'Instalar', + 'buy_now' => 'Comprar ahora', + 'token_link' => 'Haga Click aquí para obtener su API token.', + 'no_apps' => 'No hay aplicaciones en esta categoría, aún.', + 'developer' => '¿Eres un desarrollador? Aquí puedes aprender cómo crear una aplicación y comenzar a venderla hoy!', + + 'about' => 'Acerca de', + + 'added' => 'Agregado', + 'updated' => 'Actualizado', + 'compatibility' => 'Compatibilidad', + + 'installed' => ':module instalado', + 'uninstalled' => ':module desinstalado', + //'updated' => ':module updated', + 'enabled' => ':module habilitado', + 'disabled' => ':module deshabilitado', + + 'tab' => [ + 'installation' => 'Instalación', + 'faq' => 'P+F', + 'changelog' => 'Historial de cambios', + ], + + 'installation' => [ + 'header' => 'Instalación de Aplicación', + 'download' => 'Descargando archivo :module .', + 'unzip' => 'Extrayendo archivo :module .', + 'install' => 'Instalando archivos de :module .', + ], + + 'badge' => [ + 'installed' => 'Instalado', + ], + + 'button' => [ + 'uninstall' => 'Desinstalar', + 'disable' => 'Deshabilitar', + 'enable' => 'Habilitar', + ], + + 'my' => [ + 'purchased' => 'Comprado', + 'installed' => 'Instalado', + ], +]; diff --git a/resources/lang/es-ES/pagination.php b/resources/lang/es-ES/pagination.php new file mode 100755 index 0000000..e1dbac6 --- /dev/null +++ b/resources/lang/es-ES/pagination.php @@ -0,0 +1,9 @@ + '« Anterior', + 'next' => 'Siguiente »', + 'showing' => 'Mostrando :first a :last de :total :type', + +]; diff --git a/resources/lang/es-ES/passwords.php b/resources/lang/es-ES/passwords.php new file mode 100755 index 0000000..40b3708 --- /dev/null +++ b/resources/lang/es-ES/passwords.php @@ -0,0 +1,22 @@ + 'Las contraseñas deben tener mínimo 6 caracteres y coincidir con la confirmación.', + 'reset' => 'Su contraseña ha sido reestablecida!', + 'sent' => 'Hemos enviado un enlace para resetear su contraseña!', + 'token' => 'Ese token de contraseña ya no es válido.', + 'user' => "No podemos encontrar un usuario con esa dirección de correo electrónico.", + +]; diff --git a/resources/lang/es-ES/recurring.php b/resources/lang/es-ES/recurring.php new file mode 100755 index 0000000..c566fb3 --- /dev/null +++ b/resources/lang/es-ES/recurring.php @@ -0,0 +1,20 @@ + 'Repetitivo', + 'every' => 'Cada', + 'period' => 'Período', + 'times' => 'Veces', + 'daily' => 'Diariamente', + 'weekly' => 'Semanalmente', + 'monthly' => 'Mensualmente', + 'yearly' => 'Anualmente', + 'custom' => 'Personalizado', + 'days' => 'Día(s)', + 'weeks' => 'Semana(s)', + 'months' => 'Mes(es)', + 'years' => 'Año(s)', + 'message' => 'Éste es un :type periódico y el siguiente :type se generará automáticamente el día :date', + +]; diff --git a/resources/lang/es-ES/reports.php b/resources/lang/es-ES/reports.php new file mode 100755 index 0000000..791af14 --- /dev/null +++ b/resources/lang/es-ES/reports.php @@ -0,0 +1,30 @@ + 'Este año', + 'previous_year' => 'Año Anterior', + 'this_quarter' => 'Este Trimestre', + 'previous_quarter' => 'Trimestre Anterior', + 'last_12_months' => 'Últimos 12 meses', + 'profit_loss' => 'Ganancias y Pérdidas', + 'gross_profit' => 'Ganancia Bruta', + 'net_profit' => 'Ganancia Neta', + 'total_expenses' => 'Total de gastos', + 'net' => 'Neto', + + 'summary' => [ + 'income' => 'Resumen de Ingresos', + 'expense' => 'Resumen de Gastos', + 'income_expense' => 'Ingresos vs Gastos', + 'tax' => 'Resumen de impuestos', + ], + + 'quarter' => [ + '1' => 'Ene-Mar', + '2' => 'Abr-Jun', + '3' => 'Jul-Sep', + '4' => 'Oct-Dic', + ], + +]; diff --git a/resources/lang/es-ES/settings.php b/resources/lang/es-ES/settings.php new file mode 100755 index 0000000..edfdd67 --- /dev/null +++ b/resources/lang/es-ES/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Nombre', + 'email' => 'Correo electrónico', + 'phone' => 'Teléfono', + 'address' => 'Dirección', + 'logo' => 'Logo', + ], + 'localisation' => [ + 'tab' => 'Localización', + 'date' => [ + 'format' => 'Formato de Fecha', + 'separator' => 'Separador de fecha', + 'dash' => 'Guión (-)', + 'dot' => 'Punto (.)', + 'comma' => 'Coma (,)', + 'slash' => 'Barra (/)', + 'space' => 'Espacio ( )', + ], + 'timezone' => 'Zona horaria', + 'percent' => [ + 'title' => 'Posición Porcentaje (%)', + 'before' => 'Antes del Número', + 'after' => 'Después del número', + ], + ], + 'invoice' => [ + 'tab' => 'Factura', + 'prefix' => 'Prefijo de número', + 'digit' => 'Número de dígitos', + 'next' => 'Siguiente número', + 'logo' => 'Logo', + ], + 'default' => [ + 'tab' => 'Por defecto', + 'account' => 'Cuenta Predeterminada', + 'currency' => 'Moneda Predeterminada', + 'tax' => 'Impuesto Predeterminado', + 'payment' => 'Método de pago Predeterminado', + 'language' => 'Idioma Predeterminado', + ], + 'email' => [ + 'protocol' => 'Protocolo', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP Host', + 'port' => 'Puerto SMTP', + 'username' => 'Nombre de usuario SMTP', + 'password' => 'Contraseña SMTP', + 'encryption' => 'Seguridad SMTP', + 'none' => 'Ninguna', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Ruta de acceso de sendmail', + 'log' => 'Registrar Correos', + ], + 'scheduling' => [ + 'tab' => 'Programación', + 'send_invoice' => 'Enviar Recordatorio de Factura', + 'invoice_days' => 'Enviar después del vencimiento', + 'send_bill' => 'Enviar Recordatorio de Recibo', + 'bill_days' => 'Enviar Antes del Vencimiento', + 'cron_command' => 'Comando Cron', + 'schedule_time' => 'Hora de ejecución', + ], + 'appearance' => [ + 'tab' => 'Apariencia', + 'theme' => 'Tema', + 'light' => 'Claro', + 'dark' => 'Oscuro', + 'list_limit' => 'Registros por página', + 'use_gravatar' => 'Usar Gravatar', + ], + 'system' => [ + 'tab' => 'Sistema', + 'session' => [ + 'lifetime' => 'Duración de la sesión (minutos)', + 'handler' => 'Gestor de sesiones', + 'file' => 'Archivo', + 'database' => 'Base de datos', + ], + 'file_size' => 'Tamaño Máximo (MB)', + 'file_types' => 'Tipos de Archivo Permitidos', + ], + +]; diff --git a/resources/lang/es-ES/taxes.php b/resources/lang/es-ES/taxes.php new file mode 100755 index 0000000..7365b2e --- /dev/null +++ b/resources/lang/es-ES/taxes.php @@ -0,0 +1,8 @@ + 'Tasa', + 'rate_percent' => 'Tasa (%)', + +]; diff --git a/resources/lang/es-ES/transfers.php b/resources/lang/es-ES/transfers.php new file mode 100755 index 0000000..912bee1 --- /dev/null +++ b/resources/lang/es-ES/transfers.php @@ -0,0 +1,12 @@ + 'De Cuenta', + 'to_account' => 'A Cuenta', + + 'messages' => [ + 'delete' => ':from a :to (:amount)', + ], + +]; diff --git a/resources/lang/es-ES/updates.php b/resources/lang/es-ES/updates.php new file mode 100755 index 0000000..1ded34b --- /dev/null +++ b/resources/lang/es-ES/updates.php @@ -0,0 +1,15 @@ + 'Versión instalada', + 'latest_version' => 'Última versión', + 'update' => 'Actualizar Akaunting a versión :version', + 'changelog' => 'Historial de cambios', + 'check' => 'Comprobar', + 'new_core' => 'Una versión actualizada de Akaunting está disponible.', + 'latest_core' => '¡Felicidades! Tienes la última versión de Akaunting. Las actualizaciones de seguridad futuras se aplicarán automáticamente.', + 'success' => 'El proceso de actualización se ha completado con éxito.', + 'error' => 'El proceso de actualización ha fallado, por favor inténtelo de nuevo.', + +]; diff --git a/resources/lang/es-ES/validation.php b/resources/lang/es-ES/validation.php new file mode 100755 index 0000000..02af2f2 --- /dev/null +++ b/resources/lang/es-ES/validation.php @@ -0,0 +1,120 @@ + ':attribute debe ser aceptado.', + 'active_url' => ':attribute no es una URL correcta.', + 'after' => ':attribute debe ser posterior a :date.', + 'after_or_equal' => ':attribute debe ser una fecha posterior o igual a :date.', + 'alpha' => ':attribute solo acepta letras.', + 'alpha_dash' => ':attribute solo acepta letras, números y guiones.', + 'alpha_num' => ':attribute solo acepta letras y números.', + 'array' => ':attribute debe ser un array.', + 'before' => ':attribute debe ser anterior a :date.', + 'before_or_equal' => ':attribute debe ser anterior o igual a :date.', + 'between' => [ + 'numeric' => ':attribute debe estar entre :min y :max.', + 'file' => ':attribute debe estar entre :min - :max kilobytes.', + 'string' => ':attribute debe estar entre :min - :max caracteres.', + 'array' => ':attribute debe tener entre :min y :max items.', + ], + 'boolean' => ':attribute debe ser verdadero o falso.', + 'confirmed' => ':attribute la confirmación no coincide.', + 'date' => ':attribute no es una fecha válida.', + 'date_format' => ':attribute no cumple el formato :format.', + 'different' => ':attribute y :other deben ser diferentes.', + 'digits' => ':attribute debe tener :digits dígitos.', + 'digits_between' => ':attribute debe tener entre :min y :max dígitos.', + 'dimensions' => ':attribute tiene dimensiones de imagen no válido.', + 'distinct' => ':attribute tiene un valor duplicado.', + 'email' => ':attribute debe ser una dirección de email válida.', + 'exists' => 'El :attribute seleccionado no es correcto.', + 'file' => ':attribute debe ser un archivo.', + 'filled' => ':attribute debe tener un valor.', + 'image' => ':attribute debe ser una imagen.', + 'in' => 'El :attribute seleccionado es inválido.', + 'in_array' => ':attribute no existe en :other.', + 'integer' => ':attribute debe ser un número entero.', + 'ip' => ':attribute debe ser una dirección IP válida.', + 'json' => ':attribute debe ser una cadena JSON válida.', + 'max' => [ + 'numeric' => ':attribute no debe ser mayor que :max.', + 'file' => ':attribute no debe ser mayor que :max kilobytes.', + 'string' => ':attribute no debe tener como máximo :max caracteres.', + 'array' => ':attribute no debe tener más de :max items.', + ], + 'mimes' => ':attribute debe ser un archivo del tipo: :values.', + 'mimetypes' => ':attribute debe ser un archivo del tipo: :values.', + 'min' => [ + 'numeric' => ':attribute debe ser como mínimo :min.', + 'file' => ':attribute debe ser como mínimo de :min kilobytes.', + 'string' => ':attribute debe contener como mínimo :min caracteres.', + 'array' => ':attribute debe contener como mínimo :min items.', + ], + 'not_in' => 'El :attribute seleccionado es inválido.', + 'numeric' => ':attribute debe ser un número.', + 'present' => ':attribute debe tener un valor.', + 'regex' => ':attribute tiene un formato incorrecto.', + 'required' => ':attribute es obligatorio.', + 'required_if' => ':attribute es obligatorio cuando :other es :value.', + 'required_unless' => ':attribute es obligatorio a menos que :other esté en :values.', + 'required_with' => ':attribute es obligatorio cuando :values está presente.', + 'required_with_all' => ':attribute es obligatorio cuando :values está presente.', + 'required_without' => ':attribute es obligatorio cuando :values no está presente.', + 'required_without_all' => ':attribute es obligatorio cuando ningún :values está presente.', + 'same' => ':attribute y :other deben coincidir.', + 'size' => [ + 'numeric' => ':attribute debe ser :size.', + 'file' => ':attribute debe tener :size kilobytes.', + 'string' => ':attribute debe tener :size caracteres.', + 'array' => ':attribute debe tener al menos :size items.', + ], + 'string' => ':attribute debe ser una cadena de caracteres.', + 'timezone' => ':attribute debe ser una zona válida.', + 'unique' => ':attribute ya ha sido introducido.', + 'uploaded' => ':attribute no se pudo cargar.', + 'url' => ':attribute tiene un formato incorrecto.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'mensaje personalizado', + ], + 'invalid_currency' => 'El código de :attribute es incorrecto.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/es-MX/accounts.php b/resources/lang/es-MX/accounts.php new file mode 100755 index 0000000..855e537 --- /dev/null +++ b/resources/lang/es-MX/accounts.php @@ -0,0 +1,14 @@ + 'Nombre de la Cuenta', + 'number' => 'Número', + 'opening_balance' => 'Saldo de Apertura', + 'current_balance' => 'Saldo Actual', + 'bank_name' => 'Nombre del Banco', + 'bank_phone' => 'Teléfono del Banco', + 'bank_address' => 'Dirección del Banco', + 'default_account' => 'Cuenta Predeterminada', + +]; diff --git a/resources/lang/es-MX/auth.php b/resources/lang/es-MX/auth.php new file mode 100755 index 0000000..345d79d --- /dev/null +++ b/resources/lang/es-MX/auth.php @@ -0,0 +1,39 @@ + 'Perfil', + 'logout' => 'Salir', + 'login' => 'Entrar', + 'login_to' => 'Inicia sesión para comenzar', + 'remember_me' => 'Recordarme', + 'forgot_password' => 'Olvidé mi contraseña', + 'reset_password' => 'Restablecer Contraseña', + 'enter_email' => 'Introduce tu Dirección de Correo Electrónico', + 'current_email' => 'Dirección de Correo electrónico Actual', + 'reset' => 'Restablecer', + 'never' => 'nunca', + + 'password' => [ + 'current' => 'Contraseña', + 'current_confirm' => 'Confirmar Contraseña', + 'new' => 'Nueva Contraseña', + 'new_confirm' => 'Confirmar Nueva Contraseña', + ], + + 'error' => [ + 'self_delete' => 'Error: ¡No puede eliminarse usted mismo!', + 'no_company' => 'Error: No se asigno una compañía para tu cuenta. Por favor, contacte al administrador del sistema.', + ], + + 'failed' => 'Estas credenciales no coinciden con nuestros registros.', + 'disabled' => 'Esta cuenta está deshabilitada. Por favor, póngase en contacto con el administrador del sistema.', + 'throttle' => 'Demasiados intentos fallidos de inicio de sesión. Por favor, vuelva a intentarlo después de :seconds segundos.', + + 'notification' => [ + 'message_1' => 'Has recibido este correo electrónico porque se solicito un restablecimiento de contraseña para tu cuenta.', + 'message_2' => 'Si no solicitaste que se restablezca tu contraseña, no es necesario realizar ninguna acción', + 'button' => 'Restablecer Contraseña', + ], + +]; diff --git a/resources/lang/es-MX/bills.php b/resources/lang/es-MX/bills.php new file mode 100755 index 0000000..e99b52d --- /dev/null +++ b/resources/lang/es-MX/bills.php @@ -0,0 +1,46 @@ + 'Número de Recibo', + 'bill_date' => 'Fecha del Recibo', + 'total_price' => 'Precio Total', + 'due_date' => 'Fecha de Vencimiento', + 'order_number' => 'Número de Orden', + 'bill_from' => 'Recibo De', + + 'quantity' => 'Cantidad', + 'price' => 'Precio', + 'sub_total' => 'Subtotal', + 'discount' => 'Descuento', + 'tax_total' => 'Total de Impuestos', + 'total' => 'Total ', + + 'item_name' => 'Nombre del producto/servicio | Nombres de los productos/servicos', + + 'show_discount' => ':discount% Descuento', + 'add_discount' => 'Agregar Descuento', + 'discount_desc' => 'de subtotal', + + 'payment_due' => 'Vencimiento del Pago', + 'amount_due' => 'Importe Vencido', + 'paid' => 'Pagado', + 'histories' => 'Historial', + 'payments' => 'Pagos', + 'add_payment' => 'Añadir pago', + 'mark_received' => 'Marcar como Recibido', + 'download_pdf' => 'Descargar archivo PDF', + 'send_mail' => 'Enviar Correo Electrónico', + + 'status' => [ + 'draft' => 'Borrador', + 'received' => 'Recibido', + 'partial' => 'Parcial', + 'paid' => 'Pagado', + ], + + 'messages' => [ + 'received' => '¡Recibo marcado como recibido con exitosamente!', + ], + +]; diff --git a/resources/lang/es-MX/companies.php b/resources/lang/es-MX/companies.php new file mode 100755 index 0000000..dee3ed9 --- /dev/null +++ b/resources/lang/es-MX/companies.php @@ -0,0 +1,13 @@ + 'Sitio Web', + 'logo' => 'Logotipo', + 'manage' => 'Gestionar Empresas', + 'all' => 'Todas las Empresas', + 'error' => [ + 'delete_active' => 'Error: ¡No puede eliminar la empresa activa. Por favor, cámbiela antes!', + ], + +]; diff --git a/resources/lang/es-MX/currencies.php b/resources/lang/es-MX/currencies.php new file mode 100755 index 0000000..a357a66 --- /dev/null +++ b/resources/lang/es-MX/currencies.php @@ -0,0 +1,18 @@ + 'Código', + 'rate' => 'Tasa', + 'default' => 'Moneda Predeterminada', + 'decimal_mark' => 'Punto Decimal', + 'thousands_separator' => 'Separador de Miles', + 'precision' => 'Precisión', + 'symbol' => [ + 'symbol' => 'Símbolo', + 'position' => 'Posición del Símbolo', + 'before' => 'Antes del Monto', + 'after' => 'Después del Monto', + ] + +]; diff --git a/resources/lang/es-MX/customers.php b/resources/lang/es-MX/customers.php new file mode 100755 index 0000000..2ed8399 --- /dev/null +++ b/resources/lang/es-MX/customers.php @@ -0,0 +1,11 @@ + '¿Permitir Inicio de Sesión?', + 'user_created' => 'Usuario Creado', + + 'error' => [ + 'email' => 'La dirección de correo electrónico ya está en uso.' + ] +]; diff --git a/resources/lang/es-MX/dashboard.php b/resources/lang/es-MX/dashboard.php new file mode 100755 index 0000000..2d11115 --- /dev/null +++ b/resources/lang/es-MX/dashboard.php @@ -0,0 +1,24 @@ + 'Total de Ingresos', + 'receivables' => 'Cuentas por Cobrar', + 'open_invoices' => 'Facturas Abiertas', + 'overdue_invoices' => 'Facturas Vencidas', + 'total_expenses' => 'Total de Gastos', + 'payables' => 'Cuentas por Pagar', + 'open_bills' => 'Recibos Abiertos', + 'overdue_bills' => 'Recibos Vencidos', + 'total_profit' => 'Ganancias Totales', + 'open_profit' => 'Ganancias Pendientes', + 'overdue_profit' => 'Ganancias Vencidas', + 'cash_flow' => 'Flujo de Efectivo', + 'no_profit_loss' => 'No hay Perdida de Ganancias', + 'incomes_by_category' => 'Ingresos por Categoría', + 'expenses_by_category' => 'Gastos por Categoría', + 'account_balance' => 'Saldo de la Cuenta', + 'latest_incomes' => 'Últimos Ingresos', + 'latest_expenses' => 'Últimos Gastos', + +]; diff --git a/resources/lang/es-MX/demo.php b/resources/lang/es-MX/demo.php new file mode 100755 index 0000000..f69d5b9 --- /dev/null +++ b/resources/lang/es-MX/demo.php @@ -0,0 +1,16 @@ + 'Efectivo', + 'categories_deposit' => 'Depósito', + 'categories_sales' => 'Ventas', + 'currencies_usd' => 'Dólar EEUU', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Libra Esterlina', + 'currencies_try' => 'Libra Turca', + 'taxes_exempt' => 'Exentos de Impuestos', + 'taxes_normal' => 'Impuesto Normal', + 'taxes_sales' => 'Impuesto sobre Ventas', + +]; diff --git a/resources/lang/es-MX/footer.php b/resources/lang/es-MX/footer.php new file mode 100755 index 0000000..1a535ed --- /dev/null +++ b/resources/lang/es-MX/footer.php @@ -0,0 +1,9 @@ + 'Versión', + 'powered' => 'Powered By Akaunting', + 'software' => 'Software de Contabilidad Libre', + +]; diff --git a/resources/lang/es-MX/general.php b/resources/lang/es-MX/general.php new file mode 100755 index 0000000..9f88bd3 --- /dev/null +++ b/resources/lang/es-MX/general.php @@ -0,0 +1,121 @@ + 'Producto/Servicio | Productos/Servicios', + 'incomes' => 'Ingreso | Ingresos', + 'invoices' => 'Factura | Facturas', + 'revenues' => 'Ingreso | Ingresos', + 'customers' => 'Cliente | Clientes', + 'expenses' => 'Gasto | Gastos', + 'bills' => 'Recibo | Recibos', + 'payments' => 'Pago | Pagos', + 'vendors' => 'Proveedor | Proveedores', + 'accounts' => 'Cuenta | Cuentas', + 'transfers' => 'Transferencia | Transferencias', + 'transactions' => 'Transacción | Transacciones', + 'reports' => 'Informe | Informes', + 'settings' => 'Ajuste | Ajustes', + 'categories' => 'Categoría | Categorías', + 'currencies' => 'Moneda | Monedas', + 'tax_rates' => 'Tasa de Impuestos | Tasas de Impuestos', + 'users' => 'Usuario | Usuarios', + 'roles' => 'Rol|Roles', + 'permissions' => 'Permiso | Permisos', + 'modules' => 'App|Apps', + 'companies' => 'Empresa | Empresas', + 'profits' => 'Ganancia | Ganancias', + 'taxes' => 'Impuesto | Impuestos', + 'logos' => 'Logo|Logos', + 'pictures' => 'Imagen | Imágenes', + 'types' => 'Tipo | Tipos', + 'payment_methods' => 'Método de Pago | Métodos de Pago', + 'compares' => 'Ingreso vs Gasto | Ingresos vs Gastos', + 'notes' => 'Nota | Notas', + 'totals' => 'Total | Totales', + 'languages' => 'Idioma | Idiomas', + 'updates' => 'Actualización | Actualizaciones', + 'numbers' => 'Número | Números', + 'statuses' => 'Estado|Estados', + 'others' => 'Otro|Otros', + + 'dashboard' => 'Panel de Control', + 'banking' => 'Bancos', + 'general' => 'General', + 'no_records' => 'No hay registros.', + 'date' => 'Fecha', + 'amount' => 'Importe', + 'enabled' => 'Activado', + 'disabled' => 'Desactivado', + 'yes' => 'Sí', + 'no' => 'No', + 'na' => 'N/A', + 'daily' => 'Diario', + 'monthly' => 'Mensual', + 'quarterly' => 'Trimestral', + 'yearly' => 'Anual', + 'add' => 'Añadir', + 'add_new' => 'Agregar Nuevo', + 'show' => 'Mostrar', + 'edit' => 'Editar', + 'delete' => 'Borrar', + 'send' => 'Envíar', + 'download' => 'Descargar', + 'delete_confirm' => 'Confirma el borrado de :name :type?', + 'name' => 'Nombre', + 'email' => 'Correo Electrónico', + 'tax_number' => 'RFC/CIF/NIF', + 'phone' => 'Teléfono', + 'address' => 'Dirección', + 'website' => 'Sitio Web', + 'actions' => 'Acciones', + 'description' => 'Descripción', + 'manage' => 'Administrar', + 'code' => 'Código', + 'alias' => 'Alias', + 'balance' => 'Saldo', + 'reference' => 'Referencia', + 'attachment' => 'Adjunto', + 'change' => 'Cambiar', + 'switch' => 'Cambiar', + 'color' => 'Color', + 'save' => 'Guardar', + 'cancel' => 'Cancelar', + 'from' => 'De ', + 'to' => 'Para', + 'print' => 'Imprimir', + 'search' => 'Buscar', + 'search_placeholder' => 'Escriba para buscar..', + 'filter' => 'Filtrar', + 'help' => 'Ayuda', + 'all' => 'Todos', + 'all_type' => 'Todos :type', + 'upcoming' => 'Próximos', + 'created' => 'Creado', + 'id' => 'ID', + 'more_actions' => 'Más Acciones', + 'duplicate' => 'Duplicar', + 'unpaid' => 'No Pagada', + 'paid' => 'Pagada', + 'overdue' => 'Vencida', + 'partially' => 'Parcial', + 'partially_paid' => 'Pagada Parcialmente', + 'export' => 'Exportar', + 'enable' => 'Activar', + 'disable' => 'Desactivar', + + 'title' => [ + 'new' => 'Nuevo :type', + 'edit' => 'Editar :type', + ], + + 'form' => [ + 'enter' => 'Ingrese :field', + 'select' => [ + 'field' => '- Seleccione :field -', + 'file' => 'Seleccionar Archivo', + ], + 'no_file_selected' => 'Ningún archivo seleccionado...', + ], + +]; diff --git a/resources/lang/es-MX/header.php b/resources/lang/es-MX/header.php new file mode 100755 index 0000000..3524464 --- /dev/null +++ b/resources/lang/es-MX/header.php @@ -0,0 +1,15 @@ + 'Cambiar Idioma', + 'last_login' => 'Último inicio de sesión :time', + 'notifications' => [ + 'counter' => '{0} No tiene notificaciones | {1} Tiene :count notificación | [2,*] Tiene :count notificaciones', + 'overdue_invoices' => '{1} :count factura vencida | [2,*] :count facturas vencidas', + 'upcoming_bills' => '{1} :count recibo por vencer | [2,*] :count recibos por vencer', + 'items_stock' => '{1} :count producto/servicio sin stock | [2,*] :count productos/servicios sin stock', + 'view_all' => 'Ver Todo' + ], + +]; diff --git a/resources/lang/es-MX/import.php b/resources/lang/es-MX/import.php new file mode 100755 index 0000000..63a4d80 --- /dev/null +++ b/resources/lang/es-MX/import.php @@ -0,0 +1,9 @@ + 'Importar', + 'title' => 'Importar :type', + 'message' => 'Tipos de archivos permitidos: XLS, XLSX. Por favor, descarga el archivo de ejemplo.', + +]; diff --git a/resources/lang/es-MX/install.php b/resources/lang/es-MX/install.php new file mode 100755 index 0000000..8ff0603 --- /dev/null +++ b/resources/lang/es-MX/install.php @@ -0,0 +1,44 @@ + 'Siguiente', + 'refresh' => 'Actualizar', + + 'steps' => [ + 'requirements' => 'Por favor, ¡cumpla los siguientes requisitos!', + 'language' => 'Paso 1/3: Selección del Idioma', + 'database' => 'Paso 2/3: Configuración de la Base de Datos', + 'settings' => 'Paso 3/3: Detalles de la Empresa y el Administrador', + ], + + 'language' => [ + 'select' => 'Seleccionar el Idioma', + ], + + 'requirements' => [ + 'enabled' => '¡:feature nencesita estar habilitado!', + 'disabled' => '¡:feature debe estar deshabilitado!', + 'extension' => '¡La extensión :extension debe estar cargada!', + 'directory' => '¡El directorio :directorio necesita tener permiso de escritura!', + ], + + 'database' => [ + 'hostname' => 'Nombre del Host', + 'username' => 'Nombre de Usuario', + 'password' => 'Contraseña', + 'name' => 'Base de Datos', + ], + + 'settings' => [ + 'company_name' => 'Nombre de la Empresa', + 'company_email' => 'Dirección de Correo Electrónico de la Empresa', + 'admin_email' => 'Dirección de Correo Electrónico del Administrador', + 'admin_password' => 'Contraseña del Administrador', + ], + + 'error' => [ + 'connection' => 'Error: ¡No se pudo conectar a la base de datos! Por favor, asegúrese de que los datos son correctos.', + ], + +]; diff --git a/resources/lang/es-MX/invoices.php b/resources/lang/es-MX/invoices.php new file mode 100755 index 0000000..d4d1bac --- /dev/null +++ b/resources/lang/es-MX/invoices.php @@ -0,0 +1,55 @@ + 'Número de Factura', + 'invoice_date' => 'Fecha de la Factura', + 'total_price' => 'Precio Total', + 'due_date' => 'Fecha de Vencimiento', + 'order_number' => 'Número de Orden', + 'bill_to' => 'Facturar a', + + 'quantity' => 'Cantidad', + 'price' => 'Precio', + 'sub_total' => 'Subtotal', + 'discount' => 'Descuento', + 'tax_total' => 'Total de Impuestos', + 'total' => 'Total ', + + 'item_name' => 'Nombre del producto/servicio | Nombres de los productos/servicos', + + 'show_discount' => ':discount% Descuento', + 'add_discount' => 'Agregar Descuento', + 'discount_desc' => 'de subtotal', + + 'payment_due' => 'Vencimiento del Pago', + 'paid' => 'Pagado', + 'histories' => 'Historial', + 'payments' => 'Pagos', + 'add_payment' => 'Añadir Pago', + 'mark_paid' => 'Marcar Como Pagada', + 'mark_sent' => 'Marcar Como Enviada', + 'download_pdf' => 'Descargar archivo PDF', + 'send_mail' => 'Enviar Correo Electrónico', + + 'status' => [ + 'draft' => 'Borrador', + 'sent' => 'Enviado', + 'viewed' => 'Visto', + 'approved' => 'Aprobado', + 'partial' => 'Parcial', + 'paid' => 'Pagado', + ], + + 'messages' => [ + 'email_sent' => '¡El correo electrónico de la factura se ha enviado correctamente!', + 'marked_sent' => '¡Factura marcada como enviada con éxito!', + 'email_required' => 'No se encontró una dirección de correo para este cliente!', + ], + + 'notification' => [ + 'message' => 'Estimado :cliente, usted está recibiendo este correo electrónico debido a que tiene una factura pendiente de pago por la cantidad de :amount, es de suma importancia que se contacte de inmediato con nosotros. Evite la suspensión de los servicios que tiene contratados o la entrega de los productos solicitados, además de posibles recargos y gastos de cobranza.', + 'button' => 'Realizar el Pago Ahora', + ], + +]; diff --git a/resources/lang/es-MX/items.php b/resources/lang/es-MX/items.php new file mode 100755 index 0000000..588f183 --- /dev/null +++ b/resources/lang/es-MX/items.php @@ -0,0 +1,15 @@ + 'Cantidad | Cantidades', + 'sales_price' => 'Precio de Venta', + 'purchase_price' => 'Precio de Compra', + 'sku' => 'SKU/Código/Clave', + + 'notification' => [ + 'message' => 'Usted está recibiendo este correo electrónico porque el producto/servicio :name se está quedando sin inventario', + 'button' => 'Ver Ahora', + ], + +]; diff --git a/resources/lang/es-MX/messages.php b/resources/lang/es-MX/messages.php new file mode 100755 index 0000000..d7a7904 --- /dev/null +++ b/resources/lang/es-MX/messages.php @@ -0,0 +1,27 @@ + [ + 'added' => '¡:type agregado!', + 'updated' => '¡:type actualizado!', + 'deleted' => '¡:type eliminado!', + 'duplicated' => '¡:type duplicado!', + 'imported' => '¡:type importado!', + 'enabled' => ':type activado!', + 'disabled' => ':type desactivado!', + ], + 'error' => [ + 'over_payment' => 'Error: Pago no agregado! Cantidad sobre pasa el total.', + 'not_user_company' => 'Error: ¡No tiene permisos para administrar esta empresa!', + 'customer' => 'Error: Usuario no creado! :nombre ya utiliza esta dirección de correo.', + 'no_file' => 'Error: ¡Ningún archivo se ha seleccionado!', + 'last_category' => 'Error: No se pudo eliminar el ultimo No. :type category!', + 'invalid_token' => 'Error: El token ingresado es invalido!', + ], + 'warning' => [ + 'deleted' => 'Advertencia: No puede borrar :name porque tiene :text relacionado.', + 'disabled' => 'Advertencia: No se permite desactivar :name porque tiene :text relacionado.', + ], + +]; diff --git a/resources/lang/es-MX/modules.php b/resources/lang/es-MX/modules.php new file mode 100755 index 0000000..85f9e02 --- /dev/null +++ b/resources/lang/es-MX/modules.php @@ -0,0 +1,58 @@ + 'Token de API', + 'api_token' => 'Token', + 'my_apps' => 'Mis Apps', + 'top_paid' => 'Más Pagado', + 'new' => 'Nuevo', + 'top_free' => 'Top Gratis', + 'free' => 'GRATIS', + 'search' => 'Buscar', + 'install' => 'Instalar', + 'buy_now' => 'Comprar Ahora', + 'token_link' => 'Haga Haga click aquí para obtener su token de API.', + 'no_apps' => 'No hay aplicaciones en esta categoría, aún.', + 'developer' => '¿Eres un desarrollador? Aquí puedes aprender cómo crear una aplicación y comenzar a venderla hoy!', + + 'about' => 'Acerca de', + + 'added' => 'Agregado', + 'updated' => 'Actualizado', + 'compatibility' => 'Compatibilidad', + + 'installed' => ':module instalado', + 'uninstalled' => ':module desinstalado', + //'updated' => ':module updated', + 'enabled' => ':module activado', + 'disabled' => ':module desactivado', + + 'tab' => [ + 'installation' => 'Instalación', + 'faq' => 'Preguntas Frecuentes', + 'changelog' => 'Historial de Cambios', + ], + + 'installation' => [ + 'header' => 'Instalación de Aplicación', + 'download' => 'Descargando archivo :module .', + 'unzip' => 'Extrayendo archivo :module .', + 'install' => 'Instalando archivos de :module .', + ], + + 'badge' => [ + 'installed' => 'Instalado', + ], + + 'button' => [ + 'uninstall' => 'Desinstalar', + 'disable' => 'Deshabilitar', + 'enable' => 'Habilitar', + ], + + 'my' => [ + 'purchased' => 'Comprado', + 'installed' => 'Instalado', + ], +]; diff --git a/resources/lang/es-MX/pagination.php b/resources/lang/es-MX/pagination.php new file mode 100755 index 0000000..e1dbac6 --- /dev/null +++ b/resources/lang/es-MX/pagination.php @@ -0,0 +1,9 @@ + '« Anterior', + 'next' => 'Siguiente »', + 'showing' => 'Mostrando :first a :last de :total :type', + +]; diff --git a/resources/lang/es-MX/passwords.php b/resources/lang/es-MX/passwords.php new file mode 100755 index 0000000..31d8cd6 --- /dev/null +++ b/resources/lang/es-MX/passwords.php @@ -0,0 +1,22 @@ + 'Las contraseñas deben tener mínimo seis (6) caracteres y coincidir con la confirmación.', + 'reset' => '¡Su contraseña ha sido restablecida!', + 'sent' => '¡Hemos enviado via correo electrónico un enlace para resetear su contraseña!', + 'token' => 'Este token de reseteo de contraseña ya no es válido.', + 'user' => "No podemos encontrar un usuario con esa dirección de correo electrónico.", + +]; diff --git a/resources/lang/es-MX/recurring.php b/resources/lang/es-MX/recurring.php new file mode 100755 index 0000000..63fbc2b --- /dev/null +++ b/resources/lang/es-MX/recurring.php @@ -0,0 +1,20 @@ + 'Recurrente', + 'every' => 'Cada', + 'period' => 'Periodo', + 'times' => 'Veces', + 'daily' => 'Diario', + 'weekly' => 'Semanal', + 'monthly' => 'Mensual', + 'yearly' => 'Anual', + 'custom' => 'Personalizado', + 'days' => 'Día(s)', + 'weeks' => 'Semana(s)', + 'months' => 'Mes(es)', + 'years' => 'Año(s)', + 'message' => 'Éste es un :type periódico y el siguiente :type se generará automáticamente el día :date', + +]; diff --git a/resources/lang/es-MX/reports.php b/resources/lang/es-MX/reports.php new file mode 100755 index 0000000..de8b686 --- /dev/null +++ b/resources/lang/es-MX/reports.php @@ -0,0 +1,30 @@ + 'Este Año', + 'previous_year' => 'Año Anterior', + 'this_quarter' => 'Este Trimestre', + 'previous_quarter' => 'Trimestre Anterior', + 'last_12_months' => 'Últimos 12 Meses', + 'profit_loss' => 'Ganancias y Pérdidas', + 'gross_profit' => 'Ganancia Bruta', + 'net_profit' => 'Ganancia Neta', + 'total_expenses' => 'Total de Gastos', + 'net' => 'Neto', + + 'summary' => [ + 'income' => 'Resumen de Ingresos', + 'expense' => 'Resumen de Gastos', + 'income_expense' => 'Ingresos vs Gastos', + 'tax' => 'Resumen de impuestos', + ], + + 'quarter' => [ + '1' => 'Ene-Mar', + '2' => 'Abr-Jun', + '3' => 'Jul-Sep', + '4' => 'Oct-Dic', + ], + +]; diff --git a/resources/lang/es-MX/settings.php b/resources/lang/es-MX/settings.php new file mode 100755 index 0000000..8229750 --- /dev/null +++ b/resources/lang/es-MX/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Nombre', + 'email' => 'Correo Electrónico', + 'phone' => 'Teléfono', + 'address' => 'Dirección', + 'logo' => 'Logotipo', + ], + 'localisation' => [ + 'tab' => 'Localización', + 'date' => [ + 'format' => 'Formato de Fecha', + 'separator' => 'Separador de Fecha', + 'dash' => 'Guión (-)', + 'dot' => 'Punto (.)', + 'comma' => 'Coma (,)', + 'slash' => 'Barra (/)', + 'space' => 'Espacio ( )', + ], + 'timezone' => 'Zona Horaria', + 'percent' => [ + 'title' => 'Posición Porcentaje (%)', + 'before' => 'Antes del Número', + 'after' => 'Después del número', + ], + ], + 'invoice' => [ + 'tab' => 'Factura', + 'prefix' => 'Prefijo de Número', + 'digit' => 'Número de Dígitos', + 'next' => 'Siguiente Número', + 'logo' => 'Logotipo', + ], + 'default' => [ + 'tab' => 'Valores Predeterminados', + 'account' => 'Cuenta Predeterminada', + 'currency' => 'Moneda Predeterminada', + 'tax' => 'Tasa de Impuesto Predeterminado', + 'payment' => 'Método de Pago Predeterminado', + 'language' => 'Idioma Predeterminado', + ], + 'email' => [ + 'protocol' => 'Protocolo', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'Host SMTP', + 'port' => 'Puerto SMTP', + 'username' => 'Nombre de Usuario SMTP', + 'password' => 'Contraseña SMTP', + 'encryption' => 'Seguridad SMTP', + 'none' => 'Ninguna', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Ruta de acceso de Sendmail', + 'log' => 'Registrar Correos Electrónicos', + ], + 'scheduling' => [ + 'tab' => 'Programación', + 'send_invoice' => 'Enviar Recordatorio de Factura', + 'invoice_days' => 'Enviar Después del vencimiento', + 'send_bill' => 'Enviar Recordatorio de Recibo', + 'bill_days' => 'Enviar Antes del Vencimiento', + 'cron_command' => 'Comando de Cron', + 'schedule_time' => 'Hora de Ejecución', + ], + 'appearance' => [ + 'tab' => 'Apariencia', + 'theme' => 'Tema', + 'light' => 'Claro', + 'dark' => 'Oscuro', + 'list_limit' => 'Registros por Página', + 'use_gravatar' => 'Usar Gravatar', + ], + 'system' => [ + 'tab' => 'Sistema', + 'session' => [ + 'lifetime' => 'Duración de la Sesión (Minutos)', + 'handler' => 'Gestor de Sesión', + 'file' => 'Archivo', + 'database' => 'Base de Datos', + ], + 'file_size' => 'Tamaño Máximo de Archivo (MB)', + 'file_types' => 'Tipos de Archivo Permitidos', + ], + +]; diff --git a/resources/lang/es-MX/taxes.php b/resources/lang/es-MX/taxes.php new file mode 100755 index 0000000..7365b2e --- /dev/null +++ b/resources/lang/es-MX/taxes.php @@ -0,0 +1,8 @@ + 'Tasa', + 'rate_percent' => 'Tasa (%)', + +]; diff --git a/resources/lang/es-MX/transfers.php b/resources/lang/es-MX/transfers.php new file mode 100755 index 0000000..4c37b64 --- /dev/null +++ b/resources/lang/es-MX/transfers.php @@ -0,0 +1,12 @@ + 'De la Cuenta', + 'to_account' => 'A la Cuenta', + + 'messages' => [ + 'delete' => ':from a :to (:amount)', + ], + +]; diff --git a/resources/lang/es-MX/updates.php b/resources/lang/es-MX/updates.php new file mode 100755 index 0000000..b2b7385 --- /dev/null +++ b/resources/lang/es-MX/updates.php @@ -0,0 +1,15 @@ + 'Versión Instalada', + 'latest_version' => 'Última Versión', + 'update' => 'Actualizar Akaunting a la Versión :version', + 'changelog' => 'Historial de Cambios', + 'check' => 'Comprobar', + 'new_core' => 'Una versión actualizada de Akaunting está disponible.', + 'latest_core' => '¡Felicidades! Tienes la última versión de Akaunting. Las actualizaciones de seguridad futuras se aplicarán automáticamente.', + 'success' => 'El proceso de actualización se ha completado con éxito.', + 'error' => 'El proceso de actualización ha fallado, por favor inténtelo de nuevo.', + +]; diff --git a/resources/lang/es-MX/validation.php b/resources/lang/es-MX/validation.php new file mode 100755 index 0000000..50559ce --- /dev/null +++ b/resources/lang/es-MX/validation.php @@ -0,0 +1,119 @@ + ':attribute debe ser aceptado.', + 'active_url' => ':attribute no es una URL válida.', + 'after' => ':attribute debe ser posterior a :date.', + 'after_or_equal' => ':attribute debe ser una fecha posterior o igual a :date.', + 'alpha' => ':attribute solo puede contener letras.', + 'alpha_dash' => ':attribute solo puede contener letras, números y guiones.', + 'alpha_num' => ':attribute solo puede contener letras y números.', + 'array' => ':attribute debe ser un array.', + 'before' => ':attribute debe ser una fecha anterior a :date.', + 'before_or_equal' => ':attribute debe ser una fecha anterior o igual a :date.', + 'between' => [ + 'numeric' => ':attribute debe estar entre :min y :max.', + 'file' => ':attribute debe estar entre :min - :max kilobytes.', + 'string' => ':attribute debe estar entre :min - :max caracteres.', + 'array' => ':attribute debe tener entre :min y :max items.', + ], + 'boolean' => ':attribute debe ser verdadero o falso.', + 'confirmed' => ':attribute, la confirmación no coincide.', + 'date' => ':attribute no es una fecha válida.', + 'date_format' => ':attribute no coincide con el formato :format.', + 'different' => ':attribute y :other deben ser diferentes.', + 'digits' => ':attribute debe tener :digits dígitos.', + 'digits_between' => ':attribute debe tener entre :min y :max dígitos.', + 'dimensions' => ':attribute tiene dimensiones de imagen no válidas.', + 'distinct' => ':attribute tiene un valor duplicado.', + 'email' => ':attribute debe ser una dirección de correo electrónico válida.', + 'exists' => 'El :attribute seleccionado es inválido.', + 'file' => ':attribute debe ser un archivo.', + 'filled' => ':attribute debe tener un valor.', + 'image' => ':attribute debe ser una imagen.', + 'in' => 'El :attribute seleccionado es inválido.', + 'in_array' => ':attribute no existe en :other.', + 'integer' => ':attribute debe ser un número entero.', + 'ip' => ':attribute debe ser una dirección IP válida.', + 'json' => ':attribute debe ser una cadena JSON válida.', + 'max' => [ + 'numeric' => ':attribute no debe ser mayor que :max.', + 'file' => ':attribute no debe ser mayor que :max kilobytes.', + 'string' => ':attribute no debe tener como máximo :max caracteres.', + 'array' => ':attribute no debe tener más de :max items.', + ], + 'mimes' => ':attribute debe ser un archivo de los tipos: :values.', + 'mimetypes' => ':attribute debe ser un archivo de los tipos: :values.', + 'min' => [ + 'numeric' => ':attribute debe ser como mínimo :min.', + 'file' => ':attribute debe ser como mínimo de :min kilobytes.', + 'string' => ':attribute debe contener como mínimo :min caracteres.', + 'array' => ':attribute debe contener como mínimo :min items.', + ], + 'not_in' => 'El :attribute seleccionado es inválido.', + 'numeric' => ':attribute debe ser un número.', + 'present' => ':attribute debe tener un valor.', + 'regex' => ':attribute tiene un formato incorrecto.', + 'required' => ':attribute es obligatorio.', + 'required_if' => ':attribute es obligatorio cuando :other es :value.', + 'required_unless' => ':attribute es obligatorio a menos que :other esté en :values.', + 'required_with' => ':attribute es obligatorio cuando :values está presente.', + 'required_with_all' => ':attribute es obligatorio cuando :values está presente.', + 'required_without' => ':attribute es obligatorio cuando :values no está presente.', + 'required_without_all' => ':attribute es obligatorio cuando ningún :values está presente.', + 'same' => ':attribute y :other deben coincidir.', + 'size' => [ + 'numeric' => ':attribute debe ser :size.', + 'file' => ':attribute debe tener :size kilobytes.', + 'string' => ':attribute debe tener :size caracteres.', + 'array' => ':attribute debe tener al menos :size items.', + ], + 'string' => ':attribute debe ser una cadena de caracteres.', + 'timezone' => ':attribute debe ser una zona válida.', + 'unique' => ':attribute ya ha sido tomado.', + 'uploaded' => ':attribute no se pudo cargar.', + 'url' => ':attribute tiene un formato incorrecto.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/fa-IR/accounts.php b/resources/lang/fa-IR/accounts.php new file mode 100755 index 0000000..0a838a0 --- /dev/null +++ b/resources/lang/fa-IR/accounts.php @@ -0,0 +1,14 @@ + 'نام حساب', + 'number' => 'شماره حساب', + 'opening_balance' => 'موجودی حساب', + 'current_balance' => 'موجودی', + 'bank_name' => 'نام بانک', + 'bank_phone' => 'تلفن بانک', + 'bank_address' => 'آدرس بانک', + 'default_account' => 'حساب پیش فرض', + +]; diff --git a/resources/lang/fa-IR/auth.php b/resources/lang/fa-IR/auth.php new file mode 100755 index 0000000..af2bbe6 --- /dev/null +++ b/resources/lang/fa-IR/auth.php @@ -0,0 +1,30 @@ + 'پروفایل', + 'logout' => 'خروج', + 'login' => 'ورود', + 'login_to' => 'ورود برای شروع جلسه', + 'remember_me' => 'مرا به خاطر بسپار', + 'forgot_password' => 'گذرواژه خود را فراموش کرده ام', + 'reset_password' => 'تنظیم مجدد رمز عبور', + 'enter_email' => 'آدرس ایمیل خود را وارد نمایید', + 'current_email' => 'ایمیل فعلی', + 'reset' => 'بازنشانی', + 'never' => 'هرگز', + 'password' => [ + 'current' => 'رمز عبور', + 'current_confirm' => 'تکرار رمز عبور', + 'new' => 'رمز عبور جدید', + 'new_confirm' => 'تکرار رمز عبور', + ], + 'error' => [ + 'self_delete' => 'خطا: نمی‌توانید خودتان حذف کنید!' + ], + + 'failed' => 'مشخصات وارد شده با اطلاعات ما سازگار نیست.', + 'disabled' => 'این حساب غیر فعال شده است. لطفاً با مدیر سیستم تماس بگیرید.', + 'throttle' => 'دفعات تلاش شما برای ورود بیش از حد مجاز است. لطفا پس از :seconds ثانیه مجددا تلاش فرمایید.', + +]; diff --git a/resources/lang/fa-IR/bills.php b/resources/lang/fa-IR/bills.php new file mode 100755 index 0000000..348eb76 --- /dev/null +++ b/resources/lang/fa-IR/bills.php @@ -0,0 +1,46 @@ + 'شماره صورتحساب', + 'bill_date' => 'تاریخ صورتحساب', + 'total_price' => 'قیمت کل', + 'due_date' => 'سررسید', + 'order_number' => 'شماره سفارش', + 'bill_from' => 'صورتحساب از', + + 'quantity' => 'تعداد', + 'price' => 'قيمت', + 'sub_total' => 'جمع کل', + 'discount' => 'Discount', + 'tax_total' => 'مجموع مالیات', + 'total' => 'مجموع', + + 'item_name' => 'نام آیتم | نام آیتم ها', + + 'show_discount' => ':discount% Discount', + 'add_discount' => 'Add Discount', + 'discount_desc' => 'of subtotal', + + 'payment_due' => 'سررسید پرداخت', + 'amount_due' => 'مقدار سررسید', + 'paid' => 'پرداخت شده', + 'histories' => 'تاریخچه', + 'payments' => 'پرداخت ها', + 'add_payment' => 'پرداخت', + 'mark_received' => 'دریافت شده', + 'download_pdf' => 'دانلود PDF', + 'send_mail' => 'ارسال ایمیل', + + 'status' => [ + 'draft' => 'پیش‌ نویس', + 'received' => 'دریافت شده', + 'partial' => 'جزئیات', + 'paid' => 'پرداخت شده', + ], + + 'messages' => [ + 'received' => 'صورتحساب مشخص شده با موفقیت علامت گذاری شد.', + ], + +]; diff --git a/resources/lang/fa-IR/companies.php b/resources/lang/fa-IR/companies.php new file mode 100755 index 0000000..6b9ea23 --- /dev/null +++ b/resources/lang/fa-IR/companies.php @@ -0,0 +1,13 @@ + 'دامنه', + 'logo' => 'لوگو', + 'manage' => 'مدیریت شرکت ها', + 'all' => 'تمام شرکت ها', + 'error' => [ + 'delete_active' => 'خطا:نمی توانید شرکت فعال را حذف نمایید، ابتدا آن را ویرایش کنید!', + ], + +]; diff --git a/resources/lang/fa-IR/currencies.php b/resources/lang/fa-IR/currencies.php new file mode 100755 index 0000000..c9154dd --- /dev/null +++ b/resources/lang/fa-IR/currencies.php @@ -0,0 +1,18 @@ + 'کد', + 'rate' => 'نرخ', + 'default' => 'واحد پول پیش فرض', + 'decimal_mark' => 'ممیز', + 'thousands_separator' => 'هزاران جدا کننده', + 'precision' => 'دقت', + 'symbol' => [ + 'symbol' => 'نماد', + 'position' => 'موقعیت نماد', + 'before' => 'مقدار بعد از', + 'after' => 'مقدار بعد از', + ] + +]; diff --git a/resources/lang/fa-IR/customers.php b/resources/lang/fa-IR/customers.php new file mode 100755 index 0000000..1f98ae0 --- /dev/null +++ b/resources/lang/fa-IR/customers.php @@ -0,0 +1,11 @@ + 'مجاز به ورود به سیستم؟', + 'user_created' => 'کاربر ایجاد شده', + + 'error' => [ + 'email' => 'این ایمیل قبلا انتخاب شده است.' + ] +]; diff --git a/resources/lang/fa-IR/dashboard.php b/resources/lang/fa-IR/dashboard.php new file mode 100755 index 0000000..a7248d6 --- /dev/null +++ b/resources/lang/fa-IR/dashboard.php @@ -0,0 +1,24 @@ + 'کل درآمد', + 'receivables' => 'مطالبات', + 'open_invoices' => 'فاکتورها باز', + 'overdue_invoices' => 'فاکتورها سر رسیده', + 'total_expenses' => 'هزینه های کل', + 'payables' => 'Payables', + 'open_bills' => 'صورتحساب های باز', + 'overdue_bills' => 'صورتحساب های سررسید شده', + 'total_profit' => 'کل سود', + 'open_profit' => 'سود باز', + 'overdue_profit' => 'سود سررسید شده', + 'cash_flow' => 'جریان نقدی', + 'no_profit_loss' => 'بدون سود از دست رفته', + 'incomes_by_category' => 'درآمد بر اساس بخش بندی', + 'expenses_by_category' => 'هزینه بر اساس بخش بندی', + 'account_balance' => 'مانده حساب', + 'latest_incomes' => 'آخرین درآمد', + 'latest_expenses' => 'آخرین هزینه ها', + +]; diff --git a/resources/lang/fa-IR/demo.php b/resources/lang/fa-IR/demo.php new file mode 100755 index 0000000..d833a41 --- /dev/null +++ b/resources/lang/fa-IR/demo.php @@ -0,0 +1,17 @@ + 'پول نقد', + 'categories_uncat' => 'بدون بخش', + 'categories_deposit' => 'سپرده', + 'categories_sales' => 'فروش', + 'currencies_usd' => 'دلار آمریکا', + 'currencies_eur' => 'یورو', + 'currencies_gbp' => 'پوند انگلیس', + 'currencies_try' => 'لیره ترکیه', + 'taxes_exempt' => 'معاف از مالیات', + 'taxes_normal' => 'مالیات عادی', + 'taxes_sales' => 'مالیات بر فروش', + +]; diff --git a/resources/lang/fa-IR/footer.php b/resources/lang/fa-IR/footer.php new file mode 100755 index 0000000..ff5a5f6 --- /dev/null +++ b/resources/lang/fa-IR/footer.php @@ -0,0 +1,9 @@ + 'نسخه', + 'powered' => 'طراحی شده توسط Akaunting', + 'software' => 'نرم افزار حسابداری رایگان', + +]; diff --git a/resources/lang/fa-IR/general.php b/resources/lang/fa-IR/general.php new file mode 100755 index 0000000..e0775ed --- /dev/null +++ b/resources/lang/fa-IR/general.php @@ -0,0 +1,117 @@ + 'مورد | موارد', + 'incomes' => 'درآمد | درآمد', + 'invoices' => 'فاکتور | فاکتورها', + 'revenues' => 'نقدی | نقدی', + 'customers' => 'مشتری | مشتریان', + 'expenses' => 'هزینه | هزینه ها', + 'bills' => 'صورتحساب |صورتحساب', + 'payments' => 'پرداخت | پرداخت', + 'vendors' => 'فروشنده | فروشندگان', + 'accounts' => 'حساب | حساب', + 'transfers' => 'انتقال |انتقال ها', + 'transactions' => 'تراکنش |تراکنش ها', + 'reports' => 'گزارش | گزارش', + 'settings' => 'تنظیم | تنظیمات', + 'categories' => 'بخش |بخش ها', + 'currencies' => 'واحد پول | واحد پول', + 'tax_rates' => 'نرخ مالیات | نرخ مالیات', + 'users' => 'کاربر | کاربران', + 'roles' => 'نقش | نقش', + 'permissions' => 'مجوز | مجوزها', + 'modules' => 'برنامه | برنامه ها', + 'companies' => 'شرکت | شرکت ها', + 'profits' => 'سود | سود', + 'taxes' => 'مالیات | مالیات', + 'logos' => 'لوگو | لوگوها', + 'pictures' => 'عکس | تصاویر', + 'types' => 'نوع | انواع', + 'payment_methods' => 'روش پرداخت | روش های پرداخت', + 'compares' => 'درآمد هزینه | درآمد هزینه', + 'notes' => 'یادداشت | یادداشت ها', + 'totals' => 'کل | مجموع', + 'languages' => 'زبان | زبان', + 'updates' => 'به روز رسانی | به روز رسانی', + 'numbers' => 'شماره | تعداد', + 'statuses' => 'وضعیت | وضعیت', + 'others' => 'Other|Others', + + 'dashboard' => 'پیشخوان', + 'banking' => 'بانکداری', + 'general' => 'عمومی', + 'no_records' => 'بدون سابقه', + 'date' => 'تاریخ', + 'amount' => 'مبلغ', + 'enabled' => 'فعال', + 'disabled' => 'غیر فعال', + 'yes' => 'بله', + 'no' => 'خیر', + 'na' => '(تعریف نشده)', + 'daily' => 'روزانه', + 'monthly' => 'ماهانه', + 'quarterly' => 'فصلی', + 'yearly' => 'سالانه', + 'add' => 'افزودن', + 'add_new' => 'افزودن جدید', + 'show' => 'نمایش', + 'edit' => 'ويرايش', + 'delete' => 'حذف', + 'send' => 'ارسال', + 'download' => 'دريافت', + 'delete_confirm' => 'تایید حذف :name :type ؟', + 'name' => 'نام', + 'email' => 'ایمیل', + 'tax_number' => 'شماره مالیاتی', + 'phone' => 'تلفن', + 'address' => 'آدرس', + 'website' => 'وب سایت', + 'actions' => 'اقدامات', + 'description' => 'توضیحات', + 'manage' => 'مدیریت', + 'code' => 'کد', + 'alias' => 'نام مستعار', + 'balance' => 'مانده', + 'reference' => 'مرجع', + 'attachment' => 'پیوست', + 'change' => 'تغییر', + 'switch' => 'جایه‌جایی', + 'color' => 'رنگ', + 'save' => 'ذخیره کردن', + 'cancel' => 'انصراف', + 'from' => 'از', + 'to' => 'به', + 'print' => 'چاپ کن', + 'search' => 'جستجو', + 'search_placeholder' => 'جستجو...', + 'filter' => 'فیلتر', + 'help' => 'راهنما', + 'all' => 'همه', + 'all_type' => 'همه :type', + 'upcoming' => 'آینده', + 'created' => 'ایجاد شده', + 'id' => 'شناسه', + 'more_actions' => 'اقدامات بیشتر', + 'duplicate' => 'تکراری', + 'unpaid' => 'پرداخت نشده', + 'paid' => 'پرداخت شده', + 'overdue' => 'سر رسید شده', + 'partially' => 'جزئی', + 'partially_paid' => 'پرداخت جزئی', + + 'title' => [ + 'new' => ':type جدید', + 'edit' => 'ویرایش :type', + ], + 'form' => [ + 'enter' => 'واردکردن :field', + 'select' => [ + 'field' => '-انتخاب :field-', + 'file' => 'انتخاب فایل', + ], + 'no_file_selected' => 'هیچ فایلی انتخاب نشده...', + ], + +]; diff --git a/resources/lang/fa-IR/header.php b/resources/lang/fa-IR/header.php new file mode 100755 index 0000000..6023cf4 --- /dev/null +++ b/resources/lang/fa-IR/header.php @@ -0,0 +1,15 @@ + 'تغییر زبان', + 'last_login' => 'آخرین ورود :time', + 'notifications' => [ + 'counter' => '{0} شما اطلاعیه ای ندارید |{1} شما:count اطلاعیه دارید | [2, *] شما :coun اطلاعیه دارید', + 'overdue_invoices' => '{1} :count فاکتور سررسید شده دارید | [2, *]: :count فاکتور سررسید شده دارید', + 'upcoming_bills' => '{1}:count صورتحساب دارید | [2, *]:count صورتحساب دارید', + 'items_stock' => '{1} :count موجود است | [2,*] :count موجود است', + 'view_all' => 'نمایش همه' + ], + +]; diff --git a/resources/lang/fa-IR/import.php b/resources/lang/fa-IR/import.php new file mode 100755 index 0000000..87d5ab3 --- /dev/null +++ b/resources/lang/fa-IR/import.php @@ -0,0 +1,9 @@ + 'درون‌ریزی', + 'title' => ':type درون ریزی', + 'message' => 'فایل types: CSV, XLS مجاز است. لطفا از طریق لینک دانلود فایل نمونه را دانلود کنید.', + +]; diff --git a/resources/lang/fa-IR/install.php b/resources/lang/fa-IR/install.php new file mode 100755 index 0000000..af91228 --- /dev/null +++ b/resources/lang/fa-IR/install.php @@ -0,0 +1,44 @@ + 'بعدی', + 'refresh' => 'تازه سازی', + + 'steps' => [ + 'requirements' => 'لطفا نیازمندی های نصب را بررسی کنید!', + 'language' => 'گام 1/3: انتخاب زبان', + 'database' => 'مرحله 2/3: راه اندازی پایگاه داده', + 'settings' => 'مرحله 3/3: شرکت و مدیریت اطلاعات', + ], + + 'language' => [ + 'select' => 'انتخاب زبان', + ], + + 'requirements' => [ + 'enabled' => ':feature باید فعال باشد!', + 'disabled' => ':feature باید غیر فعال باشد!', + 'extension' => ':extension باید بارگذاری شود!', + 'directory' => ':directory باید فابل نوشتن باشد!', + ], + + 'database' => [ + 'hostname' => 'نام هاست', + 'username' => 'نام کاربری', + 'password' => 'رمز عبور', + 'name' => 'پایگاه داده', + ], + + 'settings' => [ + 'company_name' => 'نام شرکت', + 'company_email' => 'ایمیل شرکت', + 'admin_email' => 'ایمیل مدیر', + 'admin_password' => 'کلمه عبور مدیر', + ], + + 'error' => [ + 'connection' => 'خطا: نمی تواند به پایگاه داده وصل شد! لطفا اطلاعات صحیح را وارد کنید.', + ], + +]; diff --git a/resources/lang/fa-IR/invoices.php b/resources/lang/fa-IR/invoices.php new file mode 100755 index 0000000..540516e --- /dev/null +++ b/resources/lang/fa-IR/invoices.php @@ -0,0 +1,55 @@ + 'شماره فاکتور', + 'invoice_date' => 'تاریخ فاکتور', + 'total_price' => 'قیمت کل', + 'due_date' => 'سررسید', + 'order_number' => 'شماره فاکتور', + 'bill_to' => 'صورتحساب برای', + + 'quantity' => 'تعداد', + 'price' => 'قيمت', + 'sub_total' => 'جمع کل', + 'discount' => 'Discount', + 'tax_total' => 'مجموع مالیات', + 'total' => 'مجموع', + + 'item_name' => 'نام آیتم | نام آیتم ها', + + 'show_discount' => ':discount% Discount', + 'add_discount' => 'Add Discount', + 'discount_desc' => 'of subtotal', + + 'payment_due' => 'سررسید پرداخت', + 'paid' => 'پرداخت شده', + 'histories' => 'تاریخچه', + 'payments' => 'پرداخت ها', + 'add_payment' => 'پرداخت', + 'mark_paid' => 'پرداخت شده', + 'mark_sent' => 'ارسال شده', + 'download_pdf' => 'دانلود PDF', + 'send_mail' => 'ارسال ایمیل', + + 'status' => [ + 'draft' => 'پیش‌ نویس', + 'sent' => 'ارسال شده', + 'viewed' => 'مشاهده شده', + 'approved' => 'تایید شده', + 'partial' => 'جزئیات', + 'paid' => 'پرداخت شده', + ], + + 'messages' => [ + 'email_sent' => 'فاکتور با موفقت ارسال شده است!', + 'marked_sent' => 'فاکتور با موفقت ارسال شده است!', + 'email_required' => 'هیچ آدرس ایمیل برای این مشتری موجود نیست!', + ], + + 'notification' => [ + 'message' => 'شما این ایمیل را دریافت کردید به دلیل اینکه مشتری شما :customer مقدار :amount فاکتور دارد.', + 'button' => 'پرداخت', + ], + +]; diff --git a/resources/lang/fa-IR/items.php b/resources/lang/fa-IR/items.php new file mode 100755 index 0000000..7c68221 --- /dev/null +++ b/resources/lang/fa-IR/items.php @@ -0,0 +1,15 @@ + 'تعداد | تعداد', + 'sales_price' => 'قیمت فروش', + 'purchase_price' => 'قیمت خرید', + 'sku' => 'کد کالا', + + 'notification' => [ + 'message' => 'شما به این دلیل این ایمیل را دریافت کرده‌اید که موجودی :name در حال اتمام است.', + 'button' => 'مشاهده', + ], + +]; diff --git a/resources/lang/fa-IR/messages.php b/resources/lang/fa-IR/messages.php new file mode 100755 index 0000000..ec366d7 --- /dev/null +++ b/resources/lang/fa-IR/messages.php @@ -0,0 +1,25 @@ + [ + 'added' => ':type اضافه شد!', + 'updated' => ':type به‌روز شد!', + 'deleted' => ':type حذف شد!', + 'duplicated' => ':type دو عدد موجود است!', + 'imported' => ':type درون ریزی شد!', + ], + 'error' => [ + 'over_payment' => 'خطا: پرداخت اضافه نشده! مبلغ وارد شده از جمع کل بیشتر است.', + 'not_user_company' => 'خطا: شما اجازه مدیریت این شرکت را ندارید!', + 'customer' => 'خطا: کاربر ایجاد نشد :name از ایمیل وارد شده استفاده می کند.', + 'no_file' => 'خطا: فایلی انتخاب نشده است!', + 'last_category' => 'Error: Can not delete the last :type category!', + 'invalid_token' => 'Error: The token entered is invalid!', + ], + 'warning' => [ + 'deleted' => 'هشدار: شما نمی توانید :name را به دلیل :text حذف کنید.', + 'disabled' => 'هشدار: شما نمی توانید :name را به دلیل :text غیر فعال کنید.', + ], + +]; diff --git a/resources/lang/fa-IR/modules.php b/resources/lang/fa-IR/modules.php new file mode 100755 index 0000000..35308ce --- /dev/null +++ b/resources/lang/fa-IR/modules.php @@ -0,0 +1,48 @@ + 'API Token', + 'api_token' => 'Token', + 'top_paid' => 'بهترین غیر رایگان', + 'new' => 'جدید', + 'top_free' => 'بهترین رایگان', + 'free' => 'رایگان', + 'search' => 'Search', + 'install' => 'نصب', + 'buy_now' => 'خرید', + 'token_link' => 'دریافت Token.', + 'no_apps' => 'در این بخش هیچ نرم افزاری وجود ندارد.', + 'developer' => 'آیا شما یک توسعه دهنده هستید؟با مراجعه به سایت فروشگاهی می توانید نرم افزار های خود را بسیازید و بفروشید.', + + 'about' => 'درباره ما', + + 'added' => 'اضافه شد', + 'updated' => 'به روز رسانی شده', + 'compatibility' => 'سازگاری', + + 'installed' => ':module نصب شد', + 'uninstalled' => ':module حذف شد', + //'updated' => ':module updated', + 'enabled' => ':module فعال شد', + 'disabled' => ':module غیر فعال شد', + + 'tab' => [ + 'installation' => 'نصب', + 'faq' => 'سوالات متداول', + 'changelog' => 'تغییرات', + ], + + 'installation' => [ + 'header' => 'محل نصب نرم افزار', + 'download' => 'دریافت فایل :module', + 'unzip' => 'استخراج فایل :module.', + 'install' => 'نصب فایل های :module .', + ], + + 'button' => [ + 'uninstall' => 'حذف کردن برنامه', + 'disable' => 'غیر فعال', + 'enable' => 'فعال سازی', + ], +]; diff --git a/resources/lang/fa-IR/pagination.php b/resources/lang/fa-IR/pagination.php new file mode 100755 index 0000000..61ad705 --- /dev/null +++ b/resources/lang/fa-IR/pagination.php @@ -0,0 +1,9 @@ + '« قبلی', + 'next' => 'بعدی »', + 'showing' => 'نمایش :first تا :last از :total :typr', + +]; diff --git a/resources/lang/fa-IR/passwords.php b/resources/lang/fa-IR/passwords.php new file mode 100755 index 0000000..9952691 --- /dev/null +++ b/resources/lang/fa-IR/passwords.php @@ -0,0 +1,22 @@ + 'گذرواژه باید حداقل شش کاراکتر بوده و با تائیدیه گذرواژه یکسان باشد.', + 'reset' => 'گذرواژه شما بازگردانی شد!', + 'sent' => 'لینک بازگردانی گذرواژه به ایمیل شما ارسال شد.', + 'token' => 'مشخصه‌ی بازگردانی گذرواژه معتبر نیست.', + 'user' => "ما کاربری با این نشانی ایمیل نداریم!", + +]; diff --git a/resources/lang/fa-IR/recurring.php b/resources/lang/fa-IR/recurring.php new file mode 100755 index 0000000..72c041c --- /dev/null +++ b/resources/lang/fa-IR/recurring.php @@ -0,0 +1,20 @@ + 'دوره ای', + 'every' => 'دوره', + 'period' => 'زمان', + 'times' => 'زمان', + 'daily' => 'روزانه', + 'weekly' => 'هفتگی', + 'monthly' => 'ماهانه', + 'yearly' => 'سالانه', + 'custom' => 'دلخواه', + 'days' => 'روز', + 'weeks' => 'هفته', + 'months' => 'ماه', + 'years' => 'سال', + 'message' => 'تکرار :type و پرداخت بعدی :type در تاریخ :date ایجاد می شود.', + +]; diff --git a/resources/lang/fa-IR/reports.php b/resources/lang/fa-IR/reports.php new file mode 100755 index 0000000..34896ed --- /dev/null +++ b/resources/lang/fa-IR/reports.php @@ -0,0 +1,30 @@ + 'امسال', + 'previous_year' => 'سال قبل', + 'this_quarter' => 'سه ماه', + 'previous_quarter' => 'سه ماهه قبلی', + 'last_12_months' => '12 ماه گذشته', + 'profit_loss' => 'Profit & Loss', + 'gross_profit' => 'Gross Profit', + 'net_profit' => 'Net Profit', + 'total_expenses' => 'Total Expenses', + 'net' => 'NET', + + 'summary' => [ + 'income' => 'خلاصه درآمد', + 'expense' => 'خلاصه هزینه', + 'income_expense' => 'هزینه درآمد', + 'tax' => 'Tax Summary', + ], + + 'quarter' => [ + '1' => 'Jan-Mar', + '2' => 'Apr-Jun', + '3' => 'Jul-Sep', + '4' => 'Oct-Dec', + ], + +]; diff --git a/resources/lang/fa-IR/settings.php b/resources/lang/fa-IR/settings.php new file mode 100755 index 0000000..4f97f37 --- /dev/null +++ b/resources/lang/fa-IR/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'نام', + 'email' => 'ایمیل', + 'phone' => 'تلفن', + 'address' => 'آدرس', + 'logo' => 'لوگو', + ], + 'localisation' => [ + 'tab' => 'موقعیت', + 'date' => [ + 'format' => 'فرمت تاریخ', + 'separator' => 'جداکننده تاریخ', + 'dash' => 'خط تیره (-)', + 'dot' => 'نقطه (.)', + 'comma' => 'کاما (,)', + 'slash' => 'علامت ممیز (/)', + 'space' => 'فضا ( )', + ], + 'timezone' => 'منطقه زمانی', + 'percent' => [ + 'title' => 'Percent (%) Position', + 'before' => 'Before Number', + 'after' => 'After Number', + ], + ], + 'invoice' => [ + 'tab' => 'فاکتور', + 'prefix' => 'پیشوند شماره', + 'digit' => 'تعداد ارقام', + 'next' => 'شماره بعدی', + 'logo' => 'لوگو', + ], + 'default' => [ + 'tab' => 'پیش‌فرض‌ها', + 'account' => 'حساب پیش فرض', + 'currency' => 'واحد پول پیش فرض', + 'tax' => 'نرخ مالیات پیش فرض', + 'payment' => 'پیش فرض روش پرداخت', + 'language' => 'زبان پیش فرض', + ], + 'email' => [ + 'protocol' => 'پروتکل', + 'php' => 'ایمیل PHP', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'هاست SMTP', + 'port' => 'پورت SMTP', + 'username' => 'نام کاربری SMTP', + 'password' => 'رمز عبور SMTP', + 'encryption' => 'امنیت SMTP', + 'none' => 'هیچ', + ], + 'sendmail' => 'Sendmail ', + 'sendmail_path' => 'مسیر Sendmail', + 'log' => 'رکورد های ایمیل', + ], + 'scheduling' => [ + 'tab' => 'برنامه‌ریزی', + 'send_invoice' => 'ارسال فاکتور یادآور', + 'invoice_days' => 'ارسال بعد از چند روز', + 'send_bill' => 'ارسال یاد آور صورتحساب', + 'bill_days' => 'تعداد روز ارسال قبل از سررسید', + 'cron_command' => 'فرمان Cron', + 'schedule_time' => 'ساعت به اجرا', + ], + 'appearance' => [ + 'tab' => 'ظاهر', + 'theme' => 'قالب', + 'light' => 'روشن', + 'dark' => 'تاریک', + 'list_limit' => 'نتایج در هر صفحه', + 'use_gravatar' => 'استفاده از Gravatar', + ], + 'system' => [ + 'tab' => 'سیستم', + 'session' => [ + 'lifetime' => 'جلسه طول عمر (دقیقه)', + 'handler' => 'مکانیزم نشست', + 'file' => 'فایل', + 'database' => 'پایگاه داده', + ], + 'file_size' => 'حداکثر اندازه فایل (MB)', + 'file_types' => 'نوع فایل مجاز', + ], + +]; diff --git a/resources/lang/fa-IR/taxes.php b/resources/lang/fa-IR/taxes.php new file mode 100755 index 0000000..d79c9fd --- /dev/null +++ b/resources/lang/fa-IR/taxes.php @@ -0,0 +1,8 @@ + 'نرخ', + 'rate_percent' => 'نرخ (%)', + +]; diff --git a/resources/lang/fa-IR/transfers.php b/resources/lang/fa-IR/transfers.php new file mode 100755 index 0000000..1e3062e --- /dev/null +++ b/resources/lang/fa-IR/transfers.php @@ -0,0 +1,8 @@ + 'از حساب', + 'to_account' => 'به حساب', + +]; diff --git a/resources/lang/fa-IR/updates.php b/resources/lang/fa-IR/updates.php new file mode 100755 index 0000000..4321b99 --- /dev/null +++ b/resources/lang/fa-IR/updates.php @@ -0,0 +1,15 @@ + 'نسخه نصب شده', + 'latest_version' => 'آخرین نسخه', + 'update' => 'بروز رسانی به نسخه :version', + 'changelog' => 'تغییرات', + 'check' => 'بررسی', + 'new_core' => 'نسخه به روز شده Akaunting موجود است.', + 'latest_core' => 'تبریک میگم! آخرین نسخه Akaunting نصب است. به روز رسانی امنیتی را در آینده به طور خودکار اعمال می شوند.', + 'success' => 'عملیات با موفقیت انجام شد.', + 'error' => 'روند به روز رسانی انجام نشد، لطفا دوباره سعی کنید.', + +]; diff --git a/resources/lang/fa-IR/validation.php b/resources/lang/fa-IR/validation.php new file mode 100755 index 0000000..590e0fa --- /dev/null +++ b/resources/lang/fa-IR/validation.php @@ -0,0 +1,119 @@ + ':attribute باید پذیرفته شده باشد.', + 'active_url' => 'آدرس :attribute معتبر نیست', + 'after' => ':attribute باید تاریخی بعد از :date باشد.', + 'after_or_equal' => ':attribute باید تاریخی بعد از :date، یا مطابق با آن باشد.', + 'alpha' => ':attribute باید فقط حروف الفبا باشد.', + 'alpha_dash' => ':attribute باید فقط حروف الفبا، عدد و خط تیره(-) باشد.', + 'alpha_num' => ':attribute باید فقط حروف الفبا و عدد باشد.', + 'array' => ':attribute باید آرایه باشد.', + 'before' => ':attribute باید تاریخی قبل از :date باشد.', + 'before_or_equal' => ':attribute باید تاریخی قبل از :date، یا مطابق با آن باشد.', + 'between' => [ + 'numeric' => ':attribute باید بین :min و :max باشد.', + 'file' => ':attribute باید بین :min و :max کیلوبایت باشد.', + 'string' => ':attribute باید بین :min و :max کاراکتر باشد.', + 'array' => ':attribute باید بین :min و :max آیتم باشد.', + ], + 'boolean' => 'فیلد :attribute فقط می‌تواند صحیح و یا غلط باشد', + 'confirmed' => ':attribute با فیلد تکرار مطابقت ندارد.', + 'date' => ':attribute یک تاریخ معتبر نیست.', + 'date_format' => ':attribute با الگوی :format مطاقبت ندارد.', + 'different' => ':attribute و :other باید متفاوت باشند.', + 'digits' => ':attribute باید :digits رقم باشد.', + 'digits_between' => ':attribute باید بین :min و :max رقم باشد.', + 'dimensions' => 'ابعاد تصویر :attribute قابل قبول نیست.', + 'distinct' => 'فیلد :attribute تکراری است.', + 'email' => ':attribute باید یک ایمیل معتبر باشد', + 'exists' => ':attribute انتخاب شده، معتبر نیست.', + 'file' => ':attribute باید یک فایل باشد', + 'filled' => 'فیلد :attribute الزامی است', + 'image' => ':attribute باید تصویر باشد.', + 'in' => ':attribute انتخاب شده، معتبر نیست.', + 'in_array' => 'فیلد :attribute در :other وجود ندارد.', + 'integer' => ':attribute باید عدد صحیح باشد.', + 'ip' => ':attribute باید IP معتبر باشد.', + 'json' => 'فیلد :attribute باید یک رشته از نوع JSON باشد.', + 'max' => [ + 'numeric' => ':attribute نباید بزرگتر از :max باشد.', + 'file' => ':attribute نباید بزرگتر از :max کیلوبایت باشد.', + 'string' => ':attribute نباید بیشتر از :max کاراکتر باشد.', + 'array' => ':attribute نباید بیشتر از :max آیتم باشد.', + ], + 'mimes' => ':attribute باید یکی از فرمت های :values باشد.', + 'mimetypes' => ':attribute باید یکی از فرمت های :values باشد.', + 'min' => [ + 'numeric' => ':attribute نباید کوچکتر از :min باشد.', + 'file' => ':attribute نباید کوچکتر از :min کیلوبایت باشد.', + 'string' => ':attribute نباید کمتر از :min کاراکتر باشد.', + 'array' => ':attribute نباید کمتر از :min آیتم باشد.', + ], + 'not_in' => ':attribute انتخاب شده، معتبر نیست.', + 'numeric' => ':attribute باید عدد باشد.', + 'present' => 'فیلد :attribute باید در پارامترهای ارسالی وجود داشته باشد.', + 'regex' => 'فرمت :attribute معتبر نیست', + 'required' => 'فیلد :attribute الزامی است', + 'required_if' => 'هنگامی که :other برابر با :value است، فیلد :attribute الزامی است.', + 'required_unless' => 'فیلد :attribute ضروری است، مگر آنکه :other در :values موجود باشد.', + 'required_with' => 'در صورت وجود فیلد :values، فیلد :attribute الزامی است.', + 'required_with_all' => 'در صورت وجود فیلدهای :values، فیلد :attribute الزامی است.', + 'required_without' => 'در صورت عدم وجود فیلد :values، فیلد :attribute الزامی است.', + 'required_without_all' => 'در صورت عدم وجود هر یک از فیلدهای :values، فیلد :attribute الزامی است.', + 'same' => ':attribute و :other باید مانند هم باشند.', + 'size' => [ + 'numeric' => ':attribute باید برابر با :size باشد.', + 'file' => ':attribute باید برابر با :size کیلوبایت باشد.', + 'string' => ':attribute باید برابر با :size کاراکتر باشد.', + 'array' => ':attribute باسد شامل :size آیتم باشد.', + ], + 'string' => 'فیلد :attribute باید متن باشد.', + 'timezone' => 'فیلد :attribute باید یک منطقه زمانی قابل قبول باشد.', + 'unique' => ':attribute قبلا انتخاب شده است.', + 'uploaded' => 'آپلود فایل :attribute موفقیت آمیز نبود.', + 'url' => 'فرمت آدرس :attribute اشتباه است.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/fr-FR/accounts.php b/resources/lang/fr-FR/accounts.php new file mode 100755 index 0000000..dbe4adc --- /dev/null +++ b/resources/lang/fr-FR/accounts.php @@ -0,0 +1,14 @@ + 'Nom du compte', + 'number' => 'Numéro', + 'opening_balance' => 'Solde à l\'ouverture', + 'current_balance' => 'Solde actuel', + 'bank_name' => 'Nom de la Banque', + 'bank_phone' => 'Téléphone de votre Banque', + 'bank_address' => 'Adresse de votre Banque', + 'default_account' => 'Compte par défaut', + +]; diff --git a/resources/lang/fr-FR/auth.php b/resources/lang/fr-FR/auth.php new file mode 100755 index 0000000..330a72f --- /dev/null +++ b/resources/lang/fr-FR/auth.php @@ -0,0 +1,39 @@ + 'Profil', + 'logout' => 'Déconnexion', + 'login' => 'Connexion', + 'login_to' => 'Connexion pour démarrer votre session', + 'remember_me' => 'Se souvenir de moi', + 'forgot_password' => 'J\'ai oublié mon mot de passe', + 'reset_password' => 'Réinitialiser le mot de passe', + 'enter_email' => 'Saisissez votre adresse e-mail', + 'current_email' => 'E-mail actuel', + 'reset' => 'Réinitialiser', + 'never' => 'jamais', + + 'password' => [ + 'current' => 'Mot de passe', + 'current_confirm' => 'Confirmation de mot de passe', + 'new' => 'Nouveau mot de passe', + 'new_confirm' => 'Confirmation du nouveau mot de passe', + ], + + 'error' => [ + 'self_delete' => 'Erreur : Vous ne pouvez pas vous supprimer vous-même !', + 'no_company' => 'Erreur : Aucune entreprise associée à votre compte. Veuillez contacter votre administrateur système.', + ], + + 'failed' => 'Ces identifiants ne correspondent pas à un utilisateur.', + 'disabled' => 'Ce compte est désactivé. Veuillez contacter l’administrateur système.', + 'throttle' => 'Trop de tentatives de connexion. Veuillez réessayer à nouveau dans :seconds secondes.', + + 'notification' => [ + 'message_1' => 'Vous recevez cet email car nous avons reçu une demande de réinitialisation de mot de passe pour votre compte.', + 'message_2' => 'Aucune action n\'est requise si vous n\'êtes pas à l\'origine de la demande de réinitialisation de mot de passe.', + 'button' => 'Réinitialiser le mot de passe', + ], + +]; diff --git a/resources/lang/fr-FR/bills.php b/resources/lang/fr-FR/bills.php new file mode 100755 index 0000000..9020ac6 --- /dev/null +++ b/resources/lang/fr-FR/bills.php @@ -0,0 +1,46 @@ + 'Numéro de facture', + 'bill_date' => 'Date de facture', + 'total_price' => 'Prix total', + 'due_date' => 'Date d\'échéance', + 'order_number' => 'Numéro de commande', + 'bill_from' => 'Facture de', + + 'quantity' => 'Quantité', + 'price' => 'Prix', + 'sub_total' => 'Sous-total', + 'discount' => 'Remise', + 'tax_total' => 'Taxe totale', + 'total' => 'Total', + + 'item_name' => 'Nom de marchandise|Noms des marchandises', + + 'show_discount' => ':discount % de remise', + 'add_discount' => 'Ajouter une remise', + 'discount_desc' => 'du sous-total', + + 'payment_due' => 'Paiement dû', + 'amount_due' => 'Montant dû', + 'paid' => 'Payé', + 'histories' => 'Historiques', + 'payments' => 'Paiements', + 'add_payment' => 'Ajouter un paiement', + 'mark_received' => 'Marqué comme reçu', + 'download_pdf' => 'Télécharger en PDF', + 'send_mail' => 'Envoyer un Email', + + 'status' => [ + 'draft' => 'Brouillon', + 'received' => 'Reçu', + 'partial' => 'Partiel', + 'paid' => 'Payé', + ], + + 'messages' => [ + 'received' => 'Facture marquée comme reçue avec succès !', + ], + +]; diff --git a/resources/lang/fr-FR/companies.php b/resources/lang/fr-FR/companies.php new file mode 100755 index 0000000..5078b5f --- /dev/null +++ b/resources/lang/fr-FR/companies.php @@ -0,0 +1,13 @@ + 'Domaine', + 'logo' => 'Logo', + 'manage' => 'Gérer des entreprises', + 'all' => 'Toutes les entreprises', + 'error' => [ + 'delete_active' => 'Erreur : Vous ne pouvez pas supprimer une entreprise active. Veuillez changez d\'entreprise avant de supprimer !', + ], + +]; diff --git a/resources/lang/fr-FR/currencies.php b/resources/lang/fr-FR/currencies.php new file mode 100755 index 0000000..60d68ee --- /dev/null +++ b/resources/lang/fr-FR/currencies.php @@ -0,0 +1,18 @@ + 'Code', + 'rate' => 'Taux', + 'default' => 'Devise par défaut', + 'decimal_mark' => 'Séparateur de décimale', + 'thousands_separator' => 'Séparateur de milliers', + 'precision' => 'Nombre de décimales', + 'symbol' => [ + 'symbol' => 'Symbole', + 'position' => 'Position du symbole', + 'before' => 'Avant le montant', + 'after' => 'Après le montant', + ] + +]; diff --git a/resources/lang/fr-FR/customers.php b/resources/lang/fr-FR/customers.php new file mode 100755 index 0000000..4f5468b --- /dev/null +++ b/resources/lang/fr-FR/customers.php @@ -0,0 +1,11 @@ + 'Permettre la connexion ?', + 'user_created' => 'Utilisateur créé', + + 'error' => [ + 'email' => 'Cet email est déjà pris.' + ] +]; diff --git a/resources/lang/fr-FR/dashboard.php b/resources/lang/fr-FR/dashboard.php new file mode 100755 index 0000000..f321da8 --- /dev/null +++ b/resources/lang/fr-FR/dashboard.php @@ -0,0 +1,24 @@ + 'Revenu total', + 'receivables' => 'Recevables', + 'open_invoices' => 'Factures ouvertes', + 'overdue_invoices' => 'Factures impayées', + 'total_expenses' => 'Total des dépenses', + 'payables' => 'Exigeables', + 'open_bills' => 'Factures ouvertes', + 'overdue_bills' => 'Factures impayées', + 'total_profit' => 'Bénéfice total', + 'open_profit' => 'Bénéfice ouvert', + 'overdue_profit' => 'Bénéfice impayé', + 'cash_flow' => 'Trésorerie', + 'no_profit_loss' => 'Aucune perte de Profit', + 'incomes_by_category' => 'Revenus par catégorie', + 'expenses_by_category' => 'Dépenses par catégorie', + 'account_balance' => 'Solde du compte', + 'latest_incomes' => 'Dernières revenus', + 'latest_expenses' => 'Dernières dépenses', + +]; diff --git a/resources/lang/fr-FR/demo.php b/resources/lang/fr-FR/demo.php new file mode 100755 index 0000000..1b893b9 --- /dev/null +++ b/resources/lang/fr-FR/demo.php @@ -0,0 +1,16 @@ + 'Espèce', + 'categories_deposit' => 'Déposer', + 'categories_sales' => 'Ventes', + 'currencies_usd' => 'Dollar US', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Livre sterling', + 'currencies_try' => 'Livre turque', + 'taxes_exempt' => 'Exempts de taxe', + 'taxes_normal' => 'Taxe normales', + 'taxes_sales' => 'Taxe de vente', + +]; diff --git a/resources/lang/fr-FR/footer.php b/resources/lang/fr-FR/footer.php new file mode 100755 index 0000000..780b0f6 --- /dev/null +++ b/resources/lang/fr-FR/footer.php @@ -0,0 +1,9 @@ + 'Version', + 'powered' => 'Propulsé par Akaunting', + 'software' => 'Logiciel de comptabilité gratuit', + +]; diff --git a/resources/lang/fr-FR/general.php b/resources/lang/fr-FR/general.php new file mode 100755 index 0000000..109bea4 --- /dev/null +++ b/resources/lang/fr-FR/general.php @@ -0,0 +1,121 @@ + 'Marchandise|Marchandises', + 'incomes' => 'Revenu|Revenus', + 'invoices' => 'Facture|Factures', + 'revenues' => 'Recettes|Chiffre d’affaires', + 'customers' => 'Client|Clients', + 'expenses' => 'Dépense|Dépenses', + 'bills' => 'Facture|Factures', + 'payments' => 'Paiement|Paiements', + 'vendors' => 'Vendeur|Vendeurs', + 'accounts' => 'Compte|Comptes', + 'transfers' => 'Transfert|Transferts', + 'transactions' => 'Transaction|Transactions', + 'reports' => 'Rapport|Rapports', + 'settings' => 'Paramètre|Paramètres', + 'categories' => 'Catégorie|Catégories', + 'currencies' => 'Devise|Devises', + 'tax_rates' => 'Taux d’imposition|Taux d’imposition', + 'users' => 'Utilisateur|Utilisateurs', + 'roles' => 'Rôle|Rôles', + 'permissions' => 'Autorisation|Autorisations', + 'modules' => 'Application|Applications', + 'companies' => 'Entreprise|Entreprises', + 'profits' => 'Bénéfice|Bénéfices', + 'taxes' => 'Taxe|Taxes', + 'logos' => 'Logo|Logos', + 'pictures' => 'Photo|Photos', + 'types' => 'Type|Types', + 'payment_methods' => 'Mode de paiement|Modes de paiement', + 'compares' => 'Revenus vs dépenses|Revenus vs dépenses', + 'notes' => 'Note|Notes', + 'totals' => 'Total|Totaux', + 'languages' => 'Langue|Langues', + 'updates' => 'Mise à jour|Mises à jour', + 'numbers' => 'Numéro|Numéros', + 'statuses' => 'Statut | Statuts', + 'others' => 'Autre|Autres', + + 'dashboard' => 'Tableau de bord', + 'banking' => 'Banque', + 'general' => 'Général', + 'no_records' => 'Aucune donnée.', + 'date' => 'Date', + 'amount' => 'Montant', + 'enabled' => 'Activé', + 'disabled' => 'Désactivé', + 'yes' => 'Oui', + 'no' => 'Non', + 'na' => 'N/A', + 'daily' => 'Quotidien', + 'monthly' => 'Mensuel', + 'quarterly' => 'Trimestriel', + 'yearly' => 'Annuel', + 'add' => 'Ajouter', + 'add_new' => 'Ajouter un nouveau', + 'show' => 'Afficher', + 'edit' => 'Editer', + 'delete' => 'Supprimer', + 'send' => 'Envoyer', + 'download' => 'Télécharger', + 'delete_confirm' => 'Valider la suppression de :name :type ?', + 'name' => 'Nom', + 'email' => 'Email', + 'tax_number' => 'Numéro de taxe', + 'phone' => 'Téléphone', + 'address' => 'Adresse', + 'website' => 'Site web', + 'actions' => 'Actions', + 'description' => 'Description', + 'manage' => 'Gestion', + 'code' => 'Code', + 'alias' => 'Alias', + 'balance' => 'Solde', + 'reference' => 'Référence', + 'attachment' => 'Fichier joint', + 'change' => 'Changer', + 'switch' => 'Changer', + 'color' => 'Couleur', + 'save' => 'Enregistrer', + 'cancel' => 'Annuler', + 'from' => 'De', + 'to' => 'Vers', + 'print' => 'Imprimer', + 'search' => 'Rechercher', + 'search_placeholder' => 'Votre recherche...', + 'filter' => 'Filtre', + 'help' => 'Aide', + 'all' => 'Tous', + 'all_type' => 'Tous :type', + 'upcoming' => 'À venir', + 'created' => 'Créés', + 'id' => 'Identifiant', + 'more_actions' => 'Autres actions', + 'duplicate' => 'Dupliquer', + 'unpaid' => 'Impayé', + 'paid' => 'Payé', + 'overdue' => 'En retard', + 'partially' => 'Partiellement', + 'partially_paid' => 'Partiellement payé', + 'export' => 'Exporter', + 'enable' => 'Activer', + 'disable' => 'Désactiver', + + 'title' => [ + 'new' => 'Nouveau :type', + 'edit' => 'Modifier :type', + ], + + 'form' => [ + 'enter' => 'Entrez :field', + 'select' => [ + 'field' => '- Selectionner :field -', + 'file' => 'Selectionner un fichier', + ], + 'no_file_selected' => 'Aucun fichier sélectionné...', + ], + +]; diff --git a/resources/lang/fr-FR/header.php b/resources/lang/fr-FR/header.php new file mode 100755 index 0000000..84377a7 --- /dev/null +++ b/resources/lang/fr-FR/header.php @@ -0,0 +1,15 @@ + 'Changer la langue', + 'last_login' => 'Dernière connexion :time', + 'notifications' => [ + 'counter' => '{0} Vous n’avez aucune notification|{1} Vous avez :count notification|[2, *] Vous avez :count notifications', + 'overdue_invoices' => '{1} :nombre de factures impayées|[2,*] :nombre de factures impayées', + 'upcoming_bills' => '{1} :nombre de factures à venir|[2,*] :nombre de factures à venir', + 'items_stock' => '{1} :count élément épuisé|[2,*] :count éléments épuisés', + 'view_all' => 'Afficher tout' + ], + +]; diff --git a/resources/lang/fr-FR/import.php b/resources/lang/fr-FR/import.php new file mode 100755 index 0000000..95bf62d --- /dev/null +++ b/resources/lang/fr-FR/import.php @@ -0,0 +1,9 @@ + 'Importation', + 'title' => 'Importer :type', + 'message' => 'Types de fichier autorisés : XLS, XLSX. Veuillez télécharger le modèle de fichier.', + +]; diff --git a/resources/lang/fr-FR/install.php b/resources/lang/fr-FR/install.php new file mode 100755 index 0000000..989aa97 --- /dev/null +++ b/resources/lang/fr-FR/install.php @@ -0,0 +1,44 @@ + 'Suivant', + 'refresh' => 'Actualiser', + + 'steps' => [ + 'requirements' => 'Veuillez contacter votre hébergeur pour régler les problèmes !', + 'language' => 'Etape 1/3 : Choix de la langue', + 'database' => 'Etape 2/3 : Configuration de la base de données', + 'settings' => 'Etape 3/3 : Société et détails de l\'administrateur', + ], + + 'language' => [ + 'select' => 'Choix de la langue', + ], + + 'requirements' => [ + 'enabled' => ':feature doit être activée !', + 'disabled' => ':feature doit être désactivée !', + 'extension' => 'L\'extension :extension doit être installée et chargée !', + 'directory' => ':directory doit être accessible en écriture !', + ], + + 'database' => [ + 'hostname' => 'Nom d\'hôte', + 'username' => 'Nom d\'utilisateur', + 'password' => 'Mot de passe', + 'name' => 'Base de données', + ], + + 'settings' => [ + 'company_name' => 'Nom de l\'entreprise', + 'company_email' => 'Email de l’entreprise', + 'admin_email' => 'E-mail de l\'administrateur', + 'admin_password' => 'Mot de passe de l\'administrateur', + ], + + 'error' => [ + 'connection' => 'Erreur : Impossible de se connecter à la base de données ! S’il vous plaît, assurez-vous que les informations sont correctes.', + ], + +]; diff --git a/resources/lang/fr-FR/invoices.php b/resources/lang/fr-FR/invoices.php new file mode 100755 index 0000000..61ee3af --- /dev/null +++ b/resources/lang/fr-FR/invoices.php @@ -0,0 +1,55 @@ + 'Numéro de facture', + 'invoice_date' => 'Date de facturation', + 'total_price' => 'Prix total', + 'due_date' => 'Date d\'échéance', + 'order_number' => 'Numéro de commande', + 'bill_to' => 'Facture de', + + 'quantity' => 'Quantité', + 'price' => 'Prix', + 'sub_total' => 'Sous-total', + 'discount' => 'Remise', + 'tax_total' => 'Taxe totale', + 'total' => 'Total', + + 'item_name' => 'Nom de marchandise|Noms des marchandises', + + 'show_discount' => ':discount % de remise', + 'add_discount' => 'Ajouter une remise', + 'discount_desc' => 'du sous-total', + + 'payment_due' => 'Paiement dû', + 'paid' => 'Payé', + 'histories' => 'Historiques', + 'payments' => 'Paiements', + 'add_payment' => 'Ajouter un paiement', + 'mark_paid' => 'Marquer comme payée', + 'mark_sent' => 'Marquer comme envoyée', + 'download_pdf' => 'Télécharger en PDF', + 'send_mail' => 'Envoyer un Email', + + 'status' => [ + 'draft' => 'Brouillon', + 'sent' => 'Envoyé', + 'viewed' => 'Vu', + 'approved' => 'Approuvé', + 'partial' => 'Partiel', + 'paid' => 'Payé', + ], + + 'messages' => [ + 'email_sent' => 'La facture a été envoyé avec succès !', + 'marked_sent' => 'Facture marquée comme envoyée avec succès !', + 'email_required' => 'Ce client ne possède pas d\'email !', + ], + + 'notification' => [ + 'message' => 'Vous recevez cet email car une facture d\'un montant de :amount pour le client :customer arrive à échéance.', + 'button' => 'Payer maintenant', + ], + +]; diff --git a/resources/lang/fr-FR/items.php b/resources/lang/fr-FR/items.php new file mode 100755 index 0000000..f4801ba --- /dev/null +++ b/resources/lang/fr-FR/items.php @@ -0,0 +1,15 @@ + 'Quantité|Quantités', + 'sales_price' => 'Prix de vente', + 'purchase_price' => 'Prix d\'achat', + 'sku' => 'Référence (SKU)', + + 'notification' => [ + 'message' => 'Vous recevez cet e-mail car :name est en rupture de stock.', + 'button' => 'Voir Maintenant', + ], + +]; diff --git a/resources/lang/fr-FR/messages.php b/resources/lang/fr-FR/messages.php new file mode 100755 index 0000000..386a996 --- /dev/null +++ b/resources/lang/fr-FR/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => ':type ajouté !', + 'updated' => ':type mise à jour !', + 'deleted' => ':type supprimé !', + 'duplicated' => ':type dupliqué !', + 'imported' => ':type importé !', + 'enabled' => ':type activé !', + 'disabled' => ':type désactivé !', + ], + 'error' => [ + 'over_payment' => 'Erreur : le paiement n\'a pas été ajouté ! Le montant est supérieur au total.', + 'not_user_company' => 'Erreur : Vous n’êtes pas autorisé à gérer cette société !', + 'customer' => 'Erreur : Utilisateur non créé ! :name utilise déjà cette adresse email.', + 'no_file' => 'Erreur : Aucun fichier sélectionné !', + 'last_category' => 'Erreur : impossible de supprimer la dernière catégorie de type :type !', + 'invalid_token' => 'Erreur : le token est invalide !', + 'import_column' => 'Erreur : :message Nom de la feuille : :sheet. Numéro de ligne : :line.', + 'import_sheet' => 'Erreur : Le nom de la feuille n\'est pas valide. Veuillez télécharger le modèle de fichier.', + ], + 'warning' => [ + 'deleted' => 'Avertissement : Vous n’êtes pas autorisé à supprimer :name parce qu’il est associé à :texte.', + 'disabled' => 'Avertissement : Vous n’êtes pas autorisé à désactiver :name parce qu’il est associé à :texte.', + ], + +]; diff --git a/resources/lang/fr-FR/modules.php b/resources/lang/fr-FR/modules.php new file mode 100755 index 0000000..be7da57 --- /dev/null +++ b/resources/lang/fr-FR/modules.php @@ -0,0 +1,58 @@ + 'Jeton de l\'API', + 'api_token' => 'Jeton', + 'my_apps' => 'Mes applications', + 'top_paid' => 'Top payant', + 'new' => 'Nouveau', + 'top_free' => 'Top gratuit', + 'free' => 'GRATUIT', + 'search' => 'Rechercher', + 'install' => 'Installation', + 'buy_now' => 'Acheter maintenant', + 'token_link' => 'Cliquez ici pour obtenir votre jeton de l\'API.', + 'no_apps' => 'Il n’y a pas encore d\'application dans cette catégorie.', + 'developer' => 'Vous êtes développeur ? ici vous pouvez apprendre à créer une application et commencer à la vendre  !', + + 'about' => 'A propos', + + 'added' => 'Ajouté', + 'updated' => 'Mis à jour', + 'compatibility' => 'Compatibilité', + + 'installed' => ':module installé', + 'uninstalled' => ':module désinstallé', + //'updated' => ':module updated', + 'enabled' => ':module activé', + 'disabled' => ':module désactivé', + + 'tab' => [ + 'installation' => 'Installation', + 'faq' => 'FAQ', + 'changelog' => 'Historique des modifications', + ], + + 'installation' => [ + 'header' => 'Installation d\'une application', + 'download' => 'Téléchargement du :module.', + 'unzip' => 'Extraction des fichiers :module.', + 'install' => 'Installation des fichiers du module :module.', + ], + + 'badge' => [ + 'installed' => 'Installées', + ], + + 'button' => [ + 'uninstall' => 'Désinstaller', + 'disable' => 'Désactiver', + 'enable' => 'Activer', + ], + + 'my' => [ + 'purchased' => 'Achetées', + 'installed' => 'Installées', + ], +]; diff --git a/resources/lang/fr-FR/notifications.php b/resources/lang/fr-FR/notifications.php new file mode 100755 index 0000000..395e3af --- /dev/null +++ b/resources/lang/fr-FR/notifications.php @@ -0,0 +1,10 @@ + 'Oups !', + 'hello' => 'Bonjour !', + 'salutation' => 'Cordialement,
    :company_name', + 'subcopy' => 'Si vous n\'arrivez pas à cliquer sur le bouton ":text", veuillez copier et coller l\'URL ci-dessous dans votre navigateur web : [:url](:url)', + +]; diff --git a/resources/lang/fr-FR/pagination.php b/resources/lang/fr-FR/pagination.php new file mode 100755 index 0000000..7c081a1 --- /dev/null +++ b/resources/lang/fr-FR/pagination.php @@ -0,0 +1,9 @@ + '« Précédent', + 'next' => 'Suivant »', + 'showing' => 'Affichage de :first à :last sur :total :type', + +]; diff --git a/resources/lang/fr-FR/passwords.php b/resources/lang/fr-FR/passwords.php new file mode 100755 index 0000000..df7f8cc --- /dev/null +++ b/resources/lang/fr-FR/passwords.php @@ -0,0 +1,22 @@ + 'Les mots de passe doivent contenir au moins six caractères et correspondre à la confirmation.', + 'reset' => 'Le mot de passe principal a été réinitialisé !', + 'sent' => 'Nous avons envoyé par courrier électronique votre lien de réinitialisation de mot de passe !', + 'token' => 'Ce jeton de réinitialisation de mot de passe n’est pas valide.', + 'user' => "Nous ne pouvons pas trouver un utilisateur avec cette adresse email.", + +]; diff --git a/resources/lang/fr-FR/recurring.php b/resources/lang/fr-FR/recurring.php new file mode 100755 index 0000000..d969db0 --- /dev/null +++ b/resources/lang/fr-FR/recurring.php @@ -0,0 +1,20 @@ + 'Récurrent', + 'every' => 'Tous les', + 'period' => 'Période', + 'times' => 'Fois', + 'daily' => 'Quotidien', + 'weekly' => 'Hebdomadaire', + 'monthly' => 'Mensuel', + 'yearly' => 'Annuel', + 'custom' => 'Personnalisé', + 'days' => 'Jour(s)', + 'weeks' => 'Semaine(s)', + 'months' => 'Mois', + 'years' => 'Année(s)', + 'message' => 'Il s\'agit d\'un :type récurrent et le prochain :type sera automatiquement généré le :date', + +]; diff --git a/resources/lang/fr-FR/reports.php b/resources/lang/fr-FR/reports.php new file mode 100755 index 0000000..94614d4 --- /dev/null +++ b/resources/lang/fr-FR/reports.php @@ -0,0 +1,30 @@ + 'Cette année', + 'previous_year' => 'Année précédente', + 'this_quarter' => 'Ce trimestre', + 'previous_quarter' => 'Trimestre précédent', + 'last_12_months' => '12 derniers mois', + 'profit_loss' => 'Gains & pertes', + 'gross_profit' => 'Bénéfices brut', + 'net_profit' => 'Bénéfices net', + 'total_expenses' => 'Total des dépenses', + 'net' => 'NET', + + 'summary' => [ + 'income' => 'Sommaire des revenus', + 'expense' => 'Sommaire des dépenses', + 'income_expense' => 'Revenus vs dépenses', + 'tax' => 'Résumé des taxes', + ], + + 'quarter' => [ + '1' => 'Jan-Mar', + '2' => 'Avr-Jui', + '3' => 'Jui-Sep', + '4' => 'Oct-Déc', + ], + +]; diff --git a/resources/lang/fr-FR/settings.php b/resources/lang/fr-FR/settings.php new file mode 100755 index 0000000..47c2c83 --- /dev/null +++ b/resources/lang/fr-FR/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Nom', + 'email' => 'Email', + 'phone' => 'Téléphone', + 'address' => 'Adresse', + 'logo' => 'Logo', + ], + 'localisation' => [ + 'tab' => 'Localisation', + 'date' => [ + 'format' => 'Format de date', + 'separator' => 'Séparateur de date', + 'dash' => 'Tiret (-)', + 'dot' => 'Point (.)', + 'comma' => 'Virgule (,)', + 'slash' => 'Slash (/)', + 'space' => 'Espace ( )', + ], + 'timezone' => 'Fuseau horaire', + 'percent' => [ + 'title' => 'Position du signe "pourcentage" (%)', + 'before' => 'Avant le nombre', + 'after' => 'Après le nombre', + ], + ], + 'invoice' => [ + 'tab' => 'Facture', + 'prefix' => 'Préfixe de numérotation', + 'digit' => 'Nombre de chiffres', + 'next' => 'Numéro suivant', + 'logo' => 'Logo', + ], + 'default' => [ + 'tab' => 'Par défaut', + 'account' => 'Compte par défaut', + 'currency' => 'Devise par défaut', + 'tax' => 'Taux d’imposition par défaut', + 'payment' => 'Mode de paiement par défaut', + 'language' => 'Langue par défaut', + ], + 'email' => [ + 'protocol' => 'Protocole', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'Hôte SMTP', + 'port' => 'Port SMTP', + 'username' => 'Utilisateur SMTP', + 'password' => 'Mot de passe SMTP', + 'encryption' => 'Sécurité SMTP', + 'none' => 'Aucun', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Chemin d’accès de sendmail', + 'log' => 'Journal des Emails', + ], + 'scheduling' => [ + 'tab' => 'Planification', + 'send_invoice' => 'Envoyer un rappel de facture', + 'invoice_days' => 'Envoyer après les jours d\'échéance', + 'send_bill' => 'Envoyer rappel de facture', + 'bill_days' => 'Envoyer avant les jours d\'échéance', + 'cron_command' => 'Commande Cron', + 'schedule_time' => 'Heure de fonctionnement', + ], + 'appearance' => [ + 'tab' => 'Apparence', + 'theme' => 'Thème', + 'light' => 'Clair', + 'dark' => 'Foncé', + 'list_limit' => 'Résultats par page', + 'use_gravatar' => 'Utilisez Gravatar', + ], + 'system' => [ + 'tab' => 'Système', + 'session' => [ + 'lifetime' => 'Durée de vie de session (Minutes)', + 'handler' => 'Gestionnaire de session', + 'file' => 'Fichier', + 'database' => 'Base de données', + ], + 'file_size' => 'Taille de fichier maximale (MB)', + 'file_types' => 'Types de fichier autorisés', + ], + +]; diff --git a/resources/lang/fr-FR/taxes.php b/resources/lang/fr-FR/taxes.php new file mode 100755 index 0000000..757d017 --- /dev/null +++ b/resources/lang/fr-FR/taxes.php @@ -0,0 +1,8 @@ + 'Taux', + 'rate_percent' => 'Taux (%)', + +]; diff --git a/resources/lang/fr-FR/transfers.php b/resources/lang/fr-FR/transfers.php new file mode 100755 index 0000000..acef327 --- /dev/null +++ b/resources/lang/fr-FR/transfers.php @@ -0,0 +1,12 @@ + 'Du compte', + 'to_account' => 'Vers le compte', + + 'messages' => [ + 'delete' => ':from vers :to (:amount)', + ], + +]; diff --git a/resources/lang/fr-FR/updates.php b/resources/lang/fr-FR/updates.php new file mode 100755 index 0000000..0492444 --- /dev/null +++ b/resources/lang/fr-FR/updates.php @@ -0,0 +1,15 @@ + 'Version installée', + 'latest_version' => 'Dernière Version', + 'update' => 'Mise à jour de Akaunting à la version :version', + 'changelog' => 'Notes de version', + 'check' => 'Vérifier', + 'new_core' => 'Une nouvelle version de Akaunting est disponible.', + 'latest_core' => 'Félicitations ! Vous avez la dernière version de Akaunting. Les prochaines mises à jour de sécurité s’appliqueront automatiquement.', + 'success' => 'La mise à jour a été réalisée avec succès.', + 'error' => 'La mise à jour a échoué, veuillez essayer à nouveau.', + +]; diff --git a/resources/lang/fr-FR/validation.php b/resources/lang/fr-FR/validation.php new file mode 100755 index 0000000..6d61908 --- /dev/null +++ b/resources/lang/fr-FR/validation.php @@ -0,0 +1,120 @@ + ':attribute doit être accepté.', + 'active_url' => ':attribute n\'est pas une URL valide.', + 'after' => ':attribute doit être une date après :date.', + 'after_or_equal' => ':attribute doit être une date après ou égale à :date.', + 'alpha' => ':attribute ne peut contenir que des lettres.', + 'alpha_dash' => ':attribute ne peut contenir que des lettres, des nombres, et des tirets.', + 'alpha_num' => ':attribute ne peut contenir que des caractères alphanumériques.', + 'array' => ':attribute doit être un tableau.', + 'before' => ':attribute doit être une date avant :date.', + 'before_or_equal' => ':attribute doit être une date après ou égale à :date.', + 'between' => [ + 'numeric' => ':attribute doit être entre :min et :max.', + 'file' => ':attribute doit être entre :min et :max kilo-octets.', + 'string' => ':attribute doit contenir entre :min et :max caractères.', + 'array' => ':attribute doit contenir entre :min et :max chiffres.', + ], + 'boolean' => 'Le champ :attribute doit être vrai ou faux.', + 'confirmed' => 'La confirmation du ":attribute" ne concordent pas.', + 'date' => ':attribute n\'est pas une date valide.', + 'date_format' => ':attribute ne respecte pas le format :format.', + 'different' => ':attribute et :other doivent être différents.', + 'digits' => ':attribute doit contenir :digits chiffres.', + 'digits_between' => ':attribute doit contenir entre :min et :max chiffres.', + 'dimensions' => ':attribut possède des dimensions d\'image non valide.', + 'distinct' => ':champ a une valeur dupliquée.', + 'email' => ':attribute doit être une adresse email valide.', + 'exists' => ':attribute selectionné est invalide.', + 'file' => ':attribut doit être un fichier.', + 'filled' => ':champ d’attribut doit avoir une valeur.', + 'image' => ':attribute doit être une image.', + 'in' => ':attribute est invalide.', + 'in_array' => 'Le champ :attribute n’existe pas dans :other.', + 'integer' => ':attribute doit être un nombre entier.', + 'ip' => ':attribute doit être une adresse IP valide.', + 'json' => ':attribute doit respecté le format JSON.', + 'max' => [ + 'numeric' => ':attribute ne peut pas être plus grand que :max.', + 'file' => ':attribute ne doit pas dépasser :max kilo-octets.', + 'string' => ':attribute ne doit pas faire plus de :max caractères.', + 'array' => ':attribute ne doit pas dépasser :max marchandises.', + ], + 'mimes' => 'Le fichier :attribute doit être de type: :values.', + 'mimetypes' => 'Le fichier :attribute doit être de type: :values.', + 'min' => [ + 'numeric' => ':attribute doit être au moins :min.', + 'file' => ':attribute doit faire au moins :min kilo-octets.', + 'string' => ':attribute doit faire au moins :min caractères.', + 'array' => ':attribute doit avoir au moins :min marchandises.', + ], + 'not_in' => ':attribute est invalide.', + 'numeric' => ':attribute doit être un nombre.', + 'present' => 'Le champ :attribute doit être présent.', + 'regex' => 'Le format de :attribute est invalide.', + 'required' => 'Le champ :attribute est nécessaire.', + 'required_if' => 'Le champ :attribute est nécessaire quand :other vaut :value.', + 'required_unless' => 'Le champ :attribute est nécessaire sauf si :other se trouve dans :values.', + 'required_with' => 'Le champ :attribute est nécessaire quand :values est présent.', + 'required_with_all' => 'Le champ :attribute est nécessaire quand :values est présent.', + 'required_without' => 'Le champ :attribute est nécessaire quand :values n\'est pas présent.', + 'required_without_all' => 'Le champ :attribute est nécessaire quand aucun des :values sont présent.', + 'same' => ':attribute et :other doivent correspondre.', + 'size' => [ + 'numeric' => ':attribute doit faire :size.', + 'file' => ':attribute doit faire :size kilo-octets.', + 'string' => ':attribute doit faire :size caractères.', + 'array' => ':attribut doit contenir :size marchandises.', + ], + 'string' => ':attribute doit être une chaîne de caractères.', + 'timezone' => ':attribute doit être une zone valide.', + 'unique' => ':attribute est déjà pris.', + 'uploaded' => ':attribut n’a pas pu être envoyer.', + 'url' => 'Le format de :attribute est invalide.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'Un message spécifique sera affiché si le paramètre \'Utiliser message spécifique\' est implémenté pour le champ \'Message hors-ligne\'', + ], + 'invalid_currency' => 'Le code de :attribute est invalide.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/he-IL/accounts.php b/resources/lang/he-IL/accounts.php new file mode 100755 index 0000000..e21b0b6 --- /dev/null +++ b/resources/lang/he-IL/accounts.php @@ -0,0 +1,14 @@ + 'שם החשבון', + 'number' => 'מספר', + 'opening_balance' => 'ליתרת הפתיחה', + 'current_balance' => 'היתרה הנוכחית', + 'bank_name' => 'שם הבנק', + 'bank_phone' => 'טלפון הבנק', + 'bank_address' => 'כתובת הבנק', + 'default_account' => 'חשבון ברירת מחדל', + +]; diff --git a/resources/lang/he-IL/auth.php b/resources/lang/he-IL/auth.php new file mode 100755 index 0000000..84251e2 --- /dev/null +++ b/resources/lang/he-IL/auth.php @@ -0,0 +1,39 @@ + 'פרופיל', + 'logout' => 'יציאה', + 'login' => 'התחברות', + 'login_to' => 'התחבר כדי להתחיל את ה-session', + 'remember_me' => 'זכור אותי', + 'forgot_password' => 'שכחתי את הסיסמה שלי', + 'reset_password' => 'איפוס סיסמה', + 'enter_email' => 'הזן את כתובת הדוא"ל שלך', + 'current_email' => 'דוא ל הנוכחי', + 'reset' => 'איפוס', + 'never' => 'לעולם לא', + + 'password' => [ + 'current' => 'סיסמה', + 'current_confirm' => 'אימות סיסמה', + 'new' => 'סיסמה חדשה', + 'new_confirm' => 'אימות סיסמה חדשה', + ], + + 'error' => [ + 'self_delete' => 'שגיאה: לא ניתן למחוק את עצמך!', + 'no_company' => 'שגיאה: אין חברה המוקצה לחשבון שלך.. אנא, פנה אל מנהל המערכת.', + ], + + 'failed' => 'פרטים אלה אינם תואמים את רישומינו.', + 'disabled' => 'חשבון זה אינו זמין. אנא, פנה אל מנהל המערכת.', + 'throttle' => 'ניסיונות כניסה רבים מדי. אנא נסו שוב בעוד :seconds שניות.', + + 'notification' => [ + 'message_1' => 'אתה מקבל את האימייל הזה כי קיבלנו בקשת איפוס סיסמה עבור החשבון שלך.', + 'message_2' => 'אם לא אתה ביקשת את איפוס הסיסמה, לא נדרשת פעולה נוספת.', + 'button' => 'איפוס סיסמה', + ], + +]; diff --git a/resources/lang/he-IL/bills.php b/resources/lang/he-IL/bills.php new file mode 100755 index 0000000..2c84c14 --- /dev/null +++ b/resources/lang/he-IL/bills.php @@ -0,0 +1,46 @@ + 'מספר החשבון', + 'bill_date' => 'תאריך החשבון', + 'total_price' => 'סה"כ מחיר', + 'due_date' => 'תאריך יעד', + 'order_number' => 'מספר הזמנה', + 'bill_from' => 'חשבון מ', + + 'quantity' => 'כמות', + 'price' => 'מחיר', + 'sub_total' => 'סכום ביניים', + 'discount' => 'הנחה', + 'tax_total' => 'סה כ מס', + 'total' => 'סה"כ', + + 'item_name' => 'פריט שם | שמות הפריטים', + + 'show_discount' => ':discount % הנחה', + 'add_discount' => 'הוסף הנחה', + 'discount_desc' => 'של ביניים', + + 'payment_due' => 'תשלום בשל', + 'amount_due' => 'סכום לחיוב', + 'paid' => 'שולם', + 'histories' => 'היסטוריה', + 'payments' => 'תשלומים', + 'add_payment' => 'הוספת תשלום', + 'mark_received' => 'סימון תקבול', + 'download_pdf' => 'הורדת PDF', + 'send_mail' => 'שלח דואר אלקטרוני', + + 'status' => [ + 'draft' => 'טיוטה', + 'received' => 'התקבל', + 'partial' => 'חלקי', + 'paid' => 'שולם', + ], + + 'messages' => [ + 'received' => 'חשבונות שסומנו התקבלו בהצלחה!', + ], + +]; diff --git a/resources/lang/he-IL/companies.php b/resources/lang/he-IL/companies.php new file mode 100755 index 0000000..cceda5a --- /dev/null +++ b/resources/lang/he-IL/companies.php @@ -0,0 +1,13 @@ + 'שם מתחם', + 'logo' => 'לוגו', + 'manage' => 'ניהול חברות', + 'all' => 'כל החברות', + 'error' => [ + 'delete_active' => 'שגיאה: יכול לא למחוק את החברה פעילה, בבקשה לשנות את זה קודם!', + ], + +]; diff --git a/resources/lang/he-IL/currencies.php b/resources/lang/he-IL/currencies.php new file mode 100755 index 0000000..73d5eca --- /dev/null +++ b/resources/lang/he-IL/currencies.php @@ -0,0 +1,18 @@ + 'קוד', + 'rate' => 'דירוג', + 'default' => 'מטבע ברירת מחדל', + 'decimal_mark' => 'סימן עשרוני', + 'thousands_separator' => 'מפריד אלפים', + 'precision' => 'דיוק', + 'symbol' => [ + 'symbol' => 'סמל', + 'position' => 'מיקום סמל', + 'before' => 'לפני הכמות', + 'after' => 'אחרי הכמות', + ] + +]; diff --git a/resources/lang/he-IL/customers.php b/resources/lang/he-IL/customers.php new file mode 100755 index 0000000..a002440 --- /dev/null +++ b/resources/lang/he-IL/customers.php @@ -0,0 +1,11 @@ + 'אפשר התחברות?', + 'user_created' => 'משתמש נוצר', + + 'error' => [ + 'email' => 'כתובת הדואר אלקטרוני כבר תפוסה.' + ] +]; diff --git a/resources/lang/he-IL/dashboard.php b/resources/lang/he-IL/dashboard.php new file mode 100755 index 0000000..c722385 --- /dev/null +++ b/resources/lang/he-IL/dashboard.php @@ -0,0 +1,24 @@ + 'סה"כ הכנסות', + 'receivables' => 'חשבונות חייבים', + 'open_invoices' => 'חשבוניות פתוחות', + 'overdue_invoices' => 'חשבוניות שפרעונן חלף', + 'total_expenses' => 'סך כל ההוצאות', + 'payables' => 'לפקודת', + 'open_bills' => 'חשבונות פתוחים', + 'overdue_bills' => 'חשבונות באיחור תשלום', + 'total_profit' => 'הרווח הכולל', + 'open_profit' => 'רווח פתוח', + 'overdue_profit' => 'רווח שפרעונו חלף', + 'cash_flow' => 'תזרים מזומנים', + 'no_profit_loss' => 'אין רווח הפסד', + 'incomes_by_category' => 'הכנסות לפי קטגוריה', + 'expenses_by_category' => 'הוצאות לפי קטגוריה', + 'account_balance' => 'יתרת חשבון', + 'latest_incomes' => 'הכנסות אחרונות', + 'latest_expenses' => 'הוצאות אחרונות', + +]; diff --git a/resources/lang/he-IL/demo.php b/resources/lang/he-IL/demo.php new file mode 100755 index 0000000..554dc26 --- /dev/null +++ b/resources/lang/he-IL/demo.php @@ -0,0 +1,16 @@ + 'מזומנים', + 'categories_deposit' => 'פיקדון', + 'categories_sales' => 'מכירות', + 'currencies_usd' => 'דולר אמריקאי', + 'currencies_eur' => 'יורו', + 'currencies_gbp' => 'לירה שטרלינג', + 'currencies_try' => 'לירה טורקית', + 'taxes_exempt' => 'פטור ממס', + 'taxes_normal' => 'מס רגיל', + 'taxes_sales' => 'מיסים מכירות', + +]; diff --git a/resources/lang/he-IL/footer.php b/resources/lang/he-IL/footer.php new file mode 100755 index 0000000..ef6f08d --- /dev/null +++ b/resources/lang/he-IL/footer.php @@ -0,0 +1,9 @@ + 'גירסה', + 'powered' => 'מופעל על ידי Akaunting', + 'software' => 'תוכנת הנהלת חשבונות חינם', + +]; diff --git a/resources/lang/he-IL/general.php b/resources/lang/he-IL/general.php new file mode 100755 index 0000000..232bfdb --- /dev/null +++ b/resources/lang/he-IL/general.php @@ -0,0 +1,121 @@ + 'פריט | פריטים', + 'incomes' => 'הכנסה | ההכנסות', + 'invoices' => 'חשבונית | חשבוניות', + 'revenues' => 'הכנסה | הכנסות', + 'customers' => 'לקוח | לקוחות', + 'expenses' => 'הוצאה | הוצאות', + 'bills' => 'חשבון | חשבונות', + 'payments' => 'תשלום | תשלומים', + 'vendors' => 'ספק | ספקים', + 'accounts' => 'חשבון | חשבונות', + 'transfers' => 'העברה | העברות', + 'transactions' => 'תנועה | תנועות', + 'reports' => 'דוח | דוחות', + 'settings' => 'הגדרה | הגדרות', + 'categories' => 'קטגוריה | קטגוריות', + 'currencies' => 'מטבע | מטבעות', + 'tax_rates' => 'שיעור מס | שיעורי מס', + 'users' => 'משתמש | משתמשים', + 'roles' => 'תפקיד | תפקידים', + 'permissions' => 'הרשאה | הרשאות', + 'modules' => 'יישום | יישומים', + 'companies' => 'חברה | חברות', + 'profits' => 'רווח | רווחים', + 'taxes' => 'מס | מיסים', + 'logos' => 'לוגו | לוגואים', + 'pictures' => 'תמונה | תמונות', + 'types' => 'סוג | סוגים', + 'payment_methods' => 'שיטת התשלום | שיטות תשלום', + 'compares' => 'הכנסה לעומת הוצאה | הכנסות לעומת הוצאות', + 'notes' => 'הערה | הערות', + 'totals' => 'סיכום | סיכומים', + 'languages' => 'שפה | שפות', + 'updates' => 'עדכון | עדכונים', + 'numbers' => 'מספר | מספרים', + 'statuses' => 'מצב | מצבים', + 'others' => 'אחר | אחרים', + + 'dashboard' => 'לוח מחוונים', + 'banking' => 'בנקאות', + 'general' => 'כללי', + 'no_records' => 'אין רשומות.', + 'date' => 'תאריך', + 'amount' => 'כמות', + 'enabled' => 'מאופשר', + 'disabled' => 'מושבת', + 'yes' => 'כן', + 'no' => 'לא', + 'na' => 'לא זמין', + 'daily' => 'יומי', + 'monthly' => 'חודשי', + 'quarterly' => 'רבעוני', + 'yearly' => 'שנתי', + 'add' => 'הוסף', + 'add_new' => 'הוסף חדש', + 'show' => 'הצג', + 'edit' => 'ערוך', + 'delete' => 'מחק', + 'send' => 'שליחה', + 'download' => 'הורדה', + 'delete_confirm' => 'האם לאשר מחיקה :name :type?', + 'name' => 'שם', + 'email' => 'דואר אלקטרוני', + 'tax_number' => 'מספר מס', + 'phone' => 'טלפון', + 'address' => 'כתובת', + 'website' => 'אתר אינטרנט', + 'actions' => 'פעולות', + 'description' => 'תיאור', + 'manage' => 'ניהול', + 'code' => 'קוד', + 'alias' => 'שם חליפי', + 'balance' => 'מאזן', + 'reference' => 'רפרנס', + 'attachment' => 'קובץ מצורף', + 'change' => 'שנה', + 'switch' => 'מתג', + 'color' => 'צבע', + 'save' => 'שמור', + 'cancel' => 'ביטול', + 'from' => 'מאת', + 'to' => 'אל', + 'print' => 'הדפסה', + 'search' => 'חיפוש', + 'search_placeholder' => 'הקלד לחיפוש...', + 'filter' => 'סינון', + 'help' => 'עזרה', + 'all' => 'הכל', + 'all_type' => 'הכל :type', + 'upcoming' => 'בקרוב', + 'created' => 'נוצר', + 'id' => 'מזהה', + 'more_actions' => 'פעולות נוספות', + 'duplicate' => 'שכפל', + 'unpaid' => 'לא שולמו', + 'paid' => 'שולם', + 'overdue' => 'באיחור', + 'partially' => 'חלקי', + 'partially_paid' => 'תשלום חלקי', + 'export' => 'Export', + 'enable' => 'Enable', + 'disable' => 'Disable', + + 'title' => [ + 'new' => ':type חדש', + 'edit' => 'עריכת :type', + ], + + 'form' => [ + 'enter' => 'הכנס :field', + 'select' => [ + 'field' => '- בחר :field -', + 'file' => 'בחר קובץ', + ], + 'no_file_selected' => 'לא נבחר קובץ...', + ], + +]; diff --git a/resources/lang/he-IL/header.php b/resources/lang/he-IL/header.php new file mode 100755 index 0000000..bf7d7c0 --- /dev/null +++ b/resources/lang/he-IL/header.php @@ -0,0 +1,15 @@ + 'שינוי שפה', + 'last_login' => 'כניסה אחרונה :time', + 'notifications' => [ + 'counter' => '{0} אין התראות חדשות|{1} יש :count התראות|[2,*] יש :count התראות', + 'overdue_invoices' => '{1} :count חשבונית באיחור|[2,*] :count חשבוניות באיחור', + 'upcoming_bills' => '{1} :count חשבונית קרובה|[2,*] :count חשבוניות קרובות', + 'items_stock' => '{1} :count פריט אזל מהמלאי|[2,*] :count פריטים אזלו מהמלאי', + 'view_all' => 'הצג הכל' + ], + +]; diff --git a/resources/lang/he-IL/import.php b/resources/lang/he-IL/import.php new file mode 100755 index 0000000..2a578e2 --- /dev/null +++ b/resources/lang/he-IL/import.php @@ -0,0 +1,9 @@ + 'ייבוא', + 'title' => 'ייבוא :type', + 'message' => 'Allowed file types: XLS, XLSX. Please, download the sample file.', + +]; diff --git a/resources/lang/he-IL/install.php b/resources/lang/he-IL/install.php new file mode 100755 index 0000000..078b957 --- /dev/null +++ b/resources/lang/he-IL/install.php @@ -0,0 +1,44 @@ + 'הבא', + 'refresh' => 'רענן', + + 'steps' => [ + 'requirements' => 'בבקשה, בקש מספק האחסון שלך לתקן את השגיאות!', + 'language' => 'שלב 1/3: בחירת שפה', + 'database' => 'שלב 2/3: הגדרות מסד נתונים', + 'settings' => 'שלב 3/3: פרטי החברה והמנהל', + ], + + 'language' => [ + 'select' => 'בחירת שפה', + ], + + 'requirements' => [ + 'enabled' => ':feature צריך להיות פעיל!', + 'disabled' => ':feature צריך להיות כבוי!', + 'extension' => ':extension extension needs to be installed and loaded!', + 'directory' => ':directory צריכה להיות writable!', + ], + + 'database' => [ + 'hostname' => 'שם מארח', + 'username' => 'שם משתמש', + 'password' => 'סיסמה', + 'name' => 'בסיס נתונים', + ], + + 'settings' => [ + 'company_name' => 'שם החברה', + 'company_email' => 'כתובת הדואר האלקטרוני של החברה', + 'admin_email' => 'דוא"ל מנהל', + 'admin_password' => 'סיסמת מנהל מערכת', + ], + + 'error' => [ + 'connection' => 'שגיאה: לא היתה אפשרות להתחבר למסד הנתונים! בבקשה, ודא כי הפרטים נכונים.', + ], + +]; diff --git a/resources/lang/he-IL/invoices.php b/resources/lang/he-IL/invoices.php new file mode 100755 index 0000000..4137253 --- /dev/null +++ b/resources/lang/he-IL/invoices.php @@ -0,0 +1,55 @@ + 'מספר חשבונית', + 'invoice_date' => 'תאריך חשבונית', + 'total_price' => 'סה"כ מחיר', + 'due_date' => 'תאריך', + 'order_number' => 'מספר הזמנה', + 'bill_to' => 'חשבון עבור', + + 'quantity' => 'כמות', + 'price' => 'מחיר', + 'sub_total' => 'סכום ביניים', + 'discount' => 'הנחה', + 'tax_total' => 'סה"כ מס', + 'total' => 'סה"כ', + + 'item_name' => 'פריט שם | שמות הפריטים', + + 'show_discount' => ':discount % הנחה', + 'add_discount' => 'הוסף הנחה', + 'discount_desc' => 'של ביניים', + + 'payment_due' => 'תשלום בשל', + 'paid' => 'שולם', + 'histories' => 'היסטוריה', + 'payments' => 'תשלומים', + 'add_payment' => 'הוספת תשלום', + 'mark_paid' => 'סימון תקבול', + 'mark_sent' => 'סמן כנשלח', + 'download_pdf' => 'הורדת PDF', + 'send_mail' => 'שלח דואר אלקטרוני', + + 'status' => [ + 'draft' => 'טיוטה', + 'sent' => 'נשלח', + 'viewed' => 'נצפה', + 'approved' => 'אושר', + 'partial' => 'חלקי', + 'paid' => 'שולם', + ], + + 'messages' => [ + 'email_sent' => 'החשבונית נשלחה בהצלחה באמצעות הדואר האלקטרוני!', + 'marked_sent' => 'חשבונית סומנה שנשלחה בהצלחה!', + 'email_required' => 'אין דואר אלקטרוני מעודכן ללקוח זה!', + ], + + 'notification' => [ + 'message' => 'אתה מקבל את הודעת האימייל הזו מפני שקיימות :amount חשבוניות חדשות עבור הלקוח :customer.', + 'button' => 'שלם עכשיו', + ], + +]; diff --git a/resources/lang/he-IL/items.php b/resources/lang/he-IL/items.php new file mode 100755 index 0000000..75cbf69 --- /dev/null +++ b/resources/lang/he-IL/items.php @@ -0,0 +1,15 @@ + 'כמות | כמויות', + 'sales_price' => 'מחיר מבצע', + 'purchase_price' => 'מחיר רכישה', + 'sku' => 'מספר מזהה', + + 'notification' => [ + 'message' => 'אתה מקבל את האימייל הזה כי :name אזל מהמלאי.', + 'button' => 'הצג עכשיו', + ], + +]; diff --git a/resources/lang/he-IL/messages.php b/resources/lang/he-IL/messages.php new file mode 100755 index 0000000..4200b0b --- /dev/null +++ b/resources/lang/he-IL/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => ':type נוסף!', + 'updated' => ':type עודכן!', + 'deleted' => ':type נמחק!', + 'duplicated' => ':type שוכפל!', + 'imported' => ':type יובא!', + 'enabled' => ':type enabled!', + 'disabled' => ':type disabled!', + ], + 'error' => [ + 'over_payment' => 'שגיאה: התשלום לא הוסף! הסכום עובר את הסכום הכולל.', + 'not_user_company' => 'שגיאה: אינך מורשה לנהל החברה זאת!', + 'customer' => 'שגיאה: המשתמש לא נוצר! :name כבר משתמש בכתוב הזאת.', + 'no_file' => 'שגיאה: אין קובץ שנבחר!', + 'last_category' => 'שגיאה: לא ניתן למחוק האחרונים :type קטגוריה!', + 'invalid_token' => 'שגיאה: ה-token שהוזן אינו חוקי!', + 'import_column' => 'שגיאה:: שם הגיליון ההודעה:: גיליון. שורה מספר:: שורה.', + 'import_sheet' => 'שגיאה: שם הגיליון אינו חוקי. יש לבדוק את הקובץ לדוגמה.', + ], + 'warning' => [ + 'deleted' => 'אזהרה: אסור לך למחוק :name כי יש לו :text מקושר.', + 'disabled' => 'אזהרה: אינך מורשה לכבות :name כי יש לו :text מקושר.', + ], + +]; diff --git a/resources/lang/he-IL/modules.php b/resources/lang/he-IL/modules.php new file mode 100755 index 0000000..ee1188c --- /dev/null +++ b/resources/lang/he-IL/modules.php @@ -0,0 +1,58 @@ + 'אסימון API', + 'api_token' => 'אסימון', + 'my_apps' => 'My Apps', + 'top_paid' => 'תשלומים מובילים', + 'new' => 'חדש', + 'top_free' => 'מובילים חינם', + 'free' => 'חינם', + 'search' => 'חיפוש', + 'install' => 'התקנה', + 'buy_now' => 'קנה עכשיו', + 'token_link' => 'לחץ כאן כדי לקבל את ה-API אסימון.', + 'no_apps' => 'אין עדיין יישומים בקטגוריה זאת.', + 'developer' => 'האם אתה מפתח? כאן תלמד כיצד ליצור app ולהתחיל למכור היום!', + + 'about' => 'אודות', + + 'added' => 'הוסף', + 'updated' => 'עודכן', + 'compatibility' => 'תאימות', + + 'installed' => ':module הותקן', + 'uninstalled' => ':module הוסר', + //'updated' => ':module updated', + 'enabled' => ':module פעיל', + 'disabled' => ':module כבוי', + + 'tab' => [ + 'installation' => 'התקנה', + 'faq' => 'שאלות ותשובות', + 'changelog' => 'יומן שינויים', + ], + + 'installation' => [ + 'header' => 'התקנת יישום', + 'download' => 'מוריד קובץ :module.', + 'unzip' => 'חילוץ קובץ :module.', + 'install' => 'מתקין קבצים :module.', + ], + + 'badge' => [ + 'installed' => 'Installed', + ], + + 'button' => [ + 'uninstall' => 'הסרה', + 'disable' => 'השבת', + 'enable' => 'אפשר', + ], + + 'my' => [ + 'purchased' => 'Purchased', + 'installed' => 'Installed', + ], +]; diff --git a/resources/lang/he-IL/notifications.php b/resources/lang/he-IL/notifications.php new file mode 100755 index 0000000..9844878 --- /dev/null +++ b/resources/lang/he-IL/notifications.php @@ -0,0 +1,10 @@ + 'אופס...', + 'hello' => 'שלום!', + 'salutation' => 'ברכות,
    : שם_החברה', + 'subcopy' => 'If you’re having trouble clicking the ":text" button, copy and paste the URL below into your web browser: [:url](:url)', + +]; diff --git a/resources/lang/he-IL/pagination.php b/resources/lang/he-IL/pagination.php new file mode 100755 index 0000000..1d18403 --- /dev/null +++ b/resources/lang/he-IL/pagination.php @@ -0,0 +1,9 @@ + '« הקודם', + 'next' => 'הבא »', + 'showing' => 'מציג :first ל- :last של :total :type', + +]; diff --git a/resources/lang/he-IL/passwords.php b/resources/lang/he-IL/passwords.php new file mode 100755 index 0000000..9381bc6 --- /dev/null +++ b/resources/lang/he-IL/passwords.php @@ -0,0 +1,22 @@ + 'סיסמאות חייב להיות לפחות שישה תווים ולהתאים את האישור.', + 'reset' => 'הסיסמה אופסה!', + 'sent' => 'שלחנו לך בדואר אלקטרוני קישור לאיפוס הסיסמה!', + 'token' => 'אסימון איפוס הסיסמה לא תקין.', + 'user' => "לא הצלחנו למצוא משתמש עם כתובת הדואר אלקטרוני שהוזן.", + +]; diff --git a/resources/lang/he-IL/recurring.php b/resources/lang/he-IL/recurring.php new file mode 100755 index 0000000..5ab077a --- /dev/null +++ b/resources/lang/he-IL/recurring.php @@ -0,0 +1,20 @@ + 'חוזרות', + 'every' => 'כל', + 'period' => 'תקופת', + 'times' => 'פעמים', + 'daily' => 'יומי', + 'weekly' => 'שבועי', + 'monthly' => 'חודשי', + 'yearly' => 'שנתי', + 'custom' => 'מותאם אישית', + 'days' => 'ימים', + 'weeks' => 'שבועות', + 'months' => 'חודשים', + 'years' => 'שנים', + 'message' => ':type חזר. :type יווצר באופן אוטומטי במועד :date', + +]; diff --git a/resources/lang/he-IL/reports.php b/resources/lang/he-IL/reports.php new file mode 100755 index 0000000..1fe1a5f --- /dev/null +++ b/resources/lang/he-IL/reports.php @@ -0,0 +1,30 @@ + 'השנה', + 'previous_year' => 'בשנה הקודמת', + 'this_quarter' => 'ברבעון הזה', + 'previous_quarter' => 'ברבעון הקודם', + 'last_12_months' => '12 החודשים האחרונים', + 'profit_loss' => 'רווח & הפסד', + 'gross_profit' => 'רווח גולמי', + 'net_profit' => 'הרווח הנקי', + 'total_expenses' => 'סך כל ההוצאות', + 'net' => 'נטו', + + 'summary' => [ + 'income' => 'סיכום הכנסות', + 'expense' => 'סיכום הוצאות', + 'income_expense' => 'הכנסה לעומת הוצאות', + 'tax' => 'סיכום מס', + ], + + 'quarter' => [ + '1' => 'ינואר-מרץ', + '2' => 'אפריל-יוני', + '3' => 'יולי-ספטמבר', + '4' => 'אוקטובר-דצמבר', + ], + +]; diff --git a/resources/lang/he-IL/settings.php b/resources/lang/he-IL/settings.php new file mode 100755 index 0000000..1dc3cdf --- /dev/null +++ b/resources/lang/he-IL/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'שם', + 'email' => 'דואר אלקטרוני', + 'phone' => 'טלפון', + 'address' => 'כתובת', + 'logo' => 'לוגו', + ], + 'localisation' => [ + 'tab' => 'לוקליזציה', + 'date' => [ + 'format' => 'פורמט תאריך', + 'separator' => 'מפריד טקסט', + 'dash' => 'מקף (-)', + 'dot' => 'נקודה (.)', + 'comma' => 'פסיק (,)', + 'slash' => 'קו נטוי (/)', + 'space' => 'רווח ( )', + ], + 'timezone' => 'איזור זמן', + 'percent' => [ + 'title' => 'אחוז (%) מיקום', + 'before' => 'לפני המספר', + 'after' => 'לאחר המספר', + ], + ], + 'invoice' => [ + 'tab' => 'חשבונית', + 'prefix' => 'קידומת מספר', + 'digit' => 'מספר ספרות', + 'next' => 'המספר הבא', + 'logo' => 'לוגו', + ], + 'default' => [ + 'tab' => 'ברירת מחדל', + 'account' => 'חשבון ברירת מחדל', + 'currency' => 'מטבע ברירת מחדל', + 'tax' => 'שיעור המס ברירת מחדל', + 'payment' => 'שיטת התשלום המועדפת', + 'language' => 'שפת ברירת מחדל', + ], + 'email' => [ + 'protocol' => 'פרוטוקול', + 'php' => 'PHP דואר', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP Host', + 'port' => 'SMTP Port', + 'username' => 'שם משתמש SMTP', + 'password' => 'סיסמת SMTP', + 'encryption' => 'SMTP אבטחה', + 'none' => 'ללא', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Sendmail Path', + 'log' => 'Log Emails', + ], + 'scheduling' => [ + 'tab' => 'תזמון', + 'send_invoice' => 'שלח חשבונית תזכורת', + 'invoice_days' => 'שלח לאחר ימים', + 'send_bill' => 'שלח תזכורת חשבונית', + 'bill_days' => 'שלח לפני פירעון ימים', + 'cron_command' => 'הפקודה Cron', + 'schedule_time' => 'שעה ריצה', + ], + 'appearance' => [ + 'tab' => 'המראה', + 'theme' => 'ערכת עיצוב', + 'light' => 'בהיר', + 'dark' => 'כהה', + 'list_limit' => 'תוצאות לעמוד', + 'use_gravatar' => 'השתמש Gravatar', + ], + 'system' => [ + 'tab' => 'מערכת', + 'session' => [ + 'lifetime' => 'משך החיים של ההפעלה (דקות)', + 'handler' => 'Session Handler', + 'file' => 'קובץ', + 'database' => 'מסד נתונים', + ], + 'file_size' => 'גודל הקובץ מקסימלי (MB)', + 'file_types' => 'סוגי קבצים מותרים', + ], + +]; diff --git a/resources/lang/he-IL/taxes.php b/resources/lang/he-IL/taxes.php new file mode 100755 index 0000000..bd094b2 --- /dev/null +++ b/resources/lang/he-IL/taxes.php @@ -0,0 +1,8 @@ + 'דירוג', + 'rate_percent' => 'דירוג (%)', + +]; diff --git a/resources/lang/he-IL/transfers.php b/resources/lang/he-IL/transfers.php new file mode 100755 index 0000000..960efb4 --- /dev/null +++ b/resources/lang/he-IL/transfers.php @@ -0,0 +1,12 @@ + 'מחשבון', + 'to_account' => 'לחשבון', + + 'messages' => [ + 'delete' => ':מ אל :ל (: כמות)', + ], + +]; diff --git a/resources/lang/he-IL/updates.php b/resources/lang/he-IL/updates.php new file mode 100755 index 0000000..4c99055 --- /dev/null +++ b/resources/lang/he-IL/updates.php @@ -0,0 +1,15 @@ + 'הגירסה המותקנת', + 'latest_version' => 'הגירסה האחרונה', + 'update' => 'עדכון Akaunting לגירסה :version', + 'changelog' => 'יומן שינויים', + 'check' => 'בדוק', + 'new_core' => 'עדכון גירסה חדש עבור Akaunting זמין.', + 'latest_core' => 'מזל טוב! יש לך את הגירסה העדכנית של Akaunting. עדכוני אבטחה עתידיים יוחלו באופן אוטומטי.', + 'success' => 'תהליך העדכון הושלם בהצלחה.', + 'error' => 'תהליך העדכון נכשל, אנא נסו שנית.', + +]; diff --git a/resources/lang/he-IL/validation.php b/resources/lang/he-IL/validation.php new file mode 100755 index 0000000..e5aa077 --- /dev/null +++ b/resources/lang/he-IL/validation.php @@ -0,0 +1,120 @@ + 'שדה :attribute חייב להיות מסומן.', + 'active_url' => 'שדה :attribute הוא לא כתובת אתר תקנית.', + 'after' => 'שדה :attribute חייב להיות תאריך אחרי :date.', + 'after_or_equal' => 'שדה :attribute חייב להיות תאריך מאוחר או שווה ל :date.', + 'alpha' => 'שדה :attribute יכול להכיל אותיות בלבד.', + 'alpha_dash' => 'שדה :attribute יכול להכיל אותיות, מספרים ומקפים בלבד.', + 'alpha_num' => 'שדה :attribute יכול להכיל אותיות ומספרים בלבד.', + 'array' => 'שדה :attribute חייב להיות מערך.', + 'before' => 'שדה :attribute חייב להיות תאריך לפני :date.', + 'before_or_equal' => 'שדה :attribute חייב להיות תאריך מוקדם או שווה ל :date.', + 'between' => [ + 'numeric' => 'שדה :attribute חייב להיות בין :min ל-:max.', + 'file' => 'שדה :attribute חייב להיות בין :min ל-:max קילובייטים.', + 'string' => 'שדה :attribute חייב להיות בין :min ל-:max תווים.', + 'array' => 'שדה :attribute חייב להיות בין :min ל-:max פריטים.', + ], + 'boolean' => 'שדה :attribute חייב להיות אמת או שקר.', + 'confirmed' => 'שדה האישור של :attribute לא תואם.', + 'date' => 'שדה :attribute אינו תאריך תקני.', + 'date_format' => 'שדה :attribute לא תואם את הפורמט :format.', + 'different' => 'שדה :attribute ושדה :other חייבים להיות שונים.', + 'digits' => 'שדה :attribute חייב להיות בעל :digits ספרות.', + 'digits_between' => 'שדה :attribute חייב להיות בין :min ו-:max ספרות.', + 'dimensions' => 'שדה :attribute מימדי התמונה לא תקינים', + 'distinct' => 'שדה :attribute קיים ערך כפול.', + 'email' => 'שדה :attribute חייב להיות כתובת אימייל תקנית.', + 'exists' => 'בחירת ה-:attribute אינה תקפה.', + 'file' => 'שדה :attribute חייב להיות קובץ.', + 'filled' => 'שדה :attribute הוא חובה.', + 'image' => 'שדה :attribute חייב להיות תמונה.', + 'in' => 'בחירת ה-:attribute אינה תקפה.', + 'in_array' => 'שדה :attribute לא קיים ב:other.', + 'integer' => 'שדה :attribute חייב להיות מספר שלם.', + 'ip' => 'שדה :attribute חייב להיות כתובת IP תקנית.', + 'json' => 'שדה :attribute חייב להיות מחרוזת JSON תקנית.', + 'max' => [ + 'numeric' => 'שדה :attribute אינו יכול להיות גדול מ-:max.', + 'file' => 'שדה :attribute לא יכול להיות גדול מ-:max קילובייטים.', + 'string' => 'שדה :attribute לא יכול להיות גדול מ-:max characters.', + 'array' => 'שדה :attribute לא יכול להכיל יותר מ-:max פריטים.', + ], + 'mimes' => 'שדה :attribute צריך להיות קובץ מסוג: :values.', + 'mimetypes' => 'שדה :attribute צריך להיות קובץ מסוג: :values.', + 'min' => [ + 'numeric' => 'שדה :attribute חייב להיות לפחות :min.', + 'file' => 'שדה :attribute חייב להיות לפחות :min קילובייטים.', + 'string' => 'שדה :attribute חייב להיות לפחות :min תווים.', + 'array' => 'שדה :attribute חייב להיות לפחות :min פריטים.', + ], + 'not_in' => 'בחירת ה-:attribute אינה תקפה.', + 'numeric' => 'שדה :attribute חייב להיות מספר.', + 'present' => 'שדה :attribute חייב להיות קיים.', + 'regex' => 'שדה :attribute בעל פורמט שאינו תקין.', + 'required' => 'שדה :attribute הוא חובה.', + 'required_if' => 'שדה :attribute נחוץ כאשר :other הוא :value.', + 'required_unless' => 'שדה :attribute נחוץ אלא אם כן :other הוא בין :values.', + 'required_with' => 'שדה :attribute נחוץ כאשר :values נמצא.', + 'required_with_all' => 'שדה :attribute נחוץ כאשר :values נמצא.', + 'required_without' => 'שדה :attribute נחוץ כאשר :values לא בנמצא.', + 'required_without_all' => 'שדה :attribute נחוץ כאשר אף אחד מ-:values נמצאים.', + 'same' => 'שדה :attribute ו-:other חייבים להיות זהים.', + 'size' => [ + 'numeric' => 'שדה :attribute חייב להיות :size.', + 'file' => 'שדה :attribute חייב להיות :size קילובייטים.', + 'string' => 'שדה :attribute חייב להיות :size תווים.', + 'array' => 'שדה :attribute חייב להכיל :size פריטים.', + ], + 'string' => 'שדה :attribute חייב להיות מחרוזת.', + 'timezone' => 'שדה :attribute חייב להיות איזור תקני.', + 'unique' => 'שדה :attribute כבר תפוס.', + 'uploaded' => 'שדה :attribute ארעה שגיאה בעת ההעלאה.', + 'url' => 'שדה :attribute בעל פורמט שאינו תקין.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'הודעה מותאמת אישית', + ], + 'invalid_currency' => 'The :attribute code is invalid.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/hr-HR/accounts.php b/resources/lang/hr-HR/accounts.php new file mode 100755 index 0000000..2ad5f68 --- /dev/null +++ b/resources/lang/hr-HR/accounts.php @@ -0,0 +1,14 @@ + 'Naziv računa', + 'number' => 'Broj', + 'opening_balance' => 'Početni saldo', + 'current_balance' => 'Trenutni saldo', + 'bank_name' => 'Naziv banke', + 'bank_phone' => 'Telefon banke', + 'bank_address' => 'Adresa banke', + 'default_account' => 'Zadani račun', + +]; diff --git a/resources/lang/hr-HR/auth.php b/resources/lang/hr-HR/auth.php new file mode 100755 index 0000000..c942526 --- /dev/null +++ b/resources/lang/hr-HR/auth.php @@ -0,0 +1,39 @@ + 'Profil', + 'logout' => 'Odjava', + 'login' => 'Prijava', + 'login_to' => 'Prijava za pokretanje sesije', + 'remember_me' => 'Zapamti me', + 'forgot_password' => 'Zaboravio sam lozinku', + 'reset_password' => 'Resetiranje lozinke', + 'enter_email' => 'Upišite svoju e-mail adresu', + 'current_email' => 'Trenutni E-mail', + 'reset' => 'Resetiranje', + 'never' => 'nikad', + + 'password' => [ + 'current' => 'Lozinka', + 'current_confirm' => 'Potvrda lozinke', + 'new' => 'Nova lozinka', + 'new_confirm' => 'Potvrda nove lozinke', + ], + + 'error' => [ + 'self_delete' => 'Pogreška: Nije moguće izbrisati sebe!', + 'no_company' => 'Pogleška: Nema dodijeljene tvrtke za vaš račun. Obratite se administratoru sustava.', + ], + + 'failed' => 'Ove vjerodajnice ne odgovaraju našim zapisima.', + 'disabled' => 'Ovaj račun je onemogućen. Molimo vas da se obratite administratoru sustava.', + 'throttle' => 'Previše pokušaja prijave. Molim Vas pokušajte ponovno za :seconds sekundi.', + + 'notification' => [ + 'message_1' => 'Primili ste ovaj e-mail jer smo zaprimili zahtjev za resetiranje lozinke za vaš račun.', + 'message_2' => 'Ako nisi zatražio poništavanje lozinke, nikakve daljnje radnje nisu potrebne.', + 'button' => 'Resetiranje lozinke', + ], + +]; diff --git a/resources/lang/hr-HR/bills.php b/resources/lang/hr-HR/bills.php new file mode 100755 index 0000000..a2f9e5f --- /dev/null +++ b/resources/lang/hr-HR/bills.php @@ -0,0 +1,46 @@ + 'Broj računa', + 'bill_date' => 'Datum računa', + 'total_price' => 'Ukupna cijena', + 'due_date' => 'Datum dospijeća', + 'order_number' => 'Broj narudžbe', + 'bill_from' => 'Račun od', + + 'quantity' => 'Količina', + 'price' => 'Cijena', + 'sub_total' => 'Podzbroj', + 'discount' => 'Popust', + 'tax_total' => 'Porez Ukupno', + 'total' => 'Ukupno', + + 'item_name' => 'Naziv stavke|Nazivi stavaka', + + 'show_discount' => ':discount% popusta', + 'add_discount' => 'Dodaj popust', + 'discount_desc' => 'od podzbroja', + + 'payment_due' => 'Dospijeća plaćanja', + 'amount_due' => 'Dospjeli iznos', + 'paid' => 'Plaćeno', + 'histories' => 'Povijesti', + 'payments' => 'Plaćanja', + 'add_payment' => 'Dodaj plaćanje', + 'mark_received' => 'Označi kao primljeno', + 'download_pdf' => 'Preuzmite PDF', + 'send_mail' => 'Pošalji e-mail', + + 'status' => [ + 'draft' => 'Skica', + 'received' => 'Primljeno', + 'partial' => 'Djelomično', + 'paid' => 'Plaćeno', + ], + + 'messages' => [ + 'received' => 'Račun označen kao uspješno primljen!', + ], + +]; diff --git a/resources/lang/hr-HR/companies.php b/resources/lang/hr-HR/companies.php new file mode 100755 index 0000000..5fb0d21 --- /dev/null +++ b/resources/lang/hr-HR/companies.php @@ -0,0 +1,13 @@ + 'Domena', + 'logo' => 'Logo', + 'manage' => 'Upravljanje tvrtkama', + 'all' => 'Sve tvrtke', + 'error' => [ + 'delete_active' => 'Pogreška: Nije moguće izbrisati aktivnu tvrtku, molimo da je prvo promijenite!', + ], + +]; diff --git a/resources/lang/hr-HR/currencies.php b/resources/lang/hr-HR/currencies.php new file mode 100755 index 0000000..1e6d1f6 --- /dev/null +++ b/resources/lang/hr-HR/currencies.php @@ -0,0 +1,18 @@ + 'Kod', + 'rate' => 'Stopa', + 'default' => 'Zadana valuta', + 'decimal_mark' => 'Decimalna oznaka', + 'thousands_separator' => 'Separator tisućica', + 'precision' => 'Preciznost', + 'symbol' => [ + 'symbol' => 'Simbol', + 'position' => 'Položaj simbola', + 'before' => 'Prije iznosa', + 'after' => 'Nakon iznosa', + ] + +]; diff --git a/resources/lang/hr-HR/customers.php b/resources/lang/hr-HR/customers.php new file mode 100755 index 0000000..ed8eea9 --- /dev/null +++ b/resources/lang/hr-HR/customers.php @@ -0,0 +1,11 @@ + 'Omogućiti prijavu?', + 'user_created' => 'Korisnik kreiran', + + 'error' => [ + 'email' => 'E-mail je već zauzet.' + ] +]; diff --git a/resources/lang/hr-HR/dashboard.php b/resources/lang/hr-HR/dashboard.php new file mode 100755 index 0000000..313c91e --- /dev/null +++ b/resources/lang/hr-HR/dashboard.php @@ -0,0 +1,24 @@ + 'Ukupni prihodi', + 'receivables' => 'Potraživanja', + 'open_invoices' => 'Otvorene fakture', + 'overdue_invoices' => 'Dospjele fakture', + 'total_expenses' => 'Ukupni troškovi', + 'payables' => 'Dugovanja', + 'open_bills' => 'Otvoreni računi', + 'overdue_bills' => 'Neplaćeni računi', + 'total_profit' => 'Ukupna dobit', + 'open_profit' => 'Otvorena dobit', + 'overdue_profit' => 'Dospjela dobit', + 'cash_flow' => 'Novčani tok', + 'no_profit_loss' => 'Nema gubitka dobiti', + 'incomes_by_category' => 'Prihodi po kategorijama', + 'expenses_by_category' => 'Troškovi po kategorijama', + 'account_balance' => 'Stanje računa', + 'latest_incomes' => 'Najnoviji prihodi', + 'latest_expenses' => 'Najnoviji troškovi', + +]; diff --git a/resources/lang/hr-HR/demo.php b/resources/lang/hr-HR/demo.php new file mode 100755 index 0000000..9f08019 --- /dev/null +++ b/resources/lang/hr-HR/demo.php @@ -0,0 +1,16 @@ + 'Gotovina', + 'categories_deposit' => 'Depozit', + 'categories_sales' => 'Prodaje', + 'currencies_usd' => 'Američki dolar', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Britanska funta', + 'currencies_try' => 'Turska lira', + 'taxes_exempt' => 'Izuzeto od poreza', + 'taxes_normal' => 'Normalan porez', + 'taxes_sales' => 'Porez prodaje', + +]; diff --git a/resources/lang/hr-HR/footer.php b/resources/lang/hr-HR/footer.php new file mode 100755 index 0000000..b0cec0e --- /dev/null +++ b/resources/lang/hr-HR/footer.php @@ -0,0 +1,9 @@ + 'Verzija', + 'powered' => 'Powered By Akaunting', + 'software' => 'Slobodan računovodstveni softver', + +]; diff --git a/resources/lang/hr-HR/general.php b/resources/lang/hr-HR/general.php new file mode 100755 index 0000000..6433852 --- /dev/null +++ b/resources/lang/hr-HR/general.php @@ -0,0 +1,121 @@ + 'Stavka|Stavke', + 'incomes' => 'Prihod|Prihodi', + 'invoices' => 'Faktura|Fakture', + 'revenues' => 'Prihod|Prihodi', + 'customers' => 'Kupac|Kupci', + 'expenses' => 'Trošak|Troškovi', + 'bills' => 'Račun|Računi', + 'payments' => 'Plaćanje|Plaćanja', + 'vendors' => 'Dobavljač|Dobavljači', + 'accounts' => 'Račun|Računi', + 'transfers' => 'Prijenos|Prijenosi', + 'transactions' => 'Transakcija|Transakcije', + 'reports' => 'Izvještaj|Izvještaji', + 'settings' => 'Postavka|Postavke', + 'categories' => 'Kategorija|Kategorije', + 'currencies' => 'Valuta|Valute', + 'tax_rates' => 'Porezna stopa|Porezne stope', + 'users' => 'Korisnik|Korisnici', + 'roles' => 'Uloga|Uloge', + 'permissions' => 'Dozvola|Dozvole', + 'modules' => 'Aplikacija|Aplikacije', + 'companies' => 'Tvrtka|Tvrtke', + 'profits' => 'Dobit|Dobiti', + 'taxes' => 'Porez|Porezi', + 'logos' => 'Logo|Logoi', + 'pictures' => 'Slika|Slike', + 'types' => 'Tip|Tipovi', + 'payment_methods' => 'Način plaćanja|Načini plaćanja', + 'compares' => 'Prihod nasuprot trošku|Prihodi nasuprot troškovima', + 'notes' => 'Bilješka|Bilješke', + 'totals' => 'Ukupno|Ukupno', + 'languages' => 'Jezik|Jezici', + 'updates' => 'Ažuriranje|Ažuriranja', + 'numbers' => 'Broj|Brojevi', + 'statuses' => 'Status|Statusi', + 'others' => 'Ostalo|Ostali', + + 'dashboard' => 'Nadzorna ploča', + 'banking' => 'Bankarstvo', + 'general' => 'Općenito', + 'no_records' => 'Nema zapisa.', + 'date' => 'Datum', + 'amount' => 'Iznos', + 'enabled' => 'Omogućeno', + 'disabled' => 'Onemogućeno', + 'yes' => 'Da', + 'no' => 'Ne', + 'na' => 'N/A', + 'daily' => 'Dnevno', + 'monthly' => 'Mjesečno', + 'quarterly' => 'Kvartalno', + 'yearly' => 'Godišnje', + 'add' => 'Dodaj', + 'add_new' => 'Dodaj novo', + 'show' => 'Prikaži', + 'edit' => 'Uredi', + 'delete' => 'Izbriši', + 'send' => 'Pošalji', + 'download' => 'Preuzmi', + 'delete_confirm' => 'Potvrda brisanja :name: tipa?', + 'name' => 'Naziv', + 'email' => 'E-mail', + 'tax_number' => 'Porezni broj', + 'phone' => 'Telefon', + 'address' => 'Adresa', + 'website' => 'Web stranica', + 'actions' => 'Radnje', + 'description' => 'Opis', + 'manage' => 'Upravljanje', + 'code' => 'Kod', + 'alias' => 'Alias', + 'balance' => 'Saldo', + 'reference' => 'Referenca', + 'attachment' => 'Privitak', + 'change' => 'Promijeni', + 'switch' => 'Prebaci', + 'color' => 'Boja', + 'save' => 'Spremi', + 'cancel' => 'Otkaži', + 'from' => 'Od', + 'to' => 'Za', + 'print' => 'Ispis', + 'search' => 'Pretraživanje', + 'search_placeholder' => 'Upiši za traženje..', + 'filter' => 'Filter', + 'help' => 'Pomoć', + 'all' => 'Sve', + 'all_type' => 'Sve :type', + 'upcoming' => 'Nadolazeće', + 'created' => 'Kreirano', + 'id' => 'ID', + 'more_actions' => 'Više radnji', + 'duplicate' => 'Dupliciraj', + 'unpaid' => 'Neplaćeno', + 'paid' => 'Plaćeno', + 'overdue' => 'Dospjelo', + 'partially' => 'Djelomično', + 'partially_paid' => 'Djelomično plaćeno', + 'export' => 'Izvoz', + 'enable' => 'Omogući', + 'disable' => 'Onemogući', + + 'title' => [ + 'new' => 'Novo - :type', + 'edit' => 'Uređivanje - :type', + ], + + 'form' => [ + 'enter' => 'Unos - :type', + 'select' => [ + 'field' => '-Odaberite :field -', + 'file' => 'Odaberite datoteku', + ], + 'no_file_selected' => 'Datoteka nije odabrana...', + ], + +]; diff --git a/resources/lang/hr-HR/header.php b/resources/lang/hr-HR/header.php new file mode 100755 index 0000000..6676292 --- /dev/null +++ b/resources/lang/hr-HR/header.php @@ -0,0 +1,15 @@ + 'Promjena jezika', + 'last_login' => 'Zadnja prijava :time', + 'notifications' => [ + 'counter' => '{0} Nemate obavijesti|{1} Imate :count obavijest | [2,*] Imate :count obavijesti', + 'overdue_invoices' => '{1} :count dospjela faktura|[2,*] :count dospjelih faktura', + 'upcoming_bills' => '{1} :count nadolazeći račun|[2,*] :count nadolazećih računa', + 'items_stock' => '{1} :count stavka ponestaje zaliha|[2,*] :count stavke ponestaje zaliha', + 'view_all' => 'Vidi sve' + ], + +]; diff --git a/resources/lang/hr-HR/import.php b/resources/lang/hr-HR/import.php new file mode 100755 index 0000000..ec7120d --- /dev/null +++ b/resources/lang/hr-HR/import.php @@ -0,0 +1,9 @@ + 'Uvezi', + 'title' => 'Uvoz :type', + 'message' => 'Allowed file types: XLS, XLSX. Please, download the sample file.', + +]; diff --git a/resources/lang/hr-HR/install.php b/resources/lang/hr-HR/install.php new file mode 100755 index 0000000..ad5b268 --- /dev/null +++ b/resources/lang/hr-HR/install.php @@ -0,0 +1,44 @@ + 'Sljedeći', + 'refresh' => 'Osvježi', + + 'steps' => [ + 'requirements' => 'Please, ask your hosting provider to fix the errors!', + 'language' => 'Korak 1/3: Odabir jezika', + 'database' => 'Korak 2/3: Postavka baze podataka', + 'settings' => 'Korak 3/3: Tvrtka i admin detalji', + ], + + 'language' => [ + 'select' => 'Odaberite jezik', + ], + + 'requirements' => [ + 'enabled' => ':feature mora biti omogućeno!', + 'disabled' => ':feature mora biti onemogućeno!', + 'extension' => ':extension extension needs to be installed and loaded!', + 'directory' => ':directory direktorij mora biti omogućen za zapisivanje!', + ], + + 'database' => [ + 'hostname' => 'Naziv hosta', + 'username' => 'Korisničko ime', + 'password' => 'Lozinka', + 'name' => 'Baza podataka', + ], + + 'settings' => [ + 'company_name' => 'Naziv tvrtke', + 'company_email' => 'E-mail tvrtke', + 'admin_email' => 'Admin e-mail', + 'admin_password' => 'Admin lozinka', + ], + + 'error' => [ + 'connection' => 'Pogreška: Nije moguće povezati se na bazu podataka! Provjerite jesu li podaci ispravni.', + ], + +]; diff --git a/resources/lang/hr-HR/invoices.php b/resources/lang/hr-HR/invoices.php new file mode 100755 index 0000000..8ec54d4 --- /dev/null +++ b/resources/lang/hr-HR/invoices.php @@ -0,0 +1,55 @@ + 'Broj fakture', + 'invoice_date' => 'Datum fakture', + 'total_price' => 'Ukupna cijena', + 'due_date' => 'Datum dospijeća', + 'order_number' => 'Broj narudžbe', + 'bill_to' => 'Naplatiti', + + 'quantity' => 'Količina', + 'price' => 'Cijena', + 'sub_total' => 'Podzbroj', + 'discount' => 'Popust', + 'tax_total' => 'Porez Ukupno', + 'total' => 'Ukupno', + + 'item_name' => 'Ime stavke|Imena stavaka', + + 'show_discount' => ':discount% popusta', + 'add_discount' => 'Dodaj popust', + 'discount_desc' => 'od podzbroja', + + 'payment_due' => 'Dospijeća plaćanja', + 'paid' => 'Plaćeno', + 'histories' => 'Povijesti', + 'payments' => 'Plaćanja', + 'add_payment' => 'Dodaj plaćanje', + 'mark_paid' => 'Označi kao plaćeno', + 'mark_sent' => 'Označi kao poslano', + 'download_pdf' => 'Preuzmite PDF', + 'send_mail' => 'Pošalji e-mail', + + 'status' => [ + 'draft' => 'Skica', + 'sent' => 'Poslano', + 'viewed' => 'Pogledano', + 'approved' => 'Odobreno', + 'partial' => 'Djelomično', + 'paid' => 'Plaćeno', + ], + + 'messages' => [ + 'email_sent' => 'E-mail računa je uspješno poslan!', + 'marked_sent' => 'Račun je uspješno označen kao poslan!', + 'email_required' => 'Nema e-mail adrese za ovog kupca!', + ], + + 'notification' => [ + 'message' => 'Primili ste ovaj e-mail jer imate nadolazeću :amount fakturu za :customer.', + 'button' => 'Platite sada', + ], + +]; diff --git a/resources/lang/hr-HR/items.php b/resources/lang/hr-HR/items.php new file mode 100755 index 0000000..fd36359 --- /dev/null +++ b/resources/lang/hr-HR/items.php @@ -0,0 +1,15 @@ + 'Količina|Količine', + 'sales_price' => 'Prodajna cijena', + 'purchase_price' => 'Nabavna cijena', + 'sku' => 'SKU', + + 'notification' => [ + 'message' => 'Primili ste ovaj e-mail jer ponestaje zaliha za :name.', + 'button' => 'Pogledaj sada', + ], + +]; diff --git a/resources/lang/hr-HR/messages.php b/resources/lang/hr-HR/messages.php new file mode 100755 index 0000000..695e76c --- /dev/null +++ b/resources/lang/hr-HR/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => ':type dodan!', + 'updated' => ':type ažuriran!', + 'deleted' => ':type izbrisan!', + 'duplicated' => ':type dupliciran!', + 'imported' => ':type uvezen!', + 'enabled' => ':type enabled!', + 'disabled' => ':type disabled!', + ], + 'error' => [ + 'over_payment' => 'Pogreška: Plaćanje nije dodano! Iznos prelazi ukupan iznos.', + 'not_user_company' => 'Pogreška: Nije vam dozvoljeno upravljanje ovom tvrtkom!', + 'customer' => 'Pogreška: Korisnik nije kreiran! :name već koristi ovu e-mail adresu.', + 'no_file' => 'Pogreška: Nije odabrana nijedna datoteka!', + 'last_category' => 'Pogreška: Nije moguće izbrisati zadnju :type kategoriju!', + 'invalid_token' => 'Pogreška: Upisani token nije valjan!', + 'import_column' => 'Error: :message Sheet name: :sheet. Line number: :line.', + 'import_sheet' => 'Error: Sheet name is not valid. Please, check the sample file.', + ], + 'warning' => [ + 'deleted' => 'Upozorenje: Nije vam dozvoljeno izbrisati :name jer postoji poveznica s :text.', + 'disabled' => 'Upozorenje: Nije vam dozvoljeno onemogućiti :name jer postoji poveznica s :text.', + ], + +]; diff --git a/resources/lang/hr-HR/modules.php b/resources/lang/hr-HR/modules.php new file mode 100755 index 0000000..48d4730 --- /dev/null +++ b/resources/lang/hr-HR/modules.php @@ -0,0 +1,58 @@ + 'API Token', + 'api_token' => 'Token', + 'my_apps' => 'Moje aplikacije', + 'top_paid' => 'Najbolje plaćeni', + 'new' => 'Novo', + 'top_free' => 'Najbolje besplatno', + 'free' => 'BESPLATNO', + 'search' => 'Pretraživanje', + 'install' => 'Instaliraj', + 'buy_now' => 'Kupi odmah', + 'token_link' => 'Kliknite ovdje da biste dobili svoj API token.', + 'no_apps' => 'U ovoj kategoriji još nema aplikacija.', + 'developer' => 'Jeste li programer? Ovdje možete naučiti kako kreirati aplikaciju i početi prodavati!', + + 'about' => 'O aplikaciji', + + 'added' => 'Dodano', + 'updated' => 'Ažurirano', + 'compatibility' => 'Kompatibilnost', + + 'installed' => ':module instalirana', + 'uninstalled' => ':module deinstalirana', + //'updated' => ':module updated', + 'enabled' => ':module omogućena', + 'disabled' => ':module onemogućena', + + 'tab' => [ + 'installation' => 'Instalacija', + 'faq' => 'ČPP', + 'changelog' => 'Popis promjena', + ], + + 'installation' => [ + 'header' => 'Instalacija aplikacije', + 'download' => 'Preuzimanje :module datoteke.', + 'unzip' => 'Raspakiravanje :module datoteka.', + 'install' => 'Instalacija :module datoteka.', + ], + + 'badge' => [ + 'installed' => 'Instalirano', + ], + + 'button' => [ + 'uninstall' => 'Deinstaliraj', + 'disable' => 'Onemogući', + 'enable' => 'Omogući', + ], + + 'my' => [ + 'purchased' => 'Kupljeno', + 'installed' => 'Instalirano', + ], +]; diff --git a/resources/lang/hr-HR/notifications.php b/resources/lang/hr-HR/notifications.php new file mode 100755 index 0000000..816f50e --- /dev/null +++ b/resources/lang/hr-HR/notifications.php @@ -0,0 +1,10 @@ + 'Ups!', + 'hello' => 'Pozdrav!', + 'salutation' => 'Regards,
    :company_name', + 'subcopy' => 'If you’re having trouble clicking the ":text" button, copy and paste the URL below into your web browser: [:url](:url)', + +]; diff --git a/resources/lang/hr-HR/pagination.php b/resources/lang/hr-HR/pagination.php new file mode 100755 index 0000000..eac40f7 --- /dev/null +++ b/resources/lang/hr-HR/pagination.php @@ -0,0 +1,9 @@ + '« Prethodna', + 'next' => 'Sljedeća »', + 'showing' => 'Prikazivanje :first do :last od :total :type', + +]; diff --git a/resources/lang/hr-HR/passwords.php b/resources/lang/hr-HR/passwords.php new file mode 100755 index 0000000..a232ce2 --- /dev/null +++ b/resources/lang/hr-HR/passwords.php @@ -0,0 +1,22 @@ + 'Lozinke moraju biti duge barem 6 znakova i moraju odgovarati potvrdi.', + 'reset' => 'Vaša lozinka je resetirana!', + 'sent' => 'Link za resetiranje lozinke je poslan na e-mail!', + 'token' => 'Token za resetiranje lozinke nije važeći.', + 'user' => "Ne možemo pronaći korisnika s tom e-mail adresom.", + +]; diff --git a/resources/lang/hr-HR/recurring.php b/resources/lang/hr-HR/recurring.php new file mode 100755 index 0000000..449e96a --- /dev/null +++ b/resources/lang/hr-HR/recurring.php @@ -0,0 +1,20 @@ + 'Ponavljajuće', + 'every' => 'Svakih', + 'period' => 'Razdoblje', + 'times' => 'Puta', + 'daily' => 'Dnevno', + 'weekly' => 'Tjedno', + 'monthly' => 'Mjesečno', + 'yearly' => 'Godišnje', + 'custom' => 'Prilagođeno', + 'days' => 'Dan(a)', + 'weeks' => 'Tjedan(a)', + 'months' => 'Mjesec(i)', + 'years' => 'Godine(a)', + 'message' => 'Ovo je ponavljajući :type i sljedeći :type će automatski biti generiran :date', + +]; diff --git a/resources/lang/hr-HR/reports.php b/resources/lang/hr-HR/reports.php new file mode 100755 index 0000000..d40cb74 --- /dev/null +++ b/resources/lang/hr-HR/reports.php @@ -0,0 +1,30 @@ + 'Tekuća godina', + 'previous_year' => 'Prethodna godina', + 'this_quarter' => 'Ovaj kvartal', + 'previous_quarter' => 'Prethodni kvartal', + 'last_12_months' => 'Zadnjih 12 mjeseci', + 'profit_loss' => 'Dobit i gubitak', + 'gross_profit' => 'Bruto dobit', + 'net_profit' => 'Neto dobit', + 'total_expenses' => 'Ukupni troškovi', + 'net' => 'Neto', + + 'summary' => [ + 'income' => 'Sažetak prihoda', + 'expense' => 'Sažetak troškova', + 'income_expense' => 'Prihodi nasuprot troškovima', + 'tax' => 'Sažetak poreza', + ], + + 'quarter' => [ + '1' => 'Sij-Ožu', + '2' => 'Tra-Lip', + '3' => 'Srp-Ruj', + '4' => 'Lis-Pro', + ], + +]; diff --git a/resources/lang/hr-HR/settings.php b/resources/lang/hr-HR/settings.php new file mode 100755 index 0000000..96dfa53 --- /dev/null +++ b/resources/lang/hr-HR/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Naziv', + 'email' => 'E-mail', + 'phone' => 'Telefon', + 'address' => 'Adresa', + 'logo' => 'Logo', + ], + 'localisation' => [ + 'tab' => 'Lokalizacija', + 'date' => [ + 'format' => 'Format datuma', + 'separator' => 'Separator datuma', + 'dash' => 'Crtica (-)', + 'dot' => 'Točka (.)', + 'comma' => 'Zarez (,)', + 'slash' => 'Kosa crta (/)', + 'space' => 'Razmak ( )', + ], + 'timezone' => 'Vremenska zona', + 'percent' => [ + 'title' => 'Pozicija postotka (%)', + 'before' => 'Ispred broja', + 'after' => 'Nakon broja', + ], + ], + 'invoice' => [ + 'tab' => 'Faktura', + 'prefix' => 'Prefiks proja', + 'digit' => 'Broj znamenki', + 'next' => 'Sljedeći broj', + 'logo' => 'Logo', + ], + 'default' => [ + 'tab' => 'Zadano', + 'account' => 'Zadani račun', + 'currency' => 'Zadana valuta', + 'tax' => 'Zadana stopa poreza', + 'payment' => 'Zadani način plaćanja', + 'language' => 'Zadani jezik', + ], + 'email' => [ + 'protocol' => 'Protokol', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP Host', + 'port' => 'SMTP Port', + 'username' => 'SMTP Korisničko Ime', + 'password' => 'SMTP Lozinka', + 'encryption' => 'SMTP sigurnost', + 'none' => 'Ništa', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Sendmail putanja', + 'log' => 'E-mail evidentiranje', + ], + 'scheduling' => [ + 'tab' => 'Zakazivanje', + 'send_invoice' => 'Slanje podsjetnika faktura', + 'invoice_days' => 'Slanje prije datuma dospijeća', + 'send_bill' => 'Slanje podsjetnika računa', + 'bill_days' => 'Slanje prije datuma dospijeća', + 'cron_command' => 'Cron naredba', + 'schedule_time' => 'Vrijeme pokretanja', + ], + 'appearance' => [ + 'tab' => 'Izgled', + 'theme' => 'Tema', + 'light' => 'Svjetlo', + 'dark' => 'Tamno', + 'list_limit' => 'Zapisa po stranici', + 'use_gravatar' => 'Koristi Gravatar', + ], + 'system' => [ + 'tab' => 'Sustav', + 'session' => [ + 'lifetime' => 'Životni vijek sesije (Minute)', + 'handler' => 'Rukovatelj sesije', + 'file' => 'Datoteka', + 'database' => 'Baza podataka', + ], + 'file_size' => 'Max veličina datoteke (MB)', + 'file_types' => 'Dopuštena vrsta datoteka', + ], + +]; diff --git a/resources/lang/hr-HR/taxes.php b/resources/lang/hr-HR/taxes.php new file mode 100755 index 0000000..d86b37c --- /dev/null +++ b/resources/lang/hr-HR/taxes.php @@ -0,0 +1,8 @@ + 'Stopa', + 'rate_percent' => 'Stopa (%)', + +]; diff --git a/resources/lang/hr-HR/transfers.php b/resources/lang/hr-HR/transfers.php new file mode 100755 index 0000000..2f949d2 --- /dev/null +++ b/resources/lang/hr-HR/transfers.php @@ -0,0 +1,12 @@ + 'S računa', + 'to_account' => 'Na račun', + + 'messages' => [ + 'delete' => ':from za :to (:amount)', + ], + +]; diff --git a/resources/lang/hr-HR/updates.php b/resources/lang/hr-HR/updates.php new file mode 100755 index 0000000..af38d2a --- /dev/null +++ b/resources/lang/hr-HR/updates.php @@ -0,0 +1,15 @@ + 'Instalirana verzija', + 'latest_version' => 'Posljednja verzija', + 'update' => 'Ažuriraj Akaunting na :version verziju', + 'changelog' => 'Popis promjena', + 'check' => 'Provjera', + 'new_core' => 'Dostupna je ažurirana Akaunting verzija.', + 'latest_core' => 'Čestitamo! Imate najnoviju Akaunting verziju. Buduća sigurnosna ažuriranja primjenjivat će se automatski.', + 'success' => 'Proces ažuriranja uspješno završen.', + 'error' => 'Proces ažuriranja nije uspio, molimo pokušajte ponovno.', + +]; diff --git a/resources/lang/hr-HR/validation.php b/resources/lang/hr-HR/validation.php new file mode 100755 index 0000000..d5eee07 --- /dev/null +++ b/resources/lang/hr-HR/validation.php @@ -0,0 +1,120 @@ + ':attribute mora biti prihvaćeno.', + 'active_url' => ':attribute nije važeći URL.', + 'after' => ':attribute mora biti datum nakon :date.', + 'after_or_equal' => ':attribute mora biti datum nakon ili isti kao :date.', + 'alpha' => ':attribute može sadržavati samo slova.', + 'alpha_dash' => ':attribute može sadržavati samo slova, brojeve i crtice.', + 'alpha_num' => ':attribute može sadržavati samo slova i brojeve.', + 'array' => ':attribute mora biti polje.', + 'before' => ':attribute mora biti datum prije :date.', + 'before_or_equal' => ':attribute mora biti datum prije ili isti kao :date.', + 'between' => [ + 'numeric' => ':attribute mora biti između :min i :max.', + 'file' => ':attribute mora biti između :min i :max kilobajta.', + 'string' => ':attribute mora biti između :min i :max znakova.', + 'array' => ':attribute mora imati između :min i :max stavki.', + ], + 'boolean' => 'Polje :attribute mora biti true ili false.', + 'confirmed' => ':attribute potvrda se ne podudara.', + 'date' => ':attribute nije važeći datum.', + 'date_format' => ':attribute ne odgovara formatu :format.', + 'different' => ':attribute i :other moraju biti različiti.', + 'digits' => ':attribute mora sadržavati :digits znamenki.', + 'digits_between' => ':attribute mora biti između :min i :max znamenki.', + 'dimensions' => ':attribute ima nevažeće dimenzije slike.', + 'distinct' => 'Polje :attribute ima dvostruku vrijednost.', + 'email' => ':attribute mora biti važeća e-mail adresa.', + 'exists' => 'Odabrano :attribute nije važeće.', + 'file' => ':attribute mora biti datoteka.', + 'filled' => 'Polje :attribute mora imati vrijednost.', + 'image' => ':attribute mora biti slika.', + 'in' => 'Odabrano :attribute nije valjano.', + 'in_array' => 'Polje :attribute ne postoji u :other.', + 'integer' => ':attribute mora biti cijeli broj.', + 'ip' => ':attribute mora biti važeća IP adresa.', + 'json' => ':attribute mora biti valjani JSON niz.', + 'max' => [ + 'numeric' => ':attribute ne može biti veće od :max.', + 'file' => ':attribute ne može biti veće od :max kilobajta.', + 'string' => ':attribute ne može biti više od :max znakova.', + 'array' => ':attribute ne može imati više od :max stavki.', + ], + 'mimes' => ':attribute mora biti datoteka tipa: :values.', + 'mimetypes' => ':attribute mora biti datoteka tipa: :values.', + 'min' => [ + 'numeric' => ':attribute mora biti barem :min.', + 'file' => ':attribute mora biti barem :min kilobajta.', + 'string' => ':attribute mora sadržavati barem :min znakova.', + 'array' => ':attribute mora sadržavati barem :min stavki.', + ], + 'not_in' => 'Odabrano :attribute nije valjano.', + 'numeric' => ':attribute mora biti broj.', + 'present' => 'Polje :attribute mora biti prisutno.', + 'regex' => ':attribute format nije valjan.', + 'required' => 'Polje :attribute je obavezno.', + 'required_if' => 'Polje :attribute je obavezno kada je :other :value.', + 'required_unless' => 'Polje :attribute je obavezno osim ako je :other u :values.', + 'required_with' => 'Polje :attribute je obavezno kada postoje polja :values.', + 'required_with_all' => 'Polje :attribute je obavezno kada postoje polja :values.', + 'required_without' => 'Polje :attribute je obavezno kada ne postoji polje :values.', + 'required_without_all' => 'Polje :attribute je obavezno kada nijedno od polja :values ne postoji.', + 'same' => ':attribute i :other se moraju podudarati.', + 'size' => [ + 'numeric' => ':attribute mora biti :size.', + 'file' => ':attribute mora biti :size kilobajta.', + 'string' => ':attribute mora biti :size znakova.', + 'array' => ':attribute mora sadržavati :size stavki.', + ], + 'string' => ':attribute mora biti niz.', + 'timezone' => ':attribute mora biti važeća vremenska zona.', + 'unique' => ':attribute već postoji.', + 'uploaded' => ':attribute nije uspješno učitan.', + 'url' => ':attribute nije ispravnog formata.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'prilagođena-poruka', + ], + 'invalid_currency' => 'The :attribute code is invalid.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/id-ID/accounts.php b/resources/lang/id-ID/accounts.php new file mode 100755 index 0000000..1d3e6d6 --- /dev/null +++ b/resources/lang/id-ID/accounts.php @@ -0,0 +1,14 @@ + 'Nama Akun', + 'number' => 'Nomor', + 'opening_balance' => 'Saldo Awal', + 'current_balance' => 'Saldo Sekarang', + 'bank_name' => 'Nama Bank', + 'bank_phone' => 'Telpon Bank', + 'bank_address' => 'Alamat Bank', + 'default_account' => 'Akun Utama', + +]; diff --git a/resources/lang/id-ID/auth.php b/resources/lang/id-ID/auth.php new file mode 100755 index 0000000..8c7d50e --- /dev/null +++ b/resources/lang/id-ID/auth.php @@ -0,0 +1,39 @@ + 'Profil', + 'logout' => 'Keluar', + 'login' => 'Masuk', + 'login_to' => 'Masuk untuk memulai sesi anda', + 'remember_me' => 'Ingat Saya', + 'forgot_password' => 'Lupa kata sandi ?', + 'reset_password' => 'Atur Ulang Sandi', + 'enter_email' => 'Masukan Alamat Email Anda', + 'current_email' => 'Email saat ini', + 'reset' => 'Atur Ulang', + 'never' => 'tidak pernah', + + 'password' => [ + 'current' => 'Sandi', + 'current_confirm' => 'Konfirmasi Sandi', + 'new' => 'Kata sandi baru', + 'new_confirm' => 'Konfirmasi sandi baru', + ], + + 'error' => [ + 'self_delete' => 'Kesalahan: Tidak dapat menghapus akun sendiri!', + 'no_company' => 'Galat: Tidak ada perusahaan yang ditetapkan ke akun Anda. Mohon hubungi administrator sistem.', + ], + + 'failed' => 'Identitas tersebut tidak cocok dengan data kami.', + 'disabled' => 'Akun ini dinonaktifkan. Silahkan, hubungi administrator sistem.', + 'throttle' => 'Terlalu banyak percobaan masuk. Silahkan coba lagi dalam :seconds detik.', + + 'notification' => [ + 'message_1' => 'Anda menerima email ini karena kami menerima permintaan atur ulang kata sandi untuk akun Anda.', + 'message_2' => 'Jika Anda tidak melakukan permintaan atur ulang kata sandi, tindakan lebih lanjut tidak diperlukan.', + 'button' => 'Atur ulang kata sandi', + ], + +]; diff --git a/resources/lang/id-ID/bills.php b/resources/lang/id-ID/bills.php new file mode 100755 index 0000000..4c5a96d --- /dev/null +++ b/resources/lang/id-ID/bills.php @@ -0,0 +1,46 @@ + 'Nomor Tagihan', + 'bill_date' => 'Tanggal Tagihan', + 'total_price' => 'Total Harga', + 'due_date' => 'Tanggal Jatuh Tempo', + 'order_number' => 'Nomor Pesanan', + 'bill_from' => 'Tagihan Dari', + + 'quantity' => 'Jumlah', + 'price' => 'Harga', + 'sub_total' => 'Subtotal', + 'discount' => 'Diskon', + 'tax_total' => 'Total Pajak', + 'total' => 'Total', + + 'item_name' => 'Nama Barang | Nama Barang', + + 'show_discount' => 'Diskon :discount%', + 'add_discount' => 'Tambahkan diskon', + 'discount_desc' => 'dari subtotal', + + 'payment_due' => 'Pembayaran Jatuh Tempo', + 'amount_due' => 'Jumlah Jatuh Tempo', + 'paid' => 'Dibayar', + 'histories' => 'Riwayat', + 'payments' => 'Pembayaran', + 'add_payment' => 'Tambahkan Pembayaran', + 'mark_received' => 'Tandai Diterima', + 'download_pdf' => 'Unduh PDF', + 'send_mail' => 'Kirim Email', + + 'status' => [ + 'draft' => 'Konsep', + 'received' => 'Diterima', + 'partial' => 'Sebagian', + 'paid' => 'Dibayar', + ], + + 'messages' => [ + 'received' => 'Bill ditandai sebagai berhasil diterima!', + ], + +]; diff --git a/resources/lang/id-ID/companies.php b/resources/lang/id-ID/companies.php new file mode 100755 index 0000000..82b7ac4 --- /dev/null +++ b/resources/lang/id-ID/companies.php @@ -0,0 +1,13 @@ + 'Domain', + 'logo' => 'Logo', + 'manage' => 'Kelola Perusahaan', + 'all' => 'Semua Perusahaan', + 'error' => [ + 'delete_active' => 'Kesalahan: Tidak dapat menghapus perusahaan aktif, silahkan, ubah dulu!', + ], + +]; diff --git a/resources/lang/id-ID/currencies.php b/resources/lang/id-ID/currencies.php new file mode 100755 index 0000000..2ee7fd4 --- /dev/null +++ b/resources/lang/id-ID/currencies.php @@ -0,0 +1,18 @@ + 'Kode', + 'rate' => 'Kurs', + 'default' => 'Mata Uang Utama', + 'decimal_mark' => 'Pemisah desimal', + 'thousands_separator' => 'Pemisah ribuan', + 'precision' => 'Presisi', + 'symbol' => [ + 'symbol' => 'Simbol', + 'position' => 'Posisi simbol', + 'before' => 'Sebelum Jumlah', + 'after' => 'Sesudah Jumlah', + ] + +]; diff --git a/resources/lang/id-ID/customers.php b/resources/lang/id-ID/customers.php new file mode 100755 index 0000000..1fda3ad --- /dev/null +++ b/resources/lang/id-ID/customers.php @@ -0,0 +1,11 @@ + 'Perbolehkan Masuk?', + 'user_created' => 'Pengguna Dibuat', + + 'error' => [ + 'email' => 'Email ini sudah dipakai.' + ] +]; diff --git a/resources/lang/id-ID/dashboard.php b/resources/lang/id-ID/dashboard.php new file mode 100755 index 0000000..f2c4b7f --- /dev/null +++ b/resources/lang/id-ID/dashboard.php @@ -0,0 +1,24 @@ + 'Total Pendapatan', + 'receivables' => 'Piutang', + 'open_invoices' => 'Membuka Faktur', + 'overdue_invoices' => 'Faktur yang telah lewat', + 'total_expenses' => 'Total Biaya', + 'payables' => 'Hutang', + 'open_bills' => 'Membuka tagihan', + 'overdue_bills' => 'Tagihan terlambat', + 'total_profit' => 'Total keuntungan', + 'open_profit' => 'Membuka Keuntungan', + 'overdue_profit' => 'Keuntungan jatuh tempo', + 'cash_flow' => 'Arus kas', + 'no_profit_loss' => 'Tidak ada Rugi Laba', + 'incomes_by_category' => 'Pendapatan menurut Kategori', + 'expenses_by_category' => 'Biaya Berdasarkan Kategori', + 'account_balance' => 'Saldo rekening', + 'latest_incomes' => 'Pendapatan Terbaru', + 'latest_expenses' => 'Biaya Terakhir', + +]; diff --git a/resources/lang/id-ID/demo.php b/resources/lang/id-ID/demo.php new file mode 100755 index 0000000..f7f7cb1 --- /dev/null +++ b/resources/lang/id-ID/demo.php @@ -0,0 +1,16 @@ + 'Kas', + 'categories_deposit' => 'Deposit', + 'categories_sales' => 'Penjualan', + 'currencies_usd' => 'Dolar Amerika', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Pound Inggris', + 'currencies_try' => 'Lira Turki', + 'taxes_exempt' => 'Bebas pajak', + 'taxes_normal' => 'Pajak normal', + 'taxes_sales' => 'Pajak Penjualan', + +]; diff --git a/resources/lang/id-ID/footer.php b/resources/lang/id-ID/footer.php new file mode 100755 index 0000000..4605dfa --- /dev/null +++ b/resources/lang/id-ID/footer.php @@ -0,0 +1,9 @@ + 'Versi', + 'powered' => 'Didukung oleh Akaunting', + 'software' => 'Perangkat Lunak Akutansi Gratis', + +]; diff --git a/resources/lang/id-ID/general.php b/resources/lang/id-ID/general.php new file mode 100755 index 0000000..caa6d7a --- /dev/null +++ b/resources/lang/id-ID/general.php @@ -0,0 +1,121 @@ + 'Item|Item', + 'incomes' => 'Pendapatan| Pendapatan', + 'invoices' => 'Faktur | faktur', + 'revenues' => 'Pendapatan|Pendapatan', + 'customers' => 'Pelanggan | Pelanggan', + 'expenses' => 'Biaya | Biaya', + 'bills' => 'Tagihan|Tagihan', + 'payments' => 'Pembayaran | Pembayaran', + 'vendors' => 'Penjual | Vendor', + 'accounts' => 'Akun | Akun', + 'transfers' => 'Mentransfer | Transfer', + 'transactions' => 'Transaksi | Transaksi', + 'reports' => 'Laporan | Laporan', + 'settings' => 'Pengaturan | Pengaturan', + 'categories' => 'Kategori | Kategori', + 'currencies' => 'Mata uang | Mata uang', + 'tax_rates' => 'Tarif Pajak | Tarif Pajak', + 'users' => 'Pengguna | Pengguna', + 'roles' => 'Peran | Peran', + 'permissions' => 'Izin | Izin', + 'modules' => 'Aplikasi|aplikasi', + 'companies' => 'Perusahaan | Perusahaan', + 'profits' => 'Keuntungan | Keuntungan', + 'taxes' => 'Pajak | Pajak', + 'logos' => 'Logo | Logo', + 'pictures' => 'Gambar | Gambar', + 'types' => 'Jenis | Jenis', + 'payment_methods' => 'Metode Pembayaran | Metode Pembayaran', + 'compares' => 'Pendapatan vs Beban | Pendapatan dan Beban', + 'notes' => 'Catatan | Catatan', + 'totals' => 'Total |Total', + 'languages' => 'Bahasa | Bahasa', + 'updates' => 'Pembaruan|Pembaruan', + 'numbers' => 'Nomor | Nomor', + 'statuses' => 'Status | Status', + 'others' => 'Lain | Lain-lain', + + 'dashboard' => 'Dasbor', + 'banking' => 'Perbankan', + 'general' => 'Umum', + 'no_records' => 'Tidak ada catatan.', + 'date' => 'Tanggal', + 'amount' => 'Jumlah', + 'enabled' => 'Diaktifkan', + 'disabled' => 'Dinonaktifkan', + 'yes' => 'Ya', + 'no' => 'Tidak', + 'na' => 'N/A', + 'daily' => 'Harian', + 'monthly' => 'Bulanan', + 'quarterly' => 'Tiga Bulan', + 'yearly' => 'Tahunan', + 'add' => 'Menambahkan', + 'add_new' => 'Tambah Baru', + 'show' => 'Menampilkan', + 'edit' => 'Sunting', + 'delete' => 'Hapus', + 'send' => 'Kirim', + 'download' => 'Unduh', + 'delete_confirm' => 'Konfirmasi hapus :nama :jenis?', + 'name' => 'Nama', + 'email' => 'E-mail', + 'tax_number' => 'NPWP', + 'phone' => 'Telepon', + 'address' => 'Alamat', + 'website' => 'Situs Web', + 'actions' => 'Tindakan', + 'description' => 'Deskripsi', + 'manage' => 'Mengelola', + 'code' => 'Kode', + 'alias' => 'Alias', + 'balance' => 'Saldo', + 'reference' => 'Referensi', + 'attachment' => 'Lampiran', + 'change' => 'Perubahan', + 'switch' => 'Beralih', + 'color' => 'Warna', + 'save' => 'Simpan', + 'cancel' => 'Batal', + 'from' => 'Dari', + 'to' => 'Untuk', + 'print' => 'Cetak', + 'search' => 'Cari', + 'search_placeholder' => 'Ketik untuk mencari..', + 'filter' => 'Menyaring', + 'help' => 'Bantuan', + 'all' => 'Semuanya', + 'all_type' => 'Semua :type', + 'upcoming' => 'Mendatang', + 'created' => 'Dibuat', + 'id' => 'ID', + 'more_actions' => 'Tindakan Lainnya', + 'duplicate' => 'Duplikat', + 'unpaid' => 'Belum Dibayar', + 'paid' => 'Dibayar', + 'overdue' => 'Jatuh tempo', + 'partially' => 'Sebagian', + 'partially_paid' => 'Sebagian dibayar', + 'export' => 'Ekspor', + 'enable' => 'Aktif', + 'disable' => 'Nonaktif', + + 'title' => [ + 'new' => 'Baru :type', + 'edit' => 'Sunting :type', + ], + + 'form' => [ + 'enter' => 'Masukkan :field', + 'select' => [ + 'field' => '-Pilih :field -', + 'file' => 'Pilih Berkas', + ], + 'no_file_selected' => 'Tidak ada Berkas yang dipilih...', + ], + +]; diff --git a/resources/lang/id-ID/header.php b/resources/lang/id-ID/header.php new file mode 100755 index 0000000..a2f9b84 --- /dev/null +++ b/resources/lang/id-ID/header.php @@ -0,0 +1,15 @@ + 'Ganti Bahasa', + 'last_login' => 'Terakhir Masuk :time', + 'notifications' => [ + 'counter' => '{0} Anda tidak memiliki pemberitahuan |{1} Anda memiliki :count Pemberitahuan |[2,*] Kamu memiliki :count pemberitahuan', + 'overdue_invoices' => '{1} :count faktur yang telah lewat|[2,*] :count faktur yang telah lewat', + 'upcoming_bills' => '{1} :count tagihan yang akan datang|[2,*] :count tagihan yang akan datang', + 'items_stock' => '{1} :count item habis|[2,*] :count barang habis', + 'view_all' => 'Menampilkan Semuanya' + ], + +]; diff --git a/resources/lang/id-ID/import.php b/resources/lang/id-ID/import.php new file mode 100755 index 0000000..6d7069c --- /dev/null +++ b/resources/lang/id-ID/import.php @@ -0,0 +1,9 @@ + 'Impor', + 'title' => 'Impor :type', + 'message' => 'Allowed file types: XLS, XLSX. Please, download the sample file.', + +]; diff --git a/resources/lang/id-ID/install.php b/resources/lang/id-ID/install.php new file mode 100755 index 0000000..f54a321 --- /dev/null +++ b/resources/lang/id-ID/install.php @@ -0,0 +1,44 @@ + 'Selanjutnya', + 'refresh' => 'Menyegarkan', + + 'steps' => [ + 'requirements' => 'Please, ask your hosting provider to fix the errors!', + 'language' => 'Langkah 1/3 : Seleksi Bahasa', + 'database' => 'Langkah 2/3 : Setup basis data', + 'settings' => 'Langkah 3/3: Detail Perusahaan dan Admin', + ], + + 'language' => [ + 'select' => 'Pilih bahasa', + ], + + 'requirements' => [ + 'enabled' => ':feature perlu diaktifkan!', + 'disabled' => ':feature perlu dinonaktifkan!', + 'extension' => ':extension extension needs to be installed and loaded!', + 'directory' => ':directory direktori perlu ditulis!', + ], + + 'database' => [ + 'hostname' => 'Nama host', + 'username' => 'Nama pengguna', + 'password' => 'Kata Sandi', + 'name' => 'Basis data', + ], + + 'settings' => [ + 'company_name' => 'Nama Perusahaan', + 'company_email' => 'Email Perusahaan', + 'admin_email' => 'Email Admin', + 'admin_password' => 'Kata Sandi Admin', + ], + + 'error' => [ + 'connection' => 'Kesalahan: Tidak dapat terhubung ke database! Tolong, pastikan detilnya benar.', + ], + +]; diff --git a/resources/lang/id-ID/invoices.php b/resources/lang/id-ID/invoices.php new file mode 100755 index 0000000..a277d1b --- /dev/null +++ b/resources/lang/id-ID/invoices.php @@ -0,0 +1,55 @@ + 'Nomor faktur', + 'invoice_date' => 'Tanggal faktur', + 'total_price' => 'Total harga', + 'due_date' => 'Batas tanggal terakhir', + 'order_number' => 'Jumlah Pesanan', + 'bill_to' => 'Pembayaran Kepada', + + 'quantity' => 'Kuantitas', + 'price' => 'Harga', + 'sub_total' => 'Subtotal', + 'discount' => 'Diskon', + 'tax_total' => 'Total Pajak', + 'total' => 'Total', + + 'item_name' => 'Nama Item | Nama Item', + + 'show_discount' => 'Diskon :discount%', + 'add_discount' => 'Tambahkan diskon', + 'discount_desc' => 'of subtotal', + + 'payment_due' => 'Tanggal Pembayaran', + 'paid' => 'Dibayar', + 'histories' => 'Sejarah', + 'payments' => 'Pembayaran', + 'add_payment' => 'Tambahkan Pembayaran', + 'mark_paid' => 'Ditandai Dibayar', + 'mark_sent' => 'Tandai Dikirim', + 'download_pdf' => 'Unduh PDF', + 'send_mail' => 'Kirim Email', + + 'status' => [ + 'draft' => 'Konsep', + 'sent' => 'Mengirim', + 'viewed' => 'Lihat', + 'approved' => 'Disetujui', + 'partial' => 'Sebagian', + 'paid' => 'Dibayar', + ], + + 'messages' => [ + 'email_sent' => 'Email faktur telah berhasil dikirim!', + 'marked_sent' => 'Faktur ditandai sebagai berhasil dikirim!', + 'email_required' => 'Tidak ada alamat email untuk pelanggan ini!', + ], + + 'notification' => [ + 'message' => 'Anda menerima email ini karena Anda memiliki faktur jumlah yang akan datang: pelanggan pelanggan.', + 'button' => 'Bayar sekarang', + ], + +]; diff --git a/resources/lang/id-ID/items.php b/resources/lang/id-ID/items.php new file mode 100755 index 0000000..4281d5c --- /dev/null +++ b/resources/lang/id-ID/items.php @@ -0,0 +1,15 @@ + 'Jumlah | Banyaknya', + 'sales_price' => 'Harga Jual', + 'purchase_price' => 'Harga Beli', + 'sku' => 'SKU', + + 'notification' => [ + 'message' => 'Anda menerima email ini karena :name kehabisan stok.', + 'button' => 'Lihat sekarang', + ], + +]; diff --git a/resources/lang/id-ID/messages.php b/resources/lang/id-ID/messages.php new file mode 100755 index 0000000..2905818 --- /dev/null +++ b/resources/lang/id-ID/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => ':type ditambahkan!', + 'updated' => ':type diperbaharui!', + 'deleted' => ':type dihapus!', + 'duplicated' => ':type duplikat!', + 'imported' => ':type diimpor!', + 'enabled' => ':type enabled!', + 'disabled' => ':type disabled!', + ], + 'error' => [ + 'over_payment' => 'Error: Payment not added! Amount passes the total.', + 'not_user_company' => 'Kesalahan: Anda tidak diperbolehkan mengelola perusahaan ini!', + 'customer' => 'Galat: Pengguna tidak dibuat! :name telah menggunakan alamat email ini.', + 'no_file' => 'Kesalahan: Tidak ada file dipilih!', + 'last_category' => 'Error: Can not delete the last :type category!', + 'invalid_token' => 'Galat: Token yang dimasukkan tidak sah!', + 'import_column' => 'Error: :message Sheet name: :sheet. Line number: :line.', + 'import_sheet' => 'Error: Sheet name is not valid. Please, check the sample file.', + ], + 'warning' => [ + 'deleted' => 'PeringatanL: Anda tidak boleh menghapus :name karena memiliki :text terkaitan.', + 'disabled' => 'Peringatan: Anda tidak boleh menonaktifkan:name karena memiliki :text terkaitan.', + ], + +]; diff --git a/resources/lang/id-ID/modules.php b/resources/lang/id-ID/modules.php new file mode 100755 index 0000000..06c36c1 --- /dev/null +++ b/resources/lang/id-ID/modules.php @@ -0,0 +1,58 @@ + 'API Token', + 'api_token' => 'Token', + 'my_apps' => 'Aplikasi saya', + 'top_paid' => 'Dibayar atas', + 'new' => 'Baru', + 'top_free' => 'Gratis Teratas', + 'free' => 'GRATIS', + 'search' => 'Cari', + 'install' => 'Pasang', + 'buy_now' => 'Beli Sekarang', + 'token_link' => 'Klik disini untuk mendapatkan API token anda.', + 'no_apps' => 'Belum ada aplikasi dalam kategori ini.', + 'developer' => 'Apakah kamu seorang pengembangDisini Anda bisa belajar membuat aplikasi dan mulai menjual hari ini!', + + 'about' => 'Tentang', + + 'added' => 'Menambahkan', + 'updated' => 'Mempebarui', + 'compatibility' => 'Kesesuaian', + + 'installed' => ':module terpasang', + 'uninstalled' => ':module dihapus', + //'updated' => ':module updated', + 'enabled' => ':module diaktifkan', + 'disabled' => ':module dinonaktifkan', + + 'tab' => [ + 'installation' => 'Instalasi', + 'faq' => 'FAQ', + 'changelog' => 'Perubahan Catatan', + ], + + 'installation' => [ + 'header' => 'Instalasi Aplikasi', + 'download' => 'Mengunduh :module file.', + 'unzip' => 'Mengekstrak :module file.', + 'install' => 'Instalasi :module.', + ], + + 'badge' => [ + 'installed' => 'Terpasang', + ], + + 'button' => [ + 'uninstall' => 'Hapus', + 'disable' => 'Nonaktif', + 'enable' => 'Aktif', + ], + + 'my' => [ + 'purchased' => 'Dibeli', + 'installed' => 'Terpasang', + ], +]; diff --git a/resources/lang/id-ID/notifications.php b/resources/lang/id-ID/notifications.php new file mode 100755 index 0000000..88c2f9d --- /dev/null +++ b/resources/lang/id-ID/notifications.php @@ -0,0 +1,10 @@ + 'Whoops!', + 'hello' => 'Hello!', + 'salutation' => 'Regards,
    :company_name', + 'subcopy' => 'If you’re having trouble clicking the ":text" button, copy and paste the URL below into your web browser: [:url](:url)', + +]; diff --git a/resources/lang/id-ID/pagination.php b/resources/lang/id-ID/pagination.php new file mode 100755 index 0000000..2bb8ba2 --- /dev/null +++ b/resources/lang/id-ID/pagination.php @@ -0,0 +1,9 @@ + '« Sebelumnya', + 'next' => 'Berikutnya »', + 'showing' => 'Menampilkan :first ke :last dari :total :type', + +]; diff --git a/resources/lang/id-ID/passwords.php b/resources/lang/id-ID/passwords.php new file mode 100755 index 0000000..074dc2a --- /dev/null +++ b/resources/lang/id-ID/passwords.php @@ -0,0 +1,22 @@ + 'Kata sandi harus minimal enam karakter dan cocok dengan konfirmasi.', + 'reset' => 'Kata sandi Anda sudah direset!', + 'sent' => 'Kami sudah mengirim email yang berisi tautan untuk mereset kata sandi Anda!', + 'token' => 'Kata sandi token pengaturan ulang tidak sah.', + 'user' => "Kami tidak dapat menemukan pengguna dengan alamat surel tersebut.", + +]; diff --git a/resources/lang/id-ID/recurring.php b/resources/lang/id-ID/recurring.php new file mode 100755 index 0000000..6beb8e5 --- /dev/null +++ b/resources/lang/id-ID/recurring.php @@ -0,0 +1,20 @@ + 'Berulang', + 'every' => 'Setiap', + 'period' => 'Periode', + 'times' => 'Waktu', + 'daily' => 'Harian', + 'weekly' => 'Mingguan', + 'monthly' => 'Bulanan', + 'yearly' => 'Tahunan', + 'custom' => 'Sesuaikan', + 'days' => 'Hari', + 'weeks' => 'Minggu', + 'months' => 'Bulan', + 'years' => 'Tahun', + 'message' => 'Ini adalah :type berulang dan :type selanjutnya akan dibuat otomatis pada tanggal :date', + +]; diff --git a/resources/lang/id-ID/reports.php b/resources/lang/id-ID/reports.php new file mode 100755 index 0000000..2c7befa --- /dev/null +++ b/resources/lang/id-ID/reports.php @@ -0,0 +1,30 @@ + 'Tahun ini', + 'previous_year' => 'Tahun sebelumnya', + 'this_quarter' => 'Kuartal ini', + 'previous_quarter' => 'Kuartal sebelumnya', + 'last_12_months' => '12 Bulan terakhir', + 'profit_loss' => 'Laba & Rugi', + 'gross_profit' => 'Laba Kotor', + 'net_profit' => 'Laba Bersih', + 'total_expenses' => 'Total Pengeluaran', + 'net' => 'NET', + + 'summary' => [ + 'income' => 'Ringkasan Pendapatan', + 'expense' => 'Ringkasan Pengeluaran', + 'income_expense' => 'Pendapatan berbanding Pengeluaran', + 'tax' => 'Ringkasan Pajak', + ], + + 'quarter' => [ + '1' => 'Jan-Mar', + '2' => 'Apr-Jun', + '3' => 'Jul-Sep', + '4' => 'Okt-Des', + ], + +]; diff --git a/resources/lang/id-ID/settings.php b/resources/lang/id-ID/settings.php new file mode 100755 index 0000000..71c2aeb --- /dev/null +++ b/resources/lang/id-ID/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Nama', + 'email' => 'Email', + 'phone' => 'Telpon', + 'address' => 'Alamat', + 'logo' => 'Logo', + ], + 'localisation' => [ + 'tab' => 'Lokalisasi', + 'date' => [ + 'format' => 'Format Tanggal', + 'separator' => 'Pemisah Tanggal', + 'dash' => 'Strip (-)', + 'dot' => 'Titik (.)', + 'comma' => 'Koma (,)', + 'slash' => 'Garis Miring (/)', + 'space' => 'Spasi ( )', + ], + 'timezone' => 'Zona Waktu', + 'percent' => [ + 'title' => 'Percent (%) Position', + 'before' => 'Before Number', + 'after' => 'After Number', + ], + ], + 'invoice' => [ + 'tab' => 'Faktur', + 'prefix' => 'Prefix Nomor', + 'digit' => 'Digit nomor', + 'next' => 'Nomor Berikutnya', + 'logo' => 'Logo', + ], + 'default' => [ + 'tab' => 'Standar', + 'account' => 'Akun Utama', + 'currency' => 'Mata Uang Utama', + 'tax' => 'Kurs Pajak Utama', + 'payment' => 'Metode Pembayaran Utama', + 'language' => 'Bahasa Utama', + ], + 'email' => [ + 'protocol' => 'Protokol', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP Host', + 'port' => 'SMTP Port', + 'username' => 'Nama Pengguna SMTP', + 'password' => 'Kata Sandi SMTP', + 'encryption' => 'Keamanan SMTP', + 'none' => 'Tidak ada', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Sendmail Path', + 'log' => 'Log Email', + ], + 'scheduling' => [ + 'tab' => 'Penjadwalan', + 'send_invoice' => 'Kirim Pengingat Faktur', + 'invoice_days' => 'Kirim Setelah Jatuh Tempo', + 'send_bill' => 'Kirim Pengingat Tagihan', + 'bill_days' => 'Kirim Sebelum Jatuh Tempo', + 'cron_command' => 'Perintah Cron', + 'schedule_time' => 'Waktu untuk Menjalankan', + ], + 'appearance' => [ + 'tab' => 'Tampilan', + 'theme' => 'Tema', + 'light' => 'Terang', + 'dark' => 'Gelap', + 'list_limit' => 'Data Per Laman', + 'use_gravatar' => 'Gunakan Gravatar', + ], + 'system' => [ + 'tab' => 'Sistem', + 'session' => [ + 'lifetime' => 'Batas Waktu Session (Menit)', + 'handler' => 'Pemegang Session', + 'file' => 'File', + 'database' => 'Database', + ], + 'file_size' => 'Ukuran Maksimal File (MB)', + 'file_types' => 'Jenis File Yang Diperbolehkan', + ], + +]; diff --git a/resources/lang/id-ID/taxes.php b/resources/lang/id-ID/taxes.php new file mode 100755 index 0000000..bafca15 --- /dev/null +++ b/resources/lang/id-ID/taxes.php @@ -0,0 +1,8 @@ + 'Kurs', + 'rate_percent' => 'Kurs (%)', + +]; diff --git a/resources/lang/id-ID/transfers.php b/resources/lang/id-ID/transfers.php new file mode 100755 index 0000000..241cb15 --- /dev/null +++ b/resources/lang/id-ID/transfers.php @@ -0,0 +1,12 @@ + 'Dari Rekening', + 'to_account' => 'Ke Rekening', + + 'messages' => [ + 'delete' => ':from ke :to (:amount)', + ], + +]; diff --git a/resources/lang/id-ID/updates.php b/resources/lang/id-ID/updates.php new file mode 100755 index 0000000..363daa2 --- /dev/null +++ b/resources/lang/id-ID/updates.php @@ -0,0 +1,15 @@ + 'Versi Terpasang', + 'latest_version' => 'Revisi Terakhir', + 'update' => 'Memperbaharui Akaunting ke versi :version', + 'changelog' => 'Catatan Perubahan', + 'check' => 'Periksa', + 'new_core' => 'Versi terbaru Akaunting tersedia.', + 'latest_core' => 'Selamat! Anda telah memiliki revisi terbaru Akaunting. Pembaharuan keamanan untuk kedepan akan diterapkan secara otomatis.', + 'success' => 'Proses pembaharuan telah selesai dengan baik.', + 'error' => 'Proses pembaharuan gagal, silakan, coba lagi.', + +]; diff --git a/resources/lang/id-ID/validation.php b/resources/lang/id-ID/validation.php new file mode 100755 index 0000000..32b9a62 --- /dev/null +++ b/resources/lang/id-ID/validation.php @@ -0,0 +1,120 @@ + 'Isian :attribute harus diterima.', + 'active_url' => 'Isian :attribute bukan URL yang valid.', + 'after' => 'Isian :attribute harus tanggal setelah :date.', + 'after_or_equal' => 'Isian :attribute harus berupa tanggal setelah atau sama dengan tanggal :date.', + 'alpha' => 'Isian :attribute hanya boleh berisi huruf.', + 'alpha_dash' => 'Isian :attribute hanya boleh berisi huruf, angka, dan strip.', + 'alpha_num' => 'Isian :attribute hanya boleh berisi huruf dan angka.', + 'array' => 'Isian :attribute harus berupa sebuah array.', + 'before' => 'Isian :attribute harus tanggal sebelum :date.', + 'before_or_equal' => 'Isian :attribute harus berupa tanggal sebelum atau sama dengan tanggal :date.', + 'between' => [ + 'numeric' => 'Isian :attribute harus antara :min dan :max.', + 'file' => 'Isian :attribute harus antara :min dan :max kilobytes.', + 'string' => 'Isian :attribute harus antara :min dan :max karakter.', + 'array' => 'Isian :attribute harus antara :min dan :max item.', + ], + 'boolean' => 'Isian :attribute harus berupa true atau false', + 'confirmed' => 'Konfirmasi :attribute tidak cocok.', + 'date' => 'Isian :attribute bukan tanggal yang valid.', + 'date_format' => 'Isian :attribute tidak cocok dengan format :format.', + 'different' => 'Isian :attribute dan :other harus berbeda.', + 'digits' => 'Isian :attribute harus berupa angka :digits.', + 'digits_between' => 'Isian :attribute harus antara angka :min dan :max.', + 'dimensions' => 'Bidang :attribute tidak memiliki dimensi gambar yang valid.', + 'distinct' => 'Bidang isian :attribute memiliki nilai yang duplikat.', + 'email' => 'Isian :attribute harus berupa alamat surel yang valid.', + 'exists' => 'Isian :attribute yang dipilih tidak valid.', + 'file' => 'Bidang :attribute harus berupa sebuah berkas.', + 'filled' => 'Isian :attribute harus memiliki nilai.', + 'image' => 'Isian :attribute harus berupa gambar.', + 'in' => 'Isian :attribute yang dipilih tidak valid.', + 'in_array' => 'Bidang isian :attribute tidak terdapat dalam :other.', + 'integer' => 'Isian :attribute harus merupakan bilangan bulat.', + 'ip' => 'Isian :attribute harus berupa alamat IP yang valid.', + 'json' => 'Isian :attribute harus berupa JSON string yang valid.', + 'max' => [ + 'numeric' => 'Isian :attribute seharusnya tidak lebih dari :max.', + 'file' => 'Isian :attribute seharusnya tidak lebih dari :max kilobytes.', + 'string' => 'Isian :attribute seharusnya tidak lebih dari :max karakter.', + 'array' => 'Isian :attribute seharusnya tidak lebih dari :max item.', + ], + 'mimes' => 'Isian :attribute harus dokumen berjenis : :values.', + 'mimetypes' => 'Isian :attribute harus dokumen berjenis : :values.', + 'min' => [ + 'numeric' => 'Isian :attribute harus minimal :min.', + 'file' => 'Isian :attribute harus minimal :min kilobytes.', + 'string' => 'Isian :attribute harus minimal :min karakter.', + 'array' => 'Isian :attribute harus minimal :min item.', + ], + 'not_in' => 'Isian :attribute yang dipilih tidak valid.', + 'numeric' => 'Isian :attribute harus berupa angka.', + 'present' => 'Bidang isian :attribute wajib ada.', + 'regex' => 'Format isian :attribute tidak valid.', + 'required' => 'Bidang isian :attribute wajib diisi.', + 'required_if' => 'Bidang isian :attribute wajib diisi bila :other adalah :value.', + 'required_unless' => 'Bidang isian :attribute wajib diisi kecuali :other memiliki nilai :values.', + 'required_with' => 'Bidang isian :attribute wajib diisi bila terdapat :values.', + 'required_with_all' => 'Bidang isian :attribute wajib diisi bila terdapat :values.', + 'required_without' => 'Bidang isian :attribute wajib diisi bila tidak terdapat :values.', + 'required_without_all' => 'Bidang isian :attribute wajib diisi bila tidak terdapat ada :values.', + 'same' => 'Isian :attribute dan :other harus sama.', + 'size' => [ + 'numeric' => 'Isian :attribute harus berukuran :size.', + 'file' => 'Isian :attribute harus berukuran :size kilobyte.', + 'string' => 'Isian :attribute harus berukuran :size karakter.', + 'array' => 'Isian :attribute harus mengandung :size item.', + ], + 'string' => 'Isian :attribute harus berupa string.', + 'timezone' => 'Isian :attribute harus berupa zona waktu yang valid.', + 'unique' => 'Isian :attribute sudah ada sebelumnya.', + 'uploaded' => 'Isian :attribute gagal diunggah.', + 'url' => 'Format isian :attribute tidak valid.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'kustomisasi-pesan', + ], + 'invalid_currency' => 'The :attribute code is invalid.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/it-IT/accounts.php b/resources/lang/it-IT/accounts.php new file mode 100755 index 0000000..b8f2197 --- /dev/null +++ b/resources/lang/it-IT/accounts.php @@ -0,0 +1,14 @@ + 'Nome conto', + 'number' => 'Numero', + 'opening_balance' => 'Saldo residuo', + 'current_balance' => 'Saldo corrente', + 'bank_name' => 'Nome della banca', + 'bank_phone' => 'Telefono della Banca', + 'bank_address' => 'Indirizzo della banca', + 'default_account' => 'Conto predefinito', + +]; diff --git a/resources/lang/it-IT/auth.php b/resources/lang/it-IT/auth.php new file mode 100755 index 0000000..f4017d8 --- /dev/null +++ b/resources/lang/it-IT/auth.php @@ -0,0 +1,39 @@ + 'Profilo', + 'logout' => 'Esci', + 'login' => 'Accedi', + 'login_to' => 'Accedi per iniziare la sessione', + 'remember_me' => 'Ricordami', + 'forgot_password' => 'Password dimenticata', + 'reset_password' => 'Reimposta la Password', + 'enter_email' => 'Inserisci il tuo indirizzo email', + 'current_email' => 'Email attuale', + 'reset' => 'Reimposta', + 'never' => 'mai', + + 'password' => [ + 'current' => 'Password', + 'current_confirm' => 'Conferma Password', + 'new' => 'Nuova Password', + 'new_confirm' => 'Conferma Nuova Password', + ], + + 'error' => [ + 'self_delete' => 'Errore: Non puoi eliminarlo!', + 'no_company' => 'Errore: Nessuna società assegnata al tuo account. Per favore, contatta l\'amministratore di sistema.', + ], + + 'failed' => 'Credenziali non corrispondenti ai dati registrati.', + 'disabled' => 'Questo account è disattivato. Si prega di contattare l\'amministratore di sistema.', + 'throttle' => 'Troppi tentativi di accesso. Riprova tra :seconds secondi.', + + 'notification' => [ + 'message_1' => 'Hai ricevuto questa email perché abbiamo ricevuto una richiesta di reimpostazione della password per il tuo account.', + 'message_2' => 'Se non hai richiesto la reimpostazione della password, non sono necessarie ulteriori azioni.', + 'button' => 'Resetta la Password', + ], + +]; diff --git a/resources/lang/it-IT/bills.php b/resources/lang/it-IT/bills.php new file mode 100755 index 0000000..45c22eb --- /dev/null +++ b/resources/lang/it-IT/bills.php @@ -0,0 +1,46 @@ + 'Numero fattura di acquisto', + 'bill_date' => 'Data fattura di acquisto', + 'total_price' => 'Prezzo Totale', + 'due_date' => 'Data scadenza', + 'order_number' => 'Ordine di acquisto numero', + 'bill_from' => 'Fattura da', + + 'quantity' => 'Quantità', + 'price' => 'Prezzo', + 'sub_total' => 'Subtotale', + 'discount' => 'Sconto', + 'tax_total' => 'Totale imposta', + 'total' => 'Totale', + + 'item_name' => 'Nome dell\'articolo|Nomi degli articoli', + + 'show_discount' => ': discount% Sconto', + 'add_discount' => 'Aggiungi Sconto', + 'discount_desc' => 'di subtotale', + + 'payment_due' => 'Scadenza pagamento', + 'amount_due' => 'Importo dovuto', + 'paid' => 'Pagato', + 'histories' => 'Storico', + 'payments' => 'Pagamenti', + 'add_payment' => 'Aggiungere pagamento', + 'mark_received' => 'Segna come ricevuto', + 'download_pdf' => 'Scarica PDF', + 'send_mail' => 'Invia email', + + 'status' => [ + 'draft' => 'Bozza', + 'received' => 'Ricevuto', + 'partial' => 'Parziale', + 'paid' => 'Pagato', + ], + + 'messages' => [ + 'received' => 'Fattura segnata con successo come ricevuta!', + ], + +]; diff --git a/resources/lang/it-IT/companies.php b/resources/lang/it-IT/companies.php new file mode 100755 index 0000000..c91d164 --- /dev/null +++ b/resources/lang/it-IT/companies.php @@ -0,0 +1,13 @@ + 'Dominio', + 'logo' => 'Logo', + 'manage' => 'Gestisci aziende', + 'all' => 'Tutte le aziende', + 'error' => [ + 'delete_active' => 'Errore: Non puoi eliminare un\'azienda attiva, per favore, cambiala prima!', + ], + +]; diff --git a/resources/lang/it-IT/currencies.php b/resources/lang/it-IT/currencies.php new file mode 100755 index 0000000..3df732f --- /dev/null +++ b/resources/lang/it-IT/currencies.php @@ -0,0 +1,18 @@ + 'Codice', + 'rate' => 'Tasso', + 'default' => 'Valuta Predefinita', + 'decimal_mark' => 'Separatore dei decimali', + 'thousands_separator' => 'Separatore delle Migliaia', + 'precision' => 'Precisione', + 'symbol' => [ + 'symbol' => 'Simbolo', + 'position' => 'Posizione simbolo', + 'before' => 'Prima dell\'importo', + 'after' => 'Dopo l\'importo', + ] + +]; diff --git a/resources/lang/it-IT/customers.php b/resources/lang/it-IT/customers.php new file mode 100755 index 0000000..9ed5474 --- /dev/null +++ b/resources/lang/it-IT/customers.php @@ -0,0 +1,11 @@ + 'Abilitare la login?', + 'user_created' => 'Utente creato', + + 'error' => [ + 'email' => 'L\'email è già stata presa.' + ] +]; diff --git a/resources/lang/it-IT/dashboard.php b/resources/lang/it-IT/dashboard.php new file mode 100755 index 0000000..9f5a40b --- /dev/null +++ b/resources/lang/it-IT/dashboard.php @@ -0,0 +1,24 @@ + 'Totale entrate', + 'receivables' => 'Crediti', + 'open_invoices' => 'Fatture aperte', + 'overdue_invoices' => 'Fatture scadute', + 'total_expenses' => 'Totale spese', + 'payables' => 'Debiti', + 'open_bills' => 'Fatture aperte', + 'overdue_bills' => 'Fatture scadute', + 'total_profit' => 'Totale profitto', + 'open_profit' => 'Profitto aperto', + 'overdue_profit' => 'Profitto scaduto', + 'cash_flow' => 'Flusso di cassa', + 'no_profit_loss' => 'Nessuna perdita di profitto', + 'incomes_by_category' => 'Redditi di categoria', + 'expenses_by_category' => 'Spese per categoria', + 'account_balance' => 'Saldo del conto', + 'latest_incomes' => 'Redditi più recenti', + 'latest_expenses' => 'Spese più recenti', + +]; diff --git a/resources/lang/it-IT/demo.php b/resources/lang/it-IT/demo.php new file mode 100755 index 0000000..d943f0c --- /dev/null +++ b/resources/lang/it-IT/demo.php @@ -0,0 +1,16 @@ + 'Contanti', + 'categories_deposit' => 'Deposito', + 'categories_sales' => 'Vendite', + 'currencies_usd' => 'Dollaro USA', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Sterlina Regno Unito', + 'currencies_try' => 'Lira turca', + 'taxes_exempt' => 'Esenti da imposte', + 'taxes_normal' => 'Tassa normale', + 'taxes_sales' => 'Imposta sulle vendite', + +]; diff --git a/resources/lang/it-IT/footer.php b/resources/lang/it-IT/footer.php new file mode 100755 index 0000000..a7fcdfa --- /dev/null +++ b/resources/lang/it-IT/footer.php @@ -0,0 +1,9 @@ + 'Versione', + 'powered' => 'Powered By Akaunting', + 'software' => 'Free Accounting Software', + +]; diff --git a/resources/lang/it-IT/general.php b/resources/lang/it-IT/general.php new file mode 100755 index 0000000..105a525 --- /dev/null +++ b/resources/lang/it-IT/general.php @@ -0,0 +1,121 @@ + 'Articolo|Articoli', + 'incomes' => 'Entrata|Entrate', + 'invoices' => 'Fattura|Fatture', + 'revenues' => 'Reddito|Redditi', + 'customers' => 'Cliente|Clienti', + 'expenses' => 'Uscita|Uscite', + 'bills' => 'Fattura di acquisto|Fatture di acquisto', + 'payments' => 'Pagamento|Pagamenti', + 'vendors' => 'Fornitore|Fornitori', + 'accounts' => 'Conto|Conti', + 'transfers' => 'Trasferimento|Trasferimenti', + 'transactions' => 'Transazione|Transazioni', + 'reports' => 'Relazione|Relazioni', + 'settings' => 'Impostazione|Impostazioni', + 'categories' => 'Categoria|Categorie', + 'currencies' => 'Valuta|Valute', + 'tax_rates' => 'Aliquota fiscale|Aliquote fiscali', + 'users' => 'Utente|Utenti', + 'roles' => 'Ruolo|Ruoli', + 'permissions' => 'Autorizzazione|Autorizzazioni', + 'modules' => 'App|Apps', + 'companies' => 'Azienda|Aziende', + 'profits' => 'Profitto|Profitti', + 'taxes' => 'Tasso|Tassi', + 'logos' => 'Logo|Loghi', + 'pictures' => 'Immagine|Immagini', + 'types' => 'Tipo|Tipi', + 'payment_methods' => 'Metodo di pagamento|Metodi di pagamento', + 'compares' => 'Entrata vs Uscita|Entrate vs Uscite', + 'notes' => 'Nota|Note', + 'totals' => 'Totale|Totali', + 'languages' => 'Lingua|Lingue', + 'updates' => 'Aggiornamento|Aggiornamenti', + 'numbers' => 'Numero|Numeri', + 'statuses' => 'Stato|Stati', + 'others' => 'Altro|Altri', + + 'dashboard' => 'Cruscotto', + 'banking' => 'Banca', + 'general' => 'Generale', + 'no_records' => 'Nessun record.', + 'date' => 'Data', + 'amount' => 'Importo', + 'enabled' => 'Attivato', + 'disabled' => 'Disattivato', + 'yes' => 'Sì', + 'no' => 'No', + 'na' => 'N/A', + 'daily' => 'Giornaliero', + 'monthly' => 'Mensile', + 'quarterly' => 'Trimestrale', + 'yearly' => 'Annuale', + 'add' => 'Aggiungi', + 'add_new' => 'Aggiungi nuovo', + 'show' => 'Mostra', + 'edit' => 'Modifica', + 'delete' => 'Elimina', + 'send' => 'Invia', + 'download' => 'Scarica', + 'delete_confirm' => 'Conferma eliminazione :name :type?', + 'name' => 'Nome', + 'email' => 'Email', + 'tax_number' => 'Codice fiscale', + 'phone' => 'Telefono', + 'address' => 'Indirizzo', + 'website' => 'Sito Web', + 'actions' => 'Azioni', + 'description' => 'Descrizione', + 'manage' => 'Gestisci', + 'code' => 'Codice', + 'alias' => 'Alias', + 'balance' => 'Bilancio', + 'reference' => 'Referenza', + 'attachment' => 'Allegato', + 'change' => 'Cambia', + 'switch' => 'Passa', + 'color' => 'Colore', + 'save' => 'Salva', + 'cancel' => 'Annulla', + 'from' => 'Da', + 'to' => 'A', + 'print' => 'Stampa', + 'search' => 'Cerca', + 'search_placeholder' => 'Tipo da ricercare...', + 'filter' => 'Filtro', + 'help' => 'Aiuto', + 'all' => 'Tutti', + 'all_type' => 'Tutti :type', + 'upcoming' => 'Imminente', + 'created' => 'Creato', + 'id' => 'ID', + 'more_actions' => 'Altre azioni', + 'duplicate' => 'Duplicato', + 'unpaid' => 'Non pagato', + 'paid' => 'Pagato', + 'overdue' => 'In Ritardo', + 'partially' => 'Parzialmente', + 'partially_paid' => 'Parzialmente Pagato', + 'export' => 'Esporta', + 'enable' => 'Attiva', + 'disable' => 'Disattiva', + + 'title' => [ + 'new' => 'Nuovo :type', + 'edit' => 'Modifica :type', + ], + + 'form' => [ + 'enter' => 'Immettere :field', + 'select' => [ + 'field' => '-Seleziona :field -', + 'file' => 'Seleziona File', + ], + 'no_file_selected' => 'Nessun file selezionato...', + ], + +]; diff --git a/resources/lang/it-IT/header.php b/resources/lang/it-IT/header.php new file mode 100755 index 0000000..495ddb3 --- /dev/null +++ b/resources/lang/it-IT/header.php @@ -0,0 +1,15 @@ + 'Cambia lingua', + 'last_login' => 'Ultimo accesso :time', + 'notifications' => [ + 'counter' => '{0} Non hai nessuna notifica |{1} Hai :count notifica|[2,*] Hai :count notifiche', + 'overdue_invoices' => '{1} :count fattura scaduta|[2, *] :count fatture scadute', + 'upcoming_bills' => '{1} :count fattura di acquisto imminente|[2, *] :count fatture di acquisto imminenti', + 'items_stock' => '{1} :count articolo esaurito|[2, *] :count articoli esauriti', + 'view_all' => 'Visualizza tutti' + ], + +]; diff --git a/resources/lang/it-IT/import.php b/resources/lang/it-IT/import.php new file mode 100755 index 0000000..02570bb --- /dev/null +++ b/resources/lang/it-IT/import.php @@ -0,0 +1,9 @@ + 'Importa', + 'title' => 'Importazione :type', + 'message' => 'Tipi di file consentiti: XLS, XLSX. Prego, scaricare il file di esempio.', + +]; diff --git a/resources/lang/it-IT/install.php b/resources/lang/it-IT/install.php new file mode 100755 index 0000000..dfa79bb --- /dev/null +++ b/resources/lang/it-IT/install.php @@ -0,0 +1,44 @@ + 'Successivo', + 'refresh' => 'Aggiorna', + + 'steps' => [ + 'requirements' => 'Per favore, chiedi al tuo fornitore di hosting di correggere gli errori!', + 'language' => 'Passo 1/3: Selezione della lingua', + 'database' => 'Passo 2/3: Configurazione del Database', + 'settings' => 'Passo 3/3: Azienda e dettagli Amministrazione', + ], + + 'language' => [ + 'select' => 'Seleziona la lingua', + ], + + 'requirements' => [ + 'enabled' => ':feature deve essere abilitata!', + 'disabled' => ':feature deve essere disabilitata!', + 'extension' => ':extension estensione deve essere installata e caricata!', + 'directory' => 'la cartella :directory deve essere scrivibile!', + ], + + 'database' => [ + 'hostname' => 'Hostname', + 'username' => 'Username', + 'password' => 'Password', + 'name' => 'Database', + ], + + 'settings' => [ + 'company_name' => 'Nome Azienda', + 'company_email' => 'Email azienda', + 'admin_email' => 'E-mail dell\'amministratore', + 'admin_password' => 'Password amministratore:', + ], + + 'error' => [ + 'connection' => 'Errore: Impossibile connettersi al database! Per favore, assicurati che i dettagli siano corretti.', + ], + +]; diff --git a/resources/lang/it-IT/invoices.php b/resources/lang/it-IT/invoices.php new file mode 100755 index 0000000..98eda49 --- /dev/null +++ b/resources/lang/it-IT/invoices.php @@ -0,0 +1,55 @@ + 'Numero fattura', + 'invoice_date' => 'Data fattura', + 'total_price' => 'Prezzo Totale', + 'due_date' => 'Data scadenza', + 'order_number' => 'Numero d\'ordine', + 'bill_to' => 'Fatturare a', + + 'quantity' => 'Quantità', + 'price' => 'Prezzo', + 'sub_total' => 'Subtotale', + 'discount' => 'Sconto', + 'tax_total' => 'Totale imposte', + 'total' => 'Totale', + + 'item_name' => 'Nome dell\'articolo|Nomi degli articoli', + + 'show_discount' => ': discount% Sconto', + 'add_discount' => 'Aggiungi Sconto', + 'discount_desc' => 'di subtotale', + + 'payment_due' => 'Scadenza pagamento', + 'paid' => 'Pagato', + 'histories' => 'Storico', + 'payments' => 'Pagamenti', + 'add_payment' => 'Aggiungere pagamento', + 'mark_paid' => 'Segna come pagata', + 'mark_sent' => 'Segna come inviata', + 'download_pdf' => 'Scarica PDF', + 'send_mail' => 'Invia email', + + 'status' => [ + 'draft' => 'Bozza', + 'sent' => 'Inviato', + 'viewed' => 'Visto', + 'approved' => 'Approvato', + 'partial' => 'Parziale', + 'paid' => 'Pagato', + ], + + 'messages' => [ + 'email_sent' => 'La mail è stata inviata con successo.', + 'marked_sent' => 'La mail è stata contrassegnata con successo come inviata.', + 'email_required' => 'Nessun indirizzo email per questo cliente!', + ], + + 'notification' => [ + 'message' => 'Hai ricevuto questa e-mail perché avete un imminente importo di :amount a :customer cliente.', + 'button' => 'Paga adesso', + ], + +]; diff --git a/resources/lang/it-IT/items.php b/resources/lang/it-IT/items.php new file mode 100755 index 0000000..904f2d0 --- /dev/null +++ b/resources/lang/it-IT/items.php @@ -0,0 +1,15 @@ + 'Quantità|Quantità', + 'sales_price' => 'Prezzo di vendita', + 'purchase_price' => 'Prezzo d\'acquisto', + 'sku' => 'Cod.Art.', + + 'notification' => [ + 'message' => 'Hai ricevuto questa e-mail perché il :name è in esaurimento.', + 'button' => 'Mostra ora', + ], + +]; diff --git a/resources/lang/it-IT/messages.php b/resources/lang/it-IT/messages.php new file mode 100755 index 0000000..3d5f27d --- /dev/null +++ b/resources/lang/it-IT/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => ':type aggiunto!', + 'updated' => ':type aggiornato!', + 'deleted' => ':type eliminato!', + 'duplicated' => ':type duplicato!', + 'imported' => ':type importato!', + 'enabled' => ':type enabled!', + 'disabled' => ':type disabled!', + ], + 'error' => [ + 'over_payment' => 'Errore: Pagamento non aggiunto! L\'importo supera il totale.', + 'not_user_company' => 'Errore: Non hai i permessi per gestire questa azienda!', + 'customer' => 'Errore: Utente non creato! :name usa già questo indirizzo email.', + 'no_file' => 'Errore: Nessun file selezionato!', + 'last_category' => 'Error: Can not delete the last :type category!', + 'invalid_token' => 'Error: The token entered is invalid!', + 'import_column' => 'Error: :message Sheet name: :sheet. Line number: :line.', + 'import_sheet' => 'Error: Sheet name is not valid. Please, check the sample file.', + ], + 'warning' => [ + 'deleted' => 'Attenzione: Non è consentito eliminare :name perché ha :text collegato.', + 'disabled' => 'Attenzione: Non è consentito disabilitare :name perché ha :text collegato.', + ], + +]; diff --git a/resources/lang/it-IT/modules.php b/resources/lang/it-IT/modules.php new file mode 100755 index 0000000..a0bd252 --- /dev/null +++ b/resources/lang/it-IT/modules.php @@ -0,0 +1,58 @@ + 'API Token', + 'api_token' => 'Token', + 'my_apps' => 'Le mie Applicazioni', + 'top_paid' => 'Più pagate', + 'new' => 'Nuovo', + 'top_free' => 'Top gratis', + 'free' => 'GRATIS', + 'search' => 'Ricerca', + 'install' => 'Installa', + 'buy_now' => 'Acquista ora', + 'token_link' => ' Clicca qui per ottenere il tuo API token.', + 'no_apps' => 'Non c\'è nessuna apps in questa categoria, ancora.', + 'developer' => 'Sei uno sviluppatore? Qui si può imparare a creare un\'app e iniziare a vendere oggi!', + + 'about' => 'Info', + + 'added' => 'Aggiunto', + 'updated' => 'Aggiornato', + 'compatibility' => 'Compatibilità', + + 'installed' => ':module installato', + 'uninstalled' => ':module disinstallato', + //'updated' => ':module updated', + 'enabled' => ':module abilitato', + 'disabled' => ':module disabilitato', + + 'tab' => [ + 'installation' => 'Installazione', + 'faq' => 'FAQ', + 'changelog' => 'Modifiche di Versione', + ], + + 'installation' => [ + 'header' => 'Installazione di App', + 'download' => 'Scaricamento del file del modulo :module.', + 'unzip' => 'Estrazione files del modulo :module.', + 'install' => 'Installazione dei files del modulo :module.', + ], + + 'badge' => [ + 'installed' => 'Installato', + ], + + 'button' => [ + 'uninstall' => 'Disinstalla', + 'disable' => 'Disabilita', + 'enable' => 'Attiva', + ], + + 'my' => [ + 'purchased' => 'Acquistato', + 'installed' => 'Installato', + ], +]; diff --git a/resources/lang/it-IT/notifications.php b/resources/lang/it-IT/notifications.php new file mode 100755 index 0000000..e5c4480 --- /dev/null +++ b/resources/lang/it-IT/notifications.php @@ -0,0 +1,10 @@ + 'Whoops!', + 'hello' => 'Ciao!', + 'salutation' => 'Saluti,
    : company_name', + 'subcopy' => 'Se stai avendo problemi cliccando il ":testo" pulsante, copiare e incollare l\'URL qui sotto nel tuo browser web: [:url](:url)', + +]; diff --git a/resources/lang/it-IT/pagination.php b/resources/lang/it-IT/pagination.php new file mode 100755 index 0000000..674ec4b --- /dev/null +++ b/resources/lang/it-IT/pagination.php @@ -0,0 +1,9 @@ + '« Precedente', + 'next' => 'Prossimo »', + 'showing' => 'Visualizza dal :first al :last di :total :type', + +]; diff --git a/resources/lang/it-IT/passwords.php b/resources/lang/it-IT/passwords.php new file mode 100755 index 0000000..67f08a2 --- /dev/null +++ b/resources/lang/it-IT/passwords.php @@ -0,0 +1,22 @@ + 'Le password devono essere di almeno 6 caratteri e devono coincidere.', + 'reset' => 'La password è stata reimpostata!', + 'sent' => 'Promemoria della password inviato!', + 'token' => 'Questo token per la reimpostazione della password non è valido.', + 'user' => "Non esiste un utente associato a questo indirizzo e-mail.", + +]; diff --git a/resources/lang/it-IT/recurring.php b/resources/lang/it-IT/recurring.php new file mode 100755 index 0000000..0438877 --- /dev/null +++ b/resources/lang/it-IT/recurring.php @@ -0,0 +1,20 @@ + 'Recurring', + 'every' => 'Ogni', + 'period' => 'Periodo', + 'times' => 'Volte', + 'daily' => 'Quotidiano', + 'weekly' => 'Settimanalmente', + 'monthly' => 'Mensile', + 'yearly' => 'Annuale', + 'custom' => 'Custom', + 'days' => 'Day(s)', + 'weeks' => 'Week(s)', + 'months' => 'Month(s)', + 'years' => 'Year(s)', + 'message' => 'This is a recurring :type and the next :type will be automatically generated at :date', + +]; diff --git a/resources/lang/it-IT/reports.php b/resources/lang/it-IT/reports.php new file mode 100755 index 0000000..01f3fbd --- /dev/null +++ b/resources/lang/it-IT/reports.php @@ -0,0 +1,30 @@ + 'Anno Corrente', + 'previous_year' => 'Anno Precedente', + 'this_quarter' => 'Trimestre Corrente', + 'previous_quarter' => 'Trimestre precedente', + 'last_12_months' => 'Ultimi 12 mesi', + 'profit_loss' => 'Profit & Loss', + 'gross_profit' => 'Gross Profit', + 'net_profit' => 'Net Profit', + 'total_expenses' => 'Total Expenses', + 'net' => 'NET', + + 'summary' => [ + 'income' => 'Riepilogo di reddito', + 'expense' => 'Riepilogo spese', + 'income_expense' => 'Reddito vs Spese', + 'tax' => 'Tax Summary', + ], + + 'quarter' => [ + '1' => 'Jan-Mar', + '2' => 'Apr-Jun', + '3' => 'Jul-Sep', + '4' => 'Oct-Dec', + ], + +]; diff --git a/resources/lang/it-IT/settings.php b/resources/lang/it-IT/settings.php new file mode 100755 index 0000000..11137a3 --- /dev/null +++ b/resources/lang/it-IT/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Nome', + 'email' => 'Email', + 'phone' => 'Telefono', + 'address' => 'Indirizzo', + 'logo' => 'Logo', + ], + 'localisation' => [ + 'tab' => 'Localizzazione', + 'date' => [ + 'format' => 'Formato data', + 'separator' => 'Separatore di data', + 'dash' => 'Trattino (-)', + 'dot' => 'Punto (.)', + 'comma' => 'Virgola (,)', + 'slash' => 'Slash (/)', + 'space' => 'Spazio ( )', + ], + 'timezone' => 'Fuso Orario', + 'percent' => [ + 'title' => 'Percentuale (%) Posizione', + 'before' => 'Prima del Numero', + 'after' => 'Dopo il Numero', + ], + ], + 'invoice' => [ + 'tab' => 'Fattura', + 'prefix' => 'Prefisso del numero', + 'digit' => 'Numero cifre', + 'next' => 'Codice fiscale', + 'logo' => 'Logo', + ], + 'default' => [ + 'tab' => 'Predefiniti', + 'account' => 'Conto predefinito', + 'currency' => 'Valuta Predefinita', + 'tax' => 'Aliquota d\'imposta predefinito', + 'payment' => 'Metodo di pagamento predefinito', + 'language' => 'Lingua predefinita', + ], + 'email' => [ + 'protocol' => 'Protocollo', + 'php' => 'Mail PHP', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'Host SMTP', + 'port' => 'Porta SMTP', + 'username' => 'Nome utente SMTP', + 'password' => 'Password SMTP', + 'encryption' => 'Protezione SMTP', + 'none' => 'Nessuno', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Percorso Sendmail', + 'log' => 'Log Emails', + ], + 'scheduling' => [ + 'tab' => 'Pianificazioni', + 'send_invoice' => 'Inviare promemoria fattura', + 'invoice_days' => 'Inviare dopo Due giorni', + 'send_bill' => 'Inviare promemoria pagamenti', + 'bill_days' => 'Inviare entro Due giorni', + 'cron_command' => 'Comando cron', + 'schedule_time' => 'Ora di esecuzione', + ], + 'appearance' => [ + 'tab' => 'Aspetto', + 'theme' => 'Tema', + 'light' => 'Chiaro', + 'dark' => 'Scuro', + 'list_limit' => 'Risultati per Pagina', + 'use_gravatar' => 'Utilizzare Gravatar', + ], + 'system' => [ + 'tab' => 'Sistema', + 'session' => [ + 'lifetime' => 'Durata della sessione (minuti)', + 'handler' => 'Gestore di sessione', + 'file' => 'File', + 'database' => 'Database', + ], + 'file_size' => 'Dimensione massima del file(MB)', + 'file_types' => 'Tipi di File consentiti', + ], + +]; diff --git a/resources/lang/it-IT/taxes.php b/resources/lang/it-IT/taxes.php new file mode 100755 index 0000000..9b6870d --- /dev/null +++ b/resources/lang/it-IT/taxes.php @@ -0,0 +1,8 @@ + 'Tasso', + 'rate_percent' => 'Tasso (%)', + +]; diff --git a/resources/lang/it-IT/transfers.php b/resources/lang/it-IT/transfers.php new file mode 100755 index 0000000..d9b3d89 --- /dev/null +++ b/resources/lang/it-IT/transfers.php @@ -0,0 +1,12 @@ + 'Dal conto', + 'to_account' => 'Al Conto', + + 'messages' => [ + 'delete' => ':from to :to (:amount)', + ], + +]; diff --git a/resources/lang/it-IT/updates.php b/resources/lang/it-IT/updates.php new file mode 100755 index 0000000..fede9a8 --- /dev/null +++ b/resources/lang/it-IT/updates.php @@ -0,0 +1,15 @@ + 'Versione installata', + 'latest_version' => 'Ultima versione', + 'update' => 'Aggiornamento Akaunting alla versione :version', + 'changelog' => 'Modifiche di Versione', + 'check' => 'Controlla', + 'new_core' => 'È disponibile una versione aggiornata di Akaunting.', + 'latest_core' => 'Congratulazioni! Hai l\'ultima versione di Akaunting. Aggiornamenti di sicurezza per il futuro verranno applicati automaticamente.', + 'success' => 'Installazione completata con successo.', + 'error' => 'Processo di aggiornamento non è riuscito, per favore, riprova.', + +]; diff --git a/resources/lang/it-IT/validation.php b/resources/lang/it-IT/validation.php new file mode 100755 index 0000000..40fa462 --- /dev/null +++ b/resources/lang/it-IT/validation.php @@ -0,0 +1,120 @@ + ':attribute deve essere accettato.', + 'active_url' => ':attribute non è un URL valido.', + 'after' => ':attribute deve essere una data successiva al :date.', + 'after_or_equal' => ':attribute deve essere una data successiva o uguale al :date.', + 'alpha' => ':attribute può contenere solo lettere.', + 'alpha_dash' => ':attribute può contenere solo lettere, numeri e trattini.', + 'alpha_num' => ':attribute può contenere solo lettere e numeri.', + 'array' => ':attribute deve essere un array.', + 'before' => ':attribute deve essere una data precedente al :date.', + 'before_or_equal' => ':attribute deve essere una data precedente o uguale al :date.', + 'between' => [ + 'numeric' => ':attribute deve trovarsi tra :min - :max.', + 'file' => ':attribute deve trovarsi tra :min - :max kilobytes.', + 'string' => ':attribute deve trovarsi tra :min - :max caratteri.', + 'array' => ':attribute deve avere tra :min - :max elementi.', + ], + 'boolean' => 'Il campo :attribute deve essere vero o falso.', + 'confirmed' => 'Il campo di conferma per :attribute non coincide.', + 'date' => ':attribute non è una data valida.', + 'date_format' => ':attribute non coincide con il formato :format.', + 'different' => ':attribute e :other devono essere differenti.', + 'digits' => ':attribute deve essere di :digits cifre.', + 'digits_between' => ':attribute deve essere tra :min e :max cifre.', + 'dimensions' => 'Le dimensioni dell\'immagine di :attribute non sono valide.', + 'distinct' => ':attribute contiene un valore duplicato.', + 'email' => ':attribute non è valido.', + 'exists' => ':attribute selezionato non è valido.', + 'file' => ':attribute deve essere un file.', + 'filled' => 'Il campo :attribute è richiesto.', + 'image' => ':attribute deve essere un\'immagine.', + 'in' => ':attribute selezionato non è valido.', + 'in_array' => 'Il valore del campo :attribute non esiste in :other.', + 'integer' => ':attribute deve essere un numero intero.', + 'ip' => ':attribute deve essere un indirizzo IP valido.', + 'json' => ':attribute deve essere una stringa JSON valida.', + 'max' => [ + 'numeric' => ':attribute non può essere superiore a :max.', + 'file' => ':attribute non può essere superiore a :max kilobytes.', + 'string' => ':attribute non può contenere più di :max caratteri.', + 'array' => ':attribute non può avere più di :max elementi.', + ], + 'mimes' => ':attribute deve essere del tipo: :values.', + 'mimetypes' => ':attribute deve essere del tipo: :values.', + 'min' => [ + 'numeric' => ':attribute deve essere almeno :min.', + 'file' => ':attribute deve essere almeno di :min kilobytes.', + 'string' => ':attribute deve contenere almeno :min caratteri.', + 'array' => ':attribute deve avere almeno :min elementi.', + ], + 'not_in' => 'Il valore selezionato per :attribute non è valido.', + 'numeric' => ':attribute deve essere un numero.', + 'present' => 'Il campo :attribute deve essere presente.', + 'regex' => 'Il formato del campo :attribute non è valido.', + 'required' => 'Il campo :attribute è richiesto.', + 'required_if' => 'Il campo :attribute è richiesto quando :other è :value.', + 'required_unless' => 'Il campo :attribute è richiesto a meno che :other sia in :values.', + 'required_with' => 'Il campo :attribute è richiesto quando :values è presente.', + 'required_with_all' => 'Il campo :attribute è richiesto quando :values è presente.', + 'required_without' => 'Il campo :attribute è richiesto quando :values non è presente.', + 'required_without_all' => 'Il campo :attribute è richiesto quando nessuno di :values è presente.', + 'same' => ':attribute e :other devono coincidere.', + 'size' => [ + 'numeric' => ':attribute deve essere :size.', + 'file' => ':attribute deve essere :size kilobytes.', + 'string' => ':attribute deve contenere :size caratteri.', + 'array' => ':attribute deve contenere :size elementi.', + ], + 'string' => ':attribute deve essere una stringa.', + 'timezone' => ':attribute deve essere una zona valida.', + 'unique' => ':attribute è stato già utilizzato.', + 'uploaded' => ':attribute non è stato caricato.', + 'url' => 'Il formato del campo :attribute non è valido.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'messaggio-personalizzato', + ], + 'invalid_currency' => ':attribute codice non è valido.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/lv-LV/accounts.php b/resources/lang/lv-LV/accounts.php new file mode 100755 index 0000000..329bbb4 --- /dev/null +++ b/resources/lang/lv-LV/accounts.php @@ -0,0 +1,14 @@ + 'Konta nosaukums', + 'number' => 'Konta numurs', + 'opening_balance' => 'Sākuma atlikums', + 'current_balance' => 'Beigu atlikums', + 'bank_name' => 'Bankas nosaukums', + 'bank_phone' => 'Bankas tālrunis', + 'bank_address' => 'Bankas adrese', + 'default_account' => 'Noklusētais konts', + +]; diff --git a/resources/lang/lv-LV/auth.php b/resources/lang/lv-LV/auth.php new file mode 100755 index 0000000..71dbc76 --- /dev/null +++ b/resources/lang/lv-LV/auth.php @@ -0,0 +1,39 @@ + 'Profils', + 'logout' => 'Iziet', + 'login' => 'Pieslēgties', + 'login_to' => 'Pieslēgties, lai sāktu darbu', + 'remember_me' => 'Atcerēties mani', + 'forgot_password' => 'Es aizmirsu savu paroli', + 'reset_password' => 'Atjaunot paroli', + 'enter_email' => 'Ievadiet e-pasta adresi', + 'current_email' => 'E-pasta adrese', + 'reset' => 'Atiestatīt', + 'never' => 'nekad', + + 'password' => [ + 'current' => 'Parole', + 'current_confirm' => 'Paroles apstiprinājums', + 'new' => 'Jauna parole', + 'new_confirm' => 'Paroles apstiprinājums', + ], + + 'error' => [ + 'self_delete' => 'Kļūda: Nevar izdzēst sevi!', + 'no_company' => 'Kļūda: Jūsu kontam nav piesaistīts neviens uzņēmums. Sazinieties, lūdzu, ar sistēmas administratoru.', + ], + + 'failed' => 'Lietotāja vārds un/vai parole ir nepareiza.', + 'disabled' => 'Šis konts ir atiespējots. Lūdzu, sazinieties ar sistēmas administratoru.', + 'throttle' => 'Pārāk daudz pieteikšanās mēģinājumu. Lūdzu, mēģiniet vēlreiz pēc :seconds sekundēm.', + + 'notification' => [ + 'message_1' => 'Jūs saņēmāt šo epastu, jo esam saņēmuši paroles atjaunošanas pieprasījumu Jūsu kontam.', + 'message_2' => 'Ja Jūs neesat veikši šo pieprasījumi, lūdzu ignorējiet to.', + 'button' => 'Atjaunot paroli', + ], + +]; diff --git a/resources/lang/lv-LV/bills.php b/resources/lang/lv-LV/bills.php new file mode 100755 index 0000000..177fed8 --- /dev/null +++ b/resources/lang/lv-LV/bills.php @@ -0,0 +1,46 @@ + 'Rēķina numurs', + 'bill_date' => 'Rēķina datums', + 'total_price' => 'Kopējā summa', + 'due_date' => 'Apmaksas termiņš', + 'order_number' => 'Pasūtījuma numurs', + 'bill_from' => 'Piegādātājs (pakalpojuma sniedzējs)', + + 'quantity' => 'Daudzums', + 'price' => 'Cena', + 'sub_total' => 'Kopā', + 'discount' => 'Atlaide', + 'tax_total' => 'Nodokļi kopā', + 'total' => 'Kopā', + + 'item_name' => 'Nosaukums|Nosaukums', + + 'show_discount' => 'Atlaide :discount%', + 'add_discount' => 'Pievienot atlaidi', + 'discount_desc' => 'no', + + 'payment_due' => 'Kavēts rēķins', + 'amount_due' => 'Kavēts maksājums', + 'paid' => 'Samaksāts', + 'histories' => 'Vēsture', + 'payments' => 'Maksājumi', + 'add_payment' => 'Pievienot maksājumu', + 'mark_received' => 'Mark Received', + 'download_pdf' => 'Lejupielādēt PDF', + 'send_mail' => 'Sūtīt e-pastu', + + 'status' => [ + 'draft' => 'Sagatave', + 'received' => 'Apstiprināts', + 'partial' => 'Daļējs', + 'paid' => 'Samaksāts', + ], + + 'messages' => [ + 'received' => 'Rēķina saņemšana ir apstiprināta!', + ], + +]; diff --git a/resources/lang/lv-LV/companies.php b/resources/lang/lv-LV/companies.php new file mode 100755 index 0000000..45ac3f9 --- /dev/null +++ b/resources/lang/lv-LV/companies.php @@ -0,0 +1,13 @@ + 'Domēns', + 'logo' => 'Logo', + 'manage' => 'Pārvaldīt uzņēmumus', + 'all' => 'Visi uzņēmumi', + 'error' => [ + 'delete_active' => 'Kļūda: Nevar dzēst aktīvo uzņēmumu. Lai dzēstu šo uzņēmumu, vispirms pārslēdzieties uz citu uzņēmumu!', + ], + +]; diff --git a/resources/lang/lv-LV/currencies.php b/resources/lang/lv-LV/currencies.php new file mode 100755 index 0000000..cfd2a8a --- /dev/null +++ b/resources/lang/lv-LV/currencies.php @@ -0,0 +1,18 @@ + 'Kods', + 'rate' => 'Kurss', + 'default' => 'Noklusētā valūta', + 'decimal_mark' => 'Decimālā zīme', + 'thousands_separator' => 'Tūkstošu atdalītāju', + 'precision' => 'Precizitāte', + 'symbol' => [ + 'symbol' => 'Simbols', + 'position' => 'Simbola novietojums', + 'before' => 'Pirms summas', + 'after' => 'Pēc summas', + ] + +]; diff --git a/resources/lang/lv-LV/customers.php b/resources/lang/lv-LV/customers.php new file mode 100755 index 0000000..56efaf9 --- /dev/null +++ b/resources/lang/lv-LV/customers.php @@ -0,0 +1,11 @@ + 'Atļaut ielogoties?', + 'user_created' => 'Lietotājs, kas izveidojis', + + 'error' => [ + 'email' => 'Lietotājs ar šādu e-pasta adresi jau eksistē.' + ] +]; diff --git a/resources/lang/lv-LV/dashboard.php b/resources/lang/lv-LV/dashboard.php new file mode 100755 index 0000000..4196589 --- /dev/null +++ b/resources/lang/lv-LV/dashboard.php @@ -0,0 +1,24 @@ + 'Kopējie ieņēmumi', + 'receivables' => 'Pircēju parādi', + 'open_invoices' => 'Neapmaksātie rēķini', + 'overdue_invoices' => 'Kavētie rēķini', + 'total_expenses' => 'Kopējās izmaksas', + 'payables' => 'Piegādātāju rēķini', + 'open_bills' => 'Neapmaksātie rēķini', + 'overdue_bills' => 'Kavētie rēķini', + 'total_profit' => 'Kopējā peļņa', + 'open_profit' => 'Neapmaksātā peļņa', + 'overdue_profit' => 'Peļņa (kavētie rēķini)', + 'cash_flow' => 'Naudas plūsma', + 'no_profit_loss' => 'No Profit Loss', + 'incomes_by_category' => 'Ieņēmumu kategorijas', + 'expenses_by_category' => 'Izdevumu kategorijas', + 'account_balance' => 'Konta atlikums', + 'latest_incomes' => 'Pēdējie ieņēmumi', + 'latest_expenses' => 'Pēdējās izmaksas', + +]; diff --git a/resources/lang/lv-LV/demo.php b/resources/lang/lv-LV/demo.php new file mode 100755 index 0000000..010030d --- /dev/null +++ b/resources/lang/lv-LV/demo.php @@ -0,0 +1,16 @@ + 'Skaidra nauda', + 'categories_deposit' => 'Bezskaidra nauda', + 'categories_sales' => 'Pārdošana', + 'currencies_usd' => 'ASV dolārs', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Angļu mārciņa', + 'currencies_try' => 'Turku lira', + 'taxes_exempt' => 'Ar nodokli neapliekams', + 'taxes_normal' => 'Ar nodokli apliekams', + 'taxes_sales' => 'PVN', + +]; diff --git a/resources/lang/lv-LV/footer.php b/resources/lang/lv-LV/footer.php new file mode 100755 index 0000000..ac11e2f --- /dev/null +++ b/resources/lang/lv-LV/footer.php @@ -0,0 +1,9 @@ + 'Versija', + 'powered' => 'Powered By Akaunting', + 'software' => 'Bezmaksas grāmatvedības programma', + +]; diff --git a/resources/lang/lv-LV/general.php b/resources/lang/lv-LV/general.php new file mode 100755 index 0000000..db48fc1 --- /dev/null +++ b/resources/lang/lv-LV/general.php @@ -0,0 +1,121 @@ + 'Preces|Preces', + 'incomes' => 'Ienākumi|Ienākumi', + 'invoices' => 'Rēķini|Rēķini', + 'revenues' => 'Ieņēmumi|Ieņēmumi', + 'customers' => 'Pircēji|Pircēji', + 'expenses' => 'Izdevumi|Izdevumi', + 'bills' => 'Rēķini|Rēķini', + 'payments' => 'Maksājumi|Maksājumi', + 'vendors' => 'Piegādātāji|Piegādātāji', + 'accounts' => 'Konts|Konti', + 'transfers' => 'Pārvedums|Pārvedumi', + 'transactions' => 'Transakcija|Transakcijas', + 'reports' => 'Pārskats|Pārskati', + 'settings' => 'Iestatījumi|Iestatījumi', + 'categories' => 'Kategorija|Kategorijas', + 'currencies' => 'Valūta|Valūtas', + 'tax_rates' => 'Nodokļa likme|Nodokļu likmes', + 'users' => 'Lietotājs|Lietotāji', + 'roles' => 'Loma|Lomas', + 'permissions' => 'Tiesība|Tiesības', + 'modules' => 'Papildinājumi|Papildinājumi', + 'companies' => 'Uzņēmums|Uzņēmumi', + 'profits' => 'Peļņa|Peļņa', + 'taxes' => 'Nodokļi|Nodokļi', + 'logos' => 'Logo|Logos', + 'pictures' => 'Attēli|Attēli', + 'types' => 'Tips|Tipi', + 'payment_methods' => 'Maksājumu veidi|Maksājumi veidi', + 'compares' => 'Ieņēmumi pret izdevumiem|Ieņēmumi pret izdevumiem', + 'notes' => 'Piezīmes|Piezīmes', + 'totals' => 'Kopā|Kopā', + 'languages' => 'Valoda|Valoda', + 'updates' => 'Atjauninājumi|Atjauninājumi', + 'numbers' => 'Skaitļi|Skaitļi', + 'statuses' => 'Statusi|Statusi', + 'others' => 'Citi|Citi', + + 'dashboard' => 'Sākums', + 'banking' => 'Banka', + 'general' => 'Galvenā', + 'no_records' => 'Ierakstu nav.', + 'date' => 'Datums', + 'amount' => 'Summa', + 'enabled' => 'Iespējots', + 'disabled' => 'Atspējots', + 'yes' => 'Jā', + 'no' => 'Nē', + 'na' => 'Nav pieejams', + 'daily' => 'Ikdienas', + 'monthly' => 'Ikmēneša', + 'quarterly' => 'Ceturkšņa', + 'yearly' => 'Gada', + 'add' => 'Pievienot', + 'add_new' => 'Pievienot jaunu', + 'show' => 'Skatīt', + 'edit' => 'Labot', + 'delete' => 'Dzēst', + 'send' => 'Sūtīt', + 'download' => 'Lejupielādēt', + 'delete_confirm' => 'Apstiprināt dzēšanu :name :type?', + 'name' => 'Nosaukums', + 'email' => 'E-pasts', + 'tax_number' => 'Nodokļu maksātāja numurs', + 'phone' => 'Tālrunis', + 'address' => 'Adrese', + 'website' => 'Mājas lapa', + 'actions' => 'Darbības', + 'description' => 'Apraksts', + 'manage' => 'Pārvaldīt', + 'code' => 'Kods', + 'alias' => 'Alias', + 'balance' => 'Bilance', + 'reference' => 'Reference', + 'attachment' => 'Pielikums', + 'change' => 'Mainīt', + 'switch' => 'Mainīt', + 'color' => 'Krāsa', + 'save' => 'Saglabāt', + 'cancel' => 'Atcelt', + 'from' => 'No', + 'to' => 'Kam', + 'print' => 'Drukāt', + 'search' => 'Meklēt', + 'search_placeholder' => 'Meklēt..', + 'filter' => 'Filtrs', + 'help' => 'Palīgs', + 'all' => 'Visi', + 'all_type' => 'Visi :type', + 'upcoming' => 'Tuvojošies', + 'created' => 'Izveidots', + 'id' => 'ID', + 'more_actions' => 'Citas darbības', + 'duplicate' => 'Dublikāts', + 'unpaid' => 'Neapmaksāts', + 'paid' => 'Apmaksāts', + 'overdue' => 'Kavēts', + 'partially' => 'Daļēji', + 'partially_paid' => 'Daļēji apmaksāts', + 'export' => 'Eksportēt', + 'enable' => 'Iespējot', + 'disable' => 'Atspējot', + + 'title' => [ + 'new' => 'Jauns :type', + 'edit' => 'Redigēts :type', + ], + + 'form' => [ + 'enter' => 'Ievadiet :field', + 'select' => [ + 'field' => '- Izvēlēties :field -', + 'file' => 'Izvēlēties failu', + ], + 'no_file_selected' => 'Fails nav izvēlēts...', + ], + +]; diff --git a/resources/lang/lv-LV/header.php b/resources/lang/lv-LV/header.php new file mode 100755 index 0000000..510917f --- /dev/null +++ b/resources/lang/lv-LV/header.php @@ -0,0 +1,15 @@ + 'Mainīt valodu', + 'last_login' => 'Pēdējā autorizācija :time', + 'notifications' => [ + 'counter' => '{0} Jums nav nevienas notifkācijas|{1} Jums ir :count notifikācija|[2,*] Jums ir :count notifikācijas', + 'overdue_invoices' => '{1} :count kavēts rēķins|[2,*] :count kavēti rēķini', + 'upcoming_bills' => '{1} Drīzumā jāapmaksā :count rēķins |[2,*] Drīzūmā jāapmaksā :count rēķini', + 'items_stock' => '{1} Noliktavā trūkst :count preces |[2,*] Noliktavā trūkst :count preču', + 'view_all' => 'Skatīt visus' + ], + +]; diff --git a/resources/lang/lv-LV/import.php b/resources/lang/lv-LV/import.php new file mode 100755 index 0000000..d8b9e2e --- /dev/null +++ b/resources/lang/lv-LV/import.php @@ -0,0 +1,9 @@ + 'Importēt', + 'title' => 'Importēt :type', + 'message' => 'Atļautie failu tipi: XLS, XLSX. Lejupielādēt faila paraugu', + +]; diff --git a/resources/lang/lv-LV/install.php b/resources/lang/lv-LV/install.php new file mode 100755 index 0000000..b768c15 --- /dev/null +++ b/resources/lang/lv-LV/install.php @@ -0,0 +1,44 @@ + 'Tālāk', + 'refresh' => 'Atjaunot', + + 'steps' => [ + 'requirements' => 'Nepieciešams atbilst šādām tehniskajām prasībām!', + 'language' => 'Solis 1/3 : Valodas izvēle', + 'database' => 'Solis 2/3 : Datubāzes iestatīšana', + 'settings' => 'Solis 3/3 : Uzņēmuma un administratora detaļas', + ], + + 'language' => [ + 'select' => 'Izvēlieties valodu', + ], + + 'requirements' => [ + 'enabled' => ':feature ir jāiespējo!', + 'disabled' => ':feature ir jāatspējo!', + 'extension' => ':extension nepieciešams ielādēt', + 'directory' => ':directory direktorijai jābūt rakstīšanas tiesībām!', + ], + + 'database' => [ + 'hostname' => 'Resursdators', + 'username' => 'Lietotājs', + 'password' => 'Parole', + 'name' => 'Datubāze', + ], + + 'settings' => [ + 'company_name' => 'Uzņēmuma nosaukums', + 'company_email' => 'Uzņēmuma e-pasts', + 'admin_email' => 'Administratora e-pasts', + 'admin_password' => 'Administratora parole', + ], + + 'error' => [ + 'connection' => 'Kļūda: Nevar savienoties ar datubāzi. Lūdzu pārliecinies, ka dati ir pareizi.', + ], + +]; diff --git a/resources/lang/lv-LV/invoices.php b/resources/lang/lv-LV/invoices.php new file mode 100755 index 0000000..ee5d8b4 --- /dev/null +++ b/resources/lang/lv-LV/invoices.php @@ -0,0 +1,55 @@ + 'Rēķina numurs', + 'invoice_date' => 'Rēķina datums', + 'total_price' => 'Kopējā summa', + 'due_date' => 'Apmaksas termiņš', + 'order_number' => 'Pasūtījuma numurs', + 'bill_to' => 'Piegādātājs', + + 'quantity' => 'Daudzums', + 'price' => 'Cena', + 'sub_total' => 'Summa', + 'discount' => 'Atlaide', + 'tax_total' => 'Atlaide kopā', + 'total' => 'Summa', + + 'item_name' => 'Nosaukums|Nosaukums', + + 'show_discount' => ':discount% atlaide', + 'add_discount' => 'Pieviento atlaidi', + 'discount_desc' => 'no summas', + + 'payment_due' => 'Apmaksas termiņš', + 'paid' => 'Samaksāts', + 'histories' => 'Vēsture', + 'payments' => 'Maksājumi', + 'add_payment' => 'Pievienot maksājumu', + 'mark_paid' => 'Atzīmēt kā samaksāts', + 'mark_sent' => 'Atzīmēt kā nosūtītu', + 'download_pdf' => 'Lejupielādēt PDF', + 'send_mail' => 'Sūtīt e-pastu', + + 'status' => [ + 'draft' => 'Sagatave', + 'sent' => 'Nosūtīts', + 'viewed' => 'Skatīts', + 'approved' => 'Apstiprināts', + 'partial' => 'Daļēji', + 'paid' => 'Samaksāts', + ], + + 'messages' => [ + 'email_sent' => 'Rēķins veiksmīgi nosūtīts uz e-pastu!', + 'marked_sent' => 'Rēķins atzīmēts kā nosūtīts!', + 'email_required' => 'Pircējam nav norādīta e-pasta adrese!', + ], + + 'notification' => [ + 'message' => 'Jūs saņemāt šo e-pastu, jo jums ir sagatavots rēķins par summu :amount, Rēķins izrakstīts :customer.', + 'button' => 'Apmaksāt', + ], + +]; diff --git a/resources/lang/lv-LV/items.php b/resources/lang/lv-LV/items.php new file mode 100755 index 0000000..d10ee85 --- /dev/null +++ b/resources/lang/lv-LV/items.php @@ -0,0 +1,15 @@ + 'Daudzums|Daudzums', + 'sales_price' => 'Pārdošanas cena', + 'purchase_price' => 'Iegādes cena', + 'sku' => 'Kods', + + 'notification' => [ + 'message' => 'Jūs saņemāt šo e-pastu, jo precei :name noliktavā beidzas atlikums.', + 'button' => 'Skatīt tagad', + ], + +]; diff --git a/resources/lang/lv-LV/messages.php b/resources/lang/lv-LV/messages.php new file mode 100755 index 0000000..d1fe93c --- /dev/null +++ b/resources/lang/lv-LV/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => ':type pievients!', + 'updated' => ':type atjaunināts!', + 'deleted' => ':type dzēsts!', + 'duplicated' => ':type kopēts!', + 'imported' => ':type importēts!', + 'enabled' => ':type iespējots!', + 'disabled' => ':type atspējots!', + ], + 'error' => [ + 'over_payment' => 'Kļūda: Maksājums nav pievienots! Nepietiekoša summa.', + 'not_user_company' => 'Kļūda: Jums nav tiesības strādāt ar šo uzņēmumu!', + 'customer' => 'Kļūda: Lietotājs nav izveidots! :name jau lieto šādu e-pasta adresi.', + 'no_file' => 'Kļūda: Fails nav izvēlēts!', + 'last_category' => 'Kļūda: Nevar izdzēst pēdējo :type kategoriju!', + 'invalid_token' => 'Kļūda: Ievadītā atslēga nav pareiza!', + 'import_column' => 'Kļūda: :message Lapas nosaukums: :sheet. Rindas numurs: :line.', + 'import_sheet' => 'Kļūda: Lapas nosaukums nav pareizs. Lūdzu pārbaudiet parauga failu.', + ], + 'warning' => [ + 'deleted' => 'Brīdinājums: Jums nav tiesību dzēst :name jo tas ir saistīts ar :text.', + 'disabled' => 'Brīdinājums: Jums nav tiesību atspējot :name jo tas ir saistīts ar :text.', + ], + +]; diff --git a/resources/lang/lv-LV/modules.php b/resources/lang/lv-LV/modules.php new file mode 100755 index 0000000..3beb981 --- /dev/null +++ b/resources/lang/lv-LV/modules.php @@ -0,0 +1,58 @@ + 'API atslēga', + 'api_token' => 'Atslēga', + 'my_apps' => 'Manas programmas', + 'top_paid' => 'Top maksas', + 'new' => 'Jaunas', + 'top_free' => 'Top bezmaksas', + 'free' => 'BEZMAKSAS', + 'search' => 'Meklēt', + 'install' => 'Instalēt', + 'buy_now' => 'Pirkt tagad', + 'token_link' => 'Spied šeit, lai saņemtu savu API atslēgu.', + 'no_apps' => 'Šajā kategorijā programmu vēl nav.', + 'developer' => 'Vai jūs esat izstrādātājs? Šeit jūs varat iemācīties, kā veidot programmas un sākt tās pārdot!', + + 'about' => 'Par', + + 'added' => 'Pievienots', + 'updated' => 'Atjaunināts', + 'compatibility' => 'Savietojamība', + + 'installed' => ':module instalēta', + 'uninstalled' => ':module atinstalēta', + //'updated' => ':module updated', + 'enabled' => ':module iespējots', + 'disabled' => ':module atspējots', + + 'tab' => [ + 'installation' => 'Instalācija', + 'faq' => 'BUJ', + 'changelog' => 'Izmaiņas', + ], + + 'installation' => [ + 'header' => 'Programmas instalācija', + 'download' => 'Lejupielādēju :module.', + 'unzip' => 'Atarhivēju :module.', + 'install' => 'Instalēju :module.', + ], + + 'badge' => [ + 'installed' => 'Instalēts', + ], + + 'button' => [ + 'uninstall' => 'Atinstalēt', + 'disable' => 'Atspējot', + 'enable' => 'Iespējot', + ], + + 'my' => [ + 'purchased' => 'Nopirkts', + 'installed' => 'Instalēts', + ], +]; diff --git a/resources/lang/lv-LV/notifications.php b/resources/lang/lv-LV/notifications.php new file mode 100755 index 0000000..a79a2e0 --- /dev/null +++ b/resources/lang/lv-LV/notifications.php @@ -0,0 +1,10 @@ + 'Whoops!', + 'hello' => 'Sveicināts!', + 'salutation' => 'Sveicieniem,
    : company_name', + 'subcopy' => 'Ja rodas problēmas, noklikšķinot uz ": tekstu" pogu, nokopējiet šo URL un ielīmējiet to savā web pārlūkprogrammā: [: url](:url)', + +]; diff --git a/resources/lang/lv-LV/pagination.php b/resources/lang/lv-LV/pagination.php new file mode 100755 index 0000000..38edce3 --- /dev/null +++ b/resources/lang/lv-LV/pagination.php @@ -0,0 +1,9 @@ + '« Nākamā', + 'next' => 'Iepriešējā »', + 'showing' => 'Rāda :first līdz :last no :total :type', + +]; diff --git a/resources/lang/lv-LV/passwords.php b/resources/lang/lv-LV/passwords.php new file mode 100755 index 0000000..8d4ed85 --- /dev/null +++ b/resources/lang/lv-LV/passwords.php @@ -0,0 +1,22 @@ + 'Parolei jābūt vismaz 6 zīmes garai.', + 'reset' => 'Jūsu parole ir atjaunota!', + 'sent' => 'Mēs jums uz e-pastu nosūtījām paroles atjaunošanas saiti!', + 'token' => 'Paroles atjaunošanas atslēga ir nederīga.', + 'user' => "Mēs nevaram atrast lietotāju ar šadu e-pasta adresi.", + +]; diff --git a/resources/lang/lv-LV/recurring.php b/resources/lang/lv-LV/recurring.php new file mode 100755 index 0000000..11e2141 --- /dev/null +++ b/resources/lang/lv-LV/recurring.php @@ -0,0 +1,20 @@ + 'Atkārtojošs', + 'every' => 'Katru', + 'period' => 'Periods', + 'times' => 'Skaits', + 'daily' => 'Katru dienu', + 'weekly' => 'Katru nedēļu', + 'monthly' => 'Katru mēnesi', + 'yearly' => 'Reizi gadā', + 'custom' => 'Cits', + 'days' => 'Diena(s)', + 'weeks' => 'Nedēļa(s)', + 'months' => 'Mēnesis(-ši)', + 'years' => 'Gads(-i)', + 'message' => ':type iestatīta atkārtošana. Nākošais :type tiks automātiski ģenerēts :date', + +]; diff --git a/resources/lang/lv-LV/reports.php b/resources/lang/lv-LV/reports.php new file mode 100755 index 0000000..96ff434 --- /dev/null +++ b/resources/lang/lv-LV/reports.php @@ -0,0 +1,30 @@ + 'Šogad', + 'previous_year' => 'Iepriekšējais gads', + 'this_quarter' => 'Šis ceturksnis', + 'previous_quarter' => 'Iepriekšējais ceturksnis', + 'last_12_months' => 'Iepriekšējie 12 mēneši', + 'profit_loss' => 'Peļņa un zaudējumi', + 'gross_profit' => 'Bruto peļņa', + 'net_profit' => 'Neto peļņa', + 'total_expenses' => 'Kopējie izdevumi', + 'net' => 'NET', + + 'summary' => [ + 'income' => 'Ieņēmumu kopsavilkums', + 'expense' => 'Izdevumu kopsavilkums', + 'income_expense' => 'Ieņēmumi pret izdevumiem', + 'tax' => 'Nodokļu kopsavilkums', + ], + + 'quarter' => [ + '1' => 'Jan-Mar', + '2' => 'Apr-Jun', + '3' => 'Jul-Sep', + '4' => 'Okt-Dec', + ], + +]; diff --git a/resources/lang/lv-LV/settings.php b/resources/lang/lv-LV/settings.php new file mode 100755 index 0000000..a7282c9 --- /dev/null +++ b/resources/lang/lv-LV/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Vārds', + 'email' => 'E-pasts', + 'phone' => 'Tālrunis', + 'address' => 'Adrese', + 'logo' => 'Logo', + ], + 'localisation' => [ + 'tab' => 'Reģionālie iestatījumi', + 'date' => [ + 'format' => 'Datuma formāts', + 'separator' => 'Datuma atdalītājs', + 'dash' => 'Domuzīme (-)', + 'dot' => 'Punkts (.)', + 'comma' => 'Komats (,)', + 'slash' => 'Daļsvītra (/)', + 'space' => 'Atstarpe ( )', + ], + 'timezone' => 'Laika zona', + 'percent' => [ + 'title' => 'Procentu (%) pozīcija', + 'before' => 'Pirms skaitļa', + 'after' => 'Pēc skaitļa', + ], + ], + 'invoice' => [ + 'tab' => 'Rēķini', + 'prefix' => 'Rēķina sākums', + 'digit' => 'Rēķina numura garums', + 'next' => 'Nākamais numurs', + 'logo' => 'Logo', + ], + 'default' => [ + 'tab' => 'Noklusētie iestatījumi', + 'account' => 'Noklusētais konts', + 'currency' => 'Noklusētā valūta', + 'tax' => 'Noklusētā PVN likme', + 'payment' => 'Noklusētā maksājuma metode', + 'language' => 'Noklusētā valoda', + ], + 'email' => [ + 'protocol' => 'Protokols', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP adrese', + 'port' => 'SMTP ports', + 'username' => 'SMTP lietotājs', + 'password' => 'SMTP parole', + 'encryption' => 'SMTP drošība', + 'none' => 'nav', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Sendmail ceļš', + 'log' => 'Auditēt e-pastus', + ], + 'scheduling' => [ + 'tab' => 'Atgādinājumi', + 'send_invoice' => 'Sūtīt rēķinu atgādinājumus', + 'invoice_days' => 'Sūtīt pēc kavētām dienām', + 'send_bill' => 'Sūtīt piegādātāju rēķinu atgādinājumus', + 'bill_days' => 'Sūtīt dienas pirms termiņa', + 'cron_command' => 'Cron komanda', + 'schedule_time' => 'Stunda kurā sūtīt', + ], + 'appearance' => [ + 'tab' => 'Izskats', + 'theme' => 'Tēma', + 'light' => 'Gaiša', + 'dark' => 'Tumša', + 'list_limit' => 'Ieraksti lapā', + 'use_gravatar' => 'Lietot attēlu', + ], + 'system' => [ + 'tab' => 'Sistēma', + 'session' => [ + 'lifetime' => 'Sesijas ilgums (minūtes)', + 'handler' => 'Sesijas uzturēšana', + 'file' => 'Fails', + 'database' => 'Datubāze', + ], + 'file_size' => 'Maksimālais faila lielums (MB)', + 'file_types' => 'Atļautie failu tipi', + ], + +]; diff --git a/resources/lang/lv-LV/taxes.php b/resources/lang/lv-LV/taxes.php new file mode 100755 index 0000000..468bc14 --- /dev/null +++ b/resources/lang/lv-LV/taxes.php @@ -0,0 +1,8 @@ + 'Likme', + 'rate_percent' => 'Likme (%)', + +]; diff --git a/resources/lang/lv-LV/transfers.php b/resources/lang/lv-LV/transfers.php new file mode 100755 index 0000000..9e2898a --- /dev/null +++ b/resources/lang/lv-LV/transfers.php @@ -0,0 +1,12 @@ + 'No konta', + 'to_account' => 'Uz kontu', + + 'messages' => [ + 'delete' => ':from uz :to (:amount)', + ], + +]; diff --git a/resources/lang/lv-LV/updates.php b/resources/lang/lv-LV/updates.php new file mode 100755 index 0000000..0448a68 --- /dev/null +++ b/resources/lang/lv-LV/updates.php @@ -0,0 +1,15 @@ + 'Instalēta versija', + 'latest_version' => 'Pēdējā versija', + 'update' => 'Atjaunināt Akaunting uz :version versiju', + 'changelog' => 'Izmaiņas', + 'check' => 'Pārbaudīt', + 'new_core' => 'Ir pieejama Akaunting atjaunināta versija.', + 'latest_core' => 'Apsveicu! Jums ir jaunākā Akaunting versija. Nākamos drošības uzlabojumus jūs saņemsiet automātiski.', + 'success' => 'Atjaunināšanas process ir veiksmīgi pabeigts.', + 'error' => 'Atjaunināšanas procesā notika kļūda, mēģiniet vēlreiz.', + +]; diff --git a/resources/lang/lv-LV/validation.php b/resources/lang/lv-LV/validation.php new file mode 100755 index 0000000..290e613 --- /dev/null +++ b/resources/lang/lv-LV/validation.php @@ -0,0 +1,120 @@ + ':attribute nepieciešams akceptēt.', + 'active_url' => ':attribute nav derīga URL adrese.', + 'after' => ':attribute datumam jābūt pēc :date datuma.', + 'after_or_equal' => ':attribute datumam jābūt vienādam vai vēlākam par :date.', + 'alpha' => ':attribute jāsatur tikai burti.', + 'alpha_dash' => ':attribute var saturēt tikai burtus, ciparus un domuzīmes.', + 'alpha_num' => ':attribute var saturēt tikai burtus un ciparus.', + 'array' => ':attribute nepieciešams būt datu masīvam.', + 'before' => ':attribute jābūt pirms :date.', + 'before_or_equal' => ':attribute jābūt vienādam vai pirms :date.', + 'between' => [ + 'numeric' => ':attribute nepieciešams būt starp :min un :max.', + 'file' => ':attribute nepieciešams būt starp :min un :max kilobaitiem.', + 'string' => ':attribute nepieciešams būt starp :min un :max zīmēm.', + 'array' => ':attribute nepieciešams būt starp :min un :max vienībām.', + ], + 'boolean' => ':attribute jābūt true vai false.', + 'confirmed' => ':attribute apstiprinājums nav derīgs.', + 'date' => ':attribute nav derīgs datums.', + 'date_format' => ':attribute neatbilst formātam :format.', + 'different' => ':attribute un :other jābūt atšķirīgiem.', + 'digits' => ':attribute jābūt :digits zīmju skaitlim.', + 'digits_between' => ':attribute vajag būt starp :min un :max zīmēm.', + 'dimensions' => ':attribute nav derīgs attēla izmērs.', + 'distinct' => ':attribute laukam vērtība atkārtojas.', + 'email' => ':attribute jābūt derīgai e-pasta adresei', + 'exists' => 'Izvēlētā vērtība :attribute nav derīga.', + 'file' => ':attribute jābūt failam.', + 'filled' => ':attribute jābūt norādītai vērtībai.', + 'image' => ':attribute jābūt attēlam.', + 'in' => 'Atzīmētā vērtība :attribute nav derīga.', + 'in_array' => ':attribute vērtība neeksistē :other.', + 'integer' => ':attribute jābūt veselam skaitlim.', + 'ip' => ':attribute jābūt derīgai IP adresei.', + 'json' => ':attribute jābūt derīgai JSON vērtībai.', + 'max' => [ + 'numeric' => ':attribute nevar būt lielāks par :max.', + 'file' => ':attribute nevar būt lielāks par :max kilobaitiem.', + 'string' => ':attribute nevar būt garāks par :max zīmēm.', + 'array' => ':attribute nevar saturēt vairāk kā :max vērtības.', + ], + 'mimes' => ':attribute ir jābūt šāda tipa failam: :values.', + 'mimetypes' => ':attribute ir jābūt šāda tipa failam: :values.', + 'min' => [ + 'numeric' => ':attribute jābūt vismaz :min.', + 'file' => ':attribute jābūt lielākam par :min kilobaitiem.', + 'string' => ':attribute jābūt vismaz zīmes :min garam.', + 'array' => ':attribute jāsatur vismaz :min vērtības.', + ], + 'not_in' => 'Atzīmētā vērtība :attribute nav derīga.', + 'numeric' => ':attribute jābūt skaitlim.', + 'present' => ':attribute jābūt norādītam.', + 'regex' => ':attribute formāts nav derīgs.', + 'required' => ':attribute lauks ir obligāts.', + 'required_if' => ':attribute jauks ir obligāts, ja :other ir :value.', + 'required_unless' => ':attribute lauks ir obligāts, ja :other satur :values.', + 'required_with' => ':attribute lauks ir obligāts, ja :values ir aizpildīta.', + 'required_with_all' => ':attribute lauks ir obligāts, ja :values ir aizpildītas.', + 'required_without' => ':attribute laukam jābūt aizpildītam, ja lauks :values nav aizpildīts.', + 'required_without_all' => ':attribute lauks ir jāaizpilda, ja lauki :values nav aizpildīti.', + 'same' => ':attribute un :other jābūt vienādiem.', + 'size' => [ + 'numeric' => ':attribute jābūt :size.', + 'file' => ':attribute jābūt :size kilobaiti.', + 'string' => ':attribute jābūt :size zīmes.', + 'array' => ':attribute jāsatur :size vērtības.', + ], + 'string' => ':attribute jābūt teksta vērtībai.', + 'timezone' => ':attribute jābūt derīgai laika zonai.', + 'unique' => ':attribute jau ir aizņemts.', + 'uploaded' => ':attribute neizdevās augšupielādēt.', + 'url' => ':attribute formāts nav derīgs.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + 'invalid_currency' => ':attribute kods nav derīgs.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/nb-NO/accounts.php b/resources/lang/nb-NO/accounts.php new file mode 100755 index 0000000..a174cf8 --- /dev/null +++ b/resources/lang/nb-NO/accounts.php @@ -0,0 +1,14 @@ + 'Kontonavn', + 'number' => 'Nummer', + 'opening_balance' => 'Åpningsbalanse', + 'current_balance' => 'Gjeldende balanse', + 'bank_name' => 'Banknavn', + 'bank_phone' => 'Bankens telefon', + 'bank_address' => 'Bankens adresse', + 'default_account' => 'Standard konto', + +]; diff --git a/resources/lang/nb-NO/auth.php b/resources/lang/nb-NO/auth.php new file mode 100755 index 0000000..9f9d945 --- /dev/null +++ b/resources/lang/nb-NO/auth.php @@ -0,0 +1,30 @@ + 'Profil', + 'logout' => 'Logg ut', + 'login' => 'Logg inn', + 'login_to' => 'Logg inn for å starte din økt', + 'remember_me' => 'Husk meg', + 'forgot_password' => 'Jeg har glemt mitt passord', + 'reset_password' => 'Tilbakestill passord', + 'enter_email' => 'Skriv inn din e-postadresse.', + 'current_email' => 'Gjeldende e-post', + 'reset' => 'Tilbakestill', + 'never' => 'aldri', + 'password' => [ + 'current' => 'Passord', + 'current_confirm' => 'Passordbekreftelse', + 'new' => 'Nytt passord', + 'new_confirm' => 'Passordbekreftelse', + ], + 'error' => [ + 'self_delete' => 'Feil: Du kan ikke slette deg selv.' + ], + + 'failed' => 'Disse opplysningene samsvarer ikke med våre oppføringer.', + 'disabled' => 'Denne kontoen er deaktivert. Kontakt systemadministrator.', + 'throttle' => 'For mange innloggingsforsøk. Forsøk igjen om :seconds sekunder.', + +]; diff --git a/resources/lang/nb-NO/bills.php b/resources/lang/nb-NO/bills.php new file mode 100755 index 0000000..c0cbdf3 --- /dev/null +++ b/resources/lang/nb-NO/bills.php @@ -0,0 +1,46 @@ + 'Fakturanummer', + 'bill_date' => 'Fakturadato', + 'total_price' => 'Totalpris', + 'due_date' => 'Forfallsdato', + 'order_number' => 'Ordrenummer', + 'bill_from' => 'Faktura fra', + + 'quantity' => 'Antall', + 'price' => 'Pris', + 'sub_total' => 'Sum', + 'discount' => 'Rabatt', + 'tax_total' => 'Mva', + 'total' => 'Totalt', + + 'item_name' => 'Enhetsnavn | Enhetsnavn', + + 'show_discount' => ':discount% rabatt', + 'add_discount' => 'Legg til rabatt', + 'discount_desc' => 'av delsum', + + 'payment_due' => 'Forfallsdato', + 'amount_due' => 'Forfallsbeløp', + 'paid' => 'Betalt', + 'histories' => 'Historikk', + 'payments' => 'Betalinger', + 'add_payment' => 'Legg til betaling', + 'mark_received' => 'Merk som mottatt', + 'download_pdf' => 'Last ned PDF', + 'send_mail' => 'Send e-post', + + 'status' => [ + 'draft' => 'Utkast', + 'received' => 'Mottatt', + 'partial' => 'Delvis', + 'paid' => 'Betalt', + ], + + 'messages' => [ + 'received' => 'Faktura ble merket som mottatt.', + ], + +]; diff --git a/resources/lang/nb-NO/companies.php b/resources/lang/nb-NO/companies.php new file mode 100755 index 0000000..2d8af9b --- /dev/null +++ b/resources/lang/nb-NO/companies.php @@ -0,0 +1,13 @@ + 'Domene', + 'logo' => 'Logo', + 'manage' => 'Administrer foretak', + 'all' => 'Alle foretak', + 'error' => [ + 'delete_active' => 'Feil. Kan ikke slette aktivt firma, du må bytte først.', + ], + +]; diff --git a/resources/lang/nb-NO/currencies.php b/resources/lang/nb-NO/currencies.php new file mode 100755 index 0000000..5a16f23 --- /dev/null +++ b/resources/lang/nb-NO/currencies.php @@ -0,0 +1,18 @@ + 'Kode', + 'rate' => 'Kurs', + 'default' => 'Standard valuta', + 'decimal_mark' => 'Desimaltegn', + 'thousands_separator' => 'Tusenskille', + 'precision' => 'Presisjon', + 'symbol' => [ + 'symbol' => 'Symbol', + 'position' => 'Symbolplassering', + 'before' => 'Foran beløp', + 'after' => 'Etter beløp', + ] + +]; diff --git a/resources/lang/nb-NO/customers.php b/resources/lang/nb-NO/customers.php new file mode 100755 index 0000000..03d4d58 --- /dev/null +++ b/resources/lang/nb-NO/customers.php @@ -0,0 +1,11 @@ + 'Tillat innlogging?', + 'user_created' => 'Bruker ble opprettet', + + 'error' => [ + 'email' => 'E-postadressen er allerede i bruk.' + ] +]; diff --git a/resources/lang/nb-NO/dashboard.php b/resources/lang/nb-NO/dashboard.php new file mode 100755 index 0000000..84e8b34 --- /dev/null +++ b/resources/lang/nb-NO/dashboard.php @@ -0,0 +1,24 @@ + 'Totale inntekter', + 'receivables' => 'Fordringer', + 'open_invoices' => 'Ubetalte fakturaer', + 'overdue_invoices' => 'Forfalte fakturaer', + 'total_expenses' => 'Totale utgifter', + 'payables' => 'Leverandørgjeld', + 'open_bills' => 'Ubetalte faktura', + 'overdue_bills' => 'Forfalte faktura', + 'total_profit' => 'Samlet fortjeneste', + 'open_profit' => 'Åpen fortjeneste', + 'overdue_profit' => 'Forfalt fortjeneste', + 'cash_flow' => 'Kontantstrøm', + 'no_profit_loss' => 'Ingen fortjenestetap', + 'incomes_by_category' => 'Inntekter etter kategori', + 'expenses_by_category' => 'Utgifter etter kategori', + 'account_balance' => 'Kontobalanse', + 'latest_incomes' => 'Siste inntekter', + 'latest_expenses' => 'Siste utgifter', + +]; diff --git a/resources/lang/nb-NO/demo.php b/resources/lang/nb-NO/demo.php new file mode 100755 index 0000000..61a7c48 --- /dev/null +++ b/resources/lang/nb-NO/demo.php @@ -0,0 +1,17 @@ + 'Kontanter', + 'categories_uncat' => 'Ukategorisert', + 'categories_deposit' => 'Innskudd', + 'categories_sales' => 'Salg', + 'currencies_usd' => 'Amerikanske Dollar', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Britiske pund', + 'currencies_try' => 'Tyrkiske Lira', + 'taxes_exempt' => 'Avgiftsfri', + 'taxes_normal' => 'Normal avgift', + 'taxes_sales' => 'Salgsavgift', + +]; diff --git a/resources/lang/nb-NO/footer.php b/resources/lang/nb-NO/footer.php new file mode 100755 index 0000000..926ebfc --- /dev/null +++ b/resources/lang/nb-NO/footer.php @@ -0,0 +1,9 @@ + 'Versjon', + 'powered' => 'Drevet med Akaunting', + 'software' => 'Gratis regnskapsprogram', + +]; diff --git a/resources/lang/nb-NO/general.php b/resources/lang/nb-NO/general.php new file mode 100755 index 0000000..98a05f0 --- /dev/null +++ b/resources/lang/nb-NO/general.php @@ -0,0 +1,117 @@ + 'Enhet | Enheter', + 'incomes' => 'Inntekt | Inntekter', + 'invoices' => 'Faktura | Fakturaer', + 'revenues' => 'Inntekt | Inntekter', + 'customers' => 'Kunde | Kunder', + 'expenses' => 'Utgift | Utgifter', + 'bills' => 'Faktura | Fakturaer', + 'payments' => 'Betaling | Betalinger', + 'vendors' => 'Selger | Selgere', + 'accounts' => 'Konto | Kontoer', + 'transfers' => 'Overføring | Overføringer', + 'transactions' => 'Transaksjon | Transaksjoner', + 'reports' => 'Rapport | Rapporter', + 'settings' => 'Innstilling | Innstillinger', + 'categories' => 'Kategori | Kategorier', + 'currencies' => 'Valuta | Valutaer', + 'tax_rates' => 'Avgiftssats | Avgiftssatser', + 'users' => 'Bruker | Brukere', + 'roles' => 'Rolle | Roller', + 'permissions' => 'Tillatelse | Tillatelser', + 'modules' => 'Applikasjon | Applikasjoner', + 'companies' => 'Foretak | Foretak', + 'profits' => 'Fortjeneste | Fortjenester', + 'taxes' => 'Avgift | Avgifter', + 'logos' => 'Logo|Logoer', + 'pictures' => 'Bilde | Bilder', + 'types' => 'Type | Typer', + 'payment_methods' => 'Betalingsmåte | Betalingsmåter', + 'compares' => 'Inntekt vs. utgift | Inntekter vs. utgifter', + 'notes' => 'Notat | Notater', + 'totals' => 'Totalt | Totaler', + 'languages' => 'Språk | Språk', + 'updates' => 'Oppdatering | Oppdateringer', + 'numbers' => 'Nummer | Nummer', + 'statuses' => 'Status | Statuser', + 'others' => 'Annen | Andre', + + 'dashboard' => 'Kontrollpanel', + 'banking' => 'Bank', + 'general' => 'Generelt', + 'no_records' => 'Ingen oppføringer.', + 'date' => 'Dato', + 'amount' => 'Beløp', + 'enabled' => 'Aktivert', + 'disabled' => 'Deaktivert', + 'yes' => 'Ja', + 'no' => 'Nei', + 'na' => 'Ikke tilgjengelig', + 'daily' => 'Daglig', + 'monthly' => 'Månedlig', + 'quarterly' => 'Kvartalsvis', + 'yearly' => 'Årlig', + 'add' => 'Legg til', + 'add_new' => 'Legg til ny', + 'show' => 'Vis', + 'edit' => 'Endre', + 'delete' => 'Slett', + 'send' => 'Send', + 'download' => 'Last ned', + 'delete_confirm' => 'Bekreft sletting av :name :type?', + 'name' => 'Navn', + 'email' => 'E-post', + 'tax_number' => 'Organisasjonsnummer', + 'phone' => 'Telefon', + 'address' => 'Adresse', + 'website' => 'Nettside', + 'actions' => 'Handlinger', + 'description' => 'Beskrivelse', + 'manage' => 'Administrer', + 'code' => 'Kode', + 'alias' => 'Alias', + 'balance' => 'Balanse', + 'reference' => 'Referanse', + 'attachment' => 'Vedlegg', + 'change' => 'Endre', + 'switch' => 'Bytt', + 'color' => 'Farge', + 'save' => 'Lagre', + 'cancel' => 'Avbryt', + 'from' => 'Fra', + 'to' => 'Til', + 'print' => 'Skriv ut', + 'search' => 'Søk', + 'search_placeholder' => 'Skriv for å søke ...', + 'filter' => 'Filter', + 'help' => 'Hjelp', + 'all' => 'Alle', + 'all_type' => 'Alle :type', + 'upcoming' => 'Kommende', + 'created' => 'Opprettet', + 'id' => 'Id', + 'more_actions' => 'Flere handlinger', + 'duplicate' => 'Duplikat', + 'unpaid' => 'Ubetalt', + 'paid' => 'Betalt', + 'overdue' => 'Forfalt', + 'partially' => 'Delvis', + 'partially_paid' => 'Delvis betalt', + + 'title' => [ + 'new' => 'Ny :type', + 'edit' => 'Endre :type', + ], + 'form' => [ + 'enter' => 'Fyll inn :field', + 'select' => [ + 'field' => '-Velg :field -', + 'file' => 'Velg fil', + ], + 'no_file_selected' => 'Ingen fil valgt ...', + ], + +]; diff --git a/resources/lang/nb-NO/header.php b/resources/lang/nb-NO/header.php new file mode 100755 index 0000000..e08afa8 --- /dev/null +++ b/resources/lang/nb-NO/header.php @@ -0,0 +1,15 @@ + 'Endre språk', + 'last_login' => 'Siste pålogging :time', + 'notifications' => [ + 'counter' => '{0} Du har ingen varsel |{1} Du har :count varsler|[2,*] Du har :count varsler', + 'overdue_invoices' => '{1} :count forfalt faktura|[2,*] :count forfalte fakturaer', + 'upcoming_bills' => '{1} :count kommende faktura [2,*] :count kommende fakturaer', + 'items_stock' => '{1} :count utsolgt produkt|[2,*] :count utsolgte produkter', + 'view_all' => 'Vis alle' + ], + +]; diff --git a/resources/lang/nb-NO/import.php b/resources/lang/nb-NO/import.php new file mode 100755 index 0000000..08095ae --- /dev/null +++ b/resources/lang/nb-NO/import.php @@ -0,0 +1,9 @@ + 'Importer', + 'title' => 'Importer :type', + 'message' => 'Tillatte filtyper: CSV, XLS. Last ned eksempelfilen.', + +]; diff --git a/resources/lang/nb-NO/install.php b/resources/lang/nb-NO/install.php new file mode 100755 index 0000000..e3fcc19 --- /dev/null +++ b/resources/lang/nb-NO/install.php @@ -0,0 +1,44 @@ + 'Neste', + 'refresh' => 'Oppfrisk', + + 'steps' => [ + 'requirements' => 'Du må oppfyll følgende avhengigheter.', + 'language' => 'Steg 1/3: Språkvalg', + 'database' => 'Steg 2/3: Databaseoppsett', + 'settings' => 'Steg 3/3: Foretak- og administratordetaljer', + ], + + 'language' => [ + 'select' => 'Velg språk', + ], + + 'requirements' => [ + 'enabled' => ':feature må være aktivert.', + 'disabled' => ':feature må være deaktivert.', + 'extension' => ':extension utvidelse må være lastet.', + 'directory' => 'Mappen :directory må være skrivbar.', + ], + + 'database' => [ + 'hostname' => 'Tjenernavn', + 'username' => 'Brukernavn', + 'password' => 'Passord', + 'name' => 'Database', + ], + + 'settings' => [ + 'company_name' => 'Foretaksnavn', + 'company_email' => 'Foretaks e-post', + 'admin_email' => 'Admins e-post', + 'admin_password' => 'Admins passord', + ], + + 'error' => [ + 'connection' => 'Feil: Kunne ikke koble til databasen. Påse at opplysningene er riktig.', + ], + +]; diff --git a/resources/lang/nb-NO/invoices.php b/resources/lang/nb-NO/invoices.php new file mode 100755 index 0000000..c428370 --- /dev/null +++ b/resources/lang/nb-NO/invoices.php @@ -0,0 +1,55 @@ + 'Fakturanummer', + 'invoice_date' => 'Fakturadato', + 'total_price' => 'Totalpris', + 'due_date' => 'Forfallsdato', + 'order_number' => 'Ordrenummer', + 'bill_to' => 'Faktura til', + + 'quantity' => 'Antall', + 'price' => 'Pris', + 'sub_total' => 'Sum', + 'discount' => 'Rabatt', + 'tax_total' => 'Totalt mva', + 'total' => 'Totalt', + + 'item_name' => 'Enhetsnavn | Enhetsnavn', + + 'show_discount' => ':discount% rabatt', + 'add_discount' => 'Legg til rabatt', + 'discount_desc' => 'av delsum', + + 'payment_due' => 'Forfallsdato', + 'paid' => 'Betalt', + 'histories' => 'Historikk', + 'payments' => 'Betalinger', + 'add_payment' => 'Legg til betaling', + 'mark_paid' => 'Merk som betalt', + 'mark_sent' => 'Merk som sendt', + 'download_pdf' => 'Last ned PDF', + 'send_mail' => 'Send e-post', + + 'status' => [ + 'draft' => 'Utkast', + 'sent' => 'Sendt', + 'viewed' => 'Åpnet', + 'approved' => 'Godkjent', + 'partial' => 'Delvis', + 'paid' => 'Betalt', + ], + + 'messages' => [ + 'email_sent' => 'E-post med faktura har blitt sendt.', + 'marked_sent' => 'Faktura merket som sendt.', + 'email_required' => 'E-postadresse må fylles inn.', + ], + + 'notification' => [ + 'message' => 'Du mottar denne e-posten fordi du har en kommende faktura, pålydende :amount, til :costumer.', + 'button' => 'Betal nå', + ], + +]; diff --git a/resources/lang/nb-NO/items.php b/resources/lang/nb-NO/items.php new file mode 100755 index 0000000..d7c69cb --- /dev/null +++ b/resources/lang/nb-NO/items.php @@ -0,0 +1,15 @@ + 'Antall | Antall', + 'sales_price' => 'Utsalgspris', + 'purchase_price' => 'Innkjøpspris', + 'sku' => 'Varenummer (SKU)', + + 'notification' => [ + 'message' => 'Du mottar denne e-posten fordi :name snart er utsolgt.', + 'button' => 'Vis nå', + ], + +]; diff --git a/resources/lang/nb-NO/messages.php b/resources/lang/nb-NO/messages.php new file mode 100755 index 0000000..afe4ab1 --- /dev/null +++ b/resources/lang/nb-NO/messages.php @@ -0,0 +1,25 @@ + [ + 'added' => ':type lagt til.', + 'updated' => ':type oppdatert.', + 'deleted' => ':type slettet.', + 'duplicated' => ':type duplisert.', + 'imported' => ':type importert.', + ], + 'error' => [ + 'over_payment' => 'Feil: Betaling ble ikke lagt til. Beløpet overstiger total.', + 'not_user_company' => 'Feil: Du ikke kan administrere dette foretaket.', + 'customer' => 'Feil: Bruker ble ikke opprettet. :name bruker allerede denne e-postadressen.', + 'no_file' => 'Feil: Ingen fil er valgt.', + 'last_category' => 'Feil: Kan ikke slette siste :type kategori.', + 'invalid_token' => 'Feil: Angitt token er ugyldig.', + ], + 'warning' => [ + 'deleted' => 'Advarsel: Du har ikke mulighet til å slette :name fordi kontoen har :text relatert.', + 'disabled' => 'Advarsel: Du kan ikke deaktivere :name fordi kontoen har :text relatert.', + ], + +]; diff --git a/resources/lang/nb-NO/modules.php b/resources/lang/nb-NO/modules.php new file mode 100755 index 0000000..ab962b3 --- /dev/null +++ b/resources/lang/nb-NO/modules.php @@ -0,0 +1,48 @@ + 'API-token', + 'api_token' => 'Token', + 'top_paid' => 'Topp betalte', + 'new' => 'Ny', + 'top_free' => 'Topp gratis', + 'free' => 'GRATIS', + 'search' => 'Søk', + 'install' => 'Installer', + 'buy_now' => 'Kjøp nå', + 'token_link' => 'Klikk her for å få din API-token.', + 'no_apps' => 'Det er ingen applikasjoner i denne kategorien ennå.', + 'developer' => 'Er du en utvikler? Her kan du lære hvordan du lager en applikasjon for salg.', + + 'about' => 'Om', + + 'added' => 'Lagt til', + 'updated' => 'Oppdatert', + 'compatibility' => 'Kompatibilitet', + + 'installed' => ':module installert', + 'uninstalled' => ':module avinstallert', + //'updated' => ':module updated', + 'enabled' => ':module aktivert', + 'disabled' => ':module deaktivert', + + 'tab' => [ + 'installation' => 'Installering', + 'faq' => 'FAQ', + 'changelog' => 'Endringslogg', + ], + + 'installation' => [ + 'header' => 'Applikasjonsinstallering', + 'download' => 'Laster ned :module.', + 'unzip' => 'Pakker ut :module.', + 'install' => 'Installerer :module.', + ], + + 'button' => [ + 'uninstall' => 'Avinstaller', + 'disable' => 'Deaktiver', + 'enable' => 'Aktiver', + ], +]; diff --git a/resources/lang/nb-NO/pagination.php b/resources/lang/nb-NO/pagination.php new file mode 100755 index 0000000..a633bbe --- /dev/null +++ b/resources/lang/nb-NO/pagination.php @@ -0,0 +1,9 @@ + '« Forrige', + 'next' => 'Neste »', + 'showing' => 'Viser :first til :last av :total :type', + +]; diff --git a/resources/lang/nb-NO/passwords.php b/resources/lang/nb-NO/passwords.php new file mode 100755 index 0000000..3ca6625 --- /dev/null +++ b/resources/lang/nb-NO/passwords.php @@ -0,0 +1,22 @@ + 'Passord må inneholde minst seks tegn, og også være være lik bekreftelsen.', + 'reset' => 'Passordet ble endret.', + 'sent' => 'Vi har sendt deg en lenke på e-post, som du kan klikke på for å endre passord.', + 'token' => 'Nullstillingskode for passord er ugyldig.', + 'user' => "Vi finner ingen bruker med denne e-postadressen.", + +]; diff --git a/resources/lang/nb-NO/recurring.php b/resources/lang/nb-NO/recurring.php new file mode 100755 index 0000000..fe55960 --- /dev/null +++ b/resources/lang/nb-NO/recurring.php @@ -0,0 +1,20 @@ + 'Gjentakende', + 'every' => 'Hver', + 'period' => 'Periode', + 'times' => 'Gjentakelser', + 'daily' => 'Daglig', + 'weekly' => 'Ukentlig', + 'monthly' => 'Månedlig', + 'yearly' => 'Årlig', + 'custom' => 'Egendefinert', + 'days' => 'Dag(er)', + 'weeks' => 'Uke(r)', + 'months' => 'Måned(er)', + 'years' => 'År', + 'message' => 'Dette er en gjentakende :type, neste :type genereres automatisk :date', + +]; diff --git a/resources/lang/nb-NO/reports.php b/resources/lang/nb-NO/reports.php new file mode 100755 index 0000000..fa67732 --- /dev/null +++ b/resources/lang/nb-NO/reports.php @@ -0,0 +1,30 @@ + 'Inneværende år', + 'previous_year' => 'Foregående år', + 'this_quarter' => 'Inneværende kvartal', + 'previous_quarter' => 'Foregående kvartal', + 'last_12_months' => 'Siste 12 måneder', + 'profit_loss' => 'Resultat', + 'gross_profit' => 'Bruttofortjeneste', + 'net_profit' => 'Nettoresultat', + 'total_expenses' => 'Totale utgifter', + 'net' => 'NET', + + 'summary' => [ + 'income' => 'Inntektsammendrag', + 'expense' => 'Utgiftsammendrag', + 'income_expense' => 'Inntekter mot utgifter', + 'tax' => 'Avgiftsammendrag', + ], + + 'quarter' => [ + '1' => 'Jan.-Mars', + '2' => 'April-Juni', + '3' => 'Juli-Sep.', + '4' => 'Okt.-Des.', + ], + +]; diff --git a/resources/lang/nb-NO/settings.php b/resources/lang/nb-NO/settings.php new file mode 100755 index 0000000..04deec4 --- /dev/null +++ b/resources/lang/nb-NO/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Navn', + 'email' => 'E-post', + 'phone' => 'Telefon', + 'address' => 'Adresse', + 'logo' => 'Logo', + ], + 'localisation' => [ + 'tab' => 'Lokalisering', + 'date' => [ + 'format' => 'Datoformat', + 'separator' => 'Datoseparator', + 'dash' => 'Bindestrek (-)', + 'dot' => 'Punktum (.)', + 'comma' => 'Komma (,)', + 'slash' => 'Skråstrek (/)', + 'space' => 'Mellomrom ( )', + ], + 'timezone' => 'Tidssone', + 'percent' => [ + 'title' => 'Prosentplassering (%)', + 'before' => 'Før nummer', + 'after' => 'Etter nummer', + ], + ], + 'invoice' => [ + 'tab' => 'Faktura', + 'prefix' => 'Nummerprefiks', + 'digit' => 'Antall siffer', + 'next' => 'Neste nummer', + 'logo' => 'Logo', + ], + 'default' => [ + 'tab' => 'Standardinnstilinger', + 'account' => 'Standard konto', + 'currency' => 'Standard valuta', + 'tax' => 'Standard avgiftssats', + 'payment' => 'Standard betalingsmåte', + 'language' => 'Standard språk', + ], + 'email' => [ + 'protocol' => 'Protokoll', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP-vert', + 'port' => 'SMTP-port', + 'username' => 'SMTP-brukernavn', + 'password' => 'SMTP-passord', + 'encryption' => 'SMTP-sikkerhet', + 'none' => 'Ingen', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Sti for Sendmail', + 'log' => 'Logg e-post', + ], + 'scheduling' => [ + 'tab' => 'Tidsplan', + 'send_invoice' => 'Send fakturapåminnelse', + 'invoice_days' => 'Antall dager etter forfall for utsending', + 'send_bill' => 'Send fakturapåminnelse', + 'bill_days' => 'Antall dager før forfall for utsending', + 'cron_command' => 'Cron-kommando', + 'schedule_time' => 'Tid for kjøring', + ], + 'appearance' => [ + 'tab' => 'Utseende', + 'theme' => 'Tema', + 'light' => 'Lys', + 'dark' => 'Mørk', + 'list_limit' => 'Oppføringer per side', + 'use_gravatar' => 'Bruk Gravatar', + ], + 'system' => [ + 'tab' => 'System', + 'session' => [ + 'lifetime' => 'Øktlevetid (minutter)', + 'handler' => 'Øktbehandler', + 'file' => 'Fil', + 'database' => 'Database', + ], + 'file_size' => 'Maks fil størrelse (MB)', + 'file_types' => 'Tillatte filtyper', + ], + +]; diff --git a/resources/lang/nb-NO/taxes.php b/resources/lang/nb-NO/taxes.php new file mode 100755 index 0000000..0ff1ac9 --- /dev/null +++ b/resources/lang/nb-NO/taxes.php @@ -0,0 +1,8 @@ + 'Sats', + 'rate_percent' => 'Sats (%)', + +]; diff --git a/resources/lang/nb-NO/transfers.php b/resources/lang/nb-NO/transfers.php new file mode 100755 index 0000000..5de0931 --- /dev/null +++ b/resources/lang/nb-NO/transfers.php @@ -0,0 +1,8 @@ + 'Fra konto', + 'to_account' => 'Til konto', + +]; diff --git a/resources/lang/nb-NO/updates.php b/resources/lang/nb-NO/updates.php new file mode 100755 index 0000000..f4c6302 --- /dev/null +++ b/resources/lang/nb-NO/updates.php @@ -0,0 +1,15 @@ + 'Installert versjon', + 'latest_version' => 'Nyeste versjon', + 'update' => 'Oppdater Akaunting til :version', + 'changelog' => 'Endringslogg', + 'check' => 'Se etter oppdatering', + 'new_core' => 'Det finnes en oppdatert versjon av Akaunting.', + 'latest_core' => 'Gratulerer! Du har den siste versjonen av Akaunting.', + 'success' => 'Oppdateringsprosessen er fullført.', + 'error' => 'Oppdateringsprosessen feilet. Forsøk igjen.', + +]; diff --git a/resources/lang/nb-NO/validation.php b/resources/lang/nb-NO/validation.php new file mode 100755 index 0000000..384c8f1 --- /dev/null +++ b/resources/lang/nb-NO/validation.php @@ -0,0 +1,119 @@ + ':attribute må aksepteres.', + 'active_url' => ':attribute er ikke en gyldig nettadresse.', + 'after' => ':attribute må være en dato etter :date.', + 'after_or_equal' => ':attribute må være en dato etter eller samme som :date.', + 'alpha' => ':attribute kan bare inneholde bokstaver.', + 'alpha_dash' => ':attribute kan bare inneholde bokstaver, tall og bindestreker.', + 'alpha_num' => ':attribute kan bare inneholde bokstaver og tall.', + 'array' => ':attribute må være en kommaseparert liste.', + 'before' => ':attribute må være en dato før :date.', + 'before_or_equal' => ':attribute må være en dato før eller samme som :date.', + 'between' => [ + 'numeric' => ':attribute må være mellom :min - :max.', + 'file' => ':attribute må være mellom :min og :max kilobyte.', + 'string' => ':attribute må inneholde mellom :min og :max tegn.', + 'array' => ':attribute må inneholde mellom :min og :max elementer.', + ], + 'boolean' => 'Feltet :attribute må være \'true\' eller \'false\'.', + 'confirmed' => 'Bekreftelsen for :attribute samsvarer ikke.', + 'date' => ':attribute er ikke en gyldig dato.', + 'date_format' => ':attribute samsvarer ikke med formatet :format.', + 'different' => ':attribute og :other må være forskjellige.', + 'digits' => ':attribute må inneholde :digits sifre.', + 'digits_between' => ':attribute må inneholde mellom :min og :max sifre.', + 'dimensions' => ':attribute har feil bildedimensjoner.', + 'distinct' => ':attribute feltet har en duplisert verdi.', + 'email' => ':attribute må være en gyldig e-postadresse.', + 'exists' => 'Det valgte :attribute er ugyldig.', + 'file' => ':attribute må være en fil.', + 'filled' => 'Feltet for :attribute må fylles ut.', + 'image' => ':attribute må være et bilde.', + 'in' => 'Valgt :attribute er ugyldig.', + 'in_array' => ':attribute felt eksisterer ikke i :other.', + 'integer' => ':attribute må være et heltall.', + 'ip' => ':attribute må være en gyldig IP-adresse.', + 'json' => ':attribute må være i gyldig JSON-format.', + 'max' => [ + 'numeric' => ':attribute kan ikke være større enn :max.', + 'file' => ':attribute kan ikke være større enn :max kilobytes.', + 'string' => ':attribute kan ikke være mer enn :max tegn.', + 'array' => ':attribute kan ikke inneholde mer enn :max elementer.', + ], + 'mimes' => ':attribute må være en fil av typen: :values.', + 'mimetypes' => ':attribute må være en fil av typen: :values.', + 'min' => [ + 'numeric' => ':attribute må være større enn :min.', + 'file' => ':attribute må være større enn :min kilobytes.', + 'string' => ':attribute må inneholde minst :min tegn.', + 'array' => ':attribute må inneholde minst :min elementer.', + ], + 'not_in' => 'Valgt :attribute er ugyldig.', + 'numeric' => ':attribute må være et nummer.', + 'present' => 'Feltet :attribute må være tilstede.', + 'regex' => 'Formatet på :attribute er ugyldig.', + 'required' => 'Feltet :attribute må fylles ut.', + 'required_if' => 'Feltet :attribute må fylles ut når :other er :value.', + 'required_unless' => 'Feltet :attribute er påkrevd med mindre :other finnes blant verdiene :values.', + 'required_with' => 'Feltet :attribute må fylles ut når :values er utfylt.', + 'required_with_all' => 'Feltet :attribute er påkrevd når :values er oppgitt.', + 'required_without' => 'Feltet :attribute må fylles ut når :values ikke er utfylt.', + 'required_without_all' => 'Feltet :attribute er påkrevd når ingen av :values er oppgitt.', + 'same' => ':attribute og :other må samsvare.', + 'size' => [ + 'numeric' => ':attribute må være :size.', + 'file' => ':attribute må være :size kilobytes.', + 'string' => ':attribute må inneholde :size tegn.', + 'array' => ':attribute må inneholde :size elementer.', + ], + 'string' => ':attribute må være en tekststreng.', + 'timezone' => ':attribute må være en gyldig sone.', + 'unique' => ':attribute er allerede i bruk.', + 'uploaded' => ':attribute feilet under opplastingen.', + 'url' => 'Formatet på :attribute er ugyldig.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/nl-NL/accounts.php b/resources/lang/nl-NL/accounts.php new file mode 100755 index 0000000..08daeee --- /dev/null +++ b/resources/lang/nl-NL/accounts.php @@ -0,0 +1,14 @@ + 'Bedrijfsnaam', + 'number' => 'Nummer', + 'opening_balance' => 'Beginsaldo', + 'current_balance' => 'Huidig saldo', + 'bank_name' => 'Banknaam', + 'bank_phone' => 'Telefoonnummer bank', + 'bank_address' => 'Adres van de Bank', + 'default_account' => 'Standaard account', + +]; diff --git a/resources/lang/nl-NL/auth.php b/resources/lang/nl-NL/auth.php new file mode 100755 index 0000000..3864d8e --- /dev/null +++ b/resources/lang/nl-NL/auth.php @@ -0,0 +1,39 @@ + 'Profiel', + 'logout' => 'Afmelden', + 'login' => 'Inloggen', + 'login_to' => 'Login om uw sessie te starten', + 'remember_me' => 'Onthoud mijn gegevens', + 'forgot_password' => 'Ik ben mijn wachtwoord vergeten', + 'reset_password' => 'Wachtwoord resetten', + 'enter_email' => 'Voer uw e-mailadres in', + 'current_email' => 'Huidig E-mailadres', + 'reset' => 'Resetten', + 'never' => 'nooit', + + 'password' => [ + 'current' => 'Wachtwoord', + 'current_confirm' => 'Wachtwoordbevestiging', + 'new' => 'Nieuw Wachtwoord', + 'new_confirm' => 'Nieuw Wachtwoordbevestiging', + ], + + 'error' => [ + 'self_delete' => 'Fout: u kunt uzelf niet verwijderen!', + 'no_company' => 'Fout: U heeft geen bedrijf gekoppeld aan uw account. Neem alstublieft contact op met de applicatiebeheerder.', + ], + + 'failed' => 'Deze gegevens komen niet overeen met onze administratie.', + 'disabled' => 'Dit account is uitgeschakeld. Neem alstublieft contact op met de applicatiebeheerder.', + 'throttle' => 'Te veel inlogpogingen. Probeer het met :seconds seconden opnieuw.', + + 'notification' => [ + 'message_1' => 'U ontvangt deze e-mail omdat wij een wachtwoord reset verzoek hebben ontvangen voor uw account.', + 'message_2' => 'Indien u geen wachtwoord reset heeft aangevraagd, hoeft u geen verdere acties te ondernemen.', + 'button' => 'Wachtwoord resetten', + ], + +]; diff --git a/resources/lang/nl-NL/bills.php b/resources/lang/nl-NL/bills.php new file mode 100755 index 0000000..9b7cf92 --- /dev/null +++ b/resources/lang/nl-NL/bills.php @@ -0,0 +1,46 @@ + 'Factuurnummer', + 'bill_date' => 'Factuur datum', + 'total_price' => 'Totaalprijs', + 'due_date' => 'Vervaldatum', + 'order_number' => 'Bestelnummer', + 'bill_from' => 'Factuur van', + + 'quantity' => 'Aantal', + 'price' => 'Prijs', + 'sub_total' => 'Subtotaal', + 'discount' => 'Korting', + 'tax_total' => 'Totaal BTW', + 'total' => 'Totaal', + + 'item_name' => 'Artikelnaam|Artikelnamen', + + 'show_discount' => ':discount% korting', + 'add_discount' => 'Korting toevoegen', + 'discount_desc' => 'van subtotaal', + + 'payment_due' => 'Te betalen voor', + 'amount_due' => 'Verschuldigd bedrag', + 'paid' => 'Betaald', + 'histories' => 'Geschiedenis', + 'payments' => 'Betalingen', + 'add_payment' => 'Een betaling toevoegen', + 'mark_received' => 'Markeer als ontvangen', + 'download_pdf' => 'PDF downloaden', + 'send_mail' => 'Verstuur e-mail', + + 'status' => [ + 'draft' => 'Concept', + 'received' => 'Ontvangen', + 'partial' => 'Gedeeltelijk', + 'paid' => 'Betaald', + ], + + 'messages' => [ + 'received' => 'Factuur als \'succesvol ontvangen\' gemarkeerd!', + ], + +]; diff --git a/resources/lang/nl-NL/companies.php b/resources/lang/nl-NL/companies.php new file mode 100755 index 0000000..fc112be --- /dev/null +++ b/resources/lang/nl-NL/companies.php @@ -0,0 +1,13 @@ + 'Domein', + 'logo' => 'Logo', + 'manage' => 'Bedrijven Beheren', + 'all' => 'Alle bedrijven', + 'error' => [ + 'delete_active' => 'Fout: Kan een actief bedrijf niet verwijderen. U zult dat eerst moeten aanpassen!', + ], + +]; diff --git a/resources/lang/nl-NL/currencies.php b/resources/lang/nl-NL/currencies.php new file mode 100755 index 0000000..5f32bf2 --- /dev/null +++ b/resources/lang/nl-NL/currencies.php @@ -0,0 +1,18 @@ + 'Code', + 'rate' => 'Tarief', + 'default' => 'Standaardvaluta', + 'decimal_mark' => 'Decimaalscheidingsteken', + 'thousands_separator' => 'Duizenden scheidingsteken', + 'precision' => 'Precisie', + 'symbol' => [ + 'symbol' => 'Symbool', + 'position' => 'Symboolpositie', + 'before' => 'Voor Totaal', + 'after' => 'Na Totaal', + ] + +]; diff --git a/resources/lang/nl-NL/customers.php b/resources/lang/nl-NL/customers.php new file mode 100755 index 0000000..d939b9a --- /dev/null +++ b/resources/lang/nl-NL/customers.php @@ -0,0 +1,11 @@ + 'Inloggen toestaan?', + 'user_created' => 'Gebruiker aangemaakt', + + 'error' => [ + 'email' => 'Dit e-mailadres is al reeds geregistreerd.' + ] +]; diff --git a/resources/lang/nl-NL/dashboard.php b/resources/lang/nl-NL/dashboard.php new file mode 100755 index 0000000..a188657 --- /dev/null +++ b/resources/lang/nl-NL/dashboard.php @@ -0,0 +1,24 @@ + 'Totale inkomsten', + 'receivables' => 'Debiteuren', + 'open_invoices' => 'Openstaande facturen', + 'overdue_invoices' => 'Vervallen facturen', + 'total_expenses' => 'Totale uitgaven', + 'payables' => 'Schulden', + 'open_bills' => 'Openstaande rekeningen', + 'overdue_bills' => 'Achterstallige facturen', + 'total_profit' => 'Totale winst', + 'open_profit' => 'Openstaande winst', + 'overdue_profit' => 'Achterstallige winst', + 'cash_flow' => 'Geldstroom', + 'no_profit_loss' => 'Geen winstderving', + 'incomes_by_category' => 'Inkomsten per categorie', + 'expenses_by_category' => 'Uitgaves per categorie', + 'account_balance' => 'Rekeningsaldo', + 'latest_incomes' => 'Laatste inkomsten', + 'latest_expenses' => 'Nieuwste uitgaven', + +]; diff --git a/resources/lang/nl-NL/demo.php b/resources/lang/nl-NL/demo.php new file mode 100755 index 0000000..a3674a8 --- /dev/null +++ b/resources/lang/nl-NL/demo.php @@ -0,0 +1,16 @@ + 'Contant geld', + 'categories_deposit' => 'Storting', + 'categories_sales' => 'Omzet', + 'currencies_usd' => 'Amerikaanse Dollar', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Britse pond', + 'currencies_try' => 'Turkse Lira', + 'taxes_exempt' => 'Vrijstelling van BTW', + 'taxes_normal' => 'Standaard BTW', + 'taxes_sales' => 'Verkoop BTW', + +]; diff --git a/resources/lang/nl-NL/footer.php b/resources/lang/nl-NL/footer.php new file mode 100755 index 0000000..747f39f --- /dev/null +++ b/resources/lang/nl-NL/footer.php @@ -0,0 +1,9 @@ + 'Versie', + 'powered' => 'Mogelijk gemaakt door Akaunting', + 'software' => 'Gratis boekhoudsoftware', + +]; diff --git a/resources/lang/nl-NL/general.php b/resources/lang/nl-NL/general.php new file mode 100755 index 0000000..5daba22 --- /dev/null +++ b/resources/lang/nl-NL/general.php @@ -0,0 +1,121 @@ + 'Artikel|Artikelen', + 'incomes' => 'Inkomen|Inkomsten', + 'invoices' => 'Factuur|Facturen', + 'revenues' => 'Omzet|Inkomsten', + 'customers' => 'Klant|Klanten', + 'expenses' => 'Kosten|Kosten', + 'bills' => 'Rekening|Rekeningen', + 'payments' => 'Betaling|Betalingen', + 'vendors' => 'Leverancier|Leveranciers', + 'accounts' => 'Rekening|Rekeningen', + 'transfers' => 'Overboeking|Overboekingen', + 'transactions' => 'Transactie|Transacties', + 'reports' => 'Rapport|Rapporten', + 'settings' => 'Instelling|Instellingen', + 'categories' => 'Categorie|Categorieën', + 'currencies' => 'Valuta|Valuta\'s', + 'tax_rates' => 'BTW-tarief|Belastingtarieven', + 'users' => 'Gebruiker|Gebruikers', + 'roles' => 'Rol|Rollen', + 'permissions' => 'Toestemming|Machtigingen', + 'modules' => 'App|Apps', + 'companies' => 'Bedrijf|Bedrijven', + 'profits' => 'Winst|Winst', + 'taxes' => 'Belasting|BTW', + 'logos' => 'Logo|Logo\'s', + 'pictures' => 'Foto|Foto\'s', + 'types' => 'Type|Types', + 'payment_methods' => 'Betalingsmethode|Betalingsmethoden', + 'compares' => 'Inkomen vs uitgave|Inkomsten vs uitgaven', + 'notes' => 'Notitie|Notities', + 'totals' => 'Totaal|Totalen', + 'languages' => 'Taal|Talen', + 'updates' => 'Update|Updates', + 'numbers' => 'Nummer|Nummers', + 'statuses' => 'Status|Statussen', + 'others' => 'Overig|Overigen', + + 'dashboard' => 'Dashboard', + 'banking' => 'Banken', + 'general' => 'Algemeen', + 'no_records' => 'Geen gegevens.', + 'date' => 'Datum', + 'amount' => 'Bedrag', + 'enabled' => 'Actief', + 'disabled' => 'Uitgeschakeld', + 'yes' => 'Ja', + 'no' => 'Nee', + 'na' => 'N.v.t.', + 'daily' => 'Dagelijks', + 'monthly' => 'Maandelijks', + 'quarterly' => 'Per kwartaal', + 'yearly' => 'Jaarlijks', + 'add' => 'Toevoegen', + 'add_new' => 'Nieuw aanmaken', + 'show' => 'Weergeven', + 'edit' => 'Bewerken', + 'delete' => 'Verwijderen', + 'send' => 'Verzenden', + 'download' => 'Download', + 'delete_confirm' => 'Weet u zeker dat u dit wilt verwijderen, :name :type?', + 'name' => 'Naam', + 'email' => 'E-mail', + 'tax_number' => 'BTW-nummer', + 'phone' => 'Telefoonnummer', + 'address' => 'Adres', + 'website' => 'Website', + 'actions' => 'Acties', + 'description' => 'Beschrijving', + 'manage' => 'Beheren', + 'code' => 'Code', + 'alias' => 'Alias', + 'balance' => 'Saldo', + 'reference' => 'Referentie', + 'attachment' => 'Bijlage', + 'change' => 'Wijzigen', + 'switch' => 'Omschakelen', + 'color' => 'Kleur', + 'save' => 'Opslaan', + 'cancel' => 'Annuleren', + 'from' => 'Van', + 'to' => 'Aan', + 'print' => 'Afdrukken', + 'search' => 'Zoeken', + 'search_placeholder' => 'Typ om te zoeken..', + 'filter' => 'Filter', + 'help' => 'Hulp', + 'all' => 'Alle', + 'all_type' => 'Alle :type', + 'upcoming' => 'Aankomende', + 'created' => 'Aangemaakt', + 'id' => 'ID', + 'more_actions' => 'Meer acties', + 'duplicate' => 'Dupliceren', + 'unpaid' => 'Onbetaald', + 'paid' => 'Betaald', + 'overdue' => 'Achterstallig', + 'partially' => 'Gedeeltelijk', + 'partially_paid' => 'Gedeeltelijk betaald', + 'export' => 'Exporteren', + 'enable' => 'Activeren', + 'disable' => 'Uitschakelen', + + 'title' => [ + 'new' => 'Nieuwe :type', + 'edit' => ':type bewerken', + ], + + 'form' => [ + 'enter' => 'Voer :field', + 'select' => [ + 'field' => '- Selecteer :field -', + 'file' => 'Selecteer bestand', + ], + 'no_file_selected' => 'Geen bestand geselecteerd...', + ], + +]; diff --git a/resources/lang/nl-NL/header.php b/resources/lang/nl-NL/header.php new file mode 100755 index 0000000..d9fcddf --- /dev/null +++ b/resources/lang/nl-NL/header.php @@ -0,0 +1,15 @@ + 'Taal wijzigen', + 'last_login' => 'Laatste login :time', + 'notifications' => [ + 'counter' => '{0} U heeft geen melding |{1} U heeft :count notificatie| [2,*] U heeft :count notificaties', + 'overdue_invoices' => '{1} :count achterstallig factuur | [2,*] :count achterstallige facturen', + 'upcoming_bills' => '{1} :count aankomende factuur | [2,*] :count aankomende facturen', + 'items_stock' => '{1} :count artikel niet op voorraad | [2,*] :count artikelen niet op voorraad', + 'view_all' => 'Alles Weergeven' + ], + +]; diff --git a/resources/lang/nl-NL/import.php b/resources/lang/nl-NL/import.php new file mode 100755 index 0000000..ac4435d --- /dev/null +++ b/resources/lang/nl-NL/import.php @@ -0,0 +1,9 @@ + 'Importeren', + 'title' => ':type importeren', + 'message' => 'Toegestane bestandstypen: XLS, XLSX. Download het voorbeeldbestand.', + +]; diff --git a/resources/lang/nl-NL/install.php b/resources/lang/nl-NL/install.php new file mode 100755 index 0000000..e7884ec --- /dev/null +++ b/resources/lang/nl-NL/install.php @@ -0,0 +1,44 @@ + 'Volgende', + 'refresh' => 'Vernieuwen', + + 'steps' => [ + 'requirements' => 'Vraag uw hostingprovider om de fout(en) op te lossen!', + 'language' => 'Stap 1/3: Taalkeuze', + 'database' => 'Stap 2/3: Database Installatie', + 'settings' => 'Stap 3/3: Gegevens van Bedrijf en Beheerder', + ], + + 'language' => [ + 'select' => 'Taal selecteren', + ], + + 'requirements' => [ + 'enabled' => ':feature moet worden ingeschakeld!', + 'disabled' => ':feature moet worden uitgeschakeld!', + 'extension' => ':extension extentie moet worden geïnstalleerd en geladen!', + 'directory' => ':directory map moet schrijfbaar zijn!', + ], + + 'database' => [ + 'hostname' => 'Hostnaam', + 'username' => 'Gebruikersnaam', + 'password' => 'Wachtwoord', + 'name' => 'Database', + ], + + 'settings' => [ + 'company_name' => 'Bedrijfsnaam', + 'company_email' => 'E-mailadres bedrijf', + 'admin_email' => 'E-mailadres beheerder', + 'admin_password' => 'Wachtwoord van beheerder', + ], + + 'error' => [ + 'connection' => 'Fout: Kan geen verbinding met de database! Controleer of alle gegevens juist zijn.', + ], + +]; diff --git a/resources/lang/nl-NL/invoices.php b/resources/lang/nl-NL/invoices.php new file mode 100755 index 0000000..125619d --- /dev/null +++ b/resources/lang/nl-NL/invoices.php @@ -0,0 +1,55 @@ + 'Factuurnummer', + 'invoice_date' => 'Factuur datum', + 'total_price' => 'Totaalprijs', + 'due_date' => 'Vervaldatum', + 'order_number' => 'Bestelnummer', + 'bill_to' => 'Factuur voor', + + 'quantity' => 'Aantal', + 'price' => 'Prijs', + 'sub_total' => 'Subtotaal', + 'discount' => 'Korting', + 'tax_total' => 'Totaal BTW', + 'total' => 'Totaal', + + 'item_name' => 'Artikelnaam|Artikelnamen', + + 'show_discount' => ':discount% Korting', + 'add_discount' => 'Korting toevoegen', + 'discount_desc' => 'van subtotaal', + + 'payment_due' => 'Te betalen voor', + 'paid' => 'Betaald', + 'histories' => 'Geschiedenis', + 'payments' => 'Betalingen', + 'add_payment' => 'Een betaling toevoegen', + 'mark_paid' => 'Als betaald markeren', + 'mark_sent' => 'Als verstuurd markeren', + 'download_pdf' => 'PDF downloaden', + 'send_mail' => 'E-mail versturen', + + 'status' => [ + 'draft' => 'Concept', + 'sent' => 'Verzonden', + 'viewed' => 'Bekeken', + 'approved' => 'Goedgekeurd', + 'partial' => 'Gedeeltelijk', + 'paid' => 'Betaald', + ], + + 'messages' => [ + 'email_sent' => 'Factuur is succesvol per e-mail verzonden!', + 'marked_sent' => 'Factuur is succesvol als verzonden gemarkeerd!', + 'email_required' => 'Er is geen e-mailadres bekend van deze klant!', + ], + + 'notification' => [ + 'message' => 'U ontvangt deze e-mail omdat u :amount aanstaande factuur heeft voor klant :customer.', + 'button' => 'Nu betalen', + ], + +]; diff --git a/resources/lang/nl-NL/items.php b/resources/lang/nl-NL/items.php new file mode 100755 index 0000000..65bc44a --- /dev/null +++ b/resources/lang/nl-NL/items.php @@ -0,0 +1,15 @@ + 'Hoeveelheid|Hoeveelheden', + 'sales_price' => 'Verkoopprijs', + 'purchase_price' => 'Aankoopprijs', + 'sku' => 'SKU', + + 'notification' => [ + 'message' => 'U ontvangt deze e-mail omdat er bijna geen voorraad meer is van: :name.', + 'button' => 'Nu bekijken', + ], + +]; diff --git a/resources/lang/nl-NL/messages.php b/resources/lang/nl-NL/messages.php new file mode 100755 index 0000000..afc73e0 --- /dev/null +++ b/resources/lang/nl-NL/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => ':type toegevoegd!', + 'updated' => ':type bijgewerkt!', + 'deleted' => ':type verwijderd!', + 'duplicated' => ':type gedupliceerd!', + 'imported' => ':type geïmporteerd!', + 'enabled' => ':type ingeschakeld!', + 'disabled' => ':type uitgeschakeld!', + ], + 'error' => [ + 'over_payment' => 'Fout: Betaling niet toegevoegd! Ingevoerde bedrag is hoger dan het totaal bedrag.', + 'not_user_company' => 'Fout: U heeft niet de juiste bevoegdheid om dit bedrijf te beheren!', + 'customer' => 'Fout: Gebruiker niet aangemaakt! :name heeft dit e-mailadres al in gebruik.', + 'no_file' => 'Fout: geen bestand geselecteerd!', + 'last_category' => 'Fout: Kan de laatste categorie niet verwijderen: :type', + 'invalid_token' => 'Fout: Ingevulde token is ongeldig!', + 'import_column' => 'Fout: :message Blad naam: :sheet. Lijnnummer: :line.', + 'import_sheet' => 'Fout: Bladnaam is niet geldig. Vergelijk het met het voorbeeldbestand.', + ], + 'warning' => [ + 'deleted' => 'Waarschuwing: Het is voor u niet toegestaan om :name te verwijderen omdat het gerelateerd is aan :text.', + 'disabled' => 'Waarschuwing: U mag :name niet uitschakelen omdat het gerelateerd is aan :text.', + ], + +]; diff --git a/resources/lang/nl-NL/modules.php b/resources/lang/nl-NL/modules.php new file mode 100755 index 0000000..1f1554a --- /dev/null +++ b/resources/lang/nl-NL/modules.php @@ -0,0 +1,58 @@ + 'API-Token', + 'api_token' => 'Token', + 'my_apps' => 'Mijn Apps', + 'top_paid' => 'Top betaald', + 'new' => 'Nieuw', + 'top_free' => 'Top gratis', + 'free' => 'GRATIS', + 'search' => 'Zoeken', + 'install' => 'Installeer', + 'buy_now' => 'Nu kopen', + 'token_link' => 'Klik hier om uw API-token te bemachtigen.', + 'no_apps' => 'Er zijn nog geen Apps in deze categorie beschikbaar.', + 'developer' => 'Bent u een ontwikkelaar? Hier kunt u lezen hoe u vandaag nog een app kan ontwikkelen en verkopen!', + + 'about' => 'Over ons', + + 'added' => 'Toegevoegd', + 'updated' => 'Bijgewerkt', + 'compatibility' => 'Compatibiliteit', + + 'installed' => ':module geïnstalleerd', + 'uninstalled' => ':module verwijderd', + //'updated' => ':module updated', + 'enabled' => ':module ingeschakeld', + 'disabled' => ':module uitgeschakeld', + + 'tab' => [ + 'installation' => 'Installatie', + 'faq' => 'Veelgestelde vragen (FAQ)', + 'changelog' => 'Wijzigingslogboek', + ], + + 'installation' => [ + 'header' => 'App installatie', + 'download' => ':module bestand aan het downloaden.', + 'unzip' => 'Bezig met uitpakken van :module bestanden.', + 'install' => 'Bezit met installatie van :module bestanden.', + ], + + 'badge' => [ + 'installed' => 'Geïnstalleerd', + ], + + 'button' => [ + 'uninstall' => 'Verwijderen', + 'disable' => 'Uitschakelen', + 'enable' => 'Activeren', + ], + + 'my' => [ + 'purchased' => 'Gekocht', + 'installed' => 'Geïnstalleerd', + ], +]; diff --git a/resources/lang/nl-NL/notifications.php b/resources/lang/nl-NL/notifications.php new file mode 100755 index 0000000..9a5faf2 --- /dev/null +++ b/resources/lang/nl-NL/notifications.php @@ -0,0 +1,10 @@ + 'Oeps!', + 'hello' => 'Hallo!', + 'salutation' => 'Met vriendelijke groet,
    :company_name', + 'subcopy' => 'Als u problemen ondervindt met het klikken op ":text" knop, kopieer en plak dan onderstaande URL in uw webbrowser: [:url](:url)', + +]; diff --git a/resources/lang/nl-NL/pagination.php b/resources/lang/nl-NL/pagination.php new file mode 100755 index 0000000..4a2bc94 --- /dev/null +++ b/resources/lang/nl-NL/pagination.php @@ -0,0 +1,9 @@ + '« Vorige', + 'next' => 'Volgende »', + 'showing' => 'Weergave: :first naar :last van :total :type', + +]; diff --git a/resources/lang/nl-NL/passwords.php b/resources/lang/nl-NL/passwords.php new file mode 100755 index 0000000..be52b4a --- /dev/null +++ b/resources/lang/nl-NL/passwords.php @@ -0,0 +1,22 @@ + 'Wachtwoord moet 6 karakters lang zijn en gelijk zijn in beide wachtwoordvelden.', + 'reset' => 'Uw wachtwoord is opnieuw ingesteld!', + 'sent' => 'Wij hebben uw wachtwoord reset link per e-mail naar u verstuurd!', + 'token' => 'Dit wachtwoord reset-token is ongeldig.', + 'user' => "Wij kunnen geen gebruiker met dat e-mail adres vinden.", + +]; diff --git a/resources/lang/nl-NL/recurring.php b/resources/lang/nl-NL/recurring.php new file mode 100755 index 0000000..fdeee99 --- /dev/null +++ b/resources/lang/nl-NL/recurring.php @@ -0,0 +1,20 @@ + 'Terugkerende', + 'every' => 'Elke', + 'period' => 'Periode', + 'times' => 'Tijden', + 'daily' => 'Dagelijks', + 'weekly' => 'Wekelijks', + 'monthly' => 'Maandelijks', + 'yearly' => 'Jaarlijks', + 'custom' => 'Aangepast', + 'days' => 'Dag(en)', + 'weeks' => 'Week/weken', + 'months' => 'Maand(en)', + 'years' => 'Jaar/jaren', + 'message' => 'Dit is een terugkerende :type en de volgende :type zal automatisch worden gegenereerd op :date', + +]; diff --git a/resources/lang/nl-NL/reports.php b/resources/lang/nl-NL/reports.php new file mode 100755 index 0000000..806134b --- /dev/null +++ b/resources/lang/nl-NL/reports.php @@ -0,0 +1,30 @@ + 'Dit jaar', + 'previous_year' => 'Vorig jaar', + 'this_quarter' => 'Dit kwartaal', + 'previous_quarter' => 'Vorige kwartaal', + 'last_12_months' => 'Afgelopen 12 maanden', + 'profit_loss' => 'Winst & verlies', + 'gross_profit' => 'Bruto winst', + 'net_profit' => 'Nettowinst', + 'total_expenses' => 'Totale uitgaven', + 'net' => 'NET', + + 'summary' => [ + 'income' => 'Samenvatting inkomsten', + 'expense' => 'Kosten overzicht', + 'income_expense' => 'Inkomen vs uitgaven', + 'tax' => 'Belasting overzicht', + ], + + 'quarter' => [ + '1' => 'Jan-Mrt', + '2' => 'Apr-Jun', + '3' => 'Jul-Sep', + '4' => 'Okt-Dec', + ], + +]; diff --git a/resources/lang/nl-NL/settings.php b/resources/lang/nl-NL/settings.php new file mode 100755 index 0000000..e9c933d --- /dev/null +++ b/resources/lang/nl-NL/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Naam', + 'email' => 'E-mail', + 'phone' => 'Telefoonnummer', + 'address' => 'Adres', + 'logo' => 'Logo', + ], + 'localisation' => [ + 'tab' => 'Lokalisatie', + 'date' => [ + 'format' => 'Datum formaat', + 'separator' => 'Datumscheidingsteken', + 'dash' => 'Streepje (-)', + 'dot' => 'Punt (.)', + 'comma' => 'Komma (,)', + 'slash' => 'Slash (/)', + 'space' => 'Spatie ( ) ', + ], + 'timezone' => 'Tijdzone', + 'percent' => [ + 'title' => 'Procent (%) Positie', + 'before' => 'Voor aantal', + 'after' => 'Na aantal', + ], + ], + 'invoice' => [ + 'tab' => 'Factuur', + 'prefix' => 'Nummer voorvoegsel', + 'digit' => 'Aantal cijfers', + 'next' => 'Volgende nummer', + 'logo' => 'Logo', + ], + 'default' => [ + 'tab' => 'Standaardwaarden', + 'account' => 'Standaard account', + 'currency' => 'Standaard Valuta', + 'tax' => 'Standaard BTW-tarief', + 'payment' => 'Standaard betalingsmethode', + 'language' => 'Standaard Taal', + ], + 'email' => [ + 'protocol' => 'Protocol', + 'php' => 'PHP mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP host', + 'port' => 'SMTP-poort', + 'username' => 'SMTP gebruikersnaam', + 'password' => 'SMTP wachtwoord', + 'encryption' => 'SMTP beveiliging', + 'none' => 'Geen', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Sendmail pad', + 'log' => 'E-mail logs', + ], + 'scheduling' => [ + 'tab' => 'Schema', + 'send_invoice' => 'Factuur herinnering sturen', + 'invoice_days' => 'Aantal dagen na vervaldatum sturen', + 'send_bill' => 'Factuur herinnering sturen', + 'bill_days' => 'Aantal dagen voor vervaldatum sturen', + 'cron_command' => 'Cron opdracht', + 'schedule_time' => 'Uren duurtijd', + ], + 'appearance' => [ + 'tab' => 'Opmaak', + 'theme' => 'Thema', + 'light' => 'Licht', + 'dark' => 'Donker', + 'list_limit' => 'Resultaten per pagina', + 'use_gravatar' => 'Gebruik Gravatar', + ], + 'system' => [ + 'tab' => 'Systeem', + 'session' => [ + 'lifetime' => 'Sessie levensduur (minuten)', + 'handler' => 'Sessie Beheerder', + 'file' => 'Bestand', + 'database' => 'Database', + ], + 'file_size' => 'Maximale bestandsgrootte (MB)', + 'file_types' => 'Toegestane bestandstypes', + ], + +]; diff --git a/resources/lang/nl-NL/taxes.php b/resources/lang/nl-NL/taxes.php new file mode 100755 index 0000000..7e8fff1 --- /dev/null +++ b/resources/lang/nl-NL/taxes.php @@ -0,0 +1,8 @@ + 'Tarief', + 'rate_percent' => 'Tarief (%)', + +]; diff --git a/resources/lang/nl-NL/transfers.php b/resources/lang/nl-NL/transfers.php new file mode 100755 index 0000000..ecfc21a --- /dev/null +++ b/resources/lang/nl-NL/transfers.php @@ -0,0 +1,12 @@ + 'Van Account', + 'to_account' => 'Naar Account', + + 'messages' => [ + 'delete' => ':from tot :to (:amount)', + ], + +]; diff --git a/resources/lang/nl-NL/updates.php b/resources/lang/nl-NL/updates.php new file mode 100755 index 0000000..2ce930d --- /dev/null +++ b/resources/lang/nl-NL/updates.php @@ -0,0 +1,15 @@ + 'Geïnstalleerde versie', + 'latest_version' => 'Laatste versie', + 'update' => 'Akaunting bijwerken naar versie :version', + 'changelog' => 'Wijzigingslogboek', + 'check' => 'Controleren', + 'new_core' => 'Er is een nieuwere versie van Akaunting beschikbaar.', + 'latest_core' => 'Gefeliciteerd! U heeft de laatste versie van Akaunting. Toekomstige beveiligingsupdates zullen automatisch worden toegepast.', + 'success' => 'Update-proces is voltooid.', + 'error' => 'Update-proces is mislukt. Probeer het alstublieft opnieuw.', + +]; diff --git a/resources/lang/nl-NL/validation.php b/resources/lang/nl-NL/validation.php new file mode 100755 index 0000000..e49c111 --- /dev/null +++ b/resources/lang/nl-NL/validation.php @@ -0,0 +1,120 @@ + ':attribute moet worden geaccepteerd.', + 'active_url' => ':attribute is geen geldige URL.', + 'after' => ':attribute moet een datum zijn die later is dan :date.', + 'after_or_equal' => ':attribute moet een datum zijn die later is dan :date.', + 'alpha' => ':attribute mag enkel letters bevatten.', + 'alpha_dash' => ':attribute mag enkel letters, cijfers of koppeltekens bevatten.', + 'alpha_num' => ':attribute mag enkel letters en cijfers bevatten.', + 'array' => ':attribute moet een string zijn.', + 'before' => ':attribute moet een datum zijn voor :date.', + 'before_or_equal' => ':attribute moet een datum zijn voor of gelijk aan :date.', + 'between' => [ + 'numeric' => 'De kenmerk :attribute moet tussen :min en :max zijn.', + 'file' => 'De kenmerk :attribute moet tussen :min en :max kilobytes zijn.', + 'string' => 'De kenmerk :attribute moet tussen :min en :max tekens zijn.', + 'array' => 'De kenmerk :attribute moeten tussen :min en :max items zijn.', + ], + 'boolean' => 'De kenmerksveld :attribute moet waar of onwaar zijn.', + 'confirmed' => 'De kenmerken :attribute komen niet overeen.', + 'date' => ':attribute is geen geldige datum.', + 'date_format' => ':attribute komt niet overeen met het volgende formaat :format.', + 'different' => ':attribute en :other mag niet hetzelfde zijn.', + 'digits' => ':attribute moet bestaan uit :digits cijfers.', + 'digits_between' => ':attribute moet tussen de :min en :max aantal karakters lang zijn.', + 'dimensions' => ':attribute heeft ongeldige afbeelding afmetingen.', + 'distinct' => ':attribute velden bevat dubbele waarden.', + 'email' => ':attribute moet een geldig e-mailadres zijn.', + 'exists' => 'Het geselecteerde kenmerk :attribute is ongeldig.', + 'file' => ':attribute moet een bestand zijn.', + 'filled' => ':attribute veld moet een waarde bevatten.', + 'image' => ':attribute moet een afbeelding zijn.', + 'in' => 'Het geselecteerde :attribute is ongeldig.', + 'in_array' => ':attribute veld bestaat niet in :other.', + 'integer' => 'Het :attribute moet een getal zijn.', + 'ip' => ':attribute moet een geldig IP-adres zijn.', + 'json' => ':attribute moet een geldige JSON string zijn.', + 'max' => [ + 'numeric' => ':attribute mag niet groter zijn dan :max.', + 'file' => ':attribute mag niet groter zijn dan :max kilobytes.', + 'string' => ':attribute mag niet meer zijn dan :max tekens.', + 'array' => ':attribute mag niet meer dan :max items zijn.', + ], + 'mimes' => ':attribute moet een bestandstype :values zijn.', + 'mimetypes' => ':attribute moet bestandstype :values zijn.', + 'min' => [ + 'numeric' => ':attribute moet minstens :min zijn.', + 'file' => ':attribute moet minstens :min kilobytes zijn.', + 'string' => ':attribute moet minstens :min tekens zijn.', + 'array' => ':attribute moet minstens :min items zijn.', + ], + 'not_in' => 'De geselecteerde kenmerk :attribute is ongeldig.', + 'numeric' => ':attribute moet een getal zijn.', + 'present' => ':attribute moet aanwezig zijn.', + 'regex' => 'De indeling van kenmerk :attribute is ongeldig.', + 'required' => ':attribute is verplicht.', + 'required_if' => ':attribute veld is verplicht wanneer :other :value is.', + 'required_unless' => ':attribute veld is verplicht tenzij :other bestaat in :values.', + 'required_with' => ':attribute veld is verplicht wanneer :values aanwezig is.', + 'required_with_all' => ':attribute veld is verplocht wanneer :"values aanwezig is.', + 'required_without' => ':attribute veld is verplocht wanneer :values niet aanwezig is.', + 'required_without_all' => ':attribute veld is verplocht wanneer geen van :values aanwezig zijn.', + 'same' => ':attribute en :other moeten overeenkomen.', + 'size' => [ + 'numeric' => ':attribute moet :size zijn.', + 'file' => ':attribute moet :size kilobytes zijn.', + 'string' => ':attribute moet :size tekens zijn.', + 'array' => ':attribute moet :size items bevatten.', + ], + 'string' => ':attribute moet een string zijn.', + 'timezone' => ':attribute moet een geldige zone zijn.', + 'unique' => ':attribute is al reeds in gebruik.', + 'uploaded' => 'Mislukt om :attribute te uploaden.', + 'url' => ':attribute kenmerk is ongeldig.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'aangepast-bericht', + ], + 'invalid_currency' => 'De code :attribute is ongeldig.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/pt-BR/accounts.php b/resources/lang/pt-BR/accounts.php new file mode 100755 index 0000000..52fccdb --- /dev/null +++ b/resources/lang/pt-BR/accounts.php @@ -0,0 +1,14 @@ + 'Nome', + 'number' => 'Número', + 'opening_balance' => 'Saldo Inicial', + 'current_balance' => 'Valor Atual', + 'bank_name' => 'Nome do Banco', + 'bank_phone' => 'Telefone', + 'bank_address' => 'Endereço', + 'default_account' => 'Conta Padrão', + +]; diff --git a/resources/lang/pt-BR/auth.php b/resources/lang/pt-BR/auth.php new file mode 100755 index 0000000..39b4266 --- /dev/null +++ b/resources/lang/pt-BR/auth.php @@ -0,0 +1,39 @@ + 'Perfil', + 'logout' => 'Sair', + 'login' => 'Logar', + 'login_to' => 'Entre para iniciar sua sessão', + 'remember_me' => 'Lembrar-me', + 'forgot_password' => 'Lembrar senha', + 'reset_password' => 'Resetar Senha', + 'enter_email' => 'Entre com o seu endereço de e-mail', + 'current_email' => 'E-mail atual', + 'reset' => 'Resetar', + 'never' => 'Nunca', + + 'password' => [ + 'current' => 'Senha', + 'current_confirm' => 'Confirmação da Senha', + 'new' => 'Nova Senha', + 'new_confirm' => 'Confirmação da Nova Senha', + ], + + 'error' => [ + 'self_delete' => 'Erro: não pode se excluir!', + 'no_company' => 'Erro: Nenhuma empresa atribuída à sua conta. Por favor, entre em contato com o administrador do sistema.', + ], + + 'failed' => 'Essas credenciais não correspondem aos nossos registros.', + 'disabled' => 'Esta conta está desabilitada. Por favor, entre em contato com o administrador do sistema.', + 'throttle' => 'Muitas tentativas de login. Tente novamente em :seconds segundos.', + + 'notification' => [ + 'message_1' => 'Você está recebendo este e-mail porque recebemos um pedido de redefinição de senha para sua conta.', + 'message_2' => 'Se você não pediu uma redefinição de senha, nenhuma ação adicional é necessária.', + 'button' => 'Recuperar senha', + ], + +]; diff --git a/resources/lang/pt-BR/bills.php b/resources/lang/pt-BR/bills.php new file mode 100755 index 0000000..bbdbd18 --- /dev/null +++ b/resources/lang/pt-BR/bills.php @@ -0,0 +1,46 @@ + 'Número da conta', + 'bill_date' => 'Data de Emissão', + 'total_price' => 'Valor Total', + 'due_date' => 'Data de Vencimento', + 'order_number' => 'Número', + 'bill_from' => 'Bill From', + + 'quantity' => 'Quantidade', + 'price' => 'Preço', + 'sub_total' => 'Subtotal', + 'discount' => 'Desconto', + 'tax_total' => 'Taxa', + 'total' => 'Total', + + 'item_name' => 'Nome(s) do(s) Item(s)', + + 'show_discount' => ':discount% desconto', + 'add_discount' => 'Adicionar desconto', + 'discount_desc' => 'subtotal', + + 'payment_due' => 'Valor Devido', + 'amount_due' => 'Total Devido', + 'paid' => 'Pago', + 'histories' => 'Histórico', + 'payments' => 'Pagamentos', + 'add_payment' => 'Novo Pagamento', + 'mark_received' => 'Marcar como Recebida', + 'download_pdf' => 'Baixar em PDF', + 'send_mail' => 'Enviar E-mail', + + 'status' => [ + 'draft' => 'Rascunho', + 'received' => 'Recebido', + 'partial' => 'Parcial', + 'paid' => 'Pago', + ], + + 'messages' => [ + 'received' => 'Conta marcada como recebida com sucesso!', + ], + +]; diff --git a/resources/lang/pt-BR/companies.php b/resources/lang/pt-BR/companies.php new file mode 100755 index 0000000..d567bb2 --- /dev/null +++ b/resources/lang/pt-BR/companies.php @@ -0,0 +1,13 @@ + 'Endereço do site', + 'logo' => 'Logotipo', + 'manage' => 'Gerenciar empresas', + 'all' => 'Todas as empresas', + 'error' => [ + 'delete_active' => 'Erro: não é possível deletar a empresa em atividade, por favor altere o cadastro!', + ], + +]; diff --git a/resources/lang/pt-BR/currencies.php b/resources/lang/pt-BR/currencies.php new file mode 100755 index 0000000..5269d69 --- /dev/null +++ b/resources/lang/pt-BR/currencies.php @@ -0,0 +1,18 @@ + 'Código', + 'rate' => 'Taxa', + 'default' => 'Moeda Padrão', + 'decimal_mark' => 'Separador de decimal', + 'thousands_separator' => 'Separador de milhar', + 'precision' => 'Precisão', + 'symbol' => [ + 'symbol' => 'Símbolo', + 'position' => 'Posição do símbolo', + 'before' => 'Antes do valor', + 'after' => 'Depois do valor', + ] + +]; diff --git a/resources/lang/pt-BR/customers.php b/resources/lang/pt-BR/customers.php new file mode 100755 index 0000000..3f3d87b --- /dev/null +++ b/resources/lang/pt-BR/customers.php @@ -0,0 +1,11 @@ + 'Permitir Acesso?', + 'user_created' => 'Usuário criado', + + 'error' => [ + 'email' => 'Este e-mail já foi utilizado.' + ] +]; diff --git a/resources/lang/pt-BR/dashboard.php b/resources/lang/pt-BR/dashboard.php new file mode 100755 index 0000000..dd0a92f --- /dev/null +++ b/resources/lang/pt-BR/dashboard.php @@ -0,0 +1,24 @@ + 'Rendimentos totais', + 'receivables' => 'Recebíveis', + 'open_invoices' => 'Faturas em aberto', + 'overdue_invoices' => 'Faturas vencidas', + 'total_expenses' => 'Despesas totais', + 'payables' => 'Pagamentos', + 'open_bills' => 'Contas Abertas', + 'overdue_bills' => 'Contas Vencidas', + 'total_profit' => 'Lucro Total', + 'open_profit' => 'Lucro em Aberto', + 'overdue_profit' => 'Lucro Vencido', + 'cash_flow' => 'Fluxo de Caixa', + 'no_profit_loss' => 'Sem perda de lucro', + 'incomes_by_category' => 'Resultados por Categoria', + 'expenses_by_category' => 'Despesas por Categoria', + 'account_balance' => 'Saldo da Conta', + 'latest_incomes' => 'Últimos Rendimentos', + 'latest_expenses' => 'Últimas Despesas', + +]; diff --git a/resources/lang/pt-BR/demo.php b/resources/lang/pt-BR/demo.php new file mode 100755 index 0000000..4952ef5 --- /dev/null +++ b/resources/lang/pt-BR/demo.php @@ -0,0 +1,16 @@ + 'Dinheiro', + 'categories_deposit' => 'Depósito', + 'categories_sales' => 'Vendas', + 'currencies_usd' => 'US Americado', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Libras Britânicas', + 'currencies_try' => 'Lira Turca', + 'taxes_exempt' => 'Isento de Imposto', + 'taxes_normal' => 'Taxa padrão', + 'taxes_sales' => 'Imposto sobre venda', + +]; diff --git a/resources/lang/pt-BR/footer.php b/resources/lang/pt-BR/footer.php new file mode 100755 index 0000000..b8759b0 --- /dev/null +++ b/resources/lang/pt-BR/footer.php @@ -0,0 +1,9 @@ + 'Versão', + 'powered' => 'Desenvolvido por Akaunting', + 'software' => 'Software de contabilidade gratuito', + +]; diff --git a/resources/lang/pt-BR/general.php b/resources/lang/pt-BR/general.php new file mode 100755 index 0000000..f1316cf --- /dev/null +++ b/resources/lang/pt-BR/general.php @@ -0,0 +1,121 @@ + 'Item | Itens', + 'incomes' => 'Renda|Rendas', + 'invoices' => 'Fatura|Faturas', + 'revenues' => 'Receita|Receitas', + 'customers' => 'Cliente|Clientes', + 'expenses' => 'Despesa|Despesas', + 'bills' => 'Fatura|Faturas', + 'payments' => 'Pagamento|Pagamento', + 'vendors' => 'Fornecedor|Fornecedores', + 'accounts' => 'Conta|Contas', + 'transfers' => 'Transferência|Transferências', + 'transactions' => 'Transação|Transações', + 'reports' => 'Relatório|Relatórios', + 'settings' => 'Configuração|Configurações', + 'categories' => 'Categoria|Categorias', + 'currencies' => 'Moeda|Moedas', + 'tax_rates' => 'Taxa de Imposto|Taxa de Impostos', + 'users' => 'Usuário|Usuário', + 'roles' => 'Regra|Regras', + 'permissions' => 'Permissão|Permissões', + 'modules' => 'App | Apps', + 'companies' => 'Empresa|Empresas', + 'profits' => 'Lucro|Lucros', + 'taxes' => 'Imposto|Impostos', + 'logos' => 'Logotipo | Logotipos', + 'pictures' => 'Imagen|Imagens', + 'types' => 'Tipo|Tipos', + 'payment_methods' => 'Método de pagamento|Método de pagamentos', + 'compares' => 'Receita vs Despesa|Receitas vs Despesas', + 'notes' => 'Nota|Notas', + 'totals' => 'Total|Totais', + 'languages' => 'Idioma|Idiomas', + 'updates' => 'Atualização|Atualizações', + 'numbers' => 'Número|Números', + 'statuses' => 'Status|Status', + 'others' => 'Outro | Outros', + + 'dashboard' => 'Painel', + 'banking' => 'Banco', + 'general' => 'Geral', + 'no_records' => 'Sem registros.', + 'date' => 'Data', + 'amount' => 'Montante', + 'enabled' => 'Ativado', + 'disabled' => 'Desativado', + 'yes' => 'Sim', + 'no' => 'Não', + 'na' => 'N/A', + 'daily' => 'Diariamente', + 'monthly' => 'Mensal', + 'quarterly' => 'Trimestral', + 'yearly' => 'Anual', + 'add' => 'Adicionar', + 'add_new' => 'Adicionar novo', + 'show' => 'Visualizar', + 'edit' => 'Editar', + 'delete' => 'Excluir', + 'send' => 'Enviar', + 'download' => 'Baixar', + 'delete_confirm' => 'Confirma a exclusão :name :type?', + 'name' => 'Nome', + 'email' => 'E-mail', + 'tax_number' => 'Número de identificação fisca', + 'phone' => 'Telefone', + 'address' => 'Endereço', + 'website' => 'Site', + 'actions' => 'Ações', + 'description' => 'Descrição', + 'manage' => 'Gerenciar', + 'code' => 'Código', + 'alias' => 'Alias', + 'balance' => 'Balancear', + 'reference' => 'Referência', + 'attachment' => 'Anexo', + 'change' => 'Alterar', + 'switch' => 'Trocar', + 'color' => 'Cor', + 'save' => 'Salvar', + 'cancel' => 'Cancelar', + 'from' => 'De', + 'to' => 'Para', + 'print' => 'Imprimir', + 'search' => 'Localizar', + 'search_placeholder' => 'Digite para pesquisa..', + 'filter' => 'Filtar', + 'help' => 'Ajuda', + 'all' => 'Todos', + 'all_type' => 'Todos :type', + 'upcoming' => 'Próximos', + 'created' => 'Criado', + 'id' => 'Código', + 'more_actions' => 'Mais ações', + 'duplicate' => 'Duplicado', + 'unpaid' => 'Não Pago', + 'paid' => 'Pago', + 'overdue' => 'Atrasado', + 'partially' => 'Parcial', + 'partially_paid' => 'Pagamento parcial', + 'export' => 'Export', + 'enable' => 'Enable', + 'disable' => 'Disable', + + 'title' => [ + 'new' => 'Novo :type', + 'edit' => 'Editar :type', + ], + + 'form' => [ + 'enter' => 'Digite :field', + 'select' => [ + 'field' => '- Selecionar :field -', + 'file' => 'Selecionar Arquivo', + ], + 'no_file_selected' => 'Nenhum arquivo selecionado...', + ], + +]; diff --git a/resources/lang/pt-BR/header.php b/resources/lang/pt-BR/header.php new file mode 100755 index 0000000..385369f --- /dev/null +++ b/resources/lang/pt-BR/header.php @@ -0,0 +1,15 @@ + 'Alterar Idioma', + 'last_login' => 'Último Login :time', + 'notifications' => [ + 'counter' => '{0} Você não tem notificação|{1} Você tem :count notificação|[2,*] Você tem :count notificações', + 'overdue_invoices' => '{1} :count nota atrasada|[2,*] :count notas atrasadas', + 'upcoming_bills' => '{1} :count vencimento atual|[2,*] :count vencimentos atual', + 'items_stock' => '{1}: item de contagem fora de estoque | [2, *]: contar itens fora de estoque', + 'view_all' => 'Visualizar todos' + ], + +]; diff --git a/resources/lang/pt-BR/import.php b/resources/lang/pt-BR/import.php new file mode 100755 index 0000000..53c0c73 --- /dev/null +++ b/resources/lang/pt-BR/import.php @@ -0,0 +1,9 @@ + 'Importar', + 'title' => 'Importação: tipo', + 'message' => 'Tipos de arquivos permitidos: XLS, XLSX. Por favor, clique aqui, para baixar o arquivo de exemplo.', + +]; diff --git a/resources/lang/pt-BR/install.php b/resources/lang/pt-BR/install.php new file mode 100755 index 0000000..9829de4 --- /dev/null +++ b/resources/lang/pt-BR/install.php @@ -0,0 +1,44 @@ + 'Próximo', + 'refresh' => 'Atualizar', + + 'steps' => [ + 'requirements' => 'Por favor, consulte o seu provedor de hospedagem para corrigir os erros!', + 'language' => 'Passo 1/3 : Selecionar idioma', + 'database' => 'Passo 2/3 : Configuração do Banco de Dados', + 'settings' => 'Passo 3/3 : Detalhes da empresa e do administrador', + ], + + 'language' => [ + 'select' => 'Selecionar Idioma', + ], + + 'requirements' => [ + 'enabled' => ':feature precisa esta habilitado!', + 'disabled' => ':feature precisa esta desabilitado!', + 'extension' => 'Extensão :extension precisa ser instalado e carregado!', + 'directory' => 'O diretório :directory precisa de permissão para escrita!', + ], + + 'database' => [ + 'hostname' => 'Nome do servidor', + 'username' => 'Nome de usuário', + 'password' => 'Senha', + 'name' => 'Banco de Dados', + ], + + 'settings' => [ + 'company_name' => 'Nome da empresa', + 'company_email' => 'E-mail da empresa', + 'admin_email' => 'E-mail do Admin', + 'admin_password' => 'Senha do Admin', + ], + + 'error' => [ + 'connection' => 'Erro: Não foi possível conectar ao banco de dados! Certifique-se de que os detalhes estão corretos.', + ], + +]; diff --git a/resources/lang/pt-BR/invoices.php b/resources/lang/pt-BR/invoices.php new file mode 100755 index 0000000..5a22060 --- /dev/null +++ b/resources/lang/pt-BR/invoices.php @@ -0,0 +1,55 @@ + 'Número da Fatura', + 'invoice_date' => 'Data de Emissão', + 'total_price' => 'Valor total', + 'due_date' => 'Data de Vencimento', + 'order_number' => 'Número', + 'bill_to' => 'Pagar para', + + 'quantity' => 'Quantidade', + 'price' => 'Preço', + 'sub_total' => 'Subtotal', + 'discount' => 'Desconto', + 'tax_total' => 'Valor da taxa', + 'total' => 'Total', + + 'item_name' => 'Item|Itens', + + 'show_discount' => ':discount% desconto', + 'add_discount' => 'Adicionar desconto', + 'discount_desc' => 'subtotal', + + 'payment_due' => 'Pagamento vencido', + 'paid' => 'Pago', + 'histories' => 'Histórico', + 'payments' => 'Pagamentos', + 'add_payment' => 'Novo Pagamento', + 'mark_paid' => 'Marcar como pago', + 'mark_sent' => 'Marcar Como Enviada', + 'download_pdf' => 'Baixar em PDF', + 'send_mail' => 'Enviar E-mail', + + 'status' => [ + 'draft' => 'Rascunho', + 'sent' => 'Enviar', + 'viewed' => 'Visto', + 'approved' => 'Aprovado', + 'partial' => 'Parcial', + 'paid' => 'Pago', + ], + + 'messages' => [ + 'email_sent' => 'O e-mail foi enviado com sucesso!', + 'marked_sent' => 'Fatura marcada como enviada com sucesso!', + 'email_required' => 'Nenhum endereço de e-mail para este cliente!', + ], + + 'notification' => [ + 'message' => 'Você está recebendo este e-mail porque tem :amount fatura a vencer.', + 'button' => 'Pagar agora', + ], + +]; diff --git a/resources/lang/pt-BR/items.php b/resources/lang/pt-BR/items.php new file mode 100755 index 0000000..8f921fc --- /dev/null +++ b/resources/lang/pt-BR/items.php @@ -0,0 +1,15 @@ + 'Quantidade|Quantidades', + 'sales_price' => 'Preço de Venda', + 'purchase_price' => 'Preço de Compra', + 'sku' => 'SKU', + + 'notification' => [ + 'message' => 'Você está recebendo este e-mail porque :name está ficando com limite baixo.', + 'button' => 'Ver agora', + ], + +]; diff --git a/resources/lang/pt-BR/messages.php b/resources/lang/pt-BR/messages.php new file mode 100755 index 0000000..003e37a --- /dev/null +++ b/resources/lang/pt-BR/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => ':type adicionado!', + 'updated' => ':type atualizado!', + 'deleted' => ':type excluído!', + 'duplicated' => ':type duplicado!', + 'imported' => ':type importado!', + 'enabled' => ': tipo habilitado!', + 'disabled' => ': tipo desativado!', + ], + 'error' => [ + 'over_payment' => 'Erro: Pagamento não adicionado! Valor ultrapassa o Total.', + 'not_user_company' => 'Erro: você não tem permissão para gerenciar esta empresa!', + 'customer' => 'Erro: Endereço de email :name já esta sendo utilizado.', + 'no_file' => 'Erro: Nenhum arquivo selecionado!', + 'last_category' => 'Erro: Não foi possível excluir a última :type categoria!', + 'invalid_token' => 'Erro: O símbolo inserido é inválido!', + 'import_column' => 'Erro: :message Planilha: :sheet. Número da linha: :line.', + 'import_sheet' => 'Erro: Planilha não é válida. Por favor, verifique o arquivo de exemplo.', + ], + 'warning' => [ + 'deleted' => 'Aviso: Você não têm permissão para excluir :name, porque possui o :text relacionado.', + 'disabled' => 'Aviso: Você não tem permissão para desativar :name, porque tem :text relacionado.', + ], + +]; diff --git a/resources/lang/pt-BR/modules.php b/resources/lang/pt-BR/modules.php new file mode 100755 index 0000000..448c8f3 --- /dev/null +++ b/resources/lang/pt-BR/modules.php @@ -0,0 +1,58 @@ + 'Token de API', + 'api_token' => 'Token', + 'my_apps' => 'Meus Apps', + 'top_paid' => 'Pago a maior', + 'new' => 'Novo', + 'top_free' => 'Melhores Grátis', + 'free' => 'Gratis', + 'search' => 'Pesquisa', + 'install' => 'Instalar', + 'buy_now' => 'Comprar Agora', + 'token_link' => ' Clique aqui para obter o token de sua API.', + 'no_apps' => 'Não há nenhum apps nesta categoria, ainda.', + 'developer' => 'Você é um desenvolvedor? Clique aqui que você pode aprender como criar um app e começar a vender hoje!', + + 'about' => 'Sobre', + + 'added' => 'Adicionado', + 'updated' => 'Atualizado', + 'compatibility' => 'Compatibilidade', + + 'installed' => ':module instalado', + 'uninstalled' => ':module removido', + //'updated' => ':module updated', + 'enabled' => ':module ativado', + 'disabled' => ':module desativado', + + 'tab' => [ + 'installation' => 'Instalação', + 'faq' => 'Perguntas frequentes', + 'changelog' => 'Log de alterações', + ], + + 'installation' => [ + 'header' => 'Instalação do aplicativo', + 'download' => 'Baixando arquivos do módulo :module.', + 'unzip' => 'Extraindo arquivos do módulo :module.', + 'install' => 'Instalando :module.', + ], + + 'badge' => [ + 'installed' => 'Instalado', + ], + + 'button' => [ + 'uninstall' => 'Remover', + 'disable' => 'Desativar', + 'enable' => 'Ativar', + ], + + 'my' => [ + 'purchased' => 'Comprado', + 'installed' => 'Instalado', + ], +]; diff --git a/resources/lang/pt-BR/notifications.php b/resources/lang/pt-BR/notifications.php new file mode 100755 index 0000000..72084ce --- /dev/null +++ b/resources/lang/pt-BR/notifications.php @@ -0,0 +1,10 @@ + 'Ops!', + 'hello' => 'Bem vindo!', + 'salutation' => 'Saudação,
    :company_name', + 'subcopy' => 'Se você estiver com problemas para clicar no botão ":text", copie e cole o URL abaixo em seu navegador da web: [:url](:url)', + +]; diff --git a/resources/lang/pt-BR/pagination.php b/resources/lang/pt-BR/pagination.php new file mode 100755 index 0000000..ee94e86 --- /dev/null +++ b/resources/lang/pt-BR/pagination.php @@ -0,0 +1,9 @@ + '« Anterior', + 'next' => 'Próximo »', + 'showing' => 'Mostrando :first de :last do :total :type', + +]; diff --git a/resources/lang/pt-BR/passwords.php b/resources/lang/pt-BR/passwords.php new file mode 100755 index 0000000..e1a152e --- /dev/null +++ b/resources/lang/pt-BR/passwords.php @@ -0,0 +1,22 @@ + 'A senha deve possuir no mínimo 6 caracteres e ser igual a confirmação.', + 'reset' => 'Sua senha foi redefinida!', + 'sent' => 'O link para redefinição de senha foi enviado para o seu e-mail!', + 'token' => 'Token para recuperação de senha inválido.', + 'user' => "Não encontramos nenhum usuário com esse endereço de e-mail.", + +]; diff --git a/resources/lang/pt-BR/recurring.php b/resources/lang/pt-BR/recurring.php new file mode 100755 index 0000000..93f5118 --- /dev/null +++ b/resources/lang/pt-BR/recurring.php @@ -0,0 +1,20 @@ + 'Recorrente', + 'every' => 'Intervalo', + 'period' => 'Período', + 'times' => 'Vezes', + 'daily' => 'Diário', + 'weekly' => 'Semanal', + 'monthly' => 'Mensal', + 'yearly' => 'Anual', + 'custom' => 'Customizado', + 'days' => 'Dia(s)', + 'weeks' => 'Semana(s)', + 'months' => 'Mês (es)', + 'years' => 'Ano(s)', + 'message' => 'Este é um :type recorrente e o próximo :type será automaticamente gerado no dia :date', + +]; diff --git a/resources/lang/pt-BR/reports.php b/resources/lang/pt-BR/reports.php new file mode 100755 index 0000000..8915612 --- /dev/null +++ b/resources/lang/pt-BR/reports.php @@ -0,0 +1,30 @@ + 'Este Ano', + 'previous_year' => 'Ano Anterior', + 'this_quarter' => 'Este trimestre', + 'previous_quarter' => 'Trimestre anterior', + 'last_12_months' => 'Últimos 12 meses', + 'profit_loss' => 'Receitas & Despesas', + 'gross_profit' => 'Lucro Bruto', + 'net_profit' => 'Lucro líquido', + 'total_expenses' => 'Total Despesas', + 'net' => 'Líquido', + + 'summary' => [ + 'income' => 'Resumo de Venda', + 'expense' => 'Resumo de Despesas', + 'income_expense' => 'Receita vs Despesa', + 'tax' => 'Resumo financeiro', + ], + + 'quarter' => [ + '1' => 'Jan-Mar', + '2' => 'Abr-Jun', + '3' => 'Jul-Set', + '4' => 'Out-Dez', + ], + +]; diff --git a/resources/lang/pt-BR/settings.php b/resources/lang/pt-BR/settings.php new file mode 100755 index 0000000..5f86597 --- /dev/null +++ b/resources/lang/pt-BR/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Nome', + 'email' => 'E-mail', + 'phone' => 'Telefone', + 'address' => 'Endereço', + 'logo' => 'Logo', + ], + 'localisation' => [ + 'tab' => 'Localizção', + 'date' => [ + 'format' => 'Formato da Data', + 'separator' => 'Separador de Data', + 'dash' => 'Traço (-)', + 'dot' => 'Ponto (.)', + 'comma' => 'Vírgula (,)', + 'slash' => 'Barra (/)', + 'space' => 'Espaço ( )', + ], + 'timezone' => 'Fuso Horário', + 'percent' => [ + 'title' => 'Posição do (%)', + 'before' => 'Antes do número', + 'after' => 'Depois do número', + ], + ], + 'invoice' => [ + 'tab' => 'Faturas', + 'prefix' => 'Formato do número', + 'digit' => 'Número de dígitos', + 'next' => 'Próximo número', + 'logo' => 'Logotipo', + ], + 'default' => [ + 'tab' => 'Padrões', + 'account' => 'Conta Padrão', + 'currency' => 'Moeda Padrão', + 'tax' => 'Imposto Padrão', + 'payment' => 'Método de pagamento padrão', + 'language' => 'Idioma Padrão', + ], + 'email' => [ + 'protocol' => 'Protocolo', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP Host', + 'port' => 'SMTP Porta', + 'username' => 'SMTP Usuário', + 'password' => 'SMTP Senha', + 'encryption' => 'SMTP Criptografia', + 'none' => 'Nenhum', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Sendmail Path', + 'log' => 'Log Emails', + ], + 'scheduling' => [ + 'tab' => 'Agendamento', + 'send_invoice' => 'Enviar lembrete de faturas', + 'invoice_days' => 'Enviar após dias de vencimento', + 'send_bill' => 'Enviar lembrança', + 'bill_days' => 'Enviar antes de vencer', + 'cron_command' => 'Comando Cron', + 'schedule_time' => 'Iniciar Cron', + ], + 'appearance' => [ + 'tab' => 'Aparência', + 'theme' => 'Tema', + 'light' => 'Claro', + 'dark' => 'Escuro', + 'list_limit' => 'Registros por Página', + 'use_gravatar' => 'Usar Gravatar', + ], + 'system' => [ + 'tab' => 'Sistema', + 'session' => [ + 'lifetime' => 'Finalizar sessão (Minutos)', + 'handler' => 'Manipulador de sessão', + 'file' => 'Arquivo', + 'database' => 'Database', + ], + 'file_size' => 'Tamanho máximo do arquivo (MB)', + 'file_types' => 'Tipos de arquivos permitidos', + ], + +]; diff --git a/resources/lang/pt-BR/taxes.php b/resources/lang/pt-BR/taxes.php new file mode 100755 index 0000000..8241489 --- /dev/null +++ b/resources/lang/pt-BR/taxes.php @@ -0,0 +1,8 @@ + 'Taxa', + 'rate_percent' => 'Taxa (%)', + +]; diff --git a/resources/lang/pt-BR/transfers.php b/resources/lang/pt-BR/transfers.php new file mode 100755 index 0000000..822b2ca --- /dev/null +++ b/resources/lang/pt-BR/transfers.php @@ -0,0 +1,12 @@ + 'Da conta', + 'to_account' => 'Para conta', + + 'messages' => [ + 'delete' => 'Do :from para :to (:amount)', + ], + +]; diff --git a/resources/lang/pt-BR/updates.php b/resources/lang/pt-BR/updates.php new file mode 100755 index 0000000..c71ff4c --- /dev/null +++ b/resources/lang/pt-BR/updates.php @@ -0,0 +1,15 @@ + 'Versão Instalada', + 'latest_version' => 'Última Versão', + 'update' => 'Atualiza o Akaunting para a versão :version', + 'changelog' => 'Changelog', + 'check' => 'Verificar', + 'new_core' => 'Está disponível uma versão atualizada do Sistema Akaunting.', + 'latest_core' => 'Parabéns! Você tem a versão mais recente do Akaunting. Futuras atualizações de segurança serão aplicadas automaticamente.', + 'success' => 'A instalação foi completada com êxito.', + 'error' => 'Houve um erro na atualização! Por favor tente novamente.', + +]; diff --git a/resources/lang/pt-BR/validation.php b/resources/lang/pt-BR/validation.php new file mode 100755 index 0000000..854d727 --- /dev/null +++ b/resources/lang/pt-BR/validation.php @@ -0,0 +1,120 @@ + 'O :attribute deve ser aceito.', + 'active_url' => 'O :attribute não é uma URL válida.', + 'after' => 'O :attribute deve ser uma data posterior a :date.', + 'after_or_equal' => 'O :attribute deve ser uma data posterior ou igual a :date.', + 'alpha' => 'O :attribute deve conter somente letras.', + 'alpha_dash' => 'O :attribute deve conter letras, números e traços.', + 'alpha_num' => 'O :attribute deve conter somente letras e números.', + 'array' => 'O :attribute deve ser um array.', + 'before' => 'O :attribute deve ser uma data anterior a :date.', + 'before_or_equal' => 'O :attribute deve ser uma data anterior ou igual a :date.', + 'between' => [ + 'numeric' => 'O :attribute deve estar entre :min e :max.', + 'file' => 'O :attribute deve estar entre :min e :max kilobytes.', + 'string' => 'O :attribute deve estar entre :min e :max caracteres.', + 'array' => 'O :attribute deve ter entre :min e :max itens.', + ], + 'boolean' => 'O :attribute deve ser verdadeiro ou falso.', + 'confirmed' => 'A confirmação de :attribute não confere.', + 'date' => 'O :attribute não é uma data válida.', + 'date_format' => 'O :attribute não confere com o formato :format.', + 'different' => 'O :attribute e :other devem ser diferentes.', + 'digits' => 'O :attribute deve ter :digits dígitos.', + 'digits_between' => 'O :attribute deve ter entre :min e :max dígitos.', + 'dimensions' => 'O :attribute não tem dimensões válidas.', + 'distinct' => 'O :attribute campo contém um valor duplicado.', + 'email' => 'O :attribute deve ser um endereço de e-mail válido.', + 'exists' => 'O :attribute selecionado é inválido.', + 'file' => 'O :attribute precisa ser um arquivo.', + 'filled' => 'O :attribute é um campo obrigatório.', + 'image' => 'O :attribute deve ser uma imagem.', + 'in' => 'O :attribute é inválido.', + 'in_array' => 'O :attribute campo não existe em :other.', + 'integer' => 'O :attribute deve ser um inteiro.', + 'ip' => 'O :attribute deve ser um endereço IP válido.', + 'json' => 'O :attribute deve ser um JSON válido.', + 'max' => [ + 'numeric' => 'O :attribute não deve ser maior que :max.', + 'file' => 'O :attribute não deve ter mais que :max kilobytes.', + 'string' => 'O :attribute não deve ter mais que :max caracteres.', + 'array' => 'O :attribute não pode ter mais que :max itens.', + ], + 'mimes' => 'O :attribute deve ser um arquivo do tipo: :values.', + 'mimetypes' => 'O :attribute deve ser um arquivo do tipo: :values.', + 'min' => [ + 'numeric' => 'O :attribute deve ser no mínimo :min.', + 'file' => 'O :attribute deve ter no mínimo :min kilobytes.', + 'string' => 'O :attribute deve ter no mínimo :min caracteres.', + 'array' => 'O :attribute deve ter no mínimo :min itens.', + ], + 'not_in' => 'O :attribute selecionado é inválido.', + 'numeric' => 'O :attribute deve ser um número.', + 'present' => 'O :attribute deve estar presente.', + 'regex' => 'O formato de :attribute é inválido.', + 'required' => 'O campo :attribute é obrigatório.', + 'required_if' => 'O campo :attribute é obrigatório quando :other é :value.', + 'required_unless' => 'O :attribute é necessário a menos que :other esteja em :values.', + 'required_with' => 'O campo :attribute é obrigatório quando :values está presente.', + 'required_with_all' => 'O campo :attribute é obrigatório quando :values estão presentes.', + 'required_without' => 'O campo :attribute é obrigatório quando :values não está presente.', + 'required_without_all' => 'O campo :attribute é obrigatório quando nenhum destes estão presentes: :values.', + 'same' => 'O :attribute e :other devem ser iguais.', + 'size' => [ + 'numeric' => 'O :attribute deve ser :size.', + 'file' => 'O :attribute deve ter :size kilobytes.', + 'string' => 'O :attribute deve ter :size caracteres.', + 'array' => 'O :attribute deve conter :size itens.', + ], + 'string' => 'O :attribute deve ser uma string', + 'timezone' => 'O :attribute deve ser uma timezone válida.', + 'unique' => 'O :attribute já está em uso.', + 'uploaded' => 'O :attribute falhou no upload.', + 'url' => 'O formato de :attribute é inválido.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + 'invalid_currency' => 'O código :attribute é inválido.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/pt-PT/accounts.php b/resources/lang/pt-PT/accounts.php new file mode 100755 index 0000000..ea1a5af --- /dev/null +++ b/resources/lang/pt-PT/accounts.php @@ -0,0 +1,14 @@ + 'Nome', + 'number' => 'Número', + 'opening_balance' => 'Saldo Inicial', + 'current_balance' => 'Saldo Atual', + 'bank_name' => 'Nome do Banco', + 'bank_phone' => 'Telefone', + 'bank_address' => 'Endereço', + 'default_account' => 'Conta Padrão', + +]; diff --git a/resources/lang/pt-PT/auth.php b/resources/lang/pt-PT/auth.php new file mode 100755 index 0000000..873a6a7 --- /dev/null +++ b/resources/lang/pt-PT/auth.php @@ -0,0 +1,39 @@ + 'Perfil', + 'logout' => 'Sair', + 'login' => 'Entrar', + 'login_to' => 'Entre para iniciar sessão', + 'remember_me' => 'Lembrar-me', + 'forgot_password' => 'Esqueci-me da senha', + 'reset_password' => 'Redefinir Senha', + 'enter_email' => 'Insira o seu e-mail', + 'current_email' => 'E-mail atual', + 'reset' => 'Redefinir', + 'never' => 'nunca', + + 'password' => [ + 'current' => 'Senha', + 'current_confirm' => 'Confirmação da Senha', + 'new' => 'Nova senha', + 'new_confirm' => 'Confirmação da Nova Senha', + ], + + 'error' => [ + 'self_delete' => 'Erro: Não pode se excluir!', + 'no_company' => 'Erro: Nenhuma empresa atribuída à sua conta. Por favor, contacte o administrador do sistema.', + ], + + 'failed' => 'As credenciais indicadas não coincidem com as registadas no sistema.', + 'disabled' => 'Esta conta está desativada. Por favor, contacte o administrador do sistema.', + 'throttle' => 'O limite de tentativas para entrar na sua conta foi atingido. Por favor tente novamente dentro de :seconds segundos.', + + 'notification' => [ + 'message_1' => 'Recebeu este e-mail porque foi-nos feito uma solicitação de redefinição de senha para a sua conta.', + 'message_2' => 'Se não solicitou uma redefinição de senha, nenhuma ação adicional é necessária.', + 'button' => 'Redefinir Senha', + ], + +]; diff --git a/resources/lang/pt-PT/bills.php b/resources/lang/pt-PT/bills.php new file mode 100755 index 0000000..95e5574 --- /dev/null +++ b/resources/lang/pt-PT/bills.php @@ -0,0 +1,46 @@ + 'Conta nº', + 'bill_date' => 'Data de Emissão', + 'total_price' => 'Valor Total', + 'due_date' => 'Data de vencimento', + 'order_number' => 'Encomenda nº', + 'bill_from' => 'Conta de', + + 'quantity' => 'Quantidade', + 'price' => 'Preço', + 'sub_total' => 'Subtotal', + 'discount' => 'Desconto', + 'tax_total' => 'Imposto', + 'total' => 'Total', + + 'item_name' => 'Nome do Item | Nome dos Items', + + 'show_discount' => ':discount% de desconto', + 'add_discount' => 'Adicionar desconto', + 'discount_desc' => 'do subtotal', + + 'payment_due' => 'Valor Devido', + 'amount_due' => 'Total Devido', + 'paid' => 'Pago', + 'histories' => 'Histórico', + 'payments' => 'Pagamentos', + 'add_payment' => 'Pagar Conta', + 'mark_received' => 'Marcar como Recebida', + 'download_pdf' => 'Descarregar em PDF', + 'send_mail' => 'Enviar e-mail', + + 'status' => [ + 'draft' => 'Rascunho', + 'received' => 'Recebido', + 'partial' => 'Parcial', + 'paid' => 'Pago', + ], + + 'messages' => [ + 'received' => 'Conta marcada como recebida com sucesso!', + ], + +]; diff --git a/resources/lang/pt-PT/companies.php b/resources/lang/pt-PT/companies.php new file mode 100755 index 0000000..b2db7a4 --- /dev/null +++ b/resources/lang/pt-PT/companies.php @@ -0,0 +1,13 @@ + 'Domínio', + 'logo' => 'Logotipo', + 'manage' => 'Gerir empresas', + 'all' => 'Todas as empresas', + 'error' => [ + 'delete_active' => 'Erro: Não é possível excluir a empresa em atividade, por favor altere o registo!', + ], + +]; diff --git a/resources/lang/pt-PT/currencies.php b/resources/lang/pt-PT/currencies.php new file mode 100755 index 0000000..1a235bd --- /dev/null +++ b/resources/lang/pt-PT/currencies.php @@ -0,0 +1,18 @@ + 'Código', + 'rate' => 'Taxa', + 'default' => 'Moeda Padrão', + 'decimal_mark' => 'Separador de decimal', + 'thousands_separator' => 'Separador de milhar', + 'precision' => 'Precisão', + 'symbol' => [ + 'symbol' => 'Símbolo', + 'position' => 'Posição do símbolo', + 'before' => 'Antes do Valor', + 'after' => 'Depois do Valor', + ] + +]; diff --git a/resources/lang/pt-PT/customers.php b/resources/lang/pt-PT/customers.php new file mode 100755 index 0000000..6935b47 --- /dev/null +++ b/resources/lang/pt-PT/customers.php @@ -0,0 +1,11 @@ + 'Permitir Acesso?', + 'user_created' => 'Utilizador criado', + + 'error' => [ + 'email' => 'Este e-mail já foi registado.' + ] +]; diff --git a/resources/lang/pt-PT/dashboard.php b/resources/lang/pt-PT/dashboard.php new file mode 100755 index 0000000..5a7a60c --- /dev/null +++ b/resources/lang/pt-PT/dashboard.php @@ -0,0 +1,24 @@ + 'Rendimentos totais', + 'receivables' => 'A Receber', + 'open_invoices' => 'Faturas em Aberto', + 'overdue_invoices' => 'Faturas Vencidas', + 'total_expenses' => 'Despesas totais', + 'payables' => 'A Pagar', + 'open_bills' => 'Contas em Aberto', + 'overdue_bills' => 'Contas Vencidas', + 'total_profit' => 'Lucro Total', + 'open_profit' => 'Lucro em Aberto', + 'overdue_profit' => 'Lucro Vencido', + 'cash_flow' => 'Fluxo de Caixa', + 'no_profit_loss' => 'Sem perda de lucro', + 'incomes_by_category' => 'Rendimento por Categoria', + 'expenses_by_category' => 'Despesa por Categoria', + 'account_balance' => 'Saldo da(s) Conta(s)', + 'latest_incomes' => 'Últimas Receitas', + 'latest_expenses' => 'Últimas Despesas', + +]; diff --git a/resources/lang/pt-PT/demo.php b/resources/lang/pt-PT/demo.php new file mode 100755 index 0000000..59f8889 --- /dev/null +++ b/resources/lang/pt-PT/demo.php @@ -0,0 +1,16 @@ + 'Dinheiro', + 'categories_deposit' => 'Depósito', + 'categories_sales' => 'Vendas', + 'currencies_usd' => 'Dólar Americano', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Libra Esterlina', + 'currencies_try' => 'Lira Turca', + 'taxes_exempt' => 'Isento de Imposto', + 'taxes_normal' => 'Imposto padrão', + 'taxes_sales' => 'Imposto sobre vendas', + +]; diff --git a/resources/lang/pt-PT/footer.php b/resources/lang/pt-PT/footer.php new file mode 100755 index 0000000..b8759b0 --- /dev/null +++ b/resources/lang/pt-PT/footer.php @@ -0,0 +1,9 @@ + 'Versão', + 'powered' => 'Desenvolvido por Akaunting', + 'software' => 'Software de contabilidade gratuito', + +]; diff --git a/resources/lang/pt-PT/general.php b/resources/lang/pt-PT/general.php new file mode 100755 index 0000000..3935018 --- /dev/null +++ b/resources/lang/pt-PT/general.php @@ -0,0 +1,121 @@ + 'Item|Itens', + 'incomes' => 'Rendimento|Rendimentos', + 'invoices' => 'Factura|Facturas', + 'revenues' => 'Receita|Receitas', + 'customers' => 'Cliente|Clientes', + 'expenses' => 'Despesa|Despesas', + 'bills' => 'Conta|Contas', + 'payments' => 'Pagamento|Pagamentos', + 'vendors' => 'Fornecedor|Fornecedores', + 'accounts' => 'Conta|Contas', + 'transfers' => 'Transferência|Transferências', + 'transactions' => 'Transação|Transações', + 'reports' => 'Relatório|Relatórios', + 'settings' => 'Configuração|Configurações', + 'categories' => 'Categoria|Categorias', + 'currencies' => 'Moeda|Moedas', + 'tax_rates' => 'Taxa de Imposto|Taxas de Imposto', + 'users' => 'Utilizador|Utilizadores', + 'roles' => 'Regra|Regras', + 'permissions' => 'Permissão|Permissões', + 'modules' => 'Aplicação|Aplicações', + 'companies' => 'Empresa|Empresas', + 'profits' => 'Lucro|Lucros', + 'taxes' => 'Imposto|Impostos', + 'logos' => 'Logotipo|Logotipos', + 'pictures' => 'Imagem|Imagens', + 'types' => 'Tipo|Tipos', + 'payment_methods' => 'Método de Pagamento|Métodos de Pagamento', + 'compares' => 'Receita vs Despesa|Receitas vs Despesas', + 'notes' => 'Nota|Notas', + 'totals' => 'Total|Totais', + 'languages' => 'Idioma|Idiomas', + 'updates' => 'Atualização|Atualizações', + 'numbers' => 'Número|Números', + 'statuses' => 'Estado|Estados', + 'others' => 'Outro|Outros', + + 'dashboard' => 'Painel de Controlo', + 'banking' => 'Banco', + 'general' => 'Geral', + 'no_records' => 'Sem Registos.', + 'date' => 'Data', + 'amount' => 'Montante', + 'enabled' => 'Ativo', + 'disabled' => 'Desativado', + 'yes' => 'Sim', + 'no' => 'Não', + 'na' => 'N/D', + 'daily' => 'Diário', + 'monthly' => 'Mensal', + 'quarterly' => 'Trimestral', + 'yearly' => 'Anual', + 'add' => 'Adicionar', + 'add_new' => 'Novo(a)', + 'show' => 'Mostrar', + 'edit' => 'Editar', + 'delete' => 'Excluir', + 'send' => 'Enviar', + 'download' => 'Descarregar', + 'delete_confirm' => 'Confirmar a exclusão :name :type?', + 'name' => 'Nome', + 'email' => 'E-mail', + 'tax_number' => 'Número de identificação fiscal', + 'phone' => 'Telefone', + 'address' => 'Endereço', + 'website' => 'Website', + 'actions' => 'Ações', + 'description' => 'Descrição', + 'manage' => 'Gerir', + 'code' => 'Código', + 'alias' => 'Alias', + 'balance' => 'Saldo', + 'reference' => 'Referência', + 'attachment' => 'Anexo', + 'change' => 'Alterar', + 'switch' => 'Mudar', + 'color' => 'Côr', + 'save' => 'Guardar', + 'cancel' => 'Cancelar', + 'from' => 'De', + 'to' => 'Para', + 'print' => 'Imprimir', + 'search' => 'Procurar', + 'search_placeholder' => 'Digite para procurar..', + 'filter' => 'Filtrar', + 'help' => 'Ajuda', + 'all' => 'Todos(as)', + 'all_type' => 'Todos(as) os(as) :type', + 'upcoming' => 'Próximo', + 'created' => 'Criado', + 'id' => 'ID', + 'more_actions' => 'Mais ações', + 'duplicate' => 'Duplicar', + 'unpaid' => 'Por Pagar', + 'paid' => 'Pago', + 'overdue' => 'Vencido', + 'partially' => 'Parcialmente', + 'partially_paid' => 'Parcialmente Pago', + 'export' => 'Exportar', + 'enable' => 'Activar', + 'disable' => 'Desactivar', + + 'title' => [ + 'new' => 'Novo(a) :type', + 'edit' => 'Editar :type', + ], + + 'form' => [ + 'enter' => 'Digite :field', + 'select' => [ + 'field' => '- Selecionar :field -', + 'file' => 'Selecionar ficheiro', + ], + 'no_file_selected' => 'Nenhum ficheiro selecionado...', + ], + +]; diff --git a/resources/lang/pt-PT/header.php b/resources/lang/pt-PT/header.php new file mode 100755 index 0000000..c105977 --- /dev/null +++ b/resources/lang/pt-PT/header.php @@ -0,0 +1,15 @@ + 'Alterar Idioma', + 'last_login' => 'Último Login :time', + 'notifications' => [ + 'counter' => '{0} Não tem notificações|{1} Tem :count notificação|[2,*] Tem :count notificações', + 'overdue_invoices' => '{1} :count factura vencida|[2,*] :count faturas vencidas', + 'upcoming_bills' => '{1} :count próxima conta|[2,*] :count próximas contas', + 'items_stock' => '{1} :count Item não disponível|[2,*] :count Itens não disponíveis', + 'view_all' => 'Visualizar todos' + ], + +]; diff --git a/resources/lang/pt-PT/import.php b/resources/lang/pt-PT/import.php new file mode 100755 index 0000000..e3e1033 --- /dev/null +++ b/resources/lang/pt-PT/import.php @@ -0,0 +1,9 @@ + 'Importar', + 'title' => 'Importar :type', + 'message' => 'Tipos de ficheiro permitidos: XLS, XLSX. Por favor, descarregue o ficheiro de amostra.', + +]; diff --git a/resources/lang/pt-PT/install.php b/resources/lang/pt-PT/install.php new file mode 100755 index 0000000..4c3d7e4 --- /dev/null +++ b/resources/lang/pt-PT/install.php @@ -0,0 +1,44 @@ + 'Próximo', + 'refresh' => 'Atualizar', + + 'steps' => [ + 'requirements' => 'Please, ask your hosting provider to fix the errors!', + 'language' => 'Passo 1/3: Selecionar idioma', + 'database' => 'Passo 2/3: Configuração da base de dados', + 'settings' => 'Passo 3/3: Detalhes da empresa e do administrador', + ], + + 'language' => [ + 'select' => 'Selecionar Idioma', + ], + + 'requirements' => [ + 'enabled' => ':feature precisa estar ativada!', + 'disabled' => ':feature precisa estar desativada!', + 'extension' => ':extension extension needs to be installed and loaded!', + 'directory' => 'O diretório :directory precisa de permissão para escrita!', + ], + + 'database' => [ + 'hostname' => 'Nome do servidor', + 'username' => 'Nome de utilizador', + 'password' => 'Senha', + 'name' => 'Base de Dados', + ], + + 'settings' => [ + 'company_name' => 'Nome da empresa', + 'company_email' => 'E-mail da empresa', + 'admin_email' => 'E-mail do Administrador', + 'admin_password' => 'Senha do Administrador', + ], + + 'error' => [ + 'connection' => 'Erro: Não foi possível ligar à base de dados! Por favor, verifique se a informação que inseriu está correcta.', + ], + +]; diff --git a/resources/lang/pt-PT/invoices.php b/resources/lang/pt-PT/invoices.php new file mode 100755 index 0000000..d731632 --- /dev/null +++ b/resources/lang/pt-PT/invoices.php @@ -0,0 +1,55 @@ + 'Fatura nº', + 'invoice_date' => 'Data de Emissão', + 'total_price' => 'Valor total', + 'due_date' => 'Data de Vencimento', + 'order_number' => 'Encomenda nº', + 'bill_to' => 'Cobrar a', + + 'quantity' => 'Quantidade', + 'price' => 'Preço', + 'sub_total' => 'Subtotal', + 'discount' => 'Desconto', + 'tax_total' => 'Total de imposto', + 'total' => 'Total', + + 'item_name' => 'Nome do Item|Nome dos Itens', + + 'show_discount' => ':discount% de desconto', + 'add_discount' => 'Adicionar Desconto', + 'discount_desc' => 'do subtotal', + + 'payment_due' => 'Pagamento vencido', + 'paid' => 'Pago', + 'histories' => 'Histórico', + 'payments' => 'Pagamentos', + 'add_payment' => 'Novo Pagamento', + 'mark_paid' => 'Marcar como Pago', + 'mark_sent' => 'Marcar como Enviada', + 'download_pdf' => 'Descarregar em PDF', + 'send_mail' => 'Enviar E-mail', + + 'status' => [ + 'draft' => 'Rascunho', + 'sent' => 'Enviado', + 'viewed' => 'Visto', + 'approved' => 'Aprovado', + 'partial' => 'Parcial', + 'paid' => 'Pago', + ], + + 'messages' => [ + 'email_sent' => 'O e-mail foi enviado com sucesso!', + 'marked_sent' => 'Fatura marcada como enviada com sucesso!', + 'email_required' => 'Nenhum endereço de e-mail para este cliente!', + ], + + 'notification' => [ + 'message' => 'Recebeu este e-mail porque tem uma próxima fatura com o valor de :amount para o cliente :customer.', + 'button' => 'Pagar agora', + ], + +]; diff --git a/resources/lang/pt-PT/items.php b/resources/lang/pt-PT/items.php new file mode 100755 index 0000000..57e6647 --- /dev/null +++ b/resources/lang/pt-PT/items.php @@ -0,0 +1,15 @@ + 'Quantidade|Quantidades', + 'sales_price' => 'Preço de Venda', + 'purchase_price' => 'Preço de Compra', + 'sku' => 'SKU', + + 'notification' => [ + 'message' => 'Recebeu este e-mail porque o item :name está quase indesponível.', + 'button' => 'Visualizar agora', + ], + +]; diff --git a/resources/lang/pt-PT/messages.php b/resources/lang/pt-PT/messages.php new file mode 100755 index 0000000..6ba1cb3 --- /dev/null +++ b/resources/lang/pt-PT/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => ':type adicionado(a)!', + 'updated' => ':type atualizada(s)!', + 'deleted' => ':type excluído(a)!', + 'duplicated' => ':type duplicado(a)!', + 'imported' => ':type importado(a)!', + 'enabled' => ':type ativado(a)!', + 'disabled' => ': type desativado(a)!', + ], + 'error' => [ + 'over_payment' => 'Erro: Pagamento não adicionado! O valor passa o total.', + 'not_user_company' => 'Erro: Não tem permissão para gerir esta empresa!', + 'customer' => 'Erro: O utilizador não foi criado! :name já está a usar este e-mail.', + 'no_file' => 'Erro: Nenhum ficheiro selecionado!', + 'last_category' => 'Erro: Não pode excluir a última :type categoria!', + 'invalid_token' => 'Erro: O token inserido é inválido!', + 'import_column' => 'Erro: :message Nome da folha: :sheet. Linha número: :line.', + 'import_sheet' => 'Erro: O nome da folha não é válido. Por favor, verifique o ficheiro de exemplo.', + ], + 'warning' => [ + 'deleted' => 'Aviso: Não está autorizado a excluir :name porque está relacionado com :text.', + 'disabled' => 'Aviso: Não está autorizado a desativar :name porque está relacionado com :text.', + ], + +]; diff --git a/resources/lang/pt-PT/modules.php b/resources/lang/pt-PT/modules.php new file mode 100755 index 0000000..da82084 --- /dev/null +++ b/resources/lang/pt-PT/modules.php @@ -0,0 +1,58 @@ + 'Token de API', + 'api_token' => 'Token', + 'my_apps' => 'Minhas Aplicações', + 'top_paid' => 'Melhores Pagos', + 'new' => 'Novo', + 'top_free' => 'Melhores Grátis', + 'free' => 'GRÁTIS', + 'search' => 'Pesquisar', + 'install' => 'Instalar', + 'buy_now' => 'Comprar Agora', + 'token_link' => 'Clique aqui para obter o token de API.', + 'no_apps' => 'Ainda não existem aplicações nesta categoria.', + 'developer' => 'É um programador? Aqui pode aprender como criar uma aplicação e começar a vendê-la hoje mesmo!', + + 'about' => 'Sobre', + + 'added' => 'Adicionado', + 'updated' => 'Atualizado', + 'compatibility' => 'Compatibilidade', + + 'installed' => ':module instalado', + 'uninstalled' => ':module desinstalado', + //'updated' => ':module updated', + 'enabled' => ':module ativado', + 'disabled' => ':module disativado', + + 'tab' => [ + 'installation' => 'Instalação', + 'faq' => 'Perguntas Frequentes', + 'changelog' => 'Registo de alterações', + ], + + 'installation' => [ + 'header' => 'Instalação de aplicação', + 'download' => 'A descarregar ficheiros do módulo :module.', + 'unzip' => 'A extrair ficheiros do módulo :module.', + 'install' => 'A instalar ficheiros do modulo :module.', + ], + + 'badge' => [ + 'installed' => 'Instalado', + ], + + 'button' => [ + 'uninstall' => 'Desinstalar', + 'disable' => 'Desactivar', + 'enable' => 'Activar', + ], + + 'my' => [ + 'purchased' => 'Compradas', + 'installed' => 'Instaladas', + ], +]; diff --git a/resources/lang/pt-PT/notifications.php b/resources/lang/pt-PT/notifications.php new file mode 100755 index 0000000..1000bb5 --- /dev/null +++ b/resources/lang/pt-PT/notifications.php @@ -0,0 +1,10 @@ + 'Ups!', + 'hello' => 'Olá!', + 'salutation' => 'Regards,
    :company_name', + 'subcopy' => 'If you’re having trouble clicking the ":text" button, copy and paste the URL below into your web browser: [:url](:url)', + +]; diff --git a/resources/lang/pt-PT/pagination.php b/resources/lang/pt-PT/pagination.php new file mode 100755 index 0000000..8cb0252 --- /dev/null +++ b/resources/lang/pt-PT/pagination.php @@ -0,0 +1,9 @@ + '« Anterior', + 'next' => 'Próxima »', + 'showing' => 'A mostrar :first de :last de :total :type', + +]; diff --git a/resources/lang/pt-PT/passwords.php b/resources/lang/pt-PT/passwords.php new file mode 100755 index 0000000..e710f9b --- /dev/null +++ b/resources/lang/pt-PT/passwords.php @@ -0,0 +1,22 @@ + 'A senha deve conter no mínimo 6 caracteres e ser igual à confirmação.', + 'reset' => 'A senha foi redefinida!', + 'sent' => 'O link para redefinição de senha foi enviado para o seu e-mail!', + 'token' => 'Token para recuperação de senha inválido.', + 'user' => "Não encontramos nenhum utilizador com esse endereço de e-mail.", + +]; diff --git a/resources/lang/pt-PT/recurring.php b/resources/lang/pt-PT/recurring.php new file mode 100755 index 0000000..853887d --- /dev/null +++ b/resources/lang/pt-PT/recurring.php @@ -0,0 +1,20 @@ + 'Repetir', + 'every' => 'A cada', + 'period' => 'Período', + 'times' => 'Vezes', + 'daily' => 'Diariamente', + 'weekly' => 'Semanalmente', + 'monthly' => 'Mensalmente', + 'yearly' => 'Anualmente', + 'custom' => 'Personalizado', + 'days' => 'Dia(s)', + 'weeks' => 'Semana(s)', + 'months' => 'Mês(es)', + 'years' => 'Ano(s)', + 'message' => 'This is a recurring :type and the next :type will be automatically generated at :date', + +]; diff --git a/resources/lang/pt-PT/reports.php b/resources/lang/pt-PT/reports.php new file mode 100755 index 0000000..878d1d3 --- /dev/null +++ b/resources/lang/pt-PT/reports.php @@ -0,0 +1,30 @@ + 'Este Ano', + 'previous_year' => 'Ano Anterior', + 'this_quarter' => 'Este Trimestre', + 'previous_quarter' => 'Trimestre Anterior', + 'last_12_months' => 'Últimos 12 Meses', + 'profit_loss' => 'Lucro & Perda', + 'gross_profit' => 'Lucro Bruto', + 'net_profit' => 'Lucro Líquido', + 'total_expenses' => 'Despesas Totais', + 'net' => 'Líquido', + + 'summary' => [ + 'income' => 'Resumo das Receitas', + 'expense' => 'Resumo das Despesas', + 'income_expense' => 'Receita vs Despesa', + 'tax' => 'Resumo do imposto', + ], + + 'quarter' => [ + '1' => 'Jan-Mar', + '2' => 'Abr-Jun', + '3' => 'Jul-Set', + '4' => 'Out-Dez', + ], + +]; diff --git a/resources/lang/pt-PT/settings.php b/resources/lang/pt-PT/settings.php new file mode 100755 index 0000000..a659c33 --- /dev/null +++ b/resources/lang/pt-PT/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Nome', + 'email' => 'E-mail', + 'phone' => 'Telefone', + 'address' => 'Endereço', + 'logo' => 'Logotipo', + ], + 'localisation' => [ + 'tab' => 'Localização', + 'date' => [ + 'format' => 'Formato da Data', + 'separator' => 'Separador da Data', + 'dash' => 'Traço (-)', + 'dot' => 'Ponto (.)', + 'comma' => 'Vírgula (,)', + 'slash' => 'Barra (/)', + 'space' => 'Espaço ( )', + ], + 'timezone' => 'Fuso Horário', + 'percent' => [ + 'title' => 'Posição do símbolo de percentagem (%)', + 'before' => 'Antes do Número', + 'after' => 'Depois do Número', + ], + ], + 'invoice' => [ + 'tab' => 'Faturas', + 'prefix' => 'Prefixo', + 'digit' => 'Quantidade de dígitos', + 'next' => 'Próximo Número', + 'logo' => 'Logotipo', + ], + 'default' => [ + 'tab' => 'Padrões', + 'account' => 'Conta Padrão', + 'currency' => 'Moeda Padrão', + 'tax' => 'Imposto Padrão', + 'payment' => 'Método de Pagamento Padrão', + 'language' => 'Idioma Padrão', + ], + 'email' => [ + 'protocol' => 'Protocolo', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'Servidor SMTP', + 'port' => 'Porta SMTP', + 'username' => 'Utilizador SMTP', + 'password' => 'Senha SMTP', + 'encryption' => 'Encriptação SMTP', + 'none' => 'Nenhum', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Localização Sendmail', + 'log' => 'Registo de e-mails', + ], + 'scheduling' => [ + 'tab' => 'Agendamento', + 'send_invoice' => 'Enviar lembrete de faturas', + 'invoice_days' => 'Enviar após dias de vencimento', + 'send_bill' => 'Enviar lembrete de Conta', + 'bill_days' => 'Enviar antes de vencer', + 'cron_command' => 'Comando Cron', + 'schedule_time' => 'Iniciar Cron', + ], + 'appearance' => [ + 'tab' => 'Aparência', + 'theme' => 'Tema', + 'light' => 'Claro', + 'dark' => 'Escuro', + 'list_limit' => 'Resultados por Página', + 'use_gravatar' => 'Usar Gravatar', + ], + 'system' => [ + 'tab' => 'Sistema', + 'session' => [ + 'lifetime' => 'Fechar sessão (Minutos)', + 'handler' => 'Gestor de Sessão', + 'file' => 'Ficheiro', + 'database' => 'Base de Dados', + ], + 'file_size' => 'Tamanho máximo do ficheiro (MB)', + 'file_types' => 'Tipos de ficheiros permitidos', + ], + +]; diff --git a/resources/lang/pt-PT/taxes.php b/resources/lang/pt-PT/taxes.php new file mode 100755 index 0000000..8241489 --- /dev/null +++ b/resources/lang/pt-PT/taxes.php @@ -0,0 +1,8 @@ + 'Taxa', + 'rate_percent' => 'Taxa (%)', + +]; diff --git a/resources/lang/pt-PT/transfers.php b/resources/lang/pt-PT/transfers.php new file mode 100755 index 0000000..9689049 --- /dev/null +++ b/resources/lang/pt-PT/transfers.php @@ -0,0 +1,12 @@ + 'Da Conta', + 'to_account' => 'Para a Conta', + + 'messages' => [ + 'delete' => ':from para :to (:amount)', + ], + +]; diff --git a/resources/lang/pt-PT/updates.php b/resources/lang/pt-PT/updates.php new file mode 100755 index 0000000..418246c --- /dev/null +++ b/resources/lang/pt-PT/updates.php @@ -0,0 +1,15 @@ + 'Versão Instalada', + 'latest_version' => 'Última Versão', + 'update' => 'Atualizar o Akaunting para a versão :version', + 'changelog' => 'Registo de Alterações', + 'check' => 'Verificar', + 'new_core' => 'Está disponível uma nova versão do Akaunting.', + 'latest_core' => 'Parabéns! Tem a versão mais recente do Akaunting. Futuras atualizações de segurança serão aplicadas automaticamente.', + 'success' => 'O processo de atualização foi concluído com sucesso.', + 'error' => 'O processo de atualização falhou, por favor, tente novamente.', + +]; diff --git a/resources/lang/pt-PT/validation.php b/resources/lang/pt-PT/validation.php new file mode 100755 index 0000000..f8b459c --- /dev/null +++ b/resources/lang/pt-PT/validation.php @@ -0,0 +1,120 @@ + 'O campo :attribute deverá ser aceite.', + 'active_url' => 'O campo :attribute não contém um URL válido.', + 'after' => 'O campo :attribute deverá conter uma data posterior a :date.', + 'after_or_equal' => 'O campo :attribute deverá conter uma data posterior ou igual a :date.', + 'alpha' => 'O campo :attribute deverá conter apenas letras.', + 'alpha_dash' => 'O campo :attribute deverá conter apenas letras, números e traços.', + 'alpha_num' => 'O campo :attribute deverá conter apenas letras e números .', + 'array' => 'O campo :attribute deverá conter uma coleção de elementos.', + 'before' => 'O campo :attribute deverá conter uma data anterior a :date.', + 'before_or_equal' => 'O Campo :attribute deverá conter uma data anterior ou igual a :date.', + 'between' => [ + 'numeric' => 'O campo :attribute deverá ter um valor entre :min - :max.', + 'file' => 'O campo :attribute deverá ter um tamanho entre :min - :max kilobytes.', + 'string' => 'O campo :attribute deverá conter entre :min - :max caracteres.', + 'array' => 'O campo :attribute deverá conter entre :min - :max itens.', + ], + 'boolean' => 'O campo :attribute deverá conter um valor verdadeiro ou falso.', + 'confirmed' => 'A confirmação para o campo :attribute não coincide.', + 'date' => 'O campo :attribute não contém uma data válida.', + 'date_format' => 'A data indicada para o campo :attribute não respeita o formato :format.', + 'different' => 'Os campos :attribute e :other deverão conter valores diferentes.', + 'digits' => 'O campo :attribute deverá conter :digits caracteres.', + 'digits_between' => 'O campo :attribute deverá conter entre :min a :max caracteres.', + 'dimensions' => 'O campo :attribute deverá conter um tamanho de imagem válida.', + 'distinct' => 'O campo :attribute contém um valor duplicado.', + 'email' => 'O campo :attribute não contém um endereço de e-mail válido.', + 'exists' => 'O valor selecionado para o campo :attribute é inválido.', + 'file' => 'O campo :attribute deverá conter um ficheiro.', + 'filled' => 'É obrigatória a indicação de um valor para o campo :attribute.', + 'image' => 'O campo :attribute deverá conter uma imagem.', + 'in' => 'O campo :attribute selecionado não contém um valor válido.', + 'in_array' => 'O campo :attribute não existe em :other.', + 'integer' => 'O campo :attribute deverá conter um número inteiro.', + 'ip' => 'O campo :attribute deverá conter um IP válido.', + 'json' => 'O campo :attribute deverá conter uma string JSON válida.', + 'max' => [ + 'numeric' => 'O campo :attribute não deverá conter um valor superior a :max.', + 'file' => 'O campo :attribute não deverá ter um tamanho superior a :max kilobytes.', + 'string' => 'O campo :attribute não deverá conter mais de :max caracteres.', + 'array' => 'O campo :attribute não deverá conter mais de :max itens.', + ], + 'mimes' => 'O campo :attribute deverá conter um ficheiro do tipo: :values.', + 'mimetypes' => 'O campo :attribute deverá conter um ficheiro do tipo: :values.', + 'min' => [ + 'numeric' => 'O campo :attribute deverá ter um valor superior ou igual a :min.', + 'file' => 'O campo :attribute deverá ter no mínimo :min kilobytes.', + 'string' => 'O campo :attribute deverá conter no mínimo :min caracteres.', + 'array' => 'O campo :attribute deverá conter no mínimo :min itens.', + ], + 'not_in' => 'O campo :attribute selecionado contém um valor inválido.', + 'numeric' => 'O campo :attribute deverá conter um valor numérico.', + 'present' => 'O campo :attribute deverá estar presente.', + 'regex' => 'O formato do valor para o campo :attribute é inválido.', + 'required' => 'É obrigatória a indicação de um valor para o campo :attribute.', + 'required_if' => 'É obrigatória a indicação de um valor para o campo :attribute quando o valor do campo :other é igual a :value.', + 'required_unless' => 'É obrigatória a indicação de um valor para o campo :attribute a menos que :other esteja presente em :values.', + 'required_with' => 'É obrigatória a indicação de um valor para o campo :attribute quando :values está presente.', + 'required_with_all' => 'É obrigatória a indicação de um valor para o campo :attribute quando um dos :values está presente.', + 'required_without' => 'É obrigatória a indicação de um valor para o campo :attribute quando :values não está presente.', + 'required_without_all' => 'É obrigatória a indicação de um valor para o campo :attribute quando nenhum dos :values está presente.', + 'same' => 'Os campos :attribute e :other deverão conter valores iguais.', + 'size' => [ + 'numeric' => 'O campo :attribute deverá conter o valor :size.', + 'file' => 'O campo :attribute deverá ter o tamanho de :size kilobytes.', + 'string' => 'O campo :attribute deverá conter :size caracteres.', + 'array' => 'O campo :attribute deverá conter :size itens.', + ], + 'string' => 'O campo :attribute deverá conter uma string.', + 'timezone' => 'O campo :attribute deverá ter um fuso horário válido.', + 'unique' => 'O valor indicado para o campo :attribute já se encontra registado.', + 'uploaded' => 'O upload do ficheiro :attribute falhou.', + 'url' => 'O formato do URL indicado para o campo :attribute é inválido.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'mensagem personalizada', + ], + 'invalid_currency' => 'O código do :attribute é inválido.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/ro-RO/accounts.php b/resources/lang/ro-RO/accounts.php new file mode 100755 index 0000000..689a4e6 --- /dev/null +++ b/resources/lang/ro-RO/accounts.php @@ -0,0 +1,14 @@ + 'Denumire Cont', + 'number' => 'Număr', + 'opening_balance' => 'Soldul initial', + 'current_balance' => 'Soldul curent', + 'bank_name' => 'Numele bancii', + 'bank_phone' => 'Telefonul bancii', + 'bank_address' => 'Adresa bancii', + 'default_account' => 'Cont implicit', + +]; diff --git a/resources/lang/ro-RO/auth.php b/resources/lang/ro-RO/auth.php new file mode 100755 index 0000000..c7d74ce --- /dev/null +++ b/resources/lang/ro-RO/auth.php @@ -0,0 +1,40 @@ + 'Profil', + 'logout' => 'Deconectare', + 'login' => 'Conectare', + 'login_to' => 'Conecteaza-te pentru a începe sesiunea', + 'remember_me' => 'Ţine-mă minte', + 'forgot_password' => 'Am uitat parola', + 'reset_password' => 'Reseteaza parola', + 'enter_email' => 'Introduceți adresa dvs. de email', + 'current_email' => 'Adresa de Email actuala', + 'reset' => 'Resetare', + 'never' => 'niciodată', + + 'password' => [ + 'current' => 'Parola', + 'current_confirm' => 'Confirmă parola', + 'new' => 'Parola nouă', + 'new_confirm' => 'Confirmă parola', + ], + + 'error' => [ + 'self_delete' => 'Eroare: Nu te poti sterge! +Eroare: nu poti sterge contul tau! You can\'t delete your account!', + 'no_company' => 'Eroare: Nici o companie nu este atribuita contului. Contacteaza administratorul de sistem.', + ], + + 'failed' => 'Datele de identificare nu pot fi confirmate.', + 'disabled' => 'Acest cont este dezactivat. Vă rugăm, contactaţi administratorul de sistem.', + 'throttle' => 'Prea multe încercări de intrare în cont. Poți încerca din nou peste :seconds secunde.', + + 'notification' => [ + 'message_1' => 'Primesti acest email pentru ca a fost facuta o cerere de resetare a parolei pentru contul tau.', + 'message_2' => 'Daca nu ai cerut resetarea parolei, nu este necesara o actiune suplimentara.', + 'button' => 'Resetare Parola', + ], + +]; diff --git a/resources/lang/ro-RO/bills.php b/resources/lang/ro-RO/bills.php new file mode 100755 index 0000000..2ae3bea --- /dev/null +++ b/resources/lang/ro-RO/bills.php @@ -0,0 +1,49 @@ + 'Numarul facturii', + 'bill_date' => 'Data facturii', + 'total_price' => 'Preț total', + 'due_date' => 'Scadenta', + 'order_number' => 'Număr de comandă', + 'bill_from' => 'Factura de la', + + 'quantity' => 'Cantitate', + 'price' => 'Preț', + 'sub_total' => 'Subtotal', + 'discount' => 'Reducere', + 'tax_total' => 'Total taxe', + 'total' => 'Total', + + 'item_name' => 'Articol|Articole +Nume articol|Nume articole', + + 'show_discount' => ':discount% Reducere', + 'add_discount' => 'Adauga Reducere', + 'discount_desc' => 'din subtotal', + + 'payment_due' => 'De plată', + 'amount_due' => 'Suma de plata', + 'paid' => 'Plătit', + 'histories' => 'Istoric', + 'payments' => 'Plăți', + 'add_payment' => 'Adauga plata', + 'mark_received' => 'Marcheaza ca Primit/a', + 'download_pdf' => 'Descarca PDF', + 'send_mail' => 'Trimite Email', + + 'status' => [ + 'draft' => 'Ciornă', + 'received' => 'Primit +Primite', + 'partial' => 'Parţial +Parţială', + 'paid' => 'Plătit', + ], + + 'messages' => [ + 'received' => 'Factura marcata ca si Primita!', + ], + +]; diff --git a/resources/lang/ro-RO/companies.php b/resources/lang/ro-RO/companies.php new file mode 100755 index 0000000..339c18f --- /dev/null +++ b/resources/lang/ro-RO/companies.php @@ -0,0 +1,13 @@ + 'Domeniu', + 'logo' => 'Siglă', + 'manage' => 'Administreaza firmele', + 'all' => 'Toate firmele', + 'error' => [ + 'delete_active' => 'Eroare: Nu se poate sterge compania activa, va rugam sa o schimbati mai intai!', + ], + +]; diff --git a/resources/lang/ro-RO/currencies.php b/resources/lang/ro-RO/currencies.php new file mode 100755 index 0000000..b46671b --- /dev/null +++ b/resources/lang/ro-RO/currencies.php @@ -0,0 +1,18 @@ + 'Cod', + 'rate' => 'Rată', + 'default' => 'Moneda implicita', + 'decimal_mark' => 'Delimitare pentru zecimale', + 'thousands_separator' => 'Separator pentru Mii', + 'precision' => 'Precizie', + 'symbol' => [ + 'symbol' => 'Simbol', + 'position' => 'Poziţia simbolului', + 'before' => 'Înainte de suma', + 'after' => 'După suma', + ] + +]; diff --git a/resources/lang/ro-RO/customers.php b/resources/lang/ro-RO/customers.php new file mode 100755 index 0000000..087bd0b --- /dev/null +++ b/resources/lang/ro-RO/customers.php @@ -0,0 +1,11 @@ + 'Permiti conectarea?', + 'user_created' => 'Utilizator creat', + + 'error' => [ + 'email' => 'Acest email a fost deja folosit.' + ] +]; diff --git a/resources/lang/ro-RO/dashboard.php b/resources/lang/ro-RO/dashboard.php new file mode 100755 index 0000000..0a1d409 --- /dev/null +++ b/resources/lang/ro-RO/dashboard.php @@ -0,0 +1,24 @@ + 'Total venituri', + 'receivables' => 'Creante', + 'open_invoices' => 'Facturi Deschise', + 'overdue_invoices' => 'Facturi restante', + 'total_expenses' => 'Total Cheltuieli', + 'payables' => 'Sume datorate', + 'open_bills' => 'Deschide facturi', + 'overdue_bills' => 'Creante neachitate', + 'total_profit' => 'Profitul total', + 'open_profit' => 'Profit deschis', + 'overdue_profit' => 'Profit asteptat', + 'cash_flow' => 'Fluxul de numerar', + 'no_profit_loss' => 'Fara pierdere profit', + 'incomes_by_category' => 'Categorii de Venituri', + 'expenses_by_category' => 'Categorii de Cheltuieli', + 'account_balance' => 'Soldul contului', + 'latest_incomes' => 'Ultimele Incasari', + 'latest_expenses' => 'Ultimele Cheltuieli', + +]; diff --git a/resources/lang/ro-RO/demo.php b/resources/lang/ro-RO/demo.php new file mode 100755 index 0000000..47e3f20 --- /dev/null +++ b/resources/lang/ro-RO/demo.php @@ -0,0 +1,16 @@ + 'Numerar', + 'categories_deposit' => 'Depozit', + 'categories_sales' => 'Vânzări', + 'currencies_usd' => 'Dolarul american', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Lira sterlină', + 'currencies_try' => 'Lira turceasca', + 'taxes_exempt' => 'Scutite de taxe', + 'taxes_normal' => 'Taxa normala', + 'taxes_sales' => 'Taxa vanzare', + +]; diff --git a/resources/lang/ro-RO/footer.php b/resources/lang/ro-RO/footer.php new file mode 100755 index 0000000..d2643fd --- /dev/null +++ b/resources/lang/ro-RO/footer.php @@ -0,0 +1,9 @@ + 'Versiunea', + 'powered' => 'Powered By Akaunting', + 'software' => 'Program de contabilitate gratuit', + +]; diff --git a/resources/lang/ro-RO/general.php b/resources/lang/ro-RO/general.php new file mode 100755 index 0000000..268f7fa --- /dev/null +++ b/resources/lang/ro-RO/general.php @@ -0,0 +1,121 @@ + 'Element | Elemente', + 'incomes' => 'Venit | Venituri', + 'invoices' => 'Factura | Facturi', + 'revenues' => 'Venit | Venituri', + 'customers' => 'Client | Clienţi', + 'expenses' => 'Cheltuiala | Cheltuieli', + 'bills' => 'Factura | Facturi', + 'payments' => 'Plata | Plăţi', + 'vendors' => 'Furnizor | Furnizori', + 'accounts' => 'Cont | Conturi', + 'transfers' => 'Transfer | Transferuri', + 'transactions' => 'Tranzacţie | Tranzacţii', + 'reports' => 'Raport | Rapoarte', + 'settings' => 'Setare | Setări', + 'categories' => 'Categorie | Categorii', + 'currencies' => 'Moneda | Valute', + 'tax_rates' => 'Rata Impozitare | Rate Impozitare', + 'users' => 'Utilizator | Utilizatori', + 'roles' => 'Rol | Roluri', + 'permissions' => 'Permisiune | Permisiuni', + 'modules' => 'Aplicatie | Aplicatii', + 'companies' => 'Companie | Companii', + 'profits' => 'Profit | Profituri', + 'taxes' => 'Taxa| Taxe', + 'logos' => 'Logo | Logo-uri', + 'pictures' => 'Imagine | Imagini', + 'types' => 'Tip | Tipuri', + 'payment_methods' => 'Metodă de plată | Metode de plată', + 'compares' => 'Venit vs cheltuiala | Venituri vs cheltuieli', + 'notes' => 'Notă | Note', + 'totals' => 'Total | Totaluri', + 'languages' => 'Limba | Limbi', + 'updates' => 'Actualizare| Actualizări', + 'numbers' => 'Număr | Numere', + 'statuses' => 'Status | Statusuri', + 'others' => 'Alta | Alte', + + 'dashboard' => 'Panou de bord', + 'banking' => 'Bancare', + 'general' => 'Preferinţe generale', + 'no_records' => 'Nu sunt înregistrări.', + 'date' => 'Dată', + 'amount' => 'Sumă', + 'enabled' => 'Activat', + 'disabled' => 'Dezactivat', + 'yes' => 'Da', + 'no' => 'Nu', + 'na' => 'Neaplicabil', + 'daily' => 'Zilnic', + 'monthly' => 'Lunar', + 'quarterly' => 'Trimestrial', + 'yearly' => 'Anual', + 'add' => 'Adaugă', + 'add_new' => 'Adaugă', + 'show' => 'Afiseaza', + 'edit' => 'Editează', + 'delete' => 'Şterge', + 'send' => 'Trimite', + 'download' => 'Descarcă', + 'delete_confirm' => 'Confirmi ştergerea :name : type?', + 'name' => 'Nume', + 'email' => 'Email', + 'tax_number' => 'Cod Unic de Inregistrare', + 'phone' => 'Telefon', + 'address' => 'Adresă', + 'website' => 'Website', + 'actions' => 'Actiuni', + 'description' => 'Descriere', + 'manage' => 'Administrează', + 'code' => 'Cod', + 'alias' => 'Alias', + 'balance' => 'Sold', + 'reference' => 'Referință', + 'attachment' => 'Ataşament', + 'change' => 'Modifică', + 'switch' => 'Schimbă', + 'color' => 'Culoare', + 'save' => 'Salveaza', + 'cancel' => 'Anulează', + 'from' => 'Expeditor', + 'to' => 'Destinatar', + 'print' => 'Tipărește', + 'search' => 'Caută', + 'search_placeholder' => 'Tasteaza pentru a căuta..', + 'filter' => 'Filtrează', + 'help' => 'Ajutor', + 'all' => 'Toate', + 'all_type' => 'Toate :type', + 'upcoming' => 'Viitoare', + 'created' => 'Creat', + 'id' => 'ID-ul', + 'more_actions' => 'Mai multe acţiuni', + 'duplicate' => 'Duplicat', + 'unpaid' => 'Neplatit', + 'paid' => 'Platit', + 'overdue' => 'Intarziat', + 'partially' => 'Partial', + 'partially_paid' => 'Platit Partial', + 'export' => 'Export', + 'enable' => 'Activeaza', + 'disable' => 'Dezactiveaza', + + 'title' => [ + 'new' => ':type nou', + 'edit' => 'Editeaza :type', + ], + + 'form' => [ + 'enter' => 'Introduceţi :field', + 'select' => [ + 'field' => '-Selecteaza :field -', + 'file' => 'Selectează fişier', + ], + 'no_file_selected' => 'Nici un fișier selectat...', + ], + +]; diff --git a/resources/lang/ro-RO/header.php b/resources/lang/ro-RO/header.php new file mode 100755 index 0000000..49112b8 --- /dev/null +++ b/resources/lang/ro-RO/header.php @@ -0,0 +1,15 @@ + 'Schimba limba', + 'last_login' => 'Ultima autentificare :time', + 'notifications' => [ + 'counter' => '{0} Nu ai nici o notificare |{1} Ai :count notificare | [2, *] Ai :count notificări', + 'overdue_invoices' => '{1} :count factura cu scadenta depasita| [2, *] :count facturi cu scadenta depasita', + 'upcoming_bills' => '{1} :Count factura care se apropie de scadenta| [2, *] :count facturi care se apropie de scadenta', + 'items_stock' => '{1} :count articol scazut din stoc | [2, *] :count articole scazute din stoc', + 'view_all' => 'Vezi toate elementele' + ], + +]; diff --git a/resources/lang/ro-RO/import.php b/resources/lang/ro-RO/import.php new file mode 100755 index 0000000..5be7150 --- /dev/null +++ b/resources/lang/ro-RO/import.php @@ -0,0 +1,9 @@ + 'Importă', + 'title' => 'Importa :type', + 'message' => 'Tipuri fisier permise: XLS, XLSX. Te rog, descarca fisierul mostra.', + +]; diff --git a/resources/lang/ro-RO/install.php b/resources/lang/ro-RO/install.php new file mode 100755 index 0000000..79907a4 --- /dev/null +++ b/resources/lang/ro-RO/install.php @@ -0,0 +1,44 @@ + 'Mai departe', + 'refresh' => 'Reîncarcă', + + 'steps' => [ + 'requirements' => 'Va rugam, cere furnizorului serviciilor de hosting sa rezolve erorile!', + 'language' => 'Pasul 1/3: Selectati limba', + 'database' => 'Pasul 2/3: Configurarea bazei de date', + 'settings' => 'Pasul 3/3: Detalii despre Companie şi Administrator', + ], + + 'language' => [ + 'select' => 'Selectează limba', + ], + + 'requirements' => [ + 'enabled' => ':feature trebuie să fie activat/a!', + 'disabled' => ':feature trebuie să fie dezactivat/a!', + 'extension' => 'Extensia :extension trebuie sa fie instalata si incarcata!', + 'directory' => 'directorul :directory trebuie să permita scrierea!', + ], + + 'database' => [ + 'hostname' => 'Denumire gazdă', + 'username' => 'Utilizator', + 'password' => 'Parola', + 'name' => 'Bază de date', + ], + + 'settings' => [ + 'company_name' => 'Numele firmei', + 'company_email' => 'Email', + 'admin_email' => 'E-mail administrator', + 'admin_password' => 'Parolă administrator', + ], + + 'error' => [ + 'connection' => 'Eroare: Nu s-a putut conecta la baza de date! Te rugam sa te asiguri ca detaliile sunt corecte.', + ], + +]; diff --git a/resources/lang/ro-RO/invoices.php b/resources/lang/ro-RO/invoices.php new file mode 100755 index 0000000..e56691e --- /dev/null +++ b/resources/lang/ro-RO/invoices.php @@ -0,0 +1,57 @@ + 'Numărul facturii', + 'invoice_date' => 'Data facturii', + 'total_price' => 'Preț total', + 'due_date' => 'Scadenta', + 'order_number' => 'Număr de comandă', + 'bill_to' => 'Facturaţi Către', + + 'quantity' => 'Cantitate', + 'price' => 'Preț', + 'sub_total' => 'Subtotal', + 'discount' => 'Reducere', + 'tax_total' => 'Total taxe', + 'total' => 'Total', + + 'item_name' => 'Articol|Articole +Nume articol|Nume articole', + + 'show_discount' => ':discount% Reducere', + 'add_discount' => 'Adauga Reducere', + 'discount_desc' => 'din subtotal', + + 'payment_due' => 'Plata scadenta', + 'paid' => 'Plătit', + 'histories' => 'Istoric', + 'payments' => 'Plăți', + 'add_payment' => 'Adauga plata', + 'mark_paid' => 'Marcheaza ca si Platit', + 'mark_sent' => 'Marcheaza ca si Trimis', + 'download_pdf' => 'Descarca PDF', + 'send_mail' => 'Trimite Email', + + 'status' => [ + 'draft' => 'Ciornă', + 'sent' => 'Trimis', + 'viewed' => 'Vizualizat', + 'approved' => 'Aprobat', + 'partial' => 'Parţial +Parţială', + 'paid' => 'Plătit', + ], + + 'messages' => [ + 'email_sent' => 'Emailul cu factura a fost trimis cu succes!', + 'marked_sent' => 'Factura a fost marcata ca si trimisa cu succes!', + 'email_required' => 'Nu exista adresa de email pentru acest client!', + ], + + 'notification' => [ + 'message' => 'Primesti acest e-mail, pentru că urmeaza la plata o factura in suma de :amount emisa catre :customer.', + 'button' => 'Plateste acum', + ], + +]; diff --git a/resources/lang/ro-RO/items.php b/resources/lang/ro-RO/items.php new file mode 100755 index 0000000..aae98c8 --- /dev/null +++ b/resources/lang/ro-RO/items.php @@ -0,0 +1,15 @@ + 'Cantitate | Cantităţi', + 'sales_price' => 'Pret de vanzare', + 'purchase_price' => 'Cost de achizitie', + 'sku' => 'Unitate de stoc', + + 'notification' => [ + 'message' => 'Primesti acest e-mail deoarece stocul de :name este pe terminate.', + 'button' => 'Vezi acum', + ], + +]; diff --git a/resources/lang/ro-RO/messages.php b/resources/lang/ro-RO/messages.php new file mode 100755 index 0000000..16c6787 --- /dev/null +++ b/resources/lang/ro-RO/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => ':type adaugat!', + 'updated' => ':type actualizat!', + 'deleted' => ':type şters!', + 'duplicated' => ':type duplicat!', + 'imported' => ':type importat!', + 'enabled' => ':type activat!', + 'disabled' => ':type dezactivat!', + ], + 'error' => [ + 'over_payment' => 'Eroare: Plata nu a fost adaugata. Suma depaseste totalul.', + 'not_user_company' => 'Eroare: Nu ai permisiunea necesara pentru a gestiona această companie!', + 'customer' => 'Eroare: Utilizatorul nu a fost creat! :name deja foloseste aceasta adresa de email.', + 'no_file' => 'Eroare: Nici un fişier selectat!', + 'last_category' => 'Eroare: Nu pot sterge ultima :type categorie!', + 'invalid_token' => 'Eroare: Tokenul introdus este invalid!', + 'import_column' => 'Eroare: message Nume foaie lucru: :sheet. Numar linie: :line.', + 'import_sheet' => 'Eroare: Numele foii de lucru nu este valid. Te rog verifica fisierul mostra.', + ], + 'warning' => [ + 'deleted' => 'Avertisment: Nu ti se permite să ştergi :name deoarece are o legatura cu :text.', + 'disabled' => 'Avertisment: Nu ti se permite să dezactivezi :name deoarece are o legatura cu :text.', + ], + +]; diff --git a/resources/lang/ro-RO/modules.php b/resources/lang/ro-RO/modules.php new file mode 100755 index 0000000..73d2051 --- /dev/null +++ b/resources/lang/ro-RO/modules.php @@ -0,0 +1,58 @@ + 'Token API', + 'api_token' => 'Token', + 'my_apps' => 'Aplicatiile Mele', + 'top_paid' => 'Cel mai bine platit', + 'new' => 'Nou', + 'top_free' => 'Top gratuit', + 'free' => 'GRATUIT', + 'search' => 'Cauta', + 'install' => 'Instalează', + 'buy_now' => 'Cumpara acum', + 'token_link' => 'Click aici pentru a obtine token API.', + 'no_apps' => 'Inca nu exista aplicatii in aceasta categorie.', + 'developer' => 'Esti un dezvoltator de aplicatii? Aici poti afla cum sa creezi o aplicatie si sa incepi sa vinzi astazi!', + + 'about' => 'Despre', + + 'added' => 'Adăugat', + 'updated' => 'Actualizat', + 'compatibility' => 'Compatibilitate', + + 'installed' => ':module instalat', + 'uninstalled' => ':module dezinstalat', + //'updated' => ':module updated', + 'enabled' => ':module activat', + 'disabled' => ':module dezactivat', + + 'tab' => [ + 'installation' => 'Instalare', + 'faq' => 'Întrebări frecvente', + 'changelog' => 'Istoric modificări', + ], + + 'installation' => [ + 'header' => 'Instalare aplicatie', + 'download' => 'Descărcare fisier :module.', + 'unzip' => 'Dezarhivare fisiere :module.', + 'install' => 'Instalare fisiere :module.', + ], + + 'badge' => [ + 'installed' => 'Instalat', + ], + + 'button' => [ + 'uninstall' => 'Dezinstalează', + 'disable' => 'Dezactivează', + 'enable' => 'Activează', + ], + + 'my' => [ + 'purchased' => 'Cumparat', + 'installed' => 'Instalat', + ], +]; diff --git a/resources/lang/ro-RO/notifications.php b/resources/lang/ro-RO/notifications.php new file mode 100755 index 0000000..639a5d9 --- /dev/null +++ b/resources/lang/ro-RO/notifications.php @@ -0,0 +1,10 @@ + 'Ooops!', + 'hello' => 'Buna!', + 'salutation' => 'Salutari,
    :company_name', + 'subcopy' => 'Daca nu poti face click pe butonul ":text", copiaza si lipeste link-ul de mai jos in browser: [:url](:url)', + +]; diff --git a/resources/lang/ro-RO/pagination.php b/resources/lang/ro-RO/pagination.php new file mode 100755 index 0000000..5df7909 --- /dev/null +++ b/resources/lang/ro-RO/pagination.php @@ -0,0 +1,9 @@ + '« Înapoi', + 'next' => 'Înainte »', + 'showing' => 'Rezultate de la :first la :last din :total :type', + +]; diff --git a/resources/lang/ro-RO/passwords.php b/resources/lang/ro-RO/passwords.php new file mode 100755 index 0000000..e0bde1a --- /dev/null +++ b/resources/lang/ro-RO/passwords.php @@ -0,0 +1,22 @@ + 'Parola trebuie să fie de cel puțin șase caractere și să se potrivească cu cea de confirmare.', + 'reset' => 'Parola a fost resetată!', + 'sent' => 'Am trimis un e-mail cu link-ul de resetare a parolei!', + 'token' => 'Codul de resetare a parolei este greșit.', + 'user' => "Nu există niciun utilizator cu această adresă de e-mail.", + +]; diff --git a/resources/lang/ro-RO/recurring.php b/resources/lang/ro-RO/recurring.php new file mode 100755 index 0000000..e1cdf6d --- /dev/null +++ b/resources/lang/ro-RO/recurring.php @@ -0,0 +1,20 @@ + 'Recurent', + 'every' => 'Fiecare', + 'period' => 'Perioada', + 'times' => 'Dati', + 'daily' => 'Zilnic', + 'weekly' => 'Saptamanal', + 'monthly' => 'Lunar', + 'yearly' => 'Anual', + 'custom' => 'Personalizat', + 'days' => 'Zi(le)', + 'weeks' => 'Saptamana(i)', + 'months' => 'Luna(i)', + 'years' => 'An(i)', + 'message' => 'Acesta este un :type recurent si urmatorul :type va fi generat pe :date', + +]; diff --git a/resources/lang/ro-RO/reports.php b/resources/lang/ro-RO/reports.php new file mode 100755 index 0000000..43e484e --- /dev/null +++ b/resources/lang/ro-RO/reports.php @@ -0,0 +1,30 @@ + 'Anul curent', + 'previous_year' => 'Anul precedent', + 'this_quarter' => 'Trimistrul acesta', + 'previous_quarter' => 'Trimestrul anterior', + 'last_12_months' => 'Ultimele 12 luni', + 'profit_loss' => 'Profit & Pierdere', + 'gross_profit' => 'Profit Brut', + 'net_profit' => 'Profit Net', + 'total_expenses' => 'Total Cheltuieli', + 'net' => 'NET', + + 'summary' => [ + 'income' => 'Rezumat Venituri', + 'expense' => 'Rezumat Chetuieli', + 'income_expense' => 'Venituri vs. Cheltuieli', + 'tax' => 'Rezumat Taxe', + ], + + 'quarter' => [ + '1' => 'Ian-Mar', + '2' => 'Apr-Iun', + '3' => 'Iul-Sep', + '4' => 'Oct-Dec', + ], + +]; diff --git a/resources/lang/ro-RO/settings.php b/resources/lang/ro-RO/settings.php new file mode 100755 index 0000000..fc33c14 --- /dev/null +++ b/resources/lang/ro-RO/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Nume', + 'email' => 'Email', + 'phone' => 'Telefon', + 'address' => 'Adresă', + 'logo' => 'Siglă', + ], + 'localisation' => [ + 'tab' => 'Localizare', + 'date' => [ + 'format' => 'Format dată', + 'separator' => 'Separator data', + 'dash' => 'Cratimă (-)', + 'dot' => 'Punct (.)', + 'comma' => 'Virgulă (,)', + 'slash' => 'Slash (/)', + 'space' => 'Spaţiu ( )', + ], + 'timezone' => 'Fus orar', + 'percent' => [ + 'title' => 'Procent (%) Pozitie', + 'before' => 'Inainte de Numar', + 'after' => 'Dupa Numar', + ], + ], + 'invoice' => [ + 'tab' => 'Factură', + 'prefix' => 'Prefix', + 'digit' => 'Zecimale Numar', + 'next' => 'Următorul număr', + 'logo' => 'Siglă', + ], + 'default' => [ + 'tab' => 'Implicit', + 'account' => 'Cont implicit', + 'currency' => 'Moneda implicita', + 'tax' => 'Rata Impozitare Implicita', + 'payment' => 'Metodă de plată prestabilită', + 'language' => 'Limba implicita', + ], + 'email' => [ + 'protocol' => 'Protocol', + 'php' => 'Mail PHP', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'Gazdă SMTP', + 'port' => 'Port SMTP', + 'username' => 'Utilizator SMTP', + 'password' => 'Parola SMTP', + 'encryption' => 'Securitate SMTP', + 'none' => 'Nici una', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Cale Sendmail', + 'log' => 'Jurnal Email-uri', + ], + 'scheduling' => [ + 'tab' => 'Planificare', + 'send_invoice' => 'Trimite memento pentru factura', + 'invoice_days' => 'Trimite dupa Zilele Cuvenite', + 'send_bill' => 'Trimite memento pentru factura', + 'bill_days' => 'Trimite Inainte de Zilele Cuvenite', + 'cron_command' => 'Comanda Cron', + 'schedule_time' => 'Ora la care ruleaza', + ], + 'appearance' => [ + 'tab' => 'Aspect', + 'theme' => 'Temă', + 'light' => 'Deschis', + 'dark' => 'Inchis', + 'list_limit' => 'Rezultate pe pagina', + 'use_gravatar' => 'Foloseste Gravatar', + ], + 'system' => [ + 'tab' => 'Sistem', + 'session' => [ + 'lifetime' => 'Durata de viaţă a sesiunii (minute)', + 'handler' => 'Manager Sesiune', + 'file' => 'Fişier', + 'database' => 'Bază de date', + ], + 'file_size' => 'Mărime maximă a fișierului (MB)', + 'file_types' => 'Tipuri de fișiere permise', + ], + +]; diff --git a/resources/lang/ro-RO/taxes.php b/resources/lang/ro-RO/taxes.php new file mode 100755 index 0000000..4321a5d --- /dev/null +++ b/resources/lang/ro-RO/taxes.php @@ -0,0 +1,8 @@ + 'Rata', + 'rate_percent' => 'Rate (%)', + +]; diff --git a/resources/lang/ro-RO/transfers.php b/resources/lang/ro-RO/transfers.php new file mode 100755 index 0000000..b43da9b --- /dev/null +++ b/resources/lang/ro-RO/transfers.php @@ -0,0 +1,12 @@ + 'Cont platitor', + 'to_account' => 'Cont beneficiar', + + 'messages' => [ + 'delete' => ':from catre :to (:amount)', + ], + +]; diff --git a/resources/lang/ro-RO/updates.php b/resources/lang/ro-RO/updates.php new file mode 100755 index 0000000..9268790 --- /dev/null +++ b/resources/lang/ro-RO/updates.php @@ -0,0 +1,15 @@ + 'Versiunea instalată', + 'latest_version' => 'Cea mai recentă versiune', + 'update' => 'Actualizeaza Akaunting la versiunea :version', + 'changelog' => 'Jurnal modificari', + 'check' => 'Verifica', + 'new_core' => 'Este disponibila o versiune actualizată a Akaunting.', + 'latest_core' => 'Felicitări! Ai instalata ultima versiune de Akaunting. Actualizările de securitate viitoare vor fi aplicate automat.', + 'success' => 'Procesul de actualizare a fost finalizat cu succes.', + 'error' => 'Procesul de actualizare a eşuat. Te rog, încearca din nou.', + +]; diff --git a/resources/lang/ro-RO/validation.php b/resources/lang/ro-RO/validation.php new file mode 100755 index 0000000..1dabd59 --- /dev/null +++ b/resources/lang/ro-RO/validation.php @@ -0,0 +1,120 @@ + 'Câmpul :attribute trebuie să fie acceptat.', + 'active_url' => 'Câmpul :attribute nu este un URL valid.', + 'after' => 'Câmpul :attribute trebuie să fie o dată după :date.', + 'after_or_equal' => 'Câmpul :attribute trebuie să fie o dată ulterioară sau egală cu :date.', + 'alpha' => 'Câmpul :attribute poate conține doar litere.', + 'alpha_dash' => 'Câmpul :attribute poate conține doar litere, numere și cratime.', + 'alpha_num' => 'Câmpul :attribute poate conține doar litere și numere.', + 'array' => 'Câmpul :attribute trebuie să fie un array.', + 'before' => 'Câmpul :attribute trebuie să fie o dată înainte de :date.', + 'before_or_equal' => 'Câmpul :attribute trebuie să fie o dată înainte sau egală cu :date.', + 'between' => [ + 'numeric' => 'Câmpul :attribute trebuie să fie între :min și :max.', + 'file' => 'Câmpul :attribute trebuie să fie între :min și :max kiloocteți.', + 'string' => 'Câmpul :attribute trebuie să fie între :min și :max caractere.', + 'array' => 'Câmpul :attribute trebuie să aibă între :min și :max elemente.', + ], + 'boolean' => 'Câmpul :attribute trebuie să fie adevărat sau fals.', + 'confirmed' => 'Confirmarea :attribute nu se potrivește.', + 'date' => 'Câmpul :attribute nu este o dată validă.', + 'date_format' => 'Câmpul :attribute trebuie să fie în formatul :format.', + 'different' => 'Câmpurile :attribute și :other trebuie să fie diferite.', + 'digits' => 'Câmpul :attribute trebuie să aibă :digits cifre.', + 'digits_between' => 'Câmpul :attribute trebuie să aibă între :min și :max cifre.', + 'dimensions' => 'Câmpul :attribute are dimensiuni de imagine nevalide.', + 'distinct' => 'Câmpul :attribute are o valoare duplicat.', + 'email' => 'Câmpul :attribute trebuie să fie o adresă de e-mail validă.', + 'exists' => 'Câmpul :attribute selectat nu este valid.', + 'file' => 'Câmpul :attribute trebuie să fie un fișier.', + 'filled' => 'Câmpul :attribute trebuie completat.', + 'image' => 'Câmpul :attribute trebuie să fie o imagine.', + 'in' => 'Câmpul :attribute selectat nu este valid.', + 'in_array' => 'Câmpul :attribute nu există în :other.', + 'integer' => 'Câmpul :attribute trebuie să fie un număr întreg.', + 'ip' => 'Câmpul :attribute trebuie să fie o adresă IP validă.', + 'json' => 'Câmpul :attribute trebuie să fie un string JSON valid.', + 'max' => [ + 'numeric' => 'Câmpul :attribute nu poate fi mai mare de :max.', + 'file' => 'Câmpul :attribute nu poate avea mai mult de :max kiloocteți.', + 'string' => 'Câmpul :attribute nu poate avea mai mult de :max caractere.', + 'array' => 'Câmpul :attribute nu poate avea mai mult de :max elemente.', + ], + 'mimes' => 'Câmpul :attribute trebuie să fie un fișier de tipul: :values.', + 'mimetypes' => 'Câmpul :attribute trebuie să fie un fișier de tipul: :values.', + 'min' => [ + 'numeric' => 'Câmpul :attribute nu poate fi mai mic de :min.', + 'file' => 'Câmpul :attribute trebuie să aibă cel puțin :min kiloocteți.', + 'string' => 'Câmpul :attribute trebuie să aibă cel puțin :min caractere.', + 'array' => 'Câmpul :attribute trebuie să aibă cel puțin :min elemente.', + ], + 'not_in' => 'Câmpul :attribute selectat nu este valid.', + 'numeric' => 'Câmpul :attribute trebuie să fie un număr.', + 'present' => 'Câmpul :attribute trebuie să fie prezent.', + 'regex' => 'Câmpul :attribute nu are un format valid.', + 'required' => 'Câmpul :attribute este obligatoriu.', + 'required_if' => 'Câmpul :attribute este necesar când :other este :value.', + 'required_unless' => 'Câmpul :attribute este necesar, cu excepția cazului :other este in :values.', + 'required_with' => 'Câmpul :attribute este necesar când există :values.', + 'required_with_all' => 'Câmpul :attribute este necesar când există :values.', + 'required_without' => 'Câmpul :attribute este necesar când nu există :values.', + 'required_without_all' => 'Câmpul :attribute este necesar când niciunul(una) dintre :values nu există.', + 'same' => 'Câmpul :attribute și :other trebuie să fie identice.', + 'size' => [ + 'numeric' => 'Câmpul :attribute trebuie să fie :size.', + 'file' => 'Câmpul :attribute trebuie să aibă :size kiloocteți.', + 'string' => 'Câmpul :attribute trebuie să aibă :size caractere.', + 'array' => 'Câmpul :attribute trebuie să aibă :size elemente.', + ], + 'string' => 'Câmpul :attribute trebuie să fie string.', + 'timezone' => 'Câmpul :attribute trebuie să fie un fus orar valid.', + 'unique' => 'Câmpul :attribute a fost deja folosit.', + 'uploaded' => 'Câmpul :attribute nu a reușit încărcarea.', + 'url' => 'Câmpul :attribute nu este un URL valid.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'mesaj-personalizat', + ], + 'invalid_currency' => 'Codul :attribute este invalid.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/ru-RU/accounts.php b/resources/lang/ru-RU/accounts.php new file mode 100755 index 0000000..c4a34b9 --- /dev/null +++ b/resources/lang/ru-RU/accounts.php @@ -0,0 +1,14 @@ + 'Имя аккаунта', + 'number' => 'Номер', + 'opening_balance' => 'Открытие баланса', + 'current_balance' => 'Текущий баланс', + 'bank_name' => 'Название банка', + 'bank_phone' => 'Телефон банка', + 'bank_address' => 'Адрес банка', + 'default_account' => 'Аккаунт по-умолчанию', + +]; diff --git a/resources/lang/ru-RU/auth.php b/resources/lang/ru-RU/auth.php new file mode 100755 index 0000000..7082b59 --- /dev/null +++ b/resources/lang/ru-RU/auth.php @@ -0,0 +1,30 @@ + 'Профиль', + 'logout' => 'Выйти', + 'login' => 'Войти', + 'login_to' => 'Войти, чтобы начать сеанс', + 'remember_me' => 'Запомнить меня', + 'forgot_password' => 'Забыли пароль?', + 'reset_password' => 'Сбросить пароль', + 'enter_email' => 'Введите Ваш e-mail', + 'current_email' => 'Текущий E-mail', + 'reset' => 'Сбросить', + 'never' => 'никогда', + 'password' => [ + 'current' => 'Пароль', + 'current_confirm' => 'Подтверждение пароля', + 'new' => 'Новый пароль', + 'new_confirm' => 'Подтверждение нового пароля', + ], + 'error' => [ + 'self_delete' => 'Ошибка: нельзя удалить самого себя!' + ], + + 'failed' => 'Имя пользователя и пароль не совпадают.', + 'disabled' => 'Эта учетная запись отключена. Пожалуйста, обратитесь к системному администратору.', + 'throttle' => 'Слишком много попыток входа. Пожалуйста, попробуйте еще раз через :seconds секунд.', + +]; diff --git a/resources/lang/ru-RU/bills.php b/resources/lang/ru-RU/bills.php new file mode 100755 index 0000000..63c6c15 --- /dev/null +++ b/resources/lang/ru-RU/bills.php @@ -0,0 +1,46 @@ + 'Номер счёта', + 'bill_date' => 'Дата счёта', + 'total_price' => 'Общая стоимость', + 'due_date' => 'Дата завершения', + 'order_number' => 'Номер заказа', + 'bill_from' => 'Счёт от', + + 'quantity' => 'Количество', + 'price' => 'Цена', + 'sub_total' => 'Итого', + 'discount' => 'Discount', + 'tax_total' => 'Итого с налогом', + 'total' => 'Всего', + + 'item_name' => 'Имя пункта | Имена пунктов', + + 'show_discount' => ':discount% Discount', + 'add_discount' => 'Add Discount', + 'discount_desc' => 'of subtotal', + + 'payment_due' => 'Оплатить до', + 'amount_due' => 'Сумма', + 'paid' => 'Оплачено', + 'histories' => 'Истории', + 'payments' => 'Платежи', + 'add_payment' => 'Добавить платёж', + 'mark_received' => 'Отметить как получено', + 'download_pdf' => 'Скачать PDF', + 'send_mail' => 'Отправить E-mail', + + 'status' => [ + 'draft' => 'Черновик', + 'received' => 'Получено', + 'partial' => 'Частично', + 'paid' => 'Оплачено', + ], + + 'messages' => [ + 'received' => 'Счёт помечен как успешно получен!', + ], + +]; diff --git a/resources/lang/ru-RU/companies.php b/resources/lang/ru-RU/companies.php new file mode 100755 index 0000000..c75ecd9 --- /dev/null +++ b/resources/lang/ru-RU/companies.php @@ -0,0 +1,13 @@ + 'Домен', + 'logo' => 'Логотип', + 'manage' => 'Управление компаниями', + 'all' => 'Все компании', + 'error' => [ + 'delete_active' => 'Ошибка: нельзя удалить активную компанию, пожалуйста, смените её сперва на любую другую!', + ], + +]; diff --git a/resources/lang/ru-RU/currencies.php b/resources/lang/ru-RU/currencies.php new file mode 100755 index 0000000..ea40b9b --- /dev/null +++ b/resources/lang/ru-RU/currencies.php @@ -0,0 +1,18 @@ + 'Код', + 'rate' => 'Оценка', + 'default' => 'Валюта по-умолчанию', + 'decimal_mark' => 'Десятичный знак', + 'thousands_separator' => 'Разделитель тысяч', + 'precision' => 'Точность', + 'symbol' => [ + 'symbol' => 'Символ', + 'position' => 'Позиция символа', + 'before' => 'До итоговой суммы', + 'after' => 'После итоговой суммы', + ] + +]; diff --git a/resources/lang/ru-RU/customers.php b/resources/lang/ru-RU/customers.php new file mode 100755 index 0000000..993d881 --- /dev/null +++ b/resources/lang/ru-RU/customers.php @@ -0,0 +1,11 @@ + 'Разрешить вход?', + 'user_created' => 'Пользователь создан', + + 'error' => [ + 'email' => 'Этот e-mail уже занят.' + ] +]; diff --git a/resources/lang/ru-RU/dashboard.php b/resources/lang/ru-RU/dashboard.php new file mode 100755 index 0000000..cc229ef --- /dev/null +++ b/resources/lang/ru-RU/dashboard.php @@ -0,0 +1,24 @@ + 'Всего доходов', + 'receivables' => 'Задолженность', + 'open_invoices' => 'Открытые квитанции', + 'overdue_invoices' => 'Просроченные квитанции', + 'total_expenses' => 'Всего расходов', + 'payables' => 'Долги по кредитам', + 'open_bills' => 'Открытые счета', + 'overdue_bills' => 'Просроченные счета', + 'total_profit' => 'Общая прибыль', + 'open_profit' => 'Открытая прибыль', + 'overdue_profit' => 'Просроченная прибыль', + 'cash_flow' => 'Поток средств', + 'no_profit_loss' => 'Без потери прибыли', + 'incomes_by_category' => 'Доходы по категориям', + 'expenses_by_category' => 'Расходы по категориям', + 'account_balance' => 'Баланс счёта', + 'latest_incomes' => 'Последние доходы', + 'latest_expenses' => 'Последние расходы', + +]; diff --git a/resources/lang/ru-RU/demo.php b/resources/lang/ru-RU/demo.php new file mode 100755 index 0000000..827ace3 --- /dev/null +++ b/resources/lang/ru-RU/demo.php @@ -0,0 +1,17 @@ + 'Средства', + 'categories_uncat' => 'Без категории', + 'categories_deposit' => 'Депозит', + 'categories_sales' => 'Продажи', + 'currencies_usd' => 'Доллар США', + 'currencies_eur' => 'Евро', + 'currencies_gbp' => 'Британский Фунт', + 'currencies_try' => 'Турецкая Лира', + 'taxes_exempt' => 'Налоговые освобождения', + 'taxes_normal' => 'Обычный налог', + 'taxes_sales' => 'Налог с продаж', + +]; diff --git a/resources/lang/ru-RU/footer.php b/resources/lang/ru-RU/footer.php new file mode 100755 index 0000000..0ec6e01 --- /dev/null +++ b/resources/lang/ru-RU/footer.php @@ -0,0 +1,9 @@ + 'Версия', + 'powered' => '© Akaunting', + 'software' => 'Бесплатное Биллинговое ПО', + +]; diff --git a/resources/lang/ru-RU/general.php b/resources/lang/ru-RU/general.php new file mode 100755 index 0000000..e7d59a2 --- /dev/null +++ b/resources/lang/ru-RU/general.php @@ -0,0 +1,117 @@ + 'Пункт | Пункты', + 'incomes' => 'Поступление | Поступления', + 'invoices' => 'Квитанция | Квитанции', + 'revenues' => 'Доход | Доходы', + 'customers' => 'Клиент | Клиенты', + 'expenses' => 'Расход | Расходы', + 'bills' => 'Счёт | Счета', + 'payments' => 'Платёж | Платежи', + 'vendors' => 'Поставщик | Поставщики', + 'accounts' => 'Аккаунт | Аккаунты', + 'transfers' => 'Перевод | Переводы', + 'transactions' => 'Транзакция | Транзакции', + 'reports' => 'Отчёт | Отчёты', + 'settings' => 'Настройка | Настройки', + 'categories' => 'Категория | Категории', + 'currencies' => 'Валюта | Валюты', + 'tax_rates' => 'Налоговая ставка | Налоговые ставки', + 'users' => 'Пользователь | Пользователи', + 'roles' => 'Роль | Роли', + 'permissions' => 'Разрешение | Разрешения', + 'modules' => 'Приложение | Приложения', + 'companies' => 'Компания | Компании', + 'profits' => 'Прибыль | Прибыль', + 'taxes' => 'Налог | Налоги', + 'logos' => 'Логотип | Логотипы', + 'pictures' => 'Фотография | Фотографии', + 'types' => 'Тип | Типы', + 'payment_methods' => 'Способ оплаты | Способы оплаты', + 'compares' => 'Поступление vs Расход | Поступления vs Расходы', + 'notes' => 'Примечание | Примечания', + 'totals' => 'Итог | Итоги', + 'languages' => 'Язык | Языки', + 'updates' => 'Обновление | Обновления', + 'numbers' => 'Номер | Номера', + 'statuses' => 'Статус | Статусы', + 'others' => 'Other|Others', + + 'dashboard' => 'Панель управления', + 'banking' => 'Банки', + 'general' => 'Общее', + 'no_records' => 'Нет записей.', + 'date' => 'Дата', + 'amount' => 'Сумма', + 'enabled' => 'Включено', + 'disabled' => 'Отключено', + 'yes' => 'Да', + 'no' => 'Нет', + 'na' => 'Н/Д', + 'daily' => 'Ежедневно', + 'monthly' => 'Ежемесячно', + 'quarterly' => 'Ежеквартально', + 'yearly' => 'Ежегодно', + 'add' => 'Добавить', + 'add_new' => 'Добавить новый', + 'show' => 'Показать', + 'edit' => 'Редактировать', + 'delete' => 'Удалить', + 'send' => 'Отправить', + 'download' => 'Скачать', + 'delete_confirm' => 'Подтверждение удаления :name :type?', + 'name' => 'Имя', + 'email' => 'E-mail', + 'tax_number' => 'Налоговый номер', + 'phone' => 'Телефон', + 'address' => 'Адрес', + 'website' => 'Сайт', + 'actions' => 'Действия', + 'description' => 'Описание', + 'manage' => 'Управление', + 'code' => 'Код', + 'alias' => 'Алиас', + 'balance' => 'Баланс', + 'reference' => 'Ссылка', + 'attachment' => 'Вложение', + 'change' => 'Изменить', + 'switch' => 'Переключить', + 'color' => 'Цвет', + 'save' => 'Сохранить', + 'cancel' => 'Отмена', + 'from' => 'От', + 'to' => 'Кому', + 'print' => 'Печать', + 'search' => 'Поиск', + 'search_placeholder' => 'Введите для поиска..', + 'filter' => 'Фильтр', + 'help' => 'Справка', + 'all' => 'Все', + 'all_type' => 'Все :type', + 'upcoming' => 'Предстоящие', + 'created' => 'Создан', + 'id' => 'ID', + 'more_actions' => 'Дополнительные действия', + 'duplicate' => 'Дублировать', + 'unpaid' => 'Невыплаченные', + 'paid' => 'Выплаченные', + 'overdue' => 'Просроченные', + 'partially' => 'Частично', + 'partially_paid' => 'Частично выплаченные', + + 'title' => [ + 'new' => 'Создать :type', + 'edit' => 'Изменить :type', + ], + 'form' => [ + 'enter' => 'Ввести :field', + 'select' => [ + 'field' => '- Выбрать :field -', + 'file' => 'Выбрать файл', + ], + 'no_file_selected' => 'Файл не выбран...', + ], + +]; diff --git a/resources/lang/ru-RU/header.php b/resources/lang/ru-RU/header.php new file mode 100755 index 0000000..ab8df5b --- /dev/null +++ b/resources/lang/ru-RU/header.php @@ -0,0 +1,15 @@ + 'Сменить язык', + 'last_login' => 'Последний вход :time', + 'notifications' => [ + 'counter' => '{0} Уведомления отсутствуют|{1} У Вас :count уведомление|[2,3,4] уведомления|[5,*]У Вас :count уведомлений', + 'overdue_invoices' => '{1} :count просроченная квитанция|[2,3,4] :count просроченные квитанции|[5,*] :count просроченных квитанций', + 'upcoming_bills' => '{1} :count входящий счёт|[2,3,4] :count входящих счёта|[5,*] :count входящих счетов', + 'items_stock' => '{1} : количество распроданного товара | [2, *]: количество распроданных товаров', + 'view_all' => 'Просмотреть все' + ], + +]; diff --git a/resources/lang/ru-RU/import.php b/resources/lang/ru-RU/import.php new file mode 100755 index 0000000..ec39da9 --- /dev/null +++ b/resources/lang/ru-RU/import.php @@ -0,0 +1,9 @@ + 'Импортировать', + 'title' => 'Импорт :type', + 'message' => 'Допустимые типы файлов: CSV, XLS. Пожалуйста, скачайте файл примера.', + +]; diff --git a/resources/lang/ru-RU/install.php b/resources/lang/ru-RU/install.php new file mode 100755 index 0000000..2e1f1e4 --- /dev/null +++ b/resources/lang/ru-RU/install.php @@ -0,0 +1,44 @@ + 'Далее', + 'refresh' => 'Обновить', + + 'steps' => [ + 'requirements' => 'Пожалуйста, ознакомьтесь со следующими требованиями!', + 'language' => 'Шаг 1/3: Выбор языка', + 'database' => 'Шаг 2/3: Настройка базы данных', + 'settings' => 'Шаг 3/3: Компании и данные Администратора', + ], + + 'language' => [ + 'select' => 'Выбрать язык', + ], + + 'requirements' => [ + 'enabled' => ':feature должно быть включено!', + 'disabled' => ':feature должно быть отключено!', + 'extension' => ':extension расширение должно быть загружено!', + 'directory' => ':directory директория должна быть доступна для записи!', + ], + + 'database' => [ + 'hostname' => 'Имя хоста', + 'username' => 'Имя пользователя', + 'password' => 'Пароль', + 'name' => 'База данных', + ], + + 'settings' => [ + 'company_name' => 'Название компании', + 'company_email' => 'E-mail компании', + 'admin_email' => 'E-mail Администратора', + 'admin_password' => 'Пароль Администратора', + ], + + 'error' => [ + 'connection' => 'Ошибка: не удалось подключиться к базе данных! Пожалуйста, убедитесь, что данные являются правильными.', + ], + +]; diff --git a/resources/lang/ru-RU/invoices.php b/resources/lang/ru-RU/invoices.php new file mode 100755 index 0000000..53951a8 --- /dev/null +++ b/resources/lang/ru-RU/invoices.php @@ -0,0 +1,55 @@ + 'Номер квитанции', + 'invoice_date' => 'Дата квитанции', + 'total_price' => 'Общая цена', + 'due_date' => 'Дата окончания', + 'order_number' => 'Номер заказа', + 'bill_to' => 'Плательщик', + + 'quantity' => 'Количество', + 'price' => 'Цена', + 'sub_total' => 'Итого', + 'discount' => 'Discount', + 'tax_total' => 'Итого с налогом', + 'total' => 'Всего', + + 'item_name' => 'Имя пункта | Имена пунктов', + + 'show_discount' => ':discount% Discount', + 'add_discount' => 'Add Discount', + 'discount_desc' => 'of subtotal', + + 'payment_due' => 'Оплатить до', + 'paid' => 'Оплачено', + 'histories' => 'Истории', + 'payments' => 'Платежи', + 'add_payment' => 'Добавить платёж', + 'mark_paid' => 'Пометить как оплачено', + 'mark_sent' => 'Пометить как отправлено', + 'download_pdf' => 'Скачать PDF', + 'send_mail' => 'Отправить E-mail', + + 'status' => [ + 'draft' => 'Черновик', + 'sent' => 'Отправлено', + 'viewed' => 'Просмотрено', + 'approved' => 'Утверждено', + 'partial' => 'Частично', + 'paid' => 'Оплачено', + ], + + 'messages' => [ + 'email_sent' => 'Счет-фактура успешно отправлена на e-mail!', + 'marked_sent' => 'Счет-фактура помечена как успешно отправлена!', + 'email_required' => 'Отсутствует e-mail адрес для этого клиента!', + ], + + 'notification' => [ + 'message' => 'Вы получили это письмо потому, что у Вас имеются входящие :amount счета на :customer клиента.', + 'button' => 'Оплатить сейчас', + ], + +]; diff --git a/resources/lang/ru-RU/items.php b/resources/lang/ru-RU/items.php new file mode 100755 index 0000000..cb17b77 --- /dev/null +++ b/resources/lang/ru-RU/items.php @@ -0,0 +1,15 @@ + 'Количество | Количества', + 'sales_price' => 'Цена продажи', + 'purchase_price' => 'Цена покупки', + 'sku' => 'SKU', + + 'notification' => [ + 'message' => 'Вы получили это письмо, потому что :name заканчивается.', + 'button' => 'Просмотреть сейчас', + ], + +]; diff --git a/resources/lang/ru-RU/messages.php b/resources/lang/ru-RU/messages.php new file mode 100755 index 0000000..1350434 --- /dev/null +++ b/resources/lang/ru-RU/messages.php @@ -0,0 +1,25 @@ + [ + 'added' => ':type добавлено!', + 'updated' => ':type обновлено!', + 'deleted' => ':type удалено!', + 'duplicated' => ':type продублировано!', + 'imported' => ':type импортировано!', + ], + 'error' => [ + 'over_payment' => 'Ошибка: Оплата не добавлена! Сумма проходит, как общая.', + 'not_user_company' => 'Ошибка: Вы не можете управлять этой компанией!', + 'customer' => 'Ошибка: Пользователь не создан! :name уже использует этот адрес электронной почты.', + 'no_file' => 'Ошибка: Файл не выбран!', + 'last_category' => 'Error: Can not delete the last :type category!', + 'invalid_token' => 'Error: The token entered is invalid!', + ], + 'warning' => [ + 'deleted' => 'Предупреждение: Вы не можете удалить :name потому что имеется связь с :text.', + 'disabled' => 'Предупреждение: Вы не можете отключить :name потому что имеется связь с :text.', + ], + +]; diff --git a/resources/lang/ru-RU/modules.php b/resources/lang/ru-RU/modules.php new file mode 100755 index 0000000..dada783 --- /dev/null +++ b/resources/lang/ru-RU/modules.php @@ -0,0 +1,48 @@ + 'API ключ', + 'api_token' => 'Ключ', + 'top_paid' => 'Топ оплаченных', + 'new' => 'Новый', + 'top_free' => 'Топ бесплатных', + 'free' => 'БЕСПЛАТНО', + 'search' => 'Search', + 'install' => 'Установить', + 'buy_now' => 'Купить сейчас', + 'token_link' => 'Нажмите здесь чтобы получить Ваш API ключ.', + 'no_apps' => 'В этой категории еще нет приложений.', + 'developer' => 'Вы разработчик? Здесь вы можете узнать, как создать приложение и начать продавать уже сегодня!', + + 'about' => 'О нас', + + 'added' => 'Добавлено', + 'updated' => 'Обновлено', + 'compatibility' => 'Совместимость', + + 'installed' => ':module установлен', + 'uninstalled' => ':module удалён', + //'updated' => ':module updated', + 'enabled' => ':module включен', + 'disabled' => ':module отключен', + + 'tab' => [ + 'installation' => 'Установка', + 'faq' => 'ЧаВо', + 'changelog' => 'История изменений', + ], + + 'installation' => [ + 'header' => 'Установка приложения', + 'download' => 'Скачивание :module модуля.', + 'unzip' => 'Распаковка :module модуля.', + 'install' => 'Установка :module модуля.', + ], + + 'button' => [ + 'uninstall' => 'Деинсталляция', + 'disable' => 'Отключить', + 'enable' => 'Включить', + ], +]; diff --git a/resources/lang/ru-RU/pagination.php b/resources/lang/ru-RU/pagination.php new file mode 100755 index 0000000..3159118 --- /dev/null +++ b/resources/lang/ru-RU/pagination.php @@ -0,0 +1,9 @@ + '« Предыдущее', + 'next' => 'Следующее »', + 'showing' => 'Показать от :first к :last для :total :type', + +]; diff --git a/resources/lang/ru-RU/passwords.php b/resources/lang/ru-RU/passwords.php new file mode 100755 index 0000000..93fdb5a --- /dev/null +++ b/resources/lang/ru-RU/passwords.php @@ -0,0 +1,22 @@ + 'Пароль должен быть не менее шести символов и совпадать с подтверждением.', + 'reset' => 'Ваш пароль был сброшен!', + 'sent' => 'Ссылка на сброс пароля была отправлена!', + 'token' => 'Ошибочный код сброса пароля.', + 'user' => "Не удалось найти пользователя с указанным электронным адресом.", + +]; diff --git a/resources/lang/ru-RU/recurring.php b/resources/lang/ru-RU/recurring.php new file mode 100755 index 0000000..92099c7 --- /dev/null +++ b/resources/lang/ru-RU/recurring.php @@ -0,0 +1,20 @@ + 'Recurring', + 'every' => 'Every', + 'period' => 'Period', + 'times' => 'Times', + 'daily' => 'Daily', + 'weekly' => 'Weekly', + 'monthly' => 'Monthly', + 'yearly' => 'Yearly', + 'custom' => 'Custom', + 'days' => 'Day(s)', + 'weeks' => 'Week(s)', + 'months' => 'Month(s)', + 'years' => 'Year(s)', + 'message' => 'This is a recurring :type and the next :type will be automatically generated at :date', + +]; diff --git a/resources/lang/ru-RU/reports.php b/resources/lang/ru-RU/reports.php new file mode 100755 index 0000000..b754d05 --- /dev/null +++ b/resources/lang/ru-RU/reports.php @@ -0,0 +1,30 @@ + 'Этот год', + 'previous_year' => 'Предыдущий год', + 'this_quarter' => 'Этот квартал', + 'previous_quarter' => 'Предыдущий квартал', + 'last_12_months' => 'Последние 12 месяцев', + 'profit_loss' => 'Profit & Loss', + 'gross_profit' => 'Gross Profit', + 'net_profit' => 'Net Profit', + 'total_expenses' => 'Total Expenses', + 'net' => 'NET', + + 'summary' => [ + 'income' => 'Сводка поступлений', + 'expense' => 'Сводка расходов', + 'income_expense' => 'Поступления vs Расходы', + 'tax' => 'Tax Summary', + ], + + 'quarter' => [ + '1' => 'Jan-Mar', + '2' => 'Apr-Jun', + '3' => 'Jul-Sep', + '4' => 'Oct-Dec', + ], + +]; diff --git a/resources/lang/ru-RU/settings.php b/resources/lang/ru-RU/settings.php new file mode 100755 index 0000000..80e200a --- /dev/null +++ b/resources/lang/ru-RU/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Имя', + 'email' => 'E-mail', + 'phone' => 'Телефон', + 'address' => 'Адрес', + 'logo' => 'Логотип', + ], + 'localisation' => [ + 'tab' => 'Локализация', + 'date' => [ + 'format' => 'Формат даты', + 'separator' => 'Разделитель даты', + 'dash' => 'Тире (-)', + 'dot' => 'Точка (.)', + 'comma' => 'Запятая (,)', + 'slash' => 'Слэш (/)', + 'space' => 'Пробел ( )', + ], + 'timezone' => 'Часовой пояс', + 'percent' => [ + 'title' => 'Percent (%) Position', + 'before' => 'Before Number', + 'after' => 'After Number', + ], + ], + 'invoice' => [ + 'tab' => 'Квитанция', + 'prefix' => 'Номерной префикс', + 'digit' => 'Цифрой префикс', + 'next' => 'Следующий номер', + 'logo' => 'Логотип', + ], + 'default' => [ + 'tab' => 'Умолчания', + 'account' => 'Аккаунт по-умолчанию', + 'currency' => 'Валюта по-умолчанию', + 'tax' => 'Налог по-умолчанию', + 'payment' => 'Способ оплаты по-умолчанию', + 'language' => 'Язык по-умолчанию', + ], + 'email' => [ + 'protocol' => 'Протокол', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP-хост', + 'port' => 'SMTP-порт', + 'username' => 'SMTP-пользователь', + 'password' => 'SMTP-пароль', + 'encryption' => 'SMTP-защита', + 'none' => 'Отсутствует', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Путь к Sendmail', + 'log' => 'Журнал E-mail\'ов', + ], + 'scheduling' => [ + 'tab' => 'Планировщик', + 'send_invoice' => 'Отправить напоминание с квитанцией', + 'invoice_days' => 'Отправить после истечения дней', + 'send_bill' => 'Отправить напоминание со счётом', + 'bill_days' => 'Отправить до истечения дней', + 'cron_command' => 'Cron-команда', + 'schedule_time' => 'Время выполнения', + ], + 'appearance' => [ + 'tab' => 'Внешний вид', + 'theme' => 'Тема', + 'light' => 'Светлая', + 'dark' => 'Тёмная', + 'list_limit' => 'Записей на странице', + 'use_gravatar' => 'Использовать Gravatar', + ], + 'system' => [ + 'tab' => 'Система', + 'session' => [ + 'lifetime' => 'Время жизни сеанса (в минутах)', + 'handler' => 'Обработчик сеанса', + 'file' => 'Файл', + 'database' => 'База данных', + ], + 'file_size' => 'Максимальный размер файла (МБ)', + 'file_types' => 'Допустимые типы файлов', + ], + +]; diff --git a/resources/lang/ru-RU/taxes.php b/resources/lang/ru-RU/taxes.php new file mode 100755 index 0000000..fe4a33d --- /dev/null +++ b/resources/lang/ru-RU/taxes.php @@ -0,0 +1,8 @@ + 'Оценка', + 'rate_percent' => 'Оценка (%)', + +]; diff --git a/resources/lang/ru-RU/transfers.php b/resources/lang/ru-RU/transfers.php new file mode 100755 index 0000000..291c5d3 --- /dev/null +++ b/resources/lang/ru-RU/transfers.php @@ -0,0 +1,8 @@ + 'Из аккаунта', + 'to_account' => 'В аккаунт', + +]; diff --git a/resources/lang/ru-RU/updates.php b/resources/lang/ru-RU/updates.php new file mode 100755 index 0000000..8067278 --- /dev/null +++ b/resources/lang/ru-RU/updates.php @@ -0,0 +1,15 @@ + 'Установленная версия', + 'latest_version' => 'Последняя версия', + 'update' => 'Обновить «Akaunting» до :version версии', + 'changelog' => 'История изменений', + 'check' => 'Проверить', + 'new_core' => 'Доступна обновленная версия «Akaunting».', + 'latest_core' => 'Поздравляем! Теперь у Вас последняя версия «Akaunting». Будущие обновления безопасности будут применяться автоматически.', + 'success' => 'Обновление успешно завершено.', + 'error' => 'Обновление не удалось, пожалуйста, попробуйте снова.', + +]; diff --git a/resources/lang/ru-RU/validation.php b/resources/lang/ru-RU/validation.php new file mode 100755 index 0000000..2500623 --- /dev/null +++ b/resources/lang/ru-RU/validation.php @@ -0,0 +1,119 @@ + 'Вы должны принять :attribute.', + 'active_url' => 'Поле :attribute содержит недействительный URL.', + 'after' => 'В поле :attribute должна быть дата после :date.', + 'after_or_equal' => 'В поле :attribute должна быть дата после или равняться :date.', + 'alpha' => 'Поле :attribute может содержать только буквы.', + 'alpha_dash' => 'Поле :attribute может содержать только буквы, цифры и дефисы.', + 'alpha_num' => 'Поле :attribute может содержать только буквы и цифры.', + 'array' => 'Поле :attribute должно быть массивом.', + 'before' => 'В поле :attribute должна быть дата до :date.', + 'before_or_equal' => 'В поле :attribute должна быть дата до или равняться :date.', + 'between' => [ + 'numeric' => 'Поле :attribute должно быть между :min и :max.', + 'file' => 'Размер файла в поле :attribute должен быть между :min и :max Кб.', + 'string' => 'Количество символов в поле :attribute должно быть между :min и :max.', + 'array' => 'Количество элементов в поле :attribute должно быть между :min и :max.', + ], + 'boolean' => 'Поле :attribute должно иметь true или false.', + 'confirmed' => 'Поле :attribute не совпадает с подтверждением.', + 'date' => 'Поле :attribute не является датой.', + 'date_format' => 'Поле :attribute не соответствует формату :format.', + 'different' => 'Поля :attribute и :other должны различаться.', + 'digits' => 'Длина цифрового поля :attribute должна быть :digits.', + 'digits_between' => 'Длина цифрового поля :attribute должна быть между :min и :max.', + 'dimensions' => 'Поле :attribute имеет недопустимые размеры изображения.', + 'distinct' => 'Поле :attribute содержит повторяющееся значение.', + 'email' => 'Поле :attribute должно быть действительным E-mail\'ом.', + 'exists' => 'Выбранное значение для :attribute некорректно.', + 'file' => 'Поле :attribute должно быть файлом.', + 'filled' => 'Поле :attribute обязательно для заполнения.', + 'image' => 'Поле :attribute должно быть изображением.', + 'in' => 'Выбранное значение для :attribute неверно.', + 'in_array' => 'Поле :attribute не существует в :other.', + 'integer' => 'Поле :attribute должно быть целым числом.', + 'ip' => 'Поле :attribute должно быть действительным IP-адресом.', + 'json' => 'Поле :attribute должно быть JSON строкой.', + 'max' => [ + 'numeric' => 'Поле :attribute не может быть больше :max.', + 'file' => 'Размер файла в поле :attribute не может быть больше :max Кб.', + 'string' => 'Количество символов в поле :attribute не может превышать :max.', + 'array' => 'Количество элементов в поле :attribute не может превышать :max.', + ], + 'mimes' => 'Поле :attribute должно быть файлом одного из следующих типов: :values.', + 'mimetypes' => 'Поле :attribute должно быть файлом одного из следующих типов: :values.', + 'min' => [ + 'numeric' => 'Поле :attribute должно быть не меньше :min.', + 'file' => 'Размер файла в поле :attribute должен быть не менее :min Кб.', + 'string' => 'Количество символов в поле :attribute должно быть не менее :min.', + 'array' => 'Количество элементов в поле :attribute должно быть не менее :min.', + ], + 'not_in' => 'Выбранное значение :attribute неверно.', + 'numeric' => 'Поле :attribute должно быть числом.', + 'present' => 'Поле :attribute должно присутствовать.', + 'regex' => 'Поле :attribute имеет неверный формат.', + 'required' => 'Поле :attribute обязательно для заполнения.', + 'required_if' => 'Поле :attribute обязательно для заполнения, когда :other равно :value.', + 'required_unless' => 'Поле :attribute обязательно для заполнения, когда :other не равно :values.', + 'required_with' => 'Поле :attribute обязательно для заполнения, когда :values указано.', + 'required_with_all' => 'Поле :attribute обязательно для заполнения, когда :values указано.', + 'required_without' => 'Поле :attribute обязательно для заполнения, когда :values не указано.', + 'required_without_all' => 'Поле :attribute обязательно для заполнения, когда ни одно из :values не указано.', + 'same' => 'Значение :attribute должно совпадать с :other.', + 'size' => [ + 'numeric' => 'Поле :attribute должно быть равным :size.', + 'file' => 'Размер файла в поле :attribute должен быть равен :size Кб.', + 'string' => 'Количество символов в поле :attribute должно быть равным :size.', + 'array' => 'Количество элементов в поле :attribute должно быть равным :size.', + ], + 'string' => 'Поле :attribute должно быть строкой.', + 'timezone' => 'Поле :attribute должно быть действительным часовым поясом.', + 'unique' => 'Такое значение поля :attribute уже существует.', + 'uploaded' => 'Загрузка поля :attribute не удалась.', + 'url' => 'Поле :attribute имеет неверный формат.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'Настраиваемое сообщение', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/sq-AL/accounts.php b/resources/lang/sq-AL/accounts.php new file mode 100755 index 0000000..f90c67c --- /dev/null +++ b/resources/lang/sq-AL/accounts.php @@ -0,0 +1,14 @@ + 'Emri i Llogarisë', + 'number' => 'Numri', + 'opening_balance' => 'Bilanci i Hapjes', + 'current_balance' => 'Bilanci Aktual', + 'bank_name' => 'Emri i Bankës', + 'bank_phone' => 'Telefoni i Bankës', + 'bank_address' => 'Adresa e Bankës', + 'default_account' => 'Llogaria Default', + +]; diff --git a/resources/lang/sq-AL/auth.php b/resources/lang/sq-AL/auth.php new file mode 100755 index 0000000..6a55f8c --- /dev/null +++ b/resources/lang/sq-AL/auth.php @@ -0,0 +1,39 @@ + 'Profili', + 'logout' => 'Dalje', + 'login' => 'Hyrja', + 'login_to' => 'Identifikohu për të filluar sessionin tuaj', + 'remember_me' => 'Më kujto', + 'forgot_password' => 'Kam harruar fjalëkalimin tim', + 'reset_password' => 'Rivendos Fjalëkalimin', + 'enter_email' => 'Shkruani Adresën Tuaj Email', + 'current_email' => 'Emaili Aktual', + 'reset' => 'Rivendos', + 'never' => 'asnjëherë', + + 'password' => [ + 'current' => 'Fjalëkalimi', + 'current_confirm' => 'Konfirmimi i Fjalëkalimit', + 'new' => 'Fjalëkalimi i Ri', + 'new_confirm' => 'Konfirmimi i Fjalëkalimit të Ri', + ], + + 'error' => [ + 'self_delete' => 'Gabim: Nuk mund të fshini veten!', + 'no_company' => 'Gabim: Asnjë kompani nuk është caktuar në llogarinë tuaj. Ju lutemi, kontaktoni administratorin e sistemit.', + ], + + 'failed' => 'Këto kredencialet nuk përputhen me të dhënat tona.', + 'disabled' => 'Kjo llogari është e mbyllur. Ju lutemi, kontaktoni administratorin e sistemit.', + 'throttle' => 'Shumë përpjekje për identifikim. Provo sërish në :seconds sekonda.', + + 'notification' => [ + 'message_1' => 'Po pranon këtë email sepse kemi marrë një kërkesë për rivendosjen e fjalëkalimit për llogarinë tënde.', + 'message_2' => 'Nëse nuk keni kërkuar një rivendosje të fjalëkalimit, nuk kërkohet asnjë veprim i mëtejshëm.', + 'button' => 'Rivendos Fjalëkalimin', + ], + +]; diff --git a/resources/lang/sq-AL/bills.php b/resources/lang/sq-AL/bills.php new file mode 100755 index 0000000..1b45ad4 --- /dev/null +++ b/resources/lang/sq-AL/bills.php @@ -0,0 +1,46 @@ + 'Numri i Faturës', + 'bill_date' => 'Data e Faturës', + 'total_price' => 'Cmimi Total', + 'due_date' => 'Data e duhur', + 'order_number' => 'Numri i Porosisë', + 'bill_from' => 'Fature Nga', + + 'quantity' => 'Sasia', + 'price' => 'Çmimi', + 'sub_total' => 'Nëntotali', + 'discount' => 'Skonto', + 'tax_total' => 'Tatimi Gjithsej', + 'total' => 'Totali', + + 'item_name' => 'Emri i Artikullit | Emrat e Artikullit', + + 'show_discount' => ':discount% Skonto', + 'add_discount' => 'Shto Skonto', + 'discount_desc' => 'e nëntotalit', + + 'payment_due' => 'Pagesa e Duhur', + 'amount_due' => 'Shuma e Duhur', + 'paid' => 'I paguar', + 'histories' => 'Historitë', + 'payments' => 'Pagesat', + 'add_payment' => 'Shto Pagesë', + 'mark_received' => 'Shënoje të Marrë', + 'download_pdf' => 'Shkarko PDF', + 'send_mail' => 'Dërgo Email', + + 'status' => [ + 'draft' => 'Draft', + 'received' => 'Marrë', + 'partial' => 'I pjesshëm', + 'paid' => 'I paguar', + ], + + 'messages' => [ + 'received' => 'Fatura shënohet si i marrë me sukses!', + ], + +]; diff --git a/resources/lang/sq-AL/companies.php b/resources/lang/sq-AL/companies.php new file mode 100755 index 0000000..ae4f5f3 --- /dev/null +++ b/resources/lang/sq-AL/companies.php @@ -0,0 +1,13 @@ + 'Domain', + 'logo' => 'Logoja', + 'manage' => 'Menaxho Kompanitë', + 'all' => 'Të Gjitha Kompanitë', + 'error' => [ + 'delete_active' => 'Gabim: Nuk mund të fshihet kompania aktive, ju lutem, ndryshoni së pari!', + ], + +]; diff --git a/resources/lang/sq-AL/currencies.php b/resources/lang/sq-AL/currencies.php new file mode 100755 index 0000000..d296bcc --- /dev/null +++ b/resources/lang/sq-AL/currencies.php @@ -0,0 +1,18 @@ + 'Kodi', + 'rate' => 'Normë', + 'default' => 'Valuta e Parazgjedhur', + 'decimal_mark' => 'Marku Decimal', + 'thousands_separator' => 'Mijëra Ndarës', + 'precision' => 'Saktësia', + 'symbol' => [ + 'symbol' => 'Simboli', + 'position' => 'Pozicioni i Simbolit', + 'before' => 'Para Shuma', + 'after' => 'Pas Shuma', + ] + +]; diff --git a/resources/lang/sq-AL/customers.php b/resources/lang/sq-AL/customers.php new file mode 100755 index 0000000..1ff8994 --- /dev/null +++ b/resources/lang/sq-AL/customers.php @@ -0,0 +1,11 @@ + 'Lejo Identifikimin?', + 'user_created' => 'Përdoruesi u Krijua', + + 'error' => [ + 'email' => 'Emaili tashmë është marrë.' + ] +]; diff --git a/resources/lang/sq-AL/dashboard.php b/resources/lang/sq-AL/dashboard.php new file mode 100755 index 0000000..18835bf --- /dev/null +++ b/resources/lang/sq-AL/dashboard.php @@ -0,0 +1,24 @@ + 'Fitimet Totale', + 'receivables' => 'Të Arkëtueshmet', + 'open_invoices' => 'Faturat e Hapura', + 'overdue_invoices' => 'Faturat e Vonuara', + 'total_expenses' => 'Shpenzimet Totale', + 'payables' => 'Të Pagueshmet', + 'open_bills' => 'Faturat e Hapura', + 'overdue_bills' => 'Faturat e Vonuara', + 'total_profit' => 'Fitimi Total', + 'open_profit' => 'Fitimi i Hapur', + 'overdue_profit' => 'Fitimi i Vonuar', + 'cash_flow' => 'Fluksi i Parave', + 'no_profit_loss' => 'Asnjë Humbje Fitimi', + 'incomes_by_category' => 'Fitimet Sipas Kategorive', + 'expenses_by_category' => 'Shpenzimet Sipas Kategorive', + 'account_balance' => 'Bilanci i Llogarisë', + 'latest_incomes' => 'Fitimet e Fundit', + 'latest_expenses' => 'Shpenzimet e Fundit', + +]; diff --git a/resources/lang/sq-AL/demo.php b/resources/lang/sq-AL/demo.php new file mode 100755 index 0000000..43b034d --- /dev/null +++ b/resources/lang/sq-AL/demo.php @@ -0,0 +1,16 @@ + 'Para', + 'categories_deposit' => 'Depozite', + 'categories_sales' => 'Shitjet', + 'currencies_usd' => 'Dollar Amerikan', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Poundi Britanik', + 'currencies_try' => 'Lira Turke', + 'taxes_exempt' => 'Përjashtohet Taksa', + 'taxes_normal' => 'Taksa Normale', + 'taxes_sales' => 'Taksa e Shitjes', + +]; diff --git a/resources/lang/sq-AL/footer.php b/resources/lang/sq-AL/footer.php new file mode 100755 index 0000000..2972a06 --- /dev/null +++ b/resources/lang/sq-AL/footer.php @@ -0,0 +1,9 @@ + 'Versioni', + 'powered' => 'Mundësuar nga Akaunting', + 'software' => 'Program Kontabiliteti Falas', + +]; diff --git a/resources/lang/sq-AL/general.php b/resources/lang/sq-AL/general.php new file mode 100755 index 0000000..def33fa --- /dev/null +++ b/resources/lang/sq-AL/general.php @@ -0,0 +1,121 @@ + 'Artikull | Artikuj', + 'incomes' => 'Fitim | Fitime', + 'invoices' => 'Faturë | Faturat', + 'revenues' => 'Ardhura | Ardhurat', + 'customers' => 'Konsumatori | Konsumatorët', + 'expenses' => 'Shpenzime | Shpenzimet', + 'bills' => 'Fatura | Faturat', + 'payments' => 'Pagesë | Pagesat', + 'vendors' => 'Shitësi | Shitësit', + 'accounts' => 'Llogaria | Llogaritë', + 'transfers' => 'Transferimi | Transferimet', + 'transactions' => 'Transaksioni | Transaksionet', + 'reports' => 'Raporti | Raportet', + 'settings' => 'Konfigurimi | Konfigurimet', + 'categories' => 'Kategoria | Kategoritë', + 'currencies' => 'Monedhë | Monedhat', + 'tax_rates' => 'Norma e Tatimit | Normat Tatimore', + 'users' => 'Përdoruesi | Përdoruesit', + 'roles' => 'Roli | Rolet', + 'permissions' => 'Leje | Lejet', + 'modules' => 'Aplikacioni | Aplikacionet', + 'companies' => 'Kompania | Kompanitë', + 'profits' => 'Fitimi | Fitimet', + 'taxes' => 'Tatim | Tatimet', + 'logos' => 'Logo | Logot', + 'pictures' => 'Foto | Fotografitë', + 'types' => 'Lloji | Llojet', + 'payment_methods' => 'Metoda e Pagesës | Metodat e Pagesës', + 'compares' => 'Fitimi kundrejt Shpenzimit | Fitimet kundrejt Shpenzimeve', + 'notes' => 'Shënim | Shënimet', + 'totals' => 'Totali | Totalet', + 'languages' => 'Gjuha | Gjuhët', + 'updates' => 'Përditësimi | Përditësimet', + 'numbers' => 'Numri | Numrat', + 'statuses' => 'Statusi | Statuset', + 'others' => 'Tjetër | Të tjera', + + 'dashboard' => 'Paneli Kryesor', + 'banking' => 'Veprime Bankare', + 'general' => 'Të përgjithshme', + 'no_records' => 'Nuk ka të dhëna.', + 'date' => 'Data', + 'amount' => 'Vlera', + 'enabled' => 'Aktivizuar', + 'disabled' => 'Caktivizuar', + 'yes' => 'Po', + 'no' => 'Jo', + 'na' => 'I Padisponueshëm', + 'daily' => 'Ditore', + 'monthly' => 'Mujore', + 'quarterly' => 'Tremujore', + 'yearly' => 'Vjetore', + 'add' => 'Shto', + 'add_new' => 'Shto të Re', + 'show' => 'Shfaq', + 'edit' => 'Modifiko', + 'delete' => 'Fshij', + 'send' => 'Dërgo', + 'download' => 'Shkarko', + 'delete_confirm' => 'Konfirmo fshirjen :name :type?', + 'name' => 'Emri', + 'email' => 'Email', + 'tax_number' => 'Numri i Takses', + 'phone' => 'Telefoni', + 'address' => 'Adresa', + 'website' => 'Faqja e Internetit', + 'actions' => 'Veprime', + 'description' => 'Përshkrimi', + 'manage' => 'Menaxho', + 'code' => 'Kodi', + 'alias' => 'Alias', + 'balance' => 'Bilanci', + 'reference' => 'Referenca', + 'attachment' => 'Bashkëngjitje', + 'change' => 'Ndrysho', + 'switch' => 'Ndryshim', + 'color' => 'Ngjyra', + 'save' => 'Ruaj', + 'cancel' => 'Anulo', + 'from' => 'Nga', + 'to' => 'Te', + 'print' => 'Printo', + 'search' => 'Kërko', + 'search_placeholder' => 'Lloji për të kërkuar..', + 'filter' => 'Filtër', + 'help' => 'Ndihmë', + 'all' => 'Të gjitha', + 'all_type' => 'Të gjitha :type', + 'upcoming' => 'Ardhshme', + 'created' => 'Krijuar', + 'id' => 'ID', + 'more_actions' => 'Më shumë Veprime', + 'duplicate' => 'Dublo', + 'unpaid' => 'I papaguar', + 'paid' => 'I paguar', + 'overdue' => 'I vonuar', + 'partially' => 'Pjesërisht', + 'partially_paid' => 'I paguar pjesërisht', + 'export' => 'Eksporto', + 'enable' => 'Aktivizo', + 'disable' => 'Çaktivizo', + + 'title' => [ + 'new' => 'I ri :type', + 'edit' => 'Modifiko :type', + ], + + 'form' => [ + 'enter' => 'Shkruaj :field', + 'select' => [ + 'field' => '- Selekto :field -', + 'file' => 'Selekto Dosje', + ], + 'no_file_selected' => 'Asnjë skedar i përzgjedhur...', + ], + +]; diff --git a/resources/lang/sq-AL/header.php b/resources/lang/sq-AL/header.php new file mode 100755 index 0000000..6dd440e --- /dev/null +++ b/resources/lang/sq-AL/header.php @@ -0,0 +1,15 @@ + 'Ndrysho Gjuhen', + 'last_login' => 'Identifikimi i fundit :time', + 'notifications' => [ + 'counter' => '{0} Ju nuk keni njoftim |{1} Ju keni :count njoftim |[2,*] Ju keni :count njoftime', + 'overdue_invoices' => '{1} :count faturë e vonuar |[2,*] :count fatura të vonuara', + 'upcoming_bills' => '{1} :count faturë e ardhshme |[2,*] :count fatura të ardhshme', + 'items_stock' => '{1} :count artikulli jashtë magazinës | [2,*] :count artikuj jashtë magazinës', + 'view_all' => 'Shiko te Gjitha' + ], + +]; diff --git a/resources/lang/sq-AL/import.php b/resources/lang/sq-AL/import.php new file mode 100755 index 0000000..6ee87c6 --- /dev/null +++ b/resources/lang/sq-AL/import.php @@ -0,0 +1,9 @@ + 'Import', + 'title' => 'Import :type', + 'message' => 'Llojet e lejuara të skedarëve: XLS, XLSX. Ju lutemi, shkarko skedarin shembull.', + +]; diff --git a/resources/lang/sq-AL/install.php b/resources/lang/sq-AL/install.php new file mode 100755 index 0000000..b216298 --- /dev/null +++ b/resources/lang/sq-AL/install.php @@ -0,0 +1,44 @@ + 'Vijues', + 'refresh' => 'Rifresko', + + 'steps' => [ + 'requirements' => 'Ju lutemi, pyesni ofruesin tuaj të hosting për të rregulluar gabimet!', + 'language' => 'Hapi 1/3: Përzgjedhja e Gjuhës', + 'database' => 'Hapi 2/3: Vendosja e Database', + 'settings' => 'Hapi 3/3: Detajet e Kompanisë dhe Adminit', + ], + + 'language' => [ + 'select' => 'Zgjidh Gjuhen', + ], + + 'requirements' => [ + 'enabled' => ':feature duhet të aktivizohet!', + 'disabled' => ':feature duhet të çaktivizohet!', + 'extension' => ':extension shtesa duhet të instalohet dhe të ngarkohet!', + 'directory' => ':directory lista duhet të jetë e shkrueshme!', + ], + + 'database' => [ + 'hostname' => 'Hostname', + 'username' => 'Emri Përdorues', + 'password' => 'Fjalëkalimi', + 'name' => 'Database', + ], + + 'settings' => [ + 'company_name' => 'Emri i Kompanisë', + 'company_email' => 'Email i Kompanisë', + 'admin_email' => 'Email i Adminit', + 'admin_password' => 'Fjalëkalimi i Adminit', + ], + + 'error' => [ + 'connection' => 'Gabim: Nuk mund të lidhej me database! Ju lutemi, sigurohuni që të dhënat janë të sakta.', + ], + +]; diff --git a/resources/lang/sq-AL/invoices.php b/resources/lang/sq-AL/invoices.php new file mode 100755 index 0000000..00b3252 --- /dev/null +++ b/resources/lang/sq-AL/invoices.php @@ -0,0 +1,55 @@ + 'Numri i faturës', + 'invoice_date' => 'Data e Faturës', + 'total_price' => 'Cmimi Total', + 'due_date' => 'Data e Duhur', + 'order_number' => 'Numri i Porosisë', + 'bill_to' => 'Faturë Për', + + 'quantity' => 'Sasia', + 'price' => 'Çmimi', + 'sub_total' => 'Nëntotali', + 'discount' => 'Skonto', + 'tax_total' => 'Tatimi Gjithsej', + 'total' => 'Totali', + + 'item_name' => 'Emri i Artikullit | Emrat e Artikullit', + + 'show_discount' => ':discount% Skonto', + 'add_discount' => 'Shto Skonto', + 'discount_desc' => 'e nëntotalit', + + 'payment_due' => 'Pagesa e Duhur', + 'paid' => 'I paguar', + 'histories' => 'Historitë', + 'payments' => 'Pagesat', + 'add_payment' => 'Shto Pagesë', + 'mark_paid' => 'Shënoje të Paguar', + 'mark_sent' => 'Shënoje të Dërguar', + 'download_pdf' => 'Shkarko PDF', + 'send_mail' => 'Dërgo Email', + + 'status' => [ + 'draft' => 'Draft', + 'sent' => 'E Dërguar', + 'viewed' => 'E Shikuar', + 'approved' => 'I Miratuar', + 'partial' => 'I pjesshëm', + 'paid' => 'I paguar', + ], + + 'messages' => [ + 'email_sent' => 'Emaili i faturës është dërguar me sukses!', + 'marked_sent' => 'Fatura shënohet si e dërguar me sukses!', + 'email_required' => 'Ska adresë e-mail për këtë klient!', + ], + + 'notification' => [ + 'message' => 'Ju po merrni këtë email sepse keni një të ardhshme :amount fature e :customer klientit.', + 'button' => 'Paguaj Tani', + ], + +]; diff --git a/resources/lang/sq-AL/items.php b/resources/lang/sq-AL/items.php new file mode 100755 index 0000000..3fe2708 --- /dev/null +++ b/resources/lang/sq-AL/items.php @@ -0,0 +1,15 @@ + 'Sasia | Sasitë', + 'sales_price' => 'Çmimi i Shitjes', + 'purchase_price' => 'Çmimi i Blerjes', + 'sku' => 'SKU', + + 'notification' => [ + 'message' => 'Ju po merrni këtë email sepse :name po mbaron.', + 'button' => 'Shiko Tani', + ], + +]; diff --git a/resources/lang/sq-AL/messages.php b/resources/lang/sq-AL/messages.php new file mode 100755 index 0000000..01fd2a6 --- /dev/null +++ b/resources/lang/sq-AL/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => ':type shtuar!', + 'updated' => ':type përditësuar!', + 'deleted' => ':type fshirë!', + 'duplicated' => ':type dubluar!', + 'imported' => ':type importuar!', + 'enabled' => ':type aktivizuar!', + 'disabled' => ':type çaktivizuar!', + ], + 'error' => [ + 'over_payment' => 'Gabim: Pagesa nuk u shtua! Shuma kalon totalin.', + 'not_user_company' => 'Gabim: Nuk ju lejohet të menaxhoni këtë kompani!', + 'customer' => 'Gabim: Përdoruesi nuk u krijua! :name tashmë përdor këtë adresë e-maili.', + 'no_file' => 'Gabim: Asnjë skedar i përzgjedhur!', + 'last_category' => 'Gabim: Nuk mund të fshihet :type kategoria e fundit!', + 'invalid_token' => 'Gabim: Marku i dhënë është i pavlefshëm!', + 'import_column' => 'Gabim: :message Fleta name: :sheet. Rreshti number: :line.', + 'import_sheet' => 'Gabim: Emri i fletës nuk është i vlefshëm. Ju lutem, kontrolloni skedarin e mostrës.', + ], + 'warning' => [ + 'deleted' => 'Njoftim: :name nuk mund të fshihet sepse ka :text të lidhur.', + 'disabled' => 'Njoftim: :name nuk mund të disable sepse ka :text të lidhur.', + ], + +]; diff --git a/resources/lang/sq-AL/modules.php b/resources/lang/sq-AL/modules.php new file mode 100755 index 0000000..1570a98 --- /dev/null +++ b/resources/lang/sq-AL/modules.php @@ -0,0 +1,58 @@ + 'Shenjë API', + 'api_token' => 'Shenjë', + 'my_apps' => 'Aplikacionet e Mia', + 'top_paid' => 'Më të paguarat', + 'new' => 'I ri', + 'top_free' => 'Më të mirët Falas', + 'free' => 'FALAS', + 'search' => 'Kërko', + 'install' => 'Instalo', + 'buy_now' => 'Bli Tani', + 'token_link' => 'Kliko këtupër të marrë shenjën tuaj API.', + 'no_apps' => 'Në këtë kategori akoma nuk ka aplikacione.', + 'developer' => 'A jeni një zhvillues?Këtu mund të mësoni si të krijoni një aplikacion dhe të filloni shitjen sot!', + + 'about' => 'Rreth nesh', + + 'added' => 'Shtuar', + 'updated' => 'Përditësuar', + 'compatibility' => 'Pajtueshmëri', + + 'installed' => ':module instaluar', + 'uninstalled' => ':module çinstaluar', + //'updated' => ':module updated', + 'enabled' => ':module i aktivizuar', + 'disabled' => ':module i çaktivizuar', + + 'tab' => [ + 'installation' => 'Instalim', + 'faq' => 'Pyetësori', + 'changelog' => 'Ndryshimet', + ], + + 'installation' => [ + 'header' => 'Instalim Aplikacioni', + 'download' => 'Shkarkimi i :module skedarit.', + 'unzip' => 'Ekstraktimi i :module skedarit.', + 'install' => 'Instalim i :module skedareve.', + ], + + 'badge' => [ + 'installed' => 'Instaluar', + ], + + 'button' => [ + 'uninstall' => 'Çinstalo', + 'disable' => 'Çaktivizo', + 'enable' => 'Aktivizo', + ], + + 'my' => [ + 'purchased' => 'Blerë', + 'installed' => 'Instaluar', + ], +]; diff --git a/resources/lang/sq-AL/notifications.php b/resources/lang/sq-AL/notifications.php new file mode 100755 index 0000000..d24a71e --- /dev/null +++ b/resources/lang/sq-AL/notifications.php @@ -0,0 +1,10 @@ + 'Oops!', + 'hello' => 'Përshëndetje!', + 'salutation' => 'Respekte,
    :company_name', + 'subcopy' => 'Nëse ke probleme duke klikuar butonin ":text", kopjoni dhe ngjisni URL më poshtë në shfletuesin tuaj të internetit: [:url](:url)', + +]; diff --git a/resources/lang/sq-AL/pagination.php b/resources/lang/sq-AL/pagination.php new file mode 100755 index 0000000..65e32d9 --- /dev/null +++ b/resources/lang/sq-AL/pagination.php @@ -0,0 +1,9 @@ + '« Prapa', + 'next' => 'Para »', + 'showing' => 'Shfaq :first për të :last i :total :type', + +]; diff --git a/resources/lang/sq-AL/passwords.php b/resources/lang/sq-AL/passwords.php new file mode 100755 index 0000000..7680187 --- /dev/null +++ b/resources/lang/sq-AL/passwords.php @@ -0,0 +1,22 @@ + 'Fjalëkalimet duhet të jenë të paktën gjashtë karaktere dhe të përputhen me konfirmimin.', + 'reset' => 'Fjalëkalimi juaj është rivendosur!', + 'sent' => 'Kemi dërguar e-mail linkun tuaj të rivendosjes së fjalëkalimit!', + 'token' => 'Ky shenjë e rivendosjes së fjalëkalimit është e pavlefshme.', + 'user' => "Ne nuk mund të gjejmë një përdorues me atë adresë e-mail.", + +]; diff --git a/resources/lang/sq-AL/recurring.php b/resources/lang/sq-AL/recurring.php new file mode 100755 index 0000000..93a46be --- /dev/null +++ b/resources/lang/sq-AL/recurring.php @@ -0,0 +1,20 @@ + 'Periodik', + 'every' => 'Çdo', + 'period' => 'Periudhë', + 'times' => 'Kohët', + 'daily' => 'Ditore', + 'weekly' => 'Javore', + 'monthly' => 'Mujore', + 'yearly' => 'Vjetore', + 'custom' => 'Special', + 'days' => 'Ditë(t)', + 'weeks' => 'Javë(t)', + 'months' => 'Muaj(t)', + 'years' => 'Vit(e)', + 'message' => 'Ky është një :type i periodik dhe :type i ardhshëm do të gjenerohet automatikisht në :date', + +]; diff --git a/resources/lang/sq-AL/reports.php b/resources/lang/sq-AL/reports.php new file mode 100755 index 0000000..660ee9f --- /dev/null +++ b/resources/lang/sq-AL/reports.php @@ -0,0 +1,30 @@ + 'Këtë Vit', + 'previous_year' => 'Viti i Kaluar', + 'this_quarter' => 'Këtë Tremujor', + 'previous_quarter' => 'Tremujor i Kaluar', + 'last_12_months' => '12 Muajt e Fundit', + 'profit_loss' => 'Fitimi & Humbje', + 'gross_profit' => 'Fitimi Bruto', + 'net_profit' => 'Fitimi Neto', + 'total_expenses' => 'Shpenzimet Totale', + 'net' => 'NETO', + + 'summary' => [ + 'income' => 'Përmbledhje e të Ardhurave', + 'expense' => 'Përmbledhje e Shpenzimeve', + 'income_expense' => 'Të Ardhurat vs Shpenzimet', + 'tax' => 'Përmbledhje e Taksave', + ], + + 'quarter' => [ + '1' => 'Jan-Mar', + '2' => 'Prill-Qer', + '3' => 'Korr-Shta', + '4' => 'Tet-Dhje', + ], + +]; diff --git a/resources/lang/sq-AL/settings.php b/resources/lang/sq-AL/settings.php new file mode 100755 index 0000000..0d07be2 --- /dev/null +++ b/resources/lang/sq-AL/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Emri', + 'email' => 'Email', + 'phone' => 'Telefoni', + 'address' => 'Adresa', + 'logo' => 'Logoja', + ], + 'localisation' => [ + 'tab' => 'Lokalizimi', + 'date' => [ + 'format' => 'Formati i Datës', + 'separator' => 'Ndarës i Datës', + 'dash' => 'Vizë (-)', + 'dot' => 'Pikë (.)', + 'comma' => 'Presje (,)', + 'slash' => 'Prerje (/)', + 'space' => 'Hapësirë ( )', + ], + 'timezone' => 'Zona Kohore', + 'percent' => [ + 'title' => 'Pozicioni Përqindja (%)', + 'before' => 'Para Numrit', + 'after' => 'Pas Numrit', + ], + ], + 'invoice' => [ + 'tab' => 'Faturë', + 'prefix' => 'Parashtesa e numrit', + 'digit' => 'Gjatësia a numrit', + 'next' => 'Numri tjetër', + 'logo' => 'Logoja', + ], + 'default' => [ + 'tab' => 'Parazgjedhjet', + 'account' => 'Llogaria e Parazgjedhur', + 'currency' => 'Valuta e Parazgjedhur', + 'tax' => 'Norma Tatimore e Parazgjedhur', + 'payment' => 'Metoda e Pagesës e Parazgjedhur', + 'language' => 'Gjuha e Parazgjedhur', + ], + 'email' => [ + 'protocol' => 'Protokolli', + 'php' => 'PHP Email', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP Host', + 'port' => 'SMTP Port', + 'username' => 'Emri i Përdorimit SMTP', + 'password' => 'Fjalëkalimi i SMTP', + 'encryption' => 'Siguria SMTP', + 'none' => 'Asnjë', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Sendmail Path', + 'log' => 'Logo Emailet', + ], + 'scheduling' => [ + 'tab' => 'Planifikimi', + 'send_invoice' => 'Dërgo Faturën Rikujtimor', + 'invoice_days' => 'Dërgo Pas Ditëve të Duhura', + 'send_bill' => 'Dërgo Faturën Rikujtimor', + 'bill_days' => 'Dërgo Para Ditëve të Duhura', + 'cron_command' => 'Komanda Cron', + 'schedule_time' => 'Ora për të Kandiduar', + ], + 'appearance' => [ + 'tab' => 'Pamja', + 'theme' => 'Tema', + 'light' => 'E Çelur', + 'dark' => 'E Errët', + 'list_limit' => 'Regjistrimet Në Faqe', + 'use_gravatar' => 'Përdorni Gravatar', + ], + 'system' => [ + 'tab' => 'Sistemi', + 'session' => [ + 'lifetime' => 'Jetëgjatësia e Sesionit (Minuta)', + 'handler' => 'Menaxheri i Sesionit', + 'file' => 'Skedar', + 'database' => 'Database', + ], + 'file_size' => 'Madhësia e Skedarit Maksimal (MB)', + 'file_types' => 'Llojet Skedare të Lejuara', + ], + +]; diff --git a/resources/lang/sq-AL/taxes.php b/resources/lang/sq-AL/taxes.php new file mode 100755 index 0000000..c09d9bc --- /dev/null +++ b/resources/lang/sq-AL/taxes.php @@ -0,0 +1,8 @@ + 'Normë', + 'rate_percent' => 'Normë (%)', + +]; diff --git a/resources/lang/sq-AL/transfers.php b/resources/lang/sq-AL/transfers.php new file mode 100755 index 0000000..3004a63 --- /dev/null +++ b/resources/lang/sq-AL/transfers.php @@ -0,0 +1,12 @@ + 'Nga Llogaria', + 'to_account' => 'Në Llogarinë', + + 'messages' => [ + 'delete' => ':from për të :to (:amount)', + ], + +]; diff --git a/resources/lang/sq-AL/updates.php b/resources/lang/sq-AL/updates.php new file mode 100755 index 0000000..2f9654d --- /dev/null +++ b/resources/lang/sq-AL/updates.php @@ -0,0 +1,15 @@ + 'Version i Instaluar', + 'latest_version' => 'Versioni i Fundit', + 'update' => 'Përditëso Akaunting në versionin :version', + 'changelog' => 'Ndryshimet', + 'check' => 'Kontrollo', + 'new_core' => 'Është në dispozicion një version i përditësuar i Akaunting.', + 'latest_core' => 'Urime! Ju keni versionin më të fundit të Akaunting. Përditësimet e ardhshme të sigurisë do të zbatohen automatikisht.', + 'success' => 'Procesi i përditësimit është përfunduar me sukses.', + 'error' => 'Procesi i përditësimit ka dështuar, ju lutemi, provo përsëri.', + +]; diff --git a/resources/lang/sq-AL/validation.php b/resources/lang/sq-AL/validation.php new file mode 100755 index 0000000..d6a5d0e --- /dev/null +++ b/resources/lang/sq-AL/validation.php @@ -0,0 +1,120 @@ + ':attribute duhet të pranohet.', + 'active_url' => ':attribute nuk është adresë e saktë.', + 'after' => ':attribute duhet të jetë datë pas :date.', + 'after_or_equal' => ':attribute duhet të jetë një datë pas ose e barabartë me :date.', + 'alpha' => ':attribute mund të përmbajë vetëm shkronja.', + 'alpha_dash' => ':attribute mund të përmbajë vetëm shkronja, numra, dhe viza.', + 'alpha_num' => ':attribute mund të përmbajë vetëm shkronja dhe numra.', + 'array' => ':attribute duhet të jetë një bashkësi (array).', + 'before' => ':attribute duhet të jetë datë para :date.', + 'before_or_equal' => ':attribute duhet të jetë një datë përpara ose e barabartë me :date.', + 'between' => [ + 'numeric' => ':attribute duhet të jetë midis :min - :max.', + 'file' => ':attribute duhet të jetë midis :min - :max kilobajtëve.', + 'string' => ':attribute duhet të jetë midis :min - :max karaktereve.', + 'array' => ':attribute duhet të jetë midis :min - :max elementëve.', + ], + 'boolean' => 'Fusha :attribute duhet të jetë e vërtetë ose e gabuar', + 'confirmed' => ':attribute konfirmimi nuk përputhet.', + 'date' => ':attribute nuk është një datë e saktë.', + 'date_format' => ':attribute nuk i përshtatet formatit :format.', + 'different' => ':attribute dhe :other duhet të jenë të ndryshme.', + 'digits' => ':attribute duhet të jetë :digits shifra.', + 'digits_between' => ':attribute duhet të jetë midis :min dhe :max shifra.', + 'dimensions' => ':attribute ka dimensione të pavlefshme imazhi.', + 'distinct' => ':attribute fusha ka një vlerë të dyfishtë.', + 'email' => ':attribute formati është i pasaktë.', + 'exists' => ':attribute përzgjedhur është i/e pasaktë.', + 'file' => ':attribute duhet të jetë një skedar.', + 'filled' => 'Fusha :attribute është e kërkuar.', + 'image' => ':attribute duhet të jetë imazh.', + 'in' => ':attribute përzgjedhur është i/e pasaktë.', + 'in_array' => ':attribute fusha nuk ekziston në :other.', + 'integer' => ':attribute duhet të jetë numër i plotë.', + 'ip' => ':attribute duhet të jetë një IP adresë e saktë.', + 'json' => ':attribute duhet të jetë një varg JSON i vlefshëm.', + 'max' => [ + 'numeric' => ':attribute nuk mund të jetë më tepër se :max.', + 'file' => ':attribute nuk mund të jetë më tepër se :max kilobajtë.', + 'string' => ':attribute nuk mund të jetë më tepër se :max karaktere.', + 'array' => ':attribute nuk mund të ketë më tepër se :max elemente.', + ], + 'mimes' => ':attribute duhet të jetë një dokument i tipit: :values.', + 'mimetypes' => ':attribute duhet të jetë një dokument i tipit: :values.', + 'min' => [ + 'numeric' => ':attribute nuk mund të jetë më pak se :min.', + 'file' => ':attribute nuk mund të jetë më pak se :min kilobajtë.', + 'string' => ':attribute nuk mund të jetë më pak se :min karaktere.', + 'array' => ':attribute nuk mund të ketë më pak se :min elemente.', + ], + 'not_in' => ':attribute përzgjedhur është i/e pasaktë.', + 'numeric' => ':attribute duhet të jetë një numër.', + 'present' => ':attribute fusha duhet të jetë e pranishme.', + 'regex' => 'Formati i :attribute është i pasaktë.', + 'required' => 'Fusha :attribute është e kërkuar.', + 'required_if' => 'Fusha :attribute është e kërkuar kur :other është :value.', + 'required_unless' => ':attribute fusha është e nevojshme në mos :other është në :values.', + 'required_with' => 'Fusha :attribute është e kërkuar kur :values ekziston.', + 'required_with_all' => 'Fusha :attribute është e kërkuar kur :values ekziston.', + 'required_without' => 'Fusha :attribute është e kërkuar kur :values nuk ekziston.', + 'required_without_all' => 'Fusha :attribute është e kërkuar kur nuk ekziston asnjë nga :values.', + 'same' => ':attribute dhe :other duhet të përputhen.', + 'size' => [ + 'numeric' => ':attribute duhet të jetë :size.', + 'file' => ':attribute duhet të jetë :size kilobajtë.', + 'string' => ':attribute duhet të jetë :size karaktere.', + 'array' => ':attribute duhet të ketë :size elemente.', + ], + 'string' => ':attribute duhet të jetë varg.', + 'timezone' => ':attribute duhet të jetë zonë e saktë.', + 'unique' => ':attribute është marrë tashmë.', + 'uploaded' => ':attribute dështoi të ngarkohet.', + 'url' => 'Formati i :attribute është i pasaktë.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'Mesazh Privat', + ], + 'invalid_currency' => 'Kodi :attribute është i pavlefshëm.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/sv-SE/accounts.php b/resources/lang/sv-SE/accounts.php new file mode 100755 index 0000000..f41ec4b --- /dev/null +++ b/resources/lang/sv-SE/accounts.php @@ -0,0 +1,14 @@ + 'Kontonamn', + 'number' => 'Nummer', + 'opening_balance' => 'Ingående balans', + 'current_balance' => 'Aktuellt saldo', + 'bank_name' => 'Bankens namn', + 'bank_phone' => 'Bankens telefon', + 'bank_address' => 'Bankens adress', + 'default_account' => 'Huvudsakligt Konto', + +]; diff --git a/resources/lang/sv-SE/auth.php b/resources/lang/sv-SE/auth.php new file mode 100755 index 0000000..4d9b589 --- /dev/null +++ b/resources/lang/sv-SE/auth.php @@ -0,0 +1,30 @@ + 'Profil', + 'logout' => 'Logga ut', + 'login' => 'Logga in', + 'login_to' => 'Logga in för att starta din session', + 'remember_me' => 'Kom ihåg mig', + 'forgot_password' => 'Jag har glömt mitt lösenord', + 'reset_password' => 'Återställ lösenord', + 'enter_email' => 'Ange din e-postadress', + 'current_email' => 'Aktuella e-post', + 'reset' => 'Återställ', + 'never' => 'aldrig', + 'password' => [ + 'current' => 'Lösenord', + 'current_confirm' => 'Bekräfta lösenord', + 'new' => 'Nytt lösenord', + 'new_confirm' => 'Ny lösenords bekräftelse', + ], + 'error' => [ + 'self_delete' => 'Fel: Kan inte ta bort dig själv!' + ], + + 'failed' => 'Dessa uppgifter stämmer inte överens med vårt register.', + 'disabled' => 'Detta konto är inaktiverat. Kontakta systemadministratören.', + 'throttle' => 'För många inloggningsförsök. Var vänlig försök igen om :seconds sekunder.', + +]; diff --git a/resources/lang/sv-SE/bills.php b/resources/lang/sv-SE/bills.php new file mode 100755 index 0000000..b9d1927 --- /dev/null +++ b/resources/lang/sv-SE/bills.php @@ -0,0 +1,46 @@ + 'Fakturanummer', + 'bill_date' => 'Fakturadatum', + 'total_price' => 'Summa pris', + 'due_date' => 'Förfallodatum', + 'order_number' => 'Ordernummer', + 'bill_from' => 'Faktura från', + + 'quantity' => 'Antal', + 'price' => 'Pris', + 'sub_total' => 'Delsumma', + 'discount' => 'Rabatt', + 'tax_total' => 'Summa moms', + 'total' => 'Summa', + + 'item_name' => 'Artikelnamn | Artikelnamn', + + 'show_discount' => ':discount % Rabatt', + 'add_discount' => 'Lägg till rabatt', + 'discount_desc' => 'av delsumman', + + 'payment_due' => 'Betalning', + 'amount_due' => 'Fordran', + 'paid' => 'Betald', + 'histories' => 'Historia', + 'payments' => 'Betalningar', + 'add_payment' => 'Lägg till betalning', + 'mark_received' => 'Markerad som mottagen', + 'download_pdf' => 'Ladda ner PDF', + 'send_mail' => 'Skicka E-post', + + 'status' => [ + 'draft' => 'Utkast', + 'received' => 'Mottagen', + 'partial' => 'Delvis', + 'paid' => 'Betald', + ], + + 'messages' => [ + 'received' => 'Faktura markerad som mottagen!', + ], + +]; diff --git a/resources/lang/sv-SE/companies.php b/resources/lang/sv-SE/companies.php new file mode 100755 index 0000000..ba8b313 --- /dev/null +++ b/resources/lang/sv-SE/companies.php @@ -0,0 +1,13 @@ + 'Domän', + 'logo' => 'Logotyp', + 'manage' => 'Hantera företag', + 'all' => 'Alla företag', + 'error' => [ + 'delete_active' => 'Fel: Kan inte ta bort aktivt företag, var vänlig, ändra det först!', + ], + +]; diff --git a/resources/lang/sv-SE/currencies.php b/resources/lang/sv-SE/currencies.php new file mode 100755 index 0000000..f513080 --- /dev/null +++ b/resources/lang/sv-SE/currencies.php @@ -0,0 +1,19 @@ + 'Kod', + 'rate' => 'Kurs', + 'default' => 'Huvudsaklig valuta', + 'decimal_mark' => 'Decimalkomma', + 'thousands_separator' => 'Tusentals avgränsare', + 'precision' => 'Noggrannhet + ', + 'symbol' => [ + 'symbol' => 'Symbol', + 'position' => 'Symbol Position', + 'before' => 'Innan beloppet', + 'after' => 'Efter belopp', + ] + +]; diff --git a/resources/lang/sv-SE/customers.php b/resources/lang/sv-SE/customers.php new file mode 100755 index 0000000..43f7961 --- /dev/null +++ b/resources/lang/sv-SE/customers.php @@ -0,0 +1,11 @@ + 'Tillåt inloggning?', + 'user_created' => 'Användaren skapad', + + 'error' => [ + 'email' => 'e-postadressen används redan.' + ] +]; diff --git a/resources/lang/sv-SE/dashboard.php b/resources/lang/sv-SE/dashboard.php new file mode 100755 index 0000000..34e607f --- /dev/null +++ b/resources/lang/sv-SE/dashboard.php @@ -0,0 +1,24 @@ + 'Summa inkomster', + 'receivables' => 'Fordringar', + 'open_invoices' => 'Öppna fakturor', + 'overdue_invoices' => 'Förfallna fakturor', + 'total_expenses' => 'Summa kostnader', + 'payables' => 'Skulder', + 'open_bills' => 'Öppna fakturor', + 'overdue_bills' => 'Förfallna fakturor', + 'total_profit' => 'Summa vinst', + 'open_profit' => 'Öppen vinst', + 'overdue_profit' => 'Förfallen vinst', + 'cash_flow' => 'Kassaflöde', + 'no_profit_loss' => 'Ingen vinst förlust', + 'incomes_by_category' => 'Inkomster efter kategori', + 'expenses_by_category' => 'Utgifter efter kategori', + 'account_balance' => 'Konto Saldo', + 'latest_incomes' => 'Senaste inkomsterna', + 'latest_expenses' => 'Senaste Utgifterna', + +]; diff --git a/resources/lang/sv-SE/demo.php b/resources/lang/sv-SE/demo.php new file mode 100755 index 0000000..e9a3dd7 --- /dev/null +++ b/resources/lang/sv-SE/demo.php @@ -0,0 +1,17 @@ + 'Kontanter', + 'categories_uncat' => 'Okatergoriserad', + 'categories_deposit' => 'Insättning', + 'categories_sales' => 'Försäljning', + 'currencies_usd' => 'US-Dollar', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Brittiska pund', + 'currencies_try' => 'Turkiska Lira', + 'taxes_exempt' => 'Momsfria', + 'taxes_normal' => 'Normal Moms', + 'taxes_sales' => 'Moms', + +]; diff --git a/resources/lang/sv-SE/footer.php b/resources/lang/sv-SE/footer.php new file mode 100755 index 0000000..e0947c7 --- /dev/null +++ b/resources/lang/sv-SE/footer.php @@ -0,0 +1,9 @@ + 'Version', + 'powered' => 'Powered By Akaunting', + 'software' => 'Fritt bokföringsprogram', + +]; diff --git a/resources/lang/sv-SE/general.php b/resources/lang/sv-SE/general.php new file mode 100755 index 0000000..4b420e3 --- /dev/null +++ b/resources/lang/sv-SE/general.php @@ -0,0 +1,117 @@ + 'Artikel | Artiklar', + 'incomes' => 'Inkomst | Inkomster', + 'invoices' => 'Faktura | Fakturor', + 'revenues' => 'Intäkt | Intäkter', + 'customers' => 'Kund | Kunder', + 'expenses' => 'Utgift | Utgifter', + 'bills' => 'Faktura | Fakturor', + 'payments' => 'Betalning | Betalningar', + 'vendors' => 'Leverantör | Leverantörer', + 'accounts' => 'Konto | Konton', + 'transfers' => 'Överföra | Överföringar', + 'transactions' => 'Transaktion | Transaktioner', + 'reports' => 'Rapport | Rapporter', + 'settings' => 'Inställning | Inställningar', + 'categories' => 'Kategori | Kategorier', + 'currencies' => 'Valuta | Valutor', + 'tax_rates' => 'Momssats | Momssatser', + 'users' => 'Användare | Användare', + 'roles' => 'Roll | Roller', + 'permissions' => 'Behörighet | Behörigheter', + 'modules' => 'App | Appar', + 'companies' => 'Företag | Företag', + 'profits' => 'Vinst | Vinster', + 'taxes' => 'Moms | Moms', + 'logos' => 'Logotyp | Logotyper', + 'pictures' => 'Bild | Bilder', + 'types' => 'Typ | Typer', + 'payment_methods' => 'Betalningsmetod | Betalningsmetoder', + 'compares' => 'Inkomst mot Utgift | Inkomster mot Utgifter', + 'notes' => 'Anteckning | Anteckningar', + 'totals' => 'Summa | Summor', + 'languages' => 'Språk | Språk', + 'updates' => 'Uppdatering | Uppdateringar', + 'numbers' => 'Siffra | Siffror', + 'statuses' => 'Status | Statusar', + 'others' => 'Andra | Andra', + + 'dashboard' => 'Översikt', + 'banking' => 'Banktjänster', + 'general' => 'Generell', + 'no_records' => 'Inga poster.', + 'date' => 'Datum', + 'amount' => 'Belopp', + 'enabled' => 'Aktiverad', + 'disabled' => 'Inaktiverad', + 'yes' => 'Ja', + 'no' => 'Nej', + 'na' => 'Ej tillgängligt', + 'daily' => 'Dagligen', + 'monthly' => 'Månadsvis', + 'quarterly' => 'Kvartalsvis', + 'yearly' => 'Årligen', + 'add' => 'Lägg till', + 'add_new' => 'Lägg till ny', + 'show' => 'Visa', + 'edit' => 'Redigera', + 'delete' => 'Ta bort', + 'send' => 'Skicka', + 'download' => 'Ladda ner', + 'delete_confirm' => 'Bekräfta ta bort :name :type?', + 'name' => 'Namn', + 'email' => 'E-post', + 'tax_number' => 'Skattenummer', + 'phone' => 'Telefon', + 'address' => 'Adress', + 'website' => 'Webbplats', + 'actions' => 'Åtgärder', + 'description' => 'Beskrivning', + 'manage' => 'Hantera', + 'code' => 'Kod', + 'alias' => 'Alias', + 'balance' => 'Saldon', + 'reference' => 'Referens', + 'attachment' => 'Bilaga', + 'change' => 'Förändra', + 'switch' => 'Växla', + 'color' => 'Färg', + 'save' => 'Spara', + 'cancel' => 'Avbryt', + 'from' => 'Från', + 'to' => 'Till', + 'print' => 'Skriv ut', + 'search' => 'Sök', + 'search_placeholder' => 'Skriv för att söka..', + 'filter' => 'Filter', + 'help' => 'Help', + 'all' => 'Alla', + 'all_type' => 'Alla :type', + 'upcoming' => 'Kommande', + 'created' => 'Skapad', + 'id' => 'ID', + 'more_actions' => 'Fler åtgärder', + 'duplicate' => 'Duplicera', + 'unpaid' => 'Obetald', + 'paid' => 'Betald', + 'overdue' => 'Förfallen', + 'partially' => 'Delvis', + 'partially_paid' => 'Delvis betalat', + + 'title' => [ + 'new' => 'Nytt :type', + 'edit' => 'Redigera :type', + ], + 'form' => [ + 'enter' => 'Ange :field', + 'select' => [ + 'field' => '-Välj :field -', + 'file' => 'Välj fil', + ], + 'no_file_selected' => 'Ingen fil är vald...', + ], + +]; diff --git a/resources/lang/sv-SE/header.php b/resources/lang/sv-SE/header.php new file mode 100755 index 0000000..28c2ab2 --- /dev/null +++ b/resources/lang/sv-SE/header.php @@ -0,0 +1,15 @@ + 'Ändra språk', + 'last_login' => 'Senaste inloggningen :time', + 'notifications' => [ + 'counter' => '{0} Du har inga notifikationer|{1} Du har :count notifikationer|[2,*] Du har :count notifikationer', + 'overdue_invoices' => '{1} :count förfallna fakturor|[2,*] :count förfallna fakturor', + 'upcoming_bills' => '{1} :count kommande räkning|[2,*] :count kommande räkningar', + 'items_stock' => '{1} :count objekt i lager | [2 *]:count objekt i lager', + 'view_all' => 'Visa alla' + ], + +]; diff --git a/resources/lang/sv-SE/import.php b/resources/lang/sv-SE/import.php new file mode 100755 index 0000000..b1b5b5b --- /dev/null +++ b/resources/lang/sv-SE/import.php @@ -0,0 +1,9 @@ + 'Importera', + 'title' => 'Importera :type', + 'message' => 'Tillåtna filtyper: CSV, XLS. var vänlig, Hämta exempelfilen.', + +]; diff --git a/resources/lang/sv-SE/install.php b/resources/lang/sv-SE/install.php new file mode 100755 index 0000000..cdee3e8 --- /dev/null +++ b/resources/lang/sv-SE/install.php @@ -0,0 +1,44 @@ + 'Nästa', + 'refresh' => 'Uppdatera', + + 'steps' => [ + 'requirements' => 'Vänligen, uppfyll följande krav!', + 'language' => 'Steg 1/3: Språkval', + 'database' => 'Steg 2/3: Databasinställningar', + 'settings' => 'Steg 3/3: Företag och Admin uppgifter', + ], + + 'language' => [ + 'select' => 'Välj språk', + ], + + 'requirements' => [ + 'enabled' => ':feature måste vara aktiverad!', + 'disabled' => ':feature måste inaktiveras!', + 'extension' => ':extension tillägget måste laddas!', + 'directory' => ':directory katalogen måste vara skrivbar!', + ], + + 'database' => [ + 'hostname' => 'Hostnamn', + 'username' => 'Användarnamn', + 'password' => 'Lösenord', + 'name' => 'Databas', + ], + + 'settings' => [ + 'company_name' => 'Företagets namn', + 'company_email' => 'Företagets e-post', + 'admin_email' => 'Admin e-postadress', + 'admin_password' => 'Admin lösenord', + ], + + 'error' => [ + 'connection' => 'Fel: Kunde inte ansluta till databasen! Snälla, se till att uppgifterna stämmer.', + ], + +]; diff --git a/resources/lang/sv-SE/invoices.php b/resources/lang/sv-SE/invoices.php new file mode 100755 index 0000000..5703aed --- /dev/null +++ b/resources/lang/sv-SE/invoices.php @@ -0,0 +1,55 @@ + 'Fakturanummer', + 'invoice_date' => 'Fakturadatum', + 'total_price' => 'Summa pris', + 'due_date' => 'Förfallodatum', + 'order_number' => 'Ordernummer', + 'bill_to' => 'Fakturera till', + + 'quantity' => 'Antal', + 'price' => 'Pris', + 'sub_total' => 'Delsumma', + 'discount' => 'Rabatt', + 'tax_total' => 'Summa Skatt', + 'total' => 'Totalt', + + 'item_name' => 'Artikelnamn | Artikelnamn', + + 'show_discount' => ':discount % Rabatt', + 'add_discount' => 'Lägg till rabatt', + 'discount_desc' => 'av delsumman', + + 'payment_due' => 'Betalning', + 'paid' => 'Betald', + 'histories' => 'Historia', + 'payments' => 'Betalningar', + 'add_payment' => 'Lägg till betalning', + 'mark_paid' => 'Markera som betald', + 'mark_sent' => 'Markera som skickad', + 'download_pdf' => 'Ladda ner PDF', + 'send_mail' => 'Skicka E-post', + + 'status' => [ + 'draft' => 'Utkast', + 'sent' => 'Skickat', + 'viewed' => 'Visad', + 'approved' => 'Godkänd', + 'partial' => 'Delvis', + 'paid' => 'Betald', + ], + + 'messages' => [ + 'email_sent' => 'Faktura e-postmeddelandet har skickats!', + 'marked_sent' => 'Faktura e-postmeddelandet har skickats!', + 'email_required' => 'Ingen e-postadress för den här kunden!', + ], + + 'notification' => [ + 'message' => 'Du får detta mail eftersom du har en kommande :amount faktura till :customer kunden.', + 'button' => 'Betala nu', + ], + +]; diff --git a/resources/lang/sv-SE/items.php b/resources/lang/sv-SE/items.php new file mode 100755 index 0000000..1537b83 --- /dev/null +++ b/resources/lang/sv-SE/items.php @@ -0,0 +1,15 @@ + 'Kvantitet | Kvantiteter', + 'sales_price' => 'Försäljningspris', + 'purchase_price' => 'Inköpspris', + 'sku' => 'Artikelnummer', + + 'notification' => [ + 'message' => 'Du får detta mail eftersom :name är slut på lagret.', + 'button' => 'Visa nu', + ], + +]; diff --git a/resources/lang/sv-SE/messages.php b/resources/lang/sv-SE/messages.php new file mode 100755 index 0000000..390212e --- /dev/null +++ b/resources/lang/sv-SE/messages.php @@ -0,0 +1,25 @@ + [ + 'added' => ':type tillagt!', + 'updated' => ':type uppdaterad!', + 'deleted' => ':type bortagen!', + 'duplicated' => ':type dubbelpost!', + 'imported' => ':type uppdaterad!', + ], + 'error' => [ + 'over_payment' => 'Fel: Betalning inte tillagd! Belopp överskrider totalen.', + 'not_user_company' => 'Fel: Du får inte hantera detta företag!', + 'customer' => 'Fel: Användaren inte skapad! :name använder redan denna e-postadress.', + 'no_file' => 'Fel: Ingen fil har valts!', + 'last_category' => 'Fel: Kan inte ta bort sista :type kategorin!', + 'invalid_token' => 'Fel: Den symbolen som angetts är ogiltigt!', + ], + 'warning' => [ + 'deleted' => 'Varning: Du får inte ta bort :name eftersom den har :text relaterade.', + 'disabled' => 'Varning: Du får inte inaktivera :name eftersom den har :text relaterat.', + ], + +]; diff --git a/resources/lang/sv-SE/modules.php b/resources/lang/sv-SE/modules.php new file mode 100755 index 0000000..7af0cf3 --- /dev/null +++ b/resources/lang/sv-SE/modules.php @@ -0,0 +1,48 @@ + 'API-Token', + 'api_token' => 'Token', + 'top_paid' => 'Bästa betal', + 'new' => 'Nytt', + 'top_free' => 'Bästa gratis', + 'free' => 'Fri', + 'search' => 'Sök', + 'install' => 'Installera', + 'buy_now' => 'Köp nu', + 'token_link' => 'Klicka här att få din API-token.', + 'no_apps' => 'Det finns inga appar i den här kategorin ännu.', + 'developer' => 'Är du en utvecklare? här du kan lära dig hur du skapar en app och börja sälja idag!', + + 'about' => 'Om', + + 'added' => 'Tillagd', + 'updated' => 'Uppdaterad', + 'compatibility' => 'Kompatibilitet', + + 'installed' => ':module installerad', + 'uninstalled' => ':module avinstallerad', + //'updated' => ':module updated', + 'enabled' => ':module aktiverad', + 'disabled' => ':module inaktiverad', + + 'tab' => [ + 'installation' => 'Installation', + 'faq' => 'Vanliga frågor', + 'changelog' => 'Ändringslog', + ], + + 'installation' => [ + 'header' => 'App-Installation', + 'download' => 'Laddar ner :module fil.', + 'unzip' => 'Packar upp :module filer.', + 'install' => 'Installerar :module filer.', + ], + + 'button' => [ + 'uninstall' => 'Avinstallera', + 'disable' => 'Inaktivera', + 'enable' => 'Aktivera', + ], +]; diff --git a/resources/lang/sv-SE/pagination.php b/resources/lang/sv-SE/pagination.php new file mode 100755 index 0000000..142caba --- /dev/null +++ b/resources/lang/sv-SE/pagination.php @@ -0,0 +1,9 @@ + '« Föregående', + 'next' => 'Nästa »', + 'showing' => 'Visar :first till :last av :total :type', + +]; diff --git a/resources/lang/sv-SE/passwords.php b/resources/lang/sv-SE/passwords.php new file mode 100755 index 0000000..384caad --- /dev/null +++ b/resources/lang/sv-SE/passwords.php @@ -0,0 +1,22 @@ + 'Lösenord måste innehålla minst sex tecken och matcha varandra.', + 'reset' => 'Lösenordet har blivit återställt!', + 'sent' => 'Lösenordspåminnelse skickad!', + 'token' => 'Koden för lösenordsåterställning är ogiltig.', + 'user' => "Det finns ingen användare med den e-postadressen.", + +]; diff --git a/resources/lang/sv-SE/recurring.php b/resources/lang/sv-SE/recurring.php new file mode 100755 index 0000000..0dbd6e0 --- /dev/null +++ b/resources/lang/sv-SE/recurring.php @@ -0,0 +1,20 @@ + 'Återkommande', + 'every' => 'Varje', + 'period' => 'Period', + 'times' => 'Gånger', + 'daily' => 'Dagligen', + 'weekly' => 'Veckovis', + 'monthly' => 'Månadsvis', + 'yearly' => 'Årligen', + 'custom' => 'Anpassa', + 'days' => 'Dag(ar)', + 'weeks' => 'Vecka(or)', + 'months' => 'Månad(er)', + 'years' => 'År', + 'message' => 'Detta är ett återkommande :type och nästa :type genereras automatiskt den :date', + +]; diff --git a/resources/lang/sv-SE/reports.php b/resources/lang/sv-SE/reports.php new file mode 100755 index 0000000..475bd2f --- /dev/null +++ b/resources/lang/sv-SE/reports.php @@ -0,0 +1,30 @@ + 'Årets', + 'previous_year' => 'Föregående år', + 'this_quarter' => 'Detta kvartal', + 'previous_quarter' => 'Föregående kvartal', + 'last_12_months' => 'Senaste 12 månaderna', + 'profit_loss' => 'Vinst & förlust', + 'gross_profit' => 'Bruttovinst', + 'net_profit' => 'Nettoförtjänst', + 'total_expenses' => 'Summa kostnader', + 'net' => 'Netto', + + 'summary' => [ + 'income' => 'Inkomstrapport', + 'expense' => 'Utgiftsrapports', + 'income_expense' => 'Inkomst mot Utgifter', + 'tax' => 'Skatt Sammanfattning', + ], + + 'quarter' => [ + '1' => 'Jan-Mar', + '2' => 'Apr-Jun', + '3' => 'Jul-Sep', + '4' => 'Okt-Dec', + ], + +]; diff --git a/resources/lang/sv-SE/settings.php b/resources/lang/sv-SE/settings.php new file mode 100755 index 0000000..d0bce18 --- /dev/null +++ b/resources/lang/sv-SE/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Namn', + 'email' => 'E-post', + 'phone' => 'Telefon', + 'address' => 'Adress', + 'logo' => 'Logotyp', + ], + 'localisation' => [ + 'tab' => 'Plats', + 'date' => [ + 'format' => 'Datumformat', + 'separator' => 'Datumavgränsare', + 'dash' => 'Bindestreck (-)', + 'dot' => 'Punkt (.)', + 'comma' => 'Kommatecken ()', + 'slash' => 'Snedstreck (/)', + 'space' => 'Mellanslag ( )', + ], + 'timezone' => 'Tidszon', + 'percent' => [ + 'title' => 'Procent (%) Ställning', + 'before' => 'Innan nummret', + 'after' => 'Efter nummret', + ], + ], + 'invoice' => [ + 'tab' => 'Faktura', + 'prefix' => 'Nummerprefix', + 'digit' => 'Siffra', + 'next' => 'Nästa nummer', + 'logo' => 'Logotyp', + ], + 'default' => [ + 'tab' => 'Huvudsakligt', + 'account' => 'Huvudsakligt Konto', + 'currency' => 'Huvudsaklig valuta', + 'tax' => 'Huvudsaklig skattesats', + 'payment' => 'Huvudsaklig betalningsmetod', + 'language' => 'Huvudspråk', + ], + 'email' => [ + 'protocol' => 'Protokoll', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP Server', + 'port' => 'SMTP Port', + 'username' => 'SMTP Användarnamn', + 'password' => 'SMTP Lösenord', + 'encryption' => 'SMTP Säkerhet', + 'none' => 'Ingen', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Sökväg för Sendmail', + 'log' => 'Logga e-post', + ], + 'scheduling' => [ + 'tab' => 'Schemaläggning', + 'send_invoice' => 'Skicka faktura påminnelse', + 'invoice_days' => 'Skicka efter förfallodagar', + 'send_bill' => 'Skicka faktura påminnelse', + 'bill_days' => 'Skicka innan förfallodatum', + 'cron_command' => 'Cron Kommando', + 'schedule_time' => 'Tid att köra', + ], + 'appearance' => [ + 'tab' => 'Utseende', + 'theme' => 'Tema', + 'light' => 'Ljust', + 'dark' => 'Mörkt', + 'list_limit' => 'Poster Per sida', + 'use_gravatar' => 'Använda Gravatar', + ], + 'system' => [ + 'tab' => 'System', + 'session' => [ + 'lifetime' => 'Session-livstid (minuter)', + 'handler' => 'Sessionshanterare', + 'file' => 'Fil', + 'database' => 'Databas', + ], + 'file_size' => 'Max filstorlek (MB)', + 'file_types' => 'Tillåtna filtyper', + ], + +]; diff --git a/resources/lang/sv-SE/taxes.php b/resources/lang/sv-SE/taxes.php new file mode 100755 index 0000000..091286c --- /dev/null +++ b/resources/lang/sv-SE/taxes.php @@ -0,0 +1,8 @@ + 'Kurs', + 'rate_percent' => 'Momssatts (%)', + +]; diff --git a/resources/lang/sv-SE/transfers.php b/resources/lang/sv-SE/transfers.php new file mode 100755 index 0000000..4bb8f4b --- /dev/null +++ b/resources/lang/sv-SE/transfers.php @@ -0,0 +1,8 @@ + 'Från konto', + 'to_account' => 'Till konto', + +]; diff --git a/resources/lang/sv-SE/updates.php b/resources/lang/sv-SE/updates.php new file mode 100755 index 0000000..cd62e86 --- /dev/null +++ b/resources/lang/sv-SE/updates.php @@ -0,0 +1,15 @@ + 'Installerad version', + 'latest_version' => 'Senaste versionen', + 'update' => 'Uppdatera Akaunting till version :version', + 'changelog' => 'Ändringslog', + 'check' => 'Markera', + 'new_core' => 'Det finns en uppdaterad version av Akaunting.', + 'latest_core' => 'Grattis! Du har den senaste versionen av Akaunting. Framtida säkerhetsuppdateringar kommer att tillämpas automatiskt.', + 'success' => 'Uppdateringen har fullföljts.', + 'error' => 'Uppdateringen har misslyckats, var vänlig, försök igen.', + +]; diff --git a/resources/lang/sv-SE/validation.php b/resources/lang/sv-SE/validation.php new file mode 100755 index 0000000..bc433a5 --- /dev/null +++ b/resources/lang/sv-SE/validation.php @@ -0,0 +1,119 @@ + ':attribute måste accepteras.', + 'active_url' => ':attribute är inte en giltig webbadress.', + 'after' => ':attribute måste vara ett datum efter den :date.', + 'after_or_equal' => ':attribute måste vara ett datum senare eller samma dag som :date.', + 'alpha' => ':attribute får endast innehålla bokstäver.', + 'alpha_dash' => ':attribute får endast innehålla bokstäver, siffror och bindestreck.', + 'alpha_num' => ':attribute får endast innehålla bokstäver och siffror.', + 'array' => ':attribute måste vara en array.', + 'before' => ':attribute måste vara ett datum innan den :date.', + 'before_or_equal' => ':attribute måste vara ett datum före eller samma dag som :date.', + 'between' => [ + 'numeric' => ':attribute måste vara en siffra mellan :min och :max.', + 'file' => ':attribute måste vara mellan :min till :max kilobyte stor.', + 'string' => ':attribute måste innehålla :min till :max tecken.', + 'array' => ':attribute måste innehålla mellan :min - :max objekt.', + ], + 'boolean' => ':attribute måste vara sant eller falskt.', + 'confirmed' => ':attribute bekräftelsen matchar inte.', + 'date' => ':attribute är inte ett giltigt datum.', + 'date_format' => ':attribute matchar inte formatet :format.', + 'different' => ':attribute och :other får inte vara lika.', + 'digits' => ':attribute måste vara :digits tecken.', + 'digits_between' => ':attribute måste vara mellan :min och :max tecken.', + 'dimensions' => ':attribute har felaktiga bilddimensioner.', + 'distinct' => ':attribute innehåller fler än en repetition av samma element.', + 'email' => ':attribute måste innehålla en korrekt e-postadress.', + 'exists' => ':attribute är ogiltigt.', + 'file' => ':attribute måste vara en fil.', + 'filled' => ':attribute är obligatoriskt.', + 'image' => ':attribute måste vara en bild.', + 'in' => ':attribute är ogiltigt.', + 'in_array' => ':attribute finns inte i :other.', + 'integer' => ':attribute måste vara en siffra.', + 'ip' => ':attribute måste vara en giltig IP-adress.', + 'json' => ':attribute måste vara en giltig JSON-sträng.', + 'max' => [ + 'numeric' => ':attribute får inte vara större än :max.', + 'file' => ':attribute får max vara :max kilobyte stor.', + 'string' => ':attribute får max innehålla :max tecken.', + 'array' => ':attribute får inte innehålla mer än :max objekt.', + ], + 'mimes' => ':attribute måste vara en fil av typen: :values.', + 'mimetypes' => ':attribute måste vara en fil av typen: :values.', + 'min' => [ + 'numeric' => ':attribute måste vara större än :min.', + 'file' => ':attribute måste vara minst :min kilobyte stor.', + 'string' => ':attribute måste innehålla minst :min tecken.', + 'array' => ':attribute måste innehålla minst :min objekt.', + ], + 'not_in' => ':attribute är ogiltigt.', + 'numeric' => ':attribute måste vara en siffra.', + 'present' => ':attribute måste finnas med.', + 'regex' => ':attribute har ogiltigt format.', + 'required' => ':attribute är obligatoriskt.', + 'required_if' => ':attribute är obligatoriskt när :other är :value.', + 'required_unless' => ':attribute är obligatoriskt när inte :other finns bland :values.', + 'required_with' => ':attribute är obligatoriskt när :values är ifyllt.', + 'required_with_all' => ':attribute är obligatoriskt när :values är ifyllt.', + 'required_without' => ':attribute är obligatoriskt när :values ej är ifyllt.', + 'required_without_all' => ':attribute är obligatoriskt när ingen av :values är ifyllt.', + 'same' => ':attribute och :other måste vara lika.', + 'size' => [ + 'numeric' => ':attribute måste vara :size.', + 'file' => ':attribute får endast vara :size kilobyte stor.', + 'string' => ':attribute måste innehålla :size tecken.', + 'array' => ':attribute måste innehålla :size objekt.', + ], + 'string' => ':attribute måste vara en sträng.', + 'timezone' => ':attribute måste vara en giltig tidszon.', + 'unique' => ':attribute används redan.', + 'uploaded' => ':attribute kunde inte laddas upp.', + 'url' => ':attribute har ett ogiltigt format.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'anpassat-meddelande', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/th-TH/accounts.php b/resources/lang/th-TH/accounts.php new file mode 100755 index 0000000..40f6ee4 --- /dev/null +++ b/resources/lang/th-TH/accounts.php @@ -0,0 +1,14 @@ + 'ชื่อบัญชี', + 'number' => 'หมายเลข', + 'opening_balance' => 'ยอดเปิดบัญชี', + 'current_balance' => 'ยอดเงินปัจจุบัน', + 'bank_name' => 'ชื่อธนาคาร', + 'bank_phone' => 'โทรศัพท์ธนาคาร', + 'bank_address' => 'ที่อยู่ธนาคาร', + 'default_account' => 'บัญชีเริ่มต้น', + +]; diff --git a/resources/lang/th-TH/auth.php b/resources/lang/th-TH/auth.php new file mode 100755 index 0000000..f37ef7c --- /dev/null +++ b/resources/lang/th-TH/auth.php @@ -0,0 +1,30 @@ + 'ข้อมูลส่วนบุคคล', + 'logout' => 'ออกจากระบบ', + 'login' => 'เข้าสู่ระบบ', + 'login_to' => 'เข้าสู่ระบบเพื่อเริ่มต้นเซสชันของคุณ', + 'remember_me' => 'จำการเข้าสู่ระบบ', + 'forgot_password' => 'ฉันลืมรหัสผ่าน', + 'reset_password' => 'ตั้งรหัสผ่านใหม่', + 'enter_email' => 'ใส่อีเมลของคุณ', + 'current_email' => 'อีเมลปัจจุบัน', + 'reset' => 'ตั้งค่าใหม่', + 'never' => 'ไม่เคยเลย', + 'password' => [ + 'current' => 'รหัสผ่าน', + 'current_confirm' => 'การยืนยันรหัสผ่าน', + 'new' => 'รหัสผ่านใหม่', + 'new_confirm' => 'ยืนยันรหัสผ่านใหม่', + ], + 'error' => [ + 'self_delete' => 'ข้อผิดพลาด: ไม่สามารถลบด้วยตัวคุณเองได้!' + ], + + 'failed' => 'ข้อมูลที่ใช้ในการยืนยันตัวตนไม่ถูกต้อง', + 'disabled' => 'บัญชีนี้ถูกปิดใช้งาน กรุณา ติดต่อผู้ดูแลระบบ', + 'throttle' => 'คุณได้พยายามเข้าระบบหลายครั้งเกินไป กรุณาลองใหม่ใน :seconds วินาทีข้างหน้า.', + +]; diff --git a/resources/lang/th-TH/bills.php b/resources/lang/th-TH/bills.php new file mode 100755 index 0000000..9a5b573 --- /dev/null +++ b/resources/lang/th-TH/bills.php @@ -0,0 +1,46 @@ + 'หมายเลขบิล', + 'bill_date' => 'วันที่บิล', + 'total_price' => 'ราคารวม', + 'due_date' => 'วันครบกำหนด', + 'order_number' => 'หมายเลขสั่งซื้อ', + 'bill_from' => 'บิลจาก', + + 'quantity' => 'จำนวน', + 'price' => 'ราคา', + 'sub_total' => 'ยอดรวม', + 'discount' => 'ส่วนลด', + 'tax_total' => 'ยอดรวมภาษี', + 'total' => 'รวมทั้งหมด', + + 'item_name' => 'ชื่อสินค้า | ชื่อสินค้า', + + 'show_discount' => ':discount% ส่วนลด', + 'add_discount' => 'เพิ่มส่วนลด', + 'discount_desc' => 'ของยอดรวม', + + 'payment_due' => 'ครบกำหนดชำระ', + 'amount_due' => 'ยอดเงินที่ต้องชำระ', + 'paid' => 'จ่ายไป', + 'histories' => 'ประวัติ', + 'payments' => 'การชำระเงิน', + 'add_payment' => 'เพิ่มการชำระเงิน', + 'mark_received' => 'ทำเครื่องหมายได้รับแล้ว', + 'download_pdf' => 'ดาวน์โหลด PDF', + 'send_mail' => 'ส่งอีเมล', + + 'status' => [ + 'draft' => 'ฉบับร่าง', + 'received' => 'ได้รับแล้ว', + 'partial' => 'บางส่วน', + 'paid' => 'จ่ายแล้ว', + ], + + 'messages' => [ + 'received' => 'บิลทำเครื่องหมายได้รับเรียบร้อยแล้ว!', + ], + +]; diff --git a/resources/lang/th-TH/companies.php b/resources/lang/th-TH/companies.php new file mode 100755 index 0000000..ccbbfbd --- /dev/null +++ b/resources/lang/th-TH/companies.php @@ -0,0 +1,13 @@ + 'โดเมน', + 'logo' => 'โลโก้', + 'manage' => 'จัดการบริษัท', + 'all' => 'บริษัททั้งหมด', + 'error' => [ + 'delete_active' => 'ข้อผิดพลาด: ไม่สามารถลบ บริษัท ที่ใช้งานได้ กรุณา, โปรดเปลี่ยนแปลงก่อน!', + ], + +]; diff --git a/resources/lang/th-TH/currencies.php b/resources/lang/th-TH/currencies.php new file mode 100755 index 0000000..f989c41 --- /dev/null +++ b/resources/lang/th-TH/currencies.php @@ -0,0 +1,18 @@ + 'รหัส', + 'rate' => 'อัตรา', + 'default' => 'สกุลเงินเริ่มต้น', + 'decimal_mark' => 'เครื่องหมายทศนิยม', + 'thousands_separator' => 'ตัวคั่นรายการหลักพัน', + 'precision' => 'ความแม่นยำ', + 'symbol' => [ + 'symbol' => 'สัญลักษณ์', + 'position' => 'ตำแหน่งของสัญลักษณ์', + 'before' => 'ยอดเงินก่อน', + 'after' => 'ยอดเงินหลัง', + ] + +]; diff --git a/resources/lang/th-TH/customers.php b/resources/lang/th-TH/customers.php new file mode 100755 index 0000000..8d6748a --- /dev/null +++ b/resources/lang/th-TH/customers.php @@ -0,0 +1,11 @@ + 'อนุญาตให้เข้าสู่ระบบหรือไม่', + 'user_created' => 'สร้างผู้ใช้งานระบบแล้ว', + + 'error' => [ + 'email' => 'อีเมลนี้ได้ลงทะเบียนอยู่แล้ว' + ] +]; diff --git a/resources/lang/th-TH/dashboard.php b/resources/lang/th-TH/dashboard.php new file mode 100755 index 0000000..fbed870 --- /dev/null +++ b/resources/lang/th-TH/dashboard.php @@ -0,0 +1,24 @@ + 'รายได้รวม', + 'receivables' => 'ลูกหนี้', + 'open_invoices' => 'เปิดใบแจ้งหนี้', + 'overdue_invoices' => 'ใบแจ้งหนี้ที่ค้างชำระ', + 'total_expenses' => 'ค่าใช้จ่ายทั้งหมด', + 'payables' => 'เจ้าหนี้', + 'open_bills' => 'เปิดบิล', + 'overdue_bills' => 'บิลที่ค้างชำระ', + 'total_profit' => 'กำไรรวม', + 'open_profit' => 'เปิดกำไร', + 'overdue_profit' => 'กำไรที่ค้างชำระ', + 'cash_flow' => 'กระแสเงินสด', + 'no_profit_loss' => 'ไม่มีการสูญเสียกำไร', + 'incomes_by_category' => 'รายได้ตามประเภท', + 'expenses_by_category' => 'ค่าใช้จ่ายตามประเภท', + 'account_balance' => 'ยอดเงินในบัญชี', + 'latest_incomes' => 'รายได้ล่าสุด', + 'latest_expenses' => 'ค่าใช้จ่ายล่าสุด', + +]; diff --git a/resources/lang/th-TH/demo.php b/resources/lang/th-TH/demo.php new file mode 100755 index 0000000..62bfba5 --- /dev/null +++ b/resources/lang/th-TH/demo.php @@ -0,0 +1,16 @@ + 'เงินสด', + 'categories_deposit' => 'เงินฝาก', + 'categories_sales' => 'ขาย', + 'currencies_usd' => 'ดอลลาร์สหรัฐฯ', + 'currencies_eur' => 'ยูโร', + 'currencies_gbp' => 'ปอนด์ อังกฤษ', + 'currencies_try' => 'ลีรา ตุรกี', + 'taxes_exempt' => 'ยกเว้นภาษี', + 'taxes_normal' => 'ภาษีปกติ', + 'taxes_sales' => 'ภาษีการขาย', + +]; diff --git a/resources/lang/th-TH/footer.php b/resources/lang/th-TH/footer.php new file mode 100755 index 0000000..3858c19 --- /dev/null +++ b/resources/lang/th-TH/footer.php @@ -0,0 +1,9 @@ + 'เวอร์ชัน', + 'powered' => 'ขับเคลื่อน โดย Akaunting', + 'software' => 'ซอฟต์แวร์บัญชีฟรี', + +]; diff --git a/resources/lang/th-TH/general.php b/resources/lang/th-TH/general.php new file mode 100755 index 0000000..00f5d59 --- /dev/null +++ b/resources/lang/th-TH/general.php @@ -0,0 +1,117 @@ + 'รายการ | รายการ', + 'incomes' => 'รายได้ | รายได้', + 'invoices' => 'ใบแจ้งหนี้ | ใบแจ้งหนี้', + 'revenues' => 'รายได้ | รายได้', + 'customers' => 'ลูกค้า | ลูกค้า', + 'expenses' => 'ค่าใช้จ่าย | ค่าใช้จ่าย', + 'bills' => 'บิล | บิล', + 'payments' => 'ชำระเงิน | ชำระเงิน', + 'vendors' => 'ผู้จัดจำหน่าย | ผู้จัดจำหน่าย', + 'accounts' => 'บัญชี | บัญชี', + 'transfers' => 'โอน | โอน', + 'transactions' => 'ธุรกรรม | ธุรกรรม', + 'reports' => 'รายงาน | รายงาน', + 'settings' => 'การตั้งค่า | การตั้งค่า', + 'categories' => 'หมวดหมู่ | หมวดหมู่', + 'currencies' => 'สกุลเงิน | สกุลเงิน', + 'tax_rates' => 'อัตราภาษี | อัตราภาษี', + 'users' => 'ผู้ใช้งาน | ผู้ใช้งาน', + 'roles' => 'บทบาท | บทบาท', + 'permissions' => 'สิทธิ์ | สิทธิ์', + 'modules' => 'แอปพ์ | แอปพ์', + 'companies' => 'บริษัท | บริษัท', + 'profits' => 'กำไร | กำไร', + 'taxes' => 'ภาษี | ภาษี', + 'logos' => 'โลโก้ | โลโก้', + 'pictures' => 'รูปภาพ | รูปภาพ', + 'types' => 'ชนิด | ชนิด', + 'payment_methods' => 'วิธีการชำระเงิน | วิธีการชำระเงิน', + 'compares' => 'รายได้เทียบกับค่าใช้จ่าย | รายได้เทียบกับค่าใช้จ่าย', + 'notes' => 'หมายเหตุ | หมายเหตุ', + 'totals' => 'รวม | รวม', + 'languages' => 'ภาษา | ภาษา', + 'updates' => 'การปรับปรุง | การปรับปรุง', + 'numbers' => 'หมายเลข | หมายเลข', + 'statuses' => 'สถานะ | สถานะ', + 'others' => 'อื่น ๆ | อื่น ๆ', + + 'dashboard' => 'แดชบอร์ด', + 'banking' => 'การธนาคาร', + 'general' => 'ทั่วไป', + 'no_records' => 'ไม่มีรายการ', + 'date' => 'วันที่', + 'amount' => 'ยอดเงิน', + 'enabled' => 'เปิดใช้งาน', + 'disabled' => 'ปิดการใช้งาน', + 'yes' => 'ใช่', + 'no' => 'ไม่ใช่', + 'na' => 'N/A', + 'daily' => 'รายวัน', + 'monthly' => 'รายเดือน', + 'quarterly' => 'รายไตรมาส', + 'yearly' => 'รายปี', + 'add' => 'เพิ่ม', + 'add_new' => 'เพิ่มใหม่', + 'show' => 'แสดง', + 'edit' => 'แก้ไข', + 'delete' => 'ลบ', + 'send' => 'ส่ง', + 'download' => 'ดาวน์โหลด', + 'delete_confirm' => 'ยืนยันการลบ :name :type?', + 'name' => 'ชื่อ', + 'email' => 'อีเมล', + 'tax_number' => 'หมายเลขภาษี', + 'phone' => 'โทรศัพท์', + 'address' => 'ที่อยู่', + 'website' => 'เว็บไซต์', + 'actions' => 'การดำเนินการ', + 'description' => 'คำอธิบาย', + 'manage' => 'จัดการ', + 'code' => 'รหัส', + 'alias' => 'นามแฝง', + 'balance' => 'ยอดเงินคงเหลือ', + 'reference' => 'อ้างอิง', + 'attachment' => 'ไฟล์แนบ', + 'change' => 'เปลี่ยน', + 'switch' => 'สลับ', + 'color' => 'สี', + 'save' => 'บันทึก', + 'cancel' => 'ยกเลิก', + 'from' => 'จาก', + 'to' => 'ถึง', + 'print' => 'พิมพ์', + 'search' => 'ค้นหา', + 'search_placeholder' => 'พิมพ์เพื่อค้นหา...', + 'filter' => 'ตัวกรอง', + 'help' => 'ช่วยเหลือ', + 'all' => 'ทั้งหมด', + 'all_type' => 'ทั้งหมด :type', + 'upcoming' => 'เกิดขึ้น', + 'created' => 'สร้างเมื่อ', + 'id' => 'ไอดี', + 'more_actions' => 'การดำเนินการมากขึ้น', + 'duplicate' => 'ซ้ำ', + 'unpaid' => 'ยังไม่ได้ชำระ', + 'paid' => 'ชำระแล้ว', + 'overdue' => 'ค้างชำระ', + 'partially' => 'บางส่วน', + 'partially_paid' => 'ชำระเงินบางส่วน', + + 'title' => [ + 'new' => 'ใหม่ :type', + 'edit' => 'แก้ไข :type', + ], + 'form' => [ + 'enter' => 'กรอก :type', + 'select' => [ + 'field' => '- เลือก :field -', + 'file' => 'เลือกไฟล์', + ], + 'no_file_selected' => 'ไม่ได้เลือกไฟล์...', + ], + +]; diff --git a/resources/lang/th-TH/header.php b/resources/lang/th-TH/header.php new file mode 100755 index 0000000..4cde749 --- /dev/null +++ b/resources/lang/th-TH/header.php @@ -0,0 +1,15 @@ + 'เปลี่ยนภาษา', + 'last_login' => 'เข้าสู่ระบบครั้งสุดท้าย :time', + 'notifications' => [ + 'counter' => '{0} คุณไม่มีการแจ้งเตือน|{1} คุณมี: นับการแจ้งเตือน|[2,*] คุณมี: นับการแจ้งเตือน', + 'overdue_invoices' => '{1} :count ใบแจ้งหนี้ค้างชำระ|[2,*] :count ใบแจ้งหนี้ที่ค้างชำระ', + 'upcoming_bills' => '{1} :count บิลที่จะเกิดขึ้น|[2,*] :count บิลที่จะเกิดขึ้น', + 'items_stock' => '{1} :count รายการที่หมดสต็อก|[2,*] :count รายการที่หมดสต็อก', + 'view_all' => 'แสดงทั้งหมด' + ], + +]; diff --git a/resources/lang/th-TH/import.php b/resources/lang/th-TH/import.php new file mode 100755 index 0000000..0a9f37e --- /dev/null +++ b/resources/lang/th-TH/import.php @@ -0,0 +1,9 @@ + 'นำเข้า', + 'title' => 'นำเข้า :type', + 'message' => 'ประเภทไฟล์ที่อนุญาต: CSV, XLS. กรุณา, ดาวน์โหลด ไฟล์ตัวอย่าง.', + +]; diff --git a/resources/lang/th-TH/install.php b/resources/lang/th-TH/install.php new file mode 100755 index 0000000..8597488 --- /dev/null +++ b/resources/lang/th-TH/install.php @@ -0,0 +1,44 @@ + 'ถัดไป', + 'refresh' => 'โหลดใหม่', + + 'steps' => [ + 'requirements' => 'โปรดปฏิบัติตามข้อกำหนดต่อไปนี้!', + 'language' => 'ขั้นตอนที่ 1/3: เลือกภาษา', + 'database' => 'ขั้นตอนที่ 2/3: การตั้งค่าฐานข้อมูล', + 'settings' => 'ขั้นตอนที่ 3/3: รายละเอียดบริษัทและผู้ดูแลระบบ', + ], + + 'language' => [ + 'select' => 'เลือกภาษา', + ], + + 'requirements' => [ + 'enabled' => ':feature ที่ต้องการเปิดใช้งาน', + 'disabled' => ':feature ที่ต้องการปิดใช้งาน', + 'extension' => ':extension ส่วนขยายต้องการโหลด', + 'directory' => ':directory แฟ้มจำเป็นต้องเขียน', + ], + + 'database' => [ + 'hostname' => 'ชื่อโฮสต์', + 'username' => 'ชื่อผู้ใช้งาน', + 'password' => 'รหัสผ่าน', + 'name' => 'ฐานข้อมูล', + ], + + 'settings' => [ + 'company_name' => 'ชื่อบริษัท', + 'company_email' => 'อีเมลบริษัท', + 'admin_email' => 'อีเมลผู้ดูแลระบบ', + 'admin_password' => 'รหัสผ่านผู้ดูแลระบบ', + ], + + 'error' => [ + 'connection' => 'ข้อผิดพลาด: ไม่สามารถเชื่อมต่อไปยังฐานข้อมูล กรุณา ตรวจสอบรายละเอียดให้ถูกต้อง', + ], + +]; diff --git a/resources/lang/th-TH/invoices.php b/resources/lang/th-TH/invoices.php new file mode 100755 index 0000000..6d2acea --- /dev/null +++ b/resources/lang/th-TH/invoices.php @@ -0,0 +1,55 @@ + 'หมายเลขใบแจ้งหนี้', + 'invoice_date' => 'วันที่แจ้งหนี้', + 'total_price' => 'ราคารวม', + 'due_date' => 'วันครบกำหนด', + 'order_number' => 'หมายเลขสั่งซื้อ', + 'bill_to' => 'บิลถึง', + + 'quantity' => 'จำนวน', + 'price' => 'ราคา', + 'sub_total' => 'ยอดรวม', + 'discount' => 'ส่วนลด', + 'tax_total' => 'ยอดรวมภาษี', + 'total' => 'รวมทั้งหมด', + + 'item_name' => 'ชื่อสินค้า | ชื่อสินค้า', + + 'show_discount' => ':discount% ส่วนลด', + 'add_discount' => 'เพิ่มส่วนลด', + 'discount_desc' => 'ของยอดรวม', + + 'payment_due' => 'ครบกำหนดชำระ', + 'paid' => 'ชำระแล้ว', + 'histories' => 'ประวัติ', + 'payments' => 'การชำระเงิน', + 'add_payment' => 'เพิ่มการชำระเงิน', + 'mark_paid' => 'ทำเครื่องหมายชำระเงินแล้ว', + 'mark_sent' => 'ทำเครื่องหมายว่าส่งแล้ว', + 'download_pdf' => 'ดาวน์โหลด PDF', + 'send_mail' => 'ส่งอีเมล', + + 'status' => [ + 'draft' => 'ฉบับร่าง', + 'sent' => 'ส่ง', + 'viewed' => 'ดูแล้ว', + 'approved' => 'อนุมัติ', + 'partial' => 'บางส่วน', + 'paid' => 'ชำระแล้ว', + ], + + 'messages' => [ + 'email_sent' => 'อีเมลใบแจ้งหนี้ถูกส่งเรียบร้อยแล้ว!', + 'marked_sent' => 'ใบแจ้งหนี้ที่ทำเครื่องหมายว่าส่งสำเร็จแล้ว!', + 'email_required' => 'ไม่มีที่อยู่อีเมลสำหรับลูกค้านี้', + ], + + 'notification' => [ + 'message' => 'คุณได้รับอีเมลฉบับนี้ เพราะคุณมีกำลังจะเกิดขึ้น :amount ใบแจ้งหนี้ ถึง :customer ลูกค้า', + 'button' => 'ชำระเงินทันที', + ], + +]; diff --git a/resources/lang/th-TH/items.php b/resources/lang/th-TH/items.php new file mode 100755 index 0000000..132848c --- /dev/null +++ b/resources/lang/th-TH/items.php @@ -0,0 +1,15 @@ + 'จำนวน | จำนวน', + 'sales_price' => 'ราคาขาย', + 'purchase_price' => 'ราคาซื้อ', + 'sku' => 'SKU', + + 'notification' => [ + 'message' => 'คุณได้รับอีเมลนี้เพราะ :name หมดคลังแล้ว', + 'button' => 'ดูตอนนี้', + ], + +]; diff --git a/resources/lang/th-TH/messages.php b/resources/lang/th-TH/messages.php new file mode 100755 index 0000000..cf8e898 --- /dev/null +++ b/resources/lang/th-TH/messages.php @@ -0,0 +1,25 @@ + [ + 'added' => ':type เพิ่มแล้ว!', + 'updated' => ':type อัพเดทแล้ว!', + 'deleted' => ':type ลบแล้ว!', + 'duplicated' => ':type ทำซ้ำแล้ว!', + 'imported' => ':type นำเข้าแล้ว!', + ], + 'error' => [ + 'over_payment' => 'ข้อผิดพลาด: การชำระเงินไม่เพิ่ม ยอดเงินผ่านทั้งหมด', + 'not_user_company' => 'ข้อผิดพลาด: คุณไม่สามารถจัดการบริษัทนี้!', + 'customer' => 'ข้อผิดพลาด: ผู้ใช้ยังไม่ได้สร้าง! :name ใช้อีเมลนี้แล้ว', + 'no_file' => 'ข้อผิดพลาด: ไม่ได้เลือกไฟล์!', + 'last_category' => 'ข้อผิดพลาด: ไม่สามารถลบหมวด :type ล่าสุด!', + 'invalid_token' => 'ข้อผิดพลาด: โทเค็นที่ป้อนไม่ถูกต้อง!', + ], + 'warning' => [ + 'deleted' => 'คำเตือน: คุณไม่ได้รับอนุญาตให้ลบ :name เนื่องจากมี :text ที่เกี่ยวข้อง', + 'disabled' => 'คำเตือน: คุณไม่ได้รับอนุญาตให้ปิดใช้งาน :name เนื่องจากมี :text ที่เกี่ยวข้อง', + ], + +]; diff --git a/resources/lang/th-TH/modules.php b/resources/lang/th-TH/modules.php new file mode 100755 index 0000000..3de798f --- /dev/null +++ b/resources/lang/th-TH/modules.php @@ -0,0 +1,48 @@ + 'โทเค็นของ API', + 'api_token' => 'โทเค็น', + 'top_paid' => 'จ่ายเงินยอดนิยม', + 'new' => 'ใหม่', + 'top_free' => 'ฟรียอดนิยม', + 'free' => 'ฟรี', + 'search' => 'ค้นหา', + 'install' => 'ติดตั้ง', + 'buy_now' => 'ซื้อตอนนี้', + 'token_link' => 'คลิกที่นี่ที่ รับโทเค็นของคุณ API', + 'no_apps' => 'ยังไม่มีแอปพลิเคชันในหมวดหมู่นี้', + 'developer' => 'คุณเป็นนักพัฒนาใช่มั้ย? ที่นี่ คุณสามารถเรียนรู้วิธีการสร้างโปรแกรมประยุกต์และเริ่มขายวันนี้!', + + 'about' => 'เกี่ยวกับเรา', + + 'added' => 'เพิ่มแล้ว', + 'updated' => 'อัพเดทแล้ว', + 'compatibility' => 'ความเข้ากันได้', + + 'installed' => ':module ติดตั้งแล้ว', + 'uninstalled' => ':module ถอนการติดตั้งแล้ว', + //'updated' => ':module updated', + 'enabled' => ':module เปิดใช้งานแล้ว', + 'disabled' => ':module ปิดใช้งานแล้ว', + + 'tab' => [ + 'installation' => 'การติดตั้ง', + 'faq' => 'คำถามที่พบบ่อย', + 'changelog' => 'ประวัติเวอร์ชั่น', + ], + + 'installation' => [ + 'header' => 'ติดตั้งแอพ', + 'download' => 'กำลังดาวน์โหลด :module ไฟล์', + 'unzip' => 'กำลังแยก :module ไฟล์', + 'install' => 'กำลังติดตั้ง :module ไฟล์', + ], + + 'button' => [ + 'uninstall' => 'ถอนการติดตั้ง', + 'disable' => 'ปิดการใช้งาน', + 'enable' => 'เปิดใช้งาน', + ], +]; diff --git a/resources/lang/th-TH/pagination.php b/resources/lang/th-TH/pagination.php new file mode 100755 index 0000000..be3c403 --- /dev/null +++ b/resources/lang/th-TH/pagination.php @@ -0,0 +1,9 @@ + '« ก่อนหน้า', + 'next' => 'ถัดไป »', + 'showing' => 'แสดง :first ถึง :last จาก :total :type', + +]; diff --git a/resources/lang/th-TH/passwords.php b/resources/lang/th-TH/passwords.php new file mode 100755 index 0000000..e5d4370 --- /dev/null +++ b/resources/lang/th-TH/passwords.php @@ -0,0 +1,22 @@ + 'รหัสผ่านต้องมีความยาวอย่างน้อย 6 ตัวอักษรและต้องตรงกับช่องยืนยันรหัสผ่าน', + 'reset' => 'รหัสผ่านของคุณถูกตั้งค่าใหม่แล้ว!', + 'sent' => 'เราได้ส่งลิงก์การรีเซ็ตรหัสผ่านทางอีเมลของคุณแล้ว!', + 'token' => 'ชุดรหัสสำหรับการเปลี่ยนรหัสผ่านไม่ถูกต้อง', + 'user' => "ไม่พบผู้ใช้งานที่ตรงกับอีเมลนี้", + +]; diff --git a/resources/lang/th-TH/recurring.php b/resources/lang/th-TH/recurring.php new file mode 100755 index 0000000..7230bed --- /dev/null +++ b/resources/lang/th-TH/recurring.php @@ -0,0 +1,20 @@ + 'เกิดซ้ำ', + 'every' => 'ทุกๆ', + 'period' => 'รอบระยะเวลา', + 'times' => 'ครั้ง', + 'daily' => 'รายวัน', + 'weekly' => 'รายสัปดาห์', + 'monthly' => 'รายเดือน', + 'yearly' => 'รายปี', + 'custom' => 'กำหนดเอง', + 'days' => 'วัน', + 'weeks' => 'สัปดาห์', + 'months' => 'เดือน', + 'years' => 'ปี', + 'message' => 'นี่คือสิ่งที่เกิดซ้ำๆ :type และต่อไป :type จะถูกสร้างขึ้นโดยอัตโนมัติที่ :date', + +]; diff --git a/resources/lang/th-TH/reports.php b/resources/lang/th-TH/reports.php new file mode 100755 index 0000000..668bdfe --- /dev/null +++ b/resources/lang/th-TH/reports.php @@ -0,0 +1,30 @@ + 'ปีนี้', + 'previous_year' => 'ปีก่อน', + 'this_quarter' => 'ไตรมาสนี้', + 'previous_quarter' => 'ไตรมาสก่อน', + 'last_12_months' => '12 เดือนที่ผ่านมา', + 'profit_loss' => 'กำไร & ขาดทุน', + 'gross_profit' => 'กำไรขั้นต้น', + 'net_profit' => 'กำไรสุทธิ', + 'total_expenses' => 'ค่าใช้จ่ายทั้งหมด', + 'net' => 'สุทธิ', + + 'summary' => [ + 'income' => 'สรุปรายได้', + 'expense' => 'สรุปค่าใช้จ่าย', + 'income_expense' => 'รายได้ เทียบกับ ค่าใช้จ่าย', + 'tax' => 'สรุปภาษี', + ], + + 'quarter' => [ + '1' => 'ม.ค. - มี.ค.', + '2' => 'เม.ย. - มิ.ย.', + '3' => 'ก.ค. - ก.ย.', + '4' => 'ต.ค. - ธ.ค.', + ], + +]; diff --git a/resources/lang/th-TH/settings.php b/resources/lang/th-TH/settings.php new file mode 100755 index 0000000..a910260 --- /dev/null +++ b/resources/lang/th-TH/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'ชื่อบริษัท', + 'email' => 'อีเมล', + 'phone' => 'โทรศัพท์', + 'address' => 'ที่อยู่', + 'logo' => 'โลโก้', + ], + 'localisation' => [ + 'tab' => 'ภาษาท้องถิ่น', + 'date' => [ + 'format' => 'รูปแบบวันที่', + 'separator' => 'ตัวคั่นวันที่', + 'dash' => 'เครื่องหมายเส้นประ (-)', + 'dot' => 'เครื่องหมายจุด (.)', + 'comma' => 'เครื่องหมายจุลภาค (,)', + 'slash' => 'เครื่องหมายทับ (/)', + 'space' => 'ช่องว่าง ( )', + ], + 'timezone' => 'โซนเวลา', + 'percent' => [ + 'title' => 'ตำแหน่ง (%) เปอร์เซ็นต์', + 'before' => 'ก่อนตัวเลข', + 'after' => 'หลังตัวเลข', + ], + ], + 'invoice' => [ + 'tab' => 'ใบแจ้งหนี้', + 'prefix' => 'นำหน้าตัวเลข', + 'digit' => 'หมายเลขหลัก', + 'next' => 'หมายเลขถัดไป', + 'logo' => 'โลโก้', + ], + 'default' => [ + 'tab' => 'ค่าเริ่มต้น', + 'account' => 'บัญชีเริ่มต้น', + 'currency' => 'สกุลเงินเริ่มต้น', + 'tax' => 'อัตราภาษีเริ่มต้น', + 'payment' => 'วิธีการชำระเงินเริ่มต้น', + 'language' => 'ภาษาเริ่มต้น', + ], + 'email' => [ + 'protocol' => 'โปรโตคอล', + 'php' => 'เมล PHP', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'โฮสต์ SMTP', + 'port' => 'พอร์ต SMTP', + 'username' => 'ชื่อผู้ใช้ SMTP', + 'password' => 'รหัสผ่าน SMTP', + 'encryption' => 'ความปลอดภัย SMTP', + 'none' => 'ไม่ต้อง', + ], + 'sendmail' => 'ส่งเมล', + 'sendmail_path' => 'เส้นทางส่งเมล', + 'log' => 'Log อีเมล', + ], + 'scheduling' => [ + 'tab' => 'จัดตารางเวลา', + 'send_invoice' => 'ส่งการแจ้งเตือนใบแจ้งหนี้', + 'invoice_days' => 'ส่งหลังจากครบกำหนดวัน', + 'send_bill' => 'ส่งบิลแจ้งเตือน', + 'bill_days' => 'ส่งก่อนวันครบกำหนด', + 'cron_command' => 'คำสั่ง Cron', + 'schedule_time' => 'ชั่วโมงเพื่อเรียกใช้', + ], + 'appearance' => [ + 'tab' => 'ลักษณะที่ปรากฏ', + 'theme' => 'ธีม', + 'light' => 'แบบสว่าง', + 'dark' => 'แบบมืด', + 'list_limit' => 'รายการต่อหน้า', + 'use_gravatar' => 'ใช้ Gravatar', + ], + 'system' => [ + 'tab' => 'ระบบ', + 'session' => [ + 'lifetime' => 'อายุการใช้งานเซสชัน (นาที)', + 'handler' => 'ตัวจัดการเซสชัน', + 'file' => 'ไฟล์', + 'database' => 'ฐานข้อมูล', + ], + 'file_size' => 'ขนาดไฟล์สูงสุด (MB)', + 'file_types' => 'ชนิดแฟ้มที่อนุญาต', + ], + +]; diff --git a/resources/lang/th-TH/taxes.php b/resources/lang/th-TH/taxes.php new file mode 100755 index 0000000..5b72560 --- /dev/null +++ b/resources/lang/th-TH/taxes.php @@ -0,0 +1,8 @@ + 'อัตรา', + 'rate_percent' => 'อัตรา (%)', + +]; diff --git a/resources/lang/th-TH/transfers.php b/resources/lang/th-TH/transfers.php new file mode 100755 index 0000000..3346102 --- /dev/null +++ b/resources/lang/th-TH/transfers.php @@ -0,0 +1,8 @@ + 'จากบัญชี', + 'to_account' => 'ไปบัญชี', + +]; diff --git a/resources/lang/th-TH/updates.php b/resources/lang/th-TH/updates.php new file mode 100755 index 0000000..7a481c0 --- /dev/null +++ b/resources/lang/th-TH/updates.php @@ -0,0 +1,15 @@ + 'เวอร์ชั่นที่ติดตั้ง', + 'latest_version' => 'เวอร์ชั่นล่าสุด', + 'update' => 'อัปเดต Akaunting เป็นเวอร์ชัน :version', + 'changelog' => 'ประวัติเวอร์ชั่น', + 'check' => 'ตรวจสอบ', + 'new_core' => 'Akaunting รุ่นปรับปรุงจะพร้อมใช้งาน', + 'latest_core' => 'ขอแสดงความยินดี คุณมีรุ่นล่าสุด Akaunting ปรับปรุงความปลอดภัยในอนาคตจะถูกใช้โดยอัตโนมัติ', + 'success' => 'กระบวนการปรับปรุงได้เสร็จเรียบร้อย', + 'error' => 'กระบวนการปรับปรุงล้ม เหลว กรุณา ลองอีกครั้ง', + +]; diff --git a/resources/lang/th-TH/validation.php b/resources/lang/th-TH/validation.php new file mode 100755 index 0000000..9231f4b --- /dev/null +++ b/resources/lang/th-TH/validation.php @@ -0,0 +1,119 @@ + 'ข้อมูล :attribute ต้องผ่านการยอมรับก่อน', + 'active_url' => 'ข้อมูล :attribute ต้องเป็น URL เท่านั้น', + 'after' => 'ข้อมูล :attribute ต้องเป็นวันที่หลังจาก :date.', + 'after_or_equal' => ':attribute ต้องเป็นวันที่หลังจากหรือเท่ากับ :date', + 'alpha' => 'ข้อมูล :attribute ต้องเป็นตัวอักษรภาษาอังกฤษเท่านั้น', + 'alpha_dash' => 'ข้อมูล :attribute ต้องเป็นตัวอักษรภาษาอังกฤษ ตัวเลข และ _ เท่านั้น', + 'alpha_num' => 'ข้อมูล :attribute ต้องเป็นตัวอักษรภาษาอังกฤษ ตัวเลข เท่านั้น', + 'array' => 'ข้อมูล :attribute ต้องเป็น array เท่านั้น', + 'before' => 'ข้อมูล :attribute ต้องเป็นวันที่ก่อน :date.', + 'before_or_equal' => ':attribute ต้องเป็นวันที่ก่อนหรือเท่ากับ :date', + 'between' => [ + 'numeric' => 'ข้อมูล :attribute ต้องอยู่ในช่วงระหว่าง :min - :max.', + 'file' => 'ข้อมูล :attribute ต้องอยู่ในช่วงระหว่าง :min - :max กิโลไบต์', + 'string' => 'ข้อมูล :attribute ต้องอยู่ในช่วงระหว่าง :min - :max ตัวอักษร', + 'array' => 'ข้อมูล :attribute ต้องอยู่ในช่วงระหว่าง :min - :max ค่า', + ], + 'boolean' => 'ข้อมูล :attribute ต้องเป็นจริง หรือเท็จ เท่านั้น', + 'confirmed' => 'ข้อมูล :attribute ไม่ตรงกัน', + 'date' => 'ข้อมูล :attribute ต้องเป็นวันที่', + 'date_format' => 'ข้อมูล :attribute ไม่ตรงกับข้อมูลกำหนด :format.', + 'different' => 'ข้อมูล :attribute และ :other ต้องไม่เท่ากัน', + 'digits' => 'ข้อมูล :attribute ต้องเป็น :digits', + 'digits_between' => 'ข้อมูล :attribute ต้องอยู่ในช่วงระหว่าง :min ถึง :max', + 'dimensions' => ':attribute มีขนาดภาพที่ไม่ถูกต้อง', + 'distinct' => 'ข้อมูล :attribute มีค่าที่ซ้ำกัน', + 'email' => 'ข้อมูล :attribute ต้องเป็นอีเมล์', + 'exists' => 'ข้อมูล ที่ถูกเลือกจาก :attribute ไม่ถูกต้อง', + 'file' => ':attribute ต้องเป็นไฟล์', + 'filled' => 'ข้อมูล :attribute จำเป็นต้องกรอก', + 'image' => 'ข้อมูล :attribute ต้องเป็นรูปภาพ', + 'in' => 'ข้อมูล ที่ถูกเลือกใน :attribute ไม่ถูกต้อง', + 'in_array' => 'ข้อมูล :attribute ไม่มีอยู่ภายในค่าของ :other', + 'integer' => 'ข้อมูล :attribute ต้องเป็นตัวเลข', + 'ip' => 'ข้อมูล :attribute ต้องเป็น IP', + 'json' => 'ข้อมูล :attribute ต้องเป็นอักขระ JSON ที่สมบูรณ์', + 'max' => [ + 'numeric' => 'ข้อมูล :attribute ต้องมีจำนวนไม่เกิน :max.', + 'file' => 'ข้อมูล :attribute ต้องมีจำนวนไม่เกิน :max กิโลไบต์', + 'string' => 'ข้อมูล :attribute ต้องมีจำนวนไม่เกิน :max ตัวอักษร', + 'array' => 'ข้อมูล :attribute ต้องมีจำนวนไม่เกิน :max ค่า', + ], + 'mimes' => 'ข้อมูล :attribute ต้องเป็นชนิดไฟล์: :values.', + 'mimetypes' => 'ข้อมูล :attribute ต้องเป็นชนิดไฟล์: :values.', + 'min' => [ + 'numeric' => 'ข้อมูล :attribute ต้องมีจำนวนอย่างน้อย :min.', + 'file' => 'ข้อมูล :attribute ต้องมีจำนวนอย่างน้อย :min กิโลไบต์', + 'string' => 'ข้อมูล :attribute ต้องมีจำนวนอย่างน้อย :min ตัวอักษร', + 'array' => 'ข้อมูล :attribute ต้องมีจำนวนอย่างน้อย :min ค่า', + ], + 'not_in' => 'ข้อมูล ที่เลือกจาก :attribute ไม่ถูกต้อง', + 'numeric' => 'ข้อมูล :attribute ต้องเป็นตัวเลข', + 'present' => 'ข้อมูล :attribute ต้องเป็นปัจจุบัน', + 'regex' => 'ข้อมูล :attribute มีรูปแบบไม่ถูกต้อง', + 'required' => 'ข้อมูล :attribute จำเป็นต้องกรอก', + 'required_if' => 'ข้อมูล :attribute จำเป็นต้องกรอกเมื่อ :other เป็น :value.', + 'required_unless' => 'ข้อมูล :attribute จำเป็นต้องกรอกเว้นแต่ :other เป็น :values.', + 'required_with' => 'ข้อมูล :attribute จำเป็นต้องกรอกเมื่อ :values มีค่า', + 'required_with_all' => 'ข้อมูล :attribute จำเป็นต้องกรอกเมื่อ :values มีค่าทั้งหมด', + 'required_without' => 'ข้อมูล :attribute จำเป็นต้องกรอกเมื่อ :values ไม่มีค่า', + 'required_without_all' => 'ข้อมูล :attribute จำเป็นต้องกรอกเมื่อ :values ไม่มีค่าทั้งหมด', + 'same' => 'ข้อมูล :attribute และ :other ต้องถูกต้อง', + 'size' => [ + 'numeric' => 'ข้อมูล :attribute ต้องเท่ากับ :size', + 'file' => 'ข้อมูล :attribute ต้องเท่ากับ :size กิโลไบต์', + 'string' => 'ข้อมูล :attribute ต้องเท่ากับ :size ตัวอักษร', + 'array' => 'ข้อมูล :attribute ต้องเท่ากับ :size ค่า', + ], + 'string' => 'ข้อมูล :attribute ต้องเป็นอักขระ', + 'timezone' => 'ข้อมูล :attribute ต้องเป็นข้อมูลเขตเวลาที่ถูกต้อง', + 'unique' => 'ข้อมูล :attribute ไม่สามารถใช้ได้', + 'uploaded' => 'ไม่สามารถอัปโหลด :attribute ได้', + 'url' => 'ข้อมูล :attribute ไม่ถูกต้อง', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'ข้อความแบบกำหนดเอง', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/tr-TR/accounts.php b/resources/lang/tr-TR/accounts.php new file mode 100755 index 0000000..75028dd --- /dev/null +++ b/resources/lang/tr-TR/accounts.php @@ -0,0 +1,14 @@ + 'Hesap İsmi', + 'number' => 'Numara', + 'opening_balance' => 'Açılış Bakiyesi', + 'current_balance' => 'Mevcut Bakiye', + 'bank_name' => 'Banka İsmi', + 'bank_phone' => 'Banka Telefonu', + 'bank_address' => 'Banka Adresi', + 'default_account' => 'Varsayılan Hesap', + +]; diff --git a/resources/lang/tr-TR/auth.php b/resources/lang/tr-TR/auth.php new file mode 100755 index 0000000..b32db42 --- /dev/null +++ b/resources/lang/tr-TR/auth.php @@ -0,0 +1,39 @@ + 'Profil', + 'logout' => 'Çıkış', + 'login' => 'Giriş', + 'login_to' => 'Oturum açmak için giriş yapınız', + 'remember_me' => 'Beni Hatırla', + 'forgot_password' => 'Şifremi unuttum', + 'reset_password' => 'Şifremi Sıfırla', + 'enter_email' => 'Email Adresinizi Giriniz', + 'current_email' => 'Geçerli Email', + 'reset' => 'Sıfırla', + 'never' => 'hiçbir zaman', + + 'password' => [ + 'current' => 'Şifre', + 'current_confirm' => 'Şifre Onayı', + 'new' => 'Yeni Şifre', + 'new_confirm' => 'Yeni Şifre Onayı', + ], + + 'error' => [ + 'self_delete' => 'Hata: Kendinizi silemezsiniz!', + 'no_company' => 'Hata: Hesabınıza atanmış herhangi bir şirket yok. Lütfen, sistem yöneticisi ile iletişime geçin.', + ], + + 'failed' => 'Bu kullanıcı bilgileri, bizim verilerimizle eşleşmiyor.', + 'disabled' => 'Bu hesap devre dışı bırakılmıştır. Lütfen, sistem yöneticisi ile iletişime geçin.', + 'throttle' => 'Çok fazla oturum açma girişimi. Lütfen :seconds saniye içinde tekrar deneyin.', + + 'notification' => [ + 'message_1' => 'Şifre sıfırlama talebiniz doğrultusunda bu e-postayı alıyorsunuz.', + 'message_2' => 'Şifre sıfırlama talebinde bulunmadısyanız herhangi bir şey yapmayın.', + 'button' => 'Şifre Sıfırlama', + ], + +]; diff --git a/resources/lang/tr-TR/bills.php b/resources/lang/tr-TR/bills.php new file mode 100755 index 0000000..07b0046 --- /dev/null +++ b/resources/lang/tr-TR/bills.php @@ -0,0 +1,46 @@ + 'Fatura Numarası', + 'bill_date' => 'Fatura Tarihi', + 'total_price' => 'Toplam Tutar', + 'due_date' => 'Vade Tarihi', + 'order_number' => 'Sipariş Numarası', + 'bill_from' => 'Faturayı Kesen', + + 'quantity' => 'Adet', + 'price' => 'Fiyat', + 'sub_total' => 'Ara Toplam', + 'discount' => 'İndirim', + 'tax_total' => 'Vergi Toplamı', + 'total' => 'Toplam', + + 'item_name' => 'Öğe Adı | Öğe Adları', + + 'show_discount' => '%:discount İndirim', + 'add_discount' => 'İndirim Ekle', + 'discount_desc' => 'ara toplam üzerinden', + + 'payment_due' => 'Son Ödeme Tarihi', + 'amount_due' => 'Ödenecek Miktar', + 'paid' => 'Ödenmiş', + 'histories' => 'Geçmiş', + 'payments' => 'Ödemeler', + 'add_payment' => 'Ödeme Ekle', + 'mark_received' => 'Teslim Alındı İşaretle', + 'download_pdf' => 'PDF İndir', + 'send_mail' => 'Email Gönder', + + 'status' => [ + 'draft' => 'Taslak', + 'received' => 'Teslim Alındı', + 'partial' => 'Kısmi', + 'paid' => 'Ödenmiş', + ], + + 'messages' => [ + 'received' => 'Fatura başarıyla teslim alındı olarak işaretlendi!', + ], + +]; diff --git a/resources/lang/tr-TR/companies.php b/resources/lang/tr-TR/companies.php new file mode 100755 index 0000000..7e9e6b7 --- /dev/null +++ b/resources/lang/tr-TR/companies.php @@ -0,0 +1,13 @@ + 'Alan Adı', + 'logo' => 'Logo', + 'manage' => 'Şirketleri Yönet', + 'all' => 'Tüm Şirketler', + 'error' => [ + 'delete_active' => 'Hata: Etkin şirketi silemezsiniz, önce değiştirin lütfen!', + ], + +]; diff --git a/resources/lang/tr-TR/currencies.php b/resources/lang/tr-TR/currencies.php new file mode 100755 index 0000000..72cb9c8 --- /dev/null +++ b/resources/lang/tr-TR/currencies.php @@ -0,0 +1,18 @@ + 'Kod', + 'rate' => 'Kur', + 'default' => 'Varsayılan Para Birimi', + 'decimal_mark' => 'Ondalık Ayracı', + 'thousands_separator' => 'Binler Ayracı', + 'precision' => 'Hassasiyet', + 'symbol' => [ + 'symbol' => 'Simge', + 'position' => 'Simge Konumu', + 'before' => 'Tutardan Önce', + 'after' => 'Tutardan Sonra', + ] + +]; diff --git a/resources/lang/tr-TR/customers.php b/resources/lang/tr-TR/customers.php new file mode 100755 index 0000000..412c45a --- /dev/null +++ b/resources/lang/tr-TR/customers.php @@ -0,0 +1,11 @@ + 'Giriş yapabilsin?', + 'user_created' => 'Kullanıcı oluşturuldu', + + 'error' => [ + 'email' => 'Bu email adresi kullanılmaktadır.' + ] +]; diff --git a/resources/lang/tr-TR/dashboard.php b/resources/lang/tr-TR/dashboard.php new file mode 100755 index 0000000..4be35d6 --- /dev/null +++ b/resources/lang/tr-TR/dashboard.php @@ -0,0 +1,24 @@ + 'Toplam Gelir', + 'receivables' => 'Alacak', + 'open_invoices' => 'Açık Faturalar', + 'overdue_invoices' => 'Gecikmiş Faturalar', + 'total_expenses' => 'Toplam Gider', + 'payables' => 'Verecek', + 'open_bills' => 'Açık Faturalar', + 'overdue_bills' => 'Gecikmiş Faturalar', + 'total_profit' => 'Toplam Kar', + 'open_profit' => 'Açık Kar', + 'overdue_profit' => 'Gecikmiş Kar', + 'cash_flow' => 'Nakit Akışı', + 'no_profit_loss' => 'Kar Kaybı Yok', + 'incomes_by_category' => 'Gelir Kategorileri', + 'expenses_by_category' => 'Gider Kategorileri', + 'account_balance' => 'Hesap Bakiyesi', + 'latest_incomes' => 'Son Gelirler', + 'latest_expenses' => 'Son Giderler', + +]; diff --git a/resources/lang/tr-TR/demo.php b/resources/lang/tr-TR/demo.php new file mode 100755 index 0000000..8254176 --- /dev/null +++ b/resources/lang/tr-TR/demo.php @@ -0,0 +1,16 @@ + 'Kasa', + 'categories_deposit' => 'Depozito', + 'categories_sales' => 'Satış', + 'currencies_usd' => 'Amerikan Doları', + 'currencies_eur' => 'Avro', + 'currencies_gbp' => 'İngiliz Sterlini', + 'currencies_try' => 'Türk Lirası', + 'taxes_exempt' => 'Vergi Muaf', + 'taxes_normal' => 'Normal Vergi', + 'taxes_sales' => 'Satış Vergisi', + +]; diff --git a/resources/lang/tr-TR/footer.php b/resources/lang/tr-TR/footer.php new file mode 100755 index 0000000..f562be7 --- /dev/null +++ b/resources/lang/tr-TR/footer.php @@ -0,0 +1,9 @@ + 'Sürüm', + 'powered' => 'Altyapı Akaunting', + 'software' => 'Ücretsiz Ön Muhasebe Programı', + +]; diff --git a/resources/lang/tr-TR/general.php b/resources/lang/tr-TR/general.php new file mode 100755 index 0000000..065213e --- /dev/null +++ b/resources/lang/tr-TR/general.php @@ -0,0 +1,121 @@ + 'Ürün / Hizmet|Ürünler / Hizmetler', + 'incomes' => 'Gelir|Gelirler', + 'invoices' => 'Fatura|Faturalar', + 'revenues' => 'Tahsilat|Tahsilatlar', + 'customers' => 'Müşteri|Müşteriler', + 'expenses' => 'Gider|Giderler', + 'bills' => 'Fatura|Faturalar', + 'payments' => 'Ödeme|Ödemeler', + 'vendors' => 'Tedarikçi|Tedarikçiler', + 'accounts' => 'Hesap|Hesaplar', + 'transfers' => 'Transfer|Transferler', + 'transactions' => 'İşlem|İşlemler', + 'reports' => 'Rapor|Raporlar', + 'settings' => 'Ayar|Ayarlar', + 'categories' => 'Kategori|Kategoriler', + 'currencies' => 'Para Birimi|Para Birimleri', + 'tax_rates' => 'Vergi Oranı|Vergi Oranları', + 'users' => 'Kullanıcı|Kullanıcılar', + 'roles' => 'Görev|Görevler', + 'permissions' => 'İzin|İzinler', + 'modules' => 'Uygulama|Uygulamalar', + 'companies' => 'Şirket|Şirketler', + 'profits' => 'Kar|Kar', + 'taxes' => 'Vergi Oranı|Vergi Oranları', + 'logos' => 'Logo|Logolar', + 'pictures' => 'Resim|Resimler', + 'types' => 'Tip|Tipler', + 'payment_methods' => 'Ödeme Yöntemi|Ödeme Yöntemleri', + 'compares' => 'Gelir ve Gider | Gelirler ve Giderler', + 'notes' => 'Açıklama|Açıklamalar', + 'totals' => 'Toplam|Toplamlar', + 'languages' => 'Dil|Diller', + 'updates' => 'Güncelleme|Güncellemeler', + 'numbers' => 'Sayı|Sayılar', + 'statuses' => 'Durum|Durumlar', + 'others' => 'Diğer|Diğerleri', + + 'dashboard' => 'Kontrol Paneli', + 'banking' => 'Banka', + 'general' => 'Genel', + 'no_records' => 'Kayıt yok.', + 'date' => 'Tarih', + 'amount' => 'Tutar', + 'enabled' => 'Etkin', + 'disabled' => 'Devredışı', + 'yes' => 'Evet', + 'no' => 'Hayır', + 'na' => '- Yok -', + 'daily' => 'Günlük', + 'monthly' => 'Aylık', + 'quarterly' => 'Çeyrek', + 'yearly' => 'Yıllık', + 'add' => 'Ekle', + 'add_new' => 'Yeni Ekle', + 'show' => 'Göster', + 'edit' => 'Düzenle', + 'delete' => 'Sil', + 'send' => 'Gönder', + 'download' => 'İndir', + 'delete_confirm' => ':name :type silinsin mi?', + 'name' => 'İsim', + 'email' => 'E-posta', + 'tax_number' => 'Vergi Numarası', + 'phone' => 'Telefon', + 'address' => 'Adres', + 'website' => 'Web Sayfası', + 'actions' => 'Eylem', + 'description' => 'Açıklama', + 'manage' => 'Yönet', + 'code' => 'Kod', + 'alias' => 'Rumuz', + 'balance' => 'Bakiye', + 'reference' => 'Referans', + 'attachment' => 'Dosya', + 'change' => 'Değiştir', + 'switch' => 'Değiştir', + 'color' => 'Renk', + 'save' => 'Kaydet', + 'cancel' => 'İptal', + 'from' => 'Tarafından', + 'to' => 'Tarafına', + 'print' => 'Yazdır', + 'search' => 'Ara', + 'search_placeholder' => 'Aranacak kelime..', + 'filter' => 'Filtrele', + 'help' => 'Yardım', + 'all' => 'Hepsi', + 'all_type' => 'Tüm :type', + 'upcoming' => 'Gelecek', + 'created' => 'Oluşturuldu', + 'id' => 'ID', + 'more_actions' => 'Diğer İşlemler', + 'duplicate' => 'Çoğalt', + 'unpaid' => 'Ödenmemiş', + 'paid' => 'Ödenmiş', + 'overdue' => 'Gecikmiş', + 'partially' => 'Kısmen', + 'partially_paid' => 'Kısmen Ödenmiş', + 'export' => 'Dışa Aktar', + 'enable' => 'Etkinleştir', + 'disable' => 'Devre Dışı Bırak', + + 'title' => [ + 'new' => 'Yeni :type', + 'edit' => ':type Düzenle', + ], + + 'form' => [ + 'enter' => ':field Girin', + 'select' => [ + 'field' => '- :field Seçin -', + 'file' => 'Dosya Seçin', + ], + 'no_file_selected' => 'Dosya seçilmemiş...', + ], + +]; diff --git a/resources/lang/tr-TR/header.php b/resources/lang/tr-TR/header.php new file mode 100755 index 0000000..421bc33 --- /dev/null +++ b/resources/lang/tr-TR/header.php @@ -0,0 +1,15 @@ + 'Dil Değiştir', + 'last_login' => 'Son giriş :time', + 'notifications' => [ + 'counter' => '{0} Bildirim yok|{1} :count bildiriminiz var|[2,*] :count bildiriminiz var', + 'overdue_invoices' => '{1} :count Gecikmiş Fatura Mevcut |[2,*] :count Gecikmiş Fatura Mevcut', + 'upcoming_bills' => '{1} :count Yaklaşan Fatura Mevcut|[2,*] :count Yaklaşan Fatura Mevcut', + 'items_stock' => '{1} :count ürün stok dışı|[2,*] :count ürün stok dışı', + 'view_all' => 'Tümünü Görüntüle' + ], + +]; diff --git a/resources/lang/tr-TR/import.php b/resources/lang/tr-TR/import.php new file mode 100755 index 0000000..c45b70c --- /dev/null +++ b/resources/lang/tr-TR/import.php @@ -0,0 +1,9 @@ + 'İçe Aktar', + 'title' => ':type İçe Aktar', + 'message' => 'İzin verilen dosya türleri: XLS, XLSX. Lütfen, örnek dosyayı indirin.', + +]; diff --git a/resources/lang/tr-TR/install.php b/resources/lang/tr-TR/install.php new file mode 100755 index 0000000..48c0fec --- /dev/null +++ b/resources/lang/tr-TR/install.php @@ -0,0 +1,44 @@ + 'İleri', + 'refresh' => 'Yenile', + + 'steps' => [ + 'requirements' => 'Sorunları gidermek için hosting firması ile iletişime geçin!', + 'language' => 'Adım 1/3 : Dil Seçimi', + 'database' => 'Adım 2/3 : Veritabanı Ayarları', + 'settings' => 'Adım 3/3 : Şirket ve Yönetici Bilgileri', + ], + + 'language' => [ + 'select' => 'Dil Seçin', + ], + + 'requirements' => [ + 'enabled' => ':feature etkin olmalıdır!', + 'disabled' => ':feature devre dışı bırakılmalıdır!', + 'extension' => ':extension eklendisi kurulmalı ve yüklenmelidir!', + 'directory' => ':directory dizini yazılabilir olmalıdır!', + ], + + 'database' => [ + 'hostname' => 'Sunucu', + 'username' => 'Kullanıcı', + 'password' => 'Şifre', + 'name' => 'Veritabanı', + ], + + 'settings' => [ + 'company_name' => 'Şirket Adı', + 'company_email' => 'Şirket e-Postası', + 'admin_email' => 'Yönetici e-Postası', + 'admin_password' => 'Yönetici Şifresi', + ], + + 'error' => [ + 'connection' => 'Hata: Veritabanına bağlanamıyoruz! Lütfen veritabanı bilgilerini kontrol ediniz.', + ], + +]; diff --git a/resources/lang/tr-TR/invoices.php b/resources/lang/tr-TR/invoices.php new file mode 100755 index 0000000..73d9854 --- /dev/null +++ b/resources/lang/tr-TR/invoices.php @@ -0,0 +1,55 @@ + 'Fatura Numarası', + 'invoice_date' => 'Fatura Tarihi', + 'total_price' => 'Toplam Tutar', + 'due_date' => 'Vade Tarihi', + 'order_number' => 'Sipariş Numarası', + 'bill_to' => 'Faturalanacak Kişi/Kurum', + + 'quantity' => 'Adet', + 'price' => 'Fiyat', + 'sub_total' => 'Ara Toplam', + 'discount' => 'İndirim', + 'tax_total' => 'Vergi Toplamı', + 'total' => 'Toplam', + + 'item_name' => 'Öğe Adı | Öğe Adları', + + 'show_discount' => '%:discount İndirim', + 'add_discount' => 'İndirim Ekle', + 'discount_desc' => 'ara toplam üzerinden', + + 'payment_due' => 'Son Ödeme Tarihi', + 'paid' => 'Ödenmiş', + 'histories' => 'Geçmiş', + 'payments' => 'Ödemeler', + 'add_payment' => 'Ödeme Ekle', + 'mark_paid' => 'Ödendi İşaretle', + 'mark_sent' => 'Gönderildi İşaretle', + 'download_pdf' => 'PDF İndir', + 'send_mail' => 'Email Gönder', + + 'status' => [ + 'draft' => 'Taslak', + 'sent' => 'Gönderilen', + 'viewed' => 'Görüldü', + 'approved' => 'Onaylandı', + 'partial' => 'Kısmi', + 'paid' => 'Ödenmiş', + ], + + 'messages' => [ + 'email_sent' => 'Fatura emaili başarı ile gönderildi!', + 'marked_sent' => 'Fatura başarıyla gönderilmiş olarak işaretlendi!', + 'email_required' => 'Bu müşteri için e-posta adresi yok!', + ], + + 'notification' => [ + 'message' => ':amount tutarında faturayı :customer ödemediği için bu iletiyi almaktasınız.', + 'button' => 'Şimdi Öde', + ], + +]; diff --git a/resources/lang/tr-TR/items.php b/resources/lang/tr-TR/items.php new file mode 100755 index 0000000..b733230 --- /dev/null +++ b/resources/lang/tr-TR/items.php @@ -0,0 +1,15 @@ + 'Adet|Adetler', + 'sales_price' => 'Satış Fiyatı', + 'purchase_price' => 'Alış Fiyatı', + 'sku' => 'Ürün Kodu', + + 'notification' => [ + 'message' => ':name ürünün stoğu tükendiği için bu iletiyi almaktasınız.', + 'button' => 'Şimdi Görüntüle', + ], + +]; diff --git a/resources/lang/tr-TR/messages.php b/resources/lang/tr-TR/messages.php new file mode 100755 index 0000000..2003bc1 --- /dev/null +++ b/resources/lang/tr-TR/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => ':type eklendi!', + 'updated' => ':type güncellendi!', + 'deleted' => ':type silindi!', + 'duplicated' => ':type çoğaltıldı!', + 'imported' => ':type içe aktarıldı!', + 'enabled' => ':type etkinleştirildi!', + 'disabled' => ':type devre dışı bırakıldı!', + ], + 'error' => [ + 'over_payment' => 'Hata: Ödeme eklenmedi. Girilen tutar toplamı geçiyor.', + 'not_user_company' => 'Hata: Bu şirketi yönetme yetkiniz yok!', + 'customer' => 'Hata: Kullanıcı oluşturulamadı. :name bu e-posta adresini kullanmaktadır.', + 'no_file' => 'Hata: Dosya seçilmedi!', + 'last_category' => 'Hata: Son :type kategorisini silemezsiniz!', + 'invalid_token' => 'Hata: Girilen token yanlış!', + 'import_column' => 'Hata: :message Sayfa ismi: :sheet. Satır numarası: :line.', + 'import_sheet' => 'Hata: Sayfa ismi geçersiz. Lütfen, örnek dosyaya bakın.', + ], + 'warning' => [ + 'deleted' => 'Uyarı: :name silinemez çünkü :text ile ilişkilidir.', + 'disabled' => 'Uyarı: :name devre dışı bırakılamaz çünkü :text ile ilişkilidir.', + ], + +]; diff --git a/resources/lang/tr-TR/modules.php b/resources/lang/tr-TR/modules.php new file mode 100755 index 0000000..3a0d627 --- /dev/null +++ b/resources/lang/tr-TR/modules.php @@ -0,0 +1,58 @@ + 'API token', + 'api_token' => 'Token', + 'my_apps' => 'Uygulamalarım', + 'top_paid' => 'Popüler Ücretli', + 'new' => 'Yeni', + 'top_free' => 'Popüler Ücretsiz', + 'free' => 'Ücretsiz', + 'search' => 'Arama', + 'install' => 'Yükle', + 'buy_now' => 'Şimdi Satın Al', + 'token_link' => 'API token almak için buraya tıklayın.', + 'no_apps' => 'Henüz bu kategoride uygulama bulunmamaktadır.', + 'developer' => 'Geliştirici misiniz? Uygulama geliştirip satışa sunmak içinburaya tıklayın!', + + 'about' => 'Hakkında', + + 'added' => 'Ekleme Tarihi', + 'updated' => 'Güncelleme Tarihi', + 'compatibility' => 'Uyumluluk', + + 'installed' => ':module yüklendi', + 'uninstalled' => ':module kaldırıldı', + //'updated' => ':module updated', + 'enabled' => ':module etkinleştirildi', + 'disabled' => ':module devre dışı bırakıldı', + + 'tab' => [ + 'installation' => 'Yükleme', + 'faq' => 'SSS', + 'changelog' => 'Değişiklikler', + ], + + 'installation' => [ + 'header' => 'Uygulama Yükleme', + 'download' => ':module dosyası indiriliyor.', + 'unzip' => ':module ayıklanıyor', + 'install' => ':module uygulamanın dosyaları yükleniyor.', + ], + + 'badge' => [ + 'installed' => 'Yüklü', + ], + + 'button' => [ + 'uninstall' => 'Kaldır', + 'disable' => 'Devre Dışı Bırak', + 'enable' => 'Etkinleştir', + ], + + 'my' => [ + 'purchased' => 'Satın Alınmış', + 'installed' => 'Yüklü', + ], +]; diff --git a/resources/lang/tr-TR/notifications.php b/resources/lang/tr-TR/notifications.php new file mode 100755 index 0000000..0672913 --- /dev/null +++ b/resources/lang/tr-TR/notifications.php @@ -0,0 +1,10 @@ + 'Hay aksi!', + 'hello' => 'Merhaba!', + 'salutation' => 'Saygılar,
    :company_name', + 'subcopy' => '":text" butonuna tıklayamıyorsanız, aşağıdaki bağlantıyı kopyalayıp tarayıcıya yapıştırın: [:url](:url)', + +]; diff --git a/resources/lang/tr-TR/pagination.php b/resources/lang/tr-TR/pagination.php new file mode 100755 index 0000000..caa74e2 --- /dev/null +++ b/resources/lang/tr-TR/pagination.php @@ -0,0 +1,9 @@ + '« Önceki', + 'next' => 'Sonraki »', + 'showing' => ':total kayıttan :first ile :last arasındaki kayıtlar gösteriliyor', + +]; diff --git a/resources/lang/tr-TR/passwords.php b/resources/lang/tr-TR/passwords.php new file mode 100755 index 0000000..b395dcf --- /dev/null +++ b/resources/lang/tr-TR/passwords.php @@ -0,0 +1,22 @@ + 'Şifreler en az altı karakter olmalı ve onay ile eşleşmelidir.', + 'reset' => 'Şifreniz sıfırlandı!', + 'sent' => 'Şifre sıfırlama bağlantınızı size e-posta ile gönderdik!', + 'token' => 'Şifre sıfırlama adresi/kodu geçersiz.', + 'user' => "Bu e-posta adresi ile kayıtlı bir üye bulunmuyor.", + +]; diff --git a/resources/lang/tr-TR/recurring.php b/resources/lang/tr-TR/recurring.php new file mode 100755 index 0000000..249a563 --- /dev/null +++ b/resources/lang/tr-TR/recurring.php @@ -0,0 +1,20 @@ + 'Tekrarlanan', + 'every' => 'Her', + 'period' => 'Aralık', + 'times' => 'Kez', + 'daily' => 'Günlük', + 'weekly' => 'Haftalık', + 'monthly' => 'Aylık', + 'yearly' => 'Yıllık', + 'custom' => 'Özel', + 'days' => 'Gün', + 'weeks' => 'Hafta', + 'months' => 'Ay', + 'years' => 'Yıl', + 'message' => 'Bu tekrarlayan bir :type ve bir sonraki :type otomatik olarak :date tarihinde oluşturulacaktır.', + +]; diff --git a/resources/lang/tr-TR/reports.php b/resources/lang/tr-TR/reports.php new file mode 100755 index 0000000..a9d2ae7 --- /dev/null +++ b/resources/lang/tr-TR/reports.php @@ -0,0 +1,30 @@ + 'Bu Yıl', + 'previous_year' => 'Önceki Yıl', + 'this_quarter' => 'Bu Çeyrek', + 'previous_quarter' => 'Önceki Çeyrek', + 'last_12_months' => 'Son 12 Ay', + 'profit_loss' => 'Kar ve Zarar', + 'gross_profit' => 'Brüt Kar', + 'net_profit' => 'Net Kar', + 'total_expenses' => 'Toplam Gider', + 'net' => 'NET', + + 'summary' => [ + 'income' => 'Gelir Özeti', + 'expense' => 'Gider Özeti', + 'income_expense' => 'Gelir Gider Dengesi', + 'tax' => 'Vergi Özeti', + ], + + 'quarter' => [ + '1' => 'Oca-Mar', + '2' => 'Nis-Haz', + '3' => 'Tem-Eyl', + '4' => 'Eki-Ara', + ], + +]; diff --git a/resources/lang/tr-TR/settings.php b/resources/lang/tr-TR/settings.php new file mode 100755 index 0000000..4470f43 --- /dev/null +++ b/resources/lang/tr-TR/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Şirket İsmi', + 'email' => 'Şirket Emaili', + 'phone' => 'Telefon', + 'address' => 'Şirket Adresi', + 'logo' => 'Şirket Logosu', + ], + 'localisation' => [ + 'tab' => 'Yerelleştirme', + 'date' => [ + 'format' => 'Tarih Biçimi', + 'separator' => 'Tarih Ayracı', + 'dash' => 'Tire (-)', + 'dot' => 'Nokta (.)', + 'comma' => 'Virgül (,)', + 'slash' => 'Taksim (/)', + 'space' => 'Boşluk ( )', + ], + 'timezone' => 'Saat dilimi', + 'percent' => [ + 'title' => 'Yüzde (%) Konumu', + 'before' => 'Sayıdan Önce', + 'after' => 'Sayıdan Sonra', + ], + ], + 'invoice' => [ + 'tab' => 'Fatura', + 'prefix' => 'Numara Öneki', + 'digit' => 'Numara Rakam Sayısı', + 'next' => 'Sonraki Numara', + 'logo' => 'Logo', + ], + 'default' => [ + 'tab' => 'Varsayılanlar', + 'account' => 'Varsayılan Hesap', + 'currency' => 'Varsayılan Para Birimi', + 'tax' => 'Varsayılan Vergi Oranı', + 'payment' => 'Varsayılan Ödeme Yöntemi', + 'language' => 'Varsayılan Dil', + ], + 'email' => [ + 'protocol' => 'Protokol', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP Host', + 'port' => 'SMTP Port', + 'username' => 'SMTP Kullanıcı Adı', + 'password' => 'SMTP Şifresi', + 'encryption' => 'SMTP Güvenlik', + 'none' => 'Hiçbiri', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Sendmail Dizini', + 'log' => 'E-mailleri logla', + ], + 'scheduling' => [ + 'tab' => 'Zamanlama', + 'send_invoice' => 'Gelir Faturası Hatırlat', + 'invoice_days' => 'Vade Gününden Sonra Gönder', + 'send_bill' => 'Gider Faturası Hatırlat', + 'bill_days' => 'Vade Gününden Önce Gönder', + 'cron_command' => 'Cron Komutu', + 'schedule_time' => 'Çalışma Saati', + ], + 'appearance' => [ + 'tab' => 'Görünüm', + 'theme' => 'Tema', + 'light' => 'Açık', + 'dark' => 'Koyu', + 'list_limit' => 'Sayfa Başına Kayıt Sayısı', + 'use_gravatar' => 'Gravatar kullanın', + ], + 'system' => [ + 'tab' => 'Sistem', + 'session' => [ + 'lifetime' => 'Oturum süresi (Dakika)', + 'handler' => 'Oturum Yöneticisi', + 'file' => 'Dosya', + 'database' => 'Veritabanı', + ], + 'file_size' => 'Maksimum dosya boyutu (MB)', + 'file_types' => 'İzin verilen dosya türleri', + ], + +]; diff --git a/resources/lang/tr-TR/taxes.php b/resources/lang/tr-TR/taxes.php new file mode 100755 index 0000000..837b43f --- /dev/null +++ b/resources/lang/tr-TR/taxes.php @@ -0,0 +1,8 @@ + 'Oran', + 'rate_percent' => 'Oran (%)', + +]; diff --git a/resources/lang/tr-TR/transfers.php b/resources/lang/tr-TR/transfers.php new file mode 100755 index 0000000..8d79ca7 --- /dev/null +++ b/resources/lang/tr-TR/transfers.php @@ -0,0 +1,12 @@ + 'Gönderen Hesap', + 'to_account' => 'Alan Hesap', + + 'messages' => [ + 'delete' => ':from hesabıdan :to hesabına (:amount)', + ], + +]; diff --git a/resources/lang/tr-TR/updates.php b/resources/lang/tr-TR/updates.php new file mode 100755 index 0000000..11f78a6 --- /dev/null +++ b/resources/lang/tr-TR/updates.php @@ -0,0 +1,15 @@ + 'Yüklü Sürüm', + 'latest_version' => 'En Son Sürüm', + 'update' => ':version sürümüne güncelle', + 'changelog' => 'Değişiklik Kaydı', + 'check' => 'Yenile', + 'new_core' => 'Akaunting\'in güncel bir versiyonu mevcut.', + 'latest_core' => 'Tebrikler! Akaunting\'in en son versiyonuna sahip oldunuz. Güvenlik güncellemeleri otomatik olarak uygulanacaktır.', + 'success' => 'Güncelleme işlemi başarıyla tamamlandı.', + 'error' => 'Güncelleme işlemi başarısız oldu, lütfen yeniden deneyin.', + +]; diff --git a/resources/lang/tr-TR/validation.php b/resources/lang/tr-TR/validation.php new file mode 100755 index 0000000..fd00e7e --- /dev/null +++ b/resources/lang/tr-TR/validation.php @@ -0,0 +1,120 @@ + ':attribute kabul edilmelidir.', + 'active_url' => ':attribute geçerli bir URL olmalıdır.', + 'after' => ':attribute şundan daha eski bir tarih olmalıdır :date.', + 'after_or_equal' => ':attribute tarihi eşit veya daha eski olmalıdır', + 'alpha' => ':attribute sadece harflerden oluşmalıdır.', + 'alpha_dash' => ':attribute sadece harfler, rakamlar ve tirelerden oluşmalıdır.', + 'alpha_num' => ':attribute sadece harfler ve rakamlar içermelidir.', + 'array' => ':attribute dizi olmalıdır.', + 'before' => ':attribute şundan daha önceki bir tarih olmalıdır :date.', + 'before_or_equal' => ':attribute tarihi eşit veya daha eski olmalıdır', + 'between' => [ + 'numeric' => ':attribute :min - :max arasında olmalıdır.', + 'file' => ':attribute :min - :max arasındaki kilobayt değeri olmalıdır.', + 'string' => ':attribute :min - :max arasında karakterden oluşmalıdır.', + 'array' => ':attribute :min - :max arasında nesneye sahip olmalıdır.', + ], + 'boolean' => ':attribute sadece doğru veya yanlış olmalıdır.', + 'confirmed' => ':attribute tekrarı eşleşmiyor.', + 'date' => ':attribute geçerli bir tarih olmalıdır.', + 'date_format' => ':attribute :format biçimi ile eşleşmiyor.', + 'different' => ':attribute ile :other birbirinden farklı olmalıdır.', + 'digits' => ':attribute :digits rakam olmalıdır.', + 'digits_between' => ':attribute :min ile :max arasında rakam olmalıdır.', + 'dimensions' => ':attribute görsel ölçüleri geçersiz.', + 'distinct' => ':attribute alanı yinelenen bir değere sahip.', + 'email' => ':attribute biçimi geçersiz.', + 'exists' => 'Seçili :attribute geçersiz.', + 'file' => ':attribute dosya olmalıdır.', + 'filled' => ':attribute alanı gereklidir.', + 'image' => ':attribute alanı resim dosyası olmalıdır.', + 'in' => ':attribute değeri geçersiz.', + 'in_array' => ':attribute alanı :other içinde mevcut değil.', + 'integer' => ':attribute tamsayı olmalıdır.', + 'ip' => ':attribute geçerli bir IP adresi olmalıdır.', + 'json' => ':attribute geçerli bir JSON değişkeni olmalıdır.', + 'max' => [ + 'numeric' => ':attribute değeri :max değerinden küçük olmalıdır.', + 'file' => ':attribute değeri :max kilobayt değerinden küçük olmalıdır.', + 'string' => ':attribute değeri :max karakter değerinden küçük olmalıdır.', + 'array' => ':attribute değeri :max adedinden az nesneye sahip olmalıdır.', + ], + 'mimes' => ':attribute dosya biçimi :values olmalıdır.', + 'mimetypes' => ':attribute dosya biçimi :values olmalıdır.', + 'min' => [ + 'numeric' => ':attribute değeri :min değerinden büyük olmalıdır.', + 'file' => ':attribute değeri :min kilobayt değerinden büyük olmalıdır.', + 'string' => ':attribute değeri :min karakter değerinden büyük olmalıdır.', + 'array' => ':attribute en az :min nesneye sahip olmalıdır.', + ], + 'not_in' => 'Seçili :attribute geçersiz.', + 'numeric' => ':attribute sayı olmalıdır.', + 'present' => ':attribute alanı gereklidir', + 'regex' => ':attribute biçimi geçersiz.', + 'required' => ':attribute alanı gereklidir.', + 'required_if' => ':attribute alanı, :other :value değerine sahip olduğunda zorunludur.', + 'required_unless' => ':attribute alanı, :other :values değerine sahip olmadığı sürece zorunludur.', + 'required_with' => ':attribute alanı :values varken zorunludur.', + 'required_with_all' => ':attribute alanı herhangi bir :values değeri varken zorunludur.', + 'required_without' => ':attribute alanı :values yokken zorunludur.', + 'required_without_all' => ':attribute alanı :values değerlerinden herhangi biri yokken zorunludur.', + 'same' => ':attribute ile :other eşleşmelidir.', + 'size' => [ + 'numeric' => ':attribute :size olmalıdır.', + 'file' => ':attribute :size kilobyte olmalıdır.', + 'string' => ':attribute :size karakter olmalıdır.', + 'array' => ':attribute :size nesneye sahip olmalıdır.', + ], + 'string' => ':attribute dizge olmalıdır.', + 'timezone' => ':attribute geçerli bir saat dilimi olmalıdır.', + 'unique' => ':attribute daha önceden kayıt edilmiş.', + 'uploaded' => ':attribute yüklenemedi', + 'url' => ':attribute biçimi geçersiz.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'Özel Mesaj', + ], + 'invalid_currency' => ':attribute geçersiz bir döviz kuru kodu.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/uk-UA/accounts.php b/resources/lang/uk-UA/accounts.php new file mode 100755 index 0000000..dbacda1 --- /dev/null +++ b/resources/lang/uk-UA/accounts.php @@ -0,0 +1,14 @@ + 'Ім\'я облікового запису', + 'number' => 'Номер', + 'opening_balance' => 'Відкриття балансу', + 'current_balance' => 'Поточний баланс', + 'bank_name' => 'Назва банку', + 'bank_phone' => 'Телефон банку', + 'bank_address' => 'Адреса банку', + 'default_account' => 'Обліковий запис за замовчуванням', + +]; diff --git a/resources/lang/uk-UA/auth.php b/resources/lang/uk-UA/auth.php new file mode 100755 index 0000000..a04ccbf --- /dev/null +++ b/resources/lang/uk-UA/auth.php @@ -0,0 +1,30 @@ + 'Профіль', + 'logout' => 'Вийти', + 'login' => 'Логін', + 'login_to' => 'Увійдіть щоб розпочати сеанс', + 'remember_me' => 'Запам\'ятати мене', + 'forgot_password' => 'Я забув свій пароль', + 'reset_password' => 'Змінити пароль', + 'enter_email' => 'Введіть адресу електронної пошти', + 'current_email' => 'Поточна електронна пошта', + 'reset' => 'Скинути', + 'never' => 'Ніколи', + 'password' => [ + 'current' => 'Пароль', + 'current_confirm' => 'Підтвердіть пароль', + 'new' => 'Новий пароль', + 'new_confirm' => 'Підтвердити новий пароль', + ], + 'error' => [ + 'self_delete' => 'Помилка: неможливо видалити!' + ], + + 'failed' => 'Ці облікові дані не збігаються з нашими записами.', + 'disabled' => 'Цей обліковий запис вимкнено. Будь-ласка, зверніться до адміністратора.', + 'throttle' => 'Занадто багато спроб входу. Будь ласка, спробуйте ще раз, через :seconds секунд.', + +]; diff --git a/resources/lang/uk-UA/bills.php b/resources/lang/uk-UA/bills.php new file mode 100755 index 0000000..d53ba1b --- /dev/null +++ b/resources/lang/uk-UA/bills.php @@ -0,0 +1,46 @@ + 'Номер рахунку', + 'bill_date' => 'Дата рахунку', + 'total_price' => 'Загальна сума', + 'due_date' => 'Термін дії', + 'order_number' => 'Номер замовлення', + 'bill_from' => 'Рахунок від', + + 'quantity' => 'Кількість', + 'price' => 'Ціна', + 'sub_total' => 'Всього', + 'discount' => 'Знижка', + 'tax_total' => 'Всього пдв', + 'total' => 'Всього', + + 'item_name' => 'Назва товару', + + 'show_discount' => ': знижка % Знижка', + 'add_discount' => 'Додати знижку', + 'discount_desc' => 'Підсумок', + + 'payment_due' => 'Очікуваний платіж', + 'amount_due' => 'Заборгованість', + 'paid' => 'Оплачено', + 'histories' => 'Історії', + 'payments' => 'Платежі', + 'add_payment' => 'Додати платіж', + 'mark_received' => 'Відмітка отримана', + 'download_pdf' => 'Завантажити PDF', + 'send_mail' => 'Надіслати листа', + + 'status' => [ + 'draft' => 'Чернетка', + 'received' => 'Отримано', + 'partial' => 'Частково', + 'paid' => 'Оплачений', + ], + + 'messages' => [ + 'received' => 'Рахунок позначено як успішно отриманий!', + ], + +]; diff --git a/resources/lang/uk-UA/companies.php b/resources/lang/uk-UA/companies.php new file mode 100755 index 0000000..0e8ed77 --- /dev/null +++ b/resources/lang/uk-UA/companies.php @@ -0,0 +1,13 @@ + 'Домен', + 'logo' => 'Логотип', + 'manage' => 'Управління компаніями', + 'all' => 'Всі компанії', + 'error' => [ + 'delete_active' => 'Помилка: Не можна видалити активну компанію, будь ласка, спочатку змініть її!', + ], + +]; diff --git a/resources/lang/uk-UA/currencies.php b/resources/lang/uk-UA/currencies.php new file mode 100755 index 0000000..d37ba7c --- /dev/null +++ b/resources/lang/uk-UA/currencies.php @@ -0,0 +1,18 @@ + 'Код', + 'rate' => 'Оцінити', + 'default' => 'Валюта за замовчуванням', + 'decimal_mark' => 'Десятковий знак', + 'thousands_separator' => 'Тисячі сепаратор', + 'precision' => 'Точність', + 'symbol' => [ + 'symbol' => 'Символ', + 'position' => 'Позиція символу', + 'before' => 'Перед сумою', + 'after' => 'Після суми', + ] + +]; diff --git a/resources/lang/uk-UA/customers.php b/resources/lang/uk-UA/customers.php new file mode 100755 index 0000000..8b8e824 --- /dev/null +++ b/resources/lang/uk-UA/customers.php @@ -0,0 +1,11 @@ + 'Дозволити вхід?', + 'user_created' => 'Користувача створено', + + 'error' => [ + 'email' => 'Ця електронна пошта вже використовується.' + ] +]; diff --git a/resources/lang/uk-UA/dashboard.php b/resources/lang/uk-UA/dashboard.php new file mode 100755 index 0000000..16797f9 --- /dev/null +++ b/resources/lang/uk-UA/dashboard.php @@ -0,0 +1,24 @@ + 'Загальний дохід', + 'receivables' => 'Дебіторська заборгованість', + 'open_invoices' => 'Виставлені рахунки', + 'overdue_invoices' => 'Протерміновані рахунки', + 'total_expenses' => 'Загальні витрати', + 'payables' => 'Кредиторська заборгованість', + 'open_bills' => 'Відкриті рахунки', + 'overdue_bills' => 'Протерміновані рахунки', + 'total_profit' => 'Загальний прибуток', + 'open_profit' => 'Очікуваний Прибуток', + 'overdue_profit' => 'Протермінований прибуток', + 'cash_flow' => 'Грошовий потік', + 'no_profit_loss' => 'Без втрати прибутку', + 'incomes_by_category' => 'Доходи за категоріями', + 'expenses_by_category' => 'Витрати за категоріями', + 'account_balance' => 'Залишок на рахунку', + 'latest_incomes' => 'Останні доходи', + 'latest_expenses' => 'Останні витрати', + +]; diff --git a/resources/lang/uk-UA/demo.php b/resources/lang/uk-UA/demo.php new file mode 100755 index 0000000..607d0cd --- /dev/null +++ b/resources/lang/uk-UA/demo.php @@ -0,0 +1,17 @@ + 'Готівка', + 'categories_uncat' => 'Без категорії', + 'categories_deposit' => 'Депозит', + 'categories_sales' => 'Продажі', + 'currencies_usd' => 'Долар США', + 'currencies_eur' => 'Євро', + 'currencies_gbp' => 'Британський фунт', + 'currencies_try' => 'Турецька ліра', + 'taxes_exempt' => 'Без податку', + 'taxes_normal' => 'Звичайний Податок', + 'taxes_sales' => 'Податок з продажу', + +]; diff --git a/resources/lang/uk-UA/footer.php b/resources/lang/uk-UA/footer.php new file mode 100755 index 0000000..0de829c --- /dev/null +++ b/resources/lang/uk-UA/footer.php @@ -0,0 +1,9 @@ + 'Версія', + 'powered' => 'Зроблено в Akaunting', + 'software' => 'Безкоштовна Бухгалтерська Програма', + +]; diff --git a/resources/lang/uk-UA/general.php b/resources/lang/uk-UA/general.php new file mode 100755 index 0000000..631a7c5 --- /dev/null +++ b/resources/lang/uk-UA/general.php @@ -0,0 +1,117 @@ + 'Позиція|Позиції', + 'incomes' => 'Прибуток | Прибутки', + 'invoices' => 'Рахунок | Рахунки', + 'revenues' => 'Прибуток | Прибутки', + 'customers' => 'Клієнт|Клієнти', + 'expenses' => 'Витрати | Витрати', + 'bills' => 'Рахунок | Рахунки', + 'payments' => 'Платіж | Платежі', + 'vendors' => 'Постачальник | Постачальники', + 'accounts' => 'Обліковий запис | Облікові записи', + 'transfers' => 'Переказ | Перекази', + 'transactions' => 'Операція | Операції', + 'reports' => 'Звіт | Звіти', + 'settings' => 'Налаштування | Налаштування', + 'categories' => 'Категорія | Категорії', + 'currencies' => 'Валюта | Валюти', + 'tax_rates' => 'Податкова ставка | Податкові ставки', + 'users' => 'Користувач | Користувачі', + 'roles' => 'Роль | Ролі', + 'permissions' => 'Дозвіл | Дозволи', + 'modules' => 'Додаток | Додатки', + 'companies' => 'Компанія | Компанії', + 'profits' => 'Прибуток | Прибутки', + 'taxes' => 'Податок | Податки', + 'logos' => 'Логотип | Логотипи', + 'pictures' => 'Зображення | Зображення', + 'types' => 'Тип | Типи', + 'payment_methods' => 'Метод оплати | Метод оплат', + 'compares' => 'Дохід vs витрати | Доходи vs витрати', + 'notes' => 'Примітка | Примітки', + 'totals' => 'Всього | Разом', + 'languages' => 'Мова | Мови', + 'updates' => 'Оновлення | Оновлення', + 'numbers' => 'Номер | Номери', + 'statuses' => 'Статус | Статуси', + 'others' => 'Інший | Інші', + + 'dashboard' => 'Панель інструментів', + 'banking' => 'Банківська справа', + 'general' => 'Головний', + 'no_records' => 'Немає записів.', + 'date' => 'Дата', + 'amount' => 'Підсумок', + 'enabled' => 'Увімкнено', + 'disabled' => 'Вимкнено', + 'yes' => 'Так', + 'no' => 'Ні', + 'na' => 'Н/Д', + 'daily' => 'Щоденно', + 'monthly' => 'Щомісяця', + 'quarterly' => 'Щоквартально', + 'yearly' => 'Щорічно', + 'add' => 'Додати', + 'add_new' => 'Добавити нове', + 'show' => 'Показати', + 'edit' => 'Редагувати', + 'delete' => 'Видалити', + 'send' => 'Надіслати', + 'download' => 'Завантажити', + 'delete_confirm' => 'Підтвердьте видалення: ім\'я: тип?', + 'name' => 'Ім’я', + 'email' => 'E-mail', + 'tax_number' => 'Податковий номер', + 'phone' => 'Телефон', + 'address' => 'Адреса', + 'website' => 'Сайт', + 'actions' => 'Дії', + 'description' => 'Опис', + 'manage' => 'Управління', + 'code' => 'Код', + 'alias' => 'Псевдонім', + 'balance' => 'Баланс', + 'reference' => 'Посилання', + 'attachment' => 'Вкладення', + 'change' => 'Редагувати', + 'switch' => 'Перемкнути', + 'color' => 'Колір', + 'save' => 'Зберегти', + 'cancel' => 'Відміна', + 'from' => 'Від', + 'to' => 'До', + 'print' => 'Друк', + 'search' => 'Пошук', + 'search_placeholder' => 'Введіть текст для пошуку..', + 'filter' => 'Фільтр', + 'help' => 'Допомога', + 'all' => 'Всі', + 'all_type' => 'Всі: тип', + 'upcoming' => 'Майбутні', + 'created' => 'Створено', + 'id' => 'Ідентифікатор', + 'more_actions' => 'Додаткові дії', + 'duplicate' => 'Дублювати', + 'unpaid' => 'Неоплачено', + 'paid' => 'Оплачено', + 'overdue' => 'Протерміновано', + 'partially' => 'Частково', + 'partially_paid' => 'Частково Оплачено', + + 'title' => [ + 'new' => 'Нове: тип', + 'edit' => 'Редагування: тип', + ], + 'form' => [ + 'enter' => 'Введіть: поля', + 'select' => [ + 'field' => '-Вкажiть: поля -', + 'file' => 'Вибрати файл', + ], + 'no_file_selected' => 'Файл не вибрано...', + ], + +]; diff --git a/resources/lang/uk-UA/header.php b/resources/lang/uk-UA/header.php new file mode 100755 index 0000000..5f36939 --- /dev/null +++ b/resources/lang/uk-UA/header.php @@ -0,0 +1,15 @@ + 'Змінити мову', + 'last_login' => 'Останній вхід :час', + 'notifications' => [ + 'counter' => '{0} немає сповіщення |{1} , у вас є: розраховувати сповіщення | [2, *] У вас є: розраховувати сповіщення', + 'overdue_invoices' => '{1} : враховувати прострочені рахунки | [2, *]: враховувати прострочені рахунки', + 'upcoming_bills' => '{1} : враховувати майбутній рахунок | [2, *]: враховувати майбутні рахунки', + 'items_stock' => '{1} :враховувати позицію немає в наявності|[2,*] :враховувати позиції немає в наявності', + 'view_all' => 'Переглянути всі' + ], + +]; diff --git a/resources/lang/uk-UA/import.php b/resources/lang/uk-UA/import.php new file mode 100755 index 0000000..16428a9 --- /dev/null +++ b/resources/lang/uk-UA/import.php @@ -0,0 +1,9 @@ + 'Імпорт', + 'title' => 'Імпорт: тип', + 'message' => 'Допускається типи файлів: CSV, XLS. Будь-ласказавантажте зразок файлу.', + +]; diff --git a/resources/lang/uk-UA/install.php b/resources/lang/uk-UA/install.php new file mode 100755 index 0000000..288ea66 --- /dev/null +++ b/resources/lang/uk-UA/install.php @@ -0,0 +1,44 @@ + 'Наступний', + 'refresh' => 'Перезавантажити', + + 'steps' => [ + 'requirements' => 'Будь ласка, відповідайте наступним вимогам!', + 'language' => 'Крок 1/3: Вибір мови', + 'database' => 'Крок 2/3: Налаштування бази даних', + 'settings' => 'Крок 3/3: Деталі компанії та адміністратора', + ], + + 'language' => [ + 'select' => 'Виберіть мову', + ], + + 'requirements' => [ + 'enabled' => ': функцію потрібно ввімкнути!', + 'disabled' => ': функцію потрібно вимкнути!', + 'extension' => ': розширення розширення повинно бути завантаженим!', + 'directory' => ': директорія каталогу повинна бути доступною для запису!', + ], + + 'database' => [ + 'hostname' => 'Ім\'я хосту', + 'username' => 'Ім\'я користувача', + 'password' => 'Пароль', + 'name' => 'База Даних', + ], + + 'settings' => [ + 'company_name' => 'Назва компанії', + 'company_email' => 'Email Вашої Компанії', + 'admin_email' => 'Адміністратор електронної пошти', + 'admin_password' => 'Пароль адміністратора', + ], + + 'error' => [ + 'connection' => 'Помилка: Не вдалося підключитися до бази даних! Переконайтесь, що даніі є правильними.', + ], + +]; diff --git a/resources/lang/uk-UA/invoices.php b/resources/lang/uk-UA/invoices.php new file mode 100755 index 0000000..60101da --- /dev/null +++ b/resources/lang/uk-UA/invoices.php @@ -0,0 +1,55 @@ + 'Номер рахунку', + 'invoice_date' => 'Дата рахунку', + 'total_price' => 'Загальна сума', + 'due_date' => 'Термін дії', + 'order_number' => 'Номер замовлення', + 'bill_to' => 'Рахунок-фактура', + + 'quantity' => 'Кількість', + 'price' => 'Ціна', + 'sub_total' => 'Всього', + 'discount' => 'Знижка', + 'tax_total' => 'Всього пдв', + 'total' => 'Всього', + + 'item_name' => 'Назва товару', + + 'show_discount' => ': знижка % Знижка', + 'add_discount' => 'Додати знижку', + 'discount_desc' => 'підсумок', + + 'payment_due' => 'Очікуваний платіж', + 'paid' => 'Оплачено', + 'histories' => 'Історії', + 'payments' => 'Платежі', + 'add_payment' => 'Додати платіж', + 'mark_paid' => 'Позначити оплату', + 'mark_sent' => 'Позначити відправлено', + 'download_pdf' => 'Завантажити PDF', + 'send_mail' => 'Надіслати листа', + + 'status' => [ + 'draft' => 'Чернетка', + 'sent' => 'Надіслано', + 'viewed' => 'Переглянуті', + 'approved' => 'Затверджено', + 'partial' => 'Частково', + 'paid' => 'Оплачено', + ], + + 'messages' => [ + 'email_sent' => 'Повідомлення з рахунком було успішно відправлено!', + 'marked_sent' => 'Повідомлення з рахунком було успішно відправлено!', + 'email_required' => 'Немає повідомлень цього клієнта!', + ], + + 'notification' => [ + 'message' => 'Ви отримуєте цей лист, тому що у вас є наступна: сума рахунку до: клієнта замовника.', + 'button' => 'Оплатити зараз', + ], + +]; diff --git a/resources/lang/uk-UA/items.php b/resources/lang/uk-UA/items.php new file mode 100755 index 0000000..4380df7 --- /dev/null +++ b/resources/lang/uk-UA/items.php @@ -0,0 +1,15 @@ + 'Кількість | Кількості', + 'sales_price' => 'Ціна продажу', + 'purchase_price' => 'Ціна покупки', + 'sku' => 'Артикул', + + 'notification' => [ + 'message' => 'Ви отримуєте це повідомлення, тому що : назва відсутня.', + 'button' => 'Переглянути зараз', + ], + +]; diff --git a/resources/lang/uk-UA/messages.php b/resources/lang/uk-UA/messages.php new file mode 100755 index 0000000..2d926fb --- /dev/null +++ b/resources/lang/uk-UA/messages.php @@ -0,0 +1,25 @@ + [ + 'added' => ': тип додано!', + 'updated' => ': тип оновлено!', + 'deleted' => ': тип видалено!', + 'duplicated' => ': тип продубльовано!', + 'imported' => ': тип імпортовано!', + ], + 'error' => [ + 'over_payment' => 'Помилка: Оплату не додано! Сума проходить загальна.', + 'not_user_company' => 'Помилка: Вам не дозволено керувати цією компанією!', + 'customer' => 'Помилка: Користувача не створено! : ця електронна адреса вже використовується.', + 'no_file' => 'Помилка: Файл не обрано!', + 'last_category' => 'Помилка: Неможливо видалити :type категорію!', + 'invalid_token' => 'Помилка: Введений токен невірний!', + ], + 'warning' => [ + 'deleted' => 'Увага: Вам не дозволено видалити : ім\'я , оскільки воно має: текст, пов\'язані.', + 'disabled' => 'Увага: Вам не дозволяється відключати : ім\'я , оскільки воно має: текст, пов\'язані.', + ], + +]; diff --git a/resources/lang/uk-UA/modules.php b/resources/lang/uk-UA/modules.php new file mode 100755 index 0000000..bc0d0fe --- /dev/null +++ b/resources/lang/uk-UA/modules.php @@ -0,0 +1,48 @@ + 'API маркер', + 'api_token' => 'Маркер', + 'top_paid' => 'Топ Paid', + 'new' => 'Нове', + 'top_free' => 'Топ безкоштовних', + 'free' => 'БЕЗКОШТОВНО', + 'search' => 'Пошук', + 'install' => 'Встановити', + 'buy_now' => 'Купити зараз', + 'token_link' => 'натисніть тут щоб отримати ваш API маркер.', + 'no_apps' => 'Немає поки що додатків у цій категорії.', + 'developer' => 'Ви розробник? тут ви можете дізнатися, як створити додаток і почати продажі сьогодні!', + + 'about' => 'Про', + + 'added' => 'Додано', + 'updated' => 'Оновлено', + 'compatibility' => 'Сумiснiсть', + + 'installed' => ':module встановлено', + 'uninstalled' => ':module видалено', + //'updated' => ':module updated', + 'enabled' => ':module увімкнено', + 'disabled' => ':module вимкнено', + + 'tab' => [ + 'installation' => 'Встановлення', + 'faq' => 'Поширені запитання', + 'changelog' => 'Історія змін', + ], + + 'installation' => [ + 'header' => 'Встановлення додатку', + 'download' => 'Завантаження: файл модуля.', + 'unzip' => 'Вилучення файлів :module.', + 'install' => 'Установка файлів : module .', + ], + + 'button' => [ + 'uninstall' => 'Видалити', + 'disable' => 'Вимкнути', + 'enable' => 'Увімкнути', + ], +]; diff --git a/resources/lang/uk-UA/pagination.php b/resources/lang/uk-UA/pagination.php new file mode 100755 index 0000000..4b37f31 --- /dev/null +++ b/resources/lang/uk-UA/pagination.php @@ -0,0 +1,9 @@ + '« Назад', + 'next' => 'Далі »', + 'showing' => 'Показ :first до :last з :total :type', + +]; diff --git a/resources/lang/uk-UA/passwords.php b/resources/lang/uk-UA/passwords.php new file mode 100755 index 0000000..f9ecb3b --- /dev/null +++ b/resources/lang/uk-UA/passwords.php @@ -0,0 +1,22 @@ + 'Пароль повинен бути щонайменше 6 символів довжиною та співпадати з підтвердженням.', + 'reset' => 'Ваш пароль змінено!', + 'sent' => 'Ми надіслали на Вашу електронну адресу посилання для зміни пароля!', + 'token' => 'Помилковий код для зміни пароля.', + 'user' => "Користувача з такою електронною адресою не знайдено.", + +]; diff --git a/resources/lang/uk-UA/recurring.php b/resources/lang/uk-UA/recurring.php new file mode 100755 index 0000000..d515ccc --- /dev/null +++ b/resources/lang/uk-UA/recurring.php @@ -0,0 +1,20 @@ + 'Поточний', + 'every' => 'Кожен', + 'period' => 'Період', + 'times' => 'Час', + 'daily' => 'Щоденно', + 'weekly' => 'Щотижня', + 'monthly' => 'Щомісяця', + 'yearly' => 'Щорічно', + 'custom' => 'Інший', + 'days' => 'День(дні)', + 'weeks' => 'Тиждень(тиждні)', + 'months' => 'Місяць(місяці)', + 'years' => 'Рік(роки)', + 'message' => 'Це повторюється: тип і наступний: тип буде автоматично згенеровано на: дата', + +]; diff --git a/resources/lang/uk-UA/reports.php b/resources/lang/uk-UA/reports.php new file mode 100755 index 0000000..3fe0649 --- /dev/null +++ b/resources/lang/uk-UA/reports.php @@ -0,0 +1,31 @@ + 'Цього Року', + 'previous_year' => 'Минулий Рік', + 'this_quarter' => 'Цей Квартал', + 'previous_quarter' => 'Попередній Квартал', + 'last_12_months' => 'Останні 12 Місяців', + 'profit_loss' => 'Прибуток & Збиток', + 'gross_profit' => 'Загальний Прибуток +', + 'net_profit' => 'Новий Прибуток', + 'total_expenses' => 'Загальні витрати', + 'net' => 'NET', + + 'summary' => [ + 'income' => 'Підсумковий Прибуток', + 'expense' => 'Звіт про Витрати', + 'income_expense' => 'Дохід vs Витрати', + 'tax' => 'Підсумковий Податок', + ], + + 'quarter' => [ + '1' => 'Січень-Березень', + '2' => 'Квітень-Червень', + '3' => 'Липень-Вересень', + '4' => 'Жовтень-Грудень', + ], + +]; diff --git a/resources/lang/uk-UA/settings.php b/resources/lang/uk-UA/settings.php new file mode 100755 index 0000000..8f0de08 --- /dev/null +++ b/resources/lang/uk-UA/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Ім’я', + 'email' => 'Електронна пошта', + 'phone' => 'Телефон', + 'address' => 'Адреса', + 'logo' => 'Логотип', + ], + 'localisation' => [ + 'tab' => 'Локалізація', + 'date' => [ + 'format' => 'Формат дати', + 'separator' => 'Роздільник дати', + 'dash' => 'Тире (–)', + 'dot' => 'Крапка (.)', + 'comma' => 'Кома (,)', + 'slash' => 'Слеш (/)', + 'space' => 'Пробіл ( )', + ], + 'timezone' => 'Часовий пояс', + 'percent' => [ + 'title' => 'Відсоток (%) Позиція', + 'before' => 'Перед Номером', + 'after' => 'Після Номеру', + ], + ], + 'invoice' => [ + 'tab' => 'Рахунок', + 'prefix' => 'Префікс Рахунку', + 'digit' => 'Кількість цифр', + 'next' => 'Наступний номер', + 'logo' => 'Логотип', + ], + 'default' => [ + 'tab' => 'За замовчуванням', + 'account' => 'Обліковий запис за замовчуванням', + 'currency' => 'Валюта за замовчуванням', + 'tax' => 'Ставка податку за замовчуванням', + 'payment' => 'Стандартний Спосіб Оплати', + 'language' => 'Мова за замовчуванням', + ], + 'email' => [ + 'protocol' => 'Протокол', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP Сервер', + 'port' => 'SMTP порт', + 'username' => 'SMTP ім\'я користувача', + 'password' => 'Пароль до SMTP', + 'encryption' => 'SMTP безпеки', + 'none' => 'Жодний', + ], + 'sendmail' => 'Надіслати пошту', + 'sendmail_path' => 'Шлях надсилання пошти', + 'log' => 'Журнал Електронної пошти ', + ], + 'scheduling' => [ + 'tab' => 'Планувальник', + 'send_invoice' => 'Надсилати Рахунок-Фактуру', + 'invoice_days' => 'Надсилати після відповідних днів', + 'send_bill' => 'Відправити Квитанцію про отримання', + 'bill_days' => 'Надіслати після відповідних днів', + 'cron_command' => 'Cron команда', + 'schedule_time' => 'Години до запуску', + ], + 'appearance' => [ + 'tab' => 'Вигляд', + 'theme' => 'Тема', + 'light' => 'Світлий', + 'dark' => 'Темний', + 'list_limit' => 'Записів на сторінці', + 'use_gravatar' => 'Використання Gravatar', + ], + 'system' => [ + 'tab' => 'Система', + 'session' => [ + 'lifetime' => 'Тривалість Сеансу (Хвилин)', + 'handler' => 'Менеджер сесій', + 'file' => 'Файл', + 'database' => 'База Даних', + ], + 'file_size' => 'Максимальний об’єм файлу (Мб)', + 'file_types' => 'Допускається Тип Файлів', + ], + +]; diff --git a/resources/lang/uk-UA/taxes.php b/resources/lang/uk-UA/taxes.php new file mode 100755 index 0000000..99b2ce4 --- /dev/null +++ b/resources/lang/uk-UA/taxes.php @@ -0,0 +1,8 @@ + 'Оцінка', + 'rate_percent' => 'Оцінка (%)', + +]; diff --git a/resources/lang/uk-UA/transfers.php b/resources/lang/uk-UA/transfers.php new file mode 100755 index 0000000..a64cf70 --- /dev/null +++ b/resources/lang/uk-UA/transfers.php @@ -0,0 +1,8 @@ + 'З облікового запису', + 'to_account' => 'Обліковому запису', + +]; diff --git a/resources/lang/uk-UA/updates.php b/resources/lang/uk-UA/updates.php new file mode 100755 index 0000000..8a2c4f3 --- /dev/null +++ b/resources/lang/uk-UA/updates.php @@ -0,0 +1,15 @@ + 'Встановлена версія', + 'latest_version' => 'Остання версія', + 'update' => 'Оновити Akaunting до: версії версія', + 'changelog' => 'Історія змін', + 'check' => 'Позначити', + 'new_core' => 'Оновлена версію Akaunting доступна.', + 'latest_core' => 'Вітаємо! У вас є остання версія Akaunting. Майбутні оновлення безпеки буде застосовано автоматично.', + 'success' => 'Процес оновлення успішно завершено.', + 'error' => 'Процес оновлення не вдалий, будь ласка, спробуйте ще раз.', + +]; diff --git a/resources/lang/uk-UA/validation.php b/resources/lang/uk-UA/validation.php new file mode 100755 index 0000000..d92eace --- /dev/null +++ b/resources/lang/uk-UA/validation.php @@ -0,0 +1,119 @@ + 'Ви повинні прийняти :attribute.', + 'active_url' => ':attribute не правильний URL.', + 'after' => 'Поле :attribute має містити дату не раніше :date.', + 'after_or_equal' => ':attribute має містити дату не раніше або дорівнювати :date.', + 'alpha' => 'Поле :attribute має містити лише літери.', + 'alpha_dash' => 'Поле :attribute має містити лише літери, цифри та підкреслення.', + 'alpha_num' => 'Поле :attribute має містити лише літери та цифри.', + 'array' => 'Поле :attribute має бути масивом.', + 'before' => 'Поле :attribute має містити дату не пізніше :date.', + 'before_or_equal' => 'Поле :attribute має містити дату не пізніше або дорівнюватися :date.', + 'between' => [ + 'numeric' => 'Поле :attribute має бути між :min та :max.', + 'file' => 'Розмір файлу в полі :attribute має бути не менше :min та не більше :max кілобайт.', + 'string' => 'Текст в полі :attribute має бути не менше :min та не більше :max символів.', + 'array' => 'Поле :attribute має містити від :min до :max елементів.', + ], + 'boolean' => 'Поле :attribute повинне містити логічний тип.', + 'confirmed' => 'Поле :attribute не збігається з підтвердженням.', + 'date' => 'Поле :attribute не є датою.', + 'date_format' => 'Поле :attribute не відповідає формату :format.', + 'different' => 'Поля :attribute та :other повинні бути різними.', + 'digits' => 'Довжина цифрового поля :attribute повинна дорівнювати :digits.', + 'digits_between' => 'Довжина цифрового поля :attribute повинна бути від :min до :max.', + 'dimensions' => ':attribute містить неприпустимі розміри зображення.', + 'distinct' => 'Поле :attribute містить значення, яке дублюється.', + 'email' => 'Поле :attribute повинне містити коректну електронну адресу.', + 'exists' => 'Вибране для :attribute значення не коректне.', + 'file' => 'Поле :attribute має містити файл.', + 'filled' => 'Поле :attribute є обов\'язковим для заповнення.', + 'image' => 'Поле :attribute має містити зображення.', + 'in' => 'Вибране для :attribute значення не коректне.', + 'in_array' => 'Значення поля :attribute не міститься в :other.', + 'integer' => 'Поле :attribute має містити ціле число.', + 'ip' => 'Поле :attribute має містити IP адресу.', + 'json' => 'Дані поля :attribute мають бути в форматі JSON.', + 'max' => [ + 'numeric' => 'Поле :attribute має бути не більше :max.', + 'file' => 'Файл в полі :attribute має бути не більше :max кілобайт.', + 'string' => 'Текст в полі :attribute повинен мати довжину не більшу за :max.', + 'array' => 'Поле :attribute повинне містити не більше :max елементів.', + ], + 'mimes' => 'Поле :attribute повинне містити файл одного з типів: :values.', + 'mimetypes' => 'Поле :attribute повинне містити файл одного з типів: :values.', + 'min' => [ + 'numeric' => 'Поле :attribute повинне бути не менше :min.', + 'file' => 'Розмір файлу в полі :attribute має бути не меншим :min кілобайт.', + 'string' => 'Текст в полі :attribute повинен містити не менше :min символів.', + 'array' => 'Поле :attribute повинне містити не менше :min елементів.', + ], + 'not_in' => 'Вибране для :attribute значення не коректне.', + 'numeric' => 'Поле :attribute повинно містити число.', + 'present' => 'Поле :attribute повинне бути присутнє.', + 'regex' => 'Поле :attribute має хибний формат.', + 'required' => 'Поле :attribute є обов\'язковим для заповнення.', + 'required_if' => 'Поле :attribute є обов\'язковим для заповнення, коли :other є рівним :value.', + 'required_unless' => 'Поле :attribute є обов\'язковим для заповнення, коли :other відрізняється від :values', + 'required_with' => 'Поле :attribute є обов\'язковим для заповнення, коли :values вказано.', + 'required_with_all' => 'Поле :attribute є обов\'язковим для заповнення, коли :values вказано.', + 'required_without' => 'Поле :attribute є обов\'язковим для заповнення, коли :values не вказано.', + 'required_without_all' => ':attribute є обов\'язковим для заповнення, коли :values вказано.', + 'same' => 'Поля :attribute та :other мають співпадати.', + 'size' => [ + 'numeric' => ':attribute має бути довжиною :size.', + 'file' => 'Файл в полі :attribute має бути розміром :size кілобайт.', + 'string' => 'Текст в полі :attribute повинен містити :size символів.', + 'array' => 'Поле :attribute повинне містити :size елементів.', + ], + 'string' => 'Поле :attribute повинне містити текст.', + 'timezone' => 'Поле :attribute повинне містити коректну часову зону.', + 'unique' => 'Таке значення поля :attribute вже існує.', + 'uploaded' => 'Завантаження поля :attribute не вдалося.', + 'url' => 'Формат поля :attribute неправильний.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'спеціальне повідомлення', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/vi-VN/accounts.php b/resources/lang/vi-VN/accounts.php new file mode 100755 index 0000000..d30c3fe --- /dev/null +++ b/resources/lang/vi-VN/accounts.php @@ -0,0 +1,14 @@ + 'Tên tài khoản', + 'number' => 'Số', + 'opening_balance' => 'Số dư đầu năm', + 'current_balance' => 'Số dư hiện tại', + 'bank_name' => 'Tên ngân hàng', + 'bank_phone' => 'Số điện thoại ngân hàng', + 'bank_address' => 'Địa chỉ ngân hàng', + 'default_account' => 'Tài khoản mặc định', + +]; diff --git a/resources/lang/vi-VN/auth.php b/resources/lang/vi-VN/auth.php new file mode 100755 index 0000000..8bc1e99 --- /dev/null +++ b/resources/lang/vi-VN/auth.php @@ -0,0 +1,39 @@ + 'Hồ sơ', + 'logout' => 'Đăng xuất', + 'login' => 'Đăng nhập', + 'login_to' => 'Đăng nhập ngay', + 'remember_me' => 'Ghi nhớ tôi', + 'forgot_password' => 'Quên mật khẩu', + 'reset_password' => 'Khôi phục mật khẩu', + 'enter_email' => 'Nhập địa chỉ email của bạn', + 'current_email' => 'Email hiện tại của bạn', + 'reset' => 'Đặt lại', + 'never' => 'không bao giờ', + + 'password' => [ + 'current' => 'Mật khẩu', + 'current_confirm' => 'Xác nhân mật khẩu', + 'new' => 'Mật khẩu mới', + 'new_confirm' => 'Xác nhận mật khẩu mới', + ], + + 'error' => [ + 'self_delete' => 'Lỗi: Bạn không thể xoá chính bạn!', + 'no_company' => 'Error: No company assigned to your account. Please, contact the system administrator.', + ], + + 'failed' => 'Thông tin tài khoản không tìm thấy trong hệ thống.', + 'disabled' => 'Tài khoản của bạn bị khoá. Vui lòng liên hệ với quản trị viên.', + 'throttle' => 'Vượt quá số lần đăng nhập cho phép. Vui lòng thử lại sau :seconds giây.', + + 'notification' => [ + 'message_1' => 'You are receiving this email because we received a password reset request for your account.', + 'message_2' => 'If you did not request a password reset, no further action is required.', + 'button' => 'Reset Password', + ], + +]; diff --git a/resources/lang/vi-VN/bills.php b/resources/lang/vi-VN/bills.php new file mode 100755 index 0000000..0e25aa3 --- /dev/null +++ b/resources/lang/vi-VN/bills.php @@ -0,0 +1,46 @@ + 'Số hoá đơn', + 'bill_date' => 'Ngày trên hoá đơn', + 'total_price' => 'Tổng giá', + 'due_date' => 'Ngày hết hạn', + 'order_number' => 'Số đơn hàng', + 'bill_from' => 'Hoá đơn từ', + + 'quantity' => 'Số lượng', + 'price' => 'Đơn giá', + 'sub_total' => 'Tổng phụ', + 'discount' => 'Discount', + 'tax_total' => 'Tổng thuế', + 'total' => 'Tổng số', + + 'item_name' => 'Tên mục | Tên mục', + + 'show_discount' => ':discount% Discount', + 'add_discount' => 'Add Discount', + 'discount_desc' => 'of subtotal', + + 'payment_due' => 'Hạn thanh toán', + 'amount_due' => 'Số tiền phải trả', + 'paid' => 'Đã thanh toán', + 'histories' => 'Lịch sử thanh toán', + 'payments' => 'Thanh toán', + 'add_payment' => 'Thêm thanh toán', + 'mark_received' => 'Đã nhận được', + 'download_pdf' => 'Tải PDF', + 'send_mail' => 'Gửi email', + + 'status' => [ + 'draft' => 'Bản nháp', + 'received' => 'Đã nhận', + 'partial' => 'Một phần', + 'paid' => 'Đã thanh toán', + ], + + 'messages' => [ + 'received' => 'Hoá đợn được đánh dấu là đã nhận thanh toán!', + ], + +]; diff --git a/resources/lang/vi-VN/companies.php b/resources/lang/vi-VN/companies.php new file mode 100755 index 0000000..3bc0883 --- /dev/null +++ b/resources/lang/vi-VN/companies.php @@ -0,0 +1,13 @@ + 'Tên miền', + 'logo' => 'Logo', + 'manage' => 'Quản lý công ty', + 'all' => 'Tất cả công ty', + 'error' => [ + 'delete_active' => 'Lỗi: Không có thể xóa các công ty đang hoạt động, xin vui lòng, thay đổi trạng thái nó trước tiên!', + ], + +]; diff --git a/resources/lang/vi-VN/currencies.php b/resources/lang/vi-VN/currencies.php new file mode 100755 index 0000000..25c6761 --- /dev/null +++ b/resources/lang/vi-VN/currencies.php @@ -0,0 +1,18 @@ + 'Mã', + 'rate' => 'Tỷ giá', + 'default' => 'Tiền tệ mặc định', + 'decimal_mark' => 'Dấu tách phần thập phân', + 'thousands_separator' => 'Dấu tách phần ngàn', + 'precision' => 'Độ chính xác', + 'symbol' => [ + 'symbol' => 'Ký hiệu', + 'position' => 'Vị trí ký hiệu', + 'before' => 'Phía trước số tiền', + 'after' => 'Phía sau số tiền', + ] + +]; diff --git a/resources/lang/vi-VN/customers.php b/resources/lang/vi-VN/customers.php new file mode 100755 index 0000000..ebbee88 --- /dev/null +++ b/resources/lang/vi-VN/customers.php @@ -0,0 +1,11 @@ + 'Cho phép đăng nhập?', + 'user_created' => 'Người dùng đã được tạo', + + 'error' => [ + 'email' => 'Email đã được đăng ký.' + ] +]; diff --git a/resources/lang/vi-VN/dashboard.php b/resources/lang/vi-VN/dashboard.php new file mode 100755 index 0000000..dd90356 --- /dev/null +++ b/resources/lang/vi-VN/dashboard.php @@ -0,0 +1,24 @@ + 'Tổng thu nhập', + 'receivables' => 'Khoản phải thu', + 'open_invoices' => 'Hoá đơn phải thu', + 'overdue_invoices' => 'Hoá đơn quá hạn', + 'total_expenses' => 'Tổng chi phí', + 'payables' => 'Khoản phải trả', + 'open_bills' => 'Hoá đơn phải thu', + 'overdue_bills' => 'Hoá đơn quá hạn', + 'total_profit' => 'Tổng lợi nhuận', + 'open_profit' => 'Lợi nhuận', + 'overdue_profit' => 'Lợi nhuận quá hạn', + 'cash_flow' => 'Dòng tiền', + 'no_profit_loss' => 'Không thất thoát lợi nhuận', + 'incomes_by_category' => 'Doanh thu theo danh mục', + 'expenses_by_category' => 'Chi phí theo danh mục', + 'account_balance' => 'Số dư tài khoản', + 'latest_incomes' => 'Doanh thu gần đây', + 'latest_expenses' => 'Chi phí gần đây', + +]; diff --git a/resources/lang/vi-VN/demo.php b/resources/lang/vi-VN/demo.php new file mode 100755 index 0000000..34659f7 --- /dev/null +++ b/resources/lang/vi-VN/demo.php @@ -0,0 +1,16 @@ + 'Tiền mặt', + 'categories_deposit' => 'Tiền gửi', + 'categories_sales' => 'Bán hàng', + 'currencies_usd' => 'Đô-la Mỹ', + 'currencies_eur' => 'Euro', + 'currencies_gbp' => 'Bảng Anh', + 'currencies_try' => 'Lia Thổ Nhĩ Kỳ', + 'taxes_exempt' => 'Miễn thuế', + 'taxes_normal' => 'Thuế', + 'taxes_sales' => 'Thuế bán hàng', + +]; diff --git a/resources/lang/vi-VN/footer.php b/resources/lang/vi-VN/footer.php new file mode 100755 index 0000000..57bdd9f --- /dev/null +++ b/resources/lang/vi-VN/footer.php @@ -0,0 +1,9 @@ + 'Phiên bản', + 'powered' => 'Powered By Akaunting', + 'software' => 'Phần mềm kế toán miễn phí', + +]; diff --git a/resources/lang/vi-VN/general.php b/resources/lang/vi-VN/general.php new file mode 100755 index 0000000..e525d3d --- /dev/null +++ b/resources/lang/vi-VN/general.php @@ -0,0 +1,121 @@ + 'Mục | Mục', + 'incomes' => 'Thu nhập | Thu nhập', + 'invoices' => 'Hoá đơn | Hoá đơn', + 'revenues' => 'Doanh thu | Doanh thu', + 'customers' => 'Khách hàng | Khách hàng', + 'expenses' => 'Chi phí | Chi phí', + 'bills' => 'Hoá đơn | Hoá đơn', + 'payments' => 'Thanh toán | Thanh toán', + 'vendors' => 'Nhà cung cấp | Nhà cung cấp', + 'accounts' => 'Tài khoản | Tài khoản', + 'transfers' => 'Chuyển khoản | Chuyển khoản', + 'transactions' => 'Giao dịch | Giao dịch', + 'reports' => 'Báo cáo | Báo cáo', + 'settings' => 'Thiết lập | Thiết lập', + 'categories' => 'Danh mục | Danh mục', + 'currencies' => 'Tiền tệ | Tiền tệ', + 'tax_rates' => 'Thuế suất | Thuế suất', + 'users' => 'Người dùng | Người dùng', + 'roles' => 'Vai trò | Vai trò', + 'permissions' => 'Phân quyền | Phân quyền', + 'modules' => 'Ứng dụng | Ứng dụng', + 'companies' => 'Công ty | Công ty', + 'profits' => 'Lợi nhuận | Lợi nhuận', + 'taxes' => 'Thuế | Thuế', + 'logos' => 'Logo|Logos', + 'pictures' => 'Hình ảnh | Hình ảnh', + 'types' => 'Loại | Loại', + 'payment_methods' => 'Phương thức thanh toán | Phương thức thanh toán', + 'compares' => 'Thu nhập vs chi phí | Thu nhập vs chi phí', + 'notes' => 'Ghi chú | Ghi chú', + 'totals' => 'Tổng số | Tổng số', + 'languages' => 'Ngôn ngữ | Ngôn ngữ', + 'updates' => 'Cập Nhật | Cập Nhật', + 'numbers' => 'Số | Số', + 'statuses' => 'Tình trạng | Trạng thái', + 'others' => 'Other|Others', + + 'dashboard' => 'Bảng điều khiển', + 'banking' => 'Ngân hàng', + 'general' => 'Tổng quan', + 'no_records' => 'Không có mục nào.', + 'date' => 'Ngày', + 'amount' => 'Số tiền', + 'enabled' => 'Đã kích hoạt', + 'disabled' => 'Bị vô hiệu hóa', + 'yes' => 'Có', + 'no' => 'Không', + 'na' => 'N/A', + 'daily' => 'Hàng ngày', + 'monthly' => 'Hàng tháng', + 'quarterly' => 'Quarterly', + 'yearly' => 'Hàng Năm', + 'add' => 'Thêm', + 'add_new' => 'Thêm mới', + 'show' => 'Hiển thị', + 'edit' => 'Sửa', + 'delete' => 'Xóa', + 'send' => 'Gửi', + 'download' => 'Tải về', + 'delete_confirm' => 'Bạn có chắc muốn xoá :name :type?', + 'name' => 'Tên', + 'email' => 'Email', + 'tax_number' => 'Mã số thuế', + 'phone' => 'Điện thoại', + 'address' => 'Địa chỉ', + 'website' => 'Website', + 'actions' => 'Tác vụ', + 'description' => 'Mô tả', + 'manage' => 'Quản lý', + 'code' => 'Mã', + 'alias' => 'Đại diện', + 'balance' => 'Số dư', + 'reference' => 'Tham chiếu', + 'attachment' => 'Đính kèm', + 'change' => 'Thay đổi', + 'switch' => 'Switch', + 'color' => 'Màu', + 'save' => 'Lưu', + 'cancel' => 'Huỷ', + 'from' => 'Từ', + 'to' => 'Đến', + 'print' => 'In', + 'search' => 'Tìm kiếm', + 'search_placeholder' => 'Nhập từ cần tìm..', + 'filter' => 'Bộ lọc', + 'help' => 'Trợ giúp', + 'all' => 'Tất cả', + 'all_type' => 'Tất cả :type', + 'upcoming' => 'Sắp tới', + 'created' => 'Đã tạo', + 'id' => 'ID', + 'more_actions' => 'Thao tác khác', + 'duplicate' => 'Bản sao', + 'unpaid' => 'Unpaid', + 'paid' => 'Paid', + 'overdue' => 'Overdue', + 'partially' => 'Partially', + 'partially_paid' => 'Partially Paid', + 'export' => 'Export', + 'enable' => 'Enable', + 'disable' => 'Disable', + + 'title' => [ + 'new' => 'Thêm loại :type', + 'edit' => 'Chỉnh sửa loại :type', + ], + + 'form' => [ + 'enter' => 'Nhập trường :field', + 'select' => [ + 'field' => '-Chọn trường :field -', + 'file' => 'Chọn tập tin', + ], + 'no_file_selected' => 'Không có tập tin nào được chọn...', + ], + +]; diff --git a/resources/lang/vi-VN/header.php b/resources/lang/vi-VN/header.php new file mode 100755 index 0000000..18419e6 --- /dev/null +++ b/resources/lang/vi-VN/header.php @@ -0,0 +1,15 @@ + 'Chọn ngôn ngữ', + 'last_login' => 'Đăng nhập lần cuối :time', + 'notifications' => [ + 'counter' => '{0} Bạn không có thông báo nào |{1} Bạn có :count thông báo | [2, *] Bạn có :count thông báo', + 'overdue_invoices' => '{1} :count hóa đơn quá hạn | [2, *] :count hóa đơn quá hạn', + 'upcoming_bills' => '{1} :count hoá đơn chờ thanh toán | [2, *] :count hoá đơn chờ thanh toán', + 'items_stock' => '{1} :count mục hết hàng | [2, *] :count mục hết hàng', + 'view_all' => 'Xem tất cả' + ], + +]; diff --git a/resources/lang/vi-VN/import.php b/resources/lang/vi-VN/import.php new file mode 100755 index 0000000..3afa878 --- /dev/null +++ b/resources/lang/vi-VN/import.php @@ -0,0 +1,9 @@ + 'Nhập', + 'title' => 'Nhập :type', + 'message' => 'Allowed file types: XLS, XLSX. Please, download the sample file.', + +]; diff --git a/resources/lang/vi-VN/install.php b/resources/lang/vi-VN/install.php new file mode 100755 index 0000000..302abbf --- /dev/null +++ b/resources/lang/vi-VN/install.php @@ -0,0 +1,44 @@ + 'Tiếp theo', + 'refresh' => 'Làm mới', + + 'steps' => [ + 'requirements' => 'Xin vui lòng, đáp ứng các yêu cầu sau đây!', + 'language' => 'Bước 1/3: Lựa chọn ngôn ngữ', + 'database' => 'Bước 2/3: Thiết lập cơ sở dữ liệu', + 'settings' => 'Bước 3/3: Chi tiết thông tin công ty và trang quản trị', + ], + + 'language' => [ + 'select' => 'Chọn ngôn ngữ', + ], + + 'requirements' => [ + 'enabled' => ':feature cần phải được kích hoạt!', + 'disabled' => ':feature cần phải được vô hiệu hoá!', + 'extension' => ':extension extension cần phải được cài đặt!', + 'directory' => 'Thư mục :directory cần được cấp quyền writable!', + ], + + 'database' => [ + 'hostname' => 'Hostname', + 'username' => 'Username', + 'password' => 'Mật Khẩu', + 'name' => 'Cơ sở dữ liệu', + ], + + 'settings' => [ + 'company_name' => 'Tên công ty', + 'company_email' => 'Email công ty', + 'admin_email' => 'Email người quản trị', + 'admin_password' => 'Mật khẩu người quản trị', + ], + + 'error' => [ + 'connection' => 'Lỗi: Không thể kết nối cơ sở dữ liệu! Vui lòng kiểm tra lại thông tin chi tiết.', + ], + +]; diff --git a/resources/lang/vi-VN/invoices.php b/resources/lang/vi-VN/invoices.php new file mode 100755 index 0000000..307e0b7 --- /dev/null +++ b/resources/lang/vi-VN/invoices.php @@ -0,0 +1,55 @@ + 'Số hoá đơn', + 'invoice_date' => 'Ngày hóa đơn', + 'total_price' => 'Tổng giá', + 'due_date' => 'Ngày hết hạn', + 'order_number' => 'Số đơn hàng', + 'bill_to' => 'Hoá đơn tới', + + 'quantity' => 'Số lượng', + 'price' => 'Đơn giá', + 'sub_total' => 'Tổng phụ', + 'discount' => 'Discount', + 'tax_total' => 'Tổng thuế', + 'total' => 'Tổng số', + + 'item_name' => 'Tên mục | Tên mục', + + 'show_discount' => ':discount% Discount', + 'add_discount' => 'Add Discount', + 'discount_desc' => 'of subtotal', + + 'payment_due' => 'Hạn thanh toán', + 'paid' => 'Đã thanh toán', + 'histories' => 'Lịch sử thanh toán', + 'payments' => 'Thanh toán', + 'add_payment' => 'Thêm thanh toán', + 'mark_paid' => 'Đánh dấu đã trả tiền', + 'mark_sent' => 'Đánh dấu đã gửi', + 'download_pdf' => 'Tải PDF', + 'send_mail' => 'Gửi Email', + + 'status' => [ + 'draft' => 'Bản nháp', + 'sent' => 'Đã gửi', + 'viewed' => 'Đã xem', + 'approved' => 'Đã duyệt', + 'partial' => 'Một phần', + 'paid' => 'Đã thanh toán', + ], + + 'messages' => [ + 'email_sent' => 'Hoá đơn email đã được gửi thành công!', + 'marked_sent' => 'Hóa đơn được đánh dấu là đã gửi thành công!', + 'email_required' => 'No email address for this customer!', + ], + + 'notification' => [ + 'message' => 'Bạn nhận được email này bởi vì bạn sắp có :amount hóa đơn cần thanh toán cho khách hàng :customer.', + 'button' => 'Trả ngay', + ], + +]; diff --git a/resources/lang/vi-VN/items.php b/resources/lang/vi-VN/items.php new file mode 100755 index 0000000..7427008 --- /dev/null +++ b/resources/lang/vi-VN/items.php @@ -0,0 +1,15 @@ + 'Số lượng | Số lượng', + 'sales_price' => 'Giá bán', + 'purchase_price' => 'Giá Mua', + 'sku' => 'SKU', + + 'notification' => [ + 'message' => 'Bạn nhận được email này bởi vì :name đang hết hàng.', + 'button' => 'Xem ngay', + ], + +]; diff --git a/resources/lang/vi-VN/messages.php b/resources/lang/vi-VN/messages.php new file mode 100755 index 0000000..f2ea8f7 --- /dev/null +++ b/resources/lang/vi-VN/messages.php @@ -0,0 +1,27 @@ + [ + 'added' => ':type đã được thêm!', + 'updated' => ':type đã được cập nhật!', + 'deleted' => ':type đã được xoá!', + 'duplicated' => ':type bị trùng!', + 'imported' => ':type đã được nhập!', + 'enabled' => ':type enabled!', + 'disabled' => ':type disabled!', + ], + 'error' => [ + 'over_payment' => 'Lỗi: Thanh toán không thành công! Số tiền vượt qua tổng số.', + 'not_user_company' => 'Lỗi: Bạn không được phép để quản lý công ty này!', + 'customer' => 'Lỗi: Người dùng chưa được tạo! Đã có người dùng :name sử dụng địa chỉ email này.', + 'no_file' => 'Lỗi: Không có tập tin nào được chọn!', + 'last_category' => 'Lỗi: Không thể xóa mục :type cuối!', + 'invalid_token' => 'Lỗi: Chữ ký số nhập vào không hợp lệ!', + ], + 'warning' => [ + 'deleted' => 'Chú ý: Bạn không được phép xoá :name này bởi vì nó có :text liên quan.', + 'disabled' => 'Chú ý: Bạn không được phép vô hiệu hoá :name này bởi vì nó có :text liên quan.', + ], + +]; diff --git a/resources/lang/vi-VN/modules.php b/resources/lang/vi-VN/modules.php new file mode 100755 index 0000000..33d1992 --- /dev/null +++ b/resources/lang/vi-VN/modules.php @@ -0,0 +1,58 @@ + 'API Token', + 'api_token' => 'Token', + 'my_apps' => 'My Apps', + 'top_paid' => 'Top trả tiền', + 'new' => 'Mới', + 'top_free' => 'Top miễn phí', + 'free' => 'MIỄN PHÍ', + 'search' => 'Tìm kiếm', + 'install' => 'Cài đặt', + 'buy_now' => 'Mua ngay', + 'token_link' => ' Click vào đây để lấy API token của bạn.', + 'no_apps' => 'Chưa có ứng dụng nào trong mục này.', + 'developer' => 'Bạn có phải là nhà phát triển? Tại đây bạn có thể tìm hiểu cách làm thế nào để tạo ra một ứng dụng và bắt đầu bán hôm nay!', + + 'about' => 'Giới thiệu', + + 'added' => 'Đã thêm', + 'updated' => 'Cập nhật', + 'compatibility' => 'Khả năng tương thích', + + 'installed' => ':module đã được cài đặt', + 'uninstalled' => ':module đã được gỡ cài đặt', + //'updated' => ':module updated', + 'enabled' => ':module đã bật', + 'disabled' => ':module đã tắt', + + 'tab' => [ + 'installation' => 'Cài đặt', + 'faq' => 'Những câu hỏi thường gặp', + 'changelog' => 'Changelog', + ], + + 'installation' => [ + 'header' => 'Cài đặt ứng dụng', + 'download' => 'Đang tải tập tin :module.', + 'unzip' => 'Đang giải nén tập tin :module.', + 'install' => 'Đang cài đặt các tập tin :module', + ], + + 'badge' => [ + 'installed' => 'Installed', + ], + + 'button' => [ + 'uninstall' => 'Gỡ bỏ cài đặt', + 'disable' => 'Vô hiệu', + 'enable' => 'Kích hoạt', + ], + + 'my' => [ + 'purchased' => 'Purchased', + 'installed' => 'Installed', + ], +]; diff --git a/resources/lang/vi-VN/pagination.php b/resources/lang/vi-VN/pagination.php new file mode 100755 index 0000000..43e4dd6 --- /dev/null +++ b/resources/lang/vi-VN/pagination.php @@ -0,0 +1,9 @@ + '« Trang sau', + 'next' => 'Trang trước »', + 'showing' => 'Hiển thị :first đến :last trong tổng số :total :type', + +]; diff --git a/resources/lang/vi-VN/passwords.php b/resources/lang/vi-VN/passwords.php new file mode 100755 index 0000000..aa568c7 --- /dev/null +++ b/resources/lang/vi-VN/passwords.php @@ -0,0 +1,22 @@ + 'Mật khẩu phải gồm 6 ký tự và khớp với phần xác nhận.', + 'reset' => 'Mật khẩu mới đã được cập nhật!', + 'sent' => 'Hướng dẫn cấp lại mật khẩu đã được gửi!', + 'token' => 'Mã khôi phục mật khẩu không hợp lệ.', + 'user' => "Không tìm thấy người dùng với địa chỉ email này.", + +]; diff --git a/resources/lang/vi-VN/recurring.php b/resources/lang/vi-VN/recurring.php new file mode 100755 index 0000000..05a7cf1 --- /dev/null +++ b/resources/lang/vi-VN/recurring.php @@ -0,0 +1,21 @@ + 'Định kỳ', + 'every' => 'Mỗi', + 'period' => 'Kỳ', + 'times' => 'Lần', + 'daily' => 'Hàng ngày', + 'weekly' => 'Hàng tuần', + 'monthly' => 'Hàng tháng', + 'yearly' => 'Hàng năm', + 'custom' => 'Tùy chỉnh', + 'days' => 'Ngày', + 'weeks' => 'Tuần', + 'months' => 'Tháng', + 'years' => 'Năm', + 'message' => 'Đây là một :type định kỳ và lần :type tiếp theo sẽ được tự động tạo ra vào :date +', + +]; diff --git a/resources/lang/vi-VN/reports.php b/resources/lang/vi-VN/reports.php new file mode 100755 index 0000000..6f1dc16 --- /dev/null +++ b/resources/lang/vi-VN/reports.php @@ -0,0 +1,30 @@ + 'Năm nay', + 'previous_year' => 'Năm trước', + 'this_quarter' => 'Quý này', + 'previous_quarter' => 'Quý trước', + 'last_12_months' => '12 tháng gần nhất', + 'profit_loss' => 'Lãi lỗ', + 'gross_profit' => 'Lợi nhuận gộp', + 'net_profit' => 'Lợi nhuận ròng', + 'total_expenses' => 'Tổng chi phí', + 'net' => 'NET', + + 'summary' => [ + 'income' => 'Tổng hợp thu nhập', + 'expense' => 'Tổng hợp chi phí', + 'income_expense' => 'Thu nhập vs Chi phí', + 'tax' => 'Tổng hợp thuế', + ], + + 'quarter' => [ + '1' => 'Quý I', + '2' => 'Quý II', + '3' => 'Quý III', + '4' => 'Quý IV', + ], + +]; diff --git a/resources/lang/vi-VN/settings.php b/resources/lang/vi-VN/settings.php new file mode 100755 index 0000000..1a13fc5 --- /dev/null +++ b/resources/lang/vi-VN/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => 'Tên', + 'email' => 'Email', + 'phone' => 'Điện thoại', + 'address' => 'Địa chỉ', + 'logo' => 'Logo', + ], + 'localisation' => [ + 'tab' => 'Địa phương hóa', + 'date' => [ + 'format' => 'Định dạng Ngày tháng', + 'separator' => 'Dấu cách ngày tháng', + 'dash' => 'Gạch (-)', + 'dot' => 'Chấm (.)', + 'comma' => 'Phẩy (,)', + 'slash' => 'Gạch chéo (/)', + 'space' => 'Khoảng trắng ( )', + ], + 'timezone' => 'Múi giờ', + 'percent' => [ + 'title' => 'Vị trí ký hiệu %', + 'before' => 'Trước số', + 'after' => 'Sau số', + ], + ], + 'invoice' => [ + 'tab' => 'Hoá đơn', + 'prefix' => 'Số tiền số', + 'digit' => 'Số chữ số', + 'next' => 'Số tiếp theo', + 'logo' => 'Logo', + ], + 'default' => [ + 'tab' => 'Mặc định', + 'account' => 'Tài khoản mặc định', + 'currency' => 'Tiền tệ mặc định', + 'tax' => 'Thuế mặc định', + 'payment' => 'Phương thức thanh toán mặc định', + 'language' => 'Ngôn ngữ mặc định', + ], + 'email' => [ + 'protocol' => 'Giao thức', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP Host', + 'port' => 'Cổng SMTP', + 'username' => 'Tài khoản SMTP', + 'password' => 'Mật khẩu SMTP', + 'encryption' => 'SMTP Security', + 'none' => 'Không có', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Đường dẫn sendmail', + 'log' => 'Ghi nhận email', + ], + 'scheduling' => [ + 'tab' => 'Lập lịch', + 'send_invoice' => 'Gửi lời nhắc nhở hóa đơn', + 'invoice_days' => 'Gửi sau số ngày quá hạn', + 'send_bill' => 'Gửi nhắc thanh toán hoá đơn', + 'bill_days' => 'Gửi trước số ngày quá hạn', + 'cron_command' => 'Lệnh Cronjob', + 'schedule_time' => 'Giờ chạy', + ], + 'appearance' => [ + 'tab' => 'Hiển thị', + 'theme' => 'Giao diện', + 'light' => 'Sáng', + 'dark' => 'Tối', + 'list_limit' => 'Kết quả mỗi trang', + 'use_gravatar' => 'Sử dụng Gravatar', + ], + 'system' => [ + 'tab' => 'Hệ thống', + 'session' => [ + 'lifetime' => 'Giới hạn phiên làm việc (phút)', + 'handler' => 'Quản lý phiên làm việc', + 'file' => 'Tập tin', + 'database' => 'Cơ sở dữ liệu', + ], + 'file_size' => 'Kích thước tối đa tập tin (MB)', + 'file_types' => 'Loại tập tin cho phép', + ], + +]; diff --git a/resources/lang/vi-VN/taxes.php b/resources/lang/vi-VN/taxes.php new file mode 100755 index 0000000..0e918d2 --- /dev/null +++ b/resources/lang/vi-VN/taxes.php @@ -0,0 +1,8 @@ + 'Tỷ suất', + 'rate_percent' => 'Tỷ suất (%)', + +]; diff --git a/resources/lang/vi-VN/transfers.php b/resources/lang/vi-VN/transfers.php new file mode 100755 index 0000000..4b2e5b2 --- /dev/null +++ b/resources/lang/vi-VN/transfers.php @@ -0,0 +1,12 @@ + 'Từ Tài khoản', + 'to_account' => 'Tới Tài khoản', + + 'messages' => [ + 'delete' => ':from to :to (:amount)', + ], + +]; diff --git a/resources/lang/vi-VN/updates.php b/resources/lang/vi-VN/updates.php new file mode 100755 index 0000000..aabb31a --- /dev/null +++ b/resources/lang/vi-VN/updates.php @@ -0,0 +1,15 @@ + 'Phiên bản cài đặt', + 'latest_version' => 'Phiên bản mới nhất', + 'update' => 'Cập nhật phần mềm Akaunting đến :version', + 'changelog' => 'Nhật ký thay đổi', + 'check' => 'Kiểm tra', + 'new_core' => 'Có phiên bản mới của Akaunting.', + 'latest_core' => 'Chúc mừng! Bạn vừa nâng cấp phiên bản mới nhất của Akaunting. Các bản cập nhật liên quan tới bảo mật sẽ được cập nhật 1 cách tự động.', + 'success' => 'Cập nhật hoàn tất.', + 'error' => 'Cập nhật thất bại. Vui lòng thử lại. ', + +]; diff --git a/resources/lang/vi-VN/validation.php b/resources/lang/vi-VN/validation.php new file mode 100755 index 0000000..4357ecd --- /dev/null +++ b/resources/lang/vi-VN/validation.php @@ -0,0 +1,119 @@ + 'Trường :attribute phải được chấp nhận.', + 'active_url' => 'Trường :attribute không phải là một URL hợp lệ.', + 'after' => 'Trường :attribute phải là một ngày sau ngày :date.', + 'after_or_equal' => 'Trường :attribute phải là thời gian bắt đầu sau :date.', + 'alpha' => 'Trường :attribute chỉ có thể chứa các chữ cái.', + 'alpha_dash' => 'Trường :attribute chỉ có thể chứa chữ cái, số và dấu gạch ngang.', + 'alpha_num' => 'Trường :attribute chỉ có thể chứa chữ cái và số.', + 'array' => 'Trường :attribute phải là dạng mảng.', + 'before' => 'Trường :attribute phải là một ngày trước ngày :date.', + 'before_or_equal' => 'Trường :attribute phải là thời gian bắt đầu trước :date.', + 'between' => [ + 'numeric' => 'Trường :attribute phải nằm trong khoảng :min - :max.', + 'file' => 'Dung lượng tập tin trong trường :attribute phải từ :min - :max kB.', + 'string' => 'Trường :attribute phải từ :min - :max ký tự.', + 'array' => 'Trường :attribute phải có từ :min - :max phần tử.', + ], + 'boolean' => 'Trường :attribute phải là true hoặc false.', + 'confirmed' => 'Giá trị xác nhận trong trường :attribute không khớp.', + 'date' => 'Trường :attribute không phải là định dạng của ngày-tháng.', + 'date_format' => 'Trường :attribute không giống với định dạng :format.', + 'different' => 'Trường :attribute và :other phải khác nhau.', + 'digits' => 'Độ dài của trường :attribute phải gồm :digits chữ số.', + 'digits_between' => 'Độ dài của trường :attribute phải nằm trong khoảng :min and :max chữ số.', + 'dimensions' => 'Trường :attribute có kích thước không hợp lệ.', + 'distinct' => 'Trường :attribute có giá trị trùng lặp.', + 'email' => 'Trường :attribute phải là một địa chỉ email hợp lệ.', + 'exists' => 'Giá trị đã chọn trong trường :attribute không hợp lệ.', + 'file' => 'Trường :attribute phải là một tệp tin.', + 'filled' => 'Trường :attribute không được bỏ trống.', + 'image' => 'Trường :attribute phải là định dạng hình ảnh.', + 'in' => 'Giá trị đã chọn trong trường :attribute không hợp lệ.', + 'in_array' => 'Trường :attribute phải thuộc tập cho phép: :other.', + 'integer' => 'Trường :attribute phải là một số nguyên.', + 'ip' => 'Trường :attribute phải là một địa chỉ IP.', + 'json' => 'Trường :attribute phải là một chuỗi JSON.', + 'max' => [ + 'numeric' => 'Trường :attribute không được lớn hơn :max.', + 'file' => 'Dung lượng tập tin trong trường :attribute không được lớn hơn :max kB.', + 'string' => 'Trường :attribute không được lớn hơn :max ký tự.', + 'array' => 'Trường :attribute không được lớn hơn :max phần tử.', + ], + 'mimes' => 'Trường :attribute phải là một tập tin có định dạng: :values.', + 'mimetypes' => 'Trường :attribute phải là một tập tin có định dạng: :values.', + 'min' => [ + 'numeric' => 'Trường :attribute phải tối thiểu là :min.', + 'file' => 'Dung lượng tập tin trong trường :attribute phải tối thiểu :min kB.', + 'string' => 'Trường :attribute phải có tối thiểu :min ký tự.', + 'array' => 'Trường :attribute phải có tối thiểu :min phần tử.', + ], + 'not_in' => 'Giá trị đã chọn trong trường :attribute không hợp lệ.', + 'numeric' => 'Trường :attribute phải là một số.', + 'present' => 'Trường :attribute phải được cung cấp.', + 'regex' => 'Định dạng trường :attribute không hợp lệ.', + 'required' => 'Trường :attribute không được bỏ trống.', + 'required_if' => 'Trường :attribute không được bỏ trống khi trường :other là :value.', + 'required_unless' => 'Trường :attribute không được bỏ trống trừ khi :other là :values.', + 'required_with' => 'Trường :attribute không được bỏ trống khi một trong :values có giá trị.', + 'required_with_all' => 'Trường :attribute không được bỏ trống khi tất cả :values có giá trị.', + 'required_without' => 'Trường :attribute không được bỏ trống khi một trong :values không có giá trị.', + 'required_without_all' => 'Trường :attribute không được bỏ trống khi tất cả :values không có giá trị.', + 'same' => 'Trường :attribute và :other phải giống nhau.', + 'size' => [ + 'numeric' => 'Trường :attribute phải bằng :size.', + 'file' => 'Dung lượng tập tin trong trường :attribute phải bằng :size kB.', + 'string' => 'Trường :attribute phải chứa :size ký tự.', + 'array' => 'Trường :attribute phải chứa :size phần tử.', + ], + 'string' => 'Trường :attribute phải là một chuỗi ký tự.', + 'timezone' => 'Trường :attribute phải là một múi giờ hợp lệ.', + 'unique' => 'Trường :attribute đã có trong cơ sở dữ liệu.', + 'uploaded' => 'Trường :attribute tải lên thất bại.', + 'url' => 'Trường :attribute không giống với định dạng một URL.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/zh-CN/accounts.php b/resources/lang/zh-CN/accounts.php new file mode 100755 index 0000000..5a74e14 --- /dev/null +++ b/resources/lang/zh-CN/accounts.php @@ -0,0 +1,14 @@ + '帐户名称', + 'number' => '号码', + 'opening_balance' => '开户余额', + 'current_balance' => '当前余额', + 'bank_name' => '银行名称', + 'bank_phone' => '银行电话', + 'bank_address' => '银行地址', + 'default_account' => '默认帐户', + +]; diff --git a/resources/lang/zh-CN/auth.php b/resources/lang/zh-CN/auth.php new file mode 100755 index 0000000..fcd9160 --- /dev/null +++ b/resources/lang/zh-CN/auth.php @@ -0,0 +1,39 @@ + '个人资料', + 'logout' => '退出登录', + 'login' => '登录', + 'login_to' => '登录', + 'remember_me' => '记住我', + 'forgot_password' => '我忘记了我的密码', + 'reset_password' => '重置密码', + 'enter_email' => '请输入电子邮箱', + 'current_email' => '目前电子邮箱', + 'reset' => '重置', + 'never' => '永远不要', + + 'password' => [ + 'current' => '密码', + 'current_confirm' => '确认密码', + 'new' => '新的密码', + 'new_confirm' => '确认新的密码', + ], + + 'error' => [ + 'self_delete' => '错误:无法删除自己!', + 'no_company' => '错误: 你账户下没有公司,请联系管理员.', + ], + + 'failed' => '账号或者密码错误', + 'disabled' => '此账号已被停用,请联系管理员', + 'throttle' => '尝试登录次数过多,请在 :seconds 秒后再试。', + + 'notification' => [ + 'message_1' => '您收到此电子邮件是因为我们收到了您帐户的密码重置请求.', + 'message_2' => '如果您未请求重置密码,则无需进一步操作.', + 'button' => '重置密码', + ], + +]; diff --git a/resources/lang/zh-CN/bills.php b/resources/lang/zh-CN/bills.php new file mode 100755 index 0000000..8d34289 --- /dev/null +++ b/resources/lang/zh-CN/bills.php @@ -0,0 +1,46 @@ + '账单编号', + 'bill_date' => '账单日期', + 'total_price' => '总价', + 'due_date' => '到期日', + 'order_number' => '订单编号', + 'bill_from' => '账单来自', + + 'quantity' => '数量', + 'price' => '价格', + 'sub_total' => '小计', + 'discount' => '折扣', + 'tax_total' => '税率', + 'total' => '总计', + + 'item_name' => '产品名称 | 产品名称', + + 'show_discount' => ':discount% 折扣', + 'add_discount' => '新增折扣', + 'discount_desc' => '小计', + + 'payment_due' => '付款到期日', + 'amount_due' => '到期金额', + 'paid' => '已付款', + 'histories' => '历史记录', + 'payments' => '付款方式', + 'add_payment' => '新增付款方式', + 'mark_received' => '标记已收到', + 'download_pdf' => '下载 PDF格式', + 'send_mail' => '发送邮件', + + 'status' => [ + 'draft' => '草稿', + 'received' => '已收到', + 'partial' => '部分', + 'paid' => '已付款', + ], + + 'messages' => [ + 'received' => '成功标记账单为已收到!', + ], + +]; diff --git a/resources/lang/zh-CN/companies.php b/resources/lang/zh-CN/companies.php new file mode 100755 index 0000000..bacfca4 --- /dev/null +++ b/resources/lang/zh-CN/companies.php @@ -0,0 +1,13 @@ + '域名', + 'logo' => '标志', + 'manage' => '管理公司', + 'all' => '公司', + 'error' => [ + 'delete_active' => '错误: 无法删除已激活的公司, 请先更改它!', + ], + +]; diff --git a/resources/lang/zh-CN/currencies.php b/resources/lang/zh-CN/currencies.php new file mode 100755 index 0000000..9f0081b --- /dev/null +++ b/resources/lang/zh-CN/currencies.php @@ -0,0 +1,18 @@ + '货币代码', + 'rate' => '货币汇率', + 'default' => '默认货币', + 'decimal_mark' => '小数点', + 'thousands_separator' => '千位分隔符', + 'precision' => '精确度', + 'symbol' => [ + 'symbol' => '货币符号', + 'position' => '货币符号位置', + 'before' => '货币兑换前', + 'after' => '货币兑换后', + ] + +]; diff --git a/resources/lang/zh-CN/customers.php b/resources/lang/zh-CN/customers.php new file mode 100755 index 0000000..69b558b --- /dev/null +++ b/resources/lang/zh-CN/customers.php @@ -0,0 +1,11 @@ + '允许登录?', + 'user_created' => '用户创建成功', + + 'error' => [ + 'email' => '邮箱已注册' + ] +]; diff --git a/resources/lang/zh-CN/dashboard.php b/resources/lang/zh-CN/dashboard.php new file mode 100755 index 0000000..f75103b --- /dev/null +++ b/resources/lang/zh-CN/dashboard.php @@ -0,0 +1,24 @@ + '总收入', + 'receivables' => '应收账款', + 'open_invoices' => '未结订单', + 'overdue_invoices' => '逾期订单', + 'total_expenses' => '总费用', + 'payables' => '应付账款', + 'open_bills' => '未结账单', + 'overdue_bills' => '过期账单', + 'total_profit' => '总利润', + 'open_profit' => '初始利润', + 'overdue_profit' => '逾期利润', + 'cash_flow' => '现金流', + 'no_profit_loss' => '无利润损失', + 'incomes_by_category' => '收入分类', + 'expenses_by_category' => '支出分类', + 'account_balance' => '账户余额', + 'latest_incomes' => '近期收入', + 'latest_expenses' => '近期支出', + +]; diff --git a/resources/lang/zh-CN/demo.php b/resources/lang/zh-CN/demo.php new file mode 100755 index 0000000..ba3610c --- /dev/null +++ b/resources/lang/zh-CN/demo.php @@ -0,0 +1,16 @@ + '现金', + 'categories_deposit' => '存款', + 'categories_sales' => '业务员', + 'currencies_usd' => '美金', + 'currencies_eur' => '欧元', + 'currencies_gbp' => '英镑', + 'currencies_try' => '土耳其里拉', + 'taxes_exempt' => '免税', + 'taxes_normal' => '一般税率', + 'taxes_sales' => '销售税', + +]; diff --git a/resources/lang/zh-CN/footer.php b/resources/lang/zh-CN/footer.php new file mode 100755 index 0000000..d46aa1c --- /dev/null +++ b/resources/lang/zh-CN/footer.php @@ -0,0 +1,9 @@ + '当前版本', + 'powered' => '由 Akaunting 驱动', + 'software' => '免费会计软件', + +]; diff --git a/resources/lang/zh-CN/general.php b/resources/lang/zh-CN/general.php new file mode 100755 index 0000000..7748a25 --- /dev/null +++ b/resources/lang/zh-CN/general.php @@ -0,0 +1,121 @@ + '产品 | 产品', + 'incomes' => '收入 | 收入', + 'invoices' => '订单 | 订单', + 'revenues' => '营业额 | 营业额', + 'customers' => '客戶 | 客戶', + 'expenses' => '支出 | 支出', + 'bills' => '账单 | 账单', + 'payments' => '付款 | 付款', + 'vendors' => '供应商 | 供应商', + 'accounts' => '账户 | 账户', + 'transfers' => '转账 | 转账', + 'transactions' => '交易 | 交易', + 'reports' => '报告 | 报告', + 'settings' => '设置 | 设置', + 'categories' => '分类 | 分类', + 'currencies' => '币种 | 币种', + 'tax_rates' => '税率 | 税率', + 'users' => '用户 | 用户', + 'roles' => '角色 | 角色', + 'permissions' => '权限 | 权限', + 'modules' => 'App|Apps', + 'companies' => '公司 | 公司', + 'profits' => '利润 | 利润', + 'taxes' => '税额 | 税额', + 'logos' => 'Logo | Logo', + 'pictures' => '图片 | 图片', + 'types' => '类型 | 类型', + 'payment_methods' => '付款方式 | 付款方式', + 'compares' => '收入vs支出 | 收入vs支出', + 'notes' => '备注 | 备注', + 'totals' => '总计 | 总计', + 'languages' => '语言 | 语言', + 'updates' => '更新 | 更新', + 'numbers' => '编号 | 编号', + 'statuses' => '状态 | 状态', + 'others' => '其他 | 其他', + + 'dashboard' => '统计', + 'banking' => '银行', + 'general' => '通用', + 'no_records' => '尚无记录。', + 'date' => '日期', + 'amount' => '金额', + 'enabled' => '启用', + 'disabled' => '停用', + 'yes' => '是', + 'no' => '否', + 'na' => 'N/A', + 'daily' => '每日', + 'monthly' => '每月', + 'quarterly' => '每季度', + 'yearly' => '每年', + 'add' => '新增', + 'add_new' => '新增', + 'show' => '显示', + 'edit' => '编辑', + 'delete' => '刪除', + 'send' => '发送', + 'download' => '下载', + 'delete_confirm' => '确认刪除 :name :type ?', + 'name' => '名称', + 'email' => '邮箱', + 'tax_number' => '统一编号', + 'phone' => '电话', + 'address' => '地址', + 'website' => '网站', + 'actions' => '操作', + 'description' => '描述', + 'manage' => '管理', + 'code' => '代码', + 'alias' => '別名', + 'balance' => '余额', + 'reference' => '参考', + 'attachment' => '附件', + 'change' => '修改', + 'switch' => '切换', + 'color' => '颜色', + 'save' => '保存', + 'cancel' => '取消', + 'from' => '來自', + 'to' => '收件人', + 'print' => '打印', + 'search' => '搜索', + 'search_placeholder' => '请输入..', + 'filter' => '筛选', + 'help' => '帮助', + 'all' => '全部', + 'all_type' => '所有 :type', + 'upcoming' => '待付账款', + 'created' => '已创建', + 'id' => 'ID', + 'more_actions' => '更多', + 'duplicate' => '复制', + 'unpaid' => '未付款', + 'paid' => '已付款', + 'overdue' => '已逾期', + 'partially' => '部分', + 'partially_paid' => '部分付款', + 'export' => '导出', + 'enable' => '启用', + 'disable' => '禁用', + + 'title' => [ + 'new' => '新增 :type', + 'edit' => '编辑 :type', + ], + + 'form' => [ + 'enter' => '输入 :field', + 'select' => [ + 'field' => '- 选择 :field -', + 'file' => '选择文件', + ], + 'no_file_selected' => '未选择文件...', + ], + +]; diff --git a/resources/lang/zh-CN/header.php b/resources/lang/zh-CN/header.php new file mode 100755 index 0000000..950b6c1 --- /dev/null +++ b/resources/lang/zh-CN/header.php @@ -0,0 +1,15 @@ + '更换语言', + 'last_login' => '上次登录时间 :time', + 'notifications' => [ + 'counter' => '{0} 您沒有任何通知 | {1} 您有 :count 个通知 | [2,*] 您有 :count个通知', + 'overdue_invoices' => '{1} :count 个逾期订单 | [2,*] :count 个逾期订单', + 'upcoming_bills' => '{1} :count 个即将到來的账单 | [2,*] :count 个即将到來的账单', + 'items_stock' => '{1} :count 項目无库存 | [2,*] :count 項目无库存', + 'view_all' => '查看全部' + ], + +]; diff --git a/resources/lang/zh-CN/import.php b/resources/lang/zh-CN/import.php new file mode 100755 index 0000000..13de8c7 --- /dev/null +++ b/resources/lang/zh-CN/import.php @@ -0,0 +1,9 @@ + '导入', + 'title' => '导入 :type', + 'message' => '允许的文件类型: CSV, XLS。请下载示例文件。', + +]; diff --git a/resources/lang/zh-CN/install.php b/resources/lang/zh-CN/install.php new file mode 100755 index 0000000..a8089c7 --- /dev/null +++ b/resources/lang/zh-CN/install.php @@ -0,0 +1,44 @@ + '下一步', + 'refresh' => '重新整理', + + 'steps' => [ + 'requirements' => '請檢查以下系統需求!', + 'language' => '步驟一:選擇語系', + 'database' => '步驟二:設定資料庫', + 'settings' => '步驟三:公司與管理員資訊', + ], + + 'language' => [ + 'select' => '選擇語系', + ], + + 'requirements' => [ + 'enabled' => ':feature 必須啟動!', + 'disabled' => ':feature 必須關閉!', + 'extension' => ':extension 必須載入!', + 'directory' => ':directory 必須可寫入!', + ], + + 'database' => [ + 'hostname' => '主機名稱', + 'username' => '使用者名稱', + 'password' => '密碼', + 'name' => '資料庫', + ], + + 'settings' => [ + 'company_name' => '公司名稱', + 'company_email' => '公司電子郵件', + 'admin_email' => '管理員電子郵件', + 'admin_password' => '管理員密碼', + ], + + 'error' => [ + 'connection' => '錯誤:無法連線到資料庫!請確認所提供的資訊正確無誤。', + ], + +]; diff --git a/resources/lang/zh-CN/invoices.php b/resources/lang/zh-CN/invoices.php new file mode 100755 index 0000000..2ee63f9 --- /dev/null +++ b/resources/lang/zh-CN/invoices.php @@ -0,0 +1,55 @@ + '订单号码', + 'invoice_date' => '订单日期', + 'total_price' => '总价', + 'due_date' => '到期日', + 'order_number' => '订单编号', + 'bill_to' => '账单收件人', + + 'quantity' => '数量', + 'price' => '价格', + 'sub_total' => '小计', + 'discount' => '折扣', + 'tax_total' => '税额', + 'total' => '总计', + + 'item_name' => '产品名称 | 产品名称', + + 'show_discount' => ':discount% 折扣', + 'add_discount' => '新增折扣', + 'discount_desc' => '小计', + + 'payment_due' => '付款到期日', + 'paid' => '已付款', + 'histories' => '历史记录', + 'payments' => '付款方式', + 'add_payment' => '新增付款方式', + 'mark_paid' => '标记为已付款', + 'mark_sent' => '标记为已发送', + 'download_pdf' => '下载 PDF格式', + 'send_mail' => '发送邮件', + + 'status' => [ + 'draft' => '草稿', + 'sent' => '已发送', + 'viewed' => '已浏览', + 'approved' => '已批准', + 'partial' => '部分', + 'paid' => '已付款', + ], + + 'messages' => [ + 'email_sent' => '成功发送账单邮件!', + 'marked_sent' => '成功标记账单为已发送!', + 'email_required' => '此客户沒有邮箱!', + ], + + 'notification' => [ + 'message' => '由于您有一个即将到來的 :amount 账单给客户 :customer,因此收到此邮件。', + 'button' => '立即付款', + ], + +]; diff --git a/resources/lang/zh-CN/items.php b/resources/lang/zh-CN/items.php new file mode 100755 index 0000000..16297ba --- /dev/null +++ b/resources/lang/zh-CN/items.php @@ -0,0 +1,15 @@ + '数量 | 数量', + 'sales_price' => '定价', + 'purchase_price' => '售价', + 'sku' => '库存', + + 'notification' => [ + 'message' => '由于 :name 已经无库存,因此您会收到此封邮件。', + 'button' => '现在查看', + ], + +]; diff --git a/resources/lang/zh-CN/messages.php b/resources/lang/zh-CN/messages.php new file mode 100755 index 0000000..b216071 --- /dev/null +++ b/resources/lang/zh-CN/messages.php @@ -0,0 +1,29 @@ + [ + 'added' => '已新增:type !', + 'updated' => '已更新:type !', + 'deleted' => '已刪除:type !', + 'duplicated' => ':type 重复!', + 'imported' => ':type 已导入!', + 'enabled' => ':type 已启用!', + 'disabled' => ':type 已禁用!', + ], + 'error' => [ + 'over_payment' => '错误:未加入付款方式!数量超过总计。', + 'not_user_company' => '错误:您不允许管理此公司!', + 'customer' => '错误:未创建用户!:name已经使用此邮箱。', + 'no_file' => '错误:沒有选择文件!', + 'last_category' => '错误:无法刪除最后一个 :type 分类!', + 'invalid_token' => '错误:token输入错误!', + 'import_column' => '错误: :message Sheet name: :sheet. Line number: :line.', + 'import_sheet' => '错误: Sheet name 无效. 请检查示例文件.', + ], + 'warning' => [ + 'deleted' => '警告:由于和 :text 相关,你不能刪除:name。', + 'disabled' => '警告:由于和 :text 相关,你不能停用:name。', + ], + +]; diff --git a/resources/lang/zh-CN/modules.php b/resources/lang/zh-CN/modules.php new file mode 100755 index 0000000..11eaafc --- /dev/null +++ b/resources/lang/zh-CN/modules.php @@ -0,0 +1,58 @@ + 'API Token', + 'api_token' => 'Token', + 'my_apps' => '我的应用', + 'top_paid' => '最佳销售', + 'new' => '新增', + 'top_free' => '最佳免费', + 'free' => '免费', + 'search' => '搜索', + 'install' => '安装', + 'buy_now' => '马上购买', + 'token_link' => '点这里取得您的 API token.', + 'no_apps' => '此分类中尚无App。', + 'developer' => '您是開發人員嗎?這裡可以幫助您學習如何建立應用程式並立即開始銷售!', + + 'about' => '關於', + + 'added' => '已新增', + 'updated' => '已更新', + 'compatibility' => '相容性', + + 'installed' => '已安裝 :module', + 'uninstalled' => '已移除 :module', + //'updated' => ':module updated', + 'enabled' => '已啟用 :module', + 'disabled' => '已停用 :module', + + 'tab' => [ + 'installation' => '安裝', + 'faq' => '常見問題', + 'changelog' => '更新日誌', + ], + + 'installation' => [ + 'header' => '應用程式安裝', + 'download' => '下載模組檔案中::module', + 'unzip' => '解開模組封裝中::module', + 'install' => '安裝 :module檔案中。', + ], + + 'badge' => [ + 'installed' => '安装成功', + ], + + 'button' => [ + 'uninstall' => '移除', + 'disable' => '停用', + 'enable' => '啟用', + ], + + 'my' => [ + 'purchased' => '已购买', + 'installed' => '已安装', + ], +]; diff --git a/resources/lang/zh-CN/notifications.php b/resources/lang/zh-CN/notifications.php new file mode 100755 index 0000000..33646c6 --- /dev/null +++ b/resources/lang/zh-CN/notifications.php @@ -0,0 +1,10 @@ + '啊噢!', + 'hello' => 'Hello!', + 'salutation' => '尊敬的,
    :company_name', + 'subcopy' => '如果您在点击":text" 按钮时遇到问题,请将以下网址复制并粘贴到您的网络浏览器中: [:url](:url)', + +]; diff --git a/resources/lang/zh-CN/pagination.php b/resources/lang/zh-CN/pagination.php new file mode 100755 index 0000000..9698685 --- /dev/null +++ b/resources/lang/zh-CN/pagination.php @@ -0,0 +1,9 @@ + '« 上一页', + 'next' => '下一页 »', + 'showing' => '显示 :first 至 :last 的 :total :type', + +]; diff --git a/resources/lang/zh-CN/passwords.php b/resources/lang/zh-CN/passwords.php new file mode 100755 index 0000000..a66bca0 --- /dev/null +++ b/resources/lang/zh-CN/passwords.php @@ -0,0 +1,22 @@ + '密码至少是六位字符并且匹配。', + 'reset' => '密码重置成功!', + 'sent' => '密码重置邮件已发送!', + 'token' => '密码重置令牌无效。', + 'user' => "找不到该邮箱对应的用户。", + +]; diff --git a/resources/lang/zh-CN/recurring.php b/resources/lang/zh-CN/recurring.php new file mode 100755 index 0000000..7e0d17a --- /dev/null +++ b/resources/lang/zh-CN/recurring.php @@ -0,0 +1,20 @@ + '循环', + 'every' => '每个', + 'period' => '周期', + 'times' => '次', + 'daily' => '每日', + 'weekly' => '每周', + 'monthly' => '每月', + 'yearly' => '每年', + 'custom' => '自定义', + 'days' => '天', + 'weeks' => '周', + 'months' => '月', + 'years' => '年', + 'message' => '这是一个循环的 :type 且下次的 :type 将会自动产生于 :date', + +]; diff --git a/resources/lang/zh-CN/reports.php b/resources/lang/zh-CN/reports.php new file mode 100755 index 0000000..e0712ce --- /dev/null +++ b/resources/lang/zh-CN/reports.php @@ -0,0 +1,30 @@ + '今年', + 'previous_year' => '去年', + 'this_quarter' => '本季', + 'previous_quarter' => '前一季', + 'last_12_months' => '过去 12 个月', + 'profit_loss' => '损益', + 'gross_profit' => '毛利', + 'net_profit' => '初始利润', + 'total_expenses' => '总费用', + 'net' => '初始', + + 'summary' => [ + 'income' => '收入概要', + 'expense' => '支出概要', + 'income_expense' => '收入 vs 支出', + 'tax' => '税务概要', + ], + + 'quarter' => [ + '1' => '一至三月', + '2' => '四至六月', + '3' => '七至九月', + '4' => '十至十二月', + ], + +]; diff --git a/resources/lang/zh-CN/settings.php b/resources/lang/zh-CN/settings.php new file mode 100755 index 0000000..b5d30aa --- /dev/null +++ b/resources/lang/zh-CN/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => '名称', + 'email' => '电子邮箱', + 'phone' => '电话', + 'address' => '地址', + 'logo' => '标志', + ], + 'localisation' => [ + 'tab' => '本地化', + 'date' => [ + 'format' => '日期格式', + 'separator' => '日期分隔', + 'dash' => '破折号 (-)', + 'dot' => '点 (.)', + 'comma' => '逗号 (,)', + 'slash' => '斜线 (/)', + 'space' => '空格 ( )', + ], + 'timezone' => '时区', + 'percent' => [ + 'title' => '百分比 (%) 位置', + 'before' => '编号之前', + 'after' => '编号之后', + ], + ], + 'invoice' => [ + 'tab' => '订单', + 'prefix' => '订单前缀', + 'digit' => '数字位数', + 'next' => '下一个号码', + 'logo' => 'Logo', + ], + 'default' => [ + 'tab' => '默认', + 'account' => '默认账户', + 'currency' => '默认货币', + 'tax' => '默认税率', + 'payment' => '默认付款方式', + 'language' => '默认语言', + ], + 'email' => [ + 'protocol' => '协议', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP IP', + 'port' => 'SMTP Port', + 'username' => 'SMTP 账户', + 'password' => 'SMTP 绵绵', + 'encryption' => 'SMTP 安全性', + 'none' => '无', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Sendmail 路径', + 'log' => '邮件日志', + ], + 'scheduling' => [ + 'tab' => '计划任务', + 'send_invoice' => '发送订单提醒', + 'invoice_days' => '与到期日后发送', + 'send_bill' => '发送账单提醒', + 'bill_days' => '与到期日前发送', + 'cron_command' => 'Cron命令', + 'schedule_time' => '执行时间', + ], + 'appearance' => [ + 'tab' => '显示', + 'theme' => '主题', + 'light' => '明亮', + 'dark' => '暗色', + 'list_limit' => '每页记录数量', + 'use_gravatar' => '使用 Gravatar(邮箱头像:不建议开启,影响系统速度)', + ], + 'system' => [ + 'tab' => '系统', + 'session' => [ + 'lifetime' => 'Session周期 (分钟)', + 'handler' => 'Session管理', + 'file' => '文件', + 'database' => '数据库', + ], + 'file_size' => '最大文件容量 (MB)', + 'file_types' => '允许文件格式', + ], + +]; diff --git a/resources/lang/zh-CN/taxes.php b/resources/lang/zh-CN/taxes.php new file mode 100755 index 0000000..ba57ab0 --- /dev/null +++ b/resources/lang/zh-CN/taxes.php @@ -0,0 +1,8 @@ + '税率', + 'rate_percent' => '税率 (%)', + +]; diff --git a/resources/lang/zh-CN/transfers.php b/resources/lang/zh-CN/transfers.php new file mode 100755 index 0000000..a6e3fa8 --- /dev/null +++ b/resources/lang/zh-CN/transfers.php @@ -0,0 +1,12 @@ + '来自账户', + 'to_account' => '收件账户', + + 'messages' => [ + 'delete' => ':from to :to (:amount)', + ], + +]; diff --git a/resources/lang/zh-CN/updates.php b/resources/lang/zh-CN/updates.php new file mode 100755 index 0000000..b52875d --- /dev/null +++ b/resources/lang/zh-CN/updates.php @@ -0,0 +1,15 @@ + '已安装版本', + 'latest_version' => '最新版本', + 'update' => '更新 Akaunting 至 :version 版', + 'changelog' => '更新日誌', + 'check' => '檢查', + 'new_core' => '新版 Akaunting 已準備好。', + 'latest_core' => '太好了!你已經使用最新版 Akaunting,未來將會自動套用安全性更新。', + 'success' => '更新程序已完成。', + 'error' => '更新程序失敗,請重試。', + +]; diff --git a/resources/lang/zh-CN/validation.php b/resources/lang/zh-CN/validation.php new file mode 100755 index 0000000..27872f8 --- /dev/null +++ b/resources/lang/zh-CN/validation.php @@ -0,0 +1,120 @@ + '必须接受 :attribute。', + 'active_url' => ':attribute 并非一个有效的网址。', + 'after' => ':attribute 必须要晚于 :date。', + 'after_or_equal' => ':attribute 必须要等于 :date 或更晚', + 'alpha' => ':attribute 只能以字母组成。', + 'alpha_dash' => ':attribute 只能以字母、数字及斜线组成。', + 'alpha_num' => ':attribute 只能以字母及数字组成。', + 'array' => ':attribute 必须为数组。', + 'before' => ':attribute 必须要早于 :date。', + 'before_or_equal' => ':attribute 必须要等于 :date 或更早。', + 'between' => [ + 'numeric' => ':attribute 必须介于 :min 至 :max 之间。', + 'file' => ':attribute 必须介于 :min 至 :max kb 之间。 ', + 'string' => ':attribute 必须介于 :min 至 :max 个字符之间。', + 'array' => ':attribute: 必须有 :min - :max 个元素。', + ], + 'boolean' => ':attribute 必须为布尔值(是、否/真、假)。', + 'confirmed' => ':attribute 确认值的输入不一致。', + 'date' => ':attribute 并非一个有效日期。', + 'date_format' => ':attribute 不符合 :format 的格式。', + 'different' => ':attribute 与 :other 必须不同。', + 'digits' => ':attribute 必须是 :digits 位数字。', + 'digits_between' => ':attribute 必须介于 :min 至 :max 位数字。', + 'dimensions' => ':attribute 图片尺寸不正确。', + 'distinct' => ':attribute 已存在。', + 'email' => ':attribute 必须是有效的邮箱。', + 'exists' => '所选择的 :attribute 选项无效。', + 'file' => ':attribute 必须是文件。', + 'filled' => ':attribute 不能留空。', + 'image' => ':attribute 必须是图片。', + 'in' => '所选择的 :attribute 选项无效。', + 'in_array' => ':attribute 没有在 :other 中。', + 'integer' => ':attribute 必须是整数。', + 'ip' => ':attribute 必须是有效的 IP 地址。', + 'json' => ':attribute 必须是正确的 JSON 字符串。', + 'max' => [ + 'numeric' => ':attribute 不能大于 :max。', + 'file' => ':attribute 不能大于 :max kb。', + 'string' => ':attribute 不能多于 :max 个字符。', + 'array' => ':attribute 最多有 :max 个元素。', + ], + 'mimes' => ':attribute 必须为 :values 的文件。', + 'mimetypes' => ':attribute 必须为 :values 的文件。', + 'min' => [ + 'numeric' => ':attribute 不能小于 :min。', + 'file' => ':attribute 不能小于 :min kb。', + 'string' => ':attribute 不能小于 :min 个字符。', + 'array' => ':attribute 至少有 :min 个元素。', + ], + 'not_in' => '所选择的 :attribute 选项无效。', + 'numeric' => ':attribute 必须为数字。', + 'present' => ':attribute 必须存在。', + 'regex' => ':attribute 的格式错误。', + 'required' => ':attribute 不能留空。', + 'required_if' => '当 :other 是 :value 时 :attribute 不能留空。', + 'required_unless' => '当 :other 不是 :value 时 :attribute 不能留空。', + 'required_with' => '当 :values 出现时 :attribute 不能留空。', + 'required_with_all' => '当 :values 出现时 :attribute 不能為空。', + 'required_without' => '当 :values 留空时 :attribute field 不能留空。', + 'required_without_all' => '当 :values 都不出现时 :attribute 不能留空。', + 'same' => ':attribute 与 :other 必须相同。', + 'size' => [ + 'numeric' => ':attribute 的大小必须是 :size。', + 'file' => ':attribute 的大小必须是 :size kb。', + 'string' => ':attribute 必须是 :size 个字符。', + 'array' => ':attribute 必须是 :size 个元素。', + ], + 'string' => ':attribute 必须是字符串。', + 'timezone' => ':attribute 必须是争取的时区值。', + 'unique' => ':attribute 已经存在。', + 'uploaded' => ':attribute 上传失败。', + 'url' => ':attribute 的格式错误。', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => '自定信息', + ], + 'invalid_currency' => ':attribute code 无效.', + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/zh-TW/accounts.php b/resources/lang/zh-TW/accounts.php new file mode 100755 index 0000000..325d7a2 --- /dev/null +++ b/resources/lang/zh-TW/accounts.php @@ -0,0 +1,14 @@ + '帳戶名稱', + 'number' => '編號', + 'opening_balance' => '期初餘額', + 'current_balance' => '目前餘額', + 'bank_name' => '銀行名稱', + 'bank_phone' => '銀行電話', + 'bank_address' => '銀行地址', + 'default_account' => '預設帳戶', + +]; diff --git a/resources/lang/zh-TW/auth.php b/resources/lang/zh-TW/auth.php new file mode 100755 index 0000000..ed38d6f --- /dev/null +++ b/resources/lang/zh-TW/auth.php @@ -0,0 +1,30 @@ + '個人檔案', + 'logout' => '登出', + 'login' => '登入', + 'login_to' => '登入以開始您的工作', + 'remember_me' => '記住登入資訊', + 'forgot_password' => '忘記密碼', + 'reset_password' => '重設密碼', + 'enter_email' => '輸入您的電子郵件', + 'current_email' => '目前的電子郵件', + 'reset' => '重設', + 'never' => '永遠不要', + 'password' => [ + 'current' => '密碼', + 'current_confirm' => '確認密碼', + 'new' => '新的密碼', + 'new_confirm' => '確認新的密碼', + ], + 'error' => [ + 'self_delete' => '錯誤:無法刪除自己!' + ], + + 'failed' => '使用者名稱或密碼錯誤', + 'disabled' => '此帳號已被停用,請聯繫系統管理員。', + 'throttle' => '嘗試登入太多次,請在 :seconds 秒後再試。', + +]; diff --git a/resources/lang/zh-TW/bills.php b/resources/lang/zh-TW/bills.php new file mode 100755 index 0000000..ad69e76 --- /dev/null +++ b/resources/lang/zh-TW/bills.php @@ -0,0 +1,46 @@ + '帳單編號', + 'bill_date' => '帳單日期', + 'total_price' => '總價', + 'due_date' => '到期日', + 'order_number' => '訂單編號', + 'bill_from' => '帳單來自', + + 'quantity' => '數量', + 'price' => '售價', + 'sub_total' => '小計', + 'discount' => '折扣', + 'tax_total' => '稅額', + 'total' => '總計', + + 'item_name' => '產品名稱 | 產品名稱', + + 'show_discount' => ':discount% 折扣', + 'add_discount' => '新增折扣', + 'discount_desc' => '小計', + + 'payment_due' => '付款到期日', + 'amount_due' => '到期金額', + 'paid' => '已付款', + 'histories' => '歷史記錄', + 'payments' => '付款方式', + 'add_payment' => '新增付款方式', + 'mark_received' => '標記已收到', + 'download_pdf' => '下載 PDF格式', + 'send_mail' => '傳送電子郵件', + + 'status' => [ + 'draft' => '草稿', + 'received' => '已收到', + 'partial' => '部分', + 'paid' => '已付款', + ], + + 'messages' => [ + 'received' => '成功標記帳單為已收到!', + ], + +]; diff --git a/resources/lang/zh-TW/companies.php b/resources/lang/zh-TW/companies.php new file mode 100755 index 0000000..0ba2aa4 --- /dev/null +++ b/resources/lang/zh-TW/companies.php @@ -0,0 +1,13 @@ + '網域', + 'logo' => '商標', + 'manage' => '管理公司', + 'all' => '所有公司', + 'error' => [ + 'delete_active' => '錯誤:不能刪除使用中的公司,請先修改!', + ], + +]; diff --git a/resources/lang/zh-TW/currencies.php b/resources/lang/zh-TW/currencies.php new file mode 100755 index 0000000..0eb912f --- /dev/null +++ b/resources/lang/zh-TW/currencies.php @@ -0,0 +1,18 @@ + '代碼', + 'rate' => '稅率', + 'default' => '預設貨幣', + 'decimal_mark' => '十進位標記', + 'thousands_separator' => '千分位', + 'precision' => '精確度', + 'symbol' => [ + 'symbol' => '符號', + 'position' => '符號位置', + 'before' => '金額前方', + 'after' => '金額後方', + ] + +]; diff --git a/resources/lang/zh-TW/customers.php b/resources/lang/zh-TW/customers.php new file mode 100755 index 0000000..7fbf7ab --- /dev/null +++ b/resources/lang/zh-TW/customers.php @@ -0,0 +1,11 @@ + '允許登入?', + 'user_created' => '已建立使用者', + + 'error' => [ + 'email' => '此郵件已被使用。' + ] +]; diff --git a/resources/lang/zh-TW/dashboard.php b/resources/lang/zh-TW/dashboard.php new file mode 100755 index 0000000..568b85b --- /dev/null +++ b/resources/lang/zh-TW/dashboard.php @@ -0,0 +1,24 @@ + '總收入', + 'receivables' => '應收帳款', + 'open_invoices' => '未結訂單', + 'overdue_invoices' => '逾期訂單', + 'total_expenses' => '總費用', + 'payables' => '應付帳款', + 'open_bills' => '未結帳單', + 'overdue_bills' => '逾期帳單', + 'total_profit' => '總利潤', + 'open_profit' => '初始利潤', + 'overdue_profit' => '逾期利潤', + 'cash_flow' => '金流', + 'no_profit_loss' => '無利潤損失', + 'incomes_by_category' => '收入分類', + 'expenses_by_category' => '支出分類', + 'account_balance' => '帳戶餘額', + 'latest_incomes' => '近期收入', + 'latest_expenses' => '近期支出', + +]; diff --git a/resources/lang/zh-TW/demo.php b/resources/lang/zh-TW/demo.php new file mode 100755 index 0000000..ad67dcb --- /dev/null +++ b/resources/lang/zh-TW/demo.php @@ -0,0 +1,17 @@ + '現金', + 'categories_uncat' => '未分類', + 'categories_deposit' => '存款', + 'categories_sales' => '業務人員', + 'currencies_usd' => '美金', + 'currencies_eur' => '歐元', + 'currencies_gbp' => '英鎊', + 'currencies_try' => '土耳其里拉', + 'taxes_exempt' => '免稅', + 'taxes_normal' => '一般稅率', + 'taxes_sales' => '銷售稅', + +]; diff --git a/resources/lang/zh-TW/footer.php b/resources/lang/zh-TW/footer.php new file mode 100755 index 0000000..cee1104 --- /dev/null +++ b/resources/lang/zh-TW/footer.php @@ -0,0 +1,9 @@ + '版本', + 'powered' => 'Powered By Akaunting', + 'software' => '免費會計軟體', + +]; diff --git a/resources/lang/zh-TW/general.php b/resources/lang/zh-TW/general.php new file mode 100755 index 0000000..f40aa0d --- /dev/null +++ b/resources/lang/zh-TW/general.php @@ -0,0 +1,117 @@ + '產品 | 產品', + 'incomes' => '收入 | 收入', + 'invoices' => '訂單 | 訂單', + 'revenues' => '營業額 | 營業額', + 'customers' => '客戶 | 客戶', + 'expenses' => '支出 | 支出', + 'bills' => '帳單 | 帳單', + 'payments' => '付款 | 付款', + 'vendors' => '供應商 | 供應商', + 'accounts' => '帳戶 | 帳戶', + 'transfers' => '移轉 | 移轉', + 'transactions' => '交易 | 交易', + 'reports' => '報告 | 報告', + 'settings' => '設定 | 設定', + 'categories' => '分類 | 分類', + 'currencies' => '幣別 | 幣別', + 'tax_rates' => '稅率 | 稅率', + 'users' => '使用者 | 使用者', + 'roles' => '角色 | 角色', + 'permissions' => '權限 | 權限', + 'modules' => 'App|Apps', + 'companies' => '公司 | 公司', + 'profits' => '利潤 | 利潤', + 'taxes' => '稅額 | 稅額', + 'logos' => '標誌 | 標誌', + 'pictures' => '圖片 | 圖片', + 'types' => '類型 | 類型', + 'payment_methods' => '付款方式 | 付款方式', + 'compares' => '收入vs支出 | 收入vs支出', + 'notes' => '備註 | 備註', + 'totals' => '總計 | 總計', + 'languages' => '語言 | 語言', + 'updates' => '更新 | 更新', + 'numbers' => '編號 | 編號', + 'statuses' => '狀態 | 狀態', + 'others' => '其他 | 其他', + + 'dashboard' => '控制面板', + 'banking' => '銀行', + 'general' => '一般', + 'no_records' => '尚無記錄。', + 'date' => '日期', + 'amount' => '金額', + 'enabled' => '啟用', + 'disabled' => '停用', + 'yes' => '是', + 'no' => '否', + 'na' => 'N/A', + 'daily' => '每日', + 'monthly' => '每月', + 'quarterly' => '每季度', + 'yearly' => '每年', + 'add' => '新增', + 'add_new' => '新增', + 'show' => '顯示', + 'edit' => '編輯', + 'delete' => '刪除', + 'send' => '傳送', + 'download' => '下載', + 'delete_confirm' => '確認刪除 :name :type ?', + 'name' => '名稱', + 'email' => '電子郵件', + 'tax_number' => '統一編號', + 'phone' => '電話', + 'address' => '地址', + 'website' => '網站', + 'actions' => '操作', + 'description' => '描述', + 'manage' => '管理', + 'code' => '代碼', + 'alias' => '別名', + 'balance' => '餘額', + 'reference' => '参考', + 'attachment' => '附件', + 'change' => '修改', + 'switch' => '切換', + 'color' => '顏色', + 'save' => '儲存', + 'cancel' => '取消', + 'from' => '來自', + 'to' => '收件人', + 'print' => '列印', + 'search' => '搜尋', + 'search_placeholder' => '輸入搜尋..', + 'filter' => '篩選', + 'help' => '說明', + 'all' => '全部', + 'all_type' => '所有 :type', + 'upcoming' => '即將到來', + 'created' => '已建立', + 'id' => '編號', + 'more_actions' => '更多動作', + 'duplicate' => '複製', + 'unpaid' => '未付款', + 'paid' => '已付款', + 'overdue' => '已逾期', + 'partially' => '部分', + 'partially_paid' => '部分付款', + + 'title' => [ + 'new' => '新增 :type', + 'edit' => '編輯 :type', + ], + 'form' => [ + 'enter' => '輸入 :field', + 'select' => [ + 'field' => '- 選擇 :field -', + 'file' => '選擇檔案', + ], + 'no_file_selected' => '尚未選擇檔案...', + ], + +]; diff --git a/resources/lang/zh-TW/header.php b/resources/lang/zh-TW/header.php new file mode 100755 index 0000000..b59c6d1 --- /dev/null +++ b/resources/lang/zh-TW/header.php @@ -0,0 +1,15 @@ + '變更語系', + 'last_login' => '上次登入時間 :time', + 'notifications' => [ + 'counter' => '{0} 您沒有任何通知 | {1} 您有 :count 個通知 | [2,*] 您有 :count個通知', + 'overdue_invoices' => '{1} :count 張逾期訂單 | [2,*] :count 張逾期訂單', + 'upcoming_bills' => '{1} :count 張即將到來的帳單 | [2,*] :count 張即將到來的帳單', + 'items_stock' => '{1} :count 項目無庫存 | [2,*] :count 項目無庫存', + 'view_all' => '檢視全部' + ], + +]; diff --git a/resources/lang/zh-TW/import.php b/resources/lang/zh-TW/import.php new file mode 100755 index 0000000..23a07f1 --- /dev/null +++ b/resources/lang/zh-TW/import.php @@ -0,0 +1,9 @@ + '匯入', + 'title' => '匯入 :type', + 'message' => '允許的檔案類型: CSV, XLS。請下載範例檔案。', + +]; diff --git a/resources/lang/zh-TW/install.php b/resources/lang/zh-TW/install.php new file mode 100755 index 0000000..a8089c7 --- /dev/null +++ b/resources/lang/zh-TW/install.php @@ -0,0 +1,44 @@ + '下一步', + 'refresh' => '重新整理', + + 'steps' => [ + 'requirements' => '請檢查以下系統需求!', + 'language' => '步驟一:選擇語系', + 'database' => '步驟二:設定資料庫', + 'settings' => '步驟三:公司與管理員資訊', + ], + + 'language' => [ + 'select' => '選擇語系', + ], + + 'requirements' => [ + 'enabled' => ':feature 必須啟動!', + 'disabled' => ':feature 必須關閉!', + 'extension' => ':extension 必須載入!', + 'directory' => ':directory 必須可寫入!', + ], + + 'database' => [ + 'hostname' => '主機名稱', + 'username' => '使用者名稱', + 'password' => '密碼', + 'name' => '資料庫', + ], + + 'settings' => [ + 'company_name' => '公司名稱', + 'company_email' => '公司電子郵件', + 'admin_email' => '管理員電子郵件', + 'admin_password' => '管理員密碼', + ], + + 'error' => [ + 'connection' => '錯誤:無法連線到資料庫!請確認所提供的資訊正確無誤。', + ], + +]; diff --git a/resources/lang/zh-TW/invoices.php b/resources/lang/zh-TW/invoices.php new file mode 100755 index 0000000..fed4f1e --- /dev/null +++ b/resources/lang/zh-TW/invoices.php @@ -0,0 +1,55 @@ + '訂單號碼', + 'invoice_date' => '訂單日期', + 'total_price' => '總價', + 'due_date' => '到期日', + 'order_number' => '訂單編號', + 'bill_to' => '帳單收件人', + + 'quantity' => '數量', + 'price' => '售價', + 'sub_total' => '小計', + 'discount' => '折扣', + 'tax_total' => '稅額', + 'total' => '總計', + + 'item_name' => '產品名稱 | 產品名稱', + + 'show_discount' => ':discount% 折扣', + 'add_discount' => '新增折扣', + 'discount_desc' => '小計', + + 'payment_due' => '付款到期日', + 'paid' => '已付款', + 'histories' => '歷史記錄', + 'payments' => '付款方式', + 'add_payment' => '新增付款方式', + 'mark_paid' => '標記為已付款', + 'mark_sent' => '標記為已傳送', + 'download_pdf' => '下載 PDF格式', + 'send_mail' => '傳送電子郵件', + + 'status' => [ + 'draft' => '草稿', + 'sent' => '已傳送', + 'viewed' => '已瀏覽', + 'approved' => '已批准', + 'partial' => '部分', + 'paid' => '已付款', + ], + + 'messages' => [ + 'email_sent' => '成功傳送帳單郵件!', + 'marked_sent' => '成功標記帳單為已傳送!', + 'email_required' => '此客戶沒有電子郵件地址!', + ], + + 'notification' => [ + 'message' => '由於您有一個即將到來的 :amount 帳單給客戶 :customer,因此收到此封郵件。', + 'button' => '立即付款', + ], + +]; diff --git a/resources/lang/zh-TW/items.php b/resources/lang/zh-TW/items.php new file mode 100755 index 0000000..cc46096 --- /dev/null +++ b/resources/lang/zh-TW/items.php @@ -0,0 +1,15 @@ + '數量 | 數量', + 'sales_price' => '定價', + 'purchase_price' => '售價', + 'sku' => '庫存', + + 'notification' => [ + 'message' => '由於 :name 已經無庫存,因此您會收到此封郵件。', + 'button' => '現在檢視', + ], + +]; diff --git a/resources/lang/zh-TW/messages.php b/resources/lang/zh-TW/messages.php new file mode 100755 index 0000000..9705afd --- /dev/null +++ b/resources/lang/zh-TW/messages.php @@ -0,0 +1,25 @@ + [ + 'added' => '已新增:type !', + 'updated' => '已更新:type !', + 'deleted' => '已刪除:type !', + 'duplicated' => ':type 重複!', + 'imported' => ':type 已匯入!', + ], + 'error' => [ + 'over_payment' => '錯誤:未加入付款方式!數量超過總計。', + 'not_user_company' => '錯誤:您不允許管理此公司!', + 'customer' => '錯誤:未建立使用者!:name已經使用此電子郵件。', + 'no_file' => '錯誤:沒有選擇檔案!', + 'last_category' => '錯誤:無法刪除最後一個 :type 分類!', + 'invalid_token' => '錯誤:token輸入錯誤!', + ], + 'warning' => [ + 'deleted' => '警告:由於和 :text 相關,你不能刪除:name。', + 'disabled' => '警告:由於和 :text 相關,你不能停用:name。', + ], + +]; diff --git a/resources/lang/zh-TW/modules.php b/resources/lang/zh-TW/modules.php new file mode 100755 index 0000000..7703db7 --- /dev/null +++ b/resources/lang/zh-TW/modules.php @@ -0,0 +1,48 @@ + 'API Token', + 'api_token' => 'Token', + 'top_paid' => '最佳銷售', + 'new' => '新增', + 'top_free' => '最佳免費', + 'free' => '免費', + 'search' => '搜尋', + 'install' => '安裝', + 'buy_now' => '現在購買', + 'token_link' => '點這裡取得您的 API token.', + 'no_apps' => '此分類中尚無應用程式。', + 'developer' => '您是開發人員嗎?這裡可以幫助您學習如何建立應用程式並立即開始銷售!', + + 'about' => '關於', + + 'added' => '已新增', + 'updated' => '已更新', + 'compatibility' => '相容性', + + 'installed' => '已安裝 :module', + 'uninstalled' => '已移除 :module', + //'updated' => ':module updated', + 'enabled' => '已啟用 :module', + 'disabled' => '已停用 :module', + + 'tab' => [ + 'installation' => '安裝', + 'faq' => '常見問題', + 'changelog' => '更新日誌', + ], + + 'installation' => [ + 'header' => '應用程式安裝', + 'download' => '下載模組檔案中::module', + 'unzip' => '解開模組封裝中::module', + 'install' => '安裝 :module檔案中。', + ], + + 'button' => [ + 'uninstall' => '移除', + 'disable' => '停用', + 'enable' => '啟用', + ], +]; diff --git a/resources/lang/zh-TW/pagination.php b/resources/lang/zh-TW/pagination.php new file mode 100755 index 0000000..ca04fdb --- /dev/null +++ b/resources/lang/zh-TW/pagination.php @@ -0,0 +1,9 @@ + '« 上一頁', + 'next' => '下一頁 »', + 'showing' => '顯示 :first 至 :last 的 :total :type', + +]; diff --git a/resources/lang/zh-TW/passwords.php b/resources/lang/zh-TW/passwords.php new file mode 100755 index 0000000..f1b382f --- /dev/null +++ b/resources/lang/zh-TW/passwords.php @@ -0,0 +1,22 @@ + '密碼至少要有六個字元且與密碼確認欄位一致。', + 'reset' => '密碼已成功重設!', + 'sent' => '密碼重設郵件已發送!', + 'token' => '密碼重設隨機碼 (token) 無效。', + 'user' => "找不到該電子郵件信箱對應的使用者。", + +]; diff --git a/resources/lang/zh-TW/recurring.php b/resources/lang/zh-TW/recurring.php new file mode 100755 index 0000000..b90ddf5 --- /dev/null +++ b/resources/lang/zh-TW/recurring.php @@ -0,0 +1,20 @@ + '循環', + 'every' => '每個', + 'period' => '週期', + 'times' => '次', + 'daily' => '每日', + 'weekly' => '每週', + 'monthly' => '每月', + 'yearly' => '每年', + 'custom' => '自訂', + 'days' => '天', + 'weeks' => '週', + 'months' => '月', + 'years' => '年', + 'message' => '這是一個循環的 :type 且下次的 :type 將會自動產生於 :date', + +]; diff --git a/resources/lang/zh-TW/reports.php b/resources/lang/zh-TW/reports.php new file mode 100755 index 0000000..1ec9165 --- /dev/null +++ b/resources/lang/zh-TW/reports.php @@ -0,0 +1,30 @@ + '今年', + 'previous_year' => '去年', + 'this_quarter' => '本季', + 'previous_quarter' => '前一季', + 'last_12_months' => '過去 12 個月', + 'profit_loss' => '損益', + 'gross_profit' => '毛利', + 'net_profit' => '初始利潤', + 'total_expenses' => '總費用', + 'net' => '初始', + + 'summary' => [ + 'income' => '收入概要', + 'expense' => '支出概要', + 'income_expense' => '收入 vs 支出', + 'tax' => '稅務概要', + ], + + 'quarter' => [ + '1' => '一至三月', + '2' => '四至六月', + '3' => '七至九月', + '4' => '十至十二月', + ], + +]; diff --git a/resources/lang/zh-TW/settings.php b/resources/lang/zh-TW/settings.php new file mode 100755 index 0000000..e46a9ff --- /dev/null +++ b/resources/lang/zh-TW/settings.php @@ -0,0 +1,90 @@ + [ + 'name' => '名稱', + 'email' => '電子郵件', + 'phone' => '電話', + 'address' => '地址', + 'logo' => '商標', + ], + 'localisation' => [ + 'tab' => '本地化', + 'date' => [ + 'format' => '日期格式', + 'separator' => '日期分隔', + 'dash' => '破折號 (-)', + 'dot' => '點 (.)', + 'comma' => '逗號 (,)', + 'slash' => '斜線 (/)', + 'space' => '空格 ( )', + ], + 'timezone' => '時區', + 'percent' => [ + 'title' => '百分比 (%) 位置', + 'before' => '編號之前', + 'after' => '編號之後', + ], + ], + 'invoice' => [ + 'tab' => '訂單', + 'prefix' => '數字字軌', + 'digit' => '數字位數', + 'next' => '下一個號碼', + 'logo' => '商標', + ], + 'default' => [ + 'tab' => '預設', + 'account' => '預設帳號', + 'currency' => '預設貨幣', + 'tax' => '預設稅率', + 'payment' => '預設付款方式', + 'language' => '預設語言', + ], + 'email' => [ + 'protocol' => '協定', + 'php' => 'PHP Mail', + 'smtp' => [ + 'name' => 'SMTP', + 'host' => 'SMTP 主機', + 'port' => 'SMTP 通訊埠', + 'username' => 'SMTP 帳號', + 'password' => 'SMTP 密碼', + 'encryption' => 'SMTP 安全性', + 'none' => '無', + ], + 'sendmail' => 'Sendmail', + 'sendmail_path' => 'Sendmail 路徑', + 'log' => '郵件日誌', + ], + 'scheduling' => [ + 'tab' => '排程', + 'send_invoice' => '傳送訂單提醒', + 'invoice_days' => '於到期日後傳送', + 'send_bill' => '傳送帳單提醒', + 'bill_days' => '於到期日前傳送', + 'cron_command' => 'Cron指令', + 'schedule_time' => '執行時間', + ], + 'appearance' => [ + 'tab' => '外觀', + 'theme' => '主題', + 'light' => '明亮', + 'dark' => '暗色', + 'list_limit' => '每頁記錄', + 'use_gravatar' => '使用 Gravatar', + ], + 'system' => [ + 'tab' => '系統', + 'session' => [ + 'lifetime' => '工作階段保存 (分鐘)', + 'handler' => '工作階段管理員', + 'file' => '檔案', + 'database' => '資料庫', + ], + 'file_size' => '最大檔案容量 (MB)', + 'file_types' => '允許檔案格式', + ], + +]; diff --git a/resources/lang/zh-TW/taxes.php b/resources/lang/zh-TW/taxes.php new file mode 100755 index 0000000..32fc24d --- /dev/null +++ b/resources/lang/zh-TW/taxes.php @@ -0,0 +1,8 @@ + '稅率', + 'rate_percent' => '稅率 (%)', + +]; diff --git a/resources/lang/zh-TW/transfers.php b/resources/lang/zh-TW/transfers.php new file mode 100755 index 0000000..b06e9c9 --- /dev/null +++ b/resources/lang/zh-TW/transfers.php @@ -0,0 +1,8 @@ + '來自帳戶', + 'to_account' => '收件帳戶', + +]; diff --git a/resources/lang/zh-TW/updates.php b/resources/lang/zh-TW/updates.php new file mode 100755 index 0000000..419c967 --- /dev/null +++ b/resources/lang/zh-TW/updates.php @@ -0,0 +1,15 @@ + '已安裝版本', + 'latest_version' => '最新版本', + 'update' => '更新 Akaunting 至 :version 版', + 'changelog' => '更新日誌', + 'check' => '檢查', + 'new_core' => '新版 Akaunting 已準備好。', + 'latest_core' => '太好了!你已經使用最新版 Akaunting,未來將會自動套用安全性更新。', + 'success' => '更新程序已完成。', + 'error' => '更新程序失敗,請重試。', + +]; diff --git a/resources/lang/zh-TW/validation.php b/resources/lang/zh-TW/validation.php new file mode 100755 index 0000000..758ab33 --- /dev/null +++ b/resources/lang/zh-TW/validation.php @@ -0,0 +1,119 @@ + '必須接受 :attribute。', + 'active_url' => ':attribute 並非一個有效的網址。', + 'after' => ':attribute 必須要晚於 :date。', + 'after_or_equal' => ':attribute 必須要等於 :date 或更晚', + 'alpha' => ':attribute 只能以字母組成。', + 'alpha_dash' => ':attribute 只能以字母、數字及斜線組成。', + 'alpha_num' => ':attribute 只能以字母及數字組成。', + 'array' => ':attribute 必須為陣列。', + 'before' => ':attribute 必須要早於 :date。', + 'before_or_equal' => ':attribute 必須要等於 :date 或更早。', + 'between' => [ + 'numeric' => ':attribute 必須介於 :min 至 :max 之間。', + 'file' => ':attribute 必須介於 :min 至 :max kb 之間。 ', + 'string' => ':attribute 必須介於 :min 至 :max 個字元之間。', + 'array' => ':attribute: 必須有 :min - :max 個元素。', + ], + 'boolean' => ':attribute 必須為布林值。', + 'confirmed' => ':attribute 確認欄位的輸入不一致。', + 'date' => ':attribute 並非一個有效的日期。', + 'date_format' => ':attribute 不符合 :format 的格式。', + 'different' => ':attribute 與 :other 必須不同。', + 'digits' => ':attribute 必須是 :digits 位數字。', + 'digits_between' => ':attribute 必須介於 :min 至 :max 位數字。', + 'dimensions' => ':attribute 圖片尺寸不正確。', + 'distinct' => ':attribute 已經存在。', + 'email' => ':attribute 必須是有效的電子郵件位址。', + 'exists' => '所選擇的 :attribute 選項無效。', + 'file' => ':attribute 必須是一個檔案。', + 'filled' => ':attribute 不能留空。', + 'image' => ':attribute 必須是一張圖片。', + 'in' => '所選擇的 :attribute 選項無效。', + 'in_array' => ':attribute 沒有在 :other 中。', + 'integer' => ':attribute 必須是一個整數。', + 'ip' => ':attribute 必須是一個有效的 IP 位址。', + 'json' => ':attribute 必須是正確的 JSON 字串。', + 'max' => [ + 'numeric' => ':attribute 不能大於 :max。', + 'file' => ':attribute 不能大於 :max kb。', + 'string' => ':attribute 不能多於 :max 個字元。', + 'array' => ':attribute 最多有 :max 個元素。', + ], + 'mimes' => ':attribute 必須為 :values 的檔案。', + 'mimetypes' => ':attribute 必須為 :values 的檔案。', + 'min' => [ + 'numeric' => ':attribute 不能小於 :min。', + 'file' => ':attribute 不能小於 :min kb。', + 'string' => ':attribute 不能小於 :min 個字元。', + 'array' => ':attribute 至少有 :min 個元素。', + ], + 'not_in' => '所選擇的 :attribute 選項無效。', + 'numeric' => ':attribute 必須為一個數字。', + 'present' => ':attribute 必須存在。', + 'regex' => ':attribute 的格式錯誤。', + 'required' => ':attribute 不能留空。', + 'required_if' => '當 :other 是 :value 時 :attribute 不能留空。', + 'required_unless' => '當 :other 不是 :value 時 :attribute 不能留空。', + 'required_with' => '當 :values 出現時 :attribute 不能留空。', + 'required_with_all' => '當 :values 出現時 :attribute 不能為空。', + 'required_without' => '當 :values 留空時 :attribute field 不能留空。', + 'required_without_all' => '當 :values 都不出現時 :attribute 不能留空。', + 'same' => ':attribute 與 :other 必須相同。', + 'size' => [ + 'numeric' => ':attribute 的大小必須是 :size。', + 'file' => ':attribute 的大小必須是 :size kb。', + 'string' => ':attribute 必須是 :size 個字元。', + 'array' => ':attribute 必須是 :size 個元素。', + ], + 'string' => ':attribute 必須是一個字串。', + 'timezone' => ':attribute 必須是一個正確的時區值。', + 'unique' => ':attribute 已經存在。', + 'uploaded' => ':attribute 上傳失敗。', + 'url' => ':attribute 的格式錯誤。', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => '自訂訊息', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/views/auth/forgot/create.blade.php b/resources/views/auth/forgot/create.blade.php new file mode 100755 index 0000000..13f90da --- /dev/null +++ b/resources/views/auth/forgot/create.blade.php @@ -0,0 +1,32 @@ +@extends('layouts.auth') + +@section('title', trans('auth.reset_password')) +@section('message', trans('auth.reset_password')) + +@section('content') +
    + {{ csrf_field() }} + + @stack('email_input_start') + +
    + + + @if ($errors->has('email')) + + {{ $errors->first('email') }} + + @endif +
    + + @stack('email_input_end') + +
    + +
    + +
    + +
    +
    +@endsection diff --git a/resources/views/auth/login/create.blade.php b/resources/views/auth/login/create.blade.php new file mode 100755 index 0000000..90d9d1a --- /dev/null +++ b/resources/views/auth/login/create.blade.php @@ -0,0 +1,76 @@ +@extends('layouts.auth') + +@section('title', trans('auth.login')) +@section('message', trans('auth.login_to')) + +@section('content') +
    + {{ csrf_field() }} + + @stack('email_input_start') +
    + + + @if ($errors->has('email')) + + {{ $errors->first('email') }} + + @endif +
    + @stack('email_input_end') + + @stack('password_input_start') +
    + + + @if ($errors->has('password')) + + {{ $errors->first('password') }} + + @endif +
    + @stack('password_input_end') + +
    + @stack('remember_input_start') +
    +
    + +
    +
    + @stack('remember_input_end') + + +
    + +
    + +
    +
    + +{{ trans('auth.forgot_password') }}
    +@endsection + +@push('js') + + +@endpush + +@push('css') + + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/auth/permissions/create.blade.php b/resources/views/auth/permissions/create.blade.php new file mode 100755 index 0000000..d5f693e --- /dev/null +++ b/resources/views/auth/permissions/create.blade.php @@ -0,0 +1,25 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.new', ['type' => trans_choice('general.permissions', 1)])) + +@section('content') + +
    + {!! Form::open(['url' => 'auth/permissions', 'role' => 'form']) !!} + +
    + {{ Form::textGroup('display_name', trans('general.name'), 'id-card-o') }} + + {{ Form::textGroup('name', trans('general.code'), 'code') }} + + {{ Form::textareaGroup('description', trans('general.description')) }} +
    + + + + + {!! Form::close() !!} +
    +@endsection diff --git a/resources/views/auth/permissions/edit.blade.php b/resources/views/auth/permissions/edit.blade.php new file mode 100755 index 0000000..7ca0c49 --- /dev/null +++ b/resources/views/auth/permissions/edit.blade.php @@ -0,0 +1,32 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.edit', ['type' => trans_choice('general.permissions', 1)])) + +@section('content') + +
    + {!! Form::model($permission, [ + 'method' => 'PATCH', + 'url' => ['auth/permissions', $permission->id], + 'role' => 'form' + ]) !!} + +
    + {{ Form::textGroup('display_name', trans('general.name'), 'id-card-o') }} + + {{ Form::textGroup('name', trans('general.code'), 'code') }} + + {{ Form::textareaGroup('description', trans('general.description')) }} +
    + + + @permission('update-auth-permissions') + + + @endpermission + + {!! Form::close() !!} +
    +@endsection diff --git a/resources/views/auth/permissions/index.blade.php b/resources/views/auth/permissions/index.blade.php new file mode 100755 index 0000000..9c8c793 --- /dev/null +++ b/resources/views/auth/permissions/index.blade.php @@ -0,0 +1,69 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.permissions', 2)) + +@permission('update-auth-permissions') +@section('new_button') +  {{ trans('general.add_new') }} +@endsection +@endpermission + +@section('content') + +
    +
    + {!! Form::open(['url' => 'auth/permissions', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    +
    +
    + + + + + + + + + + + @foreach($permissions as $item) + + + + + + + @endforeach + +
    @sortablelink('display_name', trans('general.name'))@sortablelink('name', trans('general.code')){{ trans('general.actions') }}
    {{ $item->display_name }}{{ $item->name }} +
    + + +
    +
    +
    +
    + + +
    + +@endsection diff --git a/resources/views/auth/reset/create.blade.php b/resources/views/auth/reset/create.blade.php new file mode 100755 index 0000000..6cfd41c --- /dev/null +++ b/resources/views/auth/reset/create.blade.php @@ -0,0 +1,56 @@ +@extends('layouts.auth') + +@section('title', trans('auth.reset_password')) +@section('message', trans('auth.reset_password')) + +@section('content') +
    + {{ csrf_field() }} + + + + @stack('email_input_start') +
    + + + @if ($errors->has('email')) + + {{ $errors->first('email') }} + + @endif +
    + @stack('email_input_end') + + @stack('password_input_start') +
    + + + @if ($errors->has('password')) + + {{ $errors->first('password') }} + + @endif +
    + @stack('password_input_end') + + @stack('password_confirmation_input_start') +
    + + + @if ($errors->has('password_confirmation')) + + {{ $errors->first('password_confirmation') }} + + @endif +
    + @stack('password_confirmation_input_end') + +
    + +
    + +
    + +
    +
    +@endsection diff --git a/resources/views/auth/roles/create.blade.php b/resources/views/auth/roles/create.blade.php new file mode 100755 index 0000000..074b37a --- /dev/null +++ b/resources/views/auth/roles/create.blade.php @@ -0,0 +1,28 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.new', ['type' => trans_choice('general.roles', 1)])) + +@section('content') + +
    + {!! Form::open(['url' => 'auth/roles', 'role' => 'form']) !!} + +
    + {{ Form::textGroup('display_name', trans('general.name'), 'id-card-o') }} + + {{ Form::textGroup('name', trans('general.code'), 'code') }} + + {{ Form::textareaGroup('description', trans('general.description')) }} + + {{ Form::checkboxGroup('permissions', trans_choice('general.permissions', 2), $permissions, 'display_name') }} +
    + + + + + + {!! Form::close() !!} +
    +@endsection diff --git a/resources/views/auth/roles/edit.blade.php b/resources/views/auth/roles/edit.blade.php new file mode 100755 index 0000000..b34f77b --- /dev/null +++ b/resources/views/auth/roles/edit.blade.php @@ -0,0 +1,34 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.edit', ['type' => trans_choice('general.roles', 1)])) + +@section('content') + +
    + {!! Form::model($role, [ + 'method' => 'PATCH', + 'url' => ['auth/roles', $role->id], + 'role' => 'form' + ]) !!} + +
    + {{ Form::textGroup('display_name', trans('general.name'), 'id-card-o') }} + + {{ Form::textGroup('name', trans('general.code'), 'code') }} + + {{ Form::textareaGroup('description', trans('general.description')) }} + + {{ Form::checkboxGroup('permissions', trans_choice('general.permissions', 2), $permissions, 'display_name') }} +
    + + + @permission('update-auth-roles') + + + @endpermission + + {!! Form::close() !!} +
    +@endsection diff --git a/resources/views/auth/roles/index.blade.php b/resources/views/auth/roles/index.blade.php new file mode 100755 index 0000000..6827726 --- /dev/null +++ b/resources/views/auth/roles/index.blade.php @@ -0,0 +1,69 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.roles', 2)) + +@permission('create-auth-roles') +@section('new_button') +  {{ trans('general.add_new') }} +@endsection +@endpermission + +@section('content') + +
    +
    + {!! Form::open(['url' => 'auth/roles', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    +
    +
    + + + + + + + + + + + @foreach($roles as $item) + + + + + + + @endforeach + +
    @sortablelink('display_name', trans('general.name'))@sortablelink('name', trans('general.code')){{ trans('general.actions') }}
    {{ $item->display_name }}{{ $item->name }} +
    + + +
    +
    +
    +
    + + +
    + +@endsection diff --git a/resources/views/auth/users/create.blade.php b/resources/views/auth/users/create.blade.php new file mode 100755 index 0000000..602259c --- /dev/null +++ b/resources/views/auth/users/create.blade.php @@ -0,0 +1,90 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.new', ['type' => trans_choice('general.users', 1)])) + +@section('content') + +
    + {!! Form::open(['url' => 'auth/users', 'files' => true, 'role' => 'form']) !!} + +
    + {{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} + + {{ Form::emailGroup('email', trans('general.email'), 'envelope') }} + + {{ Form::passwordGroup('password', trans('auth.password.current'), 'key') }} + + {{ Form::passwordGroup('password_confirmation', trans('auth.password.current_confirm'), 'key') }} + + {{ Form::selectGroup('locale', trans_choice('general.languages', 1), 'flag', language()->allowed(), setting('general.default_locale')) }} + + @if (setting('general.use_gravatar', '0') == '1') + @stack('picture_input_start') +
    + {!! Form::label('picture', trans_choice('general.pictures', 1), ['class' => 'control-label']) !!} +
    +
    + {!! Form::text('fake_picture', null, ['id' => 'fake_picture', 'class' => 'form-control', 'disabled' => 'disabled', 'placeholder' => trans('settings.appearance.use_gravatar')]) !!} +
    +
    + @stack('picture_input_end') + @else + {{ Form::fileGroup('picture', trans_choice('general.pictures', 1)) }} + @endif + + @permission('read-common-companies') + {{ Form::checkboxGroup('companies', trans_choice('general.companies', 2), $companies, 'company_name') }} + @endpermission + + @permission('read-auth-roles') + {{ Form::checkboxGroup('roles', trans_choice('general.roles', 2), $roles, 'display_name') }} + @endpermission + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} +
    + + + + + {!! Form::close() !!} +
    +@endsection + +@push('js') + + +@endpush + +@push('css') + + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/auth/users/edit.blade.php b/resources/views/auth/users/edit.blade.php new file mode 100755 index 0000000..657adfd --- /dev/null +++ b/resources/views/auth/users/edit.blade.php @@ -0,0 +1,123 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.edit', ['type' => trans_choice('general.users', 1)])) + +@section('content') + +
    + {!! Form::model($user, [ + 'method' => 'PATCH', + 'files' => true, + 'url' => ['auth/users', $user->id], + 'role' => 'form' + ]) !!} + +
    + {{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} + + {{ Form::emailGroup('email', trans('general.email'), 'envelope') }} + + {{ Form::passwordGroup('password', trans('auth.password.current'), 'key', []) }} + + {{ Form::passwordGroup('password_confirmation', trans('auth.password.current_confirm'), 'key', []) }} + + {{ Form::selectGroup('locale', trans_choice('general.languages', 1), 'flag', language()->allowed()) }} + + @if (setting('general.use_gravatar', '0') == '1') + @stack('picture_input_start') +
    + {!! Form::label('picture', trans_choice('general.pictures', 1), ['class' => 'control-label']) !!} +
    +
    + {!! Form::text('fake_picture', null, ['id' => 'fake_picture', 'class' => 'form-control', 'disabled' => 'disabled', 'placeholder' => trans('settings.appearance.use_gravatar')]) !!} +
    +
    + @stack('picture_input_end') + @else + {{ Form::fileGroup('picture', trans_choice('general.pictures', 1)) }} + @endif + + @permission('read-common-companies') + {{ Form::checkboxGroup('companies', trans_choice('general.companies', 2), $companies, 'company_name') }} + @endpermission + + @permission('read-auth-roles') + {{ Form::checkboxGroup('roles', trans_choice('general.roles', 2), $roles, 'display_name') }} + @endpermission + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} +
    + + + @permission('update-auth-users') + + + @endpermission + + {!! Form::close() !!} +
    +@endsection + +@push('js') + + +@endpush + +@push('css') + + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/auth/users/index.blade.php b/resources/views/auth/users/index.blade.php new file mode 100755 index 0000000..b722667 --- /dev/null +++ b/resources/views/auth/users/index.blade.php @@ -0,0 +1,101 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.users', 2)) + +@permission('create-auth-users') +@section('new_button') +  {{ trans('general.add_new') }} +@endsection +@endpermission + +@section('content') + +
    +
    + {!! Form::open(['url' => 'auth/users', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::select('role', $roles, request('role'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    + +
    +
    + + + + + + + + + + + + @foreach($users as $item) + + + + + + + + @endforeach + +
    @sortablelink('name', trans('general.name'))@sortablelink('email', trans('general.email')){{ trans('general.actions') }}
    + + @if (setting('general.use_gravatar', '0') == '1') + {{ $item->name }} + @else + @if ($item->picture) + {{ $item->name }} + @endif + @endif + {{ $item->name }} + + {{ $item->email }} +
    + + +
    +
    +
    +
    + + + +
    + +@endsection + diff --git a/resources/views/banking/accounts/create.blade.php b/resources/views/banking/accounts/create.blade.php new file mode 100755 index 0000000..48c69db --- /dev/null +++ b/resources/views/banking/accounts/create.blade.php @@ -0,0 +1,99 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.new', ['type' => trans_choice('general.accounts', 1)])) + +@section('content') + +
    + {!! Form::open(['url' => 'banking/accounts', 'role' => 'form']) !!} + +
    + {{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} + + {{ Form::textGroup('number', trans('accounts.number'), 'pencil') }} + + {{ Form::selectGroup('currency_code', trans_choice('general.currencies', 1), 'exchange', $currencies, setting('general.default_currency')) }} + + {{ Form::textGroup('opening_balance', trans('accounts.opening_balance'), 'money', ['required' => 'required'], 0) }} + + {{ Form::textGroup('bank_name', trans('accounts.bank_name'), 'university', []) }} + + {{ Form::textGroup('bank_phone', trans('accounts.bank_phone'), 'phone', []) }} + + {{ Form::textareaGroup('bank_address', trans('accounts.bank_address')) }} + + {{ Form::radioGroup('default_account', trans('accounts.default_account')) }} + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} +
    + + + + + + {!! Form::close() !!} +
    +@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/banking/accounts/edit.blade.php b/resources/views/banking/accounts/edit.blade.php new file mode 100755 index 0000000..7e53f8f --- /dev/null +++ b/resources/views/banking/accounts/edit.blade.php @@ -0,0 +1,101 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.edit', ['type' => trans_choice('general.accounts', 1)])) + +@section('content') + +
    + {!! Form::model($account, [ + 'method' => 'PATCH', + 'url' => ['banking/accounts', $account->id], + 'role' => 'form' + ]) !!} + +
    + {{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} + + {{ Form::textGroup('number', trans('accounts.number'), 'pencil') }} + + {{ Form::selectGroup('currency_code', trans_choice('general.currencies', 1), 'exchange', $currencies) }} + + {{ Form::textGroup('opening_balance', trans('accounts.opening_balance'), 'money') }} + + {{ Form::textGroup('bank_name', trans('accounts.bank_name'), 'university', []) }} + + {{ Form::textGroup('bank_phone', trans('accounts.bank_phone'), 'phone', []) }} + + {{ Form::textareaGroup('bank_address', trans('accounts.bank_address')) }} + + {{ Form::radioGroup('default_account', trans('accounts.default_account')) }} + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} +
    + + + @permission('update-banking-accounts') + + + @endpermission + + {!! Form::close() !!} +
    +@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/banking/accounts/index.blade.php b/resources/views/banking/accounts/index.blade.php new file mode 100755 index 0000000..1533923 --- /dev/null +++ b/resources/views/banking/accounts/index.blade.php @@ -0,0 +1,88 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.accounts', 2)) + +@permission('create-banking-accounts') +@section('new_button') +  {{ trans('general.add_new') }} +@endsection +@endpermission + +@section('content') + +
    +
    + {!! Form::open(['url' => 'banking/accounts', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    + + +
    +
    + + + + + + + + + + + + @foreach($accounts as $item) + + + + + + + + @endforeach + +
    @sortablelink('name', trans('general.name'))@sortablelink('opening_balance', trans('accounts.current_balance')){{ trans('general.actions') }}
    {{ $item->name }}@money($item->balance, $item->currency_code, true) +
    + + +
    +
    +
    +
    + + + + +
    + +@endsection + diff --git a/resources/views/banking/transactions/index.blade.php b/resources/views/banking/transactions/index.blade.php new file mode 100755 index 0000000..d25de5e --- /dev/null +++ b/resources/views/banking/transactions/index.blade.php @@ -0,0 +1,60 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.transactions', 2)) + +@section('content') + +
    +
    + {!! Form::open(['url' => 'banking/transactions', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::select('account', $accounts, request('account'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::select('type', $types, request('type'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::select('category', $categories, request('category'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    + + +
    +
    + + + + + + + + + + + + + @foreach($transactions as $item) + + + + + + + + + @endforeach + +
    @sortablelink('paid_at', trans('general.date'))@sortablelink('account_name', trans('accounts.account_name'))@sortablelink('type', trans_choice('general.types', 1))@sortablelink('category_name', trans_choice('general.categories', 1))@sortablelink('description', trans('general.description'))@sortablelink('amount', trans('general.amount'))
    {{ Date::parse($item->paid_at)->format($date_format) }}{{ $item->account_name }}{{ $item->type }}{{ $item->category_name }}{{ $item->description }}@money($item->amount, $item->currency_code, true)
    +
    +
    + + + + +
    + +@endsection diff --git a/resources/views/banking/transfers/create.blade.php b/resources/views/banking/transfers/create.blade.php new file mode 100755 index 0000000..7a5bb9b --- /dev/null +++ b/resources/views/banking/transfers/create.blade.php @@ -0,0 +1,116 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.new', ['type' => trans_choice('general.transfers', 1)])) + +@section('content') + +
    + {!! Form::open(['url' => 'banking/transfers', 'role' => 'form']) !!} + +
    + {{ Form::selectGroup('from_account_id', trans('transfers.from_account'), 'university', $accounts) }} + + {{ Form::selectGroup('to_account_id', trans('transfers.to_account'), 'university', $accounts) }} + + {{ Form::textGroup('amount', trans('general.amount'), 'money') }} + + {{ Form::textGroup('transferred_at', trans('general.date'), 'calendar',['id' => 'transferred_at', 'required' => 'required', 'data-inputmask' => '\'alias\': \'yyyy-mm-dd\'', 'data-mask' => '', 'autocomplete' => 'off'], Date::now()->toDateString()) }} + + {{ Form::textareaGroup('description', trans('general.description')) }} + + {{ Form::selectGroup('payment_method', trans_choice('general.payment_methods', 1), 'credit-card', $payment_methods, setting('general.default_payment_method')) }} + + {{ Form::textGroup('reference', trans('general.reference'), 'file-text-o', []) }} + + {!! Form::hidden('currency_code', null, ['id' => 'currency_code']) !!} + {!! Form::hidden('currency_rate', null, ['id' => 'currency_rate']) !!} +
    + + + + + + {!! Form::close() !!} +
    +@endsection + +@push('js') + + +@endpush + +@push('css') + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/banking/transfers/edit.blade.php b/resources/views/banking/transfers/edit.blade.php new file mode 100755 index 0000000..42904f9 --- /dev/null +++ b/resources/views/banking/transfers/edit.blade.php @@ -0,0 +1,122 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.edit', ['type' => trans_choice('general.transfers', 1)])) + +@section('content') + +
    + {!! Form::model($transfer, [ + 'method' => 'PATCH', + 'url' => ['banking/transfers', $transfer->id], + 'role' => 'form' + ]) !!} + +
    + {{ Form::selectGroup('from_account_id', trans('transfers.from_account'), 'university', $accounts) }} + + {{ Form::selectGroup('to_account_id', trans('transfers.to_account'), 'university', $accounts) }} + + {{ Form::textGroup('amount', trans('general.amount'), 'money') }} + + {{ Form::textGroup('transferred_at', trans('general.date'), 'calendar',['id' => 'transferred_at', 'required' => 'required', 'data-inputmask' => '\'alias\': \'yyyy-mm-dd\'', 'data-mask' => 'yyyy-mm-dd', 'autocomplete' => 'off']) }} + + {{ Form::textareaGroup('description', trans('general.description')) }} + + {{ Form::selectGroup('payment_method', trans_choice('general.payment_methods', 1), 'credit-card', $payment_methods, null) }} + + {{ Form::textGroup('reference', trans('general.reference'), 'file-text-o', []) }} + + {!! Form::hidden('currency_code', $currency->code, ['id' => 'currency_code']) !!} + {!! Form::hidden('currency_rate', $currency->rate, ['id' => 'currency_rate']) !!} +
    + + + @permission('update-banking-transfers') + + + @endpermission + + {!! Form::close() !!} +
    +@endsection + +@push('js') + + +@endpush + +@push('css') + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/banking/transfers/index.blade.php b/resources/views/banking/transfers/index.blade.php new file mode 100755 index 0000000..046dbf9 --- /dev/null +++ b/resources/views/banking/transfers/index.blade.php @@ -0,0 +1,76 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.transfers', 2)) + +@permission('create-banking-transfers') +@section('new_button') +  {{ trans('general.add_new') }} +@endsection +@endpermission + +@section('content') + +
    +
    + {!! Form::open(['url' => 'banking/transfers', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::select('from_account', $accounts, request('from_account'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::select('to_account', $accounts, request('to_account'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    + + +
    +
    + + + + + + + + + + + + @foreach($transfers as $item) + + + + + + + + @endforeach + +
    @sortablelink('payment.paid_at', trans('general.date'))@sortablelink('payment.name', trans('transfers.from_account'))@sortablelink('revenue.name', trans('transfers.to_account'))@sortablelink('payment.amount', trans('general.amount')){{ trans('general.actions') }}
    {{ Date::parse($item->paid_at)->format($date_format) }}{{ $item->from_account }}{{ $item->to_account }}@money($item->amount, $item->currency_code, true) +
    + + +
    +
    +
    +
    + + + + +
    + +@endsection diff --git a/resources/views/common/companies/create.blade.php b/resources/views/common/companies/create.blade.php new file mode 100755 index 0000000..b31d404 --- /dev/null +++ b/resources/views/common/companies/create.blade.php @@ -0,0 +1,60 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.new', ['type' => trans_choice('general.companies', 1)])) + +@section('content') + +
    + {!! Form::open(['url' => 'common/companies', 'files' => true, 'role' => 'form']) !!} +
    + {{ Form::textGroup('company_name', trans('general.name'), 'id-card-o') }} + + {{ Form::textGroup('domain', trans('companies.domain'), 'globe') }} + + {{ Form::emailGroup('company_email', trans('general.email'), 'envelope') }} + + {{ Form::selectGroup('default_currency', trans_choice('general.currencies', 1), 'money', $currencies) }} + + {{ Form::textareaGroup('company_address', trans('general.address')) }} + + {{ Form::fileGroup('company_logo', trans('companies.logo')) }} + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} +
    + + + + + + {!! Form::close() !!} +
    +@endsection + +@push('js') + +@endpush + +@push('css') + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/common/companies/edit.blade.php b/resources/views/common/companies/edit.blade.php new file mode 100755 index 0000000..962cb45 --- /dev/null +++ b/resources/views/common/companies/edit.blade.php @@ -0,0 +1,93 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.edit', ['type' => trans_choice('general.companies', 1)])) + +@section('content') + +
    + {!! Form::model($company, [ + 'method' => 'PATCH', + 'url' => ['common/companies', $company->id], + 'files' => true, + 'role' => 'form' + ]) !!} + +
    + {{ Form::textGroup('company_name', trans('general.name'), 'id-card-o') }} + + {{ Form::textGroup('domain', trans('companies.domain'), 'globe') }} + + {{ Form::emailGroup('company_email', trans('general.email'), 'envelope') }} + + {{ Form::selectGroup('default_currency', trans_choice('general.currencies', 1), 'money', $currencies) }} + + {{ Form::textareaGroup('company_address', trans('general.address')) }} + + {{ Form::fileGroup('company_logo', trans('companies.logo')) }} + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} +
    + + + @permission('update-common-companies') + + + @endpermission + + {!! Form::close() !!} +
    +@endsection + +@push('js') + +@endpush + +@push('css') + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/common/companies/index.blade.php b/resources/views/common/companies/index.blade.php new file mode 100755 index 0000000..b700799 --- /dev/null +++ b/resources/views/common/companies/index.blade.php @@ -0,0 +1,97 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.companies', 2)) + +@permission('create-common-companies') +@section('new_button') +  {{ trans('general.add_new') }} +@endsection +@endpermission + +@section('content') + + +
    +
    + {!! Form::open(['url' => 'common/companies', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    + + +
    +
    + + + + + + + + + + + + + + @foreach($companies as $item) + + + + + + + + + + @endforeach + +
    @sortablelink('name', trans('general.name')){{ trans('general.actions') }}
    {{ $item->company_name }} +
    + + +
    +
    +
    +
    + + + + +
    + +@endsection + diff --git a/resources/views/common/dashboard/index.blade.php b/resources/views/common/dashboard/index.blade.php new file mode 100755 index 0000000..7496928 --- /dev/null +++ b/resources/views/common/dashboard/index.blade.php @@ -0,0 +1,313 @@ +@extends('layouts.admin') + +@section('title', trans('general.dashboard')) + +@section('content') +
    + +
    +
    + + +
    + {{ trans('dashboard.total_incomes') }} + @money($total_incomes['total'], setting('general.default_currency'), true) +
    +
    +
    +
    + {{ trans('dashboard.receivables') }} + {{ $total_incomes['open_invoice'] }} / {{ $total_incomes['overdue_invoice'] }} +
    +
    +
    +
    + + +
    +
    + + +
    + {{ trans('dashboard.total_expenses') }} + @money($total_expenses['total'], setting('general.default_currency'), true) + +
    +
    +
    +
    + {{ trans('dashboard.payables') }} + {{ $total_expenses['open_bill'] }} / {{ $total_expenses['overdue_bill'] }} +
    +
    +
    +
    + + +
    +
    + + +
    + {{ trans('dashboard.total_profit') }} + @money($total_profit['total'], setting('general.default_currency'), true) + +
    +
    +
    +
    + {{ trans('general.upcoming') }} + {{ $total_profit['open'] }} / {{ $total_profit['overdue'] }} +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    {{ trans('dashboard.cash_flow') }}

    +
    +    +    + +
    +
    +   + +
    +
    +
    +
    +
    + {!! $cashflow->render() !!} +
    +
    +
    +
    + +
    +
    +
    +
    +

    {{ trans('dashboard.incomes_by_category') }}

    +
    + +
    +
    +
    + {!! $donut_incomes->render() !!} +
    +
    +
    + +
    +
    +
    +

    {{ trans('dashboard.expenses_by_category') }}

    +
    + +
    +
    +
    + {!! $donut_expenses->render() !!} +
    +
    +
    +
    + +
    + +
    +
    +
    +

    {{ trans('dashboard.account_balance') }}

    +
    + +
    +
    +
    + @if ($accounts->count()) + + + @foreach($accounts as $item) + + + + + @endforeach + +
    {{ $item->name }}@money($item->balance, $item->currency_code, true)
    + @else +
    {{ trans('general.no_records') }}
    + @endif +
    +
    +
    + + +
    +
    +
    +

    {{ trans('dashboard.latest_incomes') }}

    +
    + +
    +
    +
    + @if ($latest_incomes->count()) + + + + + + + + + + @foreach($latest_incomes as $item) + + + + + + @endforeach + +
    {{ trans('general.date') }}{{ trans_choice('general.categories', 1) }}{{ trans('general.amount') }}
    {{ Date::parse($item->paid_at)->format($date_format) }}{{ $item->category ? $item->category->name : trans_choice('general.invoices', 2) }}@money($item->amount, $item->currency_code, true)
    + @else +
    {{ trans('general.no_records') }}
    + @endif +
    +
    +
    + + +
    +
    +
    +

    {{ trans('dashboard.latest_expenses') }}

    +
    + +
    +
    +
    + @if ($latest_expenses->count()) + + + + + + + + + + @foreach($latest_expenses as $item) + + + + + + @endforeach + +
    {{ trans('general.date') }}{{ trans_choice('general.categories', 1) }}{{ trans('general.amount') }}
    {{ Date::parse($item->paid_at)->format($date_format) }}{{ $item->category ? $item->category->name : trans_choice('general.bills', 2) }}@money($item->amount, $item->currency_code, true)
    + @else +
    {{ trans('general.no_records') }}
    + @endif +
    +
    +
    +
    +@endsection + +@push('css') + +@endpush + +@push('js') +{!! Charts::assets() !!} + +@if (is_file(base_path('public/js/moment/locale/' . strtolower(app()->getLocale()) . '.js'))) + +@elseif (is_file(base_path('public/js/moment/locale/' . language()->getShortCode() . '.js'))) + +@endif + +@endpush + +@push('scripts') + +@endpush \ No newline at end of file diff --git a/resources/views/common/import/create.blade.php b/resources/views/common/import/create.blade.php new file mode 100755 index 0000000..94c7312 --- /dev/null +++ b/resources/views/common/import/create.blade.php @@ -0,0 +1,56 @@ +@extends('layouts.admin') + +@section('title', trans('import.title', ['type' => trans_choice('general.' . $type, 2)])) + +@section('content') +
    + {!! Form::open(['url' => $path . '/import', 'files' => true, 'role' => 'form']) !!} + +
    +
    +
    + {!! trans('import.message', ['link' => url('public/files/import/' . $type . '.xlsx')]) !!} +
    +
    + @stack('import_input_start') +
    + {!! Form::label('import', trans('general.form.select.file'), ['class' => 'control-label']) !!} + {!! Form::file('import', null, ['class' => 'form-control']) !!} + {!! $errors->first('import', '

    :message

    ') !!} +
    + @stack('import_input_end') +
    + + + + + {!! Form::close() !!} +
    +@endsection + +@push('js') + +@endpush + +@push('css') + +@endpush + +@push('scripts') + +@endpush \ No newline at end of file diff --git a/resources/views/common/items/create.blade.php b/resources/views/common/items/create.blade.php new file mode 100755 index 0000000..a6ada71 --- /dev/null +++ b/resources/views/common/items/create.blade.php @@ -0,0 +1,135 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.new', ['type' => trans_choice('general.items', 1)])) + +@section('content') + +
    + {!! Form::open(['route' => 'items.store', 'files' => true, 'role' => 'form']) !!} + +
    + {{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} + + {{ Form::textGroup('sku', trans('items.sku'), 'key') }} + + {{ Form::textareaGroup('description', trans('general.description')) }} + + {{ Form::textGroup('sale_price', trans('items.sales_price'), 'money') }} + + {{ Form::textGroup('purchase_price', trans('items.purchase_price'), 'money') }} + + {{ Form::textGroup('quantity', trans_choice('items.quantities', 1), 'cubes', ['required' => 'required'], '1') }} + + {{ Form::selectGroup('tax_id', trans_choice('general.taxes', 1), 'percent', $taxes, setting('general.default_tax'), []) }} + + @stack('category_id_input_start') +
    + {!! Form::label('category_id', trans_choice('general.categories', 1), ['class' => 'control-label']) !!} +
    +
    + {!! Form::select('category_id', $categories, null, array_merge(['class' => 'form-control', 'placeholder' => trans('general.form.select.field', ['field' => trans_choice('general.categories', 1)])])) !!} +
    + +
    +
    + {!! $errors->first('category_id', '

    :message

    ') !!} +
    + @stack('category_id_input_end') + + {{ Form::fileGroup('picture', trans_choice('general.pictures', 1)) }} + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} +
    + + + + + + {!! Form::close() !!} +
    +@endsection + +@push('js') + + +@endpush + +@push('css') + + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/common/items/edit.blade.php b/resources/views/common/items/edit.blade.php new file mode 100755 index 0000000..155e374 --- /dev/null +++ b/resources/views/common/items/edit.blade.php @@ -0,0 +1,132 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.edit', ['type' => trans_choice('general.items', 1)])) + +@section('content') + +
    + {!! Form::model($item, [ + 'method' => 'PATCH', + 'files' => true, + 'route' => ['items.update', $item->id], + 'role' => 'form' + ]) !!} + +
    + {{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} + + {{ Form::textGroup('sku', trans('items.sku'), 'key') }} + + {{ Form::textareaGroup('description', trans('general.description')) }} + + {{ Form::textGroup('sale_price', trans('items.sales_price'), 'money') }} + + {{ Form::textGroup('purchase_price', trans('items.purchase_price'), 'money') }} + + {{ Form::textGroup('quantity', trans_choice('items.quantities', 1), 'cubes') }} + + {{ Form::selectGroup('tax_id', trans_choice('general.taxes', 1), 'percent', $taxes, null, []) }} + + {{ Form::selectGroup('category_id', trans_choice('general.categories', 1), 'folder-open-o', $categories, null, []) }} + + {{ Form::fileGroup('picture', trans_choice('general.pictures', 1)) }} + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} +
    + + + @permission('update-common-items') + + + @endpermission + {!! Form::close() !!} +
    +@endsection + +@push('js') + +@endpush + +@push('css') + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/common/items/index.blade.php b/resources/views/common/items/index.blade.php new file mode 100755 index 0000000..7bbc0c0 --- /dev/null +++ b/resources/views/common/items/index.blade.php @@ -0,0 +1,100 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.items', 2)) + +@section('new_button') +@permission('create-common-items') +  {{ trans('general.add_new') }} +  {{ trans('import.import') }} +@endpermission +  {{ trans('general.export') }} +@endsection + +@section('content') + +
    +
    + {!! Form::open(['route' => 'items.index', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::select('category', $categories, request('category'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    + + +
    +
    + + + + + + + + + + + + + + + @foreach($items as $item) + + + + + + + + + + + @endforeach + +
    @sortablelink('name', trans('general.name'))@sortablelink('sale_price', trans('items.sales_price')){{ trans('general.actions') }}
    {{ $item->name }}{{ money($item->sale_price, setting('general.default_currency'), true) }} +
    + + +
    +
    +
    +
    + + + + +
    + +@endsection diff --git a/resources/views/customers/dashboard/index.blade.php b/resources/views/customers/dashboard/index.blade.php new file mode 100755 index 0000000..f5aa452 --- /dev/null +++ b/resources/views/customers/dashboard/index.blade.php @@ -0,0 +1,66 @@ +@extends('layouts.customer') + +@section('title', trans('general.dashboard')) + +@section('content') +
    + +
    +
    +
    +
    +
    +
    +
    {{ trans('general.unpaid') }}
    +
    {{ $progress['total'] }} / {{ $progress['unpaid'] }}
    +
    +
    + {{ !empty($progress['total']) ? (100 / $progress['total']) * $progress['unpaid'] : '0' }} % +
    +
    +
    +
    +
    +
    +
    {{ trans('general.paid') }}
    +
    {{ $progress['total'] }} / {{ $progress['paid'] }}
    +
    +
    + {{ !empty($progress['total']) ? (100 / $progress['total']) * $progress['paid'] : '0' }}% +
    +
    +
    +
    +
    +
    +
    {{ trans('general.overdue') }}
    +
    {{ $progress['total'] }} / {{ $progress['overdue'] }}
    +
    +
    + {{ !empty($progress['total']) ? (100 / $progress['total']) * $progress['overdue'] : '0' }}% +
    +
    +
    +
    +
    +
    +
    {{ trans('general.partially_paid') }}
    +
    {{ $progress['total'] }} / {{ $progress['partially_paid'] }}
    +
    +
    + {{ !empty($progress['total']) ? (100 / $progress['total']) * $progress['partially_paid'] : '0' }}% +
    +
    +
    +
    +
    +
    + {!! $chart->render() !!} +
    +
    +
    +
    +@endsection +@push('js') +{!! Charts::assets() !!} +@endpush \ No newline at end of file diff --git a/resources/views/customers/invoices/index.blade.php b/resources/views/customers/invoices/index.blade.php new file mode 100755 index 0000000..a2aa941 --- /dev/null +++ b/resources/views/customers/invoices/index.blade.php @@ -0,0 +1,56 @@ +@extends('layouts.customer') + +@section('title', trans_choice('general.invoices', 2)) + +@section('content') + +
    +
    + {!! Form::open(['url' => 'customers/invoices', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::select('status', $status, request('status'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    + +
    +
    + + + + + + + + + + + + @foreach($invoices as $item) + + + + + + + + @endforeach + +
    @sortablelink('invoice_number', trans('invoices.invoice_number'))@sortablelink('amount', trans('general.amount'))@sortablelink('invoiced_at', trans('invoices.invoice_date'))@sortablelink('due_at', trans('invoices.due_date'))@sortablelink('status.name', trans_choice('general.statuses', 1))
    {{ $item->invoice_number }}@money($item->amount, $item->currency_code, true){{ Date::parse($item->invoiced_at)->format($date_format) }}{{ Date::parse($item->due_at)->format($date_format) }}{{ trans('invoices.status.' . $item->status->code) }}
    +
    +
    + + + +
    + +@endsection diff --git a/resources/views/customers/invoices/invoice.blade.php b/resources/views/customers/invoices/invoice.blade.php new file mode 100755 index 0000000..15f577d --- /dev/null +++ b/resources/views/customers/invoices/invoice.blade.php @@ -0,0 +1,140 @@ +@extends('layouts.invoice') + +@section('title', trans_choice('general.invoices', 1) . ': ' . $invoice->invoice_number) + +@section('content') +
    +
    +
    + @if ($logo) + + @endif +
    +
    +
    + {{ setting('general.company_name') }}
    + {{ setting('general.company_address') }}
    + @if (setting('general.company_tax_number')) + {{ trans('general.tax_number') }}: {{ setting('general.company_tax_number') }}
    + @endif +
    + @if (setting('general.company_phone')) + {{ setting('general.company_phone') }}
    + @endif + {{ setting('general.company_email') }} +
    +
    +
    + +
    +
    + {{ trans('invoices.bill_to') }} +
    + {{ $invoice->customer_name }}
    + {{ $invoice->customer_address }}
    + @if ($invoice->customer_tax_number) + {{ trans('general.tax_number') }}: {{ $invoice->customer_tax_number }}
    + @endif +
    + @if ($invoice->customer_phone) + {{ $invoice->customer_phone }}
    + @endif + {{ $invoice->customer_email }} +
    +
    +
    +
    + + + + + + + @if ($invoice->order_number) + + + + + @endif + + + + + + + + + +
    {{ trans('invoices.invoice_number') }}:{{ $invoice->invoice_number }}
    {{ trans('invoices.order_number') }}:{{ $invoice->order_number }}
    {{ trans('invoices.invoice_date') }}:{{ Date::parse($invoice->invoiced_at)->format($date_format) }}
    {{ trans('invoices.payment_due') }}:{{ Date::parse($invoice->due_at)->format($date_format) }}
    +
    +
    +
    + +
    +
    + + + + + + + + + @foreach($invoice->items as $item) + + + + + + + @endforeach + +
    {{ trans_choice('general.items', 1) }}{{ trans('invoices.quantity') }}{{ trans('invoices.price') }}{{ trans('invoices.total') }}
    + {{ $item->name }} + @if ($item->sku) +
    {{ trans('items.sku') }}: {{ $item->sku }} + @endif +
    {{ $item->quantity }}@money($item->price, $invoice->currency_code, true)@money($item->total, $invoice->currency_code, true)
    +
    +
    + +
    +
    + @if ($invoice->notes) +

    {{ trans_choice('general.notes', 2) }}

    + +

    + {{ $invoice->notes }} +

    + @endif +
    +
    +
    + + + @foreach($invoice->totals as $total) + @if($total->code != 'total') + + + + + @else + @if ($invoice->paid) + + + + + @endif + + + + + @endif + @endforeach + +
    {{ trans($total['name']) }}:@money($total->amount, $invoice->currency_code, true)
    {{ trans('invoices.paid') }}:- @money($invoice->paid, $invoice->currency_code, true)
    {{ trans($total['name']) }}:@money($total->amount - $invoice->paid, $invoice->currency_code, true)
    +
    +
    +
    +
    +@endsection diff --git a/resources/views/customers/invoices/show.blade.php b/resources/views/customers/invoices/show.blade.php new file mode 100755 index 0000000..8b0a34b --- /dev/null +++ b/resources/views/customers/invoices/show.blade.php @@ -0,0 +1,219 @@ +@extends('layouts.customer') + +@section('title', trans_choice('general.invoices', 1) . ': ' . $invoice->invoice_number) + +@section('content') +
    +
    +
    +
    +
    {{ trans('invoices.status.' . $invoice->status->code) }}
    +
    +
    + +
    +
    + @if (setting('general.invoice_logo')) + + @elseif (setting('general.company_logo')) + + @else + + @endif +
    +
    +
    + {{ setting('general.company_name') }}
    + {{ setting('general.company_address') }}
    + @if (setting('general.company_tax_number')) + {{ trans('general.tax_number') }}: {{ setting('general.company_tax_number') }}
    + @endif +
    + @if (setting('general.company_phone')) + {{ setting('general.company_phone') }}
    + @endif + {{ setting('general.company_email') }} +
    +
    +
    + +
    +
    + {{ trans('invoices.bill_to') }} +
    + {{ $invoice->customer_name }}
    + {{ $invoice->customer_address }}
    + @if ($invoice->customer_tax_number) + {{ trans('general.tax_number') }}: {{ $invoice->customer_tax_number }}
    + @endif +
    + @if ($invoice->customer_phone) + {{ $invoice->customer_phone }}
    + @endif + {{ $invoice->customer_email }} +
    +
    +
    +
    + + + + + + + @if ($invoice->order_number) + + + + + @endif + + + + + + + + + +
    {{ trans('invoices.invoice_number') }}:{{ $invoice->invoice_number }}
    {{ trans('invoices.order_number') }}:{{ $invoice->order_number }}
    {{ trans('invoices.invoice_date') }}:{{ Date::parse($invoice->invoiced_at)->format($date_format) }}
    {{ trans('invoices.payment_due') }}:{{ Date::parse($invoice->due_at)->format($date_format) }}
    +
    +
    +
    + +
    +
    + + + + + + + + + @foreach($invoice->items as $item) + + + + + + + @endforeach + +
    {{ trans_choice('general.items', 1) }}{{ trans('invoices.quantity') }}{{ trans('invoices.price') }}{{ trans('invoices.total') }}
    + {{ $item->name }} + @if ($item->sku) +
    {{ trans('items.sku') }}: {{ $item->sku }} + @endif +
    {{ $item->quantity }}@money($item->price, $invoice->currency_code, true)@money($item->total, $invoice->currency_code, true)
    +
    +
    + +
    +
    + @if ($invoice->notes) +

    {{ trans_choice('general.notes', 2) }}

    + +

    + {{ $invoice->notes }} +

    + @endif +
    +
    +
    + + + @foreach($invoice->totals as $total) + @if($total->code != 'total') + + + + + @else + @if ($invoice->paid) + + + + + @endif + + + + + @endif + @endforeach + +
    {{ trans($total['name']) }}:@money($total->amount, $invoice->currency_code, true)
    {{ trans('invoices.paid') }}:- @money($invoice->paid, $invoice->currency_code, true)
    {{ trans($total['name']) }}:@money($total->amount - $invoice->paid, $invoice->currency_code, true)
    +
    +
    +
    + + +
    +
    +@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/customers/payments/index.blade.php b/resources/views/customers/payments/index.blade.php new file mode 100755 index 0000000..33d121b --- /dev/null +++ b/resources/views/customers/payments/index.blade.php @@ -0,0 +1,54 @@ +@extends('layouts.customer') + +@section('title', trans_choice('general.payments', 1)) + +@section('content') + +
    +
    + {!! Form::open(['url' => 'customers/payments', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::select('category_id', $categories, request('category_id'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::select('payment_method', $payment_methods, request('payment_method'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    + +
    +
    + + + + + + + + + + + @foreach($payments as $item) + + + + + + + @endforeach + +
    @sortablelink('paid_at', trans('general.date'))@sortablelink('amount', trans('general.amount'))@sortablelink('category.name', trans_choice('general.categories', 1))@sortablelink('payment_method', trans_choice('general.payment_methods', 1))
    {{ Date::parse($item->paid_at)->format($date_format) }}@money($item->amount, $item->currency_code, true){{ $item->category->name }}{{ $payment_methods[$item->payment_method] }}
    +
    +
    + + +
    + +@endsection diff --git a/resources/views/customers/payments/show.blade.php b/resources/views/customers/payments/show.blade.php new file mode 100755 index 0000000..6a170e8 --- /dev/null +++ b/resources/views/customers/payments/show.blade.php @@ -0,0 +1,107 @@ +@extends('layouts.customer') + +@section('title', trans_choice('general.invoices', 1)) + +@section('content') +
    +
    {{ $payment->category->name }} +
    +
    + +
    +
    + +
    +
    + {{ trans('general.from') }} +
    + {{ setting('general.company_name') }}
    + {{ setting('general.company_address') }}
    + {{ trans('general.phone') }}: (804) 123-5432
    + {{ trans('general.email') }}: {{ setting('general.company_email') }} +
    +
    +
    + {{ trans('general.to') }} +
    + {{ $payment->customer->name }}
    + {{ $payment->customer->address }}
    + {{ trans('general.phone') }}: {{ $payment->customer->phone }}
    + {{ trans('general.email') }}: {{ $payment->customer->email }} +
    +
    +
    + {{ trans('invoices.payment_due') }}: {{ Date::parse($payment->paid_at)->format($date_format) }} +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    {{ trans_choice('general.categories', 1) }}{{ trans_choice('general.payment_methods', 1) }}{{ trans('general.reference') }}{{ trans('general.amount') }}
    {{ $payment->category->name }}{{ $payment_methods[$payment->payment_method] }}{{ $payment->reference }}@money($payment->amount, $payment->currency_code, true)
    +
    +
    + @if ($payment->description) +
    +
    +

    {{ trans('general.description') }}:

    + +

    + {{ $payment->description }} +

    +
    +
    + @endif + + @if ($payment->attachment) + + @endif +
    +
    +@endsection + diff --git a/resources/views/customers/profile/edit.blade.php b/resources/views/customers/profile/edit.blade.php new file mode 100755 index 0000000..fbe8b77 --- /dev/null +++ b/resources/views/customers/profile/edit.blade.php @@ -0,0 +1,94 @@ +@extends('layouts.customer') + +@section('title', trans('general.title.edit', ['type' => trans('auth.profile')])) + +@section('content') + +
    + {!! Form::model($user, [ + 'method' => 'PATCH', + 'files' => true, + 'url' => ['customers/profile/update'], + 'role' => 'form' + ]) !!} + +
    + {{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} + + {{ Form::emailGroup('email', trans('general.email'), 'envelope') }} + + {{ Form::textGroup('tax_number', trans('general.tax_number'), 'percent', []) }} + + {{ Form::textGroup('phone', trans('general.phone'), 'phone', []) }} + + {{ Form::textareaGroup('address', trans('general.address')) }} + + {{ Form::passwordGroup('password', trans('auth.password.current'), 'key', []) }} + + {{ Form::passwordGroup('password_confirmation', trans('auth.password.current_confirm'), 'key', []) }} + + {{ Form::selectGroup('locale', trans_choice('general.languages', 1), 'flag', language()->allowed()) }} + + {{ Form::fileGroup('picture', trans_choice('general.pictures', 1)) }} +
    + + + @permission(['update-customers-profile']) + + + @endpermission + + {!! Form::close() !!} +
    +@endsection + +@push('js') + +@endpush + +@push('css') + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/customers/transactions/index.blade.php b/resources/views/customers/transactions/index.blade.php new file mode 100755 index 0000000..66b4838 --- /dev/null +++ b/resources/views/customers/transactions/index.blade.php @@ -0,0 +1,56 @@ +@extends('layouts.customer') + +@section('title', trans_choice('general.transactions', 2)) + +@section('content') + +
    +
    + {!! Form::open(['url' => 'customers/transactions', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    + +
    +
    + + + + + + + + + + + + + @foreach($transactions as $item) + + + + + + + + + @endforeach + +
    @sortablelink('paid_at', trans('general.date'))@sortablelink('account.name', trans('accounts.account_name'))@sortablelink('type', trans_choice('general.types', 1))@sortablelink('category.name', trans_choice('general.categories', 1))@sortablelink('description', trans('general.description'))@sortablelink('amount', trans('general.amount'))
    {{ Date::parse($item->date)->format($date_format) }}{{ $item->account }}{{ $item->type }}{{ $item->category }}{{ $item->description }}@money($item->amount, $item->currency_code, true)
    +
    +
    + + + +
    + +@endsection diff --git a/resources/views/errors/403.blade.php b/resources/views/errors/403.blade.php new file mode 100755 index 0000000..2d45bbe --- /dev/null +++ b/resources/views/errors/403.blade.php @@ -0,0 +1,13 @@ +@extends('layouts.admin') + +@section('title', 'Forbidden Access') + +@section('content') + +
    +
    +

    You don't have permission.

    +
    + +
    +@endsection diff --git a/resources/views/expenses/bills/bill.blade.php b/resources/views/expenses/bills/bill.blade.php new file mode 100755 index 0000000..e109a15 --- /dev/null +++ b/resources/views/expenses/bills/bill.blade.php @@ -0,0 +1,140 @@ +@extends('layouts.bill') + +@section('title', trans_choice('general.bills', 1) . ': ' . $bill->bill_number) + +@section('content') +
    +
    +
    + @if ($logo) + + @endif +
    +
    +
    + {{ setting('general.company_name') }}
    + {!! nl2br(setting('general.company_address')) !!}
    + @if (setting('general.company_tax_number')) + {{ trans('general.tax_number') }}: {{ setting('general.company_tax_number') }}
    + @endif +
    + @if (setting('general.company_phone')) + {{ setting('general.company_phone') }}
    + @endif + {{ setting('general.company_email') }} +
    +
    +
    + +
    +
    + {{ trans('bills.bill_from') }} +
    + {{ $bill->vendor_name }}
    + {!! nl2br($bill->vendor_address) !!}
    + @if ($bill->vendor_tax_number) + {{ trans('general.tax_number') }}: {{ $bill->vendor_tax_number }}
    + @endif +
    + @if ($bill->vendor_phone) + {{ $bill->vendor_phone }}
    + @endif + {{ $bill->vendor_email }} +
    +
    +
    +
    + + + + + + + @if ($bill->order_number) + + + + + @endif + + + + + + + + + +
    {{ trans('bills.bill_number') }}:{{ $bill->bill_number }}
    {{ trans('bills.order_number') }}:{{ $bill->order_number }}
    {{ trans('bills.bill_date') }}:{{ Date::parse($bill->billed_at)->format($date_format) }}
    {{ trans('bills.payment_due') }}:{{ Date::parse($bill->due_at)->format($date_format) }}
    +
    +
    +
    + +
    +
    + + + + + + + + + @foreach($bill->items as $item) + + + + + + + @endforeach + +
    {{ trans_choice('general.items', 1) }}{{ trans('bills.quantity') }}{{ trans('bills.price') }}{{ trans('bills.total') }}
    + {{ $item->name }} + @if ($item->sku) +
    {{ trans('items.sku') }}: {{ $item->sku }} + @endif +
    {{ $item->quantity }}@money($item->price, $bill->currency_code, true)@money($item->total, $bill->currency_code, true)
    +
    +
    + +
    +
    + @if ($bill->notes) +

    {{ trans_choice('general.notes', 2) }}:

    + +

    + {{ $bill->notes }} +

    + @endif +
    +
    +
    + + + @foreach($bill->totals as $total) + @if ($total->code != 'total') + + + + + @else + @if ($bill->paid) + + + + + @endif + + + + + @endif + @endforeach + +
    {{ trans($total->title) }}:@money($total->amount, $bill->currency_code, true)
    {{ trans('invoices.paid') }}:- @money($bill->paid, $bill->currency_code, true)
    {{ trans($total->name) }}:@money($total->amount - $bill->paid, $bill->currency_code, true)
    +
    +
    +
    +
    +@endsection diff --git a/resources/views/expenses/bills/create.blade.php b/resources/views/expenses/bills/create.blade.php new file mode 100755 index 0000000..688d80c --- /dev/null +++ b/resources/views/expenses/bills/create.blade.php @@ -0,0 +1,509 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.new', ['type' => trans_choice('general.bills', 1)])) + +@section('content') + +
    + {!! Form::open(['url' => 'expenses/bills', 'files' => true, 'role' => 'form']) !!} + +
    + @stack('vendor_id_input_start') +
    + {!! Form::label('vendor_id', trans_choice('general.vendors', 1), ['class' => 'control-label']) !!} +
    +
    + {!! Form::select('vendor_id', $vendors, null, array_merge(['id' => 'vendor_id', 'class' => 'form-control', 'placeholder' => trans('general.form.select.field', ['field' => trans_choice('general.vendors', 1)])])) !!} + + + +
    + {!! $errors->first('vendor_id', '

    :message

    ') !!} +
    + @stack('vendor_id_input_end') + + {{ Form::selectGroup('currency_code', trans_choice('general.currencies', 1), 'exchange', $currencies, setting('general.default_currency')) }} + + {{ Form::textGroup('billed_at', trans('bills.bill_date'), 'calendar',['id' => 'billed_at', 'class' => 'form-control', 'required' => 'required', 'data-inputmask' => '\'alias\': \'yyyy/mm/dd\'', 'data-mask' => '', 'autocomplete' => 'off'],Date::now()->toDateString()) }} + + {{ Form::textGroup('due_at', trans('bills.due_date'), 'calendar',['id' => 'due_at', 'class' => 'form-control', 'required' => 'required', 'data-inputmask' => '\'alias\': \'yyyy/mm/dd\'', 'data-mask' => '', 'autocomplete' => 'off'],Date::now()->toDateString()) }} + + {{ Form::textGroup('bill_number', trans('bills.bill_number'), 'file-text-o') }} + + {{ Form::textGroup('order_number', trans('bills.order_number'), 'shopping-cart',[]) }} + +
    + {!! Form::label('items', trans_choice('general.items', 2), ['class' => 'control-label']) !!} +
    + + + + @stack('actions_th_start') + + @stack('actions_th_end') + @stack('name_th_start') + + @stack('name_th_end') + @stack('quantity_th_start') + + @stack('quantity_th_end') + @stack('price_th_start') + + @stack('price_th_end') + @stack('taxes_th_start') + + @stack('taxes_th_end') + @stack('total_th_start') + + @stack('total_th_end') + + + + @php $item_row = 0; @endphp + @if(old('item')) + @foreach(old('item') as $old_item) + @php $item = (object) $old_item; @endphp + @include('expenses.bills.item') + @php $item_row++; @endphp + @endforeach + @else + @include('expenses.bills.item') + @endif + @php $item_row++; @endphp + @stack('add_item_td_start') + + + + + @stack('add_item_td_end') + @stack('sub_total_td_start') + + + + + @stack('sub_total_td_end') + @stack('add_discount_td_start') + + + + + @stack('add_discount_td_end') + @stack('tax_total_td_start') + + + + + @stack('tax_total_td_end') + @stack('grand_total_td_start') + + + + + @stack('grand_total_td_end') + +
    {{ trans('general.actions') }}{{ trans('general.name') }}{{ trans('bills.quantity') }}{{ trans('bills.price') }}{{ trans_choice('general.taxes', 1) }}{{ trans('bills.total') }}
    {{ trans('bills.sub_total') }}0
    + {{ trans('bills.add_discount') }} + + + {!! Form::hidden('discount', null, ['id' => 'discount', 'class' => 'form-control text-right']) !!} +
    {{ trans_choice('general.taxes', 1) }}0
    {{ trans('bills.total') }}0
    +
    +
    + + {{ Form::textareaGroup('notes', trans_choice('general.notes', 2)) }} + + @stack('category_id_input_start') +
    + {!! Form::label('category_id', trans_choice('general.categories', 1), ['class' => 'control-label']) !!} +
    +
    + {!! Form::select('category_id', $categories, null, array_merge(['class' => 'form-control', 'placeholder' => trans('general.form.select.field', ['field' => trans_choice('general.categories', 1)])])) !!} +
    + +
    +
    + {!! $errors->first('category_id', '

    :message

    ') !!} +
    + @stack('category_id_input_end') + + {{ Form::recurring('create') }} + + {{ Form::fileGroup('attachment', trans('general.attachment'),[]) }} + + {{ Form::hidden('vendor_name', old('vendor_name'), ['id' => 'vendor_name']) }} + {{ Form::hidden('vendor_email', old('vendor_email'), ['id' => 'vendor_email']) }} + {{ Form::hidden('vendor_tax_number', old('vendor_tax_number'), ['id' => 'vendor_tax_number']) }} + {{ Form::hidden('vendor_phone', old('vendor_phone'), ['id' => 'vendor_phone']) }} + {{ Form::hidden('vendor_address', old('vendor_address'), ['id' => 'vendor_address']) }} + {{ Form::hidden('currency_rate', old('currency_rate'), ['id' => 'currency_rate']) }} + {{ Form::hidden('bill_status_code', old('bill_status_code', 'draft'), ['id' => 'bill_status_code']) }} + {{ Form::hidden('amount', old('amount', '0'), ['id' => 'amount']) }} +
    + + + + + + {!! Form::close() !!} +
    +@endsection + +@push('js') + + + + + +@endpush + +@push('css') + + + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/expenses/bills/edit.blade.php b/resources/views/expenses/bills/edit.blade.php new file mode 100755 index 0000000..ef21f9d --- /dev/null +++ b/resources/views/expenses/bills/edit.blade.php @@ -0,0 +1,486 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.edit', ['type' => trans_choice('general.bills', 1)])) + +@section('content') + +
    + {!! Form::model($bill, ['method' => 'PATCH', 'files' => true, 'url' => ['expenses/bills', $bill->id], 'role' => 'form']) !!} + +
    + {{ Form::selectGroup('vendor_id', trans_choice('general.vendors', 1), 'user', $vendors) }} + + {{ Form::selectGroup('currency_code', trans_choice('general.currencies', 1), 'exchange', $currencies) }} + + {{ Form::textGroup('billed_at', trans('bills.bill_date'), 'calendar', ['id' => 'billed_at', 'class' => 'form-control', 'required' => 'required', 'data-inputmask' => '\'alias\': \'yyyy-mm-dd\'', 'data-mask' => '', 'autocomplete' => 'off'], Date::parse($bill->billed_at)->toDateString()) }} + + {{ Form::textGroup('due_at', trans('bills.due_date'), 'calendar', ['id' => 'due_at', 'class' => 'form-control', 'required' => 'required', 'data-inputmask' => '\'alias\': \'yyyy-mm-dd\'', 'data-mask' => '', 'autocomplete' => 'off'], Date::parse($bill->due_at)->toDateString()) }} + + {{ Form::textGroup('bill_number', trans('bills.bill_number'), 'file-text-o') }} + + {{ Form::textGroup('order_number', trans('bills.order_number'), 'shopping-cart',[]) }} + +
    + {!! Form::label('items', trans_choice('general.items', 2), ['class' => 'control-label']) !!} +
    + + + + @stack('actions_th_start') + + @stack('actions_th_end') + @stack('name_th_start') + + @stack('name_th_end') + @stack('quantity_th_start') + + @stack('quantity_th_end') + @stack('price_th_start') + + @stack('price_th_end') + @stack('taxes_th_start') + + @stack('taxes_th_end') + @stack('total_th_start') + + @stack('total_th_end') + + + + @php $item_row = 0; @endphp + @if(old('item')) + @foreach(old('item') as $old_item) + @php $item = (object) $old_item; @endphp + @include('expenses.bills.item') + @php $item_row++; @endphp + @endforeach + @else + @foreach($bill->items as $item) + @include('expenses.bills.item') + @php $item_row++; @endphp + @endforeach + @if (empty($bill->items)) + @include('expenses.bills.item') + @endif + @endif + @php $item_row++; @endphp + @stack('add_item_td_start') + + + + + @stack('add_item_td_end') + @stack('sub_total_td_start') + + + + + @stack('sub_total_td_end') + @stack('add_discount_td_start') + + + + + @stack('add_discount_td_end') + @stack('tax_total_td_start') + + + + + @stack('tax_total_td_end') + @stack('grand_total_td_start') + + + + + @stack('grand_total_td_end') + +
    {{ trans('general.actions') }}{{ trans('general.name') }}{{ trans('bills.quantity') }}{{ trans('bills.price') }}{{ trans_choice('general.taxes', 1) }}{{ trans('bills.total') }}
    {{ trans('bills.sub_total') }}0
    + {{ trans('bills.add_discount') }} + + + {!! Form::hidden('discount', null, ['id' => 'discount', 'class' => 'form-control text-right']) !!} +
    {{ trans_choice('general.taxes', 1) }}0
    {{ trans('bills.total') }}0
    +
    +
    + + {{ Form::textareaGroup('notes', trans_choice('general.notes', 2)) }} + + {{ Form::selectGroup('category_id', trans_choice('general.categories', 1), 'folder-open-o', $categories) }} + + {{ Form::recurring('edit', $bill) }} + + {{ Form::fileGroup('attachment', trans('general.attachment'),[]) }} + + {{ Form::hidden('vendor_name', old('customer_name', null), ['id' => 'vendor_name']) }} + {{ Form::hidden('vendor_email', old('vendor_email', null), ['id' => 'vendor_email']) }} + {{ Form::hidden('vendor_tax_number', old('vendor_tax_number', null), ['id' => 'vendor_tax_number']) }} + {{ Form::hidden('vendor_phone', old('vendor_phone', null), ['id' => 'vendor_phone']) }} + {{ Form::hidden('vendor_address', old('vendor_address', null), ['id' => 'vendor_address']) }} + {{ Form::hidden('currency_rate', old('currency_rate', null), ['id' => 'currency_rate']) }} + {{ Form::hidden('bill_status_code', old('bill_status_code', null), ['id' => 'bill_status_code']) }} + {{ Form::hidden('amount', old('amount', null), ['id' => 'amount']) }} +
    + + + @permission('update-expenses-bills') + + + @endpermission + {!! Form::close() !!} +
    +@endsection + +@push('js') + + + + +@endpush + +@push('css') + + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/expenses/bills/index.blade.php b/resources/views/expenses/bills/index.blade.php new file mode 100755 index 0000000..ca47a2b --- /dev/null +++ b/resources/views/expenses/bills/index.blade.php @@ -0,0 +1,90 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.bills', 2)) + +@section('new_button') +@permission('create-expenses-bills') +  {{ trans('general.add_new') }} +  {{ trans('import.import') }} +@endpermission +  {{ trans('general.export') }} +@endsection + +@section('content') + +
    +
    + {!! Form::open(['url' => 'expenses/bills', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::select('vendor', $vendors, request('vendor'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::select('status', $statuses, request('status'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    + + +
    +
    + + + + + + + + + + + + + + @foreach($bills as $item) + + + + + + + + + + @endforeach + +
    @sortablelink('bill_number', trans_choice('general.numbers', 1))@sortablelink('vendor_name', trans_choice('general.vendors', 1))@sortablelink('amount', trans('general.amount'))@sortablelink('billed_at', trans('bills.bill_date'))@sortablelink('due_at', trans('bills.due_date'))@sortablelink('bill_status_code', trans_choice('general.statuses', 1)){{ trans('general.actions') }}
    {{ $item->bill_number }}{{ $item->vendor_name }}@money($item->amount, $item->currency_code, true){{ Date::parse($item->billed_at)->format($date_format) }}{{ Date::parse($item->due_at)->format($date_format) }}{{ trans('bills.status.' . $item->status->code) }} +
    + + +
    +
    +
    +
    + + + + +
    + +@endsection + diff --git a/resources/views/expenses/bills/item.blade.php b/resources/views/expenses/bills/item.blade.php new file mode 100755 index 0000000..0d015fd --- /dev/null +++ b/resources/views/expenses/bills/item.blade.php @@ -0,0 +1,54 @@ + + @stack('actions_td_start') + + @stack('actions_button_start') + + @stack('actions_button_end') + + @stack('actions_td_end') + @stack('name_td_start') + has('item.' . $item_row . '.name') ? 'class="has-error"' : '' !!}"> + @stack('name_input_start') + + + {!! $errors->first('item.' . $item_row . '.name', '

    :message

    ') !!} + @stack('name_input_end') + + @stack('name_td_end') + @stack('quantity_td_start') + has('item.' . $item_row . '.quantity') ? 'class="has-error"' : '' }}"> + @stack('quantity_input_start') + + {!! $errors->first('item.' . $item_row . '.quantity', '

    :message

    ') !!} + @stack('quantity_input_end') + + @stack('quantity_td_end') + @stack('price_td_start') + has('item.' . $item_row . 'price') ? 'class="has-error"' : '' }}"> + @stack('price_input_start') + + + {!! $errors->first('item.' . $item_row . 'price', '

    :message

    ') !!} + @stack('price_input_end') + + @stack('price_td_end') + @stack('taxes_td_start') + has('item.' . $item_row . '.tax_id') ? 'class="has-error"' : '' }}"> + @stack('tax_id_input_start') + {!! Form::select('item[' . $item_row . '][tax_id]', $taxes, empty($item) ? setting('general.default_tax') : $item->tax_id, ['id'=> 'item-tax-'. $item_row, 'class' => 'form-control tax-select2', 'placeholder' => trans('general.form.select.field', ['field' => trans_choice('general.taxes', 1)])]) !!} + {!! $errors->first('item.' . $item_row . '.tax_id', '

    :message

    ') !!} + @stack('tax_id_input_end') + + @stack('taxes_td_end') + @stack('total_td_start') + + @stack('total_input_start') + @if (empty($item) || !isset($item->total)) + 0 + @else + @money($item->total, $bill->currency_code, true) + @endif + @stack('total_input_end') + + @stack('total_td_end') + diff --git a/resources/views/expenses/bills/show.blade.php b/resources/views/expenses/bills/show.blade.php new file mode 100755 index 0000000..c3d0c07 --- /dev/null +++ b/resources/views/expenses/bills/show.blade.php @@ -0,0 +1,367 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.bills', 1) . ': ' . $bill->bill_number) + +@section('content') + @if (($recurring = $bill->recurring) && ($next = $recurring->next())) +
    +

    {{ trans('recurring.recurring') }}

    + +

    {{ trans('recurring.message', [ + 'type' => mb_strtolower(trans_choice('general.bills', 1)), + 'date' => $next->format($date_format) + ]) }} +

    +
    + @endif + +
    +
    +
    +
    +
    {{ trans('bills.status.' . $bill->status->code) }}
    +
    +
    + +
    +
    + @if (isset($bill->vendor->logo) && !empty($bill->vendor->logo->id)) + + @else + + @endif +
    +
    +
    + {{ setting('general.company_name') }}
    + {!! nl2br(setting('general.company_address')) !!}
    + @if (setting('general.company_tax_number')) + {{ trans('general.tax_number') }}: {{ setting('general.company_tax_number') }}
    + @endif +
    + @if (setting('general.company_phone')) + {{ setting('general.company_phone') }}
    + @endif + {{ setting('general.company_email') }} +
    +
    +
    + +
    +
    + {{ trans('bills.bill_from') }} +
    + {{ $bill->vendor_name }}
    + {!! nl2br($bill->vendor_address) !!}
    + @if ($bill->vendor_tax_number) + {{ trans('general.tax_number') }}: {{ $bill->vendor_tax_number }}
    + @endif +
    + @if ($bill->vendor_phone) + {{ $bill->vendor_phone }}
    + @endif + {{ $bill->vendor_email }} +
    +
    +
    +
    + + + + + + + @if ($bill->order_number) + + + + + @endif + + + + + + + + + +
    {{ trans('bills.bill_number') }}:{{ $bill->bill_number }}
    {{ trans('bills.order_number') }}:{{ $bill->order_number }}
    {{ trans('bills.bill_date') }}:{{ Date::parse($bill->billed_at)->format($date_format) }}
    {{ trans('bills.payment_due') }}:{{ Date::parse($bill->due_at)->format($date_format) }}
    +
    +
    +
    + +
    +
    + + + + + + + + + @foreach($bill->items as $item) + + + + + + + @endforeach + +
    {{ trans_choice('general.items', 1) }}{{ trans('bills.quantity') }}{{ trans('bills.price') }}{{ trans('bills.total') }}
    + {{ $item->name }} + @if ($item->sku) +
    {{ trans('items.sku') }}: {{ $item->sku }} + @endif +
    {{ $item->quantity }}@money($item->price, $bill->currency_code, true)@money($item->total, $bill->currency_code, true)
    +
    +
    + +
    +
    + @if ($bill->notes) +

    {{ trans_choice('general.notes', 2) }}:

    + +

    + {{ $bill->notes }} +

    + @endif +
    +
    +
    + + + @foreach ($bill->totals as $total) + @if ($total->code != 'total') + + + + + @else + @if ($bill->paid) + + + + + @endif + + + + + @endif + @endforeach + +
    {{ trans($total->title) }}:@money($total->amount, $bill->currency_code, true)
    {{ trans('invoices.paid') }}:- @money($bill->paid, $bill->currency_code, true)
    {{ trans($total->name) }}:@money($total->amount - $bill->paid, $bill->currency_code, true)
    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    +

    {{ trans('bills.histories') }}

    + +
    + +
    + +
    +
    +
    + + + + + + + + + + @foreach($bill->histories as $history) + + + + + + @endforeach + +
    {{ trans('general.date') }}{{ trans_choice('general.statuses', 1) }}{{ trans('general.description') }}
    {{ Date::parse($history->created_at)->format($date_format) }}{{ $history->status->name }}{{ $history->description }}
    +
    +
    +
    +
    + +
    +
    +
    +

    {{ trans('bills.payments') }}

    + +
    + +
    + +
    +
    +
    + + + + + + + + + + + @foreach($bill->payments as $payment) + + + + + + + @endforeach + +
    {{ trans('general.date') }}{{ trans('general.amount') }}{{ trans_choice('general.accounts', 1) }}{{ trans('general.actions') }}
    {{ Date::parse($payment->paid_at)->format($date_format) }}@money($payment->amount, $payment->currency_code, true){{ $payment->account->name }} + + + {!! Form::open([ + 'id' => 'bill-payment-' . $payment->id, + 'method' => 'DELETE', + 'url' => ['expenses/bills/payment', $payment->id], + 'style' => 'display:inline' + ]) !!} + {!! Form::button(' ' . trans('general.delete'), array( + 'type' => 'button', + 'class' => 'btn btn-danger btn-xs', + 'title' => trans('general.delete'), + 'onclick' => 'confirmDelete("' . '#bill-payment-' . $payment->id . '", "' . trans_choice('general.payments', 2) . '", "' . trans('general.delete_confirm', ['name' => '' . Date::parse($payment->paid_at)->format($date_format) . ' - ' . money($payment->amount, $payment->currency_code, true) . ' - ' . $payment->account->name . '', 'type' => strtolower(trans_choice('general.revenues', 1))]) . '", "' . trans('general.cancel') . '", "' . trans('general.delete') . '")' + )) !!} + {!! Form::close() !!} +
    +
    +
    +
    +
    +
    +@endsection + +@push('js') + + +@endpush + +@push('css') + + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/expenses/payments/create.blade.php b/resources/views/expenses/payments/create.blade.php new file mode 100755 index 0000000..198c128 --- /dev/null +++ b/resources/views/expenses/payments/create.blade.php @@ -0,0 +1,206 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.new', ['type' => trans_choice('general.payments', 1)])) + +@section('content') + +
    + {!! Form::open(['url' => 'expenses/payments', 'files' => true, 'role' => 'form']) !!} + +
    + {{ Form::textGroup('paid_at', trans('general.date'), 'calendar',['id' => 'paid_at', 'class' => 'form-control', 'required' => 'required', 'data-inputmask' => '\'alias\': \'yyyy-mm-dd\'', 'data-mask' => '', 'autocomplete' => 'off'], Date::now()->toDateString()) }} + + {!! Form::hidden('currency_code', $account_currency_code, ['id' => 'currency_code', 'class' => 'form-control', 'required' => 'required']) !!} + {!! Form::hidden('currency_rate', '', ['id' => 'currency_rate']) !!} + + {{ Form::textGroup('amount', trans('general.amount'), 'money', ['required' => 'required', 'autofocus' => 'autofocus']) }} + + @stack('account_id_input_start') +
    + {!! Form::label('account_id', trans_choice('general.accounts', 1), ['class' => 'control-label']) !!} +
    +
    + {!! Form::select('account_id', $accounts, setting('general.default_account'), array_merge(['class' => 'form-control', 'placeholder' => trans('general.form.select.field', ['field' => trans_choice('general.accounts', 1)])])) !!} +
    + {!! Form::text('currency', $account_currency_code, ['id' => 'currency', 'class' => 'form-control', 'required' => 'required', 'disabled' => 'disabled']) !!} +
    +
    +
    + @stack('account_id_input_end') + + @stack('vendor_id_input_start') +
    + {!! Form::label('vendor_id', trans_choice('general.vendors', 1), ['class' => 'control-label']) !!} +
    +
    + {!! Form::select('vendor_id', $vendors, null, array_merge(['id' => 'vendor_id', 'class' => 'form-control', 'placeholder' => trans('general.form.select.field', ['field' => trans_choice('general.vendors', 1)])])) !!} + + + +
    +
    + @stack('vendor_id_input_end') + + {{ Form::textareaGroup('description', trans('general.description')) }} + + @stack('category_id_input_start') +
    + {!! Form::label('category_id', trans_choice('general.categories', 1), ['class' => 'control-label']) !!} +
    +
    + {!! Form::select('category_id', $categories, null, array_merge(['class' => 'form-control', 'placeholder' => trans('general.form.select.field', ['field' => trans_choice('general.categories', 1)])])) !!} +
    + +
    +
    + {!! $errors->first('category_id', '

    :message

    ') !!} +
    + @stack('category_id_input_end') + + {{ Form::recurring('create') }} + + {{ Form::selectGroup('payment_method', trans_choice('general.payment_methods', 1), 'credit-card', $payment_methods, setting('general.default_payment_method')) }} + + {{ Form::textGroup('reference', trans('general.reference'), 'file-text-o',[]) }} + + {{ Form::fileGroup('attachment', trans('general.attachment')) }} +
    + + + + + + {!! Form::close() !!} +
    +@endsection + +@push('js') + + + + +@endpush + +@push('css') + + + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/expenses/payments/edit.blade.php b/resources/views/expenses/payments/edit.blade.php new file mode 100755 index 0000000..84fac27 --- /dev/null +++ b/resources/views/expenses/payments/edit.blade.php @@ -0,0 +1,194 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.edit', ['type' => trans_choice('general.payments', 1)])) + +@section('content') + @if (($recurring = $payment->recurring) && ($next = $recurring->next())) +
    +

    {{ trans('recurring.recurring') }}

    + +

    {{ trans('recurring.message', [ + 'type' => mb_strtolower(trans_choice('general.payments', 1)), + 'date' => $next->format($date_format) + ]) }} +

    +
    + @endif + + +
    + {!! Form::model($payment, [ + 'method' => 'PATCH', + 'files' => true, + 'url' => ['expenses/payments', $payment->id], + 'role' => 'form' + ]) !!} + +
    + {{ Form::textGroup('paid_at', trans('general.date'), 'calendar', ['id' => 'paid_at', 'class' => 'form-control', 'required' => 'required', 'data-inputmask' => '\'alias\': \'yyyy-mm-dd\'', 'data-mask' => '', 'autocomplete' => 'off'], Date::parse($payment->paid_at)->toDateString()) }} + + {!! Form::hidden('currency_code', $account_currency_code, ['id' => 'currency_code', 'class' => 'form-control', 'required' => 'required']) !!} + {!! Form::hidden('currency_rate', null, ['id' => 'currency_rate']) !!} + + {{ Form::textGroup('amount', trans('general.amount'), 'money', ['required' => 'required', 'autofocus' => 'autofocus']) }} + + @stack('account_id_input_start') +
    + {!! Form::label('account_id', trans_choice('general.accounts', 1), ['class' => 'control-label']) !!} +
    +
    + {!! Form::select('account_id', $accounts, null, array_merge(['class' => 'form-control', 'placeholder' => trans('general.form.select.field', ['field' => trans_choice('general.accounts', 1)])])) !!} +
    + {!! Form::text('currency', $account_currency_code, ['id' => 'currency', 'class' => 'form-control', 'required' => 'required', 'disabled' => 'disabled']) !!} +
    +
    +
    + @stack('account_id_input_end') + + {{ Form::selectGroup('vendor_id', trans_choice('general.vendors', 1), 'user', $vendors, null, []) }} + + {{ Form::textareaGroup('description', trans('general.description')) }} + + {{ Form::selectGroup('category_id', trans_choice('general.categories', 1), 'folder-open-o', $categories) }} + + {{ Form::recurring('edit', $payment) }} + + {{ Form::selectGroup('payment_method', trans_choice('general.payment_methods', 1), 'credit-card', $payment_methods) }} + + {{ Form::textGroup('reference', trans('general.reference'), 'file-text-o',[]) }} + + {{ Form::fileGroup('attachment', trans('general.attachment')) }} +
    + + + @permission('update-expenses-payments') + + + @endpermission +
    + + {!! Form::close() !!} +@endsection + +@push('js') + + + +@endpush + +@push('css') + + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/expenses/payments/index.blade.php b/resources/views/expenses/payments/index.blade.php new file mode 100755 index 0000000..22ec312 --- /dev/null +++ b/resources/views/expenses/payments/index.blade.php @@ -0,0 +1,89 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.payments', 2)) + +@section('new_button') +@permission('create-expenses-payments') +  {{ trans('general.add_new') }} +  {{ trans('import.import') }} +@endpermission +  {{ trans('general.export') }} +@endsection + +@section('content') + +
    +
    + {!! Form::open(['url' => 'expenses/payments', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::select('vendor', $vendors, request('vendor'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::select('category', $categories, request('category'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::select('account', $accounts, request('account'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    + +
    +
    + + + + + + + + + + + + + @foreach($payments as $item) + + + + + + + + + @endforeach + +
    @sortablelink('paid_at', trans('general.date'))@sortablelink('amount', trans('general.amount')){{ trans('general.actions') }}
    {{ Date::parse($item->paid_at)->format($date_format) }}@money($item->amount, $item->currency_code, true) + @if ($item->category->id != $transfer_cat_id) +
    + + +
    + @endif +
    +
    +
    + + + + +
    + +@endsection + diff --git a/resources/views/expenses/vendors/create.blade.php b/resources/views/expenses/vendors/create.blade.php new file mode 100755 index 0000000..faee66d --- /dev/null +++ b/resources/views/expenses/vendors/create.blade.php @@ -0,0 +1,69 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.new', ['type' => trans_choice('general.vendors', 1)])) + +@section('content') + +
    + {!! Form::open(['url' => 'expenses/vendors', 'files' => true, 'role' => 'form']) !!} + +
    + {{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} + + {{ Form::textGroup('email', trans('general.email'), 'envelope', []) }} + + {{ Form::textGroup('tax_number', trans('general.tax_number'), 'percent', []) }} + + {{ Form::selectGroup('currency_code', trans_choice('general.currencies', 1), 'exchange', $currencies, setting('general.default_currency')) }} + + {{ Form::textGroup('phone', trans('general.phone'), 'phone', []) }} + + {{ Form::textGroup('website', trans('general.website'), 'globe',[]) }} + + {{ Form::textareaGroup('address', trans('general.address')) }} + + {{ Form::fileGroup('logo', trans_choice('general.pictures', 1)) }} + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} +
    + + + + + + {!! Form::close() !!} +
    +@endsection + +@push('js') + +@endpush + +@push('css') + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/expenses/vendors/edit.blade.php b/resources/views/expenses/vendors/edit.blade.php new file mode 100755 index 0000000..48c1682 --- /dev/null +++ b/resources/views/expenses/vendors/edit.blade.php @@ -0,0 +1,96 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.edit', ['type' => trans_choice('general.vendors', 1)])) + +@section('content') + +
    + {!! Form::model($vendor, [ + 'method' => 'PATCH', + 'files' => true, + 'url' => ['expenses/vendors', $vendor->id], + 'role' => 'form' + ]) !!} + +
    + {{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} + + {{ Form::textGroup('email', trans('general.email'), 'envelope', []) }} + + {{ Form::textGroup('tax_number', trans('general.tax_number'), 'percent', []) }} + + {{ Form::selectGroup('currency_code', trans_choice('general.currencies', 1), 'exchange', $currencies) }} + + {{ Form::textGroup('phone', trans('general.phone'), 'phone', []) }} + + {{ Form::textGroup('website', trans('general.website'), 'globe',[]) }} + + {{ Form::textareaGroup('address', trans('general.address')) }} + + {{ Form::fileGroup('logo', trans_choice('general.logos', 1)) }} + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} +
    + + + @permission('update-expenses-vendors') + + + @endpermission + {!! Form::close() !!} +
    +@endsection + +@push('js') + +@endpush + +@push('css') + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/expenses/vendors/index.blade.php b/resources/views/expenses/vendors/index.blade.php new file mode 100755 index 0000000..f5aa6c9 --- /dev/null +++ b/resources/views/expenses/vendors/index.blade.php @@ -0,0 +1,92 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.vendors', 2)) + +@section('new_button') +@permission('create-expenses-vendors') +  {{ trans('general.add_new') }} +  {{ trans('import.import') }} +@endpermission +  {{ trans('general.export') }} +@endsection + +@section('content') + +
    +
    + {!! Form::open(['url' => 'expenses/vendors', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    + + +
    +
    + + + + + + + + + + + + @foreach($vendors as $item) + + + + + + + + @endforeach + +
    @sortablelink('name', trans('general.name'))@sortablelink('phone', trans('general.phone')){{ trans('general.actions') }}
    {{ $item->name }}{{ $item->phone }} +
    + + +
    +
    +
    +
    + + +
    + +@endsection + diff --git a/resources/views/expenses/vendors/show.blade.php b/resources/views/expenses/vendors/show.blade.php new file mode 100755 index 0000000..635fd03 --- /dev/null +++ b/resources/views/expenses/vendors/show.blade.php @@ -0,0 +1,152 @@ +@extends('layouts.admin') + +@section('title', $vendor->name) + +@section('content') +
    +
    + +
    +
    + +
    + +
    + + +
    +
    +

    {{ trans('auth.profile') }}

    +
    +
    + +
    + +
    + + +
    +
    +

    {{ trans('general.address') }}

    +
    + +
    +

    + {{ $vendor->address }} +

    +
    + +
    + + + + +
    + + +
    +
    +
    +
    + + +
    + {{ trans('general.paid') }} + @money($amounts['paid'], setting('general.default_currency'), true) +
    + +
    + +
    + +
    +
    + + +
    + {{ trans('dashboard.open_bills') }} + @money($amounts['open'], setting('general.default_currency'), true) +
    + +
    + +
    + +
    +
    + + +
    + {{ trans('dashboard.overdue_bills') }} + @money($amounts['overdue'], setting('general.default_currency'), true) +
    + +
    + +
    + +
    + +
    +
    +

    {{ trans_choice('general.transactions', 2) }}

    +
    + +
    +
    + + + + + + + + + + + @foreach($transactions as $item) + + + + + + + @endforeach + +
    {{ trans('general.date') }}{{ trans('general.amount') }}
    {{ Date::parse($item->paid_at)->format($date_format) }}@money($item->amount, $item->currency_code, true)
    +
    +
    + + + + +
    + +
    +
    +@endsection diff --git a/resources/views/incomes/customers/create.blade.php b/resources/views/incomes/customers/create.blade.php new file mode 100755 index 0000000..f1c313b --- /dev/null +++ b/resources/views/incomes/customers/create.blade.php @@ -0,0 +1,163 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.new', ['type' => trans_choice('general.customers', 1)])) + +@section('content') + +
    + {!! Form::open(['url' => 'incomes/customers', 'role' => 'form']) !!} + +
    + {{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} + + {{ Form::textGroup('email', trans('general.email'), 'envelope', []) }} + + {{ Form::textGroup('tax_number', trans('general.tax_number'), 'percent', []) }} + + {{ Form::selectGroup('currency_code', trans_choice('general.currencies', 1), 'exchange', $currencies, setting('general.default_currency')) }} + + {{ Form::textGroup('phone', trans('general.phone'), 'phone', []) }} + + {{ Form::textGroup('website', trans('general.website'), 'globe', []) }} + + {{ Form::textareaGroup('address', trans('general.address')) }} + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} + + @stack('create_user_input_start') +
    + {{ trans('customers.allow_login') }}   {{ Form::checkbox('create_user', '1', null, ['id' => 'create_user']) }} +
    + @stack('create_user_input_end') +
    + + + + + + {!! Form::close() !!} +
    +@endsection + +@push('js') + +@endpush + +@push('css') + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/incomes/customers/edit.blade.php b/resources/views/incomes/customers/edit.blade.php new file mode 100755 index 0000000..e342911 --- /dev/null +++ b/resources/views/incomes/customers/edit.blade.php @@ -0,0 +1,169 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.edit', ['type' => trans_choice('general.customers', 1)])) + +@section('content') + +
    + {!! Form::model($customer, [ + 'method' => 'PATCH', + 'url' => ['incomes/customers', $customer->id], + 'role' => 'form' + ]) !!} + +
    + {{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} + + {{ Form::textGroup('email', trans('general.email'), 'envelope', []) }} + + {{ Form::textGroup('tax_number', trans('general.tax_number'), 'percent', []) }} + + {{ Form::selectGroup('currency_code', trans_choice('general.currencies', 1), 'exchange', $currencies) }} + + {{ Form::textGroup('phone', trans('general.phone'), 'phone', []) }} + + {{ Form::textGroup('website', trans('general.website'), 'globe',[]) }} + + {{ Form::textareaGroup('address', trans('general.address')) }} + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} + + @stack('create_user_input_start') +
    + @if ($customer->user_id) + {{ trans('customers.user_created') }}   {{ Form::checkbox('create_user', '1', 1, ['id' => 'create_user', 'disabled' => 'disabled']) }} + @else + {{ trans('customers.allow_login') }}   {{ Form::checkbox('create_user', '1', null, ['id' => 'create_user']) }} + @endif +
    + @stack('create_user_input_end') +
    + + + @permission('update-incomes-customers') + + + @endpermission + + {!! Form::close() !!} +
    +@endsection + +@push('js') + +@endpush + +@push('css') + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/incomes/customers/index.blade.php b/resources/views/incomes/customers/index.blade.php new file mode 100755 index 0000000..a76c3c2 --- /dev/null +++ b/resources/views/incomes/customers/index.blade.php @@ -0,0 +1,94 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.customers', 2)) + +@section('new_button') +@permission('create-incomes-customers') +  {{ trans('general.add_new') }} +  {{ trans('import.import') }} +@endpermission +  {{ trans('general.export') }} +@endsection + +@section('content') + +
    +
    + {!! Form::open(['url' => 'incomes/customers', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    + + +
    +
    + + + + + + + + + + + + @foreach($customers as $item) + + + + + + + + @endforeach + +
    @sortablelink('name', trans('general.name'))@sortablelink('phone', trans('general.phone')){{ trans('general.actions') }}
    {{ $item->name }}{{ $item->phone }} +
    + + +
    +
    +
    +
    + + + +
    + +@endsection + diff --git a/resources/views/incomes/customers/show.blade.php b/resources/views/incomes/customers/show.blade.php new file mode 100755 index 0000000..f4892fe --- /dev/null +++ b/resources/views/incomes/customers/show.blade.php @@ -0,0 +1,152 @@ +@extends('layouts.admin') + +@section('title', $customer->name) + +@section('content') +
    +
    + +
    +
    + +
    + +
    + + +
    +
    +

    {{ trans('auth.profile') }}

    +
    +
    + +
    + +
    + + +
    +
    +

    {{ trans('general.address') }}

    +
    + +
    +

    + {{ $customer->address }} +

    +
    + +
    + + + + +
    + + +
    +
    +
    +
    + + +
    + {{ trans('general.paid') }} + @money($amounts['paid'], setting('general.default_currency'), true) +
    + +
    + +
    + +
    +
    + + +
    + {{ trans('dashboard.open_invoices') }} + @money($amounts['open'], setting('general.default_currency'), true) +
    + +
    + +
    + +
    +
    + + +
    + {{ trans('dashboard.overdue_invoices') }} + @money($amounts['overdue'], setting('general.default_currency'), true) +
    + +
    + +
    + +
    + +
    +
    +

    {{ trans_choice('general.transactions', 2) }}

    +
    + +
    +
    + + + + + + + + + + + @foreach($transactions as $item) + + + + + + + @endforeach + +
    {{ trans('general.date') }}{{ trans('general.amount') }}
    {{ Date::parse($item->paid_at)->format($date_format) }}@money($item->amount, $item->currency_code, true)
    +
    +
    + + + + +
    + +
    +
    +@endsection diff --git a/resources/views/incomes/invoices/create.blade.php b/resources/views/incomes/invoices/create.blade.php new file mode 100755 index 0000000..6065fa4 --- /dev/null +++ b/resources/views/incomes/invoices/create.blade.php @@ -0,0 +1,509 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.new', ['type' => trans_choice('general.invoices', 1)])) + +@section('content') + +
    + {!! Form::open(['url' => 'incomes/invoices', 'files' => true, 'role' => 'form']) !!} + +
    + @stack('customer_id_input_start') +
    + {!! Form::label('customer_id', trans_choice('general.customers', 1), ['class' => 'control-label']) !!} +
    +
    + {!! Form::select('customer_id', $customers, null, array_merge(['class' => 'form-control', 'placeholder' => trans('general.form.select.field', ['field' => trans_choice('general.customers', 1)])])) !!} +
    + +
    +
    + {!! $errors->first('customer_id', '

    :message

    ') !!} +
    + @stack('customer_id_input_end') + + {{ Form::selectGroup('currency_code', trans_choice('general.currencies', 1), 'exchange', $currencies, setting('general.default_currency')) }} + + {{ Form::textGroup('invoiced_at', trans('invoices.invoice_date'), 'calendar',['id' => 'invoiced_at', 'class' => 'form-control', 'required' => 'required', 'data-inputmask' => '\'alias\': \'yyyy/mm/dd\'', 'data-mask' => '', 'autocomplete' => 'off'], Date::now()->toDateString()) }} + + {{ Form::textGroup('due_at', trans('invoices.due_date'), 'calendar',['id' => 'due_at', 'class' => 'form-control', 'required' => 'required', 'data-inputmask' => '\'alias\': \'yyyy/mm/dd\'', 'data-mask' => '', 'autocomplete' => 'off']) }} + + {{ Form::textGroup('invoice_number', trans('invoices.invoice_number'), 'file-text-o', ['required' => 'required'], $number) }} + + {{ Form::textGroup('order_number', trans('invoices.order_number'), 'shopping-cart', []) }} + +
    + {!! Form::label('items', trans_choice('general.items', 2), ['class' => 'control-label']) !!} +
    + + + + @stack('actions_th_start') + + @stack('actions_th_end') + @stack('name_th_start') + + @stack('name_th_end') + @stack('quantity_th_start') + + @stack('quantity_th_end') + @stack('price_th_start') + + @stack('price_th_end') + @stack('taxes_th_start') + + @stack('taxes_th_end') + @stack('total_th_start') + + @stack('total_th_end') + + + + @php $item_row = 0; @endphp + @if(old('item')) + @foreach(old('item') as $old_item) + @php $item = (object) $old_item; @endphp + @include('incomes.invoices.item') + @php $item_row++; @endphp + @endforeach + @else + @include('incomes.invoices.item') + @endif + @php $item_row++; @endphp + @stack('add_item_td_start') + + + + + @stack('add_item_td_end') + @stack('sub_total_td_start') + + + + + @stack('sub_total_td_end') + @stack('add_discount_td_start') + + + + + @stack('add_discount_td_end') + @stack('tax_total_td_start') + + + + + @stack('tax_total_td_end') + @stack('grand_total_td_start') + + + + + @stack('grand_total_td_end') + +
    {{ trans('general.actions') }}{{ trans('general.name') }}{{ trans('invoices.quantity') }}{{ trans('invoices.price') }}{{ trans_choice('general.taxes', 1) }}{{ trans('invoices.total') }}
    {{ trans('invoices.sub_total') }}0
    + {{ trans('invoices.add_discount') }} + + + {!! Form::hidden('discount', null, ['id' => 'discount', 'class' => 'form-control text-right']) !!} +
    {{ trans_choice('general.taxes', 1) }}0
    {{ trans('invoices.total') }}0
    +
    +
    + + {{ Form::textareaGroup('notes', trans_choice('general.notes', 2)) }} + + @stack('category_id_input_start') +
    + {!! Form::label('category_id', trans_choice('general.categories', 1), ['class' => 'control-label']) !!} +
    +
    + {!! Form::select('category_id', $categories, null, array_merge(['class' => 'form-control', 'placeholder' => trans('general.form.select.field', ['field' => trans_choice('general.categories', 1)])])) !!} +
    + +
    +
    + {!! $errors->first('category_id', '

    :message

    ') !!} +
    + @stack('category_id_input_end') + + {{ Form::recurring('create') }} + + {{ Form::fileGroup('attachment', trans('general.attachment')) }} + + {{ Form::hidden('customer_name', old('customer_name'), ['id' => 'customer_name']) }} + {{ Form::hidden('customer_email', old('customer_email'), ['id' => 'customer_email']) }} + {{ Form::hidden('customer_tax_number', old('customer_tax_number'), ['id' => 'customer_tax_number']) }} + {{ Form::hidden('customer_phone', old('customer_phone'), ['id' => 'customer_phone']) }} + {{ Form::hidden('customer_address', old('customer_address'), ['id' => 'customer_address']) }} + {{ Form::hidden('currency_rate', old('currency_rate'), ['id' => 'currency_rate']) }} + {{ Form::hidden('invoice_status_code', old('invoice_status_code', 'draft'), ['id' => 'invoice_status_code']) }} + {{ Form::hidden('amount', old('amount', '0'), ['id' => 'amount']) }} +
    + + + + + + {!! Form::close() !!} +
    +@endsection + +@push('js') + + + + + +@endpush + +@push('css') + + + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/incomes/invoices/edit.blade.php b/resources/views/incomes/invoices/edit.blade.php new file mode 100755 index 0000000..93095b1 --- /dev/null +++ b/resources/views/incomes/invoices/edit.blade.php @@ -0,0 +1,486 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.edit', ['type' => trans_choice('general.invoices', 1)])) + +@section('content') + +
    + {!! Form::model($invoice, ['method' => 'PATCH', 'files' => true, 'url' => ['incomes/invoices', $invoice->id], 'role' => 'form']) !!} + +
    + {{ Form::selectGroup('customer_id', trans_choice('general.customers', 1), 'user', $customers, config('general.customers')) }} + + {{ Form::selectGroup('currency_code', trans_choice('general.currencies', 1), 'exchange', $currencies) }} + + {{ Form::textGroup('invoiced_at', trans('invoices.invoice_date'), 'calendar', ['id' => 'invoiced_at', 'class' => 'form-control', 'required' => 'required', 'data-inputmask' => '\'alias\': \'yyyy-mm-dd\'', 'data-mask' => '', 'autocomplete' => 'off'], Date::parse($invoice->invoiced_at)->toDateString()) }} + + {{ Form::textGroup('due_at', trans('invoices.due_date'), 'calendar', ['id' => 'due_at', 'class' => 'form-control', 'required' => 'required', 'data-inputmask' => '\'alias\': \'yyyy-mm-dd\'', 'data-mask' => '', 'autocomplete' => 'off'], Date::parse($invoice->due_at)->toDateString()) }} + + {{ Form::textGroup('invoice_number', trans('invoices.invoice_number'), 'file-text-o') }} + + {{ Form::textGroup('order_number', trans('invoices.order_number'), 'shopping-cart',[]) }} + +
    + {!! Form::label('items', trans_choice('general.items', 2), ['class' => 'control-label']) !!} +
    + + + + @stack('actions_th_start') + + @stack('actions_th_end') + @stack('name_th_start') + + @stack('name_th_end') + @stack('quantity_th_start') + + @stack('quantity_th_end') + @stack('price_th_start') + + @stack('price_th_end') + @stack('taxes_th_start') + + @stack('taxes_th_end') + @stack('total_th_start') + + @stack('total_th_end') + + + + @php $item_row = 0; @endphp + @if(old('item')) + @foreach(old('item') as $old_item) + @php $item = (object) $old_item; @endphp + @include('incomes.invoices.item') + @php $item_row++; @endphp + @endforeach + @else + @foreach($invoice->items as $item) + @include('incomes.invoices.item') + @php $item_row++; @endphp + @endforeach + @if (empty($invoice->items)) + @include('incomes.invoices.item') + @endif + @endif + @php $item_row++; @endphp + @stack('add_item_td_start') + + + + + @stack('add_item_td_end') + @stack('sub_total_td_start') + + + + + @stack('sub_total_td_end') + @stack('add_discount_td_start') + + + + + @stack('add_discount_td_end') + @stack('tax_total_td_start') + + + + + @stack('tax_total_td_end') + @stack('grand_total_td_start') + + + + + @stack('grand_total_td_end') + +
    {{ trans('general.actions') }}{{ trans('general.name') }}{{ trans('invoices.quantity') }}{{ trans('invoices.price') }}{{ trans_choice('general.taxes', 1) }}{{ trans('invoices.total') }}
    {{ trans('invoices.sub_total') }}0
    + {{ trans('invoices.add_discount') }} + + + {!! Form::hidden('discount', null, ['id' => 'discount', 'class' => 'form-control text-right']) !!} +
    {{ trans_choice('general.taxes', 1) }}0
    {{ trans('invoices.total') }}0
    +
    +
    + + {{ Form::textareaGroup('notes', trans_choice('general.notes', 2)) }} + + {{ Form::selectGroup('category_id', trans_choice('general.categories', 1), 'folder-open-o', $categories) }} + + {{ Form::recurring('edit', $invoice) }} + + {{ Form::fileGroup('attachment', trans('general.attachment')) }} + + {{ Form::hidden('customer_name', old('customer_name', null), ['id' => 'customer_name']) }} + {{ Form::hidden('customer_email', old('customer_email', null), ['id' => 'customer_email']) }} + {{ Form::hidden('customer_tax_number', old('customer_tax_number', null), ['id' => 'customer_tax_number']) }} + {{ Form::hidden('customer_phone', old('customer_phone', null), ['id' => 'customer_phone']) }} + {{ Form::hidden('customer_address', old('customer_address', null), ['id' => 'customer_address']) }} + {{ Form::hidden('currency_rate', old('currency_rate', null), ['id' => 'currency_rate']) }} + {{ Form::hidden('invoice_status_code', old('invoice_status_code', null), ['id' => 'invoice_status_code']) }} + {{ Form::hidden('amount', old('amount', null), ['id' => 'amount']) }} +
    + + + @permission('update-incomes-invoices') + + + @endpermission + {!! Form::close() !!} +
    +@endsection + +@push('js') + + + + +@endpush + +@push('css') + + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/incomes/invoices/index.blade.php b/resources/views/incomes/invoices/index.blade.php new file mode 100755 index 0000000..4e36173 --- /dev/null +++ b/resources/views/incomes/invoices/index.blade.php @@ -0,0 +1,88 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.invoices', 2)) + +@section('new_button') +@permission('create-incomes-invoices') +  {{ trans('general.add_new') }} +  {{ trans('import.import') }} +@endpermission +  {{ trans('general.export') }} +@endsection + +@section('content') + +
    +
    + {!! Form::open(['url' => 'incomes/invoices', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::select('customer', $customers, request('customer'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::select('status', $status, request('status'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    + +
    +
    + + + + + + + + + + + + + + @foreach($invoices as $item) + + + + + + + + + + @endforeach + +
    @sortablelink('invoice_number', trans_choice('general.numbers', 1))@sortablelink('customer_name', trans_choice('general.customers', 1))@sortablelink('amount', trans('general.amount'))@sortablelink('invoiced_at', trans('invoices.invoice_date'))@sortablelink('due_at', trans('invoices.due_date'))@sortablelink('invoice_status_code', trans_choice('general.statuses', 1)){{ trans('general.actions') }}
    {{ $item->invoice_number }}{{ $item->customer_name }}@money($item->amount, $item->currency_code, true){{ Date::parse($item->invoiced_at)->format($date_format) }}{{ Date::parse($item->due_at)->format($date_format) }}{{ trans('invoices.status.' . $item->status->code) }} +
    + + +
    +
    +
    +
    + + + + +
    + +@endsection diff --git a/resources/views/incomes/invoices/invoice.blade.php b/resources/views/incomes/invoices/invoice.blade.php new file mode 100755 index 0000000..bdf2684 --- /dev/null +++ b/resources/views/incomes/invoices/invoice.blade.php @@ -0,0 +1,140 @@ +@extends('layouts.invoice') + +@section('title', trans_choice('general.invoices', 1) . ': ' . $invoice->invoice_number) + +@section('content') +
    +
    +
    + @if ($logo) + + @endif +
    +
    +
    + {{ setting('general.company_name') }}
    + {!! nl2br(setting('general.company_address')) !!}
    + @if (setting('general.company_tax_number')) + {{ trans('general.tax_number') }}: {{ setting('general.company_tax_number') }}
    + @endif +
    + @if (setting('general.company_phone')) + {{ setting('general.company_phone') }}
    + @endif + {{ setting('general.company_email') }} +
    +
    +
    + +
    +
    + {{ trans('invoices.bill_to') }} +
    + {{ $invoice->customer_name }}
    + {!! nl2br($invoice->customer_address) !!}
    + @if ($invoice->customer_tax_number) + {{ trans('general.tax_number') }}: {{ $invoice->customer_tax_number }}
    + @endif +
    + @if ($invoice->customer_phone) + {{ $invoice->customer_phone }}
    + @endif + {{ $invoice->customer_email }} +
    +
    +
    +
    + + + + + + + @if ($invoice->order_number) + + + + + @endif + + + + + + + + + +
    {{ trans('invoices.invoice_number') }}:{{ $invoice->invoice_number }}
    {{ trans('invoices.order_number') }}:{{ $invoice->order_number }}
    {{ trans('invoices.invoice_date') }}:{{ Date::parse($invoice->invoiced_at)->format($date_format) }}
    {{ trans('invoices.payment_due') }}:{{ Date::parse($invoice->due_at)->format($date_format) }}
    +
    +
    +
    + +
    +
    + + + + + + + + + @foreach($invoice->items as $item) + + + + + + + @endforeach + +
    {{ trans_choice('general.items', 1) }}{{ trans('invoices.quantity') }}{{ trans('invoices.price') }}{{ trans('invoices.total') }}
    + {{ $item->name }} + @if ($item->sku) +
    {{ trans('items.sku') }}: {{ $item->sku }} + @endif +
    {{ $item->quantity }}@money($item->price, $invoice->currency_code, true)@money($item->total, $invoice->currency_code, true)
    +
    +
    + +
    +
    + @if ($invoice->notes) +

    {{ trans_choice('general.notes', 2) }}

    + +

    + {{ $invoice->notes }} +

    + @endif +
    +
    +
    + + + @foreach ($invoice->totals as $total) + @if ($total->code != 'total') + + + + + @else + @if ($invoice->paid) + + + + + @endif + + + + + @endif + @endforeach + +
    {{ trans($total->title) }}:@money($total->amount, $invoice->currency_code, true)
    {{ trans('invoices.paid') }}:- @money($invoice->paid, $invoice->currency_code, true)
    {{ trans($total->name) }}:@money($total->amount - $invoice->paid, $invoice->currency_code, true)
    +
    +
    +
    +
    +@endsection diff --git a/resources/views/incomes/invoices/item.blade.php b/resources/views/incomes/invoices/item.blade.php new file mode 100755 index 0000000..8822779 --- /dev/null +++ b/resources/views/incomes/invoices/item.blade.php @@ -0,0 +1,54 @@ + + @stack('actions_td_start') + + @stack('actions_button_start') + + @stack('actions_button_end') + + @stack('actions_td_end') + @stack('name_td_start') + has('item.' . $item_row . '.name') ? 'class="has-error"' : '' !!}"> + @stack('name_input_start') + + + {!! $errors->first('item.' . $item_row . '.name', '

    :message

    ') !!} + @stack('name_input_end') + + @stack('name_td_end') + @stack('quantity_td_start') + has('item.' . $item_row . '.quantity') ? 'class="has-error"' : '' }}"> + @stack('quantity_input_start') + + {!! $errors->first('item.' . $item_row . '.quantity', '

    :message

    ') !!} + @stack('quantity_input_end') + + @stack('quantity_td_end') + @stack('price_td_start') + has('item.' . $item_row . 'price') ? 'class="has-error"' : '' }}"> + @stack('price_input_start') + + + {!! $errors->first('item.' . $item_row . 'price', '

    :message

    ') !!} + @stack('price_input_end') + + @stack('price_td_end') + @stack('taxes_td_start') + has('item.' . $item_row . '.tax_id') ? 'class="has-error"' : '' }}"> + @stack('tax_id_input_start') + {!! Form::select('item[' . $item_row . '][tax_id]', $taxes, empty($item) ? setting('general.default_tax') : $item->tax_id, ['id'=> 'item-tax-'. $item_row, 'class' => 'form-control tax-select2', 'placeholder' => trans('general.form.select.field', ['field' => trans_choice('general.taxes', 1)])]) !!} + {!! $errors->first('item.' . $item_row . '.tax_id', '

    :message

    ') !!} + @stack('tax_id_input_end') + + @stack('taxes_td_end') + @stack('total_td_start') + + @stack('total_input_start') + @if (empty($item) || !isset($item->total)) + 0 + @else + @money($item->total, $invoice->currency_code, true) + @endif + @stack('total_input_end') + + @stack('total_td_end') + diff --git a/resources/views/incomes/invoices/show.blade.php b/resources/views/incomes/invoices/show.blade.php new file mode 100755 index 0000000..6e27c20 --- /dev/null +++ b/resources/views/incomes/invoices/show.blade.php @@ -0,0 +1,380 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.invoices', 1) . ': ' . $invoice->invoice_number) + +@section('content') + @if (($recurring = $invoice->recurring) && ($next = $recurring->next())) +
    +

    {{ trans('recurring.recurring') }}

    + +

    {{ trans('recurring.message', [ + 'type' => mb_strtolower(trans_choice('general.invoices', 1)), + 'date' => $next->format($date_format) + ]) }} +

    +
    + @endif + +
    +
    +
    +
    +
    {{ trans('invoices.status.' . $invoice->status->code) }}
    +
    +
    + +
    +
    + @if (setting('general.invoice_logo')) + + @elseif (setting('general.company_logo')) + + @else + + @endif +
    +
    +
    + {{ setting('general.company_name') }}
    + {!! nl2br(setting('general.company_address')) !!}
    + @if (setting('general.company_tax_number')) + {{ trans('general.tax_number') }}: {{ setting('general.company_tax_number') }}
    + @endif +
    + @if (setting('general.company_phone')) + {{ setting('general.company_phone') }}
    + @endif + {{ setting('general.company_email') }} +
    +
    +
    + +
    +
    + {{ trans('invoices.bill_to') }} +
    + {{ $invoice->customer_name }}
    + {!! nl2br($invoice->customer_address) !!}
    + @if ($invoice->customer_tax_number) + {{ trans('general.tax_number') }}: {{ $invoice->customer_tax_number }}
    + @endif +
    + @if ($invoice->customer_phone) + {{ $invoice->customer_phone }}
    + @endif + {{ $invoice->customer_email }} +
    +
    +
    +
    + + + + + + + @if ($invoice->order_number) + + + + + @endif + + + + + + + + + +
    {{ trans('invoices.invoice_number') }}:{{ $invoice->invoice_number }}
    {{ trans('invoices.order_number') }}:{{ $invoice->order_number }}
    {{ trans('invoices.invoice_date') }}:{{ Date::parse($invoice->invoiced_at)->format($date_format) }}
    {{ trans('invoices.payment_due') }}:{{ Date::parse($invoice->due_at)->format($date_format) }}
    +
    +
    +
    + +
    +
    + + + + + + + + + @foreach($invoice->items as $item) + + + + + + + @endforeach + +
    {{ trans_choice('general.items', 1) }}{{ trans('invoices.quantity') }}{{ trans('invoices.price') }}{{ trans('invoices.total') }}
    + {{ $item->name }} + @if ($item->sku) +
    {{ trans('items.sku') }}: {{ $item->sku }} + @endif +
    {{ $item->quantity }}@money($item->price, $invoice->currency_code, true)@money($item->total, $invoice->currency_code, true)
    +
    +
    + +
    +
    + @if ($invoice->notes) +

    {{ trans_choice('general.notes', 2) }}

    + +

    + {{ $invoice->notes }} +

    + @endif +
    +
    +
    + + + @foreach ($invoice->totals as $total) + @if ($total->code != 'total') + + + + + @else + @if ($invoice->paid) + + + + + @endif + + + + + @endif + @endforeach + +
    {{ trans($total->title) }}:@money($total->amount, $invoice->currency_code, true)
    {{ trans('invoices.paid') }}:- @money($invoice->paid, $invoice->currency_code, true)
    {{ trans($total->name) }}:@money($total->amount - $invoice->paid, $invoice->currency_code, true)
    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    +

    {{ trans('invoices.histories') }}

    + +
    + +
    + +
    +
    +
    + + + + + + + + + + @foreach($invoice->histories as $history) + + + + + + @endforeach + +
    {{ trans('general.date') }}{{ trans_choice('general.statuses', 1) }}{{ trans('general.description') }}
    {{ Date::parse($history->created_at)->format($date_format) }}{{ $history->status->name }}{{ $history->description }}
    +
    +
    +
    +
    + +
    +
    +
    +

    {{ trans('invoices.payments') }}

    + +
    + +
    + +
    +
    +
    + + + + + + + + + + + @foreach($invoice->payments as $payment) + + + + + + + @endforeach + +
    {{ trans('general.date') }}{{ trans('general.amount') }}{{ trans_choice('general.accounts', 1) }}{{ trans('general.actions') }}
    {{ Date::parse($payment->paid_at)->format($date_format) }}@money($payment->amount, $payment->currency_code, true){{ $payment->account->name }} + + + {!! Form::open([ + 'id' => 'invoice-payment-' . $payment->id, + 'method' => 'DELETE', + 'url' => ['incomes/invoices/payment', $payment->id], + 'style' => 'display:inline' + ]) !!} + {!! Form::button(' ' . trans('general.delete'), array( + 'type' => 'button', + 'class' => 'btn btn-danger btn-xs', + 'title' => trans('general.delete'), + 'onclick' => 'confirmDelete("' . '#invoice-payment-' . $payment->id . '", "' . trans_choice('general.payments', 2) . '", "' . trans('general.delete_confirm', ['name' => '' . Date::parse($payment->paid_at)->format($date_format) . ' - ' . money($payment->amount, $payment->currency_code, true) . ' - ' . $payment->account->name . '', 'type' => strtolower(trans_choice('general.revenues', 1))]) . '", "' . trans('general.cancel') . '", "' . trans('general.delete') . '")' + )) !!} + {!! Form::close() !!} +
    +
    +
    +
    +
    +
    +@endsection + +@push('js') + + +@endpush + +@push('css') + + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/incomes/revenues/create.blade.php b/resources/views/incomes/revenues/create.blade.php new file mode 100755 index 0000000..a208646 --- /dev/null +++ b/resources/views/incomes/revenues/create.blade.php @@ -0,0 +1,206 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.new', ['type' => trans_choice('general.revenues', 1)])) + +@section('content') + +
    + {!! Form::open(['url' => 'incomes/revenues', 'files' => true, 'role' => 'form']) !!} + +
    + {{ Form::textGroup('paid_at', trans('general.date'), 'calendar',['id' => 'paid_at', 'class' => 'form-control', 'required' => 'required', 'data-inputmask' => '\'alias\': \'yyyy-mm-dd\'', 'data-mask' => '', 'autocomplete' => 'off'], Date::now()->toDateString()) }} + + {!! Form::hidden('currency_code', $account_currency_code, ['id' => 'currency_code', 'class' => 'form-control', 'required' => 'required']) !!} + {!! Form::hidden('currency_rate', '', ['id' => 'currency_rate']) !!} + + {{ Form::textGroup('amount', trans('general.amount'), 'money', ['required' => 'required', 'autofocus' => 'autofocus']) }} + + @stack('account_id_input_start') +
    + {!! Form::label('account_id', trans_choice('general.accounts', 1), ['class' => 'control-label']) !!} +
    +
    + {!! Form::select('account_id', $accounts, setting('general.default_account'), array_merge(['class' => 'form-control', 'placeholder' => trans('general.form.select.field', ['field' => trans_choice('general.accounts', 1)])])) !!} +
    + {!! Form::text('currency', $account_currency_code, ['id' => 'currency', 'class' => 'form-control', 'required' => 'required', 'disabled' => 'disabled']) !!} +
    +
    +
    + @stack('account_id_input_end') + + @stack('customer_id_input_start') +
    + {!! Form::label('customer_id', trans_choice('general.customers', 1), ['class' => 'control-label']) !!} +
    +
    + {!! Form::select('customer_id', $customers, null, array_merge(['class' => 'form-control', 'placeholder' => trans('general.form.select.field', ['field' => trans_choice('general.customers', 1)])])) !!} + + + +
    +
    + @stack('customer_id_input_end') + + {{ Form::textareaGroup('description', trans('general.description')) }} + + @stack('category_id_input_start') +
    + {!! Form::label('category_id', trans_choice('general.categories', 1), ['class' => 'control-label']) !!} +
    +
    + {!! Form::select('category_id', $categories, null, array_merge(['class' => 'form-control', 'placeholder' => trans('general.form.select.field', ['field' => trans_choice('general.categories', 1)])])) !!} +
    + +
    +
    + {!! $errors->first('category_id', '

    :message

    ') !!} +
    + @stack('category_id_input_end') + + {{ Form::recurring('create') }} + + {{ Form::selectGroup('payment_method', trans_choice('general.payment_methods', 1), 'credit-card', $payment_methods, setting('general.default_payment_method')) }} + + {{ Form::textGroup('reference', trans('general.reference'), 'file-text-o', []) }} + + {{ Form::fileGroup('attachment', trans('general.attachment')) }} +
    + + + + + + {!! Form::close() !!} +
    +@endsection + +@push('js') + + + + +@endpush + +@push('css') + + + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/incomes/revenues/edit.blade.php b/resources/views/incomes/revenues/edit.blade.php new file mode 100755 index 0000000..b43f061 --- /dev/null +++ b/resources/views/incomes/revenues/edit.blade.php @@ -0,0 +1,194 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.edit', ['type' => trans_choice('general.revenues', 1)])) + +@section('content') + @if (($recurring = $revenue->recurring) && ($next = $recurring->next())) +
    +

    {{ trans('recurring.recurring') }}

    + +

    {{ trans('recurring.message', [ + 'type' => mb_strtolower(trans_choice('general.revenues', 1)), + 'date' => $next->format($date_format) + ]) }} +

    +
    + @endif + + +
    + {!! Form::model($revenue, [ + 'method' => 'PATCH', + 'files' => true, + 'url' => ['incomes/revenues', $revenue->id], + 'role' => 'form' + ]) !!} + +
    + {{ Form::textGroup('paid_at', trans('general.date'), 'calendar', ['id' => 'paid_at', 'class' => 'form-control', 'required' => 'required', 'data-inputmask' => '\'alias\': \'yyyy-mm-dd\'', 'data-mask' => '', 'autocomplete' => 'off'], Date::parse($revenue->paid_at)->toDateString()) }} + + {!! Form::hidden('currency_code', $account_currency_code, ['id' => 'currency_code', 'class' => 'form-control', 'required' => 'required']) !!} + {!! Form::hidden('currency_rate', null, ['id' => 'currency_rate']) !!} + + {{ Form::textGroup('amount', trans('general.amount'), 'money', ['required' => 'required', 'autofocus' => 'autofocus']) }} + + @stack('account_id_input_start') +
    + {!! Form::label('account_id', trans_choice('general.accounts', 1), ['class' => 'control-label']) !!} +
    +
    + {!! Form::select('account_id', $accounts, null, array_merge(['class' => 'form-control', 'placeholder' => trans('general.form.select.field', ['field' => trans_choice('general.accounts', 1)])])) !!} +
    + {!! Form::text('currency', $account_currency_code, ['id' => 'currency', 'class' => 'form-control', 'required' => 'required', 'disabled' => 'disabled']) !!} +
    +
    +
    + @stack('account_id_input_end') + + {{ Form::selectGroup('customer_id', trans_choice('general.customers', 1), 'user', $customers, null, []) }} + + {{ Form::textareaGroup('description', trans('general.description')) }} + + {{ Form::selectGroup('category_id', trans_choice('general.categories', 1), 'folder-open-o', $categories) }} + + {{ Form::recurring('edit', $revenue) }} + + {{ Form::selectGroup('payment_method', trans_choice('general.payment_methods', 1), 'credit-card', $payment_methods) }} + + {{ Form::textGroup('reference', trans('general.reference'), 'file-text-o',[]) }} + + {{ Form::fileGroup('attachment', trans('general.attachment')) }} +
    + + + @permission('update-incomes-revenues') + + + @endpermission + + {!! Form::close() !!} +
    +@endsection + +@push('js') + + + +@endpush + +@push('css') + + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/incomes/revenues/index.blade.php b/resources/views/incomes/revenues/index.blade.php new file mode 100755 index 0000000..72b1091 --- /dev/null +++ b/resources/views/incomes/revenues/index.blade.php @@ -0,0 +1,89 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.revenues', 2)) + +@section('new_button') +@permission('create-incomes-revenues') +  {{ trans('general.add_new') }} +  {{ trans('import.import') }} +@endpermission +  {{ trans('general.export') }} +@endsection + +@section('content') + +
    +
    + {!! Form::open(['url' => 'incomes/revenues', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::select('customer', $customers, request('customer'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::select('category', $categories, request('category'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::select('account', $accounts, request('account'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    + +
    +
    + + + + + + + + + + + + + @foreach($revenues as $item) + + + + + + + + + @endforeach + +
    @sortablelink('paid_at', trans('general.date'))@sortablelink('amount', trans('general.amount')){{ trans('general.actions') }}
    {{ Date::parse($item->paid_at)->format($date_format) }}@money($item->amount, $item->currency_code, true) + @if ($item->category->id != $transfer_cat_id) +
    + + +
    + @endif +
    +
    +
    + + + + +
    + +@endsection + diff --git a/resources/views/install/database/create.blade.php b/resources/views/install/database/create.blade.php new file mode 100755 index 0000000..368d025 --- /dev/null +++ b/resources/views/install/database/create.blade.php @@ -0,0 +1,37 @@ +@extends('layouts.install') + +@section('header', trans('install.steps.database')) + +@section('content') + {{ Form::textGroup('hostname', trans('install.database.hostname'), 'server', ['required' => 'required'], old('hostname', 'localhost'), 'col-md-12') }} + + {{ Form::textGroup('username', trans('install.database.username'), 'user', ['required' => 'required'], old('username'), 'col-md-12') }} + + {{ Form::passwordGroup('password', trans('install.database.password'), 'key', [], old('password'), 'col-md-12') }} + + {{ Form::textGroup('database', trans('install.database.name'), 'database', ['required' => 'required'], old('database'), 'col-md-12') }} +@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/install/language/create.blade.php b/resources/views/install/language/create.blade.php new file mode 100755 index 0000000..d486544 --- /dev/null +++ b/resources/views/install/language/create.blade.php @@ -0,0 +1,15 @@ +@extends('layouts.install') + +@section('header', trans('install.steps.language')) + +@section('content') +
    +
    + +
    +
    +@endsection diff --git a/resources/views/install/requirements/show.blade.php b/resources/views/install/requirements/show.blade.php new file mode 100755 index 0000000..b8f0070 --- /dev/null +++ b/resources/views/install/requirements/show.blade.php @@ -0,0 +1,3 @@ +@extends('layouts.install') + +@section('header', trans('install.steps.requirements')) \ No newline at end of file diff --git a/resources/views/install/settings/create.blade.php b/resources/views/install/settings/create.blade.php new file mode 100755 index 0000000..2be8876 --- /dev/null +++ b/resources/views/install/settings/create.blade.php @@ -0,0 +1,38 @@ +@extends('layouts.install') + +@section('header', trans('install.steps.settings')) + +@section('content') + {{ Form::textGroup('company_name', trans('install.settings.company_name'), 'id-card-o', ['required' => 'required'], old('company_name'), 'col-md-12') }} + + {{ Form::textGroup('company_email', trans('install.settings.company_email'), 'envelope', ['required' => 'required'], old('company_email'), 'col-md-12') }} + + {{ Form::textGroup('user_email', trans('install.settings.admin_email'), 'envelope', ['required' => 'required'], old('user_email'), 'col-md-12') }} + + {{ Form::passwordGroup('user_password', trans('install.settings.admin_password'), 'key', ['required' => 'required'], old('user_password'), 'col-md-12') }} +@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/install/updates/index.blade.php b/resources/views/install/updates/index.blade.php new file mode 100755 index 0000000..80d1d0f --- /dev/null +++ b/resources/views/install/updates/index.blade.php @@ -0,0 +1,72 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.updates', 2)) + +@section('new_button') +  {{ trans('updates.check') }} +@endsection + +@section('content') + +
    +
    + +

    Akaunting

    +
    + + +
    + @if (empty($core)) + {{ trans('updates.latest_core') }} + @else + {{ trans('updates.new_core') }} +  {{ trans('updates.update', ['version' => $core]) }} +  {{ trans('updates.changelog') }} + @endif +
    + + +
    + + + +
    +
    + +

    {{ trans_choice('general.modules', 2) }}

    +
    + + +
    +
    + + + + + + + + + + + + @foreach($modules as $module) + + + + + + + + @endforeach + +
    {{ trans('general.name') }}{{ trans_choice('general.categories', 1) }}{{ trans('updates.installed_version') }}{{ trans('updates.latest_version') }}{{ trans('general.actions') }}
    {{ $module->name }}{{ $module->category }}{{ $module->installed }}{{ $module->latest }} + {{ trans_choice('general.updates', 1) }} +
    +
    +
    + + +
    + +@endsection diff --git a/resources/views/layouts/admin.blade.php b/resources/views/layouts/admin.blade.php new file mode 100755 index 0000000..d7e792c --- /dev/null +++ b/resources/views/layouts/admin.blade.php @@ -0,0 +1,20 @@ + + @include('partials.admin.head') + + + @stack('body_start') + + +
    + @include('partials.admin.header') + + @include('partials.admin.menu') + + @include('partials.admin.content') + + @include('partials.admin.footer') +
    + + @stack('body_end') + + diff --git a/resources/views/layouts/auth.blade.php b/resources/views/layouts/auth.blade.php new file mode 100755 index 0000000..da2f580 --- /dev/null +++ b/resources/views/layouts/auth.blade.php @@ -0,0 +1,38 @@ + + @include('partials.auth.head') + + + @stack('body_start') + + + + @stack('body_end') + + diff --git a/resources/views/layouts/bill.blade.php b/resources/views/layouts/bill.blade.php new file mode 100755 index 0000000..fdb27ab --- /dev/null +++ b/resources/views/layouts/bill.blade.php @@ -0,0 +1,15 @@ + + @include('partials.bill.head') + + + @stack('body_start') + + +
    + @yield('content') +
    + + + @stack('body_end') + + diff --git a/resources/views/layouts/customer.blade.php b/resources/views/layouts/customer.blade.php new file mode 100755 index 0000000..508f273 --- /dev/null +++ b/resources/views/layouts/customer.blade.php @@ -0,0 +1,20 @@ + + @include('partials.customer.head') + + + @stack('body_start') + + +
    + @include('partials.customer.header') + + @include('partials.customer.menu') + + @include('partials.customer.content') + + @include('partials.customer.footer') +
    + + @stack('body_end') + + diff --git a/resources/views/layouts/install.blade.php b/resources/views/layouts/install.blade.php new file mode 100755 index 0000000..e60f1eb --- /dev/null +++ b/resources/views/layouts/install.blade.php @@ -0,0 +1,62 @@ + + @include('partials.install.head') + + +
    + +
    + + +
    +
    +
    +

    @yield('header')

    +
    +
    + + +
    + {!! Form::open(['url' => url()->current(), 'role' => 'form']) !!} + +
    +
    + +
    +
    + @include('flash::message') +
    +
    + + @yield('content') +
    + + + + + {!! Form::close() !!} +
    + + +
    +
    + + diff --git a/resources/views/layouts/invoice.blade.php b/resources/views/layouts/invoice.blade.php new file mode 100755 index 0000000..9858a32 --- /dev/null +++ b/resources/views/layouts/invoice.blade.php @@ -0,0 +1,15 @@ + + @include('partials.invoice.head') + + + @stack('body_start') + + +
    + @yield('content') +
    + + + @stack('body_end') + + diff --git a/resources/views/layouts/modules.blade.php b/resources/views/layouts/modules.blade.php new file mode 100755 index 0000000..927d517 --- /dev/null +++ b/resources/views/layouts/modules.blade.php @@ -0,0 +1,20 @@ + + @include('partials.modules.head') + + + @stack('body_start') + + +
    + @include('partials.admin.header') + + @include('partials.admin.menu') + + @include('partials.admin.content') + + @include('partials.admin.footer') +
    + + @stack('body_end') + + diff --git a/resources/views/layouts/print.blade.php b/resources/views/layouts/print.blade.php new file mode 100755 index 0000000..cbcb4ad --- /dev/null +++ b/resources/views/layouts/print.blade.php @@ -0,0 +1,16 @@ + + @include('partials.admin.head') + + @push('css') + + + @endpush + + + @stack('body_start') + + @yield('content') + + @stack('body_end') + + diff --git a/resources/views/modals/bills/payment.blade.php b/resources/views/modals/bills/payment.blade.php new file mode 100755 index 0000000..3ae1ec2 --- /dev/null +++ b/resources/views/modals/bills/payment.blade.php @@ -0,0 +1,176 @@ + + + \ No newline at end of file diff --git a/resources/views/modals/categories/create.blade.php b/resources/views/modals/categories/create.blade.php new file mode 100755 index 0000000..c3c7741 --- /dev/null +++ b/resources/views/modals/categories/create.blade.php @@ -0,0 +1,82 @@ + + + \ No newline at end of file diff --git a/resources/views/modals/customers/create.blade.php b/resources/views/modals/customers/create.blade.php new file mode 100755 index 0000000..8b7706b --- /dev/null +++ b/resources/views/modals/customers/create.blade.php @@ -0,0 +1,86 @@ + + + \ No newline at end of file diff --git a/resources/views/modals/invoices/payment.blade.php b/resources/views/modals/invoices/payment.blade.php new file mode 100755 index 0000000..b054216 --- /dev/null +++ b/resources/views/modals/invoices/payment.blade.php @@ -0,0 +1,176 @@ + + + \ No newline at end of file diff --git a/resources/views/modals/vendors/create.blade.php b/resources/views/modals/vendors/create.blade.php new file mode 100755 index 0000000..867b4a3 --- /dev/null +++ b/resources/views/modals/vendors/create.blade.php @@ -0,0 +1,86 @@ + + + \ No newline at end of file diff --git a/resources/views/modules/home/index.blade.php b/resources/views/modules/home/index.blade.php new file mode 100755 index 0000000..3a2b992 --- /dev/null +++ b/resources/views/modules/home/index.blade.php @@ -0,0 +1,44 @@ +@extends('layouts.modules') + +@section('title', trans_choice('general.modules', 2)) + +@section('new_button') +  {{ trans('modules.api_token') }} +  {{ trans('modules.my_apps') }} +@endsection + +@section('content') + @include('partials.modules.bar') + +
    +
    +
    +

    {{ trans('modules.top_paid') }}

    +
    + + @foreach ($paid as $module) + @include('partials.modules.item') + @endforeach +
    + +
    +
    +

    {{ trans('modules.new') }}

    +
    + + @foreach ($new as $module) + @include('partials.modules.item') + @endforeach +
    + +
    +
    +

    {{ trans('modules.top_free') }}

    +
    + + @foreach ($free as $module) + @include('partials.modules.item') + @endforeach +
    +
    +@endsection \ No newline at end of file diff --git a/resources/views/modules/item/show.blade.php b/resources/views/modules/item/show.blade.php new file mode 100755 index 0000000..40db550 --- /dev/null +++ b/resources/views/modules/item/show.blade.php @@ -0,0 +1,324 @@ +@extends('layouts.modules') + +@section('title', trans_choice('general.modules', 2)) + +@section('new_button') +  {{ trans('modules.api_token') }} +  {{ trans('modules.my_apps') }} +@endsection + +@section('content') + @include('partials.modules.bar') + +
    +
    +
    +
    +

    {{ $module->name }}

    + +
    + @for($i = 1; $i <= $module->vote; $i++) + + @endfor + @for($i = $module->vote; $i < 5; $i++) + + @endfor +
    +
    + + +
    + +
    +
    +

    {{ trans_choice('general.actions', 1) }}

    +
    + +
    +
    +
    +
    + @if ($module->price == '0.0000') + {{ trans('modules.free') }} + @else + @if (isset($module->special_price)) + {{ $module->price }} + {{ $module->special_price }} + @else + {{ $module->price }} + @endif + @endif +
    +
    +
    + + + + +
    + + +
    +

    {{ trans('modules.about') }}

    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ trans_choice('general.vendors', 1) }}{{ $module->vendor_name }}
    {{ trans('footer.version') }}{{ $module->version }}
    {{ trans('modules.added') }}{{ Date::parse($module->created_at)->format($date_format) }}
    {{ trans('modules.updated') }}{{ Date::parse($module->updated_at)->diffForHumans() }}
    {{ trans('modules.compatibility') }}{{ $module->compatibility }}
    {{ trans_choice('general.categories', 1) }}{{ $module->category->name }}
    +
    + +
    + +
    +
    +
    +@endsection + +@push('css') + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/modules/my/index.blade.php b/resources/views/modules/my/index.blade.php new file mode 100755 index 0000000..6f2843c --- /dev/null +++ b/resources/views/modules/my/index.blade.php @@ -0,0 +1,62 @@ +@extends('layouts.modules') + +@section('title', trans_choice('general.modules', 2)) + +@section('new_button') +  {{ trans('modules.api_token') }} +  {{ trans('modules.my_apps') }} +@endsection + +@section('content') + @include('partials.modules.bar') + +
    +
    +
    +

    {{ trans('modules.my.purchased') }}

    +
    + + @if ($purchased) + @foreach ($purchased as $module) + @include('partials.modules.item') + @endforeach + @else +
    +
    +

    + {{ trans('modules.no_apps') }} +

    +

    + {!! trans('modules.developer') !!} +

    +
    + +
    + @endif +
    + +
    +
    +

    {{ trans('modules.my.installed') }}

    +
    + + @if ($modules) + @foreach ($modules as $module) + @include('partials.modules.item') + @endforeach + @else +
    +
    +

    + {{ trans('modules.no_apps') }} +

    +

    + {!! trans('modules.developer') !!} +

    +
    + +
    + @endif +
    +
    +@endsection \ No newline at end of file diff --git a/resources/views/modules/tiles/index.blade.php b/resources/views/modules/tiles/index.blade.php new file mode 100755 index 0000000..d4423f1 --- /dev/null +++ b/resources/views/modules/tiles/index.blade.php @@ -0,0 +1,38 @@ +@extends('layouts.modules') + +@section('title', trans_choice('general.modules', 2)) + +@section('new_button') +  {{ trans('modules.api_token') }} +  {{ trans('modules.my_apps') }} +@endsection + +@section('content') + @include('partials.modules.bar') + +
    +
    +
    +

    {{ $title }}

    +
    + + @if ($modules) + @foreach ($modules as $module) + @include('partials.modules.item') + @endforeach + @else +
    +
    +

    + {{ trans('modules.no_apps') }} +

    +

    + {!! trans('modules.developer') !!} +

    +
    + +
    + @endif +
    +
    +@endsection \ No newline at end of file diff --git a/resources/views/modules/token/create.blade.php b/resources/views/modules/token/create.blade.php new file mode 100755 index 0000000..61faa3b --- /dev/null +++ b/resources/views/modules/token/create.blade.php @@ -0,0 +1,32 @@ +@extends('layouts.modules') + +@section('title', trans('modules.title')) + +@section('content') +
    + {!! Form::open(['url' => 'apps/token', 'files' => true, 'role' => 'form']) !!} + +
    +
    +
    + {!! Form::label('sale_price', trans('modules.api_token'), ['class' => 'control-label']) !!} +
    + + {!! Form::text('api_token', setting('general.api_token', null), ['class' => 'form-control', 'required' => 'required', 'placeholder' => trans('general.form.enter', ['field' => trans('modules.api_token')])]) !!} +
    + {!! $errors->first('api_token', '

    :message

    ') !!} +
    +

    + {!! trans('modules.token_link') !!} +

    +
    +
    + + + + + {!! Form::close() !!} +
    +@endsection \ No newline at end of file diff --git a/resources/views/partials/admin/content.blade.php b/resources/views/partials/admin/content.blade.php new file mode 100755 index 0000000..e6fffc2 --- /dev/null +++ b/resources/views/partials/admin/content.blade.php @@ -0,0 +1,46 @@ +@stack('content_start') + + +
    + @stack('content_wrapper_start') + + +
    + @stack('content_header_start') + +

    + @yield('title') + @yield('new_button') + @if (!empty($suggestion_modules)) + @foreach($suggestion_modules as $s_module) + +  {{ $s_module->name }} + + @endforeach + @endif +

    + + @stack('content_header_end') +
    + + +
    + @include('flash::message') + + @stack('content_content_start') + + @yield('content') + + @stack('content_content_end') +
    + + + @stack('content_wrapper_end') +
    + + + + +@stack('content_end') \ No newline at end of file diff --git a/resources/views/partials/admin/footer.blade.php b/resources/views/partials/admin/footer.blade.php new file mode 100755 index 0000000..12597c9 --- /dev/null +++ b/resources/views/partials/admin/footer.blade.php @@ -0,0 +1,10 @@ +@stack('footer_start') + + + +@stack('footer_end') diff --git a/resources/views/partials/admin/head.blade.php b/resources/views/partials/admin/head.blade.php new file mode 100755 index 0000000..682fe33 --- /dev/null +++ b/resources/views/partials/admin/head.blade.php @@ -0,0 +1,71 @@ + + @stack('head_start') + + + + + + + @yield('title') - @setting('general.company_name') + + + + + + + + + + + @if (setting('general.admin_theme', 'skin-green-light') == 'skin-green-light') + + @else + + + @endif + + + + + + + + + @stack('css') + + @stack('stylesheet') + + + + + + + + + + + + + + + + + + + + + + + + + @stack('js') + + @stack('scripts') + + @stack('head_end') + diff --git a/resources/views/partials/admin/header.blade.php b/resources/views/partials/admin/header.blade.php new file mode 100755 index 0000000..248e764 --- /dev/null +++ b/resources/views/partials/admin/header.blade.php @@ -0,0 +1,240 @@ +@stack('header_start') + +
    + + + + +
    + +@stack('header_end') diff --git a/resources/views/partials/admin/menu.blade.php b/resources/views/partials/admin/menu.blade.php new file mode 100755 index 0000000..b0dfd3a --- /dev/null +++ b/resources/views/partials/admin/menu.blade.php @@ -0,0 +1,43 @@ +@stack('menu_start') + + + +@stack('menu_end') \ No newline at end of file diff --git a/resources/views/partials/admin/pagination.blade.php b/resources/views/partials/admin/pagination.blade.php new file mode 100755 index 0000000..3958070 --- /dev/null +++ b/resources/views/partials/admin/pagination.blade.php @@ -0,0 +1,16 @@ +@stack('pagination_start') + +@if ($items->firstItem()) +
    + {{ trans('pagination.showing', ['first' => $items->firstItem(), 'last' => $items->lastItem(), 'total' => $items->total(), 'type' => strtolower(trans_choice('general.' . $type, 2))]) }} +
    +
    + {!! $items->appends(request()->except('page'))->links() !!} +
    +@else +
    + {{ trans('general.no_records') }} +
    +@endif + +@stack('pagination_end') \ No newline at end of file diff --git a/resources/views/partials/auth/head.blade.php b/resources/views/partials/auth/head.blade.php new file mode 100755 index 0000000..cfc649b --- /dev/null +++ b/resources/views/partials/auth/head.blade.php @@ -0,0 +1,54 @@ + + @stack('head_start') + + + + + + + @yield('title') + + + + + + + + + + + + + + + + + + @stack('css') + + @stack('stylesheet') + + + + + + + + + + + + + + + + + @stack('js') + + @stack('scripts') + + @stack('head_end') + diff --git a/resources/views/partials/bill/head.blade.php b/resources/views/partials/bill/head.blade.php new file mode 100755 index 0000000..e248275 --- /dev/null +++ b/resources/views/partials/bill/head.blade.php @@ -0,0 +1,59 @@ + + @stack('head_start') + + + + + + + + @yield('title') - @setting('general.company_name') + + + + + + + + + + + + + + + + + @stack('css') + + @stack('stylesheet') + + + + + + + + + + + + + + + + + @stack('js') + + @stack('scripts') + + @stack('head_end') + diff --git a/resources/views/partials/customer/content.blade.php b/resources/views/partials/customer/content.blade.php new file mode 100755 index 0000000..5e8d401 --- /dev/null +++ b/resources/views/partials/customer/content.blade.php @@ -0,0 +1,39 @@ +@stack('content_start') + + +
    + @stack('content_wrapper_start') + + +
    + @stack('content_header_start') + +

    + @yield('title') + @yield('new_button') +

    + + @stack('content_header_end') +
    + + +
    + @include('flash::message') + + @stack('content_content_start') + + @yield('content') + + @stack('content_content_end') +
    + + + @stack('content_wrapper_end') +
    + + + + +@stack('content_end') diff --git a/resources/views/partials/customer/footer.blade.php b/resources/views/partials/customer/footer.blade.php new file mode 100755 index 0000000..f61a1dc --- /dev/null +++ b/resources/views/partials/customer/footer.blade.php @@ -0,0 +1,7 @@ +@stack('footer_start') + + + +@stack('footer_end') diff --git a/resources/views/partials/customer/head.blade.php b/resources/views/partials/customer/head.blade.php new file mode 100755 index 0000000..8bef6ff --- /dev/null +++ b/resources/views/partials/customer/head.blade.php @@ -0,0 +1,77 @@ + + @stack('head_start') + + + + + + + @yield('title') - @setting('general.company_name') + + + + + + + + + + + @if (setting('general.admin_theme', 'skin-green-light') == 'skin-green-light') + + @else + + + @endif + + + + + + + + + + + @stack('css') + + @stack('stylesheet') + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @stack('js') + + @stack('scripts') + + @stack('head_end') + diff --git a/resources/views/partials/customer/header.blade.php b/resources/views/partials/customer/header.blade.php new file mode 100755 index 0000000..7f399a0 --- /dev/null +++ b/resources/views/partials/customer/header.blade.php @@ -0,0 +1,107 @@ +@stack('header_start') + +
    + + + + +
    + +@stack('header_end') diff --git a/resources/views/partials/customer/menu.blade.php b/resources/views/partials/customer/menu.blade.php new file mode 100755 index 0000000..ae27d33 --- /dev/null +++ b/resources/views/partials/customer/menu.blade.php @@ -0,0 +1,12 @@ +@stack('menu_start') + + + +@stack('menu_end') \ No newline at end of file diff --git a/resources/views/partials/customer/pagination.blade.php b/resources/views/partials/customer/pagination.blade.php new file mode 100755 index 0000000..c229e97 --- /dev/null +++ b/resources/views/partials/customer/pagination.blade.php @@ -0,0 +1,16 @@ +@stack('pagination_start') + +@if ($items->firstItem()) +
    + {{ trans('pagination.showing', ['first' => $items->firstItem(), 'last' => $items->lastItem(), 'total' => $items->total(), 'type' => strtolower(trans_choice('general.' . $type, 2))]) }} +
    +
    + {!! $items->appends(request()->except('page'))->links() !!} +
    +@else +
    + {{ trans('general.no_records') }} +
    +@endif + +@stack('pagination_end') diff --git a/resources/views/partials/form/checkbox_group.blade.php b/resources/views/partials/form/checkbox_group.blade.php new file mode 100755 index 0000000..eef1c6b --- /dev/null +++ b/resources/views/partials/form/checkbox_group.blade.php @@ -0,0 +1,14 @@ +@stack($name . '_input_start') + +
    + {!! Form::label($name, $text, ['class' => 'control-label']) !!} +
    + @foreach($items as $item) +
    + {{ Form::checkbox($name . '[]', $item->$id) }}   {{ $item->$value }} +
    + @endforeach + {!! $errors->first($name, '

    :message

    ') !!} +
    + +@stack($name . '_input_end') diff --git a/resources/views/partials/form/delete_button.blade.php b/resources/views/partials/form/delete_button.blade.php new file mode 100755 index 0000000..46b03f8 --- /dev/null +++ b/resources/views/partials/form/delete_button.blade.php @@ -0,0 +1,18 @@ +@php +$page = explode('/', $url)[1]; +$text = $text ? $text : $page; +@endphp + +{!! Form::open([ + 'id' => str_singular($page) . '-' . $item->$id, + 'method' => 'DELETE', + 'url' => [$url, $item->$id], + 'style' => 'display:inline' +]) !!} +{!! Form::button(' ' . trans('general.delete'), array( + 'type' => 'button', + 'class' => 'btn btn-danger btn-xs', + 'title' => trans('general.delete'), + 'onclick' => 'confirmDelete("' . '#' . str_singular($page) . '-' . $item->$id . '", "' . trans_choice('general.' . $text, 2) . '", "' . trans('general.delete_confirm', ['name' => '' . $item->$value . '', 'type' => mb_strtolower(trans_choice('general.' . $text, 1))]) . '", "' . trans('general.cancel') . '", "' . trans('general.delete') . '")' +)) !!} +{!! Form::close() !!} diff --git a/resources/views/partials/form/delete_link.blade.php b/resources/views/partials/form/delete_link.blade.php new file mode 100755 index 0000000..d08cb85 --- /dev/null +++ b/resources/views/partials/form/delete_link.blade.php @@ -0,0 +1,20 @@ +@php +$page = explode('/', $url)[1]; +$text = $text ? $text : $page; + +$name = addslashes($item->$value); +@endphp + +{!! Form::open([ + 'id' => str_singular($page) . '-' . $item->$id, + 'method' => 'DELETE', + 'url' => [$url, $item->$id], + 'style' => 'display:inline' +]) !!} +{!! Form::button(trans('general.delete'), array( + 'type' => 'button', + 'class' => 'delete-link', + 'title' => trans('general.delete'), + 'onclick' => 'confirmDelete("' . '#' . str_singular($page) . '-' . $item->$id . '", "' . trans_choice('general.' . $text, 2) . '", "' . trans('general.delete_confirm', ['name' => '' . $name . '', 'type' => mb_strtolower(trans_choice('general.' . $text, 1))]) . '", "' . trans('general.cancel') . '", "' . trans('general.delete') . '")' +)) !!} +{!! Form::close() !!} diff --git a/resources/views/partials/form/email_group.blade.php b/resources/views/partials/form/email_group.blade.php new file mode 100755 index 0000000..a97077a --- /dev/null +++ b/resources/views/partials/form/email_group.blade.php @@ -0,0 +1,12 @@ +@stack($name . '_input_start') + +
    + {!! Form::label($name, $text, ['class' => 'control-label']) !!} +
    +
    + {!! Form::email($name, $value, array_merge(['class' => 'form-control', 'placeholder' => trans('general.form.enter', ['field' => $text])], $attributes)) !!} +
    + {!! $errors->first($name, '

    :message

    ') !!} +
    + +@stack($name . '_input_end') diff --git a/resources/views/partials/form/file_group.blade.php b/resources/views/partials/form/file_group.blade.php new file mode 100755 index 0000000..7dcdb58 --- /dev/null +++ b/resources/views/partials/form/file_group.blade.php @@ -0,0 +1,9 @@ +@stack($name . '_input_start') + +
    + {!! Form::label($name, $text, ['class' => 'control-label']) !!} + {!! Form::file($name, array_merge(['class' => 'form-control'], $attributes)) !!} + {!! $errors->first($name, '

    :message

    ') !!} +
    + +@stack($name . '_input_end') diff --git a/resources/views/partials/form/number_group.blade.php b/resources/views/partials/form/number_group.blade.php new file mode 100755 index 0000000..0b7922d --- /dev/null +++ b/resources/views/partials/form/number_group.blade.php @@ -0,0 +1,12 @@ +@stack($name . '_input_start') + +
    + {!! Form::label($name, $text, ['class' => 'control-label']) !!} +
    +
    + {!! Form::number($name, $value, array_merge(['class' => 'form-control', 'placeholder' => trans('general.form.enter', ['field' => $text])], $attributes)) !!} +
    + {!! $errors->first($name, '

    :message

    ') !!} +
    + +@stack($name . '_input_end') diff --git a/resources/views/partials/form/password_group.blade.php b/resources/views/partials/form/password_group.blade.php new file mode 100755 index 0000000..a14c944 --- /dev/null +++ b/resources/views/partials/form/password_group.blade.php @@ -0,0 +1,12 @@ +@stack($name . '_input_start') + +
    + {!! Form::label($name, $text, ['class' => 'control-label']) !!} +
    +
    + {!! Form::password($name, array_merge(['class' => 'form-control', 'placeholder' => trans('general.form.enter', ['field' => $text])], $attributes)) !!} +
    + {!! $errors->first($name, '

    :message

    ') !!} +
    + +@stack($name . '_input_end') diff --git a/resources/views/partials/form/radio_group.blade.php b/resources/views/partials/form/radio_group.blade.php new file mode 100755 index 0000000..4424998 --- /dev/null +++ b/resources/views/partials/form/radio_group.blade.php @@ -0,0 +1,20 @@ +@stack($name . '_input_start') + +
    + {!! Form::label($name, $text, ['class' => 'control-label']) !!} +
    +
    + + +
    +
    + {!! $errors->first($name, '

    :message

    ') !!} +
    + +@stack($name . '_input_end') diff --git a/resources/views/partials/form/recurring.blade.php b/resources/views/partials/form/recurring.blade.php new file mode 100755 index 0000000..ba37d81 --- /dev/null +++ b/resources/views/partials/form/recurring.blade.php @@ -0,0 +1,43 @@ +@php + if (($page == 'create') || !$model->recurring()->count()) { + $frequency = 'no'; + $interval = 1; + $custom_frequency = 'monthly'; + $count = 0; + } else { + $r = $model->recurring; + $frequency = ($r->interval != 1) ? 'custom' : $r->frequency; + $interval = $r->interval; + $custom_frequency = $r->frequency; + $count = $r->count; + } +@endphp + +
    +
    + {!! Form::label('recurring_frequency', trans('recurring.recurring'), ['class' => 'control-label']) !!} +
    +
    + {!! Form::select('recurring_frequency', $recurring_frequencies, $frequency, ['class' => 'form-control']) !!} +
    + {!! $errors->first('recurring_frequency', '

    :message

    ') !!} +
    + + + + + + +
    diff --git a/resources/views/partials/form/save_buttons.blade.php b/resources/views/partials/form/save_buttons.blade.php new file mode 100755 index 0000000..fa0e4d2 --- /dev/null +++ b/resources/views/partials/form/save_buttons.blade.php @@ -0,0 +1,10 @@ +@stack('save_buttons_start') + +
    +
    + {!! Form::button('  ' . trans('general.save'), ['type' => 'submit', 'class' => 'btn btn-success']) !!} +  {{ trans('general.cancel') }} +
    +
    + +@stack('save_buttons_end') diff --git a/resources/views/partials/form/select_group.blade.php b/resources/views/partials/form/select_group.blade.php new file mode 100755 index 0000000..e3985f7 --- /dev/null +++ b/resources/views/partials/form/select_group.blade.php @@ -0,0 +1,12 @@ +@stack($name . '_input_start') + +
    + {!! Form::label($name, $text, ['class' => 'control-label']) !!} +
    +
    + {!! Form::select($name, $values, $selected, array_merge(['class' => 'form-control', 'placeholder' => trans('general.form.select.field', ['field' => $text])], $attributes)) !!} +
    + {!! $errors->first($name, '

    :message

    ') !!} +
    + +@stack($name . '_input_end') diff --git a/resources/views/partials/form/text_group.blade.php b/resources/views/partials/form/text_group.blade.php new file mode 100755 index 0000000..10c284b --- /dev/null +++ b/resources/views/partials/form/text_group.blade.php @@ -0,0 +1,12 @@ +@stack($name . '_input_start') + +
    + {!! Form::label($name, $text, ['class' => 'control-label']) !!} +
    +
    + {!! Form::text($name, $value, array_merge(['class' => 'form-control', 'placeholder' => trans('general.form.enter', ['field' => $text])], $attributes)) !!} +
    + {!! $errors->first($name, '

    :message

    ') !!} +
    + +@stack($name . '_input_end') diff --git a/resources/views/partials/form/textarea_group.blade.php b/resources/views/partials/form/textarea_group.blade.php new file mode 100755 index 0000000..399972d --- /dev/null +++ b/resources/views/partials/form/textarea_group.blade.php @@ -0,0 +1,9 @@ +@stack($name . '_input_start') + +
    + {!! Form::label($name, $text, ['class' => 'control-label']) !!} + {!! Form::textarea($name, $value, array_merge(['class' => 'form-control', 'placeholder' => trans('general.form.enter', ['field' => $text])], $attributes)) !!} + {!! $errors->first($name, '

    :message

    ') !!} +
    + +@stack($name . '_input_end') diff --git a/resources/views/partials/install/head.blade.php b/resources/views/partials/install/head.blade.php new file mode 100755 index 0000000..70613b8 --- /dev/null +++ b/resources/views/partials/install/head.blade.php @@ -0,0 +1,54 @@ + + @stack('head_start') + + + + + + + Akaunting + + + + + + + + + + + + + + + + + + @stack('css') + + @stack('stylesheet') + + + + + + + + + + + + + + + + + @stack('js') + + @stack('scripts') + + @stack('head_end') + diff --git a/resources/views/partials/invoice/head.blade.php b/resources/views/partials/invoice/head.blade.php new file mode 100755 index 0000000..e248275 --- /dev/null +++ b/resources/views/partials/invoice/head.blade.php @@ -0,0 +1,59 @@ + + @stack('head_start') + + + + + + + + @yield('title') - @setting('general.company_name') + + + + + + + + + + + + + + + + + @stack('css') + + @stack('stylesheet') + + + + + + + + + + + + + + + + + @stack('js') + + @stack('scripts') + + @stack('head_end') + diff --git a/resources/views/partials/modules/bar.blade.php b/resources/views/partials/modules/bar.blade.php new file mode 100755 index 0000000..a8c6ece --- /dev/null +++ b/resources/views/partials/modules/bar.blade.php @@ -0,0 +1,23 @@ +
    +
    +
    + +
    + {!! Form::select('category', $categories, request('category'), ['class' => 'form-control input-sm', 'style' => 'display:inline;width:inherit;']) !!} + {{ trans('modules.top_paid') }} + {{ trans('modules.new') }} + {{ trans('modules.top_free') }} +
    + +
    +
    + {!! Form::open(['url' => 'apps/search', 'role' => 'form', 'method' => 'GET']) !!} + + + {!! Form::close() !!} +
    +
    + +
    +
    +
    \ No newline at end of file diff --git a/resources/views/partials/modules/head.blade.php b/resources/views/partials/modules/head.blade.php new file mode 100755 index 0000000..737733d --- /dev/null +++ b/resources/views/partials/modules/head.blade.php @@ -0,0 +1,89 @@ + + @stack('head_start') + + + + + + + @yield('title') - @setting('general.company_name') + + + + + + + + + + + @if (setting('general.admin_theme', 'skin-green-light') == 'skin-green-light') + + @else + + + @endif + + + + + + + + + + @stack('css') + + @stack('stylesheet') + + + + + + + + + + + + + + + + + + + + + + + + + + @stack('js') + + @stack('scripts') + + @stack('head_end') + diff --git a/resources/views/partials/modules/item.blade.php b/resources/views/partials/modules/item.blade.php new file mode 100755 index 0000000..c54a248 --- /dev/null +++ b/resources/views/partials/modules/item.blade.php @@ -0,0 +1,59 @@ +
    +
    +
    +

    {{ $module->name }}

    + + @if (isset($installed[$module->slug])) + @php $color = 'bg-green'; @endphp + + @if (!$installed[$module->slug]) + @php $color = 'bg-yellow'; @endphp + @endif + + {{ trans('modules.badge.installed') }} + + @endif + +
    + + + + + + + +
    + +
    \ No newline at end of file diff --git a/resources/views/reports/expense_summary/body.blade.php b/resources/views/reports/expense_summary/body.blade.php new file mode 100755 index 0000000..ba036df --- /dev/null +++ b/resources/views/reports/expense_summary/body.blade.php @@ -0,0 +1,48 @@ +
    + {!! $chart->render() !!} + +
    + +
    + + + + + @foreach($dates as $date) + + @endforeach + + + + @if ($expenses) + @foreach($expenses as $category_id => $category) + + + @foreach($category as $item) + + @endforeach + + @endforeach + @else + + + + @endif + + + + + @foreach($totals as $total) + + @endforeach + + +
    {{ trans_choice('general.categories', 1) }}{{ $date }}
    {{ $categories[$category_id] }}@money($item['amount'], $item['currency_code'], true)
    +
    {{ trans('general.no_records') }}
    +
    {{ trans_choice('general.totals', 1) }}@money($total['amount'], $total['currency_code'], true)
    +
    +
    + +@push('js') +{!! Charts::assets() !!} +@endpush \ No newline at end of file diff --git a/resources/views/reports/expense_summary/index.blade.php b/resources/views/reports/expense_summary/index.blade.php new file mode 100755 index 0000000..1f6e0e0 --- /dev/null +++ b/resources/views/reports/expense_summary/index.blade.php @@ -0,0 +1,30 @@ +@extends('layouts.admin') + +@section('title', trans('reports.summary.expense')) + +@section('new_button') +  {{ trans('general.print') }} +@endsection + +@section('content') + +
    +
    + + {!! Form::open(['url' => 'reports/expense-summary', 'role' => 'form', 'method' => 'GET']) !!} +
    + @stack('year_input_start') + {!! Form::select('year', $years, request('year', $this_year), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} + @stack('year_input_end') +
    + {!! Form::close() !!} +
    + + @include('reports.expense_summary.body') +
    + +@endsection diff --git a/resources/views/reports/expense_summary/print.blade.php b/resources/views/reports/expense_summary/print.blade.php new file mode 100755 index 0000000..e1d4f96 --- /dev/null +++ b/resources/views/reports/expense_summary/print.blade.php @@ -0,0 +1,7 @@ +@extends('layouts.print') + +@section('title', trans('reports.summary.expense')) + +@section('content') + @include('reports.expense_summary.body') +@endsection \ No newline at end of file diff --git a/resources/views/reports/income_expense_summary/body.blade.php b/resources/views/reports/income_expense_summary/body.blade.php new file mode 100755 index 0000000..a5f54f4 --- /dev/null +++ b/resources/views/reports/income_expense_summary/body.blade.php @@ -0,0 +1,66 @@ +
    + {!! $chart->render() !!} + +
    + +
    + + + + + @foreach($dates as $date) + + @endforeach + + + + @if ($compares) + @foreach($compares as $type => $categories) + @foreach($categories as $category_id => $category) + + @if($type == 'income') + + @else + + @endif + @foreach($category as $item) + @if($type == 'income') + + @else + + @endif + @endforeach + + @endforeach + @endforeach + @else + + + + @endif + + + + + @foreach($totals as $total) + + @endforeach + + +
    {{ trans_choice('general.categories', 1) }}{{ $date }}
    {{ $income_categories[$category_id] }}{{ $expense_categories[$category_id] }}@money($item['amount'], $item['currency_code'], true)@money(-$item['amount'], $item['currency_code'], true)
    +
    {{ trans('general.no_records') }}
    +
    {{ trans_choice('general.totals', 1) }} + @if($total['amount'] == 0) + @money($total['amount'], $total['currency_code'], true) + @elseif($total['amount'] > 0) + @money($total['amount'], $total['currency_code'], true) + @else + @money($total['amount'], $total['currency_code'], true) + @endif +
    +
    +
    + +@push('js') +{!! Charts::assets() !!} +@endpush diff --git a/resources/views/reports/income_expense_summary/index.blade.php b/resources/views/reports/income_expense_summary/index.blade.php new file mode 100755 index 0000000..920ff3d --- /dev/null +++ b/resources/views/reports/income_expense_summary/index.blade.php @@ -0,0 +1,30 @@ +@extends('layouts.admin') + +@section('title', trans('reports.summary.income_expense')) + +@section('new_button') +  {{ trans('general.print') }} +@endsection + +@section('content') + +
    +
    + + {!! Form::open(['url' => 'reports/income-expense-summary', 'role' => 'form', 'method' => 'GET']) !!} +
    + @stack('year_input_start') + {!! Form::select('year', $years, request('year', $this_year), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} + @stack('year_input_end') +
    + {!! Form::close() !!} +
    + + @include('reports.income_expense_summary.body') +
    + +@endsection diff --git a/resources/views/reports/income_expense_summary/print.blade.php b/resources/views/reports/income_expense_summary/print.blade.php new file mode 100755 index 0000000..fa13bd1 --- /dev/null +++ b/resources/views/reports/income_expense_summary/print.blade.php @@ -0,0 +1,7 @@ +@extends('layouts.print') + +@section('title', trans('reports.summary.income_expense')) + +@section('content') + @include('reports.income_expense_summary.body') +@endsection \ No newline at end of file diff --git a/resources/views/reports/income_summary/body.blade.php b/resources/views/reports/income_summary/body.blade.php new file mode 100755 index 0000000..c42f7c3 --- /dev/null +++ b/resources/views/reports/income_summary/body.blade.php @@ -0,0 +1,48 @@ +
    + {!! $chart->render() !!} + +
    + +
    + + + + + @foreach($dates as $date) + + @endforeach + + + + @if ($incomes) + @foreach($incomes as $category_id => $category) + + + @foreach($category as $item) + + @endforeach + + @endforeach + @else + + + + @endif + + + + + @foreach($totals as $total) + + @endforeach + + +
    {{ trans_choice('general.categories', 1) }}{{ $date }}
    {{ $categories[$category_id] }}@money($item['amount'], $item['currency_code'], true)
    +
    {{ trans('general.no_records') }}
    +
    {{ trans_choice('general.totals', 1) }}@money($total['amount'], $total['currency_code'], true)
    +
    +
    + +@push('js') +{!! Charts::assets() !!} +@endpush diff --git a/resources/views/reports/income_summary/index.blade.php b/resources/views/reports/income_summary/index.blade.php new file mode 100755 index 0000000..c3f0d3b --- /dev/null +++ b/resources/views/reports/income_summary/index.blade.php @@ -0,0 +1,30 @@ +@extends('layouts.admin') + +@section('title', trans('reports.summary.income')) + +@section('new_button') +  {{ trans('general.print') }} +@endsection + +@section('content') + +
    +
    + + {!! Form::open(['url' => 'reports/income-summary', 'role' => 'form', 'method' => 'GET']) !!} +
    + @stack('year_input_start') + {!! Form::select('year', $years, request('year', $this_year), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} + @stack('year_input_end') +
    + {!! Form::close() !!} +
    + + @include('reports.income_summary.body') +
    + +@endsection diff --git a/resources/views/reports/income_summary/print.blade.php b/resources/views/reports/income_summary/print.blade.php new file mode 100755 index 0000000..14f4083 --- /dev/null +++ b/resources/views/reports/income_summary/print.blade.php @@ -0,0 +1,7 @@ +@extends('layouts.print') + +@section('title', trans('reports.summary.income')) + +@section('content') + @include('reports.income_summary.body') +@endsection \ No newline at end of file diff --git a/resources/views/reports/profit_loss/body.blade.php b/resources/views/reports/profit_loss/body.blade.php new file mode 100755 index 0000000..c3682ec --- /dev/null +++ b/resources/views/reports/profit_loss/body.blade.php @@ -0,0 +1,77 @@ +
    +
    + + + + + @foreach($dates as $date) + + @endforeach + + + +
     {{ trans('reports.quarter.' . $date) }}{{ trans_choice('general.totals', 1) }}
    + + + + + + + + @foreach($compares['income'] as $category_id => $category) + + + @foreach($category as $i => $item) + @php $gross['income'][$i] += $item['amount']; @endphp + + @endforeach + + @endforeach + + + + + @foreach($gross['income'] as $item) + + @endforeach + + +
    {{ trans_choice('general.incomes', 1) }}
    {{ $income_categories[$category_id] }}@money($item['amount'], $item['currency_code'], true)
    {{ trans('reports.gross_profit') }}@money($item, setting('general.default_currency'), true)
    + + + + + + + + @foreach($compares['expense'] as $category_id => $category) + + + @foreach($category as $i => $item) + @php $gross['expense'][$i] += $item['amount']; @endphp + + @endforeach + + @endforeach + + + + + @foreach($gross['expense'] as $item) + + @endforeach + + +
    {{ trans_choice('general.expenses', 2) }}
    {{ $expense_categories[$category_id] }}@money($item['amount'], $item['currency_code'], true)
    {{ trans('reports.total_expenses') }}@money($item, setting('general.default_currency'), true)
    + + + + + @foreach($totals as $total) + + @endforeach + + +
    {{ trans('reports.net_profit') }}@money($total['amount'], $total['currency_code'], true)
    +
    +
    diff --git a/resources/views/reports/profit_loss/index.blade.php b/resources/views/reports/profit_loss/index.blade.php new file mode 100755 index 0000000..2f55f2f --- /dev/null +++ b/resources/views/reports/profit_loss/index.blade.php @@ -0,0 +1,30 @@ +@extends('layouts.admin') + +@section('title', trans('reports.profit_loss')) + +@section('new_button') +  {{ trans('general.print') }} +@endsection + +@section('content') + +
    +
    + + {!! Form::open(['url' => 'reports/profit-loss', 'role' => 'form', 'method' => 'GET']) !!} +
    + @stack('year_input_start') + {!! Form::select('year', $years, request('year', $this_year), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} + @stack('year_input_end') +
    + {!! Form::close() !!} +
    + + @include('reports.profit_loss.body') +
    + +@endsection diff --git a/resources/views/reports/profit_loss/print.blade.php b/resources/views/reports/profit_loss/print.blade.php new file mode 100755 index 0000000..6c3154f --- /dev/null +++ b/resources/views/reports/profit_loss/print.blade.php @@ -0,0 +1,15 @@ +@extends('layouts.print') + +@section('title', trans('reports.profit_loss')) + +@section('content') +
    +

    {{ trans('reports.profit_loss') }}

    +
    + {{ setting('general.company_name') }} +
    + {{ Date::parse(request('year') . '-1-1')->format($date_format) }} - {{ Date::parse(request('year') . '-12-31')->format($date_format) }} +
    +
    + @include('reports.profit_loss.body') +@endsection \ No newline at end of file diff --git a/resources/views/reports/tax_summary/body.blade.php b/resources/views/reports/tax_summary/body.blade.php new file mode 100755 index 0000000..59695a1 --- /dev/null +++ b/resources/views/reports/tax_summary/body.blade.php @@ -0,0 +1,57 @@ +
    +
    + + + + + @foreach($dates as $date) + + @endforeach + + +
     {{ $date }}
    + @if ($taxes) + @foreach($taxes as $tax_name) + + + + + + + + + + @foreach($incomes[$tax_name] as $tax_date) + + @endforeach + + + + @foreach($expenses[$tax_name] as $tax_date) + + @endforeach + + + + + + @foreach($totals[$tax_name] as $tax_date) + + @endforeach + + +
    {{ $tax_name }}
    {{ trans_choice('general.incomes', 2) }}@money($tax_date['amount'], $tax_date['currency_code'], true)
    {{ trans_choice('general.expenses', 2) }}@money($tax_date['amount'], $tax_date['currency_code'], true)
    {{ trans('reports.net') }}@money($tax_date['amount'], $tax_date['currency_code'], true)
    + @endforeach + @else + + + + + + +
    +
    {{ trans('general.no_records') }}
    +
    + @endif +
    +
    \ No newline at end of file diff --git a/resources/views/reports/tax_summary/index.blade.php b/resources/views/reports/tax_summary/index.blade.php new file mode 100755 index 0000000..550a066 --- /dev/null +++ b/resources/views/reports/tax_summary/index.blade.php @@ -0,0 +1,30 @@ +@extends('layouts.admin') + +@section('title', trans('reports.summary.tax')) + +@section('new_button') +  {{ trans('general.print') }} +@endsection + +@section('content') + +
    +
    + + {!! Form::open(['url' => 'reports/tax-summary', 'role' => 'form', 'method' => 'GET']) !!} +
    + @stack('year_input_start') + {!! Form::select('year', $years, request('year', $this_year), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} + @stack('year_input_end') +
    + {!! Form::close() !!} +
    + + @include('reports.tax_summary.body') +
    + +@endsection diff --git a/resources/views/reports/tax_summary/print.blade.php b/resources/views/reports/tax_summary/print.blade.php new file mode 100755 index 0000000..4fc18a5 --- /dev/null +++ b/resources/views/reports/tax_summary/print.blade.php @@ -0,0 +1,15 @@ +@extends('layouts.print') + +@section('title', trans('reports.summary.tax')) + +@section('content') +
    +

    {{ trans('reports.summary.tax') }}

    +
    + {{ setting('general.company_name') }} +
    + {{ Date::parse(request('year') . '-1-1')->format($date_format) }} - {{ Date::parse(request('year') . '-12-31')->format($date_format) }} +
    +
    + @include('reports.tax_summary.body') +@endsection \ No newline at end of file diff --git a/resources/views/settings/categories/create.blade.php b/resources/views/settings/categories/create.blade.php new file mode 100755 index 0000000..4036f24 --- /dev/null +++ b/resources/views/settings/categories/create.blade.php @@ -0,0 +1,64 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.new', ['type' => trans_choice('general.categories', 1)])) + +@section('content') + +
    + {!! Form::open(['url' => 'settings/categories', 'role' => 'form']) !!} + +
    + {{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} + + {{ Form::selectGroup('type', trans_choice('general.types', 1), 'bars', $types, config('general.types')) }} + + @stack('color_input_start') +
    + {!! Form::label('color', trans('general.color'), ['class' => 'control-label']) !!} +
    +
    + {!! Form::text('color', '#00a65a', ['id' => 'color', 'class' => 'form-control', 'required' => 'required']) !!} +
    + {!! $errors->first('color', '

    :message

    ') !!} +
    + @stack('color_input_end') + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} +
    + + + + + + {!! Form::close() !!} +
    +@endsection + +@push('js') + +@endpush + +@push('css') + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/settings/categories/edit.blade.php b/resources/views/settings/categories/edit.blade.php new file mode 100755 index 0000000..e11f75f --- /dev/null +++ b/resources/views/settings/categories/edit.blade.php @@ -0,0 +1,71 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.edit', ['type' => trans_choice('general.categories', 1)])) + +@section('content') + +
    + {!! Form::model($category, [ + 'method' => 'PATCH', + 'url' => ['settings/categories', $category->id], + 'role' => 'form' + ]) !!} + +
    + {{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} + + @if ($type_disabled) + {{ Form::selectGroup('type', trans_choice('general.types', 1), 'bars', $types, null, ['required' => 'required', 'disabled' => 'disabled']) }} + + @else + {{ Form::selectGroup('type', trans_choice('general.types', 1), 'bars', $types) }} + @endif + + @stack('color_input_start') +
    + {!! Form::label('color', trans('general.color'), ['class' => 'control-label']) !!} +
    +
    + {!! Form::text('color', null, ['id' => 'color', 'class' => 'form-control', 'required' => 'required']) !!} +
    + {!! $errors->first('color', '

    :message

    ') !!} +
    + @stack('color_input_end') + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} +
    + + + @permission('update-settings-categories') + + + @endpermission + + {!! Form::close() !!} +
    +@endsection + +@push('js') + +@endpush + +@push('css') + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/settings/categories/index.blade.php b/resources/views/settings/categories/index.blade.php new file mode 100755 index 0000000..cba5334 --- /dev/null +++ b/resources/views/settings/categories/index.blade.php @@ -0,0 +1,90 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.categories', 2)) + +@permission('create-settings-categories') +@section('new_button') +  {{ trans('general.add_new') }} +@endsection +@endpermission + +@section('content') + +
    +
    + {!! Form::open(['url' => 'settings/categories', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::select('type', $types, request('type'), ['class' => 'form-control input-filter input-sm']) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    + + +
    +
    + + + + + + + + + + + + @foreach($categories as $item) + + + + + + + + @endforeach + +
    @sortablelink('name', trans('general.name'))@sortablelink('type', trans_choice('general.types', 1)){{ trans('general.actions') }}
    {{ $item->name }}{{ $types[$item->type] }} +
    + + +
    +
    +
    +
    + + + + +
    + +@endsection diff --git a/resources/views/settings/currencies/create.blade.php b/resources/views/settings/currencies/create.blade.php new file mode 100755 index 0000000..e52e29c --- /dev/null +++ b/resources/views/settings/currencies/create.blade.php @@ -0,0 +1,76 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.new', ['type' => trans_choice('general.currencies', 1)])) + +@section('content') + +
    + {!! Form::open(['url' => 'settings/currencies', 'role' => 'form']) !!} + +
    + {{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} + + {{ Form::selectGroup('code', trans('currencies.code'), 'code', $codes) }} + + {{ Form::textGroup('rate', trans('currencies.rate'), 'money') }} + + {{ Form::numberGroup('precision', trans('currencies.precision'), 'bullseye') }} + + {{ Form::textGroup('symbol', trans('currencies.symbol.symbol'), 'font') }} + + {{ Form::selectGroup('symbol_first', trans('currencies.symbol.position'), 'text-width', ['1' => trans('currencies.symbol.before'), '0' => trans('currencies.symbol.after')]) }} + + {{ Form::textGroup('decimal_mark', trans('currencies.decimal_mark'), 'columns') }} + + {{ Form::textGroup('thousands_separator', trans('currencies.thousands_separator'), 'columns', []) }} + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} + + {{ Form::radioGroup('default_currency', trans('currencies.default')) }} +
    + + + + + + {!! Form::close() !!} +
    +@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/settings/currencies/edit.blade.php b/resources/views/settings/currencies/edit.blade.php new file mode 100755 index 0000000..c67e2d2 --- /dev/null +++ b/resources/views/settings/currencies/edit.blade.php @@ -0,0 +1,78 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.edit', ['type' => trans_choice('general.currencies', 1)])) + +@section('content') + +
    + {!! Form::model($currency, [ + 'method' => 'PATCH', + 'url' => ['settings/currencies', $currency->id], + 'role' => 'form' + ]) !!} + +
    + {{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} + + {{ Form::selectGroup('code', trans('currencies.code'), 'code', $codes) }} + + {{ Form::textGroup('rate', trans('currencies.rate'), 'money') }} + + {{ Form::numberGroup('precision', trans('currencies.precision'), 'bullseye') }} + + {{ Form::textGroup('symbol', trans('currencies.symbol.symbol'), 'font') }} + + {{ Form::selectGroup('symbol_first', trans('currencies.symbol.position'), 'text-width', ['1' => trans('currencies.symbol.before'), '0' => trans('currencies.symbol.after')]) }} + + {{ Form::textGroup('decimal_mark', trans('currencies.decimal_mark'), 'columns') }} + + {{ Form::textGroup('thousands_separator', trans('currencies.thousands_separator'), 'columns', []) }} + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} + + {{ Form::radioGroup('default_currency', trans('currencies.default')) }} +
    + + + @permission('update-settings-currencies') + + + @endpermission + + {!! Form::close() !!} +
    +@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/settings/currencies/index.blade.php b/resources/views/settings/currencies/index.blade.php new file mode 100755 index 0000000..b012d52 --- /dev/null +++ b/resources/views/settings/currencies/index.blade.php @@ -0,0 +1,85 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.currencies', 2)) + +@permission('create-settings-currencies') +@section('new_button') +  {{ trans('general.add_new') }} +@endsection +@endpermission + +@section('content') + +
    +
    + {!! Form::open(['url' => 'settings/currencies', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    +
    +
    + + + + + + + + + + + + @foreach($currencies as $item) + + + + + + + + @endforeach + +
    @sortablelink('name', trans('general.name'))@sortablelink('rate', trans('currencies.rate')){{ trans('general.actions') }}
    {{ $item->name }}{{ $item->rate }} +
    + + +
    +
    +
    +
    + + + + +
    + +@endsection diff --git a/resources/views/settings/modules/edit.blade.php b/resources/views/settings/modules/edit.blade.php new file mode 100755 index 0000000..98806ef --- /dev/null +++ b/resources/views/settings/modules/edit.blade.php @@ -0,0 +1,50 @@ +@extends('layouts.admin') + +@section('title', $module->getName()) + +@section('content') + +
    + {!! Form::model($setting, [ + 'method' => 'PATCH', + 'url' => ['settings/apps/' . $module->getAlias()], + 'files' => true, + 'role' => 'form' + ]) !!} + +
    + @foreach($module->get('settings') as $field) + @php $type = $field['type']; @endphp + + @if (($type == 'textGroup') || ($type == 'emailGroup') || ($type == 'passwordGroup')) + {{ Form::$type($field['name'], trans($field['title']), $field['icon'], $field['attributes']) }} + @elseif ($type == 'textareaGroup') + {{ Form::$type($field['name'], trans($field['title'])) }} + @elseif ($type == 'selectGroup') + {{ Form::$type($field['name'], trans($field['title']), $field['icon'], $field['values'], $field['selected'], $field['attributes']) }} + @elseif ($type == 'radioGroup') + {{ Form::$type($field['name'], trans($field['title']), trans($field['enable']), trans($field['disable']), $field['attributes']) }} + @elseif ($type == 'checkboxGroup') + {{ Form::$type($field['name'], trans($field['title']), $field['items'], $field['value'], $field['id'], $field['attributes']) }} + @elseif ($type == 'fileGroup') + {{ Form::$type($field['name'], trans($field['title']), $field['attributes']) }} + @endif + @endforeach +
    + + + + + + {!! Form::close() !!} +
    +@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/settings/settings/edit.blade.php b/resources/views/settings/settings/edit.blade.php new file mode 100755 index 0000000..d75a5e8 --- /dev/null +++ b/resources/views/settings/settings/edit.blade.php @@ -0,0 +1,308 @@ +@extends('layouts.admin') + +@section('title', trans('general.general')) + +@section('content') + +
    + {!! Form::model($setting, [ + 'method' => 'PATCH', + 'url' => ['settings/settings'], + 'class' => 'setting-form', + 'files' => true, + 'role' => 'form' + ]) !!} + +
    + +
    + + {!! Form::close() !!} +
    +@endsection + +@push('js') + +@endpush + +@push('css') + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/settings/taxes/create.blade.php b/resources/views/settings/taxes/create.blade.php new file mode 100755 index 0000000..4405c7c --- /dev/null +++ b/resources/views/settings/taxes/create.blade.php @@ -0,0 +1,39 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.new', ['type' => trans_choice('general.tax_rates', 1)])) + +@section('content') + +
    + {!! Form::open(['url' => 'settings/taxes', 'role' => 'form']) !!} + +
    + {{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} + + {{ Form::textGroup('rate', trans('taxes.rate'), 'percent') }} + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} +
    + + + + + + {!! Form::close() !!} +
    +@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/settings/taxes/edit.blade.php b/resources/views/settings/taxes/edit.blade.php new file mode 100755 index 0000000..eaad372 --- /dev/null +++ b/resources/views/settings/taxes/edit.blade.php @@ -0,0 +1,39 @@ +@extends('layouts.admin') + +@section('title', trans('general.title.edit', ['type' => trans_choice('general.tax_rates', 1)])) + +@section('content') + +
    + {!! Form::model($tax, [ + 'method' => 'PATCH', + 'url' => ['settings/taxes', $tax->id], + 'role' => 'form' + ]) !!} + +
    + {{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} + + {{ Form::textGroup('rate', trans('taxes.rate'), 'percent') }} + + {{ Form::radioGroup('enabled', trans('general.enabled')) }} +
    + + + @permission('update-settings-taxes') + + + @endpermission + + {!! Form::close() !!} +
    +@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/settings/taxes/index.blade.php b/resources/views/settings/taxes/index.blade.php new file mode 100755 index 0000000..1861ff2 --- /dev/null +++ b/resources/views/settings/taxes/index.blade.php @@ -0,0 +1,85 @@ +@extends('layouts.admin') + +@section('title', trans_choice('general.tax_rates', 2)) + +@permission('create-settings-taxes') +@section('new_button') +  {{ trans('general.add_new') }} +@endsection +@endpermission + +@section('content') + +
    +
    + {!! Form::open(['url' => 'settings/taxes', 'role' => 'form', 'method' => 'GET']) !!} +
    + + {!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} + {!! Form::button('  ' . trans('general.filter'), ['type' => 'submit', 'class' => 'btn btn-sm btn-default btn-filter']) !!} +
    +
    + + {!! Form::select('limit', $limits, request('limit', setting('general.list_limit', '25')), ['class' => 'form-control input-filter input-sm', 'onchange' => 'this.form.submit()']) !!} +
    + {!! Form::close() !!} +
    + + +
    +
    + + + + + + + + + + + @foreach($taxes as $item) + + + + + + + @endforeach + +
    @sortablelink('name', trans('general.name'))@sortablelink('rate', trans('taxes.rate_percent')){{ trans('general.actions') }}
    {{ $item->name }}{{ $item->rate }} +
    + + +
    +
    +
    +
    + + + +
    + + +@endsection diff --git a/resources/views/vendor/consoletvs/charts/chartjs/area.blade.php b/resources/views/vendor/consoletvs/charts/chartjs/area.blade.php new file mode 100755 index 0000000..8f48dc9 --- /dev/null +++ b/resources/views/vendor/consoletvs/charts/chartjs/area.blade.php @@ -0,0 +1,49 @@ +@if(!$model->customId) + @include('charts::_partials.container.canvas2') +@endif + +@include('charts::_partials.helpers.hex2rgb') + + diff --git a/resources/views/vendor/consoletvs/charts/chartjs/bar.blade.php b/resources/views/vendor/consoletvs/charts/chartjs/bar.blade.php new file mode 100755 index 0000000..94ab0fd --- /dev/null +++ b/resources/views/vendor/consoletvs/charts/chartjs/bar.blade.php @@ -0,0 +1,57 @@ +@if(!$model->customId) + @include('charts::_partials.container.canvas2') +@endif + + diff --git a/resources/views/vendor/consoletvs/charts/chartjs/donut.blade.php b/resources/views/vendor/consoletvs/charts/chartjs/donut.blade.php new file mode 100755 index 0000000..e671bb1 --- /dev/null +++ b/resources/views/vendor/consoletvs/charts/chartjs/donut.blade.php @@ -0,0 +1,72 @@ +@if(!$model->customId) + @include('charts::_partials.container.canvas2') +@endif + + diff --git a/resources/views/vendor/consoletvs/charts/chartjs/line.blade.php b/resources/views/vendor/consoletvs/charts/chartjs/line.blade.php new file mode 100755 index 0000000..378a761 --- /dev/null +++ b/resources/views/vendor/consoletvs/charts/chartjs/line.blade.php @@ -0,0 +1,46 @@ +@if(!$model->customId) + @include('charts::_partials.container.canvas2') +@endif + + diff --git a/resources/views/vendor/consoletvs/charts/chartjs/multi/area.blade.php b/resources/views/vendor/consoletvs/charts/chartjs/multi/area.blade.php new file mode 100755 index 0000000..5b3bdcf --- /dev/null +++ b/resources/views/vendor/consoletvs/charts/chartjs/multi/area.blade.php @@ -0,0 +1,56 @@ +@if(!$model->customId) + @include('charts::_partials.container.canvas2') +@endif + +@include('charts::_partials.helpers.hex2rgb') + + diff --git a/resources/views/vendor/consoletvs/charts/chartjs/multi/bar.blade.php b/resources/views/vendor/consoletvs/charts/chartjs/multi/bar.blade.php new file mode 100755 index 0000000..cc109cb --- /dev/null +++ b/resources/views/vendor/consoletvs/charts/chartjs/multi/bar.blade.php @@ -0,0 +1,58 @@ +@if(!$model->customId) + @include('charts::_partials.container.canvas2') +@endif + + diff --git a/resources/views/vendor/consoletvs/charts/chartjs/multi/line.blade.php b/resources/views/vendor/consoletvs/charts/chartjs/multi/line.blade.php new file mode 100755 index 0000000..45874dd --- /dev/null +++ b/resources/views/vendor/consoletvs/charts/chartjs/multi/line.blade.php @@ -0,0 +1,55 @@ +@if(!$model->customId) + @include('charts::_partials.container.canvas2') +@endif + + diff --git a/resources/views/vendor/consoletvs/charts/chartjs/multi/line_print.blade.php b/resources/views/vendor/consoletvs/charts/chartjs/multi/line_print.blade.php new file mode 100755 index 0000000..bd2b2e8 --- /dev/null +++ b/resources/views/vendor/consoletvs/charts/chartjs/multi/line_print.blade.php @@ -0,0 +1,58 @@ +@if(!$model->customId) + @include('charts::_partials.container.canvas2') +@endif + + diff --git a/resources/views/vendor/consoletvs/charts/chartjs/pie.blade.php b/resources/views/vendor/consoletvs/charts/chartjs/pie.blade.php new file mode 100755 index 0000000..c04743a --- /dev/null +++ b/resources/views/vendor/consoletvs/charts/chartjs/pie.blade.php @@ -0,0 +1,47 @@ +@if(!$model->customId) + @include('charts::_partials.container.canvas2') +@endif + + diff --git a/resources/views/vendor/flash/message.blade.php b/resources/views/vendor/flash/message.blade.php new file mode 100755 index 0000000..b822189 --- /dev/null +++ b/resources/views/vendor/flash/message.blade.php @@ -0,0 +1,28 @@ +@foreach ((array) session('flash_notification') as $messages) + @foreach ((array)$messages as $message) + @if ($message['overlay']) + @include('flash::modal', [ + 'modalClass' => 'flash-modal', + 'title' => $message['title'], + 'body' => $message['message'] + ]) + @else +
    + @if ($message['important']) + + @endif + + {!! $message['message'] !!} +
    + @endif + @endforeach +@endforeach + +{{ session()->forget('flash_notification') }} diff --git a/resources/views/vendor/flash/modal.blade.php b/resources/views/vendor/flash/modal.blade.php new file mode 100755 index 0000000..41b821c --- /dev/null +++ b/resources/views/vendor/flash/modal.blade.php @@ -0,0 +1,19 @@ + diff --git a/resources/views/vendor/language/flag.blade.php b/resources/views/vendor/language/flag.blade.php new file mode 100755 index 0000000..1b9a2c4 --- /dev/null +++ b/resources/views/vendor/language/flag.blade.php @@ -0,0 +1 @@ +{{ $name }} \ No newline at end of file diff --git a/resources/views/vendor/language/flags.blade.php b/resources/views/vendor/language/flags.blade.php new file mode 100755 index 0000000..dfdd91c --- /dev/null +++ b/resources/views/vendor/language/flags.blade.php @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/resources/views/vendor/mail/html/button.blade.php b/resources/views/vendor/mail/html/button.blade.php new file mode 100755 index 0000000..c7aae1b --- /dev/null +++ b/resources/views/vendor/mail/html/button.blade.php @@ -0,0 +1,19 @@ + + + + +
    + + + + +
    + + + + +
    + {{ $slot }} +
    +
    +
    diff --git a/resources/views/vendor/mail/html/footer.blade.php b/resources/views/vendor/mail/html/footer.blade.php new file mode 100755 index 0000000..c3f9360 --- /dev/null +++ b/resources/views/vendor/mail/html/footer.blade.php @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/resources/views/vendor/mail/html/header.blade.php b/resources/views/vendor/mail/html/header.blade.php new file mode 100755 index 0000000..eefabab --- /dev/null +++ b/resources/views/vendor/mail/html/header.blade.php @@ -0,0 +1,7 @@ + + + + {{ $slot }} + + + diff --git a/resources/views/vendor/mail/html/layout.blade.php b/resources/views/vendor/mail/html/layout.blade.php new file mode 100755 index 0000000..991ae52 --- /dev/null +++ b/resources/views/vendor/mail/html/layout.blade.php @@ -0,0 +1,54 @@ + + + + + + + + + + + + + +
    + + {{ $header or '' }} + + + + + + + {{ $footer or '' }} +
    + + + + + +
    + {{ Illuminate\Mail\Markdown::parse($slot) }} + + {{ $subcopy or '' }} +
    +
    +
    + + diff --git a/resources/views/vendor/mail/html/message.blade.php b/resources/views/vendor/mail/html/message.blade.php new file mode 100755 index 0000000..413dbaf --- /dev/null +++ b/resources/views/vendor/mail/html/message.blade.php @@ -0,0 +1,27 @@ +@component('mail::layout') + {{-- Header --}} + @slot('header') + @component('mail::header', ['url' => config('app.url')]) + {{ setting('general.company_name', config('app.name')) }} + @endcomponent + @endslot + + {{-- Body --}} + {{ $slot }} + + {{-- Subcopy --}} + @isset($subcopy) + @slot('subcopy') + @component('mail::subcopy') + {{ $subcopy }} + @endcomponent + @endslot + @endisset + + {{-- Footer --}} + @slot('footer') + @component('mail::footer') + © {{ date('Y') }} {{ setting('general.company_name', config('app.name')) }}. All rights reserved. + @endcomponent + @endslot +@endcomponent diff --git a/resources/views/vendor/mail/html/panel.blade.php b/resources/views/vendor/mail/html/panel.blade.php new file mode 100755 index 0000000..f397080 --- /dev/null +++ b/resources/views/vendor/mail/html/panel.blade.php @@ -0,0 +1,13 @@ + + + + +
    + + + + +
    + {{ Illuminate\Mail\Markdown::parse($slot) }} +
    +
    diff --git a/resources/views/vendor/mail/html/promotion.blade.php b/resources/views/vendor/mail/html/promotion.blade.php new file mode 100755 index 0000000..0debcf8 --- /dev/null +++ b/resources/views/vendor/mail/html/promotion.blade.php @@ -0,0 +1,7 @@ + + + + +
    + {{ Illuminate\Mail\Markdown::parse($slot) }} +
    diff --git a/resources/views/vendor/mail/html/promotion/button.blade.php b/resources/views/vendor/mail/html/promotion/button.blade.php new file mode 100755 index 0000000..8e79081 --- /dev/null +++ b/resources/views/vendor/mail/html/promotion/button.blade.php @@ -0,0 +1,13 @@ + + + + +
    + + + + +
    + {{ $slot }} +
    +
    diff --git a/resources/views/vendor/mail/html/subcopy.blade.php b/resources/views/vendor/mail/html/subcopy.blade.php new file mode 100755 index 0000000..c3df7b4 --- /dev/null +++ b/resources/views/vendor/mail/html/subcopy.blade.php @@ -0,0 +1,7 @@ + + + + +
    + {{ Illuminate\Mail\Markdown::parse($slot) }} +
    diff --git a/resources/views/vendor/mail/html/table.blade.php b/resources/views/vendor/mail/html/table.blade.php new file mode 100755 index 0000000..a5f3348 --- /dev/null +++ b/resources/views/vendor/mail/html/table.blade.php @@ -0,0 +1,3 @@ +
    +{{ Illuminate\Mail\Markdown::parse($slot) }} +
    diff --git a/resources/views/vendor/mail/html/themes/default.css b/resources/views/vendor/mail/html/themes/default.css new file mode 100755 index 0000000..2065993 --- /dev/null +++ b/resources/views/vendor/mail/html/themes/default.css @@ -0,0 +1,285 @@ +/* Base */ + +body, body *:not(html):not(style):not(br):not(tr):not(code) { + font-family: Avenir, Helvetica, sans-serif; + box-sizing: border-box; +} + +body { + background-color: #f5f8fa; + color: #74787E; + height: 100%; + hyphens: auto; + line-height: 1.4; + margin: 0; + -moz-hyphens: auto; + -ms-word-break: break-all; + width: 100% !important; + -webkit-hyphens: auto; + -webkit-text-size-adjust: none; + word-break: break-all; + word-break: break-word; +} + +p, +ul, +ol, +blockquote { + line-height: 1.4; + text-align: left; +} + +a { + color: #3869D4; +} + +a img { + border: none; +} + +/* Typography */ + +h1 { + color: #2F3133; + font-size: 19px; + font-weight: bold; + margin-top: 0; + text-align: left; +} + +h2 { + color: #2F3133; + font-size: 16px; + font-weight: bold; + margin-top: 0; + text-align: left; +} + +h3 { + color: #2F3133; + font-size: 14px; + font-weight: bold; + margin-top: 0; + text-align: left; +} + +p { + color: #74787E; + font-size: 16px; + line-height: 1.5em; + margin-top: 0; + text-align: left; +} + +p.sub { + font-size: 12px; +} + +img { + max-width: 100%; +} + +/* Layout */ + +.wrapper { + background-color: #f5f8fa; + margin: 0; + padding: 0; + width: 100%; + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; +} + +.content { + margin: 0; + padding: 0; + width: 100%; + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; +} + +/* Header */ + +.header { + padding: 25px 0; + text-align: center; +} + +.header a { + color: #bbbfc3; + font-size: 19px; + font-weight: bold; + text-decoration: none; + text-shadow: 0 1px 0 white; +} + +/* Body */ + +.body { + background-color: #FFFFFF; + border-bottom: 1px solid #EDEFF2; + border-top: 1px solid #EDEFF2; + margin: 0; + padding: 0; + width: 100%; + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; +} + +.inner-body { + background-color: #FFFFFF; + margin: 0 auto; + padding: 0; + width: 570px; + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 570px; +} + +/* Subcopy */ + +.subcopy { + border-top: 1px solid #EDEFF2; + margin-top: 25px; + padding-top: 25px; +} + +.subcopy p { + font-size: 12px; +} + +/* Footer */ + +.footer { + margin: 0 auto; + padding: 0; + text-align: center; + width: 570px; + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 570px; +} + +.footer p { + color: #AEAEAE; + font-size: 12px; + text-align: center; +} + +/* Tables */ + +.table table { + margin: 30px auto; + width: 100%; + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; +} + +.table th { + border-bottom: 1px solid #EDEFF2; + padding-bottom: 8px; +} + +.table td { + color: #74787E; + font-size: 15px; + line-height: 18px; + padding: 10px 0; +} + +.content-cell { + padding: 35px; +} + +/* Buttons */ + +.action { + margin: 30px auto; + padding: 0; + text-align: center; + width: 100%; + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; +} + +.button { + border-radius: 3px; + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.16); + color: #FFF; + display: inline-block; + text-decoration: none; + -webkit-text-size-adjust: none; +} + +.button-blue { + background-color: #3097D1; + border-top: 10px solid #3097D1; + border-right: 18px solid #3097D1; + border-bottom: 10px solid #3097D1; + border-left: 18px solid #3097D1; +} + +.button-green { + background-color: #2ab27b; + border-top: 10px solid #2ab27b; + border-right: 18px solid #2ab27b; + border-bottom: 10px solid #2ab27b; + border-left: 18px solid #2ab27b; +} + +.button-red { + background-color: #bf5329; + border-top: 10px solid #bf5329; + border-right: 18px solid #bf5329; + border-bottom: 10px solid #bf5329; + border-left: 18px solid #bf5329; +} + +/* Panels */ + +.panel { + margin: 0 0 21px; +} + +.panel-content { + background-color: #EDEFF2; + padding: 16px; +} + +.panel-item { + padding: 0; +} + +.panel-item p:last-of-type { + margin-bottom: 0; + padding-bottom: 0; +} + +/* Promotions */ + +.promotion { + background-color: #FFFFFF; + border: 2px dashed #9BA2AB; + margin: 0; + margin-bottom: 25px; + margin-top: 25px; + padding: 24px; + width: 100%; + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; +} + +.promotion h1 { + text-align: center; +} + +.promotion p { + font-size: 15px; + text-align: center; +} diff --git a/resources/views/vendor/mail/markdown/button.blade.php b/resources/views/vendor/mail/markdown/button.blade.php new file mode 100755 index 0000000..97444eb --- /dev/null +++ b/resources/views/vendor/mail/markdown/button.blade.php @@ -0,0 +1 @@ +{{ $slot }}: {{ $url }} diff --git a/resources/views/vendor/mail/markdown/footer.blade.php b/resources/views/vendor/mail/markdown/footer.blade.php new file mode 100755 index 0000000..3338f62 --- /dev/null +++ b/resources/views/vendor/mail/markdown/footer.blade.php @@ -0,0 +1 @@ +{{ $slot }} diff --git a/resources/views/vendor/mail/markdown/header.blade.php b/resources/views/vendor/mail/markdown/header.blade.php new file mode 100755 index 0000000..aaa3e57 --- /dev/null +++ b/resources/views/vendor/mail/markdown/header.blade.php @@ -0,0 +1 @@ +[{{ $slot }}]({{ $url }}) diff --git a/resources/views/vendor/mail/markdown/layout.blade.php b/resources/views/vendor/mail/markdown/layout.blade.php new file mode 100755 index 0000000..9378baa --- /dev/null +++ b/resources/views/vendor/mail/markdown/layout.blade.php @@ -0,0 +1,9 @@ +{!! strip_tags($header) !!} + +{!! strip_tags($slot) !!} +@isset($subcopy) + +{!! strip_tags($subcopy) !!} +@endisset + +{!! strip_tags($footer) !!} diff --git a/resources/views/vendor/mail/markdown/message.blade.php b/resources/views/vendor/mail/markdown/message.blade.php new file mode 100755 index 0000000..4792686 --- /dev/null +++ b/resources/views/vendor/mail/markdown/message.blade.php @@ -0,0 +1,27 @@ +@component('mail::layout') + {{-- Header --}} + @slot('header') + @component('mail::header', ['url' => config('app.url')]) + {{ setting('general.company_name', config('app.name')) }} + @endcomponent + @endslot + + {{-- Body --}} + {{ $slot }} + + {{-- Subcopy --}} + @isset($subcopy) + @slot('subcopy') + @component('mail::subcopy') + {{ $subcopy }} + @endcomponent + @endslot + @endisset + + {{-- Footer --}} + @slot('footer') + @component('mail::footer') + © {{ date('Y') }} {{ setting('general.company_name', config('app.name')) }}. All rights reserved. + @endcomponent + @endslot +@endcomponent diff --git a/resources/views/vendor/mail/markdown/panel.blade.php b/resources/views/vendor/mail/markdown/panel.blade.php new file mode 100755 index 0000000..3338f62 --- /dev/null +++ b/resources/views/vendor/mail/markdown/panel.blade.php @@ -0,0 +1 @@ +{{ $slot }} diff --git a/resources/views/vendor/mail/markdown/promotion.blade.php b/resources/views/vendor/mail/markdown/promotion.blade.php new file mode 100755 index 0000000..3338f62 --- /dev/null +++ b/resources/views/vendor/mail/markdown/promotion.blade.php @@ -0,0 +1 @@ +{{ $slot }} diff --git a/resources/views/vendor/mail/markdown/promotion/button.blade.php b/resources/views/vendor/mail/markdown/promotion/button.blade.php new file mode 100755 index 0000000..aaa3e57 --- /dev/null +++ b/resources/views/vendor/mail/markdown/promotion/button.blade.php @@ -0,0 +1 @@ +[{{ $slot }}]({{ $url }}) diff --git a/resources/views/vendor/mail/markdown/subcopy.blade.php b/resources/views/vendor/mail/markdown/subcopy.blade.php new file mode 100755 index 0000000..3338f62 --- /dev/null +++ b/resources/views/vendor/mail/markdown/subcopy.blade.php @@ -0,0 +1 @@ +{{ $slot }} diff --git a/resources/views/vendor/mail/markdown/table.blade.php b/resources/views/vendor/mail/markdown/table.blade.php new file mode 100755 index 0000000..3338f62 --- /dev/null +++ b/resources/views/vendor/mail/markdown/table.blade.php @@ -0,0 +1 @@ +{{ $slot }} diff --git a/resources/views/vendor/notifications/email.blade.php b/resources/views/vendor/notifications/email.blade.php new file mode 100755 index 0000000..e572533 --- /dev/null +++ b/resources/views/vendor/notifications/email.blade.php @@ -0,0 +1,57 @@ +@component('mail::message') +{{-- Greeting --}} +@if (! empty($greeting)) +# {{ $greeting }} +@else +@if ($level == 'error') +# {{ trans('notifications.whoops') }} +@else +# {{ trans('notifications.hello') }} +@endif +@endif + +{{-- Intro Lines --}} +@foreach ($introLines as $line) +{{ $line }} + +@endforeach + +{{-- Action Button --}} +@isset($actionText) + +@component('mail::button', ['url' => $actionUrl, 'color' => $color]) +{{ $actionText }} +@endcomponent +@endisset + +{{-- Outro Lines --}} +@foreach ($outroLines as $line) +{{ $line }} + +@endforeach + + +@if (! empty($salutation)) +{{ $salutation }} +@else +{!! trans('notifications.salutation', ['company_name' => setting('general.company_name', config('app.name'))]) !!} +@endif + + +@isset($actionText) +@component('mail::subcopy') +{!! trans('notifications.subcopy', ['text' => $actionText, 'url' => $actionUrl]) !!} +@endcomponent +@endisset +@endcomponent diff --git a/resources/views/vendor/nwidart/menus/child/dropdown.blade.php b/resources/views/vendor/nwidart/menus/child/dropdown.blade.php new file mode 100755 index 0000000..1761b38 --- /dev/null +++ b/resources/views/vendor/nwidart/menus/child/dropdown.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/vendor/nwidart/menus/child/item.blade.php b/resources/views/vendor/nwidart/menus/child/item.blade.php new file mode 100755 index 0000000..67e5a8d --- /dev/null +++ b/resources/views/vendor/nwidart/menus/child/item.blade.php @@ -0,0 +1,11 @@ +@if ($item->isDivider()) +
  • +@elseif ($item->isHeader()) + +@else +
  • + + {{ $item->title }} + +
  • +@endif diff --git a/resources/views/vendor/nwidart/menus/default.blade.php b/resources/views/vendor/nwidart/menus/default.blade.php new file mode 100755 index 0000000..a4b286f --- /dev/null +++ b/resources/views/vendor/nwidart/menus/default.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/vendor/nwidart/menus/item/dropdown.blade.php b/resources/views/vendor/nwidart/menus/item/dropdown.blade.php new file mode 100755 index 0000000..57e12a7 --- /dev/null +++ b/resources/views/vendor/nwidart/menus/item/dropdown.blade.php @@ -0,0 +1,15 @@ + diff --git a/resources/views/vendor/nwidart/menus/item/item.blade.php b/resources/views/vendor/nwidart/menus/item/item.blade.php new file mode 100755 index 0000000..88864e4 --- /dev/null +++ b/resources/views/vendor/nwidart/menus/item/item.blade.php @@ -0,0 +1,12 @@ +@if ($item->isDivider()) +
  • +@elseif ($item->isHeader()) + +@else +
  • + getAttributes() !!}> + {!! $item->getIcon() !!} + {{ $item->title }} + +
  • +@endif diff --git a/resources/views/vendor/nwidart/menus/menu.blade.php b/resources/views/vendor/nwidart/menus/menu.blade.php new file mode 100755 index 0000000..2504b8a --- /dev/null +++ b/resources/views/vendor/nwidart/menus/menu.blade.php @@ -0,0 +1,7 @@ +@foreach ($items as $item) + @if ($item->hasChilds()) + @include('menus::item.dropdown', compact('item')) + @else + @include('menus::item.item', compact('item')) + @endif +@endforeach diff --git a/resources/views/vendor/nwidart/menus/nav-pills-justified.blade.php b/resources/views/vendor/nwidart/menus/nav-pills-justified.blade.php new file mode 100755 index 0000000..325bd9e --- /dev/null +++ b/resources/views/vendor/nwidart/menus/nav-pills-justified.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/vendor/nwidart/menus/nav-pills-stacked.blade.php b/resources/views/vendor/nwidart/menus/nav-pills-stacked.blade.php new file mode 100755 index 0000000..dbe0131 --- /dev/null +++ b/resources/views/vendor/nwidart/menus/nav-pills-stacked.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/vendor/nwidart/menus/nav-pills.blade.php b/resources/views/vendor/nwidart/menus/nav-pills.blade.php new file mode 100755 index 0000000..46d91da --- /dev/null +++ b/resources/views/vendor/nwidart/menus/nav-pills.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/vendor/nwidart/menus/nav-tabs-justified.blade.php b/resources/views/vendor/nwidart/menus/nav-tabs-justified.blade.php new file mode 100755 index 0000000..03ce5de --- /dev/null +++ b/resources/views/vendor/nwidart/menus/nav-tabs-justified.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/vendor/nwidart/menus/nav-tabs.blade.php b/resources/views/vendor/nwidart/menus/nav-tabs.blade.php new file mode 100755 index 0000000..445455b --- /dev/null +++ b/resources/views/vendor/nwidart/menus/nav-tabs.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/vendor/nwidart/menus/navbar-left.blade.php b/resources/views/vendor/nwidart/menus/navbar-left.blade.php new file mode 100755 index 0000000..bc2cf1c --- /dev/null +++ b/resources/views/vendor/nwidart/menus/navbar-left.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/vendor/nwidart/menus/navbar-right.blade.php b/resources/views/vendor/nwidart/menus/navbar-right.blade.php new file mode 100755 index 0000000..67aa753 --- /dev/null +++ b/resources/views/vendor/nwidart/menus/navbar-right.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/vendor/nwidart/menus/style.blade.php b/resources/views/vendor/nwidart/menus/style.blade.php new file mode 100755 index 0000000..76f31ec --- /dev/null +++ b/resources/views/vendor/nwidart/menus/style.blade.php @@ -0,0 +1,49 @@ + diff --git a/resources/views/vendor/pagination/bootstrap-4.blade.php b/resources/views/vendor/pagination/bootstrap-4.blade.php new file mode 100755 index 0000000..3f98455 --- /dev/null +++ b/resources/views/vendor/pagination/bootstrap-4.blade.php @@ -0,0 +1,36 @@ +@if ($paginator->hasPages()) +
      + {{-- Previous Page Link --}} + @if ($paginator->onFirstPage()) +
    • «
    • + @else +
    • + @endif + + {{-- Pagination Elements --}} + @foreach ($elements as $element) + {{-- "Three Dots" Separator --}} + @if (is_string($element)) +
    • {{ $element }}
    • + @endif + + {{-- Array Of Links --}} + @if (is_array($element)) + @foreach ($element as $page => $url) + @if ($page == $paginator->currentPage()) +
    • {{ $page }}
    • + @else +
    • {{ $page }}
    • + @endif + @endforeach + @endif + @endforeach + + {{-- Next Page Link --}} + @if ($paginator->hasMorePages()) +
    • + @else +
    • »
    • + @endif +
    +@endif diff --git a/resources/views/vendor/pagination/default.blade.php b/resources/views/vendor/pagination/default.blade.php new file mode 100755 index 0000000..7a09358 --- /dev/null +++ b/resources/views/vendor/pagination/default.blade.php @@ -0,0 +1,34 @@ +
      + {{-- Previous Page Link --}} + @if ($paginator->onFirstPage()) +
    • «
    • + @else +
    • + @endif + + {{-- Pagination Elements --}} + @foreach ($elements as $element) + {{-- "Three Dots" Separator --}} + @if (is_string($element)) +
    • {{ $element }}
    • + @endif + + {{-- Array Of Links --}} + @if (is_array($element)) + @foreach ($element as $page => $url) + @if ($page == $paginator->currentPage()) +
    • {{ $page }}
    • + @else +
    • {{ $page }}
    • + @endif + @endforeach + @endif + @endforeach + + {{-- Next Page Link --}} + @if ($paginator->hasMorePages()) +
    • + @else +
    • »
    • + @endif +
    diff --git a/resources/views/vendor/pagination/simple-bootstrap-4.blade.php b/resources/views/vendor/pagination/simple-bootstrap-4.blade.php new file mode 100755 index 0000000..a9a18d3 --- /dev/null +++ b/resources/views/vendor/pagination/simple-bootstrap-4.blade.php @@ -0,0 +1,17 @@ +@if ($paginator->hasPages()) +
      + {{-- Previous Page Link --}} + @if ($paginator->onFirstPage()) +
    • @lang('pagination.previous')
    • + @else +
    • + @endif + + {{-- Next Page Link --}} + @if ($paginator->hasMorePages()) +
    • + @else +
    • @lang('pagination.next')
    • + @endif +
    +@endif diff --git a/resources/views/vendor/pagination/simple-default.blade.php b/resources/views/vendor/pagination/simple-default.blade.php new file mode 100755 index 0000000..1801609 --- /dev/null +++ b/resources/views/vendor/pagination/simple-default.blade.php @@ -0,0 +1,17 @@ +@if ($paginator->hasPages()) +
      + {{-- Previous Page Link --}} + @if ($paginator->onFirstPage()) +
    • @lang('pagination.previous')
    • + @else +
    • + @endif + + {{-- Next Page Link --}} + @if ($paginator->hasMorePages()) +
    • + @else +
    • @lang('pagination.next')
    • + @endif +
    +@endif diff --git a/routes/api.php b/routes/api.php new file mode 100755 index 0000000..75fd17e --- /dev/null +++ b/routes/api.php @@ -0,0 +1,42 @@ +version('v1', ['middleware' => ['api']], function($api) { + $api->group(['namespace' => 'App\Http\Controllers\Api'], function($api) { + // Companies + $api->resource('companies', 'Common\Companies'); + + // Items + $api->resource('items', 'Common\Items'); + + // Incomes + $api->resource('customers', 'Incomes\Customers'); + $api->resource('invoices', 'Incomes\Invoices'); + $api->resource('invoices.payments', 'Incomes\InvoicePayments'); + $api->resource('revenues', 'Incomes\Revenues'); + + // Expenses + $api->resource('bills', 'Expenses\Bills'); + $api->resource('payments', 'Expenses\Payments'); + $api->resource('vendors', 'Expenses\Vendors'); + + // Banking + $api->resource('accounts', 'Banking\Accounts'); + $api->resource('transfers', 'Banking\Transfers'); + + // Settings + $api->resource('categories', 'Settings\Categories'); + $api->resource('currencies', 'Settings\Currencies'); + $api->resource('settings', 'Settings\Settings'); + $api->resource('taxes', 'Settings\Taxes'); + + // Common + $api->resource('ping', 'Common\Ping'); + + // Auth + $api->resource('permissions', 'Auth\Permissions'); + $api->resource('roles', 'Auth\Roles'); + $api->resource('users', 'Auth\Users'); + }); +}); diff --git a/routes/channels.php b/routes/channels.php new file mode 100755 index 0000000..f16a20b --- /dev/null +++ b/routes/channels.php @@ -0,0 +1,16 @@ +id === (int) $id; +}); diff --git a/routes/console.php b/routes/console.php new file mode 100755 index 0000000..75dd0cd --- /dev/null +++ b/routes/console.php @@ -0,0 +1,18 @@ +comment(Inspiring::quote()); +})->describe('Display an inspiring quote'); diff --git a/routes/web.php b/routes/web.php new file mode 100755 index 0000000..d32947f --- /dev/null +++ b/routes/web.php @@ -0,0 +1,250 @@ + 'language'], function () { + Route::group(['middleware' => 'auth'], function () { + Route::group(['prefix' => 'uploads'], function () { + Route::get('{id}', 'Common\Uploads@get'); + Route::get('{id}/download', 'Common\Uploads@download'); + }); + + Route::group(['middleware' => ['adminmenu', 'permission:read-admin-panel']], function () { + Route::get('/', 'Common\Dashboard@index'); + + Route::group(['prefix' => 'uploads'], function () { + Route::delete('{id}', 'Common\Uploads@destroy'); + }); + + Route::group(['prefix' => 'common'], function () { + Route::get('companies/{company}/set', 'Common\Companies@set')->name('companies.switch'); + Route::get('companies/{company}/enable', 'Common\Companies@enable')->name('companies.enable'); + Route::get('companies/{company}/disable', 'Common\Companies@disable')->name('companies.disable'); + Route::resource('companies', 'Common\Companies'); + Route::get('dashboard/cashflow', 'Common\Dashboard@cashFlow')->name('dashboard.cashflow'); + Route::get('import/{group}/{type}', 'Common\Import@create')->name('import.create'); + Route::get('items/autocomplete', 'Common\Items@autocomplete')->name('items.autocomplete'); + Route::post('items/totalItem', 'Common\Items@totalItem')->middleware(['money'])->name('items.total'); + Route::get('items/{item}/duplicate', 'Common\Items@duplicate')->name('items.duplicate'); + Route::post('items/import', 'Common\Items@import')->name('items.import'); + Route::get('items/export', 'Common\Items@export')->name('items.export'); + Route::get('items/{item}/enable', 'Common\Items@enable')->name('items.enable'); + Route::get('items/{item}/disable', 'Common\Items@disable')->name('items.disable'); + Route::resource('items', 'Common\Items', ['middleware' => ['money']]); + Route::get('search/search', 'Common\Search@search')->name('search.search'); + Route::resource('search', 'Common\Search'); + }); + + Route::group(['prefix' => 'auth'], function () { + Route::get('logout', 'Auth\Login@destroy')->name('logout'); + Route::get('users/autocomplete', 'Auth\Users@autocomplete'); + Route::get('users/{user}/read-bills', 'Auth\Users@readUpcomingBills'); + Route::get('users/{user}/read-invoices', 'Auth\Users@readOverdueInvoices'); + Route::get('users/{user}/read-items', 'Auth\Users@readItemsOutOfStock'); + Route::get('users/{user}/enable', 'Auth\Users@enable')->name('users.enable'); + Route::get('users/{user}/disable', 'Auth\Users@disable')->name('users.disable'); + Route::resource('users', 'Auth\Users'); + Route::resource('roles', 'Auth\Roles'); + Route::resource('permissions', 'Auth\Permissions'); + }); + + Route::group(['prefix' => 'incomes'], function () { + Route::get('invoices/{invoice}/sent', 'Incomes\Invoices@markSent'); + Route::get('invoices/{invoice}/email', 'Incomes\Invoices@emailInvoice'); + Route::get('invoices/{invoice}/pay', 'Incomes\Invoices@markPaid'); + Route::get('invoices/{invoice}/print', 'Incomes\Invoices@printInvoice'); + Route::get('invoices/{invoice}/pdf', 'Incomes\Invoices@pdfInvoice'); + Route::get('invoices/{invoice}/duplicate', 'Incomes\Invoices@duplicate'); + Route::get('invoices/addItem', 'Incomes\Invoices@addItem')->middleware(['money'])->name('invoice.add.item'); + Route::post('invoices/payment', 'Incomes\Invoices@payment')->middleware(['dateformat', 'money'])->name('invoice.payment'); + Route::delete('invoices/payment/{payment}', 'Incomes\Invoices@paymentDestroy'); + Route::post('invoices/import', 'Incomes\Invoices@import')->name('invoices.import'); + Route::get('invoices/export', 'Incomes\Invoices@export')->name('invoices.export'); + Route::resource('invoices', 'Incomes\Invoices', ['middleware' => ['dateformat', 'money']]); + Route::get('revenues/{revenue}/duplicate', 'Incomes\Revenues@duplicate'); + Route::post('revenues/import', 'Incomes\Revenues@import')->name('revenues.import'); + Route::get('revenues/export', 'Incomes\Revenues@export')->name('revenues.export'); + Route::resource('revenues', 'Incomes\Revenues', ['middleware' => ['dateformat', 'money']]); + Route::get('customers/currency', 'Incomes\Customers@currency'); + Route::get('customers/{customer}/duplicate', 'Incomes\Customers@duplicate'); + Route::post('customers/customer', 'Incomes\Customers@customer'); + Route::post('customers/field', 'Incomes\Customers@field'); + Route::post('customers/import', 'Incomes\Customers@import')->name('customers.import'); + Route::get('customers/export', 'Incomes\Customers@export')->name('customers.export'); + Route::get('customers/{customer}/enable', 'Incomes\Customers@enable')->name('customers.enable'); + Route::get('customers/{customer}/disable', 'Incomes\Customers@disable')->name('customers.disable'); + Route::resource('customers', 'Incomes\Customers'); + }); + + Route::group(['prefix' => 'expenses'], function () { + Route::get('bills/{bill}/received', 'Expenses\Bills@markReceived'); + Route::get('bills/{bill}/print', 'Expenses\Bills@printBill'); + Route::get('bills/{bill}/pdf', 'Expenses\Bills@pdfBill'); + Route::get('bills/{bill}/duplicate', 'Expenses\Bills@duplicate'); + Route::get('bills/addItem', 'Expenses\Bills@addItem')->middleware(['money'])->name('bill.add.item'); + Route::post('bills/payment', 'Expenses\Bills@payment')->middleware(['dateformat', 'money'])->name('bill.payment'); + Route::delete('bills/payment/{payment}', 'Expenses\Bills@paymentDestroy'); + Route::post('bills/import', 'Expenses\Bills@import')->name('bills.import'); + Route::get('bills/export', 'Expenses\Bills@export')->name('bills.export'); + Route::resource('bills', 'Expenses\Bills', ['middleware' => ['dateformat', 'money']]); + Route::get('payments/{payment}/duplicate', 'Expenses\Payments@duplicate'); + Route::post('payments/import', 'Expenses\Payments@import')->name('payments.import'); + Route::get('payments/export', 'Expenses\Payments@export')->name('payments.export'); + Route::resource('payments', 'Expenses\Payments', ['middleware' => ['dateformat', 'money']]); + Route::get('vendors/currency', 'Expenses\Vendors@currency'); + Route::get('vendors/{vendor}/duplicate', 'Expenses\Vendors@duplicate'); + Route::post('vendors/vendor', 'Expenses\Vendors@vendor'); + Route::post('vendors/import', 'Expenses\Vendors@import')->name('vendors.import'); + Route::get('vendors/export', 'Expenses\Vendors@export')->name('vendors.export'); + Route::get('vendors/{vendor}/enable', 'Expenses\Vendors@enable')->name('vendors.enable'); + Route::get('vendors/{vendor}/disable', 'Expenses\Vendors@disable')->name('vendors.disable'); + Route::resource('vendors', 'Expenses\Vendors'); + }); + + Route::group(['prefix' => 'banking'], function () { + Route::get('accounts/currency', 'Banking\Accounts@currency')->name('accounts.currency'); + Route::get('accounts/{account}/enable', 'Banking\Accounts@enable')->name('accounts.enable'); + Route::get('accounts/{account}/disable', 'Banking\Accounts@disable')->name('accounts.disable'); + Route::resource('accounts', 'Banking\Accounts', ['middleware' => ['dateformat', 'money']]); + Route::resource('transactions', 'Banking\Transactions'); + Route::resource('transfers', 'Banking\Transfers', ['middleware' => ['dateformat', 'money']]); + }); + + Route::group(['prefix' => 'reports'], function () { + Route::resource('income-summary', 'Reports\IncomeSummary'); + Route::resource('expense-summary', 'Reports\ExpenseSummary'); + Route::resource('income-expense-summary', 'Reports\IncomeExpenseSummary'); + Route::resource('tax-summary', 'Reports\TaxSummary'); + Route::resource('profit-loss', 'Reports\ProfitLoss'); + }); + + Route::group(['prefix' => 'settings'], function () { + Route::post('categories/category', 'Settings\Categories@category'); + Route::get('categories/{category}/enable', 'Settings\Categories@enable')->name('categories.enable'); + Route::get('categories/{category}/disable', 'Settings\Categories@disable')->name('categories.disable'); + Route::resource('categories', 'Settings\Categories'); + Route::get('currencies/currency', 'Settings\Currencies@currency'); + Route::get('currencies/config', 'Settings\Currencies@config'); + Route::get('currencies/{currency}/enable', 'Settings\Currencies@enable')->name('currencies.enable'); + Route::get('currencies/{currency}/disable', 'Settings\Currencies@disable')->name('currencies.disable'); + Route::resource('currencies', 'Settings\Currencies'); + Route::get('settings', 'Settings\Settings@edit'); + Route::patch('settings', 'Settings\Settings@update'); + Route::get('taxes/{tax}/enable', 'Settings\Taxes@enable')->name('taxes.enable'); + Route::get('taxes/{tax}/disable', 'Settings\Taxes@disable')->name('taxes.disable'); + Route::resource('taxes', 'Settings\Taxes'); + Route::get('apps/{alias}', 'Settings\Modules@edit'); + Route::patch('apps/{alias}', 'Settings\Modules@update'); + }); + + Route::group(['prefix' => 'apps'], function () { + Route::resource('token', 'Modules\Token'); + Route::resource('home', 'Modules\Home'); + Route::resource('my', 'Modules\My'); + Route::get('categories/{alias}', 'Modules\Tiles@categoryModules'); + Route::get('paid', 'Modules\Tiles@paidModules'); + Route::get('new', 'Modules\Tiles@newModules'); + Route::get('free', 'Modules\Tiles@freeModules'); + Route::get('search', 'Modules\Tiles@searchModules'); + Route::post('steps', 'Modules\Item@steps'); + Route::post('download', 'Modules\Item@download'); + Route::post('unzip', 'Modules\Item@unzip'); + Route::post('install', 'Modules\Item@install'); + Route::get('post/{alias}', 'Modules\Item@post'); + Route::get('{alias}/uninstall', 'Modules\Item@uninstall'); + Route::get('{alias}/enable', 'Modules\Item@enable'); + Route::get('{alias}/disable', 'Modules\Item@disable'); + Route::get('{alias}', 'Modules\Item@show'); + }); + + Route::group(['prefix' => 'install'], function () { + Route::get('updates/changelog', 'Install\Updates@changelog'); + Route::get('updates/check', 'Install\Updates@check'); + Route::get('updates/update/{alias}/{version}', 'Install\Updates@update'); + Route::get('updates/post/{alias}/{old}/{new}', 'Install\Updates@post'); + Route::resource('updates', 'Install\Updates'); + }); + + Route::group(['prefix' => 'modals'], function () { + Route::resource('categories', 'Modals\Categories', ['names' => [ + 'index' => 'modals.categories.index', + 'create' => 'modals.categories.create', + 'store' => 'modals.categories.store', + 'show' => 'modals.categories.show', + 'edit' => 'modals.categories.edit', + 'update' => 'modals.categories.update', + 'destroy' => 'modals.categories.destroy', + ]]); + Route::resource('customers', 'Modals\Customers', ['names' => [ + 'index' => 'modals.customers.index', + 'create' => 'modals.customers.create', + 'store' => 'modals.customers.store', + 'show' => 'modals.customers.show', + 'edit' => 'modals.customers.edit', + 'update' => 'modals.customers.update', + 'destroy' => 'modals.customers.destroy', + ]]); + Route::resource('vendors', 'Modals\Vendors', ['names' => [ + 'index' => 'modals.vendors.index', + 'create' => 'modals.vendors.create', + 'store' => 'modals.vendors.store', + 'show' => 'modals.vendors.show', + 'edit' => 'modals.vendors.edit', + 'update' => 'modals.vendors.update', + 'destroy' => 'modals.vendors.destroy', + ]]); + Route::resource('invoices/{invoice}/payment', 'Modals\InvoicePayments', ['middleware' => ['dateformat', 'money']]); + Route::resource('bills/{bill}/payment', 'Modals\BillPayments', ['middleware' => ['dateformat', 'money']]); + }); + + /* @deprecated */ + Route::post('items/items/totalItem', 'Common\Items@totalItem'); + }); + + Route::group(['middleware' => ['customermenu', 'permission:read-customer-panel']], function () { + Route::group(['prefix' => 'customers'], function () { + Route::get('/', 'Customers\Dashboard@index'); + + Route::get('invoices/{invoice}/print', 'Customers\Invoices@printInvoice'); + Route::get('invoices/{invoice}/pdf', 'Customers\Invoices@pdfInvoice'); + Route::post('invoices/{invoice}/payment', 'Customers\Invoices@payment'); + Route::post('invoices/{invoice}/confirm', 'Customers\Invoices@confirm'); + Route::resource('invoices', 'Customers\Invoices'); + Route::resource('payments', 'Customers\Payments'); + Route::resource('transactions', 'Customers\Transactions'); + Route::get('profile/read-invoices', 'Customers\Profile@readOverdueInvoices'); + Route::resource('profile', 'Customers\Profile'); + + Route::get('logout', 'Auth\Login@destroy')->name('customer_logout'); + }); + }); + }); + + Route::group(['middleware' => 'guest'], function () { + Route::group(['prefix' => 'auth'], function () { + Route::get('login', 'Auth\Login@create')->name('login'); + Route::post('login', 'Auth\Login@store'); + + Route::get('forgot', 'Auth\Forgot@create')->name('forgot'); + Route::post('forgot', 'Auth\Forgot@store'); + + //Route::get('reset', 'Auth\Reset@create'); + Route::get('reset/{token}', 'Auth\Reset@create')->name('reset'); + Route::post('reset', 'Auth\Reset@store'); + }); + + Route::group(['middleware' => 'install'], function () { + Route::group(['prefix' => 'install'], function () { + Route::get('/', 'Install\Requirements@show'); + Route::get('requirements', 'Install\Requirements@show'); + + Route::get('language', 'Install\Language@create'); + Route::post('language', 'Install\Language@store'); + + Route::get('database', 'Install\Database@create'); + Route::post('database', 'Install\Database@store'); + + Route::get('settings', 'Install\Settings@create'); + Route::post('settings', 'Install\Settings@store'); + }); + }); + }); +}); diff --git a/storage/app/.gitignore b/storage/app/.gitignore new file mode 100755 index 0000000..207a1d8 --- /dev/null +++ b/storage/app/.gitignore @@ -0,0 +1,5 @@ +* +!public/ +!temp/ +!uploads/ +!.gitignore diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/app/public/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/app/temp/.gitignore b/storage/app/temp/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/app/temp/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/app/uploads/.gitignore b/storage/app/uploads/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/app/uploads/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/dotenv-editor/.gitignore b/storage/dotenv-editor/.gitignore new file mode 100755 index 0000000..669c278 --- /dev/null +++ b/storage/dotenv-editor/.gitignore @@ -0,0 +1,3 @@ +/backups +* +!.gitignore diff --git a/storage/fonts/index.html b/storage/fonts/index.html new file mode 100755 index 0000000..2efb97f --- /dev/null +++ b/storage/fonts/index.html @@ -0,0 +1 @@ + diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore new file mode 100755 index 0000000..b02b700 --- /dev/null +++ b/storage/framework/.gitignore @@ -0,0 +1,8 @@ +config.php +routes.php +schedule-* +compiled.php +services.json +events.scanned.php +routes.scanned.php +down diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/sessions/.gitignore b/storage/framework/sessions/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/sessions/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/testing/.gitignore b/storage/framework/testing/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/testing/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/views/.gitignore b/storage/framework/views/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/tests/CreatesApplication.php b/tests/CreatesApplication.php new file mode 100755 index 0000000..547152f --- /dev/null +++ b/tests/CreatesApplication.php @@ -0,0 +1,22 @@ +make(Kernel::class)->bootstrap(); + + return $app; + } +} diff --git a/tests/Feature/Common/ItemsTest.php b/tests/Feature/Common/ItemsTest.php new file mode 100755 index 0000000..6510c3e --- /dev/null +++ b/tests/Feature/Common/ItemsTest.php @@ -0,0 +1,77 @@ +loginAs() + ->get(route('items.index')) + ->assertStatus(200) + ->assertSee('Items'); + } + + public function testItShouldBeShowCreateItemPage() + { + $this + ->loginAs() + ->get(route('items.create')) + ->assertStatus(200) + ->assertSee('New Item'); + } + + public function testItShouldStoreAnItem() + { + $picture = UploadedFile::fake()->create('image.jpg'); + + $item = [ + 'name' => $this->faker->title, + 'sku' => $this->faker->languageCode, + 'picture' => $picture, + 'description' => $this->faker->text(100), + 'purchase_price' => $this->faker->randomFloat(2,10,20), + 'sale_price' => $this->faker->randomFloat(2,10,20), + 'quantity' => $this->faker->randomNumber(2), + 'category_id' => $this->company->categories()->first()->id, + 'tax_id' => $this->company->taxes()->first()->id, + 'enabled' => $this->faker->boolean ? 1 : 0 + ]; + + $this + ->loginAs() + ->post(route('items.store'), $item) + ->assertStatus(302) + ->assertRedirect(route('items.index')); + $this->assertFlashLevel('success'); + } + + public function testItShouldEditItem() + { + $item = factory(Item::class)->create(); + + $this + ->loginAs() + ->get(route('items.edit', ['item' => $item])) + ->assertStatus(200) + ->assertSee($item->name); + } + + public function testItShouldDeleteItem() + { + $item = factory(Item::class)->create(); + + $this + ->loginAs() + ->delete(route('items.destroy', ['item' => $item])) + ->assertStatus(302) + ->assertRedirect(route('items.index')); + + $this->assertFlashLevel('success'); + } +} \ No newline at end of file diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php new file mode 100755 index 0000000..5fd074d --- /dev/null +++ b/tests/Feature/ExampleTest.php @@ -0,0 +1,23 @@ +actingAs(User::first()) + ->get('/'); + + $response->assertStatus(200); + } +} diff --git a/tests/Feature/FeatureTestCase.php b/tests/Feature/FeatureTestCase.php new file mode 100755 index 0000000..925dd38 --- /dev/null +++ b/tests/Feature/FeatureTestCase.php @@ -0,0 +1,64 @@ +faker = Factory::create(); + $this->user = User::first(); + $this->company = $this->user->first()->companies()->first(); + } + + /** + * Empty for default user. + * + * @param User|null $user + * @param Company|null $company + * @return FeatureTestCase + */ + public function loginAs(User $user = null, Company $company = null) + { + if(!$user) $user = $this->user; + if(!$company) $company = $user->companies()->first(); + $this->startSession(); + return $this->actingAs($user) + ->withSession(['company_id' => $company->id]); + } + + public function assertFlashLevel($excepted) + { + $flash["level"] = null; + if($flashMessage = session('flash_notification')) + { + $flash = $flashMessage->first(); + } + + $this->assertEquals($excepted, $flash['level']); + } +} \ No newline at end of file diff --git a/tests/Feature/Incomes/CustomersTest.php b/tests/Feature/Incomes/CustomersTest.php new file mode 100755 index 0000000..b8dd1d5 --- /dev/null +++ b/tests/Feature/Incomes/CustomersTest.php @@ -0,0 +1,127 @@ +getCustomerData(); + $this->loginAs() + ->post(route("customers.store"), $customer) + ->assertStatus(302) + ->assertRedirect(route("customers.index")); + $this->assertFlashLevel("success"); + } + + public function testItShouldCreateCustomerWithUser() + { + $customerWithUser = $this->getCustomerDataWithUser(); + + $this->loginAs() + ->post(route("customers.store"), $customerWithUser) + ->assertStatus(302) + ->assertRedirect(route("customers.index")); + $this->assertFlashLevel("success"); + + $user = User::where("email", $customerWithUser["email"])->first(); + $this->assertNotNull($user); + $this->assertEquals($customerWithUser["email"], $user->email); + } + + public function testItShouldNotCreateCustomerWithExistsUser() + { + $customerWithUser = $this->getCustomerDataWithUser(); + User::create($customerWithUser); + + $this->loginAs() + ->post(route('customers.store'), $customerWithUser) + ->assertSessionHasErrors(['email']); + } + + public function testItShouldBeSeeTheCustomersPage() + { + $customer = Customer::create($this->getCustomerData()); + $this + ->loginAs() + ->get(route('customers.index')) + ->assertStatus(200) + ->assertSee($customer->email); + } + + public function testItShouldBeSeeTheEditCustomersPage() + { + $customer = Customer::create($this->getCustomerData()); + $this + ->loginAs() + ->get(route('customers.edit', ['customer' => $customer->id])) + ->assertStatus(200) + ->assertSee($customer->email) + ->assertSee($customer->name); + } + + public function testItShouldUpdateTheCustomer() + { + $customerData = $this->getCustomerData(); + $customer = Customer::create($customerData); + $customerData["name"] = $this->faker->name; + + $this + ->loginAs() + ->patch(route('customers.update', $customer->id), $customerData) + ->assertStatus(302) + ->assertRedirect(route('customers.index')); + $this->assertFlashLevel('success'); + } + + public function testItShouldDeleteTheCustomer() + { + $customer = Customer::create($this->getCustomerData()); + + $this->loginAs() + ->delete(route('customers.destroy', $customer->id)) + ->assertStatus(302) + ->assertRedirect(route('customers.index')); + + $this->assertFlashLevel('success'); + + } + + public function testItShouldNotDeleteIfItHaveRelations() + { + $this->assertTrue(true); + //TODO : This will write after done invoice and revenues tests. + } + + // Helpers + private function getCustomerData() + { + return [ + 'company_id' => $this->company->id, + 'name' => $this->faker->name, + 'email' => $this->faker->email, + 'tax_number' => $this->faker->buildingNumber, + 'phone' => $this->faker->phoneNumber, + 'address' => $this->faker->streetAddress, + 'website' => 'www.akaunting.com', + 'currency_code' => $this->company->currencies()->first()->code, + 'enabled' => $this->faker->boolean ? 1 : 0 + ]; + } + + private function getCustomerDataWithUser() + { + $password = $this->faker->password; + + return $this->getCustomerData() + [ + 'create_user' => 1, + 'locale' => 'en-GB', + 'password' => $password, + 'password_confirmation' => $password + ]; + } +} \ No newline at end of file diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100755 index 0000000..63c8944 --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,20 @@ + '\Database\Seeds\TestCompany', '--force' => true]); + Artisan::call('company:seed',['company' => 1]); + } +} diff --git a/tests/Unit/ExampleTest.php b/tests/Unit/ExampleTest.php new file mode 100755 index 0000000..8b7026f --- /dev/null +++ b/tests/Unit/ExampleTest.php @@ -0,0 +1,20 @@ +assertTrue(true); + } +} diff --git a/web.config b/web.config new file mode 100755 index 0000000..624c176 --- /dev/null +++ b/web.config @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + -- libgit2 0.21.4