Merge branch 'develop'

This commit is contained in:
Alex Tselegidis 2020-10-20 16:07:11 +03:00
commit 39b236345e
1220 changed files with 86203 additions and 234956 deletions

View file

@ -7,5 +7,4 @@ indent_style = space
indent_size = 4
[{package.json,.travis.yml}]
indent_style = space
indent_size = 2

19
.env
View file

@ -1,19 +0,0 @@
DB_USERNAME=easyapp
DB_NAME=easyapp
# before deploying to production change to harder password, and don't commit it to git
DB_PASSWORD=veryhardpassword
# change to your installation address
APP_URL=localhost
APP_HOST=0.0.0.0
APP_PORT=80
# email settings - set to 'smtp' and provide SMTP settings if you want to send emails
EMAIL_PROTOCOL=mail
SMTP_HOST=smtp.gmail.com
SMTP_USER=user
SMTP_PASS=password
SMTP_CRYPTO=ssl
SMTP_PORT=25

1
.gitattributes vendored Normal file
View file

@ -0,0 +1 @@
* text=auto

58
.github/CODE_OF_CONDUCT.md vendored Normal file
View file

@ -0,0 +1,58 @@
# Code of Conduct
### Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making
participation in our project and our community a harassment-free experience for everyone, regardless of age, body size,
disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race,
religion, or sexual identity and orientation.
### Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language.
* Being respectful of differing viewpoints and experiences.
* Gracefully accepting constructive criticism.
* Focusing on what is best for the community.
* Showing empathy towards other community members.
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances.
* Trolling, insulting/derogatory comments, and personal or political attacks.
* Public or private harassment.
* Publishing others' private information, such as a physical or electronic address, without explicit permission.
* Other conduct which could reasonably be considered inappropriate in a professional setting.
### Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take
appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits,
issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any
contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
### Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the
project or its community. Examples of representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed representative at an online or offline
event. Representation of a project may be further defined and clarified by project maintainers.
### Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project owner at
[alextselegidis@gmail.com](alextselegidis@gmail.com). All complaints will be reviewed and investigated and will result
in a response that is deemed necessary and appropriate to the circumstances. The project owner is obligated to maintain
confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be
posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent
repercussions as determined by other members of the project's leadership.
### Attribution
This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.4,
available at http://contributor-covenant.org/version/1/4.

17
.github/CONTRIBUTING.md vendored Normal file
View file

@ -0,0 +1,17 @@
# Contributing
When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other
method with the owner of this repository before making a change.
Please note we have a code of conduct, please follow it in all your interactions with the project.
## Pull Request Process
1. Ensure any install or build dependencies are removed before the end of the layer when doing a build.
2. Ensure that your changes comply with the project's coding guidelines and that it's sufficiently documented.
3. Update the README.md with details of changes to the interface, this includes new environment variables, exposed
ports, useful file locations and container parameters.
4. Target the develop branch for your Pull Requests as this is were new changes are introduced.
4. After being successfully reviewed pull requests will be merged to develop branch and will finally be included in an
upcoming release.

37
.gitignore vendored
View file

@ -1,21 +1,28 @@
/*.zip
/.idea/
/.tmp-package/
/doc/apigen/
/doc/jsdoc/
/doc/plato/
/build/
/docs/apigen/html
/docs/jsdoc/html
/docs/plato/html
/docker/mysql/*
!/docker/mysql/.gitkeep
/node_modules/
/npm-debug.log
/src/config.php
/src/storage/cache/*
!/src/storage/cache/.htaccess
!/src/storage/cache/index.html
/src/storage/logs/*
!/src/storage/logs/.htaccess
!/src/storage/logs/index.html
/src/storage/sessions/*
!/src/storage/sessions/.htaccess
!/src/storage/sessions/index.html
/src/storage/uploads/*
/!src/storage/uploads/index.html
/assets/js/**/*.min.js
/assets/css/**/*.min.css
/config.php
/storage/cache/*
!/storage/cache/.htaccess
!/storage/cache/index.html
/storage/logs/*
!/storage/logs/.htaccess
!/storage/logs/index.html
/storage/sessions/*
!/storage/sessions/.htaccess
!/storage/sessions/index.html
/storage/uploads/*
/!storage/uploads/index.html
/vendor/
/metafile
.DS_Store

View file

@ -6,9 +6,9 @@ developers to maintain and readjust their custom modifications on the main proje
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
## [1.3.2]
## [1.3.2] - 2018-07-29
## Fixed
### Fixed
- #480: Make the app GDPR - new EU privacy regulations compliant.
- #485: Make REST API search check with "q" parameter case insensitive.
@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- #510: Providers should not be able to create appointments for other providers in the backend calendar page.
- #512: Only show appointments of the currently logged in provider.
## [1.3.1]
## [1.3.1] - 2018-06-03
### Added
@ -25,11 +25,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- #441: Added time format selection
- #452: Provide more information when errors occur during the installation.
## Changed
### Changed
- #494: French translation corrections/improvements.
## Fixed
### Fixed
- #433: Selected date when editing an appointment
- #436: All days unavailable in agendaDay view
@ -45,7 +45,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- #495: Database migration fixes (from 1.2.1 to 1.3.x).
- #497: Backend settings are not being displayed on page load when the user is not an admin.
## [1.3.0]
## [1.3.0] - 2018-02-28
### Added

View file

@ -1,75 +0,0 @@
# Contributing
When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other
method with the owner of this repository before making a change.
Please note we have a code of conduct, please follow it in all your interactions with the project.
## Pull Request Process
1. Ensure any install or build dependencies are removed before the end of the layer when doing a build.
2. Ensure that your changes comply with the project's coding guidelines and that it's sufficiently documented.
3. Update the README.md with details of changes to the interface, this includes new environment variables, exposed
ports, useful file locations and container parameters.
4. Target the develop branch for your Pull Requests as this is were new changes are introduced.
4. After being successfully reviewed pull requests will be merged to develop branch and will finally be included in an
upcoming release.
## Code of Conduct
### Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making
participation in our project and our community a harassment-free experience for everyone, regardless of age, body size,
disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race,
religion, or sexual identity and orientation.
### Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language.
* Being respectful of differing viewpoints and experiences.
* Gracefully accepting constructive criticism.
* Focusing on what is best for the community.
* Showing empathy towards other community members.
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances.
* Trolling, insulting/derogatory comments, and personal or political attacks.
* Public or private harassment.
* Publishing others' private information, such as a physical or electronic address, without explicit permission.
* Other conduct which could reasonably be considered inappropriate in a professional setting.
### Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take
appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits,
issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any
contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
### Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the
project or its community. Examples of representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed representative at an online or offline
event. Representation of a project may be further defined and clarified by project maintainers.
### Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project owner at
[alextselegidis@gmail.com](alextselegidis@gmail.com). All complaints will be reviewed and investigated and will result
in a response that is deemed necessary and appropriate to the circumstances. The project owner is obligated to maintain
confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be
posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent
repercussions as determined by other members of the project's leadership.
### Attribution
This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.4,
available at http://contributor-covenant.org/version/1/4.

View file

@ -1,16 +0,0 @@
FROM php:7.0-apache
ENV PROJECT_DIR=/var/www/html \
APP_URL=localhost
RUN docker-php-ext-install mysqli gettext
COPY ./src $PROJECT_DIR
COPY docker-entrypoint.sh /entrypoint.sh
RUN sed -i 's/\r//' /entrypoint.sh
VOLUME $PROJECT_DIR/storage
ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
CMD ["run"]

135
README.md
View file

@ -1,79 +1,108 @@
<h1 align="center">
<br>
<a href="https://easyappointments.org">
<img src="https://raw.githubusercontent.com/alextselegidis/easyappointments/develop/docs/images/logo.png" alt="Easy!Appointments" width="150">
</a>
<br>
Easy!Appointments
================
<br>
</h1>
<img src="http://easyappointments.org/img/easyappointments-banner.png">
<br>
### Organize your business! Exploit human resources that can be used in other tasks more efficiently.
<h4 align="center">
A powerful Open Source Web Scheduler that can be installed on your server.
</h4>
**Easy!Appointments** is a highly customizable web application that allows your customers to book
appointments with you via the web. Moreover, it provides the ability to sync your data with
Google Calendar so you can use them with other services. It is an open source project and you
can download and install it **even for commercial use**. Easy!Appointments will run smoothly with
your existing website, because it can be installed in a single folder of the server and of course,
both sites can share the same database.
<p align="center">
<img alt="GitHub" src="https://img.shields.io/github/license/alextselegidis/easyappointments?style=for-the-badge">
<img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/alextselegidis/easyappointments?style=for-the-badge">
<img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/alextselegidis/easyappointments/total?style=for-the-badge">
</p>
### Features
<p align="center">
<a href="#about">About</a>
<a href="#features">Features</a>
<a href="#setup">Setup</a>
<a href="#installation">Installation</a>
<a href="#license">License</a>
</p>
The project was designed to be flexible and reliable so as to be able to meet the needs of any
kind of enterprise. You can read the main features of the system below:
![screenshot](screenshot.png)
* Full customers and appointments management.
* Services and service providers organization.
* Workflow and booking rules.
## About
**Easy!Appointments** is a highly customizable web application that allows customers to book appointments with you
via a sophisticated web interface. Moreover, it provides the ability to sync your data with Google Calendar so you can
use them with other services. It is an open source project that you can download and install **even for commercial use**.
Easy!Appointments will run smoothly with your existing website as it can be installed in a single folder of the
server and of course share an existing database.
## Features
The application is designed to be flexible enough so that it can handle any enterprise work flow.
* Customers and appointments management.
* Services and providers organization.
* Working plan and booking rules.
* Google Calendar synchronization.
* Email notifications system.
* Standalone installation (like WordPress, Drupal, Joomla and other web systems).
* Self hosted installation.
* Translated user interface.
* User community support.
### Installation
## Setup
Since Easy!Appointments is a web application, it runs on a web server and thus you will need to
perform the following steps in order to install the system on your server:
To clone and run this application, you'll need [Git](https://git-scm.com), [Node.js](https://nodejs.org/en/download/) (which comes with [npm](http://npmjs.com)) and [Composer](https://getcomposer.org) installed on your computer. From your command line:
```bash
# Clone this repository
$ git clone https://github.com/alextselegidis/easyappointments.git
# Go into the repository
$ cd easyappointments
# Install dependencies
$ npm install && composer install
# Start the file watcher
$ npm start
```
Note: If you're using Linux Bash for Windows, [see this guide](https://www.howtogeek.com/261575/how-to-run-graphical-linux-desktop-applications-from-windows-10s-bash-shell/) or use `node` from the command prompt.
You can build the files by running `npm run build`. This command will bundle everything to a `build` directory.
## Installation
You will need to perform the following steps to install the application on your server:
* Make sure that your server has Apache/Nginx, PHP and MySQL installed.
* Create a new database (or use an existing).
* Create a new database (or use an existing one).
* Copy the "easyappointments" source folder on your server.
* Make sure that the "storage" directory is writable.
* Rename the "config-sample.php" file to "config.php" and set your server properties.
* Open your browser on the Easy!Appointments URL and follow the installation guide.
* That's it! You can now use Easy!Appointments at your will.
* Rename the "config-sample.php" file to "config.php" and update its contents based on your environment.
* Open the browser on the Easy!Appointments URL and follow the installation guide.
You will find the latest release at [easyappointments.org](http://easyappointments.org).
If you have problems installing or configuring the application take a look on the
[wiki pages](https://github.com/alextselegidis/easyappointments/wiki) or visit the
That's it! You can now use Easy!Appointments at your will.
You will find the latest release at [easyappointments.org](https://easyappointments.org).
If you have problems installing or configuring the application visit the
[official support group](https://groups.google.com/forum/#!forum/easy-appointments).
You can also report problems on the [issues page](https://github.com/alextselegidis/easyappointments/issues)
and help the development progress.
### Docker
To start Easy!Appointments using Docker in development configuration, with source files mounted into container, run:
```
docker-compose up
```
## License
Production deployment can be made by changing required values in .env file (DB_PASSWORD, APP_URL, APP_PORT) and running:
```
docker-compose -f docker-compose.prod.yml up -d
```
Code Licensed Under [GPL v3.0](https://www.gnu.org/licenses/gpl-3.0.en.html) | Content Under [CC BY 3.0](https://creativecommons.org/licenses/by/3.0/)
Database data will be stored in named volume `easyappointments_easy-appointments-data`, and app storage (logs, cache, uploads) in `easyappointments_easy-appointments-storage`.
To find where exactly they are stored, you can run
```
docker volume inspect easyappointments_easy-appointments-storage
```
---
Production containers will automatically be restarted in case of crash / server reboot. For more info, take a look into `docker-compose.prod.yml` file.
Website [alextselegidis.com](https://alextselegidis.com) &nbsp;&middot;&nbsp;
GitHub [alextselegidis](https://github.com/alextselegidis) &nbsp;&middot;&nbsp;
Twitter [@alextselegidis](https://twitter.com/AlexTselegidis)
### User Feedback
Whether it is new ideas or defects, your feedback is highly appreciated and will be taken into
consideration for the following releases of the project. Share your experience and discuss your
thoughts with other users through communities. Create issues with suggestions on new features or
bug reports.
### Translate Easy!Appointments
As of version 1.0 Easy!Appointments supports translated user interface. If you want to contribute to the
translation process read the [get involved](https://github.com/alextselegidis/easyappointments/blob/master/doc/get-involved.md)
page for additional information.
###### More Projects On Github
###### ⇾ [Plainpad &middot; Self Hosted Note Taking App](https://github.com/alextselegidis/plainpad)
###### ⇾ [Questionful &middot; Web Questionnaires Made Easy](https://github.com/alextselegidis/questionful)
###### ⇾ [Integravy &middot; Service Orchestration At Your Fingertips](https://github.com/alextselegidis/integravy)

View file

@ -0,0 +1,117 @@
<?php defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| AUTO-LOADER
| -------------------------------------------------------------------
| This file specifies which systems should be loaded by default.
|
| In order to keep the framework as light-weight as possible only the
| absolute minimal resources are loaded by default. For example,
| the database is not connected to automatically since no assumption
| is made regarding whether you intend to use it. This file lets
| you globally define which systems you would like loaded with every
| request.
|
| -------------------------------------------------------------------
| Instructions
| -------------------------------------------------------------------
|
| These are the things you can load automatically:
|
| 1. Packages
| 2. Libraries
| 3. Helper files
| 4. Custom config files
| 5. Language files
| 6. Models
|
*/
/*
| -------------------------------------------------------------------
| Auto-load Packges
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['packages'] = array(APPPATH.'third_party', '/usr/local/shared');
|
*/
$autoload['packages'] = [];
/*
| -------------------------------------------------------------------
| Auto-load Libraries
| -------------------------------------------------------------------
| These are the classes located in the system/libraries folder
| or in your application/libraries folder.
|
| Prototype:
|
| $autoload['libraries'] = array('database', 'session', 'xmlrpc');
*/
$autoload['libraries'] = ['database'];
/*
| -------------------------------------------------------------------
| Auto-load Helper Files
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['helper'] = array('url', 'file');
*/
$autoload['helper'] = ['custom_exceptions', 'url', 'file', 'language', 'asset', 'config', 'render'];
/*
| -------------------------------------------------------------------
| Auto-load Config files
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['config'] = array('config1', 'config2');
|
| NOTE: This item is intended for use ONLY if you have created custom
| config files. Otherwise, leave it blank.
|
*/
$autoload['config'] = ['google', 'email'];
/*
| -------------------------------------------------------------------
| Auto-load Language files
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['language'] = array('lang1', 'lang2');
|
| NOTE: Do not include the "_lang" part of your file. For example
| "codeigniter_lang.php" would be referenced as array('codeigniter');
|
*/
$autoload['language'] = [];
/*
| -------------------------------------------------------------------
| Auto-load Models
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['model'] = array('model1', 'model2');
|
*/
$autoload['model'] = [];
/* End of file autoload.php */
/* Location: ./application/config/autoload.php */

View file

@ -0,0 +1,450 @@
<?php defined('BASEPATH') OR exit('No direct script access allowed');
/*
|--------------------------------------------------------------------------
| Easy!Appointments - Internal Configuration
|--------------------------------------------------------------------------
|
| Declare some of the global config values of Easy!Appointments.
|
*/
$config['version'] = '1.4.0'; // This must be changed manually.
$config['release_label'] = 'Dev'; // Leave empty for no title or add Alpha, Beta etc ...
$config['debug'] = Config::DEBUG_MODE;
/*
|--------------------------------------------------------------------------
| Base Site URL
|--------------------------------------------------------------------------
|
| URL to your CodeIgniter root. Typically this will be your base URL,
| WITH a trailing slash:
|
| http://example.com/
|
| If this is not set then CodeIgniter will guess the protocol, domain and
| path to your installation.
|
*/
$config['base_url'] = Config::BASE_URL;
/*
|--------------------------------------------------------------------------
| Index File
|--------------------------------------------------------------------------
|
| Typically this will be your index.php file, unless you've renamed it to
| something else. If you are using mod_rewrite to remove the page set this
| variable so that it is blank.
|
*/
$config['index_page'] = 'index.php';
/*
|--------------------------------------------------------------------------
| URI PROTOCOL
|--------------------------------------------------------------------------
|
| This item determines which server global should be used to retrieve the
| URI string. The default setting of 'AUTO' works for most servers.
| If your links do not seem to work, try one of the other delicious flavors:
|
| 'AUTO' Default - auto detects
| 'PATH_INFO' Uses the PATH_INFO
| 'QUERY_STRING' Uses the QUERY_STRING
| 'REQUEST_URI' Uses the REQUEST_URI
| 'ORIG_PATH_INFO' Uses the ORIG_PATH_INFO
|
*/
$config['uri_protocol'] = 'AUTO';
/*
|--------------------------------------------------------------------------
| URL suffix
|--------------------------------------------------------------------------
|
| This option allows you to add a suffix to all URLs generated by CodeIgniter.
| For more information please see the user guide:
|
| http://codeigniter.com/user_guide/general/urls.html
*/
$config['url_suffix'] = '';
/*
|--------------------------------------------------------------------------
| Default Language
|--------------------------------------------------------------------------
|
| This determines which set of language files should be used. Make sure
| there is an available translation if you intend to use something other
| than english.
|
*/
$config['language'] = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ?
[
'ar' => 'arabic',
'bu' => 'bulgarian',
'zh' => 'chinese',
'da' => 'danish',
'nl' => 'dutch',
'en' => 'english',
'fi' => 'finnish',
'fr' => 'french',
'de' => 'german',
'el' => 'greek',
'hi' => 'hindi',
'hu' => 'hungarian',
'it' => 'italian',
'ja' => 'japanese',
'pl' => 'polish',
'pt' => 'portuguese',
'ro' => 'romanian',
'ru' => 'russian',
'sk' => 'slovak',
'es' => 'spanish',
'tr' => 'turkish',
'sv' => 'swedish'
][substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2)]
: Config::LANGUAGE;
/*
|--------------------------------------------------------------------------
| Available Languages
|--------------------------------------------------------------------------
|
| Each item of this array must be a directory with the translation files in
| the /application/language directory. The users will be able to select one
| of these languages.
|
*/
$config['available_languages'] = [
'arabic',
'bulgarian',
'catalan',
'chinese',
'czech',
'danish',
'dutch',
'english',
'finnish',
'french',
'german',
'greek',
'hindi',
'hungarian',
'italian',
'japanese',
'marathi',
'luxembourgish',
'polish',
'portuguese',
'portuguese-br',
'romanian',
'russian',
'slovak',
'spanish',
'turkish'
];
/*
|--------------------------------------------------------------------------
| Default Character Set
|--------------------------------------------------------------------------
|
| This determines which character set is used by default in various methods
| that require a character set to be provided.
|
*/
$config['charset'] = 'UTF-8';
/*
|--------------------------------------------------------------------------
| Enable/Disable System Hooks
|--------------------------------------------------------------------------
|
| If you would like to use the 'hooks' feature you must enable it by
| setting this variable to TRUE (boolean). See the user guide for details.
|
*/
$config['enable_hooks'] = TRUE;
/*
|--------------------------------------------------------------------------
| Class Extension Prefix
|--------------------------------------------------------------------------
|
| This item allows you to set the filename/classname prefix when extending
| native libraries. For more information please see the user guide:
|
| http://codeigniter.com/user_guide/general/core_classes.html
| http://codeigniter.com/user_guide/general/creating_libraries.html
|
*/
$config['subclass_prefix'] = 'MY_';
/*
|--------------------------------------------------------------------------
| Allowed URL Characters
|--------------------------------------------------------------------------
|
| This lets you specify with a regular expression which characters are permitted
| within your URLs. When someone tries to submit a URL with disallowed
| characters they will get a warning message.
|
| As a security measure you are STRONGLY encouraged to restrict URLs to
| as few characters as possible. By default only these are allowed: a-z 0-9~%.:_-
|
| Leave blank to allow all characters -- but only if you are insane.
|
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
|
*/
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
/*
|--------------------------------------------------------------------------
| Enable Query Strings
|--------------------------------------------------------------------------
|
| By default CodeIgniter uses search-engine friendly segment based URLs:
| example.com/who/what/where/
|
| By default CodeIgniter enables access to the $_GET array. If for some
| reason you would like to disable it, set 'allow_get_array' to FALSE.
|
| You can optionally enable standard query string based URLs:
| example.com?who=me&what=something&where=here
|
| Options are: TRUE or FALSE (boolean)
|
| The other items let you set the query string 'words' that will
| invoke your controllers and its functions:
| example.com/index.php?c=controller&m=function
|
| Please note that some of the helpers won't work as expected when
| this feature is enabled, since CodeIgniter is designed primarily to
| use segment based URLs.
|
*/
$config['allow_get_array'] = TRUE;
$config['enable_query_strings'] = FALSE;
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';
$config['directory_trigger'] = 'd'; // experimental not currently in use
/*
|--------------------------------------------------------------------------
| Error Logging Threshold
|--------------------------------------------------------------------------
|
| If you have enabled error logging, you can set an error threshold to
| determine what gets logged. Threshold options are:
| You can enable error logging by setting a threshold over zero. The
| threshold determines what gets logged. Threshold options are:
|
| 0 = Disables logging, Error logging TURNED OFF
| 1 = Error Messages (including PHP errors)
| 2 = Debug Messages
| 3 = Informational Messages
| 4 = All Messages
|
| For a live site you'll usually only enable Errors (1) to be logged otherwise
| your log files will fill up very fast.
|
*/
$config['log_threshold'] = 1;
/*
|--------------------------------------------------------------------------
| Error Logging Directory Path
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| application/logs/ folder. Use a full server path with trailing slash.
|
*/
$config['log_path'] = __DIR__ . '/../../storage/logs/';
/*
|--------------------------------------------------------------------------
| Date Format for Logs
|--------------------------------------------------------------------------
|
| Each item that is logged has an associated date. You can use PHP date
| codes to set your own date formatting
|
*/
$config['log_date_format'] = 'Y-m-d H:i:s';
/*
|--------------------------------------------------------------------------
| Cache Directory Path
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| system/cache/ folder. Use a full server path with trailing slash.
|
*/
$config['cache_path'] = __DIR__ . '/../../storage/cache/';
/*
|--------------------------------------------------------------------------
| Cache Busting Token
|--------------------------------------------------------------------------
|
| This token will be appending to asset URLs in order to invalidate the browser
| cache and enforce end clients to fetch new files. Update the token with each
| new release.
|
*/
$config['cache_busting_token'] = '93GX4';
/*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| If you use the Encryption class or the Session class you
| MUST set an encryption key. See the user guide for info.
|
*/
$config['encryption_key'] = Config::BASE_URL;
/*
|--------------------------------------------------------------------------
| Session Variables
|--------------------------------------------------------------------------
|
| 'sess_cookie_name' = the name you want for the cookie
| 'sess_expiration' = the number of SECONDS you want the session to last.
| by default sessions last 7200 seconds (two hours). Set to zero for no expiration.
| 'sess_expire_on_close' = Whether to cause the session to expire automatically
| when the browser window is closed
| 'sess_encrypt_cookie' = Whether to encrypt the cookie
| 'sess_use_database' = Whether to save the session data to a database
| 'sess_table_name' = The name of the session database table
| 'sess_match_ip' = Whether to match the user's IP address when reading the session data
| 'sess_match_useragent' = Whether to match the User Agent when reading the session data
| 'sess_time_to_update' = how many seconds between CI refreshing Session Information
|
*/
$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ea_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = __DIR__ . '/../../storage/sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
/*
|--------------------------------------------------------------------------
| Cookie Related Variables
|--------------------------------------------------------------------------
|
| 'cookie_prefix' = Set a prefix if you need to avoid collisions
| 'cookie_domain' = Set to .your-domain.com for site-wide cookies
| 'cookie_path' = Typically will be a forward slash
| 'cookie_secure' = Cookies will only be set if a secure HTTPS connection exists.
|
*/
$config['cookie_prefix'] = "";
$config['cookie_domain'] = "";
$config['cookie_path'] = "/";
$config['cookie_secure'] = FALSE;
/*
|--------------------------------------------------------------------------
| Global XSS Filtering
|--------------------------------------------------------------------------
|
| Determines whether the XSS filter is always active when GET, POST or
| COOKIE data is encountered
|
*/
$config['global_xss_filtering'] = TRUE;
/*
|--------------------------------------------------------------------------
| Cross Site Request Forgery
|--------------------------------------------------------------------------
| Enables a CSRF cookie token to be set. When set to TRUE, token will be
| checked on a submitted form. If you are accepting user data, it is strongly
| recommended CSRF protection be enabled.
|
| 'csrf_token_name' = The token name
| 'csrf_cookie_name' = The cookie name
| 'csrf_expire' = The number in seconds the token should expire.
*/
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrfToken';
$config['csrf_cookie_name'] = 'csrfCookie';
$config['csrf_expire'] = 7200;
$config['csrf_exclude_uris'] = ['api/v1/.*'];
/*
|--------------------------------------------------------------------------
| Output Compression
|--------------------------------------------------------------------------
|
| Enables Gzip output compression for faster page loads. When enabled,
| the output class will test whether your server supports Gzip.
| Even if it does, however, not all browsers support compression
| so enable only if you are reasonably sure your visitors can handle it.
|
| VERY IMPORTANT: If you are getting a blank page when compression is enabled it
| means you are prematurely outputting something to your browser. It could
| even be a line of whitespace at the end of one of your scripts. For
| compression to work, nothing can be sent before the output buffer is called
| by the output class. Do not 'echo' any values with compression enabled.
|
*/
$config['compress_output'] = FALSE;
/*
|--------------------------------------------------------------------------
| Master Time Reference
|--------------------------------------------------------------------------
|
| Options are 'local' or 'gmt'. This pref tells the system whether to use
| your server's local time as the master 'now' reference, or convert it to
| GMT. See the 'date helper' page of the user guide for information
| regarding date handling.
|
*/
$config['time_reference'] = 'local';
/*
|--------------------------------------------------------------------------
| Rewrite PHP Short Tags
|--------------------------------------------------------------------------
|
| If your PHP installation does not have short tag support enabled CI
| can rewrite the tags on-the-fly, enabling you to utilize that syntax
| in your view files. Options are TRUE or FALSE (boolean)
|
*/
$config['rewrite_short_tags'] = FALSE;
/*
|--------------------------------------------------------------------------
| Reverse Proxy IPs
|--------------------------------------------------------------------------
|
| If your server is behind a reverse proxy, you must whitelist the proxy IP
| addresses from which CodeIgniter should trust the HTTP_X_FORWARDED_FOR
| header in order to properly identify the visitor's IP address.
| Comma-delimited, e.g. '10.0.1.200,10.0.1.201'
|
*/
$config['proxy_ips'] = '';
/* End of file config.php */
/* Location: ./application/config/config.php */

View file

@ -0,0 +1,93 @@
<?php defined('BASEPATH') OR exit('No direct script access allowed');
/*
|--------------------------------------------------------------------------
| File and Directory Modes
|--------------------------------------------------------------------------
|
| These prefs are used when checking and setting modes when working
| with the file system. The defaults are fine on servers with proper
| security, but you may wish (or even need) to change the values in
| certain environments (Apache running a separate process for each
| user, PHP under CGI with Apache suEXEC, etc.). Octal values should
| always be used to set the mode correctly.
|
*/
define('FILE_READ_MODE', 0644);
define('FILE_WRITE_MODE', 0666);
define('DIR_READ_MODE', 0755);
define('DIR_WRITE_MODE', 0777);
/*
|--------------------------------------------------------------------------
| File Stream Modes
|--------------------------------------------------------------------------
|
| These modes are used when working with fopen()/popen()
|
*/
define('FOPEN_READ', 'rb');
define('FOPEN_READ_WRITE', 'r+b');
define('FOPEN_WRITE_CREATE_DESTRUCTIVE', 'wb'); // truncates existing file data, use with care
define('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE', 'w+b'); // truncates existing file data, use with care
define('FOPEN_WRITE_CREATE', 'ab');
define('FOPEN_READ_WRITE_CREATE', 'a+b');
define('FOPEN_WRITE_CREATE_STRICT', 'xb');
define('FOPEN_READ_WRITE_CREATE_STRICT', 'x+b');
/*
|--------------------------------------------------------------------------
| Application Data
|--------------------------------------------------------------------------
|
| These constants are used globally from the application when handling data.
|
*/
define('DB_SLUG_CUSTOMER', 'customer');
define('DB_SLUG_PROVIDER', 'provider');
define('DB_SLUG_ADMIN', 'admin');
define('DB_SLUG_SECRETARY', 'secretary');
define('FILTER_TYPE_PROVIDER', 'provider');
define('FILTER_TYPE_SERVICE', 'service');
define('AJAX_SUCCESS', 'SUCCESS');
define('AJAX_FAILURE', 'FAILURE');
define('SETTINGS_SYSTEM', 'SETTINGS_SYSTEM');
define('SETTINGS_USER', 'SETTINGS_USER');
define('PRIV_VIEW', 1);
define('PRIV_ADD', 2);
define('PRIV_EDIT', 4);
define('PRIV_DELETE', 8);
define('PRIV_APPOINTMENTS', 'appointments');
define('PRIV_CUSTOMERS', 'customers');
define('PRIV_SERVICES', 'services');
define('PRIV_USERS', 'users');
define('PRIV_SYSTEM_SETTINGS', 'system_settings');
define('PRIV_USER_SETTINGS', 'user_settings');
define('DATE_FORMAT_DMY', 'DMY');
define('DATE_FORMAT_MDY', 'MDY');
define('DATE_FORMAT_YMD', 'YMD');
define('TIME_FORMAT_REGULAR', 'regular');
define('TIME_FORMAT_MILITARY', 'military');
define('MIN_PASSWORD_LENGTH', 7);
define('ANY_PROVIDER', 'any-provider');
define('CALENDAR_VIEW_DEFAULT', 'default');
define('CALENDAR_VIEW_TABLE', 'table');
define('AVAILABILITIES_TYPE_FLEXIBLE', 'flexible');
define('AVAILABILITIES_TYPE_FIXED', 'fixed');
define('EVENT_MINIMUM_DURATION', 5); // Minutes
/* End of file constants.php */
/* Location: ./application/config/constants.php */

View file

@ -0,0 +1,70 @@
<?php defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| DATABASE CONNECTIVITY SETTINGS
| -------------------------------------------------------------------
| This file will contain the settings needed to access your database.
|
| For complete instructions please consult the 'Database Connection'
| page of the User Guide.
|
| -------------------------------------------------------------------
| EXPLANATION OF VARIABLES
| -------------------------------------------------------------------
|
| ['hostname'] The hostname of your database server.
| ['username'] The username used to connect to the database
| ['password'] The password used to connect to the database
| ['database'] The name of the database you want to connect to
| ['dbdriver'] The database type. ie: mysql. Currently supported:
mysql, mysqli, postgre, odbc, mssql, sqlite, oci8
| ['dbprefix'] You can add an optional prefix, which will be added
| to the table name when using the Active Record class
| ['pconnect'] TRUE/FALSE - Whether to use a persistent connection
| ['db_debug'] TRUE/FALSE - Whether database errors should be displayed.
| ['cache_on'] TRUE/FALSE - Enables/disables query caching
| ['cachedir'] The path to the folder where cache files should be stored
| ['char_set'] The character set used in communicating with the database
| ['dbcollat'] The character collation used in communicating with the database
| NOTE: For MySQL and MySQLi databases, this setting is only used
| as a backup if your server is running PHP < 5.2.3 or MySQL < 5.0.7
| (and in table creation queries made with DB Forge).
| There is an incompatibility in PHP with mysql_real_escape_string() which
| can make your site vulnerable to SQL injection if you are using a
| multi-byte character set and are running versions lower than these.
| Sites using Latin-1 or UTF-8 database character set and collation are unaffected.
| ['swap_pre'] A default table prefix that should be swapped with the dbprefix
| ['autoinit'] Whether or not to automatically initialize the database.
| ['stricton'] TRUE/FALSE - forces 'Strict Mode' connections
| - good for ensuring strict SQL while developing
|
| The $active_group variable lets you choose which connection group to
| make active. By default there is only one group (the 'default' group).
|
| The $active_record variables lets you determine whether or not to load
| the active record class
*/
$active_group = 'default';
$query_builder = TRUE;
$db['default']['hostname'] = Config::DB_HOST;
$db['default']['username'] = Config::DB_USERNAME;
$db['default']['password'] = Config::DB_PASSWORD;
$db['default']['database'] = Config::DB_NAME;
$db['default']['dbdriver'] = 'mysqli';
$db['default']['dbprefix'] = 'ea_';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
/* End of file database.php */
/* Location: ./application/config/database.php */

View file

@ -0,0 +1,17 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/*
|--------------------------------------------------------------------------
| Google Calendar - Internal Configuration
|--------------------------------------------------------------------------
|
| Declare some of the global config values of the Google Calendar
| synchronization feature.
|
*/
$config['google_sync_feature'] = Config::GOOGLE_SYNC_FEATURE;
$config['google_product_name'] = Config::GOOGLE_PRODUCT_NAME;
$config['google_client_id'] = Config::GOOGLE_CLIENT_ID;
$config['google_client_secret'] = Config::GOOGLE_CLIENT_SECRET;
$config['google_api_key'] = Config::GOOGLE_API_KEY;

View file

@ -0,0 +1,41 @@
<?php defined('BASEPATH') OR exit('No direct script access allowed');
/*
|--------------------------------------------------------------------------
| Enable/Disable Migrations
|--------------------------------------------------------------------------
|
| Migrations are disabled by default but should be enabled
| whenever you intend to do a schema migration.
|
*/
$config['migration_enabled'] = TRUE;
/*
|--------------------------------------------------------------------------
| Migrations version
|--------------------------------------------------------------------------
|
| This is used to set migration version that the file system should be on.
| If you run $this->migration->latest() this is the version that schema will
| be upgraded / downgraded to.
|
*/
$config['migration_version'] = 20;
/*
|--------------------------------------------------------------------------
| Migrations Path
|--------------------------------------------------------------------------
|
| Path to your migrations folder.
| Typically, it will be within your application path.
| Also, writing permission is required within the migrations path.
|
*/
$config['migration_path'] = APPPATH . 'migrations/';
/* End of file migration.php */
/* Location: ./application/config/migration.php */

View file

@ -0,0 +1,184 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| MIME TYPES
| -------------------------------------------------------------------
| This file contains an array of mime types. It is used by the
| Upload class to help identify allowed file types.
|
*/
return array(
'hqx' => array('application/mac-binhex40', 'application/mac-binhex', 'application/x-binhex40', 'application/x-mac-binhex40'),
'cpt' => 'application/mac-compactpro',
'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain'),
'bin' => array('application/macbinary', 'application/mac-binary', 'application/octet-stream', 'application/x-binary', 'application/x-macbinary'),
'dms' => 'application/octet-stream',
'lha' => 'application/octet-stream',
'lzh' => 'application/octet-stream',
'exe' => array('application/octet-stream', 'application/x-msdownload'),
'class' => 'application/octet-stream',
'psd' => array('application/x-photoshop', 'image/vnd.adobe.photoshop'),
'so' => 'application/octet-stream',
'sea' => 'application/octet-stream',
'dll' => 'application/octet-stream',
'oda' => 'application/oda',
'pdf' => array('application/pdf', 'application/force-download', 'application/x-download', 'binary/octet-stream'),
'ai' => array('application/pdf', 'application/postscript'),
'eps' => 'application/postscript',
'ps' => 'application/postscript',
'smi' => 'application/smil',
'smil' => 'application/smil',
'mif' => 'application/vnd.mif',
'xls' => array('application/vnd.ms-excel', 'application/msexcel', 'application/x-msexcel', 'application/x-ms-excel', 'application/x-excel', 'application/x-dos_ms_excel', 'application/xls', 'application/x-xls', 'application/excel', 'application/download', 'application/vnd.ms-office', 'application/msword'),
'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint', 'application/vnd.ms-office', 'application/msword'),
'pptx' => array('application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/x-zip', 'application/zip'),
'wbxml' => 'application/wbxml',
'wmlc' => 'application/wmlc',
'dcr' => 'application/x-director',
'dir' => 'application/x-director',
'dxr' => 'application/x-director',
'dvi' => 'application/x-dvi',
'gtar' => 'application/x-gtar',
'gz' => 'application/x-gzip',
'gzip' => 'application/x-gzip',
'php' => array('application/x-httpd-php', 'application/php', 'application/x-php', 'text/php', 'text/x-php', 'application/x-httpd-php-source'),
'php4' => 'application/x-httpd-php',
'php3' => 'application/x-httpd-php',
'phtml' => 'application/x-httpd-php',
'phps' => 'application/x-httpd-php-source',
'js' => array('application/x-javascript', 'text/plain'),
'swf' => 'application/x-shockwave-flash',
'sit' => 'application/x-stuffit',
'tar' => 'application/x-tar',
'tgz' => array('application/x-tar', 'application/x-gzip-compressed'),
'z' => 'application/x-compress',
'xhtml' => 'application/xhtml+xml',
'xht' => 'application/xhtml+xml',
'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed', 'application/s-compressed', 'multipart/x-zip'),
'rar' => array('application/x-rar', 'application/rar', 'application/x-rar-compressed'),
'mid' => 'audio/midi',
'midi' => 'audio/midi',
'mpga' => 'audio/mpeg',
'mp2' => 'audio/mpeg',
'mp3' => array('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'),
'aif' => array('audio/x-aiff', 'audio/aiff'),
'aiff' => array('audio/x-aiff', 'audio/aiff'),
'aifc' => 'audio/x-aiff',
'ram' => 'audio/x-pn-realaudio',
'rm' => 'audio/x-pn-realaudio',
'rpm' => 'audio/x-pn-realaudio-plugin',
'ra' => 'audio/x-realaudio',
'rv' => 'video/vnd.rn-realvideo',
'wav' => array('audio/x-wav', 'audio/wave', 'audio/wav'),
'bmp' => array('image/bmp', 'image/x-bmp', 'image/x-bitmap', 'image/x-xbitmap', 'image/x-win-bitmap', 'image/x-windows-bmp', 'image/ms-bmp', 'image/x-ms-bmp', 'application/bmp', 'application/x-bmp', 'application/x-win-bitmap'),
'gif' => 'image/gif',
'jpeg' => array('image/jpeg', 'image/pjpeg'),
'jpg' => array('image/jpeg', 'image/pjpeg'),
'jpe' => array('image/jpeg', 'image/pjpeg'),
'jp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'j2k' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'jpf' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'jpg2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'jpx' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'jpm' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'mj2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'mjp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'png' => array('image/png', 'image/x-png'),
'tiff' => 'image/tiff',
'tif' => 'image/tiff',
'css' => array('text/css', 'text/plain'),
'html' => array('text/html', 'text/plain'),
'htm' => array('text/html', 'text/plain'),
'shtml' => array('text/html', 'text/plain'),
'txt' => 'text/plain',
'text' => 'text/plain',
'log' => array('text/plain', 'text/x-log'),
'rtx' => 'text/richtext',
'rtf' => 'text/rtf',
'xml' => array('application/xml', 'text/xml', 'text/plain'),
'xsl' => array('application/xml', 'text/xsl', 'text/xml'),
'mpeg' => 'video/mpeg',
'mpg' => 'video/mpeg',
'mpe' => 'video/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
'avi' => array('video/x-msvideo', 'video/msvideo', 'video/avi', 'application/x-troff-msvideo'),
'movie' => 'video/x-sgi-movie',
'doc' => array('application/msword', 'application/vnd.ms-office'),
'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword', 'application/x-zip'),
'dot' => array('application/msword', 'application/vnd.ms-office'),
'dotx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword'),
'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip', 'application/vnd.ms-excel', 'application/msword', 'application/x-zip'),
'word' => array('application/msword', 'application/octet-stream'),
'xl' => 'application/excel',
'eml' => 'message/rfc822',
'json' => array('application/json', 'text/json'),
'pem' => array('application/x-x509-user-cert', 'application/x-pem-file', 'application/octet-stream'),
'p10' => array('application/x-pkcs10', 'application/pkcs10'),
'p12' => 'application/x-pkcs12',
'p7a' => 'application/x-pkcs7-signature',
'p7c' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'),
'p7m' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'),
'p7r' => 'application/x-pkcs7-certreqresp',
'p7s' => 'application/pkcs7-signature',
'crt' => array('application/x-x509-ca-cert', 'application/x-x509-user-cert', 'application/pkix-cert'),
'crl' => array('application/pkix-crl', 'application/pkcs-crl'),
'der' => 'application/x-x509-ca-cert',
'kdb' => 'application/octet-stream',
'pgp' => 'application/pgp',
'gpg' => 'application/gpg-keys',
'sst' => 'application/octet-stream',
'csr' => 'application/octet-stream',
'rsa' => 'application/x-pkcs7',
'cer' => array('application/pkix-cert', 'application/x-x509-ca-cert'),
'3g2' => 'video/3gpp2',
'3gp' => array('video/3gp', 'video/3gpp'),
'mp4' => 'video/mp4',
'm4a' => 'audio/x-m4a',
'f4v' => array('video/mp4', 'video/x-f4v'),
'flv' => 'video/x-flv',
'webm' => 'video/webm',
'aac' => 'audio/x-acc',
'm4u' => 'application/vnd.mpegurl',
'm3u' => 'text/plain',
'xspf' => 'application/xspf+xml',
'vlc' => 'application/videolan',
'wmv' => array('video/x-ms-wmv', 'video/x-ms-asf'),
'au' => 'audio/x-au',
'ac3' => 'audio/ac3',
'flac' => 'audio/x-flac',
'ogg' => array('audio/ogg', 'video/ogg', 'application/ogg'),
'kmz' => array('application/vnd.google-earth.kmz', 'application/zip', 'application/x-zip'),
'kml' => array('application/vnd.google-earth.kml+xml', 'application/xml', 'text/xml'),
'ics' => 'text/calendar',
'ical' => 'text/calendar',
'zsh' => 'text/x-scriptzsh',
'7z' => array('application/x-7z-compressed', 'application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'),
'7zip' => array('application/x-7z-compressed', 'application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'),
'cdr' => array('application/cdr', 'application/coreldraw', 'application/x-cdr', 'application/x-coreldraw', 'image/cdr', 'image/x-cdr', 'zz-application/zz-winassoc-cdr'),
'wma' => array('audio/x-ms-wma', 'video/x-ms-asf'),
'jar' => array('application/java-archive', 'application/x-java-application', 'application/x-jar', 'application/x-compressed'),
'svg' => array('image/svg+xml', 'application/xml', 'text/xml'),
'vcf' => 'text/x-vcard',
'srt' => array('text/srt', 'text/plain'),
'vtt' => array('text/vtt', 'text/plain'),
'ico' => array('image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon'),
'odc' => 'application/vnd.oasis.opendocument.chart',
'otc' => 'application/vnd.oasis.opendocument.chart-template',
'odf' => 'application/vnd.oasis.opendocument.formula',
'otf' => 'application/vnd.oasis.opendocument.formula-template',
'odg' => 'application/vnd.oasis.opendocument.graphics',
'otg' => 'application/vnd.oasis.opendocument.graphics-template',
'odi' => 'application/vnd.oasis.opendocument.image',
'oti' => 'application/vnd.oasis.opendocument.image-template',
'odp' => 'application/vnd.oasis.opendocument.presentation',
'otp' => 'application/vnd.oasis.opendocument.presentation-template',
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
'odt' => 'application/vnd.oasis.opendocument.text',
'odm' => 'application/vnd.oasis.opendocument.text-master',
'ott' => 'application/vnd.oasis.opendocument.text-template',
'oth' => 'application/vnd.oasis.opendocument.text-web'
);

View file

@ -0,0 +1,84 @@
<?php defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| URI ROUTING
| -------------------------------------------------------------------------
| This file lets you re-map URI requests to specific controller functions.
|
| Typically there is a one-to-one relationship between a URL string
| and its corresponding controller class/method. The segments in a
| URL normally follow this pattern:
|
| example.com/class/method/id/
|
| In some instances, however, you may want to remap this relationship
| so that a different class/function is called than the one
| corresponding to the URL.
|
| Please see the user guide for complete details:
|
| http://codeigniter.com/user_guide/general/routing.html
|
| -------------------------------------------------------------------------
| RESERVED ROUTES
| -------------------------------------------------------------------------
|
| There area two reserved routes:
|
| $route['default_controller'] = 'welcome';
|
| This route indicates which controller class should be loaded if the
| URI contains no data. In the above example, the "welcome" class
| would be loaded.
|
| $route['404_override'] = 'errors/page_missing';
|
| This route will tell the Router what URI segments to use if those provided
| in the URL cannot be matched to a valid route.
|
*/
$route['default_controller'] = 'appointments';
$route['404_override'] = 'errors/error404';
/*
| -------------------------------------------------------------------------
| REST API ROUTING
| -------------------------------------------------------------------------
| The following routes will point the API calls into the correct controller
| callback methods. This routes also define the HTTP verbs that they are
| used for each operation.
|
*/
$resources = [
'appointments',
'unavailabilities',
'customers',
'services',
'categories',
'admins',
'providers',
'secretaries'
];
foreach ($resources as $resource)
{
$route['api/v1/' . $resource]['post'] = 'api/v1/' . $resource . '/post';
$route['api/v1/' . $resource . '/(:num)']['put'] = 'api/v1/' . $resource . '/put/$1';
$route['api/v1/' . $resource . '/(:num)']['delete'] = 'api/v1/' . $resource . '/delete/$1';
$route['api/v1/' . $resource]['get'] = 'api/v1/' . $resource . '/get';
$route['api/v1/' . $resource . '/(:num)']['get'] = 'api/v1/' . $resource . '/get/$1';
}
$route['api/v1/settings']['get'] = 'api/v1/settings/get';
$route['api/v1/settings/(:any)']['get'] = 'api/v1/settings/get/$1';
$route['api/v1/settings/(:any)']['put'] = 'api/v1/settings/put/$1';
$route['api/v1/settings/(:any)']['delete'] = 'api/v1/settings/delete/$1';
$route['api/v1/availabilities']['get'] = 'api/v1/availabilities/get';
/* End of file routes.php */
/* Location: ./application/config/routes.php */

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,431 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.0.0
* ---------------------------------------------------------------------------- */
/**
* Backend Controller
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class Backend extends CI_Controller {
/**
* Class Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->library('session');
if ($this->session->userdata('language'))
{
// Set user's selected language.
$this->config->set_item('language', $this->session->userdata('language'));
$this->lang->load('translations', $this->session->userdata('language'));
}
else
{
// Set the default language.
$this->lang->load('translations', $this->config->item('language'));
}
}
/**
* Display the main backend page.
*
* This method displays the main backend page. All users login permission can view this page which displays a
* calendar with the events of the selected provider or service. If a user has more privileges he will see more
* menus at the top of the page.
*
* @param string $appointment_hash Appointment edit dialog will appear when the page loads (default '').
*
* @throws Exception
*/
public function index($appointment_hash = '')
{
$this->session->set_userdata('dest_url', site_url('backend/index' . (!empty($appointment_hash) ? '/' . $appointment_hash : '')));
if ( ! $this->has_privileges(PRIV_APPOINTMENTS))
{
return;
}
$this->load->model('appointments_model');
$this->load->model('providers_model');
$this->load->model('services_model');
$this->load->model('customers_model');
$this->load->model('settings_model');
$this->load->model('roles_model');
$this->load->model('user_model');
$this->load->model('secretaries_model');
$this->load->library('timezones');
$calendar_view_query_param = $this->input->get('view');
$user_id = $this->session->userdata('user_id');
$user = $this->user_model->get_user($user_id);
$view['base_url'] = $this->config->item('base_url');
$view['page_title'] = lang('calendar');
$view['user_display_name'] = $this->user_model->get_user_display_name($this->session->userdata('user_id'));
$view['active_menu'] = PRIV_APPOINTMENTS;
$view['date_format'] = $this->settings_model->get_setting('date_format');
$view['time_format'] = $this->settings_model->get_setting('time_format');
$view['first_weekday'] = $this->settings_model->get_setting('first_weekday');
$view['company_name'] = $this->settings_model->get_setting('company_name');
$view['require_phone_number'] = $this->settings_model->get_setting('require_phone_number');
$view['available_providers'] = $this->providers_model->get_available_providers();
$view['available_services'] = $this->services_model->get_available_services();
$view['customers'] = $this->customers_model->get_batch();
$view['calendar_view'] = !empty($calendar_view_query_param) ? $calendar_view_query_param : $user['settings']['calendar_view'];
$view['timezones'] = $this->timezones->to_array();
$this->set_user_data($view);
if ($this->session->userdata('role_slug') === DB_SLUG_SECRETARY)
{
$secretary = $this->secretaries_model->get_row($this->session->userdata('user_id'));
$view['secretary_providers'] = $secretary['providers'];
}
else
{
$view['secretary_providers'] = [];
}
$results = $this->appointments_model->get_batch(['hash' => $appointment_hash]);
if ($appointment_hash !== '' && count($results) > 0)
{
$appointment = $results[0];
$appointment['customer'] = $this->customers_model->get_row($appointment['id_users_customer']);
$view['edit_appointment'] = $appointment; // This will display the appointment edit dialog on page load.
}
else
{
$view['edit_appointment'] = NULL;
}
$this->load->view('backend/header', $view);
$this->load->view('backend/calendar', $view);
$this->load->view('backend/footer', $view);
}
/**
* Check whether current user is logged in and has the required privileges to view a page.
*
* The backend page requires different privileges from the users to display pages. Not all pages are available to
* all users. For example secretaries should not be able to edit the system users.
*
* @param string $page This argument must match the roles field names of each section (eg "appointments", "users"
* ...).
* @param bool $redirect If the user has not the required privileges (either not logged in or insufficient role
* privileges) then the user will be redirected to another page. Set this argument to FALSE when using ajax (default
* true).
*
* @return bool Returns whether the user has the required privileges to view the page or not. If the user is not
* logged in then he will be prompted to log in. If he hasn't the required privileges then an info message will be
* displayed.
*/
protected function has_privileges($page, $redirect = TRUE)
{
// Check if user is logged in.
$user_id = $this->session->userdata('user_id');
if ($user_id == FALSE)
{
// User not logged in, display the login view.
if ($redirect)
{
header('Location: ' . site_url('user/login'));
}
return FALSE;
}
// Check if the user has the required privileges for viewing the selected page.
$role_slug = $this->session->userdata('role_slug');
$role_privileges = $this->db->get_where('roles', ['slug' => $role_slug])->row_array();
if ($role_privileges[$page] < PRIV_VIEW)
{
// User does not have the permission to view the page.
if ($redirect)
{
header('Location: ' . site_url('user/no_privileges'));
}
return FALSE;
}
return TRUE;
}
/**
* Set the user data in order to be available at the view and js code.
*
* @param array $view Contains the view data.
*/
protected function set_user_data(&$view)
{
$this->load->model('roles_model');
// Get privileges
$view['user_id'] = $this->session->userdata('user_id');
$view['user_email'] = $this->session->userdata('user_email');
$view['timezone'] = $this->session->userdata('timezone');
$view['role_slug'] = $this->session->userdata('role_slug');
$view['privileges'] = $this->roles_model->get_privileges($this->session->userdata('role_slug'));
}
/**
* Display the backend customers page.
*
* In this page the user can manage all the customer records of the system.
*/
public function customers()
{
$this->session->set_userdata('dest_url', site_url('backend/customers'));
if ( ! $this->has_privileges(PRIV_CUSTOMERS))
{
return;
}
$this->load->model('providers_model');
$this->load->model('customers_model');
$this->load->model('secretaries_model');
$this->load->model('services_model');
$this->load->model('settings_model');
$this->load->model('user_model');
$this->load->library('timezones');
$view['base_url'] = $this->config->item('base_url');
$view['page_title'] = lang('customers');
$view['user_display_name'] = $this->user_model->get_user_display_name($this->session->userdata('user_id'));
$view['active_menu'] = PRIV_CUSTOMERS;
$view['company_name'] = $this->settings_model->get_setting('company_name');
$view['date_format'] = $this->settings_model->get_setting('date_format');
$view['time_format'] = $this->settings_model->get_setting('time_format');
$view['first_weekday'] = $this->settings_model->get_setting('first_weekday');
$view['require_phone_number'] = $this->settings_model->get_setting('require_phone_number');
$view['customers'] = $this->customers_model->get_batch();
$view['available_providers'] = $this->providers_model->get_available_providers();
$view['available_services'] = $this->services_model->get_available_services();
$view['timezones'] = $this->timezones->to_array();
if ($this->session->userdata('role_slug') === DB_SLUG_SECRETARY)
{
$secretary = $this->secretaries_model->get_row($this->session->userdata('user_id'));
$view['secretary_providers'] = $secretary['providers'];
}
else
{
$view['secretary_providers'] = [];
}
$this->set_user_data($view);
$this->load->view('backend/header', $view);
$this->load->view('backend/customers', $view);
$this->load->view('backend/footer', $view);
}
/**
* Displays the backend services page.
*
* Here the admin user will be able to organize and create the services that the user will be able to book
* appointments in frontend.
*
* NOTICE: The services that each provider is able to service is managed from the backend services page.
*/
public function services()
{
$this->session->set_userdata('dest_url', site_url('backend/services'));
if ( ! $this->has_privileges(PRIV_SERVICES))
{
return;
}
$this->load->model('customers_model');
$this->load->model('services_model');
$this->load->model('settings_model');
$this->load->model('user_model');
$this->load->library('timezones');
$view['base_url'] = $this->config->item('base_url');
$view['page_title'] = lang('services');
$view['user_display_name'] = $this->user_model->get_user_display_name($this->session->userdata('user_id'));
$view['active_menu'] = PRIV_SERVICES;
$view['company_name'] = $this->settings_model->get_setting('company_name');
$view['date_format'] = $this->settings_model->get_setting('date_format');
$view['time_format'] = $this->settings_model->get_setting('time_format');
$view['first_weekday'] = $this->settings_model->get_setting('first_weekday');
$view['services'] = $this->services_model->get_batch();
$view['categories'] = $this->services_model->get_all_categories();
$view['timezones'] = $this->timezones->to_array();
$this->set_user_data($view);
$this->load->view('backend/header', $view);
$this->load->view('backend/services', $view);
$this->load->view('backend/footer', $view);
}
/**
* Display the backend users page.
*
* In this page the admin user will be able to manage the system users. By this, we mean the provider, secretary and
* admin users. This is also the page where the admin defines which service can each provider provide.
*/
public function users()
{
$this->session->set_userdata('dest_url', site_url('backend/users'));
if ( ! $this->has_privileges(PRIV_USERS))
{
return;
}
$this->load->model('providers_model');
$this->load->model('secretaries_model');
$this->load->model('admins_model');
$this->load->model('services_model');
$this->load->model('settings_model');
$this->load->model('user_model');
$this->load->library('timezones');
$view['base_url'] = $this->config->item('base_url');
$view['page_title'] = lang('users');
$view['user_display_name'] = $this->user_model->get_user_display_name($this->session->userdata('user_id'));
$view['active_menu'] = PRIV_USERS;
$view['company_name'] = $this->settings_model->get_setting('company_name');
$view['date_format'] = $this->settings_model->get_setting('date_format');
$view['time_format'] = $this->settings_model->get_setting('time_format');
$view['first_weekday'] = $this->settings_model->get_setting('first_weekday');
$view['admins'] = $this->admins_model->get_batch();
$view['providers'] = $this->providers_model->get_batch();
$view['secretaries'] = $this->secretaries_model->get_batch();
$view['services'] = $this->services_model->get_batch();
$view['working_plan'] = $this->settings_model->get_setting('company_working_plan');
$view['timezones'] = $this->timezones->to_array();
$view['working_plan_exceptions'] = '{}';
$this->set_user_data($view);
$this->load->view('backend/header', $view);
$this->load->view('backend/users', $view);
$this->load->view('backend/footer', $view);
}
/**
* Display the user/system settings.
*
* This page will display the user settings (name, password etc). If current user is an administrator, then he will
* be able to make change to the current Easy!Appointment installation (core settings like company name, book
* timeout etc).
*/
public function settings()
{
$this->session->set_userdata('dest_url', site_url('backend/settings'));
if ( ! $this->has_privileges(PRIV_SYSTEM_SETTINGS, FALSE)
&& ! $this->has_privileges(PRIV_USER_SETTINGS))
{
return;
}
$this->load->model('settings_model');
$this->load->model('user_model');
$this->load->library('timezones');
$this->load->library('session');
$user_id = $this->session->userdata('user_id');
$view['base_url'] = $this->config->item('base_url');
$view['page_title'] = lang('settings');
$view['user_display_name'] = $this->user_model->get_user_display_name($user_id);
$view['active_menu'] = PRIV_SYSTEM_SETTINGS;
$view['company_name'] = $this->settings_model->get_setting('company_name');
$view['date_format'] = $this->settings_model->get_setting('date_format');
$view['first_weekday'] = $this->settings_model->get_setting('first_weekday');
$view['time_format'] = $this->settings_model->get_setting('time_format');
$view['role_slug'] = $this->session->userdata('role_slug');
$view['system_settings'] = $this->settings_model->get_settings();
$view['user_settings'] = $this->user_model->get_user($user_id);
$view['timezones'] = $this->timezones->to_array();
// book_advance_timeout preview
$book_advance_timeout = $this->settings_model->get_setting('book_advance_timeout');
$hours = floor($book_advance_timeout / 60);
$minutes = $book_advance_timeout % 60;
$view['book_advance_timeout_preview'] = sprintf('%02d:%02d', $hours, $minutes);
$this->set_user_data($view);
$this->load->view('backend/header', $view);
$this->load->view('backend/settings', $view);
$this->load->view('backend/footer', $view);
}
/**
* This method will update the installation to the latest available version in the server.
*
* IMPORTANT: The code files must exist in the server, this method will not fetch any new files but will update
* the database schema.
*
* This method can be used either by loading the page in the browser or by an ajax request. But it will answer with
* JSON encoded data.
*/
public function update()
{
try
{
if ( ! $this->has_privileges(PRIV_SYSTEM_SETTINGS, TRUE))
{
throw new Exception('You do not have the required privileges for this task!');
}
$this->load->library('migration');
if ( ! $this->migration->current())
{
throw new Exception($this->migration->error_string());
}
$view = ['success' => TRUE];
}
catch (Exception $exception)
{
$view = ['success' => FALSE, 'exception' => $exception->getMessage()];
}
$this->load->view('general/update', $view);
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,62 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.0.0
* ---------------------------------------------------------------------------- */
/**
* Captcha Controller
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class Captcha extends CI_Controller {
/**
* Class Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->library('session');
}
/**
* Make a request to this method to get a captcha image.
*/
public function index()
{
header('Content-type: image/jpeg');
$builder = new Gregwar\Captcha\CaptchaBuilder;
$builder->build();
$this->session->set_userdata('captcha_phrase', $builder->getPhrase());
$builder->output();
}
}

View file

@ -0,0 +1,79 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.3.2
* ---------------------------------------------------------------------------- */
/**
* Class Consent
*
* Handles user consent related operations.
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Consents_Model consents_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class Consents extends CI_Controller {
/**
* Save the user's consent.
*/
public function ajax_save_consent()
{
try
{
$this->load->model('consents_model');
$consent = $this->input->post('consent');
$consent['ip'] = $this->input->ip_address();
$consent['id'] = $this->consents_model->add($consent);
$response = [
'success' => TRUE,
'id' => $consent['id']
];
}
catch (Exception $exception)
{
$this->output->set_status_header(500);
$response = [
'message' => $exception->getMessage(),
'trace' => config('debug') ? $exception->getTrace() : []
];
}
$this->output
->set_content_type('application/json')
->set_output(json_encode($response));
}
}

View file

@ -0,0 +1,90 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.3.2
* ---------------------------------------------------------------------------- */
require_once __DIR__ .'/Google.php';
/**
* Class Console
*
* CLI commands of Easy!Appointments, can only be executed from a terminal and not with a direct request.
*
* @property CI_Migration $migration
* @property Providers_model $providers_model
*/
class Console extends CI_Controller {
/**
* Console constructor.
*/
public function __construct()
{
if ( ! is_cli())
{
exit('No direct script access allowed');
}
parent::__construct();
$this->load->library('migration');
$this->load->model('providers_model');
}
/**
* Migrate the database to the latest state.
*
* Use this method to upgrade an existing installation to the latest database state.
*
* Notice:
*
* Do not use this method to install the app as it will not seed the database with the initial entries (admin,
* provider, service, settings etc). Use the UI installation page for this.
*
* Usage:
*
* php index.php console migrate
*/
public function migrate()
{
if ($this->migration->current() === FALSE)
{
show_error($this->migration->error_string());
}
}
/**
* Trigger the synchronization of all provider calendars with Google Calendar.
*
* Use this method in a cronjob to automatically sync events between Easy!Appointments and Google Calendar.
*
* Notice:
*
* Google syncing must first be enabled for each individual provider from inside the backend calendar page.
*
* Usage:
*
* php index.php console sync
*/
public function sync()
{
$providers = $this->providers_model->get_batch();
foreach ($providers as $provider)
{
if ( ! filter_var($provider['settings']['google_sync'], FILTER_VALIDATE_BOOLEAN))
{
continue;
}
Google::sync($provider['id']);
}
}
}

View file

@ -0,0 +1,84 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.0.0
* ---------------------------------------------------------------------------- */
/**
* Errors Controller
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class Errors extends CI_Controller {
/**
* Class Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->library('session');
if ($this->session->userdata('language'))
{
// Set user's selected language.
$this->config->set_item('language', $this->session->userdata('language'));
$this->lang->load('translations', $this->session->userdata('language'));
}
else
{
// Set the default language.
$this->lang->load('translations', $this->config->item('language'));
}
}
/**
* Display the 404 error page.
*/
public function index()
{
$this->error404();
}
/**
* Display the 404 error page.
*/
public function error404()
{
$this->load->helper('google_analytics');
$this->load->model('settings_model');
$view['company_name'] = $this->settings_model->get_setting('company_name');
$this->load->view('general/error404', $view);
}
}

View file

@ -0,0 +1,320 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.0.0
* ---------------------------------------------------------------------------- */
/**
* Google Controller
*
* This controller handles the Google Calendar synchronization operations.
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class Google extends CI_Controller {
/**
* Class Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->library('session');
}
/**
* Authorize Google Calendar API usage for a specific provider.
*
* Since it is required to follow the web application flow, in order to retrieve a refresh token from the Google API
* service, this method is going to authorize the given provider.
*
* @param int $provider_id The provider id, for whom the sync authorization is made.
*/
public function oauth($provider_id)
{
// Store the provider id for use on the callback function.
$this->session->set_userdata('oauth_provider_id', $provider_id);
// Redirect browser to google user content page.
$this->load->library('google_sync');
header('Location: ' . $this->google_sync->get_auth_url());
}
/**
* Callback method for the Google Calendar API authorization process.
*
* Once the user grants consent with his Google Calendar data usage, the Google OAuth service will redirect him back
* in this page. Here we are going to store the refresh token, because this is what will be used to generate access
* tokens in the future.
*
* IMPORTANT: Because it is necessary to authorize the application using the web server flow (see official
* documentation of OAuth), every Easy!Appointments installation should use its own calendar api key. So in every
* api console account, the "http://path-to-Easy!Appointments/google/oauth_callback" should be included in an allowed redirect URL.
*/
public function oauth_callback()
{
$code = $this->input->get('code');
if (empty($code))
{
$this->output->set_output('Code authorization failed.');
return;
}
$this->load->library('Google_sync');
$token = $this->google_sync->authenticate($code);
if (empty($token))
{
$this->output->set_output('Token authorization failed.');
return;
}
// Store the token into the database for future reference.
$oauth_provider_id = $this->session->userdata('oauth_provider_id');
if ($oauth_provider_id)
{
$this->load->model('providers_model');
$this->providers_model->set_setting('google_sync', TRUE, $oauth_provider_id);
$this->providers_model->set_setting('google_token', json_encode($token), $oauth_provider_id);
$this->providers_model->set_setting('google_calendar', 'primary', $oauth_provider_id);
}
else
{
$this->output->set_output('Sync provider id not specified.');
}
}
/**
* Complete synchronization of appointments between Google Calendar and Easy!Appointments.
*
* This method will completely sync the appointments of a provider with his Google Calendar account. The sync period
* needs to be relatively small, because a lot of API calls might be necessary and this will lead to consuming the
* Google limit for the Calendar API usage.
*
* @param int $provider_id Provider record to be synced.
*/
public static function sync($provider_id = NULL)
{
try
{
$framework = get_instance();
// The user must be logged in.
$framework->load->library('session');
if ($framework->session->userdata('user_id') == FALSE && is_cli() === FALSE)
{
return;
}
if ($provider_id === NULL)
{
throw new Exception('Provider id not specified.');
}
$framework->load->model('appointments_model');
$framework->load->model('providers_model');
$framework->load->model('services_model');
$framework->load->model('customers_model');
$framework->load->model('settings_model');
$provider = $framework->providers_model->get_row($provider_id);
// Check whether the selected provider has google sync enabled.
$google_sync = $framework->providers_model->get_setting('google_sync', $provider['id']);
if ( ! $google_sync)
{
throw new Exception('The selected provider has not the google synchronization setting enabled.');
}
$google_token = json_decode($framework->providers_model->get_setting('google_token', $provider['id']));
$framework->load->library('google_sync');
$framework->google_sync->refresh_token($google_token->refresh_token);
// Fetch provider's appointments that belong to the sync time period.
$sync_past_days = $framework->providers_model->get_setting('sync_past_days', $provider['id']);
$sync_future_days = $framework->providers_model->get_setting('sync_future_days', $provider['id']);
$start = strtotime('-' . $sync_past_days . ' days', strtotime(date('Y-m-d')));
$end = strtotime('+' . $sync_future_days . ' days', strtotime(date('Y-m-d')));
$where_clause = [
'start_datetime >=' => date('Y-m-d H:i:s', $start),
'end_datetime <=' => date('Y-m-d H:i:s', $end),
'id_users_provider' => $provider['id']
];
$appointments = $framework->appointments_model->get_batch($where_clause);
$company_settings = [
'company_name' => $framework->settings_model->get_setting('company_name'),
'company_link' => $framework->settings_model->get_setting('company_link'),
'company_email' => $framework->settings_model->get_setting('company_email')
];
$provider_timezone = new DateTimeZone($provider['timezone']);
// Sync each appointment with Google Calendar by following the project's sync protocol (see documentation).
foreach ($appointments as $appointment)
{
if ($appointment['is_unavailable'] == FALSE)
{
$service = $framework->services_model->get_row($appointment['id_services']);
$customer = $framework->customers_model->get_row($appointment['id_users_customer']);
}
else
{
$service = NULL;
$customer = NULL;
}
// If current appointment not synced yet, add to Google Calendar.
if ($appointment['id_google_calendar'] == NULL)
{
$google_event = $framework->google_sync->add_appointment($appointment, $provider,
$service, $customer, $company_settings);
$appointment['id_google_calendar'] = $google_event->id;
$framework->appointments_model->add($appointment); // Save the Google Calendar ID.
}
else
{
// Appointment is synced with google calendar.
try
{
$google_event = $framework->google_sync->get_event($provider, $appointment['id_google_calendar']);
if ($google_event->status == 'cancelled')
{
throw new Exception('Event is cancelled, remove the record from Easy!Appointments.');
}
// If Google Calendar event is different from Easy!Appointments appointment then update
// Easy!Appointments record.
$is_different = FALSE;
$appt_start = strtotime($appointment['start_datetime']);
$appt_end = strtotime($appointment['end_datetime']);
$event_start = new DateTime($google_event->getStart()->getDateTime());
$event_start->setTimezone($provider_timezone);
$event_end = new DateTime($google_event->getEnd()->getDateTime());
$event_end->setTimezone($provider_timezone);
if ($appt_start != $event_start->getTimestamp() || $appt_end != $event_end->getTimestamp()
|| $appointment['notes'] !== $google_event->getDescription())
{
$is_different = TRUE;
}
if ($is_different)
{
$appointment['start_datetime'] = $event_start->format('Y-m-d H:i:s');
$appointment['end_datetime'] = $event_end->format('Y-m-d H:i:s');
$appointment['notes'] = $google_event->getDescription();
$framework->appointments_model->add($appointment);
}
}
catch (Exception $exception)
{
// Appointment not found on Google Calendar, delete from Easy!Appoinmtents.
$framework->appointments_model->delete($appointment['id']);
$appointment['id_google_calendar'] = NULL;
}
}
}
// Add Google Calendar events that do not exist in Easy!Appointments.
$google_calendar = $provider['settings']['google_calendar'];
$google_events = $framework->google_sync->get_sync_events($google_calendar, $start, $end);
foreach ($google_events->getItems() as $google_event)
{
if ($google_event->getStatus() === 'cancelled')
{
continue;
}
if ($google_event->getStart() === NULL || $google_event->getEnd() === NULL)
{
continue;
}
$results = $framework->appointments_model->get_batch(['id_google_calendar' => $google_event->getId()]);
if ( ! empty($results))
{
continue;
}
$event_start = new DateTime($google_event->getStart()->getDateTime());
$event_start->setTimezone($provider_timezone);
$event_end = new DateTime($google_event->getEnd()->getDateTime());
$event_end->setTimezone($provider_timezone);
// Record doesn't exist in the Easy!Appointments, so add the event now.
$appointment = [
'start_datetime' => $event_start->format('Y-m-d H:i:s'),
'end_datetime' => $event_end->format('Y-m-d H:i:s'),
'is_unavailable' => TRUE,
'location' => $google_event->getLocation(),
'notes' => $google_event->getSummary() . ' ' . $google_event->getDescription(),
'id_users_provider' => $provider_id,
'id_google_calendar' => $google_event->getId(),
'id_users_customer' => NULL,
'id_services' => NULL,
];
$framework->appointments_model->add($appointment);
}
$response = AJAX_SUCCESS;
}
catch (Exception $exception)
{
$framework->output->set_status_header(500);
$response = [
'message' => $exception->getMessage(),
'trace' => config('debug') ? $exception->getTrace() : []
];
}
$framework->output
->set_content_type('application/json')
->set_output(json_encode($response));
}
}

View file

@ -0,0 +1,187 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.1.0
* ---------------------------------------------------------------------------- */
/**
* Installation Controller
*
* This controller will handle the installation procedure of Easy!Appointments.
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property CI_Migration migration
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class Installation extends CI_Controller {
/**
* Class Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->helper('installation');
$this->load->library('session');
if ($this->session->userdata('language'))
{
// Set user's selected language.
$this->config->set_item('language', $this->session->userdata('language'));
$this->lang->load('translations', $this->session->userdata('language'));
}
else
{
// Set the default language.
$this->lang->load('translations', $this->config->item('language'));
}
}
/**
* Display the installation page.
*/
public function index()
{
if (is_app_installed())
{
redirect('appointments/index');
return;
}
$this->load->view('general/installation', [
'base_url' => $this->config->item('base_url')
]);
}
/**
* [AJAX] Installs Easy!Appointments on the server.
*/
public function ajax_install()
{
try
{
if (is_app_installed())
{
return;
}
$this->load->model('admins_model');
$this->load->model('settings_model');
$this->load->model('services_model');
$this->load->model('providers_model');
$this->load->library('session');
$this->load->library('migration');
$this->load->helper('string');
$admin = $this->input->post('admin');
$company = $this->input->post('company');
if ( ! $this->migration->current())
{
throw new Exception($this->migration->error_string());
}
// Insert admin
$admin['timezone'] = 'UTC';
$admin['settings']['username'] = $admin['username'];
$admin['settings']['password'] = $admin['password'];
$admin['settings']['notifications'] = true;
$admin['settings']['calendar_view'] = CALENDAR_VIEW_DEFAULT;
unset($admin['username'], $admin['password']);
$admin['id'] = $this->admins_model->add($admin);
$this->session->set_userdata('user_id', $admin['id']);
$this->session->set_userdata('user_email', $admin['email']);
$this->session->set_userdata('role_slug', DB_SLUG_ADMIN);
$this->session->set_userdata('timezone', $admin['timezone']);
$this->session->set_userdata('username', $admin['settings']['username']);
// Save company settings
$this->settings_model->set_setting('company_name', $company['company_name']);
$this->settings_model->set_setting('company_email', $company['company_email']);
$this->settings_model->set_setting('company_link', $company['company_link']);
// Create sample records.
$services = [
'name' => 'Test Service',
'duration' => 30,
'price' => 50.0,
'currency' => 'EUR',
'description' => 'This is a test service automatically inserted by the installer.',
'availabilities_type' => 'flexible',
'attendants_number' => 1,
'id_service_categories' => NULL
];
$services['id'] = $this->services_model->add($services);
$salt = generate_salt();
$password = random_string('alnum', 12);
$sample_provider = [
'first_name' => 'John',
'last_name' => 'Doe',
'email' => 'john@example.org',
'phone_number' => '0123456789',
'services' => [
$services['id']
],
'settings' => [
'username' => 'johndoe',
'password' => hash_password($salt, $password),
'salt' => $salt,
'working_plan' => '{"monday":{"start":"09:00","end":"18:00","breaks":[{"start":"14:30","end":"15:00"}]},"tuesday":{"start":"09:00","end":"18:00","breaks":[{"start":"14:30","end":"15:00"}]},"wednesday":{"start":"09:00","end":"18:00","breaks":[{"start":"14:30","end":"15:00"}]},"thursday":{"start":"09:00","end":"18:00","breaks":[{"start":"14:30","end":"15:00"}]},"friday":{"start":"09:00","end":"18:00","breaks":[{"start":"14:30","end":"15:00"}]},"saturday":null,"sunday":null}',
'notifications' => FALSE,
'google_sync' => FALSE,
'sync_past_days' => 5,
'sync_future_days' => 5,
'calendar_view' => CALENDAR_VIEW_DEFAULT
]
];
$this->providers_model->add($sample_provider);
$response = AJAX_SUCCESS;
}
catch (Exception $exception)
{
$this->output->set_status_header(500);
$response = [
'message' => $exception->getMessage(),
'trace' => config('debug') ? $exception->getTrace() : []
];
}
$this->output
->set_content_type('application/json')
->set_output(json_encode($response));
}
}

View file

@ -0,0 +1,88 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.3.2
* ---------------------------------------------------------------------------- */
/**
* Class Privacy
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class Privacy extends CI_Controller {
/**
* Remove all customer data (including appointments from the system).
*/
public function ajax_delete_personal_information()
{
try
{
$customer_token = $this->input->post('customer_token');
if (empty($customer_token))
{
throw new InvalidArgumentException('Invalid customer token value provided.');
}
$this->load->driver('cache', ['adapter' => 'file']);
$customer_id = $this->cache->get('customer-token-' . $customer_token);
if (empty($customer_id))
{
throw new InvalidArgumentException('Customer ID could not be found, please reload the page '
. 'and try again.');
}
$this->load->model('customers_model');
$this->customers_model->delete($customer_id);
$response = [
'success' => TRUE
];
}
catch (Exception $exception)
{
$this->output->set_status_header(500);
$response = [
'message' => $exception->getMessage(),
'trace' => config('debug') ? $exception->getTrace() : []
];
}
$this->output
->set_content_type('application/json')
->set_output(json_encode($response));
}
}

View file

@ -0,0 +1,249 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.0.0
* ---------------------------------------------------------------------------- */
use EA\Engine\Notifications\Email as EmailClient;
use EA\Engine\Types\Email;
use EA\Engine\Types\NonEmptyText;
/**
* User Controller
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class User extends CI_Controller {
/**
* Class Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->library('session');
if ($this->session->userdata('language'))
{
// Set user's selected language.
$this->config->set_item('language', $this->session->userdata('language'));
$this->lang->load('translations', $this->session->userdata('language'));
}
else
{
// Set the default language.
$this->lang->load('translations', $this->config->item('language')); // default
}
}
/**
* Default Method
*
* The default method will redirect the browser to the user/login URL.
*/
public function index()
{
header('Location: ' . site_url('user/login'));
}
/**
* Display the login page.
*
* @throws Exception
*/
public function login()
{
$this->load->model('settings_model');
$view['base_url'] = $this->config->item('base_url');
$view['dest_url'] = $this->session->userdata('dest_url');
if ( ! $view['dest_url'])
{
$view['dest_url'] = site_url('backend');
}
$view['company_name'] = $this->settings_model->get_setting('company_name');
$this->load->view('user/login', $view);
}
/**
* Display the logout page.
*/
public function logout()
{
$this->load->model('settings_model');
$this->session->unset_userdata('user_id');
$this->session->unset_userdata('user_email');
$this->session->unset_userdata('role_slug');
$this->session->unset_userdata('username');
$this->session->unset_userdata('dest_url');
$view['base_url'] = $this->config->item('base_url');
$view['company_name'] = $this->settings_model->get_setting('company_name');
$this->load->view('user/logout', $view);
}
/**
* Display the "forgot password" page.
* @throws Exception
*/
public function forgot_password()
{
$this->load->model('settings_model');
$view['base_url'] = $this->config->item('base_url');
$view['company_name'] = $this->settings_model->get_setting('company_name');
$this->load->view('user/forgot_password', $view);
}
/**
* Display the "not authorized" page.
* @throws Exception
*/
public function no_privileges()
{
$this->load->model('settings_model');
$view['base_url'] = $this->config->item('base_url');
$view['company_name'] = $this->settings_model->get_setting('company_name');
$this->load->view('user/no_privileges', $view);
}
/**
* [AJAX] Check whether the user has entered the correct login credentials.
*
* The session data of a logged in user are the following:
* - 'user_id'
* - 'user_email'
* - 'role_slug'
* - 'dest_url'
*/
public function ajax_check_login()
{
try
{
if ( ! $this->input->post('username') || ! $this->input->post('password'))
{
throw new Exception('Invalid credentials given!');
}
$this->load->model('user_model');
$user_data = $this->user_model->check_login($this->input->post('username'), $this->input->post('password'));
if ($user_data)
{
$this->session->set_userdata($user_data); // Save data on user's session.
$response = AJAX_SUCCESS;
}
else
{
$response = AJAX_FAILURE;
}
}
catch (Exception $exception)
{
$this->output->set_status_header(500);
$response = [
'message' => $exception->getMessage(),
'trace' => config('debug') ? $exception->getTrace() : []
];
}
$this->output
->set_content_type('application/json')
->set_output(json_encode($response));
}
/**
* Regenerate a new password for the current user, only if the username and
* email address given correspond to an existing user in db.
*
* Required POST Parameters:
*
* - string $_POST['username'] Username to be validated.
* - string $_POST['email'] Email to be validated.
*/
public function ajax_forgot_password()
{
try
{
if ( ! $this->input->post('username') || ! $this->input->post('email'))
{
throw new Exception('You must enter a valid username and email address in '
. 'order to get a new password!');
}
$this->load->model('user_model');
$this->load->model('settings_model');
$new_password = $this->user_model->regenerate_password(
$this->input->post('username'),
$this->input->post('email')
);
if ($new_password != FALSE)
{
$this->config->load('email');
$email = new EmailClient($this, $this->config->config);
$company_settings = [
'company_name' => $this->settings_model->get_setting('company_name'),
'company_link' => $this->settings_model->get_setting('company_link'),
'company_email' => $this->settings_model->get_setting('company_email')
];
$email->sendPassword(new NonEmptyText($new_password), new Email($this->input->post('email')),
$company_settings);
}
$response = $new_password != FALSE ? AJAX_SUCCESS : AJAX_FAILURE;
}
catch (Exception $exception)
{
$this->output->set_status_header(500);
$response = [
'message' => $exception->getMessage(),
'trace' => config('debug') ? $exception->getTrace() : []
];
}
$this->output
->set_content_type('application/json')
->set_output(json_encode($response));
}
}

View file

@ -0,0 +1,173 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.2.0
* ---------------------------------------------------------------------------- */
use EA\Engine\Api\V1\Authorization;
use EA\Engine\Types\NonEmptyText;
/**
* API V1 Controller
*
* Parent controller class for the API v1 resources. Extend this class instead of the CI_Controller
* and call the parent constructor.
*
* @package Controllers
*/
class API_V1_Controller extends CI_Controller {
/**
* Class Constructor
*
* This constructor will handle the common operations of each API call.
*
* Important: Do not forget to call the this constructor from the child classes.
*
* Notice: At the time being only the basic authentication is supported. Make sure
* that you use the API through SSL/TLS for security.
*/
public function __construct()
{
try
{
parent::__construct();
$this->load->model('settings_model');
$api_token = $this->settings_model->get_setting('api_token');
$authorization = new Authorization($this);
if ( ! empty($api_token) && $api_token === $this->_getBearerToken())
{
return;
}
if ( ! isset($_SERVER['PHP_AUTH_USER']))
{
$this->_requestAuthentication();
return;
}
$username = new NonEmptyText($_SERVER['PHP_AUTH_USER']);
$password = new NonEmptyText($_SERVER['PHP_AUTH_PW']);
$authorization->basic($username, $password);
}
catch (Exception $exception)
{
exit($this->_handleException($exception));
}
}
/**
* Returns the bearer token value.
*
* @return string
*/
protected function _getBearerToken()
{
$headers = $this->_getAuthorizationHeader();
// HEADER: Get the access token from the header
if ( ! empty($headers))
{
if (preg_match('/Bearer\s(\S+)/', $headers, $matches))
{
return $matches[1];
}
}
return NULL;
}
/**
* Returns the authorization header.
*
* @return string
*/
protected function _getAuthorizationHeader()
{
$headers = NULL;
if (isset($_SERVER['Authorization']))
{
$headers = trim($_SERVER['Authorization']);
}
else
{
if (isset($_SERVER['HTTP_AUTHORIZATION']))
{
//Nginx or fast CGI
$headers = trim($_SERVER['HTTP_AUTHORIZATION']);
}
elseif (function_exists('apache_request_headers'))
{
$requestHeaders = apache_request_headers();
// Server-side fix for bug in old Android versions (a nice side-effect of this fix means we don't care
// about capitalization for Authorization).
$requestHeaders = array_combine(array_map('ucwords', array_keys($requestHeaders)), array_values($requestHeaders));
if (isset($requestHeaders['Authorization']))
{
$headers = trim($requestHeaders['Authorization']);
}
}
}
return $headers;
}
/**
* Sets request authentication headers.
*/
protected function _requestAuthentication()
{
header('WWW-Authenticate: Basic realm="Easy!Appointments"');
header('HTTP/1.0 401 Unauthorized');
exit('You are not authorized to use the API.');
}
/**
* Outputs the required headers and messages for exception handling.
*
* Call this method from catch blocks of child controller callbacks.
*
* @param Exception $exception Thrown exception to be outputted.
*/
protected function _handleException(Exception $exception)
{
$error = [
'code' => $exception->getCode() ?: 500,
'message' => $exception->getMessage(),
];
$header = $exception instanceof \EA\Engine\Api\V1\Exception
? $exception->getCode() . ' ' . $exception->getHeader()
: '500 Internal Server Error';
header('HTTP/1.0 ' . $header);
header('Content-Type: application/json');
$this->output
->set_content_type('application/json')
->set_output(json_encode($error, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
}
/**
* Throw an API exception stating that the requested record was not found.
*
* @throws \EA\Engine\Api\V1\Exception
*/
protected function _throwRecordNotFound()
{
throw new \EA\Engine\Api\V1\Exception('The requested record was not found!', 404, 'Not Found');
}
}

View file

@ -0,0 +1,188 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.2.0
* ---------------------------------------------------------------------------- */
require_once __DIR__ . '/API_V1_Controller.php';
use EA\Engine\Api\V1\Request;
use EA\Engine\Api\V1\Response;
use EA\Engine\Types\NonEmptyText;
/**
* Admins Controller
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class Admins extends API_V1_Controller {
/**
* Admins Resource Parser
*
* @var \EA\Engine\Api\V1\Parsers\Admins
*/
protected $parser;
/**
* Class Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->model('admins_model');
$this->parser = new \EA\Engine\Api\V1\Parsers\Admins;
}
/**
* GET API Method
*
* @param int $id Optional (null), the record ID to be returned.
*/
public function get($id = NULL)
{
try
{
$condition = $id !== NULL ? 'id = ' . $id : NULL;
$admins = $this->admins_model->get_batch($condition);
if ($id !== NULL && count($admins) === 0)
{
$this->_throwRecordNotFound();
}
$response = new Response($admins);
$response->encode($this->parser)
->search()
->sort()
->paginate()
->minimize()
->singleEntry($id)
->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* POST API Method
*/
public function post()
{
try
{
// Insert the admin to the database.
$request = new Request();
$admin = $request->getBody();
$this->parser->decode($admin);
if (isset($admin['id']))
{
unset($admin['id']);
}
$id = $this->admins_model->add($admin);
// Fetch the new object from the database and return it to the client.
$batch = $this->admins_model->get_batch('id = ' . $id);
$response = new Response($batch);
$status = new NonEmptyText('201 Created');
$response->encode($this->parser)->singleEntry(TRUE)->output($status);
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* PUT API Method
*
* @param int $id The record ID to be updated.
*/
public function put($id)
{
try
{
// Update the admin record.
$batch = $this->admins_model->get_batch('id = ' . $id);
if ($id !== NULL && count($batch) === 0)
{
$this->_throwRecordNotFound();
}
$request = new Request();
$updatedAdmin = $request->getBody();
$baseAdmin = $batch[0];
$this->parser->decode($updatedAdmin, $baseAdmin);
$updatedAdmin['id'] = $id;
$id = $this->admins_model->add($updatedAdmin);
// Fetch the updated object from the database and return it to the client.
$batch = $this->admins_model->get_batch('id = ' . $id);
$response = new Response($batch);
$response->encode($this->parser)->singleEntry($id)->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* DELETE API Method
*
* @param int $id The record ID to be deleted.
*/
public function delete($id)
{
try
{
$this->admins_model->delete($id);
$response = new Response([
'code' => 200,
'message' => 'Record was deleted successfully!'
]);
$response->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
}

View file

@ -0,0 +1,211 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.2.0
* ---------------------------------------------------------------------------- */
require_once __DIR__ . '/API_V1_Controller.php';
use EA\Engine\Api\V1\Request;
use EA\Engine\Api\V1\Response;
use EA\Engine\Types\NonEmptyText;
/**
* Appointments Controller
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class Appointments extends API_V1_Controller {
/**
* Appointments Resource Parser
*
* @var \EA\Engine\Api\V1\Parsers\Appointments
*/
protected $parser;
/**
* Class Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->model('appointments_model');
$this->parser = new \EA\Engine\Api\V1\Parsers\Appointments;
}
/**
* GET API Method
*
* @param int $id Optional (null), the record ID to be returned.
*/
public function get($id = NULL)
{
try
{
$conditions = [
'is_unavailable' => FALSE
];
if ($id !== NULL)
{
$conditions['id'] = $id;
}
$appointments = $this->appointments_model->get_batch($conditions, NULL, NULL, NULL, array_key_exists('aggregates', $_GET));
if ($id !== NULL && count($appointments) === 0)
{
$this->_throwRecordNotFound();
}
$response = new Response($appointments);
$response->encode($this->parser)
->search()
->sort()
->paginate()
->minimize()
->singleEntry($id)
->output();
}
catch (Exception $exception)
{
exit($this->_handleException($exception));
}
}
/**
* POST API Method
*/
public function post()
{
$this->load->model('services_model');
try
{
// Insert the appointment to the database.
$request = new Request();
$appointment = $request->getBody();
$this->parser->decode($appointment);
if (isset($appointment['id']))
{
unset($appointment['id']);
}
// Generate end_datetime based on service duration if this field is not defined
if ( ! isset($appointment['end_datetime']))
{
$service = $this->services_model->get_row($appointment['id_services']);
if (isset($service['duration']))
{
$end_datetime = new DateTime($appointment['start_datetime']);
$end_datetime->add(new DateInterval('PT' . $service['duration'] . 'M'));
$appointment['end_datetime'] = $end_datetime->format('Y-m-d H:i:s');
}
}
$id = $this->appointments_model->add($appointment);
// Fetch the new object from the database and return it to the client.
$batch = $this->appointments_model->get_batch('id = ' . $id);
$response = new Response($batch);
$status = new NonEmptyText('201 Created');
$response->encode($this->parser)->singleEntry(TRUE)->output($status);
}
catch (Exception $exception)
{
exit($this->_handleException($exception));
}
}
/**
* PUT API Method
*
* @param int $id The record ID to be updated.
*/
public function put($id)
{
try
{
// Update the appointment record.
$batch = $this->appointments_model->get_batch('id = ' . $id);
if ($id !== NULL && count($batch) === 0)
{
$this->_throwRecordNotFound();
}
$request = new Request();
$updatedAppointment = $request->getBody();
$baseAppointment = $batch[0];
$this->parser->decode($updatedAppointment, $baseAppointment);
$updatedAppointment['id'] = $id;
$id = $this->appointments_model->add($updatedAppointment);
// Fetch the updated object from the database and return it to the client.
$batch = $this->appointments_model->get_batch('id = ' . $id);
$response = new Response($batch);
$response->encode($this->parser)->singleEntry($id)->output();
}
catch (Exception $exception)
{
exit($this->_handleException($exception));
}
}
/**
* DELETE API Method
*
* @param int $id The record ID to be deleted.
*/
public function delete($id)
{
try
{
$this->appointments_model->delete($id);
$response = new Response([
'code' => 200,
'message' => 'Record was deleted successfully!'
]);
$response->output();
}
catch (Exception $exception)
{
exit($this->_handleException($exception));
}
}
}

View file

@ -0,0 +1,568 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.2.0
* ---------------------------------------------------------------------------- */
require_once __DIR__ . '/API_V1_Controller.php';
require_once __DIR__ . '/../../Appointments.php';
use EA\Engine\Types\UnsignedInteger;
/**
* Availabilities Controller
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class Availabilities extends API_V1_Controller {
/**
* Class Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->model('appointments_model');
$this->load->model('providers_model');
$this->load->model('services_model');
$this->load->model('settings_model');
}
/**
* GET API Method
*
* Provide the "providerId", "serviceId" and "date" GET parameters to get the availabilities for a specific date.
* If no "date" was provided then the current date will be used.
*/
public function get()
{
try
{
$providerId = new UnsignedInteger($this->input->get('providerId'));
$serviceId = new UnsignedInteger($this->input->get('serviceId'));
if ($this->input->get('date'))
{
$date = new DateTime($this->input->get('date'));
}
else
{
$date = new DateTime();
}
$provider = $this->providers_model->get_row($providerId->get());
$service = $this->services_model->get_row($serviceId->get());
$emptyPeriods = $this->_getProviderAvailableTimePeriods($providerId->get(),
$date->format('Y-m-d'), []);
$availableHours = $this->_calculateAvailableHours($emptyPeriods,
$date->format('Y-m-d'), $service['duration'], FALSE, $service['availabilities_type']);
if ($service['attendants_number'] > 1)
{
$availableHours = $this->_getMultipleAttendantsHours($date->format('Y-m-d'), $service, $provider);
}
// If the selected date is today, remove past hours. It is important include the timeout before
// booking that is set in the back-office the system. Normally we might want the customer to book
// an appointment that is at least half or one hour from now. The setting is stored in minutes.
if ($date->format('Y-m-d') === date('Y-m-d'))
{
$bookAdvanceTimeout = $this->settings_model->get_setting('book_advance_timeout');
foreach ($availableHours as $index => $value)
{
$availableHour = strtotime($value);
$currentHour = strtotime('+' . $bookAdvanceTimeout . ' minutes', strtotime('now'));
if ($availableHour <= $currentHour)
{
unset($availableHours[$index]);
}
}
}
$availableHours = array_values($availableHours);
sort($availableHours, SORT_STRING);
$availableHours = array_values($availableHours);
$this->output
->set_content_type('application/json')
->set_output(json_encode($availableHours));
}
catch (Exception $exception)
{
exit($this->_handleException($exception));
}
}
/**
* Get an array containing the free time periods (start - end) of a selected date.
*
* This method is very important because there are many cases where the system needs to
* know when a provider is available for an appointment. This method will return an array
* that belongs to the selected date and contains values that have the start and the end
* time of an available time period.
*
* @param int $provider_id The provider's record id.
* @param string $selected_date The date to be checked (MySQL formatted string).
* @param array $exclude_appointments This array contains the ids of the appointments that
* will not be taken into consideration when the available time periods are calculated.
*
* @return array Returns an array with the available time periods of the provider.
*/
protected function _getProviderAvailableTimePeriods(
$provider_id,
$selected_date,
$exclude_appointments = []
)
{
$this->load->model('appointments_model');
$this->load->model('providers_model');
// Get the provider's working plan and reserved appointments.
$working_plan = json_decode($this->providers_model->get_setting('working_plan', $provider_id), TRUE);
// Get the provider's working plan exceptions.
$working_plan_exceptions = json_decode($this->providers_model->get_setting('working_plan_exceptions', $provider_id), TRUE);
$where_clause = [
'id_users_provider' => $provider_id
];
$reserved_appointments = $this->appointments_model->get_batch($where_clause);
// Sometimes it might be necessary to not take into account some appointment records
// in order to display what the providers' available time periods would be without them.
foreach ($exclude_appointments as $excluded_id)
{
foreach ($reserved_appointments as $index => $reserved)
{
if ($reserved['id'] == $excluded_id)
{
unset($reserved_appointments[$index]);
}
}
}
// Find the empty spaces on the plan. The first split between the plan is due to a break (if exist). After that
// every reserved appointment is considered to be a taken space in the plan.
$selected_date_working_plan = $working_plan[strtolower(date('l', strtotime($selected_date)))];
if (isset($working_plan_exceptions[$selected_date]))
{
$selected_date_working_plan = $working_plan_exceptions[$selected_date];
}
$available_periods_with_breaks = [];
if (isset($selected_date_working_plan['breaks']))
{
$start = new DateTime($selected_date_working_plan['start']);
$end = new DateTime($selected_date_working_plan['end']);
$available_periods_with_breaks[] = [
'start' => $selected_date_working_plan['start'],
'end' => $selected_date_working_plan['end']
];
// Split the working plan to available time periods that do not contain the breaks in them.
foreach ($selected_date_working_plan['breaks'] as $index => $break)
{
$break_start = new DateTime($break['start']);
$break_end = new DateTime($break['end']);
if ($break_start < $start)
{
$break_start = $start;
}
if ($break_end > $end)
{
$break_end = $end;
}
if ($break_start >= $break_end)
{
continue;
}
foreach ($available_periods_with_breaks as $key => $open_period)
{
$s = new DateTime($open_period['start']);
$e = new DateTime($open_period['end']);
if ($s < $break_end && $break_start < $e)
{ // check for overlap
$changed = FALSE;
if ($s < $break_start)
{
$open_start = $s;
$open_end = $break_start;
$available_periods_with_breaks[] = [
'start' => $open_start->format('H:i'),
'end' => $open_end->format('H:i')
];
$changed = TRUE;
}
if ($break_end < $e)
{
$open_start = $break_end;
$open_end = $e;
$available_periods_with_breaks[] = [
'start' => $open_start->format('H:i'),
'end' => $open_end->format('H:i')
];
$changed = TRUE;
}
if ($changed)
{
unset($available_periods_with_breaks[$key]);
}
}
}
}
}
// Break the empty periods with the reserved appointments.
$available_periods_with_appointments = $available_periods_with_breaks;
foreach ($reserved_appointments as $appointment)
{
foreach ($available_periods_with_appointments as $index => &$period)
{
$a_start = strtotime($appointment['start_datetime']);
$a_end = strtotime($appointment['end_datetime']);
$p_start = strtotime($selected_date . ' ' . $period['start']);
$p_end = strtotime($selected_date . ' ' . $period['end']);
if ($a_start <= $p_start && $a_end <= $p_end && $a_end <= $p_start)
{
// The appointment does not belong in this time period, so we
// will not change anything.
}
else
{
if ($a_start <= $p_start && $a_end <= $p_end && $a_end >= $p_start)
{
// The appointment starts before the period and finishes somewhere inside.
// We will need to break this period and leave the available part.
$period['start'] = date('H:i', $a_end);
}
else
{
if ($a_start >= $p_start && $a_end <= $p_end)
{
// The appointment is inside the time period, so we will split the period
// into two new others.
unset($available_periods_with_appointments[$index]);
$available_periods_with_appointments[] = [
'start' => date('H:i', $p_start),
'end' => date('H:i', $a_start)
];
$available_periods_with_appointments[] = [
'start' => date('H:i', $a_end),
'end' => date('H:i', $p_end)
];
}
else
{
if ($a_start >= $p_start && $a_end >= $p_start && $a_start <= $p_end)
{
// The appointment starts in the period and finishes out of it. We will
// need to remove the time that is taken from the appointment.
$period['end'] = date('H:i', $a_start);
}
else
{
if ($a_start >= $p_start && $a_end >= $p_end && $a_start >= $p_end)
{
// The appointment does not belong in the period so do not change anything.
}
else
{
if ($a_start <= $p_start && $a_end >= $p_end && $a_start <= $p_end)
{
// The appointment is bigger than the period, so this period needs to be removed.
unset($available_periods_with_appointments[$index]);
}
}
}
}
}
}
}
}
return array_values($available_periods_with_appointments);
}
/**
* Calculate the available appointment hours.
*
* Calculate the available appointment hours for the given date. The empty spaces
* are broken down to 15 min and if the service fit in each quarter then a new
* available hour is added to the "$available_hours" array.
*
* @param array $empty_periods Contains the empty periods as generated by the
* "_getProviderAvailableTimePeriods" method.
* @param string $selected_date The selected date to be search (format )
* @param int $service_duration The service duration is required for the hour calculation.
* @param bool $manage_mode (optional) Whether we are currently on manage mode (editing an existing appointment).
* @param string $availabilities_type Optional ('flexible'), the service availabilities type.
*
* @return array Returns an array with the available hours for the appointment.
*/
protected function _calculateAvailableHours(
array $empty_periods,
$selected_date,
$service_duration,
$manage_mode = FALSE,
$availabilities_type = 'flexible'
)
{
$this->load->model('settings_model');
$available_hours = [];
foreach ($empty_periods as $period)
{
$start_hour = new DateTime($selected_date . ' ' . $period['start']);
$end_hour = new DateTime($selected_date . ' ' . $period['end']);
$interval = $availabilities_type === AVAILABILITIES_TYPE_FIXED ? (int)$service_duration : 15;
$current_hour = $start_hour;
$diff = $current_hour->diff($end_hour);
while (($diff->h * 60 + $diff->i) >= intval($service_duration))
{
$available_hours[] = $current_hour->format('H:i');
$current_hour->add(new DateInterval('PT' . $interval . 'M'));
$diff = $current_hour->diff($end_hour);
}
}
return $available_hours;
}
/**
* Get multiple attendants hours.
*
* This method will add the additional appointment hours whenever a service accepts multiple attendants.
*
* @param string $selected_date The selected appointment date.
* @param array $service Selected service data.
* @param array $provider Selected provider data.
*
* @return array Returns the available hours array.
*/
protected function _getMultipleAttendantsHours(
$selected_date,
$service,
$provider
)
{
$this->load->model('appointments_model');
$this->load->model('services_model');
$this->load->model('providers_model');
$unavailabilities = $this->appointments_model->get_batch([
'is_unavailable' => TRUE,
'DATE(start_datetime)' => $selected_date,
'id_users_provider' => $provider['id']
]);
$working_plan = json_decode($provider['settings']['working_plan'], TRUE);
$working_day = strtolower(date('l', strtotime($selected_date)));
$working_hours = $working_plan[$working_day];
$periods = [
[
'start' => new DateTime($selected_date . ' ' . $working_hours['start']),
'end' => new DateTime($selected_date . ' ' . $working_hours['end'])
]
];
$periods = $this->_removeBreaks($selected_date, $periods, $working_hours['breaks']);
$periods = $this->_removeUnavailabilities($periods, $unavailabilities);
$hours = [];
$interval_value = $service['availabilities_type'] == AVAILABILITIES_TYPE_FIXED ? $service['duration'] : '15';
$interval = new DateInterval('PT' . (int)$interval_value . 'M');
$duration = new DateInterval('PT' . (int)$service['duration'] . 'M');
foreach ($periods as $period)
{
$slot_start = clone $period['start'];
$slot_end = clone $slot_start;
$slot_end->add($duration);
while ($slot_end <= $period['end'])
{
// Check reserved attendants for this time slot and see if current attendants fit.
$appointment_attendants_number = $this->appointments_model->get_attendants_number_for_period($slot_start,
$slot_end, $service['id']);
if ($appointment_attendants_number < $service['attendants_number'])
{
$hours[] = $slot_start->format('H:i');
}
$slot_start->add($interval);
$slot_end->add($interval);
}
}
return $hours;
}
/**
* Remove breaks from available time periods.
*
* @param string $selected_date Selected data (Y-m-d format).
* @param array $periods Time periods of the current date.
* @param array $breaks Breaks array for the current date.
*
* @return array Returns the available time periods without the breaks.
*/
public function _removeBreaks($selected_date, $periods, $breaks)
{
if ( ! $breaks)
{
return $periods;
}
foreach ($breaks as $break)
{
$break_start = new DateTime($selected_date . ' ' . $break['start']);
$break_end = new DateTime($selected_date . ' ' . $break['end']);
foreach ($periods as &$period)
{
$period_start = $period['start'];
$period_end = $period['end'];
if ($break_start <= $period_start && $break_end >= $period_start && $break_end <= $period_end)
{
// left
$period['start'] = $break_end;
continue;
}
if ($break_start >= $period_start && $break_start <= $period_end && $break_end >= $period_start && $break_end <= $period_end)
{
// middle
$period['end'] = $break_start;
$periods[] = [
'start' => $break_end,
'end' => $period_end
];
continue;
}
if ($break_start >= $period_start && $break_start <= $period_end && $break_end >= $period_end)
{
// right
$period['end'] = $break_start;
continue;
}
if ($break_start <= $period_start && $break_end >= $period_end)
{
// break contains period
$period['start'] = $break_end;
continue;
}
}
}
return $periods;
}
/**
* Remove the unavailabilities from the available time periods of the selected date.
*
* @param array $periods Available time periods.
* @param array $unavailabilities Unavailabilities of the current date.
*
* @return array Returns the available time periods without the unavailabilities.
*/
public function _removeUnavailabilities($periods, $unavailabilities)
{
foreach ($unavailabilities as $unavailability)
{
$unavailability_start = new DateTime($unavailability['start_datetime']);
$unavailability_end = new DateTime($unavailability['end_datetime']);
foreach ($periods as &$period)
{
$period_start = $period['start'];
$period_end = $period['end'];
if ($unavailability_start <= $period_start && $unavailability_end >= $period_start && $unavailability_end <= $period_end)
{
// left
$period['start'] = $unavailability_end;
continue;
}
if ($unavailability_start >= $period_start && $unavailability_start <= $period_end && $unavailability_end >= $period_start && $unavailability_end <= $period_end)
{
// middle
$period['end'] = $unavailability_start;
$periods[] = [
'start' => $unavailability_end,
'end' => $period_end
];
continue;
}
if ($unavailability_start >= $period_start && $unavailability_start <= $period_end && $unavailability_end >= $period_end)
{
// right
$period['end'] = $unavailability_start;
continue;
}
if ($unavailability_start <= $period_start && $unavailability_end >= $period_end)
{
// Unavaibility contains period
$period['start'] = $unavailability_end;
continue;
}
}
}
return $periods;
}
}

View file

@ -0,0 +1,188 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.2.0
* ---------------------------------------------------------------------------- */
require_once __DIR__ . '/API_V1_Controller.php';
use EA\Engine\Api\V1\Request;
use EA\Engine\Api\V1\Response;
use EA\Engine\Types\NonEmptyText;
/**
* Categories Controller
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class Categories extends API_V1_Controller {
/**
* Categories Resource Parser
*
* @var \EA\Engine\Api\V1\Parsers\Categories
*/
protected $parser;
/**
* Class Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->model('services_model');
$this->parser = new \EA\Engine\Api\V1\Parsers\Categories;
}
/**
* GET API Method
*
* @param int $id Optional (null), the record ID to be returned.
*/
public function get($id = NULL)
{
try
{
$condition = $id !== NULL ? 'id = ' . $id : '';
$categories = $this->services_model->get_all_categories($condition);
if ($id !== NULL && count($categories) === 0)
{
$this->_throwRecordNotFound();
}
$response = new Response($categories);
$response->encode($this->parser)
->search()
->sort()
->paginate()
->minimize()
->singleEntry($id)
->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* POST API Method
*/
public function post()
{
try
{
// Insert the category to the database.
$request = new Request();
$category = $request->getBody();
$this->parser->decode($category);
if (isset($category['id']))
{
unset($category['id']);
}
$id = $this->services_model->add_category($category);
// Fetch the new object from the database and return it to the client.
$batch = $this->services_model->get_all_categories('id = ' . $id);
$response = new Response($batch);
$status = new NonEmptyText('201 Created');
$response->encode($this->parser)->singleEntry(TRUE)->output($status);
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* PUT API Method
*
* @param int $id The record ID to be updated.
*/
public function put($id)
{
try
{
// Update the category record.
$batch = $this->services_model->get_all_categories('id = ' . $id);
if ($id !== NULL && count($batch) === 0)
{
$this->_throwRecordNotFound();
}
$request = new Request();
$updatedCategory = $request->getBody();
$baseCategory = $batch[0];
$this->parser->decode($updatedCategory, $baseCategory);
$updatedCategory['id'] = $id;
$id = $this->services_model->add_category($updatedCategory);
// Fetch the updated object from the database and return it to the client.
$batch = $this->services_model->get_all_categories('id = ' . $id);
$response = new Response($batch);
$response->encode($this->parser)->singleEntry($id)->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* DELETE API Method
*
* @param int $id The record ID to be deleted.
*/
public function delete($id)
{
try
{
$result = $this->services_model->delete_category($id);
$response = new Response([
'code' => 200,
'message' => 'Record was deleted successfully!'
]);
$response->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
}

View file

@ -0,0 +1,188 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.2.0
* ---------------------------------------------------------------------------- */
require_once __DIR__ . '/API_V1_Controller.php';
use EA\Engine\Api\V1\Request;
use EA\Engine\Api\V1\Response;
use EA\Engine\Types\NonEmptyText;
/**
* Customers Controller
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class Customers extends API_V1_Controller {
/**
* Customers Resource Parser
*
* @var \EA\Engine\Api\V1\Parsers\Customers
*/
protected $parser;
/**
* Class Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->model('customers_model');
$this->parser = new \EA\Engine\Api\V1\Parsers\Customers;
}
/**
* GET API Method
*
* @param int $id Optional (null), the record ID to be returned.
*/
public function get($id = NULL)
{
try
{
$condition = $id !== NULL ? 'id = ' . $id : NULL;
$customers = $this->customers_model->get_batch($condition);
if ($id !== NULL && count($customers) === 0)
{
$this->_throwRecordNotFound();
}
$response = new Response($customers);
$response->encode($this->parser)
->search()
->sort()
->paginate()
->minimize()
->singleEntry($id)
->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* POST API Method
*/
public function post()
{
try
{
// Insert the customer to the database.
$request = new Request();
$customer = $request->getBody();
$this->parser->decode($customer);
if (isset($customer['id']))
{
unset($customer['id']);
}
$id = $this->customers_model->add($customer);
// Fetch the new object from the database and return it to the client.
$batch = $this->customers_model->get_batch('id = ' . $id);
$response = new Response($batch);
$status = new NonEmptyText('201 Created');
$response->encode($this->parser)->singleEntry(TRUE)->output($status);
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* PUT API Method
*
* @param int $id The record ID to be updated.
*/
public function put($id)
{
try
{
// Update the customer record.
$batch = $this->customers_model->get_batch('id = ' . $id);
if ($id !== NULL && count($batch) === 0)
{
$this->_throwRecordNotFound();
}
$request = new Request();
$updatedCustomer = $request->getBody();
$baseCustomer = $batch[0];
$this->parser->decode($updatedCustomer, $baseCustomer);
$updatedCustomer['id'] = $id;
$id = $this->customers_model->add($updatedCustomer);
// Fetch the updated object from the database and return it to the client.
$batch = $this->customers_model->get_batch('id = ' . $id);
$response = new Response($batch);
$response->encode($this->parser)->singleEntry($id)->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* DELETE API Method
*
* @param int $id The record ID to be deleted.
*/
public function delete($id)
{
try
{
$result = $this->customers_model->delete($id);
$response = new Response([
'code' => 200,
'message' => 'Record was deleted successfully!'
]);
$response->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
}

View file

@ -0,0 +1,188 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.2.0
* ---------------------------------------------------------------------------- */
require_once __DIR__ . '/API_V1_Controller.php';
use EA\Engine\Api\V1\Request;
use EA\Engine\Api\V1\Response;
use EA\Engine\Types\NonEmptyText;
/**
* Providers Controller
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class Providers extends API_V1_Controller {
/**
* Providers Resource Parser
*
* @var \EA\Engine\Api\V1\Parsers\Providers
*/
protected $parser;
/**
* Class Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->model('providers_model');
$this->parser = new \EA\Engine\Api\V1\Parsers\Providers;
}
/**
* GET API Method
*
* @param int $id Optional (null), the record ID to be returned.
*/
public function get($id = NULL)
{
try
{
$condition = $id !== NULL ? 'id = ' . $id : NULL;
$providers = $this->providers_model->get_batch($condition);
if ($id !== NULL && count($providers) === 0)
{
$this->_throwRecordNotFound();
}
$response = new Response($providers);
$response->encode($this->parser)
->search()
->sort()
->paginate()
->minimize()
->singleEntry($id)
->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* POST API Method
*/
public function post()
{
try
{
// Insert the provider to the database.
$request = new Request();
$provider = $request->getBody();
$this->parser->decode($provider);
if (isset($provider['id']))
{
unset($provider['id']);
}
$id = $this->providers_model->add($provider);
// Fetch the new object from the database and return it to the client.
$batch = $this->providers_model->get_batch('id = ' . $id);
$response = new Response($batch);
$status = new NonEmptyText('201 Created');
$response->encode($this->parser)->singleEntry(TRUE)->output($status);
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* PUT API Method
*
* @param int $id The record ID to be updated.
*/
public function put($id)
{
try
{
// Update the provider record.
$batch = $this->providers_model->get_batch('id = ' . $id);
if ($id !== NULL && count($batch) === 0)
{
$this->_throwRecordNotFound();
}
$request = new Request();
$updatedProvider = $request->getBody();
$baseProvider = $batch[0];
$this->parser->decode($updatedProvider, $baseProvider);
$updatedProvider['id'] = $id;
$id = $this->providers_model->add($updatedProvider);
// Fetch the updated object from the database and return it to the client.
$batch = $this->providers_model->get_batch('id = ' . $id);
$response = new Response($batch);
$response->encode($this->parser)->singleEntry($id)->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* DELETE API Method
*
* @param int $id The record ID to be deleted.
*/
public function delete($id)
{
try
{
$result = $this->providers_model->delete($id);
$response = new Response([
'code' => 200,
'message' => 'Record was deleted successfully!'
]);
$response->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
}

View file

@ -0,0 +1,188 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.2.0
* ---------------------------------------------------------------------------- */
require_once __DIR__ . '/API_V1_Controller.php';
use EA\Engine\Api\V1\Request;
use EA\Engine\Api\V1\Response;
use EA\Engine\Types\NonEmptyText;
/**
* Secretaries Controller
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class Secretaries extends API_V1_Controller {
/**
* Secretaries Resource Parser
*
* @var \EA\Engine\Api\V1\Parsers\Secretaries
*/
protected $parser;
/**
* Class Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->model('secretaries_model');
$this->parser = new \EA\Engine\Api\V1\Parsers\Secretaries;
}
/**
* GET API Method
*
* @param int $id Optional (null), the record ID to be returned.
*/
public function get($id = NULL)
{
try
{
$condition = $id !== NULL ? 'id = ' . $id : NULL;
$secretaries = $this->secretaries_model->get_batch($condition);
if ($id !== NULL && count($secretaries) === 0)
{
$this->_throwRecordNotFound();
}
$response = new Response($secretaries);
$response->encode($this->parser)
->search()
->sort()
->paginate()
->minimize()
->singleEntry($id)
->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* POST API Method
*/
public function post()
{
try
{
// Insert the secretary to the database.
$request = new Request();
$secretary = $request->getBody();
$this->parser->decode($secretary);
if (isset($secretary['id']))
{
unset($secretary['id']);
}
$id = $this->secretaries_model->add($secretary);
// Fetch the new object from the database and return it to the client.
$batch = $this->secretaries_model->get_batch('id = ' . $id);
$response = new Response($batch);
$status = new NonEmptyText('201 Created');
$response->encode($this->parser)->singleEntry(TRUE)->output($status);
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* PUT API Method
*
* @param int $id The record ID to be updated.
*/
public function put($id)
{
try
{
// Update the secretary record.
$batch = $this->secretaries_model->get_batch('id = ' . $id);
if ($id !== NULL && count($batch) === 0)
{
$this->_throwRecordNotFound();
}
$request = new Request();
$updatedSecretary = $request->getBody();
$baseSecretary = $batch[0];
$this->parser->decode($updatedSecretary, $baseSecretary);
$updatedSecretary['id'] = $id;
$id = $this->secretaries_model->add($updatedSecretary);
// Fetch the updated object from the database and return it to the client.
$batch = $this->secretaries_model->get_batch('id = ' . $id);
$response = new Response($batch);
$response->encode($this->parser)->singleEntry($id)->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* DELETE API Method
*
* @param int $id The record ID to be deleted.
*/
public function delete($id)
{
try
{
$result = $this->secretaries_model->delete($id);
$response = new Response([
'code' => 200,
'message' => 'Record was deleted successfully!'
]);
$response->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
}

View file

@ -0,0 +1,188 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.2.0
* ---------------------------------------------------------------------------- */
require_once __DIR__ . '/API_V1_Controller.php';
use EA\Engine\Api\V1\Request;
use EA\Engine\Api\V1\Response;
use EA\Engine\Types\NonEmptyText;
/**
* Services Controller
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class Services extends API_V1_Controller {
/**
* Services Resource Parser
*
* @var \EA\Engine\Api\V1\Parsers\Services
*/
protected $parser;
/**
* Class Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->model('services_model');
$this->parser = new \EA\Engine\Api\V1\Parsers\Services;
}
/**
* GET API Method
*
* @param int $id Optional (null), the record ID to be returned.
*/
public function get($id = NULL)
{
try
{
$condition = $id !== NULL ? 'id = ' . $id : NULL;
$services = $this->services_model->get_batch($condition);
if ($id !== NULL && count($services) === 0)
{
$this->_throwRecordNotFound();
}
$response = new Response($services);
$response->encode($this->parser)
->search()
->sort()
->paginate()
->minimize()
->singleEntry($id)
->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* POST API Method
*/
public function post()
{
try
{
// Insert the service to the database.
$request = new Request();
$service = $request->getBody();
$this->parser->decode($service);
if (isset($service['id']))
{
unset($service['id']);
}
$id = $this->services_model->add($service);
// Fetch the new object from the database and return it to the client.
$batch = $this->services_model->get_batch('id = ' . $id);
$response = new Response($batch);
$status = new NonEmptyText('201 Created');
$response->encode($this->parser)->singleEntry(TRUE)->output($status);
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* PUT API Method
*
* @param int $id The record ID to be updated.
*/
public function put($id)
{
try
{
// Update the service record.
$batch = $this->services_model->get_batch('id = ' . $id);
if ($id !== NULL && count($batch) === 0)
{
$this->_throwRecordNotFound();
}
$request = new Request();
$updatedService = $request->getBody();
$baseService = $batch[0];
$this->parser->decode($updatedService, $baseService);
$updatedService['id'] = $id;
$id = $this->services_model->add($updatedService);
// Fetch the updated object from the database and return it to the client.
$batch = $this->services_model->get_batch('id = ' . $id);
$response = new Response($batch);
$response->encode($this->parser)->singleEntry($id)->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
/**
* DELETE API Method
*
* @param int $id The record ID to be deleted.
*/
public function delete($id)
{
try
{
$result = $this->services_model->delete($id);
$response = new Response([
'code' => 200,
'message' => 'Record was deleted successfully!'
]);
$response->output();
}
catch (Exception $exception)
{
$this->_handleException($exception);
}
}
}

View file

@ -0,0 +1,168 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.2.0
* ---------------------------------------------------------------------------- */
require_once __DIR__ . '/API_V1_Controller.php';
use EA\Engine\Api\V1\Request;
use EA\Engine\Api\V1\Response;
/**
* Settings Controller
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class Settings extends API_V1_Controller {
/**
* Settings Resource Parser
*
* @var \EA\Engine\Api\V1\Parsers\Settings
*/
protected $parser;
/**
* Class Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->model('settings_model');
$this->parser = new \EA\Engine\Api\V1\Parsers\Settings;
}
/**
* GET API Method
*
* @param string $name Optional (null), the setting name to be returned.
*/
public function get($name = NULL)
{
try
{
$settings = $this->settings_model->get_settings();
if ($name !== NULL)
{
$setting = NULL;
foreach ($settings as $entry)
{
if ($entry['name'] === $name)
{
$setting = $entry;
break;
}
}
if (empty($setting))
{
$this->_throwRecordNotFound();
}
unset($setting['id']);
$settings = [
$setting
];
}
$response = new Response($settings);
$response->encode($this->parser)
->search()
->sort()
->paginate()
->minimize()
->singleEntry($name)
->output();
}
catch (Exception $exception)
{
exit($this->_handleException($exception));
}
}
/**
* PUT API Method
*
* @param string $name The setting name to be inserted/updated.
*/
public function put($name)
{
try
{
$request = new Request();
$value = $request->getBody()['value'];
$this->settings_model->set_setting($name, $value);
// Fetch the updated object from the database and return it to the client.
$response = new Response([
[
'name' => $name,
'value' => $value
]
]);
$response->encode($this->parser)->singleEntry($name)->output();
}
catch (Exception $exception)
{
exit($this->_handleException($exception));
}
}
/**
* DELETE API Method
*
* @param string $name The setting name to be deleted.
*/
public function delete($name)
{
try
{
$result = $this->settings_model->remove_setting($name);
$response = new Response([
'code' => 200,
'message' => 'Record was deleted successfully!'
]);
$response->output();
}
catch (Exception $exception)
{
exit($this->_handleException($exception));
}
}
}

View file

@ -0,0 +1,188 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.2.0
* ---------------------------------------------------------------------------- */
require_once __DIR__ . '/API_V1_Controller.php';
use EA\Engine\Api\V1\Request;
use EA\Engine\Api\V1\Response;
use EA\Engine\Types\NonEmptyText;
/**
* Unavailabilities Controller
*
* @property CI_Session $session
* @property CI_Loader $load
* @property CI_Input $input
* @property CI_Output $output
* @property CI_Config $config
* @property CI_Lang $lang
* @property CI_Cache $cache
* @property CI_DB_query_builder $db
* @property CI_Security $security
* @property Google_Sync $google_sync
* @property Ics_file $ics_file
* @property Appointments_Model $appointments_model
* @property Providers_Model $providers_model
* @property Services_Model $services_model
* @property Customers_Model $customers_model
* @property Settings_Model $settings_model
* @property Timezones $timezones
* @property Roles_Model $roles_model
* @property Secretaries_Model $secretaries_model
* @property Admins_Model $admins_model
* @property User_Model $user_model
*
* @package Controllers
*/
class Unavailabilities extends API_V1_Controller {
/**
* Unavailabilities Resource Parser
*
* @var \EA\Engine\Api\V1\Parsers\Unavailabilities
*/
protected $parser;
/**
* Class Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->model('appointments_model');
$this->parser = new \EA\Engine\Api\V1\Parsers\Unavailabilities;
}
/**
* GET API Method
*
* @param int $id Optional (null), the record ID to be returned.
*/
public function get($id = NULL)
{
try
{
$condition = $id !== NULL ? 'id = ' . $id : 'is_unavailable = 1';
$unavailabilities = $this->appointments_model->get_batch($condition);
if ($id !== NULL && count($unavailabilities) === 0)
{
$this->_throwRecordNotFound();
}
$response = new Response($unavailabilities);
$response->encode($this->parser)
->search()
->sort()
->paginate()
->minimize()
->singleEntry($id)
->output();
}
catch (Exception $exception)
{
exit($this->_handleException($exception));
}
}
/**
* POST API Method
*/
public function post()
{
try
{
// Insert the appointment to the database.
$request = new Request();
$unavailability = $request->getBody();
$this->parser->decode($unavailability);
if (isset($unavailability['id']))
{
unset($unavailability['id']);
}
$id = $this->appointments_model->add_unavailable($unavailability);
// Fetch the new object from the database and return it to the client.
$batch = $this->appointments_model->get_batch('id = ' . $id);
$response = new Response($batch);
$status = new NonEmptyText('201 Created');
$response->encode($this->parser)->singleEntry(TRUE)->output($status);
}
catch (Exception $exception)
{
exit($this->_handleException($exception));
}
}
/**
* PUT API Method
*
* @param int $id The record ID to be updated.
*/
public function put($id)
{
try
{
// Update the appointment record.
$batch = $this->appointments_model->get_batch('id = ' . $id);
if ($id !== NULL && count($batch) === 0)
{
$this->_throwRecordNotFound();
}
$request = new Request();
$updatedUnavailability = $request->getBody();
$baseUnavailability = $batch[0];
$this->parser->decode($updatedUnavailability, $baseUnavailability);
$updatedUnavailability['id'] = $id;
$id = $this->appointments_model->add_unavailable($updatedUnavailability);
// Fetch the updated object from the database and return it to the client.
$batch = $this->appointments_model->get_batch('id = ' . $id);
$response = new Response($batch);
$response->encode($this->parser)->singleEntry($id)->output();
}
catch (Exception $exception)
{
exit($this->_handleException($exception));
}
}
/**
* DELETE API Method
*
* @param int $id The record ID to be deleted.
*/
public function delete($id)
{
try
{
$result = $this->appointments_model->delete_unavailable($id);
$response = new Response([
'code' => 200,
'message' => 'Record was deleted successfully!'
]);
$response->output();
}
catch (Exception $exception)
{
exit($this->_handleException($exception));
}
}
}

View file

@ -0,0 +1,44 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.3.0
* ---------------------------------------------------------------------------- */
/**
* Assets URL helper function.
*
* This function will create an asset file URL that includes a cache busting parameter in order
* to invalidate the browser cache in case of an update.
*
* @param string $uri Relative URI (just like the one used in the base_url helper).
* @param string|null $protocol Valid URI protocol.
*
* @return string Returns the final asset URL.
*/
function asset_url($uri = '', $protocol = NULL)
{
$framework =& get_instance();
$debug = $framework->config->item('debug');
$cache_busting_token = ! $debug ? '?' . $framework->config->item('cache_busting_token') : '';
if (strpos(basename($uri), '.js') !== FALSE && strpos(basename($uri), '.min.js') === FALSE && ! $debug)
{
$uri = str_replace('.js', '.min.js', $uri);
}
if (strpos(basename($uri), '.css') !== FALSE && strpos(basename($uri), '.min.css') === FALSE && ! $debug)
{
$uri = str_replace('.css', '.min.css', $uri);
}
return base_url($uri . $cache_busting_token, $protocol);
}

View file

@ -0,0 +1,26 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.3.0
* ---------------------------------------------------------------------------- */
/**
* Quickly fetch the value of a framework configuration.
*
* @param string $key Configuration key.
*
* @return mixed Returns the configuration value.
*/
function config($key)
{
$framework = &get_instance();
return $framework->config->item($key);
}

View file

@ -0,0 +1,44 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.0.0
* ---------------------------------------------------------------------------- */
/**
* Print an exception to an HTML text.
*
* This method is used to display exceptions in a way that is useful and easy
* for the user to see. It uses the Bootstrap CSS accordion markup to display
* the message and when the user clicks on it the exception trace will be revealed.
* We display only one exceptions at a time because the user needs to be able
* to display the details of each exception seperately. (In contrast with js).
*
* @param Exception $exception The exception to be displayed.
* @return string Returns the html markup of the exception.
*/
function exceptionToHtml($exception)
{
return
'<div class="accordion" id="error-accordion">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" data-toggle="collapse"
data-parent="#error-accordion" href="#error-technical">' .
$exception->getMessage() . '
</a>
</div>
<div id="error-technical" class="accordion-body collapse">
<div class="accordion-inner">
<pre>' . $exception->getTraceAsString() . '</pre>
</div>
</div>
</div>
</div>';
}

View file

@ -0,0 +1,28 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.0.0
* ---------------------------------------------------------------------------- */
/**
* Check if a string date is valid for insertion or update
* to the database.
*
* @param string $datetime The given date.
* @return bool Returns the validation result.
*
* @link http://stackoverflow.com/a/8105844/1718162 [SOURCE]
*/
function validate_mysql_datetime($datetime)
{
$dt = DateTime::createFromFormat('Y-m-d H:i:s', $datetime);
return $dt ? TRUE : FALSE;
}

View file

@ -0,0 +1,85 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.0.0
* ---------------------------------------------------------------------------- */
/**
* Get date in RFC3339
*
* For example used in XML/Atom
*
* @link http://stackoverflow.com/questions/5671433/php-time-to-google-calendar-dates-time-format
*
* @param integer $timestamp
*
* @return string date in RFC3339
*
* @author Boris Korobkov
*/
function date3339($timestamp = 0)
{
if ( ! $timestamp)
{
$timestamp = time();
}
$date = date('Y-m-d\TH:i:s', $timestamp);
$matches = [];
if (preg_match('/^([\-+])(\d{2})(\d{2})$/', date('O', $timestamp), $matches))
{
$date .= $matches[1] . $matches[2] . ':' . $matches[3];
}
else
{
$date .= 'Z';
}
return $date;
}
/**
* Generate a hash of password string.
*
* For user security, all system passwords are stored in hash string into the database. Use this method to produce the
* hashed password.
*
* @param string $salt Salt value for current user. This value is stored on the database and is used when generating
* the password hash.
* @param string $password Given string password.
*
* @return string Returns the hash string of the given password.
*/
function hash_password($salt, $password)
{
$half = (int)(strlen($salt) / 2);
$hash = hash('sha256', substr($salt, 0, $half) . $password . substr($salt, $half));
for ($i = 0; $i < 100000; $i++)
{
$hash = hash('sha256', $hash);
}
return $hash;
}
/**
* Generate a new password salt.
*
* This method will not check if the salt is unique in database. This must be done
* from the calling procedure.
*
* @return string Returns a salt string.
*/
function generate_salt()
{
$max_length = 100;
$salt = hash('sha256', (uniqid(rand(), TRUE)));
return substr($salt, 0, $max_length);
}

View file

@ -0,0 +1,42 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.1.0
* ---------------------------------------------------------------------------- */
/**
* Print Google Analytics script.
*
* This helper function should be used in view files in order to output the Google Analytics script. It will check
* whether the code is set in the database and print it, otherwise nothing will be outputted. This eliminates the need
* for extra checking before outputting.
*/
function google_analytics_script()
{
$framework =& get_instance();
$framework->load->model('settings_model');
$google_analytics_code = $framework->settings_model->get_setting('google_analytics_code');
if ($google_analytics_code !== '')
{
echo '
<script>
(function(i,s,o,g,r,a,m){i["GoogleAnalyticsObject"]=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,"script","//www.google-analytics.com/analytics.js","ga");
ga("create", "' . $google_analytics_code . '", "auto");
ga("send", "pageview");
</script>
';
}
}

View file

@ -0,0 +1,29 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.1.0
* ---------------------------------------------------------------------------- */
/**
* Check if Easy!Appointments is installed.
*
* This function will check some factors to determine if Easy!Appointments is installed or not. It is possible that the
* installation is properly configure without being recognized by this method.
*
* Notice: You can add more checks into this file in order to further check the installation state of the application.
*
* @return bool Returns whether E!A is installed or not.
*/
function is_app_installed()
{
$framework =& get_instance();
return $framework->db->table_exists('users');
}

View file

@ -0,0 +1,33 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) 2013 - 2020, Alex Tselegidis
* @license http://opensource.org/licenses/GPL-3.0 - GPLv3
* @link http://easyappointments.org
* @since v1.4.0
* ---------------------------------------------------------------------------- */
/**
* Render the HTML output of a timezone dropdown element.
*
* @param string $attributes HTML element attributes of the dropdown.
* @return false|string
*/
function render_timezone_dropdown($attributes = '')
{
$framework = get_instance();
$framework->load->library('timezones');
$timezones = $framework->timezones->to_grouped_array();
ob_start();
require __DIR__ . '/../views/partial/timezone_dropdown.php';
return ob_get_clean();
}

View file

@ -0,0 +1,323 @@
<?php
// Arabic
$lang['page_title'] = 'احجز موعد مع';
$lang['service_and_provider'] = 'اختر الخدمة والمزود';
$lang['select_service'] = 'اختر الخدمة';
$lang['select_provider'] = 'اختر المزود';
$lang['duration'] = 'المدة';
$lang['minutes'] = 'دقائق';
$lang['price'] = 'السعر';
$lang['back'] = 'الخلف';
$lang['appointment_date_and_time'] = 'اختر وقت وتاريخ الموعد';
$lang['no_available_hours'] = 'لا يوجد مواعيد متاحة في الوقت الذي تم إختياره الرجاء اختيار وقت آخر';
$lang['appointment_hour_missing'] = 'الرجاء اختيار ساعة الموعد قبل الإكمال';
$lang['customer_information'] = 'أدخل بياناتك';
$lang['first_name'] = 'الاسم الأول';
$lang['last_name'] = 'العائلة';
$lang['email'] = 'البريد الإلكتروني';
$lang['phone_number'] = 'رقم الجوال';
$lang['address'] = 'العنوان';
$lang['city'] = 'المدينة';
$lang['zip_code'] = 'الرمز البريدي';
$lang['notes'] = 'ملاحظات';
$lang['fields_are_required'] = 'الحقول ب* مطلوب تعبئتها';
$lang['appointment_confirmation'] = 'تأكيد الموعد';
$lang['confirm'] = 'تأكيد';
$lang['update'] = 'تحديث';
$lang['cancel_appointment_hint'] = ' .إضغط زر "إلغاء" لحذف الموعد من الجدول';
$lang['cancel'] = 'إلغاء';
$lang['appointment_registered'] = '!تم تسجيل الموعد بنجاح';
$lang['cancel_appointment_title'] = 'إلغاء الموعد';
$lang['appointment_cancelled'] = '!تم إلغاء الموعد بنجاح';
$lang['appointment_cancelled_title'] = 'تم إلغاء الموعد';
$lang['reason'] = 'السبب';
$lang['appointment_removed_from_schedule'] = 'المواعيد التالية تم حذفها من الجدول';
$lang['appointment_details_was_sent_to_you'] = 'تم إرسال تفاصيل الموعد الى البريد الالكتروني الخاص بك';
$lang['add_to_google_calendar'] = 'اضافة تقويم جوجل';
$lang['appointment_booked'] = '!تم حجز الموعد بنجاح';
$lang['thank_you_for_appointment'] = 'شكرا لحجزك معنا موعد . تستطيع رؤية تفاصيل الموعد والحجز أدناه . يمكنك التعديل عليه بالضغط على الرابط.';
$lang['appointment_details_title'] = 'تفاصيل الموعد';
$lang['customer_details_title'] = 'تفاصيل الزبون';
$lang['service'] = 'الخدمة';
$lang['provider'] = 'المزود';
$lang['customer'] = 'الزبون';
$lang['start'] = 'البداية';
$lang['end'] = 'النهاية';
$lang['name'] = 'الإسم';
$lang['appointment_link_title'] = 'رابط الموعد';
$lang['success'] = ' !تم بنجاح';
$lang['appointment_added_to_google_calendar'] = 'تم اضافة الموعد الى تقويم جوجل الخاص بحسابك';
$lang['view_appointment_in_google_calendar'] = ' اضغط هنا لمشاهدة الموعد على تقويم جوجل الخاص بحسابك ';
$lang['appointment_added_to_your_plan'] = 'تم اضافة موعد الى خطتك';
$lang['appointment_link_description'] = 'تستطيع عمل اي تعديلات بالضغط على رابط الموعد أدناه';
$lang['appointment_not_found'] = 'لم يتم العثور على الموعد.';
$lang['appointment_does_not_exist_in_db'] = 'الموعد الذي قمت بطلبه لم يعد موجودا في بيانات البرنامج';
$lang['display_calendar'] = 'اظهار التقويم';
$lang['calendar'] = 'التقويم';
$lang['users'] = 'المستخدمون';
$lang['settings'] = 'الاعدادات';
$lang['log_out'] = 'تسجيل الخروج';
$lang['synchronize'] = 'المزامنة';
$lang['enable_sync'] = 'تمكين المزامنة';
$lang['disable_sync'] = 'تعطيل المزامنة';
$lang['reload'] = 'اعادة التحميل';
$lang['appointment'] = 'الموعد';
$lang['unavailable'] = 'غير متوفر';
$lang['week'] = 'الأسبوع';
$lang['month'] = 'الشهر';
$lang['today'] = 'اليوم';
$lang['not_working'] = 'لا يعمل';
$lang['break'] = 'استراحة';
$lang['add'] = 'اضافة';
$lang['edit'] = 'تعديل';
$lang['hello'] = 'مرحبا';
$lang['all_day'] = 'طوال اليوم';
$lang['manage_appointment_record_hint'] = 'إدارة جميع سجلات المواعيد للمزودين والخدمات';
$lang['select_filter_item_hint'] = 'اختار مزود أو خدمة وانظر للمواعيد على التقويم ';
$lang['enable_appointment_sync_hint'] = 'تمكين المزامنة للمواعيد على تقويم جوجل الخاص بالمزود';
$lang['manage_customers_hint'] = 'ادارة الزبائن المسجلين واستعراض حجوزاتهم السابقة';
$lang['manage_services_hint'] = 'ادارة الخدمات والأقسام أو الفئات المتاحة في البرنامج';
$lang['manage_users_hint'] = 'ادارة المستخدمين (مدراء البرنامج, المزودين, السكرتيريين).';
$lang['settings_hint'] = 'ضبط البرنامج أو اعدادات المستخدمين';
$lang['log_out_hint'] = 'تسجيل الخروج من البرنامج';
$lang['unavailable_periods_hint'] = 'خلال الفترات الغير متوفرة لن يقبل المزود اي موعد';
$lang['new_appointment_hint'] = 'انشاء موعد جديد وتخزينه في قاعدة البيانات';
$lang['reload_appointments_hint'] = 'اعادة تحميل تقويم المواعيد';
$lang['trigger_google_sync_hint'] = 'تشغيل عملية مزامنة تقويم جوجل.';
$lang['appointment_updated'] = 'تم تحديث الموعد بنجاح.';
$lang['undo'] = 'تراجع';
$lang['appointment_details_changed'] = 'تم تعديل تفاصيل الموعد بنجاح';
$lang['appointment_changes_saved'] = 'تم حفظ التعديلات على الموعد بنجاح.';
$lang['save'] = 'تخزين';
$lang['new'] = 'جديد';
$lang['select'] = 'تحديد';
$lang['hide'] = 'اخفاء';
$lang['type_to_filter_customers'] = 'اكتب لتصفية الزبائن';
$lang['clear_fields_add_existing_customer_hint'] = 'تنظيف الحقول واضافة زبون جديد';
$lang['pick_existing_customer_hint'] = 'اختيار زبون موجود سابقا';
$lang['new_appointment_title'] = 'موعد جديد';
$lang['edit_appointment_title'] = 'تعديل موعد';
$lang['delete_appointment_title'] = 'حذف موعد';
$lang['write_appointment_removal_reason'] = ':الرجاء كتابة سبب حذف الموعد ';
$lang['appointment_saved'] = 'تم حفظ الموعد بنجاح';
$lang['new_unavailable_title'] = 'فترة غير متاحة جديدة';
$lang['edit_unavailable_title'] = 'تعديل فترة غير متاحة';
$lang['unavailable_saved'] = 'تم حفظ الفترة الغير متاحة بنجاح';
$lang['start_date_before_end_error'] = 'تاريخ البداية أكبر من تاريخ الانتهاء.';
$lang['invalid_email'] = 'بريد الكتروني غير صحيح';
$lang['customers'] = 'الزبائن';
$lang['details'] = 'التفاصيل';
$lang['no_records_found'] = 'لا يوجد أي تسجيل ..';
$lang['services'] = 'الخدمات';
$lang['duration_minutes'] = 'المدة (الدقائق)';
$lang['currency'] = 'العملة';
$lang['category'] = 'الفئة';
$lang['no_category'] = 'لا يوجد فئة';
$lang['description'] = 'الوصف';
$lang['categories'] = 'الفئات';
$lang['admins'] = 'المسؤولين';
$lang['providers'] = 'المزودون';
$lang['secretaries'] = 'السيكرتاريين';
$lang['mobile_number'] = 'رقم الهاتف';
$lang['state'] = 'الحالة';
$lang['username'] = 'اسم المستخدم';
$lang['password'] = 'كلمة المرور';
$lang['retype_password'] = 'كتابة كلمة المرور مرة أخرى';
$lang['receive_notifications'] = 'تلّقي الاشعارات';
$lang['passwords_mismatch'] = 'كلمتا السر غير متطابقتين';
$lang['admin_saved'] = 'تم حفظ المسؤول بنجاح';
$lang['provider_saved'] = 'تم حفظ المزود بنجاح';
$lang['secretary_saved'] = 'تم حفظ السكرتير بنجاح';
$lang['admin_deleted'] = 'تم حذف المسؤول بنجاح';
$lang['provider_deleted'] = 'تم حذف المزود بنجاح';
$lang['secretary_deleted'] = 'تم حذف السيكرتير بنجاح';
$lang['service_saved'] = 'تم حفظ الخدمة بنجاح';
$lang['service_category_saved'] = 'تم حفظ فئة الخدمة بنجاح';
$lang['service_deleted'] = 'تم حذف الخدمة بنجاح';
$lang['service_category_deleted'] = 'تم حذف فئة الخدمة بنجاح';
$lang['customer_saved'] = 'تم حفظ الزبون بنجاح';
$lang['customer_deleted'] = 'تم حذف الزبون بنجاح';
$lang['current_view'] = 'الرعض الحالي';
$lang['working_plan'] = 'خطة العمل';
$lang['reset_plan'] = 'اعادة تهيئة الخطة';
$lang['monday'] = 'الاثنين';
$lang['tuesday'] = 'الثلاثاء';
$lang['wednesday'] = 'الأربعاء';
$lang['thursday'] = 'الخميس';
$lang['friday'] = 'الجمعة';
$lang['saturday'] = 'السبت';
$lang['sunday'] = 'الأحد';
$lang['breaks'] = 'الاستراحات';
$lang['add_breaks_during_each_day'] = 'اضافة فترة الاستراحة في كل يوم . في فترة الاستراحة لن يستقبل المزود أي موعد';
$lang['day'] = 'اليوم';
$lang['days'] = 'الأيام';
$lang['actions'] = 'الحركات';
$lang['reset_working_plan_hint'] = 'اعادة تهئية خطة العمل لتعود الى الاعدادات الافتراضية';
$lang['company_name'] = 'اسم الشركة';
$lang['company_name_hint'] = 'اسم الشركة سيظهر في كل مكان في البرنامج (مطلوب).';
$lang['company_email'] = 'البريد الالكتروني للشركة';
$lang['company_email_hint'] = 'هذا سيكون البريد الالكتروني للشركة وسيكون المرسل للايميلات والردود من البرنامج(مطلوب).';
$lang['company_link'] = 'الموقع الالكتروني للشركة';
$lang['company_link_hint'] = 'الموقع الالكتروني للشركة يجب ان يكون موقع رسمي للشركة (مطلوب).';
$lang['go_to_booking_page'] = 'الذهاب الى صفحة الحجوزات';
$lang['settings_saved'] = 'تم حفظ الاعدادات بنجاح';
$lang['general'] = 'عام';
$lang['business_logic'] = 'منطق الأعمال';
$lang['current_user'] = 'المستخدم الحالي';
$lang['about_app'] = 'About E!A';
$lang['edit_working_plan_hint'] = 'ضع علامة أسفل الأيام والساعات التي تقبل فيها شركتك المواعيد سوف تكون قادرا على ضبط المواعيد في غير ساعات العمل ولكن الزبائن لن يكونون قادرين على حجز المواعيد في غير فترات العمل ستكون خطة العمل هذه هي الطريقة الافتراضية لكل مزود خدمة جديد ولكنك ستتمكن من تغيير خطة كل مزود خدمة بشكل منفصل عن طريق تعديل سجله بعد ذلك يمكنك إضافة فترات استراحة';
$lang['edit_breaks_hint'] = 'اضافة فترات الاستراحة لكل يوم. فترات الاستراحة هذه سيتم تطبيقها لكل مزودي الخدمات';
$lang['book_advance_timeout'] = 'حجز مهلة مسبقا';
$lang['book_advance_timeout_hint'] = 'تعريف المهلة (بالدقائق) قبل أن يحجز الزبائن الموعد او يقومون باعادة ترتيب حجزهم';
$lang['timeout_minutes'] = 'المهلة (الدقائق)';
$lang['about_app_info'] = 'Easy!Appointments is a highly customizable web application that allows your customers to book appointments with you via the web. Moreover, it provides the ability to sync your data with Google Calendar so you can use them with other services.';
$lang['current_version'] = 'النسخة الحالية';
$lang['support'] = 'الدعم';
$lang['about_app_support'] = 'If you encounter any problems when using Easy!Appointments you can search the official Google Group for answers. You might also need to create a new issue on the Google Code page in order to help the development progress.';
$lang['official_website'] = 'الموقع الرسمي';
$lang['google_plus_community'] = 'Google+ مجتمع';
$lang['support_group'] = 'مجموعة الدعم';
$lang['project_issues'] = 'مشاكل المشروع';
$lang['license'] = 'الرخصة';
$lang['about_app_license'] = 'Easy!Appointments is licensed under the GPLv3 license. By using the code of Easy!Appointments in any way you are agreeing to the terms described in the following url:';
$lang['logout_success'] = 'تم تسجيل الخروج بنجاح';
$lang['book_appointment_title'] = 'احجز موعد';
$lang['backend_section'] = 'صفحة الدخول للبرنامج';
$lang['you_need_to_login'] = 'مرحبا بك ! يجب عليك تسجيل الدخول لمعاينة صفحات البرنامج وادارته';
$lang['enter_username_here'] = 'ادخل اسم المستخدم هنا ...';
$lang['enter_password_here'] = 'ادخل كلمة المرور هنا ...';
$lang['login'] = 'تسجيل الدخول';
$lang['forgot_your_password'] = 'نسيت كلمة المرور؟';
$lang['login_failed'] = 'تعذر تسجيل الدخول . الرجاء التأكد من اسم المستخدم وكلمة المرور مرة أخرى.';
$lang['type_username_and_email_for_new_password'] = 'ادخل اسم المستخدم والبريد الالكتروني لاعادة تعيين كلمة المرور';
$lang['enter_email_here'] = 'ادخل البريد الالكتروني هنا ...';
$lang['regenerate_password'] = 'اعادة تجديد كلمة المرور';
$lang['go_to_login'] = 'العودة الى صفحة تسجيل الدخول';
$lang['new_password_sent_with_email'] = 'تم ارسال كلمة المرور الى البريد الالكتروني';
$lang['new_account_password'] = 'كلمة المرور للحساب الجديد';
$lang['new_password_is'] = 'يرجى حفظ هذا البريد الالكتروني في مكان آمن ، ويمكنك تغيير كلمة السر من صفحة الاعدادات في البرنامج $password كلمة المرور لحسابك الجديد ';
$lang['delete_record_prompt'] = 'هل انت متاكد من حذف هذا التسجيل ؟ لا يمكن التراجع عن الحذف بعد حذفه';
$lang['delete_admin'] = 'حذف المسؤول';
$lang['delete_customer'] = 'حذف الزبون';
$lang['delete_service'] = 'حذف الخدمة';
$lang['delete_category'] = 'حذف فئة الخدمة';
$lang['delete_provider'] = 'حذف المزود';
$lang['delete_secretary'] = 'حذف السكرتير';
$lang['delete_appointment'] = 'حذف الموعد';
$lang['delete_unavailable'] = 'حذف الفترة الغير متاحة';
$lang['delete'] = 'حذف';
$lang['unexpected_issues'] = 'مشكلة غير متوقعة';
$lang['unexpected_issues_message'] = 'هذه العملية لا يمكن ان تتم في ظل وجود مشكلة غير متوقعة';
$lang['close'] = 'إغلاق';
$lang['page_not_found'] = 'لم يتم الحثور على الصفحة';
$lang['page_not_found_message'] = 'لم يتم العثور على الصفحة للأسف .يرجى التاكد من الرابط في المتصفح او الذهاب الى مكان آخر باستخدام الازرار أدناه';
$lang['error'] = 'خطأ';
$lang['no_privileges'] = 'لا يوجد صلاحيات';
$lang['no_privileges_message'] = 'لا يوجد لك صلاحيات لمعاينة هذه الصفحة . يرجى التوجه الى مكان آخر';
$lang['backend_calendar'] = 'التقويم الخاص بالمستخدمين ';
$lang['start_date_time'] = 'وقت البداية / الوقت';
$lang['end_date_time'] = 'وقت النهاية / الوقت';
$lang['licensed_under'] = 'مرخصة تحت';
$lang['unexpected_issues_occurred'] = 'حدثت مشكلة غير متوقعة.';
$lang['service_communication_error'] = 'فشل الاتصال بالخادم . يرجى اعادة التحميل مرة أخرى';
$lang['no_privileges_edit_appointments'] = 'لا تملك الصلاحايات للتعديل على الموعد';
$lang['unavailable_updated'] = 'تم تحديث الفترة الغير متاحة بنجاح.';
$lang['appointments'] = 'المواعيد';
$lang['unexpected_warnings'] = 'تحذيرات غير متوقعة';
$lang['unexpected_warnings_message'] = 'العملية تمت بنجاح لكن ظهرت بعض التحذيرات';
$lang['filter'] = 'تنقية/فلترة';
$lang['clear'] = 'تنظيف';
$lang['uncategorized'] = 'غير مصنّف';
$lang['username_already_exists'] = 'اسم المستخدم موجود مسبقا';
$lang['password_length_notice'] = 'حرف على الأقل $number اسم المستخدم يجب ان يكون';
$lang['general_settings'] = 'الاعدادات العامة';
$lang['personal_information'] = 'المعلومات الشخصية';
$lang['system_login'] = 'تسجيل الدخول الى النظام';
$lang['user_settings_are_invalid'] = 'اعدادات المستخدم غير صحيحة . يرجى تعديل الاعدادات والمحاولة مرة أخرى';
$lang['add_break'] = 'إضافة فترة استراحة';
$lang['january'] = 'يناير / January';
$lang['february'] = 'فبراير / February';
$lang['march'] = 'مارس / March';
$lang['april'] = ' أبريل / April';
$lang['may'] = 'مايو / May';
$lang['june'] = 'يونيو / June';
$lang['july'] = 'يوليو / July';
$lang['august'] = 'أغسطس / August';
$lang['september'] = 'سبتمبر / September';
$lang['october'] = 'أوكتوبر / October';
$lang['november'] = 'نوفمبر / November';
$lang['december'] = 'ديسمبر / December';
$lang['previous'] = 'السابق';
$lang['next'] = 'التالي';
$lang['now'] = 'الآن';
$lang['select_time'] = 'إختر الوقت';
$lang['time'] = 'الوقت';
$lang['hour'] = 'الساعة';
$lang['minute'] = 'الدقيقة';
$lang['google_sync_completed'] = 'اكتملت مزامنة جوجل بنجاح .';
$lang['google_sync_failed'] = 'فشلت المزامنة مع جوجل: تعذر انشاءالاتصال مع الخادم';
$lang['select_google_calendar'] = 'اختيار تقويم جوجل';
$lang['select_google_calendar_prompt'] = 'يرجى اختيار التقويم الذي تريد مزامنته مع مواعيدك. اذا لم تريد اختيار اي تقويم سيتم استخدام التقويم الافتراضي.';
$lang['google_calendar_selected'] = 'تم اختيار تقويم جوجل بنجاح';
$lang['oops_something_went_wrong'] = 'للأسف ! حصل خطأ ما .';
$lang['could_not_add_to_google_calendar'] = 'لا يمكن اضافة موعدك على تقويم جوجل';
$lang['ea_update_success'] = 'تم تحديث برنامج الحجوزات بنجاح';
$lang['require_captcha'] = 'مطلوب CAPTCHA';
$lang['require_captcha_hint'] = 'عند التمكين ، سيتوجب على الزبون ادخال رمز عشوائي عند الحجز او التعديل على الموعد ';
$lang['captcha_is_wrong'] = 'الرجاء المحاولة مرة أخرى CAPTCHA لم يتم تأكيد';
$lang['any_provider'] = 'أيْ مزوّد خدمة';
$lang['requested_hour_is_unavailable'] = 'الموعد الذي طلبته غير متاح للأسف . يرجى اختيار ساعة مختلفة لحجز الموعد ';
$lang['customer_notifications'] = 'اشعارات الزبون';
$lang['customer_notifications_hint'] = 'سيتم تلقي اشعارات للزبون عند تغيّر موعد الحجز أو عند تحديثه';
$lang['date_format'] = 'صيغة التاريخ';
$lang['date_format_hint'] = 'تغيير صيغة وعرض التاريخ (D - Date, M - Month, Y - Year).';
$lang['time_format'] = 'Time Format';
$lang['time_format_hint'] = 'Change the time display format (H - Hours, M - Minutes).';
$lang['first_weekday'] = 'First day of week';
$lang['first_weekday_hint'] = 'Set the first day of the calendar week.';
$lang['google_analytics_code_hint'] = 'ليتم تضمينه في صفحة الحجز Google Analytics ID أضف معرّف';
$lang['availabilities_type'] = 'نوع التوفر أو الإتاحة';
$lang['flexible'] = 'مرن';
$lang['fixed'] = 'ثابت';
$lang['attendants_number'] = 'عدد الحاضرين';
$lang['reset_working_plan'] = 'Reset the working plan back to the default values.';
$lang['legal_contents'] = 'Legal Contents';
$lang['cookie_notice'] = 'Cookie Notice';
$lang['display_cookie_notice'] = 'Display Cookie Notice';
$lang['cookie_notice_content'] = 'Cookie Notice Content';
$lang['terms_and_conditions'] = 'Terms & Conditions';
$lang['display_terms_and_conditions'] = 'Display Terms & Conditions';
$lang['terms_and_conditions_content'] = 'Terms & Conditions Content';
$lang['privacy_policy'] = 'Privacy Policy';
$lang['display_privacy_policy'] = 'Display Privacy Policy';
$lang['privacy_policy_content'] = 'Privacy Policy Content';
$lang['website_using_cookies_to_ensure_best_experience'] = 'This website uses cookies to ensure you get the best experience on our website.';
$lang['read_and_agree_to_terms_and_conditions'] = 'I have read and agree to the {$link}Terms & Conditions{/$link}.';
$lang['read_and_agree_to_privacy_policy'] = 'I have read and agree to the {$link}Privacy Policy{/$link}.';
$lang['delete_personal_information_hint'] = 'Delete all personal information from the system.';
$lang['delete_personal_information'] = 'Delete Personal Information';
$lang['delete_personal_information_prompt'] = 'Are you sure that you want to delete your personal information? This action cannot be undone.';
$lang['location'] = 'Location';
$lang['working_plan_exception'] = 'Working Plan Exception';
$lang['working_plan_exceptions'] = 'Working Plan Exceptions';
$lang['working_plan_exceptions_hint'] = 'Add a working plan exception day, outside the working plan.';
$lang['new_working_plan_exception_title'] = 'New Working Plan Exception';
$lang['working_plan_exception_saved'] = 'Working plan exception saved successfully.';
$lang['working_plan_exception_deleted'] = 'Working plan exception deleted successfully.';
$lang['add_working_plan_exceptions_during_each_day'] = 'Add working plan exceptions, outside the working plan.';
$lang['add_working_plan_exception'] = 'Add Working Plan Exception';
$lang['require_phone_number'] = 'Require phone number';
$lang['require_phone_number_hint'] = 'When enabled, customers and users will need to enter the customer\'s phone number when booking an appointment';
$lang['check_spam_folder'] = 'Please check your spam folder if the email does not arrive within a few minutes.';
$lang['api_token_hint'] = 'Set a secret token in order to enable the token based authentication of the Easy!Appointments API.';
$lang['timezone'] = 'Timezone';
$lang['overwrite_existing_working_plans'] = 'This will overwrite the existing provider working plans, are you sure that you want to continue?';
$lang['working_plans_got_updated'] = 'All the working plans got updated.';
$lang['apply_to_all_providers'] = 'Apply To All Providers';
$lang['display_any_provider'] = 'Display Any Provider Option';
$lang['display_any_provider_hint'] = 'The booking page will get an additional option that allows customers to book without specifying a provider.';
$lang['load_more'] = 'Load More';
$lang['list'] = 'List';
$lang['default'] = 'Default';
$lang['table'] = 'Table';
$lang['date'] = 'Date';

View file

@ -0,0 +1,323 @@
<?php defined('BASEPATH') OR exit('No direct script access allowed');
// Bulgarian
$lang['page_title'] = 'Запазете час с ...';
$lang['service_and_provider'] = 'Изберете Услуга и Изпълнител';
$lang['select_service'] = 'Изберете Услуга';
$lang['select_provider'] = 'Изберете Изпълнител';
$lang['duration'] = 'Продължителност';
$lang['minutes'] = 'Минути';
$lang['price'] = 'Цена';
$lang['back'] = 'Обратно';
$lang['appointment_date_and_time'] = 'Изберете дата и час';
$lang['no_available_hours'] = 'Не са налични свободни часове за избраната дата. Моля изберете друга дата.';
$lang['appointment_hour_missing'] = 'Моля изберете час преди да продължите.';
$lang['customer_information'] = 'Моля попълнете Вашите данни';
$lang['first_name'] = 'Име';
$lang['last_name'] = 'Фамилия';
$lang['email'] = 'електронна поща';
$lang['phone_number'] = 'Телефонен номер';
$lang['address'] = 'Адрес';
$lang['city'] = 'Град';
$lang['zip_code'] = 'Пощенски Код';
$lang['notes'] = 'Записки';
$lang['fields_are_required'] = 'Полетата обозначени с * са задължителни.';
$lang['appointment_confirmation'] = 'Потвърдете часът';
$lang['confirm'] = 'Потвърждение';
$lang['update'] = 'Актуализиране';
$lang['cancel_appointment_hint'] = 'Натиснете бутон "отказ" за да отстраните часът си от графика.';
$lang['cancel'] = 'Отказ';
$lang['appointment_registered'] = 'Часът Ви бе успешно регистриран.';
$lang['cancel_appointment_title'] = 'Отказ на Час';
$lang['appointment_cancelled'] = 'Часът Ви бе успешно анулиран.';
$lang['appointment_cancelled_title'] = 'Часът анулиран.';
$lang['reason'] = 'Причина';
$lang['appointment_removed_from_schedule'] = 'Следният час бе отстранен от графика.';
$lang['appointment_details_was_sent_to_you'] = 'Електронно писмо с информация за часа Ви бе изпратено.';
$lang['add_to_google_calendar'] = 'Добавяне в Google Calendar';
$lang['appointment_booked'] = 'Часът Ви бе успешно запазен.';
$lang['thank_you_for_appointment'] = 'Благодарим Ви , че запазихте час при нас. Можете да намерите подробна информация за часът си по-долу. Можете да направите промени като използвате линкът на часът.';
$lang['appointment_details_title'] = 'Данни за часът ';
$lang['customer_details_title'] = 'Клиентски данни';
$lang['service'] = 'Услуга';
$lang['provider'] = 'Изпълнител';
$lang['customer'] = 'Клиент';
$lang['start'] = 'Начало';
$lang['end'] = 'Край';
$lang['name'] = 'Име';
$lang['appointment_link_title'] = 'Линк на часа';
$lang['success'] = 'Успех.';
$lang['appointment_added_to_google_calendar'] = 'Вашият час бе успешно добавен във Вашият Google Calendar профил.';
$lang['view_appointment_in_google_calendar'] = 'Натиснете тук за да прегледате часът си във Вашият Google Calendar профил.';
$lang['appointment_added_to_your_plan'] = 'Нов час бе добавен към Вашият график.';
$lang['appointment_link_description'] = 'Можете да нанесете промени на часа като използвате линкът по-долу.';
$lang['appointment_not_found'] = 'Часът не е намерен.';
$lang['appointment_does_not_exist_in_db'] = 'Часът, заявен от Вас вече не съществува в базата данни на системата.';
$lang['display_calendar'] = 'Показ на календар';
$lang['calendar'] = 'Календар';
$lang['users'] = 'Потребители';
$lang['settings'] = 'Настройки';
$lang['log_out'] = 'Изход';
$lang['synchronize'] = 'синхронизиране';
$lang['enable_sync'] = 'Активиране на синхронизиране';
$lang['disable_sync'] = 'Изключване на синхронизиране';
$lang['reload'] = 'Презареждане';
$lang['appointment'] = 'Час';
$lang['unavailable'] = 'не е на лице';
$lang['week'] = 'Седмица';
$lang['month'] = 'Месец';
$lang['today'] = 'Днес';
$lang['not_working'] = 'Не работен';
$lang['break'] = 'Почивка';
$lang['add'] = 'Добавяне';
$lang['edit'] = 'редактиране';
$lang['hello'] = 'Здравейте';
$lang['all_day'] = 'Цял ден';
$lang['manage_appointment_record_hint'] = 'Управление на всички записи за часове на достъпните изпълнители и услуги.';
$lang['select_filter_item_hint'] = 'Избор на изпълнител или услуга и преглед на часовете в календара.';
$lang['enable_appointment_sync_hint'] = 'Включване на синхронизиране на часове с Google Calendar профила на изпълнителя.';
$lang['manage_customers_hint'] = 'Управление на регистрирани клиенти и преглед на исторически данни за часовете им.';
$lang['manage_services_hint'] = 'Управление на наличните услуги и категории на системата.';
$lang['manage_users_hint'] = 'Управление на административните потребители (администратори, изпълнители и секретари).';
$lang['settings_hint'] = 'Задаване на системни и потребителски настройки.';
$lang['log_out_hint'] = 'Изход от системата.';
$lang['unavailable_periods_hint'] = 'По време на периоди, в които изпълнителя не е на разположение, същият няма да приема нови часове.';
$lang['new_appointment_hint'] = 'Създаване на нов час и запазването му в базата данни.';
$lang['reload_appointments_hint'] = 'Презареждане на календарни часове.';
$lang['trigger_google_sync_hint'] = 'Изпълнение на процес по синхронизация с Google Calendar.';
$lang['appointment_updated'] = 'Часът е актуализиран успешно.';
$lang['undo'] = 'Отмяна';
$lang['appointment_details_changed'] = 'Информацията относно часът е променена.';
$lang['appointment_changes_saved'] = 'Промените на часът са успешно запазени.';
$lang['save'] = 'Запис';
$lang['new'] = 'Нов';
$lang['select'] = 'Избор';
$lang['hide'] = 'Скриване';
$lang['type_to_filter_customers'] = 'Текст за филтриране на клиентите.';
$lang['clear_fields_add_existing_customer_hint'] = 'Изчистване на полетата и въвеждане на нов клиент.';
$lang['pick_existing_customer_hint'] = 'Избор на съществуващ клиент. ';
$lang['new_appointment_title'] = 'Нов час.';
$lang['edit_appointment_title'] = 'Промяна на час.';
$lang['delete_appointment_title'] = 'Отказ на час.';
$lang['write_appointment_removal_reason'] = 'Моля отделете минута за да споделите причината за отказ на часа:';
$lang['appointment_saved'] = 'Часът запазен успешно.';
$lang['new_unavailable_title'] = 'Нов неработен период';
$lang['edit_unavailable_title'] = 'Промяна на неработен период';
$lang['unavailable_saved'] = 'Неработен период запазен успешно.';
$lang['start_date_before_end_error'] = 'Стартовият период е по-дълъг от крайната дата.';
$lang['invalid_email'] = 'Невалиден адрес на електронна поща.';
$lang['customers'] = 'Клиенти';
$lang['details'] = 'Детайли';
$lang['no_records_found'] = 'Не са намерени записи…';
$lang['services'] = 'Услуги';
$lang['duration_minutes'] = 'Продължителност (минути)';
$lang['currency'] = 'Валута';
$lang['category'] = 'Категория';
$lang['no_category'] = 'Без категория';
$lang['description'] = 'Описание';
$lang['categories'] = 'Категории';
$lang['admins'] = 'Администратори';
$lang['providers'] = 'Изпълнители';
$lang['secretaries'] = 'Секретари';
$lang['mobile_number'] = 'Мобилен телефонен номер';
$lang['state'] = 'Държава';
$lang['username'] = 'Потребителско име';
$lang['password'] = 'Парола';
$lang['retype_password'] = 'Повторете паролата';
$lang['receive_notifications'] = 'Получаване на уведомления';
$lang['passwords_mismatch'] = 'Паролите не съвпадат.';
$lang['admin_saved'] = 'Администратор записан успешно.';
$lang['provider_saved'] = 'Изпълнител записан успешно.';
$lang['secretary_saved'] = 'Секретар записан успешно.';
$lang['admin_deleted'] = 'Администратор заличен успешно.';
$lang['provider_deleted'] = 'Изпълнител заличен успешно.';
$lang['secretary_deleted'] = 'Секретар заличен успешно.';
$lang['service_saved'] = 'Услуга записана успешно.';
$lang['service_category_saved'] = 'Категория на услуги записана успешно.';
$lang['service_deleted'] = 'Услугата заличена успешно.';
$lang['service_category_deleted'] = 'Категория на услуги заличена успешно.';
$lang['customer_saved'] = 'Клиент записан успешно.';
$lang['customer_deleted'] = 'Клиент заличен успешно.';
$lang['current_view'] = 'Текущ изглед';
$lang['working_plan'] = 'Работен график';
$lang['reset_plan'] = 'Нулиране на график';
$lang['monday'] = 'Понеделник';
$lang['tuesday'] = 'Вторник';
$lang['wednesday'] = 'Сряда';
$lang['thursday'] = 'Четвъртък';
$lang['friday'] = 'Петък';
$lang['saturday'] = 'Събота';
$lang['sunday'] = 'Неделя';
$lang['breaks'] = 'Почивки';
$lang['add_breaks_during_each_day'] = 'Нанесете почивките за всеки ден. По време на почивките изпълнителя няма да приема часове.';
$lang['day'] = 'Ден';
$lang['days'] = 'Дни';
$lang['actions'] = 'Действия';
$lang['reset_working_plan_hint'] = 'Връщане на работния график към стойности по подразбиране.';
$lang['company_name'] = 'Име на Организацията';
$lang['company_name_hint'] = 'Името на организацията ще бъде показвано навсякъде в системата (задължително).';
$lang['company_email'] = 'Електронна поща на организацията';
$lang['company_email_hint'] = 'Това ще е електронната поща на организацията. Ще бъде използван като изпращач и получател за системните електронни писма (задължително).';
$lang['company_link'] = 'Препратка на организацията';
$lang['company_link_hint'] = 'Препратката на организацията би трябвало да сочи към официалната страница на същата (задължително).';
$lang['go_to_booking_page'] = 'Към страница за запазване.';
$lang['settings_saved'] = 'Настройките записани успешно.';
$lang['general'] = 'Общи';
$lang['business_logic'] = 'Бизнес логика';
$lang['current_user'] = 'Текущ потребител';
$lang['about_app'] = 'Относно';
$lang['edit_working_plan_hint'] = 'Моля задайте дните и часовете през, които вашата организация ще приема часове по-долу. Ще ви бъде възможно да редактирате часове в неработни периоди , но клиентите няма да могат да запазват часове в неработни периоди. Този работен график ще бъде избран по подразбиране за всеки нов изпълнител , но Вие можете да променяте графика на всеки изпълнител отделно. След това можете да нанесете почивките.';
$lang['edit_breaks_hint'] = 'Нанасяне на работни почивки за всеки ден. Същите ще се прилагат за всички нови изпълнители.';
$lang['book_advance_timeout'] = 'Запазване на предварителна пауза';
$lang['book_advance_timeout_hint'] = 'Дефиниране на пауза (в минути) преди клиентите да могат да запазват или разместват часовете си с организацията.';
$lang['timeout_minutes'] = 'Пауза (в минути)';
$lang['about_app_info'] = 'Това е интернет система с висока гъвкавост позволяваща на клиентите Ви да запазват часовете си чрез интернет пространството. Като добавка , позволява синхронизация с Google Calendar за да може да използвате и други услуги.';
$lang['current_version'] = 'Текуща версия';
$lang['support'] = 'Поддръжка.';
$lang['about_app_support'] = 'Ако срещнете затруднения с Easy!Appointments, можете да претърсите официалната гугъл група за отговори и потенциални решения. Възможно е да се наложи да създадете нов запис за проблем в страницата за кодът, за да подпомогнете разработчиците.';
$lang['official_website'] = 'Официална интернет страница.';
$lang['google_plus_community'] = 'Google+ Community';
$lang['support_group'] = 'Support Group';
$lang['project_issues'] = 'Проектни проблеми';
$lang['license'] = 'Лиценз ';
$lang['about_app_license'] = 'тази система е лицензирана спрямо GPLv3 лиценз. Чрез използването на системата по какъвто и да е начин, Вие се съгласявате и приемате условията за изложение на следния интернет адрес: ';
$lang['logout_success'] = 'Излязохте успешно! Използвайте следните бутони за да навигирате към различна страница.';
$lang['book_appointment_title'] = 'Запазване на час';
$lang['backend_section'] = 'Административна секция';
$lang['you_need_to_login'] = 'Здравейте! Нужно е да влезете в потребителския си профил за да достъпите административната секция.';
$lang['enter_username_here'] = 'Въведете потребителското си име тук…';
$lang['enter_password_here'] = 'Въведете паролата си тук…';
$lang['login'] = 'Вход';
$lang['forgot_your_password'] = 'Забравена парола ?';
$lang['login_failed'] = 'Вход неуспешен, моля въведете правилните данни и опитайте отново. ';
$lang['type_username_and_email_for_new_password'] = 'Въведете потребителското си име и адрес на електронна поща за да получите новата си парола.';
$lang['enter_email_here'] = 'Въведете адресът на електронната Ви поща тук…';
$lang['regenerate_password'] = 'Генериране на парола';
$lang['go_to_login'] = 'Назад към страница за вход.';
$lang['new_password_sent_with_email'] = 'Вашата нова парола Ви бе изпратена чрез електронна поща.';
$lang['new_account_password'] = 'Нова парола на потребителски профил';
$lang['new_password_is'] = 'Новата парола за потребителския профил е……… Моля запазете това електронно писмо за да може да намерите паролата си при нужда. Можете да промените паролата си в секцията за настройки на Вашия профил.';
$lang['delete_record_prompt'] = 'Сигурни ли Сте, че искате да заличите този запис? Това действие е необратимо';
$lang['delete_admin'] = 'Заличаване на администратор';
$lang['delete_customer'] = 'Заличаване на клиент';
$lang['delete_service'] = 'Заличаване на услуга';
$lang['delete_category'] = 'Заличаване на категория на услуги';
$lang['delete_provider'] = 'Заличаване на изпълнител';
$lang['delete_secretary'] = 'Заличаване на секретар';
$lang['delete_appointment'] = 'Заличаване на час';
$lang['delete_unavailable'] = 'Заличаване на неработен период';
$lang['delete'] = 'Заличаване';
$lang['unexpected_issues'] = 'Неочаквани проблеми';
$lang['unexpected_issues_message'] = 'Действието не можа да бъде изпълнено поради неочаквани проблеми.';
$lang['close'] = 'Край';
$lang['page_not_found'] = 'Страницата не е намерена.';
$lang['page_not_found_message'] = 'За съжаление търсената от Вас страница не съществува. Моля проверете интернет адреса или посетете друг сегмент като използвате бутоните по-долу.';
$lang['error'] = 'Грешка';
$lang['no_privileges'] = 'Без привилегии';
$lang['no_privileges_message'] = 'Не притежавате нужните привилегии за да достъпите тази страница. Моля посетете друг сегмент.';
$lang['backend_calendar'] = 'Административен календар';
$lang['start_date_time'] = 'Начало Дата / Час';
$lang['end_date_time'] = 'Край Дата / Час';
$lang['licensed_under'] = 'Лиценз';
$lang['unexpected_issues_occurred'] = 'Възникнаха неочаквани проблеми.';
$lang['service_communication_error'] = 'Възникна грешка със сървърната комуникация, моля опитайте отново. ';
$lang['no_privileges_edit_appointments'] = 'Вие не притежавате нужните привилегии за да редактирате часове.';
$lang['unavailable_updated'] = 'Неработен период обновен успешно.';
$lang['appointments'] = 'Часове';
$lang['unexpected_warnings'] = 'Непредвидени предупреждения';
$lang['unexpected_warnings_message'] = 'Действието бе изпълнено, но са налични известни предупреждения.';
$lang['filter'] = 'Филтър';
$lang['clear'] = 'Изчистване';
$lang['uncategorized'] = 'Некатегоризирани';
$lang['username_already_exists'] = 'Потребителското име вече е заето.';
$lang['password_length_notice'] = 'Паролата трябва да бъде с минимална дължина от $number символа.';
$lang['general_settings'] = 'Общи настройки';
$lang['personal_information'] = 'Лична информация';
$lang['system_login'] = 'Вход в системата';
$lang['user_settings_are_invalid'] = 'Потребителските настройки са невалидни! Моля прегледайте настройките си и опитайте отново.';
$lang['add_break'] = 'Добавяне на почивка';
$lang['january'] = 'Януари';
$lang['february'] = 'Февруари';
$lang['march'] = 'Март';
$lang['april'] = 'Април';
$lang['may'] = 'Май';
$lang['june'] = 'Юни';
$lang['july'] = 'Чли';
$lang['august'] = 'Август';
$lang['september'] = 'Септември';
$lang['october'] = 'Октомври';
$lang['november'] = 'Ноември';
$lang['december'] = 'Декември';
$lang['previous'] = 'Предишен';
$lang['next'] = 'Следващ';
$lang['now'] = 'Сега';
$lang['select_time'] = 'Избор на време';
$lang['time'] = 'Време';
$lang['hour'] = 'Час';
$lang['minute'] = 'Минута';
$lang['google_sync_completed'] = 'Google синхронизацията приключи успешно.';
$lang['google_sync_failed'] = 'Google синхронизацията неуспешна: не бе възможно да се осъществи връзка.';
$lang['select_google_calendar'] = 'Избор на Google Calendar';
$lang['select_google_calendar_prompt'] = 'Изберете календарът, който искате да синхронизирате за часовете си. Ако не желаете да изберете специфичен календар, календар по подразбиране ще бъде използван.';
$lang['google_calendar_selected'] = 'Google Calendar бе успешно избран.';
$lang['oops_something_went_wrong'] = 'Опааа! Нещо се обърка!Опааа! Нещо се обърка.';
$lang['could_not_add_to_google_calendar'] = 'Вашият час не бе добавен във Вашият Google Calendar.';
$lang['ea_update_success'] = 'Системата Обновена успешно';
$lang['require_captcha'] = 'Изискване на CAPTCHA';
$lang['require_captcha_hint'] = 'Когато е активно, потребителя , ще трябва да въведе произволно генерирани символи за да запише или промени час.';
$lang['captcha_is_wrong'] = 'CAPTCHA verification failed, please try again.';
$lang['any_provider'] = 'Произволен Изпълнител';
$lang['requested_hour_is_unavailable'] = 'Заявеният от Вас час не е наличен. Моля изберете друг час.';
$lang['customer_notifications'] = 'Клиентски Известия';
$lang['customer_notifications_hint'] = 'Дефинира дали клиентът ще получава известия посредством електронна поща, когато има промяна в графика, съдържащ негов запазен час.';
$lang['date_format'] = 'Формат на Дата';
$lang['date_format_hint'] = 'Промяна на дормат за показ на дата (D - дата, M - месец, Y - година).';
$lang['time_format'] = 'Time Format';
$lang['time_format_hint'] = 'Change the time display format (H - Hours, M - Minutes).';
$lang['first_weekday'] = 'First day of week';
$lang['first_weekday_hint'] = 'Set the first day of the calendar week.';
$lang['google_analytics_code_hint'] = 'Добавете Google Analytics ID за да бъде включена статистика в страницата за запазване на час.';
$lang['availabilities_type'] = 'Типове на работен период.';
$lang['flexible'] = 'Гъвкав';
$lang['fixed'] = 'Фиксиран';
$lang['attendants_number'] = 'Брой Посетители';
$lang['reset_working_plan'] = 'Reset the working plan back to the default values.';
$lang['legal_contents'] = 'Legal Contents';
$lang['cookie_notice'] = 'Cookie Notice';
$lang['display_cookie_notice'] = 'Display Cookie Notice';
$lang['cookie_notice_content'] = 'Cookie Notice Content';
$lang['terms_and_conditions'] = 'Terms & Conditions';
$lang['display_terms_and_conditions'] = 'Display Terms & Conditions';
$lang['terms_and_conditions_content'] = 'Terms & Conditions Content';
$lang['privacy_policy'] = 'Privacy Policy';
$lang['display_privacy_policy'] = 'Display Privacy Policy';
$lang['privacy_policy_content'] = 'Privacy Policy Content';
$lang['website_using_cookies_to_ensure_best_experience'] = 'This website uses cookies to ensure you get the best experience on our website.';
$lang['read_and_agree_to_terms_and_conditions'] = 'I have read and agree to the {$link}Terms & Conditions{/$link}.';
$lang['read_and_agree_to_privacy_policy'] = 'I have read and agree to the {$link}Privacy Policy{/$link}.';
$lang['delete_personal_information_hint'] = 'Delete all personal information from the system.';
$lang['delete_personal_information'] = 'Delete Personal Information';
$lang['delete_personal_information_prompt'] = 'Are you sure that you want to delete your personal information? This action cannot be undone.';
$lang['location'] = 'Location';
$lang['working_plan_exception'] = 'Working Plan Exception';
$lang['working_plan_exceptions'] = 'Working Plan Exceptions';
$lang['working_plan_exceptions_hint'] = 'Add a working plan exception day, outside the working plan.';
$lang['new_working_plan_exception_title'] = 'New Working Plan Exception';
$lang['working_plan_exception_saved'] = 'Working plan exception saved successfully.';
$lang['working_plan_exception_deleted'] = 'Working plan exception deleted successfully.';
$lang['add_working_plan_exceptions_during_each_day'] = 'Add working plan exceptions, outside the working plan.';
$lang['add_working_plan_exception'] = 'Add Working Plan Exception';
$lang['require_phone_number'] = 'Require phone number';
$lang['require_phone_number_hint'] = 'When enabled, customers and users will need to enter the customer\'s phone number when booking an appointment';
$lang['check_spam_folder'] = 'Please check your spam folder if the email does not arrive within a few minutes.';
$lang['api_token_hint'] = 'Set a secret token in order to enable the token based authentication of the Easy!Appointments API.';
$lang['timezone'] = 'Timezone';
$lang['overwrite_existing_working_plans'] = 'This will overwrite the existing provider working plans, are you sure that you want to continue?';
$lang['working_plans_got_updated'] = 'All the working plans got updated.';
$lang['apply_to_all_providers'] = 'Apply To All Providers';
$lang['display_any_provider'] = 'Display Any Provider Option';
$lang['display_any_provider_hint'] = 'The booking page will get an additional option that allows customers to book without specifying a provider.';
$lang['load_more'] = 'Load More';
$lang['list'] = 'List';
$lang['default'] = 'Default';
$lang['table'] = 'Table';
$lang['date'] = 'Date';

View file

@ -0,0 +1,323 @@
<?php defined('BASEPATH') OR exit('No direct script access allowed');
// Catalan
$lang['page_title'] = 'Reserva una cita amb';
$lang['service_and_provider'] = 'Selecció del servei i el proveïdor';
$lang['select_service'] = 'Seleccioneu el servei';
$lang['select_provider'] = 'Seleccioneu el proveïdor';
$lang['duration'] = 'Durada';
$lang['minutes'] = 'minuts';
$lang['price'] = 'Preu';
$lang['back'] = 'Enrere';
$lang['appointment_date_and_time'] = 'Selecció de la data i l\'hora de la cita';
$lang['no_available_hours'] = 'No hi ha hores disponibles per a la data seleccionada. Seleccioneu una altra data.';
$lang['appointment_hour_missing'] = 'Seleccioneu-ne una altra abans de continuar.';
$lang['customer_information'] = 'Introducció de dades personals';
$lang['first_name'] = 'Nom';
$lang['last_name'] = 'Cognoms';
$lang['email'] = 'Correu electrònic';
$lang['phone_number'] = 'Número de telèfon';
$lang['address'] = 'Adreça';
$lang['city'] = 'Ciutat';
$lang['zip_code'] = 'Codi postal';
$lang['notes'] = 'Notes';
$lang['fields_are_required'] = 'Els camps amb un * són obligatoris.';
$lang['appointment_confirmation'] = 'Confirmació de la cita';
$lang['confirm'] = 'Confirma';
$lang['update'] = 'Actualitza';
$lang['cancel_appointment_hint'] = 'Prem el botó "Cancel·la" per eliminar la cita del calendari de l\'organització.';
$lang['cancel'] = 'Cancel·la';
$lang['appointment_registered'] = 'La vostra cita s\'ha desat correctament!.';
$lang['cancel_appointment_title'] = 'Cancel·lació de la cita';
$lang['appointment_cancelled'] = 'La vostra cita s\'ha cancel·lat correctament.';
$lang['appointment_cancelled_title'] = 'Cita cancel·lada';
$lang['reason'] = 'Motiu';
$lang['appointment_removed_from_schedule'] = 'La cita següent ha estat eliminada de la planificació de l\'organització.';
$lang['appointment_details_was_sent_to_you'] = 'Se us ha enviat un correu electrònic amb els detalls de la cita on també podreu modificar-la o anul·lar-la.';
$lang['add_to_google_calendar'] = 'Afegeix al Google Calendar';
$lang['appointment_booked'] = 'La vostra cita s\'ha reservat correctament.';
$lang['thank_you_for_appointment'] = 'Gràcies per reservar una cita amb nosaltres. A sota, podeu veure els detalls de la cita. Podeu fer canvis clicant a l\'enllaç de la cita.';
$lang['appointment_details_title'] = 'Detalls de la cita';
$lang['customer_details_title'] = 'Detalls del client';
$lang['service'] = 'Servei';
$lang['provider'] = 'Proveïdor';
$lang['customer'] = 'Client';
$lang['start'] = 'Inici';
$lang['end'] = 'Fi';
$lang['name'] = 'Nom';
$lang['phone'] = 'Telèfon';
$lang['address'] = 'Adreça';
$lang['appointment_link_title'] = 'Enllaç a la cita';
$lang['success'] = 'Success.';
$lang['appointment_added_to_google_calendar'] = 'La vostra cita s\'ha afegit al vostre compte de Google Calendar.';
$lang['view_appointment_in_google_calendar'] = 'Cliqueu aquí per veure la vostra cita al Google Calendar.';
$lang['appointment_added_to_your_plan'] = 'S\'ha afegit una nova cita a la vostra planificació.';
$lang['appointment_link_description'] = 'Podeu fer canvis clicant a l\'enllaç de la cita de sota.';
$lang['appointment_not_found'] = 'No s\'ha trobat la cita.';
$lang['appointment_does_not_exist_in_db'] = 'La cita que heu demanat ja no existeix a la base de dades del sistema.';
$lang['display_calendar'] = 'Mostra el calendari';
$lang['calendar'] = 'Calendari';
$lang['users'] = 'Usuaris';
$lang['settings'] = 'Configuracions';
$lang['log_out'] = 'Sortida';
$lang['synchronize'] = 'Sincronitza';
$lang['enable_sync'] = 'Permet Sync';
$lang['disable_sync'] = 'No permetis Sync';
$lang['reload'] = 'Recarrega';
$lang['appointment'] = 'Cita';
$lang['unavailable'] = 'No disponible';
$lang['week'] = 'Setmana';
$lang['month'] = 'Mes';
$lang['today'] = 'Avui';
$lang['not_working'] = 'No laborable';
$lang['break'] = 'Descans';
$lang['add'] = 'Afegeix';
$lang['edit'] = 'Edita';
$lang['hello'] = 'Hola';
$lang['all_day'] = 'Tot el dia';
$lang['manage_appointment_record_hint'] = 'Gestiona totes les cites enregistrades de proveïdors i serveis disponibles.';
$lang['select_filter_item_hint'] = 'Selecciona un proveïdor o un servei i visualitza les cites al calendari.';
$lang['enable_appointment_sync_hint'] = 'Permet la sincronització de cites amb el compte de Google Calendar del proveïdor.';
$lang['manage_customers_hint'] = 'Gestiona els clients registrats i mostra el seu historial de reserves.';
$lang['manage_services_hint'] = 'Gestiona els serveis disponibles i les categories del sistema.';
$lang['manage_users_hint'] = 'Gestiona els usuaris gestors (administradors, proveïdors, secretaris).';
$lang['settings_hint'] = 'Configura les opcions del sistema i dels usuaris.';
$lang['log_out_hint'] = 'Surt del sistema.';
$lang['unavailable_periods_hint'] = 'Durant els periodes no disponibles el proveïdor no acceptarà noves cites.';
$lang['new_appointment_hint'] = 'Crea una nova cita i emmagatzema-la a la base de dades.';
$lang['reload_appointments_hint'] = 'Recarrega el calendari de cites.';
$lang['trigger_google_sync_hint'] = 'Dispara el procés de sincronització amb el Google Calendar.';
$lang['appointment_updated'] = 'La cita s\'ha actualitzat correctament.';
$lang['undo'] = 'Desfés';
$lang['appointment_details_changed'] = 'Els detalls de la cita han canviat.';
$lang['appointment_changes_saved'] = 'Els canvis de la cita s\'han desat correctament.';
$lang['save'] = 'Desa';
$lang['new'] = 'Nou';
$lang['select'] = 'Selecciona';
$lang['hide'] = 'Amaga';
$lang['type_to_filter_customers'] = 'Tecleja per filtrar els clients.';
$lang['clear_fields_add_existing_customer_hint'] = 'Buida els camps i entra un nou client.';
$lang['pick_existing_customer_hint'] = 'Escull un client existent.';
$lang['new_appointment_title'] = 'Nova cita';
$lang['edit_appointment_title'] = 'Edita la cita';
$lang['delete_appointment_title'] = 'Elimina la cita';
$lang['write_appointment_removal_reason'] = 'Escribiu el motiu pel qual elimineu la cita:';
$lang['appointment_saved'] = 'La cita s\'ha desat correctament.';
$lang['new_unavailable_title'] = 'Nou període de no disponibilitat';
$lang['edit_unavailable_title'] = 'Edita el periode de no disponibilitat';
$lang['unavailable_saved'] = 'El periode de no disponibilitat s\'ha desat correctament.';
$lang['start_date_before_end_error'] = 'La data d\'inici és posterior de la de fi.';
$lang['invalid_email'] = 'L\'adreça de correu electrònic no és vàlida.';
$lang['customers'] = 'Clients';
$lang['details'] = 'Detalls';
$lang['no_records_found'] = 'No s\'han trobat registres...';
$lang['services'] = 'Serveis';
$lang['duration_minutes'] = 'Duració (minuts)';
$lang['currency'] = 'Moneda';
$lang['category'] = 'Categoria';
$lang['no_category'] = 'Sense categoria';
$lang['description'] = 'Descripció';
$lang['categories'] = 'Categories';
$lang['admins'] = 'Admins';
$lang['providers'] = 'Proveïdors';
$lang['secretaries'] = 'Secretaris';
$lang['mobile_number'] = 'Mòbil';
$lang['state'] = 'Província';
$lang['username'] = 'Usuari';
$lang['password'] = 'Contrasenya';
$lang['retype_password'] = 'Torna a introduir la contrasenya';
$lang['receive_notifications'] = 'Rep les notificacions';
$lang['passwords_mismatch'] = 'Les contrasenyes no coincideixen.';
$lang['admin_saved'] = 'Admin desat correctament.';
$lang['provider_saved'] = 'Proveïdor desat correctament.';
$lang['secretary_saved'] = 'Secretari desat correctament.';
$lang['admin_deleted'] = 'Admin eliminat correctament.';
$lang['provider_deleted'] = 'Proveïdor eliminat correctament.';
$lang['secretary_deleted'] = 'Secretari eliminat correctament.';
$lang['service_saved'] = 'Servei desat correctament.';
$lang['service_category_saved'] = 'Categoria de servei desada correctament.';
$lang['service_deleted'] = 'Servei eliminat correctament.';
$lang['service_category_deleted'] = 'Categoria de servei eliminada correctament.';
$lang['customer_saved'] = 'Client desat correctament.';
$lang['customer_deleted'] = 'Client eliminat correctament.';
$lang['current_view'] = 'Vista actual';
$lang['working_plan'] = 'Planificació de treball';
$lang['reset_plan'] = 'Reinicia la planificació';
$lang['monday'] = 'Dilluns';
$lang['tuesday'] = 'Dimarts';
$lang['wednesday'] = 'Dimecres';
$lang['thursday'] = 'Dijous';
$lang['friday'] = 'Divendres';
$lang['saturday'] = 'Dissabte';
$lang['sunday'] = 'Diumenge';
$lang['breaks'] = 'Descansos';
$lang['add_breaks_during_each_day'] = 'Afegeix els descansos per a cada dia. Durant els descansos, el proveïdor no acceptarà cites.';
$lang['day'] = 'Dia';
$lang['days'] = 'Dies';
$lang['actions'] = 'Accions';
$lang['reset_working_plan_hint'] = 'Reinicia la planificació de treball als valors per defecte.';
$lang['company_name'] = 'Nom de l\'organització';
$lang['company_name_hint'] = 'El nom de l\'organització es mostrarà arreu del sistema (necessari).';
$lang['company_email'] = 'Correu de l\'organització';
$lang['company_email_hint'] = 'Aquest serà l\'adreça de correu electrònic de l\'organització. S\'utilitzarà com a remitent i adreça de resposta dels correus del sistema (necessari).';
$lang['company_link'] = 'Enllaç a l\'organització';
$lang['company_link_hint'] = 'L\'enllaç a l\'organització hauria d\'enllaçar el seu lloc web oficial (necessari).';
$lang['go_to_booking_page'] = 'Ves a la pàgina de reserves';
$lang['settings_saved'] = 'Les configuracions s\'han desat correctament.';
$lang['general'] = 'General';
$lang['business_logic'] = 'Lògica de negoci';
$lang['current_user'] = 'Usuari actual';
$lang['about_app'] = 'Quant a Easy!Appointments';
$lang['edit_working_plan_hint'] = 'Marqueu a sota els dies i les hores que la vostra organització acceptarà cites. Podreu ajustar les cites a les hores no laborables, però els clients no podran reservar cites en aquest periodes. Aquesta planificació de treball serà utilitzada per defecte per cada nou proveïdor, però podreu canviar cadascuna de les planificacions dels proveïdors de forma separada. Després d\'això, podeu afegir els periodes de descans.';
$lang['edit_breaks_hint'] = 'Afegiu descansos per a cada dia. Aquests descansos s\'aplicaran a tots els nous proveïdors.';
$lang['book_advance_timeout'] = 'Temps límit de reserva';
$lang['book_advance_timeout_hint'] = 'Defineix el temps límit (en minuts) a partir del qual els clients no poden reservar una hora o modificar una cita.';
$lang['timeout_minutes'] = 'Temps límit de reserva (minuts)';
$lang['about_app_info'] = 'Easy!Appointments és una aplicació web molt ajustable que permet als vostres clients reservar cites amb vosaltres a través del web. A més, us permet sincronitzar amb Google Calendar de manera que ho podeu usar amb altres serveis.';
$lang['current_version'] = 'Versió actual';
$lang['support'] = 'Suport';
$lang['about_app_support'] = 'Si trobeu qualsevol problema fent servir Easy!Appointments, podeu consultar el Google Group per a trobar respostes. També podeu crear noves incidències a la pàgina de Google Code per ajudar al desenvolupament.';
$lang['official_website'] = 'Lloc web oficial';
$lang['google_plus_community'] = 'Comunitat Google+';
$lang['support_group'] = 'Grup de suport';
$lang['project_issues'] = 'Incidències del projecte';
$lang['license'] = 'Llicència';
$lang['about_app_license'] = 'Easy!Appointments es distribueix amb una llicència GPLv3. Usant el codi d\'Easy!Appointments de qualsevol manera, esteu consentint els termes descrits en la següent URL:';
$lang['logout_success'] = 'Heu sortit correctament! Cliqueu en un dels següents botons per navegar a una altra pàgina.';
$lang['book_appointment_title'] = 'Reserva una cita';
$lang['backend_section'] = 'Administració';
$lang['you_need_to_login'] = 'Heu d\'iniciar la sessió per veure les pàgines d\'administració.';
$lang['enter_username_here'] = 'Introduïu el vostre nom d\'usuari...';
$lang['enter_password_here'] = 'Introduïu la vostra contrasenya...';
$lang['login'] = 'Entra';
$lang['forgot_your_password'] = 'Heu oblidat la contrasenya?';
$lang['login_failed'] = 'Entrada fallida, introduïu les credencials correctes i proveu-ho un altre cop.';
$lang['type_username_and_email_for_new_password'] = 'Teclegeu el vostre nom d\'usuari i la vostra adreça de correu per obtenir una nova contrasenya.';
$lang['enter_email_here'] = 'Introdueix el teu correu aquí...';
$lang['regenerate_password'] = 'Regenera la contrasenya';
$lang['go_to_login'] = 'Torna a la pàgina d\'entrada';
$lang['new_password_sent_with_email'] = 'La vostra nova contrasenya se us ha enviat per correu electrònic.';
$lang['new_account_password'] = 'Nova contrasenya';
$lang['new_password_is'] = 'La vostra nova contrasenya és $password. Deseu aquest correu per tal de poder recuperar la contrasenya si és necessari. Podeu canviar aquesta contrasenya a la pàgina de configuracions.';
$lang['delete_record_prompt'] = 'Esteu segurs que voleu eliminar aquest registre? Aquesta acció no es pot desfer.';
$lang['delete_admin'] = 'Elimina un administrador';
$lang['delete_customer'] = 'Elimina un client';
$lang['delete_service'] = 'Elimina un servei';
$lang['delete_category'] = 'Elimina una categoria de servei';
$lang['delete_provider'] = 'Elimina un proveïdor';
$lang['delete_secretary'] = 'Elimina un secretari';
$lang['delete_appointment'] = 'Elimina una cita';
$lang['delete_unavailable'] = 'Elimina un període de no disponibilitat';
$lang['delete'] = 'Elimina';
$lang['unexpected_issues'] = 'Problemes inesperats';
$lang['unexpected_issues_message'] = 'L\'operació no s\'ha pogut completar degut a problemes inesperats.';
$lang['close'] = 'Tanca';
$lang['page_not_found'] = 'No s\'ha trobat la pàgina';
$lang['page_not_found_message'] = 'La pàgina que heu demanat no existeix. Comproveu la URL del vostre navegador o dirigiu-vos a un altre lloc clicant els botons de sota.';
$lang['error'] = 'Error';
$lang['no_privileges'] = 'Permisos insuficients';
$lang['no_privileges_message'] = 'No teniu el permisos requerits per veure aquesta pàgina. Navegueu a una altra secció.';
$lang['backend_calendar'] = 'Calendari de gestió';
$lang['start_date_time'] = 'Data/Hora d\'inici';
$lang['end_date_time'] = 'Data/Hora de fi';
$lang['licensed_under'] = 'Amb llicència';
$lang['unexpected_issues_occurred'] = 'Hi han hagut alguns problemes.';
$lang['service_communication_error'] = 'Hi hagut un problema de comunicació amb el servidor, intenteu-ho una altra vegada.';
$lang['no_privileges_edit_appointments'] = 'No teniu els permissos necessaris per editar les cites.';
$lang['unavailable_updated'] = 'El període de temps de no disponibilitat s\'ha actualitzat correctament.';
$lang['appointments'] = 'Cites';
$lang['unexpected_warnings'] = 'Errors inesperats';
$lang['unexpected_warnings_message'] = 'L\'operació s\'ha completat, però hi ha diversos avisos.';
$lang['filter'] = 'Filtra';
$lang['clear'] = 'Neteja';
$lang['uncategorized'] = 'Sense categoritzar';
$lang['username_already_exists'] = 'El nom d\'usuari ja existeix.';
$lang['password_length_notice'] = 'La contrasenya ha de tenir almenys $number caràcters de longitud.';
$lang['general_settings'] = 'Configuracions generals';
$lang['personal_information'] = 'Informació personal';
$lang['system_login'] = 'Entrada al sistema';
$lang['user_settings_are_invalid'] = 'Les configuració d\'usuari no User settings are invalid! Please review your settings and try again.';
$lang['add_break'] = 'Afegeix un descans';
$lang['january'] = 'Gener';
$lang['february'] = 'Febrer';
$lang['march'] = 'Març';
$lang['april'] = 'Abril';
$lang['may'] = 'Maig';
$lang['june'] = 'Juny';
$lang['july'] = 'Juliol';
$lang['august'] = 'Agost';
$lang['september'] = 'Setembre';
$lang['october'] = 'Octubre';
$lang['november'] = 'Novembre';
$lang['december'] = 'Desembre';
$lang['previous'] = 'Anterior';
$lang['next'] = 'Següent';
$lang['now'] = 'Ara';
$lang['select_time'] = 'Selecciona l\'hora';
$lang['time'] = 'Hora';
$lang['hour'] = 'Hora';
$lang['minute'] = 'Minut';
$lang['google_sync_completed'] = 'La sincronització amb Google s\'ha completat correctament.';
$lang['google_sync_failed'] = 'La sincronització amb Google ha fallat: no s\'ha pogut establir la connexió amb el servidor.';
$lang['select_google_calendar'] = 'Selecciona un Google Calendar';
$lang['select_google_calendar_prompt'] = 'Seleccioneu el calendari que voleu sincronitzar amb les vostres cites. Si no seleccioneu un calendari específic, s\'usarà el calendari per defecte.';
$lang['google_calendar_selected'] = 'El Google calendar s\'ha seleccionat correctament.';
$lang['oops_something_went_wrong'] = 'Ups! Alguna cosa no ha funcionat bé.';
$lang['could_not_add_to_google_calendar'] = 'La vostra cita no s\'ha pogut afegir al vostre compte de Google Calendar.';
$lang['ea_update_success'] = 'Easy!Appointments s\'ha actualitzat correctament.';
$lang['require_captcha'] = 'Requereix un CAPTCHA';
$lang['require_captcha_hint'] = 'Quan s\'habilita, els clients hauran de teclejar una cadena CAPTCHA generada aleatòriament abans de reservar o actualitzar una cita.';
$lang['captcha_is_wrong'] = 'La verificació del CAPTCHA ha fallat, torneu-ho a intentar.';
$lang['any_provider'] = 'Qualsevol proveïdor';
$lang['requested_hour_is_unavailable'] = 'La cita que demaneu no està disponible. Seleccioneu una hora diferent per la vostra cita.';
$lang['customer_notifications'] = 'Notificacions als clients';
$lang['customer_notifications_hint'] = 'Defineix si el client rebrà notificacions per correu electrònic quan hi hagi un canvi en la planificació de les seves cites.';
$lang['date_format'] = 'Format de data';
$lang['date_format_hint'] = 'Canvia el format de visualització de la data (D - Dia, M - Mes, Y - Any).';
$lang['time_format'] = 'Format d\'hora';
$lang['time_format_hint'] = 'Canvia el format de visualització de l\'hora (H - Hores, M - Minuts).';
$lang['google_analytics_code_hint'] = 'Afegiu el vostre ID de Google Analytics per afegir-lo a la pàgina de reserves.';
$lang['availabilities_type'] = 'Tipus de disponibilitats';
$lang['flexible'] = 'Flexible';
$lang['fixed'] = 'Fixat';
$lang['attendants_number'] = 'Nombre d\'assistents';
$lang['reset_working_plan'] = 'Reinicieu la planificació de treball als valors per defecte.';
$lang['legal_contents'] = 'Continguts legals';
$lang['cookie_notice'] = 'Avís de cookies';
$lang['display_cookie_notice'] = 'Mostra l\'avís de cookies';
$lang['cookie_notice_content'] = 'Contingut de l\'avís de cookies';
$lang['terms_and_conditions'] = 'Termes i condicions';
$lang['display_terms_and_conditions'] = 'Mostra els termes i condicions';
$lang['terms_and_conditions_content'] = 'Contingut dels termes i condicions';
$lang['privacy_policy'] = 'Política de privacitat';
$lang['display_privacy_policy'] = 'Mostra la política de privacitat';
$lang['privacy_policy_content'] = 'Contingut de la política de privacitat';
$lang['website_using_cookies_to_ensure_best_experience'] = 'Aquest lloc web usa cookies per assegurar-se que obteniu la millor experiència navegant pel nostre web.';
$lang['read_and_agree_to_terms_and_conditions'] = 'He llegit i estic d\'acord amb els {$link}Termes i condicions{/$link}.';
$lang['read_and_agree_to_privacy_policy'] = 'He llegit i estic d\'acord amb la {$link}Política de privacitat{/$link}.';
$lang['delete_personal_information_hint'] = 'Elimineu les vostres dades del sistema (i les cites associades).';
$lang['delete_personal_information'] = 'Eliminació de dades personals';
$lang['delete_personal_information_prompt'] = 'Esteu segur que voleu eliminar la vostra informació personal? Aquesta acció no es pot desfer.';
$lang['location'] = 'Location';
$lang['working_plan_exception'] = 'Working Plan Exception';
$lang['working_plan_exceptions'] = 'Working Plan Exceptions';
$lang['working_plan_exceptions_hint'] = 'Add a working plan exception day, outside the working plan.';
$lang['new_working_plan_exception_title'] = 'New Working Plan Exception';
$lang['working_plan_exception_saved'] = 'Working plan exception saved successfully.';
$lang['working_plan_exception_deleted'] = 'Working plan exception deleted successfully.';
$lang['add_working_plan_exceptions_during_each_day'] = 'Add working plan exceptions, outside the working plan.';
$lang['add_working_plan_exception'] = 'Add Working Plan Exception';
$lang['require_phone_number'] = 'Require phone number';
$lang['require_phone_number_hint'] = 'When enabled, customers and users will need to enter the customer\'s phone number when booking an appointment';
$lang['check_spam_folder'] = 'Please check your spam folder if the email does not arrive within a few minutes.';
$lang['api_token_hint'] = 'Set a secret token in order to enable the token based authentication of the Easy!Appointments API.';
$lang['timezone'] = 'Timezone';
$lang['overwrite_existing_working_plans'] = 'This will overwrite the existing provider working plans, are you sure that you want to continue?';
$lang['working_plans_got_updated'] = 'All the working plans got updated.';
$lang['apply_to_all_providers'] = 'Apply To All Providers';
$lang['display_any_provider'] = 'Display Any Provider Option';
$lang['display_any_provider_hint'] = 'The booking page will get an additional option that allows customers to book without specifying a provider.';
$lang['load_more'] = 'Load More';
$lang['list'] = 'List';
$lang['default'] = 'Default';
$lang['table'] = 'Table';
$lang['date'] = 'Date';

View file

@ -0,0 +1,323 @@
<?php defined('BASEPATH') OR exit('No direct script access allowed');
// Chinese
$lang['page_title'] = '准备预约';
$lang['service_and_provider'] = '选择服务人员以及服务项目';
$lang['select_service'] = '选择您需要的服务项目';
$lang['select_provider'] = '选择服务人员';
$lang['duration'] = '时长';
$lang['minutes'] = '分钟';
$lang['price'] = '价格';
$lang['back'] = '返回';
$lang['appointment_date_and_time'] = '选择预约的日期和时间';
$lang['no_available_hours'] = '您所选择的日期和时间没有空位。请选择其他日期.';
$lang['appointment_hour_missing'] = '继续之前请选择您的预约时间.';
$lang['customer_information'] = '填写您的信息';
$lang['first_name'] = '名字';
$lang['last_name'] = '姓氏';
$lang['email'] = '电子邮箱';
$lang['phone_number'] = '电话号码';
$lang['address'] = '地址';
$lang['city'] = '城市';
$lang['zip_code'] = '邮编';
$lang['notes'] = '注释';
$lang['fields_are_required'] = '标记*的位置必须填写.';
$lang['appointment_confirmation'] = '确认预约';
$lang['confirm'] = '确认';
$lang['update'] = '更新';
$lang['cancel_appointment_hint'] = '点击取消可从公司时间表移除预约.';
$lang['cancel'] = '取消';
$lang['appointment_registered'] = '您的预约已经成功预定了.';
$lang['cancel_appointment_title'] = '取消预约';
$lang['appointment_cancelled'] = '您的预约已经成功取消了.';
$lang['appointment_cancelled_title'] = '完成预约取消';
$lang['reason'] = '理由';
$lang['appointment_removed_from_schedule'] = '以下的预约将从公司时间表上移除';
$lang['appointment_details_was_sent_to_you'] = '预约详细信息的邮件已经寄到您的电子信箱.';
$lang['add_to_google_calendar'] = '添加到您的谷歌日历';
$lang['appointment_booked'] = '您已经成功完成预约了.';
$lang['thank_you_for_appointment'] = '谢谢您与我们预约.下方,您将看到预约的详细信息.如需修改,请点击预约链接.';
$lang['appointment_details_title'] = '预约详细信息';
$lang['customer_details_title'] = '客户资料';
$lang['service'] = '服务项目';
$lang['provider'] = '服务人员';
$lang['customer'] = '客户';
$lang['start'] = '开始';
$lang['end'] = '结束';
$lang['name'] = '名字';
$lang['appointment_link_title'] = '预约连接';
$lang['success'] = '成功.';
$lang['appointment_added_to_google_calendar'] = '您的预约已经添加到您的谷歌日历.';
$lang['view_appointment_in_google_calendar'] = '点击查看在谷歌日历上的预约信息.';
$lang['appointment_added_to_your_plan'] = '新的预约添加到了您的计划。.';
$lang['appointment_link_description'] = '你可以点击下方预约链接做修改.';
$lang['appointment_not_found'] = '没有找到您的预约.';
$lang['appointment_does_not_exist_in_db'] = '系统中未发现您的预约.';
$lang['display_calendar'] = '显示 日历';
$lang['calendar'] = '日历';
$lang['users'] = '用户';
$lang['settings'] = '设置';
$lang['log_out'] = '注销';
$lang['synchronize'] = '同步';
$lang['enable_sync'] = '开启同步';
$lang['disable_sync'] = '关闭同步';
$lang['reload'] = '刷新';
$lang['appointment'] = '预约';
$lang['unavailable'] = '不可用';
$lang['week'] = '周';
$lang['month'] = '月';
$lang['today'] = '今天';
$lang['not_working'] = '不工作';
$lang['break'] = '休息';
$lang['add'] = '添加';
$lang['edit'] = '编辑';
$lang['hello'] = '您好';
$lang['all_day'] = '全天';
$lang['manage_appointment_record_hint'] = '管理所有可用服务人员和服务项目的预约记录.';
$lang['select_filter_item_hint'] = '选择服务以及提供服务人员并且在日历上查看预约.';
$lang['enable_appointment_sync_hint'] = '开启提供商的谷歌日立帐户预约同步.';
$lang['manage_customers_hint'] = '管理注册客户并且查看预约记录.';
$lang['manage_services_hint'] = '管理系统可用服务项目和类别.';
$lang['manage_users_hint'] = '管理后台用户 (管理员, 服务人员, 秘书).';
$lang['settings_hint'] = '配置系统和用户.';
$lang['log_out_hint'] = '注销.';
$lang['unavailable_periods_hint'] = '不可预约时间短内,服务人员将不能接受预约.';
$lang['new_appointment_hint'] = '在数据库中建立新的预约.';
$lang['reload_appointments_hint'] = '刷新日历.';
$lang['trigger_google_sync_hint'] = '激活谷歌日历同步进程.';
$lang['appointment_updated'] = '预约成功更新.';
$lang['undo'] = '撤销';
$lang['appointment_details_changed'] = '预约信息已经修改.';
$lang['appointment_changes_saved'] = '预约已成功修改并保存.';
$lang['save'] = '保存';
$lang['new'] = '新建';
$lang['select'] = '选择';
$lang['hide'] = '隐藏';
$lang['type_to_filter_customers'] = '输入关键字过滤客户.';
$lang['clear_fields_add_existing_customer_hint'] = '清除并输入新的客户.';
$lang['pick_existing_customer_hint'] = '选择已存在的客户.';
$lang['new_appointment_title'] = '新的预约';
$lang['edit_appointment_title'] = '编辑预约';
$lang['delete_appointment_title'] = '删除预约';
$lang['write_appointment_removal_reason'] = '请花一分钟告诉我们删除预约的原因:';
$lang['appointment_saved'] = '预约成功保存.';
$lang['new_unavailable_title'] = '新的不可预约时间段';
$lang['edit_unavailable_title'] = '编辑不可预定时间段';
$lang['unavailable_saved'] = '不可预定时间段保存成功.';
$lang['start_date_before_end_error'] = '开始日期数值晚于结束日期.';
$lang['invalid_email'] = '无效电子邮箱地址.';
$lang['customers'] = '客户';
$lang['details'] = '详细资料';
$lang['no_records_found'] = '没有找到记录...';
$lang['services'] = '服务项目';
$lang['duration_minutes'] = '时长 (Minutes)';
$lang['currency'] = '币种';
$lang['category'] = '类别';
$lang['no_category'] = '无类别';
$lang['description'] = '描述';
$lang['categories'] = '类别';
$lang['admins'] = '管理员';
$lang['providers'] = '服务人员';
$lang['secretaries'] = '秘书';
$lang['mobile_number'] = '手机号码';
$lang['state'] = '省/州';
$lang['username'] = '用户名';
$lang['password'] = '密码';
$lang['retype_password'] = '重新输入密码';
$lang['receive_notifications'] = '接收提醒';
$lang['passwords_mismatch'] = '密码不符合.';
$lang['admin_saved'] = '管理员Admin成功保存.';
$lang['provider_saved'] = '服务人员成功保存.';
$lang['secretary_saved'] = '秘书成功保存.';
$lang['admin_deleted'] = '管理员Admin成功删除';
$lang['provider_deleted'] = '服务人员成功删除.';
$lang['secretary_deleted'] = '秘书成功删除.';
$lang['service_saved'] = '服务项目成功保存.';
$lang['service_category_saved'] = '服务类别成功保存.';
$lang['service_deleted'] = '服务项目成功删除.';
$lang['service_category_deleted'] = '服务类别成功删除.';
$lang['customer_saved'] = '客户成功保存.';
$lang['customer_deleted'] = '客户成功删除.';
$lang['current_view'] = '现在的视图';
$lang['working_plan'] = '工作计划';
$lang['reset_plan'] = '重置计划';
$lang['monday'] = '星期一';
$lang['tuesday'] = '星期二';
$lang['wednesday'] = '星期三';
$lang['thursday'] = '星期四';
$lang['friday'] = '星期五';
$lang['saturday'] = '星期六';
$lang['sunday'] = '星期日';
$lang['breaks'] = '休息';
$lang['add_breaks_during_each_day'] = '在每天中加入休息时间,在此时间服务人员不能接受任何预约.';
$lang['day'] = '日';
$lang['days'] = 'Days';
$lang['actions'] = '动作';
$lang['reset_working_plan_hint'] = '重置工作计划到初始数值.';
$lang['company_name'] = '公司名称';
$lang['company_name_hint'] = '公司名称将会在任何页面中显示出来 (必须).';
$lang['company_email'] = '公司电子邮箱';
$lang['company_email_hint'] = '公司电子邮箱地址,用来与客户发送和接收信件 (必须).';
$lang['company_link'] = '公司网址';
$lang['company_link_hint'] = '公司的网址应当指向公司的官方网页 (必须).';
$lang['go_to_booking_page'] = '进入预约页面';
$lang['settings_saved'] = '设置成功保存.';
$lang['general'] = '一般设置';
$lang['business_logic'] = '工作时间';
$lang['current_user'] = '目前登录用户';
$lang['about_app'] = '关于网上预约系统';
$lang['edit_working_plan_hint'] = '标示下列贵公司的工作日以及工作时间。您可以修改预约到非工作时间,但是客户不可以从网上预定非工作时间的预约。这个工作时间计划将会成为每一位服务人员的默认时间,但是您可以通过修改服务人员的记录去更正每位服务人员的计划安排。.';
$lang['edit_breaks_hint'] = '在工作日内添加休息时间段,这些休息时间段将会对所有新的服务人员生效.';
$lang['book_advance_timeout'] = '预定高级超时设置';
$lang['book_advance_timeout_hint'] = '定义超时 (in minutes) 在其他客户预定预约之前.';
$lang['timeout_minutes'] = '超时 (Minutes)';
$lang['about_app_info'] = '网上预约系统,可以通过网页形式高度定制满足您的需求.同样可以连接您的谷歌账户,同步日历功能.';
$lang['current_version'] = '版本号';
$lang['support'] = '技术支持';
$lang['about_app_support'] = '如果您与盗任何问题,请联系我们.';
$lang['official_website'] = '官方网站';
$lang['google_plus_community'] = '谷歌社区';
$lang['support_group'] = '技术支持团队';
$lang['project_issues'] = '项目问题';
$lang['license'] = '许可';
$lang['about_app_license'] = '需要了解更多关于使用许可。请点击查看以下连接:';
$lang['logout_success'] = '您已经成功注销!点击后面的按钮去向其他页面.';
$lang['book_appointment_title'] = '预定预约';
$lang['backend_section'] = '后台界面';
$lang['you_need_to_login'] = '欢迎!请输入正确的帐户信息登录后台管理页面.';
$lang['enter_username_here'] = '这里输入您的用户名 ...';
$lang['enter_password_here'] = '这里输入您的密码 ...';
$lang['login'] = '登陆';
$lang['forgot_your_password'] = '忘记密码?';
$lang['login_failed'] = '登录失败,请输入正确的登录信息重新尝试.';
$lang['type_username_and_email_for_new_password'] = '输入您的用户名和电子邮箱地址获取密码.';
$lang['enter_email_here'] = '输入您的电子邮箱地址 ...';
$lang['regenerate_password'] = '重新生成密码';
$lang['go_to_login'] = '返回登录页面';
$lang['new_password_sent_with_email'] = '新的密码已经发送到您的电子邮箱中.';
$lang['new_account_password'] = '新的账户密码';
$lang['new_password_is'] = '您的信账户密码是 $password. 如果需要请保存这封邮件,你可以在设置页面更改密码.';
$lang['delete_record_prompt'] = '您确定删除这个记录吗?删除后无法恢复。.';
$lang['delete_admin'] = '删除管理员Admin';
$lang['delete_customer'] = '删除客户';
$lang['delete_service'] = '删除服务项目';
$lang['delete_category'] = '删除服务类别';
$lang['delete_provider'] = '删除服务人员';
$lang['delete_secretary'] = '删除秘书';
$lang['delete_appointment'] = '删除预约';
$lang['delete_unavailable'] = '删除不可用时间段';
$lang['delete'] = '删除';
$lang['unexpected_issues'] = '意外错误';
$lang['unexpected_issues_message'] = '操作因意外错误无法完成.';
$lang['close'] = '关闭';
$lang['page_not_found'] = '页面没有找到';
$lang['page_not_found_message'] = '您所请求的页面不存在,请检查您的浏览器地址或返回.';
$lang['error'] = '错误';
$lang['no_privileges'] = '没有权限';
$lang['no_privileges_message'] = '您没有所需的权限去查看这个页面,请尝试其他页面.';
$lang['backend_calendar'] = '后台日历';
$lang['start_date_time'] = '开始日期/时间';
$lang['end_date_time'] = '结束日期/时间';
$lang['licensed_under'] = '许可';
$lang['unexpected_issues_occurred'] = '出现异常出错.';
$lang['service_communication_error'] = '服务器发生通讯错误,请重新再试.';
$lang['no_privileges_edit_appointments'] = '您没有权限去更改预约.';
$lang['unavailable_updated'] = '不可用的时间段更新完毕.';
$lang['appointments'] = '预约';
$lang['unexpected_warnings'] = '异常的警告';
$lang['unexpected_warnings_message'] = '操作完成,但是有警告提示.';
$lang['filter'] = '过滤';
$lang['clear'] = '清除';
$lang['uncategorized'] = '无分类';
$lang['username_already_exists'] = '用户名已经存在.';
$lang['password_length_notice'] = '密码长度必须$number 位数.';
$lang['general_settings'] = '一般设置';
$lang['personal_information'] = '个人信息';
$lang['system_login'] = '登录系统';
$lang['user_settings_are_invalid'] = '无效的用户设置!请检查设置再继续';
$lang['add_break'] = '加入休息时间';
$lang['january'] = '一月';
$lang['february'] = '二月';
$lang['march'] = '三月';
$lang['april'] = '四月';
$lang['may'] = '五月';
$lang['june'] = '六月';
$lang['july'] = '七月';
$lang['august'] = '八月';
$lang['september'] = '九月';
$lang['october'] = '十月';
$lang['november'] = '十一月';
$lang['december'] = '十二月';
$lang['previous'] = '前一页';
$lang['next'] = '下一个';
$lang['now'] = '现在';
$lang['select_time'] = '选择时间';
$lang['time'] = '时间';
$lang['hour'] = '小时';
$lang['minute'] = '分钟';
$lang['google_sync_completed'] = '谷歌同步成功.';
$lang['google_sync_failed'] = '谷歌同步失败:不能建立与服务器的连接。.';
$lang['select_google_calendar'] = '选择谷歌日历';
$lang['select_google_calendar_prompt'] = '选择您想要同步的日历。如果您不希望选择特定的日历,那么将使用默认的日历。';
$lang['google_calendar_selected'] = '谷歌日历被选定.';
$lang['oops_something_went_wrong'] = '不好!出了一些问题.';
$lang['could_not_add_to_google_calendar'] = '您的预约不能添加到谷歌日历.';
$lang['ea_update_success'] = '预约系统已经成功更新.';
$lang['require_captcha'] = 'Require CAPTCHA';
$lang['require_captcha_hint'] = 'When enabled, the customers will have to type a random generated CAPTCHA string before booking/updating an appointment.';
$lang['captcha_is_wrong'] = 'CAPTCHA verification failed, please try again.';
$lang['any_provider'] = 'Any Provider';
$lang['requested_hour_is_unavailable'] = 'The requested appointment is unfornately not available. Please select a different hour for your appointment.';
$lang['customer_notifications'] = 'Customer Notifications';
$lang['customer_notifications_hint'] = 'Defines whether the customer will receive email notifications whenever there is a schedule change on one of his appointments.';
$lang['date_format'] = 'Date Format';
$lang['date_format_hint'] = 'Change the date display format (D - Date, M - Month, Y - Year).';
$lang['time_format'] = 'Time Format';
$lang['time_format_hint'] = 'Change the time display format (H - Hours, M - Minutes).';
$lang['first_weekday'] = 'First day of week';
$lang['first_weekday_hint'] = 'Set the first day of the calendar week.';
$lang['google_analytics_code_hint'] = 'Add your Google Analytics ID to be included in the booking page.';
$lang['availabilities_type'] = 'Availabilities Type';
$lang['flexible'] = 'Flexible';
$lang['fixed'] = 'Fixed';
$lang['attendants_number'] = 'Attendants Number';
$lang['reset_working_plan'] = 'Reset the working plan back to the default values.';
$lang['legal_contents'] = 'Legal Contents';
$lang['cookie_notice'] = 'Cookie Notice';
$lang['display_cookie_notice'] = 'Display Cookie Notice';
$lang['cookie_notice_content'] = 'Cookie Notice Content';
$lang['terms_and_conditions'] = 'Terms & Conditions';
$lang['display_terms_and_conditions'] = 'Display Terms & Conditions';
$lang['terms_and_conditions_content'] = 'Terms & Conditions Content';
$lang['privacy_policy'] = 'Privacy Policy';
$lang['display_privacy_policy'] = 'Display Privacy Policy';
$lang['privacy_policy_content'] = 'Privacy Policy Content';
$lang['website_using_cookies_to_ensure_best_experience'] = 'This website uses cookies to ensure you get the best experience on our website.';
$lang['read_and_agree_to_terms_and_conditions'] = 'I have read and agree to the {$link}Terms & Conditions{/$link}.';
$lang['read_and_agree_to_privacy_policy'] = 'I have read and agree to the {$link}Privacy Policy{/$link}.';
$lang['delete_personal_information_hint'] = 'Delete all personal information from the system.';
$lang['delete_personal_information'] = 'Delete Personal Information';
$lang['delete_personal_information_prompt'] = 'Are you sure that you want to delete your personal information? This action cannot be undone.';
$lang['location'] = 'Location';
$lang['working_plan_exception'] = 'Working Plan Exception';
$lang['working_plan_exceptions'] = 'Working Plan Exceptions';
$lang['working_plan_exceptions_hint'] = 'Add a working plan exception day, outside the working plan.';
$lang['new_working_plan_exception_title'] = 'New Working Plan Exception';
$lang['working_plan_exception_saved'] = 'Working plan exception saved successfully.';
$lang['working_plan_exception_deleted'] = 'Working plan exception deleted successfully.';
$lang['add_working_plan_exceptions_during_each_day'] = 'Add working plan exceptions, outside the working plan.';
$lang['add_working_plan_exception'] = 'Add Working Plan Exception';
$lang['require_phone_number'] = 'Require phone number';
$lang['require_phone_number_hint'] = 'When enabled, customers and users will need to enter the customer\'s phone number when booking an appointment';
$lang['check_spam_folder'] = 'Please check your spam folder if the email does not arrive within a few minutes.';
$lang['api_token_hint'] = 'Set a secret token in order to enable the token based authentication of the Easy!Appointments API.';
$lang['timezone'] = 'Timezone';
$lang['overwrite_existing_working_plans'] = 'This will overwrite the existing provider working plans, are you sure that you want to continue?';
$lang['working_plans_got_updated'] = 'All the working plans got updated.';
$lang['apply_to_all_providers'] = 'Apply To All Providers';
$lang['display_any_provider'] = 'Display Any Provider Option';
$lang['display_any_provider_hint'] = 'The booking page will get an additional option that allows customers to book without specifying a provider.';
$lang['load_more'] = 'Load More';
$lang['list'] = 'List';
$lang['default'] = 'Default';
$lang['table'] = 'Table';
$lang['date'] = 'Date';

View file

@ -0,0 +1,63 @@
<?php
/**
* CodeIgniter
*
* An open source application development framework for PHP
*
* This content is released under the MIT License (MIT)
*
* Copyright (c) 2014 - 2017, British Columbia Institute of Technology
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @package CodeIgniter
* @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com
* @since Version 1.0.0
* @filesource
*/
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['db_invalid_connection_str'] = 'Z řetězce spojení které jste zadali nelze určit nastavení databáze.';
$lang['db_unable_to_connect'] = 'Se zadanými nastaveními se není možné připojit k databázovému serveru.';
$lang['db_unable_to_select'] = 'Není možné zvolit zadanou databázi: %s';
$lang['db_unable_to_create'] = 'Není možné vytvřit zadanou databázi: %s';
$lang['db_invalid_query'] = 'Dotaz který jste zadali není platný.';
$lang['db_must_set_table'] = 'Musíte zadat databázovou tabulku na kterou bude dotaz aplikován.';
$lang['db_must_use_set'] = 'Pro aktualizaci záznamu musíte použít metodu "set".';
$lang['db_must_use_index'] = 'Pro dávkovou aktualizaci musíte zadat index, u kterého budou změny aplikovány.';
$lang['db_batch_missing_index'] = 'Jeden nebo více záznamů zadaných pro dávkovou aktualizaci postrádá zadaný index.';
$lang['db_must_use_where'] = 'Aktualizace nejsou povoleny pokud neobsahují "where" klauzuli.';
$lang['db_del_must_use_where'] = 'Odstranění nejsou povolena pokud neobsahují "where" nebo "like" klauzuli.';
$lang['db_field_param_missing'] = 'Pro získání polí je vyžadováno zadání názvu tabulky jako parametru.';
$lang['db_unsupported_function'] = 'Tato funkce není v databázi kterou používáte dostupná.';
$lang['db_transaction_failure'] = 'Selhání transakce: proveden rollback.';
$lang['db_unable_to_drop'] = 'Není možné odstranit zadanou databázi.';
$lang['db_unsupported_feature'] = 'Funkce není na databázové platformě kterou používáte podporována.';
$lang['db_unsupported_compression'] = 'Formát komprese souborů který jste zvolili není vaším serverem podporován.';
$lang['db_filepath_error'] = 'Do umístění které jste zadali není možné data zapsat.';
$lang['db_invalid_cache_path'] = 'Umístění mezipaměti které jste zadali není platné nebo zapisovatelné.';
$lang['db_table_name_required'] = 'Pro tuto operaci je vyžadován název tabulky.';
$lang['db_column_name_required'] = 'Pro tuto operaci je vyžadován název sloupce.';
$lang['db_column_definition_required'] = 'Pro tuto operaci je vyžadována definice sloupce.';
$lang['db_unable_to_set_charset'] = 'Není možné nastavit znakovou sadu spojení klienta: %s';
$lang['db_error_heading'] = 'Vyskytla se chyba databáze';

View file

@ -0,0 +1,58 @@
<?php
/**
* CodeIgniter
*
* An open source application development framework for PHP
*
* This content is released under the MIT License (MIT)
*
* Copyright (c) 2014 - 2017, British Columbia Institute of Technology
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @package CodeIgniter
* @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com
* @since Version 1.0.0
* @filesource
*/
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['email_must_be_array'] = 'Metoda validace emailu musí být předána jako pole.';
$lang['email_invalid_address'] = 'Neplatná emailová adresa: %s';
$lang['email_attachment_missing'] = 'Není možné nalézt následující přílohu emailu: %s';
$lang['email_attachment_unreadable'] = 'Není možné otevřít tuto přílohu: %s';
$lang['email_no_from'] = 'Nelze odeslat email bez hodnoty pole "Od".';
$lang['email_no_recipients'] = 'Musíte zadat příjemce: Komu, Kopie nebo Skrytá kopie';
$lang['email_send_failure_phpmail'] = 'Není možné odeslat email pomocí PHP mail(). Váš server možná není konfigurován, aby odesílal emaily protřednictvím této metody.';
$lang['email_send_failure_sendmail'] = 'Není možné odeslat email pomocí PHP Sendmail. Váš server možná není konfigurován, aby odesílal emaily prostřednictvím této metody.';
$lang['email_send_failure_smtp'] = 'Není možné odeslat email pomocí PHP SMTP. Váš server možná není konfigurován, aby odesílal emaily prostřednictvím této metody.';
$lang['email_sent'] = 'Vaše zpráva byla úspěšně odeslána prostřednictvím následujícího protokolu: %s';
$lang['email_no_socket'] = 'Není možné otevřít socket pro Sendmail. Zkontrolujte prosím nastavení.';
$lang['email_no_hostname'] = 'Nezadali jste název hosta SMTP.';
$lang['email_smtp_error'] = 'Vyskytla se následující SMTP chyba: %s';
$lang['email_no_smtp_unpw'] = 'Chyba: Musíte přidělit uživatelské jméno a heslo SMTP.';
$lang['email_failed_smtp_login'] = 'Odeslání příkazu AUTH LOGIN selhalo. Chyba: %s';
$lang['email_smtp_auth_un'] = 'Autentizace uživatelského jména selhala. Chyba: %s';
$lang['email_smtp_auth_pw'] = 'Autentizace hesla selhala. Chyba: %s';
$lang['email_smtp_data_failure'] = 'Není možné odeslat data: %s';
$lang['email_exit_status'] = 'Výstupní kód ukončení programu: %s';

View file

@ -0,0 +1,19 @@
<?php
/**
* System messages translation for CodeIgniter(tm)
*
* @author CodeIgniter community
* @copyright Copyright (c) 2014-2018, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com
*/
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['migration_none_found'] = 'Nebyla nalezena žádná migrace.';
$lang['migration_not_found'] = 'Migrace s číslem verze %s nebyla nalezena.';
$lang['migration_sequence_gap'] = 'V blízkosti sekvence migrace s číslem verze %s se nachází mezera.';
$lang['migration_multiple_version'] = 'Existuje více migrací se shodným číslem verze: %s.';
$lang['migration_class_doesnt_exist'] = 'Třída migrace "%s" nebyla nalezena.';
$lang['migration_missing_up_method'] = 'Třída migrace "%s" postrádá metodu "up".';
$lang['migration_missing_down_method'] = 'Třída migrace "%s" postrádá metodu "down".';
$lang['migration_invalid_filename'] = 'Migrace "%s" má neplatný název souboru.';

View file

@ -0,0 +1,323 @@
<?php defined('BASEPATH') OR exit('No direct script access allowed');
// Czech
$lang['page_title'] = 'Rezervace schůzky s';
$lang['service_and_provider'] = 'Výběr služby & poskytovatele';
$lang['select_service'] = 'Vyberte službu';
$lang['select_provider'] = 'Vyberte poskytovatele';
$lang['duration'] = 'Trvání';
$lang['minutes'] = 'Minut';
$lang['price'] = 'Cena';
$lang['back'] = 'Zpět';
$lang['appointment_date_and_time'] = 'Výběr data a času schůzky';
$lang['no_available_hours'] = 'V rámci zvoleného data nejsou k dispozici žádné termíny pro rezervaci schůzky. Zvolte prosím jiné datum.';
$lang['appointment_hour_missing'] = 'Než budete pokračovat, zvolte prosím termín schůzky.';
$lang['customer_information'] = 'Zadání vašich údajů';
$lang['first_name'] = 'Jméno';
$lang['last_name'] = 'Příjmení';
$lang['email'] = 'Email';
$lang['phone_number'] = 'Telefonní číslo';
$lang['address'] = 'Adresa';
$lang['city'] = 'Obec';
$lang['zip_code'] = 'PSČ';
$lang['notes'] = 'Poznámky';
$lang['fields_are_required'] = 'Pole označená * jsou povinná.';
$lang['appointment_confirmation'] = 'Rezervace schůzky';
$lang['confirm'] = 'Potvrdit';
$lang['update'] = 'Změnit';
$lang['cancel_appointment_hint'] = 'Pro odebrání schůzky z kalendáře společnosti klikněte na tlačítko "Zrušit".';
$lang['cancel'] = 'Zrušit';
$lang['appointment_registered'] = 'Vaše schůzka byla úspěšně registrována.';
$lang['cancel_appointment_title'] = 'Zrušit schůzku';
$lang['appointment_cancelled'] = 'Vaše schůzka byla úspěšně zrušena.';
$lang['appointment_cancelled_title'] = 'Schůzka zrušena';
$lang['reason'] = 'Důvod';
$lang['appointment_removed_from_schedule'] = 'Následující schůzka byla odstraněna z kalendáře společnosti.';
$lang['appointment_details_was_sent_to_you'] = 'Byl vám odeslán email s informacemi o schůzce.';
$lang['add_to_google_calendar'] = 'Přidat do Kalendáře Google';
$lang['appointment_booked'] = 'Vaše schůzka byla úspěšně rezervována.';
$lang['thank_you_for_appointment'] = 'Děkujeme za vaši rezervaci schůzky s naší společností. Níže jsou zobrazeny informace o schůzce. Změny můžete provést kliknutím na odkaz na schůzku.';
$lang['appointment_details_title'] = 'Informace o schůzce';
$lang['customer_details_title'] = 'Informace o zákazníkovi';
$lang['service'] = 'Služba';
$lang['provider'] = 'Poskytovatel';
$lang['customer'] = 'Zákazník';
$lang['start'] = 'Začátek';
$lang['end'] = 'Konec';
$lang['name'] = 'Název';
$lang['phone'] = 'Telefon';
$lang['address'] = 'Adresa';
$lang['appointment_link_title'] = 'Odkaz na schůzku';
$lang['success'] = 'Úspěch.';
$lang['appointment_added_to_google_calendar'] = 'Vaše schůzka byla přidána do vašeho účtu v Kalendáři Google.';
$lang['view_appointment_in_google_calendar'] = 'Pro zobrazení vaši schůzky v Kalendáři Google klikněte sem.';
$lang['appointment_added_to_your_plan'] = 'Do vašeho rozvrhu byla přidána nová schůzka.';
$lang['appointment_link_description'] = 'Editaci můžete provést kliknutím na níže uvedený odkaz na schůzku.';
$lang['appointment_not_found'] = 'Schůzka nenalezena.';
$lang['appointment_does_not_exist_in_db'] = 'Požadovaná schůzka již v databázi systému neexistuje.';
$lang['display_calendar'] = 'Zobrazit kalendář';
$lang['calendar'] = 'Kalendář';
$lang['users'] = 'Uživatelé';
$lang['settings'] = 'Nastavení';
$lang['log_out'] = 'Odhlášení';
$lang['synchronize'] = 'Synchronizace';
$lang['enable_sync'] = 'Povolit synchronizaci';
$lang['disable_sync'] = 'Zakázat synchronizaci';
$lang['reload'] = 'Obnovit';
$lang['appointment'] = 'Schůzka';
$lang['unavailable'] = 'Nedostupnost';
$lang['week'] = 'Týden';
$lang['month'] = 'Měsíc';
$lang['today'] = 'Dnes';
$lang['not_working'] = 'Zavřeno';
$lang['break'] = 'Přestávka';
$lang['add'] = 'Přidat';
$lang['edit'] = 'Změnit';
$lang['hello'] = 'Dobrý den';
$lang['all_day'] = 'Celodenní';
$lang['manage_appointment_record_hint'] = 'Správa záznamů všech schůzek dostupných poskytovatelů a služeb.';
$lang['select_filter_item_hint'] = 'Výběr poskytovatele nebo služby a zobrazení schůzek v kalendáři.';
$lang['enable_appointment_sync_hint'] = 'Povolit synchronizaci schůzek s účtem Kalendáře Google poskytovatele.';
$lang['manage_customers_hint'] = 'Správa registrovaných zákazníků a zobrazení historie jejich rezervací.';
$lang['manage_services_hint'] = 'Správa dostupných služeb a kategorií.';
$lang['manage_users_hint'] = 'Správa interních uživatelů (administrátoři, poskytovatelé, sekretářky).';
$lang['settings_hint'] = 'Systémová a uživatelská nastavení.';
$lang['log_out_hint'] = 'Odhlášení ze systému.';
$lang['unavailable_periods_hint'] = 'V době, kdy není poskytovatel dostupný, nelze rezervovat nové schůzky.';
$lang['new_appointment_hint'] = 'Vytvoření nové schůzky a uložení do databáze.';
$lang['reload_appointments_hint'] = 'Obnovit zobrazení schůzek v kalendáři.';
$lang['trigger_google_sync_hint'] = 'Zahájit proces synchronizace s Kalendářem Google.';
$lang['appointment_updated'] = 'Provedené změny schůzky byly úspěšně uloženy.';
$lang['undo'] = 'Zpět';
$lang['appointment_details_changed'] = 'Informace schůzky byly změněny.';
$lang['appointment_changes_saved'] = 'Provedené změny schůzky byly úspěšně uloženy.';
$lang['save'] = 'Uložit';
$lang['new'] = 'Nový';
$lang['select'] = 'Vybrat';
$lang['hide'] = 'Skrýt';
$lang['type_to_filter_customers'] = 'Zadejte řetězec pro filtrování zákazníků.';
$lang['clear_fields_add_existing_customer_hint'] = 'Vymazat údaje a zadat nového zákazníka.';
$lang['pick_existing_customer_hint'] = 'Vybrat existujícího zákazníka.';
$lang['new_appointment_title'] = 'Nová schůzka';
$lang['edit_appointment_title'] = 'Editace schůzky';
$lang['delete_appointment_title'] = 'Odstranit schůzku';
$lang['write_appointment_removal_reason'] = 'Věnujte nám prosím chvilku a sdělte nám důvod, proč jste schůzku zrušili:';
$lang['appointment_saved'] = 'Schůzka úspěšně uložena.';
$lang['new_unavailable_title'] = 'Nové období nedostupnosti';
$lang['edit_unavailable_title'] = 'Editovat období nedostupnosti';
$lang['unavailable_saved'] = 'Období nedostupnosti úspěšně uloženo.';
$lang['start_date_before_end_error'] = 'Datum zahájení je vyšší než datum ukončení.';
$lang['invalid_email'] = 'Neplatná emailová adresa.';
$lang['customers'] = 'Zákazníci';
$lang['details'] = 'Základní údaje';
$lang['no_records_found'] = 'Nebyly nalezeny žádné záznamy...';
$lang['services'] = 'Služby';
$lang['duration_minutes'] = 'Doba trvání (Minuty)';
$lang['currency'] = 'Měna';
$lang['category'] = 'Kategorie';
$lang['no_category'] = 'Žádná kategorie';
$lang['description'] = 'Popis';
$lang['categories'] = 'Kategorie';
$lang['admins'] = 'Administrátoři';
$lang['providers'] = 'Poskytovatelé';
$lang['secretaries'] = 'Sekretářky';
$lang['mobile_number'] = 'Mobilní telefon';
$lang['state'] = 'Stát';
$lang['username'] = 'Uživatelské jméno';
$lang['password'] = 'Heslo';
$lang['retype_password'] = 'Potvrzení hesla';
$lang['receive_notifications'] = 'Odesílat notifikace';
$lang['passwords_mismatch'] = 'Heslo a potvrzení hesla se neshodují.';
$lang['admin_saved'] = 'Administrátor úspěšně uložen.';
$lang['provider_saved'] = 'Poskytovatel úspěšně uložen.';
$lang['secretary_saved'] = 'Sekretářka úspěšně uložena.';
$lang['admin_deleted'] = 'Administrátor úspěšně odstraněn.';
$lang['provider_deleted'] = 'Poskytovatel úspěšně odstraněn.';
$lang['secretary_deleted'] = 'Sekretářka úspěšně odstraněna.';
$lang['service_saved'] = 'Služba úspěšně uložena.';
$lang['service_category_saved'] = 'Kategorie služeb úspěšně uložena.';
$lang['service_deleted'] = 'Služba úspěšně odstraněna.';
$lang['service_category_deleted'] = 'Kategorie služeb úspěšně odstraněna.';
$lang['customer_saved'] = 'Zákazník úspěšně uložen.';
$lang['customer_deleted'] = 'Zákazník úspěšně odstraněn.';
$lang['current_view'] = 'Aktuální zobrazení';
$lang['working_plan'] = 'Pracovní doba';
$lang['reset_plan'] = 'Resetovat pracovní dobu';
$lang['monday'] = 'Pondělí';
$lang['tuesday'] = 'Úterý';
$lang['wednesday'] = 'Středa';
$lang['thursday'] = 'Čtvrtek';
$lang['friday'] = 'Pátek';
$lang['saturday'] = 'Sobota';
$lang['sunday'] = 'Neděle';
$lang['breaks'] = 'Přestávky';
$lang['add_breaks_during_each_day'] = 'Definice pracovních přestávek během každého dne. V průběhu přestávek nebude poskytovatel přijímat žádné schůzky.';
$lang['day'] = 'Den';
$lang['days'] = 'Dny';
$lang['actions'] = 'Akce';
$lang['reset_working_plan_hint'] = 'Resetovat pracovní plán zpět na defaultní hodnoty.';
$lang['company_name'] = 'Název společnosti';
$lang['company_name_hint'] = 'Název společnosti, který bude zobrazen všude v systému (povinné).';
$lang['company_email'] = 'Email společnosti';
$lang['company_email_hint'] = 'Toto bude emailová adresa společnosti. Bude používána jako email odesílatele a pro příjem odpovědí na systémové emaily (povinné).';
$lang['company_link'] = 'Odkaz na web splečnosti';
$lang['company_link_hint'] = 'Odkaz na web společnosti by měl vést na oficální webové stránky společnosti (povinné).';
$lang['go_to_booking_page'] = 'Přejít na stránku rezervací';
$lang['settings_saved'] = 'Nastavení úspěšně uložena.';
$lang['general'] = 'Obecné';
$lang['business_logic'] = 'Business logika';
$lang['current_user'] = 'Přihlášený uživatel';
$lang['about_app'] = 'O aplikaci Easy!Appointments';
$lang['edit_working_plan_hint'] = 'Zde označte dny a hodiny kdy bude vaše společnost přijímat rezervace schůzek. Budete mít možnost přizpůsobit schůzky mimo pracovní dobu, ale pro zákazníky tato možnost k dispozici nebude. Tato pracovní doba bude dafultní pro každého nově založeného poskytovatele, přičemž ji bude možné změnit u každého jednotlivého poskytovatele v rámci editace. Poté můžete přidat období přestávek.';
$lang['edit_breaks_hint'] = 'Zadejte přestávky v rámci každého dne. Definované Přestávky budou použity pro všechny nově založené poskytovatele.';
$lang['book_advance_timeout'] = 'Časový limit rezervace';
$lang['book_advance_timeout_hint'] = 'Definujte časový limit (v minutách), před jehož uplynutím budou moci zákazníci zadat nebo změnit rezervaci schůzky se společností.';
$lang['timeout_minutes'] = 'Časový limit (Minuty)';
$lang['about_app_info'] = 'Easy!Appointments je vysoce přizpůsobitelná webová aplikace, která vašim zákazníkům umožňuje rezervovat si s vámi schůzky prostřednictvím webu. Navíc poskytuje možnost synchronizovat vaše data s Kalendářem Google, takže je můžete využívat v rámci dalších služeb.';
$lang['current_version'] = 'Aktuální verze';
$lang['support'] = 'Podpora';
$lang['about_app_support'] = 'Pokud při používání Easy!Appointments narazíte na jakékoli problémy můžete odpovědi hledat v oficiální skupině Google. Také můžete založit nový incident na stránce Google Code za účelem podpory dalšího vývoje.';
$lang['official_website'] = 'Oficiální stránky';
$lang['google_plus_community'] = 'Komunita Google+';
$lang['support_group'] = 'Skupina podpory';
$lang['project_issues'] = 'Incidenty projektu';
$lang['license'] = 'Licence';
$lang['about_app_license'] = 'Easy!Appointments je licencováno pod licencí GPLv3. Používáním kódu Easy!Appointments v jakékoli formě souhlasíte s podmínkami popsanými v dokumentu na následující adrese:';
$lang['logout_success'] = 'Byli jste úspěšně odhlášeni! Pro přesměrování na jinou stránku klikněte na některé z následujících tlačítek.';
$lang['book_appointment_title'] = 'Rezervace schůzky';
$lang['backend_section'] = 'Administrace';
$lang['you_need_to_login'] = 'Vítejte! Pro zobrazení sekce administrace se musíte přihlásit.';
$lang['enter_username_here'] = 'Zadejte vaše uživatelské jméno ...';
$lang['enter_password_here'] = 'Zadejte vaše heslo ...';
$lang['login'] = 'Přihlásit';
$lang['forgot_your_password'] = 'Zapomenuté heslo?';
$lang['login_failed'] = 'Přihlášení selhalo, prosím zadejte správné přihlašovací údaje a zkuste se znovu přihlásit.';
$lang['type_username_and_email_for_new_password'] = 'Pro získání nového hesla zadejte vaše uživatelské jméno a vaši emailovou adresu.';
$lang['enter_email_here'] = 'Zadejte vaši emailovou adresu ...';
$lang['regenerate_password'] = 'Znovu vygenerovat heslo';
$lang['go_to_login'] = 'Zpět na přihlášení';
$lang['new_password_sent_with_email'] = 'Vaše nové heslo vám bylo zasláno prostřednictvím emailu.';
$lang['new_account_password'] = 'Nové heslo';
$lang['new_password_is'] = 'Vaše nové heslo je $password. Prosím, uschovejte tento email pro případ, že byste potřebovali znovu zjistit vaše heslo. Heslo si také můžete změnit v rámci nastavení.';
$lang['delete_record_prompt'] = 'Opravdu si přejete odstranit tento záznam? Tuto akci nelze vrátit zpět.';
$lang['delete_admin'] = 'Odstranit administrátora';
$lang['delete_customer'] = 'Odstranit zákazníka';
$lang['delete_service'] = 'Odstranit službu';
$lang['delete_category'] = 'Odstranit kategorii služeb';
$lang['delete_provider'] = 'Odstranit poskytovatele';
$lang['delete_secretary'] = 'Odstranit sekretářku';
$lang['delete_appointment'] = 'Odstranit schůzku';
$lang['delete_unavailable'] = 'Odstranit období nedostupnosti';
$lang['delete'] = 'Odstranit';
$lang['unexpected_issues'] = 'Neočekávaná chyba';
$lang['unexpected_issues_message'] = 'Operaci nebylo možné dokončit z důvodu neočekávané chyby.';
$lang['close'] = 'Zavřít';
$lang['page_not_found'] = 'Stránka nenalezena';
$lang['page_not_found_message'] = 'Bohužel, požadovaná stránka neexistuje. Zkontrolujte prosím adresu URL v prohlížeči nebo přejděte do jiného umístění pomocí některého z níže uvedeních tlačítek.';
$lang['error'] = 'Chyba';
$lang['no_privileges'] = 'Žádná oprávnění';
$lang['no_privileges_message'] = 'Pro zobrazení této stránky nemáte požadovaná oprávnění. Přejděte prosím do jiné sekce.';
$lang['backend_calendar'] = 'Kalendář administrace';
$lang['start_date_time'] = 'Datum / čas zahájení';
$lang['end_date_time'] = 'Datum / čas ukončení';
$lang['licensed_under'] = 'Licencováno pod';
$lang['unexpected_issues_occurred'] = 'Vyskytla se neočekávaná chyba.';
$lang['service_communication_error'] = 'Vyskytla se chyba při komunikaci se serverem, prosím opakujte akci.';
$lang['no_privileges_edit_appointments'] = 'Pro editaci schůzek nemáte požadovaná oprávnění.';
$lang['unavailable_updated'] = 'Období nedostupnosti úspěšně změněno.';
$lang['appointments'] = 'Schůzky';
$lang['unexpected_warnings'] = 'Neočekávaná varování';
$lang['unexpected_warnings_message'] = 'Operace byla provedena, ale vyskytla se nějaká varování.';
$lang['filter'] = 'Filtrovat';
$lang['clear'] = 'Zrušit filtr';
$lang['uncategorized'] = 'Nekategorizováno';
$lang['username_already_exists'] = 'Uživatelské jméno již existuje.';
$lang['password_length_notice'] = 'Heslo musí být minimálně $number znaků dlouhé.';
$lang['general_settings'] = 'Obecná nastavení';
$lang['personal_information'] = 'Osobní údaje';
$lang['system_login'] = 'Přihlášení do systému';
$lang['user_settings_are_invalid'] = 'Uživatelská nastavení nejsou platná! Prosím, zkontrolujte vaše nastavení, a poté akci opakujte.';
$lang['add_break'] = 'Přidat přestávku';
$lang['january'] = 'Leden';
$lang['february'] = 'Únor';
$lang['march'] = 'Březen';
$lang['april'] = 'Duben';
$lang['may'] = 'Květen';
$lang['june'] = 'Červen';
$lang['july'] = 'Červenec';
$lang['august'] = 'Srpen';
$lang['september'] = 'Září';
$lang['october'] = 'Říjen';
$lang['november'] = 'Listopad';
$lang['december'] = 'Prosinec';
$lang['previous'] = 'Předchozí';
$lang['next'] = 'Vpřed';
$lang['now'] = 'Nyní';
$lang['select_time'] = 'Vyberte čas';
$lang['time'] = 'Čas';
$lang['hour'] = 'Hodina';
$lang['minute'] = 'Minuta';
$lang['google_sync_completed'] = 'Synchronizace s Google byla úspěšně dokončena.';
$lang['google_sync_failed'] = 'Synchronizace s Google selhala: nepodařilo se navázat spojení se serverem.';
$lang['select_google_calendar'] = 'Vberte Kalednář Google';
$lang['select_google_calendar_prompt'] = 'Výberte kalendář, do kterého chcete synchronizovat vaše schůzky. Jestliže nechcete vybrat konkrétní kalendář, bude použit defaultní.';
$lang['google_calendar_selected'] = 'Kalendář Google byl úspěšně vybrán.';
$lang['oops_something_went_wrong'] = 'Oops! Něco se pokazilo.';
$lang['could_not_add_to_google_calendar'] = 'Vaše schůzka nemohla být přidána do vašeho Kalendáře Google.';
$lang['ea_update_success'] = 'Aplikace Easy!Appointments byla úspěšně aktualizována.';
$lang['require_captcha'] = 'Vyžadovat CAPTCHA';
$lang['require_captcha_hint'] = 'Pokud bude povolena, zákazníci budou muset před vytvořením/editací schůzky zadat náhodně vygenerovaný řetězec CAPTCHA.';
$lang['captcha_is_wrong'] = 'Ověření CAPTCHA selhalo, prosím opakujte akci.';
$lang['any_provider'] = 'Jakýkoli poskytovatel';
$lang['requested_hour_is_unavailable'] = 'Požadovaná schůzka bohužel aktuálně není dostupná. Vyberte prosím pro vaši schůzku jiný čas.';
$lang['customer_notifications'] = 'Notifikace zákazníků';
$lang['customer_notifications_hint'] = 'Definuje, zda bude zákazníkům v případě změny rozvrhu týkající se schůzky zákazníka odesílána notifikace emailem.';
$lang['date_format'] = 'Formát datumu';
$lang['date_format_hint'] = 'Změnit zobrazovaný formát datumu (D - datum, M - měsíc, Y - rok).';
$lang['time_format'] = 'Formát času';
$lang['time_format_hint'] = 'Změnit zobrazovaný formát času (H - hodiny, M - minuty).';
$lang['google_analytics_code_hint'] = 'Přidat do stránky rezervací vaše Google Analytics ID.';
$lang['availabilities_type'] = 'Typy dostupnosti';
$lang['flexible'] = 'Flexibilní';
$lang['fixed'] = 'Fixní';
$lang['attendants_number'] = 'Počet účastníků';
$lang['reset_working_plan'] = 'Resetovat pracovní dobu na defaultní hodnoty.';
$lang['legal_contents'] = 'Právní obsah';
$lang['cookie_notice'] = 'Cookie upozornění';
$lang['display_cookie_notice'] = 'Zobrazit Cookie upozornění';
$lang['cookie_notice_content'] = 'Obsah cookie upozornění';
$lang['terms_and_conditions'] = 'Obchodní podmínky';
$lang['display_terms_and_conditions'] = 'Zobrazit obchodní podmínky';
$lang['terms_and_conditions_content'] = 'Obsah obchodních podmínek';
$lang['privacy_policy'] = 'Zásady ochrany osobních údajů';
$lang['display_privacy_policy'] = 'Zobrazit zásady ochrany osobních údajů';
$lang['privacy_policy_content'] = 'Obsah zásad ochrany osobních údajů';
$lang['website_using_cookies_to_ensure_best_experience'] = 'Tyto webové stránky používají cookies pro zajištění vaší nejlepší zkušenosti na našich webových stránkách.';
$lang['read_and_agree_to_terms_and_conditions'] = 'Přečetl jsem a souhlasím s {$link}Obchodními podmínkami{/$link}.';
$lang['read_and_agree_to_privacy_policy'] = 'Přečetl jsem a souhlasím se {$link}Zásadami ochrany osobních údajů{/$link}.';
$lang['delete_personal_information_hint'] = 'Odstranit ze systému všechny osobní údaje.';
$lang['delete_personal_information'] = 'Odstranit osobní údaje';
$lang['delete_personal_information_prompt'] = 'Jste si jisti, že chcete odstranit vaše osobní údaje? Tuto akci nelze vzít zpět.';
$lang['location'] = 'Location';
$lang['working_plan_exception'] = 'Working Plan Exception';
$lang['working_plan_exceptions'] = 'Working Plan Exceptions';
$lang['working_plan_exceptions_hint'] = 'Add a working plan exception day, outside the working plan.';
$lang['new_working_plan_exception_title'] = 'New Working Plan Exception';
$lang['working_plan_exception_saved'] = 'Working plan exception saved successfully.';
$lang['working_plan_exception_deleted'] = 'Working plan exception deleted successfully.';
$lang['add_working_plan_exceptions_during_each_day'] = 'Add working plan exceptions, outside the working plan.';
$lang['add_working_plan_exception'] = 'Add Working Plan Exception';
$lang['require_phone_number'] = 'Require phone number';
$lang['require_phone_number_hint'] = 'When enabled, customers and users will need to enter the customer\'s phone number when booking an appointment';
$lang['check_spam_folder'] = 'Please check your spam folder if the email does not arrive within a few minutes.';
$lang['api_token_hint'] = 'Set a secret token in order to enable the token based authentication of the Easy!Appointments API.';
$lang['timezone'] = 'Timezone';
$lang['overwrite_existing_working_plans'] = 'This will overwrite the existing provider working plans, are you sure that you want to continue?';
$lang['working_plans_got_updated'] = 'All the working plans got updated.';
$lang['apply_to_all_providers'] = 'Apply To All Providers';
$lang['display_any_provider'] = 'Display Any Provider Option';
$lang['display_any_provider_hint'] = 'The booking page will display an additional option that allows customers to book without selecting a particular provider.';
$lang['load_more'] = 'Load More';
$lang['list'] = 'List';
$lang['default'] = 'Default';
$lang['table'] = 'Table';
$lang['date'] = 'Date';

View file

@ -0,0 +1,323 @@
<?php defined('BASEPATH') OR exit('No direct script access allowed');
// Danish
$lang['page_title'] = 'Book tid ved ...';
$lang['service_and_provider'] = 'Vælg tjeneste og leverandør';
$lang['select_service'] = 'Vælg tjeneste';
$lang['select_provider'] = 'Vælg leverandør';
$lang['duration'] = 'Varighed:';
$lang['minutes'] = 'Minutter:';
$lang['price'] = 'Pris:';
$lang['back'] = 'Tilbage';
$lang['appointment_date_and_time'] = 'Vælg dato og tid';
$lang['no_available_hours'] = 'Der er ingen ledig tid på den valgte dato.';
$lang['appointment_hour_missing'] = 'Vælg en tid før du kan fortsætte.';
$lang['customer_information'] = 'Udfyld informationer';
$lang['first_name'] = 'Fornavn';
$lang['last_name'] = 'Efternavn';
$lang['email'] = 'Email';
$lang['phone_number'] = 'Telefonnummer';
$lang['address'] = 'Adresse';
$lang['city'] = 'By';
$lang['zip_code'] = 'Postnummer';
$lang['notes'] = 'Bemærkning';
$lang['fields_are_required'] = 'Felter mærkeret med * skal udfyldes';
$lang['appointment_confirmation'] = 'Bekræft aftale';
$lang['confirm'] = 'Bekræft';
$lang['update'] = 'opdater';
$lang['cancel_appointment_hint'] = 'Tryk "annuller" for at aflyse aftalen';
$lang['cancel'] = 'Annuller';
$lang['appointment_registered'] = 'Din tidbestilling er registret';
$lang['cancel_appointment_title'] = 'Slet tid';
$lang['appointment_cancelled'] = 'Din tid er nu slettet';
$lang['appointment_cancelled_title'] = 'tiden er slettet';
$lang['reason'] = 'Grund';
$lang['appointment_removed_from_schedule'] = 'Din følgende tid er slettet ';
$lang['appointment_details_was_sent_to_you'] = 'Du vil modtage en email med oplysninger om din tidsbestilling.';
$lang['add_to_google_calendar'] = 'Tilføj til google kalenderen';
$lang['appointment_booked'] = 'Din tid er nu booket';
$lang['thank_you_for_appointment'] = 'Tak for din tidsbetilling hos os. Nedenfor kan du se oplysninger om aftalen. For at ændre i tids bestillingen tryk på linket.';
$lang['appointment_details_title'] = 'Oplysninger om aftale';
$lang['customer_details_title'] = 'Kunde oplysninger';
$lang['service'] = 'Betjening';
$lang['provider'] = 'Leverandør';
$lang['customer'] = 'Customer';
$lang['start'] = 'Start';
$lang['end'] = 'Slut';
$lang['name'] = 'Navn';
$lang['appointment_link_title'] = 'Link til aftale.';
$lang['success'] = 'Succes.';
$lang['appointment_added_to_google_calendar'] = 'Din aftale er blevet tilføjet til din Google kalender.';
$lang['view_appointment_in_google_calendar'] = 'Klik her for at se din aftale i Google kalenderen. ';
$lang['appointment_added_to_your_plan'] = 'En ny aftale er blevet tilføjet til din plan.';
$lang['appointment_link_description'] = 'Du kan lave ændringer ved at trykke på linket nedenfor';
$lang['appointment_not_found'] = 'kunne ikke finde aftale.';
$lang['appointment_does_not_exist_in_db'] = 'Den tid du efterspørger eksistere ikke i systemet mere.';
$lang['display_calendar'] = 'Vis kalender.';
$lang['calendar'] = 'Kalender';
$lang['users'] = 'Bruger';
$lang['settings'] = 'Indstillinger';
$lang['log_out'] = 'Log ud';
$lang['synchronize'] = 'Synkroniser';
$lang['enable_sync'] = 'Aktivere';
$lang['disable_sync'] = 'Deaktivere';
$lang['reload'] = 'Opdater';
$lang['appointment'] = 'Aftale';
$lang['unavailable'] = 'Ikke tilgængelig';
$lang['week'] = 'Uge';
$lang['month'] = 'Måned';
$lang['today'] = 'I dag';
$lang['not_working'] = 'Arbejder ikke';
$lang['break'] = 'Pause';
$lang['add'] = 'Tilføj';
$lang['edit'] = 'Redigere';
$lang['hello'] = 'Hej';
$lang['all_day'] = 'Hele dagen';
$lang['manage_appointment_record_hint'] = 'Administrer alle tidsbestillings på de tilgængelige leverandører og tjenester.';
$lang['select_filter_item_hint'] = 'Vælg en leverandør eller service og se aftalen i kalenderen.';
$lang['enable_appointment_sync_hint'] = 'Aktivere aftalen og synkroniser den med leverandørens Google kalender konto.';
$lang['manage_customers_hint'] = 'Behandle de registrede kunder og se deres bookings historie.';
$lang['manage_services_hint'] = 'Administrer de tilgængelige tjenester og kategorier fra systemet.';
$lang['manage_users_hint'] = 'Administrere den tilbagevende bruger (admin, leverandører, sekretærer)';
$lang['settings_hint'] = 'System- og brugerindstillinger.';
$lang['log_out_hint'] = 'Log ud af systemet';
$lang['unavailable_periods_hint'] = 'I ikke tilgængelig periode kan leverandøren ikke accepertere nye aftaler.';
$lang['new_appointment_hint'] = 'Tilføj en ny aftale ller konto i databasen.';
$lang['reload_appointments_hint'] = 'Opdater kalender.';
$lang['trigger_google_sync_hint'] = 'Udløs Google kalender synkroniseringen processen.';
$lang['appointment_updated'] = 'Tiden er opdateret.';
$lang['undo'] = 'Fortryd';
$lang['appointment_details_changed'] = 'Tidens oplysninger er ændret.';
$lang['appointment_changes_saved'] = 'Aftalens ændring er blevet gemt';
$lang['save'] = 'Gem';
$lang['new'] = 'Ny';
$lang['select'] = 'Vælg';
$lang['hide'] = 'Skjul';
$lang['type_to_filter_customers'] = 'Type filter til kunderne';
$lang['clear_fields_add_existing_customer_hint'] = 'Ryd flettet og tilføj ny kunde';
$lang['pick_existing_customer_hint'] = 'vælg en eksisterende kunde';
$lang['new_appointment_title'] = 'Ny aftale';
$lang['edit_appointment_title'] = 'Redigere aftale';
$lang['delete_appointment_title'] = 'Slet aftale';
$lang['write_appointment_removal_reason'] = 'Være venlig at skrive hvorfor du sletter din aftale';
$lang['appointment_saved'] = 'Aftalen er gemt';
$lang['new_unavailable_title'] = 'Ny ikke tilgængelig periode';
$lang['edit_unavailable_title'] = 'Redigere ikke tilgængelig periode';
$lang['unavailable_saved'] = 'Ikke tilgængelig periode er gemt.';
$lang['start_date_before_end_error'] = 'Start dato er større end slut dato';
$lang['invalid_email'] = 'Ugyldig email adresse';
$lang['customers'] = 'Kunderne';
$lang['details'] = 'Detaljer';
$lang['no_records_found'] = 'Ingen registering fundet';
$lang['services'] = 'Tjenester';
$lang['duration_minutes'] = 'Varighed.';
$lang['currency'] = 'Valuta';
$lang['category'] = 'Kategori';
$lang['no_category'] = 'Ingen kategori';
$lang['description'] = 'Beskrivelse';
$lang['categories'] = 'Kategorier';
$lang['admins'] = 'Administratore';
$lang['providers'] = 'Leverandører';
$lang['secretaries'] = 'Sekretærer';
$lang['mobile_number'] = 'Mobilnummer';
$lang['state'] = 'Land';
$lang['username'] = 'Brugernavn';
$lang['password'] = 'Password';
$lang['retype_password'] = 'Gentag password';
$lang['receive_notifications'] = 'Modtag notifikationer';
$lang['passwords_mismatch'] = 'Password passer ikke med brugernavnet';
$lang['admin_saved'] = 'Administration gemt';
$lang['provider_saved'] = 'Leverandør gemt';
$lang['secretary_saved'] = 'Sekretær gemt';
$lang['admin_deleted'] = 'Administration slettet';
$lang['provider_deleted'] = 'Leverandør slettet';
$lang['secretary_deleted'] = 'Sekræter slettet';
$lang['service_saved'] = 'Tjenesten er gemt';
$lang['service_category_saved'] = 'Tjeneste kategori gemt';
$lang['service_deleted'] = 'Tjeneste slettet';
$lang['service_category_deleted'] = 'Tjeneste kategori slettet';
$lang['customer_saved'] = 'Kunde gemt';
$lang['customer_deleted'] = 'Kunde slettet';
$lang['current_view'] = 'Nu vises';
$lang['working_plan'] = 'Arbejdsplan';
$lang['reset_plan'] = 'Nulstil plan';
$lang['monday'] = 'Mandag';
$lang['tuesday'] = 'Tirsdag';
$lang['wednesday'] = 'Onsdag';
$lang['thursday'] = 'Torsdag';
$lang['friday'] = 'Fredag';
$lang['saturday'] = 'Lørdag';
$lang['sunday'] = 'Søndag';
$lang['breaks'] = 'Pause';
$lang['add_breaks_during_each_day'] = 'Tilføj pause hver dag. I pausen acceptere leverandøren ikke nogen tids bestilling';
$lang['day'] = 'Dag';
$lang['days'] = 'Dage';
$lang['actions'] = 'Aktivere';
$lang['reset_working_plan_hint'] = 'Gendan arbejdsplanen tilbage til normalen.';
$lang['company_name'] = 'Firmanavn';
$lang['company_name_hint'] = 'Firmanavnet vil blive vist på hele systemet (krævet).';
$lang['company_email'] = 'Firma email';
$lang['company_email_hint'] = 'Dette vil være firmaets email adresse. Den vil blive brugt som afsender og modtager adresse af systemets email (Obligatorisk)';
$lang['company_link'] = 'Firma link';
$lang['company_link_hint'] = 'Firma linket skal gå ind på den officielle webside til firmaet (påkrævet)';
$lang['go_to_booking_page'] = 'Gå til booking siden';
$lang['settings_saved'] = 'Indstillingerne er gemt';
$lang['general'] = 'Generelt';
$lang['business_logic'] = 'Forretningslogik';
$lang['current_user'] = 'Nuværende bruger';
$lang['about_app'] = 'Om Easy!Appointments';
$lang['edit_working_plan_hint'] = 'Marker under de dage og timer, som din virksomhed vil acceptere aftaler. Du vil være i stand til at justere udnævnelser i ikke arbejdstid, men kunderne vil ikke være i stand til at bestille tid af sig selv i ikke arbejdsperioder. Denne arbejdsplan vil være standard for hver ny udbyder rekord, men du vil være i stand til at ændre de enkelte udbyders plan separat ved at redigere hans rekord. Efter at du kan tilføje pauser.';
$lang['edit_breaks_hint'] = 'Tilføj pausen hver dag. Disse pauser vil være tilgængelige for alle leverandøre.';
$lang['book_advance_timeout'] = 'Book forudgående pause';
$lang['book_advance_timeout_hint'] = 'Definere pausen (i minutter) før kunderne kan booke eller redigere tidsbestillingen hos firmaet.';
$lang['timeout_minutes'] = 'Pause (minutter)';
$lang['about_app_info'] = 'Easy!Appointments er et specielfremstillet internet applikation som giver mulighed for kunderne at booke bestillinger med dig via internettet. Endvidere leverandørens evne til at synkronisere dine data med Google kalender, så du kan bruge dem med andre tjenester.';
$lang['current_version'] = 'Nuværende version';
$lang['support'] = 'Support';
$lang['about_app_support'] = 'Hvis du støder på nogen problemer når du bruger Easy!Appointments kan du søge i officiel Google gruppe for svar. Du må også lave en levering i google kode side for at hjælpe opstående proces.';
$lang['official_website'] = 'Officiel Webside';
$lang['google_plus_community'] = 'Google+ fælleskab';
$lang['support_group'] = 'Support gruppe';
$lang['project_issues'] = 'Projekt levering';
$lang['license'] = 'Licens';
$lang['about_app_license'] = 'Easy!Appointments er autoriseret til GPLv3 lisens. Ved at bruge koden Easy!Appointments i hvert fald, du giver samtykke til periodens beskrivelse i det følgende url.';
$lang['logout_success'] = 'Du er blevet logget ud! Klik på en af de følgende knapper for at komme til en anden side.';
$lang['book_appointment_title'] = 'Book aftale';
$lang['backend_section'] = 'Administrationsside';
$lang['you_need_to_login'] = 'Velkommen! Du skal logge ind for at se administrationssiden.';
$lang['enter_username_here'] = 'Indtast dit brugernavn her';
$lang['enter_password_here'] = 'Indtast dit password her';
$lang['login'] = 'Login';
$lang['forgot_your_password'] = 'Glemt dit password?';
$lang['login_failed'] = 'Fejl ved login, indtast de rigtige oplysninger og prøv igen.';
$lang['type_username_and_email_for_new_password'] = 'Skriv dit brugernavn og email adresse for at få et nyt password.';
$lang['enter_email_here'] = 'Indtast din email her.';
$lang['regenerate_password'] = 'Forny password';
$lang['go_to_login'] = 'Gå tilbage til login siden';
$lang['new_password_sent_with_email'] = 'Dit nye password er blevet sendt til din email.';
$lang['new_account_password'] = 'Nyt konto password';
$lang['new_password_is'] = 'Dit nye password er $password. Gem denne email for at hente dit password igen, hvis det bliver nødvendigt. Du kan også ændre dit password i indstillingerne ';
$lang['delete_record_prompt'] = 'Er du sikker på du vil slette dette dokument, det kan ikke gendannes igen.';
$lang['delete_admin'] = 'Slet admin.';
$lang['delete_customer'] = 'Slet kunde';
$lang['delete_service'] = 'Slet tjeneste';
$lang['delete_category'] = 'Slet tjeneste kategori';
$lang['delete_provider'] = 'Slet leverandør';
$lang['delete_secretary'] = 'Slet sekræter';
$lang['delete_appointment'] = 'Slet aftale';
$lang['delete_unavailable'] = 'Slet ikke tilgængelig periode';
$lang['delete'] = 'Slet';
$lang['unexpected_issues'] = 'uforklarligt problem';
$lang['unexpected_issues_message'] = 'Kunne ikke gennemføres, da der er opstået et uventet problem.';
$lang['close'] = 'luk';
$lang['page_not_found'] = 'Siden ikke fundet';
$lang['page_not_found_message'] = 'Desværre, den side du søger eksistere ikke. Tjek din browser URL eller gå til en andet sted ved at bruge knappen nedenunder. ';
$lang['error'] = 'Error';
$lang['no_privileges'] = 'Ingen rettigheder';
$lang['no_privileges_message'] = 'Du har ikke rettigheder til at bruge denne side. Vælg en anden gruppe.';
$lang['backend_calendar'] = 'Backend Kalender';
$lang['start_date_time'] = 'Start dato / Tid';
$lang['end_date_time'] = 'Slet dato / Tid';
$lang['licensed_under'] = 'Autoriseret ifølge';
$lang['unexpected_issues_occurred'] = 'Uventede problemer opstod.';
$lang['service_communication_error'] = 'Der skete en fejl i kommunikatinen med serveren. Prøv igen.';
$lang['no_privileges_edit_appointments'] = 'Du har ikke tilladelse til at ændre bestillingen. ';
$lang['unavailable_updated'] = 'ikke tilgængelig tids periode er opdateret.';
$lang['appointments'] = 'Aftale';
$lang['unexpected_warnings'] = 'Uventede advarsler';
$lang['unexpected_warnings_message'] = 'Betjeningen fuldført, men nogle advarsler dukkede op.';
$lang['filter'] = 'Filter';
$lang['clear'] = 'Ryd';
$lang['uncategorized'] = 'ikke kategoriseret ';
$lang['username_already_exists'] = 'Brugernavnet eksisterer allerede';
$lang['password_length_notice'] = 'Password skal være på mindst $number karakter langt.';
$lang['general_settings'] = 'Generelle indstillinger';
$lang['personal_information'] = 'Personlige oplysninger';
$lang['system_login'] = 'System login';
$lang['user_settings_are_invalid'] = 'Bruger indstillingerne er ugyldige! Prøv igen.';
$lang['add_break'] = 'Tilføj pause ';
$lang['january'] = 'Januar';
$lang['february'] = 'Februar';
$lang['march'] = 'Marts';
$lang['april'] = 'April';
$lang['may'] = 'Maj';
$lang['june'] = 'Juni';
$lang['july'] = 'Juli';
$lang['august'] = 'August';
$lang['september'] = 'September';
$lang['october'] = 'Oktober';
$lang['november'] = 'November';
$lang['december'] = 'December';
$lang['previous'] = 'Forrige';
$lang['next'] = 'Næste';
$lang['now'] = 'Nu';
$lang['select_time'] = 'Vælg tid';
$lang['time'] = 'Tid';
$lang['hour'] = 'Time';
$lang['minute'] = 'Minutter';
$lang['google_sync_completed'] = 'Google synkroniseringen gennemført.';
$lang['google_sync_failed'] = 'Google synkroniseringen fejlede, kunne ikke oprette forbindelse til serveren.';
$lang['select_google_calendar'] = 'Vælg Google kalender';
$lang['select_google_calendar_prompt'] = 'vælg kalenderen du vile synkronisere med din bestilling. Hvis du ikke vil vælge en specifik kalender den normale vil blive brugt.';
$lang['google_calendar_selected'] = 'Google kalender er blevet valgt.';
$lang['oops_something_went_wrong'] = 'Oops! Noget gik galt.';
$lang['could_not_add_to_google_calendar'] = 'Din tid kunne ikke tilføjes din Google kalender konto';
$lang['ea_update_success'] = 'Easy!Appointments er blevet opdateret.';
$lang['require_captcha'] = 'Require CAPTCHA';
$lang['require_captcha_hint'] = 'When enabled, the customers will have to type a random generated CAPTCHA string before booking/updating an appointment.';
$lang['captcha_is_wrong'] = 'CAPTCHA verification failed, please try again.';
$lang['any_provider'] = 'Alle leverandører';
$lang['requested_hour_is_unavailable'] = 'The requested appointment is unfornately not available. Please select a different hour for your appointment.';
$lang['customer_notifications'] = 'Customer Notifications';
$lang['customer_notifications_hint'] = 'Defines whether the customer will receive email notifications whenever there is a schedule change on one of his appointments.';
$lang['date_format'] = 'Datoformat';
$lang['date_format_hint'] = 'Skift det viste datoformat (D - Dato, M - Måned, Y - År).';
$lang['time_format'] = 'Tidsformat';
$lang['time_format_hint'] = 'Skift det viste tidsformat (H - Time, M - Minut).';
$lang['first_weekday'] = 'First day of week';
$lang['first_weekday_hint'] = 'Set the first day of the calendar week.';
$lang['google_analytics_code_hint'] = 'Add your Google Analytics ID to be included in the booking page.';
$lang['availabilities_type'] = 'Tilgængelighed (fast - afhængig af varighed, fleksibel - hvert kvarter)';
$lang['flexible'] = 'Fleksibel';
$lang['fixed'] = 'Fast';
$lang['attendants_number'] = 'Max deltagere/samtidige reservationer';
$lang['reset_working_plan'] = 'Reset the working plan back to the default values.';
$lang['legal_contents'] = 'Legal Contents';
$lang['cookie_notice'] = 'Cookie Notice';
$lang['display_cookie_notice'] = 'Display Cookie Notice';
$lang['cookie_notice_content'] = 'Cookie Notice Content';
$lang['terms_and_conditions'] = 'Terms & Conditions';
$lang['display_terms_and_conditions'] = 'Display Terms & Conditions';
$lang['terms_and_conditions_content'] = 'Terms & Conditions Content';
$lang['privacy_policy'] = 'Privacy Policy';
$lang['display_privacy_policy'] = 'Display Privacy Policy';
$lang['privacy_policy_content'] = 'Privacy Policy Content';
$lang['website_using_cookies_to_ensure_best_experience'] = 'This website uses cookies to ensure you get the best experience on our website.';
$lang['read_and_agree_to_terms_and_conditions'] = 'I have read and agree to the {$link}Terms & Conditions{/$link}.';
$lang['read_and_agree_to_privacy_policy'] = 'I have read and agree to the {$link}Privacy Policy{/$link}.';
$lang['delete_personal_information_hint'] = 'Slet alle dine personlige oplysninger fra systemet';
$lang['delete_personal_information'] = 'Delete Personal Information';
$lang['delete_personal_information_prompt'] = 'Are you sure that you want to delete your personal information? This action cannot be undone.';
$lang['location'] = 'Location';
$lang['working_plan_exception'] = 'Working Plan Exception';
$lang['working_plan_exceptions'] = 'Working Plan Exceptions';
$lang['working_plan_exceptions_hint'] = 'Add a working plan exception day, outside the working plan.';
$lang['new_working_plan_exception_title'] = 'New Working Plan Exception';
$lang['working_plan_exception_saved'] = 'Working plan exception saved successfully.';
$lang['working_plan_exception_deleted'] = 'Working plan exception deleted successfully.';
$lang['add_working_plan_exceptions_during_each_day'] = 'Add working plan exceptions, outside the working plan.';
$lang['add_working_plan_exception'] = 'Add Working Plan Exception';
$lang['require_phone_number'] = 'Require phone number';
$lang['require_phone_number_hint'] = 'When enabled, customers and users will need to enter the customer\'s phone number when booking an appointment';
$lang['check_spam_folder'] = 'Please check your spam folder if the email does not arrive within a few minutes.';
$lang['api_token_hint'] = 'Set a secret token in order to enable the token based authentication of the Easy!Appointments API.';
$lang['timezone'] = 'Timezone';
$lang['overwrite_existing_working_plans'] = 'This will overwrite the existing provider working plans, are you sure that you want to continue?';
$lang['working_plans_got_updated'] = 'All the working plans got updated.';
$lang['apply_to_all_providers'] = 'Apply To All Providers';
$lang['display_any_provider'] = 'Display Any Provider Option';
$lang['display_any_provider_hint'] = 'The booking page will get an additional option that allows customers to book without specifying a provider.';
$lang['load_more'] = 'Load More';
$lang['list'] = 'List';
$lang['default'] = 'Default';
$lang['table'] = 'Table';
$lang['date'] = 'Date';

View file

@ -0,0 +1,323 @@
<?php defined('BASEPATH') OR exit('No direct script access allowed');
// Dutch
$lang['page_title'] = 'Boek afspraak met';
$lang['service_and_provider'] = 'Kies een dienst en een medewerker';
$lang['select_service'] = 'Kies een dienst';
$lang['select_provider'] = 'Kies een medewerker';
$lang['duration'] = 'Duur:';
$lang['minutes'] = 'minuten';
$lang['price'] = 'Prijs:';
$lang['back'] = 'Vorige';
$lang['appointment_date_and_time'] = 'Selecteer een datum en tijd';
$lang['no_available_hours'] = 'Het is momenteel niet mogelijk een afspraak te maken op die datum. Kies een andere datum.';
$lang['appointment_hour_missing'] = 'Kies een tijd voordat u verder gaat.';
$lang['customer_information'] = 'Vul uw informatie in';
$lang['first_name'] = 'Voornaam';
$lang['last_name'] = 'Achternaam';
$lang['email'] = 'E-mail';
$lang['phone_number'] = 'Telefoonnummer';
$lang['address'] = 'Adres';
$lang['city'] = 'Plaats';
$lang['zip_code'] = 'Postcode';
$lang['notes'] = 'Opmerkingen';
$lang['fields_are_required'] = 'Velden met een * zijn verplicht.';
$lang['appointment_confirmation'] = 'Afspraak bevestigen';
$lang['confirm'] = 'Bevestigen';
$lang['update'] = 'Update';
$lang['cancel_appointment_hint'] = 'Druk op de knop "Annuleren" om uw afspraak te verwijderen van de agenda van dit bedrijf.';
$lang['cancel'] = 'Annuleren';
$lang['appointment_registered'] = 'Uw afspraak is succesvol geboekt.';
$lang['cancel_appointment_title'] = 'Afspraak annuleren';
$lang['appointment_cancelled'] = 'Uw afspraak is met succes geannuleerd.';
$lang['appointment_cancelled_title'] = 'Afspraak geannuleerd';
$lang['reason'] = 'Reden';
$lang['appointment_removed_from_schedule'] = 'De volgende afspraak is verwijderd van de agenda van dit bedrijf.';
$lang['appointment_details_was_sent_to_you'] = 'Een e-mail met de details van de afspraak is naar u verzonden.';
$lang['add_to_google_calendar'] = 'Voeg toe aan Google Agenda.';
$lang['appointment_booked'] = 'Uw afspraak is met succes geboekt.';
$lang['thank_you_for_appointment'] = 'Bedankt voor het maken van een afspraak met ons! Hieronder vindt u de details van de afspraak. Breng eventuele wijzigingen aan door te klikken op de afspraak link.';
$lang['appointment_details_title'] = 'Uw afspraak';
$lang['customer_details_title'] = 'Klantgegevens';
$lang['service'] = 'Dienst';
$lang['provider'] = 'Medewerker';
$lang['customer'] = 'Klant';
$lang['start'] = 'Begin';
$lang['end'] = 'Einde';
$lang['name'] = 'Naam';
$lang['appointment_link_title'] = 'Afspraak link';
$lang['success'] = 'Succes.';
$lang['appointment_added_to_google_calendar'] = 'Uw afspraak is toegevoegd aan het Google Agenda-account.';
$lang['view_appointment_in_google_calendar'] = 'Klik hier om uw afspraak in Google Agenda bekijken.';
$lang['appointment_added_to_your_plan'] = 'Een nieuwe afspraak is toegevoegd aan uw agenda.';
$lang['appointment_link_description'] = 'U kunt wijzigingen aanbrengen door te klikken op onderstaande link van de afspraak.';
$lang['appointment_not_found'] = 'Afspraak niet gevonden.';
$lang['appointment_does_not_exist_in_db'] = 'De door u opgevraagde afspraak bestaat niet meer in de database van het systeem.';
$lang['display_calendar'] = 'Kalender';
$lang['calendar'] = 'Kalender';
$lang['users'] = 'Gebruikers';
$lang['settings'] = 'Instellingen';
$lang['log_out'] = 'Afmelden';
$lang['synchronize'] = 'Synchroniseren';
$lang['enable_sync'] = 'Synchronisatie inschakelen';
$lang['disable_sync'] = 'Synchronisatie uitschakelen';
$lang['reload'] = 'Herladen';
$lang['appointment'] = 'Afspraak';
$lang['unavailable'] = 'Niet beschikbaar';
$lang['week'] = 'Week';
$lang['month'] = 'Maand';
$lang['today'] = 'Vandaag';
$lang['not_working'] = 'Niet beschikbaar';
$lang['break'] = 'Pauze';
$lang['add'] = 'Toevoegen';
$lang['edit'] = 'Bewerk';
$lang['hello'] = 'Hallo';
$lang['all_day'] = 'Hele dag';
$lang['manage_appointment_record_hint'] = 'Beheer alle afspraken van de beschikbare medewerkers en diensten.';
$lang['select_filter_item_hint'] = 'Selecteer een medewerkers of een dienst en bekijk de afspraken op de kalender.';
$lang['enable_appointment_sync_hint'] = 'Schakel synchronisatie met het Google Agenda account van de aanbieder in.';
$lang['manage_customers_hint'] = 'Beheer van geregistreerde klanten en hun historie.';
$lang['manage_services_hint'] = 'Beheer beschikbare diensten en categorieën van het systeem.';
$lang['manage_users_hint'] = 'Beheer de backend gebruikers.';
$lang['settings_hint'] = 'Beheer het systeem en gebruikersinstellingen.';
$lang['log_out_hint'] = 'Log uit.';
$lang['unavailable_periods_hint'] = 'Er kunnen geen nieuwe afspraken geaccepteerd worden als de medewerker niet beschikbaar is.';
$lang['new_appointment_hint'] = 'Een nieuwe afspraak maken en opslaan in de database.';
$lang['reload_appointments_hint'] = 'Herlaad de afspraken.';
$lang['trigger_google_sync_hint'] = 'Start het Google Agenda synchronisatieproces.';
$lang['appointment_updated'] = 'Afspraak succesvol bijgewerkt.';
$lang['undo'] = 'Ongedaan maken';
$lang['appointment_details_changed'] = 'Afspraakgegevens veranderd.';
$lang['appointment_changes_saved'] = 'De wijzigingen in de afspraak zijn succesvol opgeslagen.';
$lang['save'] = 'Opslaan';
$lang['new'] = 'Nieuw';
$lang['select'] = 'Selecteren';
$lang['hide'] = 'Verbergen';
$lang['type_to_filter_customers'] = 'Typ om klanten te zoeken.';
$lang['clear_fields_add_existing_customer_hint'] = 'Maak alle velden leeg en voer een nieuwe klant in.';
$lang['pick_existing_customer_hint'] = 'Kies een bestaande klant.';
$lang['new_appointment_title'] = 'Nieuwe afspraak';
$lang['edit_appointment_title'] = 'Afspraak bewerken';
$lang['delete_appointment_title'] = 'Afspraak verwijderen';
$lang['write_appointment_removal_reason'] = 'Neemt u alstublieft even de tijd om de reden van annulering door te geven:';
$lang['appointment_saved'] = 'Afspraak succesvol opgeslagen.';
$lang['new_unavailable_title'] = 'Nieuwe periode waarop men niet beschikbaar is';
$lang['edit_unavailable_title'] = 'Bewerk beschikbare periode';
$lang['unavailable_saved'] = 'Onbeschikbaar periode succesvol opgeslagen.';
$lang['start_date_before_end_error'] = 'De startdatum is later dan de einddatum.';
$lang['invalid_email'] = 'Ongeldig e-mailadres.';
$lang['customers'] = 'Klanten';
$lang['details'] = 'Details';
$lang['no_records_found'] = 'Geen records gevonden';
$lang['services'] = 'Diensten';
$lang['duration_minutes'] = 'Duur (minuten)';
$lang['currency'] = 'Valuta';
$lang['category'] = 'Categorie';
$lang['no_category'] = 'Geen categorie';
$lang['description'] = 'Beschrijving';
$lang['categories'] = 'Categorieën';
$lang['admins'] = 'Beheerders';
$lang['providers'] = 'Medewerkers';
$lang['secretaries'] = 'Secretarissen';
$lang['mobile_number'] = 'Mobiel nummer';
$lang['state'] = 'Provincie/land';
$lang['username'] = 'Gebruikersnaam';
$lang['password'] = 'Wachtwoord';
$lang['retype_password'] = 'Geef nogmaals het wachtwoord';
$lang['receive_notifications'] = 'Meldingen ontvangen';
$lang['passwords_mismatch'] = 'De wachtwoorden zijn niet gelijk.';
$lang['admin_saved'] = 'Beheerder succesvol opgeslagen.';
$lang['provider_saved'] = 'Medewerker succesvol opgeslagen.';
$lang['secretary_saved'] = 'Secretaris succesvol opgeslagen.';
$lang['admin_deleted'] = 'Beheerder succesvol verwijderd.';
$lang['provider_deleted'] = 'Medewerker succesvol verwijderd.';
$lang['secretary_deleted'] = 'Secretaris succesvol verwijderd.';
$lang['service_saved'] = 'Dienst succesvol opgeslagen.';
$lang['service_category_saved'] = 'Dienstencategorie succesvol opgeslagen.';
$lang['service_deleted'] = 'Dienst succesvol verwijderd.';
$lang['service_category_deleted'] = 'Dienstencategorie succesvol verwijderd.';
$lang['customer_saved'] = 'Klant succesvol opgeslagen.';
$lang['customer_deleted'] = 'Klant succesvol verwijderd.';
$lang['current_view'] = 'Huidige weergave';
$lang['working_plan'] = 'Werkagenda';
$lang['reset_plan'] = 'Reset agenda';
$lang['monday'] = 'Maandag';
$lang['tuesday'] = 'Dinsdag';
$lang['wednesday'] = 'Woensdag';
$lang['thursday'] = 'Donderdag';
$lang['friday'] = 'Vrijdag';
$lang['saturday'] = 'Zaterdag';
$lang['sunday'] = 'Zondag';
$lang['breaks'] = 'Pauzes';
$lang['add_breaks_during_each_day'] = 'Voeg voor iedere dag de pauzes toe. Tijdens de pauzes kunnen er geen afspraken worden gepland.';
$lang['day'] = 'Dag';
$lang['days'] = 'Dagen';
$lang['actions'] = 'Acties';
$lang['reset_working_plan_hint'] = 'Reset de werkagenda naar de standaardwaarden.';
$lang['company_name'] = 'Bedrijfsnaam';
$lang['company_name_hint'] = 'Bedrijfsnaam zal overal worden weergegeven op het systeem (vereist).';
$lang['company_email'] = 'E-mail van het bedrijf';
$lang['company_email_hint'] = 'Dit is het e-mailadres van het bedrijf. Het zal worden gebruikt als afzender- en antwoordadres van de systeemmails (vereist).';
$lang['company_link'] = 'Link naar het bedrijf';
$lang['company_link_hint'] = 'De link naar het bedrijf moet verwijzen naar de officiële website van het bedrijf (verplicht).';
$lang['go_to_booking_page'] = 'Ga naar de boekingspagina';
$lang['settings_saved'] = 'Instellingen succesvol opgeslagen.';
$lang['general'] = 'Algemeen';
$lang['business_logic'] = 'Bedrijfsinstellingen';
$lang['current_user'] = 'Huidige gebruiker';
$lang['about_app'] = 'Over Easy!Appointments';
$lang['edit_working_plan_hint'] = 'Geef hier de dagen en uren in waarop klanten afspraken kunnen plannen (bijv. openingstijden). U kunt afspraken aanpassen naar tijden die normaal niet kunnen worden gekozen, maar klanten kunnen dit niet via het normale formulier. Deze tijden worden standaard gebruikt voor alle medewerkers, maar deze instellingen kunnen ook per medewerker worden gewijzigd bij de persoonlijke gegevens. Daarna kunnen ook pauzes worden gekozen.';
$lang['edit_breaks_hint'] = 'Voeg voor elke dag pauzes toe. Deze pauzes worden standaard gebruikt voor alle medewerkers.';
$lang['book_advance_timeout'] = 'Voor-boek-tijd vooruitboeken';
$lang['book_advance_timeout_hint'] = 'Definieer de tijd (in minuten) voordat klanten afspraken met het bedrijf kunnen boeken of herindelen.';
$lang['timeout_minutes'] = 'Voor-boek-tijd (minuten)';
$lang['about_app_info'] = 'Easy! Afspraken is een zeer flexibele web applicatie waarmee klanten afspraken met u kunnen boeken via het web. Bovendien biedt het de mogelijkheid om uw gegevens te synchroniseren met Google Agenda, zodat u ze kunt gebruiken met andere diensten.';
$lang['current_version'] = 'Huidige versie';
$lang['support'] = 'Ondersteuning';
$lang['about_app_support'] = 'Als u problemen ondervindt bij het gebruik van Easy! Afspraken kunt u zoeken in de officiële Google-discussiegroep voor antwoorden. U moet misschien ook een nieuw onderwerp op de pagina Google Code creëren om de ontwikkeling van de applicatie te helpen.';
$lang['official_website'] = 'Officiële Website';
$lang['google_plus_community'] = 'Google+ Community';
$lang['support_group'] = 'Support Group';
$lang['project_issues'] = 'Project issues';
$lang['license'] = 'Licentie';
$lang['about_app_license'] = 'Easy! Afspraken is gelicenseerd onder de gplv3 licentie. Door het gebruik van de code van Easy Afspraken op welke manier dan ook gaat u akkoord met de in de volgende url beschreven voorwaarden:';
$lang['logout_success'] = 'U bent succesvol uitgelogd! Gebruik een van de volgende knoppen om te navigeren naar een andere pagina.';
$lang['book_appointment_title'] = 'Boek afspraak';
$lang['backend_section'] = 'Beheerdersysteem (backend)';
$lang['you_need_to_login'] = 'Welkom! U moet inloggen om backend te bekijken.';
$lang['enter_username_here'] = 'Vul hier uw gebruikersnaam in…';
$lang['enter_password_here'] = 'Vul hier je wachtwoord in…';
$lang['login'] = 'Login';
$lang['forgot_your_password'] = 'Wachtwoord vergeten?';
$lang['login_failed'] = 'Inloggen is mislukt, voer de juiste gegevens in en probeer het opnieuw.';
$lang['type_username_and_email_for_new_password'] = 'Typ uw gebruikersnaam en uw e-mailadres in om een nieuw wachtwoord per mail te krijgen.';
$lang['enter_email_here'] = 'Vul hier uw e-mail in…';
$lang['regenerate_password'] = 'Wachtwoord genereren';
$lang['go_to_login'] = 'Ga terug naar de login pagina';
$lang['new_password_sent_with_email'] = 'Uw nieuwe wachtwoord is per mail naar u verzonden.';
$lang['new_account_password'] = 'Nieuw wachtwoord voor uw account';
$lang['new_password_is'] = 'Uw nieuwe wachtwoord is $password. Bewaar deze e-mail indien nodig. U kunt dit wachtwoord wijzigen door een nieuwe aan te maken op de pagina met instellingen.';
$lang['delete_record_prompt'] = 'Weet u zeker dat u dit record wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.';
$lang['delete_admin'] = 'Verwijder Beheerder';
$lang['delete_customer'] = 'Verwijder Klant';
$lang['delete_service'] = 'Dienst verwijderen';
$lang['delete_category'] = 'Dienstcategorie Verwijderen';
$lang['delete_provider'] = 'Verwijder medewerker';
$lang['delete_secretary'] = 'Verwijder secretaris';
$lang['delete_appointment'] = 'Afspraak verwijderen';
$lang['delete_unavailable'] = 'Verwijder een niet beschikbare periode';
$lang['delete'] = 'Verwijder';
$lang['unexpected_issues'] = 'Onverwachte problemen';
$lang['unexpected_issues_message'] = 'De bewerking kan niet worden voltooid als gevolg van onverwachte problemen.';
$lang['close'] = 'Sluit';
$lang['page_not_found'] = 'Pagina niet gevonden';
$lang['page_not_found_message'] = 'Helaas bestaat de door u opgevraagde pagina niet. Controleer aub de locatie in uw browser of ga naar een andere locatie met behulp van de onderstaande knoppen.';
$lang['error'] = 'Fout';
$lang['no_privileges'] = 'Geen rechten';
$lang['no_privileges_message'] = 'Je hebt niet de benodigde rechten om deze pagina te bekijken. Navigeer naar een andere sectie.';
$lang['backend_calendar'] = 'Backend Kalender';
$lang['start_date_time'] = 'Start datum/tijd';
$lang['end_date_time'] = 'Eind datum/tijd';
$lang['licensed_under'] = 'Gelicenseerd onder';
$lang['unexpected_issues_occurred'] = 'Onverwachte problemen opgetreden.';
$lang['service_communication_error'] = 'Er is een server communicatiefout opgetreden, probeer het opnieuw.';
$lang['no_privileges_edit_appointments'] = 'U heeft niet de benodigde rechten om afspraken te bewerken.';
$lang['unavailable_updated'] = 'Niet beschikbare periode succesvol bijgewerkt.';
$lang['appointments'] = 'Afspraken';
$lang['unexpected_warnings'] = 'Onverwachte waarschuwingen';
$lang['unexpected_warnings_message'] = 'De operatie is voltooid, maar enkele waarschuwingen zijn opgetreden.';
$lang['filter'] = 'Filter';
$lang['clear'] = 'Legen';
$lang['uncategorized'] = 'Geen categorie';
$lang['username_already_exists'] = 'Deze gebruikersnaam is reeds in gebruik.';
$lang['password_length_notice'] = 'Een wachtwoord moet ten minste $number tekens lang zijn.';
$lang['general_settings'] = 'Algemene instellingen';
$lang['personal_information'] = 'Persoonlijke informatie';
$lang['system_login'] = 'Systeem Login';
$lang['user_settings_are_invalid'] = 'De gebruikersinstellingen zijn ongeldig! Controleer uw instellingen en probeer het opnieuw.';
$lang['add_break'] = 'Pauze toevoegen';
$lang['january'] = 'Januari';
$lang['february'] = 'Februari';
$lang['march'] = 'Maart';
$lang['april'] = 'April';
$lang['may'] = 'Mei';
$lang['june'] = 'Juni';
$lang['july'] = 'Juli';
$lang['august'] = 'Augustus';
$lang['september'] = 'September';
$lang['october'] = 'Oktober';
$lang['november'] = 'November';
$lang['december'] = 'December';
$lang['previous'] = 'Vorige';
$lang['next'] = 'Volgende';
$lang['now'] = 'Nu';
$lang['select_time'] = 'Selecteer een tijd';
$lang['time'] = 'Tijd';
$lang['hour'] = 'Uur';
$lang['minute'] = 'Minuut';
$lang['google_sync_completed'] = 'Google synchronisatie is voltooid.';
$lang['google_sync_failed'] = 'Google synchronisatie is mislukt: kan geen verbinding maken met de server.';
$lang['select_google_calendar'] = 'Selecteer Google Agenda';
$lang['select_google_calendar_prompt'] = 'Selecteer de agenda waarme uw afspraken wilt synchroniseren. Als u geen specifieke kalender selecteert zal de standaard worden gebruikt.';
$lang['google_calendar_selected'] = 'Google Agenda is met succes geselecteerd.';
$lang['oops_something_went_wrong'] = 'Oeps! Er is iets misgegaan.';
$lang['could_not_add_to_google_calendar'] = 'Uw afspraak kon niet toegevoegd worden aan het Google Agenda-account.';
$lang['ea_update_success'] = 'Easy!Appointments is succesvol bijgewerkt.';
$lang['require_captcha'] = 'CAPTCHA vereist.';
$lang['require_captcha_hint'] = 'Indien ingeschakeld moeten de klanten een willekeurige tekenreeks invullen om een afspraak te bevestigen.';
$lang['captcha_is_wrong'] = 'CAPTCHA verificatie is mislukt, probeer het a.u.b.nogmaals.';
$lang['any_provider'] = 'Maakt mij niet uit.';
$lang['requested_hour_is_unavailable'] = 'De gekozen tijd voor uw afspraak is helaas niet beschikbaar. Kies a.u.b.een ander uur voor uw afspraak.';
$lang['customer_notifications'] = 'Klant mededelingen';
$lang['customer_notifications_hint'] = 'Kies of de klant een bevestiging krijgt per email als er de afspraak wordt aangepast.';
$lang['date_format'] = 'Datum formaat';
$lang['date_format_hint'] = 'Verander het datum formaat (D - dag, M - maand, Y - jaar).';
$lang['time_format'] = 'Time Format';
$lang['time_format_hint'] = 'Change the time display format (H - Hours, M - Minutes).';
$lang['first_weekday'] = 'First day of week';
$lang['first_weekday_hint'] = 'Set the first day of the calendar week.';
$lang['google_analytics_code_hint'] = 'Voeg je Google Analytics ID toe om deze te gebruiken op je boekings pagina.';
$lang['availabilities_type'] = 'Beschikbaarheidstype';
$lang['flexible'] = 'Flexibel';
$lang['fixed'] = 'Vast';
$lang['attendants_number'] = 'Aantal deelnemers';
$lang['reset_working_plan'] = 'Reset the working plan back to the default values.';
$lang['legal_contents'] = 'Legal Contents';
$lang['cookie_notice'] = 'Cookie Notice';
$lang['display_cookie_notice'] = 'Display Cookie Notice';
$lang['cookie_notice_content'] = 'Cookie Notice Content';
$lang['terms_and_conditions'] = 'Terms & Conditions';
$lang['display_terms_and_conditions'] = 'Display Terms & Conditions';
$lang['terms_and_conditions_content'] = 'Terms & Conditions Content';
$lang['privacy_policy'] = 'Privacy Policy';
$lang['display_privacy_policy'] = 'Display Privacy Policy';
$lang['privacy_policy_content'] = 'Privacy Policy Content';
$lang['website_using_cookies_to_ensure_best_experience'] = 'This website uses cookies to ensure you get the best experience on our website.';
$lang['read_and_agree_to_terms_and_conditions'] = 'I have read and agree to the {$link}Terms & Conditions{/$link}.';
$lang['read_and_agree_to_privacy_policy'] = 'I have read and agree to the {$link}Privacy Policy{/$link}.';
$lang['delete_personal_information_hint'] = 'Delete all personal information from the system.';
$lang['delete_personal_information'] = 'Delete Personal Information';
$lang['delete_personal_information_prompt'] = 'Are you sure that you want to delete your personal information? This action cannot be undone.';
$lang['location'] = 'Location';
$lang['working_plan_exception'] = 'Working Plan Exception';
$lang['working_plan_exceptions'] = 'Working Plan Exceptions';
$lang['working_plan_exceptions_hint'] = 'Add a working plan exception day, outside the working plan.';
$lang['new_working_plan_exception_title'] = 'New Working Plan Exception';
$lang['working_plan_exception_saved'] = 'Working plan exception saved successfully.';
$lang['working_plan_exception_deleted'] = 'Working plan exception deleted successfully.';
$lang['add_working_plan_exceptions_during_each_day'] = 'Add working plan exceptions, outside the working plan.';
$lang['add_working_plan_exception'] = 'Add Working Plan Exception';
$lang['require_phone_number'] = 'Require phone number';
$lang['require_phone_number_hint'] = 'When enabled, customers and users will need to enter the customer\'s phone number when booking an appointment';
$lang['check_spam_folder'] = 'Please check your spam folder if the email does not arrive within a few minutes.';
$lang['api_token_hint'] = 'Set a secret token in order to enable the token based authentication of the Easy!Appointments API.';
$lang['timezone'] = 'Timezone';
$lang['overwrite_existing_working_plans'] = 'This will overwrite the existing provider working plans, are you sure that you want to continue?';
$lang['working_plans_got_updated'] = 'All the working plans got updated.';
$lang['apply_to_all_providers'] = 'Apply To All Providers';
$lang['display_any_provider'] = 'Display Any Provider Option';
$lang['display_any_provider_hint'] = 'The booking page will get an additional option that allows customers to book without specifying a provider.';
$lang['load_more'] = 'Load More';
$lang['list'] = 'List';
$lang['default'] = 'Default';
$lang['table'] = 'Table';
$lang['date'] = 'Date';

View file

@ -0,0 +1,329 @@
<?php defined('BASEPATH') OR exit('No direct script access allowed');
// English
$lang['page_title'] = 'Book Appointment With';
$lang['service_and_provider'] = 'Service & Provider';
$lang['select_service'] = 'Select Service';
$lang['select_provider'] = 'Select Provider';
$lang['duration'] = 'Duration';
$lang['minutes'] = 'Minutes';
$lang['price'] = 'Price';
$lang['back'] = 'Back';
$lang['appointment_date_and_time'] = 'Appointment Date & Time';
$lang['no_available_hours'] = 'There are no available appointment hours for the selected date. Please choose another date.';
$lang['appointment_hour_missing'] = 'Please select an appointment hour before continuing.';
$lang['customer_information'] = 'Customer Information';
$lang['first_name'] = 'First Name';
$lang['last_name'] = 'Last Name';
$lang['email'] = 'Email';
$lang['phone_number'] = 'Phone Number';
$lang['phone'] = 'Phone';
$lang['address'] = 'Address';
$lang['city'] = 'City';
$lang['zip_code'] = 'Zip Code';
$lang['notes'] = 'Notes';
$lang['language'] = 'Language';
$lang['no_language'] = 'No language';
$lang['fields_are_required'] = 'Fields with * are required.';
$lang['appointment_confirmation'] = 'Appointment Confirmation';
$lang['confirm'] = 'Confirm';
$lang['update'] = 'Update';
$lang['cancel_appointment_hint'] = 'Press the "Cancel" button to remove the appointment from the company schedule.';
$lang['cancel'] = 'Cancel';
$lang['appointment_registered'] = 'Your appointment has been successfully registered.';
$lang['cancel_appointment_title'] = 'Cancel Appointment';
$lang['appointment_cancelled'] = 'Your appointment has been successfully cancelled.';
$lang['appointment_cancelled_title'] = 'Appointment Cancelled';
$lang['reason'] = 'Reason';
$lang['appointment_removed_from_schedule'] = 'The following appointment was removed from the company\'s schedule.';
$lang['appointment_details_was_sent_to_you'] = 'An email with the appointment details has been sent to you.';
$lang['add_to_google_calendar'] = 'Add to Google Calendar';
$lang['appointment_booked'] = 'Your appointment has been successfully booked.';
$lang['thank_you_for_appointment'] = 'Thank you for arranging an appointment with us. Below you can see the appointment details. Make changes by clicking the appointment link.';
$lang['appointment_details_title'] = 'Appointment Details';
$lang['customer_details_title'] = 'Customer Details';
$lang['service'] = 'Service';
$lang['provider'] = 'Provider';
$lang['customer'] = 'Customer';
$lang['start'] = 'Start';
$lang['end'] = 'End';
$lang['name'] = 'Name';
$lang['appointment_link_title'] = 'Appointment Link';
$lang['success'] = 'Success.';
$lang['appointment_added_to_google_calendar'] = 'Your appointment has been added to your Google Calendar account.';
$lang['view_appointment_in_google_calendar'] = 'Click here to view your appointment on Google Calendar.';
$lang['appointment_added_to_your_plan'] = 'A new appointment has been added to your plan.';
$lang['appointment_link_description'] = 'You can make changes by clicking the appointment link below.';
$lang['appointment_locked'] = 'Modification impossible.';
$lang['appointment_locked_message'] = 'The appointment cannot be changed less than {$limit} hours in advance.';
$lang['appointment_not_found'] = 'Appointment Not Found.';
$lang['appointment_does_not_exist_in_db'] = 'The appointment you requested does not exist in the system database anymore.';
$lang['display_calendar'] = 'Display Calendar';
$lang['calendar'] = 'Calendar';
$lang['users'] = 'Users';
$lang['settings'] = 'Settings';
$lang['log_out'] = 'Log Out';
$lang['synchronize'] = 'Synchronize';
$lang['enable_sync'] = 'Enable Sync';
$lang['disable_sync'] = 'Disable Sync';
$lang['reload'] = 'Reload';
$lang['appointment'] = 'Appointment';
$lang['unavailable'] = 'Unavailable';
$lang['week'] = 'Week';
$lang['month'] = 'Month';
$lang['today'] = 'Today';
$lang['not_working'] = 'Not Working';
$lang['break'] = 'Break';
$lang['add'] = 'Add';
$lang['edit'] = 'Edit';
$lang['hello'] = 'Hello';
$lang['all_day'] = 'All Day';
$lang['manage_appointment_record_hint'] = 'Manage all the appointment records of the available providers and services.';
$lang['select_filter_item_hint'] = 'Select a provider or a service and view the appointments on the calendar.';
$lang['enable_appointment_sync_hint'] = 'Enable appointment synchronization with provider\'s Google Calendar account.';
$lang['manage_customers_hint'] = 'Manage the registered customers and view their booking history.';
$lang['manage_services_hint'] = 'Manage the available services and categories of the system.';
$lang['manage_users_hint'] = 'Manage the backend users (admins, providers, secretaries).';
$lang['settings_hint'] = 'Set system and user settings.';
$lang['log_out_hint'] = 'Log out of the system.';
$lang['unavailable_periods_hint'] = 'During unavailable periods the provider won\'t accept new appointments.';
$lang['new_appointment_hint'] = 'Create a new appointment and store it into the database.';
$lang['reload_appointments_hint'] = 'Reload calendar appointments.';
$lang['trigger_google_sync_hint'] = 'Trigger the Google Calendar synchronization process.';
$lang['appointment_updated'] = 'Appointment updated successfully.';
$lang['undo'] = 'Undo';
$lang['appointment_details_changed'] = 'Appointment details have changed.';
$lang['appointment_changes_saved'] = 'Appointment changes have been successfully saved.';
$lang['save'] = 'Save';
$lang['new'] = 'New';
$lang['select'] = 'Select';
$lang['hide'] = 'Hide';
$lang['type_to_filter_customers'] = 'Type to filter customers.';
$lang['clear_fields_add_existing_customer_hint'] = 'Clear the fields and enter a new customer.';
$lang['pick_existing_customer_hint'] = 'Pick an existing customer.';
$lang['new_appointment_title'] = 'New Appointment';
$lang['edit_appointment_title'] = 'Edit Appointment';
$lang['delete_appointment_title'] = 'Delete Appointment';
$lang['write_appointment_removal_reason'] = 'Please take a minute to write the reason you are deleting the appointment:';
$lang['appointment_saved'] = 'Appointment saved successfully.';
$lang['new_unavailable_title'] = 'New Unavailable Period';
$lang['edit_unavailable_title'] = 'Edit Unavailable Period';
$lang['unavailable_saved'] = 'Unavailable period saved successfully.';
$lang['start_date_before_end_error'] = 'Start date value is latter than end date.';
$lang['invalid_email'] = 'Invalid email address.';
$lang['customers'] = 'Customers';
$lang['details'] = 'Details';
$lang['no_records_found'] = 'No records found...';
$lang['services'] = 'Services';
$lang['duration_minutes'] = 'Duration (Minutes)';
$lang['currency'] = 'Currency';
$lang['category'] = 'Category';
$lang['no_category'] = 'No Category';
$lang['description'] = 'Description';
$lang['categories'] = 'Categories';
$lang['admins'] = 'Admins';
$lang['providers'] = 'Providers';
$lang['secretaries'] = 'Secretaries';
$lang['mobile_number'] = 'Mobile Number';
$lang['mobile'] = 'Mobile';
$lang['state'] = 'State';
$lang['username'] = 'Username';
$lang['password'] = 'Password';
$lang['retype_password'] = 'Retype Password';
$lang['receive_notifications'] = 'Receive Notifications';
$lang['passwords_mismatch'] = 'Passwords mismatch.';
$lang['admin_saved'] = 'Admin saved successfully.';
$lang['provider_saved'] = 'Provider saved successfully.';
$lang['secretary_saved'] = 'Secretary saved successfully.';
$lang['admin_deleted'] = 'Admin deleted successfully.';
$lang['provider_deleted'] = 'Provider deleted successfully.';
$lang['secretary_deleted'] = 'Secretary deleted successfully.';
$lang['service_saved'] = 'Service saved successfully.';
$lang['service_category_saved'] = 'Service category saved successfully.';
$lang['service_deleted'] = 'Service deleted successfully.';
$lang['service_category_deleted'] = 'Service category deleted successfully.';
$lang['customer_saved'] = 'Customer saved successfully.';
$lang['customer_deleted'] = 'Customer deleted successfully.';
$lang['current_view'] = 'Current View';
$lang['working_plan'] = 'Working Plan';
$lang['reset_plan'] = 'Reset Plan';
$lang['monday'] = 'Monday';
$lang['tuesday'] = 'Tuesday';
$lang['wednesday'] = 'Wednesday';
$lang['thursday'] = 'Thursday';
$lang['friday'] = 'Friday';
$lang['saturday'] = 'Saturday';
$lang['sunday'] = 'Sunday';
$lang['breaks'] = 'Breaks';
$lang['add_breaks_during_each_day'] = 'Add the working breaks during each day. During breaks the provider will not accept any appointments.';
$lang['day'] = 'Day';
$lang['days'] = 'Days';
$lang['actions'] = 'Actions';
$lang['reset_working_plan_hint'] = 'Reset the working plan back to the default values.';
$lang['company_name'] = 'Company Name';
$lang['company_name_hint'] = 'Company name will be displayed everywhere on the system (required).';
$lang['company_email'] = 'Company Email';
$lang['company_email_hint'] = 'This will be the company email address. It will be used as the sender and the reply address of the system emails (required).';
$lang['company_link'] = 'Company Link';
$lang['company_link_hint'] = 'Company link should point to the official website of the company (required).';
$lang['go_to_booking_page'] = 'Go To Booking Page';
$lang['settings_saved'] = 'Settings saved successfully.';
$lang['general'] = 'General';
$lang['business_logic'] = 'Business Logic';
$lang['current_user'] = 'Current User';
$lang['about_app'] = 'About Easy!Appointments';
$lang['edit_working_plan_hint'] = 'Mark below the days and hours that your company will accept appointments. You will be able to adjust appointments in non-working hours but the customers will not be able to book appointments by themselves in non-working periods. This working plan will be the default for every new provider record, but you will be able to change each provider\'s plan separately by editing his record. After that you can add break periods.';
$lang['edit_breaks_hint'] = 'Add the working breaks during each day. These breaks will be applied for all new providers.';
$lang['book_advance_timeout'] = 'Book Advance Timeout';
$lang['book_advance_timeout_hint'] = 'Define the timeout (in minutes) before the customers can book or re-arrange appointments with the company.';
$lang['timeout_minutes'] = 'Timeout (Minutes)';
$lang['about_app_info'] = 'Easy!Appointments is a highly customizable web application that allows your customers to book appointments with you via the web. Moreover, it provides the ability to sync your data with Google Calendar, so you can use them with other services.';
$lang['current_version'] = 'Current Version';
$lang['support'] = 'Support';
$lang['about_app_support'] = 'If you encounter any problems when using Easy!Appointments you can search the official Google Group for answers. You might also need to create a new issue on the Google Code page in order to help the development progress.';
$lang['official_website'] = 'Official Website';
$lang['google_plus_community'] = 'Google+ Community';
$lang['support_group'] = 'Support Group';
$lang['project_issues'] = 'Project Issues';
$lang['license'] = 'License';
$lang['about_app_license'] = 'Easy!Appointments is licensed under the GPLv3 license. By using the code of Easy!Appointments in any way you are agreeing to the terms described in the following url:';
$lang['logout_success'] = 'You have been successfully logged out! Click on one of the following buttons to navigate to a different page.';
$lang['book_appointment_title'] = 'Book Appointment';
$lang['backend_section'] = 'Backend Section';
$lang['you_need_to_login'] = 'Welcome! You will need to login in order to view backend pages.';
$lang['enter_username_here'] = 'Enter your username here ...';
$lang['enter_password_here'] = 'Enter your password here ...';
$lang['login'] = 'Login';
$lang['forgot_your_password'] = 'Forgot Your Password?';
$lang['login_failed'] = 'Login failed, please enter the correct credentials and try again.';
$lang['type_username_and_email_for_new_password'] = 'Type your username and your email address to get your new password.';
$lang['enter_email_here'] = 'Enter your email here ...';
$lang['regenerate_password'] = 'Regenerate Password';
$lang['go_to_login'] = 'Go Back To Login Page';
$lang['new_password_sent_with_email'] = 'Your new password has been sent to you with an email.';
$lang['new_account_password'] = 'New Account Password';
$lang['new_password_is'] = 'Your new account password is $password. Please store this email to be able to retrieve your password if necessary. You can also change this password with a new one in the settings page.';
$lang['delete_record_prompt'] = 'Are you sure that you want to delete this record? This action cannot be undone.';
$lang['delete_admin'] = 'Delete Admin';
$lang['delete_customer'] = 'Delete Customer';
$lang['delete_service'] = 'Delete Service';
$lang['delete_category'] = 'Delete Service Category';
$lang['delete_provider'] = 'Delete Provider';
$lang['delete_secretary'] = 'Delete Secretary';
$lang['delete_appointment'] = 'Delete Appointment';
$lang['delete_unavailable'] = 'Delete Unavailable Period';
$lang['delete'] = 'Delete';
$lang['unexpected_issues'] = 'Unexpected Issues';
$lang['unexpected_issues_message'] = 'The operation could not complete due to unexpected issues.';
$lang['close'] = 'Close';
$lang['page_not_found'] = 'Page Not Found';
$lang['page_not_found_message'] = 'Unfortunately the page you requested does not exist. Please check your browser URL or head to another location using the buttons below.';
$lang['error'] = 'Error';
$lang['no_privileges'] = 'No Privileges';
$lang['no_privileges_message'] = 'You do not have the required privileges to view this page. Please navigate to a different section.';
$lang['backend_calendar'] = 'Backend Calendar';
$lang['start_date_time'] = 'Start Date / Time';
$lang['end_date_time'] = 'End Date / Time';
$lang['licensed_under'] = 'Licensed Under';
$lang['unexpected_issues_occurred'] = 'Unexpected issues occurred.';
$lang['service_communication_error'] = 'A server communication error occurred, please try again.';
$lang['no_privileges_edit_appointments'] = 'You do not have the required privileges to edit appointments.';
$lang['unavailable_updated'] = 'Unavailable time period updated successfully.';
$lang['appointments'] = 'Appointments';
$lang['unexpected_warnings'] = 'Unexpected Warnings';
$lang['unexpected_warnings_message'] = 'The operation completed but some warnings appeared.';
$lang['filter'] = 'Filter';
$lang['clear'] = 'Clear';
$lang['uncategorized'] = 'Uncategorized';
$lang['username_already_exists'] = 'Username already exists.';
$lang['password_length_notice'] = 'Password must be at least $number characters long.';
$lang['general_settings'] = 'General Settings';
$lang['personal_information'] = 'Personal Information';
$lang['system_login'] = 'System Login';
$lang['user_settings_are_invalid'] = 'User settings are invalid! Please review your settings and try again.';
$lang['add_break'] = 'Add Break';
$lang['january'] = 'January';
$lang['february'] = 'February';
$lang['march'] = 'March';
$lang['april'] = 'April';
$lang['may'] = 'May';
$lang['june'] = 'June';
$lang['july'] = 'July';
$lang['august'] = 'August';
$lang['september'] = 'September';
$lang['october'] = 'October';
$lang['november'] = 'November';
$lang['december'] = 'December';
$lang['previous'] = 'Previous';
$lang['next'] = 'Next';
$lang['now'] = 'Now';
$lang['select_time'] = 'Select Time';
$lang['time'] = 'Time';
$lang['hour'] = 'Hour';
$lang['minute'] = 'Minute';
$lang['google_sync_completed'] = 'Google synchronization completed successfully.';
$lang['google_sync_failed'] = 'Google synchronization failed: Could not establish server connection.';
$lang['select_google_calendar'] = 'Select Google Calendar';
$lang['select_google_calendar_prompt'] = 'Select the calendar that you want to sync your appointments. If you do not want to select a specific calendar the default one will be used.';
$lang['google_calendar_selected'] = 'Google calendar has been successfully selected.';
$lang['oops_something_went_wrong'] = 'Oops! Something Went Wrong.';
$lang['could_not_add_to_google_calendar'] = 'Your appointment could not be added to your Google Calendar account.';
$lang['ea_update_success'] = 'Easy!Appointments has been successfully updated.';
$lang['require_captcha'] = 'Require CAPTCHA';
$lang['require_captcha_hint'] = 'When enabled, the customers will have to type a random generated CAPTCHA string before booking/updating an appointment.';
$lang['captcha_is_wrong'] = 'CAPTCHA verification failed, please try again.';
$lang['any_provider'] = 'Any Provider';
$lang['requested_hour_is_unavailable'] = 'The requested appointment is unfortunately not available. Please select a different hour for your appointment.';
$lang['customer_notifications'] = 'Customer Notifications';
$lang['customer_notifications_hint'] = 'Defines whether the customer will receive email notifications whenever there is a schedule change on one of his appointments.';
$lang['date_format'] = 'Date Format';
$lang['date_format_hint'] = 'Change the date display format (D - Date, M - Month, Y - Year).';
$lang['time_format'] = 'Time Format';
$lang['time_format_hint'] = 'Change the time display format (H - Hours, M - Minutes).';
$lang['first_weekday'] = 'First day of week';
$lang['first_weekday_hint'] = 'Set the first day of the calendar week.';
$lang['google_analytics_code_hint'] = 'Add your Google Analytics ID to be included in the booking page.';
$lang['availabilities_type'] = 'Availabilities Type';
$lang['flexible'] = 'Flexible';
$lang['fixed'] = 'Fixed';
$lang['attendants_number'] = 'Attendants Number';
$lang['reset_working_plan'] = 'Reset the working plan back to the default values.';
$lang['legal_contents'] = 'Legal Contents';
$lang['cookie_notice'] = 'Cookie Notice';
$lang['display_cookie_notice'] = 'Display Cookie Notice';
$lang['cookie_notice_content'] = 'Cookie Notice Content';
$lang['terms_and_conditions'] = 'Terms & Conditions';
$lang['display_terms_and_conditions'] = 'Display Terms & Conditions';
$lang['terms_and_conditions_content'] = 'Terms & Conditions Content';
$lang['privacy_policy'] = 'Privacy Policy';
$lang['display_privacy_policy'] = 'Display Privacy Policy';
$lang['privacy_policy_content'] = 'Privacy Policy Content';
$lang['website_using_cookies_to_ensure_best_experience'] = 'This website uses cookies to ensure you get the best experience on our website.';
$lang['read_and_agree_to_terms_and_conditions'] = 'I have read and agree to the {$link}Terms & Conditions{/$link}.';
$lang['read_and_agree_to_privacy_policy'] = 'I have read and agree to the {$link}Privacy Policy{/$link}.';
$lang['delete_personal_information_hint'] = 'Remove all your appointments and personal information from the system.';
$lang['delete_personal_information'] = 'Delete Personal Information';
$lang['delete_personal_information_prompt'] = 'Are you sure that you want to delete your personal information? This action cannot be undone.';
$lang['location'] = 'Location';
$lang['working_plan_exception'] = 'Working Plan Exception';
$lang['working_plan_exceptions'] = 'Working Plan Exceptions';
$lang['working_plan_exceptions_hint'] = 'Add a working plan exception day, outside the working plan.';
$lang['new_working_plan_exception_title'] = 'New Working Plan Exception';
$lang['working_plan_exception_saved'] = 'Working plan exception saved successfully.';
$lang['working_plan_exception_deleted'] = 'Working plan exception deleted successfully.';
$lang['add_working_plan_exceptions_during_each_day'] = 'Add working plan exceptions, outside the working plan.';
$lang['add_working_plan_exception'] = 'Add Working Plan Exception';
$lang['require_phone_number'] = 'Require phone number';
$lang['require_phone_number_hint'] = 'When enabled, customers and users will need to enter the customer\'s phone number when booking an appointment';
$lang['check_spam_folder'] = 'Please check your spam folder if the email does not arrive within a few minutes.';
$lang['api_token_hint'] = 'Set a secret token in order to enable the token based authentication of the Easy!Appointments API.';
$lang['timezone'] = 'Timezone';
$lang['overwrite_existing_working_plans'] = 'This will overwrite the existing provider working plans, are you sure that you want to continue?';
$lang['working_plans_got_updated'] = 'All the working plans got updated.';
$lang['apply_to_all_providers'] = 'Apply To All Providers';
$lang['display_any_provider'] = 'Display Any Provider Option';
$lang['display_any_provider_hint'] = 'The booking page will get an additional option that allows customers to book without specifying a provider.';
$lang['load_more'] = 'Load More';
$lang['list'] = 'List';
$lang['default'] = 'Default';
$lang['table'] = 'Table';
$lang['date'] = 'Date';

Some files were not shown because too many files have changed in this diff Show more