diff options
-rw-r--r-- | classes/contact.php | 6 | ||||
-rw-r--r-- | classes/correspondence.php | 44 | ||||
-rw-r--r-- | include/clients-view.php | 80 | ||||
-rw-r--r-- | include/contacts-edit.php | 3 | ||||
-rw-r--r-- | include/contacts-overview.php | 280 |
5 files changed, 218 insertions, 195 deletions
diff --git a/classes/contact.php b/classes/contact.php index 989a14f..7741c17 100644 --- a/classes/contact.php +++ b/classes/contact.php @@ -317,13 +317,19 @@ class contact { /** * Set the language of the contact * + * @see correspondence::LANGUAGES The available languages + * * @param string $language The new language for the contact * * @throws PDOException If something went wrong with the database + * @throws Exception If the language is unknown * * @return bool True on succes, false on failure */ public function setLanguage($language) { + if (!in_array($language, correspondence::LANGUAGES)) { + throw new Exception("Language $language not available."); + } $stmt = $this->pdo->prepare("UPDATE `".constants::db_prefix."contact` SET `language`=? WHERE `id`=?"); $stmt->execute(array($language, $this->id)); if ($stmt->rowCount() == 1) { diff --git a/classes/correspondence.php b/classes/correspondence.php index 7838393..eb18b7d 100644 --- a/classes/correspondence.php +++ b/classes/correspondence.php @@ -39,63 +39,71 @@ class correspondence extends FPDF { const HEAD_BLUE = 0; /** + * Available languages + * + * @see _() Translation function + * @see $translations Translations table + */ + const LANGUAGES = ['en', 'nl']; + + /** * Array holding the translations * * @see _() A function to translate */ protected static $translations = array( - 'adres' => array( + 'adres' => array( 'en' => 'Address', 'nl' => 'Adres'), - 'amount' => array( + 'amount' => array( 'en' => 'Amount', 'nl' => 'Subtotaal'), - 'amount-due' => array( + 'amount-due' => array( 'en' => 'Total amount due', 'nl' => 'Te voldoen'), - 'biccode' => array( + 'biccode' => array( 'en' => 'The BIC code of our bank is %%.', 'nl' => 'De BIC-code van de bank is %%.'), - 'btwnr' => array( + 'btwnr' => array( 'en' => 'VAT nr', 'nl' => 'BTW nr'), - 'description' => array( + 'description' => array( 'en' => 'Description', 'nl' => 'Omschrijving'), - 'due-date' => array( + 'due-date' => array( 'en' => 'Due date', 'nl' => 'Vervaldatum'), - 'email' => array( + 'email' => array( 'en' => 'Email', 'nl' => 'Email'), - 'iban' => array( + 'iban' => array( 'en' => 'IBAN', 'nl' => 'IBAN'), - 'invoice' => array( + 'invoice' => array( 'en' => 'Invoice', 'nl' => 'Factuur'), - 'invoice-date' => array( + 'invoice-date' => array( 'en' => 'Invoice date', 'nl' => 'Factuurdatum'), - 'invoice-nr' => array( + 'invoice-nr' => array( 'en' => 'Invoice number', 'nl' => 'Factuurnummer'), - 'price-excl' => array( + 'price-excl' => array( 'en' => 'Price excl.', 'nl' => 'Prijs excl.'), - 'price-incl' => array( + 'price-incl' => array( 'en' => 'Price incl.', 'nl' => 'Prijs incl.'), - 'request' => array( + 'request' => array( 'en' => 'You are kindly requested to transfer the total amount before the due date to the provided IBAN nr.', 'nl' => 'U wordt vriendelijk verzocht het te voldoen bedrag voor de vervaldatum van de factuur over te maken naar opgegeven IBAN-nummer.'), - 'tel-nr' => array( + 'tel-nr' => array( 'en' => 'Tel.', 'nl' => 'Tel.'), - 'total' => array( + 'total' => array( 'en' => 'Total', 'nl' => 'Totaal'), - 'vat' => array( + 'vat' => array( 'en' => 'VAT', 'nl' => 'BTW'), ); diff --git a/include/clients-view.php b/include/clients-view.php index 101d530..514e4e4 100644 --- a/include/clients-view.php +++ b/include/clients-view.php @@ -22,43 +22,45 @@ require_once('./login.php'); $_client = new client($_pdo, $_id); ?> <div class="col-lg-12"> - <div class="panel panel-default"> - <div class="panel-heading">Contacts</div> - <div class="panel-body table-responsive"> - <table class="table table-bordered table-striped"> - <thead> - <tr> - <th>#</th> - <th>Name</th> - <th>Address</th> - <th>Tools</th> - </tr> - </thead> - <tbody> - <?php - $contacts = $_client->getContacts(); - foreach ($contacts as $contact) { - echo "<tr> - <td class='col-min-width'>{$contact->getId()}</td> - <td class='col-min-width'><a href='#' class='editable' id='editable-contact-{$contact->getId()}-name' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getName()}</a></td> - <td class='col-max-width'> - <a href='#' class='editable' id='editable-contact-{$contact->getId()}-address' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getAddress()}</a><br/> - <a href='#' class='editable' id='editable-contact-{$contact->getId()}-postal_code' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getPostalCode()}</a> - <a href='#' class='editable' id='editable-contact-{$contact->getId()}-city' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getCity()}</a><br/> - <a href='#' class='editable' id='editable-contact-{$contact->getId()}-country' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getCountry()}</a> - </td> - <td class='col-min-width'> - <a title='View' href='".constants::url_internal."/contacts?id={$contact->getId()}' class='btn btn-primary btn-circle fa fa-arrow-right'></a> - <a title='Delete' href='".constants::url_internal."/contacts?delete={$contact->getId()}' class='btn btn-danger btn-circle fa fa-times'></a> - </td> - </tr>"; - } - if (count($contacts) == 0) { - echo "<tr><td colspan='4'>There are no contacts in the database. Why not <a href='".constants::url_external."contacts'>create one</a>?</td></tr>"; - } - ?> - </tbody> - </table> - </div> - </div> + <div class="panel panel-default"> + <div class="panel-heading">Contacts</div> + <div class="panel-body table-responsive"> + <table class="table table-bordered table-striped"> + <thead> + <tr> + <th>#</th> + <th>Name</th> + <th>Address</th> + <th>Language</th> + <th>Tools</th> + </tr> + </thead> + <tbody> + <?php + $contacts = $_client->getContacts(); + foreach ($contacts as $contact) { + echo "<tr> + <td class='col-min-width'>{$contact->getId()}</td> + <td class='col-min-width'><a href='#' class='editable' id='editable-contact-{$contact->getId()}-name' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getName()}</a></td> + <td class='col-max-width'> + <a href='#' class='editable' id='editable-contact-{$contact->getId()}-address' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getAddress()}</a><br/> + <a href='#' class='editable' id='editable-contact-{$contact->getId()}-postal_code' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getPostalCode()}</a> + <a href='#' class='editable' id='editable-contact-{$contact->getId()}-city' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getCity()}</a><br/> + <a href='#' class='editable' id='editable-contact-{$contact->getId()}-country' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getCountry()}</a> + </td> + <td class='col-min-width'><a href='#' class='editable' id='editable-contact-{$contact->getId()}-language' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getLanguage()}</a></td> + <td class='col-min-width'> + <a title='View' href='".constants::url_internal."/contacts?id={$contact->getId()}' class='btn btn-primary btn-circle fa fa-arrow-right'></a> + <a title='Delete' href='".constants::url_internal."/contacts?delete={$contact->getId()}' class='btn btn-danger btn-circle fa fa-times'></a> + </td> + </tr>"; + } + if (count($contacts) == 0) { + echo "<tr><td colspan='4'>There are no contacts in the database. Why not <a href='".constants::url_external."contacts'>create one</a>?</td></tr>"; + } + ?> + </tbody> + </table> + </div> + </div> </div> diff --git a/include/contacts-edit.php b/include/contacts-edit.php index a2101b2..a5b3bdd 100644 --- a/include/contacts-edit.php +++ b/include/contacts-edit.php @@ -46,6 +46,9 @@ try { case 'country': $response->success = $contact->setCountry($_REQUEST['value']); break; + case 'language': + $response->success = $contact->setLanguage($_REQUEST['value']); + break; default: $response->http_response_code(404); $response->success = false; diff --git a/include/contacts-overview.php b/include/contacts-overview.php index cd7fc47..c1f282b 100644 --- a/include/contacts-overview.php +++ b/include/contacts-overview.php @@ -2,17 +2,17 @@ /** * BusinessAdmin: administrative software for small companies * Copyright (C) 2015 Camil Staps (ViviSoft) - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -21,144 +21,148 @@ require_once('./login.php'); ?> <div class="col-lg-7 col-md-7"> - <div class="panel panel-default"> - <div class="panel-heading">Overview</div> - <div class="panel-body table-responsive"> - <table class="table table-bordered table-striped mixitup dataTable" id="overview-contacts"> - <thead> - <tr> - <th class="mixitup-sort sorting" data-sort="mixerOrderId:desc">#</th> - <th class="mixitup-sort sorting" data-sort="mixerOrderName:desc">Name</th> - <th>Address</th> - <th>Tools</th> - </tr> - </thead> - <tbody> - <?php - $contacts = BusinessAdmin::getContacts($_pdo); - foreach ($contacts as $contact) { - echo "<tr class='mix' - data-mixer-order-id='{$contact->getId()}' - data-mixer-order-name='{$contact->getName()}'> - <td class='col-min-width'>{$contact->getId()}</td> - <td class='col-min-width'> - <a href='#' class='editable' id='editable-contact-{$contact->getId()}-name' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getName()}</a><br/> - ({$contact->getClient()->getName()}) - </td> - <td class='col-max-width'> - <a href='#' class='editable' id='editable-contact-{$contact->getId()}-email' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getEmail()}</a><br/> - <br/> - <a href='#' class='editable' id='editable-contact-{$contact->getId()}-address' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getAddress()}</a><br/> - " . ($contact->getAddress_2() != '' ? "<a href='#' class='editable' id='editable-contact-{$contact->getId()}-address_2' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getAddress_2()}</a><br/>" : "") . " - <a href='#' class='editable' id='editable-contact-{$contact->getId()}-postal_code' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getPostalCode()}</a> - <a href='#' class='editable' id='editable-contact-{$contact->getId()}-city' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getCity()}</a><br/> - <a href='#' class='editable' id='editable-contact-{$contact->getId()}-country' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getCountry()}</a> - </td> - <td class='col-min-width'> - <a title='View' href='?id={$contact->getId()}' class='btn btn-primary btn-circle fa fa-arrow-right'></a> - <a title='Delete' href='?delete={$contact->getId()}' class='btn btn-danger btn-circle fa fa-times'></a> - </td> - </tr>"; - } - if (count($contacts) == 0) { - echo "<tr><td colspan='5'>There are no contacts in the database. Why not start with creating one, on the right?</td></tr>"; - } - ?> - </tbody> - </table> - </div> - </div> + <div class="panel panel-default"> + <div class="panel-heading">Overview</div> + <div class="panel-body table-responsive"> + <table class="table table-bordered table-striped mixitup dataTable" id="overview-contacts"> + <thead> + <tr> + <th class="mixitup-sort sorting" data-sort="mixerOrderId:desc">#</th> + <th class="mixitup-sort sorting" data-sort="mixerOrderName:desc">Name</th> + <th>Address</th> + <th>Language</th> + <th>Tools</th> + </tr> + </thead> + <tbody> + <?php + $contacts = BusinessAdmin::getContacts($_pdo); + foreach ($contacts as $contact) { + echo "<tr class='mix' + data-mixer-order-id='{$contact->getId()}' + data-mixer-order-name='{$contact->getName()}'> + <td class='col-min-width'>{$contact->getId()}</td> + <td class='col-min-width'> + <a href='#' class='editable' id='editable-contact-{$contact->getId()}-name' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getName()}</a><br/> + ({$contact->getClient()->getName()}) + </td> + <td class='col-max-width'> + <a href='#' class='editable' id='editable-contact-{$contact->getId()}-email' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getEmail()}</a><br/> + <br/> + <a href='#' class='editable' id='editable-contact-{$contact->getId()}-address' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getAddress()}</a><br/> + " . ($contact->getAddress_2() != '' ? "<a href='#' class='editable' id='editable-contact-{$contact->getId()}-address_2' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getAddress_2()}</a><br/>" : "") . " + <a href='#' class='editable' id='editable-contact-{$contact->getId()}-postal_code' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getPostalCode()}</a> + <a href='#' class='editable' id='editable-contact-{$contact->getId()}-city' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getCity()}</a><br/> + <a href='#' class='editable' id='editable-contact-{$contact->getId()}-country' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getCountry()}</a> + </td> + <td class='col-min-width'> + <a href='#' class='editable' id='editable-contact-{$contact->getId()}-language' data-type='text' data-pk='{$contact->getId()}' data-url='".constants::url_external."contacts/edit'>{$contact->getLanguage()}</a> + </td> + <td class='col-min-width'> + <a title='View' href='?id={$contact->getId()}' class='btn btn-primary btn-circle fa fa-arrow-right'></a> + <a title='Delete' href='?delete={$contact->getId()}' class='btn btn-danger btn-circle fa fa-times'></a> + </td> + </tr>"; + } + if (count($contacts) == 0) { + echo "<tr><td colspan='5'>There are no contacts in the database. Why not start with creating one, on the right?</td></tr>"; + } + ?> + </tbody> + </table> + </div> + </div> </div> <div class="col-lg-5 col-md-5"> - <div class="panel panel-default"> - <div class="panel-heading">Create new</div> - <div class="panel-body"> - <form role="form" id="newContact" action='<?=constants::url_external?>contacts/new' method="post" class="bootstrapValidator ajaxify" - data-ajaxify-options='{"success":"newContactSuccess","error":"newContactError","beforeSubmit":"newContactBeforeSubmit"}'> - <div class="ajaxify-response alert alert-dismissable"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button><span class="ajaxify-response-text"></span></div> - <div class="form-group"> - <label>Client:</label> - <select name="clientId" class="form-control"> - <?php - foreach (BusinessAdmin::getClients($_pdo) as $client) { - echo "<option value='{$client->getId()}'>{$client->getName()}</option>"; - } - ?> - </select> - </div> - <div class="form-group"> - <label>Name:</label> - <input - type="text" name="name" class="form-control" placeholder="Name" - data-bv-notempty="true" data-bv-notempty-message="You have to provide a name"/> - </div> - <div class="form-group"> - <label>Email:</label> - <input - type="email" name="email" class="form-control" placeholder="Email" - data-bv-notempty="true" data-bv-notempty-message="You have to provide a valid email address"/> - </div> - <div class="form-group"> - <label>Address:</label> - <input - type="text" name="address" class="form-control" placeholder="Address" - data-bv-notempty="true" data-bv-notempty-message="You have to provide an address"/> - </div> - <div class="form-group"> - <input - type="text" name="address_2" class="form-control" placeholder="Second address line (optional)" /> - </div> - <div class="form-group"> - <input - type="text" name="postal_code" class="form-control" placeholder="Postal code" - data-bv-notempty="true" data-bv-notempty-message="You have to provide a postal code"/> - </div> - <div class="form-group"> - <input - type="text" name="city" class="form-control" placeholder="City" - data-bv-notempty="true" data-bv-notempty-message="You have to provide a city"/> - </div> - <div class="form-group"> - <input - type="text" name="country" class="form-control" placeholder="Country" - data-bv-notempty="true" data-bv-notempty-message="You have to provide a country"/> - </div> - <button type="submit" class="btn btn-default">Go</button> - </form> - <script type="text/javascript"> - // Callback for before the form is submitted - function newContactBeforeSubmit() { - $('#newContact input').prop('disabled', true); - $('#newContact .ajaxify-response').hide().removeClass('alert-success alert-danger').find('.ajaxify-response-text').html(''); - } + <div class="panel panel-default"> + <div class="panel-heading">Create new</div> + <div class="panel-body"> + <form role="form" id="newContact" action='<?=constants::url_external?>contacts/new' method="post" class="bootstrapValidator ajaxify" + data-ajaxify-options='{"success":"newContactSuccess","error":"newContactError","beforeSubmit":"newContactBeforeSubmit"}'> + <div class="ajaxify-response alert alert-dismissable"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button><span class="ajaxify-response-text"></span></div> + <div class="form-group"> + <label>Client:</label> + <select name="clientId" class="form-control"> + <?php + foreach (BusinessAdmin::getClients($_pdo) as $client) { + echo "<option value='{$client->getId()}'>{$client->getName()}</option>"; + } + ?> + </select> + </div> + <div class="form-group"> + <label>Name:</label> + <input + type="text" name="name" class="form-control" placeholder="Name" + data-bv-notempty="true" data-bv-notempty-message="You have to provide a name"/> + </div> + <div class="form-group"> + <label>Email:</label> + <input + type="email" name="email" class="form-control" placeholder="Email" + data-bv-notempty="true" data-bv-notempty-message="You have to provide a valid email address"/> + </div> + <div class="form-group"> + <label>Address:</label> + <input + type="text" name="address" class="form-control" placeholder="Address" + data-bv-notempty="true" data-bv-notempty-message="You have to provide an address"/> + </div> + <div class="form-group"> + <input + type="text" name="address_2" class="form-control" placeholder="Second address line (optional)" /> + </div> + <div class="form-group"> + <input + type="text" name="postal_code" class="form-control" placeholder="Postal code" + data-bv-notempty="true" data-bv-notempty-message="You have to provide a postal code"/> + </div> + <div class="form-group"> + <input + type="text" name="city" class="form-control" placeholder="City" + data-bv-notempty="true" data-bv-notempty-message="You have to provide a city"/> + </div> + <div class="form-group"> + <input + type="text" name="country" class="form-control" placeholder="Country" + data-bv-notempty="true" data-bv-notempty-message="You have to provide a country"/> + </div> + <button type="submit" class="btn btn-default">Go</button> + </form> + <script type="text/javascript"> + // Callback for before the form is submitted + function newContactBeforeSubmit() { + $('#newContact input').prop('disabled', true); + $('#newContact .ajaxify-response').hide().removeClass('alert-success alert-danger').find('.ajaxify-response-text').html(''); + } - // Callback for when the form is successfully submitted - function newContactSuccess(data) { - $('#newContact .ajaxify-response') - .addClass(data.success ? 'alert-success' : 'alert-danger') - .show() - .find('.ajaxify-response-text') - .html(data.message); + // Callback for when the form is successfully submitted + function newContactSuccess(data) { + $('#newContact .ajaxify-response') + .addClass(data.success ? 'alert-success' : 'alert-danger') + .show() + .find('.ajaxify-response-text') + .html(data.message); - $('#newContact input, #newContact button').prop('disabled', false); - $('#newContact').data('bootstrapValidator').resetForm(); - if (data.success) { - $('#newContact input').val(''); - } - } + $('#newContact input, #newContact button').prop('disabled', false); + $('#newContact').data('bootstrapValidator').resetForm(); + if (data.success) { + $('#newContact input').val(''); + } + } - // Callback for when form submission encountered an error - function newContactError() { - $('#newContact .ajaxify-response') - .addClass('alert-danger') - .show() - .find('.ajaxify-response-text') - .html('An unknown error occurred. Please contact support.'); - - $('#newContact input, #newContact button').prop('disabled', false); - $('#newContact').data('bootstrapValidator').resetForm(); - } - </script> - </div> - </div> + // Callback for when form submission encountered an error + function newContactError() { + $('#newContact .ajaxify-response') + .addClass('alert-danger') + .show() + .find('.ajaxify-response-text') + .html('An unknown error occurred. Please contact support.'); + + $('#newContact input, #newContact button').prop('disabled', false); + $('#newContact').data('bootstrapValidator').resetForm(); + } + </script> + </div> + </div> </div> |