';
-
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ if (($massactionbutton || $massaction) && $contextpage != 'poslist') { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($line->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
// Piece number
if (!empty($arrayfields['t.piece_num']['checked'])) {
print '';
@@ -1108,15 +1173,17 @@ while ($i < min($num, $limit)) {
print $hookmanager->resPrint;
// Action column
- print ' ';
- if (($massactionbutton || $massaction) && $contextpage != 'poslist') { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
- $selected = 0;
- if (in_array($line->id, $arrayofselected)) {
- $selected = 1;
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print ' ';
+ if (($massactionbutton || $massaction) && $contextpage != 'poslist') { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($line->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
}
- print ' ';
+ print ' ';
}
- print '';
if (!$i) {
$totalarray['nbfield']++;
}
diff --git a/htdocs/accountancy/class/accountancyexport.class.php b/htdocs/accountancy/class/accountancyexport.class.php
index 390aaa9ed4a..3c45315ffa9 100644
--- a/htdocs/accountancy/class/accountancyexport.class.php
+++ b/htdocs/accountancy/class/accountancyexport.class.php
@@ -718,9 +718,12 @@ class AccountancyExport
/**
* Export format : WinFic - eWinfic - WinSis Compta
+ * Last review for this format : 2022-11-01 Alexandre Spangaro (aspangaro@open-dsi.fr)
*
+ * Help : https://wiki.gestan.fr/lib/exe/fetch.php?media=wiki:v15:compta:accountancy-format_winfic-ewinfic-winsiscompta.pdf
*
* @param array $TData data
+ *
* @return void
*/
public function exportWinfic(&$TData)
@@ -728,10 +731,14 @@ class AccountancyExport
global $conf;
$end_line = "\r\n";
+ $index = 1;
//We should use dol_now function not time however this is wrong date to transfert in accounting
//$date_ecriture = dol_print_date(dol_now(), $conf->global->ACCOUNTING_EXPORT_DATE); // format must be ddmmyy
//$date_ecriture = dol_print_date(time(), $conf->global->ACCOUNTING_EXPORT_DATE); // format must be ddmmyy
+
+ // Warning ! When truncation is necessary, no dot because 3 dots = three characters. The columns are shifted
+
foreach ($TData as $data) {
$code_compta = $data->numero_compte;
if (!empty($data->subledger_account)) {
@@ -740,7 +747,7 @@ class AccountancyExport
$Tab = array();
//$Tab['type_ligne'] = 'M';
- $Tab['code_journal'] = str_pad(self::trunc($data->code_journal, 2), 2);
+ $Tab['code_journal'] = str_pad(dol_trunc($data->code_journal, 2, 'right', 'UTF-8', 1), 2);
//We use invoice date $data->doc_date not $date_ecriture which is the transfert date
//maybe we should set an option for customer who prefer to keep in accounting software the tranfert date instead of invoice date ?
@@ -749,11 +756,11 @@ class AccountancyExport
$Tab['folio'] = ' 1';
- $Tab['num_ecriture'] = str_pad(self::trunc($data->piece_num, 6), 6, ' ', STR_PAD_LEFT);
+ $Tab['num_ecriture'] = str_pad(dol_trunc($index, 6, 'right', 'UTF-8', 1), 6, ' ', STR_PAD_LEFT);
$Tab['jour_ecriture'] = dol_print_date($data->doc_date, '%d%m%y');
- $Tab['num_compte'] = str_pad(self::trunc($code_compta, 6), 6, '0');
+ $Tab['num_compte'] = str_pad(dol_trunc($code_compta, 6, 'right', 'UTF-8', 1), 6, '0');
if ($data->sens == 'D') {
$Tab['montant_debit'] = str_pad(number_format($data->debit, 2, ',', ''), 13, ' ', STR_PAD_LEFT);
@@ -765,11 +772,11 @@ class AccountancyExport
$Tab['montant_crebit'] = str_pad(number_format($data->credit, 2, ',', ''), 13, ' ', STR_PAD_LEFT);
}
- $Tab['libelle_ecriture'] = str_pad(self::trunc(dol_string_unaccent($data->doc_ref).' '.dol_string_unaccent($data->label_operation), 30), 30);
+ $Tab['libelle_ecriture'] = str_pad(dol_trunc(dol_string_unaccent($data->doc_ref).' '.dol_string_unaccent($data->label_operation), 30, 'right', 'UTF-8', 1), 30);
- $Tab['lettrage'] = str_repeat(' ', 2);
+ $Tab['lettrage'] = str_repeat(dol_trunc($data->lettering_code, 2, 'left', 'UTF-8', 1), 2);
- $Tab['code_piece'] = str_repeat(' ', 5);
+ $Tab['code_piece'] = str_pad(dol_trunc($data->piece_num, 5, 'left', 'UTF-8', 1), 5, ' ', STR_PAD_LEFT);
$Tab['code_stat'] = str_repeat(' ', 4);
@@ -793,6 +800,8 @@ class AccountancyExport
$Tab['end_line'] = $end_line;
print implode('|', $Tab);
+
+ $index++;
}
}
diff --git a/htdocs/accountancy/class/accountingaccount.class.php b/htdocs/accountancy/class/accountingaccount.class.php
index 95296624145..94ee1ac6029 100644
--- a/htdocs/accountancy/class/accountingaccount.class.php
+++ b/htdocs/accountancy/class/accountingaccount.class.php
@@ -730,7 +730,7 @@ class AccountingAccount extends CommonObject
* @param Product $product Product object sell or buy
* @param Facture|FactureFournisseur $facture Facture
* @param FactureLigne|SupplierInvoiceLine $factureDet Facture Det
- * @param array $accountingAccount Array of Account account
+ * @param array $accountingAccount Array of Accounting account
* @param string $type Customer / Supplier
* @return array|int Accounting accounts suggested or < 0 if technical error.
*/
@@ -868,20 +868,44 @@ class AccountingAccount extends CommonObject
}
// Manage Deposit
- if ($factureDet->desc == "(DEPOSIT)" || $facture->type == $facture::TYPE_DEPOSIT) {
- $accountdeposittoventilated = new self($this->db);
- if ($type == 'customer') {
- $result = $accountdeposittoventilated->fetch('', $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT, 1);
- } elseif ($type == 'supplier') {
- $result = $accountdeposittoventilated->fetch('', $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT, 1);
- }
- if (isset($result) && $result < 0) {
- return -1;
+ if (getDolGlobalString('ACCOUNTING_ACCOUNT_' . strtoupper($type) . '_DEPOSIT')) {
+ if ($factureDet->desc == "(DEPOSIT)" || $facture->type == $facture::TYPE_DEPOSIT) {
+ $accountdeposittoventilated = new self($this->db);
+ if ($type == 'customer') {
+ $result = $accountdeposittoventilated->fetch('', $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT, 1);
+ } elseif ($type == 'supplier') {
+ $result = $accountdeposittoventilated->fetch('', $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT, 1);
+ }
+ if (isset($result) && $result < 0) {
+ return -1;
+ }
+
+ $code_l = $accountdeposittoventilated->ref;
+ $code_p = '';
+ $code_t = '';
+ $suggestedid = $accountdeposittoventilated->rowid;
+ $suggestedaccountingaccountfor = 'deposit';
}
- $code_l = $accountdeposittoventilated->ref;
- $suggestedid = $accountdeposittoventilated->rowid;
- $suggestedaccountingaccountfor = 'deposit';
+ // For credit note invoice, if origin invoice is a deposit invoice, force also on specific customer/supplier deposit account
+ if (!empty($facture->fk_facture_source)) {
+ $invoiceSource = new $facture($this->db);
+ $invoiceSource->fetch($facture->fk_facture_source);
+
+ if ($facture->type == $facture::TYPE_CREDIT_NOTE && $invoiceSource->type == $facture::TYPE_DEPOSIT) {
+ $accountdeposittoventilated = new self($this->db);
+ if ($type == 'customer') {
+ $accountdeposittoventilated->fetch('', $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT, 1);
+ } elseif ($type == 'supplier') {
+ $accountdeposittoventilated->fetch('', $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT, 1);
+ }
+ $code_l = $accountdeposittoventilated->ref;
+ $code_p = '';
+ $code_t = '';
+ $suggestedid = $accountdeposittoventilated->rowid;
+ $suggestedaccountingaccountfor = 'deposit';
+ }
+ }
}
// If $suggestedid could not be guessed yet, we set it from the generic default accounting code $code_l
diff --git a/htdocs/accountancy/class/accountingjournal.class.php b/htdocs/accountancy/class/accountingjournal.class.php
index 9720399fb5e..ca6ea8cd5e5 100644
--- a/htdocs/accountancy/class/accountingjournal.class.php
+++ b/htdocs/accountancy/class/accountingjournal.class.php
@@ -231,7 +231,7 @@ class AccountingJournal extends CommonObject
* Return clicable name (with picto eventually)
*
* @param int $withpicto 0=No picto, 1=Include picto into link, 2=Only picto
- * @param int $withlabel 0=No label, 1=Include label of journal
+ * @param int $withlabel 0=No label, 1=Include label of journal, 2=Include nature of journal
* @param int $nourl 1=Disable url
* @param string $moretitle Add more text to title tooltip
* @param int $notooltip 1=Disable tooltip
@@ -281,9 +281,14 @@ class AccountingJournal extends CommonObject
}
$label_link = $this->code;
- if ($withlabel && !empty($this->label)) {
+ if ($withlabel != 2 && !empty($this->label)) {
$label_link .= ' - '.($nourl ? '' : '').$langs->transnoentities($this->label).($nourl ? ' ' : '');
}
+ if ($withlabel == 2 && !empty($this->nature)) {
+ $key = $langs->trans("AccountingJournalType".strtoupper($this->nature));
+ $transferlabel = ($this->nature && $key != "AccountingJournalType".strtoupper($langs->trans($this->nature)) ? $key : $this->label);
+ $label_link .= ' - '.($nourl ? '' : '').$transferlabel.($nourl ? ' ' : '');
+ }
$result .= $linkstart;
if ($withpicto) {
@@ -441,26 +446,40 @@ class AccountingJournal extends CommonObject
$langs->loadLangs(array("assets"));
// Clean parameters
- if (empty($type)) $type = 'view';
- if (empty($in_bookkeeping)) $in_bookkeeping = 'notyet';
+ if (empty($type)) {
+ $type = 'view';
+ }
+ if (empty($in_bookkeeping)) {
+ $in_bookkeeping = 'notyet';
+ }
$sql = "";
- if ($in_bookkeeping == 'already' || $in_bookkeeping == 'notyet') {
+
+ // FIXME sql error with Mysql 5.7
+ /*if ($in_bookkeeping == 'already' || $in_bookkeeping == 'notyet') {
$sql .= "WITH in_accounting_bookkeeping(fk_docdet) AS (";
$sql .= " SELECT DISTINCT fk_docdet";
$sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping";
$sql .= " WHERE doc_type = 'asset'";
- $sql .= ")";
- }
+ $sql .= ") ";
+ }*/
+
$sql .= "SELECT ad.fk_asset AS rowid, a.ref AS asset_ref, a.label AS asset_label, a.acquisition_value_ht AS asset_acquisition_value_ht";
$sql .= ", a.disposal_date AS asset_disposal_date, a.disposal_amount_ht AS asset_disposal_amount_ht, a.disposal_subject_to_vat AS asset_disposal_subject_to_vat";
$sql .= ", ad.rowid AS depreciation_id, ad.depreciation_mode, ad.ref AS depreciation_ref, ad.depreciation_date, ad.depreciation_ht, ad.accountancy_code_debit, ad.accountancy_code_credit";
$sql .= " FROM " . MAIN_DB_PREFIX . "asset_depreciation as ad";
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "asset as a ON a.rowid = ad.fk_asset";
- if ($in_bookkeeping == 'already' || $in_bookkeeping == 'notyet') {
+ // FIXME sql error with Mysql 5.7
+ /*if ($in_bookkeeping == 'already' || $in_bookkeeping == 'notyet') {
$sql .= " LEFT JOIN in_accounting_bookkeeping as iab ON iab.fk_docdet = ad.rowid";
- }
+ }*/
$sql .= " WHERE a.entity IN (" . getEntity('asset', 0) . ')'; // We don't share object for accountancy, we use source object sharing
+ // Compatibility with Mysql 5.7
+ if ($in_bookkeeping == 'already') {
+ $sql .= " AND EXISTS (SELECT iab.fk_docdet FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS iab WHERE iab.fk_docdet = ad.rowid AND doc_type = 'asset')";
+ } elseif ($in_bookkeeping == 'notyet') {
+ $sql .= " AND NOT EXISTS (SELECT iab.fk_docdet FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS iab WHERE iab.fk_docdet = ad.rowid AND doc_type = 'asset')";
+ }
$sql .= " AND ad.ref != ''"; // not reversal lines
if ($date_start && $date_end) {
$sql .= " AND ad.depreciation_date >= '" . $this->db->idate($date_start) . "' AND ad.depreciation_date <= '" . $this->db->idate($date_end) . "'";
@@ -470,9 +489,10 @@ class AccountingJournal extends CommonObject
$sql .= " AND ad.depreciation_date >= '" . $this->db->idate($conf->global->ACCOUNTING_DATE_START_BINDING) . "'";
}
// Already in bookkeeping or not
- if ($in_bookkeeping == 'already' || $in_bookkeeping == 'notyet') {
+ // FIXME sql error with Mysql 5.7
+ /*if ($in_bookkeeping == 'already' || $in_bookkeeping == 'notyet') {
$sql .= " AND iab.fk_docdet IS" . ($in_bookkeeping == 'already' ? " NOT" : "") . " NULL";
- }
+ }*/
$sql .= " ORDER BY ad.depreciation_date";
dol_syslog(__METHOD__, LOG_DEBUG);
diff --git a/htdocs/accountancy/class/lettering.class.php b/htdocs/accountancy/class/lettering.class.php
index 405a630942e..5749518e2b9 100644
--- a/htdocs/accountancy/class/lettering.class.php
+++ b/htdocs/accountancy/class/lettering.class.php
@@ -33,11 +33,52 @@ include_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php";
*/
class Lettering extends BookKeeping
{
- /**
- * @var BookKeeping[] Bookkeeping cached
- */
- public static $bookkeeping_cached = array();
-
+ public static $doc_type_infos = array(
+ 'customer_invoice' => array(
+ 'payment_table' => 'paiement',
+ 'payment_table_fk_bank' => 'fk_bank',
+ 'doc_payment_table' => 'paiement_facture',
+ 'doc_payment_table_fk_payment' => 'fk_paiement',
+ 'doc_payment_table_fk_doc' => 'fk_facture',
+ 'linked_info' => array(
+ array(
+ 'table' => 'paiement_facture',
+ 'fk_doc' => 'fk_facture',
+ 'fk_link' => 'fk_paiement',
+ 'prefix' => 'p',
+ ),
+ array(
+ 'table' => 'societe_remise_except',
+ 'fk_doc' => 'fk_facture_source',
+ 'fk_link' => 'fk_facture',
+ 'prefix' => 'a',
+ 'is_fk_link_is_also_fk_doc' => true,
+ ),
+ ),
+ ),
+ 'supplier_invoice' => array(
+ 'payment_table' => 'paiementfourn',
+ 'payment_table_fk_bank' => 'fk_bank',
+ 'doc_payment_table' => 'paiementfourn_facturefourn',
+ 'doc_payment_table_fk_payment' => 'fk_paiementfourn',
+ 'doc_payment_table_fk_doc' => 'fk_facturefourn',
+ 'linked_info' => array(
+ array(
+ 'table' => 'paiementfourn_facturefourn',
+ 'fk_doc' => 'fk_facturefourn',
+ 'fk_link' => 'fk_paiementfourn',
+ 'prefix' => 'p',
+ ),
+ array(
+ 'table' => 'societe_remise_except',
+ 'fk_doc' => 'fk_invoice_supplier_source',
+ 'fk_link' => 'fk_invoice_supplier',
+ 'prefix' => 'a',
+ 'is_fk_link_is_also_fk_doc' => true,
+ ),
+ ),
+ ),
+ );
/**
* letteringThirdparty
@@ -250,26 +291,17 @@ class Lettering extends BookKeeping
$lettre = 'AAA';
$sql = "SELECT DISTINCT ab2.lettering_code";
- $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping As ab";
- $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url AS bu ON bu.fk_bank = ab.fk_doc";
- $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url AS bu2 ON bu2.url_id = bu.url_id";
- $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab2 ON ab2.fk_doc = bu2.fk_bank";
- $sql .= " WHERE ab.rowid IN (" . $this->db->sanitize(implode(',', $ids)) . ")";
- $sql .= " AND ab.doc_type = 'bank'";
- $sql .= " AND ab2.doc_type = 'bank'";
- $sql .= " AND bu.type = 'company'";
- $sql .= " AND bu2.type = 'company'";
- $sql .= " AND ab.subledger_account != ''";
- $sql .= " AND ab2.subledger_account != ''";
- $sql .= " AND ab.lettering_code IS NULL";
- $sql .= " AND ab2.lettering_code != ''";
- $sql .= " ORDER BY ab2.lettering_code DESC";
- $sql .= " LIMIT 1 ";
+ $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab";
+ $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab2 ON ab2.subledger_account = ab.subledger_account";
+ $sql .= " WHERE ab.rowid IN (" . $this->db->sanitize(implode(',', $ids)) . ")";
+ $sql .= " AND ab2.lettering_code != ''";
+ $sql .= " ORDER BY ab2.lettering_code DESC";
+ $sql .= " LIMIT 1 ";
$resqla = $this->db->query($sql);
if ($resqla) {
$obj = $this->db->fetch_object($resqla);
- $lettre = (empty($obj->lettering_code) ? 'AAA' : $obj->lettering_code);
+ $lettre = (empty($obj->lettering_code) ? $lettre : $obj->lettering_code);
if (!empty($obj->lettering_code)) {
$lettre++;
}
@@ -301,7 +333,7 @@ class Lettering extends BookKeeping
if (!$error) {
$sql = "UPDATE ".MAIN_DB_PREFIX."accounting_bookkeeping SET";
$sql .= " lettering_code='".$this->db->escape($lettre)."'";
- $sql .= " , date_lettering = '".$this->db->idate($now)."'"; // todo correct date it's false
+ $sql .= ", date_lettering = '".$this->db->idate($now)."'"; // todo correct date it's false
$sql .= " WHERE rowid IN (".$this->db->sanitize(implode(',', $ids)).") AND lettering_code IS NULL AND subledger_account != ''";
dol_syslog(get_class($this)."::update", LOG_DEBUG);
@@ -336,7 +368,7 @@ class Lettering extends BookKeeping
$sql = "UPDATE ".MAIN_DB_PREFIX."accounting_bookkeeping SET";
$sql .= " lettering_code = NULL";
- $sql .= " , date_lettering = NULL";
+ $sql .= ", date_lettering = NULL";
$sql .= " WHERE rowid IN (".$this->db->sanitize(implode(',', $ids)).")";
$sql .= " AND subledger_account != ''";
@@ -374,16 +406,7 @@ class Lettering extends BookKeeping
$errors = array();
$nb_lettering = 0;
- $result = $this->bookkeepingLettering($bookkeeping_ids, 'customer_invoice', $unlettering);
- if ($result < 0) {
- $error++;
- $errors = array_merge($errors, $this->errors);
- $nb_lettering += abs($result) - 2;
- } else {
- $nb_lettering += $result;
- }
-
- $result = $this->bookkeepingLettering($bookkeeping_ids, 'supplier_invoice', $unlettering);
+ $result = $this->bookkeepingLettering($bookkeeping_ids, $unlettering);
if ($result < 0) {
$error++;
$errors = array_merge($errors, $this->errors);
@@ -404,11 +427,10 @@ class Lettering extends BookKeeping
* Lettering bookkeeping lines
*
* @param array $bookkeeping_ids Lettering specific list of bookkeeping id
- * @param string $type Type of bookkeeping type to lettering ('customer_invoice' or 'supplier_invoice')
* @param bool $unlettering Do unlettering
* @return int <0 if error (nb lettered = result -1), 0 if noting to lettering, >0 if OK (nb lettered)
*/
- public function bookkeepingLettering($bookkeeping_ids, $type = 'customer_invoice', $unlettering = false)
+ public function bookkeepingLettering($bookkeeping_ids, $unlettering = false)
{
global $langs;
@@ -416,11 +438,14 @@ class Lettering extends BookKeeping
// Clean parameters
$bookkeeping_ids = is_array($bookkeeping_ids) ? $bookkeeping_ids : array();
- $type = trim($type);
$error = 0;
$nb_lettering = 0;
- $grouped_lines = $this->getLinkedLines($bookkeeping_ids, $type);
+ $grouped_lines = $this->getLinkedLines($bookkeeping_ids);
+ if (!is_array($grouped_lines)) {
+ return -2;
+ }
+
foreach ($grouped_lines as $lines) {
$group_error = 0;
$total = 0;
@@ -478,52 +503,214 @@ class Lettering extends BookKeeping
/**
* Lettering bookkeeping lines
*
- * @param array $bookkeeping_ids Lettering specific list of bookkeeping id
- * @param string $type Type of bookkeeping type to lettering ('customer_invoice' or 'supplier_invoice')
- * @return array|int <0 if error otherwise all linked lines by block
+ * @param array $bookkeeping_ids Lettering specific list of bookkeeping id
+ * @param bool $only_has_subledger_account Get only lines who have subledger account
+ * @return array|int <0 if error otherwise all linked lines by block
*/
- public function getLinkedLines($bookkeeping_ids, $type = 'customer_invoice')
+ public function getLinkedLines($bookkeeping_ids, $only_has_subledger_account = true)
{
global $conf, $langs;
$this->errors = array();
// Clean parameters
$bookkeeping_ids = is_array($bookkeeping_ids) ? $bookkeeping_ids : array();
- $type = trim($type);
- if ($type == 'customer_invoice') {
- $doc_type = 'customer_invoice';
- $bank_url_type = 'payment';
- $payment_element = 'paiement_facture';
- $fk_payment_element = 'fk_paiement';
- $fk_element = 'fk_facture';
- $account_number = $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER;
- } elseif ($type == 'supplier_invoice') {
- $doc_type = 'supplier_invoice';
- $bank_url_type = 'payment_supplier';
- $payment_element = 'paiementfourn_facturefourn';
- $fk_payment_element = 'fk_paiementfourn';
- $fk_element = 'fk_facturefourn';
- $account_number = $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER;
- } else {
+ // Get all bookkeeping lines
+ $sql = "SELECT DISTINCT ab.doc_type, ab.fk_doc";
+ $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab";
+ $sql .= " WHERE ab.entity IN (" . getEntity('accountancy') . ")";
+ $sql .= " AND ab.fk_doc > 0";
+ if (!empty($bookkeeping_ids)) {
+ // Get all bookkeeping lines of piece number
+ $sql .= " AND EXISTS (";
+ $sql .= " SELECT rowid";
+ $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS pn";
+ $sql .= " WHERE pn.entity IN (" . getEntity('accountancy') . ")";
+ $sql .= " AND pn.rowid IN (" . $this->db->sanitize(implode(',', $bookkeeping_ids)) . ")";
+ $sql .= " AND pn.piece_num = ab.piece_num";
+ $sql .= " )";
+ }
+ if ($only_has_subledger_account) $sql .= " AND ab.subledger_account != ''";
+
+ dol_syslog(__METHOD__ . " - Get all bookkeeping lines", LOG_DEBUG);
+ $resql = $this->db->query($sql);
+ if (!$resql) {
+ $this->errors[] = "Error " . $this->db->lasterror();
+ return -1;
+ }
+
+ $bookkeeping_lines_by_type = array();
+ while ($obj = $this->db->fetch_object($resql)) {
+ $bookkeeping_lines_by_type[$obj->doc_type][$obj->fk_doc] = $obj->fk_doc;
+ }
+ $this->db->free($resql);
+
+ if (empty($bookkeeping_lines_by_type)) {
+ return array();
+ }
+
+ if (!empty($bookkeeping_lines_by_type['bank'])) {
+ $new_bookkeeping_lines_by_type = $this->getDocTypeAndFkDocFromBankLines($bookkeeping_lines_by_type['bank']);
+ if (!is_array($new_bookkeeping_lines_by_type)) {
+ return -1;
+ }
+ foreach ($new_bookkeeping_lines_by_type as $doc_type => $fk_docs) {
+ foreach ($fk_docs as $fk_doc) {
+ $bookkeeping_lines_by_type[$doc_type][$fk_doc] = $fk_doc;
+ }
+ }
+ }
+
+ $grouped_lines = array();
+ foreach (self::$doc_type_infos as $doc_type => $doc_type_info) {
+ if (!is_array($bookkeeping_lines_by_type[$doc_type])) {
+ continue;
+ }
+
+ // Get all document ids grouped
+ $doc_grouped = $this->getLinkedDocumentByGroup($bookkeeping_lines_by_type[$doc_type], $doc_type);
+ if (!is_array($doc_grouped)) {
+ return -1;
+ }
+
+ // Group all lines by document/piece number
+ foreach ($doc_grouped as $doc_ids) {
+ $bank_ids = $this->getBankLinesFromFkDocAndDocType($doc_ids, $doc_type);
+ if (!is_array($bank_ids)) {
+ return -1;
+ }
+
+ // Get all bookkeeping lines linked
+ $sql = "SELECT DISTINCT ab.rowid, ab.piece_num, ab.debit, ab.credit, ab.lettering_code";
+ $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab";
+ $sql .= " WHERE ab.entity IN (" . getEntity('accountancy') . ")";
+ $sql .= " AND (";
+ if (!empty($bank_ids)) {
+ $sql .= " EXISTS (";
+ $sql .= " SELECT bpn.rowid";
+ $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS bpn";
+ $sql .= " WHERE bpn.entity IN (" . getEntity('accountancy') . ")";
+ $sql .= " AND bpn.doc_type = 'bank'";
+ $sql .= " AND bpn.fk_doc IN (" . $this->db->sanitize(implode(',', $bank_ids)) . ")";
+ $sql .= " AND bpn.piece_num = ab.piece_num";
+ $sql .= " ) OR ";
+ }
+ $sql .= " EXISTS (";
+ $sql .= " SELECT dpn.rowid";
+ $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS dpn";
+ $sql .= " WHERE dpn.entity IN (" . getEntity('accountancy') . ")";
+ $sql .= " AND dpn.doc_type = '" . $this->db->escape($doc_type) . "'";
+ $sql .= " AND dpn.fk_doc IN (" . $this->db->sanitize(implode(',', $doc_ids)) . ")";
+ $sql .= " AND dpn.piece_num = ab.piece_num";
+ $sql .= " )";
+ $sql .= ")";
+ if ($only_has_subledger_account) $sql .= " AND ab.subledger_account != ''";
+
+ dol_syslog(__METHOD__ . " - Get all bookkeeping lines linked", LOG_DEBUG);
+ $resql = $this->db->query($sql);
+ if (!$resql) {
+ $this->errors[] = "Error " . $this->db->lasterror();
+ return -1;
+ }
+
+ $group = array();
+ while ($obj = $this->db->fetch_object($resql)) {
+ $group[$obj->rowid] = array(
+ 'id' => $obj->rowid,
+ 'piece_num' => $obj->piece_num,
+ 'debit' => $obj->debit,
+ 'credit' => $obj->credit,
+ 'lettering_code' => $obj->lettering_code,
+ );
+ }
+ $this->db->free($resql);
+
+ if (!empty($group)) $grouped_lines[] = $group;
+ }
+ }
+
+ return $grouped_lines;
+ }
+
+ /**
+ * Get all fk_doc by doc_type from list of bank ids
+ *
+ * @param array $bank_ids List of bank ids
+ * @return array|int <0 if error otherwise all fk_doc by doc_type
+ */
+ public function getDocTypeAndFkDocFromBankLines($bank_ids)
+ {
+ dol_syslog(__METHOD__ . " - bank_ids=".json_encode($bank_ids), LOG_DEBUG);
+
+ // Clean parameters
+ $bank_ids = is_array($bank_ids) ? $bank_ids : array();
+
+ if (empty($bank_ids)) {
+ return array();
+ }
+
+ $bookkeeping_lines_by_type = array();
+ foreach (self::$doc_type_infos as $doc_type => $doc_type_info) {
+ // Get all fk_doc by doc_type from bank ids
+ $sql = "SELECT DISTINCT dp." . $doc_type_info['doc_payment_table_fk_doc'] . " AS fk_doc";
+ $sql .= " FROM " . MAIN_DB_PREFIX . $doc_type_info['payment_table'] . " AS p";
+ $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . $doc_type_info['doc_payment_table'] . " AS dp ON dp." . $doc_type_info['doc_payment_table_fk_payment'] . " = p.rowid";
+ $sql .= " WHERE p." . $doc_type_info['payment_table_fk_bank'] . " IN (" . $this->db->sanitize(implode(',', $bank_ids)) . ")";
+ $sql .= " AND dp." . $doc_type_info['doc_payment_table_fk_doc'] . " > 0";
+
+ dol_syslog(__METHOD__ . " - Get all fk_doc by doc_type from list of bank ids for '" . $doc_type . "'", LOG_DEBUG);
+ $resql = $this->db->query($sql);
+ if (!$resql) {
+ $this->errors[] = "Error " . $this->db->lasterror();
+ return -1;
+ }
+
+ while ($obj = $this->db->fetch_object($resql)) {
+ $bookkeeping_lines_by_type[$doc_type][$obj->fk_doc] = $obj->fk_doc;
+ }
+ $this->db->free($resql);
+ }
+
+ return $bookkeeping_lines_by_type;
+ }
+
+ /**
+ * Get all bank ids from list of document ids of a type
+ *
+ * @param array $document_ids List of document id
+ * @param string $doc_type Type of document ('customer_invoice' or 'supplier_invoice', ...)
+ * @return array|int <0 if error otherwise all all bank ids from list of document ids of a type
+ */
+ public function getBankLinesFromFkDocAndDocType($document_ids, $doc_type)
+ {
+ global $langs;
+
+ dol_syslog(__METHOD__ . " - bank_ids=".json_encode($document_ids) . ", doc_type=$doc_type", LOG_DEBUG);
+
+ // Clean parameters
+ $document_ids = is_array($document_ids) ? $document_ids : array();
+ $doc_type = trim($doc_type);
+
+ if (empty($document_ids)) {
+ return array();
+ }
+ if (!is_array(self::$doc_type_infos[$doc_type])) {
$langs->load('errors');
$this->errors[] = $langs->trans('ErrorBadParameters');
return -1;
}
- $payment_ids = array();
+ $doc_type_info = self::$doc_type_infos[$doc_type];
+ $bank_ids = array();
- // Get all payment id from bank lines
- $sql = "SELECT DISTINCT bu.url_id AS payment_id";
- $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab";
- $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url AS bu ON bu.fk_bank = ab.fk_doc";
- $sql .= " WHERE ab.doc_type = 'bank'";
- // $sql .= " AND ab.subledger_account != ''";
- // $sql .= " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'";
- $sql .= " AND bu.type = '" . $this->db->escape($bank_url_type) . "'";
- if (!empty($bookkeeping_ids)) $sql .= " AND ab.rowid IN (" . $this->db->sanitize(implode(',', $bookkeeping_ids)) . ")";
+ // Get all fk_doc by doc_type from bank ids
+ $sql = "SELECT DISTINCT p." . $doc_type_info['payment_table_fk_bank'] . " AS fk_doc";
+ $sql .= " FROM " . MAIN_DB_PREFIX . $doc_type_info['payment_table'] . " AS p";
+ $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . $doc_type_info['doc_payment_table'] . " AS dp ON dp." . $doc_type_info['doc_payment_table_fk_payment'] . " = p.rowid";
+ $sql .= " WHERE dp." . $doc_type_info['doc_payment_table_fk_doc'] . " IN (" . $this->db->sanitize(implode(',', $document_ids)) . ")";
+ $sql .= " AND p." . $doc_type_info['payment_table_fk_bank'] . " > 0";
- dol_syslog(__METHOD__ . " - Get all payment id from bank lines", LOG_DEBUG);
+ dol_syslog(__METHOD__ . " - Get all bank ids from list of document ids of a type '" . $doc_type . "'", LOG_DEBUG);
$resql = $this->db->query($sql);
if (!$resql) {
$this->errors[] = "Error " . $this->db->lasterror();
@@ -531,218 +718,137 @@ class Lettering extends BookKeeping
}
while ($obj = $this->db->fetch_object($resql)) {
- $payment_ids[$obj->payment_id] = $obj->payment_id;
+ $bank_ids[$obj->fk_doc] = $obj->fk_doc;
}
$this->db->free($resql);
- // Get all payment id from payment lines
- $sql = "SELECT DISTINCT pe.$fk_payment_element AS payment_id";
- $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab";
- $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "$payment_element AS pe ON pe.$fk_element = ab.fk_doc";
- $sql .= " WHERE ab.doc_type = '" . $this->db->escape($doc_type) . "'";
- // $sql .= " AND ab.subledger_account != ''";
- // $sql .= " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'";
- $sql .= " AND pe.$fk_payment_element IS NOT NULL";
- if (!empty($bookkeeping_ids)) $sql .= " AND ab.rowid IN (" . $this->db->sanitize(implode(',', $bookkeeping_ids)) . ")";
-
- dol_syslog(__METHOD__ . " - Get all payment id from bank lines", LOG_DEBUG);
- $resql = $this->db->query($sql);
- if (!$resql) {
- $this->errors[] = "Error " . $this->db->lasterror();
- return -1;
- }
-
- while ($obj = $this->db->fetch_object($resql)) {
- $payment_ids[$obj->payment_id] = $obj->payment_id;
- }
- $this->db->free($resql);
-
- if (empty($payment_ids)) {
- return array();
- }
-
- // Get all payments linked by group
- $payment_by_group = $this->getLinkedPaymentByGroup($payment_ids, $type);
-
- $groups = array();
- foreach ($payment_by_group as $payment_list) {
- $lines = array();
-
- // Get bank lines
- $sql = "SELECT DISTINCT ab.rowid, ab.piece_num, ab.lettering_code, ab.debit, ab.credit";
- $sql .= " FROM " . MAIN_DB_PREFIX . "bank_url AS bu";
- $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab ON ab.fk_doc = bu.fk_bank";
- $sql .= " WHERE bu.url_id IN (" . $this->db->sanitize(implode(',', $payment_list)) . ")";
- $sql .= " AND bu.type = '" . $this->db->escape($bank_url_type) . "'";
- $sql .= " AND ab.doc_type = 'bank'";
- $sql .= " AND ab.subledger_account != ''";
- $sql .= " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'";
-
- dol_syslog(__METHOD__ . " - Get bank lines", LOG_DEBUG);
- $resql = $this->db->query($sql);
- if (!$resql) {
- $this->errors[] = "Error " . $this->db->lasterror();
- return -1;
- }
-
- while ($obj = $this->db->fetch_object($resql)) {
- $lines[$obj->rowid] = array('id' => $obj->rowid, 'piece_num' => $obj->piece_num, 'lettering_code' => $obj->lettering_code, 'debit' => $obj->debit, 'credit' => $obj->credit);
- }
- $this->db->free($resql);
-
- // Get payment lines
- $sql = "SELECT DISTINCT ab.rowid, ab.piece_num, ab.lettering_code, ab.debit, ab.credit";
- $sql .= " FROM " . MAIN_DB_PREFIX . "$payment_element AS pe";
- $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab ON ab.fk_doc = pe.$fk_element";
- $sql .= " WHERE pe.$fk_payment_element IN (" . $this->db->sanitize(implode(',', $payment_list)) . ")";
- $sql .= " AND ab.doc_type = '" . $this->db->escape($doc_type) . "'";
- $sql .= " AND ab.subledger_account != ''";
- $sql .= " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'";
-
- dol_syslog(__METHOD__ . " - Get payment lines", LOG_DEBUG);
- $resql = $this->db->query($sql);
- if (!$resql) {
- $this->errors[] = "Error " . $this->db->lasterror();
- return -1;
- }
-
- while ($obj = $this->db->fetch_object($resql)) {
- $lines[$obj->rowid] = array('id' => $obj->rowid, 'piece_num' => $obj->piece_num, 'lettering_code' => $obj->lettering_code, 'debit' => $obj->debit, 'credit' => $obj->credit);
- }
- $this->db->free($resql);
-
- if (!empty($lines)) {
- $groups[] = $lines;
- }
- }
-
- return $groups;
+ return $bank_ids;
}
/**
- * Linked payment by group
+ * Get all linked document ids by group and type
*
- * @param array $payment_ids list of payment id
- * @param string $type Type of bookkeeping type to lettering ('customer_invoice' or 'supplier_invoice')
- * @return array|int <0 if error otherwise all linked lines by block
+ * @param array $document_ids List of document id
+ * @param string $doc_type Type of document ('customer_invoice' or 'supplier_invoice', ...)
+ * @return array|int <0 if error otherwise all linked document ids by group and type [ [ 'doc_type' => [ doc_id, ... ], ... ], ... ]
*/
- public function getLinkedPaymentByGroup($payment_ids, $type)
+ public function getLinkedDocumentByGroup($document_ids, $doc_type)
{
global $langs;
// Clean parameters
- $payment_ids = is_array($payment_ids) ? $payment_ids : array();
- $type = trim($type);
+ $document_ids = is_array($document_ids) ? $document_ids : array();
+ $doc_type = trim($doc_type);
- if (empty($payment_ids)) {
+ if (empty($document_ids)) {
return array();
}
-
- if ($type == 'customer_invoice') {
- $payment_element = 'paiement_facture';
- $fk_payment_element = 'fk_paiement';
- $fk_element = 'fk_facture';
- } elseif ($type == 'supplier_invoice') {
- $payment_element = 'paiementfourn_facturefourn';
- $fk_payment_element = 'fk_paiementfourn';
- $fk_element = 'fk_facturefourn';
- } else {
+ if (!is_array(self::$doc_type_infos[$doc_type])) {
$langs->load('errors');
$this->errors[] = $langs->trans('ErrorBadParameters');
return -1;
}
- // Get payment lines
- $sql = "SELECT DISTINCT pe2.$fk_payment_element, pe2.$fk_element";
- $sql .= " FROM " . MAIN_DB_PREFIX . "$payment_element AS pe";
- $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "$payment_element AS pe2 ON pe2.$fk_element = pe.$fk_element";
- $sql .= " WHERE pe.$fk_payment_element IN (" . $this->db->sanitize(implode(',', $payment_ids)) . ")";
+ $doc_type_info = self::$doc_type_infos[$doc_type];
- dol_syslog(__METHOD__ . " - Get payment lines", LOG_DEBUG);
- $resql = $this->db->query($sql);
- if (!$resql) {
- $this->errors[] = "Error " . $this->db->lasterror();
- return -1;
+ // Get document lines
+ $current_document_ids = array();
+ $link_by_element = array();
+ $element_by_link = array();
+ foreach ($doc_type_info['linked_info'] as $linked_info) {
+ $sql = "SELECT DISTINCT tl2." . $linked_info['fk_link'] . " AS fk_link, tl2." . $linked_info['fk_doc'] . " AS fk_doc";
+ $sql .= " FROM " . MAIN_DB_PREFIX . $linked_info['table'] . " AS tl";
+ $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . $linked_info['table'] . " AS tl2 ON tl2." . $linked_info['fk_link'] . " = tl." . $linked_info['fk_link'];
+ $sql .= " WHERE tl." . $linked_info['fk_doc'] . " IN (" . $this->db->sanitize(implode(',', $document_ids)) . ")";
+
+ dol_syslog(__METHOD__ . " - Get document lines", LOG_DEBUG);
+ $resql = $this->db->query($sql);
+ if (!$resql) {
+ $this->errors[] = "Error " . $this->db->lasterror();
+ return -1;
+ }
+
+ $is_fk_link_is_also_fk_doc = !empty($linked_info['is_fk_link_is_also_fk_doc']);
+ while ($obj = $this->db->fetch_object($resql)) {
+ $current_document_ids[$obj->fk_doc] = $obj->fk_doc;
+
+ $link_key = $linked_info['prefix'] . $obj->fk_link;
+ $element_by_link[$link_key][$obj->fk_doc] = $obj->fk_doc;
+ $link_by_element[$obj->fk_doc][$link_key] = $link_key;
+ if ($is_fk_link_is_also_fk_doc) {
+ $element_by_link[$link_key][$obj->fk_link] = $obj->fk_link;
+ $link_by_element[$obj->fk_link][$link_key] = $link_key;
+ }
+ }
+ $this->db->free($resql);
}
- $current_payment_ids = array();
- $payment_by_element = array();
- $element_by_payment = array();
- while ($obj = $this->db->fetch_object($resql)) {
- $current_payment_ids[$obj->$fk_payment_element] = $obj->$fk_payment_element;
- $element_by_payment[$obj->$fk_payment_element][$obj->$fk_element] = $obj->$fk_element;
- $payment_by_element[$obj->$fk_element][$obj->$fk_payment_element] = $obj->$fk_payment_element;
- }
- $this->db->free($resql);
-
- if (count(array_diff($payment_ids, $current_payment_ids))) {
- return $this->getLinkedPaymentByGroup($current_payment_ids, $type);
+ if (count(array_diff($document_ids, $current_document_ids))) {
+ return $this->getLinkedDocumentByGroup($current_document_ids, $doc_type);
}
- return $this->getGroupElements($payment_by_element, $element_by_payment);
+ return $this->getGroupElements($link_by_element, $element_by_link);
}
/**
- * Get payment ids grouped by payment id and element id in common
+ * Get element ids grouped by link or element in common
*
- * @param array $payment_by_element List of payment ids by element id
- * @param array $element_by_payment List of element ids by payment id
- * @param int $element_id Element Id (used for recursive function)
- * @param array $current_group Current group (used for recursive function)
- * @return array List of payment ids grouped by payment id and element id in common
+ * @param array $link_by_element List of payment ids by link key
+ * @param array $element_by_link List of element ids by link key
+ * @param string $link_key Link key (used for recursive function)
+ * @param array $current_group Current group (used for recursive function)
+ * @return array List of element ids grouped by link or element in common
*/
- public function getGroupElements(&$payment_by_element, &$element_by_payment, $element_id = 0, &$current_group = array())
+ public function getGroupElements(&$link_by_element, &$element_by_link, $link_key = '', &$current_group = array())
{
- $grouped_payments = array();
- if ($element_id > 0 && !isset($payment_by_element[$element_id])) {
- // Return if specific element id not found
- return $grouped_payments;
+ $grouped_elements = array();
+ if (!empty($link_key) && !isset($element_by_link[$link_key])) {
+ // Return if specific link key not found
+ return $grouped_elements;
}
- $save_payment_by_element = null;
- $save_element_by_payment = null;
- if ($element_id == 0) {
+ if (empty($link_key)) {
// Save list when is the begin of recursive function
- $save_payment_by_element = $payment_by_element;
- $save_element_by_payment = $element_by_payment;
+ $save_link_by_element = $link_by_element;
+ $save_element_by_link = $element_by_link;
}
do {
// Get current element id, get this payment id list and delete the entry
- $current_element_id = $element_id > 0 ? $element_id : array_keys($payment_by_element)[0];
- $payment_ids = $payment_by_element[$current_element_id];
- unset($payment_by_element[$current_element_id]);
+ $current_link_key = !empty($link_key) ? $link_key : array_keys($element_by_link)[0];
+ $element_ids = $element_by_link[$current_link_key];
+ unset($element_by_link[$current_link_key]);
- foreach ($payment_ids as $payment_id) {
- // Continue if payment id in not found
- if (!isset($element_by_payment[$payment_id])) continue;
+ foreach ($element_ids as $element_id) {
+ // Continue if element id in not found
+ if (!isset($link_by_element[$element_id])) continue;
- // Set the payment in the current group
- $current_group[$payment_id] = $payment_id;
+ // Set the element in the current group
+ $current_group[$element_id] = $element_id;
- // Get current element ids, get this payment id list and delete the entry
- $element_ids = $element_by_payment[$payment_id];
- unset($element_by_payment[$payment_id]);
+ // Get current link keys, get this element id list and delete the entry
+ $link_keys = $link_by_element[$element_id];
+ unset($link_by_element[$element_id]);
- // Set payment id on the current group for each element id of the payment
- foreach ($element_ids as $id) {
- $this->getGroupElements($payment_by_element, $element_by_payment, $id, $current_group);
+ // Set element id on the current group for each link key of the element
+ foreach ($link_keys as $key) {
+ $this->getGroupElements($link_by_element, $element_by_link, $key, $current_group);
}
}
- if ($element_id == 0) {
+ if (empty($link_key)) {
// Save current group and reset the current group when is the begin of recursive function
- $grouped_payments[] = $current_group;
+ $grouped_elements[] = $current_group;
$current_group = array();
}
- } while (!empty($payment_by_element) && $element_id == 0);
+ } while (!empty($element_by_link) && empty($link_key));
- if ($element_id == 0) {
+ if (empty($link_key)) {
// Restore list when is the begin of recursive function
- $payment_by_element = $save_payment_by_element;
- $element_by_payment = $save_element_by_payment;
+ $link_by_element = $save_link_by_element;
+ $element_by_link = $save_element_by_link;
}
- return $grouped_payments;
+ return $grouped_elements;
}
}
diff --git a/htdocs/accountancy/closure/index.php b/htdocs/accountancy/closure/index.php
index da4f5eecd25..c1dc454b675 100644
--- a/htdocs/accountancy/closure/index.php
+++ b/htdocs/accountancy/closure/index.php
@@ -64,7 +64,7 @@ if (!isModEnabled('accounting')) {
if ($user->socid > 0) {
accessforbidden();
}
-if (empty($user->rights->accounting->fiscalyear->write)) {
+if (!$user->hasRight('accounting', 'fiscalyear', 'write')) {
accessforbidden();
}
diff --git a/htdocs/accountancy/customer/card.php b/htdocs/accountancy/customer/card.php
index 0b3435ecb92..e867070ed2d 100644
--- a/htdocs/accountancy/customer/card.php
+++ b/htdocs/accountancy/customer/card.php
@@ -44,7 +44,7 @@ if (!isModEnabled('accounting')) {
if ($user->socid > 0) {
accessforbidden();
}
-if (empty($user->rights->accounting->mouvements->lire)) {
+if (!$user->hasRight('accounting', 'mouvements', 'lire')) {
accessforbidden();
}
@@ -54,7 +54,7 @@ if (empty($user->rights->accounting->mouvements->lire)) {
* Actions
*/
-if ($action == 'ventil' && $user->rights->accounting->bind->write) {
+if ($action == 'ventil' && $user->hasRight('accounting', 'bind', 'write')) {
if (!$cancel) {
if ($codeventil < 0) {
$codeventil = 0;
diff --git a/htdocs/accountancy/customer/index.php b/htdocs/accountancy/customer/index.php
index 472dce11e37..b887696fb13 100644
--- a/htdocs/accountancy/customer/index.php
+++ b/htdocs/accountancy/customer/index.php
@@ -47,7 +47,7 @@ if (!isModEnabled('accounting')) {
if ($user->socid > 0) {
accessforbidden();
}
-if (empty($user->rights->accounting->bind->write)) {
+if (!$user->hasRight('accounting', 'bind', 'write')) {
accessforbidden();
}
@@ -84,7 +84,7 @@ if (!isModEnabled('accounting')) {
if ($user->socid > 0) {
accessforbidden();
}
-if (empty($user->rights->accounting->mouvements->lire)) {
+if (!$user->hasRight('accounting', 'mouvements', 'lire')) {
accessforbidden();
}
@@ -93,7 +93,7 @@ if (empty($user->rights->accounting->mouvements->lire)) {
* Actions
*/
-if (($action == 'clean' || $action == 'validatehistory') && $user->rights->accounting->bind->write) {
+if (($action == 'clean' || $action == 'validatehistory') && $user->hasRight('accounting', 'bind', 'write')) {
// Clean database by removing binding done on non existing or no more existing accounts
$db->begin();
$sql1 = "UPDATE ".MAIN_DB_PREFIX."facturedet as fd";
@@ -142,7 +142,7 @@ if ($action == 'validatehistory') {
}*/
// Customer Invoice lines (must be same request than into page list.php for manual binding)
- $sql = "SELECT f.rowid as facid, f.ref as ref, f.datef, f.type as ftype,";
+ $sql = "SELECT f.rowid as facid, f.ref as ref, f.datef, f.type as ftype, f.fk_facture_source,";
$sql .= " l.rowid, l.fk_product, l.description, l.total_ht, l.fk_code_ventilation, l.product_type as type_l, l.tva_tx as tva_tx_line, l.vat_src_code,";
$sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as type, p.tva_tx as tva_tx_prod,";
if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
@@ -237,7 +237,8 @@ if ($action == 'validatehistory') {
$facture_static->ref = $objp->ref;
$facture_static->id = $objp->facid;
$facture_static->type = $objp->ftype;
- $facture_static->date = $objp->datef;
+ $facture_static->date = $db->jdate($objp->datef);
+ $facture_static->fk_facture_source = $objp->fk_facture_source;
$facture_static_det->id = $objp->rowid;
$facture_static_det->total_ht = $objp->total_ht;
diff --git a/htdocs/accountancy/customer/lines.php b/htdocs/accountancy/customer/lines.php
index 469f29ad3c7..65d7ee0bbeb 100644
--- a/htdocs/accountancy/customer/lines.php
+++ b/htdocs/accountancy/customer/lines.php
@@ -91,7 +91,7 @@ if (!isModEnabled('accounting')) {
if ($user->socid > 0) {
accessforbidden();
}
-if (empty($user->rights->accounting->mouvements->lire)) {
+if (!$user->hasRight('accounting', 'mouvements', 'lire')) {
accessforbidden();
}
@@ -126,7 +126,7 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x'
$search_tvaintra = '';
}
-if (is_array($changeaccount) && count($changeaccount) > 0 && $user->rights->accounting->bind->write) {
+if (is_array($changeaccount) && count($changeaccount) > 0 && $user->hasRight('accounting', 'bind', 'write')) {
$error = 0;
if (!(GETPOST('account_parent', 'int') >= 0)) {
diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php
index 4038bb4b5bc..f9158be9c59 100644
--- a/htdocs/accountancy/customer/list.php
+++ b/htdocs/accountancy/customer/list.php
@@ -110,7 +110,7 @@ if (!isModEnabled('accounting')) {
if ($user->socid > 0) {
accessforbidden();
}
-if (empty($user->rights->accounting->mouvements->lire)) {
+if (!$user->hasRight('accounting', 'mouvements', 'lire')) {
accessforbidden();
}
@@ -229,7 +229,7 @@ if (empty($chartaccountcode)) {
}
// Customer Invoice lines
-$sql = "SELECT f.rowid as facid, f.ref, f.datef, f.type as ftype,";
+$sql = "SELECT f.rowid as facid, f.ref, f.datef, f.type as ftype, f.fk_facture_source,";
$sql .= " l.rowid, l.fk_product, l.description, l.total_ht, l.fk_code_ventilation, l.product_type as type_l, l.tva_tx as tva_tx_line, l.vat_src_code,";
$sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as type, p.tva_tx as tva_tx_prod,";
if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
@@ -579,6 +579,7 @@ if ($result) {
$facture_static->id = $objp->facid;
$facture_static->type = $objp->ftype;
$facture_static->date = $db->jdate($objp->datef);
+ $facture_static->fk_facture_source = $objp->fk_facture_source;
$facture_static_det->id = $objp->rowid;
$facture_static_det->total_ht = $objp->total_ht;
@@ -725,7 +726,7 @@ if ($result) {
// Suggested accounting account
print '';
- print $formaccounting->select_account(($default_account > 0 && $confirm === 'yes' && in_array($objp->rowid."_".$i, $toselect)) ? $default_account : $suggestedid, 'codeventil'.$facture_static_det->id, 1, array(), 0, 0, 'codeventil maxwidth200 maxwidthonsmartphone', 'cachewithshowemptyone');
+ print $formaccounting->select_account(($default_account > 0 && $confirm === 'yes' && in_array($objp->rowid."_".$i, $toselect)) ? $default_account : $suggestedid, 'codeventil'.$facture_static_det->id, 1, array(), 0, 0, 'codeventil maxwidth150 maxwidthonsmartphone', 'cachewithshowemptyone');
print ' ';
// Column with checkbox
diff --git a/htdocs/accountancy/expensereport/lines.php b/htdocs/accountancy/expensereport/lines.php
index 926d03f9235..aef45ae3ce1 100644
--- a/htdocs/accountancy/expensereport/lines.php
+++ b/htdocs/accountancy/expensereport/lines.php
@@ -417,7 +417,7 @@ if ($result) {
print ''.vatrate($objp->tva_tx.($objp->vat_src_code ? ' ('.$objp->vat_src_code.')' : '')).' ';
// Accounting account affected
- print '';
+ print ' ';
print $accountingaccountstatic->getNomUrl(0, 1, 1, '', 1);
print ' ';
print img_edit();
diff --git a/htdocs/accountancy/expensereport/list.php b/htdocs/accountancy/expensereport/list.php
index 7a02d0b4564..b90a8a2c573 100644
--- a/htdocs/accountancy/expensereport/list.php
+++ b/htdocs/accountancy/expensereport/list.php
@@ -503,7 +503,7 @@ if ($result) {
// Suggested accounting account
print ' ';
- print $formaccounting->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1, array(), 0, 0, 'codeventil maxwidth300 maxwidthonsmartphone', 'cachewithshowemptyone');
+ print $formaccounting->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1, array(), 0, 0, 'codeventil maxwidth200 maxwidthonsmartphone', 'cachewithshowemptyone');
print ' ';
print '';
diff --git a/htdocs/accountancy/index.php b/htdocs/accountancy/index.php
index bd7d6273848..628dceafd12 100644
--- a/htdocs/accountancy/index.php
+++ b/htdocs/accountancy/index.php
@@ -113,15 +113,17 @@ if (!empty($conf->global->INVOICE_USE_SITUATION) && $conf->global->INVOICE_USE_S
';
}
-
print load_fiche_titre($langs->trans("AccountancyArea"), $resultboxes['selectboxlist'], 'accountancy', 0, '', '', $showtutorial);
+ if (!empty($conf->global->INVOICE_USE_SITUATION) && $conf->global->INVOICE_USE_SITUATION == 1) {
+ print info_admin($langs->trans("SorryThisModuleIsNotCompatibleWithTheExperimentalFeatureOfSituationInvoices"));
+ print " ";
+ }
+
print ''; // hideobject is to start hidden
print "
\n";
print '
'.$langs->trans("AccountancyAreaDescIntro")." \n";
if ($user->hasRight('accounting', 'chartofaccount')) {
- print "
\n"; print "
\n";
-
print load_fiche_titre('
'.$langs->trans("AccountancyAreaDescActionOnce"), '', '')."\n";
print '
';
print "
\n";
diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php
index f3049206389..3a2f4c40750 100644
--- a/htdocs/accountancy/journal/bankjournal.php
+++ b/htdocs/accountancy/journal/bankjournal.php
@@ -1032,9 +1032,11 @@ if (empty($action) || $action == 'view') {
$salarystatic = new Salary($db);
$variousstatic = new PaymentVarious($db);
- llxHeader('', $langs->trans("FinanceJournal"));
+ $title = $langs->trans("GenerationOfAccountingEntries").' - '.$accountingjournalstatic->getNomUrl(0, 2, 1, '', 1);
- $nom = $langs->trans("FinanceJournal").' | '.$accountingjournalstatic->getNomUrl(0, 1, 1, '', 1);
+ llxHeader('', dol_string_nohtmltag($title));
+
+ $nom = $title;
$builddate = dol_now();
//$description = $langs->trans("DescFinanceJournal") . '
';
$description = $langs->trans("DescJournalOnlyBindedVisible").'
';
@@ -1052,6 +1054,7 @@ if (empty($action) || $action == 'view') {
journalHead($nom, '', $period, $periodlink, $description, $builddate, $exportlink, array('action' => ''), '', $varlink);
+ $desc = '';
// Test that setup is complete (we are in accounting, so test on entity is always on $conf->entity only, no sharing allowed)
$sql = "SELECT COUNT(rowid) as nb FROM ".MAIN_DB_PREFIX."bank_account WHERE entity = ".((int) $conf->entity)." AND fk_accountancy_journal IS NULL AND clos=0";
@@ -1074,7 +1077,7 @@ if (empty($action) || $action == 'view') {
if (($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == "") || $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == '-1'
|| ($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == "") || $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == '-1'
|| empty($conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT) || $conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT == '-1') {
- print '
'.img_warning().' '.$langs->trans("SomeMandatoryStepsOfSetupWereNotDone");
+ print ($desc ? '' : '
').'
'.img_warning().' '.$langs->trans("SomeMandatoryStepsOfSetupWereNotDone");
$desc = ' : '.$langs->trans("AccountancyAreaDescMisc", 4, '{link}');
$desc = str_replace('{link}', '
'.$langs->transnoentitiesnoconv("MenuAccountancy").'-'.$langs->transnoentitiesnoconv("Setup")."-".$langs->transnoentitiesnoconv("MenuDefaultAccounts").' ', $desc);
print $desc;
@@ -1125,8 +1128,8 @@ if (empty($action) || $action == 'view') {
$i = 0;
print '
';
- print "
";
- print "";
+ print '';
+ print '';
print "".$langs->trans("Date")." ";
print "".$langs->trans("Piece").' ('.$langs->trans("ObjectsRef").") ";
print "".$langs->trans("AccountAccounting")." ";
diff --git a/htdocs/accountancy/journal/expensereportsjournal.php b/htdocs/accountancy/journal/expensereportsjournal.php
index d38e49c390e..68e7ebda6ae 100644
--- a/htdocs/accountancy/journal/expensereportsjournal.php
+++ b/htdocs/accountancy/journal/expensereportsjournal.php
@@ -496,14 +496,16 @@ if ($action == 'exportcsv') { // ISO and not UTF8 !
}
if (empty($action) || $action == 'view') {
- llxHeader('', $langs->trans("ExpenseReportsJournal"));
+ $title = $langs->trans("GenerationOfAccountingEntries").' - '.$accountingjournalstatic->getNomUrl(0, 2, 1, '', 1);
- $nom = $langs->trans("ExpenseReportsJournal").' | '.$accountingjournalstatic->getNomUrl(0, 1, 1, '', 1);
+ llxHeader('', dol_string_nohtmltag($title));
+
+ $nom = $title;
$nomlink = '';
$periodlink = '';
$exportlink = '';
$builddate = dol_now();
- $description .= $langs->trans("DescJournalOnlyBindedVisible").' ';
+ $description = $langs->trans("DescJournalOnlyBindedVisible").' ';
$listofchoices = array('notyet'=>$langs->trans("NotYetInGeneralLedger"), 'already'=>$langs->trans("AlreadyInGeneralLedger"));
$period = $form->selectDate($date_start ? $date_start : -1, 'date_start', 0, 0, 0, '', 1, 0).' - '.$form->selectDate($date_end ? $date_end : -1, 'date_end', 0, 0, 0, '', 1, 0);
diff --git a/htdocs/accountancy/journal/purchasesjournal.php b/htdocs/accountancy/journal/purchasesjournal.php
index d2b37c11a87..248b0e41267 100644
--- a/htdocs/accountancy/journal/purchasesjournal.php
+++ b/htdocs/accountancy/journal/purchasesjournal.php
@@ -133,7 +133,7 @@ if (!empty($conf->global->MAIN_COMPANY_PERENTITY_SHARED)) {
$sql .= " WHERE f.fk_statut > 0";
$sql .= " AND fd.fk_code_ventilation > 0";
$sql .= " AND f.entity IN (".getEntity('facture_fourn', 0).")"; // We don't share object for accountancy
-if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
$sql .= " AND f.type IN (".FactureFournisseur::TYPE_STANDARD.",".FactureFournisseur::TYPE_REPLACEMENT.",".FactureFournisseur::TYPE_CREDIT_NOTE.",".FactureFournisseur::TYPE_SITUATION.")";
} else {
$sql .= " AND f.type IN (".FactureFournisseur::TYPE_STANDARD.",".FactureFournisseur::TYPE_REPLACEMENT.",".FactureFournisseur::TYPE_CREDIT_NOTE.",".FactureFournisseur::TYPE_DEPOSIT.",".FactureFournisseur::TYPE_SITUATION.")";
@@ -379,7 +379,7 @@ if ($action == 'writebookkeeping') {
if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) {
require_once DOL_DOCUMENT_ROOT . '/accountancy/class/lettering.class.php';
$lettering_static = new Lettering($db);
- $nb_lettering = $lettering_static->bookkeepingLettering(array($bookkeeping->id), 'supplier_invoice');
+ $nb_lettering = $lettering_static->bookkeepingLettering(array($bookkeeping->id));
}
}
}
@@ -756,15 +756,17 @@ if ($action == 'exportcsv') { // ISO and not UTF8 !
}
if (empty($action) || $action == 'view') {
- llxHeader('', $langs->trans("PurchasesJournal"));
+ $title = $langs->trans("GenerationOfAccountingEntries").' - '.$accountingjournalstatic->getNomUrl(0, 2, 1, '', 1);
- $nom = $langs->trans("PurchasesJournal").' | '.$accountingjournalstatic->getNomUrl(0, 1, 1, '', 1);
+ llxHeader('', dol_string_nohtmltag($title));
+
+ $nom = $title;
$nomlink = '';
$periodlink = '';
$exportlink = '';
$builddate = dol_now();
$description = $langs->trans("DescJournalOnlyBindedVisible").' ';
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
$description .= $langs->trans("DepositsAreNotIncluded");
} else {
$description .= $langs->trans("DepositsAreIncluded");
diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php
index 675c900680d..624b5a22335 100644
--- a/htdocs/accountancy/journal/sellsjournal.php
+++ b/htdocs/accountancy/journal/sellsjournal.php
@@ -393,7 +393,7 @@ if ($action == 'writebookkeeping') {
if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) {
require_once DOL_DOCUMENT_ROOT . '/accountancy/class/lettering.class.php';
$lettering_static = new Lettering($db);
- $nb_lettering = $lettering_static->bookkeepingLettering(array($bookkeeping->id), 'customer_invoice');
+ $nb_lettering = $lettering_static->bookkeepingLettering(array($bookkeeping->id));
}
}
}
@@ -699,9 +699,11 @@ if ($action == 'exportcsv') { // ISO and not UTF8 !
if (empty($action) || $action == 'view') {
- llxHeader('', $langs->trans("SellsJournal"));
+ $title = $langs->trans("GenerationOfAccountingEntries").' - '.$accountingjournalstatic->getNomUrl(0, 2, 1, '', 1);
- $nom = $langs->trans("SellsJournal").' | '.$accountingjournalstatic->getNomUrl(0, 1, 1, '', 1);
+ llxHeader('', dol_string_nohtmltag($title));
+
+ $nom = $title;
$nomlink = '';
$periodlink = '';
$exportlink = '';
diff --git a/htdocs/accountancy/journal/variousjournal.php b/htdocs/accountancy/journal/variousjournal.php
index b56271850e5..b58953043ff 100644
--- a/htdocs/accountancy/journal/variousjournal.php
+++ b/htdocs/accountancy/journal/variousjournal.php
@@ -165,22 +165,18 @@ if ($reload) {
$form = new Form($db);
if ($object->nature == 2) {
- $title = $langs->trans("SellsJournal");
$some_mandatory_steps_of_setup_were_not_done = $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == "" || $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == '-1';
$account_accounting_not_defined = $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == "" || $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == '-1';
} elseif ($object->nature == 3) {
- $title = $langs->trans("PurchasesJournal");
$some_mandatory_steps_of_setup_were_not_done = $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == "" || $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == '-1';
$account_accounting_not_defined = $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == "" || $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == '-1';
} elseif ($object->nature == 4) {
- $title = $langs->trans("FinanceJournal");
$some_mandatory_steps_of_setup_were_not_done = $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == "" || $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == '-1'
|| $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == "" || $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == '-1'
|| empty($conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT) || $conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT == '-1';
$account_accounting_not_defined = $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == "" || $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == '-1'
|| $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == "" || $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == '-1';
} elseif ($object->nature == 5) {
- $title = $langs->trans("ExpenseReportsJournal");
$some_mandatory_steps_of_setup_were_not_done = empty($conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT) || $conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT == '-1';
$account_accounting_not_defined = empty($conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT) || $conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT == '-1';
} else {
@@ -189,8 +185,11 @@ if ($object->nature == 2) {
$account_accounting_not_defined = false;
}
+$title = $langs->trans("GenerationOfAccountingEntries") . ' - ' . $object->getNomUrl(0, 2, 1, '', 1);
-$nom = $title . ' | ' . $object->getNomUrl(0, 1, 1, '', 1);
+llxHeader('', dol_string_nohtmltag($title));
+
+$nom = $title;
$nomlink = '';
$periodlink = '';
$exportlink = '';
@@ -202,6 +201,9 @@ if ($object->nature == 2 || $object->nature == 3) {
} else {
$description .= $langs->trans("DepositsAreIncluded");
}
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $description .= $langs->trans("SupplierDepositsAreNotIncluded");
+ }
}
$listofchoices = array('notyet' => $langs->trans("NotYetInGeneralLedger"), 'already' => $langs->trans("AlreadyInGeneralLedger"));
@@ -210,8 +212,6 @@ $period .= ' - ' . $langs->trans("JournalizationInLedgerStatus") . ' ' . $form-
$varlink = 'id_journal=' . $id_journal;
-llxHeader('', $title);
-
journalHead($nom, $nomlink, $period, $periodlink, $description, $builddate, $exportlink, array('action' => ''), '', $varlink);
if ($object->nature == 4) { // Bank journal
@@ -290,19 +290,21 @@ print '' . $langs->trans("Debit") . ' ';
print '' . $langs->trans("Credit") . ' ';
print " \n";
-foreach ($journal_data as $element_id => $element) {
- foreach ($element['blocks'] as $lines) {
- foreach ($lines as $line) {
- print '';
- print '' . $line['date'] . ' ';
- print '' . $line['piece'] . ' ';
- print '' . $line['account_accounting'] . ' ';
- print '' . $line['subledger_account'] . ' ';
- print '' . $line['label_operation'] . ' ';
- if ($object->nature == 4) print '' . $line['payment_mode'] . ' ';
- print '' . $line['debit'] . ' ';
- print '' . $line['credit'] . ' ';
- print ' ';
+if (is_array($journal_data) && !empty($journal_data)) {
+ foreach ($journal_data as $element_id => $element) {
+ foreach ($element['blocks'] as $lines) {
+ foreach ($lines as $line) {
+ print '';
+ print '' . $line['date'] . ' ';
+ print '' . $line['piece'] . ' ';
+ print '' . $line['account_accounting'] . ' ';
+ print '' . $line['subledger_account'] . ' ';
+ print '' . $line['label_operation'] . ' ';
+ if ($object->nature == 4) print '' . $line['payment_mode'] . ' ';
+ print '' . $line['debit'] . ' ';
+ print '' . $line['credit'] . ' ';
+ print ' ';
+ }
}
}
}
diff --git a/htdocs/accountancy/supplier/index.php b/htdocs/accountancy/supplier/index.php
index 2237b4347ca..b214b89734c 100644
--- a/htdocs/accountancy/supplier/index.php
+++ b/htdocs/accountancy/supplier/index.php
@@ -140,7 +140,7 @@ if ($action == 'validatehistory') {
}*/
// Supplier Invoice Lines (must be same request than into page list.php for manual binding)
- $sql = "SELECT f.rowid as facid, f.ref, f.ref_supplier, f.libelle as invoice_label, f.datef, f.type as ftype,";
+ $sql = "SELECT f.rowid as facid, f.ref, f.ref_supplier, f.libelle as invoice_label, f.datef, f.type as ftype, f.fk_facture_source,";
$sql .= " l.rowid, l.fk_product, l.description, l.total_ht, l.fk_code_ventilation, l.product_type as type_l, l.tva_tx as tva_tx_line, l.vat_src_code,";
$sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as type, p.tva_tx as tva_tx_prod,";
if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
@@ -233,7 +233,10 @@ if ($action == 'validatehistory') {
$facture_static->ref = $objp->ref;
$facture_static->id = $objp->facid;
$facture_static->type = $objp->ftype;
- $facture_static->date = $objp->datef;
+ $facture_static->ref_supplier = $objp->ref_supplier;
+ $facture_static->label = $objp->invoice_label;
+ $facture_static->date = $db->jdate($objp->datef);
+ $facture_static->fk_facture_source = $objp->fk_facture_source;
$facture_static_det->id = $objp->rowid;
$facture_static_det->total_ht = $objp->total_ht;
diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php
index d14beb84cc2..ded50694a62 100644
--- a/htdocs/accountancy/supplier/list.php
+++ b/htdocs/accountancy/supplier/list.php
@@ -232,7 +232,7 @@ if (empty($chartaccountcode)) {
}
// Supplier Invoice Lines
-$sql = "SELECT f.rowid as facid, f.ref, f.ref_supplier, f.libelle as invoice_label, f.datef, f.type as ftype,";
+$sql = "SELECT f.rowid as facid, f.ref, f.ref_supplier, f.libelle as invoice_label, f.datef, f.type as ftype, f.fk_facture_source,";
$sql .= " l.rowid, l.fk_product, l.description, l.total_ht, l.fk_code_ventilation, l.product_type as type_l, l.tva_tx as tva_tx_line, l.vat_src_code,";
$sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as type, p.tva_tx as tva_tx_prod,";
if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
@@ -342,7 +342,7 @@ if (strlen(trim($search_country))) {
if (strlen(trim($search_tvaintra))) {
$sql .= natural_search("s.tva_intra", $search_tvaintra);
}
-if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
$sql .= " AND f.type IN (".FactureFournisseur::TYPE_STANDARD.",".FactureFournisseur::TYPE_REPLACEMENT.",".FactureFournisseur::TYPE_CREDIT_NOTE.",".FactureFournisseur::TYPE_SITUATION.")";
} else {
$sql .= " AND f.type IN (".FactureFournisseur::TYPE_STANDARD.",".FactureFournisseur::TYPE_REPLACEMENT.",".FactureFournisseur::TYPE_CREDIT_NOTE.",".FactureFournisseur::TYPE_DEPOSIT.",".FactureFournisseur::TYPE_SITUATION.")";
@@ -592,6 +592,7 @@ if ($result) {
$facturefourn_static->ref_supplier = $objp->ref_supplier;
$facturefourn_static->label = $objp->invoice_label;
$facturefourn_static->date = $db->jdate($objp->datef);
+ $facturefourn_static->fk_facture_source = $objp->fk_facture_source;
$facturefourn_static_det->id = $objp->rowid;
$facturefourn_static_det->total_ht = $objp->total_ht;
@@ -749,7 +750,7 @@ if ($result) {
// Suggested accounting account
print '';
- print $formaccounting->select_account(($default_account > 0 && $confirm === 'yes' && in_array($objp->rowid."_".$i, $toselect)) ? $default_account : $suggestedid, 'codeventil'.$facturefourn_static_det->id, 1, array(), 0, 0, 'codeventil maxwidth200 maxwidthonsmartphone', 'cachewithshowemptyone');
+ print $formaccounting->select_account(($default_account > 0 && $confirm === 'yes' && in_array($objp->rowid."_".$i, $toselect)) ? $default_account : $suggestedid, 'codeventil'.$facturefourn_static_det->id, 1, array(), 0, 0, 'codeventil maxwidth150 maxwidthonsmartphone', 'cachewithshowemptyone');
print ' ';
// Column with checkbox
diff --git a/htdocs/adherents/admin/member.php b/htdocs/adherents/admin/member.php
index c94084358bd..d20bd784ced 100644
--- a/htdocs/adherents/admin/member.php
+++ b/htdocs/adherents/admin/member.php
@@ -100,7 +100,7 @@ if ($action == 'set_default') {
} else {
dol_print_error($db);
}
-} elseif ($action == 'updateall') {
+} elseif ($action == 'updatemainoptions') {
$db->begin();
$res1 = $res2 = $res3 = $res4 = $res5 = $res6 = $res7 = 0;
$res1 = dolibarr_set_const($db, 'ADHERENT_LOGIN_NOT_REQUIRED', GETPOST('ADHERENT_LOGIN_NOT_REQUIRED', 'alpha') ? 0 : 1, 'chaine', 0, '', $conf->entity);
@@ -123,6 +123,35 @@ if ($action == 'set_default') {
setEventMessages('RecordModifiedSuccessfully', null, 'mesgs');
$db->commit();
}
+} elseif ($action == 'updatememberscards') {
+ $db->begin();
+ $res1 = $res2 = $res3 = $res4 = 0;
+ $res1 = dolibarr_set_const($db, 'ADHERENT_CARD_TYPE', GETPOST('ADHERENT_CARD_TYPE'), 'chaine', 0, '', $conf->entity);
+ $res2 = dolibarr_set_const($db, 'ADHERENT_CARD_HEADER_TEXT', GETPOST('ADHERENT_CARD_HEADER_TEXT', 'alpha'), 'chaine', 0, '', $conf->entity);
+ $res3 = dolibarr_set_const($db, 'ADHERENT_CARD_TEXT', GETPOST('ADHERENT_CARD_TEXT', 'alpha'), 'chaine', 0, '', $conf->entity);
+ $res3 = dolibarr_set_const($db, 'ADHERENT_CARD_TEXT_RIGHT', GETPOST('ADHERENT_CARD_TEXT_RIGHT', 'alpha'), 'chaine', 0, '', $conf->entity);
+ $res4 = dolibarr_set_const($db, 'ADHERENT_CARD_FOOTER_TEXT', GETPOST('ADHERENT_CARD_FOOTER_TEXT', 'alpha'), 'chaine', 0, '', $conf->entity);
+
+ if ($res1 < 0 || $res2 < 0 || $res3 < 0 || $res4 < 0) {
+ setEventMessages('ErrorFailedToSaveDate', null, 'errors');
+ $db->rollback();
+ } else {
+ setEventMessages('RecordModifiedSuccessfully', null, 'mesgs');
+ $db->commit();
+ }
+} elseif ($action == 'updatememberstickets') {
+ $db->begin();
+ $res1 = $res2 = 0;
+ $res1 = dolibarr_set_const($db, 'ADHERENT_ETIQUETTE_TYPE', GETPOST('ADHERENT_ETIQUETTE_TYPE'), 'chaine', 0, '', $conf->entity);
+ $res2 = dolibarr_set_const($db, 'ADHERENT_ETIQUETTE_TEXT', GETPOST('ADHERENT_ETIQUETTE_TEXT', 'alpha'), 'chaine', 0, '', $conf->entity);
+
+ if ($res1 < 0 || $res2 < 0) {
+ setEventMessages('ErrorFailedToSaveDate', null, 'errors');
+ $db->rollback();
+ } else {
+ setEventMessages('RecordModifiedSuccessfully', null, 'mesgs');
+ $db->commit();
+ }
}
// Action to update or add a constant
@@ -130,6 +159,7 @@ if ($action == 'update' || $action == 'add') {
$constname = GETPOST('constname', 'alpha');
$constvalue = (GETPOST('constvalue_'.$constname) ? GETPOST('constvalue_'.$constname) : GETPOST('constvalue'));
+
if (($constname == 'ADHERENT_CARD_TYPE' || $constname == 'ADHERENT_ETIQUETTE_TYPE' || $constname == 'ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS') && $constvalue == -1) {
$constvalue = '';
}
@@ -195,10 +225,10 @@ print dol_get_fiche_head($head, 'general', $langs->trans("Members"), -1, 'user')
print '';
print ' ';
+// Document templates for documents generated from member record
+
$dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
// Defined model definition table
@@ -431,24 +463,12 @@ print '';
-/*
-TODO Use a global form instead of embeded form into table
+
+// Generation of cards for members
+
print '';
print ' ';
+// Membership address sheet
-/*
- * Edit info of model document
- */
-$constantes = array('ADHERENT_ETIQUETTE_TYPE', 'ADHERENT_ETIQUETTE_TEXT');
+print '';
+print ' ';
+print ' ';
print load_fiche_titre($langs->trans("MembersTickets"), '', '');
@@ -474,9 +544,42 @@ $helptext .= '__DOL_MAIN_URL_ROOT__, __ID__, __FIRSTNAME__, __LASTNAME__, __FULL
$helptext .= '__COMPANY__, __ADDRESS__, __ZIP__, __TOWN__, __COUNTRY__, __EMAIL__, __BIRTH__, __PHOTO__, __TYPE__, ';
$helptext .= '__YEAR__, __MONTH__, __DAY__';
-form_constantes($constantes, 0, $helptext);
+print '';
+print '
';
+print '';
+print ''.$langs->trans("Description").' ';
+print ''.$form->textwithpicto($langs->trans("Value"), $helptext, 1, 'help', '', 0, 2, 'idhelptext').' ';
+print " \n";
-//print '';
+// Format of labels page
+print ''.$langs->trans("DescADHERENT_ETIQUETTE_TYPE").' ';
+
+require_once DOL_DOCUMENT_ROOT.'/core/lib/format_cards.lib.php'; // List of possible labels (defined into $_Avery_Labels variable set into format_cards.lib.php)
+$arrayoflabels = array();
+foreach (array_keys($_Avery_Labels) as $codecards) {
+ $arrayoflabels[$codecards] = $_Avery_Labels[$codecards]['name'];
+}
+print $form->selectarray('ADHERENT_ETIQUETTE_TYPE', $arrayoflabels, getDolGlobalString('ADHERENT_ETIQUETTE_TYPE') ? getDolGlobalString('ADHERENT_ETIQUETTE_TYPE') : 'CARD', 1, 0, 0);
+
+print " \n";
+
+// Text printed on member address sheets
+print ''.$langs->trans("DescADHERENT_ETIQUETTE_TEXT").' ';
+print ''."\n";
+print getDolGlobalString('ADHERENT_ETIQUETTE_TEXT');
+print ' ';
+print " \n";
+
+print '
';
+print '
';
+
+print '';
+print ' ';
+print '
';
+
+print ' ';
+
+print ' ';
print " ";
diff --git a/htdocs/adherents/canvas/default/tpl/adherentcard_view.tpl.php b/htdocs/adherents/canvas/default/tpl/adherentcard_view.tpl.php
index 4b0eed154c0..14da758457f 100644
--- a/htdocs/adherents/canvas/default/tpl/adherentcard_view.tpl.php
+++ b/htdocs/adherents/canvas/default/tpl/adherentcard_view.tpl.php
@@ -133,7 +133,7 @@ if (empty($user->socid)) {
}
if ($user->rights->adherent->supprimer) {
- echo 'control->tpl['id'].'&action=delete&token='.newToken().'&canvas='.$canvas.'">'.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$this->control->tpl['id'].'&action=delete&token='.newToken().'&canvas='.$canvas, 'delete', $user->rights->adherent->supprimer);
}
echo ' ';
diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php
index e0f6b693eb7..1c564aa9bf0 100644
--- a/htdocs/adherents/card.php
+++ b/htdocs/adherents/card.php
@@ -98,14 +98,14 @@ if ($id > 0 || !empty($ref)) {
$result = $object->fetch($id, $ref);
// Define variables to know what current user can do on users
- $canadduser = ($user->admin || $user->rights->user->user->creer);
+ $canadduser = ($user->admin || $user->hasRight('user', 'user', 'creer'));
// Define variables to know what current user can do on properties of user linked to edited member
if ($object->user_id) {
// $User is the user who edits, $object->user_id is the id of the related user in the edited member
- $caneditfielduser = ((($user->id == $object->user_id) && $user->rights->user->self->creer)
- || (($user->id != $object->user_id) && $user->rights->user->user->creer));
- $caneditpassworduser = ((($user->id == $object->user_id) && $user->rights->user->self->password)
- || (($user->id != $object->user_id) && $user->rights->user->user->password));
+ $caneditfielduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'creer'))
+ || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'creer')));
+ $caneditpassworduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'password'))
+ || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'password')));
}
}
@@ -154,9 +154,9 @@ if (empty($reshook)) {
$action = '';
}
- if ($action == 'setuserid' && ($user->rights->user->self->creer || $user->rights->user->user->creer)) {
+ if ($action == 'setuserid' && ($user->hasRight('user', 'self', 'creer') || $user->hasRight('user', 'user', 'creer'))) {
$error = 0;
- if (empty($user->rights->user->user->creer)) { // If can edit only itself user, we can link to itself only
+ if (!$user->hasRight('user', 'user', 'creer')) { // If can edit only itself user, we can link to itself only
if ($userid != $user->id && $userid != $object->user_id) {
$error++;
setEventMessages($langs->trans("ErrorUserPermissionAllowsToLinksToItselfOnly"), null, 'errors');
@@ -206,7 +206,7 @@ if (empty($reshook)) {
}
// Create user from a member
- if ($action == 'confirm_create_user' && $confirm == 'yes' && $user->rights->user->user->creer) {
+ if ($action == 'confirm_create_user' && $confirm == 'yes' && $user->hasRight('user', 'user', 'creer')) {
if ($result > 0) {
// Creation user
$nuser = new User($db);
@@ -230,7 +230,7 @@ if (empty($reshook)) {
}
// Create third party from a member
- if ($action == 'confirm_create_thirdparty' && $confirm == 'yes' && $user->rights->societe->creer) {
+ if ($action == 'confirm_create_thirdparty' && $confirm == 'yes' && $user->hasRight('societe', 'creer')) {
if ($result > 0) {
// User creation
$company = new Societe($db);
@@ -585,7 +585,10 @@ if (empty($reshook)) {
$db->commit();
$rowid = $object->id;
$id = $object->id;
+
+ $backtopage = preg_replace('/__ID__/', $id, $backtopage);
} else {
+ $error++;
$db->rollback();
setEventMessages($object->error, $object->errors, 'errors');
}
@@ -614,7 +617,7 @@ if (empty($reshook)) {
}
}
- if ($user->rights->adherent->supprimer && $action == 'confirm_delete' && $confirm == 'yes') {
+ if ($user->hasRight('adherent', 'supprimer') && $action == 'confirm_delete' && $confirm == 'yes') {
$result = $object->delete($id, $user);
if ($result > 0) {
if (!empty($backtopage)) {
@@ -703,7 +706,7 @@ if (empty($reshook)) {
$action = '';
}
- if ($user->rights->adherent->supprimer && $action == 'confirm_resiliate') {
+ if ($user->hasRight('adherent', 'supprimer') && $action == 'confirm_resiliate') {
$error = 0;
if ($confirm == 'yes') {
@@ -774,7 +777,7 @@ if (empty($reshook)) {
}
}
- if ($user->rights->adherent->supprimer && $action == 'confirm_exclude') {
+ if ($user->hasRight('adherent', 'supprimer') && $action == 'confirm_exclude') {
$error = 0;
if ($confirm == 'yes') {
@@ -846,7 +849,7 @@ if (empty($reshook)) {
}
// SPIP Management
- if ($user->rights->adherent->supprimer && $action == 'confirm_del_spip' && $confirm == 'yes') {
+ if ($user->hasRight('adherent', 'supprimer') && $action == 'confirm_del_spip' && $confirm == 'yes') {
if (!count($object->errors)) {
if (!$mailmanspip->del_to_spip($object)) {
setEventMessages($langs->trans('DeleteIntoSpipError').': '.$mailmanspip->error, null, 'errors');
@@ -1041,8 +1044,8 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
print ''.img_picto('', 'object_email').' ';
// Website
- print ''.$form->editfieldkey('Web', 'member_url', '', $object, 0).' ';
- print ''.img_picto('', 'globe').' ';
+ print ''.$form->editfieldkey('Web', 'member_url', GETPOST('member_url', 'alpha'), $object, 0).' ';
+ print ''.img_picto('', 'globe').' ';
// Address
print ''.$langs->trans("Address").' ';
@@ -1115,7 +1118,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
print " \n";
// Categories
- if (isModEnabled('categorie') && !empty($user->rights->categorie->lire)) {
+ if (isModEnabled('categorie') && $user->hasRight('categorie', 'lire')) {
print ''.$form->editfieldkey("Categories", 'memcats', '', $object, 0).' ';
$cate_arbo = $form->select_all_categories(Categorie::TYPE_MEMBER, null, 'parent', null, null, 1);
print img_picto('', 'category').$form->multiselectarray('memcats', $cate_arbo, GETPOST('memcats', 'array'), null, null, 'quatrevingtpercent widthcentpercentminusx', 0, 0);
@@ -1364,7 +1367,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
print " \n";
// Categories
- if (isModEnabled('categorie') && !empty($user->rights->categorie->lire)) {
+ if (isModEnabled('categorie') && $user->hasRight('categorie', 'lire')) {
print ''.$form->editfieldkey("Categories", 'memcats', '', $object, 0).' ';
print '';
$cate_arbo = $form->select_all_categories(Categorie::TYPE_MEMBER, null, null, null, null, 1);
@@ -1722,10 +1725,12 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
}
// Type
- print ' '.$langs->trans("Type").' '.$adht->getNomUrl(1)." \n";
+ print ''.$langs->trans("Type").' ';
+ print ''.$adht->getNomUrl(1)." \n";
// Morphy
- print ''.$langs->trans("MemberNature").' '.$object->getmorphylib().' ';
+ print ''.$langs->trans("MemberNature").' ';
+ print ''.$object->getmorphylib('', 1).' ';
print ' ';
// Company
@@ -1788,7 +1793,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
print '';
// Tags / Categories
- if (isModEnabled('categorie') && !empty($user->rights->categorie->lire)) {
+ if (isModEnabled('categorie') && $user->hasRight('categorie', 'lire')) {
print ''.$langs->trans("Categories").' ';
print '';
print $form->showCategories($object->id, Categorie::TYPE_MEMBER, 1);
@@ -1857,7 +1862,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
// Login Dolibarr - Link to user
print ' ';
- $editenable = $user->hasRight('adherent', 'creer') && $user->rights->user->user->creer;
+ $editenable = $user->hasRight('adherent', 'creer') && $user->hasRight('user', 'user', 'creer');
print $form->editfieldkey('LinkedToDolibarrUser', 'login', '', $object, $editenable);
print ' ';
if ($action == 'editlogin') {
@@ -1894,7 +1899,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
// Send
if (empty($user->socid)) {
if (Adherent::STATUS_VALIDATED == $object->statut) {
- print 'id.'&action=presend&mode=init#formmailbeforetitle">'.$langs->trans('SendMail').' '."\n";
+ print 'id).'&action=presend&mode=init#formmailbeforetitle">'.$langs->trans('SendMail').' '."\n";
}
}
@@ -1914,7 +1919,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
// Modify
if ($user->hasRight('adherent', 'creer')) {
- print ''.$langs->trans("Modify").' '."\n";
+ print ''.$langs->trans("Modify").' '."\n";
} else {
print ''.$langs->trans("Modify").' '."\n";
}
@@ -1922,7 +1927,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
// Validate
if (Adherent::STATUS_DRAFT == $object->statut) {
if ($user->hasRight('adherent', 'creer')) {
- print ''.$langs->trans("Validate").' '."\n";
+ print ''.$langs->trans("Validate").' '."\n";
} else {
print ''.$langs->trans("Validate").' '."\n";
}
@@ -1931,7 +1936,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
// Reactivate
if (Adherent::STATUS_RESILIATED == $object->statut || Adherent::STATUS_EXCLUDED == $object->statut) {
if ($user->hasRight('adherent', 'creer')) {
- print ''.$langs->trans("Reenable")." \n";
+ print ''.$langs->trans("Reenable")." \n";
} else {
print ''.$langs->trans("Reenable").' '."\n";
}
@@ -1939,8 +1944,8 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
// Resiliate
if (Adherent::STATUS_VALIDATED == $object->statut) {
- if ($user->rights->adherent->supprimer) {
- print ''.$langs->trans("Resiliate")." \n";
+ if ($user->hasRight('adherent', 'supprimer')) {
+ print ''.$langs->trans("Resiliate")." \n";
} else {
print ''.$langs->trans("Resiliate").' '."\n";
}
@@ -1948,8 +1953,8 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
// Exclude
if (Adherent::STATUS_VALIDATED == $object->statut) {
- if ($user->rights->adherent->supprimer) {
- print ''.$langs->trans("Exclude")." \n";
+ if ($user->hasRight('adherent', 'supprimer')) {
+ print ''.$langs->trans("Exclude")." \n";
} else {
print ''.$langs->trans("Exclude").' '."\n";
}
@@ -1957,9 +1962,9 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
// Create third party
if (isModEnabled('societe') && !$object->socid) {
- if ($user->rights->societe->creer) {
+ if ($user->hasRight('societe', 'creer')) {
if (Adherent::STATUS_DRAFT != $object->statut) {
- print 'id.'&action=create_thirdparty" title="'.dol_escape_htmltag($langs->trans("CreateDolibarrThirdPartyDesc")).'">'.$langs->trans("CreateDolibarrThirdParty").' '."\n";
+ print 'id).'&action=create_thirdparty" title="'.dol_escape_htmltag($langs->trans("CreateDolibarrThirdPartyDesc")).'">'.$langs->trans("CreateDolibarrThirdParty").' '."\n";
} else {
print ''.$langs->trans("CreateDolibarrThirdParty").' '."\n";
}
@@ -1970,9 +1975,9 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
// Create user
if (!$user->socid && !$object->user_id) {
- if ($user->rights->user->user->creer) {
+ if ($user->hasRight('user', 'user', 'creer')) {
if (Adherent::STATUS_DRAFT != $object->statut) {
- print 'id.'&action=create_user" title="'.dol_escape_htmltag($langs->trans("CreateDolibarrLoginDesc")).'">'.$langs->trans("CreateDolibarrLogin").' '."\n";
+ print 'id).'&action=create_user" title="'.dol_escape_htmltag($langs->trans("CreateDolibarrLoginDesc")).'">'.$langs->trans("CreateDolibarrLogin").' '."\n";
} else {
print ''.$langs->trans("CreateDolibarrLogin").' '."\n";
}
@@ -1986,16 +1991,16 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
$isinspip = $mailmanspip->is_in_spip($object);
if ($isinspip == 1) {
- print ''.$langs->trans("DeleteIntoSpip").' '."\n";
+ print ''.$langs->trans("DeleteIntoSpip").' '."\n";
}
if ($isinspip == 0) {
- print ''.$langs->trans("AddIntoSpip").' '."\n";
+ print ''.$langs->trans("AddIntoSpip").' '."\n";
}
}
// Delete
- if ($user->rights->adherent->supprimer) {
- print ''.$langs->trans("Delete").' '."\n";
+ if ($user->hasRight('adherent', 'supprimer')) {
+ print ''.$langs->trans("Delete").' '."\n";
} else {
print ''.$langs->trans("Delete").' '."\n";
}
@@ -2021,7 +2026,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
$filename = dol_sanitizeFileName($object->ref);
$filedir = $conf->adherent->dir_output.'/'.get_exdir(0, 0, 0, 1, $object, 'member');
$urlsource = $_SERVER['PHP_SELF'].'?id='.$object->id;
- $genallowed = $user->rights->adherent->lire;
+ $genallowed = $user->hasRight('adherent', 'lire');
$delallowed = $user->hasRight('adherent', 'creer');
print $formfile->showdocuments('member', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', '', '', (empty($object->default_lang) ? '' : $object->default_lang), '', $object);
diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php
index 0aa1af68afc..491899a3370 100644
--- a/htdocs/adherents/class/adherent.class.php
+++ b/htdocs/adherents/class/adherent.class.php
@@ -520,21 +520,51 @@ class Adherent extends CommonObject
* Return translated label by the nature of a adherent (physical or moral)
*
* @param string $morphy Nature of the adherent (physical or moral)
+ * @param int $addbadge Add badge (1=Full label, 2=First letters only)
* @return string Label
*/
- public function getmorphylib($morphy = '')
+ public function getmorphylib($morphy = '', $addbadge = 0)
{
global $langs;
+
+ // Clean var
if (!$morphy) {
$morphy = $this->morphy;
}
- if ($morphy == 'phy') {
- return $langs->trans("Physical");
+
+ if ($addbadge) {
+ $s = '';
+ $labeltoshowm = $langs->trans("Moral");
+ $labeltoshowp = $langs->trans("Physical");
+ if ($morphy == 'phy') {
+ $labeltoshow = $labeltoshowp;
+ if ($addbadge == 2) {
+ $labeltoshow = dol_strtoupper(dolGetFirstLetters($labeltoshowp));
+ if ($labeltoshow == dol_strtoupper(dolGetFirstLetters($labeltoshowm))) {
+ $labeltoshow = dol_strtoupper(dolGetFirstLetters($labeltoshowp, 2));
+ }
+ }
+ $s .= ''.$labeltoshow.' ';
+ }
+ if ($morphy == 'mor') {
+ $labeltoshow = $labeltoshowm;
+ if ($addbadge == 2) {
+ $labeltoshow = dol_strtoupper(dolGetFirstLetters($labeltoshowm));
+ if ($labeltoshow == dol_strtoupper(dolGetFirstLetters($labeltoshowp))) {
+ $labeltoshow = dol_strtoupper(dolGetFirstLetters($labeltoshowm, 2));
+ }
+ }
+ $s .= ''.$labeltoshow.' ';
+ }
+ } else {
+ if ($morphy == 'phy') {
+ $s = $langs->trans("Physical");
+ } elseif ($morphy == 'mor') {
+ $s = $langs->trans("Moral");
+ }
}
- if ($morphy == 'mor') {
- return $langs->trans("Moral");
- }
- return $morphy;
+
+ return $s;
}
/**
@@ -710,7 +740,7 @@ class Adherent extends CommonObject
$sql .= ", state_id = ".($this->state_id > 0 ? $this->db->escape($this->state_id) : "null");
$sql .= ", email = '".$this->db->escape($this->email)."'";
$sql .= ", url = ".(!empty($this->url) ? "'".$this->db->escape($this->url)."'" : "null");
- $sql .= ", socialnetworks = '".$this->db->escape(json_encode($this->socialnetworks))."'";
+ $sql .= ", socialnetworks = ".($this->socialnetworks ? "'".$this->db->escape(json_encode($this->socialnetworks))."'" : "null");
$sql .= ", phone = ".($this->phone ? "'".$this->db->escape($this->phone)."'" : "null");
$sql .= ", phone_perso = ".($this->phone_perso ? "'".$this->db->escape($this->phone_perso)."'" : "null");
$sql .= ", phone_mobile = ".($this->phone_mobile ? "'".$this->db->escape($this->phone_mobile)."'" : "null");
@@ -2352,8 +2382,8 @@ class Adherent extends CommonObject
$statusType = 'status1';
$labelStatus = $langs->trans("MemberStatusActive");
$labelStatusShort = $langs->trans("MemberStatusActiveShort");
- } elseif ($date_end_subscription < dol_now()) {
- $statusType = 'status3';
+ } elseif ($date_end_subscription < dol_now()) { // expired
+ $statusType = 'status8';
$labelStatus = $langs->trans("MemberStatusActiveLate");
$labelStatusShort = $langs->trans("MemberStatusActiveLateShort");
} else {
@@ -2927,17 +2957,18 @@ class Adherent extends CommonObject
dol_syslog(__METHOD__.' - Process delta = '.$daysbeforeend, LOG_DEBUG);
if (!is_numeric($daysbeforeend)) {
- $blockingerrormsg = "Value for delta is not a positive or negative numeric";
+ $blockingerrormsg = "Value for delta is not a numeric value";
$nbko++;
break;
}
$tmp = dol_getdate($now);
- $datetosearchfor = dol_time_plus_duree(dol_mktime(0, 0, 0, $tmp['mon'], $tmp['mday'], $tmp['year']), $daysbeforeend, 'd');
+ $datetosearchfor = dol_time_plus_duree(dol_mktime(0, 0, 0, $tmp['mon'], $tmp['mday'], $tmp['year'], 'tzserver'), $daysbeforeend, 'd');
$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'adherent';
- $sql .= " WHERE entity = ".$conf->entity; // Do not use getEntity('adherent').")" here, we want the batch to be on its entity only;
+ $sql .= " WHERE entity = ".((int) $conf->entity); // Do not use getEntity('adherent').")" here, we want the batch to be on its entity only;
$sql .= " AND datefin = '".$this->db->idate($datetosearchfor)."'";
+ //$sql .= " LIMIT 10000";
$resql = $this->db->query($sql);
if ($resql) {
@@ -2970,7 +3001,7 @@ class Adherent extends CommonObject
dol_syslog("sendReminderForExpiredSubscription Language for member id ".$adherent->id." set to ".$outputlangs->defaultlang." mysoc->default_lang=".$mysoc->default_lang);
$arraydefaultmessage = null;
- $labeltouse = $conf->global->ADHERENT_EMAIL_TEMPLATE_REMIND_EXPIRATION;
+ $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_REMIND_EXPIRATION');
if (!empty($labeltouse)) {
$arraydefaultmessage = $formmail->getEMailTemplate($this->db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
@@ -2994,7 +3025,7 @@ class Adherent extends CommonObject
$result = $cmail->sendfile();
if (!$result) {
$error++;
- $this->error = $cmail->error;
+ $this->error .= $cmail->error.' ';
if (!is_null($cmail->errors)) {
$this->errors += $cmail->errors;
}
@@ -3012,8 +3043,7 @@ class Adherent extends CommonObject
$extraparams = '';
$actionmsg = '';
- $actionmsg2 = $langs->transnoentities('MailSentBy').' '.CMailFile::getValidAddress($from, 4, 0, 1).' '.$langs->transnoentities('To').' '.
- CMailFile::getValidAddress($sendto, 4, 0, 1);
+ $actionmsg2 = $langs->transnoentities('MailSentBy').' '.CMailFile::getValidAddress($from, 4, 0, 1).' '.$langs->transnoentities('To').' '.CMailFile::getValidAddress($sendto, 4, 0, 1);
if ($message) {
$actionmsg = $langs->transnoentities('MailFrom').': '.dol_escape_htmltag($from);
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTo').': '.dol_escape_htmltag($sendto));
@@ -3060,7 +3090,10 @@ class Adherent extends CommonObject
$actioncomm->create($user);
}
} else {
- $blockingerrormsg = "Can't find email template, defined into member module setup, to use for reminding";
+ //$blockingerrormsg = "Can't find email template with label=".$labeltouse.", to use for the reminding email";
+
+ $error++;
+ $this->error .= "Can't find email template with label=".$labeltouse.", to use for the reminding email ";
$nbko++;
$listofmembersko[$adherent->id] = $adherent->id;
@@ -3102,7 +3135,7 @@ class Adherent extends CommonObject
if ($listofids) {
$listofids .= ']';
}
- $this->output .= $listofids;
+ $this->output .= ' ids='.$listofids;
}
if ($nbko) {
$this->output .= ' - Canceled for '.$nbko.' member (no email or email sending error)';
@@ -3130,6 +3163,6 @@ class Adherent extends CommonObject
}
}
- return 0;
+ return $nbko;
}
}
diff --git a/htdocs/adherents/class/api_members.class.php b/htdocs/adherents/class/api_members.class.php
index 35ab65e9d82..8308c71fac0 100644
--- a/htdocs/adherents/class/api_members.class.php
+++ b/htdocs/adherents/class/api_members.class.php
@@ -480,11 +480,11 @@ class Members extends DolibarrApi
/**
* Add a subscription for a member
*
- * @param int $id ID of member
- * @param int $start_date Start date {@from body} {@type timestamp}
- * @param int $end_date End date {@from body} {@type timestamp}
- * @param float $amount Amount (may be 0) {@from body}
- * @param string $label Label {@from body}
+ * @param int $id ID of member
+ * @param string $start_date Start date {@from body} {@type timestamp}
+ * @param string $end_date End date {@from body} {@type timestamp}
+ * @param float $amount Amount (may be 0) {@from body}
+ * @param string $label Label {@from body}
* @return int ID of subscription
*
* @url POST {id}/subscriptions
diff --git a/htdocs/adherents/document.php b/htdocs/adherents/document.php
index bce8227ab57..4517bee15c6 100644
--- a/htdocs/adherents/document.php
+++ b/htdocs/adherents/document.php
@@ -76,14 +76,14 @@ if ($id > 0 || !empty($ref)) {
$result = $object->fetch($id, $ref);
// Define variables to know what current user can do on users
- $canadduser = ($user->admin || $user->rights->user->user->creer);
+ $canadduser = ($user->admin || $user->hasRight('user', 'user', 'creer'));
// Define variables to know what current user can do on properties of user linked to edited member
if ($object->user_id) {
// $User is the user who edits, $object->user_id is the id of the related user in the edited member
- $caneditfielduser = ((($user->id == $object->user_id) && $user->rights->user->self->creer)
- || (($user->id != $object->user_id) && $user->rights->user->user->creer));
- $caneditpassworduser = ((($user->id == $object->user_id) && $user->rights->user->self->password)
- || (($user->id != $object->user_id) && $user->rights->user->user->password));
+ $caneditfielduser = ((($user->id == $object->user_id) && $$user->hasRight('user', 'self', 'creer'))
+ || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'creer')));
+ $caneditpassworduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'password'))
+ || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'password')));
}
}
@@ -158,13 +158,12 @@ if ($id > 0) {
}
// Type
- print ' '.$langs->trans("Type").' '.$membert->getNomUrl(1)." \n";
+ print ''.$langs->trans("Type").' ';
+ print ''.$membert->getNomUrl(1)." \n";
// Morphy
- print ''.$langs->trans("MemberNature").' '.$object->getmorphylib().' ';
- /*print '';
- print $form->showphoto('memberphoto',$object);
- print ' ';*/
+ print ''.$langs->trans("MemberNature").' ';
+ print ''.$object->getmorphylib('', 1).' ';
print ' ';
// Company
diff --git a/htdocs/adherents/index.php b/htdocs/adherents/index.php
index 388d51be376..a5f9c26f192 100644
--- a/htdocs/adherents/index.php
+++ b/htdocs/adherents/index.php
@@ -87,7 +87,9 @@ print load_fiche_titre($langs->trans("MembersArea"), $resultboxes['selectboxlist
$MembersValidated = array();
$MembersToValidate = array();
+$MembersWaitingSubscription = array();
$MembersUpToDate = array();
+$MembersExpired = array();
$MembersExcluded = array();
$MembersResiliated = array();
@@ -137,13 +139,36 @@ if ($resql) {
$now = dol_now();
+// Members waiting subscription
+$sql = "SELECT count(*) as somme , d.fk_adherent_type";
+$sql .= " FROM ".MAIN_DB_PREFIX."adherent as d, ".MAIN_DB_PREFIX."adherent_type as t";
+$sql .= " WHERE d.entity IN (".getEntity('adherent').")";
+$sql .= " AND d.statut = 1"; // validated
+$sql .= " AND (d.datefin IS NULL AND t.subscription = '1')";
+$sql .= " AND t.rowid = d.fk_adherent_type";
+$sql .= " GROUP BY d.fk_adherent_type";
+
+dol_syslog("index.php::select nb of uptodate members by type", LOG_DEBUG);
+$resql = $db->query($sql);
+if ($resql) {
+ $num = $db->num_rows($resql);
+ $i = 0;
+ while ($i < $num) {
+ $objp = $db->fetch_object($resql);
+ $MembersWaitingSubscription[$objp->fk_adherent_type] = $objp->somme;
+ $i++;
+ }
+ $db->free($resql);
+}
+
// Members up to date list
-// current rule: uptodate = the end date is in future whatever is type
+// current rule: uptodate = the end date is in future or no subcription required
// old rule: uptodate = if type does not need payment, that end date is null, if type need payment that end date is in future)
$sql = "SELECT count(*) as somme , d.fk_adherent_type";
$sql .= " FROM ".MAIN_DB_PREFIX."adherent as d, ".MAIN_DB_PREFIX."adherent_type as t";
$sql .= " WHERE d.entity IN (".getEntity('adherent').")";
-$sql .= " AND d.statut = 1 AND (d.datefin >= '".$db->idate($now)."' OR t.subscription = 0)";
+$sql .= " AND d.statut = 1"; // validated
+$sql .= " AND (d.datefin >= '".$db->idate($now)."' OR t.subscription = '0')"; // end date in future
$sql .= " AND t.rowid = d.fk_adherent_type";
$sql .= " GROUP BY d.fk_adherent_type";
@@ -160,6 +185,28 @@ if ($resql) {
$db->free($resql);
}
+// Members expired list
+$sql = "SELECT count(*) as somme , d.fk_adherent_type";
+$sql .= " FROM ".MAIN_DB_PREFIX."adherent as d, ".MAIN_DB_PREFIX."adherent_type as t";
+$sql .= " WHERE d.entity IN (".getEntity('adherent').")";
+$sql .= " AND d.statut = 1"; // validated
+$sql .= " AND (d.datefin < '".$db->idate($now)."' AND t.subscription = '1')";
+$sql .= " AND t.rowid = d.fk_adherent_type";
+$sql .= " GROUP BY d.fk_adherent_type";
+
+dol_syslog("index.php::select nb of uptodate members by type", LOG_DEBUG);
+$resql = $db->query($sql);
+if ($resql) {
+ $num = $db->num_rows($resql);
+ $i = 0;
+ while ($i < $num) {
+ $objp = $db->fetch_object($resql);
+ $MembersExpired[$objp->fk_adherent_type] = $objp->somme;
+ $i++;
+ }
+ $db->free($resql);
+}
+
/*
* Statistics
*/
@@ -172,8 +219,9 @@ if ($conf->use_javascript_ajax) {
$boxgraph .='';
$SumToValidate = 0;
- $SumValidated = 0;
+ $SumWaitingSubscription = 0;
$SumUpToDate = 0;
+ $SumExpired = 0;
$SumResiliated = 0;
$SumExcluded = 0;
@@ -182,23 +230,26 @@ if ($conf->use_javascript_ajax) {
$i = 0;
foreach ($AdherentType as $key => $adhtype) {
$dataval['draft'][] = array($i, isset($MembersToValidate[$key]) ? $MembersToValidate[$key] : 0);
+ $dataval['waitingsubscription'][] = array($i, isset($MembersWaitingSubscription[$key]) ? $MembersWaitingSubscription[$key] : 0);
$dataval['uptodate'][] = array($i, isset($MembersUpToDate[$key]) ? $MembersUpToDate[$key] : 0);
- $dataval['notuptodate'][] = array($i, isset($MembersValidated[$key]) ? $MembersValidated[$key] - (isset($MembersUpToDate[$key]) ? $MembersUpToDate[$key] : 0) : 0);
+ $dataval['expired'][] = array($i, isset($MembersExpired[$key]) ? $MembersExpired[$key] : 0);
$dataval['excluded'][] = array($i, isset($MembersExcluded[$key]) ? $MembersExcluded[$key] : 0);
$dataval['resiliated'][] = array($i, isset($MembersResiliated[$key]) ? $MembersResiliated[$key] : 0);
$SumToValidate += isset($MembersToValidate[$key]) ? $MembersToValidate[$key] : 0;
- $SumValidated += isset($MembersValidated[$key]) ? $MembersValidated[$key] - (isset($MembersUpToDate[$key]) ? $MembersUpToDate[$key] : 0) : 0;
+ $SumWaitingSubscription += isset($MembersWaitingSubscription[$key]) ? $MembersWaitingSubscription[$key] : 0;
$SumUpToDate += isset($MembersUpToDate[$key]) ? $MembersUpToDate[$key] : 0;
+ $SumExpired += isset($MembersExpired[$key]) ? $MembersExpired[$key] : 0;
$SumExcluded += isset($MembersExcluded[$key]) ? $MembersExcluded [$key] : 0;
$SumResiliated += isset($MembersResiliated[$key]) ? $MembersResiliated[$key] : 0;
$i++;
}
- $total = $SumToValidate + $SumValidated + $SumUpToDate + $SumExcluded + $SumResiliated;
+ $total = $SumToValidate + $SumWaitingSubscription + $SumUpToDate + $SumExpired + $SumExcluded + $SumResiliated;
$dataseries = array();
$dataseries[] = array($langs->transnoentitiesnoconv("MembersStatusToValid"), round($SumToValidate)); // Draft, not yet validated
+ $dataseries[] = array($langs->transnoentitiesnoconv("WaitingSubscription"), round($SumWaitingSubscription));
$dataseries[] = array($langs->transnoentitiesnoconv("UpToDate"), round($SumUpToDate));
- $dataseries[] = array($langs->transnoentitiesnoconv("OutOfDate"), round($SumValidated));
+ $dataseries[] = array($langs->transnoentitiesnoconv("OutOfDate"), round($SumExpired));
$dataseries[] = array($langs->transnoentitiesnoconv("MembersStatusExcluded"), round($SumExcluded));
$dataseries[] = array($langs->transnoentitiesnoconv("MembersStatusResiliated"), round($SumResiliated));
@@ -207,7 +258,7 @@ if ($conf->use_javascript_ajax) {
include_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php';
$dolgraph = new DolGraph();
$dolgraph->SetData($dataseries);
- $dolgraph->SetDataColor(array('-'.$badgeStatus0, $badgeStatus4, '-'.$badgeStatus1, '-'.$badgeStatus8, $badgeStatus6));
+ $dolgraph->SetDataColor(array('-'.$badgeStatus0, $badgeStatus1, $badgeStatus4, $badgeStatus8, '-'.$badgeStatus8, $badgeStatus6));
$dolgraph->setShowLegend(2);
$dolgraph->setShowPercent(1);
$dolgraph->SetType(array('pie'));
@@ -217,7 +268,7 @@ if ($conf->use_javascript_ajax) {
$boxgraph .= ' ';
$boxgraph .= ''.$langs->trans("Total").' ';
- $boxgraph .= $SumToValidate + $SumValidated + $SumUpToDate + $SumExcluded + $SumResiliated;
+ $boxgraph .= $SumToValidate + $SumWaitingSubscription + $SumUpToDate + $SumExpired + $SumExcluded + $SumResiliated;
$boxgraph .= ' ';
$boxgraph .= '
';
$boxgraph .= '';
diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php
index 4c80627d70e..2e54ed03db8 100644
--- a/htdocs/adherents/list.php
+++ b/htdocs/adherents/list.php
@@ -142,31 +142,31 @@ if ($db->type == 'pgsql') {
unset($fieldstosearchall['d.rowid']);
}
$arrayfields = array(
- 'd.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1),
- 'd.civility'=>array('label'=>$langs->trans("Civility"), 'checked'=>0),
- 'd.lastname'=>array('label'=>$langs->trans("Lastname"), 'checked'=>1),
- 'd.firstname'=>array('label'=>$langs->trans("Firstname"), 'checked'=>1),
- 'd.gender'=>array('label'=>$langs->trans("Gender"), 'checked'=>0),
- 'd.company'=>array('label'=>$langs->trans("Company"), 'checked'=>1),
- 'd.login'=>array('label'=>$langs->trans("Login"), 'checked'=>1),
- 'd.morphy'=>array('label'=>$langs->trans("MemberNature"), 'checked'=>1),
- 't.libelle'=>array('label'=>$langs->trans("Type"), 'checked'=>1),
- 'd.email'=>array('label'=>$langs->trans("Email"), 'checked'=>1),
- 'd.address'=>array('label'=>$langs->trans("Address"), 'checked'=>0),
- 'd.zip'=>array('label'=>$langs->trans("Zip"), 'checked'=>0),
- 'd.town'=>array('label'=>$langs->trans("Town"), 'checked'=>0),
- 'd.phone'=>array('label'=>$langs->trans("Phone"), 'checked'=>0),
- 'd.phone_perso'=>array('label'=>$langs->trans("PhonePerso"), 'checked'=>0),
- 'd.phone_mobile'=>array('label'=>$langs->trans("PhoneMobile"), 'checked'=>0),
- 'state.nom'=>array('label'=>$langs->trans("State"), 'checked'=>0),
- 'country.code_iso'=>array('label'=>$langs->trans("Country"), 'checked'=>0),
- /*'d.note_public'=>array('label'=>$langs->trans("NotePublic"), 'checked'=>0),
- 'd.note_private'=>array('label'=>$langs->trans("NotePrivate"), 'checked'=>0),*/
- 'd.datefin'=>array('label'=>$langs->trans("EndSubscription"), 'checked'=>1, 'position'=>500),
- 'd.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500),
- 'd.birth'=>array('label'=>$langs->trans("Birthday"), 'checked'=>0, 'position'=>500),
- 'd.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500),
- 'd.statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000),
+ 'd.ref'=>array('label'=>"Ref", 'checked'=>1),
+ 'd.civility'=>array('label'=>"Civility", 'checked'=>0),
+ 'd.lastname'=>array('label'=>"Lastname", 'checked'=>1),
+ 'd.firstname'=>array('label'=>"Firstname", 'checked'=>1),
+ 'd.gender'=>array('label'=>"Gender", 'checked'=>0),
+ 'd.company'=>array('label'=>"Company", 'checked'=>1),
+ 'd.login'=>array('label'=>"Login", 'checked'=>1),
+ 'd.morphy'=>array('label'=>"MemberNature", 'checked'=>1),
+ 't.libelle'=>array('label'=>"Type", 'checked'=>1),
+ 'd.email'=>array('label'=>"Email", 'checked'=>1),
+ 'd.address'=>array('label'=>"Address", 'checked'=>0),
+ 'd.zip'=>array('label'=>"Zip", 'checked'=>0),
+ 'd.town'=>array('label'=>"Town", 'checked'=>0),
+ 'd.phone'=>array('label'=>"Phone", 'checked'=>0),
+ 'd.phone_perso'=>array('label'=>"PhonePerso", 'checked'=>0),
+ 'd.phone_mobile'=>array('label'=>"PhoneMobile", 'checked'=>0),
+ 'state.nom'=>array('label'=>"State", 'checked'=>0),
+ 'country.code_iso'=>array('label'=>"Country", 'checked'=>0),
+ /*'d.note_public'=>array('label'=>"NotePublic", 'checked'=>0),
+ 'd.note_private'=>array('label'=>"NotePrivate", 'checked'=>0),*/
+ 'd.datefin'=>array('label'=>"EndSubscription", 'checked'=>1, 'position'=>500),
+ 'd.datec'=>array('label'=>"DateCreation", 'checked'=>0, 'position'=>500),
+ 'd.birth'=>array('label'=>"Birthday", 'checked'=>0, 'position'=>500),
+ 'd.tms'=>array('label'=>"DateModificationShort", 'checked'=>0, 'position'=>500),
+ 'd.statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000),
'd.import_key'=>array('label'=>"ImportId", 'checked'=>0, 'position'=>1100),
);
// Extra fields
@@ -300,8 +300,8 @@ if (empty($reshook)) {
// Mass actions
$objectclass = 'Adherent';
$objectlabel = 'Members';
- $permissiontoread = $user->rights->adherent->lire;
- $permissiontodelete = $user->rights->adherent->supprimer;
+ $permissiontoread = $user->hasRight('adherent', 'lire');
+ $permissiontodelete = $user->hasRight('adherent', 'supprimer');
$permissiontoadd = $user->hasRight('adherent', 'creer');
$uploaddir = $conf->adherent->dir_output;
include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
@@ -350,27 +350,47 @@ $sql .= " FROM ".MAIN_DB_PREFIX."adherent as d";
if (!empty($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (d.rowid = ef.fk_object)";
}
-if ((!empty($search_categ) && ($search_categ > 0 || $search_categ == -2)) || !empty($catid)) {
- // We need this table joined to the select in order to filter by categ
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_member as cm ON d.rowid = cm.fk_member";
-}
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = d.country)";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = d.state_id)";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on (s.rowid = d.fk_soc)";
$sql .= ", ".MAIN_DB_PREFIX."adherent_type as t";
$sql .= " WHERE d.fk_adherent_type = t.rowid";
-if ($catid > 0) {
- $sql .= " AND cm.fk_categorie = ".((int) $catid);
+
+if ($catid && empty($search_categ)) {
+ $search_categ = $catid;
}
-if ($catid == -2) {
- $sql .= " AND cm.fk_categorie IS NULL";
-}
-if ($search_categ > 0) {
- $sql .= " AND cm.fk_categorie = ".((int) $search_categ);
-}
-if ($search_categ == -2) {
- $sql .= " AND cm.fk_categorie IS NULL";
+
+$searchCategoryContactList = $search_categ ? array($search_categ) : array();
+$searchCategoryContactOperator = 0;
+// Search for tag/category ($searchCategoryContactList is an array of ID)
+if (!empty($searchCategoryContactList)) {
+ $searchCategoryContactSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategoryContactList as $searchCategoryContact) {
+ if (intval($searchCategoryContact) == -2) {
+ $searchCategoryContactSqlList[] = "NOT EXISTS (SELECT ck.fk_categorie FROM ".MAIN_DB_PREFIX."categorie_member as ck WHERE d.rowid = ck.fk_member)";
+ } elseif (intval($searchCategoryContact) > 0) {
+ if ($searchCategoryContactOperator == 0) {
+ $searchCategoryContactSqlList[] = " EXISTS (SELECT ck.fk_categorie FROM ".MAIN_DB_PREFIX."categorie_member as ck WHERE d.rowid = ck.fk_member AND ck.fk_categorie = ".((int) $searchCategoryContact).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryContact);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategoryContactSqlList[] = " EXISTS (SELECT ck.fk_categorie FROM ".MAIN_DB_PREFIX."categorie_member as ck WHERE d.rowid = ck.fk_member AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategoryContactOperator == 1) {
+ if (!empty($searchCategoryContactSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryContactSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryContactSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryContactSqlList).")";
+ }
+ }
}
+
$sql .= " AND d.entity IN (".getEntity('adherent').")";
if ($sall) {
$sql .= natural_search(array_keys($fieldstosearchall), $sall);
@@ -379,7 +399,10 @@ if ($search_type > 0) {
$sql .= " AND t.rowid=".((int) $search_type);
}
if ($search_filter == 'withoutsubscription') {
- $sql .= " AND (datefin IS NULL OR t.subscription = '0')";
+ $sql .= " AND (datefin IS NULL)";
+}
+if ($search_filter == 'waitingsubscription') {
+ $sql .= " AND (datefin IS NULL AND t.subscription = '1')";
}
if ($search_filter == 'uptodate') {
$sql .= " AND (datefin >= '".$db->idate($now)."' OR t.subscription = '0')";
@@ -391,7 +414,7 @@ if ($search_status != '') {
// Peut valoir un nombre ou liste de nombre separes par virgules
$sql .= " AND d.statut in (".$db->sanitize($db->escape($search_status)).")";
}
-if ($search_morphy != '') {
+if ($search_morphy != '' && $search_morphy != '-1') {
$sql .= natural_search("d.morphy", $search_morphy);
}
if ($search_ref) {
@@ -498,35 +521,6 @@ if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $
$help_url = 'EN:Module_Foundations|FR:Module_Adhérents|ES:Módulo_Miembros';
llxHeader('', $title, $help_url);
-if (GETPOSTISSET("search_status")) {
- if ($search_status == '-1,1') { // TODO : check this test as -1 == Adherent::STATUS_DRAFT and -2 == Adherent::STATUS_EXLCUDED
- $title = $langs->trans("MembersListQualified");
- }
- if ($search_status == Adherent::STATUS_DRAFT) {
- $title = $langs->trans("MembersListToValid");
- }
- if ($search_status == Adherent::STATUS_VALIDATED && $filter == '') {
- $title = $langs->trans("MenuMembersValidated");
- }
- if ($search_status == Adherent::STATUS_VALIDATED && $filter == 'withoutsubscription') {
- $title = $langs->trans("MembersWithSubscriptionToReceive");
- }
- if ($search_status == Adherent::STATUS_VALIDATED && $filter == 'uptodate') {
- $title = $langs->trans("MembersListUpToDate");
- }
- if ($search_status == Adherent::STATUS_VALIDATED && $filter == 'outofdate') {
- $title = $langs->trans("MembersListNotUpToDate");
- }
- if ((string) $search_status == (string) Adherent::STATUS_RESILIATED) { // The cast to string is required to have test false when search_status is ''
- $title = $langs->trans("MembersListResiliated");
- }
- if ($search_status == Adherent::STATUS_EXCLUDED) {
- $title = $langs->trans("MembersListExcluded");
- }
-} elseif ($action == 'search') {
- $title = $langs->trans("MembersListQualified");
-}
-
if ($search_type > 0) {
$membertype = new AdherentType($db);
$result = $membertype->fetch($search_type);
@@ -620,13 +614,13 @@ $arrayofmassactions = array(
if ($user->hasRight('adherent', 'creer')) {
$arrayofmassactions['close'] = img_picto('', 'close_title', 'class="pictofixedwidth"').$langs->trans("Resiliate");
}
-if ($user->rights->adherent->supprimer) {
+if ($user->hasRight('adherent', 'supprimer')) {
$arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
}
-if (isModEnabled('category') && $user->rights->adherent->creer) {
+if (isModEnabled('category') && $user->hasRight('adherent', 'creer')) {
$arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("AffectTag");
}
-if ($user->hasRight('adherent', 'creer') && $user->rights->user->user->creer) {
+if ($user->hasRight('adherent', 'creer') && $user->hasRight('user', 'user', 'creer')) {
$arrayofmassactions['createexternaluser'] = img_picto('', 'user', 'class="pictofixedwidth"').$langs->trans("CreateExternalUser");
}
if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete', 'preaffecttag'))) {
@@ -667,10 +661,10 @@ if ($sall) {
// Filter on categories
$moreforfilter = '';
-if (isModEnabled('categorie') && $user->rights->categorie->lire) {
+if (isModEnabled('categorie') && $user->hasRight('categorie', 'lire')) {
require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
$moreforfilter .= '';
- $moreforfilter .= img_picto($langs->trans('Categories'), 'category', 'class="pictofixedlength"').$formother->select_categories(Categorie::TYPE_MEMBER, $search_categ, 'search_categ', 1);
+ $moreforfilter .= img_picto($langs->trans('Categories'), 'category', 'class="pictofixedlength"').$formother->select_categories(Categorie::TYPE_MEMBER, $search_categ, 'search_categ', 1, $langs->trans("MembersCategoriesShort"));
$moreforfilter .= '
';
}
$parameters = array();
@@ -741,10 +735,11 @@ if (!empty($arrayfields['d.login']['checked'])) {
print '';
print ' ';
}
+// Nature
if (!empty($arrayfields['d.morphy']['checked'])) {
- print '';
+ print ' ';
$arraymorphy = array('mor'=>$langs->trans("Moral"), 'phy'=>$langs->trans("Physical"));
- print $form->selectarray('search_morphy', $arraymorphy, $search_morphy, 1);
+ print $form->selectarray('search_morphy', $arraymorphy, $search_morphy, 1, 0, 0, '', 0, 0, 0, '', 'maxwidth100');
print ' ';
}
if (!empty($arrayfields['t.libelle']['checked'])) {
@@ -805,7 +800,8 @@ if (!empty($arrayfields['d.email']['checked'])) {
// End of subscription date
if (!empty($arrayfields['d.datefin']['checked'])) {
print '';
- $selectarray = array('-1'=>'', 'withoutsubscription'=>$langs->trans("WithoutSubscription"), 'uptodate'=>$langs->trans("UpToDate"), 'outofdate'=>$langs->trans("OutOfDate"));
+ //$selectarray = array('-1'=>'', 'withoutsubscription'=>$langs->trans("WithoutSubscription"), 'uptodate'=>$langs->trans("UpToDate"), 'outofdate'=>$langs->trans("OutOfDate"));
+ $selectarray = array('-1'=>'', 'waitingsubscription'=>$langs->trans("WaitingSubscription"), 'uptodate'=>$langs->trans("UpToDate"), 'outofdate'=>$langs->trans("OutOfDate"));
print $form->selectarray('search_filter', $selectarray, $search_filter);
print ' ';
}
@@ -919,7 +915,7 @@ if (!empty($arrayfields['d.email']['checked'])) {
print_liste_field_titre($arrayfields['d.email']['label'], $_SERVER["PHP_SELF"], 'd.email', '', $param, '', $sortfield, $sortorder);
}
if (!empty($arrayfields['d.datefin']['checked'])) {
- print_liste_field_titre($arrayfields['d.datefin']['label'], $_SERVER["PHP_SELF"], 'd.datefin', '', $param, '', $sortfield, $sortorder, 'center ');
+ print_liste_field_titre($arrayfields['d.datefin']['label'], $_SERVER["PHP_SELF"], 'd.datefin,t.subscription', '', $param, '', $sortfield, $sortorder, 'center ');
}
// Extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
@@ -938,7 +934,7 @@ if (!empty($arrayfields['d.tms']['checked'])) {
print_liste_field_titre($arrayfields['d.tms']['label'], $_SERVER["PHP_SELF"], "d.tms", "", $param, 'align="center" class="nowrap"', $sortfield, $sortorder);
}
if (!empty($arrayfields['d.statut']['checked'])) {
- print_liste_field_titre($arrayfields['d.statut']['label'], $_SERVER["PHP_SELF"], "d.statut", "", $param, 'class="right"', $sortfield, $sortorder);
+ print_liste_field_titre($arrayfields['d.statut']['label'], $_SERVER["PHP_SELF"], "d.statut,t.subscription,d.datefin", "", $param, 'class="right"', $sortfield, $sortorder);
}
if (!empty($arrayfields['d.import_key']['checked'])) {
print_liste_field_titre($arrayfields['d.import_key']['label'], $_SERVER["PHP_SELF"], "d.import_key", "", $param, '', $sortfield, $sortorder, 'center ');
@@ -955,6 +951,7 @@ while ($i < min($num, $limit)) {
$obj = $db->fetch_object($resql);
$datefin = $db->jdate($obj->datefin);
+
$memberstatic->id = $obj->rowid;
$memberstatic->ref = $obj->ref;
$memberstatic->civility_id = $obj->civility;
@@ -970,6 +967,7 @@ while ($i < min($num, $limit)) {
$memberstatic->morphy = $obj->morphy;
$memberstatic->note_public = $obj->note_public;
$memberstatic->note_private = $obj->note_private;
+ $memberstatic->need_subscription = $obj->subscription;
if (!empty($obj->fk_soc)) {
$memberstatic->fetch_thirdparty();
@@ -1070,14 +1068,7 @@ while ($i < min($num, $limit)) {
// Nature (Moral/Physical)
if (!empty($arrayfields['d.morphy']['checked'])) {
print '';
- $s = '';
- if ($obj->morphy == 'phy') {
- $s .= ''.dol_substr($langs->trans("Physical"), 0, 1).' ';
- }
- if ($obj->morphy == 'mor') {
- $s .= ''.dol_substr($langs->trans("Moral"), 0, 1).' ';
- }
- print $s;
+ print $memberstatic->getmorphylib('', 2);
print " \n";
if (!$i) {
$totalarray['nbfield']++;
@@ -1183,7 +1174,7 @@ while ($i < min($num, $limit)) {
}
} else {
if (!empty($obj->subscription)) {
- print $langs->trans("SubscriptionNotReceived");
+ print ''.$langs->trans("SubscriptionNotReceived").' ';
if ($obj->statut > 0) {
print " ".img_warning();
}
diff --git a/htdocs/adherents/note.php b/htdocs/adherents/note.php
index ea5e22fe153..4d3bc4dd638 100644
--- a/htdocs/adherents/note.php
+++ b/htdocs/adherents/note.php
@@ -59,14 +59,14 @@ if ($id > 0 || !empty($ref)) {
$result = $object->fetch($id, $ref);
// Define variables to know what current user can do on users
- $canadduser = ($user->admin || $user->rights->user->user->creer);
+ $canadduser = ($user->admin || $user->hasRight('user', 'user', 'creer'));
// Define variables to know what current user can do on properties of user linked to edited member
if ($object->user_id) {
// $User is the user who edits, $object->user_id is the id of the related user in the edited member
- $caneditfielduser = ((($user->id == $object->user_id) && $user->rights->user->self->creer)
- || (($user->id != $object->user_id) && $user->rights->user->user->creer));
- $caneditpassworduser = ((($user->id == $object->user_id) && $user->rights->user->self->password)
- || (($user->id != $object->user_id) && $user->rights->user->user->password));
+ $caneditfielduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'creer'))
+ || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'creer')));
+ $caneditpassworduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'password'))
+ || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'password')));
}
}
@@ -133,13 +133,12 @@ if ($id) {
}
// Type
- print ''.$langs->trans("Type").' '.$adht->getNomUrl(1)." \n";
+ print ''.$langs->trans("Type").' ';
+ print ''.$adht->getNomUrl(1)." \n";
// Morphy
- print ''.$langs->trans("MemberNature").' '.$object->getmorphylib().' ';
- /*print '';
- print $form->showphoto('memberphoto',$member);
- print ' ';*/
+ print ''.$langs->trans("MemberNature").' ';
+ print ''.$object->getmorphylib('', 1).' ';
print ' ';
// Company
diff --git a/htdocs/adherents/stats/byproperties.php b/htdocs/adherents/stats/byproperties.php
index f632a1ea9c7..1d0f0d92c16 100644
--- a/htdocs/adherents/stats/byproperties.php
+++ b/htdocs/adherents/stats/byproperties.php
@@ -40,7 +40,7 @@ if ($user->socid > 0) {
}
$result = restrictedArea($user, 'adherent', '', '', 'cotisation');
-$year = strftime("%Y", time());
+$year = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS)));
$endyear = $year;
diff --git a/htdocs/adherents/stats/geo.php b/htdocs/adherents/stats/geo.php
index bb65a1047a8..e7195d4ee30 100644
--- a/htdocs/adherents/stats/geo.php
+++ b/htdocs/adherents/stats/geo.php
@@ -42,7 +42,7 @@ if ($user->socid > 0) {
}
$result = restrictedArea($user, 'adherent', '', '', 'cotisation');
-$year = strftime("%Y", time());
+$year = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS)));
$endyear = $year;
diff --git a/htdocs/adherents/stats/index.php b/htdocs/adherents/stats/index.php
index 11447dcd8bb..30b79f4bd76 100644
--- a/htdocs/adherents/stats/index.php
+++ b/htdocs/adherents/stats/index.php
@@ -47,7 +47,7 @@ if ($user->socid > 0) {
}
$result = restrictedArea($user, 'adherent', '', '', 'cotisation');
-$year = strftime("%Y", time());
+$year = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS)));
$endyear = $year;
diff --git a/htdocs/adherents/subscription.php b/htdocs/adherents/subscription.php
index db40a8ad465..cc5b600b2a4 100644
--- a/htdocs/adherents/subscription.php
+++ b/htdocs/adherents/subscription.php
@@ -506,10 +506,12 @@ if ($rowid > 0) {
}
// Type
- print ''.$langs->trans("Type").' '.$adht->getNomUrl(1)." \n";
+ print ''.$langs->trans("Type").' ';
+ print ''.$adht->getNomUrl(1)." \n";
// Morphy
- print ''.$langs->trans("MemberNature").' '.$object->getmorphylib().' ';
+ print ''.$langs->trans("MemberNature").' ';
+ print ''.$object->getmorphylib('', 1).' ';
print ' ';
// Company
diff --git a/htdocs/adherents/subscription/card.php b/htdocs/adherents/subscription/card.php
index 215635757c2..83f1a01441c 100644
--- a/htdocs/adherents/subscription/card.php
+++ b/htdocs/adherents/subscription/card.php
@@ -288,7 +288,7 @@ if ($rowid && $action != 'edit') {
print '
';
- print '';
+ print '';
// Member
$adh->ref = $adh->getFullName($langs);
@@ -320,7 +320,7 @@ if ($rowid && $action != 'edit') {
print '';
// Amount
- print ''.$langs->trans("Amount").' '.price($object->amount).' ';
+ print ''.$langs->trans("Amount").' '.price($object->amount).' ';
// Label
print ''.$langs->trans("Label").' '.$object->note.' ';
diff --git a/htdocs/adherents/type.php b/htdocs/adherents/type.php
index c26a9d13536..257e7266e5a 100644
--- a/htdocs/adherents/type.php
+++ b/htdocs/adherents/type.php
@@ -118,7 +118,7 @@ if ($cancel) {
}
}
-if ($action == 'add' && $user->rights->adherent->configurer) {
+if ($action == 'add' && $user->hasRight('adherent', 'configurer')) {
$object->label = trim($label);
$object->morphy = trim($morphy);
$object->status = (int) $status;
@@ -145,6 +145,7 @@ if ($action == 'add' && $user->rights->adherent->configurer) {
$sql = "SELECT libelle FROM ".MAIN_DB_PREFIX."adherent_type WHERE libelle='".$db->escape($object->label)."'";
$sql .= " WHERE entity IN (".getEntity('member_type').")";
$result = $db->query($sql);
+ $num = null;
if ($result) {
$num = $db->num_rows($result);
}
@@ -504,19 +505,19 @@ if ($rowid > 0) {
print '';
// Edit
- if ($user->rights->adherent->configurer) {
+ if ($user->hasRight('adherent', 'configurer')) {
print '
';
}
// Add
- if ($user->rights->adherent->configurer && !empty($object->status)) {
+ if ($user->hasRight('adherent', 'configurer')&& !empty($object->status)) {
print '
';
} else {
print '
';
}
// Delete
- if ($user->rights->adherent->configurer) {
+ if ($user->hasRight('adherent', 'configurer')) {
print '
';
}
@@ -720,7 +721,7 @@ if ($rowid > 0) {
*/
// Moral/Physique
- print "
".$adh->getmorphylib($objp->morphy)." \n";
+ print "
".$adh->getmorphylib($objp->morphy, 1)." \n";
// EMail
print "
".dol_print_email($objp->email, 0, 0, 1)." \n";
@@ -740,9 +741,9 @@ if ($rowid > 0) {
}
print '';
} else {
- print '
';
+ print ' ';
if (!empty($objp->subscription)) {
- print $langs->trans("SubscriptionNotReceived");
+ print ''.$langs->trans("SubscriptionNotReceived").' ';
if ($objp->status > 0) {
print " ".img_warning();
}
@@ -757,8 +758,8 @@ if ($rowid > 0) {
if ($user->hasRight('adherent', 'creer')) {
print 'id).'">'.img_edit().' ';
}
- if ($user->rights->adherent->supprimer) {
- print ''.img_picto($langs->trans("Resiliate"), 'disable.png').' ';
+ if ($user->hasRight('adherent', 'supprimer')) {
+ print ''.img_picto($langs->trans("Resiliate"), 'disable.png').' ';
}
print " ";
@@ -845,7 +846,7 @@ if ($rowid > 0) {
print '
'.$langs->trans("Description").' ';
require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
- $doleditor = new DolEditor('comment', $object->note, '', 280, 'dolibarr_notes', '', false, true, empty($conf->fckeditor->enabled) ? false : $conf->fckeditor->enabled, 15, '90%');
+ $doleditor = new DolEditor('comment', $object->note_public, '', 220, 'dolibarr_notes', '', false, true, empty($conf->fckeditor->enabled) ? false : $conf->fckeditor->enabled, 15, '90%');
$doleditor->Create();
print " ";
diff --git a/htdocs/adherents/type_translation.php b/htdocs/adherents/type_translation.php
index 5e1db1233b8..9539250cb44 100644
--- a/htdocs/adherents/type_translation.php
+++ b/htdocs/adherents/type_translation.php
@@ -190,7 +190,7 @@ print dol_get_fiche_end();
print "\n
\n";
if ($action == '') {
- if ($user->rights->produit->creer || $user->rights->service->creer) {
+ if ($user->hasRight('produit', 'creer') || $user->hasRight('service', 'creer')) {
print '
'.$langs->trans("Add").' ';
if ($cnt_trans > 0) {
print '
'.$langs->trans("Update").' ';
@@ -226,7 +226,7 @@ if ($action == 'edit') {
print '
';
print ''.$langs->trans('Label').' ';
print ''.$langs->trans('Description').' ';
- $doleditor = new DolEditor("desc-$key", $object->multilangs[$key]["description"], '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_PRODUCTDESC'), ROWS_3, '90%');
+ $doleditor = new DolEditor("desc-$key", $object->multilangs[$key]["description"], '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_SOCIETE'), ROWS_3, '90%');
$doleditor->Create();
print ' ';
print '';
@@ -271,7 +271,7 @@ if ($action == 'edit') {
* Form to add a new translation
*/
-if ($action == 'create' && $user->rights->adherent->configurer) {
+if ($action == 'create' && $user->hasRight('adherent', 'configurer')) {
//WYSIWYG Editor
require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
@@ -289,7 +289,7 @@ if ($action == 'create' && $user->rights->adherent->configurer) {
print '';
print ''.$langs->trans('Label').' ';
print ''.$langs->trans('Description').' ';
- $doleditor = new DolEditor('desc', '', '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_PRODUCTDESC'), ROWS_3, '90%');
+ $doleditor = new DolEditor('desc', '', '', 160, 'dolibarr_notes', '', false, true, empty($conf->fckeditor->enabled) ? false : $conf->fckeditor->enabled, ROWS_3, '90%');
$doleditor->Create();
print ' ';
diff --git a/htdocs/admin/bank_extrafields.php b/htdocs/admin/bank_extrafields.php
index 3626eec4455..d01ac5a93e9 100644
--- a/htdocs/admin/bank_extrafields.php
+++ b/htdocs/admin/bank_extrafields.php
@@ -65,18 +65,21 @@ require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php';
* View
*/
-$textobject = $langs->transnoentitiesnoconv("Bank");
+$help_url = '';
+$page_name = "BankSetupModule";
llxHeader('', $langs->trans("BankSetupModule"), $help_url);
$linkback = ''.$langs->trans("BackToModuleList").' ';
-print load_fiche_titre($langs->trans("BankSetupModule"), $linkback, 'title_setup');
+print load_fiche_titre($langs->trans($page_name), $linkback, 'title_setup');
$head = bank_admin_prepare_head(null);
-print dol_get_fiche_head($head, 'attributes', $langs->trans("BankSetupModule"), -1, 'account');
+print dol_get_fiche_head($head, 'attributes', $langs->trans($page_name), -1, 'account');
+
+$textobject = $langs->transnoentitiesnoconv("Bank");
require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php';
diff --git a/htdocs/admin/bankline_extrafields.php b/htdocs/admin/bankline_extrafields.php
index 06f1267343a..7e451275f8d 100644
--- a/htdocs/admin/bankline_extrafields.php
+++ b/htdocs/admin/bankline_extrafields.php
@@ -22,7 +22,7 @@
*/
/**
- * \file admin/bankline_extrafields.php
+ * \file htdocs/admin/bankline_extrafields.php
* \ingroup bank
* \brief Page to setup extra fields of bankline
*/
@@ -41,7 +41,7 @@ $form = new Form($db);
// List of supported format
$tmptype2label = ExtraFields::$type2label;
-$type2label = [];
+$type2label = array();
foreach ($tmptype2label as $key => $val) {
$type2label[$key] = $langs->transnoentitiesnoconv($val);
}
@@ -80,6 +80,8 @@ $head = bank_admin_prepare_head(null);
print dol_get_fiche_head($head, 'bankline_extrafields', $langs->trans($page_name), -1, 'account');
+$textobject = $langs->transnoentitiesnoconv("BankTransaction");
+
require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php';
print dol_get_fiche_end();
diff --git a/htdocs/admin/commande.php b/htdocs/admin/commande.php
index b218a91385b..34a5e281fac 100644
--- a/htdocs/admin/commande.php
+++ b/htdocs/admin/commande.php
@@ -182,7 +182,39 @@ if ($action == 'updateMask') {
} else {
setEventMessages($langs->trans("Error"), null, 'errors');
}
-} elseif ($action == 'set_BANK_ASK_PAYMENT_BANK_DURING_ORDER') {
+} elseif (preg_match('/set_(.*)/', $action, $reg)) {
+ $code = $reg[1];
+ $value = (GETPOST($code) ? GETPOST($code) : 1);
+
+ $res = dolibarr_set_const($db, $code, $value, 'chaine', 0, '', $conf->entity);
+ if (!($res > 0)) {
+ $error++;
+ }
+
+ if ($error) {
+ setEventMessages($langs->trans('Error'), null, 'errors');
+ } else {
+ setEventMessages($langs->trans('SetupSaved'), null, 'mesgs');
+ header("Location: " . $_SERVER["PHP_SELF"]);
+ exit();
+ }
+} elseif (preg_match('/del_(.*)/', $action, $reg)) {
+ $code = $reg[1];
+ $res = dolibarr_del_const($db, $code, $conf->entity);
+
+ if (!($res > 0)) {
+ $error++;
+ }
+
+ if ($error) {
+ setEventMessages($langs->trans('Error'), null, 'errors');
+ } else {
+ setEventMessages($langs->trans('SetupSaved'), null, 'mesgs');
+ header("Location: " . $_SERVER["PHP_SELF"]);
+ exit();
+ }
+}
+/*elseif ($action == 'set_BANK_ASK_PAYMENT_BANK_DURING_ORDER') {
// Activate ask for payment bank
$res = dolibarr_set_const($db, "BANK_ASK_PAYMENT_BANK_DURING_ORDER", $value, 'chaine', 0, '', $conf->entity);
@@ -208,7 +240,8 @@ if ($action == 'updateMask') {
} else {
setEventMessages($langs->trans("Error"), null, 'errors');
}
-}
+} */
+
/*
@@ -636,10 +669,18 @@ print ' ';
print ' ';
print "\n";
+
+// Allow external download
+print '';
+print ''.$langs->trans("AllowExternalDownload").' ';
+print '';
+print ajax_constantonoff('ORDER_ALLOW_EXTERNAL_DOWNLOAD', array(), null, 0, 0, 0, 2, 0, 1);
+print ' ';
print '';
/*
// Seems to be not so used. So kept hidden for the moment to avoid dangerous options inflation.
+// TODO Must be implemented by PDF templates
// Ask for payment bank during order
if ($conf->banque->enabled) {
diff --git a/htdocs/admin/contract.php b/htdocs/admin/contract.php
index 98c72ac68dc..55271091db1 100644
--- a/htdocs/admin/contract.php
+++ b/htdocs/admin/contract.php
@@ -55,6 +55,8 @@ if (empty($conf->global->CONTRACT_ADDON)) {
include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php';
+$error=0;
+
if ($action == 'updateMask') {
$maskconst = GETPOST('maskconstcontract', 'alpha');
$maskvalue = GETPOST('maskcontract', 'alpha');
@@ -128,6 +130,8 @@ if ($action == 'updateMask') {
if ($ret > 0) {
$ret = addDocumentModel($value, $type, $label, $scandir);
}
+} elseif ($action == 'unsetdoc') {
+ dolibarr_del_const($db, "CONTRACT_ADDON_PDF", $conf->entity);
} elseif ($action == 'setmod') {
// TODO Verifier si module numerotation choisi peut etre active
// par appel methode canBeActivated
@@ -152,9 +156,45 @@ if ($action == 'updateMask') {
} else {
setEventMessages($langs->trans("Error"), null, 'errors');
}
+} elseif ($action == "allowonlinesign") {
+ if (!dolibarr_set_const($db, "CONTRACT_ALLOW_ONLINESIGN", $value, 0, 'int', $conf->entity)) {
+ $error++;
+ }
+} elseif (preg_match('/set_(.*)/', $action, $reg)) {
+ $code = $reg[1];
+ $value = (GETPOST($code) ? GETPOST($code) : 1);
+
+ $res = dolibarr_set_const($db, $code, $value, 'chaine', 0, '', $conf->entity);
+ if (!($res > 0)) {
+ $error++;
+ }
+
+ if ($error) {
+ setEventMessages($langs->trans('Error'), null, 'errors');
+ } else {
+ setEventMessages($langs->trans('SetupSaved'), null, 'mesgs');
+ header("Location: " . $_SERVER["PHP_SELF"]);
+ exit();
+ }
+} elseif (preg_match('/del_(.*)/', $action, $reg)) {
+ $code = $reg[1];
+ $res = dolibarr_del_const($db, $code, $conf->entity);
+
+ if (!($res > 0)) {
+ $error++;
+ }
+
+ if ($error) {
+ setEventMessages($langs->trans('Error'), null, 'errors');
+ } else {
+ setEventMessages($langs->trans('SetupSaved'), null, 'mesgs');
+ header("Location: " . $_SERVER["PHP_SELF"]);
+ exit();
+ }
}
+
/*
* View
*/
@@ -178,6 +218,7 @@ print dol_get_fiche_head($head, 'contract', $langs->trans("Contracts"), -1, 'con
print load_fiche_titre($langs->trans("ContractsNumberingModules"), '', '');
+print '';
print '
';
print '';
print ''.$langs->trans("Name").' ';
@@ -271,7 +312,7 @@ foreach ($dirmodels as $reldir) {
}
}
-print '
';
+print '
';
/*
* Documents models for Contracts
@@ -299,6 +340,7 @@ if ($resql) {
}
+print '
';
print "
";
/*
@@ -427,6 +470,8 @@ print '
';
print '
';
print load_fiche_titre($langs->trans("OtherOptions"), '', '');
+
+print '
';
print '
';
print '';
print ''.$langs->trans("Parameter").' ';
@@ -469,7 +514,31 @@ print $form->selectyesno("activate_hideClosedServiceByDefault", (!empty($conf->g
print '';
print ' ';
+// Allow online signing
+print '';
+print ''.$langs->trans("AllowOnlineSign").' ';
+print '';
+if ($conf->global->CONTRACT_ALLOW_ONLINESIGN) {
+ print '';
+ print img_picto($langs->trans("Activited"), 'switch_on');
+ print ' ';
+} else {
+ print '';
+ print img_picto($langs->trans("Disabled"), 'switch_off');
+ print ' ';
+}
+print ' ';
+print ' ';
+
+// Allow external download
+print '';
+print ''.$langs->trans("AllowExternalDownload").' ';
+print '';
+print ajax_constantonoff('CONTRACT_ALLOW_EXTERNAL_DOWNLOAD', array(), null, 0, 0, 0, 2, 0, 1);
+print ' ';
+print ' ';
print '
';
+print '
';
print $form->buttonsSaveCancel("Save", '');
diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php
index 43472c9724c..346fa2f0aea 100644
--- a/htdocs/admin/dict.php
+++ b/htdocs/admin/dict.php
@@ -1637,7 +1637,7 @@ if ($id > 0) {
if ($showfield) {
if ($value == 'country') {
print '
';
- print $form->select_country($search_country_id, 'search_country_id', '', 28, 'maxwidth150 maxwidthonsmartphone');
+ print $form->select_country($search_country_id, 'search_country_id', '', 28, 'minwidth100 maxwidth150 maxwidthonsmartphone');
print ' ';
$filterfound++;
} elseif ($value == 'code') {
@@ -2128,7 +2128,7 @@ if ($id > 0) {
$class .= ' right';
}
if (in_array($value, array('localtax1_type', 'localtax2_type'))) {
- $class .= ' nowrap';
+ $class .= ' nowraponall';
}
if (in_array($value, array('use_default', 'fk_parent', 'sortorder'))) {
$class .= ' center';
@@ -2273,8 +2273,9 @@ if ($id > 0) {
print '
';
print '
';
print '';
- print ''.$langs->trans("Dictionary").' ';
+ print ''.$langs->trans("Dictionary").' ';
print ' ';
+ print ' ';
print ' ';
$showemptyline = '';
@@ -2285,13 +2286,13 @@ if ($id > 0) {
if ($i) {
if ($showemptyline) {
- print ' ';
+ print ' ';
$showemptyline = 0;
}
$value = $tabname[$i];
- print '';
+ print ' ';
if (!empty($tabcond[$i])) {
$tabnamenoprefix = preg_replace('/'.MAIN_DB_PREFIX.'/', '', $tabname[$i]);
print '';
@@ -2309,7 +2310,7 @@ if ($id > 0) {
print img_picto('Edit', 'edit', '');
print ' ';
print ' ';
- print '';
+ print ' ';
print $form->textwithpicto('', $langs->trans("Table").': '.MAIN_DB_PREFIX.$tabname[$i]);
print ' ';
print ' ';
@@ -2374,7 +2375,7 @@ function fieldList($fieldlist, $obj = '', $tabname = '', $context = '')
} // For state page, we do not show the country input (we link to region, not country)
print '';
$fieldname = 'country';
- print $form->select_country((!empty($obj->country_code) ? $obj->country_code : (!empty($obj->country) ? $obj->country : '')), $fieldname, '', 28, 'maxwidth150 maxwidthonsmartphone');
+ print $form->select_country((!empty($obj->country_code) ? $obj->country_code : (!empty($obj->country) ? $obj->country : '')), $fieldname, '', 28, 'minwidth100 maxwidth150 maxwidthonsmartphone');
print ' ';
} elseif ($value == 'country_id') {
if (!in_array('country', $fieldlist)) { // If there is already a field country, we don't show country_id (avoid duplicate)
diff --git a/htdocs/admin/emailcollector_list.php b/htdocs/admin/emailcollector_list.php
index 075ece751ce..3be38cca113 100644
--- a/htdocs/admin/emailcollector_list.php
+++ b/htdocs/admin/emailcollector_list.php
@@ -31,7 +31,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
-dol_include_once('/emailcollector/class/emailcollector.class.php');
+require_once DOL_DOCUMENT_ROOT.'/emailcollector/class/emailcollector.class.php';
// Load translation files required by page
$langs->loadLangs(array("admin", "other"));
@@ -50,7 +50,7 @@ $mode = GETPOST('mode', 'aZ');
$id = GETPOST('id', 'int');
// Load variable for pagination
-$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
+$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
$sortfield = GETPOST('sortfield', 'aZ09comma');
$sortorder = GETPOST('sortorder', 'aZ09comma');
$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
diff --git a/htdocs/admin/eventorganization.php b/htdocs/admin/eventorganization.php
index 40c86d79e13..cc9b8d7bca8 100644
--- a/htdocs/admin/eventorganization.php
+++ b/htdocs/admin/eventorganization.php
@@ -220,7 +220,7 @@ if ($action == 'edit') {
foreach ($arrayofparameters as $constname => $val) {
if ($val['enabled']==1) {
$setupnotempty++;
- print '';
+ print ' ';
$tooltiphelp = (($langs->trans($constname . 'Tooltip') != $constname . 'Tooltip') ? $langs->trans($constname . 'Tooltip') : '');
$tooltiphelp .= (($langs->trans($constname . 'Tooltip2') && $langs->trans($constname . 'Tooltip2') != $constname . 'Tooltip2') ? ' '."\n".$langs->trans($constname . 'Tooltip2') : '');
print ''.$form->textwithpicto($langs->trans($constname), $tooltiphelp, 1, 'info', '', 0, 3, 'tootips'.$constname).' ';
@@ -302,7 +302,8 @@ if ($action == 'edit') {
foreach ($arrayofparameters as $constname => $val) {
if ($val['enabled']==1) {
$setupnotempty++;
- print ' ';
+ print ' ';
+ print '';
$tooltiphelp = (($langs->trans($constname . 'Tooltip') != $constname . 'Tooltip') ? $langs->trans($constname . 'Tooltip') : '');
$tooltiphelp .= (($langs->trans($constname . 'Tooltip2') && $langs->trans($constname . 'Tooltip2') != $constname . 'Tooltip2') ? ' '."\n".$langs->trans($constname . 'Tooltip2') : '');
print $form->textwithpicto($langs->trans($constname), $tooltiphelp);
@@ -320,12 +321,17 @@ if ($action == 'edit') {
$formmail = new FormMail($db);
$tmp = explode(':', $val['type']);
-
- $template = $formmail->getEMailTemplate($db, $tmp[1], $user, $langs, getDolGlobalString($constname));
- if ($template < 0) {
- setEventMessages(null, $formmail->errors, 'errors');
+ $labelemailtemplate = getDolGlobalString($constname);
+ if ($labelemailtemplate && $labelemailtemplate != '-1') {
+ $template = $formmail->getEMailTemplate($db, $tmp[1], $user, $langs, getDolGlobalString($constname));
+ if (is_numeric($template) && $template < 0) {
+ setEventMessages($formmail->error, $formmail->errors, 'errors');
+ } else {
+ if ($template->label != 'default') {
+ print $langs->trans($template->label);
+ }
+ }
}
- print $langs->trans($template->label);
}
} elseif (preg_match('/category:/', $val['type'])) {
if (getDolGlobalString($constname)) {
@@ -353,16 +359,21 @@ if ($action == 'edit') {
}
} elseif ($val['type'] == 'product') {
$product = new Product($db);
- $resprod = $product->fetch(getDolGlobalString($constname));
- if ($resprod > 0) {
- print $product->getNomUrl(1);
- } elseif ($resprod < 0) {
- setEventMessages($product->error, $product->errors, "errors");
+ $idproduct = getDolGlobalString($constname);
+ if ($idproduct > 0) {
+ $resprod = $product->fetch($idproduct);
+ if ($resprod > 0) {
+ print $product->getNomUrl(1);
+ } elseif ($resprod < 0) {
+ setEventMessages($product->error, $product->errors, "errors");
+ }
}
} else {
print getDolGlobalString($constname);
}
- print ' ';
+ print '';
+
+ print '';
}
}
diff --git a/htdocs/admin/facture.php b/htdocs/admin/facture.php
index cdb7794c4d2..d2e1ec4ea25 100644
--- a/htdocs/admin/facture.php
+++ b/htdocs/admin/facture.php
@@ -232,6 +232,37 @@ if ($action == 'updateMask') {
if (!($res > 0)) {
$error++;
}
+} elseif (preg_match('/set_(.*)/', $action, $reg)) {
+ $code = $reg[1];
+ $value = (GETPOST($code) ? GETPOST($code) : 1);
+
+ $res = dolibarr_set_const($db, $code, $value, 'chaine', 0, '', $conf->entity);
+ if (!($res > 0)) {
+ $error++;
+ }
+
+ if ($error) {
+ setEventMessages($langs->trans('Error'), null, 'errors');
+ } else {
+ setEventMessages($langs->trans('SetupSaved'), null, 'mesgs');
+ header("Location: " . $_SERVER["PHP_SELF"]);
+ exit();
+ }
+} elseif (preg_match('/del_(.*)/', $action, $reg)) {
+ $code = $reg[1];
+ $res = dolibarr_del_const($db, $code, $conf->entity);
+
+ if (!($res > 0)) {
+ $error++;
+ }
+
+ if ($error) {
+ setEventMessages($langs->trans('Error'), null, 'errors');
+ } else {
+ setEventMessages($langs->trans('SetupSaved'), null, 'mesgs');
+ header("Location: " . $_SERVER["PHP_SELF"]);
+ exit();
+ }
}
@@ -771,20 +802,15 @@ print '';
print ''.$langs->trans("InvoiceCheckPosteriorDate"). ' ' ;
print $form->textwithpicto('', $langs->trans("InvoiceCheckPosteriorDateHelp"), 1, 'help') . ' ';
-print '';
-if ($conf->use_javascript_ajax) {
- print ajax_constantonoff('INVOICE_CHECK_POSTERIOR_DATE');
-} else {
- print '';
- print ' ';
- print ' ';
- $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
- print $form->selectarray("INVOICE_CHECK_POSTERIOR_DATE", $arrval, $conf->global->INVOICE_CHECK_POSTERIOR_DATE);
- print ' ';
- print '';
- print ' ';
- print '';
-}
+print ' ';
+print ajax_constantonoff('INVOICE_CHECK_POSTERIOR_DATE');
+print ' ';
+
+// Allow external download
+print '';
+print ''.$langs->trans("AllowExternalDownload").' ';
+print '';
+print ajax_constantonoff('INVOICE_ALLOW_EXTERNAL_DOWNLOAD', array(), null, 0, 0, 0, 2, 0, 1);
print ' ';
print '
';
diff --git a/htdocs/admin/fckeditor.php b/htdocs/admin/fckeditor.php
index dd4748a99f1..f43ddb281bd 100644
--- a/htdocs/admin/fckeditor.php
+++ b/htdocs/admin/fckeditor.php
@@ -51,7 +51,7 @@ $modules = array(
'NOTE_PUBLIC' => 'FCKeditorForNotePublic',
'NOTE_PRIVATE' => 'FCKeditorForNotePrivate',
'SOCIETE' => 'FCKeditorForCompany',
- 'PRODUCTDESC' => 'FCKeditorForProduct',
+ //'PRODUCTDESC' => 'FCKeditorForProduct',
'DETAILS' => 'FCKeditorForProductDetails',
'USERSIGN' => 'FCKeditorForUserSignature',
'MAILING' => 'FCKeditorForMailing',
@@ -93,7 +93,7 @@ foreach ($modules as $const => $desc) {
if ($action == 'enable_'.strtolower($const)) {
dolibarr_set_const($db, "FCKEDITOR_ENABLE_".$const, "1", 'chaine', 0, '', $conf->entity);
// If fckeditor is active in the product/service description, it is activated in the forms
- if ($const == 'PRODUCTDESC' && !empty($conf->global->PRODUIT_DESC_IN_FORM)) {
+ if ($const == 'PRODUCTDESC' && getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
dolibarr_set_const($db, "FCKEDITOR_ENABLE_DETAILS", "1", 'chaine', 0, '', $conf->entity);
}
header("Location: ".$_SERVER["PHP_SELF"]);
@@ -166,7 +166,12 @@ if (empty($conf->use_javascript_ajax)) {
print ''."\n";
print '
';
print ''.img_object("", $picto[$const]).' ';
- print ''.$langs->trans($desc).' ';
+ print '';
+ print $langs->trans($desc);
+ if ($const == 'DETAILS') {
+ print ''.$langs->trans("FCKeditorForProductDetails2").' ';
+ }
+ print ' ';
print '';
$value = (isset($conf->global->$constante) ? $conf->global->$constante : 0);
if ($value == 0) {
@@ -185,6 +190,7 @@ if (empty($conf->use_javascript_ajax)) {
print ''."\n";
print ' ';
+ print ' ';
// Skins
show_skin(null, 1);
@@ -219,7 +225,7 @@ if (empty($conf->use_javascript_ajax)) {
print $conf->global->FCKEDITOR_TEST;
print '';
}
- print $form->buttonsSaveCancel("Save", '');
+ print $form->buttonsSaveCancel("Save", '', null, 0, 'reposition');
print '
';
print ' '."\n";
diff --git a/htdocs/admin/fichinter.php b/htdocs/admin/fichinter.php
index 4e4438263c3..cf637d37329 100644
--- a/htdocs/admin/fichinter.php
+++ b/htdocs/admin/fichinter.php
@@ -208,6 +208,32 @@ if ($action == 'updateMask') {
$error++;
}
+ if (!$error) {
+ setEventMessages($langs->trans("SetupSaved"), null, 'mesgs');
+ } else {
+ setEventMessages($langs->trans("Error"), null, 'errors');
+ }
+} elseif ($action == "set_FICHINTER_ALLOW_ONLINE_SIGN") {
+ $val = GETPOST('FICHINTER_ALLOW_ONLINE_SIGN', 'alpha');
+ $res = dolibarr_set_const($db, "FICHINTER_ALLOW_ONLINE_SIGN", ($val == 'on' ? 1 : 0), 'bool', 0, '', $conf->entity);
+
+ if (!($res > 0)) {
+ $error++;
+ }
+
+ if (!$error) {
+ setEventMessages($langs->trans("SetupSaved"), null, 'mesgs');
+ } else {
+ setEventMessages($langs->trans("Error"), null, 'errors');
+ }
+} elseif ($action == "set_FICHINTER_ALLOW_EXTERNAL_DOWNLOAD") {
+ $val = GETPOST('FICHINTER_ALLOW_EXTERNAL_DOWNLOAD', 'alpha');
+ $res = dolibarr_set_const($db, "FICHINTER_ALLOW_EXTERNAL_DOWNLOAD", ($val == 'on' ? 1 : 0), 'bool', 0, '', $conf->entity);
+
+ if (!($res > 0)) {
+ $error++;
+ }
+
if (!$error) {
setEventMessages($langs->trans("SetupSaved"), null, 'mesgs');
} else {
@@ -594,6 +620,39 @@ print ' ';
print ' ';
print '';
+// Allow online signing
+print '
';
+print ' ';
+print ' ';
+print '';
+print '';
+print $langs->trans("AllowOnlineSign");
+print ' ';
+print '';
+print ' ';
+print ' ';
+print '';
+print ' ';
+print ' ';
+print ' ';
+print ' ';
+// Allow external download
+print '
';
+print ' ';
+print ' ';
+print '';
+print '';
+print $langs->trans("AllowExternalDownload");
+print ' ';
+print '';
+print ' ';
+print ' ';
+print '';
+print ' ';
+print ' ';
+print ' ';
+print ' ';
+
print '
';
print '';
diff --git a/htdocs/admin/geoipmaxmind.php b/htdocs/admin/geoipmaxmind.php
index c7373fd02db..8f76f9a7b2b 100644
--- a/htdocs/admin/geoipmaxmind.php
+++ b/htdocs/admin/geoipmaxmind.php
@@ -53,27 +53,20 @@ if ($action == 'set') {
$error++;
}
- if (!$error && $gimcdf && !file_exists($gimcdf)) {
- setEventMessages($langs->trans("ErrorFileNotFound", $gimcdf), null, 'errors');
+ $res1 = dolibarr_set_const($db, "GEOIP_VERSION", GETPOST('geoipversion', 'aZ09'), 'chaine', 0, '', $conf->entity);
+ if (!($res1 > 0)) {
+ $error++;
+ }
+
+ $res2 = dolibarr_set_const($db, "GEOIPMAXMIND_COUNTRY_DATAFILE", $gimcdf, 'chaine', 0, '', $conf->entity);
+ if (!($res2 > 0)) {
$error++;
}
if (!$error) {
- $res1 = dolibarr_set_const($db, "GEOIP_VERSION", GETPOST('geoipversion', 'aZ09'), 'chaine', 0, '', $conf->entity);
- if (!($res1 > 0)) {
- $error++;
- }
-
- $res2 = dolibarr_set_const($db, "GEOIPMAXMIND_COUNTRY_DATAFILE", $gimcdf, 'chaine', 0, '', $conf->entity);
- if (!($res2 > 0)) {
- $error++;
- }
-
- if (!$error) {
- setEventMessages($langs->trans("SetupSaved"), null, 'mesgs');
- } else {
- setEventMessages($langs->trans("Error"), null, 'errors');
- }
+ setEventMessages($langs->trans("SetupSaved"), null, 'mesgs');
+ } else {
+ //setEventMessages($langs->trans("Error"), null, 'errors');
}
}
@@ -112,8 +105,8 @@ print ' \n";
// Lib version
-print ''.$langs->trans("GeoIPLibVersion").' ';
-print '';
+print ' '.$langs->trans("GeoIPLibVersion").' ';
+print '';
$arrayofvalues = array('php' => 'Native PHP functions', '1' => 'Embedded GeoIP v1', '2' => 'Embedded GeoIP v2');
print $form->selectarray('geoipversion', $arrayofvalues, (isset($conf->global->GEOIP_VERSION) ? $conf->global->GEOIP_VERSION : '2'));
if ($conf->global->GEOIP_VERSION == 'php') {
@@ -124,16 +117,29 @@ if ($conf->global->GEOIP_VERSION == 'php') {
print ' '.$langs->trans("Version").': '.$version;
}
}
+print ' ';
+print '';
print ' ';
+$gimcdf = getDolGlobalString('GEOIPMAXMIND_COUNTRY_DATAFILE');
+
// Path to database file
print ''.$langs->trans("PathToGeoIPMaxmindCountryDataFile").' ';
-print '';
-
+print ' ';
if ($conf->global->GEOIP_VERSION == 'php') {
print 'Using geoip PHP internal functions. Value must be '.geoip_db_filename(GEOIP_COUNTRY_EDITION).' or '.geoip_db_filename(GEOIP_CITY_EDITION_REV1).' or /pathtodatafile/GeoLite2-Country.mmdb ';
}
-print ' ';
+print ' ';
+if (!file_exists($gimcdf)) {
+ print ''.$langs->trans("ErrorFileNotFound", $gimcdf).'
';
+}
+print ' ';
+print '';
+print $langs->trans("Example").' ';
+print '/usr/local/share/GeoIP/GeoIP.dat
+/usr/share/GeoIP/GeoIP.dat
+/usr/share/GeoIP/GeoLite2-Country.mmdb';
+print ' ';
print ' ';
print '
';
@@ -145,12 +151,16 @@ print ' ';
print $langs->trans("NoteOnPathLocation").' ';
$url1 = 'http://www.maxmind.com/en/city?rId=awstats';
-print $langs->trans("YouCanDownloadFreeDatFileTo", ''.$url1.' ');
+$textoshow = $langs->trans("YouCanDownloadFreeDatFileTo", '{s1}');
+$textoshow = str_replace('{s1}', ''.$url1.' ', $textoshow);
+print $textoshow;
print ' ';
$url2 = 'http://www.maxmind.com/en/city?rId=awstats';
-print $langs->trans("YouCanDownloadAdvancedDatFileTo", ''.$url2.' ');
+$textoshow = $langs->trans("YouCanDownloadAdvancedDatFileTo", '{s1}');
+$textoshow = str_replace('{s1}', ''.$url2.' ', $textoshow);
+print $textoshow;
if ($geoip) {
print ' ';
diff --git a/htdocs/admin/limits.php b/htdocs/admin/limits.php
index 3d92dd5023f..c1f31282dcd 100644
--- a/htdocs/admin/limits.php
+++ b/htdocs/admin/limits.php
@@ -1,5 +1,5 @@
+/* Copyright (C) 2007-2022 Laurent Destailleur
* Copyright (C) 2009-2018 Regis Houssin
* Copyright (C) 2010 Juanjo Menent
*
@@ -30,11 +30,8 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
// Load translation files required by the page
$langs->loadLangs(array('companies', 'products', 'admin'));
-if (!$user->admin) {
- accessforbidden();
-}
-
$action = GETPOST('action', 'aZ09');
+$cancel = GETPOST('cancel', 'aZ09');
$currencycode = GETPOST('currencycode', 'alpha');
if (isModEnabled('multicompany') && !empty($conf->global->MULTICURRENCY_USE_LIMIT_BY_CURRENCY)) {
@@ -49,25 +46,36 @@ $mainroundingruletot = 'MAIN_ROUNDING_RULE_TOT'.(!empty($currencycode) ? '_'.$cu
$valmainmaxdecimalsunit = GETPOST($mainmaxdecimalsunit, 'int');
$valmainmaxdecimalstot = GETPOST($mainmaxdecimalstot, 'int');
-$valmainmaxdecimalsshown = GETPOST($mainmaxdecimalsshown, 'int');
+$valmainmaxdecimalsshown = GETPOST($mainmaxdecimalsshown, 'alpha'); // Can be 'x.y' but also 'x...'
$valmainroundingruletot = price2num(GETPOST($mainroundingruletot, 'alphanohtml'), '', 2);
-if ($action == 'update') {
+if (!$user->admin) {
+ accessforbidden();
+}
+
+
+/*
+ * Actions
+ */
+
+if ($action == 'update' && !$cancel) {
$error = 0;
$MAXDEC = 8;
- if ($_POST[$mainmaxdecimalsunit] > $MAXDEC
- || $_POST[$mainmaxdecimalstot] > $MAXDEC
- || $_POST[$mainmaxdecimalsshown] > $MAXDEC) {
+ if ($valmainmaxdecimalsunit > $MAXDEC
+ || $valmainmaxdecimalstot > $MAXDEC
+ || $valmainmaxdecimalsshown > $MAXDEC) {
$error++;
setEventMessages($langs->trans("ErrorDecimalLargerThanAreForbidden", $MAXDEC), null, 'errors');
+ $action = 'edit';
}
- if ($_POST[$mainmaxdecimalsunit].(!empty($currencycode) ? '_'.$currencycode : '') < 0
- || $_POST[$mainmaxdecimalstot] < 0
- || $_POST[$mainmaxdecimalsshown] < 0) {
+ if ($valmainmaxdecimalsunit < 0
+ || $valmainmaxdecimalstot < 0
+ || $valmainmaxdecimalsshown < 0) {
$langs->load("errors");
$error++;
setEventMessages($langs->trans("ErrorNegativeValueNotAllowed"), null, 'errors');
+ $action = 'edit';
}
if ($valmainroundingruletot) {
@@ -75,9 +83,23 @@ if ($action == 'update') {
$langs->load("errors");
$error++;
setEventMessages($langs->trans("ErrorMAIN_ROUNDING_RULE_TOTCanMAIN_MAX_DECIMALS_TOT"), null, 'errors');
+ $action = 'edit';
}
}
+ if ((float) $valmainmaxdecimalsshown == 0) {
+ $langs->load("errors");
+ $error++;
+ setEventMessages($langs->trans("ErrorValueCantBeNull", dol_trunc(dol_string_nohtmltag($langs->transnoentitiesnoconv("MAIN_MAX_DECIMALS_SHOWN")), 40)), null, 'errors');
+ $action = 'edit';
+ }
+ if (! $error && ((float) $valmainmaxdecimalsshown < $valmainmaxdecimalsunit || (float) $valmainmaxdecimalsshown < $valmainmaxdecimalstot)) {
+ $langs->load("errors");
+ $error++;
+ setEventMessages($langs->trans("ErrorValueForTooLow", dol_trunc(dol_string_nohtmltag($langs->transnoentitiesnoconv("MAIN_MAX_DECIMALS_SHOWN")), 40)), null, 'errors');
+ $action = 'edit';
+ }
+
if (!$error) {
dolibarr_set_const($db, $mainmaxdecimalsunit, $valmainmaxdecimalsunit, 'chaine', 0, '', $conf->entity);
dolibarr_set_const($db, $mainmaxdecimalstot, $valmainmaxdecimalstot, 'chaine', 0, '', $conf->entity);
@@ -144,24 +166,25 @@ if ($action == 'edit') {
print '';
print $form->textwithpicto($langs->trans("MAIN_MAX_DECIMALS_UNIT"), $langs->trans("ParameterActiveForNextInputOnly"));
- print ' ';
+ print ' ';
print '';
print $form->textwithpicto($langs->trans("MAIN_MAX_DECIMALS_TOT"), $langs->trans("ParameterActiveForNextInputOnly"));
- print ' ';
+ print ' ';
print ''.$langs->trans("MAIN_MAX_DECIMALS_SHOWN").' ';
- print ' ';
+ print ' ';
print '';
print $form->textwithpicto($langs->trans("MAIN_ROUNDING_RULE_TOT"), $langs->trans("ParameterActiveForNextInputOnly"));
- print ' ';
+ print ' ';
print '
';
- print ' ';
print '';
- print ' ';
+ print ' ';
+ print ' ';
+ print ' ';
print '
';
print ' ';
@@ -170,7 +193,7 @@ if ($action == 'edit') {
} else {
print '';
print '
';
- print ''.$langs->trans("Parameter").' '.$langs->trans("Value").' ';
+ print ''.$langs->trans("Parameter").' '.$langs->trans("Value").' ';
print '';
print $form->textwithpicto($langs->trans("MAIN_MAX_DECIMALS_UNIT"), $langs->trans("ParameterActiveForNextInputOnly"));
@@ -191,7 +214,7 @@ if ($action == 'edit') {
print '';
print '';
}
diff --git a/htdocs/admin/mailing.php b/htdocs/admin/mailing.php
index ab4b747e21c..c88bb1bc4d5 100644
--- a/htdocs/admin/mailing.php
+++ b/htdocs/admin/mailing.php
@@ -123,31 +123,35 @@ print '';
print '';
print ''.$langs->trans("Parameter").' ';
print ''.$langs->trans("Value").' ';
-print ''.$langs->trans("Example").' ';
+print ''.$langs->trans("Example").' ';
print " \n";
print '';
-print $langs->trans("MailingEMailFrom").' ';
-print ' ';
+$help = img_help(1, $langs->trans("EMailHelpMsgSPFDKIM"));
+print $langs->trans("MailingEMailFrom").' '.$help.' ';
+print ' ';
if (!empty($conf->global->MAILING_EMAIL_FROM) && !isValidEmail($conf->global->MAILING_EMAIL_FROM)) {
print ' '.img_warning($langs->trans("BadEMail"));
}
-print ' '.dol_escape_htmltag(($mysoc->name ? $mysoc->name : 'MyName').' ').' ';
+print '';
+print ''.dol_escape_htmltag(($mysoc->name ? $mysoc->name : 'MyName').' ').' ';
print ' ';
print '';
print $langs->trans("MailingEMailError").' ';
-print ' ';
+print ' ';
if (!empty($conf->global->MAILING_EMAIL_ERRORSTO) && !isValidEmail($conf->global->MAILING_EMAIL_ERRORSTO)) {
print ' '.img_warning($langs->trans("BadEMail"));
}
-print ' webmaster@example.com> ';
+print '';
+print 'webmaster@example.com> ';
print ' ';
print '';
print $langs->trans("MailingDelay").' ';
print ' ';
-print ' ';
+print '';
+print ' ';
print ' ';
@@ -156,11 +160,12 @@ print '';
print '';
print $langs->trans("ActivateCheckReadKey").' ';
-print ' ';
+print ' ';
if (!empty($conf->use_javascript_ajax)) {
print ' '.img_picto($langs->trans('Generate'), 'refresh', 'id="generate_token" class="linkobject"');
}
-print ' ';
+print '';
+print ' ';
print ' ';
// default blacklist from mailing
@@ -170,7 +175,7 @@ print '';
$blacklist_setting=array(0=>$langs->trans('No'), 1=>$langs->trans('Yes'), 2=>$langs->trans('DefaultStatusEmptyMandatory'));
print $form->selectarray("MAILING_CONTACT_DEFAULT_BULK_STATUS", $blacklist_setting, $conf->global->MAILING_CONTACT_DEFAULT_BULK_STATUS);
print ' ';
-print ' ';
+print ' ';
print '';
@@ -178,7 +183,8 @@ if (!empty($conf->use_javascript_ajax) && $conf->global->MAIN_FEATURES_LEVEL >=
print '';
print $langs->trans("MailAdvTargetRecipients").' ';
print ajax_constantonoff('EMAILING_USE_ADVANCED_SELECTOR');
- print ' ';
+ print '';
+ print ' ';
print ' ';
}
diff --git a/htdocs/admin/mails.php b/htdocs/admin/mails.php
index ff24a708797..e9a8132188c 100644
--- a/htdocs/admin/mails.php
+++ b/htdocs/admin/mails.php
@@ -34,14 +34,15 @@ $langs->loadLangs(array("companies", "products", "admin", "mails", "other", "err
$action = GETPOST('action', 'aZ09');
$cancel = GETPOST('cancel', 'aZ09');
+$trackid = GETPOST('trackid');
+
if (!$user->admin) {
accessforbidden();
}
$usersignature = $user->signature;
-// For action = test or send, we ensure that content is not html, even for signature, because this we want a test with NO html.
-
-if ($action == 'test' || $action == 'send') {
+// For action = test or send, we ensure that content is not html, even for signature, because for this we want a test with NO html.
+if ($action == 'test' || ($action == 'send' && $trackid = 'test')) {
$usersignature = dol_string_nohtmltag($usersignature, 2);
}
@@ -118,6 +119,11 @@ if ($action == 'update' && !$cancel) {
}
}
+if ($action == 'disablephpmailwarning' && !$cancel) {
+ dolibarr_set_const($db, 'MAIN_HIDE_WARNING_TO_ENCOURAGE_SMTP_SETUP', 1, 'chaine', 1, 0, $conf->entity);
+
+ setEventMessages($langs->trans("WarningDisabled"), null, 'mesgs');
+}
// Actions to send emails
$id = 0;
@@ -125,7 +131,7 @@ $actiontypecode = ''; // Not an event for agenda
$triggersendname = ''; // Disable triggers
$paramname = 'id';
$mode = 'emailfortest';
-$trackid = (($action == 'testhtml') ? "testhtml" : "test");
+$trackid = ($action == 'send' ? GETPOST('trackid', 'aZ09') : $action);
$sendcontext = '';
include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
@@ -138,7 +144,6 @@ if ($action == 'presend' && GETPOST('trackid', 'alphanohtml') == 'testhtml') {
-
/*
* View
*/
@@ -375,7 +380,7 @@ if ($action == 'edit') {
// SuperAdministrator access only
if ((empty($conf->global->MAIN_MODULE_MULTICOMPANY)) || ($user->admin && !$user->entity)) {
- print $form->selectarray('MAIN_MAIL_SENDMODE', $listofmethods, $conf->global->MAIN_MAIL_SENDMODE);
+ print $form->selectarray('MAIN_MAIL_SENDMODE', $listofmethods, getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail'));
} else {
$text = $listofmethods[$conf->global->MAIN_MAIL_SENDMODE];
if (empty($text)) {
@@ -383,13 +388,13 @@ if ($action == 'edit') {
}
$htmltext = $langs->trans("ContactSuperAdminForChange");
print $form->textwithpicto($text, $htmltext, 1, 'superadmin');
- print ' ';
+ print ' ';
}
print '';
// Host server
print '';
- if (!$conf->use_javascript_ajax && $linuxlike && $conf->global->MAIN_MAIL_SENDMODE == 'mail') {
+ if (!$conf->use_javascript_ajax && $linuxlike && getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail') == 'mail') {
print '';
print $langs->trans("MAIN_MAIL_SMTP_SERVER_NotAvailableOnLinuxLike");
print ' ';
@@ -423,7 +428,7 @@ if ($action == 'edit') {
// Port
print ' ';
- if (!$conf->use_javascript_ajax && $linuxlike && $conf->global->MAIN_MAIL_SENDMODE == 'mail') {
+ if (!$conf->use_javascript_ajax && $linuxlike && getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail') == 'mail') {
print $langs->trans("MAIN_MAIL_SMTP_PORT_NotAvailableOnLinuxLike");
print ' ';
print ''.$langs->trans("SeeLocalSendMailSetup").' ';
@@ -450,8 +455,27 @@ if ($action == 'edit') {
}
print ' ';
+ // Auth mode
+ if (!empty($conf->use_javascript_ajax) || (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail'), array('smtps', 'swiftmailer')))) {
+ print ''.$langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE").' ';
+ if (!isModEnabled('multicompany') || ($user->admin && !$user->entity)) {
+ // Note: Default value for MAIN_MAIL_SMTPS_AUTH_TYPE if not defined is 'LOGIN' (but login/pass may be empty and they won't be provided in such a case)
+ print ' ';
+ print ''.$langs->trans("UsePassword").' ';
+ print ' ';
+ print ' ';
+ print ''.$form->textwithpicto($langs->trans("UseOauth"), $langs->trans("OauthNotAvailableForAllAndHadToBeCreatedBefore")).' ';
+ } else {
+ $value = getDolGlobalString('MAIN_MAIL_SMTPS_AUTH_TYPE', 'LOGIN');
+ $htmltext = $langs->trans("ContactSuperAdminForChange");
+ print $form->textwithpicto($langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE"), $htmltext, 1, 'superadmin');
+ print ' ';
+ }
+ print ' ';
+ }
+
// ID
- if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer')))) {
+ if (!empty($conf->use_javascript_ajax) || (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail'), array('smtps', 'swiftmailer')))) {
$mainstmpid = (!empty($conf->global->MAIN_MAIL_SMTPS_ID) ? $conf->global->MAIN_MAIL_SMTPS_ID : '');
print ''.$langs->trans("MAIN_MAIL_SMTPS_ID").' ';
// SuperAdministrator access only
@@ -466,26 +490,8 @@ if ($action == 'edit') {
}
- // OAUTH
- if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer')))) {
- print ' '.$langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE").' ';
- if (!isModEnabled('multicompany') || ($user->admin && !$user->entity)) {
- print ' ';
- print ''.$langs->trans("UsePassword").' ';
- print ' ';
- print ' ';
- print ''.$form->textwithpicto($langs->trans("UseOauth"), $langs->trans("OauthNotAvailableForAllAndHadToBeCreatedBefore")).' ';
- } else {
- $value = getDolGlobalString('MAIN_MAIL_SMTPS_AUTH_TYPE', 'LOGIN');
- $htmltext = $langs->trans("ContactSuperAdminForChange");
- print $form->textwithpicto($langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE"), $htmltext, 1, 'superadmin');
- print ' ';
- }
- print ' ';
- }
-
// PW
- if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer')))) {
+ if (!empty($conf->use_javascript_ajax) || (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail'), array('smtps', 'swiftmailer')))) {
$mainsmtppw = (!empty($conf->global->MAIN_MAIL_SMTPS_PW) ? $conf->global->MAIN_MAIL_SMTPS_PW : '');
print '';
print $form->textwithpicto($langs->trans("MAIN_MAIL_SMTPS_PW"), $langs->trans("WithGMailYouCanCreateADedicatedPassword"));
@@ -502,7 +508,7 @@ if ($action == 'edit') {
}
// OAUTH service provider
- if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer')))) {
+ if (!empty($conf->use_javascript_ajax) || (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail'), array('smtps', 'swiftmailer')))) {
print ' '.$langs->trans("MAIN_MAIL_SMTPS_OAUTH_SERVICE").' ';
// SuperAdministrator access only
@@ -521,7 +527,7 @@ if ($action == 'edit') {
}
// TLS
print ' '.$langs->trans("MAIN_MAIL_EMAIL_TLS").' ';
- if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer')))) {
+ if (!empty($conf->use_javascript_ajax) || (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail'), array('smtps', 'swiftmailer')))) {
if (function_exists('openssl_open')) {
print $form->selectyesno('MAIN_MAIL_EMAIL_TLS', (!empty($conf->global->MAIN_MAIL_EMAIL_TLS) ? $conf->global->MAIN_MAIL_EMAIL_TLS : 0), 1);
} else {
@@ -534,7 +540,7 @@ if ($action == 'edit') {
// STARTTLS
print ' '.$langs->trans("MAIN_MAIL_EMAIL_STARTTLS").' ';
- if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer')))) {
+ if (!empty($conf->use_javascript_ajax) || (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail'), array('smtps', 'swiftmailer')))) {
if (function_exists('openssl_open')) {
print $form->selectyesno('MAIN_MAIL_EMAIL_STARTTLS', (!empty($conf->global->MAIN_MAIL_EMAIL_STARTTLS) ? $conf->global->MAIN_MAIL_EMAIL_STARTTLS : 0), 1);
} else {
@@ -547,7 +553,7 @@ if ($action == 'edit') {
// SMTP_ALLOW_SELF_SIGNED
print ' '.$langs->trans("MAIN_MAIL_EMAIL_SMTP_ALLOW_SELF_SIGNED").' ';
- if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer')))) {
+ if (!empty($conf->use_javascript_ajax) || (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail'), array('smtps', 'swiftmailer')))) {
if (function_exists('openssl_open')) {
print $form->selectyesno('MAIN_MAIL_EMAIL_SMTP_ALLOW_SELF_SIGNED', (!empty($conf->global->MAIN_MAIL_EMAIL_SMTP_ALLOW_SELF_SIGNED) ? $conf->global->MAIN_MAIL_EMAIL_SMTP_ALLOW_SELF_SIGNED : 0), 1);
} else {
@@ -560,7 +566,7 @@ if ($action == 'edit') {
// DKIM
print ' '.$langs->trans("MAIN_MAIL_EMAIL_DKIM_ENABLED").' ';
- if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('swiftmailer')))) {
+ if (!empty($conf->use_javascript_ajax) || (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail'), array('swiftmailer')))) {
if (function_exists('openssl_open')) {
print $form->selectyesno('MAIN_MAIL_EMAIL_DKIM_ENABLED', (!empty($conf->global->MAIN_MAIL_EMAIL_DKIM_ENABLED) ? $conf->global->MAIN_MAIL_EMAIL_DKIM_ENABLED : 0), 1);
} else {
@@ -594,7 +600,8 @@ if ($action == 'edit') {
print ' '.$langs->trans("OtherOptions").' ';
// From
- print ''.$langs->trans("MAIN_MAIL_EMAIL_FROM", ini_get('sendmail_from') ?ini_get('sendmail_from') : $langs->transnoentities("Undefined")).' ';
+ $help = img_help(1, $langs->trans("EMailHelpMsgSPFDKIM"));
+ print ''.$langs->trans("MAIN_MAIL_EMAIL_FROM", ini_get('sendmail_from') ?ini_get('sendmail_from') : $langs->transnoentities("Undefined")).' '.$help.' ';
print ' ';
@@ -671,20 +678,21 @@ if ($action == 'edit') {
// Method
print ''.$langs->trans("MAIN_MAIL_SENDMODE").' ';
- $text = $listofmethods[$conf->global->MAIN_MAIL_SENDMODE];
+ $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail')];
if (empty($text)) {
$text = $langs->trans("Undefined").img_warning();
}
print $text;
- if ($conf->global->MAIN_MAIL_SENDMODE == 'mail' && empty($conf->global->MAIN_HIDE_WARNING_TO_ENCOURAGE_SMTP_SETUP)) {
- print $form->textwithpicto('', $langs->trans("WarningPHPMail").' '.$langs->trans("WarningPHPMailA").' '.$langs->trans("WarningPHPMailB").' '.$langs->trans("WarningPHPMailC").' '.$langs->trans("WarningPHPMailD"), 1, 'warning');
+ if (getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail') == 'mail' && empty($conf->global->MAIN_HIDE_WARNING_TO_ENCOURAGE_SMTP_SETUP)) {
+ $textwarning = $langs->trans("WarningPHPMail").' '.$langs->trans("WarningPHPMailA").' '.$langs->trans("WarningPHPMailB").' '.$langs->trans("WarningPHPMailC").' '.$langs->trans("WarningPHPMailD");
+ print $form->textwithpicto('', $textwarning, 1, 'warning');
}
print ' ';
// Host server
- if ($linuxlike && (getDolGlobalString('MAIN_MAIL_SENDMODE') == 'mail')) {
+ if ($linuxlike && (getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail') == 'mail')) {
print ''.$langs->trans("MAIN_MAIL_SMTP_SERVER_NotAvailableOnLinuxLike").' '.$langs->trans("SeeLocalSendMailSetup").' ';
} else {
print ''.$langs->trans("MAIN_MAIL_SMTP_SERVER", ini_get('SMTP') ?ini_get('SMTP') : $langs->transnoentities("Undefined")).' '.(!empty($conf->global->MAIN_MAIL_SMTP_SERVER) ? $conf->global->MAIN_MAIL_SMTP_SERVER : '').' ';
@@ -692,31 +700,31 @@ if ($action == 'edit') {
// Port
- if ($linuxlike && (getDolGlobalString('MAIN_MAIL_SENDMODE') == 'mail')) {
+ if ($linuxlike && (getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail') == 'mail')) {
print ''.$langs->trans("MAIN_MAIL_SMTP_PORT_NotAvailableOnLinuxLike").' '.$langs->trans("SeeLocalSendMailSetup").' ';
} else {
print ''.$langs->trans("MAIN_MAIL_SMTP_PORT", ini_get('smtp_port') ?ini_get('smtp_port') : $langs->transnoentities("Undefined")).' '.(!empty($conf->global->MAIN_MAIL_SMTP_PORT) ? $conf->global->MAIN_MAIL_SMTP_PORT : '').' ';
}
- // SMTPS ID
- if (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE'), array('smtps', 'swiftmailer'))) {
- print ''.$langs->trans("MAIN_MAIL_SMTPS_ID").' '.$conf->global->MAIN_MAIL_SMTPS_ID.' ';
- }
-
// AUTH method
- if (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE'), array('smtps', 'swiftmailer'))) {
+ if (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail'), array('smtps', 'swiftmailer'))) {
$authtype = getDolGlobalString('MAIN_MAIL_SMTPS_AUTH_TYPE', 'LOGIN');
$text = ($authtype === "LOGIN") ? $langs->trans("UsePassword") : ($authtype === "XOAUTH2" ? $langs->trans("UseOauth") : '') ;
print ''.$langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE").' '.$text.' ';
}
+ // SMTPS ID
+ if (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail'), array('smtps', 'swiftmailer'))) {
+ print ''.$langs->trans("MAIN_MAIL_SMTPS_ID").' '.$conf->global->MAIN_MAIL_SMTPS_ID.' ';
+ }
+
// SMTPS PW
- if (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE'), array('smtps', 'swiftmailer')) && getDolGlobalString('MAIN_MAIL_SMTPS_AUTH_TYPE') != "XOAUTH2") {
+ if (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail'), array('smtps', 'swiftmailer')) && getDolGlobalString('MAIN_MAIL_SMTPS_AUTH_TYPE') != "XOAUTH2") {
print ''.$langs->trans("MAIN_MAIL_SMTPS_PW").' '.preg_replace('/./', '*', $conf->global->MAIN_MAIL_SMTPS_PW).' ';
}
// SMTPS oauth service
- if (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE'), array('smtps', 'swiftmailer')) && getDolGlobalString('MAIN_MAIL_SMTPS_AUTH_TYPE') === "XOAUTH2") {
+ if (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail'), array('smtps', 'swiftmailer')) && getDolGlobalString('MAIN_MAIL_SMTPS_AUTH_TYPE') === "XOAUTH2") {
$text = $oauthservices[$conf->global->MAIN_MAIL_SMTPS_OAUTH_SERVICE];
if (empty($text)) {
$text = $langs->trans("Undefined").img_warning();
@@ -726,7 +734,7 @@ if ($action == 'edit') {
// TLS
print ''.$langs->trans("MAIN_MAIL_EMAIL_TLS").' ';
- if (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer'))) {
+ if (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail'), array('smtps', 'swiftmailer'))) {
if (function_exists('openssl_open')) {
print yn($conf->global->MAIN_MAIL_EMAIL_TLS);
} else {
@@ -739,7 +747,7 @@ if ($action == 'edit') {
// STARTTLS
print ' '.$langs->trans("MAIN_MAIL_EMAIL_STARTTLS").' ';
- if (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer'))) {
+ if (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail'), array('smtps', 'swiftmailer'))) {
if (function_exists('openssl_open')) {
print yn($conf->global->MAIN_MAIL_EMAIL_STARTTLS);
} else {
@@ -752,7 +760,7 @@ if ($action == 'edit') {
// SMTP_ALLOW_SELF_SIGNED
print ' '.$langs->trans("MAIN_MAIL_EMAIL_SMTP_ALLOW_SELF_SIGNED").' ';
- if (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer'))) {
+ if (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail'), array('smtps', 'swiftmailer'))) {
if (function_exists('openssl_open')) {
print yn($conf->global->MAIN_MAIL_EMAIL_SMTP_ALLOW_SELF_SIGNED);
} else {
@@ -767,7 +775,7 @@ if ($action == 'edit') {
if ($conf->global->MAIN_MAIL_SENDMODE == 'swiftmailer') {
// DKIM
print ' '.$langs->trans("MAIN_MAIL_EMAIL_DKIM_ENABLED").' ';
- if (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('swiftmailer'))) {
+ if (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail'), array('swiftmailer'))) {
if (function_exists('openssl_open')) {
print yn(getDolGlobalInt('MAIN_MAIL_EMAIL_DKIM_ENABLED'));
} else {
@@ -797,8 +805,14 @@ if ($action == 'edit') {
print '
';
print '';
- if ($conf->global->MAIN_MAIL_SENDMODE == 'mail' && empty($conf->global->MAIN_HIDE_WARNING_TO_ENCOURAGE_SMTP_SETUP)) {
- print info_admin($langs->trans("WarningPHPMail").' '.$langs->trans("WarningPHPMailA").' '.$langs->trans("WarningPHPMailB").' '.$langs->trans("WarningPHPMailC").' '.$langs->trans("WarningPHPMailD"), 0, 0, 'warning');
+ if (getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail') == 'mail' && empty($conf->global->MAIN_HIDE_WARNING_TO_ENCOURAGE_SMTP_SETUP)) {
+ $messagetoshow = $langs->trans("WarningPHPMail").' '.$langs->trans("WarningPHPMailA").' '.$langs->trans("WarningPHPMailB").' '.$langs->trans("WarningPHPMailC").' '.$langs->trans("WarningPHPMailD");
+ $messagetoshow .= ' '.$langs->trans("WarningPHPMailDbis", '{s1}', '{s2}');
+ $linktosetvar1 = '';
+ $linktosetvar2 = ' ';
+ $messagetoshow = str_replace('{s1}', $linktosetvar1, $messagetoshow);
+ $messagetoshow = str_replace('{s2}', $linktosetvar2, $messagetoshow);
+ print info_admin($messagetoshow, 0, 0, 'warning');
}
print ' ';
@@ -808,7 +822,8 @@ if ($action == 'edit') {
print ' '.$langs->trans("OtherOptions").' ';
// From
- print ''.$langs->trans("MAIN_MAIL_EMAIL_FROM", ini_get('sendmail_from') ?ini_get('sendmail_from') : $langs->transnoentities("Undefined")).' ';
+ $help = img_help(1, $langs->trans("EMailHelpMsgSPFDKIM"));
+ print ''.$langs->trans("MAIN_MAIL_EMAIL_FROM", ini_get('sendmail_from') ?ini_get('sendmail_from') : $langs->transnoentities("Undefined")).' '.$help.' ';
print ''.$conf->global->MAIN_MAIL_EMAIL_FROM;
if (empty($conf->global->MAIN_MAIL_EMAIL_FROM)) {
print img_warning($langs->trans("Mandatory"));
@@ -903,7 +918,7 @@ if ($action == 'edit') {
print ''.$langs->trans("Modify").' ';
if (empty($conf->global->MAIN_DISABLE_ALL_MAILS)) {
- if ($conf->global->MAIN_MAIL_SENDMODE != 'mail' || !$linuxlike) {
+ if (getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail') != 'mail' || !$linuxlike) {
if (function_exists('fsockopen') && $port && $server) {
print ''.$langs->trans("DoTestServerAvailability").' ';
}
@@ -921,7 +936,7 @@ if ($action == 'edit') {
print '';
- if ($conf->global->MAIN_MAIL_SENDMODE == 'mail' && empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA)) {
+ if (getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail') == 'mail' && empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA)) {
/*
// Warning 1
if ($linuxlike)
@@ -938,11 +953,11 @@ if ($action == 'edit') {
if (!in_array($action, array('testconnect', 'test', 'testhtml'))) {
$text = '';
- if ($conf->global->MAIN_MAIL_SENDMODE == 'mail') {
+ if (getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail') == 'mail') {
//$text .= $langs->trans("WarningPHPMail"); // To encourage to use SMTPS
}
- if ($conf->global->MAIN_MAIL_SENDMODE == 'mail') {
+ if (getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail') == 'mail') {
if (!empty($conf->global->MAIN_EXTERNAL_MAIL_SPF_STRING_TO_ADD)) {
// List of string to add in SPF if the setup use the mail method. Example 'include:sendgrid.net include:spf.mydomain.com'
$text .= ($text ? ' ' : '').''.$langs->trans("WarningPHPMailSPF", $conf->global->MAIN_EXTERNAL_MAIL_SPF_STRING_TO_ADD);
diff --git a/htdocs/admin/mails_emailing.php b/htdocs/admin/mails_emailing.php
index d2eabd95e2b..b9cb57e0d80 100644
--- a/htdocs/admin/mails_emailing.php
+++ b/htdocs/admin/mails_emailing.php
@@ -34,10 +34,6 @@ $langs->loadLangs(array('companies', 'products', 'admin', 'mails', 'other', 'err
$action = GETPOST('action', 'aZ09');
$cancel = GETPOST('cancel', 'aZ09');
-if (!$user->admin) {
- accessforbidden();
-}
-
$usersignature = $user->signature;
// For action = test or send, we ensure that content is not html, even for signature, because this we want a test with NO html.
if ($action == 'test' || $action == 'send') {
@@ -61,6 +57,10 @@ $substitutionarrayfortest = array(
);
complete_substitutions_array($substitutionarrayfortest, $langs);
+// Security check
+if (!$user->admin) {
+ accessforbidden();
+}
/*
@@ -394,6 +394,25 @@ if ($action == 'edit') {
}
print ' ';
+ // AUTH method
+ if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE_EMAILING) && in_array($conf->global->MAIN_MAIL_SENDMODE_EMAILING, array('smtps', 'swiftmailer')))) {
+ print ''.$langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE").' ';
+ if (!isModEnabled('multicompany') || ($user->admin && !$user->entity)) {
+ // Note: Default value for MAIN_MAIL_SMTPS_AUTH_TYPE if not defined is 'LOGIN' (but login/pass may be empty and they won't be provided in such a case)
+ print ' ';
+ print ''.$langs->trans("UsePassword").' ';
+ print ' ';
+ print ' ';
+ print ''.$form->textwithpicto($langs->trans("UseOauth"), $langs->trans("OauthNotAvailableForAllAndHadToBeCreatedBefore")).' ';
+ } else {
+ $value = getDolGlobalString('MAIN_MAIL_SMTPS_AUTH_TYPE_EMAILING', 'LOGIN');
+ $htmltext = $langs->trans("ContactSuperAdminForChange");
+ print $form->textwithpicto($langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE"), $htmltext, 1, 'superadmin');
+ print ' ';
+ }
+ print ' ';
+ }
+
// ID
if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE_EMAILING) && in_array($conf->global->MAIN_MAIL_SENDMODE_EMAILING, array('smtps', 'swiftmailer')))) {
$mainstmpid = (!empty($conf->global->MAIN_MAIL_SMTPS_ID_EMAILING) ? $conf->global->MAIN_MAIL_SMTPS_ID_EMAILING : '');
@@ -409,24 +428,6 @@ if ($action == 'edit') {
print '';
}
- // OAUTH
- if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE_EMAILING) && in_array($conf->global->MAIN_MAIL_SENDMODE_EMAILING, array('smtps', 'swiftmailer')))) {
- print ''.$langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE").' ';
- if (empty($conf->multicompany->enabled) || ($user->admin && !$user->entity)) {
- print ' ';
- print ''.$langs->trans("UsePassword").' ';
- print ' ';
- print ' ';
- print ''.$form->textwithpicto($langs->trans("UseOauth"), $langs->trans("OauthNotAvailableForAllAndHadToBeCreatedBefore")).' ';
- } else {
- $value = getDolGlobalString('MAIN_MAIL_SMTPS_AUTH_TYPE_EMAILING', 'LOGIN');
- $htmltext = $langs->trans("ContactSuperAdminForChange");
- print $form->textwithpicto($langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE"), $htmltext, 1, 'superadmin');
- print ' ';
- }
- print ' ';
- }
-
// PW
if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE_EMAILING) && in_array($conf->global->MAIN_MAIL_SENDMODE_EMAILING, array('smtps', 'swiftmailer')))) {
$mainsmtppw = (!empty($conf->global->MAIN_MAIL_SMTPS_PW_EMAILING) ? $conf->global->MAIN_MAIL_SMTPS_PW_EMAILING : '');
@@ -442,7 +443,7 @@ if ($action == 'edit') {
print '';
}
- // OAUTH service provider
+ // OAUTH service provider
if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE_EMAILING) && in_array($conf->global->MAIN_MAIL_SENDMODE_EMAILING, array('smtps', 'swiftmailer')))) {
print ''.$langs->trans("MAIN_MAIL_SMTPS_OAUTH_SERVICE").' ';
@@ -546,11 +547,6 @@ if ($action == 'edit') {
print ' '.$langs->trans("MAIN_MAIL_SMTP_PORT", ini_get('smtp_port') ?ini_get('smtp_port') : $langs->transnoentities("Undefined")).' '.(!empty($conf->global->MAIN_MAIL_SMTP_PORT_EMAILING) ? $conf->global->MAIN_MAIL_SMTP_PORT_EMAILING : '').' ';
}
- // SMTPS ID
- if (isset($conf->global->MAIN_MAIL_SENDMODE_EMAILING) && in_array($conf->global->MAIN_MAIL_SENDMODE_EMAILING, array('smtps', 'swiftmailer'))) {
- print ''.$langs->trans("MAIN_MAIL_SMTPS_ID").' '.getDolGlobalString('MAIN_MAIL_SMTPS_ID_EMAILING').' ';
- }
-
// AUTH method
if (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING'), array('smtps', 'swiftmailer'))) {
$authtype = getDolGlobalString('MAIN_MAIL_SMTPS_AUTH_TYPE_EMAILING', 'LOGIN');
@@ -558,6 +554,11 @@ if ($action == 'edit') {
print ''.$langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE").' '.$text.' ';
}
+ // SMTPS ID
+ if (isset($conf->global->MAIN_MAIL_SENDMODE_EMAILING) && in_array($conf->global->MAIN_MAIL_SENDMODE_EMAILING, array('smtps', 'swiftmailer'))) {
+ print ''.$langs->trans("MAIN_MAIL_SMTPS_ID").' '.getDolGlobalString('MAIN_MAIL_SMTPS_ID_EMAILING').' ';
+ }
+
// SMTPS PW
if (isset($conf->global->MAIN_MAIL_SENDMODE_EMAILING) && in_array($conf->global->MAIN_MAIL_SENDMODE_EMAILING, array('smtps', 'swiftmailer')) && getDolGlobalString('MAIN_MAIL_SMTPS_AUTH_TYPE_EMAILING') != "XOAUTH2") {
print ''.$langs->trans("MAIN_MAIL_SMTPS_PW").' '.preg_replace('/./', '*', getDolGlobalString('MAIN_MAIL_SMTPS_PW_EMAILING')).' ';
@@ -707,8 +708,8 @@ if ($action == 'edit') {
$formmail->withfrom = 1;
$formmail->witherrorsto = 1;
$formmail->withto = (GETPOSTISSET('sendto') ? GETPOST('sendto', 'restricthtml') : ($user->email ? $user->email : 1));
- $formmail->withtocc = (GETPOSTISSET(['sendtocc']) ? GETPOST('sendtocc', 'restricthtml') : 1); // ! empty to keep field if empty
- $formmail->withtoccc = (GETPOSTISSET(['sendtoccc']) ? GETPOST('sendtoccc', 'restricthtml') : 1); // ! empty to keep field if empty
+ $formmail->withtocc = (GETPOSTISSET('sendtocc') ? GETPOST('sendtocc', 'restricthtml') : 1); // ! empty to keep field if empty
+ $formmail->withtoccc = (GETPOSTISSET('sendtoccc') ? GETPOST('sendtoccc', 'restricthtml') : 1); // ! empty to keep field if empty
$formmail->withtopic = (GETPOSTISSET('subject') ? GETPOST('subject') : $langs->trans("Test"));
$formmail->withtopicreadonly = 0;
$formmail->withfile = 2;
diff --git a/htdocs/admin/mails_templates.php b/htdocs/admin/mails_templates.php
index 02eef8a00d3..999bfecf562 100644
--- a/htdocs/admin/mails_templates.php
+++ b/htdocs/admin/mails_templates.php
@@ -56,7 +56,7 @@ if (isModEnabled('eventorganization')) {
$langs->loadLangs($langsArray);
$toselect = GETPOST('toselect', 'array');
-$action = GETPOST('action', 'aZ09') ?GETPOST('action', 'aZ09') : 'view';
+$action = GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view';
$massaction = GETPOST('massaction', 'alpha');
$confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
$mode = GETPOST('mode', 'aZ09');
@@ -350,7 +350,7 @@ if (empty($reshook)) {
}
setEventMessages($langs->transnoentities("ErrorFieldRequired", $langs->transnoentities($fieldnamekey)), null, 'errors');
- $action = 'add';
+ $action = 'create';
}
}
@@ -366,7 +366,7 @@ if (empty($reshook)) {
// List of values
$i = 0;
foreach ($listfieldinsert as $f => $value) {
- $keycode = $listfieldvalue[$i];
+ $keycode = isset($listfieldvalue[$i]) ? $listfieldvalue[$i] : "";
if ($value == 'lang') {
$keycode = 'langcode';
}
@@ -424,7 +424,7 @@ if (empty($reshook)) {
} else {
dol_print_error($db);
}
- $action = 'add';
+ $action = 'create';
}
}
@@ -654,7 +654,7 @@ $linkback = '';
$titlepicto = 'title_setup';
-$url = DOL_URL_ROOT.'/admin/mails_templates.php?action=add&token='.newToken();
+$url = DOL_URL_ROOT.'/admin/mails_templates.php?action=create';
$newcardbutton = dolGetButtonTitle($langs->trans('NewEMailTemplate'), '', 'fa fa-plus-circle', $url, '', $permissiontoadd);
@@ -685,10 +685,11 @@ if ($action == 'delete') {
$fieldlist = explode(',', $tabfield[$id]);
-if ($action == 'add') {
+if ($action == 'create') {
// Form to add a new line
print '';
print ' ';
+ print ' ';
print ' ';
print '';
@@ -739,7 +740,6 @@ if ($action == 'add') {
if ($fieldlist[$field] == 'content_lines') {
$valuetoshow = '';
}
-
if ($valuetoshow != '') {
print '
';
if (!empty($tabhelp[$id][$value]) && preg_match('/^http(s*):/i', $tabhelp[$id][$value])) {
@@ -820,16 +820,15 @@ if ($action == 'add') {
// Input field
if ($tmpfieldlist == 'topic') {
- print ' ';
+ print ' ';
} elseif ($tmpfieldlist == 'joinfiles') {
- print ' ';
+ print $form->selectyesno($tmpfieldlist, (isset($obj->$tmpfieldlist) ? $obj->$tmpfieldlist : '0'), 1, false, 0, 1);
} else {
- // print ''.(!empty($obj->{$fieldlist[$field]})?$obj->{$fieldlist[$field]}:'').' ';
$okforextended = true;
if (empty($conf->global->FCKEDITOR_ENABLE_MAIL)) {
$okforextended = false;
}
- $doleditor = new DolEditor($tmpfieldlist, (!empty($obj->{$tmpfieldlist}) ? $obj->{$tmpfieldlist} : ''), '', 180, 'dolibarr_mailings', 'In', 0, true, $okforextended, ROWS_4, '90%');
+ $doleditor = new DolEditor($tmpfieldlist, (!empty($obj->$tmpfieldlist) ? $obj->$tmpfieldlist : ''), '', 180, 'dolibarr_mailings', 'In', 0, true, $okforextended, ROWS_4, '90%');
print $doleditor->Create(1);
}
print '';
@@ -917,7 +916,7 @@ foreach ($fieldlist as $field => $value) {
print '';
} elseif ($value == 'fk_user') {
print ' ';
- print $form->select_dolusers($search_fk_user, 'search_fk_user', 1, null, 0, ($user->admin ? '' : 'hierarchyme'), null, 0, 0, 0, '', 0, '', 'maxwidth150');
+ print $form->select_dolusers($search_fk_user, 'search_fk_user', 1, null, 0, ($user->admin ? '' : 'hierarchyme'), null, 0, 0, 0, '', 0, '', 'maxwidth150', 1);
print ' ';
} elseif ($value == 'topic') {
print '
';
@@ -1024,7 +1023,7 @@ if ($num) {
$reshook = $hookmanager->executeHooks('editEmailTemplateFieldlist', $parameters, $obj, $tmpaction); // Note that $action and $object may have been modified by some hooks
$error = $hookmanager->error; $errors = $hookmanager->errors;
- // Show fields
+ // Show main fields
if (empty($reshook)) {
fieldList($fieldlist, $obj, $tabname[$id], 'edit');
}
@@ -1045,7 +1044,7 @@ if ($num) {
foreach ($fieldsforcontent as $tmpfieldlist) {
$showfield = 1;
$align = "left";
- $valuetoshow = $obj->{$tmpfieldlist};
+ $valuetoshow = $obj->$tmpfieldlist;
$class = 'tddict';
// Show value for field
@@ -1059,7 +1058,7 @@ if ($num) {
}
if ($tmpfieldlist == 'joinfiles') {
print '
'.$form->textwithpicto($langs->trans("FilesAttachedToEmail"), $tabhelp[$id][$tmpfieldlist], 1, 'help', '', 0, 2, $tmpfieldlist).' ';
- print '
';
+ print $form->selectyesno($tmpfieldlist.'-'.$rowid, (isset($obj->$tmpfieldlist) ? $obj->$tmpfieldlist : '0'), 1, false, 0, 1);
}
// If $acceptlocallinktomedia is true, we can add link media files int email templates (we already can do this into HTML editor of an email).
@@ -1174,7 +1173,7 @@ if ($num) {
$class .= ' tdoverflowmax100';
}
if ($value == 'topic') {
- $class .= 'tdoverflowmax200 small';
+ $class .= ' tdoverflowmax200 small';
}
if ($value == 'type_template') {
$valuetoshow = isset($elementList[$valuetoshow]) ? $elementList[$valuetoshow] : $valuetoshow;
@@ -1204,7 +1203,7 @@ if ($num) {
if ($value == 'joinfiles') {
$align = "center";
if ($valuetoshow) {
- $valuetoshow = 1;
+ $valuetoshow = yn(1);
} else {
$valuetoshow = '';
}
@@ -1311,7 +1310,7 @@ function fieldList($fieldlist, $obj = '', $tabname = '', $context = '')
if ($value == 'fk_user') {
print '
';
if ($user->admin) {
- print $form->select_dolusers(empty($obj->{$value}) ? '' : $obj->{$value}, 'fk_user', 1, null, 0, ($user->admin ? '' : 'hierarchyme'), null, 0, 0, 0, '', 0, '', 'minwidth150 maxwidth300');
+ print $form->select_dolusers(empty($obj->{$value}) ? '' : $obj->{$value}, 'fk_user', 1, null, 0, ($user->admin ? '' : 'hierarchyme'), null, 0, 0, 0, '', 0, '', 'minwidth150 maxwidth200');
} else {
if ($context == 'add') { // I am not admin and we show the add form
print $user->getNomUrl(1); // Me
@@ -1335,29 +1334,29 @@ function fieldList($fieldlist, $obj = '', $tabname = '', $context = '')
if (getDolGlobalInt('MAIN_MULTILANGS')) {
$selectedlang = GETPOSTISSET('langcode') ?GETPOST('langcode', 'aZ09') : $langs->defaultlang;
if ($context == 'edit') {
- $selectedlang = $obj->{$value};
+ $selectedlang = $obj->lang;
}
print $formadmin->select_language($selectedlang, 'langcode', 0, null, 1, 0, 0, 'maxwidth150');
} else {
- if (!empty($obj->{$value})) {
- print $obj->{$value}.' - '.$langs->trans('Language_'.$obj->{$value});
+ if (!empty($obj->lang)) {
+ print $obj->lang.' - '.$langs->trans('Language_'.$obj->lang);
}
$keyname = $value;
if ($keyname == 'lang') {
$keyname = 'langcode'; // Avoid conflict with lang param
}
- print ' ';
+ print ' ';
}
print ' ';
} elseif ($value == 'type_template') {
// Le type de template
print '
';
- if ($context == 'edit' && !empty($obj->{$value}) && !in_array($obj->{$value}, array_keys($elementList))) {
+ if ($context == 'edit' && !empty($obj->type_template) && !in_array($obj->type_template, array_keys($elementList))) {
// Current template type is an unknown type, so we must keep it as it is.
- print ' ';
- print $obj->{$value};
+ print ' ';
+ print $obj->type_template;
} else {
- print $form->selectarray('type_template', $elementList, (!empty($obj->{$value}) ? $obj->{$value}:''), 1, 0, 0, '', 0, 0, 0, '', 'minwidth150', 1, '', 0, 1);
+ print $form->selectarray('type_template', $elementList, (!empty($obj->type_template) ? $obj->type_template:''), 1, 0, 0, '', 0, 0, 0, '', 'minwidth150', 1, '', 0, 1);
}
print ' ';
} elseif ($context == 'add' && in_array($value, array('topic', 'joinfiles', 'content', 'content_lines'))) {
@@ -1378,7 +1377,7 @@ function fieldList($fieldlist, $obj = '', $tabname = '', $context = '')
$class = 'maxwidth50'; $classtd = 'center';
}
if ($value == 'position') {
- $class = 'maxwidth50'; $classtd = 'center';
+ $class = 'maxwidth50 center'; $classtd = 'center';
}
if ($value == 'libelle') {
$class = 'quatrevingtpercent';
@@ -1395,7 +1394,6 @@ function fieldList($fieldlist, $obj = '', $tabname = '', $context = '')
if (empty($user->admin)) {
print $form->selectyesno($value, '1', 1);
} else {
- //print '
';
print $form->selectyesno($value, (isset($obj->{$value}) ? $obj->{$value}:''), 1);
}
} else {
diff --git a/htdocs/admin/mails_ticket.php b/htdocs/admin/mails_ticket.php
index c48146fc937..05d66516cde 100644
--- a/htdocs/admin/mails_ticket.php
+++ b/htdocs/admin/mails_ticket.php
@@ -32,23 +32,28 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
$langs->loadLangs(array('companies', 'products', 'admin', 'mails', 'other', 'errors'));
$action = GETPOST('action', 'aZ09');
-$cancel = GETPOST('cancel', 'alpha');
+$cancel = GETPOST('cancel', 'aZ09');
$usersignature = $user->signature;
// For action = test or send, we ensure that content is not html, even for signature, because this we want a test with NO html.
if ($action == 'test' || $action == 'send') {
- $usersignature = dol_string_nohtmltag($usersignature);
+ $usersignature = dol_string_nohtmltag($usersignature, 2);
}
$substitutionarrayfortest = array(
-'__LOGIN__' => $user->login,
-'__ID__' => 'TESTIdRecord',
-'__EMAIL__' => 'TESTEMail',
-'__LASTNAME__' => 'TESTLastname',
-'__FIRSTNAME__' => 'TESTFirstname',
-'__USER_SIGNATURE__' => (($user->signature && empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN)) ? $usersignature : ''),
-'__SENDEREMAIL_SIGNATURE__' => (($user->signature && empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN)) ? $usersignature : ''), // Done into actions_sendmails
-//'__PERSONALIZED__' => 'TESTPersonalized' // Hiden because not used yet
+ '__DOL_MAIN_URL_ROOT__'=>DOL_MAIN_URL_ROOT,
+ '__ID__' => 'TESTIdRecord',
+ '__EMAIL__' => 'TESTEMail',
+ '__LOGIN__' => $user->login,
+ '__LASTNAME__' => 'TESTLastname',
+ '__FIRSTNAME__' => 'TESTFirstname',
+ '__ADDRESS__'=> 'RecipientAddress',
+ '__ZIP__'=> 'RecipientZip',
+ '__TOWN_'=> 'RecipientTown',
+ '__COUNTRY__'=> 'RecipientCountry',
+ '__USER_SIGNATURE__' => (($user->signature && empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN)) ? $usersignature : ''),
+ '__SENDEREMAIL_SIGNATURE__' => (($user->signature && empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN)) ? $usersignature : ''), // Done into actions_sendmails
+ //'__PERSONALIZED__' => 'TESTPersonalized' // Hiden because not used yet
);
complete_substitutions_array($substitutionarrayfortest, $langs);
@@ -94,10 +99,10 @@ $trackid = (($action == 'testhtml') ? "testhtml" : "test");
$sendcontext = 'ticket'; // Force to use dedicated context of setup for ticket
include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
-if ($action == 'presend' && GETPOST('trackid') == 'test') {
+if ($action == 'presend' && GETPOST('trackid', 'alphanohtml') == 'test') {
$action = 'test';
}
-if ($action == 'presend' && GETPOST('trackid') == 'testhtml') {
+if ($action == 'presend' && GETPOST('trackid', 'alphanohtml') == 'testhtml') {
$action = 'testhtml';
}
@@ -317,12 +322,15 @@ if ($action == 'edit') {
// Host server
- print '
';
+ print ' ';
if (!$conf->use_javascript_ajax && $linuxlike && $conf->global->MAIN_MAIL_SENDMODE_TICKET == 'mail') {
+ print '';
print $langs->trans("MAIN_MAIL_SMTP_SERVER_NotAvailableOnLinuxLike");
print ' ';
- print $langs->trans("SeeLocalSendMailSetup");
+ print ''.$langs->trans("SeeLocalSendMailSetup").' ';
+ print ' ';
} else {
+ print '';
$mainserver = (!empty($conf->global->MAIN_MAIL_SMTP_SERVER_TICKET) ? $conf->global->MAIN_MAIL_SMTP_SERVER_TICKET : '');
$smtpserver = ini_get('SMTP') ?ini_get('SMTP') : $langs->transnoentities("Undefined");
if ($linuxlike) {
@@ -333,17 +341,18 @@ if ($action == 'edit') {
print ' ';
// SuperAdministrator access only
if (!isModEnabled('multicompany') || ($user->admin && !$user->entity)) {
- print ' ';
+ print ' ';
print ' ';
- print ''.$langs->trans("SeeLocalSendMailSetup").' ';
+ print ''.$langs->trans("SeeLocalSendMailSetup").' ';
} else {
$text = !empty($mainserver) ? $mainserver : $smtpserver;
$htmltext = $langs->trans("ContactSuperAdminForChange");
print $form->textwithpicto($text, $htmltext, 1, 'superadmin');
print ' ';
}
+ print ' ';
}
- print ' ';
+ print '';
// Port
@@ -351,7 +360,7 @@ if ($action == 'edit') {
if (!$conf->use_javascript_ajax && $linuxlike && $conf->global->MAIN_MAIL_SENDMODE_TICKET == 'mail') {
print $langs->trans("MAIN_MAIL_SMTP_PORT_NotAvailableOnLinuxLike");
print '
';
- print $langs->trans("SeeLocalSendMailSetup");
+ print ''.$langs->trans("SeeLocalSendMailSetup").' ';
} else {
$mainport = (!empty($conf->global->MAIN_MAIL_SMTP_PORT_TICKET) ? $conf->global->MAIN_MAIL_SMTP_PORT_TICKET : '');
$smtpport = ini_get('smtp_port') ?ini_get('smtp_port') : $langs->transnoentities("Undefined");
@@ -365,7 +374,7 @@ if ($action == 'edit') {
if (!isModEnabled('multicompany') || ($user->admin && !$user->entity)) {
print ' ';
print ' ';
- print ''.$langs->trans("SeeLocalSendMailSetup").' ';
+ print ''.$langs->trans("SeeLocalSendMailSetup").' ';
} else {
$text = (!empty($mainport) ? $mainport : $smtpport);
$htmltext = $langs->trans("ContactSuperAdminForChange");
@@ -375,6 +384,25 @@ if ($action == 'edit') {
}
print ' ';
+ // AUTH method
+ if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE_TICKET) && in_array($conf->global->MAIN_MAIL_SENDMODE_TICKET, array('smtps', 'swiftmailer')))) {
+ print '
'.$langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE").' ';
+ if (!isModEnabled('multicompany') || ($user->admin && !$user->entity)) {
+ // Note: Default value for MAIN_MAIL_SMTPS_AUTH_TYPE if not defined is 'LOGIN' (but login/pass may be empty and they won't be provided in such a case)
+ print ' ';
+ print ''.$langs->trans("UsePassword").' ';
+ print ' ';
+ print ' ';
+ print ''.$form->textwithpicto($langs->trans("UseOauth"), $langs->trans("OauthNotAvailableForAllAndHadToBeCreatedBefore")).' ';
+ } else {
+ $value = getDolGlobalString('MAIN_MAIL_SMTPS_AUTH_TYPE_TICKET', 'LOGIN');
+ $htmltext = $langs->trans("ContactSuperAdminForChange");
+ print $form->textwithpicto($langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE"), $htmltext, 1, 'superadmin');
+ print ' ';
+ }
+ print ' ';
+ }
+
// ID
if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE_TICKET) && in_array($conf->global->MAIN_MAIL_SENDMODE_TICKET, array('smtps', 'swiftmailer')))) {
$mainstmpid = (!empty($conf->global->MAIN_MAIL_SMTPS_ID_TICKET) ? $conf->global->MAIN_MAIL_SMTPS_ID_TICKET : '');
@@ -390,25 +418,6 @@ if ($action == 'edit') {
print '';
}
- // OAUTH
- if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE_TICKET) && in_array($conf->global->MAIN_MAIL_SENDMODE_TICKET, array('smtps', 'swiftmailer')))) {
- print '
'.$langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE").' ';
- if (empty($conf->multicompany->enabled) || ($user->admin && !$user->entity)) {
- print ' ';
- print ''.$langs->trans("UsePassword").' ';
- print ' ';
- print ' ';
- print ''.$form->textwithpicto($langs->trans("UseOauth"), $langs->trans("OauthNotAvailableForAllAndHadToBeCreatedBefore")).' ';
- } else {
- $value = getDolGlobalString('MAIN_MAIL_SMTPS_AUTH_TYPE_TICKET', 'LOGIN');
- $htmltext = $langs->trans("ContactSuperAdminForChange");
- print $form->textwithpicto($langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE"), $htmltext, 1, 'superadmin');
- print ' ';
- }
- print ' ';
- }
-
-
// PW
if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE_TICKET) && in_array($conf->global->MAIN_MAIL_SENDMODE_TICKET, array('smtps', 'swiftmailer')))) {
$mainsmtppw = (!empty($conf->global->MAIN_MAIL_SMTPS_PW_TICKET) ? $conf->global->MAIN_MAIL_SMTPS_PW_TICKET : '');
@@ -514,11 +523,6 @@ if ($action == 'edit') {
print '
'.$langs->trans("MAIN_MAIL_SMTP_PORT", ini_get('smtp_port') ?ini_get('smtp_port') : $langs->transnoentities("Undefined")).' '.(!empty($conf->global->MAIN_MAIL_SMTP_PORT_TICKET) ? $conf->global->MAIN_MAIL_SMTP_PORT_TICKET : '').' ';
}
- // SMTPS ID
- if (isset($conf->global->MAIN_MAIL_SENDMODE_TICKET) && in_array($conf->global->MAIN_MAIL_SENDMODE_TICKET, array('smtps', 'swiftmailer'))) {
- print '
'.$langs->trans("MAIN_MAIL_SMTPS_ID").' '.$conf->global->MAIN_MAIL_SMTPS_ID_TICKET.' ';
- }
-
// AUTH method
if (in_array(getDolGlobalString('MAIN_MAIL_SENDMODE_TICKET'), array('smtps', 'swiftmailer'))) {
$authtype = getDolGlobalString('MAIN_MAIL_SMTPS_AUTH_TYPE_TICKET', 'LOGIN');
@@ -526,6 +530,11 @@ if ($action == 'edit') {
print '
'.$langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE").' '.$text.' ';
}
+ // SMTPS ID
+ if (isset($conf->global->MAIN_MAIL_SENDMODE_TICKET) && in_array($conf->global->MAIN_MAIL_SENDMODE_TICKET, array('smtps', 'swiftmailer'))) {
+ print '
'.$langs->trans("MAIN_MAIL_SMTPS_ID").' '.$conf->global->MAIN_MAIL_SMTPS_ID_TICKET.' ';
+ }
+
// SMTPS PW
if (isset($conf->global->MAIN_MAIL_SENDMODE_TICKET) && in_array($conf->global->MAIN_MAIL_SENDMODE_TICKET, array('smtps', 'swiftmailer')) && getDolGlobalString('MAIN_MAIL_SMTPS_AUTH_TYPE_TICKET') != "XOAUTH2") {
print '
'.$langs->trans("MAIN_MAIL_SMTPS_PW").' '.preg_replace('/./', '*', $conf->global->MAIN_MAIL_SMTPS_PW_TICKET).' ';
@@ -621,6 +630,7 @@ if ($action == 'edit') {
// Run the test to connect
if ($action == 'testconnect') {
+ print '
';
print load_fiche_titre($langs->trans("DoTestServerAvailability"));
include_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
@@ -651,8 +661,8 @@ if ($action == 'edit') {
// Cree l'objet formulaire mail
include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
$formmail = new FormMail($db);
- $formmail->fromname = (GETPOSTISSET('fromname') ? GETPOST('fromname') : $conf->global->MAIN_MAIL_EMAIL_FROM);
- $formmail->frommail = (GETPOSTISSET('frommail') ? GETPOST('frommail') : $conf->global->MAIN_MAIL_EMAIL_FROM);
+ $formmail->fromname = (GETPOSTISSET('fromname') ? GETPOST('fromname', 'restricthtml') : $conf->global->MAIN_MAIL_EMAIL_FROM);
+ $formmail->frommail = (GETPOSTISSET('frommail') ? GETPOST('frommail', 'restricthtml') : $conf->global->MAIN_MAIL_EMAIL_FROM);
$formmail->trackid = (($action == 'testhtml') ? "testhtml" : "test");
$formmail->withfromreadonly = 0;
$formmail->withsubstit = 0;
@@ -679,7 +689,7 @@ if ($action == 'edit') {
$formmail->param["returnurl"] = $_SERVER["PHP_SELF"];
// Init list of files
- if (GETPOST("mode") == 'init') {
+ if (GETPOST("mode", "aZ09") == 'init') {
$formmail->clear_attached_files();
}
diff --git a/htdocs/admin/modules.php b/htdocs/admin/modules.php
index d011b250730..bd6a238c0f0 100644
--- a/htdocs/admin/modules.php
+++ b/htdocs/admin/modules.php
@@ -1118,7 +1118,13 @@ if ($mode == 'deploy') {
}
}
} else {
- $message = info_admin($langs->trans("InstallModuleFromWebHasBeenDisabledByFile", $dolibarrdataroot.'/installmodules.lock'));
+ if (getDolGlobalString('MAIN_MESSAGE_INSTALL_MODULES_DISABLED_CONTACT_US')) {
+ // Show clean message
+ $message = info_admin($langs->trans('InstallModuleFromWebHasBeenDisabledContactUs'));
+ } else {
+ // Show technical message
+ $message = info_admin($langs->trans("InstallModuleFromWebHasBeenDisabledByFile", $dolibarrdataroot.'/installmodules.lock'));
+ }
$allowfromweb = 0;
}
diff --git a/htdocs/admin/oauth.php b/htdocs/admin/oauth.php
index e50b4f772c6..64968b1a516 100644
--- a/htdocs/admin/oauth.php
+++ b/htdocs/admin/oauth.php
@@ -85,7 +85,11 @@ if ($action == 'update') {
}
}
if (GETPOSTISSET($constvalue.'_SCOPE')) {
- $scopestring = implode(',', GETPOST($constvalue.'_SCOPE'));
+ if (is_array(GETPOST($constvalue.'_SCOPE'))) {
+ $scopestring = implode(',', GETPOST($constvalue.'_SCOPE'));
+ } else {
+ $scopestring = GETPOST($constvalue.'_SCOPE');
+ }
if (!dolibarr_set_const($db, $constvalue.'_SCOPE', $scopestring, 'chaine', 0, '', $conf->entity)) {
$error++;
}
@@ -97,6 +101,7 @@ if ($action == 'update') {
}
}
+
if (!$error) {
setEventMessages($langs->trans("SetupSaved"), null);
} else {
@@ -104,6 +109,48 @@ if ($action == 'update') {
}
}
+if ($action == 'confirm_delete') {
+ $provider = GETPOST('provider', 'aZ09');
+ $label = GETPOST('label');
+
+ $globalkey = empty($provider) ? $label : $label.'-'.$provider;
+
+ if (getDolGlobalString($globalkey.'_ID') && getDolGlobalString($globalkey.'_SECRET')) { // If ID and secret exist, we delete first the token
+ $backtourl = DOL_URL_ROOT.'/admin/oauth.php?action=delete_entry&provider='.$provider.'&label='.$label.'&token='.newToken();
+ $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
+ $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
+ $callbacktodel = $urlwithroot;
+ if ($label == 'OAUTH_GOOGLE') {
+ $callbacktodel .= '/core/modules/oauth/google_oauthcallback.php?action=delete&keyforprovider='.$provider.'&token='.newToken().'&backtourl='.urlencode($backtourl);
+ } elseif ($label == 'OAUTH_GITHUB') {
+ $callbacktodel .= '/core/modules/oauth/github_oauthcallback.php?action=delete&keyforprovider='.$provider.'&token='.newToken().'&backtourl='.urlencode($backtourl);
+ } elseif ($label == 'OAUTH_STRIPE_LIVE') {
+ $callbacktodel .= '/core/modules/oauth/stripelive_oauthcallback.php?action=delete&keyforprovider='.$provider.'&token='.newToken().'&backtourl='.urlencode($backtourl);
+ } elseif ($label == 'OAUTH_STRIPE_TEST') {
+ $callbacktodel .= '/core/modules/oauth/stripetest_oauthcallback.php?action=delete&keyforprovider='.$provider.'&token='.newToken().'&backtourl='.urlencode($backtourl);
+ } elseif ($label == 'OAUTH_OTHER') {
+ $callbacktodel .= '/core/modules/oauth/generic_oauthcallback.php?action=delete&keyforprovider='.$provider.'&token='.newToken().'&backtourl='.urlencode($backtourl);
+ }
+ header("Location: ".$callbacktodel);
+ exit;
+ } else {
+ $action = 'delete_entry';
+ }
+}
+
+if ($action == 'delete_entry') {
+ $provider = GETPOST('provider', 'aZ09');
+ $label = GETPOST('label');
+
+ $globalkey = empty($provider) ? $label : $label.'-'.$provider;
+
+ if (!dolibarr_del_const($db, $globalkey.'_NAME', $conf->entity) || !dolibarr_del_const($db, $globalkey.'_ID', $conf->entity) || !dolibarr_del_const($db, $globalkey.'_SECRET', $conf->entity) || !dolibarr_del_const($db, $globalkey.'_URLAUTHORIZE', $conf->entity) || !dolibarr_del_const($db, $globalkey.'_SCOPE', $conf->entity)) {
+ setEventMessages($langs->trans("ErrorInEntryDeletion"), null, 'errors');
+ $error++;
+ } else {
+ setEventMessages($langs->trans("EntryDeleted"), null);
+ }
+}
/*
* View
@@ -112,6 +159,13 @@ if ($action == 'update') {
llxHeader();
$form = new Form($db);
+// Confirmation of action process
+if ($action == 'delete') {
+ $formquestion = array();
+ $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?provider='.GETPOST('provider').'&label='.GETPOST('label'), $langs->trans('OAuthServiceConfirmDeleteTitle'), $langs->trans('OAuthServiceConfirmDeleteMessage'), 'confirm_delete', $formquestion, 0, 1, 220);
+ print $formconfirm;
+}
+
$linkback = '
'.$langs->trans("BackToModuleList").' ';
print load_fiche_titre($langs->trans('ConfigOAuth'), $linkback, 'title_setup');
@@ -156,7 +210,7 @@ print dol_get_fiche_end();
print '';
-
+$listinsetup = [];
// Define $listinsetup
foreach ($conf->global as $key => $val) {
if (!empty($val) && preg_match('/^OAUTH_.*_ID$/', $key)) {
@@ -227,6 +281,17 @@ if (count($listinsetup) > 0) {
print $langs->trans("OAUTH_URL_FOR_CREDENTIAL", $supportedoauth2array[$keyforsupportedoauth2array]['urlforcredentials']);
}
print '';
+
+ // Delete
+ print '
';
+ $label = preg_replace('/_NAME$/', '', $keyforsupportedoauth2array);
+ print '';
+ print img_picto('', 'delete');
+ print ' ';
+
+ print '';
+ print ' ';
+
print '';
if ($supported) {
@@ -234,41 +299,53 @@ if (count($listinsetup) > 0) {
print '
';
print ''.$langs->trans("UseTheFollowingUrlAsRedirectURI").' ';
print ' ';
- print ' ';
+ print '';
+ print '
';
+ print '';
if ($keyforsupportedoauth2array == 'OAUTH_OTHER_NAME') {
print '
';
print ''.$langs->trans("URLOfServiceForAuthorization").' ';
print ' ';
- print ' ';
+ print '';
+ print '
';
+ print '';
}
} else {
print '
';
print ''.$langs->trans("UseTheFollowingUrlAsRedirectURI").' ';
print ''.$langs->trans("FeatureNotYetSupported").' ';
- print ' ';
+ print '';
+ print '
';
+ print '';
}
// Api Id
print '
';
print ''.$langs->trans("OAUTH_ID").' ';
print ' ';
- print ' ';
+ print '';
+ print '
';
+ print '';
// Api Secret
print '
';
print ''.$langs->trans("OAUTH_SECRET").' ';
print ' ';
- print ' ';
+ print '';
+ print '
';
+ print '';
- // TODO Move this into token generation
+ // TODO Move this into token generation ?
if ($supported) {
if ($keyforsupportedoauth2array == 'OAUTH_OTHER_NAME') {
print '
';
print ''.$langs->trans("Scopes").' ';
print '';
print ' ';
- print ' ';
+ print '';
+ print '
';
+ print '';
} else {
$availablescopes = array_flip(explode(',', $supportedoauth2array[$keyforsupportedoauth2array]['availablescopes']));
$currentscopes = explode(',', getDolGlobalString($key[4]));
@@ -288,13 +365,17 @@ if (count($listinsetup) > 0) {
print '
';
print '
'.$scope.' ';
}
- print '';
+ print '';
+ print '
';
+ print '';
}
} else {
print '
';
print ''.$langs->trans("UseTheFollowingUrlAsRedirectURI").' ';
print ''.$langs->trans("FeatureNotYetSupported").' ';
- print ' ';
+ print '';
+ print '
';
+ print '';
}
print '
'."\n";
diff --git a/htdocs/admin/oauthlogintokens.php b/htdocs/admin/oauthlogintokens.php
index fa1fd18f049..f798995d525 100644
--- a/htdocs/admin/oauthlogintokens.php
+++ b/htdocs/admin/oauthlogintokens.php
@@ -291,6 +291,14 @@ if ($mode == 'setup' && $user->admin) {
print '';
print '
'."\n";
+ // Scopes
+ print '';
+ print ''.$langs->trans("Scopes").' ';
+ print '';
+ $currentscopes = getDolGlobalString($key[4]);
+ print $currentscopes;
+ print ' ';
+
print '';
print '';
//var_dump($key);
diff --git a/htdocs/admin/pdf.php b/htdocs/admin/pdf.php
index d59e2279435..7cb641c77f9 100644
--- a/htdocs/admin/pdf.php
+++ b/htdocs/admin/pdf.php
@@ -1,6 +1,6 @@
- * Copyright (C) 2004-2012 Laurent Destailleur
+ * Copyright (C) 2004-2022 Laurent Destailleur
* Copyright (C) 2005-2011 Regis Houssin
* Copyright (C) 2012-2107 Juanjo Menent
* Copyright (C) 2019 Ferran Marcet
@@ -314,7 +314,7 @@ print load_fiche_titre($langs->trans("PDFAddressForging"), '', '');
print '';
print '
';
-print ''.$langs->trans("Parameter").' '.$langs->trans("Value").' ';
+print ''.$langs->trans("Parameter").' ';
// Show sender name
@@ -378,6 +378,7 @@ if ($conf->use_javascript_ajax) {
$arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
print $form->selectarray("MAIN_PDF_NO_RECIPENT_FRAME", $arrval, $conf->global->MAIN_PDF_NO_RECIPENT_FRAME);
}
+print '';
//Invert sender and recipient
@@ -443,7 +444,7 @@ if ($mysoc->useLocalTax(1) || $mysoc->useLocalTax(2)) {
print load_fiche_titre($title, '', '');
print '';
-print ''.$langs->trans("Parameter").' '.$langs->trans("Value").' ';
+print ''.$langs->trans("Parameter").' ';
// Hide any information on Sale tax / VAT
@@ -463,22 +464,20 @@ print ' ';
// Other
+
print load_fiche_titre($langs->trans("Other"), '', '');
print '';
print '
';
-print ''.$langs->trans("Parameter").' '.$langs->trans("Value").' ';
+print ''.$langs->trans("Parameter").' '.$langs->trans("Value").' ';
// Use 2 languages into PDF
-print ''.$langs->trans("PDF_USE_ALSO_LANGUAGE_CODE").' ';
-//if (getDolGlobalInt('MAIN_MULTILANGS'))
- //{
+print ' ';
+print $form->textwithpicto($langs->trans("PDFIn2Languages"), $langs->trans("PDF_USE_ALSO_LANGUAGE_CODE"));
+print ' ';
$selected = GETPOSTISSET('PDF_USE_ALSO_LANGUAGE_CODE') ? GETPOST('PDF_USE_ALSO_LANGUAGE_CODE') : (!empty($conf->global->PDF_USE_ALSO_LANGUAGE_CODE) ? $conf->global->PDF_USE_ALSO_LANGUAGE_CODE : 0);
print $formadmin->select_language($selected, 'PDF_USE_ALSO_LANGUAGE_CODE', 0, null, 1);
-//} else {
-// print ''.$langs->trans("MultiLangNotEnabled").' ';
-//}
print ' ';
// Height of logo
diff --git a/htdocs/admin/propal.php b/htdocs/admin/propal.php
index c24446fb1bd..7883cc7da20 100644
--- a/htdocs/admin/propal.php
+++ b/htdocs/admin/propal.php
@@ -625,6 +625,15 @@ print ' ';
+print ''.$langs->trans("AllowExternalDownload").' ';
+print '';
+print ajax_constantonoff('PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD', array(), null, 0, 0, 0, 2, 0, 1);
+print ' ';
+
+
+
// default update prices on cloning a proposal
/*
print '';
diff --git a/htdocs/admin/security.php b/htdocs/admin/security.php
index 02cddbd5d70..063f1668d15 100644
--- a/htdocs/admin/security.php
+++ b/htdocs/admin/security.php
@@ -46,7 +46,7 @@ $allow_disable_encryption = true;
*/
if ($action == 'setgeneraterule') {
- if (!dolibarr_set_const($db, 'USER_PASSWORD_GENERATED', $_GET["value"], 'chaine', 0, '', $conf->entity)) {
+ if (!dolibarr_set_const($db, 'USER_PASSWORD_GENERATED', GETPOST("value", "alphanohtml"), 'chaine', 0, '', $conf->entity)) {
dol_print_error($db);
}
}
@@ -56,7 +56,11 @@ if ($action == 'activate_encrypt') {
$db->begin();
- dolibarr_set_const($db, "DATABASE_PWD_ENCRYPTED", "1", 'chaine', 0, '', $conf->entity);
+ // On old version a bug created the constant into user entity, so we delete it to be sure, such entry won't exists. We want it in entity 0 or nowhere.
+ dolibarr_del_const($db, "DATABASE_PWD_ENCRYPTED", "1", 'chaine', 0, '', $conf->entity);
+ // We set entity=0 (all) because DATABASE_PWD_ENCRYPTED is a setup into conf file, so always shared for everybody
+ $entityforall = 0;
+ dolibarr_set_const($db, "DATABASE_PWD_ENCRYPTED", "1", 'chaine', 0, '', $entityforall);
$sql = "SELECT u.rowid, u.pass, u.pass_crypted";
$sql .= " FROM ".MAIN_DB_PREFIX."user as u";
@@ -377,7 +381,8 @@ if ($conf->global->USER_PASSWORD_GENERATED == "Perso") {
}
-// Cryptage mot de passe
+// Crypt passwords in database
+
print ' ';
print ' ';
print ' ';
@@ -393,20 +398,20 @@ print '';
// Disable clear password in database
print '';
print ''.$langs->trans("DoNotStoreClearPassword").' ';
-print '';
+print ' ';
if (getDolGlobalString('DATABASE_PWD_ENCRYPTED')) {
print img_picto($langs->trans("Active"), 'tick');
}
print ' ';
if (!getDolGlobalString('DATABASE_PWD_ENCRYPTED')) {
- print '';
- print ''.$langs->trans("Activate").' ';
+ print ' ';
+ print ''.$langs->trans("Activate").' ';
print " ";
}
// Database conf file encryption
if (getDolGlobalString('DATABASE_PWD_ENCRYPTED')) {
- print '';
+ print ' ';
if ($allow_disable_encryption) {
//On n'autorise pas l'annulation de l'encryption car les mots de passe ne peuvent pas etre decodes
//Do not allow "disable encryption" as passwords cannot be decrypted
@@ -419,7 +424,8 @@ if (getDolGlobalString('DATABASE_PWD_ENCRYPTED')) {
print " ";
print ' ';
-// Cryptage du mot de base de la base dans conf.php
+
+// Crypt password into config file conf.php
print '';
print ''.$langs->trans("MainDbPasswordFileConfEncrypted").' ';
@@ -430,7 +436,7 @@ if (preg_match('/crypted:/i', $dolibarr_main_db_pass) || !empty($dolibarr_main_d
print '';
-print '';
+print ' ';
if (empty($dolibarr_main_db_pass) && empty($dolibarr_main_db_encrypted_pass)) {
$langs->load("errors");
print img_warning($langs->trans("WarningPassIsEmpty"));
@@ -452,18 +458,18 @@ print ' ';
print '';
print ''.$langs->trans("DisableForgetPasswordLinkOnLogonPage").' ';
-print '';
+print ' ';
if (getDolGlobalString('MAIN_SECURITY_DISABLEFORGETPASSLINK')) {
print img_picto($langs->trans("Active"), 'tick');
}
print ' ';
if (!getDolGlobalString('MAIN_SECURITY_DISABLEFORGETPASSLINK')) {
- print '';
+ print ' ';
print ''.$langs->trans("Activate").' ';
print " ";
}
if (getDolGlobalString('MAIN_SECURITY_DISABLEFORGETPASSLINK')) {
- print '';
+ print ' ';
print ''.$langs->trans("Disable").' ';
print " ";
}
diff --git a/htdocs/admin/security_other.php b/htdocs/admin/security_other.php
index bec69a7a6e4..d4c5a3e034a 100644
--- a/htdocs/admin/security_other.php
+++ b/htdocs/admin/security_other.php
@@ -193,7 +193,7 @@ print ' ';
print ''.$langs->trans("MaxNumberOfPostOnPublicPagesByIP").' ';
print ' ';
print '';
-print ' '.strtolower($langs->trans("Posts"));
+print ' ';
print ' ';
print ' ';
diff --git a/htdocs/admin/stock.php b/htdocs/admin/stock.php
index fcca4cf2f18..8aaf76d310b 100644
--- a/htdocs/admin/stock.php
+++ b/htdocs/admin/stock.php
@@ -445,7 +445,7 @@ if (!empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT)
|| !empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE)
|| !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION)
|| !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION_CLOSE)
- || !empty($conf->mrp->enabled)) {
+ || isModEnabled('mrp')) {
$virtualdiffersfromphysical = 1; // According to increase/decrease stock options, virtual and physical stock may differs.
}
diff --git a/htdocs/admin/stocktransfer.php b/htdocs/admin/stocktransfer.php
index 099312ef491..3bcd00c1fe8 100644
--- a/htdocs/admin/stocktransfer.php
+++ b/htdocs/admin/stocktransfer.php
@@ -24,19 +24,7 @@
*/
// Load Dolibarr environment
-$res = 0;
-// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
-if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
-// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
-$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
-while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { $i--; $j--; }
-if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
-if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
-// Try main.inc.php using relative path
-if (!$res && file_exists("../main.inc.php")) $res = @include "../main.inc.php";
-if (!$res && file_exists("../../main.inc.php")) $res = @include "../../main.inc.php";
-if (!$res && file_exists("../../../main.inc.php")) $res = @include "../../../main.inc.php";
-if (!$res) die("Include of main fails");
+require '../main.inc.php';
global $langs, $user;
@@ -56,6 +44,8 @@ $action = GETPOST('action', 'alpha');
$backtopage = GETPOST('backtopage', 'alpha');
$value = GETPOST('value', 'alpha');
+$label = GETPOST('label', 'alpha');
+$scandir = GETPOST('scan_dir', 'alpha');
$arrayofparameters = array(
'STOCKTRANSFER_MYPARAM1'=>array('css'=>'minwidth200', 'enabled'=>1),
@@ -70,9 +60,8 @@ $setupnotempty = 0;
* Actions
*/
-if ((float) DOL_VERSION >= 6) {
- include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php';
-}
+include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php';
+
if ($action == 'updateMask') {
$maskconststocktransfer = GETPOST('maskconststocktransfer', 'alpha');
@@ -131,7 +120,9 @@ if ($action == 'updateMask') {
$ret = delDocumentModel($value, 'stocktransfer');
if ($ret > 0) {
$constforval = strtoupper($tmpobjectkey).'_ADDON_PDF';
- if ($conf->global->$constforval == "$value") dolibarr_del_const($db, $constforval, $conf->entity);
+ if (getDolGlobalString($constforval) == "$value") {
+ dolibarr_del_const($db, $constforval, $conf->entity);
+ }
}
} elseif ($action == 'setdoc') { // Set default model
$tmpobjectkey = 'StockTransfer';
@@ -294,7 +285,7 @@ foreach ($myTmpObjects as $myTmpObjectKey => $myTmpObjectArray) {
print '';
$constforvar = 'STOCKTRANSFER_'.strtoupper($myTmpObjectKey).'_ADDON';
- if ($conf->global->$constforvar == $file) {
+ if (getDolGlobalString($constforvar) == $file) {
print img_picto($langs->trans("Activated"), 'switch_on');
} else {
print '';
@@ -428,7 +419,7 @@ foreach ($myTmpObjects as $myTmpObjectKey => $myTmpObjectArray) {
// Default
print ' ';
$constforvar = strtoupper($myTmpObjectKey).'_ADDON_PDF';
- if ($conf->global->$constforvar == $name) {
+ if (getDolGlobalString($constforvar) == $name) {
print img_picto($langs->trans("Default"), 'on');
} else {
print 'scandir.'&label='.urlencode($module->name).'" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"), 'off').' ';
diff --git a/htdocs/admin/supplier_order.php b/htdocs/admin/supplier_order.php
index b5114314eef..bb1b94d4385 100644
--- a/htdocs/admin/supplier_order.php
+++ b/htdocs/admin/supplier_order.php
@@ -220,6 +220,7 @@ print dol_get_fiche_head($head, 'order', $langs->trans("Suppliers"), -1, 'compan
print load_fiche_titre($langs->trans("OrdersNumberingModules"), '', '');
+print '';
print '
';
print '';
print ''.$langs->trans("Name").' ';
@@ -312,7 +313,7 @@ foreach ($dirmodels as $reldir) {
}
}
-print '
';
+print '
';
/*
@@ -342,6 +343,7 @@ if ($resql) {
dol_print_error($db);
}
+print '';
print '
'."\n";
print ''."\n";
print ''.$langs->trans("Name").' '."\n";
@@ -388,7 +390,7 @@ foreach ($dirmodels as $reldir) {
if (in_array($name, $def)) {
print ''."\n";
if ($conf->global->COMMANDE_SUPPLIER_ADDON_PDF != "$name") {
- print 'scandir).'&label='.urlencode($module->name).'&type=order_supplier">';
+ print ' scandir).'&label='.urlencode($module->name).'&type=order_supplier">';
print img_picto($langs->trans("Enabled"), 'switch_on');
print ' ';
} else {
@@ -397,17 +399,16 @@ foreach ($dirmodels as $reldir) {
print " ";
} else {
print ''."\n";
- print 'scandir).'&label='.urlencode($module->name).'&type=order_supplier">'.img_picto($langs->trans("Disabled"), 'switch_off').' ';
+ print 'scandir).'&label='.urlencode($module->name).'&type=order_supplier">'.img_picto($langs->trans("Disabled"), 'switch_off').' ';
print " ";
}
// Default
print '';
if ($conf->global->COMMANDE_SUPPLIER_ADDON_PDF == "$name") {
- // print img_picto($langs->trans("Default"), 'on');
- print 'scandir.'&label='.urlencode($module->name).'&type=order_supplier"" alt="'.$langs->trans("Disable").'">'.img_picto($langs->trans("Enabled"), 'on').' ';
+ print 'scandir).'&label='.urlencode($module->name).'&type=order_supplier" alt="'.$langs->trans("Disable").'">'.img_picto($langs->trans("Enabled"), 'on').' ';
} else {
- print 'scandir).'&label='.urlencode($module->name).'&type=order_supplier" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"), 'off').' ';
+ print 'scandir).'&label='.urlencode($module->name).'&type=order_supplier" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"), 'off').' ';
}
print ' ';
@@ -425,7 +426,7 @@ foreach ($dirmodels as $reldir) {
print $form->textwithpicto('', $htmltooltip, 1, 0);
print '';
print '';
- print ''.img_object($langs->trans("Preview"), 'pdf').' ';
+ print ''.img_object($langs->trans("Preview"), 'pdf').' ';
print ' ';
print " \n";
@@ -437,17 +438,19 @@ foreach ($dirmodels as $reldir) {
}
}
-print '
';
+print '
';
/*
-* Other options
-*/
+ * Other options
+ */
print '';
print ' ';
print ' ';
print load_fiche_titre($langs->trans("OtherOptions"), '', '');
+
+print '';
print '
';
print '';
print ''.$langs->trans("Parameter").' ';
@@ -536,7 +539,7 @@ if (isModEnabled('reception')) {
print "\n";
print " \n";
-print '
';
+print '
';
print '';
@@ -546,6 +549,8 @@ print '';
*/
print load_fiche_titre($langs->trans("Notifications"), '', '');
+
+print '';
print '
';
print '';
print ''.$langs->trans("Parameter").' ';
@@ -559,6 +564,7 @@ print '';
print " \n";
print '
';
+print '
';
// End of page
llxFooter();
diff --git a/htdocs/admin/supplier_proposal.php b/htdocs/admin/supplier_proposal.php
index fa3702d36b7..993e19fc796 100644
--- a/htdocs/admin/supplier_proposal.php
+++ b/htdocs/admin/supplier_proposal.php
@@ -178,6 +178,37 @@ if ($action == 'set') {
// par appel methode canBeActivated
dolibarr_set_const($db, "SUPPLIER_PROPOSAL_ADDON", $value, 'chaine', 0, '', $conf->entity);
+} elseif (preg_match('/set_(.*)/', $action, $reg)) {
+ $code = $reg[1];
+ $value = (GETPOST($code) ? GETPOST($code) : 1);
+
+ $res = dolibarr_set_const($db, $code, $value, 'chaine', 0, '', $conf->entity);
+ if (!($res > 0)) {
+ $error++;
+ }
+
+ if ($error) {
+ setEventMessages($langs->trans('Error'), null, 'errors');
+ } else {
+ setEventMessages($langs->trans('SetupSaved'), null, 'mesgs');
+ header("Location: " . $_SERVER["PHP_SELF"]);
+ exit();
+ }
+} elseif (preg_match('/del_(.*)/', $action, $reg)) {
+ $code = $reg[1];
+ $res = dolibarr_del_const($db, $code, $conf->entity);
+
+ if (!($res > 0)) {
+ $error++;
+ }
+
+ if ($error) {
+ setEventMessages($langs->trans('Error'), null, 'errors');
+ } else {
+ setEventMessages($langs->trans('SetupSaved'), null, 'mesgs');
+ header("Location: " . $_SERVER["PHP_SELF"]);
+ exit();
+ }
}
@@ -502,21 +533,20 @@ print '';
if (isModEnabled('banque')) {
print '';
print $langs->trans("BANK_ASK_PAYMENT_BANK_DURING_SUPPLIER_PROPOSAL").' ';
- if (!empty($conf->use_javascript_ajax)) {
- print ajax_constantonoff('BANK_ASK_PAYMENT_BANK_DURING_SUPPLIER_PROPOSAL');
- } else {
- if (empty($conf->global->BANK_ASK_PAYMENT_BANK_DURING_SUPPLIER_PROPOSAL)) {
- print ''.img_picto($langs->trans("Disabled"), 'switch_off').' ';
- } else {
- print ''.img_picto($langs->trans("Enabled"), 'switch_on').' ';
- }
- }
+ print ajax_constantonoff('BANK_ASK_PAYMENT_BANK_DURING_SUPPLIER_PROPOSAL');
print ' ';
} else {
print '';
print $langs->trans("BANK_ASK_PAYMENT_BANK_DURING_SUPPLIER_PROPOSAL").' '.$langs->trans('NotAvailable').' ';
}
+// Allow external download
+print '';
+print ''.$langs->trans("AllowExternalDownload").' ';
+print '';
+print ajax_constantonoff('PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD', array(), null, 0, 0, 0, 2, 0, 1);
+print ' ';
+
print '
';
diff --git a/htdocs/admin/system/constall.php b/htdocs/admin/system/constall.php
index 4acb8e0ff59..dcf41aacf25 100644
--- a/htdocs/admin/system/constall.php
+++ b/htdocs/admin/system/constall.php
@@ -73,7 +73,6 @@ $configfileparameters = array(
'?dolibarr_main_auth_ldap_admin_pass',
'?dolibarr_main_auth_ldap_debug',
'separator',
- '?dolibarr_lib_ADODB_PATH',
'?dolibarr_lib_FPDF_PATH',
'?dolibarr_lib_TCPDF_PATH',
'?dolibarr_lib_FPDI_PATH',
@@ -122,7 +121,6 @@ $configfilelib = array(
'dolibarr_main_auth_ldap_admin_pass',
'dolibarr_main_auth_ldap_debug',
'separator',
- 'dolibarr_lib_ADODB_PATH',
'dolibarr_lib_TCPDF_PATH',
'dolibarr_lib_FPDI_PATH',
'dolibarr_lib_NUSOAP_PATH',
diff --git a/htdocs/admin/system/dolibarr.php b/htdocs/admin/system/dolibarr.php
index 86c76ca1604..4a55c1a1160 100644
--- a/htdocs/admin/system/dolibarr.php
+++ b/htdocs/admin/system/dolibarr.php
@@ -149,25 +149,26 @@ print '
';
// Session
print '
';
print '
';
-print ''.$langs->trans("Session").' '.$langs->trans("Value").' '."\n";
-print ''.$langs->trans("SessionSavePath").' '.session_save_path().' '."\n";
-print ''.$langs->trans("SessionName").' '.session_name().' '."\n";
-print ''.$langs->trans("SessionId").' '.session_id().' '."\n";
-print ''.$langs->trans("CurrentSessionTimeOut").' (session.gc_maxlifetime) '.ini_get('session.gc_maxlifetime').' '.$langs->trans("seconds");
-print ' ';
+print ' '.$langs->trans("Session").' '.$langs->trans("Value").' '."\n";
+print ''.$langs->trans("SessionSavePath").' '.session_save_path().' '."\n";
+print ''.$langs->trans("SessionName").' '.session_name().' '."\n";
+print ''.$langs->trans("SessionId").' '.session_id().' '."\n";
+print ''.$langs->trans("CurrentSessionTimeOut").' (session.gc_maxlifetime) ';
+print '';
+print ini_get('session.gc_maxlifetime').' '.$langs->trans("seconds");
print ''."\n";
print ''."\n";
print ''."\n";
print $form->textwithpicto('', $langs->trans("SessionExplanation", ini_get("session.gc_probability"), ini_get("session.gc_divisor")));
print " \n";
-print ''.$langs->trans("CurrentTheme").' '.$conf->theme.' '."\n";
-print ''.$langs->trans("CurrentMenuHandler").' ';
+print ' '.$langs->trans("CurrentTheme").' '.$conf->theme.' '."\n";
+print ''.$langs->trans("CurrentMenuHandler").' ';
print $conf->standard_menu;
print ' '."\n";
-print ''.$langs->trans("Screen").' ';
+print ' '.$langs->trans("Screen").' ';
print $_SESSION['dol_screenwidth'].' x '.$_SESSION['dol_screenheight'];
print ' '."\n";
-print ''.$langs->trans("Session").' ';
+print ' '.$langs->trans("Session").' ';
$i = 0;
foreach ($_SESSION as $key => $val) {
if ($i > 0) {
@@ -342,7 +343,6 @@ $configfileparameters = array(
'?dolibarr_main_auth_ldap_admin_pass' => 'dolibarr_main_auth_ldap_admin_pass',
'?dolibarr_main_auth_ldap_debug' => 'dolibarr_main_auth_ldap_debug',
'separator3' => '',
- '?dolibarr_lib_ADODB_PATH' => 'dolibarr_lib_ADODB_PATH',
'?dolibarr_lib_FPDF_PATH' => 'dolibarr_lib_FPDF_PATH',
'?dolibarr_lib_TCPDF_PATH' => 'dolibarr_lib_TCPDF_PATH',
'?dolibarr_lib_FPDI_PATH' => 'dolibarr_lib_FPDI_PATH',
diff --git a/htdocs/admin/system/phpinfo.php b/htdocs/admin/system/phpinfo.php
index d8a0b384971..301231b1e4c 100644
--- a/htdocs/admin/system/phpinfo.php
+++ b/htdocs/admin/system/phpinfo.php
@@ -250,9 +250,19 @@ foreach ($phparray as $key => $value) {
//var_dump($value);
foreach ($value as $keyparam => $keyvalue) {
if (!is_array($keyvalue)) {
- print ' ';
- print ''.$keyparam.' ';
+ $keytoshow = $keyparam;
$valtoshow = $keyvalue;
+ // Hide value of session cookies
+ if (in_array($keyparam, array('HTTP_COOKIE', 'Cookie', "\$_SERVER['HTTP_COOKIE']", 'Authorization'))) {
+ $valtoshow = ''.$langs->trans("Hidden").' ';
+ }
+ if (preg_match('/'.preg_quote('$_COOKIE[\'DOLSESSID_', '/').'/i', $keyparam)) {
+ $keytoshow = $keyparam;
+ $valtoshow = ''.$langs->trans("Hidden").' ';
+ }
+
+ print ' ';
+ print ''.$keytoshow.' ';
if ($keyparam == 'X-ChromePhp-Data') {
$valtoshow = dol_trunc($keyvalue, 80);
}
diff --git a/htdocs/admin/system/security.php b/htdocs/admin/system/security.php
index b0ea7571a2d..d820b8faab7 100644
--- a/htdocs/admin/system/security.php
+++ b/htdocs/admin/system/security.php
@@ -542,13 +542,13 @@ print ' ';
print 'MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL = '.(empty($conf->global->MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL) ? ''.$langs->trans("Undefined").' ('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or").' 0) ' : $conf->global->MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL)." ";
print ' ';
-print 'MAIN_SECURITY_FORCECSP = '.(empty($conf->global->MAIN_SECURITY_FORCECSP) ? ''.$langs->trans("Undefined").' ' : $conf->global->MAIN_SECURITY_FORCECSP).' ('.$langs->trans("Example").": \"default-src 'self'; img-src *;\") ";
+print 'MAIN_SECURITY_FORCECSP = '.(empty($conf->global->MAIN_SECURITY_FORCECSP) ? ''.$langs->trans("Undefined").' ' : $conf->global->MAIN_SECURITY_FORCECSP).' ('.$langs->trans("Example").": \"frame-ancestors 'self'; default-src 'self'; img-src *;\") ";
print ' ';
-print 'MAIN_SECURITY_FORCERP = '.(empty($conf->global->MAIN_SECURITY_FORCERP) ? ''.$langs->trans("Undefined").' ' : $conf->global->MAIN_SECURITY_FORCERP).' ('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or")." \"same-origin\") ";
+print 'MAIN_SECURITY_FORCERP = '.(empty($conf->global->MAIN_SECURITY_FORCERP) ? ''.$langs->trans("Undefined").' ' : $conf->global->MAIN_SECURITY_FORCERP).' ('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or")." \"same-origin\" so browser doesn't send any referrer when going into another web site domain) ";
print ' ';
-print 'WEBSITE_MAIN_SECURITY_FORCECSP = '.(empty($conf->global->WEBSITE_MAIN_SECURITY_FORCECSP) ? ''.$langs->trans("Undefined").' ' : $conf->global->WEBSITE_MAIN_SECURITY_FORCECSP).' ('.$langs->trans("Example").": \"default-src 'self'; style-src: https://cdnjs.cloudflare.com https://fonts.googleapis.com; script-src: https://cdn.transifex.com https://www.googletagmanager.com; object-src https://youtube.com; frame-src https://youtube.com; img-src: *;\") ";
+print 'WEBSITE_MAIN_SECURITY_FORCECSP = '.(empty($conf->global->WEBSITE_MAIN_SECURITY_FORCECSP) ? ''.$langs->trans("Undefined").' ' : $conf->global->WEBSITE_MAIN_SECURITY_FORCECSP).' ('.$langs->trans("Example").": \"frame-ancestors 'self'; default-src 'self'; style-src https://cdnjs.cloudflare.com https://fonts.googleapis.com; script-src https://cdn.transifex.com https://www.googletagmanager.com; object-src https://youtube.com; frame-src https://youtube.com; img-src *;\") ";
print ' ';
print 'WEBSITE_MAIN_SECURITY_FORCERP = '.(empty($conf->global->WEBSITE_MAIN_SECURITY_FORCERP) ? ''.$langs->trans("Undefined").' ' : $conf->global->WEBSITE_MAIN_SECURITY_FORCERP).' ('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or")." \"strict-origin-when-cross-origin\") ";
@@ -570,9 +570,13 @@ print 'For a higher security, we also recommend to implement limits and mitigati
print '';
print ' ';
-print 'Login process -> This can be done using a fail2ban rule (see example into dev/setup)'." ";
-print DOL_URL_ROOT.'/passwordforgotten.php (see example into dev/setup)'." ";
-print DOL_URL_ROOT.'/public/* (see example into dev/setup)'." ";
+$urlexamplebase = 'https://github.com/Dolibarr/dolibarr/blob/develop/dev/setup/fail2ban/filter.d/';
+print '- Login process (see fail2ban example on GitHub ) ';
+print '- '.DOL_URL_ROOT.'/passwordforgotten.php (see fail2ban example on GitHub ) ';
+print '- '.DOL_URL_ROOT.'/public/* (see fail2ban example on GitHub ) ';
+print ' ';
+$urlexamplebase = 'https://github.com/Dolibarr/dolibarr/blob/develop/dev/setup/apache/';
+print '- You can also protect the application using a HTTP Basic authentication layer (see apache2 virtualhost example on GitHub ) ';
diff --git a/htdocs/admin/taxes.php b/htdocs/admin/taxes.php
index ccdbedc1f89..d903bc2d32f 100644
--- a/htdocs/admin/taxes.php
+++ b/htdocs/admin/taxes.php
@@ -1,9 +1,9 @@
- * Copyright (C) 2004-2008 Laurent Destailleur
- * Copyright (C) 2005-2009 Regis Houssin
- * Copyright (C) 2011-2013 Juanjo Menent
- * Copyright (C) 2015-2018 Alexandre Spangaro
+/* Copyright (C) 2004 Rodolphe Quiedeville
+ * Copyright (C) 2004-2008 Laurent Destailleur
+ * Copyright (C) 2005-2009 Regis Houssin
+ * Copyright (C) 2011-2013 Juanjo Menent
+ * Copyright (C) 2015-2022 Alexandre Spangaro
*
* 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
@@ -22,7 +22,7 @@
/**
* \file htdocs/admin/taxes.php
* \ingroup tax
- * \brief Page de configuration du module tax
+ * \brief Page to setup module tax
*/
// Load Dolibarr environment
@@ -116,6 +116,8 @@ if ($action == 'update') {
dolibarr_set_const($db, "MAIN_INFO_VAT_RETURN", GETPOST("MAIN_INFO_VAT_RETURN", 'alpha'), 'chaine', 0, '', $conf->entity);
+ dolibarr_set_const($db, "MAIN_INFO_TVA_DAY_DEADLINE_SUBMISSION", GETPOST("deadline_day_vat", 'int'), 'chaine', 0, '', $conf->entity);
+
if (!$error) {
$db->commit();
setEventMessages($langs->trans("SetupSaved"), null, 'mesgs');
@@ -179,6 +181,10 @@ if (empty($mysoc->tva_assuj)) {
}
print ' ';
+ print ''.$langs->trans("DeadlineDayVATSubmission").' ';
+ print ' ';
+ print ' ';
+
print '
';
print '
';
diff --git a/htdocs/admin/ticket_public.php b/htdocs/admin/ticket_public.php
index 84186e4e226..05938e27d49 100644
--- a/htdocs/admin/ticket_public.php
+++ b/htdocs/admin/ticket_public.php
@@ -419,7 +419,7 @@ if (!empty($conf->global->TICKET_ENABLE_PUBLIC_INTERFACE)) {
print '
'.$langs->trans("TicketPublicInterfaceTextHomeLabelAdmin").'';
print ' ';
require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
- $doleditor = new DolEditor('TICKET_PUBLIC_TEXT_HOME', $public_text_home, '100%', 180, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_SOCIETE'), ROWS_2, 70);
+ $doleditor = new DolEditor('TICKET_PUBLIC_TEXT_HOME', $public_text_home, '100%', 180, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_TICKET'), ROWS_2, 70);
$doleditor->Create();
print ' ';
print '';
@@ -431,7 +431,7 @@ if (!empty($conf->global->TICKET_ENABLE_PUBLIC_INTERFACE)) {
print ' '.$langs->trans("TicketPublicInterfaceTextHelpMessageLabelAdmin").'';
print ' ';
require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
- $doleditor = new DolEditor('TICKET_PUBLIC_TEXT_HELP_MESSAGE', $public_text_help_message, '100%', 180, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_SOCIETE'), ROWS_2, 70);
+ $doleditor = new DolEditor('TICKET_PUBLIC_TEXT_HELP_MESSAGE', $public_text_help_message, '100%', 180, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_TICKET'), ROWS_2, 70);
$doleditor->Create();
print ' ';
print '';
diff --git a/htdocs/admin/tools/dolibarr_export.php b/htdocs/admin/tools/dolibarr_export.php
index 779db36fb2f..d01efa0ea5b 100644
--- a/htdocs/admin/tools/dolibarr_export.php
+++ b/htdocs/admin/tools/dolibarr_export.php
@@ -212,10 +212,10 @@ function hideoptions(){
if (div.style.display === "none") {
div.style.display = "block";
- lnk.innerText="'.$langs->trans("HideAdvancedoptions").'";
+ lnk.innerText="'.dol_escape_js($langs->transnoentitiesnoconv("HideAdvancedoptions")).'";
} else {
div.style.display = "none";
- lnk.innerText="'.$langs->trans("ShowAdvancedOptions").'...";
+ lnk.innerText="'.dol_escape_js($langs->transnoentitiesnoconv("ShowAdvancedOptions")).'...";
}
}
';
diff --git a/htdocs/admin/tools/export.php b/htdocs/admin/tools/export.php
index 8299e2198ee..7a91f8f598c 100644
--- a/htdocs/admin/tools/export.php
+++ b/htdocs/admin/tools/export.php
@@ -35,7 +35,7 @@ $langs->load("admin");
$action = GETPOST('action', 'aZ09');
$what = GETPOST('what', 'alpha');
$export_type = GETPOST('export_type', 'alpha');
-$file = GETPOST('filename_template', 'alpha');
+$file = dol_sanitizeFileName(GETPOST('filename_template', 'alpha'));
// Load variable for pagination
$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
@@ -113,6 +113,9 @@ $outputdir = $conf->admin->dir_output.'/backup';
$result = dol_mkdir($outputdir);
+$lowmemorydump = GETPOSTISSET("lowmemorydump") ? GETPOST("lowmemorydump") : getDolGlobalString('MAIN_LOW_MEMORY_DUMP');
+
+
// MYSQL
if ($what == 'mysql') {
$cmddump = GETPOST("mysqldump", 'none'); // Do not sanitize here with 'alpha', will be sanitize later by dol_sanitizePathName and escapeshellarg
@@ -132,7 +135,7 @@ if ($what == 'mysql') {
}
if (!$errormsg) {
- $utils->dumpDatabase(GETPOST('compression', 'alpha'), $what, 0, $file);
+ $utils->dumpDatabase(GETPOST('compression', 'alpha'), $what, 0, $file, 0, 0, $lowmemorydump);
$errormsg = $utils->error;
$_SESSION["commandbackuplastdone"] = $utils->result['commandbackuplastdone'];
$_SESSION["commandbackuptorun"] = $utils->result['commandbackuptorun'];
@@ -141,7 +144,7 @@ if ($what == 'mysql') {
// MYSQL NO BIN
if ($what == 'mysqlnobin') {
- $utils->dumpDatabase(GETPOST('compression', 'alpha'), $what, 0, $file);
+ $utils->dumpDatabase(GETPOST('compression', 'alpha'), $what, 0, $file, 0, 0, $lowmemorydump);
$errormsg = $utils->error;
$_SESSION["commandbackuplastdone"] = $utils->result['commandbackuplastdone'];
@@ -170,7 +173,7 @@ if ($what == 'postgresql') {
}
if (!$errormsg) {
- $utils->dumpDatabase(GETPOST('compression', 'alpha'), $what, 0, $file);
+ $utils->dumpDatabase(GETPOST('compression', 'alpha'), $what, 0, $file, 0, 0, $lowmemorydump);
$errormsg = $utils->error;
$_SESSION["commandbackuplastdone"] = $utils->result['commandbackuplastdone'];
$_SESSION["commandbackuptorun"] = $utils->result['commandbackuptorun'];
diff --git a/htdocs/admin/workflow.php b/htdocs/admin/workflow.php
index 10f32eed97d..cf55c7b9127 100644
--- a/htdocs/admin/workflow.php
+++ b/htdocs/admin/workflow.php
@@ -79,7 +79,7 @@ $workflowcodes = array(
'picto'=>'ticket'
),
- 'separator1'=>array('family'=>'separator', 'position'=>25, 'title'=>''),
+ 'separator1'=>array('family'=>'separator', 'position'=>25, 'title'=>'', 'enabled'=>((isModEnabled("propal") && isModEnabled('commande')) || (isModEnabled('commande') && isModEnabled('facture')) || (isModEnabled('ticket') && isModEnabled('ficheinter')))),
// Automatic classification of proposal
'WORKFLOW_ORDER_CLASSIFY_BILLED_PROPAL'=>array(
@@ -118,8 +118,6 @@ $workflowcodes = array(
'warning'=>''
), // For this option, if module invoice is disabled, it does not exists, so "Classify billed" for order must be done manually from order card.
- 'separator2'=>array('family'=>'separator', 'position'=>50),
-
// Automatic classification supplier proposal
'WORKFLOW_ORDER_CLASSIFY_BILLED_SUPPLIER_PROPOSAL'=>array(
'family'=>'classify_supplier_proposal',
@@ -154,14 +152,6 @@ $workflowcodes = array(
'warning'=>''
),
- // Automatic classification reception
- 'WORKFLOW_BILL_ON_RECEPTION'=>array(
- 'family'=>'classify_reception',
- 'position'=>80,
- 'enabled'=>(isModEnabled("reception") && ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice"))),
- 'picto'=>'reception'
- ),
-
// Automatic classification shipping
'WORKFLOW_SHIPPING_CLASSIFY_CLOSED_INVOICE' => array(
'family' => 'classify_shipping',
@@ -170,17 +160,27 @@ $workflowcodes = array(
'picto' => 'shipment'
),
+ // Automatic classification reception
+ 'WORKFLOW_EXPEDITION_CLASSIFY_CLOSED_INVOICE'=>array(
+ 'family'=>'classify_reception',
+ 'position'=>95,
+ 'enabled'=>(isModEnabled("reception") && ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice"))),
+ 'picto'=>'reception'
+ ),
+
+ 'separator2'=>array('family'=>'separator', 'position'=>400, 'enabled' => (isModEnabled('ticket') && isModEnabled('contract'))),
+
// Automatic link ticket -> contract
'WORKFLOW_TICKET_LINK_CONTRACT' => array(
'family' => 'link_ticket',
- 'position' => 75,
- 'enabled' => isModEnabled('ticket') && !empty($conf->contract->enabled),
+ 'position' => 500,
+ 'enabled' => (isModEnabled('ticket') && isModEnabled('contract')),
'picto' => 'ticket'
),
'WORKFLOW_TICKET_USE_PARENT_COMPANY_CONTRACTS' => array(
'family' => 'link_ticket',
- 'position' => 76,
- 'enabled' => isModEnabled('ticket') && !empty($conf->contract->enabled),
+ 'position' => 501,
+ 'enabled' => (isModEnabled('ticket') && isModEnabled('contract')),
'picto' => 'ticket'
),
);
@@ -235,6 +235,7 @@ foreach ($workflowcodes as $key => $params) {
continue;
}
+ $reg = array();
if ($oldfamily != $params['family']) {
if ($params['family'] == 'create') {
$header = $langs->trans("AutomaticCreation");
@@ -269,7 +270,7 @@ foreach ($workflowcodes as $key => $params) {
print ' ';
print ''.$header.' ';
- print ''.$langs->trans("Status").' ';
+ print ''.$langs->trans("Status").' ';
print ' ';
$oldfamily = $params['family'];
@@ -286,7 +287,7 @@ foreach ($workflowcodes as $key => $params) {
print '
';
- print '';
+ print ' ';
if (!empty($conf->use_javascript_ajax)) {
print ajax_constantonoff($key);
diff --git a/htdocs/api/class/api.class.php b/htdocs/api/class/api.class.php
index fa5e2ff1de8..e0acc8faac8 100644
--- a/htdocs/api/class/api.class.php
+++ b/htdocs/api/class/api.class.php
@@ -113,9 +113,8 @@ class DolibarrApi
unset($object->pass);
unset($object->pass_indatabase);
- // Remove linkedObjects. We should already have linkedObjectsIds that avoid huge responses
+ // Remove linkedObjects. We should already have and keep only linkedObjectsIds that avoid huge responses
unset($object->linkedObjects);
- unset($object->linkedObjectsFullLoaded);
//unset($object->lines[$i]->linked_objects); // This is the array to create linked object during create
unset($object->fields);
diff --git a/htdocs/api/class/api_setup.class.php b/htdocs/api/class/api_setup.class.php
index 406172590d7..9dcd168f344 100644
--- a/htdocs/api/class/api_setup.class.php
+++ b/htdocs/api/class/api_setup.class.php
@@ -612,10 +612,10 @@ class Setup extends DolibarrApi
* @param object $object Object with label to translate
* @param string $lang Code of the language the name of the object must be translated to
* @param string $prefix Prefix for translation key
- *
+ * @param array $dict Array of dictionnary for translation
* @return void
*/
- private function translateLabel($object, $lang, $prefix = 'Country')
+ private function translateLabel($object, $lang, $prefix = 'Country', $dict = array('dict'))
{
if (!empty($lang)) {
// Load the translations if this is a new language.
@@ -623,7 +623,7 @@ class Setup extends DolibarrApi
global $conf;
$this->translations = new Translate('', $conf);
$this->translations->setDefaultLang($lang);
- $this->translations->load('dict');
+ $this->translations->loadLangs($dict);
}
if ($object->code) {
$key = $prefix.$object->code;
@@ -636,7 +636,6 @@ class Setup extends DolibarrApi
}
}
-
/**
* Get the list of events types.
*
@@ -779,6 +778,7 @@ class Setup extends DolibarrApi
* @param string $type To filter on type of contact
* @param string $module To filter on module contacts
* @param int $active Contact's type is active or not {@min 0} {@max 1}
+ * @param string $lang Code of the language the label of the civility must be translated to
* @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.code:like:'A%') and (t.active:>=:0)"
* @return array List of Contacts types
*
@@ -786,7 +786,7 @@ class Setup extends DolibarrApi
*
* @throws RestException
*/
- public function getListOfContactTypes($sortfield = "code", $sortorder = 'ASC', $limit = 100, $page = 0, $type = '', $module = '', $active = 1, $sqlfilters = '')
+ public function getListOfContactTypes($sortfield = "code", $sortorder = 'ASC', $limit = 100, $page = 0, $type = '', $module = '', $active = 1, $lang = '', $sqlfilters = '')
{
$list = array();
@@ -827,7 +827,9 @@ class Setup extends DolibarrApi
$num = $this->db->num_rows($result);
$min = min($num, ($limit <= 0 ? $num : $limit));
for ($i = 0; $i < $min; $i++) {
- $list[] = $this->db->fetch_object($result);
+ $contact_type = $this->db->fetch_object($result);
+ $this->translateLabel($contact_type, $lang, 'TypeContact_'.$contact_type->type.'_'.$contact_type->source.'_', array("eventorganization", "resource", "projects", "contracts", "bills", "orders", "agenda", "propal", "stocks", "supplier_proposal", "interventions", "sendings", "ticket"));
+ $list[] = $contact_type;
}
} else {
throw new RestException(503, 'Error when retrieving list of contacts types : '.$this->db->lasterror());
@@ -845,6 +847,7 @@ class Setup extends DolibarrApi
* @param int $page Page number (starting from zero)
* @param string $module To filter on module events
* @param int $active Civility is active or not {@min 0} {@max 1}
+ * @param string $lang Code of the language the label of the civility must be translated to
* @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.code:like:'A%') and (t.active:>=:0)"
* @return array List of civility types
*
@@ -852,7 +855,7 @@ class Setup extends DolibarrApi
*
* @throws RestException
*/
- public function getListOfCivilities($sortfield = "code", $sortorder = 'ASC', $limit = 100, $page = 0, $module = '', $active = 1, $sqlfilters = '')
+ public function getListOfCivilities($sortfield = "code", $sortorder = 'ASC', $limit = 100, $page = 0, $module = '', $active = 1, $lang = '', $sqlfilters = '')
{
$list = array();
@@ -890,7 +893,9 @@ class Setup extends DolibarrApi
$num = $this->db->num_rows($result);
$min = min($num, ($limit <= 0 ? $num : $limit));
for ($i = 0; $i < $min; $i++) {
- $list[] = $this->db->fetch_object($result);
+ $civility = $this->db->fetch_object($result);
+ $this->translateLabel($civility, $lang, 'Civility', array('dict'));
+ $list[] = $civility;
}
} else {
throw new RestException(503, 'Error when retrieving list of civility : '.$this->db->lasterror());
@@ -1188,6 +1193,7 @@ class Setup extends DolibarrApi
* @param int $limit Number of items per page
* @param int $page Page number {@min 0}
* @param int $active Shipping methodsm is active or not {@min 0} {@max 1}
+ * @param string $lang Code of the language the label of the method must be translated to
* @param string $sqlfilters SQL criteria to filter. Syntax example "(t.code:=:'CHQ')"
*
* @url GET dictionary/shipping_methods
@@ -1196,7 +1202,7 @@ class Setup extends DolibarrApi
*
* @throws RestException 400
*/
- public function getShippingModes($limit = 100, $page = 0, $active = 1, $sqlfilters = '')
+ public function getShippingModes($limit = 100, $page = 0, $active = 1, $lang = '', $sqlfilters = '')
{
$list = array();
@@ -1232,7 +1238,9 @@ class Setup extends DolibarrApi
$num = $this->db->num_rows($result);
$min = min($num, ($limit <= 0 ? $num : $limit));
for ($i = 0; $i < $min; $i++) {
- $list[] = $this->db->fetch_object($result);
+ $method = $this->db->fetch_object($result);
+ $this->translateLabel($method, $lang, '', array('dict'));
+ $list[] = $method;
}
} else {
throw new RestException(400, $this->db->lasterror());
@@ -1496,6 +1504,7 @@ class Setup extends DolibarrApi
* @param int $limit Number of items per page
* @param int $page Page number (starting from zero)
* @param int $active Payment term is active or not {@min 0} {@max 1}
+ * @param string $lang Code of the language the label of the category must be translated to
* @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.code:like:'A%') and (t.active:>=:0)"
* @return array List of ticket categories
*
@@ -1503,13 +1512,14 @@ class Setup extends DolibarrApi
*
* @throws RestException
*/
- public function getTicketsCategories($sortfield = "code", $sortorder = 'ASC', $limit = 100, $page = 0, $active = 1, $sqlfilters = '')
+ public function getTicketsCategories($sortfield = "code", $sortorder = 'ASC', $limit = 100, $page = 0, $active = 1, $lang = '', $sqlfilters = '')
{
$list = array();
$sql = "SELECT rowid, code, pos, label, use_default, description";
$sql .= " FROM ".MAIN_DB_PREFIX."c_ticket_category as t";
- $sql .= " WHERE t.active = ".((int) $active);
+ $sql .= " WHERE t.entity IN (".getEntity('c_ticket_category').")";
+ $sql .= " AND t.active = ".((int) $active);
// Add sql filters
if ($sqlfilters) {
$errormessage = '';
@@ -1538,7 +1548,9 @@ class Setup extends DolibarrApi
$num = $this->db->num_rows($result);
$min = min($num, ($limit <= 0 ? $num : $limit));
for ($i = 0; $i < $min; $i++) {
- $list[] = $this->db->fetch_object($result);
+ $category = $this->db->fetch_object($result);
+ $this->translateLabel($category, $lang, 'TicketCategoryShort', array('ticket'));
+ $list[] = $category;
}
} else {
throw new RestException(503, 'Error when retrieving list of ticket categories : '.$this->db->lasterror());
@@ -1555,6 +1567,7 @@ class Setup extends DolibarrApi
* @param int $limit Number of items per page
* @param int $page Page number (starting from zero)
* @param int $active Payment term is active or not {@min 0} {@max 1}
+ * @param string $lang Code of the language the label of the severity must be translated to
* @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.code:like:'A%') and (t.active:>=:0)"
* @return array List of ticket severities
*
@@ -1562,13 +1575,14 @@ class Setup extends DolibarrApi
*
* @throws RestException
*/
- public function getTicketsSeverities($sortfield = "code", $sortorder = 'ASC', $limit = 100, $page = 0, $active = 1, $sqlfilters = '')
+ public function getTicketsSeverities($sortfield = "code", $sortorder = 'ASC', $limit = 100, $page = 0, $active = 1, $lang = '', $sqlfilters = '')
{
$list = array();
$sql = "SELECT rowid, code, pos, label, use_default, color, description";
$sql .= " FROM ".MAIN_DB_PREFIX."c_ticket_severity as t";
- $sql .= " WHERE t.active = ".((int) $active);
+ $sql .= " WHERE t.entity IN (".getEntity('c_ticket_severity').")";
+ $sql .= " AND t.active = ".((int) $active);
// Add sql filters
if ($sqlfilters) {
$errormessage = '';
@@ -1597,7 +1611,9 @@ class Setup extends DolibarrApi
$num = $this->db->num_rows($result);
$min = min($num, ($limit <= 0 ? $num : $limit));
for ($i = 0; $i < $min; $i++) {
- $list[] = $this->db->fetch_object($result);
+ $severity = $this->db->fetch_object($result);
+ $this->translateLabel($severity, $lang, 'TicketSeverityShort', array('ticket'));
+ $list[] = $severity;
}
} else {
throw new RestException(503, 'Error when retrieving list of ticket severities : '.$this->db->lasterror());
@@ -1614,6 +1630,7 @@ class Setup extends DolibarrApi
* @param int $limit Number of items per page
* @param int $page Page number (starting from zero)
* @param int $active Payment term is active or not {@min 0} {@max 1}
+ * @param string $lang Code of the language the label of the type must be translated to
* @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.code:like:'A%') and (t.active:>=:0)"
* @return array List of ticket types
*
@@ -1621,15 +1638,15 @@ class Setup extends DolibarrApi
*
* @throws RestException
*/
- public function getTicketsTypes($sortfield = "code", $sortorder = 'ASC', $limit = 100, $page = 0, $active = 1, $sqlfilters = '')
+ public function getTicketsTypes($sortfield = "code", $sortorder = 'ASC', $limit = 100, $page = 0, $active = 1, $lang = '', $sqlfilters = '')
{
$list = array();
$sql = "SELECT rowid, code, pos, label, use_default, description";
$sql .= " FROM ".MAIN_DB_PREFIX."c_ticket_type as t";
- $sql .= " WHERE t.active = ".(int) $active;
- // if ($type) $sql .= " AND t.type LIKE '%".$this->db->escape($type)."%'";
- // if ($module) $sql .= " AND t.module LIKE '%".$this->db->escape($module)."%'";
+ $sql .= " WHERE t.entity IN (".getEntity('c_ticket_type').")";
+ $sql .= " AND t.active = ".((int) $active);
+
// Add sql filters
if ($sqlfilters) {
$errormessage = '';
@@ -1658,7 +1675,9 @@ class Setup extends DolibarrApi
$num = $this->db->num_rows($result);
$min = min($num, ($limit <= 0 ? $num : $limit));
for ($i = 0; $i < $min; $i++) {
- $list[] = $this->db->fetch_object($result);
+ $type =$this->db->fetch_object($result);
+ $this->translateLabel($type, $lang, 'TicketTypeShort', array('ticket'));
+ $list[] = $type;
}
} else {
throw new RestException(503, 'Error when retrieving list of ticket types : '.$this->db->lasterror());
diff --git a/htdocs/api/index.php b/htdocs/api/index.php
index 0abf864084d..085dd338e69 100644
--- a/htdocs/api/index.php
+++ b/htdocs/api/index.php
@@ -122,7 +122,7 @@ if (empty($conf->global->MAIN_MODULE_API)) {
// Test if explorer is not disabled
if (preg_match('/api\/index\.php\/explorer/', $url) && !empty($conf->global->API_EXPLORER_DISABLED)) {
$langs->load("admin");
- dol_syslog("Call Dolibarr API interfaces with module REST disabled");
+ dol_syslog("Call Dolibarr API interfaces with module API REST disabled");
print $langs->trans("WarningAPIExplorerDisabled").'. ';
//session_destroy();
exit(0);
@@ -155,6 +155,10 @@ preg_match('/index\.php\/([^\/]+)(.*)$/', $url, $reg);
$refreshcache = (empty($conf->global->API_PRODUCTION_DO_NOT_ALWAYS_REFRESH_CACHE) ? true : false);
if (!empty($reg[1]) && $reg[1] == 'explorer' && ($reg[2] == '/swagger.json' || $reg[2] == '/swagger.json/root' || $reg[2] == '/resources.json' || $reg[2] == '/resources.json/root')) {
$refreshcache = true;
+ if (!is_writable($conf->api->dir_temp)) {
+ print 'Erreur temp dir api/temp not writable';
+ exit(0);
+ }
}
$api = new DolibarrApi($db, '', $refreshcache);
diff --git a/htdocs/asset/list.php b/htdocs/asset/list.php
index 45f90101adc..5e00c2d2433 100644
--- a/htdocs/asset/list.php
+++ b/htdocs/asset/list.php
@@ -307,7 +307,7 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
$nbtotalofrecords++;
}*/
/* The fast and low memory method to get and count full list converts the sql into a sql count */
- $sqlforcount = preg_replace('/^SELECT[a-z0-9\._\s\(\),]+FROM/i', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
+ $sqlforcount = preg_replace('/^SELECT[a-z0-9\._\s\(\),]+FROM/Ui', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
$resql = $db->query($sqlforcount);
$objforcount = $db->fetch_object($resql);
$nbtotalofrecords = $objforcount->nbtotalofrecords;
diff --git a/htdocs/asset/model/list.php b/htdocs/asset/model/list.php
index 1d85a982e5d..aa80b4e5426 100644
--- a/htdocs/asset/model/list.php
+++ b/htdocs/asset/model/list.php
@@ -307,7 +307,7 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
$nbtotalofrecords = $db->num_rows($result);
*/
/* The fast and low memory method to get and count full list converts the sql into a sql count */
- $sqlforcount = preg_replace('/^SELECT[a-z0-9\._\s\(\),]+FROM/i', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
+ $sqlforcount = preg_replace('/^SELECT[a-z0-9\._\s\(\),]+FROM/Ui', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
$resql = $db->query($sqlforcount);
if ($resql) {
diff --git a/htdocs/bom/bom_card.php b/htdocs/bom/bom_card.php
index 09d2b2bcb9d..89705c25ec5 100644
--- a/htdocs/bom/bom_card.php
+++ b/htdocs/bom/bom_card.php
@@ -704,7 +704,7 @@ if (empty($reshook)) {
// Clone
if ($permissiontoadd) {
- print ''.$langs->trans("ToClone").' '."\n";
+ print dolGetButtonAction($langs->trans("ToClone"), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.(!empty($object->socid) ? '&socid='.$object->socid : "").'&action=clone&object=bom', 'clone', $permissiontoadd);
}
// Close / Cancel
@@ -726,11 +726,8 @@ if (empty($reshook)) {
}
*/
- if ($permissiontodelete) {
- print 'id.'&action=delete&token='.newToken().'">'.$langs->trans('Delete').' '."\n";
- } else {
- print ''.$langs->trans('Delete').' '."\n";
- }
+ // Delete
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete);
}
print ''."\n";
}
diff --git a/htdocs/bom/bom_list.php b/htdocs/bom/bom_list.php
index 3374204e22f..6e3d5c41925 100644
--- a/htdocs/bom/bom_list.php
+++ b/htdocs/bom/bom_list.php
@@ -513,7 +513,7 @@ if (!empty($moreforfilter)) {
}
$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
-$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
+$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields
$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
print '';
@@ -523,6 +523,15 @@ print '
';
+
+// Action column
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons('left');
+ print $searchpicto;
+ print ' ';
+}
+
foreach ($object->fields as $key => $val) {
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
if ($key == 'status') {
@@ -561,16 +570,22 @@ $parameters = array('arrayfields'=>$arrayfields);
$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Action column
-print '';
-$searchpicto = $form->showFilterButtons();
-print $searchpicto;
-print ' ';
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons();
+ print $searchpicto;
+ print ' ';
+}
print ''."\n";
// Fields title label
// --------------------------------------------------------------------
print '';
+// Action column
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+}
foreach ($object->fields as $key => $val) {
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
if ($key == 'status') {
@@ -593,7 +608,9 @@ $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$
$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Action column
-print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+}
print ' '."\n";
@@ -624,6 +641,18 @@ while ($i < ($limit ? min($num, $limit) : $num)) {
// Show here line of result
print '';
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($object->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
foreach ($object->fields as $key => $val) {
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
@@ -676,15 +705,17 @@ while ($i < ($limit ? min($num, $limit) : $num)) {
$reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Action column
- print '';
- if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
- $selected = 0;
- if (in_array($object->id, $arrayofselected)) {
- $selected = 1;
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print ' ';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($object->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
}
- print ' ';
+ print ' ';
}
- print '';
if (!$i) {
$totalarray['nbfield']++;
}
diff --git a/htdocs/bookcal/COPYING b/htdocs/bookcal/COPYING
new file mode 100644
index 00000000000..94a04532226
--- /dev/null
+++ b/htdocs/bookcal/COPYING
@@ -0,0 +1,621 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
diff --git a/htdocs/bookcal/ChangeLog.md b/htdocs/bookcal/ChangeLog.md
new file mode 100644
index 00000000000..992a3d0842c
--- /dev/null
+++ b/htdocs/bookcal/ChangeLog.md
@@ -0,0 +1,5 @@
+# CHANGELOG BOOKCAL FOR [DOLIBARR ERP CRM](https://www.dolibarr.org)
+
+## 1.0
+
+Initial version
diff --git a/htdocs/bookcal/README.md b/htdocs/bookcal/README.md
new file mode 100644
index 00000000000..73f2f616938
--- /dev/null
+++ b/htdocs/bookcal/README.md
@@ -0,0 +1,86 @@
+# BOOKCAL FOR [DOLIBARR ERP CRM](https://www.dolibarr.org)
+
+## Features
+
+Description of the module...
+
+
+
+Other external modules are available on [Dolistore.com](https://www.dolistore.com).
+
+## Translations
+
+Translations can be completed manually by editing files into directories *langs*.
+
+
+
+
+
+## Licenses
+
+### Main code
+
+GPLv3 or (at your option) any later version. See file COPYING for more information.
+
+### Documentation
+
+All texts and readmes are licensed under GFDL.
diff --git a/htdocs/bookcal/admin/about.php b/htdocs/bookcal/admin/about.php
new file mode 100644
index 00000000000..85f0efcdebb
--- /dev/null
+++ b/htdocs/bookcal/admin/about.php
@@ -0,0 +1,105 @@
+
+ * Copyright (C) 2022 Alice Adminson
+ *
+ * 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 .
+ */
+
+/**
+ * \file bookcal/admin/about.php
+ * \ingroup bookcal
+ * \brief About page of module BookCal.
+ */
+
+// Load Dolibarr environment
+$res = 0;
+// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
+if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
+ $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
+}
+// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
+$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
+while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
+ $i--; $j--;
+}
+if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
+ $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
+}
+if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
+ $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
+}
+// Try main.inc.php using relative path
+if (!$res && file_exists("../../main.inc.php")) {
+ $res = @include "../../main.inc.php";
+}
+if (!$res && file_exists("../../../main.inc.php")) {
+ $res = @include "../../../main.inc.php";
+}
+if (!$res) {
+ die("Include of main fails");
+}
+
+// Libraries
+require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
+require_once '../lib/bookcal.lib.php';
+
+// Translations
+$langs->loadLangs(array("errors", "admin", "bookcal@bookcal"));
+
+// Access control
+if (!$user->admin) {
+ accessforbidden();
+}
+
+// Parameters
+$action = GETPOST('action', 'aZ09');
+$backtopage = GETPOST('backtopage', 'alpha');
+
+
+/*
+ * Actions
+ */
+
+// None
+
+
+/*
+ * View
+ */
+
+$form = new Form($db);
+
+$help_url = '';
+$page_name = "BookCalAbout";
+
+llxHeader('', $langs->trans($page_name), $help_url);
+
+// Subheader
+$linkback = ''.$langs->trans("BackToModuleList").' ';
+
+print load_fiche_titre($langs->trans($page_name), $linkback, 'title_setup');
+
+// Configuration header
+$head = bookcalAdminPrepareHead();
+print dol_get_fiche_head($head, 'about', $langs->trans($page_name), 0, 'bookcal@bookcal');
+
+dol_include_once('/bookcal/core/modules/modBookCal.class.php');
+$tmpmodule = new modBookCal($db);
+print $tmpmodule->getDescLong();
+
+// Page end
+print dol_get_fiche_end();
+llxFooter();
+$db->close();
diff --git a/htdocs/bookcal/admin/availabilities_extrafields.php b/htdocs/bookcal/admin/availabilities_extrafields.php
new file mode 100644
index 00000000000..9d16d7b5395
--- /dev/null
+++ b/htdocs/bookcal/admin/availabilities_extrafields.php
@@ -0,0 +1,145 @@
+
+ * Copyright (C) 2003 Jean-Louis Bergamo
+ * Copyright (C) 2004-2011 Laurent Destailleur
+ * Copyright (C) 2012 Regis Houssin
+ * Copyright (C) 2014 Florian Henry
+ * Copyright (C) 2015 Jean-François Ferry
+ *
+ * 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 .
+ */
+
+/**
+ * \file admin/availabilities_extrafields.php
+ * \ingroup bookcal
+ * \brief Page to setup extra fields of availabilities
+ */
+
+// Load Dolibarr environment
+$res = 0;
+// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
+if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
+ $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
+}
+// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
+$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
+while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
+ $i--; $j--;
+}
+if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
+ $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
+}
+if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
+ $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
+}
+// Try main.inc.php using relative path
+if (!$res && file_exists("../../main.inc.php")) {
+ $res = @include "../../main.inc.php";
+}
+if (!$res && file_exists("../../../main.inc.php")) {
+ $res = @include "../../../main.inc.php";
+}
+if (!$res) {
+ die("Include of main fails");
+}
+
+require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
+require_once '../lib/bookcal.lib.php';
+
+// Load translation files required by the page
+$langs->loadLangs(array('bookcal@bookcal', 'admin'));
+
+$extrafields = new ExtraFields($db);
+$form = new Form($db);
+
+// List of supported format
+$tmptype2label = ExtraFields::$type2label;
+$type2label = array('');
+foreach ($tmptype2label as $key => $val) {
+ $type2label[$key] = $langs->transnoentitiesnoconv($val);
+}
+
+$action = GETPOST('action', 'aZ09');
+$attrname = GETPOST('attrname', 'alpha');
+$elementtype = 'bookcal_availabilities'; //Must be the $table_element of the class that manage extrafield
+
+if (!$user->admin) {
+ accessforbidden();
+}
+
+
+/*
+ * Actions
+ */
+
+require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php';
+
+
+
+/*
+ * View
+ */
+
+$textobject = $langs->transnoentitiesnoconv("Availabilities");
+
+$help_url = '';
+$page_name = "BookCalSetup";
+
+llxHeader('', $langs->trans("BookCalSetup"), $help_url);
+
+
+$linkback = ''.$langs->trans("BackToModuleList").' ';
+print load_fiche_titre($langs->trans($page_name), $linkback, 'title_setup');
+
+
+$head = bookcalAdminPrepareHead();
+
+print dol_get_fiche_head($head, 'availabilities_extrafields', $langs->trans($page_name), -1, 'bookcal@bookcal');
+
+require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php';
+
+print dol_get_fiche_end();
+
+
+// Buttons
+if ($action != 'create' && $action != 'edit') {
+ print '";
+}
+
+
+/*
+ * Creation of an optional field
+ */
+if ($action == 'create') {
+ print '
';
+ print load_fiche_titre($langs->trans('NewAttribute'));
+
+ require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_add.tpl.php';
+}
+
+/*
+ * Edition of an optional field
+ */
+if ($action == 'edit' && !empty($attrname)) {
+ print " ";
+ print load_fiche_titre($langs->trans("FieldEdition", $attrname));
+
+ require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_edit.tpl.php';
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/bookcal/admin/booking_extrafields.php b/htdocs/bookcal/admin/booking_extrafields.php
new file mode 100644
index 00000000000..30122d95048
--- /dev/null
+++ b/htdocs/bookcal/admin/booking_extrafields.php
@@ -0,0 +1,145 @@
+
+ * Copyright (C) 2003 Jean-Louis Bergamo
+ * Copyright (C) 2004-2011 Laurent Destailleur
+ * Copyright (C) 2012 Regis Houssin
+ * Copyright (C) 2014 Florian Henry
+ * Copyright (C) 2015 Jean-François Ferry
+ *
+ * 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 .
+ */
+
+/**
+ * \file admin/booking_extrafields.php
+ * \ingroup bookcal
+ * \brief Page to setup extra fields of booking
+ */
+
+// Load Dolibarr environment
+$res = 0;
+// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
+if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
+ $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
+}
+// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
+$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
+while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
+ $i--; $j--;
+}
+if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
+ $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
+}
+if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
+ $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
+}
+// Try main.inc.php using relative path
+if (!$res && file_exists("../../main.inc.php")) {
+ $res = @include "../../main.inc.php";
+}
+if (!$res && file_exists("../../../main.inc.php")) {
+ $res = @include "../../../main.inc.php";
+}
+if (!$res) {
+ die("Include of main fails");
+}
+
+require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
+require_once '../lib/bookcal.lib.php';
+
+// Load translation files required by the page
+$langs->loadLangs(array('bookcal@bookcal', 'admin'));
+
+$extrafields = new ExtraFields($db);
+$form = new Form($db);
+
+// List of supported format
+$tmptype2label = ExtraFields::$type2label;
+$type2label = array('');
+foreach ($tmptype2label as $key => $val) {
+ $type2label[$key] = $langs->transnoentitiesnoconv($val);
+}
+
+$action = GETPOST('action', 'aZ09');
+$attrname = GETPOST('attrname', 'alpha');
+$elementtype = 'bookcal_booking'; //Must be the $table_element of the class that manage extrafield
+
+if (!$user->admin) {
+ accessforbidden();
+}
+
+
+/*
+ * Actions
+ */
+
+require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php';
+
+
+
+/*
+ * View
+ */
+
+$textobject = $langs->transnoentitiesnoconv("Booking");
+
+$help_url = '';
+$page_name = "BookCalSetup";
+
+llxHeader('', $langs->trans("BookCalSetup"), $help_url);
+
+
+$linkback = ''.$langs->trans("BackToModuleList").' ';
+print load_fiche_titre($langs->trans($page_name), $linkback, 'title_setup');
+
+
+$head = bookcalAdminPrepareHead();
+
+print dol_get_fiche_head($head, 'booking_extrafields', $langs->trans($page_name), -1, 'bookcal@bookcal');
+
+require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php';
+
+print dol_get_fiche_end();
+
+
+// Buttons
+if ($action != 'create' && $action != 'edit') {
+ print '";
+}
+
+
+/*
+ * Creation of an optional field
+ */
+if ($action == 'create') {
+ print '
';
+ print load_fiche_titre($langs->trans('NewAttribute'));
+
+ require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_add.tpl.php';
+}
+
+/*
+ * Edition of an optional field
+ */
+if ($action == 'edit' && !empty($attrname)) {
+ print " ";
+ print load_fiche_titre($langs->trans("FieldEdition", $attrname));
+
+ require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_edit.tpl.php';
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/bookcal/admin/setup.php b/htdocs/bookcal/admin/setup.php
new file mode 100644
index 00000000000..c4fd74404eb
--- /dev/null
+++ b/htdocs/bookcal/admin/setup.php
@@ -0,0 +1,587 @@
+
+ * Copyright (C) 2022 Alice Adminson
+ *
+ * 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 .
+ */
+
+/**
+ * \file bookcal/admin/setup.php
+ * \ingroup bookcal
+ * \brief BookCal setup page.
+ */
+
+// Load Dolibarr environment
+$res = 0;
+// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
+if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
+ $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
+}
+// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
+$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
+while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
+ $i--; $j--;
+}
+if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
+ $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
+}
+if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
+ $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
+}
+// Try main.inc.php using relative path
+if (!$res && file_exists("../../main.inc.php")) {
+ $res = @include "../../main.inc.php";
+}
+if (!$res && file_exists("../../../main.inc.php")) {
+ $res = @include "../../../main.inc.php";
+}
+if (!$res) {
+ die("Include of main fails");
+}
+
+global $langs, $user;
+
+// Libraries
+require_once DOL_DOCUMENT_ROOT."/core/lib/admin.lib.php";
+require_once '../lib/bookcal.lib.php';
+//require_once "../class/myclass.class.php";
+
+// Translations
+$langs->loadLangs(array("admin", "bookcal@bookcal"));
+
+// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
+$hookmanager->initHooks(array('bookcalsetup', 'globalsetup'));
+
+// Access control
+if (!$user->admin) {
+ accessforbidden();
+}
+
+// Parameters
+$action = GETPOST('action', 'aZ09');
+$backtopage = GETPOST('backtopage', 'alpha');
+$modulepart = GETPOST('modulepart', 'aZ09'); // Used by actions_setmoduleoptions.inc.php
+
+$value = GETPOST('value', 'alpha');
+$label = GETPOST('label', 'alpha');
+$scandir = GETPOST('scan_dir', 'alpha');
+$type = 'myobject';
+
+
+$error = 0;
+$setupnotempty = 0;
+
+// Set this to 1 to use the factory to manage constants. Warning, the generated module will be compatible with version v15+ only
+$useFormSetup = 1;
+
+if (!class_exists('FormSetup')) {
+ // For retrocompatibility Dolibarr < 16.0
+ if (floatval(DOL_VERSION) < 16.0 && !class_exists('FormSetup')) {
+ require_once __DIR__.'/../backport/v16/core/class/html.formsetup.class.php';
+ } else {
+ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formsetup.class.php';
+ }
+}
+
+$formSetup = new FormSetup($db);
+
+
+// Hôte
+$item = $formSetup->newItem('NO_PARAM_JUST_TEXT');
+$item->fieldOverride = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'];
+$item->cssClass = 'minwidth500';
+
+// Setup conf BOOKCAL_MYPARAM1 as a simple string input
+$item = $formSetup->newItem('BOOKCAL_MYPARAM1');
+$item->defaultFieldValue = 'default value';
+
+// Setup conf BOOKCAL_MYPARAM1 as a simple textarea input but we replace the text of field title
+$item = $formSetup->newItem('BOOKCAL_MYPARAM2');
+$item->nameText = $item->getNameText().' more html text ';
+
+// Setup conf BOOKCAL_MYPARAM3
+$item = $formSetup->newItem('BOOKCAL_MYPARAM3');
+$item->setAsThirdpartyType();
+
+// Setup conf BOOKCAL_MYPARAM4 : exemple of quick define write style
+$formSetup->newItem('BOOKCAL_MYPARAM4')->setAsYesNo();
+
+// Setup conf BOOKCAL_MYPARAM5
+$formSetup->newItem('BOOKCAL_MYPARAM5')->setAsEmailTemplate('thirdparty');
+
+// Setup conf BOOKCAL_MYPARAM6
+$formSetup->newItem('BOOKCAL_MYPARAM6')->setAsSecureKey()->enabled = 0; // disabled
+
+// Setup conf BOOKCAL_MYPARAM7
+$formSetup->newItem('BOOKCAL_MYPARAM7')->setAsProduct();
+
+$formSetup->newItem('Title')->setAsTitle();
+
+// Setup conf BOOKCAL_MYPARAM8
+$item = $formSetup->newItem('BOOKCAL_MYPARAM8');
+$TField = array(
+ 'test01' => $langs->trans('test01'),
+ 'test02' => $langs->trans('test02'),
+ 'test03' => $langs->trans('test03'),
+ 'test04' => $langs->trans('test04'),
+ 'test05' => $langs->trans('test05'),
+ 'test06' => $langs->trans('test06'),
+);
+$item->setAsMultiSelect($TField);
+$item->helpText = $langs->transnoentities('BOOKCAL_MYPARAM8');
+
+
+// Setup conf BOOKCAL_MYPARAM9
+$formSetup->newItem('BOOKCAL_MYPARAM9')->setAsSelect($TField);
+
+
+// Setup conf BOOKCAL_MYPARAM10
+$item = $formSetup->newItem('BOOKCAL_MYPARAM10');
+$item->setAsColor();
+$item->defaultFieldValue = '#FF0000';
+$item->nameText = $item->getNameText().' more html text ';
+$item->fieldInputOverride = '';
+$item->helpText = $langs->transnoentities('AnHelpMessage');
+//$item->fieldValue = '';
+//$item->fieldAttr = array() ; // fields attribute only for compatible fields like input text
+//$item->fieldOverride = false; // set this var to override field output will override $fieldInputOverride and $fieldOutputOverride too
+//$item->fieldInputOverride = false; // set this var to override field input
+//$item->fieldOutputOverride = false; // set this var to override field output
+
+
+$setupnotempty =+ count($formSetup->items);
+
+
+$dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
+
+
+/*
+ * Actions
+ */
+
+// For retrocompatibility Dolibarr < 15.0
+if ( versioncompare(explode('.', DOL_VERSION), array(15)) < 0 && $action == 'update' && !empty($user->admin)) {
+ $formSetup->saveConfFromPost();
+}
+
+include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php';
+
+if ($action == 'updateMask') {
+ $maskconst = GETPOST('maskconst', 'alpha');
+ $maskvalue = GETPOST('maskvalue', 'alpha');
+
+ if ($maskconst) {
+ $res = dolibarr_set_const($db, $maskconst, $maskvalue, 'chaine', 0, '', $conf->entity);
+ if (!($res > 0)) {
+ $error++;
+ }
+ }
+
+ if (!$error) {
+ setEventMessages($langs->trans("SetupSaved"), null, 'mesgs');
+ } else {
+ setEventMessages($langs->trans("Error"), null, 'errors');
+ }
+} elseif ($action == 'specimen') {
+ $modele = GETPOST('module', 'alpha');
+ $tmpobjectkey = GETPOST('object');
+
+ $tmpobject = new $tmpobjectkey($db);
+ $tmpobject->initAsSpecimen();
+
+ // Search template files
+ $file = ''; $classname = ''; $filefound = 0;
+ $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
+ foreach ($dirmodels as $reldir) {
+ $file = dol_buildpath($reldir."core/modules/bookcal/doc/pdf_".$modele."_".strtolower($tmpobjectkey).".modules.php", 0);
+ if (file_exists($file)) {
+ $filefound = 1;
+ $classname = "pdf_".$modele."_".strtolower($tmpobjectkey);
+ break;
+ }
+ }
+
+ if ($filefound) {
+ require_once $file;
+
+ $module = new $classname($db);
+
+ if ($module->write_file($tmpobject, $langs) > 0) {
+ header("Location: ".DOL_URL_ROOT."/document.php?modulepart=bookcal-".strtolower($tmpobjectkey)."&file=SPECIMEN.pdf");
+ return;
+ } else {
+ setEventMessages($module->error, null, 'errors');
+ dol_syslog($module->error, LOG_ERR);
+ }
+ } else {
+ setEventMessages($langs->trans("ErrorModuleNotFound"), null, 'errors');
+ dol_syslog($langs->trans("ErrorModuleNotFound"), LOG_ERR);
+ }
+} elseif ($action == 'setmod') {
+ // TODO Check if numbering module chosen can be activated by calling method canBeActivated
+ $tmpobjectkey = GETPOST('object');
+ if (!empty($tmpobjectkey)) {
+ $constforval = 'BOOKCAL_'.strtoupper($tmpobjectkey)."_ADDON";
+ dolibarr_set_const($db, $constforval, $value, 'chaine', 0, '', $conf->entity);
+ }
+} elseif ($action == 'set') {
+ // Activate a model
+ $ret = addDocumentModel($value, $type, $label, $scandir);
+} elseif ($action == 'del') {
+ $ret = delDocumentModel($value, $type);
+ if ($ret > 0) {
+ $tmpobjectkey = GETPOST('object');
+ if (!empty($tmpobjectkey)) {
+ $constforval = 'BOOKCAL_'.strtoupper($tmpobjectkey).'_ADDON_PDF';
+ if ($conf->global->$constforval == "$value") {
+ dolibarr_del_const($db, $constforval, $conf->entity);
+ }
+ }
+ }
+} elseif ($action == 'setdoc') {
+ // Set or unset default model
+ $tmpobjectkey = GETPOST('object');
+ if (!empty($tmpobjectkey)) {
+ $constforval = 'BOOKCAL_'.strtoupper($tmpobjectkey).'_ADDON_PDF';
+ if (dolibarr_set_const($db, $constforval, $value, 'chaine', 0, '', $conf->entity)) {
+ // The constant that was read before the new set
+ // We therefore requires a variable to have a coherent view
+ $conf->global->$constforval = $value;
+ }
+
+ // We disable/enable the document template (into llx_document_model table)
+ $ret = delDocumentModel($value, $type);
+ if ($ret > 0) {
+ $ret = addDocumentModel($value, $type, $label, $scandir);
+ }
+ }
+} elseif ($action == 'unsetdoc') {
+ $tmpobjectkey = GETPOST('object');
+ if (!empty($tmpobjectkey)) {
+ $constforval = 'BOOKCAL_'.strtoupper($tmpobjectkey).'_ADDON_PDF';
+ dolibarr_del_const($db, $constforval, $conf->entity);
+ }
+}
+
+
+
+/*
+ * View
+ */
+
+$form = new Form($db);
+
+$help_url = '';
+$page_name = "BookCalSetup";
+
+llxHeader('', $langs->trans($page_name), $help_url);
+
+// Subheader
+$linkback = ''.$langs->trans("BackToModuleList").' ';
+
+print load_fiche_titre($langs->trans($page_name), $linkback, 'title_setup');
+
+// Configuration header
+$head = bookcalAdminPrepareHead();
+print dol_get_fiche_head($head, 'settings', $langs->trans($page_name), -1, "bookcal@bookcal");
+
+// Setup page goes here
+echo ''.$langs->trans("BookCalSetupPage").' ';
+
+
+if ($action == 'edit') {
+ print $formSetup->generateOutput(true);
+ print ' ';
+} elseif (!empty($formSetup->items)) {
+ print $formSetup->generateOutput();
+ print '';
+} else {
+ print ' '.$langs->trans("NothingToSetup");
+}
+
+
+$moduledir = 'bookcal';
+$myTmpObjects = array();
+$myTmpObjects['MyObject'] = array('includerefgeneration'=>0, 'includedocgeneration'=>0);
+
+
+foreach ($myTmpObjects as $myTmpObjectKey => $myTmpObjectArray) {
+ if ($myTmpObjectKey == 'MyObject') {
+ continue;
+ }
+ if ($myTmpObjectArray['includerefgeneration']) {
+ /*
+ * Orders Numbering model
+ */
+ $setupnotempty++;
+
+ print load_fiche_titre($langs->trans("NumberingModules", $myTmpObjectKey), '', '');
+
+ print '';
+ print '';
+ print ''.$langs->trans("Name").' ';
+ print ''.$langs->trans("Description").' ';
+ print ''.$langs->trans("Example").' ';
+ print ''.$langs->trans("Status").' ';
+ print ''.$langs->trans("ShortInfo").' ';
+ print ' '."\n";
+
+ clearstatcache();
+
+ foreach ($dirmodels as $reldir) {
+ $dir = dol_buildpath($reldir."core/modules/".$moduledir);
+
+ if (is_dir($dir)) {
+ $handle = opendir($dir);
+ if (is_resource($handle)) {
+ while (($file = readdir($handle)) !== false) {
+ if (strpos($file, 'mod_'.strtolower($myTmpObjectKey).'_') === 0 && substr($file, dol_strlen($file) - 3, 3) == 'php') {
+ $file = substr($file, 0, dol_strlen($file) - 4);
+
+ require_once $dir.'/'.$file.'.php';
+
+ $module = new $file($db);
+
+ // Show modules according to features level
+ if ($module->version == 'development' && $conf->global->MAIN_FEATURES_LEVEL < 2) {
+ continue;
+ }
+ if ($module->version == 'experimental' && $conf->global->MAIN_FEATURES_LEVEL < 1) {
+ continue;
+ }
+
+ if ($module->isEnabled()) {
+ dol_include_once('/'.$moduledir.'/class/'.strtolower($myTmpObjectKey).'.class.php');
+
+ print ''.$module->name." \n";
+ print $module->info();
+ print ' ';
+
+ // Show example of numbering model
+ print '';
+ $tmp = $module->getExample();
+ if (preg_match('/^Error/', $tmp)) {
+ $langs->load("errors");
+ print ''.$langs->trans($tmp).'
';
+ } elseif ($tmp == 'NotConfigured') {
+ print $langs->trans($tmp);
+ } else {
+ print $tmp;
+ }
+ print ' '."\n";
+
+ print '';
+ $constforvar = 'BOOKCAL_'.strtoupper($myTmpObjectKey).'_ADDON';
+ if (getDolGlobalString($constforvar) == $file) {
+ print img_picto($langs->trans("Activated"), 'switch_on');
+ } else {
+ print '';
+ print img_picto($langs->trans("Disabled"), 'switch_off');
+ print ' ';
+ }
+ print ' ';
+
+ $mytmpinstance = new $myTmpObjectKey($db);
+ $mytmpinstance->initAsSpecimen();
+
+ // Info
+ $htmltooltip = '';
+ $htmltooltip .= ''.$langs->trans("Version").': '.$module->getVersion().' ';
+
+ $nextval = $module->getNextValue($mytmpinstance);
+ if ("$nextval" != $langs->trans("NotAvailable")) { // Keep " on nextval
+ $htmltooltip .= ''.$langs->trans("NextValue").': ';
+ if ($nextval) {
+ if (preg_match('/^Error/', $nextval) || $nextval == 'NotConfigured') {
+ $nextval = $langs->trans($nextval);
+ }
+ $htmltooltip .= $nextval.' ';
+ } else {
+ $htmltooltip .= $langs->trans($module->error).' ';
+ }
+ }
+
+ print '';
+ print $form->textwithpicto('', $htmltooltip, 1, 0);
+ print ' ';
+
+ print " \n";
+ }
+ }
+ }
+ closedir($handle);
+ }
+ }
+ }
+ print "
\n";
+ }
+
+ if ($myTmpObjectArray['includedocgeneration']) {
+ /*
+ * Document templates generators
+ */
+ $setupnotempty++;
+ $type = strtolower($myTmpObjectKey);
+
+ print load_fiche_titre($langs->trans("DocumentModules", $myTmpObjectKey), '', '');
+
+ // Load array def with activated templates
+ $def = array();
+ $sql = "SELECT nom";
+ $sql .= " FROM ".MAIN_DB_PREFIX."document_model";
+ $sql .= " WHERE type = '".$db->escape($type)."'";
+ $sql .= " AND entity = ".$conf->entity;
+ $resql = $db->query($sql);
+ if ($resql) {
+ $i = 0;
+ $num_rows = $db->num_rows($resql);
+ while ($i < $num_rows) {
+ $array = $db->fetch_array($resql);
+ array_push($def, $array[0]);
+ $i++;
+ }
+ } else {
+ dol_print_error($db);
+ }
+
+ print "\n";
+ print "\n";
+ print ''.$langs->trans("Name").' ';
+ print ''.$langs->trans("Description").' ';
+ print ''.$langs->trans("Status")." \n";
+ print ''.$langs->trans("Default")." \n";
+ print ''.$langs->trans("ShortInfo").' ';
+ print ''.$langs->trans("Preview").' ';
+ print " \n";
+
+ clearstatcache();
+
+ foreach ($dirmodels as $reldir) {
+ foreach (array('', '/doc') as $valdir) {
+ $realpath = $reldir."core/modules/".$moduledir.$valdir;
+ $dir = dol_buildpath($realpath);
+
+ if (is_dir($dir)) {
+ $handle = opendir($dir);
+ if (is_resource($handle)) {
+ while (($file = readdir($handle)) !== false) {
+ $filelist[] = $file;
+ }
+ closedir($handle);
+ arsort($filelist);
+
+ foreach ($filelist as $file) {
+ if (preg_match('/\.modules\.php$/i', $file) && preg_match('/^(pdf_|doc_)/', $file)) {
+ if (file_exists($dir.'/'.$file)) {
+ $name = substr($file, 4, dol_strlen($file) - 16);
+ $classname = substr($file, 0, dol_strlen($file) - 12);
+
+ require_once $dir.'/'.$file;
+ $module = new $classname($db);
+
+ $modulequalified = 1;
+ if ($module->version == 'development' && $conf->global->MAIN_FEATURES_LEVEL < 2) {
+ $modulequalified = 0;
+ }
+ if ($module->version == 'experimental' && $conf->global->MAIN_FEATURES_LEVEL < 1) {
+ $modulequalified = 0;
+ }
+
+ if ($modulequalified) {
+ print '';
+ print (empty($module->name) ? $name : $module->name);
+ print " \n";
+ if (method_exists($module, 'info')) {
+ print $module->info($langs);
+ } else {
+ print $module->description;
+ }
+ print ' ';
+
+ // Active
+ if (in_array($name, $def)) {
+ print ''."\n";
+ print '';
+ print img_picto($langs->trans("Enabled"), 'switch_on');
+ print ' ';
+ print ' ';
+ } else {
+ print ''."\n";
+ print 'scandir).'&label='.urlencode($module->name).'">'.img_picto($langs->trans("Disabled"), 'switch_off').' ';
+ print " ";
+ }
+
+ // Default
+ print '';
+ $constforvar = 'BOOKCAL_'.strtoupper($myTmpObjectKey).'_ADDON';
+ if (getDolGlobalString($constforvar) == $name) {
+ //print img_picto($langs->trans("Default"), 'on');
+ // Even if choice is the default value, we allow to disable it. Replace this with previous line if you need to disable unset
+ print 'scandir).'&label='.urlencode($module->name).'&type='.urlencode($type).'" alt="'.$langs->trans("Disable").'">'.img_picto($langs->trans("Enabled"), 'on').' ';
+ } else {
+ print 'scandir).'&label='.urlencode($module->name).'" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"), 'off').' ';
+ }
+ print ' ';
+
+ // Info
+ $htmltooltip = ''.$langs->trans("Name").': '.$module->name;
+ $htmltooltip .= ' '.$langs->trans("Type").': '.($module->type ? $module->type : $langs->trans("Unknown"));
+ if ($module->type == 'pdf') {
+ $htmltooltip .= ' '.$langs->trans("Width").'/'.$langs->trans("Height").': '.$module->page_largeur.'/'.$module->page_hauteur;
+ }
+ $htmltooltip .= ' '.$langs->trans("Path").': '.preg_replace('/^\//', '', $realpath).'/'.$file;
+
+ $htmltooltip .= ''.$langs->trans("FeaturesSupported").': ';
+ $htmltooltip .= ' '.$langs->trans("Logo").': '.yn($module->option_logo, 1, 1);
+ $htmltooltip .= ' '.$langs->trans("MultiLanguage").': '.yn($module->option_multilang, 1, 1);
+
+ print '';
+ print $form->textwithpicto('', $htmltooltip, 1, 0);
+ print ' ';
+
+ // Preview
+ print '';
+ if ($module->type == 'pdf') {
+ $newname = preg_replace('/_'.preg_quote(strtolower($myTmpObjectKey), '/').'/', '', $name);
+ print ''.img_object($langs->trans("Preview"), 'pdf').' ';
+ } else {
+ print img_object($langs->trans("PreviewNotAvailable"), 'generic');
+ }
+ print ' ';
+
+ print " \n";
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ print '
';
+ }
+}
+
+if (empty($setupnotempty)) {
+ print ' '.$langs->trans("NothingToSetup");
+}
+
+// Page end
+print dol_get_fiche_end();
+
+llxFooter();
+$db->close();
diff --git a/htdocs/bookcal/availabilities_agenda.php b/htdocs/bookcal/availabilities_agenda.php
new file mode 100644
index 00000000000..c3e66a17257
--- /dev/null
+++ b/htdocs/bookcal/availabilities_agenda.php
@@ -0,0 +1,315 @@
+
+ * Copyright (C) 2022 Alice Adminson
+ *
+ * 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 .
+ */
+
+/**
+ * \file availabilities_agenda.php
+ * \ingroup bookcal
+ * \brief Tab of events on Availabilities
+ */
+
+//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db
+//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user
+//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc
+//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs
+//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters
+//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters
+//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on).
+//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on)
+//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data
+//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu
+//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php
+//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library
+//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too.
+//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
+//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value
+//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler
+//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message
+//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies
+//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET
+//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification
+
+// Load Dolibarr environment
+$res = 0;
+// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
+if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
+ $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
+}
+// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
+$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
+while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
+ $i--; $j--;
+}
+if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
+ $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
+}
+if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
+ $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
+}
+// Try main.inc.php using relative path
+if (!$res && file_exists("../main.inc.php")) {
+ $res = @include "../main.inc.php";
+}
+if (!$res && file_exists("../../main.inc.php")) {
+ $res = @include "../../main.inc.php";
+}
+if (!$res && file_exists("../../../main.inc.php")) {
+ $res = @include "../../../main.inc.php";
+}
+if (!$res) {
+ die("Include of main fails");
+}
+
+require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
+dol_include_once('/bookcal/class/availabilities.class.php');
+dol_include_once('/bookcal/lib/bookcal_availabilities.lib.php');
+
+
+// Load translation files required by the page
+$langs->loadLangs(array("bookcal@bookcal", "other"));
+
+// Get parameters
+$id = GETPOST('id', 'int');
+$ref = GETPOST('ref', 'alpha');
+$action = GETPOST('action', 'aZ09');
+$cancel = GETPOST('cancel', 'aZ09');
+$backtopage = GETPOST('backtopage', 'alpha');
+
+if (GETPOST('actioncode', 'array')) {
+ $actioncode = GETPOST('actioncode', 'array', 3);
+ if (!count($actioncode)) {
+ $actioncode = '0';
+ }
+} else {
+ $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT));
+}
+$search_agenda_label = GETPOST('search_agenda_label');
+
+$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
+$sortfield = GETPOST('sortfield', 'aZ09comma');
+$sortorder = GETPOST('sortorder', 'aZ09comma');
+$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
+if (empty($page) || $page == -1) {
+ $page = 0;
+} // If $page is not defined, or '' or -1
+$offset = $limit * $page;
+$pageprev = $page - 1;
+$pagenext = $page + 1;
+if (!$sortfield) {
+ $sortfield = 'a.datep,a.id';
+}
+if (!$sortorder) {
+ $sortorder = 'DESC,DESC';
+}
+
+// Initialize technical objects
+$object = new Availabilities($db);
+$extrafields = new ExtraFields($db);
+$diroutputmassaction = $conf->bookcal->dir_output.'/temp/massgeneration/'.$user->id;
+$hookmanager->initHooks(array('availabilitiesagenda', 'globalcard')); // Note that conf->hooks_modules contains array
+// Fetch optionals attributes and labels
+$extrafields->fetch_name_optionals_label($object->table_element);
+
+// Load object
+include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals
+if ($id > 0 || !empty($ref)) {
+ $upload_dir = $conf->bookcal->multidir_output[!empty($object->entity) ? $object->entity : $conf->entity]."/".$object->id;
+}
+
+// There is several ways to check permission.
+// Set $enablepermissioncheck to 1 to enable a minimum low level of checks
+$enablepermissioncheck = 0;
+if ($enablepermissioncheck) {
+ $permissiontoread = $user->rights->bookcal->availabilities->read;
+ $permissiontoadd = $user->rights->bookcal->availabilities->write;
+} else {
+ $permissiontoread = 1;
+ $permissiontoadd = 1;
+}
+
+// Security check (enable the most restrictive one)
+//if ($user->socid > 0) accessforbidden();
+//if ($user->socid > 0) $socid = $user->socid;
+//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
+//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
+if (empty($conf->bookcal->enabled)) accessforbidden();
+if (!$permissiontoread) accessforbidden();
+
+
+/*
+ * Actions
+ */
+
+$parameters = array('id'=>$id);
+$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
+if ($reshook < 0) {
+ setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+}
+
+if (empty($reshook)) {
+ // Cancel
+ if (GETPOST('cancel', 'alpha') && !empty($backtopage)) {
+ header("Location: ".$backtopage);
+ exit;
+ }
+
+ // Purge search criteria
+ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
+ $actioncode = '';
+ $search_agenda_label = '';
+ }
+}
+
+
+
+/*
+ * View
+ */
+
+$form = new Form($db);
+
+if ($object->id > 0) {
+ $title = $langs->trans("Agenda");
+ //if (! empty($conf->global->MAIN_HTML_TITLE) && preg_match('/thirdpartynameonly/',$conf->global->MAIN_HTML_TITLE) && $object->name) $title=$object->name." - ".$title;
+ $help_url = 'EN:Module_Agenda_En';
+ llxHeader('', $title, $help_url);
+
+ if (!empty($conf->notification->enabled)) {
+ $langs->load("mails");
+ }
+ $head = availabilitiesPrepareHead($object);
+
+
+ print dol_get_fiche_head($head, 'agenda', $langs->trans("Availabilities"), -1, $object->picto);
+
+ // Object card
+ // ------------------------------------------------------------
+ $linkback = ''.$langs->trans("BackToList").' ';
+
+ $morehtmlref = '';
+ /*
+ // Ref customer
+ $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
+ $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
+ // Thirdparty
+ $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . (is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : '');
+ // Project
+ if (! empty($conf->project->enabled)) {
+ $langs->load("projects");
+ $morehtmlref.='
'.$langs->trans('Project') . ' ';
+ if ($permissiontoadd) {
+ if ($action != 'classify') {
+ //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
+ }
+ $morehtmlref.=' : ';
+ if ($action == 'classify') {
+ //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
+ $morehtmlref.='
';
+ $morehtmlref.=' ';
+ $morehtmlref.=' ';
+ $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
+ $morehtmlref.=' ';
+ $morehtmlref.=' ';
+ } else {
+ $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ }
+ } else {
+ if (! empty($object->fk_project)) {
+ $proj = new Project($db);
+ $proj->fetch($object->fk_project);
+ $morehtmlref .= ': '.$proj->getNomUrl();
+ } else {
+ $morehtmlref .= '';
+ }
+ }
+ }*/
+ $morehtmlref .= '
';
+
+
+ dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
+
+ print '';
+ print '
';
+
+ $object->info($object->id);
+ dol_print_object_info($object, 1);
+
+ print '
';
+
+ print dol_get_fiche_end();
+
+
+
+ // Actions buttons
+
+ $objthirdparty = $object;
+ $objcon = new stdClass();
+
+ $out = '&origin='.urlencode($object->element.'@'.$object->module).'&originid='.urlencode($object->id);
+ $urlbacktopage = $_SERVER['PHP_SELF'].'?id='.$object->id;
+ $out .= '&backtopage='.urlencode($urlbacktopage);
+ $permok = $user->rights->agenda->myactions->create;
+ if ((!empty($objthirdparty->id) || !empty($objcon->id)) && $permok) {
+ //$out.='trans("AddAnAction"),'filenew');
+ //$out.=" ";
+ }
+
+
+ print '';
+
+ if (isModEnabled('agenda') && (!empty($user->rights->agenda->myactions->read) || !empty($user->rights->agenda->allactions->read))) {
+ $param = '&id='.$object->id.(!empty($socid) ? '&socid='.$socid : '');
+ if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
+ $param .= '&contextpage='.urlencode($contextpage);
+ }
+ if ($limit > 0 && $limit != $conf->liste_limit) {
+ $param .= '&limit='.urlencode($limit);
+ }
+
+
+ //print load_fiche_titre($langs->trans("ActionsOnAvailabilities"), '', '');
+
+ // List of all actions
+ $filters = array();
+ $filters['search_agenda_label'] = $search_agenda_label;
+
+ // TODO Replace this with same code than into list.php
+ show_actions_done($conf, $langs, $db, $object, null, 0, $actioncode, '', $filters, $sortfield, $sortorder, $object->module);
+ }
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/bookcal/availabilities_card.php b/htdocs/bookcal/availabilities_card.php
new file mode 100644
index 00000000000..b9f5277d4ae
--- /dev/null
+++ b/htdocs/bookcal/availabilities_card.php
@@ -0,0 +1,627 @@
+
+ * Copyright (C) 2022 Alice Adminson
+ *
+ * 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 .
+ */
+
+/**
+ * \file availabilities_card.php
+ * \ingroup bookcal
+ * \brief Page to create/edit/view availabilities
+ */
+
+//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db
+//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user
+//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc
+//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs
+//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters
+//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters
+//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token).
+//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on)
+//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data
+//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu
+//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php
+//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library
+//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too.
+//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
+//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value
+//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler
+//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message
+//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies
+//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET
+//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification
+//if (! defined('NOSESSION')) define('NOSESSION', '1'); // Disable session
+
+// Load Dolibarr environment
+$res = 0;
+// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
+if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
+ $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
+}
+// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
+$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
+while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
+ $i--; $j--;
+}
+if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
+ $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
+}
+if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
+ $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
+}
+// Try main.inc.php using relative path
+if (!$res && file_exists("../main.inc.php")) {
+ $res = @include "../main.inc.php";
+}
+if (!$res && file_exists("../../main.inc.php")) {
+ $res = @include "../../main.inc.php";
+}
+if (!$res && file_exists("../../../main.inc.php")) {
+ $res = @include "../../../main.inc.php";
+}
+if (!$res) {
+ die("Include of main fails");
+}
+
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
+dol_include_once('/bookcal/class/availabilities.class.php');
+dol_include_once('/bookcal/lib/bookcal_availabilities.lib.php');
+
+// Load translation files required by the page
+$langs->loadLangs(array("bookcal@bookcal", "other"));
+
+// Get parameters
+$id = GETPOST('id', 'int');
+$ref = GETPOST('ref', 'alpha');
+$lineid = GETPOST('lineid', 'int');
+
+$action = GETPOST('action', 'aZ09');
+$confirm = GETPOST('confirm', 'alpha');
+$cancel = GETPOST('cancel', 'aZ09');
+$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search
+$backtopage = GETPOST('backtopage', 'alpha');
+$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
+$dol_openinpopup = GETPOST('dol_openinpopup', 'aZ09');
+
+// Initialize technical objects
+$object = new Availabilities($db);
+$extrafields = new ExtraFields($db);
+$diroutputmassaction = $conf->bookcal->dir_output.'/temp/massgeneration/'.$user->id;
+$hookmanager->initHooks(array('availabilitiescard', 'globalcard')); // Note that conf->hooks_modules contains array
+
+// Fetch optionals attributes and labels
+$extrafields->fetch_name_optionals_label($object->table_element);
+
+$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
+
+// Initialize array of search criterias
+$search_all = GETPOST("search_all", 'alpha');
+$search = array();
+foreach ($object->fields as $key => $val) {
+ if (GETPOST('search_'.$key, 'alpha')) {
+ $search[$key] = GETPOST('search_'.$key, 'alpha');
+ }
+}
+
+if (empty($action) && empty($id) && empty($ref)) {
+ $action = 'view';
+}
+
+// Load object
+include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once.
+
+// There is several ways to check permission.
+// Set $enablepermissioncheck to 1 to enable a minimum low level of checks
+$enablepermissioncheck = 0;
+if ($enablepermissioncheck) {
+ $permissiontoread = $user->rights->bookcal->availabilities->read;
+ $permissiontoadd = $user->rights->bookcal->availabilities->write; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
+ $permissiontodelete = $user->rights->bookcal->availabilities->delete || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
+ $permissionnote = $user->rights->bookcal->availabilities->write; // Used by the include of actions_setnotes.inc.php
+ $permissiondellink = $user->rights->bookcal->availabilities->write; // Used by the include of actions_dellink.inc.php
+} else {
+ $permissiontoread = 1;
+ $permissiontoadd = 1; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
+ $permissiontodelete = 1;
+ $permissionnote = 1;
+ $permissiondellink = 1;
+}
+
+$upload_dir = $conf->bookcal->multidir_output[isset($object->entity) ? $object->entity : 1].'/availabilities';
+
+// Security check (enable the most restrictive one)
+//if ($user->socid > 0) accessforbidden();
+//if ($user->socid > 0) $socid = $user->socid;
+//$isdraft = (isset($object->status) && ($object->status == $object::STATUS_DRAFT) ? 1 : 0);
+//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
+if (empty($conf->bookcal->enabled)) accessforbidden();
+if (!$permissiontoread) accessforbidden();
+
+
+/*
+ * Actions
+ */
+
+$parameters = array();
+$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
+if ($reshook < 0) {
+ setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+}
+
+if (empty($reshook)) {
+ $error = 0;
+
+ $backurlforlist = dol_buildpath('/bookcal/availabilities_list.php', 1);
+
+ if (empty($backtopage) || ($cancel && empty($id))) {
+ if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
+ if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
+ $backtopage = $backurlforlist;
+ } else {
+ $backtopage = dol_buildpath('/bookcal/availabilities_card.php', 1).'?id='.((!empty($id) && $id > 0) ? $id : '__ID__');
+ }
+ }
+ }
+
+ $triggermodname = 'BOOKCAL_AVAILABILITIES_MODIFY'; // Name of trigger action code to execute when we modify record
+
+ // Actions cancel, add, update, update_extras, confirm_validate, confirm_delete, confirm_deleteline, confirm_clone, confirm_close, confirm_setdraft, confirm_reopen
+ include DOL_DOCUMENT_ROOT.'/core/actions_addupdatedelete.inc.php';
+
+ // Actions when linking object each other
+ include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php';
+
+ // Actions when printing a doc from card
+ include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
+
+ // Action to move up and down lines of object
+ //include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php';
+
+ // Action to build doc
+ include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
+
+ if ($action == 'set_thirdparty' && $permissiontoadd) {
+ $object->setValueFrom('fk_soc', GETPOST('fk_soc', 'int'), '', '', 'date', '', $user, $triggermodname);
+ }
+ if ($action == 'classin' && $permissiontoadd) {
+ $object->setProject(GETPOST('projectid', 'int'));
+ }
+
+ // Actions to send emails
+ $triggersendname = 'BOOKCAL_AVAILABILITIES_SENTBYMAIL';
+ $autocopy = 'MAIN_MAIL_AUTOCOPY_AVAILABILITIES_TO';
+ $trackid = 'availabilities'.$object->id;
+ include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
+}
+
+
+
+
+/*
+ * View
+ *
+ * Put here all code to build page
+ */
+
+$form = new Form($db);
+$formfile = new FormFile($db);
+$formproject = new FormProjets($db);
+
+$title = $langs->trans("Availabilities");
+$help_url = '';
+llxHeader('', $title, $help_url);
+
+// Example : Adding jquery code
+// print '';
+
+
+// Part to create
+if ($action == 'create') {
+ if (empty($permissiontoadd)) {
+ accessforbidden($langs->trans('NotEnoughPermissions'), 0, 1);
+ exit;
+ }
+
+ print load_fiche_titre($langs->trans("NewObject", $langs->transnoentitiesnoconv("Availabilities")), '', 'object_'.$object->picto);
+
+ print '';
+ print ' ';
+ print ' ';
+ if ($backtopage) {
+ print ' ';
+ }
+ if ($backtopageforcancel) {
+ print ' ';
+ }
+
+ print dol_get_fiche_head(array(), '');
+
+ // Set some default values
+ //if (! GETPOSTISSET('fieldname')) $_POST['fieldname'] = 'myvalue';
+
+ print ''."\n";
+
+ // Common attributes
+ include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_add.tpl.php';
+
+ // Other attributes
+ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
+
+ print '
'."\n";
+
+ print dol_get_fiche_end();
+
+ print $form->buttonsSaveCancel("Create");
+
+ print ' ';
+
+ //dol_set_focus('input[name="ref"]');
+}
+
+// Part to edit record
+if (($id || $ref) && $action == 'edit') {
+ print load_fiche_titre($langs->trans("Availabilities"), '', 'object_'.$object->picto);
+
+ print '';
+ print ' ';
+ print ' ';
+ print ' ';
+ if ($backtopage) {
+ print ' ';
+ }
+ if ($backtopageforcancel) {
+ print ' ';
+ }
+
+ print dol_get_fiche_head();
+
+ print ''."\n";
+
+ // Common attributes
+ include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_edit.tpl.php';
+
+ // Other attributes
+ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_edit.tpl.php';
+
+ print '
';
+
+ print dol_get_fiche_end();
+
+ print $form->buttonsSaveCancel();
+
+ print ' ';
+}
+
+// Part to show record
+if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) {
+ $res = $object->fetch_optionals();
+
+ $head = availabilitiesPrepareHead($object);
+ print dol_get_fiche_head($head, 'card', $langs->trans("Availabilities"), -1, $object->picto);
+
+ $formconfirm = '';
+
+ // Confirmation to delete
+ if ($action == 'delete') {
+ $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteAvailabilities'), $langs->trans('ConfirmDeleteObject'), 'confirm_delete', '', 0, 1);
+ }
+ // Confirmation to delete line
+ if ($action == 'deleteline') {
+ $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteLine'), $langs->trans('ConfirmDeleteLine'), 'confirm_deleteline', '', 0, 1);
+ }
+
+ // Clone confirmation
+ if ($action == 'clone') {
+ // Create an array for form
+ $formquestion = array();
+ $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneAsk', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
+ }
+
+ if ($action == 'generate') {
+ print ' Link : '. DOL_DOCUMENT_ROOT.'/public/bookcal/booking.php?id='.$object->id . ' ' ;
+ }
+
+ // Confirmation of action xxxx (You can use it for xxx = 'close', xxx = 'reopen', ...)
+ if ($action == 'xxx') {
+ $text = $langs->trans('ConfirmActionAvailabilities', $object->ref);
+ /*if (! empty($conf->notification->enabled))
+ {
+ require_once DOL_DOCUMENT_ROOT . '/core/class/notify.class.php';
+ $notify = new Notify($db);
+ $text .= ' ';
+ $text .= $notify->confirmMessage('AVAILABILITIES_CLOSE', $object->socid, $object);
+ }*/
+
+ $formquestion = array();
+ /*
+ $forcecombo=0;
+ if ($conf->browser->name == 'ie') $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy
+ $formquestion = array(
+ // 'text' => $langs->trans("ConfirmClone"),
+ // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1),
+ // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1),
+ // array('type' => 'other', 'name' => 'idwarehouse', 'label' => $langs->trans("SelectWarehouseForStockDecrease"), 'value' => $formproduct->selectWarehouses(GETPOST('idwarehouse')?GETPOST('idwarehouse'):'ifone', 'idwarehouse', '', 1, 0, 0, '', 0, $forcecombo))
+ );
+ */
+ $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('XXX'), $text, 'confirm_xxx', $formquestion, 0, 1, 220);
+ }
+
+ // Call Hook formConfirm
+ $parameters = array('formConfirm' => $formconfirm, 'lineid' => $lineid);
+ $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+ if (empty($reshook)) {
+ $formconfirm .= $hookmanager->resPrint;
+ } elseif ($reshook > 0) {
+ $formconfirm = $hookmanager->resPrint;
+ }
+
+ // Print form confirm
+ print $formconfirm;
+
+
+ // Object card
+ // ------------------------------------------------------------
+ $linkback = ''.$langs->trans("BackToList").' ';
+
+ $morehtmlref = '';
+ /*
+ // Ref customer
+ $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
+ $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
+ // Thirdparty
+ $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . (is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : '');
+ // Project
+ if (! empty($conf->project->enabled)) {
+ $langs->load("projects");
+ $morehtmlref .= '
'.$langs->trans('Project') . ' ';
+ if ($permissiontoadd) {
+ //if ($action != 'classify') $morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' ';
+ $morehtmlref .= ' : ';
+ if ($action == 'classify') {
+ //$morehtmlref .= $form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
+ $morehtmlref .= '
';
+ $morehtmlref .= ' ';
+ $morehtmlref .= ' ';
+ $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
+ $morehtmlref .= ' ';
+ $morehtmlref .= ' ';
+ } else {
+ $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ }
+ } else {
+ if (! empty($object->fk_project)) {
+ $proj = new Project($db);
+ $proj->fetch($object->fk_project);
+ $morehtmlref .= ': '.$proj->getNomUrl();
+ } else {
+ $morehtmlref .= '';
+ }
+ }
+ }*/
+ $morehtmlref .= '
';
+
+
+ dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
+
+
+ print '';
+ print '
';
+ print '
';
+ print '
'."\n";
+
+ // Common attributes
+ //$keyforbreak='fieldkeytoswitchonsecondcolumn'; // We change column just before this field
+ //unset($object->fields['fk_project']); // Hide field already shown in banner
+ //unset($object->fields['fk_soc']); // Hide field already shown in banner
+ include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php';
+
+ // Other attributes. Fields from hook formObjectOptions and Extrafields.
+ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
+
+ print '
';
+ print '
';
+ print '
';
+
+ print '
';
+
+ print dol_get_fiche_end();
+
+
+ /*
+ * Lines
+ */
+
+ if (!empty($object->table_element_line)) {
+ // Show object lines
+ $result = $object->getLinesArray();
+
+ print ' id.(($action != 'editline') ? '' : '#line_'.GETPOST('lineid', 'int')).'" method="POST">
+
+
+
+
+
+ ';
+
+ if (!empty($conf->use_javascript_ajax) && $object->status == 0) {
+ include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
+ }
+
+ print '';
+ if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) {
+ print '
';
+ }
+
+ if (!empty($object->lines)) {
+ $object->printObjectLines($action, $mysoc, null, GETPOST('lineid', 'int'), 1);
+ }
+
+ // Form to add new line
+ if ($object->status == 0 && $permissiontoadd && $action != 'selectlines') {
+ if ($action != 'editline') {
+ // Add products/services form
+
+ $parameters = array();
+ $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+ if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+ if (empty($reshook))
+ $object->formAddObjectLine(1, $mysoc, $soc);
+ }
+ }
+
+ if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) {
+ print '
';
+ }
+ print '
';
+
+ print " \n";
+ }
+
+
+ // Buttons for actions
+
+ if ($action != 'presend' && $action != 'editline') {
+ print ''."\n";
+ $parameters = array();
+ $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+ if ($reshook < 0) {
+ setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+ }
+
+ if (empty($reshook)) {
+ // Send
+ if (empty($user->socid)) {
+ print dolGetButtonAction($langs->trans('SendMail'), '', 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=presend&mode=init&token='.newToken().'#formmailbeforetitle');
+ }
+
+ // Back to draft
+ if ($object->status == $object::STATUS_VALIDATED) {
+ print dolGetButtonAction($langs->trans('SetToDraft'), '', 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_setdraft&confirm=yes&token='.newToken(), '', $permissiontoadd);
+ }
+
+ print dolGetButtonAction($langs->trans('Modify'), '', 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=edit&token='.newToken(), '', $permissiontoadd);
+
+ // Validate
+ if ($object->status == $object::STATUS_DRAFT) {
+ if (empty($object->table_element_line) || (is_array($object->lines) && count($object->lines) > 0)) {
+ print dolGetButtonAction($langs->trans('Validate'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=confirm_validate&confirm=yes&token='.newToken(), '', $permissiontoadd);
+ } else {
+ $langs->load("errors");
+ print dolGetButtonAction($langs->trans("ErrorAddAtLeastOneLineFirst"), $langs->trans("Validate"), 'default', '#', '', 0);
+ }
+ }
+
+ // Clone
+ print dolGetButtonAction($langs->trans('ToClone'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.(!empty($object->socid)?'&socid='.$object->socid:'').'&action=clone&token='.newToken(), '', $permissiontoadd);
+
+ // Generate link
+ print dolGetButtonAction($langs->trans('generateLink'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=generate', '', $permissiontoadd);
+
+ /*
+ if ($permissiontoadd) {
+ if ($object->status == $object::STATUS_ENABLED) {
+ print dolGetButtonAction($langs->trans('Disable'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=disable&token='.newToken(), '', $permissiontoadd);
+ } else {
+ print dolGetButtonAction($langs->trans('Enable'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=enable&token='.newToken(), '', $permissiontoadd);
+ }
+ }
+ if ($permissiontoadd) {
+ if ($object->status == $object::STATUS_VALIDATED) {
+ print dolGetButtonAction($langs->trans('Cancel'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=close&token='.newToken(), '', $permissiontoadd);
+ } else {
+ print dolGetButtonAction($langs->trans('Re-Open'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=reopen&token='.newToken(), '', $permissiontoadd);
+ }
+ }
+ */
+
+ // Delete (need delete permission, or if draft, just need create/modify permission)
+ print dolGetButtonAction($langs->trans('Delete'), '', 'delete', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=delete&token='.newToken(), '', $permissiontodelete || ($object->status == $object::STATUS_DRAFT && $permissiontoadd));
+ }
+ print '
'."\n";
+ }
+
+
+ // Select mail models is same action as presend
+ if (GETPOST('modelselected')) {
+ $action = 'presend';
+ }
+
+ if ($action != 'presend') {
+ print '';
+ print '
'; // ancre
+
+ $includedocgeneration = 0;
+
+ // Documents
+ if ($includedocgeneration) {
+ $objref = dol_sanitizeFileName($object->ref);
+ $relativepath = $objref.'/'.$objref.'.pdf';
+ $filedir = $conf->bookcal->dir_output.'/'.$object->element.'/'.$objref;
+ $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
+ $genallowed = $permissiontoread; // If you can read, you can build the PDF to read content
+ $delallowed = $permissiontoadd; // If you can create/edit, you can remove a file on card
+ print $formfile->showdocuments('bookcal:Availabilities', $object->element.'/'.$objref, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', '', '', $langs->defaultlang);
+ }
+
+ // Show links to link elements
+ $linktoelem = $form->showLinkToObjectBlock($object, null, array('availabilities'));
+ $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
+
+
+ print '
';
+
+ $MAXEVENT = 10;
+
+ $morehtmlcenter = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', dol_buildpath('/bookcal/availabilities_agenda.php', 1).'?id='.$object->id);
+
+ // List of actions on element
+ include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
+ $formactions = new FormActions($db);
+ $somethingshown = $formactions->showactions($object, $object->element.'@'.$object->module, (is_object($object->thirdparty) ? $object->thirdparty->id : 0), 1, '', $MAXEVENT, '', $morehtmlcenter);
+
+ print '
';
+ }
+
+ //Select mail models is same action as presend
+ if (GETPOST('modelselected')) {
+ $action = 'presend';
+ }
+
+ // Presend form
+ $modelmail = 'availabilities';
+ $defaulttopic = 'InformationMessage';
+ $diroutput = $conf->bookcal->dir_output;
+ $trackid = 'availabilities'.$object->id;
+
+ include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/bookcal/availabilities_contact.php b/htdocs/bookcal/availabilities_contact.php
new file mode 100644
index 00000000000..dd01e8bf046
--- /dev/null
+++ b/htdocs/bookcal/availabilities_contact.php
@@ -0,0 +1,226 @@
+
+ * Copyright (C) 2022 Alice Adminson
+ *
+ * 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 .
+ */
+
+/**
+ * \file availabilities_contact.php
+ * \ingroup bookcal
+ * \brief Tab for contacts linked to Availabilities
+ */
+
+// Load Dolibarr environment
+$res = 0;
+// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
+if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
+ $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
+}
+// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
+$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
+while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
+ $i--; $j--;
+}
+if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
+ $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
+}
+if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
+ $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
+}
+// Try main.inc.php using relative path
+if (!$res && file_exists("../main.inc.php")) {
+ $res = @include "../main.inc.php";
+}
+if (!$res && file_exists("../../main.inc.php")) {
+ $res = @include "../../main.inc.php";
+}
+if (!$res && file_exists("../../../main.inc.php")) {
+ $res = @include "../../../main.inc.php";
+}
+if (!$res) {
+ die("Include of main fails");
+}
+
+require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
+dol_include_once('/bookcal/class/availabilities.class.php');
+dol_include_once('/bookcal/lib/bookcal_availabilities.lib.php');
+
+// Load translation files required by the page
+$langs->loadLangs(array("bookcal@bookcal", "companies", "other", "mails"));
+
+$id = (GETPOST('id') ?GETPOST('id', 'int') : GETPOST('facid', 'int')); // For backward compatibility
+$ref = GETPOST('ref', 'alpha');
+$lineid = GETPOST('lineid', 'int');
+$socid = GETPOST('socid', 'int');
+$action = GETPOST('action', 'aZ09');
+
+// Initialize technical objects
+$object = new Availabilities($db);
+$extrafields = new ExtraFields($db);
+$diroutputmassaction = $conf->bookcal->dir_output.'/temp/massgeneration/'.$user->id;
+$hookmanager->initHooks(array('availabilitiescontact', 'globalcard')); // Note that conf->hooks_modules contains array
+// Fetch optionals attributes and labels
+$extrafields->fetch_name_optionals_label($object->table_element);
+
+// Load object
+include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals
+
+// There is several ways to check permission.
+// Set $enablepermissioncheck to 1 to enable a minimum low level of checks
+$enablepermissioncheck = 0;
+if ($enablepermissioncheck) {
+ $permissiontoread = $user->rights->bookcal->availabilities->read;
+ $permission = $user->rights->bookcal->availabilities->write;
+} else {
+ $permissiontoread = 1;
+ $permission = 1;
+}
+
+// Security check (enable the most restrictive one)
+//if ($user->socid > 0) accessforbidden();
+//if ($user->socid > 0) $socid = $user->socid;
+//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
+//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
+if (empty($conf->bookcal->enabled)) accessforbidden();
+if (!$permissiontoread) accessforbidden();
+
+
+/*
+ * Add a new contact
+ */
+
+if ($action == 'addcontact' && $permission) {
+ $contactid = (GETPOST('userid') ? GETPOST('userid', 'int') : GETPOST('contactid', 'int'));
+ $typeid = (GETPOST('typecontact') ? GETPOST('typecontact') : GETPOST('type'));
+ $result = $object->add_contact($contactid, $typeid, GETPOST("source", 'aZ09'));
+
+ if ($result >= 0) {
+ header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
+ exit;
+ } else {
+ if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
+ $langs->load("errors");
+ setEventMessages($langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"), null, 'errors');
+ } else {
+ setEventMessages($object->error, $object->errors, 'errors');
+ }
+ }
+} elseif ($action == 'swapstatut' && $permission) {
+ // Toggle the status of a contact
+ $result = $object->swapContactStatus(GETPOST('ligne', 'int'));
+} elseif ($action == 'deletecontact' && $permission) {
+ // Deletes a contact
+ $result = $object->delete_contact($lineid);
+
+ if ($result >= 0) {
+ header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
+ exit;
+ } else {
+ dol_print_error($db);
+ }
+}
+
+
+/*
+ * View
+ */
+
+$title = $langs->trans('Availabilities')." - ".$langs->trans('ContactsAddresses');
+$help_url = '';
+//$help_url='EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas';
+llxHeader('', $title, $help_url);
+
+$form = new Form($db);
+$formcompany = new FormCompany($db);
+$contactstatic = new Contact($db);
+$userstatic = new User($db);
+
+
+/* *************************************************************************** */
+/* */
+/* View and edit mode */
+/* */
+/* *************************************************************************** */
+
+if ($object->id) {
+ /*
+ * Show tabs
+ */
+ $head = availabilitiesPrepareHead($object);
+
+ print dol_get_fiche_head($head, 'contact', $langs->trans("Availabilities"), -1, $object->picto);
+
+ $linkback = ''.$langs->trans("BackToList").' ';
+
+ $morehtmlref = '';
+ /*
+ // Ref customer
+ $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
+ $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
+ // Thirdparty
+ $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . (is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : '');
+ // Project
+ if (! empty($conf->project->enabled))
+ {
+ $langs->load("projects");
+ $morehtmlref.='
'.$langs->trans('Project') . ' ';
+ if ($permissiontoadd)
+ {
+ if ($action != 'classify')
+ //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
+ $morehtmlref.=' : ';
+ if ($action == 'classify') {
+ //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
+ $morehtmlref.='
';
+ $morehtmlref.=' ';
+ $morehtmlref.=' ';
+ $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
+ $morehtmlref.=' ';
+ $morehtmlref.=' ';
+ } else {
+ $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ }
+ } else {
+ if (! empty($object->fk_project)) {
+ $proj = new Project($db);
+ $proj->fetch($object->fk_project);
+ $morehtmlref .= ': '.$proj->getNomUrl();
+ } else {
+ $morehtmlref .= '';
+ }
+ }
+ }*/
+ $morehtmlref .= '
';
+
+ dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref, '', 0, '', '', 1);
+
+ print dol_get_fiche_end();
+
+ print ' ';
+
+ // Contacts lines (modules that overwrite templates must declare this into descriptor)
+ $dirtpls = array_merge($conf->modules_parts['tpl'], array('/core/tpl'));
+ foreach ($dirtpls as $reldir) {
+ $res = @include dol_buildpath($reldir.'/contacts.tpl.php');
+ if ($res) {
+ break;
+ }
+ }
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/bookcal/availabilities_document.php b/htdocs/bookcal/availabilities_document.php
new file mode 100644
index 00000000000..5bab9356ee1
--- /dev/null
+++ b/htdocs/bookcal/availabilities_document.php
@@ -0,0 +1,261 @@
+
+ * Copyright (C) 2022 Alice Adminson
+ *
+ * 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 .
+ */
+
+/**
+ * \file availabilities_document.php
+ * \ingroup bookcal
+ * \brief Tab for documents linked to Availabilities
+ */
+
+//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db
+//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user
+//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc
+//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs
+//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters
+//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters
+//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on).
+//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on)
+//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data
+//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu
+//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php
+//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library
+//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too.
+//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
+//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value
+//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler
+//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message
+//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies
+//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET
+//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification
+
+// Load Dolibarr environment
+$res = 0;
+// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
+if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
+ $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
+}
+// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
+$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
+while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
+ $i--; $j--;
+}
+if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
+ $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
+}
+if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
+ $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
+}
+// Try main.inc.php using relative path
+if (!$res && file_exists("../main.inc.php")) {
+ $res = @include "../main.inc.php";
+}
+if (!$res && file_exists("../../main.inc.php")) {
+ $res = @include "../../main.inc.php";
+}
+if (!$res && file_exists("../../../main.inc.php")) {
+ $res = @include "../../../main.inc.php";
+}
+if (!$res) {
+ die("Include of main fails");
+}
+
+require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
+dol_include_once('/bookcal/class/availabilities.class.php');
+dol_include_once('/bookcal/lib/bookcal_availabilities.lib.php');
+
+// Load translation files required by the page
+$langs->loadLangs(array("bookcal@bookcal", "companies", "other", "mails"));
+
+
+$action = GETPOST('action', 'aZ09');
+$confirm = GETPOST('confirm');
+$id = (GETPOST('socid', 'int') ? GETPOST('socid', 'int') : GETPOST('id', 'int'));
+$ref = GETPOST('ref', 'alpha');
+
+// Get parameters
+$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
+$sortfield = GETPOST('sortfield', 'aZ09comma');
+$sortorder = GETPOST('sortorder', 'aZ09comma');
+$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
+if (empty($page) || $page == -1) {
+ $page = 0;
+} // If $page is not defined, or '' or -1
+$offset = $limit * $page;
+$pageprev = $page - 1;
+$pagenext = $page + 1;
+if (!$sortorder) {
+ $sortorder = "ASC";
+}
+if (!$sortfield) {
+ $sortfield = "name";
+}
+//if (! $sortfield) $sortfield="position_name";
+
+// Initialize technical objects
+$object = new Availabilities($db);
+$extrafields = new ExtraFields($db);
+$diroutputmassaction = $conf->bookcal->dir_output.'/temp/massgeneration/'.$user->id;
+$hookmanager->initHooks(array('availabilitiesdocument', 'globalcard')); // Note that conf->hooks_modules contains array
+// Fetch optionals attributes and labels
+$extrafields->fetch_name_optionals_label($object->table_element);
+
+// Load object
+include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals
+
+if ($id > 0 || !empty($ref)) {
+ $upload_dir = $conf->bookcal->multidir_output[$object->entity ? $object->entity : $conf->entity]."/availabilities/".get_exdir(0, 0, 0, 1, $object);
+}
+
+// There is several ways to check permission.
+// Set $enablepermissioncheck to 1 to enable a minimum low level of checks
+$enablepermissioncheck = 0;
+if ($enablepermissioncheck) {
+ $permissiontoread = $user->rights->bookcal->availabilities->read;
+ $permissiontoadd = $user->rights->bookcal->availabilities->write; // Used by the include of actions_addupdatedelete.inc.php and actions_linkedfiles.inc.php
+} else {
+ $permissiontoread = 1;
+ $permissiontoadd = 1;
+}
+
+// Security check (enable the most restrictive one)
+//if ($user->socid > 0) accessforbidden();
+//if ($user->socid > 0) $socid = $user->socid;
+//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
+//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
+if (empty($conf->bookcal->enabled)) accessforbidden();
+if (!$permissiontoread) accessforbidden();
+
+
+/*
+ * Actions
+ */
+
+include DOL_DOCUMENT_ROOT.'/core/actions_linkedfiles.inc.php';
+
+
+/*
+ * View
+ */
+
+$form = new Form($db);
+
+$title = $langs->trans("Availabilities").' - '.$langs->trans("Files");
+$help_url = '';
+//$help_url='EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas';
+llxHeader('', $title, $help_url);
+
+if ($object->id) {
+ /*
+ * Show tabs
+ */
+ $head = availabilitiesPrepareHead($object);
+
+ print dol_get_fiche_head($head, 'document', $langs->trans("Availabilities"), -1, $object->picto);
+
+
+ // Build file list
+ $filearray = dol_dir_list($upload_dir, "files", 0, '', '(\.meta|_preview.*\.png)$', $sortfield, (strtolower($sortorder) == 'desc' ?SORT_DESC:SORT_ASC), 1);
+ $totalsize = 0;
+ foreach ($filearray as $key => $file) {
+ $totalsize += $file['size'];
+ }
+
+ // Object card
+ // ------------------------------------------------------------
+ $linkback = ''.$langs->trans("BackToList").' ';
+
+ $morehtmlref = '';
+ /*
+ // Ref customer
+ $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
+ $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
+ // Thirdparty
+ $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . (is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : '');
+ // Project
+ if (! empty($conf->project->enabled))
+ {
+ $langs->load("projects");
+ $morehtmlref.='
'.$langs->trans('Project') . ' ';
+ if ($permissiontoadd)
+ {
+ if ($action != 'classify')
+ //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
+ $morehtmlref.=' : ';
+ if ($action == 'classify') {
+ //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
+ $morehtmlref.='
';
+ $morehtmlref.=' ';
+ $morehtmlref.=' ';
+ $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
+ $morehtmlref.=' ';
+ $morehtmlref.=' ';
+ } else {
+ $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ }
+ } else {
+ if (! empty($object->fk_project)) {
+ $proj = new Project($db);
+ $proj->fetch($object->fk_project);
+ $morehtmlref .= ': '.$proj->getNomUrl();
+ } else {
+ $morehtmlref .= '';
+ }
+ }
+ }*/
+ $morehtmlref .= '
';
+
+ dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
+
+ print '';
+
+ print '
';
+ print '
';
+
+ // Number of files
+ print ''.$langs->trans("NbOfAttachedFiles").' '.count($filearray).' ';
+
+ // Total size
+ print ''.$langs->trans("TotalSizeOfAttachedFiles").' '.$totalsize.' '.$langs->trans("bytes").' ';
+
+ print '
';
+
+ print '
';
+
+ print dol_get_fiche_end();
+
+ $modulepart = 'bookcal';
+ //$permissiontoadd = $user->rights->bookcal->availabilities->write;
+ $permissiontoadd = 1;
+ //$permtoedit = $user->rights->bookcal->availabilities->write;
+ $permtoedit = 1;
+ $param = '&id='.$object->id;
+
+ //$relativepathwithnofile='availabilities/' . dol_sanitizeFileName($object->id).'/';
+ $relativepathwithnofile = 'availabilities/'.dol_sanitizeFileName($object->ref).'/';
+
+ include DOL_DOCUMENT_ROOT.'/core/tpl/document_actions_post_headers.tpl.php';
+} else {
+ accessforbidden('', 0, 1);
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/bookcal/availabilities_list.php b/htdocs/bookcal/availabilities_list.php
new file mode 100644
index 00000000000..6c5b4c2ed64
--- /dev/null
+++ b/htdocs/bookcal/availabilities_list.php
@@ -0,0 +1,845 @@
+
+ * Copyright (C) 2022 Alice Adminson
+ *
+ * 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 .
+ */
+
+/**
+ * \file availabilities_list.php
+ * \ingroup bookcal
+ * \brief List page for availabilities
+ */
+
+//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db
+//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user
+//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc
+//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs
+//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters
+//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters
+//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on).
+//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on)
+//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data
+//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu
+//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php
+//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library
+//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too.
+//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
+//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value
+//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler
+//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message
+//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies
+//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET
+//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification
+//if (! defined('NOSESSION')) define('NOSESSION', '1'); // On CLI mode, no need to use web sessions
+
+// Load Dolibarr environment
+$res = 0;
+// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
+if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
+ $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
+}
+// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
+$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
+while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
+ $i--; $j--;
+}
+if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
+ $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
+}
+if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
+ $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
+}
+// Try main.inc.php using relative path
+if (!$res && file_exists("../main.inc.php")) {
+ $res = @include "../main.inc.php";
+}
+if (!$res && file_exists("../../main.inc.php")) {
+ $res = @include "../../main.inc.php";
+}
+if (!$res && file_exists("../../../main.inc.php")) {
+ $res = @include "../../../main.inc.php";
+}
+if (!$res) {
+ die("Include of main fails");
+}
+
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
+
+// load bookcal libraries
+require_once __DIR__.'/class/availabilities.class.php';
+
+// for other modules
+//dol_include_once('/othermodule/class/otherobject.class.php');
+
+// Load translation files required by the page
+$langs->loadLangs(array("bookcal@bookcal", "other"));
+
+$id = GETPOST('id', 'int');
+$ref = GETPOST('ref', 'alpha');
+
+$action = GETPOST('action', 'aZ09') ?GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ...
+$massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
+$show_files = GETPOST('show_files', 'int'); // Show files area generated by bulk actions ?
+$confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
+$cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
+$toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
+$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search
+$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
+$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
+$mode = GETPOST('mode', 'aZ');
+
+// Load variable for pagination
+$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
+$sortfield = GETPOST('sortfield', 'aZ09comma');
+$sortorder = GETPOST('sortorder', 'aZ09comma');
+$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
+if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
+ // If $page is not defined, or '' or -1 or if we click on clear filters
+ $page = 0;
+}
+$offset = $limit * $page;
+$pageprev = $page - 1;
+$pagenext = $page + 1;
+
+// Initialize technical objects
+$object = new Availabilities($db);
+$extrafields = new ExtraFields($db);
+$diroutputmassaction = $conf->bookcal->dir_output.'/temp/massgeneration/'.$user->id;
+$hookmanager->initHooks(array('availabilitieslist')); // Note that conf->hooks_modules contains array
+
+// Fetch optionals attributes and labels
+$extrafields->fetch_name_optionals_label($object->table_element);
+//$extrafields->fetch_name_optionals_label($object->table_element_line);
+
+$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
+
+// Default sort order (if not yet defined by previous GETPOST)
+if (!$sortfield) {
+ reset($object->fields); // Reset is required to avoid key() to return null.
+ $sortfield = "t.".key($object->fields); // Set here default search field. By default 1st field in definition.
+}
+if (!$sortorder) {
+ $sortorder = "ASC";
+}
+
+// Initialize array of search criterias
+$search_all = GETPOST('search_all', 'alphanohtml');
+$search = array();
+foreach ($object->fields as $key => $val) {
+ if (GETPOST('search_'.$key, 'alpha') !== '') {
+ $search[$key] = GETPOST('search_'.$key, 'alpha');
+ }
+ if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
+ $search[$key.'_dtstart'] = dol_mktime(0, 0, 0, GETPOST('search_'.$key.'_dtstartmonth', 'int'), GETPOST('search_'.$key.'_dtstartday', 'int'), GETPOST('search_'.$key.'_dtstartyear', 'int'));
+ $search[$key.'_dtend'] = dol_mktime(23, 59, 59, GETPOST('search_'.$key.'_dtendmonth', 'int'), GETPOST('search_'.$key.'_dtendday', 'int'), GETPOST('search_'.$key.'_dtendyear', 'int'));
+ }
+}
+
+// List of fields to search into when doing a "search in all"
+$fieldstosearchall = array();
+foreach ($object->fields as $key => $val) {
+ if (!empty($val['searchall'])) {
+ $fieldstosearchall['t.'.$key] = $val['label'];
+ }
+}
+
+// Definition of array of fields for columns
+$arrayfields = array();
+foreach ($object->fields as $key => $val) {
+ // If $val['visible']==0, then we never show the field
+ if (!empty($val['visible'])) {
+ $visible = (int) dol_eval($val['visible'], 1);
+ $arrayfields['t.'.$key] = array(
+ 'label'=>$val['label'],
+ 'checked'=>(($visible < 0) ? 0 : 1),
+ 'enabled'=>(abs($visible) != 3 && dol_eval($val['enabled'], 1)),
+ 'position'=>$val['position'],
+ 'help'=> isset($val['help']) ? $val['help'] : ''
+ );
+ }
+}
+// Extra fields
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
+
+$object->fields = dol_sort_array($object->fields, 'position');
+//$arrayfields['anotherfield'] = array('type'=>'integer', 'label'=>'AnotherField', 'checked'=>1, 'enabled'=>1, 'position'=>90, 'csslist'=>'right');
+$arrayfields = dol_sort_array($arrayfields, 'position');
+
+// There is several ways to check permission.
+// Set $enablepermissioncheck to 1 to enable a minimum low level of checks
+$enablepermissioncheck = 0;
+if ($enablepermissioncheck) {
+ $permissiontoread = $user->rights->bookcal->availabilities->read;
+ $permissiontoadd = $user->rights->bookcal->availabilities->write;
+ $permissiontodelete = $user->rights->bookcal->availabilities->delete;
+} else {
+ $permissiontoread = 1;
+ $permissiontoadd = 1;
+ $permissiontodelete = 1;
+}
+
+// Security check (enable the most restrictive one)
+if ($user->socid > 0) accessforbidden();
+//if ($user->socid > 0) accessforbidden();
+//$socid = 0; if ($user->socid > 0) $socid = $user->socid;
+//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
+//restrictedArea($user, $object->element, 0, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
+if (empty($conf->bookcal->enabled)) accessforbidden('Module not enabled');
+if (!$permissiontoread) accessforbidden();
+
+
+/*
+ * Actions
+ */
+
+if (GETPOST('cancel', 'alpha')) {
+ $action = 'list';
+ $massaction = '';
+}
+if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
+ $massaction = '';
+}
+
+$parameters = array();
+$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
+if ($reshook < 0) {
+ setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+}
+
+if (empty($reshook)) {
+ // Selection of new fields
+ include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
+
+ // Purge search criteria
+ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
+ foreach ($object->fields as $key => $val) {
+ $search[$key] = '';
+ if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
+ $search[$key.'_dtstart'] = '';
+ $search[$key.'_dtend'] = '';
+ }
+ }
+ $toselect = array();
+ $search_array_options = array();
+ }
+ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
+ || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
+ $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
+ }
+
+ // Mass actions
+ $objectclass = 'Availabilities';
+ $objectlabel = 'Availabilities';
+ $uploaddir = $conf->bookcal->dir_output;
+ include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
+}
+
+
+
+/*
+ * View
+ */
+
+$form = new Form($db);
+
+$now = dol_now();
+
+//$help_url = "EN:Module_Availabilities|FR:Module_Availabilities_FR|ES:Módulo_Availabilities";
+$help_url = '';
+$title = $langs->trans("Availabilitiess");
+$morejs = array();
+$morecss = array();
+
+
+// Build and execute select
+// --------------------------------------------------------------------
+$sql = 'SELECT ';
+$sql .= $object->getFieldList('t');
+// Add fields from extrafields
+if (!empty($extrafields->attributes[$object->table_element]['label'])) {
+ foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
+ $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
+ }
+}
+// Add fields from hooks
+$parameters = array();
+$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object); // Note that $action and $object may have been modified by hook
+$sql .= preg_replace('/^,/', '', $hookmanager->resPrint);
+$sql = preg_replace('/,\s*$/', '', $sql);
+//$sql .= ", COUNT(rc.rowid) as anotherfield";
+$sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as t";
+//$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."anothertable as rc ON rc.parent = t.rowid";
+if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
+ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)";
+}
+// Add table from hooks
+$parameters = array();
+$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
+$sql .= $hookmanager->resPrint;
+if ($object->ismultientitymanaged == 1) {
+ $sql .= " WHERE t.entity IN (".getEntity($object->element).")";
+} else {
+ $sql .= " WHERE 1 = 1";
+}
+foreach ($search as $key => $val) {
+ if (array_key_exists($key, $object->fields)) {
+ if ($key == 'status' && $search[$key] == -1) {
+ continue;
+ }
+ $mode_search = (($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key])) ? 1 : 0);
+ if ((strpos($object->fields[$key]['type'], 'integer:') === 0) || (strpos($object->fields[$key]['type'], 'sellist:') === 0) || !empty($object->fields[$key]['arrayofkeyval'])) {
+ if ($search[$key] == '-1' || ($search[$key] === '0' && (empty($object->fields[$key]['arrayofkeyval']) || !array_key_exists('0', $object->fields[$key]['arrayofkeyval'])))) {
+ $search[$key] = '';
+ }
+ $mode_search = 2;
+ }
+ if ($search[$key] != '') {
+ $sql .= natural_search("t.".$db->escape($key), $search[$key], (($key == 'status') ? 2 : $mode_search));
+ }
+ } else {
+ if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') {
+ $columnName = preg_replace('/(_dtstart|_dtend)$/', '', $key);
+ if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) {
+ if (preg_match('/_dtstart$/', $key)) {
+ $sql .= " AND t.".$db->escape($columnName)." >= '".$db->idate($search[$key])."'";
+ }
+ if (preg_match('/_dtend$/', $key)) {
+ $sql .= " AND t.".$db->escape($columnName)." <= '".$db->idate($search[$key])."'";
+ }
+ }
+ }
+ }
+}
+if ($search_all) {
+ $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
+}
+//$sql.= dolSqlDateFilter("t.field", $search_xxxday, $search_xxxmonth, $search_xxxyear);
+// Add where from extra fields
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
+// Add where from hooks
+$parameters = array();
+$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object); // Note that $action and $object may have been modified by hook
+$sql .= $hookmanager->resPrint;
+
+/* If a group by is required
+$sql .= " GROUP BY ";
+foreach($object->fields as $key => $val) {
+ $sql .= "t.".$db->escape($key).", ";
+}
+// Add fields from extrafields
+if (!empty($extrafields->attributes[$object->table_element]['label'])) {
+ foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
+ $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? "ef.".$key.', ' : '');
+ }
+}
+// Add where from hooks
+$parameters = array();
+$reshook = $hookmanager->executeHooks('printFieldListGroupBy', $parameters, $object); // Note that $action and $object may have been modified by hook
+$sql .= $hookmanager->resPrint;
+$sql = preg_replace('/,\s*$/', '', $sql);
+*/
+
+// Add HAVING from hooks
+/*
+$parameters = array();
+$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object); // Note that $action and $object may have been modified by hook
+$sql .= empty($hookmanager->resPrint) ? "" : " HAVING 1=1 ".$hookmanager->resPrint;
+*/
+
+// Count total nb of records
+$nbtotalofrecords = '';
+if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
+ /* This old and fast method to get and count full list returns all record so use a high amount of memory.
+ $resql = $db->query($sql);
+ $nbtotalofrecords = $db->num_rows($resql);
+ */
+ /* The slow method does not consume memory on mysql (not tested on pgsql) */
+ /*$resql = $db->query($sql, 0, 'auto', 1);
+ while ($db->fetch_object($resql)) {
+ if (empty($nbtotalofrecords)) {
+ $nbtotalofrecords = 1; // We can't make +1 because init value is ''
+ } else {
+ $nbtotalofrecords++;
+ }
+ }*/
+ /* The fast and low memory method to get and count full list converts the sql into a sql count */
+ $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
+ $resql = $db->query($sqlforcount);
+ if ($resql) {
+ $objforcount = $db->fetch_object($resql);
+ $nbtotalofrecords = $objforcount->nbtotalofrecords;
+ } else {
+ dol_print_error($db);
+ }
+
+ if (($page * $limit) > $nbtotalofrecords) { // if total of record found is smaller than page * limit, goto and load page 0
+ $page = 0;
+ $offset = 0;
+ }
+ $db->free($resql);
+}
+
+// Complete request and execute it with limit
+$sql .= $db->order($sortfield, $sortorder);
+if ($limit) {
+ $sql .= $db->plimit($limit + 1, $offset);
+}
+
+$resql = $db->query($sql);
+if (!$resql) {
+ dol_print_error($db);
+ exit;
+}
+
+$num = $db->num_rows($resql);
+
+
+// Direct jump if only one record found
+if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all && !$page) {
+ $obj = $db->fetch_object($resql);
+ $id = $obj->rowid;
+ header("Location: ".dol_buildpath('/bookcal/availabilities_card.php', 1).'?id='.$id);
+ exit;
+}
+
+
+// Output page
+// --------------------------------------------------------------------
+
+llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'bodyforlist');
+
+// Example : Adding jquery code
+// print '';
+
+$arrayofselected = is_array($toselect) ? $toselect : array();
+
+$param = '';
+if (!empty($mode)) {
+ $param .= '&mode='.urlencode($mode);
+}
+if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
+ $param .= '&contextpage='.urlencode($contextpage);
+}
+if ($limit > 0 && $limit != $conf->liste_limit) {
+ $param .= '&limit='.urlencode($limit);
+}
+foreach ($search as $key => $val) {
+ if (is_array($search[$key]) && count($search[$key])) {
+ foreach ($search[$key] as $skey) {
+ if ($skey != '') {
+ $param .= '&search_'.$key.'[]='.urlencode($skey);
+ }
+ }
+ } elseif ($search[$key] != '') {
+ $param .= '&search_'.$key.'='.urlencode($search[$key]);
+ }
+}
+if ($optioncss != '') {
+ $param .= '&optioncss='.urlencode($optioncss);
+}
+// Add $param from extra fields
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
+// Add $param from hooks
+$parameters = array();
+$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
+$param .= $hookmanager->resPrint;
+
+// List of mass actions available
+$arrayofmassactions = array(
+ //'validate'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
+ //'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
+ //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
+ //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
+);
+if (!empty($permissiontodelete)) {
+ $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
+}
+if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete'))) {
+ $arrayofmassactions = array();
+}
+$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
+
+print ''."\n";
+if ($optioncss != '') {
+ print ' ';
+}
+print ' ';
+print ' ';
+print ' ';
+print ' ';
+print ' ';
+print ' ';
+print ' ';
+print ' ';
+
+
+$newcardbutton = '';
+$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition'));
+$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition'));
+$newcardbutton .= dolGetButtonTitleSeparator();
+$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/bookcal/availabilities_card.php', 1).'?action=create&backtopage='.urlencode($_SERVER['PHP_SELF']), '', $permissiontoadd);
+
+print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_'.$object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
+
+// Add code for pre mass action (confirmation or email presend form)
+$topicmail = "SendAvailabilitiesRef";
+$modelmail = "availabilities";
+$objecttmp = new Availabilities($db);
+$trackid = 'xxxx'.$object->id;
+include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
+
+if ($search_all) {
+ $setupstring = '';
+ foreach ($fieldstosearchall as $key => $val) {
+ $fieldstosearchall[$key] = $langs->trans($val);
+ $setupstring .= $key."=".$val.";";
+ }
+ print ''."\n";
+ print ''.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
'."\n";
+}
+
+$moreforfilter = '';
+/*$moreforfilter.='';
+$moreforfilter.= $langs->trans('MyFilter') . ': ';
+$moreforfilter.= '
';*/
+
+$parameters = array();
+$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
+if (empty($reshook)) {
+ $moreforfilter .= $hookmanager->resPrint;
+} else {
+ $moreforfilter = $hookmanager->resPrint;
+}
+
+if (!empty($moreforfilter)) {
+ print '';
+ print $moreforfilter;
+ print '
';
+}
+
+$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
+$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields
+$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
+
+print ''; // You can use div-table-responsive-no-min if you dont need reserved height for your table
+print '
'."\n";
+
+
+// Fields title search
+// --------------------------------------------------------------------
+print '';
+// Action column
+if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print '';
+ $searchpicto = $form->showFilterButtons('left');
+ print $searchpicto;
+ print ' ';
+}
+foreach ($object->fields as $key => $val) {
+ $searchkey = empty($search[$key]) ? '' : $search[$key];
+ $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
+ if ($key == 'status') {
+ $cssforfield .= ($cssforfield ? ' ' : '').'center';
+ } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'center';
+ } elseif (in_array($val['type'], array('timestamp'))) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
+ } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'right';
+ }
+ if (!empty($arrayfields['t.'.$key]['checked'])) {
+ print '';
+ if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
+ print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100', 1);
+ } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) {
+ print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', $cssforfield.' maxwidth250', 1);
+ } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
+ print '';
+ print $form->selectDate($search[$key.'_dtstart'] ? $search[$key.'_dtstart'] : '', "search_".$key."_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
+ print '
';
+ print '';
+ print $form->selectDate($search[$key.'_dtend'] ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
+ print '
';
+ } elseif ($key == 'lang') {
+ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
+ $formadmin = new FormAdmin($db);
+ print $formadmin->select_language($search[$key], 'search_lang', 0, null, 1, 0, 0, 'minwidth150 maxwidth200', 2);
+ } else {
+ print ' ';
+ }
+ print ' ';
+ }
+}
+// Extra fields
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
+
+// Fields from hook
+$parameters = array('arrayfields'=>$arrayfields);
+$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
+print $hookmanager->resPrint;
+/*if (!empty($arrayfields['anotherfield']['checked'])) {
+ print ' ';
+}*/
+// Action column
+if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print '';
+ $searchpicto = $form->showFilterButtons();
+ print $searchpicto;
+ print ' ';
+}
+print ' '."\n";
+
+$totalarray = array();
+$totalarray['nbfield'] = 0;
+
+// Fields title label
+// --------------------------------------------------------------------
+print '';
+if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+}
+foreach ($object->fields as $key => $val) {
+ $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
+ if ($key == 'status') {
+ $cssforfield .= ($cssforfield ? ' ' : '').'center';
+ } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'center';
+ } elseif (in_array($val['type'], array('timestamp'))) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
+ } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'right';
+ }
+ $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label
+ if (!empty($arrayfields['t.'.$key]['checked'])) {
+ print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''))."\n";
+ $totalarray['nbfield']++;
+ }
+}
+// Extra fields
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
+// Hook fields
+$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder, 'totalarray'=>&$totalarray);
+$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
+print $hookmanager->resPrint;
+/*if (!empty($arrayfields['anotherfield']['checked'])) {
+ print ''.$langs->trans("AnotherField").' ';
+ $totalarray['nbfield']++;
+}*/
+// Action column
+if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+}
+$totalarray['nbfield']++;
+print ' '."\n";
+
+
+// Detect if we need a fetch on each output line
+$needToFetchEachLine = 0;
+if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) {
+ foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) {
+ if (preg_match('/\$object/', $val)) {
+ $needToFetchEachLine++; // There is at least one compute field that use $object
+ }
+ }
+}
+
+
+// Loop on record
+// --------------------------------------------------------------------
+$i = 0;
+$savnbfield = $totalarray['nbfield'];
+$totalarray = array();
+$totalarray['nbfield'] = 0;
+$imaxinloop = ($limit ? min($num, $limit) : $num);
+while ($i < $imaxinloop) {
+ $obj = $db->fetch_object($resql);
+ if (empty($obj)) {
+ break; // Should not happen
+ }
+
+ // Store properties in $object
+ $object->setVarsFromFetchObj($obj);
+
+ if ($mode == 'kanban') {
+ if ($i == 0) {
+ print '';
+ print '';
+ }
+ // Output Kanban
+ print $object->getKanbanView('');
+ if ($i == ($imaxinloop - 1)) {
+ print '
';
+ print ' ';
+ }
+ } else {
+ // Show here line of result
+ $j = 0;
+ print '';
+ // Action column
+ if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($object->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
+ foreach ($object->fields as $key => $val) {
+ $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
+ if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'center';
+ } elseif ($key == 'status') {
+ $cssforfield .= ($cssforfield ? ' ' : '').'center';
+ }
+
+ if (in_array($val['type'], array('timestamp'))) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
+ } elseif ($key == 'ref') {
+ $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
+ }
+
+ if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'right';
+ }
+ //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100';
+
+ if (!empty($arrayfields['t.'.$key]['checked'])) {
+ print '';
+ if ($key == 'status') {
+ print $object->getLibStatut(5);
+ } elseif ($key == 'rowid') {
+ print $object->showOutputField($val, $key, $object->id, '');
+ } else {
+ print $object->showOutputField($val, $key, $object->$key, '');
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
+ if (!$i) {
+ $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key;
+ }
+ if (!isset($totalarray['val'])) {
+ $totalarray['val'] = array();
+ }
+ if (!isset($totalarray['val']['t.'.$key])) {
+ $totalarray['val']['t.'.$key] = 0;
+ }
+ $totalarray['val']['t.'.$key] += $object->$key;
+ }
+ }
+ }
+ // Extra fields
+ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
+ // Fields from hook
+ $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
+ $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
+ print $hookmanager->resPrint;
+ /*if (!empty($arrayfields['anotherfield']['checked'])) {
+ print ''.$obj->anotherfield.' ';
+ }*/
+ // Action column
+ if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($object->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+
+ print ' '."\n";
+ }
+
+ $i++;
+}
+
+// Show total line
+include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
+
+// If no record found
+if ($num == 0) {
+ $colspan = 1;
+ foreach ($arrayfields as $key => $val) {
+ if (!empty($val['checked'])) {
+ $colspan++;
+ }
+ }
+ print ''.$langs->trans("NoRecordFound").' ';
+}
+
+
+$db->free($resql);
+
+$parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
+$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+print $hookmanager->resPrint;
+
+print '
'."\n";
+print '
'."\n";
+
+print ' '."\n";
+
+if (in_array('builddoc', $arrayofmassactions) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
+ $hidegeneratedfilelistifempty = 1;
+ if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
+ $hidegeneratedfilelistifempty = 0;
+ }
+
+ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
+ $formfile = new FormFile($db);
+
+ // Show list of available documents
+ $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
+ $urlsource .= str_replace('&', '&', $param);
+
+ $filedir = $diroutputmassaction;
+ $genallowed = $permissiontoread;
+ $delallowed = $permissiontoadd;
+
+ print $formfile->showdocuments('massfilesarea_bookcal', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/bookcal/availabilities_note.php b/htdocs/bookcal/availabilities_note.php
new file mode 100644
index 00000000000..faae7a08834
--- /dev/null
+++ b/htdocs/bookcal/availabilities_note.php
@@ -0,0 +1,221 @@
+
+ * Copyright (C) 2022 Alice Adminson
+ *
+ * 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 .
+ */
+
+/**
+ * \file availabilities_note.php
+ * \ingroup bookcal
+ * \brief Tab for notes on Availabilities
+ */
+
+//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db
+//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user
+//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc
+//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs
+//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters
+//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters
+//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on).
+//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on)
+//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data
+//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu
+//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php
+//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library
+//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too.
+//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
+//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value
+//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler
+//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message
+//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies
+//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET
+//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification
+
+// Load Dolibarr environment
+$res = 0;
+// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
+if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
+ $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
+}
+// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
+$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
+while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
+ $i--; $j--;
+}
+if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
+ $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
+}
+if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
+ $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
+}
+// Try main.inc.php using relative path
+if (!$res && file_exists("../main.inc.php")) {
+ $res = @include "../main.inc.php";
+}
+if (!$res && file_exists("../../main.inc.php")) {
+ $res = @include "../../main.inc.php";
+}
+if (!$res && file_exists("../../../main.inc.php")) {
+ $res = @include "../../../main.inc.php";
+}
+if (!$res) {
+ die("Include of main fails");
+}
+
+dol_include_once('/bookcal/class/availabilities.class.php');
+dol_include_once('/bookcal/lib/bookcal_availabilities.lib.php');
+
+// Load translation files required by the page
+$langs->loadLangs(array("bookcal@bookcal", "companies"));
+
+// Get parameters
+$id = GETPOST('id', 'int');
+$ref = GETPOST('ref', 'alpha');
+$action = GETPOST('action', 'aZ09');
+$cancel = GETPOST('cancel', 'aZ09');
+$backtopage = GETPOST('backtopage', 'alpha');
+
+// Initialize technical objects
+$object = new Availabilities($db);
+$extrafields = new ExtraFields($db);
+$diroutputmassaction = $conf->bookcal->dir_output.'/temp/massgeneration/'.$user->id;
+$hookmanager->initHooks(array('availabilitiesnote', 'globalcard')); // Note that conf->hooks_modules contains array
+// Fetch optionals attributes and labels
+$extrafields->fetch_name_optionals_label($object->table_element);
+
+// Load object
+include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals
+if ($id > 0 || !empty($ref)) {
+ $upload_dir = $conf->bookcal->multidir_output[!empty($object->entity) ? $object->entity : $conf->entity]."/".$object->id;
+}
+
+
+// There is several ways to check permission.
+// Set $enablepermissioncheck to 1 to enable a minimum low level of checks
+$enablepermissioncheck = 0;
+if ($enablepermissioncheck) {
+ $permissiontoread = $user->rights->bookcal->availabilities->read;
+ $permissiontoadd = $user->rights->bookcal->availabilities->write;
+ $permissionnote = $user->rights->bookcal->availabilities->write; // Used by the include of actions_setnotes.inc.php
+} else {
+ $permissiontoread = 1;
+ $permissiontoadd = 1;
+ $permissionnote = 1;
+}
+
+// Security check (enable the most restrictive one)
+//if ($user->socid > 0) accessforbidden();
+//if ($user->socid > 0) $socid = $user->socid;
+//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
+//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
+if (empty($conf->bookcal->enabled)) accessforbidden();
+if (!$permissiontoread) accessforbidden();
+
+
+/*
+ * Actions
+ */
+
+$parameters = array();
+$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
+if ($reshook < 0) {
+ setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+}
+if (empty($reshook)) {
+ include DOL_DOCUMENT_ROOT.'/core/actions_setnotes.inc.php'; // Must be include, not include_once
+}
+
+
+/*
+ * View
+ */
+
+$form = new Form($db);
+
+//$help_url='EN:Customers_Orders|FR:Commandes_Clients|ES:Pedidos de clientes';
+$help_url = '';
+$title = $langs->trans('Availabilities').' - '.$langs->trans("Notes");
+llxHeader('', $title, $help_url);
+
+if ($id > 0 || !empty($ref)) {
+ $object->fetch_thirdparty();
+
+ $head = availabilitiesPrepareHead($object);
+
+ print dol_get_fiche_head($head, 'note', $langs->trans("Availabilities"), -1, $object->picto);
+
+ // Object card
+ // ------------------------------------------------------------
+ $linkback = ''.$langs->trans("BackToList").' ';
+
+ $morehtmlref = '';
+ /*
+ // Ref customer
+ $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
+ $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
+ // Thirdparty
+ $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . (is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : '');
+ // Project
+ if (! empty($conf->project->enabled))
+ {
+ $langs->load("projects");
+ $morehtmlref.='
'.$langs->trans('Project') . ' ';
+ if ($permissiontoadd)
+ {
+ if ($action != 'classify')
+ //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
+ $morehtmlref.=' : ';
+ if ($action == 'classify') {
+ //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
+ $morehtmlref.='
';
+ $morehtmlref.=' ';
+ $morehtmlref.=' ';
+ $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
+ $morehtmlref.=' ';
+ $morehtmlref.=' ';
+ } else {
+ $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ }
+ } else {
+ if (! empty($object->fk_project)) {
+ $proj = new Project($db);
+ $proj->fetch($object->fk_project);
+ $morehtmlref .= ': '.$proj->getNomUrl();
+ } else {
+ $morehtmlref .= '';
+ }
+ }
+ }*/
+ $morehtmlref .= '
';
+
+
+ dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
+
+
+ print '';
+ print '
';
+
+
+ $cssclass = "titlefield";
+ include DOL_DOCUMENT_ROOT.'/core/tpl/notes.tpl.php';
+
+ print '
';
+
+ print dol_get_fiche_end();
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/bookcal/bookcalindex.php b/htdocs/bookcal/bookcalindex.php
new file mode 100644
index 00000000000..1b4e360e4ce
--- /dev/null
+++ b/htdocs/bookcal/bookcalindex.php
@@ -0,0 +1,227 @@
+
+ * Copyright (C) 2004-2015 Laurent Destailleur
+ * Copyright (C) 2005-2012 Regis Houssin
+ * Copyright (C) 2015 Jean-François Ferry
+ *
+ * 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 .
+ */
+
+/**
+ * \file bookcal/bookcalindex.php
+ * \ingroup bookcal
+ * \brief Home page of bookcal top menu
+ */
+
+// Load Dolibarr environment
+$res = 0;
+// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
+if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
+ $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
+}
+// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
+$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
+while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
+ $i--; $j--;
+}
+if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
+ $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
+}
+if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
+ $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
+}
+// Try main.inc.php using relative path
+if (!$res && file_exists("../main.inc.php")) {
+ $res = @include "../main.inc.php";
+}
+if (!$res && file_exists("../../main.inc.php")) {
+ $res = @include "../../main.inc.php";
+}
+if (!$res && file_exists("../../../main.inc.php")) {
+ $res = @include "../../../main.inc.php";
+}
+if (!$res) {
+ die("Include of main fails");
+}
+
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
+
+// Load translation files required by the page
+$langs->loadLangs(array("bookcal@bookcal"));
+
+$action = GETPOST('action', 'aZ09');
+
+
+// Security check
+// if (! $user->rights->bookcal->myobject->read) {
+// accessforbidden();
+// }
+$socid = GETPOST('socid', 'int');
+if (isset($user->socid) && $user->socid > 0) {
+ $action = '';
+ $socid = $user->socid;
+}
+
+$max = 5;
+$now = dol_now();
+
+
+/*
+ * Actions
+ */
+
+// None
+
+
+/*
+ * View
+ */
+
+$form = new Form($db);
+$formfile = new FormFile($db);
+
+llxHeader("", $langs->trans("BookCalArea"));
+
+print load_fiche_titre($langs->trans("BookCalArea"), '', 'bookcal.png@bookcal');
+
+print '';
+
+
+// BEGIN MODULEBUILDER DRAFT MYOBJECT
+// Draft MyObject
+if ($user->rights->bookcal->availabilities->read && !empty($conf->bookcal->enabled)) {
+ $langs->load("orders");
+
+ $sql = "SELECT rowid, `ref`, fk_soc, fk_project, description, note_public, note_private, date_creation, tms, fk_user_creat, fk_user_modif, last_main_doc, import_key, model_pdf, status, firstname, lastname, email, `start`, duration";
+ $sql .= " FROM ". MAIN_DB_PREFIX . 'bookcal_booking';
+
+ $resql = $db->query($sql);
+ if ($resql) {
+ $total = 0;
+ $num = $db->num_rows($resql);
+
+ print '
';
+ print '';
+ print ''.$langs->trans("Bookings").($num?''.$num.' ':'').' ';
+
+ $var = true;
+ print '
+
+ id
+ ref
+ name
+ date
+ hour
+ duration
+ description
+ ';
+ if ($num > 0) {
+ $i = 0;
+ while ($i < $num) {
+ $obj = $db->fetch_object($resql);
+ print '';
+
+ $myobjectstatic->id=$obj->rowid;
+ $myobjectstatic->ref=$obj->ref;
+ $myobjectstatic->date = $obj->start;
+ $myobjectstatic->firstname = $obj->firstname;
+ $myobjectstatic->lastname = $obj->lastname;
+ $myobjectstatic->start = $obj->start;
+ $myobjectstatic->duration = $obj->duration;
+ $myobjectstatic->description = $obj->description;
+
+
+ print '' . $myobjectstatic->id . " ";
+ print '' . $myobjectstatic->ref . " ";
+ print '' . $myobjectstatic->firstname . " " . $myobjectstatic->lastname . " ";
+ print '' . $myobjectstatic->start . " ";
+ print '' . $myobjectstatic->duration . " ";
+ print '' . $myobjectstatic->description . " ";
+ $i++;
+ }
+ } else {
+ print ' '.$langs->trans("NoOrder").' ';
+ }
+ print "
";
+
+ $db->free($resql);
+ } else {
+ dol_print_error($db);
+ }
+}
+//END MODULEBUILDER DRAFT MYOBJECT */
+
+
+
+print '
';
+
+
+$NBMAX = $conf->global->MAIN_SIZE_SHORTLIST_LIMIT;
+$max = $conf->global->MAIN_SIZE_SHORTLIST_LIMIT;
+
+/* BEGIN MODULEBUILDER LASTMODIFIED MYOBJECT
+// Last modified myobject
+if (! empty($conf->bookcal->enabled))
+{
+ $sql = "SELECT rowid, `ref`, fk_soc, fk_project, description, note_public, note_private, date_creation, tms, fk_user_creat, fk_user_modif, last_main_doc, import_key, model_pdf, status, firstname, lastname, email, `start`, duration";
+ $sql .= " FROM ". MAIN_DB_PREFIX . 'bookcal_booking';
+ print "here2";
+ $resql = $db->query($sql);
+ if ($resql)
+ {
+ $num = $db->num_rows($resql);
+ $i = 0;
+
+ print '
';
+ print '';
+ print '';
+ print $langs->trans("BoxTitleLatestModifiedMyObjects", $max);
+ print ' ';
+ print ''.$langs->trans("DateModificationShort").' ';
+ print ' ';
+ print $num;
+ if ($num)
+ {
+ while ($i < $num)
+ {
+ $objp = $db->fetch_object($resql);
+
+ $myobjectstatic->id=$objp->rowid;
+ $myobjectstatic->ref=$objp->ref;
+ $myobjectstatic->label=$objp->label;
+ $myobjectstatic->status = $objp->status;
+
+ print '';
+ print ''.$myobjectstatic->getNomUrl(1).' ';
+ print '';
+ print " ";
+ print ''.dol_print_date($db->jdate($objp->tms), 'day')." ";
+ print ' ';
+ $i++;
+ }
+
+ $db->free($resql);
+ } else {
+ print ''.$langs->trans("None").' ';
+ }
+ print "
";
+ }
+}
+
+*/
+print '
';
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/bookcal/booking_agenda.php b/htdocs/bookcal/booking_agenda.php
new file mode 100644
index 00000000000..dec1ebee921
--- /dev/null
+++ b/htdocs/bookcal/booking_agenda.php
@@ -0,0 +1,315 @@
+
+ * Copyright (C) 2022 Alice Adminson
+ *
+ * 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 .
+ */
+
+/**
+ * \file booking_agenda.php
+ * \ingroup bookcal
+ * \brief Tab of events on Booking
+ */
+
+//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db
+//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user
+//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc
+//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs
+//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters
+//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters
+//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on).
+//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on)
+//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data
+//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu
+//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php
+//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library
+//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too.
+//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
+//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value
+//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler
+//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message
+//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies
+//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET
+//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification
+
+// Load Dolibarr environment
+$res = 0;
+// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
+if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
+ $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
+}
+// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
+$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
+while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
+ $i--; $j--;
+}
+if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
+ $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
+}
+if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
+ $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
+}
+// Try main.inc.php using relative path
+if (!$res && file_exists("../main.inc.php")) {
+ $res = @include "../main.inc.php";
+}
+if (!$res && file_exists("../../main.inc.php")) {
+ $res = @include "../../main.inc.php";
+}
+if (!$res && file_exists("../../../main.inc.php")) {
+ $res = @include "../../../main.inc.php";
+}
+if (!$res) {
+ die("Include of main fails");
+}
+
+require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
+dol_include_once('/bookcal/class/booking.class.php');
+dol_include_once('/bookcal/lib/bookcal_booking.lib.php');
+
+
+// Load translation files required by the page
+$langs->loadLangs(array("bookcal@bookcal", "other"));
+
+// Get parameters
+$id = GETPOST('id', 'int');
+$ref = GETPOST('ref', 'alpha');
+$action = GETPOST('action', 'aZ09');
+$cancel = GETPOST('cancel', 'aZ09');
+$backtopage = GETPOST('backtopage', 'alpha');
+
+if (GETPOST('actioncode', 'array')) {
+ $actioncode = GETPOST('actioncode', 'array', 3);
+ if (!count($actioncode)) {
+ $actioncode = '0';
+ }
+} else {
+ $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT));
+}
+$search_agenda_label = GETPOST('search_agenda_label');
+
+$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
+$sortfield = GETPOST('sortfield', 'aZ09comma');
+$sortorder = GETPOST('sortorder', 'aZ09comma');
+$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
+if (empty($page) || $page == -1) {
+ $page = 0;
+} // If $page is not defined, or '' or -1
+$offset = $limit * $page;
+$pageprev = $page - 1;
+$pagenext = $page + 1;
+if (!$sortfield) {
+ $sortfield = 'a.datep,a.id';
+}
+if (!$sortorder) {
+ $sortorder = 'DESC,DESC';
+}
+
+// Initialize technical objects
+$object = new Booking($db);
+$extrafields = new ExtraFields($db);
+$diroutputmassaction = $conf->bookcal->dir_output.'/temp/massgeneration/'.$user->id;
+$hookmanager->initHooks(array('bookingagenda', 'globalcard')); // Note that conf->hooks_modules contains array
+// Fetch optionals attributes and labels
+$extrafields->fetch_name_optionals_label($object->table_element);
+
+// Load object
+include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals
+if ($id > 0 || !empty($ref)) {
+ $upload_dir = $conf->bookcal->multidir_output[!empty($object->entity) ? $object->entity : $conf->entity]."/".$object->id;
+}
+
+// There is several ways to check permission.
+// Set $enablepermissioncheck to 1 to enable a minimum low level of checks
+$enablepermissioncheck = 0;
+if ($enablepermissioncheck) {
+ $permissiontoread = $user->rights->bookcal->booking->read;
+ $permissiontoadd = $user->rights->bookcal->booking->write;
+} else {
+ $permissiontoread = 1;
+ $permissiontoadd = 1;
+}
+
+// Security check (enable the most restrictive one)
+//if ($user->socid > 0) accessforbidden();
+//if ($user->socid > 0) $socid = $user->socid;
+//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
+//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
+if (empty($conf->bookcal->enabled)) accessforbidden();
+if (!$permissiontoread) accessforbidden();
+
+
+/*
+ * Actions
+ */
+
+$parameters = array('id'=>$id);
+$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
+if ($reshook < 0) {
+ setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+}
+
+if (empty($reshook)) {
+ // Cancel
+ if (GETPOST('cancel', 'alpha') && !empty($backtopage)) {
+ header("Location: ".$backtopage);
+ exit;
+ }
+
+ // Purge search criteria
+ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
+ $actioncode = '';
+ $search_agenda_label = '';
+ }
+}
+
+
+
+/*
+ * View
+ */
+
+$form = new Form($db);
+
+if ($object->id > 0) {
+ $title = $langs->trans("Agenda");
+ //if (! empty($conf->global->MAIN_HTML_TITLE) && preg_match('/thirdpartynameonly/',$conf->global->MAIN_HTML_TITLE) && $object->name) $title=$object->name." - ".$title;
+ $help_url = 'EN:Module_Agenda_En';
+ llxHeader('', $title, $help_url);
+
+ if (!empty($conf->notification->enabled)) {
+ $langs->load("mails");
+ }
+ $head = bookingPrepareHead($object);
+
+
+ print dol_get_fiche_head($head, 'agenda', $langs->trans("Booking"), -1, $object->picto);
+
+ // Object card
+ // ------------------------------------------------------------
+ $linkback = ''.$langs->trans("BackToList").' ';
+
+ $morehtmlref = '';
+ /*
+ // Ref customer
+ $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
+ $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
+ // Thirdparty
+ $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . (is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : '');
+ // Project
+ if (! empty($conf->project->enabled)) {
+ $langs->load("projects");
+ $morehtmlref.='
'.$langs->trans('Project') . ' ';
+ if ($permissiontoadd) {
+ if ($action != 'classify') {
+ //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
+ }
+ $morehtmlref.=' : ';
+ if ($action == 'classify') {
+ //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
+ $morehtmlref.='
';
+ $morehtmlref.=' ';
+ $morehtmlref.=' ';
+ $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
+ $morehtmlref.=' ';
+ $morehtmlref.=' ';
+ } else {
+ $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ }
+ } else {
+ if (! empty($object->fk_project)) {
+ $proj = new Project($db);
+ $proj->fetch($object->fk_project);
+ $morehtmlref .= ': '.$proj->getNomUrl();
+ } else {
+ $morehtmlref .= '';
+ }
+ }
+ }*/
+ $morehtmlref .= '
';
+
+
+ dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
+
+ print '';
+ print '
';
+
+ $object->info($object->id);
+ dol_print_object_info($object, 1);
+
+ print '
';
+
+ print dol_get_fiche_end();
+
+
+
+ // Actions buttons
+
+ $objthirdparty = $object;
+ $objcon = new stdClass();
+
+ $out = '&origin='.urlencode($object->element.'@'.$object->module).'&originid='.urlencode($object->id);
+ $urlbacktopage = $_SERVER['PHP_SELF'].'?id='.$object->id;
+ $out .= '&backtopage='.urlencode($urlbacktopage);
+ $permok = $user->rights->agenda->myactions->create;
+ if ((!empty($objthirdparty->id) || !empty($objcon->id)) && $permok) {
+ //$out.='trans("AddAnAction"),'filenew');
+ //$out.=" ";
+ }
+
+
+ print '';
+
+ if (isModEnabled('agenda') && (!empty($user->rights->agenda->myactions->read) || !empty($user->rights->agenda->allactions->read))) {
+ $param = '&id='.$object->id.(!empty($socid) ? '&socid='.$socid : '');
+ if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
+ $param .= '&contextpage='.urlencode($contextpage);
+ }
+ if ($limit > 0 && $limit != $conf->liste_limit) {
+ $param .= '&limit='.urlencode($limit);
+ }
+
+
+ //print load_fiche_titre($langs->trans("ActionsOnBooking"), '', '');
+
+ // List of all actions
+ $filters = array();
+ $filters['search_agenda_label'] = $search_agenda_label;
+
+ // TODO Replace this with same code than into list.php
+ show_actions_done($conf, $langs, $db, $object, null, 0, $actioncode, '', $filters, $sortfield, $sortorder, $object->module);
+ }
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/bookcal/booking_card.php b/htdocs/bookcal/booking_card.php
new file mode 100644
index 00000000000..0240ab2dccc
--- /dev/null
+++ b/htdocs/bookcal/booking_card.php
@@ -0,0 +1,620 @@
+
+ * Copyright (C) 2022 Alice Adminson
+ *
+ * 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 .
+ */
+
+/**
+ * \file booking_card.php
+ * \ingroup bookcal
+ * \brief Page to create/edit/view booking
+ */
+
+//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db
+//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user
+//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc
+//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs
+//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters
+//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters
+//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token).
+//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on)
+//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data
+//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu
+//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php
+//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library
+//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too.
+//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
+//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value
+//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler
+//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message
+//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies
+//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET
+//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification
+//if (! defined('NOSESSION')) define('NOSESSION', '1'); // Disable session
+
+// Load Dolibarr environment
+$res = 0;
+// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
+if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
+ $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
+}
+// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
+$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
+while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
+ $i--; $j--;
+}
+if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
+ $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
+}
+if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
+ $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
+}
+// Try main.inc.php using relative path
+if (!$res && file_exists("../main.inc.php")) {
+ $res = @include "../main.inc.php";
+}
+if (!$res && file_exists("../../main.inc.php")) {
+ $res = @include "../../main.inc.php";
+}
+if (!$res && file_exists("../../../main.inc.php")) {
+ $res = @include "../../../main.inc.php";
+}
+if (!$res) {
+ die("Include of main fails");
+}
+
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
+dol_include_once('/bookcal/class/booking.class.php');
+dol_include_once('/bookcal/lib/bookcal_booking.lib.php');
+
+// Load translation files required by the page
+$langs->loadLangs(array("bookcal@bookcal", "other"));
+
+// Get parameters
+$id = GETPOST('id', 'int');
+$ref = GETPOST('ref', 'alpha');
+$lineid = GETPOST('lineid', 'int');
+
+$action = GETPOST('action', 'aZ09');
+$confirm = GETPOST('confirm', 'alpha');
+$cancel = GETPOST('cancel', 'aZ09');
+$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search
+$backtopage = GETPOST('backtopage', 'alpha');
+$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
+$dol_openinpopup = GETPOST('dol_openinpopup', 'aZ09');
+
+// Initialize technical objects
+$object = new Booking($db);
+$extrafields = new ExtraFields($db);
+$diroutputmassaction = $conf->bookcal->dir_output.'/temp/massgeneration/'.$user->id;
+$hookmanager->initHooks(array('bookingcard', 'globalcard')); // Note that conf->hooks_modules contains array
+
+// Fetch optionals attributes and labels
+$extrafields->fetch_name_optionals_label($object->table_element);
+
+$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
+
+// Initialize array of search criterias
+$search_all = GETPOST("search_all", 'alpha');
+$search = array();
+foreach ($object->fields as $key => $val) {
+ if (GETPOST('search_'.$key, 'alpha')) {
+ $search[$key] = GETPOST('search_'.$key, 'alpha');
+ }
+}
+
+if (empty($action) && empty($id) && empty($ref)) {
+ $action = 'view';
+}
+
+// Load object
+include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once.
+
+// There is several ways to check permission.
+// Set $enablepermissioncheck to 1 to enable a minimum low level of checks
+$enablepermissioncheck = 0;
+if ($enablepermissioncheck) {
+ $permissiontoread = $user->rights->bookcal->booking->read;
+ $permissiontoadd = $user->rights->bookcal->booking->write; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
+ $permissiontodelete = $user->rights->bookcal->booking->delete || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
+ $permissionnote = $user->rights->bookcal->booking->write; // Used by the include of actions_setnotes.inc.php
+ $permissiondellink = $user->rights->bookcal->booking->write; // Used by the include of actions_dellink.inc.php
+} else {
+ $permissiontoread = 1;
+ $permissiontoadd = 1; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
+ $permissiontodelete = 1;
+ $permissionnote = 1;
+ $permissiondellink = 1;
+}
+
+$upload_dir = $conf->bookcal->multidir_output[isset($object->entity) ? $object->entity : 1].'/booking';
+
+// Security check (enable the most restrictive one)
+//if ($user->socid > 0) accessforbidden();
+//if ($user->socid > 0) $socid = $user->socid;
+//$isdraft = (isset($object->status) && ($object->status == $object::STATUS_DRAFT) ? 1 : 0);
+//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
+if (empty($conf->bookcal->enabled)) accessforbidden();
+if (!$permissiontoread) accessforbidden();
+
+
+/*
+ * Actions
+ */
+
+$parameters = array();
+$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
+if ($reshook < 0) {
+ setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+}
+
+if (empty($reshook)) {
+ $error = 0;
+
+ $backurlforlist = dol_buildpath('/bookcal/booking_list.php', 1);
+
+ if (empty($backtopage) || ($cancel && empty($id))) {
+ if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
+ if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
+ $backtopage = $backurlforlist;
+ } else {
+ $backtopage = dol_buildpath('/bookcal/booking_card.php', 1).'?id='.((!empty($id) && $id > 0) ? $id : '__ID__');
+ }
+ }
+ }
+
+ $triggermodname = 'BOOKCAL_BOOKING_MODIFY'; // Name of trigger action code to execute when we modify record
+
+ // Actions cancel, add, update, update_extras, confirm_validate, confirm_delete, confirm_deleteline, confirm_clone, confirm_close, confirm_setdraft, confirm_reopen
+ include DOL_DOCUMENT_ROOT.'/core/actions_addupdatedelete.inc.php';
+
+ // Actions when linking object each other
+ include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php';
+
+ // Actions when printing a doc from card
+ include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
+
+ // Action to move up and down lines of object
+ //include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php';
+
+ // Action to build doc
+ include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
+
+ if ($action == 'set_thirdparty' && $permissiontoadd) {
+ $object->setValueFrom('fk_soc', GETPOST('fk_soc', 'int'), '', '', 'date', '', $user, $triggermodname);
+ }
+ if ($action == 'classin' && $permissiontoadd) {
+ $object->setProject(GETPOST('projectid', 'int'));
+ }
+
+ // Actions to send emails
+ $triggersendname = 'BOOKCAL_BOOKING_SENTBYMAIL';
+ $autocopy = 'MAIN_MAIL_AUTOCOPY_BOOKING_TO';
+ $trackid = 'booking'.$object->id;
+ include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
+}
+
+
+
+
+/*
+ * View
+ *
+ * Put here all code to build page
+ */
+
+$form = new Form($db);
+$formfile = new FormFile($db);
+$formproject = new FormProjets($db);
+
+$title = $langs->trans("Booking");
+$help_url = '';
+llxHeader('', $title, $help_url);
+
+// Example : Adding jquery code
+// print '';
+
+
+// Part to create
+if ($action == 'create') {
+ if (empty($permissiontoadd)) {
+ accessforbidden($langs->trans('NotEnoughPermissions'), 0, 1);
+ exit;
+ }
+
+ print load_fiche_titre($langs->trans("NewObject", $langs->transnoentitiesnoconv("Booking")), '', 'object_'.$object->picto);
+
+ print '';
+ print ' ';
+ print ' ';
+ if ($backtopage) {
+ print ' ';
+ }
+ if ($backtopageforcancel) {
+ print ' ';
+ }
+
+ print dol_get_fiche_head(array(), '');
+
+ // Set some default values
+ //if (! GETPOSTISSET('fieldname')) $_POST['fieldname'] = 'myvalue';
+
+ print ''."\n";
+
+ // Common attributes
+ include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_add.tpl.php';
+
+ // Other attributes
+ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
+
+ print '
'."\n";
+
+ print dol_get_fiche_end();
+
+ print $form->buttonsSaveCancel("Create");
+
+ print ' ';
+
+ //dol_set_focus('input[name="ref"]');
+}
+
+// Part to edit record
+if (($id || $ref) && $action == 'edit') {
+ print load_fiche_titre($langs->trans("Booking"), '', 'object_'.$object->picto);
+
+ print '';
+ print ' ';
+ print ' ';
+ print ' ';
+ if ($backtopage) {
+ print ' ';
+ }
+ if ($backtopageforcancel) {
+ print ' ';
+ }
+
+ print dol_get_fiche_head();
+
+ print ''."\n";
+
+ // Common attributes
+ include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_edit.tpl.php';
+
+ // Other attributes
+ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_edit.tpl.php';
+
+ print '
';
+
+ print dol_get_fiche_end();
+
+ print $form->buttonsSaveCancel();
+
+ print ' ';
+}
+
+// Part to show record
+if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) {
+ $res = $object->fetch_optionals();
+
+ $head = bookingPrepareHead($object);
+ print dol_get_fiche_head($head, 'card', $langs->trans("Booking"), -1, $object->picto);
+
+ $formconfirm = '';
+
+ // Confirmation to delete
+ if ($action == 'delete') {
+ $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteBooking'), $langs->trans('ConfirmDeleteObject'), 'confirm_delete', '', 0, 1);
+ }
+ // Confirmation to delete line
+ if ($action == 'deleteline') {
+ $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteLine'), $langs->trans('ConfirmDeleteLine'), 'confirm_deleteline', '', 0, 1);
+ }
+
+ // Clone confirmation
+ if ($action == 'clone') {
+ // Create an array for form
+ $formquestion = array();
+ $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneAsk', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
+ }
+
+ // Confirmation of action xxxx (You can use it for xxx = 'close', xxx = 'reopen', ...)
+ if ($action == 'xxx') {
+ $text = $langs->trans('ConfirmActionBooking', $object->ref);
+ /*if (! empty($conf->notification->enabled))
+ {
+ require_once DOL_DOCUMENT_ROOT . '/core/class/notify.class.php';
+ $notify = new Notify($db);
+ $text .= ' ';
+ $text .= $notify->confirmMessage('BOOKING_CLOSE', $object->socid, $object);
+ }*/
+
+ $formquestion = array();
+ /*
+ $forcecombo=0;
+ if ($conf->browser->name == 'ie') $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy
+ $formquestion = array(
+ // 'text' => $langs->trans("ConfirmClone"),
+ // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1),
+ // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1),
+ // array('type' => 'other', 'name' => 'idwarehouse', 'label' => $langs->trans("SelectWarehouseForStockDecrease"), 'value' => $formproduct->selectWarehouses(GETPOST('idwarehouse')?GETPOST('idwarehouse'):'ifone', 'idwarehouse', '', 1, 0, 0, '', 0, $forcecombo))
+ );
+ */
+ $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('XXX'), $text, 'confirm_xxx', $formquestion, 0, 1, 220);
+ }
+
+ // Call Hook formConfirm
+ $parameters = array('formConfirm' => $formconfirm, 'lineid' => $lineid);
+ $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+ if (empty($reshook)) {
+ $formconfirm .= $hookmanager->resPrint;
+ } elseif ($reshook > 0) {
+ $formconfirm = $hookmanager->resPrint;
+ }
+
+ // Print form confirm
+ print $formconfirm;
+
+
+ // Object card
+ // ------------------------------------------------------------
+ $linkback = ''.$langs->trans("BackToList").' ';
+
+ $morehtmlref = '';
+ /*
+ // Ref customer
+ $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
+ $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
+ // Thirdparty
+ $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . (is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : '');
+ // Project
+ if (! empty($conf->project->enabled)) {
+ $langs->load("projects");
+ $morehtmlref .= '
'.$langs->trans('Project') . ' ';
+ if ($permissiontoadd) {
+ //if ($action != 'classify') $morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' ';
+ $morehtmlref .= ' : ';
+ if ($action == 'classify') {
+ //$morehtmlref .= $form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
+ $morehtmlref .= '
';
+ $morehtmlref .= ' ';
+ $morehtmlref .= ' ';
+ $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
+ $morehtmlref .= ' ';
+ $morehtmlref .= ' ';
+ } else {
+ $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ }
+ } else {
+ if (! empty($object->fk_project)) {
+ $proj = new Project($db);
+ $proj->fetch($object->fk_project);
+ $morehtmlref .= ': '.$proj->getNomUrl();
+ } else {
+ $morehtmlref .= '';
+ }
+ }
+ }*/
+ $morehtmlref .= '
';
+
+
+ dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
+
+
+ print '';
+ print '
';
+ print '
';
+ print '
'."\n";
+
+ // Common attributes
+ //$keyforbreak='fieldkeytoswitchonsecondcolumn'; // We change column just before this field
+ //unset($object->fields['fk_project']); // Hide field already shown in banner
+ //unset($object->fields['fk_soc']); // Hide field already shown in banner
+ include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php';
+
+ // Other attributes. Fields from hook formObjectOptions and Extrafields.
+ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
+
+ print '
';
+ print '
';
+ print '
';
+
+ print '
';
+
+ print dol_get_fiche_end();
+
+
+ /*
+ * Lines
+ */
+
+ if (!empty($object->table_element_line)) {
+ // Show object lines
+ $result = $object->getLinesArray();
+
+ print ' id.(($action != 'editline') ? '' : '#line_'.GETPOST('lineid', 'int')).'" method="POST">
+
+
+
+
+
+ ';
+
+ if (!empty($conf->use_javascript_ajax) && $object->status == 0) {
+ include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
+ }
+
+ print '';
+ if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) {
+ print '
';
+ }
+
+ if (!empty($object->lines)) {
+ $object->printObjectLines($action, $mysoc, null, GETPOST('lineid', 'int'), 1);
+ }
+
+ // Form to add new line
+ if ($object->status == 0 && $permissiontoadd && $action != 'selectlines') {
+ if ($action != 'editline') {
+ // Add products/services form
+
+ $parameters = array();
+ $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+ if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+ if (empty($reshook))
+ $object->formAddObjectLine(1, $mysoc, $soc);
+ }
+ }
+
+ if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) {
+ print '
';
+ }
+ print '
';
+
+ print " \n";
+ }
+
+
+ // Buttons for actions
+
+ if ($action != 'presend' && $action != 'editline') {
+ print ''."\n";
+ $parameters = array();
+ $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+ if ($reshook < 0) {
+ setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+ }
+
+ if (empty($reshook)) {
+ // Send
+ if (empty($user->socid)) {
+ print dolGetButtonAction($langs->trans('SendMail'), '', 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=presend&mode=init&token='.newToken().'#formmailbeforetitle');
+ }
+
+ // Back to draft
+ if ($object->status == $object::STATUS_VALIDATED) {
+ print dolGetButtonAction($langs->trans('SetToDraft'), '', 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_setdraft&confirm=yes&token='.newToken(), '', $permissiontoadd);
+ }
+
+ print dolGetButtonAction($langs->trans('Modify'), '', 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=edit&token='.newToken(), '', $permissiontoadd);
+
+ // Validate
+ if ($object->status == $object::STATUS_DRAFT) {
+ if (empty($object->table_element_line) || (is_array($object->lines) && count($object->lines) > 0)) {
+ print dolGetButtonAction($langs->trans('Validate'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=confirm_validate&confirm=yes&token='.newToken(), '', $permissiontoadd);
+ } else {
+ $langs->load("errors");
+ print dolGetButtonAction($langs->trans("ErrorAddAtLeastOneLineFirst"), $langs->trans("Validate"), 'default', '#', '', 0);
+ }
+ }
+
+ // Clone
+ print dolGetButtonAction($langs->trans('ToClone'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.(!empty($object->socid)?'&socid='.$object->socid:'').'&action=clone&token='.newToken(), '', $permissiontoadd);
+
+ /*
+ if ($permissiontoadd) {
+ if ($object->status == $object::STATUS_ENABLED) {
+ print dolGetButtonAction($langs->trans('Disable'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=disable&token='.newToken(), '', $permissiontoadd);
+ } else {
+ print dolGetButtonAction($langs->trans('Enable'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=enable&token='.newToken(), '', $permissiontoadd);
+ }
+ }
+ if ($permissiontoadd) {
+ if ($object->status == $object::STATUS_VALIDATED) {
+ print dolGetButtonAction($langs->trans('Cancel'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=close&token='.newToken(), '', $permissiontoadd);
+ } else {
+ print dolGetButtonAction($langs->trans('Re-Open'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=reopen&token='.newToken(), '', $permissiontoadd);
+ }
+ }
+ */
+
+ // Delete (need delete permission, or if draft, just need create/modify permission)
+ print dolGetButtonAction($langs->trans('Delete'), '', 'delete', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=delete&token='.newToken(), '', $permissiontodelete || ($object->status == $object::STATUS_DRAFT && $permissiontoadd));
+ }
+ print '
'."\n";
+ }
+
+
+ // Select mail models is same action as presend
+ if (GETPOST('modelselected')) {
+ $action = 'presend';
+ }
+
+ if ($action != 'presend') {
+ print '';
+ print '
'; // ancre
+
+ $includedocgeneration = 0;
+
+ // Documents
+ if ($includedocgeneration) {
+ $objref = dol_sanitizeFileName($object->ref);
+ $relativepath = $objref.'/'.$objref.'.pdf';
+ $filedir = $conf->bookcal->dir_output.'/'.$object->element.'/'.$objref;
+ $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
+ $genallowed = $permissiontoread; // If you can read, you can build the PDF to read content
+ $delallowed = $permissiontoadd; // If you can create/edit, you can remove a file on card
+ print $formfile->showdocuments('bookcal:Booking', $object->element.'/'.$objref, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', '', '', $langs->defaultlang);
+ }
+
+ // Show links to link elements
+ $linktoelem = $form->showLinkToObjectBlock($object, null, array('booking'));
+ $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
+
+
+ print '
';
+
+ $MAXEVENT = 10;
+
+ $morehtmlcenter = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', dol_buildpath('/bookcal/booking_agenda.php', 1).'?id='.$object->id);
+
+ // List of actions on element
+ include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
+ $formactions = new FormActions($db);
+ $somethingshown = $formactions->showactions($object, $object->element.'@'.$object->module, (is_object($object->thirdparty) ? $object->thirdparty->id : 0), 1, '', $MAXEVENT, '', $morehtmlcenter);
+
+ print '
';
+ }
+
+ //Select mail models is same action as presend
+ if (GETPOST('modelselected')) {
+ $action = 'presend';
+ }
+
+ // Presend form
+ $modelmail = 'booking';
+ $defaulttopic = 'InformationMessage';
+ $diroutput = $conf->bookcal->dir_output;
+ $trackid = 'booking'.$object->id;
+
+ include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/bookcal/booking_contact.php b/htdocs/bookcal/booking_contact.php
new file mode 100644
index 00000000000..923976adb47
--- /dev/null
+++ b/htdocs/bookcal/booking_contact.php
@@ -0,0 +1,226 @@
+
+ * Copyright (C) 2022 Alice Adminson
+ *
+ * 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 .
+ */
+
+/**
+ * \file booking_contact.php
+ * \ingroup bookcal
+ * \brief Tab for contacts linked to Booking
+ */
+
+// Load Dolibarr environment
+$res = 0;
+// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
+if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
+ $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
+}
+// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
+$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
+while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
+ $i--; $j--;
+}
+if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
+ $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
+}
+if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
+ $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
+}
+// Try main.inc.php using relative path
+if (!$res && file_exists("../main.inc.php")) {
+ $res = @include "../main.inc.php";
+}
+if (!$res && file_exists("../../main.inc.php")) {
+ $res = @include "../../main.inc.php";
+}
+if (!$res && file_exists("../../../main.inc.php")) {
+ $res = @include "../../../main.inc.php";
+}
+if (!$res) {
+ die("Include of main fails");
+}
+
+require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
+dol_include_once('/bookcal/class/booking.class.php');
+dol_include_once('/bookcal/lib/bookcal_booking.lib.php');
+
+// Load translation files required by the page
+$langs->loadLangs(array("bookcal@bookcal", "companies", "other", "mails"));
+
+$id = (GETPOST('id') ?GETPOST('id', 'int') : GETPOST('facid', 'int')); // For backward compatibility
+$ref = GETPOST('ref', 'alpha');
+$lineid = GETPOST('lineid', 'int');
+$socid = GETPOST('socid', 'int');
+$action = GETPOST('action', 'aZ09');
+
+// Initialize technical objects
+$object = new Booking($db);
+$extrafields = new ExtraFields($db);
+$diroutputmassaction = $conf->bookcal->dir_output.'/temp/massgeneration/'.$user->id;
+$hookmanager->initHooks(array('bookingcontact', 'globalcard')); // Note that conf->hooks_modules contains array
+// Fetch optionals attributes and labels
+$extrafields->fetch_name_optionals_label($object->table_element);
+
+// Load object
+include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals
+
+// There is several ways to check permission.
+// Set $enablepermissioncheck to 1 to enable a minimum low level of checks
+$enablepermissioncheck = 0;
+if ($enablepermissioncheck) {
+ $permissiontoread = $user->rights->bookcal->booking->read;
+ $permission = $user->rights->bookcal->booking->write;
+} else {
+ $permissiontoread = 1;
+ $permission = 1;
+}
+
+// Security check (enable the most restrictive one)
+//if ($user->socid > 0) accessforbidden();
+//if ($user->socid > 0) $socid = $user->socid;
+//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
+//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
+if (empty($conf->bookcal->enabled)) accessforbidden();
+if (!$permissiontoread) accessforbidden();
+
+
+/*
+ * Add a new contact
+ */
+
+if ($action == 'addcontact' && $permission) {
+ $contactid = (GETPOST('userid') ? GETPOST('userid', 'int') : GETPOST('contactid', 'int'));
+ $typeid = (GETPOST('typecontact') ? GETPOST('typecontact') : GETPOST('type'));
+ $result = $object->add_contact($contactid, $typeid, GETPOST("source", 'aZ09'));
+
+ if ($result >= 0) {
+ header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
+ exit;
+ } else {
+ if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
+ $langs->load("errors");
+ setEventMessages($langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"), null, 'errors');
+ } else {
+ setEventMessages($object->error, $object->errors, 'errors');
+ }
+ }
+} elseif ($action == 'swapstatut' && $permission) {
+ // Toggle the status of a contact
+ $result = $object->swapContactStatus(GETPOST('ligne', 'int'));
+} elseif ($action == 'deletecontact' && $permission) {
+ // Deletes a contact
+ $result = $object->delete_contact($lineid);
+
+ if ($result >= 0) {
+ header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
+ exit;
+ } else {
+ dol_print_error($db);
+ }
+}
+
+
+/*
+ * View
+ */
+
+$title = $langs->trans('Booking')." - ".$langs->trans('ContactsAddresses');
+$help_url = '';
+//$help_url='EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas';
+llxHeader('', $title, $help_url);
+
+$form = new Form($db);
+$formcompany = new FormCompany($db);
+$contactstatic = new Contact($db);
+$userstatic = new User($db);
+
+
+/* *************************************************************************** */
+/* */
+/* View and edit mode */
+/* */
+/* *************************************************************************** */
+
+if ($object->id) {
+ /*
+ * Show tabs
+ */
+ $head = bookingPrepareHead($object);
+
+ print dol_get_fiche_head($head, 'contact', $langs->trans("Booking"), -1, $object->picto);
+
+ $linkback = ''.$langs->trans("BackToList").' ';
+
+ $morehtmlref = '';
+ /*
+ // Ref customer
+ $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
+ $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
+ // Thirdparty
+ $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . (is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : '');
+ // Project
+ if (! empty($conf->project->enabled))
+ {
+ $langs->load("projects");
+ $morehtmlref.='
'.$langs->trans('Project') . ' ';
+ if ($permissiontoadd)
+ {
+ if ($action != 'classify')
+ //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
+ $morehtmlref.=' : ';
+ if ($action == 'classify') {
+ //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
+ $morehtmlref.='
';
+ $morehtmlref.=' ';
+ $morehtmlref.=' ';
+ $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
+ $morehtmlref.=' ';
+ $morehtmlref.=' ';
+ } else {
+ $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ }
+ } else {
+ if (! empty($object->fk_project)) {
+ $proj = new Project($db);
+ $proj->fetch($object->fk_project);
+ $morehtmlref .= ': '.$proj->getNomUrl();
+ } else {
+ $morehtmlref .= '';
+ }
+ }
+ }*/
+ $morehtmlref .= '
';
+
+ dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref, '', 0, '', '', 1);
+
+ print dol_get_fiche_end();
+
+ print ' ';
+
+ // Contacts lines (modules that overwrite templates must declare this into descriptor)
+ $dirtpls = array_merge($conf->modules_parts['tpl'], array('/core/tpl'));
+ foreach ($dirtpls as $reldir) {
+ $res = @include dol_buildpath($reldir.'/contacts.tpl.php');
+ if ($res) {
+ break;
+ }
+ }
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/bookcal/booking_document.php b/htdocs/bookcal/booking_document.php
new file mode 100644
index 00000000000..81342e1a7b6
--- /dev/null
+++ b/htdocs/bookcal/booking_document.php
@@ -0,0 +1,261 @@
+
+ * Copyright (C) 2022 Alice Adminson
+ *
+ * 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 .
+ */
+
+/**
+ * \file booking_document.php
+ * \ingroup bookcal
+ * \brief Tab for documents linked to Booking
+ */
+
+//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db
+//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user
+//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc
+//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs
+//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters
+//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters
+//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on).
+//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on)
+//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data
+//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu
+//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php
+//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library
+//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too.
+//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
+//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value
+//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler
+//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message
+//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies
+//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET
+//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification
+
+// Load Dolibarr environment
+$res = 0;
+// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
+if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
+ $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
+}
+// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
+$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
+while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
+ $i--; $j--;
+}
+if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
+ $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
+}
+if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
+ $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
+}
+// Try main.inc.php using relative path
+if (!$res && file_exists("../main.inc.php")) {
+ $res = @include "../main.inc.php";
+}
+if (!$res && file_exists("../../main.inc.php")) {
+ $res = @include "../../main.inc.php";
+}
+if (!$res && file_exists("../../../main.inc.php")) {
+ $res = @include "../../../main.inc.php";
+}
+if (!$res) {
+ die("Include of main fails");
+}
+
+require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
+dol_include_once('/bookcal/class/booking.class.php');
+dol_include_once('/bookcal/lib/bookcal_booking.lib.php');
+
+// Load translation files required by the page
+$langs->loadLangs(array("bookcal@bookcal", "companies", "other", "mails"));
+
+
+$action = GETPOST('action', 'aZ09');
+$confirm = GETPOST('confirm');
+$id = (GETPOST('socid', 'int') ? GETPOST('socid', 'int') : GETPOST('id', 'int'));
+$ref = GETPOST('ref', 'alpha');
+
+// Get parameters
+$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
+$sortfield = GETPOST('sortfield', 'aZ09comma');
+$sortorder = GETPOST('sortorder', 'aZ09comma');
+$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
+if (empty($page) || $page == -1) {
+ $page = 0;
+} // If $page is not defined, or '' or -1
+$offset = $limit * $page;
+$pageprev = $page - 1;
+$pagenext = $page + 1;
+if (!$sortorder) {
+ $sortorder = "ASC";
+}
+if (!$sortfield) {
+ $sortfield = "name";
+}
+//if (! $sortfield) $sortfield="position_name";
+
+// Initialize technical objects
+$object = new Booking($db);
+$extrafields = new ExtraFields($db);
+$diroutputmassaction = $conf->bookcal->dir_output.'/temp/massgeneration/'.$user->id;
+$hookmanager->initHooks(array('bookingdocument', 'globalcard')); // Note that conf->hooks_modules contains array
+// Fetch optionals attributes and labels
+$extrafields->fetch_name_optionals_label($object->table_element);
+
+// Load object
+include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals
+
+if ($id > 0 || !empty($ref)) {
+ $upload_dir = $conf->bookcal->multidir_output[$object->entity ? $object->entity : $conf->entity]."/booking/".get_exdir(0, 0, 0, 1, $object);
+}
+
+// There is several ways to check permission.
+// Set $enablepermissioncheck to 1 to enable a minimum low level of checks
+$enablepermissioncheck = 0;
+if ($enablepermissioncheck) {
+ $permissiontoread = $user->rights->bookcal->booking->read;
+ $permissiontoadd = $user->rights->bookcal->booking->write; // Used by the include of actions_addupdatedelete.inc.php and actions_linkedfiles.inc.php
+} else {
+ $permissiontoread = 1;
+ $permissiontoadd = 1;
+}
+
+// Security check (enable the most restrictive one)
+//if ($user->socid > 0) accessforbidden();
+//if ($user->socid > 0) $socid = $user->socid;
+//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
+//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
+if (empty($conf->bookcal->enabled)) accessforbidden();
+if (!$permissiontoread) accessforbidden();
+
+
+/*
+ * Actions
+ */
+
+include DOL_DOCUMENT_ROOT.'/core/actions_linkedfiles.inc.php';
+
+
+/*
+ * View
+ */
+
+$form = new Form($db);
+
+$title = $langs->trans("Booking").' - '.$langs->trans("Files");
+$help_url = '';
+//$help_url='EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas';
+llxHeader('', $title, $help_url);
+
+if ($object->id) {
+ /*
+ * Show tabs
+ */
+ $head = bookingPrepareHead($object);
+
+ print dol_get_fiche_head($head, 'document', $langs->trans("Booking"), -1, $object->picto);
+
+
+ // Build file list
+ $filearray = dol_dir_list($upload_dir, "files", 0, '', '(\.meta|_preview.*\.png)$', $sortfield, (strtolower($sortorder) == 'desc' ?SORT_DESC:SORT_ASC), 1);
+ $totalsize = 0;
+ foreach ($filearray as $key => $file) {
+ $totalsize += $file['size'];
+ }
+
+ // Object card
+ // ------------------------------------------------------------
+ $linkback = ''.$langs->trans("BackToList").' ';
+
+ $morehtmlref = '';
+ /*
+ // Ref customer
+ $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
+ $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
+ // Thirdparty
+ $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . (is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : '');
+ // Project
+ if (! empty($conf->project->enabled))
+ {
+ $langs->load("projects");
+ $morehtmlref.='
'.$langs->trans('Project') . ' ';
+ if ($permissiontoadd)
+ {
+ if ($action != 'classify')
+ //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
+ $morehtmlref.=' : ';
+ if ($action == 'classify') {
+ //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
+ $morehtmlref.='
';
+ $morehtmlref.=' ';
+ $morehtmlref.=' ';
+ $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
+ $morehtmlref.=' ';
+ $morehtmlref.=' ';
+ } else {
+ $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ }
+ } else {
+ if (! empty($object->fk_project)) {
+ $proj = new Project($db);
+ $proj->fetch($object->fk_project);
+ $morehtmlref .= ': '.$proj->getNomUrl();
+ } else {
+ $morehtmlref .= '';
+ }
+ }
+ }*/
+ $morehtmlref .= '
';
+
+ dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
+
+ print '';
+
+ print '
';
+ print '
';
+
+ // Number of files
+ print ''.$langs->trans("NbOfAttachedFiles").' '.count($filearray).' ';
+
+ // Total size
+ print ''.$langs->trans("TotalSizeOfAttachedFiles").' '.$totalsize.' '.$langs->trans("bytes").' ';
+
+ print '
';
+
+ print '
';
+
+ print dol_get_fiche_end();
+
+ $modulepart = 'bookcal';
+ //$permissiontoadd = $user->rights->bookcal->booking->write;
+ $permissiontoadd = 1;
+ //$permtoedit = $user->rights->bookcal->booking->write;
+ $permtoedit = 1;
+ $param = '&id='.$object->id;
+
+ //$relativepathwithnofile='booking/' . dol_sanitizeFileName($object->id).'/';
+ $relativepathwithnofile = 'booking/'.dol_sanitizeFileName($object->ref).'/';
+
+ include DOL_DOCUMENT_ROOT.'/core/tpl/document_actions_post_headers.tpl.php';
+} else {
+ accessforbidden('', 0, 1);
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/bookcal/booking_list.php b/htdocs/bookcal/booking_list.php
new file mode 100644
index 00000000000..f4aac1e5ed8
--- /dev/null
+++ b/htdocs/bookcal/booking_list.php
@@ -0,0 +1,845 @@
+
+ * Copyright (C) 2022 Alice Adminson
+ *
+ * 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 .
+ */
+
+/**
+ * \file booking_list.php
+ * \ingroup bookcal
+ * \brief List page for booking
+ */
+
+//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db
+//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user
+//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc
+//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs
+//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters
+//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters
+//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on).
+//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on)
+//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data
+//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu
+//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php
+//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library
+//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too.
+//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
+//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value
+//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler
+//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message
+//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies
+//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET
+//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification
+//if (! defined('NOSESSION')) define('NOSESSION', '1'); // On CLI mode, no need to use web sessions
+
+// Load Dolibarr environment
+$res = 0;
+// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
+if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
+ $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
+}
+// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
+$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
+while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
+ $i--; $j--;
+}
+if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
+ $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
+}
+if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
+ $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
+}
+// Try main.inc.php using relative path
+if (!$res && file_exists("../main.inc.php")) {
+ $res = @include "../main.inc.php";
+}
+if (!$res && file_exists("../../main.inc.php")) {
+ $res = @include "../../main.inc.php";
+}
+if (!$res && file_exists("../../../main.inc.php")) {
+ $res = @include "../../../main.inc.php";
+}
+if (!$res) {
+ die("Include of main fails");
+}
+
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
+
+// load bookcal libraries
+require_once __DIR__.'/class/booking.class.php';
+
+// for other modules
+//dol_include_once('/othermodule/class/otherobject.class.php');
+
+// Load translation files required by the page
+$langs->loadLangs(array("bookcal@bookcal", "other"));
+
+$id = GETPOST('id', 'int');
+$ref = GETPOST('ref', 'alpha');
+
+$action = GETPOST('action', 'aZ09') ?GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ...
+$massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
+$show_files = GETPOST('show_files', 'int'); // Show files area generated by bulk actions ?
+$confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
+$cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
+$toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
+$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search
+$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
+$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
+$mode = GETPOST('mode', 'aZ');
+
+// Load variable for pagination
+$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
+$sortfield = GETPOST('sortfield', 'aZ09comma');
+$sortorder = GETPOST('sortorder', 'aZ09comma');
+$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
+if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
+ // If $page is not defined, or '' or -1 or if we click on clear filters
+ $page = 0;
+}
+$offset = $limit * $page;
+$pageprev = $page - 1;
+$pagenext = $page + 1;
+
+// Initialize technical objects
+$object = new Booking($db);
+$extrafields = new ExtraFields($db);
+$diroutputmassaction = $conf->bookcal->dir_output.'/temp/massgeneration/'.$user->id;
+$hookmanager->initHooks(array('bookinglist')); // Note that conf->hooks_modules contains array
+
+// Fetch optionals attributes and labels
+$extrafields->fetch_name_optionals_label($object->table_element);
+//$extrafields->fetch_name_optionals_label($object->table_element_line);
+
+$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
+
+// Default sort order (if not yet defined by previous GETPOST)
+if (!$sortfield) {
+ reset($object->fields); // Reset is required to avoid key() to return null.
+ $sortfield = "t.".key($object->fields); // Set here default search field. By default 1st field in definition.
+}
+if (!$sortorder) {
+ $sortorder = "ASC";
+}
+
+// Initialize array of search criterias
+$search_all = GETPOST('search_all', 'alphanohtml');
+$search = array();
+foreach ($object->fields as $key => $val) {
+ if (GETPOST('search_'.$key, 'alpha') !== '') {
+ $search[$key] = GETPOST('search_'.$key, 'alpha');
+ }
+ if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
+ $search[$key.'_dtstart'] = dol_mktime(0, 0, 0, GETPOST('search_'.$key.'_dtstartmonth', 'int'), GETPOST('search_'.$key.'_dtstartday', 'int'), GETPOST('search_'.$key.'_dtstartyear', 'int'));
+ $search[$key.'_dtend'] = dol_mktime(23, 59, 59, GETPOST('search_'.$key.'_dtendmonth', 'int'), GETPOST('search_'.$key.'_dtendday', 'int'), GETPOST('search_'.$key.'_dtendyear', 'int'));
+ }
+}
+
+// List of fields to search into when doing a "search in all"
+$fieldstosearchall = array();
+foreach ($object->fields as $key => $val) {
+ if (!empty($val['searchall'])) {
+ $fieldstosearchall['t.'.$key] = $val['label'];
+ }
+}
+
+// Definition of array of fields for columns
+$arrayfields = array();
+foreach ($object->fields as $key => $val) {
+ // If $val['visible']==0, then we never show the field
+ if (!empty($val['visible'])) {
+ $visible = (int) dol_eval($val['visible'], 1);
+ $arrayfields['t.'.$key] = array(
+ 'label'=>$val['label'],
+ 'checked'=>(($visible < 0) ? 0 : 1),
+ 'enabled'=>(abs($visible) != 3 && dol_eval($val['enabled'], 1)),
+ 'position'=>$val['position'],
+ 'help'=> isset($val['help']) ? $val['help'] : ''
+ );
+ }
+}
+// Extra fields
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
+
+$object->fields = dol_sort_array($object->fields, 'position');
+//$arrayfields['anotherfield'] = array('type'=>'integer', 'label'=>'AnotherField', 'checked'=>1, 'enabled'=>1, 'position'=>90, 'csslist'=>'right');
+$arrayfields = dol_sort_array($arrayfields, 'position');
+
+// There is several ways to check permission.
+// Set $enablepermissioncheck to 1 to enable a minimum low level of checks
+$enablepermissioncheck = 0;
+if ($enablepermissioncheck) {
+ $permissiontoread = $user->rights->bookcal->booking->read;
+ $permissiontoadd = $user->rights->bookcal->booking->write;
+ $permissiontodelete = $user->rights->bookcal->booking->delete;
+} else {
+ $permissiontoread = 1;
+ $permissiontoadd = 1;
+ $permissiontodelete = 1;
+}
+
+// Security check (enable the most restrictive one)
+if ($user->socid > 0) accessforbidden();
+//if ($user->socid > 0) accessforbidden();
+//$socid = 0; if ($user->socid > 0) $socid = $user->socid;
+//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
+//restrictedArea($user, $object->element, 0, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
+if (empty($conf->bookcal->enabled)) accessforbidden('Module not enabled');
+if (!$permissiontoread) accessforbidden();
+
+
+/*
+ * Actions
+ */
+
+if (GETPOST('cancel', 'alpha')) {
+ $action = 'list';
+ $massaction = '';
+}
+if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
+ $massaction = '';
+}
+
+$parameters = array();
+$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
+if ($reshook < 0) {
+ setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+}
+
+if (empty($reshook)) {
+ // Selection of new fields
+ include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
+
+ // Purge search criteria
+ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
+ foreach ($object->fields as $key => $val) {
+ $search[$key] = '';
+ if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
+ $search[$key.'_dtstart'] = '';
+ $search[$key.'_dtend'] = '';
+ }
+ }
+ $toselect = array();
+ $search_array_options = array();
+ }
+ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
+ || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
+ $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
+ }
+
+ // Mass actions
+ $objectclass = 'Booking';
+ $objectlabel = 'Booking';
+ $uploaddir = $conf->bookcal->dir_output;
+ include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
+}
+
+
+
+/*
+ * View
+ */
+
+$form = new Form($db);
+
+$now = dol_now();
+
+//$help_url = "EN:Module_Booking|FR:Module_Booking_FR|ES:Módulo_Booking";
+$help_url = '';
+$title = $langs->trans("Bookings");
+$morejs = array();
+$morecss = array();
+
+
+// Build and execute select
+// --------------------------------------------------------------------
+$sql = 'SELECT ';
+$sql .= $object->getFieldList('t');
+// Add fields from extrafields
+if (!empty($extrafields->attributes[$object->table_element]['label'])) {
+ foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
+ $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
+ }
+}
+// Add fields from hooks
+$parameters = array();
+$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object); // Note that $action and $object may have been modified by hook
+$sql .= preg_replace('/^,/', '', $hookmanager->resPrint);
+$sql = preg_replace('/,\s*$/', '', $sql);
+//$sql .= ", COUNT(rc.rowid) as anotherfield";
+$sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as t";
+//$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."anothertable as rc ON rc.parent = t.rowid";
+if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
+ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)";
+}
+// Add table from hooks
+$parameters = array();
+$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
+$sql .= $hookmanager->resPrint;
+if ($object->ismultientitymanaged == 1) {
+ $sql .= " WHERE t.entity IN (".getEntity($object->element).")";
+} else {
+ $sql .= " WHERE 1 = 1";
+}
+foreach ($search as $key => $val) {
+ if (array_key_exists($key, $object->fields)) {
+ if ($key == 'status' && $search[$key] == -1) {
+ continue;
+ }
+ $mode_search = (($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key])) ? 1 : 0);
+ if ((strpos($object->fields[$key]['type'], 'integer:') === 0) || (strpos($object->fields[$key]['type'], 'sellist:') === 0) || !empty($object->fields[$key]['arrayofkeyval'])) {
+ if ($search[$key] == '-1' || ($search[$key] === '0' && (empty($object->fields[$key]['arrayofkeyval']) || !array_key_exists('0', $object->fields[$key]['arrayofkeyval'])))) {
+ $search[$key] = '';
+ }
+ $mode_search = 2;
+ }
+ if ($search[$key] != '') {
+ $sql .= natural_search("t.".$db->escape($key), $search[$key], (($key == 'status') ? 2 : $mode_search));
+ }
+ } else {
+ if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') {
+ $columnName = preg_replace('/(_dtstart|_dtend)$/', '', $key);
+ if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) {
+ if (preg_match('/_dtstart$/', $key)) {
+ $sql .= " AND t.".$db->escape($columnName)." >= '".$db->idate($search[$key])."'";
+ }
+ if (preg_match('/_dtend$/', $key)) {
+ $sql .= " AND t.".$db->escape($columnName)." <= '".$db->idate($search[$key])."'";
+ }
+ }
+ }
+ }
+}
+if ($search_all) {
+ $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
+}
+//$sql.= dolSqlDateFilter("t.field", $search_xxxday, $search_xxxmonth, $search_xxxyear);
+// Add where from extra fields
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
+// Add where from hooks
+$parameters = array();
+$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object); // Note that $action and $object may have been modified by hook
+$sql .= $hookmanager->resPrint;
+
+/* If a group by is required
+$sql .= " GROUP BY ";
+foreach($object->fields as $key => $val) {
+ $sql .= "t.".$db->escape($key).", ";
+}
+// Add fields from extrafields
+if (!empty($extrafields->attributes[$object->table_element]['label'])) {
+ foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
+ $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? "ef.".$key.', ' : '');
+ }
+}
+// Add where from hooks
+$parameters = array();
+$reshook = $hookmanager->executeHooks('printFieldListGroupBy', $parameters, $object); // Note that $action and $object may have been modified by hook
+$sql .= $hookmanager->resPrint;
+$sql = preg_replace('/,\s*$/', '', $sql);
+*/
+
+// Add HAVING from hooks
+/*
+$parameters = array();
+$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object); // Note that $action and $object may have been modified by hook
+$sql .= empty($hookmanager->resPrint) ? "" : " HAVING 1=1 ".$hookmanager->resPrint;
+*/
+
+// Count total nb of records
+$nbtotalofrecords = '';
+if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
+ /* This old and fast method to get and count full list returns all record so use a high amount of memory.
+ $resql = $db->query($sql);
+ $nbtotalofrecords = $db->num_rows($resql);
+ */
+ /* The slow method does not consume memory on mysql (not tested on pgsql) */
+ /*$resql = $db->query($sql, 0, 'auto', 1);
+ while ($db->fetch_object($resql)) {
+ if (empty($nbtotalofrecords)) {
+ $nbtotalofrecords = 1; // We can't make +1 because init value is ''
+ } else {
+ $nbtotalofrecords++;
+ }
+ }*/
+ /* The fast and low memory method to get and count full list converts the sql into a sql count */
+ $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
+ $resql = $db->query($sqlforcount);
+ if ($resql) {
+ $objforcount = $db->fetch_object($resql);
+ $nbtotalofrecords = $objforcount->nbtotalofrecords;
+ } else {
+ dol_print_error($db);
+ }
+
+ if (($page * $limit) > $nbtotalofrecords) { // if total of record found is smaller than page * limit, goto and load page 0
+ $page = 0;
+ $offset = 0;
+ }
+ $db->free($resql);
+}
+
+// Complete request and execute it with limit
+$sql .= $db->order($sortfield, $sortorder);
+if ($limit) {
+ $sql .= $db->plimit($limit + 1, $offset);
+}
+
+$resql = $db->query($sql);
+if (!$resql) {
+ dol_print_error($db);
+ exit;
+}
+
+$num = $db->num_rows($resql);
+
+
+// Direct jump if only one record found
+if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all && !$page) {
+ $obj = $db->fetch_object($resql);
+ $id = $obj->rowid;
+ header("Location: ".dol_buildpath('/bookcal/booking_card.php', 1).'?id='.$id);
+ exit;
+}
+
+
+// Output page
+// --------------------------------------------------------------------
+
+llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'bodyforlist');
+
+// Example : Adding jquery code
+// print '';
+
+$arrayofselected = is_array($toselect) ? $toselect : array();
+
+$param = '';
+if (!empty($mode)) {
+ $param .= '&mode='.urlencode($mode);
+}
+if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
+ $param .= '&contextpage='.urlencode($contextpage);
+}
+if ($limit > 0 && $limit != $conf->liste_limit) {
+ $param .= '&limit='.urlencode($limit);
+}
+foreach ($search as $key => $val) {
+ if (is_array($search[$key]) && count($search[$key])) {
+ foreach ($search[$key] as $skey) {
+ if ($skey != '') {
+ $param .= '&search_'.$key.'[]='.urlencode($skey);
+ }
+ }
+ } elseif ($search[$key] != '') {
+ $param .= '&search_'.$key.'='.urlencode($search[$key]);
+ }
+}
+if ($optioncss != '') {
+ $param .= '&optioncss='.urlencode($optioncss);
+}
+// Add $param from extra fields
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
+// Add $param from hooks
+$parameters = array();
+$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
+$param .= $hookmanager->resPrint;
+
+// List of mass actions available
+$arrayofmassactions = array(
+ //'validate'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
+ //'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
+ //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
+ //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
+);
+if (!empty($permissiontodelete)) {
+ $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
+}
+if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete'))) {
+ $arrayofmassactions = array();
+}
+$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
+
+print ''."\n";
+if ($optioncss != '') {
+ print ' ';
+}
+print ' ';
+print ' ';
+print ' ';
+print ' ';
+print ' ';
+print ' ';
+print ' ';
+print ' ';
+
+
+$newcardbutton = '';
+$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition'));
+$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition'));
+$newcardbutton .= dolGetButtonTitleSeparator();
+$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/bookcal/booking_card.php', 1).'?action=create&backtopage='.urlencode($_SERVER['PHP_SELF']), '', $permissiontoadd);
+
+print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_'.$object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
+
+// Add code for pre mass action (confirmation or email presend form)
+$topicmail = "SendBookingRef";
+$modelmail = "booking";
+$objecttmp = new Booking($db);
+$trackid = 'xxxx'.$object->id;
+include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
+
+if ($search_all) {
+ $setupstring = '';
+ foreach ($fieldstosearchall as $key => $val) {
+ $fieldstosearchall[$key] = $langs->trans($val);
+ $setupstring .= $key."=".$val.";";
+ }
+ print ''."\n";
+ print ''.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
'."\n";
+}
+
+$moreforfilter = '';
+/*$moreforfilter.='';
+$moreforfilter.= $langs->trans('MyFilter') . ': ';
+$moreforfilter.= '
';*/
+
+$parameters = array();
+$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
+if (empty($reshook)) {
+ $moreforfilter .= $hookmanager->resPrint;
+} else {
+ $moreforfilter = $hookmanager->resPrint;
+}
+
+if (!empty($moreforfilter)) {
+ print '';
+ print $moreforfilter;
+ print '
';
+}
+
+$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
+$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields
+$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
+
+print ''; // You can use div-table-responsive-no-min if you dont need reserved height for your table
+print '
'."\n";
+
+
+// Fields title search
+// --------------------------------------------------------------------
+print '';
+// Action column
+if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print '';
+ $searchpicto = $form->showFilterButtons('left');
+ print $searchpicto;
+ print ' ';
+}
+foreach ($object->fields as $key => $val) {
+ $searchkey = empty($search[$key]) ? '' : $search[$key];
+ $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
+ if ($key == 'status') {
+ $cssforfield .= ($cssforfield ? ' ' : '').'center';
+ } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'center';
+ } elseif (in_array($val['type'], array('timestamp'))) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
+ } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'right';
+ }
+ if (!empty($arrayfields['t.'.$key]['checked'])) {
+ print '';
+ if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
+ print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100', 1);
+ } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) {
+ print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', $cssforfield.' maxwidth250', 1);
+ } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
+ print '';
+ print $form->selectDate($search[$key.'_dtstart'] ? $search[$key.'_dtstart'] : '', "search_".$key."_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
+ print '
';
+ print '';
+ print $form->selectDate($search[$key.'_dtend'] ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
+ print '
';
+ } elseif ($key == 'lang') {
+ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
+ $formadmin = new FormAdmin($db);
+ print $formadmin->select_language($search[$key], 'search_lang', 0, null, 1, 0, 0, 'minwidth150 maxwidth200', 2);
+ } else {
+ print ' ';
+ }
+ print ' ';
+ }
+}
+// Extra fields
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
+
+// Fields from hook
+$parameters = array('arrayfields'=>$arrayfields);
+$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
+print $hookmanager->resPrint;
+/*if (!empty($arrayfields['anotherfield']['checked'])) {
+ print ' ';
+}*/
+// Action column
+if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print '';
+ $searchpicto = $form->showFilterButtons();
+ print $searchpicto;
+ print ' ';
+}
+print ' '."\n";
+
+$totalarray = array();
+$totalarray['nbfield'] = 0;
+
+// Fields title label
+// --------------------------------------------------------------------
+print '';
+if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+}
+foreach ($object->fields as $key => $val) {
+ $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
+ if ($key == 'status') {
+ $cssforfield .= ($cssforfield ? ' ' : '').'center';
+ } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'center';
+ } elseif (in_array($val['type'], array('timestamp'))) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
+ } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'right';
+ }
+ $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label
+ if (!empty($arrayfields['t.'.$key]['checked'])) {
+ print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''))."\n";
+ $totalarray['nbfield']++;
+ }
+}
+// Extra fields
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
+// Hook fields
+$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder, 'totalarray'=>&$totalarray);
+$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
+print $hookmanager->resPrint;
+/*if (!empty($arrayfields['anotherfield']['checked'])) {
+ print ''.$langs->trans("AnotherField").' ';
+ $totalarray['nbfield']++;
+}*/
+// Action column
+if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+}
+$totalarray['nbfield']++;
+print ' '."\n";
+
+
+// Detect if we need a fetch on each output line
+$needToFetchEachLine = 0;
+if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) {
+ foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) {
+ if (preg_match('/\$object/', $val)) {
+ $needToFetchEachLine++; // There is at least one compute field that use $object
+ }
+ }
+}
+
+
+// Loop on record
+// --------------------------------------------------------------------
+$i = 0;
+$savnbfield = $totalarray['nbfield'];
+$totalarray = array();
+$totalarray['nbfield'] = 0;
+$imaxinloop = ($limit ? min($num, $limit) : $num);
+while ($i < $imaxinloop) {
+ $obj = $db->fetch_object($resql);
+ if (empty($obj)) {
+ break; // Should not happen
+ }
+
+ // Store properties in $object
+ $object->setVarsFromFetchObj($obj);
+
+ if ($mode == 'kanban') {
+ if ($i == 0) {
+ print '';
+ print '';
+ }
+ // Output Kanban
+ print $object->getKanbanView('');
+ if ($i == ($imaxinloop - 1)) {
+ print '
';
+ print ' ';
+ }
+ } else {
+ // Show here line of result
+ $j = 0;
+ print '';
+ // Action column
+ if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($object->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
+ foreach ($object->fields as $key => $val) {
+ $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
+ if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'center';
+ } elseif ($key == 'status') {
+ $cssforfield .= ($cssforfield ? ' ' : '').'center';
+ }
+
+ if (in_array($val['type'], array('timestamp'))) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
+ } elseif ($key == 'ref') {
+ $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
+ }
+
+ if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'right';
+ }
+ //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100';
+
+ if (!empty($arrayfields['t.'.$key]['checked'])) {
+ print '';
+ if ($key == 'status') {
+ print $object->getLibStatut(5);
+ } elseif ($key == 'rowid') {
+ print $object->showOutputField($val, $key, $object->id, '');
+ } else {
+ print $object->showOutputField($val, $key, $object->$key, '');
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
+ if (!$i) {
+ $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key;
+ }
+ if (!isset($totalarray['val'])) {
+ $totalarray['val'] = array();
+ }
+ if (!isset($totalarray['val']['t.'.$key])) {
+ $totalarray['val']['t.'.$key] = 0;
+ }
+ $totalarray['val']['t.'.$key] += $object->$key;
+ }
+ }
+ }
+ // Extra fields
+ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
+ // Fields from hook
+ $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
+ $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
+ print $hookmanager->resPrint;
+ /*if (!empty($arrayfields['anotherfield']['checked'])) {
+ print ''.$obj->anotherfield.' ';
+ }*/
+ // Action column
+ if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($object->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+
+ print ' '."\n";
+ }
+
+ $i++;
+}
+
+// Show total line
+include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
+
+// If no record found
+if ($num == 0) {
+ $colspan = 1;
+ foreach ($arrayfields as $key => $val) {
+ if (!empty($val['checked'])) {
+ $colspan++;
+ }
+ }
+ print ''.$langs->trans("NoRecordFound").' ';
+}
+
+
+$db->free($resql);
+
+$parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
+$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+print $hookmanager->resPrint;
+
+print '
'."\n";
+print '
'."\n";
+
+print ' '."\n";
+
+if (in_array('builddoc', $arrayofmassactions) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
+ $hidegeneratedfilelistifempty = 1;
+ if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
+ $hidegeneratedfilelistifempty = 0;
+ }
+
+ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
+ $formfile = new FormFile($db);
+
+ // Show list of available documents
+ $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
+ $urlsource .= str_replace('&', '&', $param);
+
+ $filedir = $diroutputmassaction;
+ $genallowed = $permissiontoread;
+ $delallowed = $permissiontoadd;
+
+ print $formfile->showdocuments('massfilesarea_bookcal', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/bookcal/booking_note.php b/htdocs/bookcal/booking_note.php
new file mode 100644
index 00000000000..f68ffcbd72b
--- /dev/null
+++ b/htdocs/bookcal/booking_note.php
@@ -0,0 +1,221 @@
+
+ * Copyright (C) 2022 Alice Adminson
+ *
+ * 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 .
+ */
+
+/**
+ * \file booking_note.php
+ * \ingroup bookcal
+ * \brief Tab for notes on Booking
+ */
+
+//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db
+//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user
+//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc
+//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs
+//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters
+//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters
+//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on).
+//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on)
+//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data
+//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu
+//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php
+//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library
+//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too.
+//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
+//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value
+//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler
+//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message
+//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies
+//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET
+//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification
+
+// Load Dolibarr environment
+$res = 0;
+// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
+if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
+ $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
+}
+// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
+$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
+while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
+ $i--; $j--;
+}
+if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
+ $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
+}
+if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
+ $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
+}
+// Try main.inc.php using relative path
+if (!$res && file_exists("../main.inc.php")) {
+ $res = @include "../main.inc.php";
+}
+if (!$res && file_exists("../../main.inc.php")) {
+ $res = @include "../../main.inc.php";
+}
+if (!$res && file_exists("../../../main.inc.php")) {
+ $res = @include "../../../main.inc.php";
+}
+if (!$res) {
+ die("Include of main fails");
+}
+
+dol_include_once('/bookcal/class/booking.class.php');
+dol_include_once('/bookcal/lib/bookcal_booking.lib.php');
+
+// Load translation files required by the page
+$langs->loadLangs(array("bookcal@bookcal", "companies"));
+
+// Get parameters
+$id = GETPOST('id', 'int');
+$ref = GETPOST('ref', 'alpha');
+$action = GETPOST('action', 'aZ09');
+$cancel = GETPOST('cancel', 'aZ09');
+$backtopage = GETPOST('backtopage', 'alpha');
+
+// Initialize technical objects
+$object = new Booking($db);
+$extrafields = new ExtraFields($db);
+$diroutputmassaction = $conf->bookcal->dir_output.'/temp/massgeneration/'.$user->id;
+$hookmanager->initHooks(array('bookingnote', 'globalcard')); // Note that conf->hooks_modules contains array
+// Fetch optionals attributes and labels
+$extrafields->fetch_name_optionals_label($object->table_element);
+
+// Load object
+include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals
+if ($id > 0 || !empty($ref)) {
+ $upload_dir = $conf->bookcal->multidir_output[!empty($object->entity) ? $object->entity : $conf->entity]."/".$object->id;
+}
+
+
+// There is several ways to check permission.
+// Set $enablepermissioncheck to 1 to enable a minimum low level of checks
+$enablepermissioncheck = 0;
+if ($enablepermissioncheck) {
+ $permissiontoread = $user->rights->bookcal->booking->read;
+ $permissiontoadd = $user->rights->bookcal->booking->write;
+ $permissionnote = $user->rights->bookcal->booking->write; // Used by the include of actions_setnotes.inc.php
+} else {
+ $permissiontoread = 1;
+ $permissiontoadd = 1;
+ $permissionnote = 1;
+}
+
+// Security check (enable the most restrictive one)
+//if ($user->socid > 0) accessforbidden();
+//if ($user->socid > 0) $socid = $user->socid;
+//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
+//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
+if (empty($conf->bookcal->enabled)) accessforbidden();
+if (!$permissiontoread) accessforbidden();
+
+
+/*
+ * Actions
+ */
+
+$parameters = array();
+$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
+if ($reshook < 0) {
+ setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+}
+if (empty($reshook)) {
+ include DOL_DOCUMENT_ROOT.'/core/actions_setnotes.inc.php'; // Must be include, not include_once
+}
+
+
+/*
+ * View
+ */
+
+$form = new Form($db);
+
+//$help_url='EN:Customers_Orders|FR:Commandes_Clients|ES:Pedidos de clientes';
+$help_url = '';
+$title = $langs->trans('Booking').' - '.$langs->trans("Notes");
+llxHeader('', $title, $help_url);
+
+if ($id > 0 || !empty($ref)) {
+ $object->fetch_thirdparty();
+
+ $head = bookingPrepareHead($object);
+
+ print dol_get_fiche_head($head, 'note', $langs->trans("Booking"), -1, $object->picto);
+
+ // Object card
+ // ------------------------------------------------------------
+ $linkback = ''.$langs->trans("BackToList").' ';
+
+ $morehtmlref = '';
+ /*
+ // Ref customer
+ $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
+ $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
+ // Thirdparty
+ $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . (is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : '');
+ // Project
+ if (! empty($conf->project->enabled))
+ {
+ $langs->load("projects");
+ $morehtmlref.='
'.$langs->trans('Project') . ' ';
+ if ($permissiontoadd)
+ {
+ if ($action != 'classify')
+ //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
+ $morehtmlref.=' : ';
+ if ($action == 'classify') {
+ //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
+ $morehtmlref.='
';
+ $morehtmlref.=' ';
+ $morehtmlref.=' ';
+ $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
+ $morehtmlref.=' ';
+ $morehtmlref.=' ';
+ } else {
+ $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ }
+ } else {
+ if (! empty($object->fk_project)) {
+ $proj = new Project($db);
+ $proj->fetch($object->fk_project);
+ $morehtmlref .= ': '.$proj->getNomUrl();
+ } else {
+ $morehtmlref .= '';
+ }
+ }
+ }*/
+ $morehtmlref .= '
';
+
+
+ dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
+
+
+ print '';
+ print '
';
+
+
+ $cssclass = "titlefield";
+ include DOL_DOCUMENT_ROOT.'/core/tpl/notes.tpl.php';
+
+ print '
';
+
+ print dol_get_fiche_end();
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/bookcal/class/availabilities.class.php b/htdocs/bookcal/class/availabilities.class.php
new file mode 100644
index 00000000000..cfbfc8eed88
--- /dev/null
+++ b/htdocs/bookcal/class/availabilities.class.php
@@ -0,0 +1,1089 @@
+
+ * Copyright (C) 2022 Alice Adminson
+ *
+ * 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 .
+ */
+
+/**
+ * \file class/availabilities.class.php
+ * \ingroup bookcal
+ * \brief This file is a CRUD class file for Availabilities (Create/Read/Update/Delete)
+ */
+
+// Put here all includes required by your class file
+require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
+//require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
+//require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php';
+
+/**
+ * Class for Availabilities
+ */
+class Availabilities extends CommonObject
+{
+ /**
+ * @var string ID of module.
+ */
+ public $module = 'bookcal';
+
+ /**
+ * @var string ID to identify managed object.
+ */
+ public $element = 'availabilities';
+
+ /**
+ * @var string Name of table without prefix where object is stored. This is also the key used for extrafields management.
+ */
+ public $table_element = 'bookcal_availabilities';
+
+ /**
+ * @var int Does this object support multicompany module ?
+ * 0=No test on entity, 1=Test with field entity, 'field@table'=Test with link by field@table
+ */
+ public $ismultientitymanaged = 0;
+
+ /**
+ * @var int Does object support extrafields ? 0=No, 1=Yes
+ */
+ public $isextrafieldmanaged = 1;
+
+ /**
+ * @var string String with name of icon for availabilities. Must be a 'fa-xxx' fontawesome code (or 'fa-xxx_fa_color_size') or 'availabilities@bookcal' if picto is file 'img/object_availabilities.png'.
+ */
+ public $picto = 'fa-file';
+
+
+ const STATUS_DRAFT = 0;
+ const STATUS_VALIDATED = 1;
+ const STATUS_CANCELED = 9;
+
+
+ /**
+ * 'type' field format ('integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortfield]]]', 'sellist:TableName:LabelFieldName[:KeyFieldName[:KeyFieldParent[:Filter[:Sortfield]]]]', 'varchar(x)', 'double(24,8)', 'real', 'price', 'text', 'text:none', 'html', 'date', 'datetime', 'timestamp', 'duration', 'mail', 'phone', 'url', 'password')
+ * Note: Filter can be a string like "(t.ref:like:'SO-%') or (t.date_creation:<:'20160101') or (t.nature:is:NULL)"
+ * 'label' the translation key.
+ * 'picto' is code of a picto to show before value in forms
+ * 'enabled' is a condition when the field must be managed (Example: 1 or '$conf->global->MY_SETUP_PARAM' or '!empty($conf->multicurrency->enabled)' ...)
+ * 'position' is the sort order of field.
+ * 'notnull' is set to 1 if not null in database. Set to -1 if we must set data to null if empty ('' or 0).
+ * 'visible' says if field is visible in list (Examples: 0=Not visible, 1=Visible on list and create/update/view forms, 2=Visible on list only, 3=Visible on create/update/view form only (not list), 4=Visible on list and update/view form only (not create). 5=Visible on list and view only (not create/not update). Using a negative value means field is not shown by default on list but can be selected for viewing)
+ * 'noteditable' says if field is not editable (1 or 0)
+ * 'default' is a default value for creation (can still be overwrote by the Setup of Default Values if field is editable in creation form). Note: If default is set to '(PROV)' and field is 'ref', the default value will be set to '(PROVid)' where id is rowid when a new record is created.
+ * 'index' if we want an index in database.
+ * 'foreignkey'=>'tablename.field' if the field is a foreign key (it is recommanded to name the field fk_...).
+ * 'searchall' is 1 if we want to search in this field when making a search from the quick search button.
+ * 'isameasure' must be set to 1 or 2 if field can be used for measure. Field type must be summable like integer or double(24,8). Use 1 in most cases, or 2 if you don't want to see the column total into list (for example for percentage)
+ * 'css' and 'cssview' and 'csslist' is the CSS style to use on field. 'css' is used in creation and update. 'cssview' is used in view mode. 'csslist' is used for columns in lists. For example: 'css'=>'minwidth300 maxwidth500 widthcentpercentminusx', 'cssview'=>'wordbreak', 'csslist'=>'tdoverflowmax200'
+ * 'help' is a 'TranslationString' to use to show a tooltip on field. You can also use 'TranslationString:keyfortooltiponlick' for a tooltip on click.
+ * 'showoncombobox' if value of the field must be visible into the label of the combobox that list record
+ * 'disabled' is 1 if we want to have the field locked by a 'disabled' attribute. In most cases, this is never set into the definition of $fields into class, but is set dynamically by some part of code.
+ * 'arrayofkeyval' to set a list of values if type is a list of predefined values. For example: array("0"=>"Draft","1"=>"Active","-1"=>"Cancel"). Note that type can be 'integer' or 'varchar'
+ * 'autofocusoncreate' to have field having the focus on a create form. Only 1 field should have this property set to 1.
+ * 'comment' is not used. You can store here any text of your choice. It is not used by application.
+ * 'validate' is 1 if need to validate with $this->validateField()
+ * 'copytoclipboard' is 1 or 2 to allow to add a picto to copy value into clipboard (1=picto after label, 2=picto after value)
+ *
+ * Note: To have value dynamic, you can set value to 0 in definition and edit the value on the fly into the constructor.
+ */
+
+ // BEGIN MODULEBUILDER PROPERTIES
+ /**
+ * @var array Array with all fields and their property. Do not use it as a static var. It may be modified by constructor.
+ */
+ public $fields=array(
+ 'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>0, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'comment'=>"Id"),
+ 'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>'1', 'position'=>20, 'notnull'=>1, 'visible'=>1, 'index'=>1, 'searchall'=>1, 'showoncombobox'=>'1', 'validate'=>'1', 'comment'=>"Reference of object"),
+ 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>'1', 'position'=>30, 'notnull'=>0, 'visible'=>1, 'searchall'=>1, 'css'=>'minwidth300', 'cssview'=>'wordbreak', 'help'=>"Help text", 'showoncombobox'=>'2', 'validate'=>'1',),
+ 'description' => array('type'=>'text', 'label'=>'Description', 'enabled'=>'1', 'position'=>60, 'notnull'=>0, 'visible'=>3, 'validate'=>'1',),
+ 'note_public' => array('type'=>'html', 'label'=>'NotePublic', 'enabled'=>'1', 'position'=>61, 'notnull'=>0, 'visible'=>0, 'cssview'=>'wordbreak', 'validate'=>'1',),
+ 'note_private' => array('type'=>'html', 'label'=>'NotePrivate', 'enabled'=>'1', 'position'=>62, 'notnull'=>0, 'visible'=>0, 'cssview'=>'wordbreak', 'validate'=>'1',),
+ 'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>'1', 'position'=>500, 'notnull'=>1, 'visible'=>-2,),
+ 'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>'1', 'position'=>501, 'notnull'=>0, 'visible'=>-2,),
+ 'fk_user_creat' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserAuthor', 'picto'=>'user', 'enabled'=>'1', 'position'=>510, 'notnull'=>1, 'visible'=>-2, 'foreignkey'=>'user.rowid',),
+ 'fk_user_modif' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'picto'=>'user', 'enabled'=>'1', 'position'=>511, 'notnull'=>-1, 'visible'=>-2,),
+ 'last_main_doc' => array('type'=>'varchar(255)', 'label'=>'LastMainDoc', 'enabled'=>'1', 'position'=>600, 'notnull'=>0, 'visible'=>0,),
+ 'import_key' => array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>'1', 'position'=>1000, 'notnull'=>-1, 'visible'=>-2,),
+ 'model_pdf' => array('type'=>'varchar(255)', 'label'=>'Model pdf', 'enabled'=>'1', 'position'=>1010, 'notnull'=>-1, 'visible'=>0,),
+ 'status' => array('type'=>'integer', 'label'=>'Status', 'enabled'=>'1', 'position'=>2000, 'notnull'=>1, 'visible'=>1, 'index'=>1, 'arrayofkeyval'=>array('0'=>'Draft', '1'=>'Validated', '9'=>'Canceled'), 'validate'=>'1',),
+ 'start' => array('type'=>'date', 'label'=>'Start Date', 'enabled'=>'1', 'position'=>40, 'notnull'=>1, 'visible'=>1, 'searchall'=>1, 'isameasure'=>'1',),
+ 'end' => array('type'=>'date', 'label'=>'End Date', 'enabled'=>'1', 'position'=>45, 'notnull'=>1, 'visible'=>1, 'searchall'=>1, 'isameasure'=>'1',),
+ 'type' => array('type'=>'integer', 'label'=>'Type', 'enabled'=>'1', 'position'=>49, 'notnull'=>1, 'visible'=>1, 'index'=>1, 'arrayofkeyval'=>array('0'=>'Customer', '1'=>'Supplier', '2'=>'Else'),),
+ 'duration' => array('type'=>'integer', 'label'=>'Duration', 'enabled'=>'1', 'position'=>47, 'notnull'=>1, 'visible'=>1, 'default'=>'30', 'isameasure'=>'1',),
+ 'startHour' => array('type'=>'integer', 'label'=>'Start Hour', 'enabled'=>'1', 'position'=>46, 'notnull'=>1, 'visible'=>-1,),
+ 'endHour' => array('type'=>'integer', 'label'=>'End Hour', 'enabled'=>'1', 'position'=>46.5, 'notnull'=>1, 'visible'=>-1,),
+ );
+ public $rowid;
+ public $ref;
+ public $label;
+ public $description;
+ public $note_public;
+ public $note_private;
+ public $date_creation;
+ public $tms;
+ public $fk_user_creat;
+ public $fk_user_modif;
+ public $last_main_doc;
+ public $import_key;
+ public $model_pdf;
+ public $status;
+ public $start;
+ public $end;
+ public $type;
+ public $duration;
+ public $startHour;
+ public $endHour;
+ // END MODULEBUILDER PROPERTIES
+
+
+ // If this object has a subtable with lines
+
+ // /**
+ // * @var string Name of subtable line
+ // */
+ // public $table_element_line = 'bookcal_availabilitiesline';
+
+ // /**
+ // * @var string Field with ID of parent key if this object has a parent
+ // */
+ // public $fk_element = 'fk_availabilities';
+
+ // /**
+ // * @var string Name of subtable class that manage subtable lines
+ // */
+ // public $class_element_line = 'Availabilitiesline';
+
+ // /**
+ // * @var array List of child tables. To test if we can delete object.
+ // */
+ // protected $childtables = array();
+
+ // /**
+ // * @var array List of child tables. To know object to delete on cascade.
+ // * If name matches '@ClassNAme:FilePathClass;ParentFkFieldName' it will
+ // * call method deleteByParentField(parentId, ParentFkFieldName) to fetch and delete child object
+ // */
+ // protected $childtablesoncascade = array('bookcal_availabilitiesdet');
+
+ // /**
+ // * @var AvailabilitiesLine[] Array of subtable lines
+ // */
+ // public $lines = array();
+
+
+
+ /**
+ * Constructor
+ *
+ * @param DoliDb $db Database handler
+ */
+ public function __construct(DoliDB $db)
+ {
+ global $conf, $langs;
+
+ $this->db = $db;
+
+ if (empty($conf->global->MAIN_SHOW_TECHNICAL_ID) && isset($this->fields['rowid']) && !empty($this->fields['ref'])) {
+ $this->fields['rowid']['visible'] = 0;
+ }
+ if (empty($conf->multicompany->enabled) && isset($this->fields['entity'])) {
+ $this->fields['entity']['enabled'] = 0;
+ }
+
+ // Example to show how to set values of fields definition dynamically
+ /*if ($user->rights->bookcal->availabilities->read) {
+ $this->fields['myfield']['visible'] = 1;
+ $this->fields['myfield']['noteditable'] = 0;
+ }*/
+
+ // Unset fields that are disabled
+ foreach ($this->fields as $key => $val) {
+ if (isset($val['enabled']) && empty($val['enabled'])) {
+ unset($this->fields[$key]);
+ }
+ }
+
+ // Translate some data of arrayofkeyval
+ if (is_object($langs)) {
+ foreach ($this->fields as $key => $val) {
+ if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
+ foreach ($val['arrayofkeyval'] as $key2 => $val2) {
+ $this->fields[$key]['arrayofkeyval'][$key2] = $langs->trans($val2);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Create object into database
+ *
+ * @param User $user User that creates
+ * @param bool $notrigger false=launch triggers after, true=disable triggers
+ * @return int <0 if KO, Id of created object if OK
+ */
+ public function create(User $user, $notrigger = false)
+ {
+ $resultcreate = $this->createCommon($user, $notrigger);
+
+ //$resultvalidate = $this->validate($user, $notrigger);
+
+ return $resultcreate;
+ }
+
+ /**
+ * Clone an object into another one
+ *
+ * @param User $user User that creates
+ * @param int $fromid Id of object to clone
+ * @return mixed New object created, <0 if KO
+ */
+ public function createFromClone(User $user, $fromid)
+ {
+ global $langs, $extrafields;
+ $error = 0;
+
+ dol_syslog(__METHOD__, LOG_DEBUG);
+
+ $object = new self($this->db);
+
+ $this->db->begin();
+
+ // Load source object
+ $result = $object->fetchCommon($fromid);
+ if ($result > 0 && !empty($object->table_element_line)) {
+ $object->fetchLines();
+ }
+
+ // get lines so they will be clone
+ //foreach($this->lines as $line)
+ // $line->fetch_optionals();
+
+ // Reset some properties
+ unset($object->id);
+ unset($object->fk_user_creat);
+ unset($object->import_key);
+
+ // Clear fields
+ if (property_exists($object, 'ref')) {
+ $object->ref = empty($this->fields['ref']['default']) ? "Copy_Of_".$object->ref : $this->fields['ref']['default'];
+ }
+ if (property_exists($object, 'label')) {
+ $object->label = empty($this->fields['label']['default']) ? $langs->trans("CopyOf")." ".$object->label : $this->fields['label']['default'];
+ }
+ if (property_exists($object, 'status')) {
+ $object->status = self::STATUS_DRAFT;
+ }
+ if (property_exists($object, 'date_creation')) {
+ $object->date_creation = dol_now();
+ }
+ if (property_exists($object, 'date_modification')) {
+ $object->date_modification = null;
+ }
+ // ...
+ // Clear extrafields that are unique
+ if (is_array($object->array_options) && count($object->array_options) > 0) {
+ $extrafields->fetch_name_optionals_label($this->table_element);
+ foreach ($object->array_options as $key => $option) {
+ $shortkey = preg_replace('/options_/', '', $key);
+ if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) {
+ //var_dump($key);
+ //var_dump($clonedObj->array_options[$key]); exit;
+ unset($object->array_options[$key]);
+ }
+ }
+ }
+
+ // Create clone
+ $object->context['createfromclone'] = 'createfromclone';
+ $result = $object->createCommon($user);
+ if ($result < 0) {
+ $error++;
+ $this->error = $object->error;
+ $this->errors = $object->errors;
+ }
+
+ if (!$error) {
+ // copy internal contacts
+ if ($this->copy_linked_contact($object, 'internal') < 0) {
+ $error++;
+ }
+ }
+
+ if (!$error) {
+ // copy external contacts if same company
+ if (!empty($object->socid) && property_exists($this, 'fk_soc') && $this->fk_soc == $object->socid) {
+ if ($this->copy_linked_contact($object, 'external') < 0) {
+ $error++;
+ }
+ }
+ }
+
+ unset($object->context['createfromclone']);
+
+ // End
+ if (!$error) {
+ $this->db->commit();
+ return $object;
+ } else {
+ $this->db->rollback();
+ return -1;
+ }
+ }
+
+ /**
+ * Load object in memory from the database
+ *
+ * @param int $id Id object
+ * @param string $ref Ref
+ * @return int <0 if KO, 0 if not found, >0 if OK
+ */
+ public function fetch($id, $ref = null)
+ {
+ $result = $this->fetchCommon($id, $ref);
+ if ($result > 0 && !empty($this->table_element_line)) {
+ $this->fetchLines();
+ }
+ return $result;
+ }
+
+ /**
+ * Load object lines in memory from the database
+ *
+ * @return int <0 if KO, 0 if not found, >0 if OK
+ */
+ public function fetchLines()
+ {
+ $this->lines = array();
+
+ $result = $this->fetchLinesCommon();
+ return $result;
+ }
+
+
+ /**
+ * Load list of objects in memory from the database.
+ *
+ * @param string $sortorder Sort Order
+ * @param string $sortfield Sort field
+ * @param int $limit limit
+ * @param int $offset Offset
+ * @param array $filter Filter array. Example array('field'=>'valueforlike', 'customurl'=>...)
+ * @param string $filtermode Filter mode (AND or OR)
+ * @return array|int int <0 if KO, array of pages if OK
+ */
+ public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND')
+ {
+ global $conf;
+
+ dol_syslog(__METHOD__, LOG_DEBUG);
+
+ $records = array();
+
+ $sql = "SELECT ";
+ $sql .= $this->getFieldList('t');
+ $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t";
+ if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
+ $sql .= " WHERE t.entity IN (".getEntity($this->element).")";
+ } else {
+ $sql .= " WHERE 1 = 1";
+ }
+ // Manage filter
+ $sqlwhere = array();
+ if (count($filter) > 0) {
+ foreach ($filter as $key => $value) {
+ if ($key == 't.rowid') {
+ $sqlwhere[] = $key." = ".((int) $value);
+ } elseif (in_array($this->fields[$key]['type'], array('date', 'datetime', 'timestamp'))) {
+ $sqlwhere[] = $key." = '".$this->db->idate($value)."'";
+ } elseif ($key == 'customsql') {
+ $sqlwhere[] = $value;
+ } elseif (strpos($value, '%') === false) {
+ $sqlwhere[] = $key." IN (".$this->db->sanitize($this->db->escape($value)).")";
+ } else {
+ $sqlwhere[] = $key." LIKE '%".$this->db->escape($value)."%'";
+ }
+ }
+ }
+ if (count($sqlwhere) > 0) {
+ $sql .= " AND (".implode(" ".$filtermode." ", $sqlwhere).")";
+ }
+
+ if (!empty($sortfield)) {
+ $sql .= $this->db->order($sortfield, $sortorder);
+ }
+ if (!empty($limit)) {
+ $sql .= $this->db->plimit($limit, $offset);
+ }
+
+ $resql = $this->db->query($sql);
+ if ($resql) {
+ $num = $this->db->num_rows($resql);
+ $i = 0;
+ while ($i < ($limit ? min($limit, $num) : $num)) {
+ $obj = $this->db->fetch_object($resql);
+
+ $record = new self($this->db);
+ $record->setVarsFromFetchObj($obj);
+
+ $records[$record->id] = $record;
+
+ $i++;
+ }
+ $this->db->free($resql);
+
+ return $records;
+ } else {
+ $this->errors[] = 'Error '.$this->db->lasterror();
+ dol_syslog(__METHOD__.' '.join(',', $this->errors), LOG_ERR);
+
+ return -1;
+ }
+ }
+
+ /**
+ * Update object into database
+ *
+ * @param User $user User that modifies
+ * @param bool $notrigger false=launch triggers after, true=disable triggers
+ * @return int <0 if KO, >0 if OK
+ */
+ public function update(User $user, $notrigger = false)
+ {
+ return $this->updateCommon($user, $notrigger);
+ }
+
+ /**
+ * Delete object in database
+ *
+ * @param User $user User that deletes
+ * @param bool $notrigger false=launch triggers after, true=disable triggers
+ * @return int <0 if KO, >0 if OK
+ */
+ public function delete(User $user, $notrigger = false)
+ {
+ return $this->deleteCommon($user, $notrigger);
+ //return $this->deleteCommon($user, $notrigger, 1);
+ }
+
+ /**
+ * Delete a line of object in database
+ *
+ * @param User $user User that delete
+ * @param int $idline Id of line to delete
+ * @param bool $notrigger false=launch triggers after, true=disable triggers
+ * @return int >0 if OK, <0 if KO
+ */
+ public function deleteLine(User $user, $idline, $notrigger = false)
+ {
+ if ($this->status < 0) {
+ $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus';
+ return -2;
+ }
+
+ return $this->deleteLineCommon($user, $idline, $notrigger);
+ }
+
+
+ /**
+ * Validate object
+ *
+ * @param User $user User making status change
+ * @param int $notrigger 1=Does not execute triggers, 0= execute triggers
+ * @return int <=0 if OK, 0=Nothing done, >0 if KO
+ */
+ public function validate($user, $notrigger = 0)
+ {
+ global $conf, $langs;
+
+ require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+
+ $error = 0;
+
+ // Protection
+ if ($this->status == self::STATUS_VALIDATED) {
+ dol_syslog(get_class($this)."::validate action abandonned: already validated", LOG_WARNING);
+ return 0;
+ }
+
+ /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bookcal->availabilities->write))
+ || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bookcal->availabilities->availabilities_advance->validate))))
+ {
+ $this->error='NotEnoughPermissions';
+ dol_syslog(get_class($this)."::valid ".$this->error, LOG_ERR);
+ return -1;
+ }*/
+
+ $now = dol_now();
+
+ $this->db->begin();
+
+ // Define new ref
+ if (!$error && (preg_match('/^[\(]?PROV/i', $this->ref) || empty($this->ref))) { // empty should not happened, but when it occurs, the test save life
+ $num = $this->getNextNumRef();
+ } else {
+ $num = $this->ref;
+ }
+ $this->newref = $num;
+
+ if (!empty($num)) {
+ // Validate
+ $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
+ $sql .= " SET ref = '".$this->db->escape($num)."',";
+ $sql .= " status = ".self::STATUS_VALIDATED;
+ if (!empty($this->fields['date_validation'])) {
+ $sql .= ", date_validation = '".$this->db->idate($now)."'";
+ }
+ if (!empty($this->fields['fk_user_valid'])) {
+ $sql .= ", fk_user_valid = ".((int) $user->id);
+ }
+ $sql .= " WHERE rowid = ".((int) $this->id);
+
+ dol_syslog(get_class($this)."::validate()", LOG_DEBUG);
+ $resql = $this->db->query($sql);
+ if (!$resql) {
+ dol_print_error($this->db);
+ $this->error = $this->db->lasterror();
+ $error++;
+ }
+
+ if (!$error && !$notrigger) {
+ // Call trigger
+ $result = $this->call_trigger('AVAILABILITIES_VALIDATE', $user);
+ if ($result < 0) {
+ $error++;
+ }
+ // End call triggers
+ }
+ }
+
+ if (!$error) {
+ $this->oldref = $this->ref;
+
+ // Rename directory if dir was a temporary ref
+ if (preg_match('/^[\(]?PROV/i', $this->ref)) {
+ // Now we rename also files into index
+ $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filename = CONCAT('".$this->db->escape($this->newref)."', SUBSTR(filename, ".(strlen($this->ref) + 1).")), filepath = 'availabilities/".$this->db->escape($this->newref)."'";
+ $sql .= " WHERE filename LIKE '".$this->db->escape($this->ref)."%' AND filepath = 'availabilities/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
+ $resql = $this->db->query($sql);
+ if (!$resql) {
+ $error++; $this->error = $this->db->lasterror();
+ }
+
+ // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
+ $oldref = dol_sanitizeFileName($this->ref);
+ $newref = dol_sanitizeFileName($num);
+ $dirsource = $conf->bookcal->dir_output.'/availabilities/'.$oldref;
+ $dirdest = $conf->bookcal->dir_output.'/availabilities/'.$newref;
+ if (!$error && file_exists($dirsource)) {
+ dol_syslog(get_class($this)."::validate() rename dir ".$dirsource." into ".$dirdest);
+
+ if (@rename($dirsource, $dirdest)) {
+ dol_syslog("Rename ok");
+ // Rename docs starting with $oldref with $newref
+ $listoffiles = dol_dir_list($conf->bookcal->dir_output.'/availabilities/'.$newref, 'files', 1, '^'.preg_quote($oldref, '/'));
+ foreach ($listoffiles as $fileentry) {
+ $dirsource = $fileentry['name'];
+ $dirdest = preg_replace('/^'.preg_quote($oldref, '/').'/', $newref, $dirsource);
+ $dirsource = $fileentry['path'].'/'.$dirsource;
+ $dirdest = $fileentry['path'].'/'.$dirdest;
+ @rename($dirsource, $dirdest);
+ }
+ }
+ }
+ }
+ }
+
+ // Set new ref and current status
+ if (!$error) {
+ $this->ref = $num;
+ $this->status = self::STATUS_VALIDATED;
+ }
+
+ if (!$error) {
+ $this->db->commit();
+ return 1;
+ } else {
+ $this->db->rollback();
+ return -1;
+ }
+ }
+
+
+ /**
+ * Set draft status
+ *
+ * @param User $user Object user that modify
+ * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers
+ * @return int <0 if KO, >0 if OK
+ */
+ public function setDraft($user, $notrigger = 0)
+ {
+ // Protection
+ if ($this->status <= self::STATUS_DRAFT) {
+ return 0;
+ }
+
+ /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bookcal->write))
+ || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bookcal->bookcal_advance->validate))))
+ {
+ $this->error='Permission denied';
+ return -1;
+ }*/
+
+ return $this->setStatusCommon($user, self::STATUS_DRAFT, $notrigger, 'AVAILABILITIES_UNVALIDATE');
+ }
+
+ /**
+ * Set cancel status
+ *
+ * @param User $user Object user that modify
+ * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers
+ * @return int <0 if KO, 0=Nothing done, >0 if OK
+ */
+ public function cancel($user, $notrigger = 0)
+ {
+ // Protection
+ if ($this->status != self::STATUS_VALIDATED) {
+ return 0;
+ }
+
+ /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bookcal->write))
+ || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bookcal->bookcal_advance->validate))))
+ {
+ $this->error='Permission denied';
+ return -1;
+ }*/
+
+ return $this->setStatusCommon($user, self::STATUS_CANCELED, $notrigger, 'AVAILABILITIES_CANCEL');
+ }
+
+ /**
+ * Set back to validated status
+ *
+ * @param User $user Object user that modify
+ * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers
+ * @return int <0 if KO, 0=Nothing done, >0 if OK
+ */
+ public function reopen($user, $notrigger = 0)
+ {
+ // Protection
+ if ($this->status != self::STATUS_CANCELED) {
+ return 0;
+ }
+
+ /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bookcal->write))
+ || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bookcal->bookcal_advance->validate))))
+ {
+ $this->error='Permission denied';
+ return -1;
+ }*/
+
+ return $this->setStatusCommon($user, self::STATUS_VALIDATED, $notrigger, 'AVAILABILITIES_REOPEN');
+ }
+
+ /**
+ * Return a link to the object card (with optionaly the picto)
+ *
+ * @param int $withpicto Include picto in link (0=No picto, 1=Include picto into link, 2=Only picto)
+ * @param string $option On what the link point to ('nolink', ...)
+ * @param int $notooltip 1=Disable tooltip
+ * @param string $morecss Add more css on link
+ * @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking
+ * @return string String with URL
+ */
+ public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
+ {
+ global $conf, $langs, $hookmanager;
+
+ if (!empty($conf->dol_no_mouse_hover)) {
+ $notooltip = 1; // Force disable tooltips
+ }
+
+ $result = '';
+
+ $label = img_picto('', $this->picto).' '.$langs->trans("Availabilities").' ';
+ if (isset($this->status)) {
+ $label .= ' '.$this->getLibStatut(5);
+ }
+ $label .= ' ';
+ $label .= ''.$langs->trans('Ref').': '.$this->ref;
+
+ $url = dol_buildpath('/bookcal/availabilities_card.php', 1).'?id='.$this->id;
+
+ if ($option != 'nolink') {
+ // Add param to save lastsearch_values or not
+ $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
+ if ($save_lastsearch_value == -1 && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
+ $add_save_lastsearch_values = 1;
+ }
+ if ($url && $add_save_lastsearch_values) {
+ $url .= '&save_lastsearch_values=1';
+ }
+ }
+
+ $linkclose = '';
+ if (empty($notooltip)) {
+ if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
+ $label = $langs->trans("ShowAvailabilities");
+ $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
+ }
+ $linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
+ $linkclose .= ' class="classfortooltip'.($morecss ? ' '.$morecss : '').'"';
+ } else {
+ $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
+ }
+
+ if ($option == 'nolink' || empty($url)) {
+ $linkstart = '';
+ if ($option == 'nolink' || empty($url)) {
+ $linkend = ' ';
+ } else {
+ $linkend = '';
+ }
+
+ $result .= $linkstart;
+
+ if (empty($this->showphoto_on_popup)) {
+ if ($withpicto) {
+ $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'generic'), ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
+ }
+ } else {
+ if ($withpicto) {
+ require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+
+ list($class, $module) = explode('@', $this->picto);
+ $upload_dir = $conf->$module->multidir_output[$conf->entity]."/$class/".dol_sanitizeFileName($this->ref);
+ $filearray = dol_dir_list($upload_dir, "files");
+ $filename = $filearray[0]['name'];
+ if (!empty($filename)) {
+ $pospoint = strpos($filearray[0]['name'], '.');
+
+ $pathtophoto = $class.'/'.$this->ref.'/thumbs/'.substr($filename, 0, $pospoint).'_mini'.substr($filename, $pospoint);
+ if (empty($conf->global->{strtoupper($module.'_'.$class).'_FORMATLISTPHOTOSASUSERS'})) {
+ $result .= '';
+ } else {
+ $result .= ' ';
+ }
+
+ $result .= '';
+ } else {
+ $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'generic'), ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
+ }
+ }
+ }
+
+ if ($withpicto != 2) {
+ $result .= $this->ref;
+ }
+
+ $result .= $linkend;
+ //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
+
+ global $action, $hookmanager;
+ $hookmanager->initHooks(array('availabilitiesdao'));
+ $parameters = array('id'=>$this->id, 'getnomurl' => &$result);
+ $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
+ if ($reshook > 0) {
+ $result = $hookmanager->resPrint;
+ } else {
+ $result .= $hookmanager->resPrint;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Return the label of the status
+ *
+ * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto
+ * @return string Label of status
+ */
+ public function getLabelStatus($mode = 0)
+ {
+ return $this->LibStatut($this->status, $mode);
+ }
+
+ /**
+ * Return the label of the status
+ *
+ * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto
+ * @return string Label of status
+ */
+ public function getLibStatut($mode = 0)
+ {
+ return $this->LibStatut($this->status, $mode);
+ }
+
+ // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
+ /**
+ * Return the status
+ *
+ * @param int $status Id status
+ * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto
+ * @return string Label of status
+ */
+ public function LibStatut($status, $mode = 0)
+ {
+ // phpcs:enable
+ if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
+ global $langs;
+ //$langs->load("bookcal@bookcal");
+ $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
+ $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
+ $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
+ $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
+ $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
+ $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
+ }
+
+ $statusType = 'status'.$status;
+ //if ($status == self::STATUS_VALIDATED) $statusType = 'status1';
+ if ($status == self::STATUS_CANCELED) {
+ $statusType = 'status6';
+ }
+
+ return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode);
+ }
+
+ /**
+ * Load the info information in the object
+ *
+ * @param int $id Id of object
+ * @return void
+ */
+ public function info($id)
+ {
+ $sql = "SELECT rowid,";
+ $sql .= " date_creation as datec, tms as datem,";
+ $sql .= " fk_user_creat, fk_user_modif";
+ $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t";
+ $sql .= " WHERE t.rowid = ".((int) $id);
+
+ $result = $this->db->query($sql);
+ if ($result) {
+ if ($this->db->num_rows($result)) {
+ $obj = $this->db->fetch_object($result);
+
+ $this->id = $obj->rowid;
+
+ $this->user_creation_id = $obj->fk_user_creat;
+ $this->user_modification_id = $obj->fk_user_modif;
+ if (!empty($obj->fk_user_valid)) {
+ $this->user_validation_id = $obj->fk_user_valid;
+ }
+ $this->date_creation = $this->db->jdate($obj->datec);
+ $this->date_modification = empty($obj->datem) ? '' : $this->db->jdate($obj->datem);
+ if (!empty($obj->datev)) {
+ $this->date_validation = empty($obj->datev) ? '' : $this->db->jdate($obj->datev);
+ }
+ }
+
+ $this->db->free($result);
+ } else {
+ dol_print_error($this->db);
+ }
+ }
+
+ /**
+ * Initialise object with example values
+ * Id must be 0 if object instance is a specimen
+ *
+ * @return void
+ */
+ public function initAsSpecimen()
+ {
+ // Set here init that are not commonf fields
+ // $this->property1 = ...
+ // $this->property2 = ...
+
+ $this->initAsSpecimenCommon();
+ }
+
+ /**
+ * Create an array of lines
+ *
+ * @return array|int array of lines if OK, <0 if KO
+ */
+ public function getLinesArray()
+ {
+ $this->lines = array();
+
+ $objectline = new AvailabilitiesLine($this->db);
+ $result = $objectline->fetchAll('ASC', 'position', 0, 0, array('customsql'=>'fk_availabilities = '.((int) $this->id)));
+
+ if (is_numeric($result)) {
+ $this->error = $objectline->error;
+ $this->errors = $objectline->errors;
+ return $result;
+ } else {
+ $this->lines = $result;
+ return $this->lines;
+ }
+ }
+
+ /**
+ * Returns the reference to the following non used object depending on the active numbering module.
+ *
+ * @return string Object free reference
+ */
+ public function getNextNumRef()
+ {
+ global $langs, $conf;
+ $langs->load("bookcal@bookcal");
+
+ if (empty($conf->global->BOOKCAL_AVAILABILITIES_ADDON)) {
+ $conf->global->BOOKCAL_AVAILABILITIES_ADDON = 'mod_availabilities_standard';
+ }
+
+ if (!empty($conf->global->BOOKCAL_AVAILABILITIES_ADDON)) {
+ $mybool = false;
+
+ $file = $conf->global->BOOKCAL_AVAILABILITIES_ADDON.".php";
+ $classname = $conf->global->BOOKCAL_AVAILABILITIES_ADDON;
+
+ // Include file with class
+ $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
+ foreach ($dirmodels as $reldir) {
+ $dir = dol_buildpath($reldir."core/modules/bookcal/");
+
+ // Load file with numbering class (if found)
+ $mybool |= @include_once $dir.$file;
+ }
+
+ if ($mybool === false) {
+ dol_print_error('', "Failed to include file ".$file);
+ return '';
+ }
+
+ if (class_exists($classname)) {
+ $obj = new $classname();
+ $numref = $obj->getNextValue($this);
+
+ if ($numref != '' && $numref != '-1') {
+ return $numref;
+ } else {
+ $this->error = $obj->error;
+ //dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error);
+ return "";
+ }
+ } else {
+ print $langs->trans("Error")." ".$langs->trans("ClassNotFound").' '.$classname;
+ return "";
+ }
+ } else {
+ print $langs->trans("ErrorNumberingModuleNotSetup", $this->element);
+ return "";
+ }
+ }
+
+ /**
+ * Create a document onto disk according to template module.
+ *
+ * @param string $modele Force template to use ('' to not force)
+ * @param Translate $outputlangs objet lang a utiliser pour traduction
+ * @param int $hidedetails Hide details of lines
+ * @param int $hidedesc Hide description
+ * @param int $hideref Hide ref
+ * @param null|array $moreparams Array to provide more information
+ * @return int 0 if KO, 1 if OK
+ */
+ public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
+ {
+ global $conf, $langs;
+
+ $result = 0;
+ $includedocgeneration = 0;
+
+ $langs->load("bookcal@bookcal");
+
+ if (!dol_strlen($modele)) {
+ $modele = 'standard_availabilities';
+
+ if (!empty($this->model_pdf)) {
+ $modele = $this->model_pdf;
+ } elseif (!empty($conf->global->AVAILABILITIES_ADDON_PDF)) {
+ $modele = $conf->global->AVAILABILITIES_ADDON_PDF;
+ }
+ }
+
+ $modelpath = "core/modules/bookcal/doc/";
+
+ if ($includedocgeneration && !empty($modele)) {
+ $result = $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
+ }
+
+ return $result;
+ }
+
+ /**
+ * Action executed by scheduler
+ * CAN BE A CRON TASK. In such a case, parameters come from the schedule job setup field 'Parameters'
+ * Use public function doScheduledJob($param1, $param2, ...) to get parameters
+ *
+ * @return int 0 if OK, <>0 if KO (this function is used also by cron so only 0 is OK)
+ */
+ public function doScheduledJob()
+ {
+ global $conf, $langs;
+
+ //$conf->global->SYSLOG_FILE = 'DOL_DATA_ROOT/dolibarr_mydedicatedlofile.log';
+
+ $error = 0;
+ $this->output = '';
+ $this->error = '';
+
+ dol_syslog(__METHOD__, LOG_DEBUG);
+
+ $now = dol_now();
+
+ $this->db->begin();
+
+ // ...
+
+ $this->db->commit();
+
+ return $error;
+ }
+}
+
+
+require_once DOL_DOCUMENT_ROOT.'/core/class/commonobjectline.class.php';
+
+/**
+ * Class AvailabilitiesLine. You can also remove this and generate a CRUD class for lines objects.
+ */
+class AvailabilitiesLine extends CommonObjectLine
+{
+ // To complete with content of an object AvailabilitiesLine
+ // We should have a field rowid, fk_availabilities and position
+
+ /**
+ * @var int Does object support extrafields ? 0=No, 1=Yes
+ */
+ public $isextrafieldmanaged = 0;
+
+ /**
+ * Constructor
+ *
+ * @param DoliDb $db Database handler
+ */
+ public function __construct(DoliDB $db)
+ {
+ $this->db = $db;
+ }
+}
diff --git a/htdocs/bookcal/class/booking.class.php b/htdocs/bookcal/class/booking.class.php
new file mode 100644
index 00000000000..a74cb87a43d
--- /dev/null
+++ b/htdocs/bookcal/class/booking.class.php
@@ -0,0 +1,1089 @@
+
+ * Copyright (C) 2022 Alice Adminson
+ *
+ * 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 .
+ */
+
+/**
+ * \file class/booking.class.php
+ * \ingroup bookcal
+ * \brief This file is a CRUD class file for Booking (Create/Read/Update/Delete)
+ */
+
+// Put here all includes required by your class file
+require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
+//require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
+//require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php';
+
+/**
+ * Class for Booking
+ */
+class Booking extends CommonObject
+{
+ /**
+ * @var string ID of module.
+ */
+ public $module = 'bookcal';
+
+ /**
+ * @var string ID to identify managed object.
+ */
+ public $element = 'booking';
+
+ /**
+ * @var string Name of table without prefix where object is stored. This is also the key used for extrafields management.
+ */
+ public $table_element = 'bookcal_booking';
+
+ /**
+ * @var int Does this object support multicompany module ?
+ * 0=No test on entity, 1=Test with field entity, 'field@table'=Test with link by field@table
+ */
+ public $ismultientitymanaged = 0;
+
+ /**
+ * @var int Does object support extrafields ? 0=No, 1=Yes
+ */
+ public $isextrafieldmanaged = 1;
+
+ /**
+ * @var string String with name of icon for booking. Must be a 'fa-xxx' fontawesome code (or 'fa-xxx_fa_color_size') or 'booking@bookcal' if picto is file 'img/object_booking.png'.
+ */
+ public $picto = 'fa-file';
+
+
+ const STATUS_DRAFT = 0;
+ const STATUS_VALIDATED = 1;
+ const STATUS_CANCELED = 9;
+
+
+ /**
+ * 'type' field format ('integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortfield]]]', 'sellist:TableName:LabelFieldName[:KeyFieldName[:KeyFieldParent[:Filter[:Sortfield]]]]', 'varchar(x)', 'double(24,8)', 'real', 'price', 'text', 'text:none', 'html', 'date', 'datetime', 'timestamp', 'duration', 'mail', 'phone', 'url', 'password')
+ * Note: Filter can be a string like "(t.ref:like:'SO-%') or (t.date_creation:<:'20160101') or (t.nature:is:NULL)"
+ * 'label' the translation key.
+ * 'picto' is code of a picto to show before value in forms
+ * 'enabled' is a condition when the field must be managed (Example: 1 or '$conf->global->MY_SETUP_PARAM' or '!empty($conf->multicurrency->enabled)' ...)
+ * 'position' is the sort order of field.
+ * 'notnull' is set to 1 if not null in database. Set to -1 if we must set data to null if empty ('' or 0).
+ * 'visible' says if field is visible in list (Examples: 0=Not visible, 1=Visible on list and create/update/view forms, 2=Visible on list only, 3=Visible on create/update/view form only (not list), 4=Visible on list and update/view form only (not create). 5=Visible on list and view only (not create/not update). Using a negative value means field is not shown by default on list but can be selected for viewing)
+ * 'noteditable' says if field is not editable (1 or 0)
+ * 'default' is a default value for creation (can still be overwrote by the Setup of Default Values if field is editable in creation form). Note: If default is set to '(PROV)' and field is 'ref', the default value will be set to '(PROVid)' where id is rowid when a new record is created.
+ * 'index' if we want an index in database.
+ * 'foreignkey'=>'tablename.field' if the field is a foreign key (it is recommanded to name the field fk_...).
+ * 'searchall' is 1 if we want to search in this field when making a search from the quick search button.
+ * 'isameasure' must be set to 1 or 2 if field can be used for measure. Field type must be summable like integer or double(24,8). Use 1 in most cases, or 2 if you don't want to see the column total into list (for example for percentage)
+ * 'css' and 'cssview' and 'csslist' is the CSS style to use on field. 'css' is used in creation and update. 'cssview' is used in view mode. 'csslist' is used for columns in lists. For example: 'css'=>'minwidth300 maxwidth500 widthcentpercentminusx', 'cssview'=>'wordbreak', 'csslist'=>'tdoverflowmax200'
+ * 'help' is a 'TranslationString' to use to show a tooltip on field. You can also use 'TranslationString:keyfortooltiponlick' for a tooltip on click.
+ * 'showoncombobox' if value of the field must be visible into the label of the combobox that list record
+ * 'disabled' is 1 if we want to have the field locked by a 'disabled' attribute. In most cases, this is never set into the definition of $fields into class, but is set dynamically by some part of code.
+ * 'arrayofkeyval' to set a list of values if type is a list of predefined values. For example: array("0"=>"Draft","1"=>"Active","-1"=>"Cancel"). Note that type can be 'integer' or 'varchar'
+ * 'autofocusoncreate' to have field having the focus on a create form. Only 1 field should have this property set to 1.
+ * 'comment' is not used. You can store here any text of your choice. It is not used by application.
+ * 'validate' is 1 if need to validate with $this->validateField()
+ * 'copytoclipboard' is 1 or 2 to allow to add a picto to copy value into clipboard (1=picto after label, 2=picto after value)
+ *
+ * Note: To have value dynamic, you can set value to 0 in definition and edit the value on the fly into the constructor.
+ */
+
+ // BEGIN MODULEBUILDER PROPERTIES
+ /**
+ * @var array Array with all fields and their property. Do not use it as a static var. It may be modified by constructor.
+ */
+ public $fields=array(
+ 'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>0, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'comment'=>"Id"),
+ 'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>'1', 'position'=>1.2, 'notnull'=>1, 'visible'=>1, 'index'=>1, 'searchall'=>1, 'validate'=>'1', 'comment'=>"Reference of object"),
+ 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'ThirdParty', 'picto'=>'company', 'enabled'=>'$conf->societe->enabled', 'position'=>50, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'css'=>'maxwidth500 widthcentpercentminusxx', 'help'=>"LinkToThirparty", 'validate'=>'1',),
+ 'fk_project' => array('type'=>'integer:Project:projet/class/project.class.php:1', 'label'=>'Project', 'picto'=>'project', 'enabled'=>'$conf->project->enabled', 'position'=>52, 'notnull'=>-1, 'visible'=>-1, 'index'=>1, 'css'=>'maxwidth500 widthcentpercentminusxx', 'validate'=>'1',),
+ 'description' => array('type'=>'text', 'label'=>'Description', 'enabled'=>'1', 'position'=>60, 'notnull'=>0, 'visible'=>3, 'validate'=>'1',),
+ 'note_public' => array('type'=>'html', 'label'=>'NotePublic', 'enabled'=>'1', 'position'=>61, 'notnull'=>0, 'visible'=>0, 'cssview'=>'wordbreak', 'validate'=>'1',),
+ 'note_private' => array('type'=>'html', 'label'=>'NotePrivate', 'enabled'=>'1', 'position'=>62, 'notnull'=>0, 'visible'=>0, 'cssview'=>'wordbreak', 'validate'=>'1',),
+ 'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>'1', 'position'=>500, 'notnull'=>1, 'visible'=>-2,),
+ 'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>'1', 'position'=>501, 'notnull'=>0, 'visible'=>-2,),
+ 'fk_user_creat' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserAuthor', 'picto'=>'user', 'enabled'=>'1', 'position'=>510, 'notnull'=>1, 'visible'=>-2, 'foreignkey'=>'user.rowid',),
+ 'fk_user_modif' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'picto'=>'user', 'enabled'=>'1', 'position'=>511, 'notnull'=>-1, 'visible'=>-2,),
+ 'last_main_doc' => array('type'=>'varchar(255)', 'label'=>'LastMainDoc', 'enabled'=>'1', 'position'=>600, 'notnull'=>0, 'visible'=>0,),
+ 'import_key' => array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>'1', 'position'=>1000, 'notnull'=>-1, 'visible'=>-2,),
+ 'model_pdf' => array('type'=>'varchar(255)', 'label'=>'Model pdf', 'enabled'=>'1', 'position'=>1010, 'notnull'=>-1, 'visible'=>0,),
+ 'status' => array('type'=>'integer', 'label'=>'Status', 'enabled'=>'1', 'position'=>2000, 'notnull'=>1, 'visible'=>1, 'index'=>1, 'arrayofkeyval'=>array('0'=>'Draft', '1'=>'Validated', '9'=>'Canceled'), 'validate'=>'1',),
+ 'firstname' => array('type'=>'varchar(128)', 'label'=>'firstname', 'enabled'=>'1', 'position'=>2, 'notnull'=>1, 'visible'=>-1,),
+ 'lastname' => array('type'=>'varchar(128)', 'label'=>'lastname', 'enabled'=>'1', 'position'=>3, 'notnull'=>1, 'visible'=>-1,),
+ 'email' => array('type'=>'varchar(128)', 'label'=>'email', 'enabled'=>'1', 'position'=>4, 'notnull'=>1, 'visible'=>-1,),
+ 'start' => array('type'=>'datetime', 'label'=>'Start Hour', 'enabled'=>'1', 'position'=>5, 'notnull'=>1, 'visible'=>-1,),
+ 'duration' => array('type'=>'integer', 'label'=>'Duration', 'enabled'=>'1', 'position'=>6, 'notnull'=>1, 'visible'=>-1,),
+ );
+ public $rowid;
+ public $ref;
+ public $fk_soc;
+ public $fk_project;
+ public $description;
+ public $note_public;
+ public $note_private;
+ public $date_creation;
+ public $tms;
+ public $fk_user_creat;
+ public $fk_user_modif;
+ public $last_main_doc;
+ public $import_key;
+ public $model_pdf;
+ public $status;
+ public $firstname;
+ public $lastname;
+ public $email;
+ public $start;
+ public $duration;
+ // END MODULEBUILDER PROPERTIES
+
+
+ // If this object has a subtable with lines
+
+ // /**
+ // * @var string Name of subtable line
+ // */
+ // public $table_element_line = 'bookcal_bookingline';
+
+ // /**
+ // * @var string Field with ID of parent key if this object has a parent
+ // */
+ // public $fk_element = 'fk_booking';
+
+ // /**
+ // * @var string Name of subtable class that manage subtable lines
+ // */
+ // public $class_element_line = 'Bookingline';
+
+ // /**
+ // * @var array List of child tables. To test if we can delete object.
+ // */
+ // protected $childtables = array();
+
+ // /**
+ // * @var array List of child tables. To know object to delete on cascade.
+ // * If name matches '@ClassNAme:FilePathClass;ParentFkFieldName' it will
+ // * call method deleteByParentField(parentId, ParentFkFieldName) to fetch and delete child object
+ // */
+ // protected $childtablesoncascade = array('bookcal_bookingdet');
+
+ // /**
+ // * @var BookingLine[] Array of subtable lines
+ // */
+ // public $lines = array();
+
+
+
+ /**
+ * Constructor
+ *
+ * @param DoliDb $db Database handler
+ */
+ public function __construct(DoliDB $db)
+ {
+ global $conf, $langs;
+
+ $this->db = $db;
+
+ if (empty($conf->global->MAIN_SHOW_TECHNICAL_ID) && isset($this->fields['rowid']) && !empty($this->fields['ref'])) {
+ $this->fields['rowid']['visible'] = 0;
+ }
+ if (empty($conf->multicompany->enabled) && isset($this->fields['entity'])) {
+ $this->fields['entity']['enabled'] = 0;
+ }
+
+ // Example to show how to set values of fields definition dynamically
+ /*if ($user->rights->bookcal->booking->read) {
+ $this->fields['myfield']['visible'] = 1;
+ $this->fields['myfield']['noteditable'] = 0;
+ }*/
+
+ // Unset fields that are disabled
+ foreach ($this->fields as $key => $val) {
+ if (isset($val['enabled']) && empty($val['enabled'])) {
+ unset($this->fields[$key]);
+ }
+ }
+
+ // Translate some data of arrayofkeyval
+ if (is_object($langs)) {
+ foreach ($this->fields as $key => $val) {
+ if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
+ foreach ($val['arrayofkeyval'] as $key2 => $val2) {
+ $this->fields[$key]['arrayofkeyval'][$key2] = $langs->trans($val2);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Create object into database
+ *
+ * @param User $user User that creates
+ * @param bool $notrigger false=launch triggers after, true=disable triggers
+ * @return int <0 if KO, Id of created object if OK
+ */
+ public function create(User $user, $notrigger = false)
+ {
+ $resultcreate = $this->createCommon($user, $notrigger);
+
+ //$resultvalidate = $this->validate($user, $notrigger);
+
+ return $resultcreate;
+ }
+
+ /**
+ * Clone an object into another one
+ *
+ * @param User $user User that creates
+ * @param int $fromid Id of object to clone
+ * @return mixed New object created, <0 if KO
+ */
+ public function createFromClone(User $user, $fromid)
+ {
+ global $langs, $extrafields;
+ $error = 0;
+
+ dol_syslog(__METHOD__, LOG_DEBUG);
+
+ $object = new self($this->db);
+
+ $this->db->begin();
+
+ // Load source object
+ $result = $object->fetchCommon($fromid);
+ if ($result > 0 && !empty($object->table_element_line)) {
+ $object->fetchLines();
+ }
+
+ // get lines so they will be clone
+ //foreach($this->lines as $line)
+ // $line->fetch_optionals();
+
+ // Reset some properties
+ unset($object->id);
+ unset($object->fk_user_creat);
+ unset($object->import_key);
+
+ // Clear fields
+ if (property_exists($object, 'ref')) {
+ $object->ref = empty($this->fields['ref']['default']) ? "Copy_Of_".$object->ref : $this->fields['ref']['default'];
+ }
+ if (property_exists($object, 'label')) {
+ $object->label = empty($this->fields['label']['default']) ? $langs->trans("CopyOf")." ".$object->label : $this->fields['label']['default'];
+ }
+ if (property_exists($object, 'status')) {
+ $object->status = self::STATUS_DRAFT;
+ }
+ if (property_exists($object, 'date_creation')) {
+ $object->date_creation = dol_now();
+ }
+ if (property_exists($object, 'date_modification')) {
+ $object->date_modification = null;
+ }
+ // ...
+ // Clear extrafields that are unique
+ if (is_array($object->array_options) && count($object->array_options) > 0) {
+ $extrafields->fetch_name_optionals_label($this->table_element);
+ foreach ($object->array_options as $key => $option) {
+ $shortkey = preg_replace('/options_/', '', $key);
+ if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) {
+ //var_dump($key);
+ //var_dump($clonedObj->array_options[$key]); exit;
+ unset($object->array_options[$key]);
+ }
+ }
+ }
+
+ // Create clone
+ $object->context['createfromclone'] = 'createfromclone';
+ $result = $object->createCommon($user);
+ if ($result < 0) {
+ $error++;
+ $this->error = $object->error;
+ $this->errors = $object->errors;
+ }
+
+ if (!$error) {
+ // copy internal contacts
+ if ($this->copy_linked_contact($object, 'internal') < 0) {
+ $error++;
+ }
+ }
+
+ if (!$error) {
+ // copy external contacts if same company
+ if (!empty($object->socid) && property_exists($this, 'fk_soc') && $this->fk_soc == $object->socid) {
+ if ($this->copy_linked_contact($object, 'external') < 0) {
+ $error++;
+ }
+ }
+ }
+
+ unset($object->context['createfromclone']);
+
+ // End
+ if (!$error) {
+ $this->db->commit();
+ return $object;
+ } else {
+ $this->db->rollback();
+ return -1;
+ }
+ }
+
+ /**
+ * Load object in memory from the database
+ *
+ * @param int $id Id object
+ * @param string $ref Ref
+ * @return int <0 if KO, 0 if not found, >0 if OK
+ */
+ public function fetch($id, $ref = null)
+ {
+ $result = $this->fetchCommon($id, $ref);
+ if ($result > 0 && !empty($this->table_element_line)) {
+ $this->fetchLines();
+ }
+ return $result;
+ }
+
+ /**
+ * Load object lines in memory from the database
+ *
+ * @return int <0 if KO, 0 if not found, >0 if OK
+ */
+ public function fetchLines()
+ {
+ $this->lines = array();
+
+ $result = $this->fetchLinesCommon();
+ return $result;
+ }
+
+
+ /**
+ * Load list of objects in memory from the database.
+ *
+ * @param string $sortorder Sort Order
+ * @param string $sortfield Sort field
+ * @param int $limit limit
+ * @param int $offset Offset
+ * @param array $filter Filter array. Example array('field'=>'valueforlike', 'customurl'=>...)
+ * @param string $filtermode Filter mode (AND or OR)
+ * @return array|int int <0 if KO, array of pages if OK
+ */
+ public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND')
+ {
+ global $conf;
+
+ dol_syslog(__METHOD__, LOG_DEBUG);
+
+ $records = array();
+
+ $sql = "SELECT ";
+ $sql .= $this->getFieldList('t');
+ $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t";
+ if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
+ $sql .= " WHERE t.entity IN (".getEntity($this->element).")";
+ } else {
+ $sql .= " WHERE 1 = 1";
+ }
+ // Manage filter
+ $sqlwhere = array();
+ if (count($filter) > 0) {
+ foreach ($filter as $key => $value) {
+ if ($key == 't.rowid') {
+ $sqlwhere[] = $key." = ".((int) $value);
+ } elseif (in_array($this->fields[$key]['type'], array('date', 'datetime', 'timestamp'))) {
+ $sqlwhere[] = $key." = '".$this->db->idate($value)."'";
+ } elseif ($key == 'customsql') {
+ $sqlwhere[] = $value;
+ } elseif (strpos($value, '%') === false) {
+ $sqlwhere[] = $key." IN (".$this->db->sanitize($this->db->escape($value)).")";
+ } else {
+ $sqlwhere[] = $key." LIKE '%".$this->db->escape($value)."%'";
+ }
+ }
+ }
+ if (count($sqlwhere) > 0) {
+ $sql .= " AND (".implode(" ".$filtermode." ", $sqlwhere).")";
+ }
+
+ if (!empty($sortfield)) {
+ $sql .= $this->db->order($sortfield, $sortorder);
+ }
+ if (!empty($limit)) {
+ $sql .= $this->db->plimit($limit, $offset);
+ }
+
+ $resql = $this->db->query($sql);
+ if ($resql) {
+ $num = $this->db->num_rows($resql);
+ $i = 0;
+ while ($i < ($limit ? min($limit, $num) : $num)) {
+ $obj = $this->db->fetch_object($resql);
+
+ $record = new self($this->db);
+ $record->setVarsFromFetchObj($obj);
+
+ $records[$record->id] = $record;
+
+ $i++;
+ }
+ $this->db->free($resql);
+
+ return $records;
+ } else {
+ $this->errors[] = 'Error '.$this->db->lasterror();
+ dol_syslog(__METHOD__.' '.join(',', $this->errors), LOG_ERR);
+
+ return -1;
+ }
+ }
+
+ /**
+ * Update object into database
+ *
+ * @param User $user User that modifies
+ * @param bool $notrigger false=launch triggers after, true=disable triggers
+ * @return int <0 if KO, >0 if OK
+ */
+ public function update(User $user, $notrigger = false)
+ {
+ return $this->updateCommon($user, $notrigger);
+ }
+
+ /**
+ * Delete object in database
+ *
+ * @param User $user User that deletes
+ * @param bool $notrigger false=launch triggers after, true=disable triggers
+ * @return int <0 if KO, >0 if OK
+ */
+ public function delete(User $user, $notrigger = false)
+ {
+ return $this->deleteCommon($user, $notrigger);
+ //return $this->deleteCommon($user, $notrigger, 1);
+ }
+
+ /**
+ * Delete a line of object in database
+ *
+ * @param User $user User that delete
+ * @param int $idline Id of line to delete
+ * @param bool $notrigger false=launch triggers after, true=disable triggers
+ * @return int >0 if OK, <0 if KO
+ */
+ public function deleteLine(User $user, $idline, $notrigger = false)
+ {
+ if ($this->status < 0) {
+ $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus';
+ return -2;
+ }
+
+ return $this->deleteLineCommon($user, $idline, $notrigger);
+ }
+
+
+ /**
+ * Validate object
+ *
+ * @param User $user User making status change
+ * @param int $notrigger 1=Does not execute triggers, 0= execute triggers
+ * @return int <=0 if OK, 0=Nothing done, >0 if KO
+ */
+ public function validate($user, $notrigger = 0)
+ {
+ global $conf, $langs;
+
+ require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+
+ $error = 0;
+
+ // Protection
+ if ($this->status == self::STATUS_VALIDATED) {
+ dol_syslog(get_class($this)."::validate action abandonned: already validated", LOG_WARNING);
+ return 0;
+ }
+
+ /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bookcal->booking->write))
+ || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bookcal->booking->booking_advance->validate))))
+ {
+ $this->error='NotEnoughPermissions';
+ dol_syslog(get_class($this)."::valid ".$this->error, LOG_ERR);
+ return -1;
+ }*/
+
+ $now = dol_now();
+
+ $this->db->begin();
+
+ // Define new ref
+ if (!$error && (preg_match('/^[\(]?PROV/i', $this->ref) || empty($this->ref))) { // empty should not happened, but when it occurs, the test save life
+ $num = $this->getNextNumRef();
+ } else {
+ $num = $this->ref;
+ }
+ $this->newref = $num;
+
+ if (!empty($num)) {
+ // Validate
+ $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
+ $sql .= " SET ref = '".$this->db->escape($num)."',";
+ $sql .= " status = ".self::STATUS_VALIDATED;
+ if (!empty($this->fields['date_validation'])) {
+ $sql .= ", date_validation = '".$this->db->idate($now)."'";
+ }
+ if (!empty($this->fields['fk_user_valid'])) {
+ $sql .= ", fk_user_valid = ".((int) $user->id);
+ }
+ $sql .= " WHERE rowid = ".((int) $this->id);
+
+ dol_syslog(get_class($this)."::validate()", LOG_DEBUG);
+ $resql = $this->db->query($sql);
+ if (!$resql) {
+ dol_print_error($this->db);
+ $this->error = $this->db->lasterror();
+ $error++;
+ }
+
+ if (!$error && !$notrigger) {
+ // Call trigger
+ $result = $this->call_trigger('BOOKING_VALIDATE', $user);
+ if ($result < 0) {
+ $error++;
+ }
+ // End call triggers
+ }
+ }
+
+ if (!$error) {
+ $this->oldref = $this->ref;
+
+ // Rename directory if dir was a temporary ref
+ if (preg_match('/^[\(]?PROV/i', $this->ref)) {
+ // Now we rename also files into index
+ $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filename = CONCAT('".$this->db->escape($this->newref)."', SUBSTR(filename, ".(strlen($this->ref) + 1).")), filepath = 'booking/".$this->db->escape($this->newref)."'";
+ $sql .= " WHERE filename LIKE '".$this->db->escape($this->ref)."%' AND filepath = 'booking/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
+ $resql = $this->db->query($sql);
+ if (!$resql) {
+ $error++; $this->error = $this->db->lasterror();
+ }
+
+ // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
+ $oldref = dol_sanitizeFileName($this->ref);
+ $newref = dol_sanitizeFileName($num);
+ $dirsource = $conf->bookcal->dir_output.'/booking/'.$oldref;
+ $dirdest = $conf->bookcal->dir_output.'/booking/'.$newref;
+ if (!$error && file_exists($dirsource)) {
+ dol_syslog(get_class($this)."::validate() rename dir ".$dirsource." into ".$dirdest);
+
+ if (@rename($dirsource, $dirdest)) {
+ dol_syslog("Rename ok");
+ // Rename docs starting with $oldref with $newref
+ $listoffiles = dol_dir_list($conf->bookcal->dir_output.'/booking/'.$newref, 'files', 1, '^'.preg_quote($oldref, '/'));
+ foreach ($listoffiles as $fileentry) {
+ $dirsource = $fileentry['name'];
+ $dirdest = preg_replace('/^'.preg_quote($oldref, '/').'/', $newref, $dirsource);
+ $dirsource = $fileentry['path'].'/'.$dirsource;
+ $dirdest = $fileentry['path'].'/'.$dirdest;
+ @rename($dirsource, $dirdest);
+ }
+ }
+ }
+ }
+ }
+
+ // Set new ref and current status
+ if (!$error) {
+ $this->ref = $num;
+ $this->status = self::STATUS_VALIDATED;
+ }
+
+ if (!$error) {
+ $this->db->commit();
+ return 1;
+ } else {
+ $this->db->rollback();
+ return -1;
+ }
+ }
+
+
+ /**
+ * Set draft status
+ *
+ * @param User $user Object user that modify
+ * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers
+ * @return int <0 if KO, >0 if OK
+ */
+ public function setDraft($user, $notrigger = 0)
+ {
+ // Protection
+ if ($this->status <= self::STATUS_DRAFT) {
+ return 0;
+ }
+
+ /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bookcal->write))
+ || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bookcal->bookcal_advance->validate))))
+ {
+ $this->error='Permission denied';
+ return -1;
+ }*/
+
+ return $this->setStatusCommon($user, self::STATUS_DRAFT, $notrigger, 'BOOKING_UNVALIDATE');
+ }
+
+ /**
+ * Set cancel status
+ *
+ * @param User $user Object user that modify
+ * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers
+ * @return int <0 if KO, 0=Nothing done, >0 if OK
+ */
+ public function cancel($user, $notrigger = 0)
+ {
+ // Protection
+ if ($this->status != self::STATUS_VALIDATED) {
+ return 0;
+ }
+
+ /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bookcal->write))
+ || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bookcal->bookcal_advance->validate))))
+ {
+ $this->error='Permission denied';
+ return -1;
+ }*/
+
+ return $this->setStatusCommon($user, self::STATUS_CANCELED, $notrigger, 'BOOKING_CANCEL');
+ }
+
+ /**
+ * Set back to validated status
+ *
+ * @param User $user Object user that modify
+ * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers
+ * @return int <0 if KO, 0=Nothing done, >0 if OK
+ */
+ public function reopen($user, $notrigger = 0)
+ {
+ // Protection
+ if ($this->status != self::STATUS_CANCELED) {
+ return 0;
+ }
+
+ /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bookcal->write))
+ || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bookcal->bookcal_advance->validate))))
+ {
+ $this->error='Permission denied';
+ return -1;
+ }*/
+
+ return $this->setStatusCommon($user, self::STATUS_VALIDATED, $notrigger, 'BOOKING_REOPEN');
+ }
+
+ /**
+ * Return a link to the object card (with optionaly the picto)
+ *
+ * @param int $withpicto Include picto in link (0=No picto, 1=Include picto into link, 2=Only picto)
+ * @param string $option On what the link point to ('nolink', ...)
+ * @param int $notooltip 1=Disable tooltip
+ * @param string $morecss Add more css on link
+ * @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking
+ * @return string String with URL
+ */
+ public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
+ {
+ global $conf, $langs, $hookmanager;
+
+ if (!empty($conf->dol_no_mouse_hover)) {
+ $notooltip = 1; // Force disable tooltips
+ }
+
+ $result = '';
+
+ $label = img_picto('', $this->picto).' '.$langs->trans("Booking").' ';
+ if (isset($this->status)) {
+ $label .= ' '.$this->getLibStatut(5);
+ }
+ $label .= ' ';
+ $label .= ''.$langs->trans('Ref').': '.$this->ref;
+
+ $url = dol_buildpath('/bookcal/booking_card.php', 1).'?id='.$this->id;
+
+ if ($option != 'nolink') {
+ // Add param to save lastsearch_values or not
+ $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
+ if ($save_lastsearch_value == -1 && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
+ $add_save_lastsearch_values = 1;
+ }
+ if ($url && $add_save_lastsearch_values) {
+ $url .= '&save_lastsearch_values=1';
+ }
+ }
+
+ $linkclose = '';
+ if (empty($notooltip)) {
+ if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
+ $label = $langs->trans("ShowBooking");
+ $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
+ }
+ $linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
+ $linkclose .= ' class="classfortooltip'.($morecss ? ' '.$morecss : '').'"';
+ } else {
+ $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
+ }
+
+ if ($option == 'nolink' || empty($url)) {
+ $linkstart = '';
+ if ($option == 'nolink' || empty($url)) {
+ $linkend = ' ';
+ } else {
+ $linkend = '';
+ }
+
+ $result .= $linkstart;
+
+ if (empty($this->showphoto_on_popup)) {
+ if ($withpicto) {
+ $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'generic'), ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
+ }
+ } else {
+ if ($withpicto) {
+ require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+
+ list($class, $module) = explode('@', $this->picto);
+ $upload_dir = $conf->$module->multidir_output[$conf->entity]."/$class/".dol_sanitizeFileName($this->ref);
+ $filearray = dol_dir_list($upload_dir, "files");
+ $filename = $filearray[0]['name'];
+ if (!empty($filename)) {
+ $pospoint = strpos($filearray[0]['name'], '.');
+
+ $pathtophoto = $class.'/'.$this->ref.'/thumbs/'.substr($filename, 0, $pospoint).'_mini'.substr($filename, $pospoint);
+ if (empty($conf->global->{strtoupper($module.'_'.$class).'_FORMATLISTPHOTOSASUSERS'})) {
+ $result .= '';
+ } else {
+ $result .= '';
+ }
+
+ $result .= '';
+ } else {
+ $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'generic'), ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
+ }
+ }
+ }
+
+ if ($withpicto != 2) {
+ $result .= $this->ref;
+ }
+
+ $result .= $linkend;
+ //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
+
+ global $action, $hookmanager;
+ $hookmanager->initHooks(array('bookingdao'));
+ $parameters = array('id'=>$this->id, 'getnomurl' => &$result);
+ $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
+ if ($reshook > 0) {
+ $result = $hookmanager->resPrint;
+ } else {
+ $result .= $hookmanager->resPrint;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Return the label of the status
+ *
+ * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto
+ * @return string Label of status
+ */
+ public function getLabelStatus($mode = 0)
+ {
+ return $this->LibStatut($this->status, $mode);
+ }
+
+ /**
+ * Return the label of the status
+ *
+ * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto
+ * @return string Label of status
+ */
+ public function getLibStatut($mode = 0)
+ {
+ return $this->LibStatut($this->status, $mode);
+ }
+
+ // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
+ /**
+ * Return the status
+ *
+ * @param int $status Id status
+ * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto
+ * @return string Label of status
+ */
+ public function LibStatut($status, $mode = 0)
+ {
+ // phpcs:enable
+ if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
+ global $langs;
+ //$langs->load("bookcal@bookcal");
+ $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
+ $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
+ $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
+ $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
+ $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
+ $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
+ }
+
+ $statusType = 'status'.$status;
+ //if ($status == self::STATUS_VALIDATED) $statusType = 'status1';
+ if ($status == self::STATUS_CANCELED) {
+ $statusType = 'status6';
+ }
+
+ return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode);
+ }
+
+ /**
+ * Load the info information in the object
+ *
+ * @param int $id Id of object
+ * @return void
+ */
+ public function info($id)
+ {
+ $sql = "SELECT rowid,";
+ $sql .= " date_creation as datec, tms as datem,";
+ $sql .= " fk_user_creat, fk_user_modif";
+ $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t";
+ $sql .= " WHERE t.rowid = ".((int) $id);
+
+ $result = $this->db->query($sql);
+ if ($result) {
+ if ($this->db->num_rows($result)) {
+ $obj = $this->db->fetch_object($result);
+
+ $this->id = $obj->rowid;
+
+ $this->user_creation_id = $obj->fk_user_creat;
+ $this->user_modification_id = $obj->fk_user_modif;
+ if (!empty($obj->fk_user_valid)) {
+ $this->user_validation_id = $obj->fk_user_valid;
+ }
+ $this->date_creation = $this->db->jdate($obj->datec);
+ $this->date_modification = empty($obj->datem) ? '' : $this->db->jdate($obj->datem);
+ if (!empty($obj->datev)) {
+ $this->date_validation = empty($obj->datev) ? '' : $this->db->jdate($obj->datev);
+ }
+ }
+
+ $this->db->free($result);
+ } else {
+ dol_print_error($this->db);
+ }
+ }
+
+ /**
+ * Initialise object with example values
+ * Id must be 0 if object instance is a specimen
+ *
+ * @return void
+ */
+ public function initAsSpecimen()
+ {
+ // Set here init that are not commonf fields
+ // $this->property1 = ...
+ // $this->property2 = ...
+
+ $this->initAsSpecimenCommon();
+ }
+
+ /**
+ * Create an array of lines
+ *
+ * @return array|int array of lines if OK, <0 if KO
+ */
+ public function getLinesArray()
+ {
+ $this->lines = array();
+
+ $objectline = new BookingLine($this->db);
+ $result = $objectline->fetchAll('ASC', 'position', 0, 0, array('customsql'=>'fk_booking = '.((int) $this->id)));
+
+ if (is_numeric($result)) {
+ $this->error = $objectline->error;
+ $this->errors = $objectline->errors;
+ return $result;
+ } else {
+ $this->lines = $result;
+ return $this->lines;
+ }
+ }
+
+ /**
+ * Returns the reference to the following non used object depending on the active numbering module.
+ *
+ * @return string Object free reference
+ */
+ public function getNextNumRef()
+ {
+ global $langs, $conf;
+ $langs->load("bookcal@bookcal");
+
+ if (empty($conf->global->BOOKCAL_BOOKING_ADDON)) {
+ $conf->global->BOOKCAL_BOOKING_ADDON = 'mod_booking_standard';
+ }
+
+ if (!empty($conf->global->BOOKCAL_BOOKING_ADDON)) {
+ $mybool = false;
+
+ $file = $conf->global->BOOKCAL_BOOKING_ADDON.".php";
+ $classname = $conf->global->BOOKCAL_BOOKING_ADDON;
+
+ // Include file with class
+ $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
+ foreach ($dirmodels as $reldir) {
+ $dir = dol_buildpath($reldir."core/modules/bookcal/");
+
+ // Load file with numbering class (if found)
+ $mybool |= @include_once $dir.$file;
+ }
+
+ if ($mybool === false) {
+ dol_print_error('', "Failed to include file ".$file);
+ return '';
+ }
+
+ if (class_exists($classname)) {
+ $obj = new $classname();
+ $numref = $obj->getNextValue($this);
+
+ if ($numref != '' && $numref != '-1') {
+ return $numref;
+ } else {
+ $this->error = $obj->error;
+ //dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error);
+ return "";
+ }
+ } else {
+ print $langs->trans("Error")." ".$langs->trans("ClassNotFound").' '.$classname;
+ return "";
+ }
+ } else {
+ print $langs->trans("ErrorNumberingModuleNotSetup", $this->element);
+ return "";
+ }
+ }
+
+ /**
+ * Create a document onto disk according to template module.
+ *
+ * @param string $modele Force template to use ('' to not force)
+ * @param Translate $outputlangs objet lang a utiliser pour traduction
+ * @param int $hidedetails Hide details of lines
+ * @param int $hidedesc Hide description
+ * @param int $hideref Hide ref
+ * @param null|array $moreparams Array to provide more information
+ * @return int 0 if KO, 1 if OK
+ */
+ public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
+ {
+ global $conf, $langs;
+
+ $result = 0;
+ $includedocgeneration = 0;
+
+ $langs->load("bookcal@bookcal");
+
+ if (!dol_strlen($modele)) {
+ $modele = 'standard_booking';
+
+ if (!empty($this->model_pdf)) {
+ $modele = $this->model_pdf;
+ } elseif (!empty($conf->global->BOOKING_ADDON_PDF)) {
+ $modele = $conf->global->BOOKING_ADDON_PDF;
+ }
+ }
+
+ $modelpath = "core/modules/bookcal/doc/";
+
+ if ($includedocgeneration && !empty($modele)) {
+ $result = $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
+ }
+
+ return $result;
+ }
+
+ /**
+ * Action executed by scheduler
+ * CAN BE A CRON TASK. In such a case, parameters come from the schedule job setup field 'Parameters'
+ * Use public function doScheduledJob($param1, $param2, ...) to get parameters
+ *
+ * @return int 0 if OK, <>0 if KO (this function is used also by cron so only 0 is OK)
+ */
+ public function doScheduledJob()
+ {
+ global $conf, $langs;
+
+ //$conf->global->SYSLOG_FILE = 'DOL_DATA_ROOT/dolibarr_mydedicatedlofile.log';
+
+ $error = 0;
+ $this->output = '';
+ $this->error = '';
+
+ dol_syslog(__METHOD__, LOG_DEBUG);
+
+ $now = dol_now();
+
+ $this->db->begin();
+
+ // ...
+
+ $this->db->commit();
+
+ return $error;
+ }
+}
+
+
+require_once DOL_DOCUMENT_ROOT.'/core/class/commonobjectline.class.php';
+
+/**
+ * Class BookingLine. You can also remove this and generate a CRUD class for lines objects.
+ */
+class BookingLine extends CommonObjectLine
+{
+ // To complete with content of an object BookingLine
+ // We should have a field rowid, fk_booking and position
+
+ /**
+ * @var int Does object support extrafields ? 0=No, 1=Yes
+ */
+ public $isextrafieldmanaged = 0;
+
+ /**
+ * Constructor
+ *
+ * @param DoliDb $db Database handler
+ */
+ public function __construct(DoliDB $db)
+ {
+ $this->db = $db;
+ }
+}
diff --git a/htdocs/bookcal/lib/bookcal.lib.php b/htdocs/bookcal/lib/bookcal.lib.php
new file mode 100644
index 00000000000..bc60468fb1d
--- /dev/null
+++ b/htdocs/bookcal/lib/bookcal.lib.php
@@ -0,0 +1,68 @@
+
+ *
+ * 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 .
+ */
+
+/**
+ * \file bookcal/lib/bookcal.lib.php
+ * \ingroup bookcal
+ * \brief Library files with common functions for BookCal
+ */
+
+/**
+ * Prepare admin pages header
+ *
+ * @return array
+ */
+function bookcalAdminPrepareHead()
+{
+ global $langs, $conf;
+
+ $langs->load("bookcal@bookcal");
+
+ $h = 0;
+ $head = array();
+
+ $head[$h][0] = dol_buildpath("/bookcal/admin/setup.php", 1);
+ $head[$h][1] = $langs->trans("Settings");
+ $head[$h][2] = 'settings';
+ $h++;
+
+ /*
+ $head[$h][0] = dol_buildpath("/bookcal/admin/myobject_extrafields.php", 1);
+ $head[$h][1] = $langs->trans("ExtraFields");
+ $head[$h][2] = 'myobject_extrafields';
+ $h++;
+ */
+
+ $head[$h][0] = dol_buildpath("/bookcal/admin/about.php", 1);
+ $head[$h][1] = $langs->trans("About");
+ $head[$h][2] = 'about';
+ $h++;
+
+ // Show more tabs from modules
+ // Entries must be declared in modules descriptor with line
+ //$this->tabs = array(
+ // 'entity:+tabname:Title:@bookcal:/bookcal/mypage.php?id=__ID__'
+ //); // to add new tab
+ //$this->tabs = array(
+ // 'entity:-tabname:Title:@bookcal:/bookcal/mypage.php?id=__ID__'
+ //); // to remove a tab
+ complete_head_from_modules($conf, $langs, null, $head, $h, 'bookcal@bookcal');
+
+ complete_head_from_modules($conf, $langs, null, $head, $h, 'bookcal@bookcal', 'remove');
+
+ return $head;
+}
diff --git a/htdocs/bookcal/lib/bookcal_availabilities.lib.php b/htdocs/bookcal/lib/bookcal_availabilities.lib.php
new file mode 100644
index 00000000000..83d204a2d76
--- /dev/null
+++ b/htdocs/bookcal/lib/bookcal_availabilities.lib.php
@@ -0,0 +1,110 @@
+
+ *
+ * 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 .
+ */
+
+/**
+ * \file lib/bookcal_availabilities.lib.php
+ * \ingroup bookcal
+ * \brief Library files with common functions for Availabilities
+ */
+
+/**
+ * Prepare array of tabs for Availabilities
+ *
+ * @param Availabilities $object Availabilities
+ * @return array Array of tabs
+ */
+function availabilitiesPrepareHead($object)
+{
+ global $db, $langs, $conf;
+
+ $langs->load("bookcal@bookcal");
+
+ $showtabofpagecontact = 1;
+ $showtabofpagenote = 1;
+ $showtabofpagedocument = 1;
+ $showtabofpageagenda = 1;
+
+ $h = 0;
+ $head = array();
+
+ $head[$h][0] = dol_buildpath("/bookcal/availabilities_card.php", 1).'?id='.$object->id;
+ $head[$h][1] = $langs->trans("Card");
+ $head[$h][2] = 'card';
+ $h++;
+
+ if ($showtabofpagecontact) {
+ $head[$h][0] = dol_buildpath("/bookcal/availabilities_contact.php", 1).'?id='.$object->id;
+ $head[$h][1] = $langs->trans("Contacts");
+ $head[$h][2] = 'contact';
+ $h++;
+ }
+
+ if ($showtabofpagenote) {
+ if (isset($object->fields['note_public']) || isset($object->fields['note_private'])) {
+ $nbNote = 0;
+ if (!empty($object->note_private)) {
+ $nbNote++;
+ }
+ if (!empty($object->note_public)) {
+ $nbNote++;
+ }
+ $head[$h][0] = dol_buildpath('/bookcal/availabilities_note.php', 1).'?id='.$object->id;
+ $head[$h][1] = $langs->trans('Notes');
+ if ($nbNote > 0) {
+ $head[$h][1] .= (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) ? ''.$nbNote.' ' : '');
+ }
+ $head[$h][2] = 'note';
+ $h++;
+ }
+ }
+
+ if ($showtabofpagedocument) {
+ require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ require_once DOL_DOCUMENT_ROOT.'/core/class/link.class.php';
+ $upload_dir = $conf->bookcal->dir_output."/availabilities/".dol_sanitizeFileName($object->ref);
+ $nbFiles = count(dol_dir_list($upload_dir, 'files', 0, '', '(\.meta|_preview.*\.png)$'));
+ $nbLinks = Link::count($db, $object->element, $object->id);
+ $head[$h][0] = dol_buildpath("/bookcal/availabilities_document.php", 1).'?id='.$object->id;
+ $head[$h][1] = $langs->trans('Documents');
+ if (($nbFiles + $nbLinks) > 0) {
+ $head[$h][1] .= ''.($nbFiles + $nbLinks).' ';
+ }
+ $head[$h][2] = 'document';
+ $h++;
+ }
+
+ if ($showtabofpageagenda) {
+ $head[$h][0] = dol_buildpath("/bookcal/availabilities_agenda.php", 1).'?id='.$object->id;
+ $head[$h][1] = $langs->trans("Events");
+ $head[$h][2] = 'agenda';
+ $h++;
+ }
+
+ // Show more tabs from modules
+ // Entries must be declared in modules descriptor with line
+ //$this->tabs = array(
+ // 'entity:+tabname:Title:@bookcal:/bookcal/mypage.php?id=__ID__'
+ //); // to add new tab
+ //$this->tabs = array(
+ // 'entity:-tabname:Title:@bookcal:/bookcal/mypage.php?id=__ID__'
+ //); // to remove a tab
+ complete_head_from_modules($conf, $langs, $object, $head, $h, 'availabilities@bookcal');
+
+ complete_head_from_modules($conf, $langs, $object, $head, $h, 'availabilities@bookcal', 'remove');
+
+ return $head;
+}
diff --git a/htdocs/bookcal/lib/bookcal_booking.lib.php b/htdocs/bookcal/lib/bookcal_booking.lib.php
new file mode 100644
index 00000000000..a6cb0e50df6
--- /dev/null
+++ b/htdocs/bookcal/lib/bookcal_booking.lib.php
@@ -0,0 +1,110 @@
+
+ *
+ * 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 .
+ */
+
+/**
+ * \file lib/bookcal_booking.lib.php
+ * \ingroup bookcal
+ * \brief Library files with common functions for Booking
+ */
+
+/**
+ * Prepare array of tabs for Booking
+ *
+ * @param Booking $object Booking
+ * @return array Array of tabs
+ */
+function bookingPrepareHead($object)
+{
+ global $db, $langs, $conf;
+
+ $langs->load("bookcal@bookcal");
+
+ $showtabofpagecontact = 1;
+ $showtabofpagenote = 1;
+ $showtabofpagedocument = 1;
+ $showtabofpageagenda = 1;
+
+ $h = 0;
+ $head = array();
+
+ $head[$h][0] = dol_buildpath("/bookcal/booking_card.php", 1).'?id='.$object->id;
+ $head[$h][1] = $langs->trans("Card");
+ $head[$h][2] = 'card';
+ $h++;
+
+ if ($showtabofpagecontact) {
+ $head[$h][0] = dol_buildpath("/bookcal/booking_contact.php", 1).'?id='.$object->id;
+ $head[$h][1] = $langs->trans("Contacts");
+ $head[$h][2] = 'contact';
+ $h++;
+ }
+
+ if ($showtabofpagenote) {
+ if (isset($object->fields['note_public']) || isset($object->fields['note_private'])) {
+ $nbNote = 0;
+ if (!empty($object->note_private)) {
+ $nbNote++;
+ }
+ if (!empty($object->note_public)) {
+ $nbNote++;
+ }
+ $head[$h][0] = dol_buildpath('/bookcal/booking_note.php', 1).'?id='.$object->id;
+ $head[$h][1] = $langs->trans('Notes');
+ if ($nbNote > 0) {
+ $head[$h][1] .= (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) ? ''.$nbNote.' ' : '');
+ }
+ $head[$h][2] = 'note';
+ $h++;
+ }
+ }
+
+ if ($showtabofpagedocument) {
+ require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ require_once DOL_DOCUMENT_ROOT.'/core/class/link.class.php';
+ $upload_dir = $conf->bookcal->dir_output."/booking/".dol_sanitizeFileName($object->ref);
+ $nbFiles = count(dol_dir_list($upload_dir, 'files', 0, '', '(\.meta|_preview.*\.png)$'));
+ $nbLinks = Link::count($db, $object->element, $object->id);
+ $head[$h][0] = dol_buildpath("/bookcal/booking_document.php", 1).'?id='.$object->id;
+ $head[$h][1] = $langs->trans('Documents');
+ if (($nbFiles + $nbLinks) > 0) {
+ $head[$h][1] .= ''.($nbFiles + $nbLinks).' ';
+ }
+ $head[$h][2] = 'document';
+ $h++;
+ }
+
+ if ($showtabofpageagenda) {
+ $head[$h][0] = dol_buildpath("/bookcal/booking_agenda.php", 1).'?id='.$object->id;
+ $head[$h][1] = $langs->trans("Events");
+ $head[$h][2] = 'agenda';
+ $h++;
+ }
+
+ // Show more tabs from modules
+ // Entries must be declared in modules descriptor with line
+ //$this->tabs = array(
+ // 'entity:+tabname:Title:@bookcal:/bookcal/mypage.php?id=__ID__'
+ //); // to add new tab
+ //$this->tabs = array(
+ // 'entity:-tabname:Title:@bookcal:/bookcal/mypage.php?id=__ID__'
+ //); // to remove a tab
+ complete_head_from_modules($conf, $langs, $object, $head, $h, 'booking@bookcal');
+
+ complete_head_from_modules($conf, $langs, $object, $head, $h, 'booking@bookcal', 'remove');
+
+ return $head;
+}
diff --git a/htdocs/bookcal/modulebuilder.txt b/htdocs/bookcal/modulebuilder.txt
new file mode 100644
index 00000000000..670a1774929
--- /dev/null
+++ b/htdocs/bookcal/modulebuilder.txt
@@ -0,0 +1,3 @@
+# DO NOT DELETE THIS FILE MANUALLY
+# File to flag module built using official module template.
+# When this file is present into a module directory, you can edit it with the module builder tool.
\ No newline at end of file
diff --git a/htdocs/bookmarks/bookmarks.lib.php b/htdocs/bookmarks/bookmarks.lib.php
index 797bffa187a..d5258ba26f1 100644
--- a/htdocs/bookmarks/bookmarks.lib.php
+++ b/htdocs/bookmarks/bookmarks.lib.php
@@ -60,7 +60,7 @@ function printDropdownBookmarksList()
if ($sortorder) {
$tmpurl .= ($tmpurl ? '&' : '').'sortorder='.urlencode($sortorder);
}
- if (is_array($_POST)) {
+ if (!empty($_POST) && is_array($_POST)) {
foreach ($_POST as $key => $val) {
if ((preg_match('/^search_/', $key) || in_array($key, $authorized_var))
&& $val != ''
diff --git a/htdocs/bookmarks/card.php b/htdocs/bookmarks/card.php
index 60d615192d0..5b22b8918d9 100644
--- a/htdocs/bookmarks/card.php
+++ b/htdocs/bookmarks/card.php
@@ -1,6 +1,6 @@
- * Copyright (C) 2005-2015 Laurent Destailleur
+ * Copyright (C) 2005-2022 Laurent Destailleur
* Copyright (C) 2014 Marcos García
*
* This program is free software; you can redistribute it and/or modify
@@ -186,7 +186,7 @@ if ($action == 'create') {
print $form->selectarray('target', $liste, GETPOSTISSET('target') ? GETPOST('target', 'int') : $defaulttarget, 0, 0, 0, '', 0, 0, 0, '', 'maxwidth300');
print ''.$langs->trans("ChooseIfANewWindowMustBeOpenedOnClickOnBookmark").' ';
- // Owner
+ // Visibility / Owner
print ''.$langs->trans("Visibility").' ';
print img_picto('', 'user').' '.$form->select_dolusers(GETPOSTISSET('userid') ? GETPOST('userid', 'int') : $user->id, 'userid', 0, '', 0, ($user->admin ? '' : array($user->id)), '', 0, 0, 0, '', ($user->admin) ? 1 : 0, '', 'maxwidth300 widthcentpercentminusx');
print ' ';
@@ -279,9 +279,10 @@ if ($id > 0 && !preg_match('/^add/i', $action)) {
}
print '';
+ // Visibility / owner
print ''.$langs->trans("Visibility").' ';
if ($action == 'edit' && $user->admin) {
- print img_picto('', 'user').' '.$form->select_dolusers(GETPOSTISSET('userid') ? GETPOST('userid', 'int') : ($object->fk_user ? $object->fk_user : ''), 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300');
+ print img_picto('', 'user').' '.$form->select_dolusers(GETPOSTISSET('userid') ? GETPOST('userid', 'int') : ($object->fk_user ? $object->fk_user : ''), 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300 widthcentpercentminusx');
} else {
if ($object->fk_user > 0) {
$fuser = new User($db);
diff --git a/htdocs/bookmarks/list.php b/htdocs/bookmarks/list.php
index 4f5d73a2404..5f8eb93af96 100644
--- a/htdocs/bookmarks/list.php
+++ b/htdocs/bookmarks/list.php
@@ -1,5 +1,5 @@
+/* Copyright (C) 2005-2022 Laurent Destailleur
*
* 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
@@ -39,13 +39,14 @@ $id = GETPOST("id", 'int');
$optioncss = GETPOST('optioncss', 'alpha');
// Load variable for pagination
-$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
+$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
$sortfield = GETPOST('sortfield', 'aZ09comma');
$sortorder = GETPOST('sortorder', 'aZ09comma');
$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
-if (empty($page) || $page == -1 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha') || (empty($toselect) && $massaction === '0')) {
+if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
+ // If $page is not defined, or '' or -1 or if we click on clear filters
$page = 0;
-} // If $page is not defined, or '' or -1 or if we click on clear filters or if we select empty mass action
+}
$offset = $limit * $page;
$pageprev = $page - 1;
$pagenext = $page + 1;
@@ -72,6 +73,14 @@ $permissiontodelete = !empty($user->rights->bookmark->supprimer);
* Actions
*/
+if (GETPOST('cancel', 'alpha')) {
+ $action = 'list';
+ $massaction = '';
+}
+if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
+ $massaction = '';
+}
+
if ($action == 'delete') {
$res = $object->remove($id);
if ($res > 0) {
@@ -103,34 +112,41 @@ if (!$user->admin) {
$sql .= " AND (b.fk_user = ".((int) $user->id)." OR b.fk_user is NULL OR b.fk_user = 0)";
}
-$sql .= $db->order($sortfield.", position", $sortorder);
-
// Count total nb of records
$nbtotalofrecords = '';
if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
- $resql = $db->query($sql);
- $nbtotalofrecords = $db->num_rows($resql);
+ /* The fast and low memory method to get and count full list converts the sql into a sql count */
+ $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/Ui', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
+ $resql = $db->query($sqlforcount);
+ if ($resql) {
+ $objforcount = $db->fetch_object($resql);
+ $nbtotalofrecords = $objforcount->nbtotalofrecords;
+ } else {
+ dol_print_error($db);
+ }
+
if (($page * $limit) > $nbtotalofrecords) { // if total of record found is smaller than page * limit, goto and load page 0
$page = 0;
$offset = 0;
}
+ $db->free($resql);
}
-// if total of record found is smaller than limit, no need to do paging and to restart another select with limits set.
-if (is_numeric($nbtotalofrecords) && $limit > $nbtotalofrecords) {
- $num = $nbtotalofrecords;
-} else {
+
+// Complete request and execute it with limit
+$sql .= $db->order($sortfield.", position", $sortorder);
+if ($limit) {
$sql .= $db->plimit($limit + 1, $offset);
-
- $resql = $db->query($sql);
- if (!$resql) {
- dol_print_error($db);
- exit;
- }
-
- $num = $db->num_rows($resql);
}
-$param = "";
+$resql = $db->query($sql);
+if (!$resql) {
+ dol_print_error($db);
+ exit;
+}
+
+$num = $db->num_rows($resql);
+
+$param = '';
if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
$param .= '&contextpage='.urlencode($contextpage);
}
@@ -138,7 +154,7 @@ if ($limit > 0 && $limit != $conf->liste_limit) {
$param .= '&limit='.urlencode($limit);
}
if ($optioncss != '') {
- $param = '&optioncss='.urlencode($optioncss);
+ $param .= '&optioncss='.urlencode($optioncss);
}
$moreforfilter = '';
@@ -150,7 +166,7 @@ $arrayofmassactions = array(
//'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
//'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
);
-if ($permissiontodelete) {
+if (!empty($permissiontodelete)) {
$arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
}
if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete'))) {
@@ -158,7 +174,7 @@ if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'pr
}
$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
-print '';
+print ' '."\n";
if ($optioncss != '') {
print ' ';
}
@@ -167,7 +183,9 @@ print ' ';
print ' ';
print ' ';
+print ' ';
print ' ';
+print ' ';
$newcardbutton = '';
$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/bookmarks/card.php?action=create&backtopage='.urlencode(DOL_URL_ROOT.'/bookmarks/list.php'), '', !empty($user->rights->bookmark->creer));
@@ -179,13 +197,13 @@ print '';
//print " ";
-print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "b.rowid", "", $param, 'align="left"', $sortfield, $sortorder);
-print_liste_field_titre("Title", $_SERVER["PHP_SELF"], "b.title", "", $param, 'align="left"', $sortfield, $sortorder);
-print_liste_field_titre("Link", $_SERVER["PHP_SELF"], "b.url", "", $param, 'align="left"', $sortfield, $sortorder);
-print_liste_field_titre("Target", '', '', '', '', 'align="center"');
-print_liste_field_titre("Visibility", $_SERVER["PHP_SELF"], "u.lastname", "", $param, 'align="center"', $sortfield, $sortorder);
-print_liste_field_titre("Date", $_SERVER["PHP_SELF"], "b.dateb", "", $param, 'align="center"', $sortfield, $sortorder);
-print_liste_field_titre("Position", $_SERVER["PHP_SELF"], "b.position", "", $param, 'class="right"', $sortfield, $sortorder);
+print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "b.rowid", "", $param, '', $sortfield, $sortorder);
+print_liste_field_titre("Title", $_SERVER["PHP_SELF"], "b.title", "", $param, '', $sortfield, $sortorder);
+print_liste_field_titre("Link", $_SERVER["PHP_SELF"], "b.url", "", $param, '', $sortfield, $sortorder);
+print_liste_field_titre("Target", $_SERVER["PHP_SELF"], "b.target", "", $param, '', $sortfield, $sortorder, 'center ');
+print_liste_field_titre("Visibility", $_SERVER["PHP_SELF"], "u.lastname", "", $param, '', $sortfield, $sortorder, 'center ');
+print_liste_field_titre("DateCreation", $_SERVER["PHP_SELF"], "b.dateb", "", $param, '', $sortfield, $sortorder, 'center ');
+print_liste_field_titre("Position", $_SERVER["PHP_SELF"], "b.position", "", $param, '', $sortfield, $sortorder, 'right ');
print_liste_field_titre('');
print "\n";
@@ -205,33 +223,31 @@ while ($i < min($num, $limit)) {
print $object->getNomUrl(1);
print '';
- $linkintern = 0;
+ $linkintern = 1;
+ if (preg_match('/^http/i', $obj->url)) {
+ $linkintern = 0;
+ }
$title = $obj->title;
$link = $obj->url;
$canedit = $user->rights->bookmark->supprimer;
$candelete = $user->rights->bookmark->creer;
// Title
- print "";
- $linkintern = 1;
- if ($linkintern) {
- print '';
- }
- print $title;
- if ($linkintern) {
- print " ";
- }
+ print ' ';
+ print dol_escape_htmltag($title);
print " \n";
// Url
print '';
- if (!$linkintern) {
- print 'target ? ' target="newlink" rel="noopener"' : '').'>';
+ if (empty($linkintern)) {
+ print img_picto('', 'url', 'class="pictofixedwidth"');
+ print ' target ? ' target="newlink" rel="noopener"' : '').'>';
+ } else {
+ //print img_picto('', 'rightarrow', 'class="pictofixedwidth"');
+ print ' ';
}
print $link;
- if (!$linkintern) {
- print ' ';
- }
+ print '';
print " \n";
// Target
@@ -264,7 +280,7 @@ while ($i < min($num, $limit)) {
print "\n";
// Date creation
- print ''.dol_print_date($db->jdate($obj->dateb), 'day')." ";
+ print ''.dol_print_date($db->jdate($obj->dateb), 'day')." ";
// Position
print ''.$obj->position." ";
diff --git a/htdocs/categories/card.php b/htdocs/categories/card.php
index 7f04c6d1005..c94e464a762 100644
--- a/htdocs/categories/card.php
+++ b/htdocs/categories/card.php
@@ -247,7 +247,7 @@ if ($user->rights->categorie->creer) {
// Description
print ''.$langs->trans("Description").' ';
require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
- $doleditor = new DolEditor('description', $description, '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_PRODUCTDESC'), ROWS_5, '90%');
+ $doleditor = new DolEditor('description', $description, '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_SOCIETE'), ROWS_5, '90%');
$doleditor->Create();
print ' ';
diff --git a/htdocs/categories/class/categorie.class.php b/htdocs/categories/class/categorie.class.php
index 1d7901eca3f..b5719d388f3 100644
--- a/htdocs/categories/class/categorie.class.php
+++ b/htdocs/categories/class/categorie.class.php
@@ -694,6 +694,7 @@ class Categorie extends CommonObject
* @param CommonObject $obj Object to link to category
* @param string $type Type of category ('product', ...). Use '' to take $obj->element.
* @return int 1 : OK, -1 : erreur SQL, -2 : id not defined, -3 : Already linked
+ * @see del_type()
*/
public function add_type($obj, $type = '')
{
@@ -785,8 +786,8 @@ class Categorie extends CommonObject
*
* @param CommonObject $obj Object
* @param string $type Type of category ('customer', 'supplier', 'contact', 'product', 'member')
- *
* @return int 1 if OK, -1 if KO
+ * @see add_type()
*/
public function del_type($obj, $type)
{
@@ -1151,6 +1152,7 @@ class Categorie extends CommonObject
$this->cats[$obj->rowid]['color'] = $obj->color;
$this->cats[$obj->rowid]['visible'] = $obj->visible;
$this->cats[$obj->rowid]['ref_ext'] = $obj->ref_ext;
+ $this->cats[$obj->rowid]['picto'] = 'category';
$i++;
}
} else {
@@ -1673,10 +1675,10 @@ class Categorie extends CommonObject
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
- * Deplace fichier uploade sous le nom $files dans le repertoire sdir
+ * Deplace fichier uploade sous le nom $file dans le repertoire sdir
*
- * @param string $sdir Repertoire destination finale
- * @param string $file Nom du fichier uploade
+ * @param string $sdir Final destination directory
+ * @param array $file Uploaded file name
* @return void
*/
public function add_photo($sdir, $file)
@@ -1980,6 +1982,7 @@ class Categorie extends CommonObject
* @param string $type The category type (e.g Categorie::TYPE_WAREHOUSE)
* @param string $rowIdName The name of the row id inside the whole sql query (e.g. "e.rowid")
* @return string A additional SQL JOIN query
+ * @deprecated search on some categories must be done using a WHERE EXISTS or NOT EXISTS and not a LEFT JOIN. @TODO Replace with getWhereQuery($type, $searchCategoryList)
*/
public static function getFilterJoinQuery($type, $rowIdName)
{
@@ -1997,6 +2000,7 @@ class Categorie extends CommonObject
* @param string $rowIdName The name of the row id inside the whole sql query (e.g. "e.rowid")
* @param Array $searchList A list with the selected categories
* @return string A additional SQL SELECT query
+ * @deprecated search on some categories must be done using a WHERE EXISTS or NOT EXISTS and not a LEFT JOIN
*/
public static function getFilterSelectQuery($type, $rowIdName, $searchList)
{
diff --git a/htdocs/categories/traduction.php b/htdocs/categories/traduction.php
index 8aecdde63ea..f0f40b4401b 100644
--- a/htdocs/categories/traduction.php
+++ b/htdocs/categories/traduction.php
@@ -267,7 +267,7 @@ if ($action == 'edit') {
// Desc
$desc = (GETPOST('desc-'.$key) ? GETPOST('desc-'.$key) : $object->multilangs[$key]['description']);
print ''.$langs->trans('Description').' ';
- $doleditor = new DolEditor("desc-$key", $desc, '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_PRODUCTDESC'), ROWS_3, '90%');
+ $doleditor = new DolEditor("desc-$key", $desc, '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_SOCIETE'), ROWS_3, '90%');
$doleditor->Create();
print ' ';
@@ -327,7 +327,7 @@ if ($action == 'add' && ($user->rights->produit->creer || $user->rights->service
print ''.$langs->trans('Label').' ';
print ' ';
print ''.$langs->trans('Description').' ';
- $doleditor = new DolEditor('desc', GETPOST('desc', 'restricthtml'), '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_PRODUCTDESC'), ROWS_3, '90%');
+ $doleditor = new DolEditor('desc', GETPOST('desc', 'restricthtml'), '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_SOCIETE'), ROWS_3, '90%');
$doleditor->Create();
print ' ';
diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php
index 2c008202348..105e70e18bc 100644
--- a/htdocs/comm/action/card.php
+++ b/htdocs/comm/action/card.php
@@ -75,6 +75,7 @@ $offsetunit = GETPOST('offsetunittype_duration', 'aZ09');
$remindertype = GETPOST('selectremindertype', 'aZ09');
$modelmail = GETPOST('actioncommsendmodel_mail', 'int');
$complete = GETPOST('complete', 'alpha'); // 'na' must be allowed
+$private = GETPOST('private', 'alphanohtml');
if ($complete == 'na' || $complete == -2) {
$complete = -1;
}
@@ -89,6 +90,14 @@ if ($fulldayevent) {
$datep = dol_mktime($aphour, $apmin, 0, GETPOST("apmonth", 'int'), GETPOST("apday", 'int'), GETPOST("apyear", 'int'), 'tzuserrel');
$datef = dol_mktime($p2hour, $p2min, '59', GETPOST("p2month", 'int'), GETPOST("p2day", 'int'), GETPOST("p2year", 'int'), 'tzuserrel');
}
+$reg = array();
+if (GETPOST('datep')) {
+ if (GETPOST('datep') == 'now') {
+ $datep = dol_now();
+ } elseif (preg_match('/^([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])$/', GETPOST("datep"), $reg)) { // Try to not use this. Use insteead '&datep=now'
+ $datep = dol_mktime(0, 0, 0, $reg[2], $reg[3], $reg[1], 'tzuser');
+ }
+}
// Security check
$socid = GETPOST('socid', 'int');
@@ -150,6 +159,8 @@ if ($user->socid && $socid) {
$result = restrictedArea($user, 'societe', $socid);
}
+$usercancreate = $user->rights->agenda->allactions->create || (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->rights->agenda->myactions->create);
+
/*
* Actions
@@ -419,7 +430,36 @@ if (empty($reshook) && $action == 'add') {
if (!$error) {
$db->begin();
+ $selectedrecurrulefreq = 'no';
+ $selectedrecurrulebymonthday = '';
+ $selectedrecurrulebyday = '';
+ $object->recurrule = GETPOSTISSET('recurrulefreq') ? "FREQ=".GETPOST('recurrulefreq', 'alpha') : "";
+ $object->recurrule .= (GETPOST('recurrulefreq', 'alpha') == 'MONTHLY' && GETPOSTISSET('BYMONTHDAY')) ? "_BYMONTHDAY".GETPOST('BYMONTHDAY', 'alpha') : "";
+ $object->recurrule .= (GETPOST('recurrulefreq', 'alpha') == 'WEEKLY' && GETPOSTISSET('BYDAY')) ? "_BYDAY".GETPOST('BYDAY', 'alpha') : "";
+ $reg1 = array(); $reg2 = array(); $reg3 = array();
+ if ($object->recurrule && preg_match('/FREQ=([A-Z]+)/i', $object->recurrule, $reg1)) {
+ $selectedrecurrulefreq = $reg1[1];
+ }
+ if ($object->recurrule && preg_match('/FREQ=MONTHLY.*BYMONTHDAY(\d+)/i', $object->recurrule, $reg2)) {
+ $selectedrecurrulebymonthday = $reg2[1];
+ }
+ if ($object->recurrule && preg_match('/FREQ=WEEKLY.*BYDAY(\d+)/i', $object->recurrule, $reg3)) {
+ $selectedrecurrulebyday = $reg3[1];
+ }
+
+ // Is event recurrent ?
+ $eventisrecurring = 0;
+ $userepeatevent = (getDolGlobalInt('MAIN_FEATURES_LEVEL') == 2 ? 1 : 0);
+ if ($userepeatevent && !empty($selectedrecurrulefreq) && $selectedrecurrulefreq != 'no') {
+ $eventisrecurring = 1;
+ $object->recurid = dol_print_date(dol_now('gmt'), 'dayhourlog', 'gmt');
+ $object->recurdateend = dol_mktime(0, 0, 0, GETPOST('limitmonth', 'int'), GETPOST('limitday', 'int'), GETPOST('limityear', 'int'));
+ } else {
+ unset($object->recurid);
+ unset($object->recurrule);
+ unset($object->recurdateend);
+ }
// Creation of action/event
$idaction = $object->create($user);
@@ -506,26 +546,7 @@ if (empty($reshook) && $action == 'add') {
$action = 'create'; $donotclearsession = 1;
}
- $selectedrecurrulefreq = 'no';
- $selectedrecurrulebymonthday = '';
- $selectedrecurrulebyday = '';
- $object->recurrule = GETPOSTISSET('recurrulefreq') ? "FREQ=".GETPOST('recurrulefreq', 'alpha') : "";
- $object->recurrule .= GETPOSTISSET('BYMONTHDAY') ? "_BYMONTHDAY".GETPOST('BYMONTHDAY', 'alpha') : "";
- $object->recurrule .= GETPOSTISSET('BYDAY') ? "_BYDAY".GETPOST('BYDAY', 'alpha') : "";
-
- if ($object->recurrule && preg_match('/FREQ=([A-Z]+)/i', $object->recurrule, $reg1)) {
- $selectedrecurrulefreq = $reg1[1];
- }
- if ($object->recurrule && preg_match('/FREQ=MONTHLY.*BYMONTHDAY(\d+)/i', $object->recurrule, $reg2)) {
- $selectedrecurrulebymonthday = $reg2[1];
- }
- if ($object->recurrule && preg_match('/FREQ=WEEKLY.*BYDAY(\d+)/i', $object->recurrule, $reg3)) {
- $selectedrecurrulebyday = $reg3[1];
- }
-
- // If event is recurrent
- $userepeatevent = ($conf->global->MAIN_FEATURES_LEVEL == 2 ? 1 : 0);
- if ($userepeatevent && !empty($selectedrecurrulefreq) && $selectedrecurrulefreq != 'no') {
+ if ($eventisrecurring) {
// We set first date of recurrence and offsets
if ($selectedrecurrulefreq == 'WEEKLY' && !empty($selectedrecurrulebyday)) {
$firstdatearray = dol_get_first_day_week(GETPOST("apday", 'int'), GETPOST("apmonth", 'int'), GETPOST("apyear", 'int'));
@@ -695,7 +716,15 @@ if (empty($reshook) && $action == 'update') {
$datef = dol_mktime($fulldayevent ? '23' : GETPOST("p2hour", 'int'), $fulldayevent ? '59' : GETPOST("p2min", 'int'), $fulldayevent ? '59' : GETPOST("apsec", 'int'), GETPOST("p2month", 'int'), GETPOST("p2day", 'int'), GETPOST("p2year", 'int'), 'tzuser');
}
- $object->type_id = dol_getIdFromCode($db, GETPOST("actioncode", 'aZ09'), 'c_actioncomm');
+ if ($object->elementtype == 'ticket') {
+ if ($private) {
+ $object->type_code = 'TICKET_MSG_PRIVATE';
+ } else {
+ $object->type_id = dol_getIdFromCode($db, 'AC_EMAIL', 'c_actioncomm');
+ }
+ } else {
+ $object->type_id = dol_getIdFromCode($db, GETPOST("actioncode", 'aZ09'), 'c_actioncomm');
+ }
$object->label = GETPOST("label", "alphanohtml");
$object->datep = $datep;
$object->datef = $datef;
@@ -925,9 +954,7 @@ if (empty($reshook) && $action == 'update') {
}
}
-/*
- * delete event
- */
+// Delete event
if (empty($reshook) && $action == 'confirm_delete' && GETPOST("confirm") == 'yes') {
$object->fetch($id);
$object->fetch_optionals();
@@ -1059,7 +1086,6 @@ if (empty($reshook)) {
}
-
/*
* View
*/
@@ -1172,9 +1198,10 @@ if ($action == 'create') {
// Type of event
if (!empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
print ''.$langs->trans("Type").' ';
- $default = (empty($conf->global->AGENDA_USE_EVENT_TYPE_DEFAULT) ? 'AC_RDV' : $conf->global->AGENDA_USE_EVENT_TYPE_DEFAULT);
+ $default = getDolGlobalString('AGENDA_USE_EVENT_TYPE_DEFAULT', 'AC_RDV');
print img_picto($langs->trans("ActionType"), 'square', 'class="fawidth30 inline-block" style="color: #ddd;"');
- print $formactions->select_type_actions(GETPOSTISSET("actioncode") ? GETPOST("actioncode", 'aZ09') : ($object->type_code ? $object->type_code : $default), "actioncode", "systemauto", 0, -1, 0, 1); // TODO Replace 0 with -2 in onlyautoornot
+ $selectedvalue = GETPOSTISSET("actioncode") ? GETPOST("actioncode", 'aZ09') : ($object->type_code ? $object->type_code : $default);
+ print $formactions->select_type_actions($selectedvalue, "actioncode", "systemauto", 0, -1, 0, 1); // TODO Replace 0 with -2 in onlyautoornot
print ' ';
}
@@ -1486,11 +1513,6 @@ if ($action == 'create') {
}
}
- $reg = array();
- if (GETPOST("datep") && preg_match('/^([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])$/', GETPOST("datep"), $reg)) {
- $object->datep = dol_mktime(0, 0, 0, $reg[2], $reg[3], $reg[1]);
- }
-
// Priority
if (!empty($conf->global->AGENDA_SUPPORT_PRIORITY_IN_EVENTS)) {
print ''.$langs->trans("Priority").' ';
@@ -1694,7 +1716,7 @@ if ($id > 0) {
if ($backtopage) {
print ' ';
}
- if (empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
+ if (empty($conf->global->AGENDA_USE_EVENT_TYPE) && $object->code != "TICKET_MSG_PRIVATE") {
print ' ';
}
@@ -1706,7 +1728,7 @@ if ($id > 0) {
print ' '.$langs->trans("Ref").' '.$object->id.' ';
// Type of event
- if (!empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
+ if (!empty($conf->global->AGENDA_USE_EVENT_TYPE) && $object->elementtype != "ticket") {
print ''.$langs->trans("Type").' ';
if ($object->type_code != 'AC_OTH_AUTO') {
print img_picto($langs->trans("ActionType"), 'square', 'class="fawidth30 inline-block" style="color: #ddd;"');
@@ -1719,6 +1741,9 @@ if ($id > 0) {
print ' ';
}
+ // Private
+ if ($object->elementtype == 'ticket') print ''.$langs->trans("PrivateEventMessage").' code == 'TICKET_MSG_PRIVATE') ? ' checked' : '').'> ';
+
// Title
print 'global->AGENDA_USE_EVENT_TYPE) ? ' class="fieldrequired titlefieldcreate"' : '').'>'.$langs->trans("Title").' ';
@@ -1865,7 +1890,7 @@ if ($id > 0) {
// Location
if (empty($conf->global->AGENDA_DISABLE_LOCATION)) {
- print ''.$langs->trans("Location").' ';
+ print ''.$langs->trans("Location").' ';
}
// Status
@@ -1997,7 +2022,7 @@ if ($id > 0) {
print '
';
// Reminders
- if ($conf->global->AGENDA_REMINDER_EMAIL || $conf->global->AGENDA_REMINDER_BROWSER) {
+ if (getDolGlobalString('AGENDA_REMINDER_EMAIL') || getDolGlobalString('AGENDA_REMINDER_BROWSER')) {
$filteruserid = $user->id;
if ($user->rights->agenda->allactions->read) {
$filteruserid = 0;
@@ -2131,6 +2156,15 @@ if ($id > 0) {
$linkback .= ''.$langs->trans("ViewPerUser").' ';
$linkback .= '';
+ // Add more views from hooks
+ $parameters = array();
+ $reshook = $hookmanager->executeHooks('addCalendarView', $parameters, $object, $action);
+ if (empty($reshook)) {
+ $linkback .= $hookmanager->resPrint;
+ } elseif ($reshook > 1) {
+ $linkback = $hookmanager->resPrint;
+ }
+
//$linkback.=$out;
$morehtmlref = '';
@@ -2139,34 +2173,21 @@ if ($id > 0) {
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- //$morehtmlref.='
'.$langs->trans('Project') . ' ';
- $morehtmlref .= $langs->trans('Project').' ';
- if ($user->rights->agenda->allactions->create ||
- (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->rights->agenda->myactions->create)) {
+ //$morehtmlref .= '
';
+ if ($usercancreate) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
@@ -2184,16 +2205,26 @@ if ($id > 0) {
print '
';
// Type
- if (!empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
+ if (!empty($conf->global->AGENDA_USE_EVENT_TYPE) && $object->elementtype != 'ticket') {
print ''.$langs->trans("Type").' ';
print $object->getTypePicto();
print $langs->trans("Action".$object->type_code);
print ' ';
}
+ // Private
+ if ($object->elementtype == 'ticket') {
+ print ''.$langs->trans("PrivateEventMessage").' '.yn(($object->code == 'TICKET_MSG_PRIVATE') ? 1 : 0, 3).' ';
+ }
+
// Full day event
print ''.$langs->trans("EventOnFullDay").' '.yn($object->fulldayevent ? 1 : 0, 3).' ';
+ // Event into a serie
+ if ($object->recurid) {
+ print ''.$langs->trans("EventIntoASerie").' '.dol_escape_htmltag($object->recurid).' ';
+ }
+
$rowspan = 4;
if (empty($conf->global->AGENDA_DISABLE_LOCATION)) {
$rowspan++;
diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php
index 45dbbbf12c0..3b4af2c3c8e 100644
--- a/htdocs/comm/action/class/actioncomm.class.php
+++ b/htdocs/comm/action/class/actioncomm.class.php
@@ -269,6 +269,7 @@ class ActionComm extends CommonObject
*/
public $contact_id;
+
/**
* @var Societe|null Company linked to action (optional)
* @deprecated
@@ -376,9 +377,9 @@ class ActionComm extends CommonObject
/**
* Properties to manage the recurring events
*/
- public $recurid;
- public $recurrule;
- public $recurdateend;
+ public $recurid; /* A string YYYYMMDDHHMMSS shared by allevent of same serie */
+ public $recurrule; /* Rule of recurring */
+ public $recurdateend; /* Repeat until this date */
public $calling_duration;
@@ -549,6 +550,9 @@ class ActionComm extends CommonObject
$sql .= "email_tobcc,";
$sql .= "email_subject,";
$sql .= "errors_to,";
+ $sql .= "recurid,";
+ $sql .= "recurrule,";
+ $sql .= "recurdateend,";
$sql .= "num_vote,";
$sql .= "event_paid,";
$sql .= "status";
@@ -587,6 +591,9 @@ class ActionComm extends CommonObject
$sql .= (!empty($this->email_tobcc) ? "'".$this->db->escape($this->email_tobcc)."'" : "null").", ";
$sql .= (!empty($this->email_subject) ? "'".$this->db->escape($this->email_subject)."'" : "null").", ";
$sql .= (!empty($this->errors_to) ? "'".$this->db->escape($this->errors_to)."'" : "null").", ";
+ $sql .= (!empty($this->recurid) ? "'".$this->db->escape($this->recurid)."'" : "null").", ";
+ $sql .= (!empty($this->recurrule) ? "'".$this->db->escape($this->recurrule)."'" : "null").", ";
+ $sql .= (!empty($this->recurdateend) ? "'".$this->db->idate($this->recurdateend)."'" : "null").", ";
$sql .= (!empty($this->num_vote) ? (int) $this->num_vote : "null").", ";
$sql .= (!empty($this->event_paid) ? (int) $this->event_paid : 0).", ";
$sql .= (!empty($this->status) ? (int) $this->status : "0");
@@ -716,6 +723,9 @@ class ActionComm extends CommonObject
$this->fetchResources();
$this->id = 0;
+ $this->recurid = '';
+ $this->recurrule = '';
+ $this->recurdateend = '';
// Create clone
$this->context['createfromclone'] = 'createfromclone';
@@ -1306,8 +1316,17 @@ class ActionComm extends CommonObject
dol_syslog(get_class()."::getActions", LOG_DEBUG);
+ require_once DOL_DOCUMENT_ROOT . '/core/class/hookmanager.class.php';
+ $hookmanager = new HookManager($this->db);
+ // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
+ $hookmanager->initHooks(array('agendadao'));
+
$sql = "SELECT a.id";
$sql .= " FROM ".MAIN_DB_PREFIX."actioncomm as a";
+ // Fields from hook
+ $parameters = array('sql' => &$sql, 'socid' => $socid, 'fk_element' => $fk_element, 'elementtype' => $elementtype);
+ $reshook = $hookmanager->executeHooks('getActionsListFrom', $parameters); // Note that $action and $object may have been modified by hook
+ if (!empty($hookmanager->resPrint)) $sql.= $hookmanager->resPrint;
$sql .= " WHERE a.entity IN (".getEntity('agenda').")";
if (!empty($socid)) {
$sql .= " AND a.fk_soc = ".((int) $socid);
@@ -1326,6 +1345,10 @@ class ActionComm extends CommonObject
if (!empty($filter)) {
$sql .= $filter;
}
+ // Fields where hook
+ $parameters = array('sql' => &$sql, 'socid' => $socid, 'fk_element' => $fk_element, 'elementtype' => $elementtype);
+ $reshook = $hookmanager->executeHooks('getActionsListWhere', $parameters); // Note that $action and $object may have been modified by hook
+ if (!empty($hookmanager->resPrint)) $sql.= $hookmanager->resPrint;
if ($sortorder && $sortfield) {
$sql .= $this->db->order($sortfield, $sortorder);
}
@@ -1376,7 +1399,6 @@ class ActionComm extends CommonObject
if (empty($user->rights->agenda->allactions->read)) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."actioncomm_resources AS ar ON a.id = ar.fk_actioncomm AND ar.element_type ='user' AND ar.fk_element = ".((int) $user->id);
}
- $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON a.fk_soc = s.rowid";
$sql .= " WHERE 1 = 1";
if (empty($load_state_board)) {
$sql .= " AND a.percent >= 0 AND a.percent < 100";
@@ -1591,16 +1613,16 @@ class ActionComm extends CommonObject
$tooltip = img_picto('', $this->picto).' '.$langs->trans('Action').' ';
if (!empty($this->ref)) {
- $tooltip .= ''.$langs->trans('Ref').': '.$this->ref;
+ $tooltip .= ''.$langs->trans('Ref').': '.dol_escape_htmltag($this->ref);
}
if (!empty($label)) {
- $tooltip .= ''.$langs->trans('Title').': '.$label;
+ $tooltip .= ''.$langs->trans('Title').': '.dol_escape_htmltag($label);
}
if (!empty($labeltype)) {
- $tooltip .= ''.$langs->trans('Type').': '.$labeltype;
+ $tooltip .= ''.$langs->trans('Type').': '.dol_escape_htmltag($labeltype);
}
if (!empty($this->location)) {
- $tooltip .= ''.$langs->trans('Location').': '.$this->location;
+ $tooltip .= ''.$langs->trans('Location').': '.dol_escape_htmltag($this->location);
}
if (isset($this->transparency)) {
$tooltip .= ''.$langs->trans('Busy').': '.yn($this->transparency);
@@ -1609,7 +1631,7 @@ class ActionComm extends CommonObject
$langs->load("mails");
$tooltip .= ' ';
//$tooltip .= ''.img_picto('', 'email').' '.$langs->trans("Email").' ';
- $tooltip .= ''.$langs->trans('MailTopic').': '.$this->email_subject;
+ $tooltip .= ''.$langs->trans('MailTopic').': '.dol_escape_htmltag($this->email_subject);
$tooltip .= ''.$langs->trans('MailFrom').': '.str_replace(array('<', '>'), array('<', '>'), $this->email_from);
$tooltip .= ''.$langs->trans('MailTo').': '.str_replace(array('<', '>'), array('<', '>'), $this->email_to);
if (!empty($this->email_tocc)) {
@@ -1622,8 +1644,10 @@ class ActionComm extends CommonObject
}
if (!empty($this->note_private)) {
$tooltip .= ''.$langs->trans('Description').': ';
- $texttoshow = dolGetFirstLineOfText($this->note_private, 10);
+ $texttoshow = dolGetFirstLineOfText($this->note_private, 10); // Try to limit length of content
+ $tooltip .= ''; // Restrict height of content into the tooltip
$tooltip .= (dol_textishtml($texttoshow) ? str_replace(array("\r", "\n"), "", $texttoshow) : str_replace(array("\r", "\n"), ' ', $texttoshow));
+ $tooltip .= '
';
}
$linkclose = '';
//if (!empty($conf->global->AGENDA_USE_EVENT_TYPE) && $this->type_color)
@@ -1697,7 +1721,7 @@ class ActionComm extends CommonObject
if ($withpicto) {
$result .= img_object(($notooltip ? '' : $langs->trans("ShowAction").': '.$label), ($overwritepicto ? $overwritepicto : 'action'), (($this->type_color && $overwritepicto) ? 'style="color: #'.$this->type_color.' !important;" ' : '').($notooltip ? 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'"' : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
}
- $result .= $labelshort;
+ $result .= dol_escape_htmltag($labelshort);
$result .= $linkend;
global $action;
@@ -2057,7 +2081,7 @@ class ActionComm extends CommonObject
}
if ($exportholiday == 1) {
- $langs->load("holidays");
+ $langs->load("holiday");
$title = $langs->trans("Holidays");
$sql = "SELECT u.rowid as uid, u.lastname, u.firstname, u.email, u.statut, x.rowid, x.date_debut as date_start, x.date_fin as date_end, x.halfday, x.statut as status";
diff --git a/htdocs/comm/action/class/cactioncomm.class.php b/htdocs/comm/action/class/cactioncomm.class.php
index 0942e1554a8..049b70737e8 100644
--- a/htdocs/comm/action/class/cactioncomm.class.php
+++ b/htdocs/comm/action/class/cactioncomm.class.php
@@ -204,7 +204,7 @@ class CActionComm
if ($obj->module == 'order' && isModEnabled('commande') && empty($user->rights->commande->lire)) {
$qualified = 1;
}
- if ($obj->module == 'propal' && isModEnabled("propal") && !empty($user->rights->propale->lire)) {
+ if ($obj->module == 'propal' && isModEnabled("propal") && !empty($user->rights->propal->lire)) {
$qualified = 1;
}
if ($obj->module == 'invoice_supplier' && ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && !empty($user->rights->fournisseur->facture->lire)) || (isModEnabled('supplier_invoice') && !empty($user->rights->supplier_invoice->lire)))) {
diff --git a/htdocs/comm/action/document.php b/htdocs/comm/action/document.php
index 9a4a4e6a869..82cc7584c07 100644
--- a/htdocs/comm/action/document.php
+++ b/htdocs/comm/action/document.php
@@ -63,6 +63,9 @@ if ($id > 0) {
$object->fetch_thirdparty();
}
+// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
+$hookmanager->initHooks(array('actioncard', 'globalcard'));
+
// Get parameters
$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
$sortfield = GETPOST('sortfield', 'aZ09comma');
@@ -89,7 +92,8 @@ if ($user->socid && $socid) {
$result = restrictedArea($user, 'societe', $socid);
}
-$permissiontoadd = $user->rights->agenda->myactions->read; // Used by the include of actions_addupdatedelete.inc.php and actions_linkedfiles.inc.php
+$usercancreate = $user->rights->agenda->allactions->create || (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->rights->agenda->myactions->create);
+$permissiontoadd = $usercancreate;
/*
@@ -154,6 +158,15 @@ if ($object->id > 0) {
$out .= ''.img_picto($langs->trans("ViewDay"), 'object_calendarday', 'class="hideonsmartphone pictoactionview"');
$out .= ''.$langs->trans("ViewDay").' ';
+ // Add more views from hooks
+ $parameters = array();
+ $reshook = $hookmanager->executeHooks('addCalendarView', $parameters, $object, $action);
+ if (empty($reshook)) {
+ $out .= $hookmanager->resPrint;
+ } elseif ($reshook > 1) {
+ $out = $hookmanager->resPrint;
+ }
+
$linkback .= $out;
$morehtmlref = '';
@@ -162,17 +175,22 @@ if ($object->id > 0) {
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- //$morehtmlref.='
'.$langs->trans('Project') . ' ';
- $morehtmlref .= $langs->trans('Project').': ';
- if (!empty($object->fk_project)) {
- $proj = new Project($db);
- $proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
- if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ //$morehtmlref .= '
';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
+ if ($action != 'classify') {
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
- $morehtmlref .= '';
+ if (!empty($object->fk_project)) {
+ $proj = new Project($db);
+ $proj->fetch($object->fk_project);
+ $morehtmlref .= $proj->getNomUrl(1);
+ if ($proj->title) {
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
+ }
+ }
}
}
$morehtmlref .= '
';
diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php
index f46b0adc3cb..a6a39d1eb05 100644
--- a/htdocs/comm/action/index.php
+++ b/htdocs/comm/action/index.php
@@ -278,11 +278,11 @@ if (empty($conf->global->AGENDA_DISABLE_EXT)) {
// Note: $conf->global->buggedfile can be empty or 'uselocalandtznodaylight' or 'uselocalandtzdaylight'
$listofextcals[] = array(
'src' => getDolGlobalString($source),
- 'name' => getDolGlobalString($name),
- 'offsettz' => (!empty($conf->global->$offsettz) ? $conf->global->$offsettz : 0),
- 'color' => getDolGlobalString($color),
- 'default' => getDolGlobalString($default),
- 'buggedfile' => (isset($conf->global->buggedfile) ? $conf->global->buggedfile : 0)
+ 'name' => dol_string_nohtmltag(getDolGlobalString($name)),
+ 'offsettz' => (int) getDolGlobalInt($offsettz, 0),
+ 'color' => dol_string_nohtmltag(getDolGlobalString($color)),
+ 'default' => dol_string_nohtmltag(getDolGlobalString($default)),
+ 'buggedfile' => dol_string_nohtmltag(getDolGlobalString('buggedfile', ''))
);
}
}
@@ -303,11 +303,11 @@ if (empty($user->conf->AGENDA_DISABLE_EXT)) {
// Note: $conf->global->buggedfile can be empty or 'uselocalandtznodaylight' or 'uselocalandtzdaylight'
$listofextcals[] = array(
'src' => $user->conf->$source,
- 'name' => $user->conf->$name,
- 'offsettz' => (!empty($user->conf->$offsettz) ? $user->conf->$offsettz : 0),
- 'color' => $user->conf->$color,
- 'default' => $user->conf->$default,
- 'buggedfile' => (isset($user->conf->buggedfile) ? $user->conf->buggedfile : 0)
+ 'name' => dol_string_nohtmltag($user->conf->$name),
+ 'offsettz' => (int) (empty($user->conf->$offsettz) ? 0 : $user->conf->$offsettz),
+ 'color' => dol_string_nohtmltag($user->conf->$color),
+ 'default' => dol_string_nohtmltag($user->conf->$default),
+ 'buggedfile' => dol_string_nohtmltag(isset($user->conf->buggedfile) ? $user->conf->buggedfile : '')
);
}
}
@@ -614,7 +614,7 @@ if (!empty($conf->use_javascript_ajax)) { // If javascript on
$default = '';
}
- $s .= ' '.$val['name'].'
';
+ $s .= ' '.dol_escape_htmltag($val['name']).'
';
}
}
@@ -637,8 +637,7 @@ if (!empty($conf->use_javascript_ajax)) { // If javascript on
if (!preg_match('/showbirthday=/i', $newparam)) {
$newparam .= '&showbirthday=1';
}
- $link = 'trans("AgendaShowBirthdayEvents");
@@ -1272,9 +1271,9 @@ if (count($listofextcals)) {
$event->datef = $dateend + $usertime;
if ($icalevent['SUMMARY']) {
- $event->label = $icalevent['SUMMARY'];
+ $event->label = dol_string_nohtmltag($icalevent['SUMMARY']);
} elseif ($icalevent['DESCRIPTION']) {
- $event->label = dol_nl2br($icalevent['DESCRIPTION'], 1);
+ $event->label = dol_nl2br(dol_string_nohtmltag($icalevent['DESCRIPTION']), 1);
} else {
$event->label = $langs->trans("ExtSiteNoLabel");
}
@@ -1985,7 +1984,7 @@ function show_day_events($db, $day, $month, $year, $monthshown, $style, &$eventa
// Show title
$titletoshow = $daterange;
- $titletoshow .= ($titletoshow ? ' ' : '').($event->label ? $event->label : $event->libelle);
+ $titletoshow .= ($titletoshow ? ' ' : '').dol_escape_htmltag($event->label ? $event->label : $event->libelle);
if ($event->type_code != 'ICALEVENT') {
$savlabel = $event->label ? $event->label : $event->libelle;
diff --git a/htdocs/comm/action/info.php b/htdocs/comm/action/info.php
index 807a8e6f412..d4588223b26 100644
--- a/htdocs/comm/action/info.php
+++ b/htdocs/comm/action/info.php
@@ -39,6 +39,9 @@ $langs->load("commercial");
$id = GETPOST('id', 'int');
+// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
+$hookmanager->initHooks(array('actioncard', 'globalcard'));
+
// Security check
if ($user->socid > 0) {
$action = '';
@@ -50,6 +53,8 @@ if ($user->socid && $socid) {
$result = restrictedArea($user, 'societe', $socid);
}
+$usercancreate = $user->rights->agenda->allactions->create || (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->rights->agenda->myactions->create);
+
/*
* View
@@ -81,6 +86,15 @@ $out .= ' '.img_picto($langs->trans("ViewDay"), 'object_calendarday', 'class="hideonsmartphone pictoactionview"');
$out .= ' '.$langs->trans("ViewDay").' ';
+// Add more views from hooks
+$parameters = array();
+$reshook = $hookmanager->executeHooks('addCalendarView', $parameters, $object, $action);
+if (empty($reshook)) {
+ $out .= $hookmanager->resPrint;
+} elseif ($reshook > 1) {
+ $out = $hookmanager->resPrint;
+}
+
$linkback .= $out;
$morehtmlref = '';
@@ -89,17 +103,22 @@ $morehtmlref = '
';
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- //$morehtmlref.='
'.$langs->trans('Project') . ' ';
- $morehtmlref .= $langs->trans('Project').': ';
- if (!empty($object->fk_project)) {
- $proj = new Project($db);
- $proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
- if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ //$morehtmlref .= '
';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
+ if ($action != 'classify') {
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
- $morehtmlref .= '';
+ if (!empty($object->fk_project)) {
+ $proj = new Project($db);
+ $proj->fetch($object->fk_project);
+ $morehtmlref .= $proj->getNomUrl(1);
+ if ($proj->title) {
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
+ }
+ }
}
}
$morehtmlref .= '
';
diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php
index 4c758600082..d44bbda6fd5 100644
--- a/htdocs/comm/action/list.php
+++ b/htdocs/comm/action/list.php
@@ -270,6 +270,7 @@ if (empty($reshook)) {
*/
$form = new Form($db);
+$userstatic = new User($db);
$formactions = new FormActions($db);
$actionstatic = new ActionComm($db);
@@ -572,7 +573,7 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
$nbtotalofrecords++;
}*/
/* The fast and low memory method to get and count full list converts the sql into a sql count */
- $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),]+FROM/i', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
+ $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/Ui', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
$resql = $db->query($sqlforcount);
$objforcount = $db->fetch_object($resql);
$nbtotalofrecords = $objforcount->nbtotalofrecords;
@@ -714,7 +715,7 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
$moreforfilter = '';
$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
-$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
+$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
if ($massactionbutton) {
$selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
}
@@ -728,6 +729,13 @@ print '
';
print '
'."\n";
print '';
+// Action column
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons('left');
+ print $searchpicto;
+ print ' ';
+}
if (!empty($arrayfields['a.id']['checked'])) {
print ' ';
}
@@ -794,10 +802,12 @@ if (!empty($arrayfields['a.percent']['checked'])) {
print '';
}
// Action column
-print '';
-$searchpicto = $form->showFilterButtons();
-print $searchpicto;
-print ' ';
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons();
+ print $searchpicto;
+ print ' ';
+}
print ' '."\n";
$totalarray = array();
@@ -806,6 +816,9 @@ $totalarray['nbfield'] = 0;
// Fields title label
// --------------------------------------------------------------------
print '';
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
+}
if (!empty($arrayfields['a.id']['checked'])) {
print_liste_field_titre($arrayfields['a.id']['label'], $_SERVER["PHP_SELF"], "a.id", $param, "", "", $sortfield, $sortorder);
$totalarray['nbfield']++;
@@ -867,7 +880,9 @@ if (!empty($arrayfields['a.percent']['checked'])) {
print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "a.percent", $param, "", 'align="center"', $sortfield, $sortorder);
$totalarray['nbfield']++;
}
-print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
+}
$totalarray['nbfield']++;
print " \n";
@@ -973,7 +988,18 @@ while ($i < $imaxinloop) {
}
print '';
-
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
// Ref
if (!empty($arrayfields['a.id']['checked'])) {
print '';
@@ -1158,15 +1184,17 @@ while ($i < $imaxinloop) {
print ' '.$actionstatic->LibStatut($obj->percent, 5, 0, $datep).' ';
}
// Action column
- print '';
- if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
- $selected = 0;
- if (in_array($obj->id, $arrayofselected)) {
- $selected = 1;
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print ' ';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
}
- print ' ';
+ print ' ';
}
- print '';
print ' '."\n";
diff --git a/htdocs/comm/card.php b/htdocs/comm/card.php
index f6ae06b1f7f..f578aa75cf5 100644
--- a/htdocs/comm/card.php
+++ b/htdocs/comm/card.php
@@ -158,7 +158,7 @@ if (empty($reshook)) {
$action = "";
}
- // set accountancy code
+ // Set accountancy code
if ($action == 'setcustomeraccountancycode') {
$result = $object->fetch($id);
$object->code_compta_client = GETPOST("customeraccountancycode");
@@ -169,7 +169,7 @@ if (empty($reshook)) {
}
}
- // terms of the settlement
+ // Payment terms of the settlement
if ($action == 'setconditions' && $user->rights->societe->creer) {
$object->fetch($id);
$result = $object->setPaymentTerms(GETPOST('cond_reglement_id', 'int'), GETPOST('cond_reglement_id_deposit_percent', 'alpha'));
@@ -178,7 +178,7 @@ if (empty($reshook)) {
}
}
- // mode de reglement
+ // Payment mode
if ($action == 'setmode' && $user->rights->societe->creer) {
$object->fetch($id);
$result = $object->setPaymentMethods(GETPOST('mode_reglement_id', 'int'));
@@ -187,7 +187,7 @@ if (empty($reshook)) {
}
}
- // transport mode
+ // Transport mode
if ($action == 'settransportmode' && $user->rights->societe->creer) {
$object->fetch($id);
$result = $object->setTransportMode(GETPOST('transport_mode_id', 'alpha'));
@@ -421,7 +421,7 @@ if ($object->id > 0) {
print "";
print '';
- // Mode de reglement par defaut
+ // Default payment mode
print '';
print '';
print $langs->trans('PaymentMode');
@@ -440,7 +440,7 @@ if ($object->id > 0) {
print ' ';
if (isModEnabled("banque")) {
- // Compte bancaire par défaut
+ // Default bank account for payments
print '';
print '';
print $langs->trans('PaymentBankAccount');
@@ -1165,7 +1165,7 @@ if ($object->id > 0) {
$late = '';
foreach ($contrat->lines as $line) {
if ($contrat->statut == Contrat::STATUS_VALIDATED && $line->statut == ContratLigne::STATUS_OPEN) {
- if (((!empty($line->date_fin_validite) ? $line->date_fin_validite : 0) + $conf->contrat->services->expires->warning_delay) < $now) {
+ if (((!empty($line->date_end) ? $line->date_end : 0) + $conf->contrat->services->expires->warning_delay) < $now) {
$late = img_warning($langs->trans("Late"));
}
}
diff --git a/htdocs/comm/index.php b/htdocs/comm/index.php
index 27f9b91a9d7..2c20eaea352 100644
--- a/htdocs/comm/index.php
+++ b/htdocs/comm/index.php
@@ -321,7 +321,7 @@ if (isModEnabled('supplier_proposal') && $user->rights->supplier_proposal->lire)
/*
- * Draft customer orders
+ * Draft sales orders
*/
if (isModEnabled('commande') && $user->rights->commande->lire) {
@@ -1091,7 +1091,7 @@ if (isModEnabled('commande') && $user->rights->commande->lire) {
print '
';
print ' ';
- print ''.$companystatic->getNomUrl(1, 'customer', 44).' ';
+ print ''.$companystatic->getNomUrl(1, 'customer', 44).' ';
$datem = $db->jdate($obj->dv);
print '';
print dol_print_date($datem, 'day', 'tzserver');
diff --git a/htdocs/comm/mailing/card.php b/htdocs/comm/mailing/card.php
index e59389a87b7..0afb5cdd230 100644
--- a/htdocs/comm/mailing/card.php
+++ b/htdocs/comm/mailing/card.php
@@ -84,6 +84,8 @@ if (empty($user->rights->mailing->lire) || (empty($conf->global->EXTERNAL_USERS_
accessforbidden();
}
+$upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, 2, 0, 1, $object, 'mailing');
+
/*
* Actions
@@ -124,8 +126,6 @@ if (empty($reshook)) {
setEventMessages($langs->trans("NotEnoughPermissions"), null, 'warnings');
$action = '';
} else {
- $upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, 2, 0, 1, $object, 'mailing');
-
if ($object->statut == 0) {
dol_print_error('', 'ErrorMailIsNotValidated');
exit;
@@ -227,13 +227,13 @@ if (empty($reshook)) {
$substitutionarray['__UNSUBSCRIBE_URL__'] = DOL_MAIN_URL_ROOT.'/public/emailing/mailing-unsubscribe.php?tag='.urlencode($obj->tag).'&unsuscrib=1&securitykey='.urlencode($conf->global->MAILING_EMAIL_UNSUBSCRIBE_KEY).'&email='.urlencode($obj->email).'&mtid='.$obj->rowid;
$onlinepaymentenabled = 0;
- if (!empty($conf->paypal->enabled)) {
+ if (isModEnabled('paypal')) {
$onlinepaymentenabled++;
}
- if (!empty($conf->paybox->enabled)) {
+ if (isModEnabled('paybox')) {
$onlinepaymentenabled++;
}
- if (!empty($conf->stripe->enabled)) {
+ if (isModEnabled('stripe')) {
$onlinepaymentenabled++;
}
if ($onlinepaymentenabled && !empty($conf->global->PAYMENT_SECURITY_TOKEN)) {
@@ -263,7 +263,7 @@ if (empty($reshook)) {
$substitutionarray['__PUBLICLINK_NEWMEMBERFORM__'] = ''.$langs->trans('BlankSubscriptionForm'). ' ';
}
/* For backward compatibility, deprecated */
- if (!empty($conf->paypal->enabled) && !empty($conf->global->PAYPAL_SECURITY_TOKEN)) {
+ if (isModEnabled('paypal') && !empty($conf->global->PAYPAL_SECURITY_TOKEN)) {
$substitutionarray['__SECUREKEYPAYPAL__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2);
if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) {
@@ -318,7 +318,8 @@ if (empty($reshook)) {
// Mail making
$trackid = 'emailing-'.$obj->fk_mailing.'-'.$obj->rowid;
- $mail = new CMailFile($newsubject, $sendto, $from, $newmessage, $arr_file, $arr_mime, $arr_name, '', '', 0, $msgishtml, $errorsto, $arr_css, $trackid, $moreinheader, 'emailing');
+ $upload_dir_tmp = $upload_dir;
+ $mail = new CMailFile($newsubject, $sendto, $from, $newmessage, $arr_file, $arr_mime, $arr_name, '', '', 0, $msgishtml, $errorsto, $arr_css, $trackid, $moreinheader, 'emailing', '', $upload_dir_tmp);
if ($mail->error) {
$res = 0;
@@ -478,7 +479,8 @@ if (empty($reshook)) {
}
$trackid = 'emailing-test';
- $mailfile = new CMailFile($tmpsujet, $object->sendto, $object->email_from, $tmpbody, $arr_file, $arr_mime, $arr_name, '', '', 0, $msgishtml, $object->email_errorsto, $arr_css, $trackid, '', 'emailing');
+ $upload_dir_tmp = $upload_dir;
+ $mailfile = new CMailFile($tmpsujet, $object->sendto, $object->email_from, $tmpbody, $arr_file, $arr_mime, $arr_name, '', '', 0, $msgishtml, $object->email_errorsto, $arr_css, $trackid, '', 'emailing', '', $upload_dir_tmp);
$result = $mailfile->sendfile();
if ($result) {
@@ -520,9 +522,10 @@ if (empty($reshook)) {
exit;
}
$mesgs[] = $object->error;
+ $mesgs = array_merge($mesgs, $object->errors);
}
- setEventMessages(null, $mesgs, 'errors');
+ setEventMessages('', $mesgs, 'errors');
$action = "create";
}
@@ -607,9 +610,10 @@ if (empty($reshook)) {
exit;
}
$mesgs[] = $object->error;
+ $mesgs = array_merge($mesgs, $object->errors);
}
- setEventMessages($mesg, $mesgs, 'errors');
+ setEventMessages('', $mesgs, 'errors');
$action = "edit";
} else {
$action = "edit";
@@ -726,11 +730,14 @@ if ($action == 'create') {
// Print mail form
print load_fiche_titre($langs->trans("NewMailing"), $availablelink, 'object_email');
- print dol_get_fiche_head();
+ print dol_get_fiche_head(array(), '', '', -3);
print '';
- print ' ';
+ print ' ';
print '';
print ''.$langs->trans("MailTopic").' ';
@@ -761,7 +768,7 @@ if ($action == 'create') {
print dol_get_fiche_end();
- print $form->buttonsSaveCancel("CreateMailing", '');
+ print $form->buttonsSaveCancel("CreateMailing", 'Cancel');
print '';
} else {
@@ -887,16 +894,16 @@ if ($action == 'create') {
// Description
print '';
- print $form->editfieldkey("MailTitle", 'title', $object->title, $object, $user->rights->mailing->creer && $object->statut < 3, 'string');
+ print $form->editfieldkey("MailTitle", 'title', $object->title, $object, $user->hasRight('mailing', 'creer'), 'string');
print ' ';
- print $form->editfieldval("MailTitle", 'title', $object->title, $object, $user->rights->mailing->creer && $object->statut < 3, 'string');
+ print $form->editfieldval("MailTitle", 'title', $object->title, $object, $user->hasRight('mailing', 'creer'), 'string');
print ' ';
// From
print '';
- print $form->editfieldkey("MailFrom", 'email_from', $object->email_from, $object, $user->rights->mailing->creer && $object->statut < 3, 'string');
+ print $form->editfieldkey("MailFrom", 'email_from', $object->email_from, $object, $user->hasRight('mailing', 'creer') && $object->statut < 3, 'string');
print ' ';
- print $form->editfieldval("MailFrom", 'email_from', $object->email_from, $object, $user->rights->mailing->creer && $object->statut < 3, 'string');
+ print $form->editfieldval("MailFrom", 'email_from', $object->email_from, $object, $user->hasRight('mailing', 'creer') && $object->statut < 3, 'string');
$email = CMailFile::getValidAddress($object->email_from, 2);
if ($email && !isValidEmail($email)) {
$langs->load("errors");
@@ -910,9 +917,9 @@ if ($action == 'create') {
// Errors to
print ' ';
- print $form->editfieldkey("MailErrorsTo", 'email_errorsto', $object->email_errorsto, $object, $user->rights->mailing->creer && $object->statut < 3, 'string');
+ print $form->editfieldkey("MailErrorsTo", 'email_errorsto', $object->email_errorsto, $object, $user->hasRight('mailing', 'creer') && $object->statut < 3, 'string');
print ' ';
- print $form->editfieldval("MailErrorsTo", 'email_errorsto', $object->email_errorsto, $object, $user->rights->mailing->creer && $object->statut < 3, 'string');
+ print $form->editfieldval("MailErrorsTo", 'email_errorsto', $object->email_errorsto, $object, $user->hasRight('mailing', 'creer') && $object->statut < 3, 'string');
$email = CMailFile::getValidAddress($object->email_errorsto, 2);
if ($email && !isValidEmail($email)) {
$langs->load("errors");
@@ -977,11 +984,11 @@ if ($action == 'create') {
if (GETPOST('cancel', 'alpha') || $confirm == 'no' || $action == '' || in_array($action, array('settodraft', 'valid', 'delete', 'sendall', 'clone', 'test'))) {
print "\n\n\n";
- if (($object->statut == 1) && ($user->rights->mailing->valider || $object->user_validation == $user->id)) {
+ if (($object->statut == 1) && ($user->hasRight('mailing', 'valider') || $object->user_validation == $user->id)) {
print '
'.$langs->trans("SetToDraft").' ';
}
- if (($object->statut == 0 || $object->statut == 1 || $object->statut == 2) && $user->rights->mailing->creer) {
+ if (($object->statut == 0 || $object->statut == 1 || $object->statut == 2) && $user->hasRight('mailing', 'creer')) {
if (isModEnabled('fckeditor') && !empty($conf->global->FCKEDITOR_ENABLE_MAILING)) {
print '
'.$langs->trans("EditWithEditor").' ';
} else {
@@ -1011,7 +1018,7 @@ if ($action == 'create') {
}
}
- if (($object->statut == 1 || $object->statut == 2) && $object->nbemail > 0 && $user->rights->mailing->valider) {
+ if (($object->statut == 1 || $object->statut == 2) && $object->nbemail > 0 && $user->hasRight('mailing', 'valider')) {
if ($conf->global->MAILING_LIMIT_SENDBYWEB < 0) {
print '
'.$langs->trans("SendMailing").' ';
} elseif (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !$user->rights->mailing->mailing_advance->send) {
@@ -1021,11 +1028,11 @@ if ($action == 'create') {
}
}
- if ($user->rights->mailing->creer) {
+ if ($user->hasRight('mailing', 'creer')) {
print '
'.$langs->trans("ToClone").' ';
}
- if (($object->statut == 2 || $object->statut == 3) && $user->rights->mailing->valider) {
+ if (($object->statut == 2 || $object->statut == 3) && $user->hasRight('mailing', 'valider')) {
if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !$user->rights->mailing->mailing_advance->send) {
print '
'.$langs->trans("ResetMailing").' ';
} else {
@@ -1033,7 +1040,7 @@ if ($action == 'create') {
}
}
- if (($object->statut <= 1 && $user->rights->mailing->creer) || $user->rights->mailing->supprimer) {
+ if (($object->statut <= 1 && $user->hasRight('mailing', 'creer')) || $user->hasRight('mailing', 'supprimer')) {
if ($object->statut > 0 && (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !$user->rights->mailing->mailing_advance->delete)) {
print '
'.$langs->trans("DeleteMailing").' ';
} else {
@@ -1262,8 +1269,9 @@ if ($action == 'create') {
$out .= '
';
}
} else {
- $out .= ''.$langs->trans("NoAttachedFiles").' ';
+ //$out .= ''.$langs->trans("NoAttachedFiles").' ';
}
+
// Add link to add file
$maxfilesizearray = getMaxFileSizeArray();
$maxmin = $maxfilesizearray['maxmin'];
@@ -1272,7 +1280,7 @@ if ($action == 'create') {
}
$out .= ' ';
$out .= ' ';
- $out .= ' ';
+ $out .= ' ';
print $out;
print ' ';
@@ -1306,7 +1314,7 @@ if ($action == 'create') {
print '';
print ' ';
- print ' ';
+ print ' ';
print ' ';
print '
';
diff --git a/htdocs/comm/mailing/cibles.php b/htdocs/comm/mailing/cibles.php
index 1beefca8cf6..fa2f3a3a83b 100644
--- a/htdocs/comm/mailing/cibles.php
+++ b/htdocs/comm/mailing/cibles.php
@@ -394,7 +394,7 @@ if ($object->fetch($id) >= 0) {
if (empty($obj->picto)) {
$obj->picto = 'generic';
}
- print img_object($langs->trans("EmailingTargetSelector").': '.get_class($obj), $obj->picto, 'class="valignmiddle pictomodule"');
+ print img_object($langs->trans("EmailingTargetSelector").': '.get_class($obj), $obj->picto, 'class="valignmiddle pictomodule pictofixedwidth"');
print ' ';
print $obj->getDesc();
print '';
@@ -544,7 +544,7 @@ if ($object->fetch($id) >= 0) {
if ($allowaddtarget) {
$morehtmlcenter = ''.$langs->trans("ToClearAllRecipientsClickHere").' id.'" class="button reposition smallpaddingimp">'.$langs->trans("TargetsReset").' ';
}
- $morehtmlcenter .= ' id.'">'.$langs->trans("Download").' ';
+ $morehtmlcenter .= ' id.'">'.img_picto('', 'download', 'class="pictofixedwidth"').$langs->trans("Download").' ';
$massactionbutton = '';
@@ -633,10 +633,12 @@ if ($object->fetch($id) >= 0) {
include_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
include_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
include_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
+ include_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorboothattendee.class.php';
$objectstaticmember = new Adherent($db);
$objectstaticuser = new User($db);
$objectstaticcompany = new Societe($db);
$objectstaticcontact = new Contact($db);
+ $objectstaticeventorganization = new ConferenceOrBoothAttendee($db);
while ($i < min($num, $limit)) {
$obj = $db->fetch_object($resql);
@@ -662,6 +664,9 @@ if ($object->fetch($id) >= 0) {
} elseif ($obj->source_type == 'contact') {
$objectstaticcontact->fetch($obj->source_id);
print $objectstaticcontact->getNomUrl(1);
+ } elseif ($obj->source_type == 'eventorganizationattendee') {
+ $objectstaticeventorganization->fetch($obj->source_id);
+ print $objectstaticeventorganization->getNomUrl(1);
} else {
print $obj->source_url;
}
diff --git a/htdocs/comm/mailing/class/advtargetemailing.class.php b/htdocs/comm/mailing/class/advtargetemailing.class.php
index ea6ec241b16..7b4e06c897f 100644
--- a/htdocs/comm/mailing/class/advtargetemailing.class.php
+++ b/htdocs/comm/mailing/class/advtargetemailing.class.php
@@ -119,13 +119,23 @@ class AdvanceTargetingMailing extends CommonObject
'3' => $langs->trans('ThirdParty'),
'4' => $langs->trans('ContactsWithThirdpartyFilter')
);
- $this->type_statuscommprospect = array(
- -1 => $langs->trans("StatusProspect-1"),
- 0 => $langs->trans("StatusProspect0"),
- 1 => $langs->trans("StatusProspect1"),
- 2 => $langs->trans("StatusProspect2"),
- 3 => $langs->trans("StatusProspect3")
- );
+
+ require_once DOL_DOCUMENT_ROOT.'/societe/class/client.class.php';
+ $customerStatic = new Client($this->db);
+ $customerStatic->loadCacheOfProspStatus();
+ if (!empty($customerStatic->cacheprospectstatus)) {
+ foreach ($customerStatic->cacheprospectstatus as $dataProspectSt) {
+ $this->type_statuscommprospect[$dataProspectSt['id']]=$dataProspectSt['label'];
+ }
+ } else {
+ $this->type_statuscommprospect = array(
+ -1 => $langs->trans("StatusProspect-1"),
+ 0 => $langs->trans("StatusProspect0"),
+ 1 => $langs->trans("StatusProspect1"),
+ 2 => $langs->trans("StatusProspect2"),
+ 3 => $langs->trans("StatusProspect3")
+ );
+ }
}
/**
diff --git a/htdocs/comm/mailing/class/html.formadvtargetemailing.class.php b/htdocs/comm/mailing/class/html.formadvtargetemailing.class.php
index 9e10d51031e..50169438baa 100644
--- a/htdocs/comm/mailing/class/html.formadvtargetemailing.class.php
+++ b/htdocs/comm/mailing/class/html.formadvtargetemailing.class.php
@@ -355,7 +355,7 @@ class FormAdvTargetEmailing extends Form
$out = '';
$sql = "SELECT c.rowid, c.name, c.fk_element";
- $sql .= " FROM ".MAIN_DB_PREFIX."advtargetemailing as c";
+ $sql .= " FROM ".MAIN_DB_PREFIX."mailing_advtarget as c";
$sql .= " WHERE type_element = '".$this->db->escape($type_element)."'";
$sql .= " ORDER BY c.name";
diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php
index 96acf0913f9..07729fd55de 100644
--- a/htdocs/comm/propal/card.php
+++ b/htdocs/comm/propal/card.php
@@ -61,10 +61,10 @@ if (isModEnabled('variants')) {
// Load translation files required by the page
$langs->loadLangs(array('companies', 'propal', 'compta', 'bills', 'orders', 'products', 'deliveries', 'sendings', 'other'));
-if (!empty($conf->incoterm->enabled)) {
+if (isModEnabled('incoterm')) {
$langs->load('incoterm');
}
-if (!empty($conf->margin->enabled)) {
+if (isModEnabled('margin')) {
$langs->load('margins');
}
@@ -131,7 +131,6 @@ $permissiontoedit = $usercancreate; // Used by the include of actions_lineupdown
// Security check
if (!empty($user->socid)) {
$socid = $user->socid;
- $object->id = $user->socid;
}
restrictedArea($user, 'propal', $object->id);
@@ -375,7 +374,7 @@ if (empty($reshook)) {
if ($result < 0) {
setEventMessages($object->error, $object->errors, 'errors');
}
- } elseif ($action == 'set_incoterms' && !empty($conf->incoterm->enabled) && $usercancreate) {
+ } elseif ($action == 'set_incoterms' && isModEnabled('incoterm') && $usercancreate) {
// Set incoterm
$result = $object->setIncoterms(GETPOST('incoterm_id', 'int'), GETPOST('location_incoterms', 'alpha'));
} elseif ($action == 'add' && $usercancreate) {
@@ -1048,7 +1047,7 @@ if (empty($reshook)) {
$filter = array('t.fk_product' => $prod->id, 't.fk_soc' => $object->thirdparty->id);
- $result = $prodcustprice->fetch_all('', '', 0, 0, $filter);
+ $result = $prodcustprice->fetchAll('', '', 0, 0, $filter);
if ($result) {
// If there is some prices specific to the customer
if (count($prodcustprice->lines) > 0) {
@@ -1792,13 +1791,13 @@ if ($action == 'create') {
// Terms of payment
print ''.$langs->trans('PaymentConditionsShort').' ';
print img_picto('', 'paiment');
- print $form->getSelectConditionsPaiements((GETPOSTISSET('cond_reglement_id') && GETPOST('cond_reglement_id') != 0) ? GETPOST('cond_reglement_id', 'int') : $soc->cond_reglement_id, 'cond_reglement_id', 1, 1, 0, '', (GETPOSTISSET('cond_reglement_id_deposit_percent') ? GETPOST('cond_reglement_id_deposit_percent', 'alpha') : $soc->deposit_percent));
+ print $form->getSelectConditionsPaiements((GETPOSTISSET('cond_reglement_id') && GETPOST('cond_reglement_id', 'int') != 0) ? GETPOST('cond_reglement_id', 'int') : $soc->cond_reglement_id, 'cond_reglement_id', 1, 1, 0, '', (GETPOSTISSET('cond_reglement_id_deposit_percent') ? GETPOST('cond_reglement_id_deposit_percent', 'alpha') : $soc->deposit_percent));
print ' ';
// Mode of payment
print ''.$langs->trans('PaymentMode').' ';
print img_picto('', 'bank', 'class="pictofixedwidth"');
- print $form->select_types_paiements((GETPOSTISSET('mode_reglement_id') && GETPOST('mode_reglement_id') != 0) ? GETPOST('mode_reglement_id', 'int') : $soc->mode_reglement_id, 'mode_reglement_id', 'CRDT', 0, 1, 0, 0, 1, 'maxwidth200 widthcentpercentminusx', 1);
+ print $form->select_types_paiements((GETPOSTISSET('mode_reglement_id') && GETPOST('mode_reglement_id', 'int') != 0) ? GETPOST('mode_reglement_id', 'int') : $soc->mode_reglement_id, 'mode_reglement_id', 'CRDT', 0, 1, 0, 0, 1, 'maxwidth200 widthcentpercentminusx', 1);
print ' ';
// Bank Account
@@ -1870,7 +1869,7 @@ if ($action == 'create') {
}
// Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
print '';
print ''.$form->textwithpicto($langs->trans("IncotermLabel"), $soc->label_incoterms, 1).' ';
print '';
@@ -2004,8 +2003,8 @@ if ($action == 'create') {
$i = 0;
while ($i < $num) {
$row = $db->fetch_row($resql);
- $propalRefAndSocName = $row [1]." - ".$row [2];
- $liste_propal [$row [0]] = $propalRefAndSocName;
+ $propalRefAndSocName = $row[1]." - ".$row[2];
+ $liste_propal[$row[0]] = $propalRefAndSocName;
$i++;
}
print $form->selectarray("copie_propal", $liste_propal, 0);
@@ -2297,39 +2296,28 @@ if ($action == 'create') {
$morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, $usercancreate, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, $usercancreate, 'string'.(isset($conf->global->THIRDPARTY_REF_INPUT_SIZE) ? ':'.$conf->global->THIRDPARTY_REF_INPUT_SIZE : ''), '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ''.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'customer');
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1, 'customer');
if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
$morehtmlref .= ' ('.$langs->trans("OtherProposals").' )';
}
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ''.$langs->trans('Project').' ';
+ $morehtmlref .= ' ';
if ($usercancreate) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ': '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
@@ -2343,7 +2331,7 @@ if ($action == 'create') {
print '';
print '
';
- print '
';
+ print '';
// Link for thirdparty discounts
if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
@@ -2403,7 +2391,7 @@ if ($action == 'create') {
// Date end proposal
print '';
print '';
- print '';
+ print '';
print $langs->trans('DateEndPropal');
print ' ';
if ($action != 'editecheance' && $usercancreate && $caneditfield) {
@@ -2655,7 +2643,7 @@ if ($action == 'create') {
}
// Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
print '';
print '';
print $langs->trans('IncotermLabel');
@@ -2737,7 +2725,7 @@ if ($action == 'create') {
print '
';
// Margin Infos
- if (!empty($conf->margin->enabled)) {
+ if (isModEnabled('margin')) {
$formmargin->displayMarginInfos($object);
}
@@ -2933,10 +2921,7 @@ if ($action == 'create') {
}
// Delete
- if ($usercandelete) {
- print 'id.'&action=delete&token='.newToken().'"';
- print '>'.$langs->trans('Delete').' ';
- }
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $usercandelete);
}
}
diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php
index 46474092448..3dec7256171 100644
--- a/htdocs/comm/propal/class/propal.class.php
+++ b/htdocs/comm/propal/class/propal.class.php
@@ -53,6 +53,11 @@ class Propal extends CommonObject
{
use CommonIncoterm;
+ /**
+ * @var string code
+ */
+ public $code = "";
+
/**
* @var string ID to identify managed object
*/
@@ -1102,6 +1107,7 @@ class Propal extends CommonObject
$sql .= ", fk_mode_reglement";
$sql .= ", fk_account";
$sql .= ", ref_client";
+ $sql .= ", ref_ext";
$sql .= ", date_livraison";
$sql .= ", fk_shipping_method";
$sql .= ", fk_warehouse";
@@ -1136,6 +1142,7 @@ class Propal extends CommonObject
$sql .= ", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) : 'NULL');
$sql .= ", ".($this->fk_account > 0 ? ((int) $this->fk_account) : 'NULL');
$sql .= ", '".$this->db->escape($this->ref_client)."'";
+ $sql .= ", '".$this->db->escape($this->ref_ext)."'";
$sql .= ", ".(empty($delivery_date) ? "NULL" : "'".$this->db->idate($delivery_date)."'");
$sql .= ", ".($this->shipping_method_id > 0 ? $this->shipping_method_id : 'NULL');
$sql .= ", ".($this->warehouse_id > 0 ? $this->warehouse_id : 'NULL');
@@ -1412,7 +1419,7 @@ class Propal extends CommonObject
} elseif (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) {
$prodcustprice = new Productcustomerprice($this->db);
$filter = array('t.fk_product' => $prod->id, 't.fk_soc' => $objsoc->id);
- $result = $prodcustprice->fetch_all('', '', 0, 0, $filter);
+ $result = $prodcustprice->fetchAll('', '', 0, 0, $filter);
if ($result) {
// If there is some prices specific to the customer
if (count($prodcustprice->lines) > 0) {
@@ -1520,7 +1527,7 @@ class Propal extends CommonObject
$sql .= ", p.datep as dp";
$sql .= ", p.fin_validite as dfv";
$sql .= ", p.date_livraison as delivery_date";
- $sql .= ", p.model_pdf, p.last_main_doc, p.ref_client, p.extraparams";
+ $sql .= ", p.model_pdf, p.last_main_doc, p.ref_client, ref_ext, p.extraparams";
$sql .= ", p.note_private, p.note_public";
$sql .= ", p.fk_projet as fk_project, p.fk_statut";
$sql .= ", p.fk_user_author, p.fk_user_valid, p.fk_user_cloture";
@@ -1572,6 +1579,7 @@ class Propal extends CommonObject
$this->ref = $obj->ref;
$this->ref_client = $obj->ref_client;
+ $this->ref_ext = $obj->ref_ext;
$this->remise = $obj->remise;
$this->remise_percent = $obj->remise_percent;
$this->remise_absolue = $obj->remise_absolue;
@@ -2107,11 +2115,11 @@ class Propal extends CommonObject
* Define end validity date
*
* @param User $user Object user that modify
- * @param int $date_fin_validite End of validity date
+ * @param int $date_end_validity End of validity date
* @param int $notrigger 1=Does not execute triggers, 0= execute triggers
* @return int <0 if KO, >0 if OK
*/
- public function set_echeance($user, $date_fin_validite, $notrigger = 0)
+ public function set_echeance($user, $date_end_validity, $notrigger = 0)
{
// phpcs:enable
if (!empty($user->rights->propal->creer)) {
@@ -2119,8 +2127,8 @@ class Propal extends CommonObject
$this->db->begin();
- $sql = "UPDATE ".MAIN_DB_PREFIX."propal SET fin_validite = ".($date_fin_validite != '' ? "'".$this->db->idate($date_fin_validite)."'" : 'null');
- $sql .= " WHERE rowid = ".((int) $this->id)." AND fk_statut = ".self::STATUS_DRAFT;
+ $sql = "UPDATE ".MAIN_DB_PREFIX."propal SET fin_validite = ".($date_end_validity != '' ? "'".$this->db->idate($date_end_validity)."'" : 'null');
+ $sql .= " WHERE rowid = ".((int) $this->id)." AND fk_statut = ".((int) self::STATUS_DRAFT);
dol_syslog(__METHOD__, LOG_DEBUG);
$resql = $this->db->query($sql);
@@ -2132,7 +2140,7 @@ class Propal extends CommonObject
if (!$error) {
$this->oldcopy = clone $this;
- $this->fin_validite = $date_fin_validite;
+ $this->fin_validite = $date_end_validity;
}
if (!$notrigger && empty($error)) {
@@ -2639,10 +2647,10 @@ class Propal extends CommonObject
if ($resql) {
// Status self::STATUS_REFUSED by default
$modelpdf = !empty($conf->global->PROPALE_ADDON_PDF_ODT_CLOSED) ? $conf->global->PROPALE_ADDON_PDF_ODT_CLOSED : $this->model_pdf;
- $trigger_name = 'PROPAL_CLOSE_REFUSED';
+ $trigger_name = 'PROPAL_CLOSE_REFUSED'; // used later in call_trigger()
if ($status == self::STATUS_SIGNED) { // Status self::STATUS_SIGNED
- $trigger_name = 'PROPAL_CLOSE_SIGNED';
+ $trigger_name = 'PROPAL_CLOSE_SIGNED'; // used later in call_trigger()
$modelpdf = !empty($conf->global->PROPALE_ADDON_PDF_ODT_TOBILL) ? $conf->global->PROPALE_ADDON_PDF_ODT_TOBILL : $this->model_pdf;
// The connected company is classified as a client
@@ -3344,7 +3352,7 @@ class Propal extends CommonObject
public function LibStatut($status, $mode = 1)
{
// phpcs:enable
- global $conf;
+ global $conf, $hookmanager;
// Init/load array of translation of status
if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
@@ -3375,6 +3383,14 @@ class Propal extends CommonObject
$statusType = 'status6';
}
+
+ $parameters = array('status' => $status, 'mode' => $mode);
+ $reshook = $hookmanager->executeHooks('LibStatut', $parameters, $this); // Note that $action and $object may have been modified by hook
+
+ if ($reshook > 0) {
+ return $hookmanager->resPrint;
+ }
+
return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode);
}
@@ -4429,8 +4445,8 @@ class PropaleLigne extends CommonObjectLine
$sql .= ", qty='".price2num($this->qty)."'";
$sql .= ", subprice=".price2num($this->subprice)."";
$sql .= ", remise_percent=".price2num($this->remise_percent)."";
- $sql .= ", price=".price2num($this->price).""; // TODO A virer
- $sql .= ", remise=".price2num($this->remise).""; // TODO A virer
+ $sql .= ", price=".(float) price2num($this->price).""; // TODO A virer
+ $sql .= ", remise=".(float) price2num($this->remise).""; // TODO A virer
$sql .= ", info_bits='".$this->db->escape($this->info_bits)."'";
if (empty($this->skip_update_total)) {
$sql .= ", total_ht=".price2num($this->total_ht)."";
diff --git a/htdocs/comm/propal/class/propalestats.class.php b/htdocs/comm/propal/class/propalestats.class.php
index 1e688457623..81d49bb87ad 100644
--- a/htdocs/comm/propal/class/propalestats.class.php
+++ b/htdocs/comm/propal/class/propalestats.class.php
@@ -109,9 +109,7 @@ class PropaleStats extends Stats
}
if ($categid) {
- $this->join .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_societe as cs ON cs.fk_soc = p.fk_soc';
- $this->join .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie as c ON c.rowid = cs.fk_categorie';
- $this->where .= ' AND c.rowid = '.((int) $categid);
+ $this->where .= ' AND EXISTS (SELECT rowid FROM '.MAIN_DB_PREFIX.'categorie_societe as cats WHERE cats.fk_soc = p.fk_soc AND cats.fk_categorie = '.((int) $categid).')';
}
}
diff --git a/htdocs/comm/propal/contact.php b/htdocs/comm/propal/contact.php
index 97fceb99f9e..42f3f34f8d4 100644
--- a/htdocs/comm/propal/contact.php
+++ b/htdocs/comm/propal/contact.php
@@ -69,12 +69,14 @@ if (!empty($user->socid)) {
}
restrictedArea($user, 'propal', $object->id);
+$usercancreate = $user->hasRight("propal", "creer");
+
/*
* Add a new contact
*/
-if ($action == 'addcontact' && $user->rights->propale->creer) {
+if ($action == 'addcontact' && $user->rights->propal->creer) {
if ($object->id > 0) {
$contactid = (GETPOST('userid', 'int') ? GETPOST('userid', 'int') : GETPOST('contactid', 'int'));
$typeid = (GETPOST('typecontact') ? GETPOST('typecontact') : GETPOST('type'));
@@ -92,12 +94,12 @@ if ($action == 'addcontact' && $user->rights->propale->creer) {
setEventMessages($object->error, $object->errors, 'errors');
}
}
-} elseif ($action == 'swapstatut' && $user->rights->propale->creer) {
+} elseif ($action == 'swapstatut' && $user->rights->propal->creer) {
// Toggle the status of a contact
if ($object->id > 0) {
$result = $object->swapContactStatus(GETPOST('ligne', 'int'));
}
-} elseif ($action == 'deletecontact' && $user->rights->propale->creer) {
+} elseif ($action == 'deletecontact' && $user->rights->propal->creer) {
// Deletes a contact
$result = $object->delete_contact($lineid);
@@ -137,37 +139,25 @@ if ($object->id > 0) {
$morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'customer');
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1, 'customer');
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->propal->creer) {
+ $morehtmlref .= ' ';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/comm/propal/document.php b/htdocs/comm/propal/document.php
index f58ed518517..f1d1d7ef644 100644
--- a/htdocs/comm/propal/document.php
+++ b/htdocs/comm/propal/document.php
@@ -81,7 +81,7 @@ if (!$sortfield) {
$object = new Propal($db);
$object->fetch($id, $ref);
-$permissiontoadd = $user->rights->propale->creer;
+$permissiontoadd = $user->rights->propal->creer;
// Security check
if (!empty($user->socid)) {
@@ -90,6 +90,8 @@ if (!empty($user->socid)) {
}
restrictedArea($user, 'propal', $object->id);
+$usercancreate = $user->hasRight("propal", "creer");
+
/*
* Actions
@@ -135,37 +137,25 @@ if ($object->id > 0) {
$morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'customer');
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1, 'customer');
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->propal->creer) {
+ $morehtmlref .= ' ';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/comm/propal/index.php b/htdocs/comm/propal/index.php
index 2a9429ffeaa..4a6d9ec63ed 100644
--- a/htdocs/comm/propal/index.php
+++ b/htdocs/comm/propal/index.php
@@ -227,7 +227,7 @@ if ($resql) {
/*
* Open (validated) proposals
*/
-if (isModEnabled("propal") && $user->rights->propale->lire) {
+if (isModEnabled("propal") && $user->rights->propal->lire) {
$sql = "SELECT s.nom as socname, s.rowid as socid, s.canvas, s.client, s.email, s.code_compta";
$sql .= ", p.rowid as propalid, p.entity, p.total_ttc, p.total_ht, p.ref, p.fk_statut, p.datep as dp, p.fin_validite as dfv";
$sql .= " FROM ".MAIN_DB_PREFIX."societe as s";
@@ -312,7 +312,7 @@ if (isModEnabled("propal") && $user->rights->propale->lire) {
*/
/*
-if (!empty($conf->propal->enabled))
+if (isModEnabled('propal'))
{
$sql = "SELECT c.rowid, c.ref, c.fk_statut, s.nom as name, s.rowid as socid";
$sql.=" FROM ".MAIN_DB_PREFIX."propal as c";
@@ -387,7 +387,7 @@ if (!empty($conf->propal->enabled))
*/
/*
-if (!empty($conf->propal->enabled))
+if (isModEnabled('propal'))
{
$sql = "SELECT c.rowid, c.ref, c.fk_statut, c.facture, s.nom as name, s.rowid as socid";
$sql.= " FROM ".MAIN_DB_PREFIX."commande as c";
diff --git a/htdocs/comm/propal/info.php b/htdocs/comm/propal/info.php
index 933791bbec2..986601a91bc 100644
--- a/htdocs/comm/propal/info.php
+++ b/htdocs/comm/propal/info.php
@@ -53,6 +53,8 @@ if (!empty($user->socid)) {
}
restrictedArea($user, 'propal', $object->id);
+$usercancreate = $user->hasRight("propal", "creer");
+
/*
* View
@@ -82,37 +84,25 @@ $morehtmlref = '';
$morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
-$morehtmlref .= '
'.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+$morehtmlref .= '
'.$object->thirdparty->getNomUrl(1);
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= '
'.$langs->trans('Project').' ';
- if ($user->rights->propal->creer) {
+ $morehtmlref .= '
';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php
index b95d1e5253f..eb1791285c0 100644
--- a/htdocs/comm/propal/list.php
+++ b/htdocs/comm/propal/list.php
@@ -50,6 +50,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
+if (isModEnabled('categorie')) {
+ require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
+ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcategory.class.php';
+}
// Load translation files required by the page
$langs->loadLangs(array('companies', 'propal', 'compta', 'bills', 'orders', 'products', 'deliveries', 'categories'));
@@ -205,12 +209,12 @@ $checkedtypetiers = 0;
$arrayfields = array(
'p.ref'=>array('label'=>"Ref", 'checked'=>1),
'p.ref_client'=>array('label'=>"RefCustomer", 'checked'=>-1),
- 'pr.ref'=>array('label'=>"ProjectRef", 'checked'=>1, 'enabled'=>(!isModEnabled('project') ? 0 : 1)),
- 'pr.title'=>array('label'=>"ProjectLabel", 'checked'=>0, 'enabled'=>(!isModEnabled('project') ? 0 : 1)),
+ 'pr.ref'=>array('label'=>"ProjectRef", 'checked'=>1, 'enabled'=>(isModEnabled('project') ? 1 : 0)),
+ 'pr.title'=>array('label'=>"ProjectLabel", 'checked'=>0, 'enabled'=>(isModEnabled('project') ? 1 : 0)),
's.nom'=>array('label'=>"ThirdParty", 'checked'=>1),
's.name_alias'=>array('label'=>"AliasNameShort", 'checked'=>-1),
's.town'=>array('label'=>"Town", 'checked'=>-1),
- 's.zip'=>array('label'=>"Zip", 'checked'=>1),
+ 's.zip'=>array('label'=>"Zip", 'checked'=>-1),
'state.nom'=>array('label'=>"StateShort", 'checked'=>0),
'country.code_iso'=>array('label'=>"Country", 'checked'=>0),
'typent.code'=>array('label'=>"ThirdPartyType", 'checked'=>$checkedtypetiers),
@@ -244,8 +248,8 @@ $arrayfields = array(
'p.datec'=>array('label'=>"DateCreation", 'checked'=>0, 'position'=>500),
'p.tms'=>array('label'=>"DateModificationShort", 'checked'=>0, 'position'=>500),
'p.date_cloture'=>array('label'=>"DateClosing", 'checked'=>0, 'position'=>500),
- 'p.note_public'=>array('label'=>'NotePublic', 'checked'=>0, 'position'=>510, 'enabled'=>(empty($conf->global->MAIN_LIST_ALLOW_PUBLIC_NOTES))),
- 'p.note_private'=>array('label'=>'NotePrivate', 'checked'=>0, 'position'=>511, 'enabled'=>(empty($conf->global->MAIN_LIST_ALLOW_PRIVATE_NOTES))),
+ 'p.note_public'=>array('label'=>'NotePublic', 'checked'=>0, 'position'=>510, 'enabled'=>(!getDolGlobalInt('MAIN_LIST_HIDE_PUBLIC_NOTES'))),
+ 'p.note_private'=>array('label'=>'NotePrivate', 'checked'=>0, 'position'=>511, 'enabled'=>(!getDolGlobalInt('MAIN_LIST_HIDE_PRIVATE_NOTES'))),
'p.fk_statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000),
);
@@ -462,7 +466,7 @@ if ($action == "nosign" && $permissiontoclose) {
$error = 0;
foreach ($toselect as $checked) {
if ($tmpproposal->fetch($checked) > 0) {
- if ($tmpproposal->statut == $tmpproposal::STATUS_VALIDATED) {
+ if ($tmpproposal->statut == $tmpproposal::STATUS_VALIDATED || (!empty($conf->global->PROPAL_SKIP_ACCEPT_REFUSE) && $tmpproposal->statut == $tmpproposal::STATUS_DRAFT)) {
$tmpproposal->statut = $tmpproposal::STATUS_NOTSIGNED;
if ($tmpproposal->closeProposal($user, $tmpproposal::STATUS_NOTSIGNED) > 0) {
setEventMessage($tmpproposal->ref." ".$langs->trans('NoSigned'), 'mesgs');
@@ -536,7 +540,7 @@ $formother = new FormOther($db);
$formfile = new FormFile($db);
$formpropal = new FormPropal($db);
$formmargin = null;
-if (!empty($conf->margin->enabled)) {
+if (isModEnabled('margin')) {
$formmargin = new FormMargin($db);
}
$companystatic = new Societe($db);
@@ -548,7 +552,7 @@ $help_url = 'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'
llxHeader('', $title, $help_url);
$sql = 'SELECT';
-if ($sall || $search_product_category > 0 || $search_user > 0) {
+if ($sall || $search_user > 0) {
$sql = 'SELECT DISTINCT';
}
$sql .= ' s.rowid as socid, s.nom as name, s.name_alias as alias, s.email, s.phone, s.fax , s.address, s.town, s.zip, s.fk_pays, s.client, s.fournisseur, s.code_client, ';
@@ -578,7 +582,7 @@ if (!empty($extrafields->attributes[$object->table_element]['label'])) {
}
// Add fields from hooks
$parameters = array();
-$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$sql .= $hookmanager->resPrint;
$sql = preg_replace('/, $/', '', $sql);
$sql .= ' FROM '.MAIN_DB_PREFIX.'societe as s';
@@ -592,12 +596,9 @@ $sql .= ', '.MAIN_DB_PREFIX.'propal as p';
if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (p.rowid = ef.fk_object)";
}
-if ($sall || $search_product_category > 0) {
+if ($sall) {
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'propaldet as pd ON p.rowid=pd.fk_propal';
}
-if ($search_product_category > 0) {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_product as cp ON cp.fk_product=pd.fk_product';
-}
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'user as u ON p.fk_user_author = u.rowid';
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet as pr ON pr.rowid = p.fk_projet";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_availability as ava on (ava.rowid = p.fk_availability)";
@@ -710,10 +711,6 @@ if ($search_fk_input_reason > 0) {
if ($search_fk_mode_reglement > 0) {
$sql .= " AND p.fk_mode_reglement = ".((int) $search_fk_mode_reglement);
}
-
-if ($search_product_category > 0) {
- $sql .= " AND cp.fk_categorie = ".((int) $search_product_category);
-}
if ($socid > 0) {
$sql .= ' AND s.rowid = '.((int) $socid);
}
@@ -750,17 +747,47 @@ if ($search_date_signature_start) {
if ($search_date_signature_end) {
$sql .= " AND p.date_signature <= '".$db->idate($search_date_signature_end)."'";
}
+// Search for tag/category ($searchCategoryProductList is an array of ID)
+$searchCategoryProductOperator = -1;
+$searchCategoryProductList = array($search_product_category);
+if (!empty($searchCategoryProductList)) {
+ $searchCategoryProductSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategoryProductList as $searchCategoryProduct) {
+ if (intval($searchCategoryProduct) == -2) {
+ $searchCategoryProductSqlList[] = "NOT EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."propaldet as pd WHERE pd.fk_propal = p.rowid AND pd.fk_product = ck.fk_product)";
+ } elseif (intval($searchCategoryProduct) > 0) {
+ if ($searchCategoryProductOperator == 0) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."propaldet as pd WHERE pd.fk_propal = p.rowid AND pd.fk_product = ck.fk_product AND ck.fk_categorie = ".((int) $searchCategoryProduct).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProduct);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."propaldet as pd WHERE pd.fk_propal = p.rowid AND pd.fk_product = ck.fk_product AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategoryProductOperator == 1) {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
+ }
+ }
+}
// Add where from extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
// Add where from hooks
$parameters = array();
-$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$sql .= $hookmanager->resPrint;
// Add HAVING from hooks
$parameters = array();
-$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$sql .= empty($hookmanager->resPrint) ? "" : " HAVING 1=1 ".$hookmanager->resPrint;
$sql .= $db->order($sortfield, $sortorder);
@@ -987,7 +1014,7 @@ if ($resql) {
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
// Add $param from hooks
$parameters = array();
- $reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$param .= $hookmanager->resPrint;
// List of mass actions available
@@ -1080,13 +1107,12 @@ if ($resql) {
$moreforfilter .= '
';
}
// If the user can view products
- if (isModEnabled('categorie') && $user->rights->categorie->lire && ($user->rights->produit->lire || $user->rights->service->lire)) {
+ if (isModEnabled('categorie') && $user->hasRight('categorie', 'read') && ($user->rights->produit->lire || $user->rights->service->lire)) {
+ $searchCategoryProductOperator = -1;
include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
- $moreforfilter .= '';
$tmptitle = $langs->trans('IncludingProductWithTag');
- $cate_arbo = $form->select_all_categories(Categorie::TYPE_PRODUCT, null, 'parent', null, null, 1);
- $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$form->selectarray('search_product_category', $cate_arbo, $search_product_category, $tmptitle, 0, 0, '', 0, 0, 0, 0, (empty($conf->dol_optimize_smallscreen) ? 'maxwidth300 widthcentpercentminusx' : 'maxwidth250 widthcentpercentminusx'), 1);
- $moreforfilter .= '
';
+ $formcategory = new FormCategory($db);
+ $moreforfilter .= $formcategory->getFilterBox(Categorie::TYPE_PRODUCT, array($search_product_category), 'maxwidth300', $searchCategoryProductOperator, 0, 0, $tmptitle);
}
if (isModEnabled('categorie') && $user->rights->categorie->lire) {
require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
@@ -1104,7 +1130,7 @@ if ($resql) {
$moreforfilter .= '';
}
$parameters = array();
- $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
if (empty($reshook)) {
$moreforfilter .= $hookmanager->resPrint;
} else {
@@ -1362,7 +1388,7 @@ if ($resql) {
// Fields from hook
$parameters = array('arrayfields'=>$arrayfields);
- $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Date creation
if (!empty($arrayfields['p.datec']['checked'])) {
@@ -1404,6 +1430,14 @@ if ($resql) {
}
print " \n";
+ $totalarray = array(
+ 'nbfield' => 0,
+ 'val' => array(
+ 'p.total_ht' => 0,
+ 'p.total_tva' => 0,
+ 'p.total_ttc' => 0,
+ ),
+ );
// Fields title
print '';
@@ -1524,14 +1558,6 @@ if ($resql) {
if (!empty($arrayfields['total_mark_rate']['checked'])) {
print_liste_field_titre($arrayfields['total_mark_rate']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'class="right"', $sortfield, $sortorder);
}
- $totalarray = array(
- 'nbfield' => 0,
- 'val' => array(
- 'p.total_ht' => 0,
- 'p.total_tva' => 0,
- 'p.total_ttc' => 0,
- ),
- );
// Extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
// Hook fields
@@ -1543,7 +1569,8 @@ if ($resql) {
'totalarray' => &$totalarray,
);
- $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+
print $hookmanager->resPrint;
if (!empty($arrayfields['p.datec']['checked'])) {
print_liste_field_titre($arrayfields['p.datec']['label'], $_SERVER["PHP_SELF"], "p.datec", "", $param, 'align="center" class="nowrap"', $sortfield, $sortorder);
@@ -1573,7 +1600,7 @@ if ($resql) {
$typenArray = null;
$with_margin_info = false;
- if (!empty($conf->margin->enabled) && (
+ if (isModEnabled('margin') && (
!empty($arrayfields['total_pa']['checked'])
|| !empty($arrayfields['total_margin']['checked'])
|| !empty($arrayfields['total_margin_rate']['checked'])
@@ -1588,6 +1615,7 @@ if ($resql) {
$savnbfield = $totalarray['nbfield'];
$totalarray = array();
$totalarray['nbfield'] = 0;
+
$imaxinloop = ($limit ? min($num, $limit) : $num);
while ($i < $imaxinloop) {
$obj = $db->fetch_object($resql);
@@ -1661,6 +1689,9 @@ if ($resql) {
print ' ';
}
print '';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
}
if (!empty($arrayfields['p.ref']['checked'])) {
@@ -2047,7 +2078,7 @@ if ($resql) {
if (!empty($arrayfields['sale_representative']['checked'])) {
// Sales representatives
- print '';
+ print ' ';
if ($obj->socid > 0) {
$listsalesrepresentatives = $companystatic->getSalesRepresentatives($user);
if ($listsalesrepresentatives < 0) {
@@ -2140,7 +2171,7 @@ if ($resql) {
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
// Fields from hook
$parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
- $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Date creation
if (!empty($arrayfields['p.datec']['checked'])) {
@@ -2205,10 +2236,11 @@ if ($resql) {
print ' ';
}
print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
}
- if (!$i) {
- $totalarray['nbfield']++;
- }
+
print ' '."\n";
@@ -2232,7 +2264,7 @@ if ($resql) {
$db->free($resql);
$parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
- $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
print '
'."\n";
diff --git a/htdocs/comm/propal/note.php b/htdocs/comm/propal/note.php
index d2e453eac9e..fe4895ad2f8 100644
--- a/htdocs/comm/propal/note.php
+++ b/htdocs/comm/propal/note.php
@@ -59,12 +59,14 @@ $hookmanager->initHooks(array('propalnote'));
restrictedArea($user, 'propal', $object->id, 'propal');
+$usercancreate = $user->hasRight("propal", "creer");
+
/*
* Actions
*/
-$permissionnote = $user->rights->propale->creer; // Used by the include of actions_setnotes.inc.php
+$permissionnote = $user->rights->propal->creer; // Used by the include of actions_setnotes.inc.php
$reshook = $hookmanager->executeHooks('doActions', array(), $object, $action); // Note that $action and $object may have been modified by some hooks
if ($reshook < 0) {
@@ -107,37 +109,25 @@ if ($object->id > 0) {
$morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1);
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->propal->creer) {
+ $morehtmlref .= ' ';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/comm/propal/stats/index.php b/htdocs/comm/propal/stats/index.php
index af5247fb10f..db85490e1bb 100644
--- a/htdocs/comm/propal/stats/index.php
+++ b/htdocs/comm/propal/stats/index.php
@@ -52,7 +52,7 @@ if ($user->socid > 0) {
$socid = $user->socid;
}
-$nowyear = strftime("%Y", dol_now());
+$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$year = GETPOST('year') > 0 ? GETPOST('year', 'int') : $nowyear;
$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS)));
$endyear = $year;
@@ -60,7 +60,7 @@ $endyear = $year;
// Load translation files required by the page
$langs->loadLangs(array('orders', 'companies', 'other', 'suppliers', 'supplier_proposal'));
-if ($mode == 'customer' && !$user->rights->propale->lire) {
+if ($mode == 'customer' && !$user->rights->propal->lire) {
accessforbidden();
}
if ($mode == 'supplier' && !$user->rights->supplier_proposal->lire) {
diff --git a/htdocs/comm/propal/tpl/linkedobjectblock.tpl.php b/htdocs/comm/propal/tpl/linkedobjectblock.tpl.php
index 613f06a6feb..37c0f8d5e58 100644
--- a/htdocs/comm/propal/tpl/linkedobjectblock.tpl.php
+++ b/htdocs/comm/propal/tpl/linkedobjectblock.tpl.php
@@ -62,7 +62,7 @@ foreach ($linkedObjectBlock as $key => $objectlink) {
print ' '.$objectlink->ref_client.' ';
print ''.dol_print_date($objectlink->date, 'day').' ';
print '';
- if ($user->rights->propale->lire) {
+ if ($user->rights->propal->lire) {
$total = $total + $objectlink->total_ht;
echo price($objectlink->total_ht);
}
diff --git a/htdocs/comm/prospect/index.php b/htdocs/comm/prospect/index.php
index 83c30743c77..19bde7072ad 100644
--- a/htdocs/comm/prospect/index.php
+++ b/htdocs/comm/prospect/index.php
@@ -119,7 +119,7 @@ if ($resql) {
/*
* Liste des propal brouillons
*/
-if (isModEnabled("propal") && $user->rights->propale->lire) {
+if (isModEnabled("propal") && $user->rights->propal->lire) {
$sql = "SELECT p.rowid, p.ref, p.price, s.nom as sname";
$sql .= " FROM ".MAIN_DB_PREFIX."propal as p";
$sql .= ", ".MAIN_DB_PREFIX."societe as s";
@@ -177,7 +177,7 @@ if (isModEnabled('agenda')) {
/*
* Dernieres propales ouvertes
*/
-if (isModEnabled("propal") && $user->rights->propale->lire) {
+if (isModEnabled("propal") && $user->rights->propal->lire) {
$sql = "SELECT s.nom as name, s.rowid as socid, s.client, s.canvas,";
$sql .= " p.rowid as propalid, p.total_ttc, p.ref, p.datep as dp, c.label as statut, c.id as statutid";
$sql .= " FROM ".MAIN_DB_PREFIX."societe as s";
diff --git a/htdocs/comm/remx.php b/htdocs/comm/remx.php
index b28af96527e..fe8c630fc10 100644
--- a/htdocs/comm/remx.php
+++ b/htdocs/comm/remx.php
@@ -53,6 +53,9 @@ if ($user->socid > 0) {
}
$result = restrictedArea($user, 'societe', $id, '&societe', '', 'fk_soc', 'rowid', 0);
+$permissiontocreate = ($user->rights->societe->creer || $user->rights->facture->creer);
+
+
/*
* Actions
@@ -63,7 +66,7 @@ if (GETPOST('cancel', 'alpha') && !empty($backtopage)) {
exit;
}
-if ($action == 'confirm_split' && GETPOST("confirm", "alpha") == 'yes' && ($user->rights->societe->creer || $user->rights->facture->creer)) {
+if ($action == 'confirm_split' && GETPOST("confirm", "alpha") == 'yes' && $permissiontocreate) {
//if ($user->rights->societe->creer)
//if ($user->rights->facture->creer)
@@ -154,16 +157,17 @@ if ($action == 'confirm_split' && GETPOST("confirm", "alpha") == 'yes' && ($user
}
}
-if ($action == 'setremise' && ($user->rights->societe->creer || $user->rights->facture->creer)) {
+if ($action == 'setremise' && $permissiontocreate) {
//if ($user->rights->societe->creer)
//if ($user->rights->facture->creer)
- $amount_ht = price2num(GETPOST('amount_ht', 'alpha'));
+ $amount = price2num(GETPOST('amount', 'alpha'), '', 2);
$desc = GETPOST('desc', 'alpha');
$tva_tx = GETPOST('tva_tx', 'alpha');
$discount_type = GETPOSTISSET('discount_type') ? GETPOST('discount_type', 'alpha') : 0;
+ $price_base_type = GETPOST('price_base_type', 'alpha');
- if ($amount_ht > 0) {
+ if ($amount > 0) {
$error = 0;
if (empty($desc)) {
setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ReasonDiscount")), null, 'errors');
@@ -173,14 +177,14 @@ if ($action == 'setremise' && ($user->rights->societe->creer || $user->rights->f
if (!$error) {
$soc = new Societe($db);
$soc->fetch($id);
- $discountid = $soc->set_remise_except($amount_ht, $user, $desc, $tva_tx, $discount_type);
+ $discountid = $soc->set_remise_except($amount, $user, $desc, $tva_tx, $discount_type, $price_base_type);
if ($discountid > 0) {
if (!empty($backtopage)) {
- header("Location: ".$backtopage.'&discountid='.$discountid);
+ header("Location: ".$backtopage.'&discountid='.((int) $discountid));
exit;
} else {
- header("Location: remx.php?id=".$id);
+ header("Location: remx.php?id=".((int) $id));
exit;
}
} else {
@@ -193,7 +197,7 @@ if ($action == 'setremise' && ($user->rights->societe->creer || $user->rights->f
}
}
-if (GETPOST('action', 'aZ09') == 'confirm_remove' && GETPOST("confirm") == 'yes' && ($user->rights->societe->creer || $user->rights->facture->creer)) {
+if (GETPOST('action', 'aZ09') == 'confirm_remove' && GETPOST("confirm") == 'yes' && $permissiontocreate) {
//if ($user->rights->societe->creer)
//if ($user->rights->facture->creer)
@@ -231,9 +235,8 @@ if ($socid > 0) {
$isCustomer = $object->client == 1 || $object->client == 3;
$isSupplier = $object->fournisseur == 1;
- /*
- * Display tabs
- */
+ // Display tabs
+
$head = societe_prepare_head($object);
print 'id.'">';
@@ -262,6 +265,7 @@ if ($socid > 0) {
}
+ print '';
print '
';
if ($isCustomer) { // Calcul avoirs client en cours
@@ -324,9 +328,10 @@ if ($socid > 0) {
}
print '
';
-
print '
';
+ print ''; // close fichecenter
+
print dol_get_fiche_end();
@@ -346,6 +351,8 @@ if ($socid > 0) {
print dol_get_fiche_head();
+
+ print '';
print '
';
if ($isCustomer && $isSupplier) {
print ''.$langs->trans('DiscountType').' ';
@@ -353,9 +360,19 @@ if ($socid > 0) {
print ' '.$langs->trans('Supplier').' ';
print ' ';
}
- print ''.$langs->trans("AmountHT").' ';
- print ' ';
+
+ // Amount
+ print ''.$langs->trans("Amount").' ';
+ print ' ';
print ' '.$langs->trans("Currency".$conf->currency).' ';
+
+ // Price base (HT / TTC)
+ print ''.$langs->trans("PriceBase").' ';
+ print '';
+ print $form->selectPriceBaseType(GETPOST("price_base_type"), "price_base_type");
+ print ' ';
+
+ // VAT
print ''.$langs->trans("VAT").' ';
print '';
print $form->load_tva('tva_tx', GETPOSTISSET('tva_tx') ? GETPOST('tva_tx', 'alpha') : 0, $mysoc, $object, 0, 0, '', 0, 1);
@@ -364,6 +381,7 @@ if ($socid > 0) {
print ' ';
print "
";
+ print '
';
print dol_get_fiche_end();
}
diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php
index 4e1b47c598c..786fb1a2ad2 100644
--- a/htdocs/commande/card.php
+++ b/htdocs/commande/card.php
@@ -32,7 +32,7 @@
/**
* \file htdocs/commande/card.php
* \ingroup commande
- * \brief Page to show customer order
+ * \brief Page to show sales order
*/
// Load Dolibarr environment
@@ -790,7 +790,7 @@ if (empty($reshook)) {
$filter = array('t.fk_product' => $prod->id, 't.fk_soc' => $object->thirdparty->id);
- $result = $prodcustprice->fetch_all('', '', 0, 0, $filter);
+ $result = $prodcustprice->fetchAll('', '', 0, 0, $filter);
if ($result >= 0) {
if (count($prodcustprice->lines) > 0) {
$pu_ht = price($prodcustprice->lines[0]->price);
@@ -2326,39 +2326,28 @@ if ($action == 'create' && $usercancreate) {
$morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, $usercancreate, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, $usercancreate, 'string'.(isset($conf->global->THIRDPARTY_REF_INPUT_SIZE) ? ':'.$conf->global->THIRDPARTY_REF_INPUT_SIZE : ''), '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$soc->getNomUrl(1, 'customer');
+ $morehtmlref .= ' '.$soc->getNomUrl(1, 'customer');
if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
$morehtmlref .= ' ('.$langs->trans("OtherOrders").' )';
}
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
+ $morehtmlref .= ' ';
if ($usercancreate) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', 0, 0, 1, 0, 1, 0, 0, '', 1, 0, 'maxwidth500');
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
@@ -2899,7 +2888,7 @@ if ($action == 'create' && $usercancreate) {
// Delete order
if ($usercandelete) {
if ($numshipping == 0) {
- print dolGetButtonAction('', $langs->trans('Delete'), 'delete', $_SERVER["PHP_SELF"].'?action=delete&token='.newToken().'&id='.$object->id, '');
+ print dolGetButtonAction('', $langs->trans('Delete'), 'delete', $_SERVER["PHP_SELF"].'?action=delete&token='.newToken().'&id='.$object->id, '');
} else {
print dolGetButtonAction($langs->trans('ShippingExist'), $langs->trans('Delete'), 'default', $_SERVER['PHP_SELF']. '#', '', false);
}
diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php
index aa7a7f11a55..99a8e31521c 100644
--- a/htdocs/commande/class/commande.class.php
+++ b/htdocs/commande/class/commande.class.php
@@ -3395,7 +3395,7 @@ class Commande extends CommonOrder
}
/**
- * Delete the customer order
+ * Delete the sales order
*
* @param User $user User object
* @param int $notrigger 1=Does not execute triggers, 0= execute triggers
@@ -3626,7 +3626,7 @@ class Commande extends CommonOrder
public function LibStatut($status, $billed, $mode, $donotshowbilled = 0)
{
// phpcs:enable
- global $langs, $conf;
+ global $langs, $conf, $hookmanager;
$billedtext = '';
if (empty($donotshowbilled)) {
@@ -3674,6 +3674,19 @@ class Commande extends CommonOrder
$mode = 0;
}
+ $parameters = array(
+ 'status' => $status,
+ 'mode' => $mode,
+ 'billed' => $billed,
+ 'donotshowbilled' => $donotshowbilled
+ );
+
+ $reshook = $hookmanager->executeHooks('LibStatut', $parameters, $this); // Note that $action and $object may have been modified by hook
+
+ if ($reshook > 0) {
+ return $hookmanager->resPrint;
+ }
+
return dolGetStatus($labelStatus, $labelStatusShort, '', $statusType, $mode, '', array('tooltip' => $labelTooltip));
}
@@ -4062,7 +4075,7 @@ class Commande extends CommonOrder
}
/**
- * Is the customer order delayed?
+ * Is the sales order delayed?
*
* @return bool true if late, false if not
*/
@@ -4200,6 +4213,12 @@ class OrderLine extends CommonOrderLine
$result = $this->db->query($sql);
if ($result) {
$objp = $this->db->fetch_object($result);
+
+ if (!$objp) {
+ $this->error = 'OrderLine with id '. $rowid .' not found sql='.$sql;
+ return 0;
+ }
+
$this->rowid = $objp->rowid;
$this->id = $objp->rowid;
$this->fk_commande = $objp->fk_commande;
diff --git a/htdocs/commande/class/commandestats.class.php b/htdocs/commande/class/commandestats.class.php
index d02d56175ff..5f13cf780f4 100644
--- a/htdocs/commande/class/commandestats.class.php
+++ b/htdocs/commande/class/commandestats.class.php
@@ -109,9 +109,7 @@ class CommandeStats extends Stats
}
if ($categid) {
- $this->join .= ' LEFT JOIN '.$this->categ_link.' as cats ON cats.fk_soc = c.fk_soc';
- $this->join .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie as cat ON cat.rowid = cats.fk_categorie';
- $this->where .= ' AND cat.rowid = '.((int) $categid);
+ $this->where .= ' AND EXISTS (SELECT rowid FROM '.$this->categ_link.' as cats WHERE cats.fk_soc = c.fk_soc AND cats.fk_categorie = '.((int) $categid).')';
}
}
diff --git a/htdocs/commande/contact.php b/htdocs/commande/contact.php
index c353287962e..04c16e68aa0 100644
--- a/htdocs/commande/contact.php
+++ b/htdocs/commande/contact.php
@@ -47,8 +47,11 @@ if ($user->socid) {
}
$result = restrictedArea($user, 'commande', $id, '');
+$usercancreate = $user->hasRight("commande", "creer");
+
$object = new Commande($db);
+
/*
* Ajout d'un nouveau contact
*/
@@ -130,37 +133,25 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1);
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->commande->creer) {
+ $morehtmlref .= ' ';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->thirdparty->id, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->thirdparty->id, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/commande/document.php b/htdocs/commande/document.php
index c341ae59b4e..0c35c3489f7 100644
--- a/htdocs/commande/document.php
+++ b/htdocs/commande/document.php
@@ -73,7 +73,8 @@ if (!$sortfield) {
$object = new Commande($db);
-$permissiontoadd = $user->rights->commande->creer;
+$usercancreate = $user->hasRight("commande", "creer");
+$permissiontoadd = $usercancreate;
// Security check
if ($user->socid) {
@@ -129,37 +130,25 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1);
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->commande->creer) {
+ $morehtmlref .= ' ';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->thirdparty->id, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->thirdparty->id, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/commande/index.php b/htdocs/commande/index.php
index 9ee103911f7..9b653b90e65 100644
--- a/htdocs/commande/index.php
+++ b/htdocs/commande/index.php
@@ -22,7 +22,7 @@
/**
* \file htdocs/commande/index.php
* \ingroup commande
- * \brief Home page of customer order module
+ * \brief Home page of sales order module
*/
diff --git a/htdocs/commande/info.php b/htdocs/commande/info.php
index 4442af6a679..0acc5b793aa 100644
--- a/htdocs/commande/info.php
+++ b/htdocs/commande/info.php
@@ -50,6 +50,8 @@ if ($user->socid) {
}
$result = restrictedArea($user, 'commande', $comid, '');
+$usercancreate = $user->hasRight("commande", "creer");
+
$object = new Commande($db);
if (!$object->fetch($id, $ref) > 0) {
dol_print_error($db);
@@ -82,37 +84,25 @@ $morehtmlref = '';
$morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
-$morehtmlref .= '
'.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+$morehtmlref .= '
'.$object->thirdparty->getNomUrl(1);
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= '
'.$langs->trans('Project').' ';
- if ($user->rights->commande->creer) {
+ $morehtmlref .= '
';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->thirdparty->id, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->thirdparty->id, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php
index 86bead44380..0ac8d109575 100644
--- a/htdocs/commande/list.php
+++ b/htdocs/commande/list.php
@@ -42,7 +42,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/discount.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
-if (!empty($conf->margin->enabled)) {
+if (isModEnabled('margin')) {
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formmargin.class.php';
}
require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
@@ -80,6 +80,7 @@ $search_ref = GETPOST('search_ref', 'alpha') != '' ?GETPOST('search_ref', 'alpha
$search_ref_customer = GETPOST('search_ref_customer', 'alpha');
$search_company = GETPOST('search_company', 'alpha');
$search_company_alias = GETPOST('search_company_alias', 'alpha');
+$search_parent_name = trim(GETPOST('search_parent_name', 'alphanohtml'));
$search_town = GETPOST('search_town', 'alpha');
$search_zip = GETPOST('search_zip', 'alpha');
$search_state = GETPOST('search_state', 'alpha');
@@ -178,6 +179,7 @@ $arrayfields = array(
'p.title'=>array('label'=>"ProjectLabel", 'checked'=>0, 'enabled'=>(!isModEnabled('project') ? 0 : 1), 'position'=>25),
's.nom'=>array('label'=>"ThirdParty", 'checked'=>1, 'position'=>30),
's.name_alias'=>array('label'=>"AliasNameShort", 'checked'=>-1, 'position'=>31),
+ 's2.nom'=>array('label'=>'ParentCompany', 'position'=>32, 'checked'=>0),
's.town'=>array('label'=>"Town", 'checked'=>-1, 'position'=>35),
's.zip'=>array('label'=>"Zip", 'checked'=>-1, 'position'=>40),
'state.nom'=>array('label'=>"StateShort", 'checked'=>0, 'position'=>45),
@@ -199,15 +201,15 @@ $arrayfields = array(
'c.multicurrency_total_ttc'=>array('label'=>'MulticurrencyAmountTTC', 'checked'=>0, 'enabled'=>(!isModEnabled("multicurrency") ? 0 : 1), 'position'=>110),
'u.login'=>array('label'=>"Author", 'checked'=>1, 'position'=>115),
'sale_representative'=>array('label'=>"SaleRepresentativesOfThirdParty", 'checked'=>0, 'position'=>116),
- 'total_pa' => array('label' => (getDolGlobalString('MARGIN_TYPE') == '1' ? 'BuyingPrice' : 'CostPrice'), 'checked' => 0, 'position' => 300, 'enabled' => (empty($conf->margin->enabled) || !$user->rights->margins->liretous ? 0 : 1)),
- 'total_margin' => array('label' => 'Margin', 'checked' => 0, 'position' => 301, 'enabled' => (empty($conf->margin->enabled) || !$user->rights->margins->liretous ? 0 : 1)),
- 'total_margin_rate' => array('label' => 'MarginRate', 'checked' => 0, 'position' => 302, 'enabled' => (empty($conf->margin->enabled) || !$user->rights->margins->liretous || empty($conf->global->DISPLAY_MARGIN_RATES) ? 0 : 1)),
- 'total_mark_rate' => array('label' => 'MarkRate', 'checked' => 0, 'position' => 303, 'enabled' => (empty($conf->margin->enabled) || !$user->rights->margins->liretous || empty($conf->global->DISPLAY_MARK_RATES) ? 0 : 1)),
+ 'total_pa' => array('label' => (getDolGlobalString('MARGIN_TYPE') == '1' ? 'BuyingPrice' : 'CostPrice'), 'checked' => 0, 'position' => 300, 'enabled' => (!isModEnabled('margin') || !$user->rights->margins->liretous ? 0 : 1)),
+ 'total_margin' => array('label' => 'Margin', 'checked' => 0, 'position' => 301, 'enabled' => (!isModEnabled('margin') || !$user->rights->margins->liretous ? 0 : 1)),
+ 'total_margin_rate' => array('label' => 'MarginRate', 'checked' => 0, 'position' => 302, 'enabled' => (!isModEnabled('margin') || !$user->rights->margins->liretous || empty($conf->global->DISPLAY_MARGIN_RATES) ? 0 : 1)),
+ 'total_mark_rate' => array('label' => 'MarkRate', 'checked' => 0, 'position' => 303, 'enabled' => (!isModEnabled('margin') || !$user->rights->margins->liretous || empty($conf->global->DISPLAY_MARK_RATES) ? 0 : 1)),
'c.datec'=>array('label'=>"DateCreation", 'checked'=>0, 'position'=>120),
'c.tms'=>array('label'=>"DateModificationShort", 'checked'=>0, 'position'=>125),
'c.date_cloture'=>array('label'=>"DateClosing", 'checked'=>0, 'position'=>130),
- 'c.note_public'=>array('label'=>'NotePublic', 'checked'=>0, 'enabled'=>(empty($conf->global->MAIN_LIST_ALLOW_PUBLIC_NOTES)), 'position'=>135),
- 'c.note_private'=>array('label'=>'NotePrivate', 'checked'=>0, 'enabled'=>(empty($conf->global->MAIN_LIST_ALLOW_PRIVATE_NOTES)), 'position'=>140),
+ 'c.note_public'=>array('label'=>'NotePublic', 'checked'=>0, 'enabled'=>(!getDolGlobalInt('MAIN_LIST_HIDE_PUBLIC_NOTES')), 'position'=>135),
+ 'c.note_private'=>array('label'=>'NotePrivate', 'checked'=>0, 'enabled'=>(!getDolGlobalInt('MAIN_LIST_HIDE_PRIVATE_NOTES')), 'position'=>140),
'shippable'=>array('label'=>"Shippable", 'checked'=>1,'enabled'=>(isModEnabled("expedition")), 'position'=>990),
'c.facture'=>array('label'=>"Billed", 'checked'=>1, 'enabled'=>(empty($conf->global->WORKFLOW_BILL_ON_SHIPMENT)), 'position'=>995),
'c.import_key' =>array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'position'=>999),
@@ -253,6 +255,7 @@ if (empty($reshook)) {
$search_ref_customer = '';
$search_company = '';
$search_company_alias = '';
+ $search_parent_name = '';
$search_town = '';
$search_zip = "";
$search_state = "";
@@ -778,10 +781,11 @@ $form = new Form($db);
$formother = new FormOther($db);
$formfile = new FormFile($db);
$formmargin = null;
-if (!empty($conf->margin->enabled)) {
+if (isModEnabled('margin')) {
$formmargin = new FormMargin($db);
}
$companystatic = new Societe($db);
+$company_url_list = array();
$formcompany = new FormCompany($db);
$projectstatic = new Project($db);
@@ -789,10 +793,12 @@ $title = $langs->trans("Orders");
$help_url = "EN:Module_Customers_Orders|FR:Module_Commandes_Clients|ES:Módulo_Pedidos_de_clientes";
$sql = 'SELECT';
-if ($sall || $search_product_category > 0 || $search_user > 0) {
+if ($sall || $search_user > 0) {
$sql = 'SELECT DISTINCT';
}
$sql .= ' s.rowid as socid, s.nom as name, s.name_alias as alias, s.email, s.phone, s.fax, s.address, s.town, s.zip, s.fk_pays, s.client, s.fournisseur, s.code_client,';
+$sql .= " s.parent as fk_parent,";
+$sql .= " s2.nom as name2,";
$sql .= " typent.code as typent_code,";
$sql .= " state.code_departement as state_code, state.nom as state_name,";
$sql .= " country.code as country_code,";
@@ -817,9 +823,10 @@ if (!empty($extrafields->attributes[$object->table_element]['label'])) {
// Add fields from hooks
$parameters = array();
-$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$sql .= $hookmanager->resPrint;
$sql .= ' FROM '.MAIN_DB_PREFIX.'societe as s';
+$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s2 ON s2.rowid = s.parent";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typent)";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)";
@@ -830,12 +837,9 @@ $sql .= ', '.MAIN_DB_PREFIX.'commande as c';
if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."commande_extrafields as ef on (c.rowid = ef.fk_object)";
}
-if ($sall || $search_product_category > 0) {
+if ($sall) {
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'commandedet as pd ON c.rowid=pd.fk_commande';
}
-if ($search_product_category > 0) {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_product as cp ON cp.fk_product=pd.fk_product';
-}
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet as p ON p.rowid = c.fk_projet";
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'user as u ON c.fk_user_author = u.rowid';
@@ -850,14 +854,11 @@ if ($search_user > 0) {
// Add table from hooks
$parameters = array();
-$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$sql .= $hookmanager->resPrint;
$sql .= ' WHERE c.fk_soc = s.rowid';
$sql .= ' AND c.entity IN ('.getEntity('commande').')';
-if ($search_product_category > 0) {
- $sql .= " AND cp.fk_categorie = ".((int) $search_product_category);
-}
if ($socid > 0) {
$sql .= ' AND s.rowid = '.((int) $socid);
}
@@ -937,6 +938,9 @@ if ($search_company) {
if ($search_company_alias) {
$sql .= natural_search('s.name_alias', $search_company_alias);
}
+if ($search_parent_name) {
+ $sql .= natural_search('s2.nom', $search_parent_name);
+}
if ($search_sale > 0) {
$sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $search_sale);
}
@@ -997,17 +1001,46 @@ if ($search_fk_mode_reglement > 0) {
if ($search_fk_input_reason > 0) {
$sql .= " AND c.fk_input_reason = ".((int) $search_fk_input_reason);
}
-
+// Search for tag/category ($searchCategoryProductList is an array of ID)
+$searchCategoryProductOperator = -1;
+$searchCategoryProductList = array($search_product_category);
+if (!empty($searchCategoryProductList)) {
+ $searchCategoryProductSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategoryProductList as $searchCategoryProduct) {
+ if (intval($searchCategoryProduct) == -2) {
+ $searchCategoryProductSqlList[] = "NOT EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."commandedet as cd WHERE cd.fk_commande = c.rowid AND cd.fk_product = ck.fk_product)";
+ } elseif (intval($searchCategoryProduct) > 0) {
+ if ($searchCategoryProductOperator == 0) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."commandedet as cd WHERE cd.fk_commande = c.rowid AND cd.fk_product = ck.fk_product AND ck.fk_categorie = ".((int) $searchCategoryProduct).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProduct);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."commandedet as cd WHERE cd.fk_commande = c.rowid AND cd.fk_product = ck.fk_product AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategoryProductOperator == 1) {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
+ }
+ }
+}
// Add where from extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
// Add where from hooks
$parameters = array();
-$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$sql .= $hookmanager->resPrint;
// Add HAVING from hooks
$parameters = array();
-$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$sql .= empty($hookmanager->resPrint) ? "" : " HAVING 1=1 ".$hookmanager->resPrint;
$sql .= $db->order($sortfield, $sortorder);
@@ -1121,6 +1154,9 @@ if ($resql) {
if ($search_company_alias) {
$param .= '&search_company_alias='.urlencode($search_company_alias);
}
+ if ($search_parent_name != '') {
+ $param .= '&search_parent_name='.urlencode($search_parent_name);
+ }
if ($search_ref_customer) {
$param .= '&search_ref_customer='.urlencode($search_ref_customer);
}
@@ -1211,7 +1247,7 @@ if ($resql) {
// Add $param from hooks
$parameters = array();
- $reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$param .= $hookmanager->resPrint;
// List of mass actions available
@@ -1380,7 +1416,7 @@ if ($resql) {
$moreforfilter .= '
';
}
$parameters = array();
- $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
if (empty($reshook)) {
$moreforfilter .= $hookmanager->resPrint;
} else {
@@ -1451,6 +1487,12 @@ if ($resql) {
print ' ';
print ' ';
}
+ // Parent company
+ if (!empty($arrayfields['s2.nom']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+ }
// Town
if (!empty($arrayfields['s.town']['checked'])) {
print ' ';
@@ -1602,7 +1644,7 @@ if ($resql) {
// Fields from hook
$parameters = array('arrayfields'=>$arrayfields);
- $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Date creation
@@ -1707,6 +1749,9 @@ if ($resql) {
if (!empty($arrayfields['s.name_alias']['checked'])) {
print_liste_field_titre($arrayfields['s.name_alias']['label'], $_SERVER["PHP_SELF"], 's.name_alias', '', $param, '', $sortfield, $sortorder);
}
+ if (!empty($arrayfields['s2.nom']['checked'])) {
+ print_liste_field_titre($arrayfields['s2.nom']['label'], $_SERVER['PHP_SELF'], 's2.nom', '', $param, '', $sortfield, $sortorder);
+ }
if (!empty($arrayfields['s.town']['checked'])) {
print_liste_field_titre($arrayfields['s.town']['label'], $_SERVER["PHP_SELF"], 's.town', '', $param, '', $sortfield, $sortorder);
}
@@ -1804,7 +1849,7 @@ if ($resql) {
'sortorder' => $sortorder,
'totalarray' => &$totalarray,
);
- $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
if (!empty($arrayfields['c.datec']['checked'])) {
print_liste_field_titre($arrayfields['c.datec']['label'], $_SERVER["PHP_SELF"], "c.date_creation", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
@@ -1850,7 +1895,7 @@ if ($resql) {
$i = 0;
$with_margin_info = false;
- if (!empty($conf->margin->enabled) && (
+ if (isModEnabled('margin') && (
!empty($arrayfields['total_pa']['checked'])
|| !empty($arrayfields['total_margin']['checked'])
|| !empty($arrayfields['total_margin_rate']['checked'])
@@ -1928,6 +1973,10 @@ if ($resql) {
}
print ' ';
}
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ print '';
}
// Ref
@@ -2008,6 +2057,27 @@ if ($resql) {
}
}
+ // Parent company
+ if (!empty($arrayfields['s2.nom']['checked'])) {
+ print '';
+ if ($obj->fk_parent > 0) {
+ if (!isset($company_url_list[$obj->fk_parent])) {
+ $companyparent = new Societe($db);
+ $res = $companyparent->fetch($obj->fk_parent);
+ if ($res > 0) {
+ $company_url_list[$obj->fk_parent] = $companyparent->getNomUrl(1);
+ }
+ }
+ if (isset($company_url_list[$obj->fk_parent])) {
+ print $company_url_list[$obj->fk_parent];
+ }
+ }
+ print " ";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
// Town
if (!empty($arrayfields['s.town']['checked'])) {
print '';
@@ -2149,7 +2219,11 @@ if ($resql) {
if (!$i) {
$totalarray['pos'][$totalarray['nbfield']] = 'c.total_tva';
}
- $totalarray['val']['c.total_tva'] += $obj->total_tva;
+ if (isset($totalarray['val']['c.total_tva'])) {
+ $totalarray['val']['c.total_tva'] += $obj->total_tva;
+ } else {
+ $totalarray['val']['c.total_tva'] = $obj->total_tva;
+ }
}
// Amount TTC / gross
@@ -2161,7 +2235,11 @@ if ($resql) {
if (!$i) {
$totalarray['pos'][$totalarray['nbfield']] = 'c.total_ttc';
}
- $totalarray['val']['c.total_ttc'] += $obj->total_ttc;
+ if (isset($totalarray['val']['c.total_ttc'])) {
+ $totalarray['val']['c.total_ttc'] += $obj->total_ttc;
+ } else {
+ $totalarray['val']['c.total_ttc'] = $obj->total_ttc;
+ }
}
// Currency
@@ -2329,7 +2407,7 @@ if ($resql) {
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
// Fields from hook
$parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
- $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Date creation
@@ -2403,7 +2481,7 @@ if ($resql) {
// Get local and virtual stock and store it into cache
if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product])) {
- $generic_product->load_stock('nobatch'); // ->load_virtual_stock() is already included into load_stock()
+ $generic_product->load_stock('nobatch,warehouseopen'); // ->load_virtual_stock() is already included into load_stock()
$productstat_cache[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_reel;
$productstat_cachevirtual[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_theorique;
} else {
@@ -2522,10 +2600,10 @@ if ($resql) {
}
print ' ';
}
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
+ print '';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
}
print " \n";
@@ -2552,7 +2630,7 @@ if ($resql) {
$db->free($resql);
$parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
- $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
print '
'."\n";
diff --git a/htdocs/commande/note.php b/htdocs/commande/note.php
index 452e58076c7..e84dd5ad6e1 100644
--- a/htdocs/commande/note.php
+++ b/htdocs/commande/note.php
@@ -52,6 +52,10 @@ $hookmanager->initHooks(array('ordernote'));
$result = restrictedArea($user, 'commande', $id, '');
+$usercancreate = $user->hasRight("commande", "creer");
+
+$permissionnote = $user->rights->commande->creer; // Used by the include of actions_setnotes.inc.php
+
$object = new Commande($db);
if (!$object->fetch($id, $ref) > 0) {
@@ -59,8 +63,6 @@ if (!$object->fetch($id, $ref) > 0) {
exit;
}
-$permissionnote = $user->rights->commande->creer; // Used by the include of actions_setnotes.inc.php
-
/*
* Actions
@@ -101,37 +103,25 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1);
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->commande->creer) {
+ $morehtmlref .= ' ';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/commande/stats/index.php b/htdocs/commande/stats/index.php
index 15642da2d39..9052ed7ab27 100644
--- a/htdocs/commande/stats/index.php
+++ b/htdocs/commande/stats/index.php
@@ -65,7 +65,7 @@ if ($user->socid > 0) {
$socid = $user->socid;
}
-$nowyear = strftime("%Y", dol_now());
+$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$year = GETPOST('year') > 0 ?GETPOST('year') : $nowyear;
$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS)));
$endyear = $year;
diff --git a/htdocs/compta/bank/class/api_bankaccounts.class.php b/htdocs/compta/bank/class/api_bankaccounts.class.php
index 8e38d1ffe78..c9886a176f0 100644
--- a/htdocs/compta/bank/class/api_bankaccounts.class.php
+++ b/htdocs/compta/bank/class/api_bankaccounts.class.php
@@ -471,7 +471,7 @@ class BankAccounts extends DolibarrApi
* Add a line to an account
*
* @param int $id ID of account
- * @param int $date Payment date (timestamp) {@from body} {@type timestamp}
+ * @param string $date Payment date (timestamp) {@from body} {@type timestamp}
* @param string $type Payment mode (TYP,VIR,PRE,LIQ,VAD,CB,CHQ...) {@from body}
* @param string $label Label {@from body}
* @param float $amount Amount (may be 0) {@from body}
@@ -480,7 +480,7 @@ class BankAccounts extends DolibarrApi
* @param string $cheque_writer Name of cheque writer {@from body}
* @param string $cheque_bank Bank of cheque writer {@from body}
* @param string $accountancycode Accountancy code {@from body}
- * @param int $datev Payment date value (timestamp) {@from body} {@type timestamp}
+ * @param string $datev Payment date value (timestamp) {@from body} {@type timestamp}
* @param string $num_releve Bank statement numero {@from body}
* @return int ID of line
*
diff --git a/htdocs/compta/bank/line.php b/htdocs/compta/bank/line.php
index 49edf3c3a1a..cb10a7310c6 100644
--- a/htdocs/compta/bank/line.php
+++ b/htdocs/compta/bank/line.php
@@ -657,13 +657,13 @@ if ($result) {
if ($user->rights->banque->consolidate) {
print ' ';
if ($objp->rappro) {
- print ' rappro ? ' disabled' : '').'>';
- print ' ';
+ print ' rappro ? ' disabled' : '').'>';
+ print ' ';
} else {
- print ' rappro ? ' disabled' : '').'>';
+ print ' rappro ? ' disabled' : '').'>';
}
if ($objp->num_releve) {
- print ' ('.$langs->trans("AccountStatement").' '.$objp->num_releve.') ';
+ print ' ('.$langs->trans("AccountStatement").' '.$objp->num_releve.') ';
}
print ' ';
} else {
@@ -675,6 +675,28 @@ if ($result) {
if ($user->rights->banque->consolidate) {
print '';
print ' rappro ? ' checked="checked"' : '')).'">';
+
+ print '
+
+ ';
+
print ' ';
} else {
print ''.yn($objp->rappro).' ';
diff --git a/htdocs/compta/bank/list.php b/htdocs/compta/bank/list.php
index 5f223450ab7..faf1c52a0c0 100644
--- a/htdocs/compta/bank/list.php
+++ b/htdocs/compta/bank/list.php
@@ -59,6 +59,7 @@ $search_number = GETPOST('search_number', 'alpha');
$search_status = GETPOST('search_status') ?GETPOST('search_status', 'alpha') : 'opened'; // 'all' or ''='opened'
$optioncss = GETPOST('optioncss', 'alpha');
+$search_category_list ="";
if (isModEnabled('categorie')) {
$search_category_list = GETPOST("search_category_".Categorie::TYPE_ACCOUNT."_list", "array");
}
@@ -162,6 +163,7 @@ if (empty($reshook)) {
$search_label = '';
$search_number = '';
$search_status = '';
+ $search_category_list = array();
}
// Mass actions
@@ -191,17 +193,12 @@ if (!empty($extrafields->attributes[$object->table_element]['label'])) {
}
// Add fields from hooks
$parameters = array();
-$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$sql .= $hookmanager->resPrint;
$sql .= " FROM ".MAIN_DB_PREFIX."bank_account as b";
if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (b.rowid = ef.fk_object)";
}
-
-if (isModEnabled('categorie')) {
- $sql .= Categorie::getFilterJoinQuery(Categorie::TYPE_ACCOUNT, "b.rowid");
-}
-
$sql .= " WHERE b.entity IN (".getEntity('bank_account').")";
if ($search_status == 'opened') {
$sql .= " AND clos = 0";
@@ -209,11 +206,6 @@ if ($search_status == 'opened') {
if ($search_status == 'closed') {
$sql .= " AND clos = 1";
}
-
-if (isModEnabled('categorie')) {
- $sql .= Categorie::getFilterSelectQuery(Categorie::TYPE_ACCOUNT, "b.rowid", $search_category_list);
-}
-
if ($search_ref != '') {
$sql .= natural_search('b.ref', $search_ref);
}
@@ -223,11 +215,41 @@ if ($search_label != '') {
if ($search_number != '') {
$sql .= natural_search('b.number', $search_number);
}
+// Search for tag/category ($searchCategoryBankList is an array of ID)
+$searchCategoryBankList = $search_category_list;
+$searchCategoryBankOperator = 0;
+if (!empty($searchCategoryBankList)) {
+ $searchCategoryBankSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategoryBankList as $searchCategoryBank) {
+ if (intval($searchCategoryBank) == -2) {
+ $searchCategoryBankSqlList[] = "NOT EXISTS (SELECT ck.fk_account FROM ".MAIN_DB_PREFIX."categorie_account as ck WHERE b.rowid = ck.fk_account)";
+ } elseif (intval($searchCategoryBank) > 0) {
+ if ($searchCategoryBankOperator == 0) {
+ $searchCategoryBankSqlList[] = " EXISTS (SELECT ck.fk_account FROM ".MAIN_DB_PREFIX."categorie_account as ck WHERE b.rowid = ck.fk_account AND ck.fk_categorie = ".((int) $searchCategoryBank).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryBank);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategoryBankSqlList[] = " EXISTS (SELECT ck.fk_account FROM ".MAIN_DB_PREFIX."categorie_account as ck WHERE b.rowid = ck.fk_account AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategoryBankOperator == 1) {
+ if (!empty($searchCategoryBankSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryBankSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryBankSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryBankSqlList).")";
+ }
+ }
+}
// Add where from extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
// Add where from hooks
$parameters = array();
-$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$sql .= $hookmanager->resPrint;
$sql .= $db->order($sortfield, $sortorder);
@@ -293,7 +315,7 @@ if ($optioncss != '') {
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
// Add $param from hooks
$parameters = array();
-$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$param .= $hookmanager->resPrint;
// List of mass actions available
@@ -351,7 +373,7 @@ if (isModEnabled('categorie') && $user->rights->categorie->lire) {
// Bank accounts
$parameters = array();
-$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
if (empty($reshook)) {
$moreforfilter .= $hookmanager->resPrint;
} else {
@@ -365,7 +387,7 @@ if (!empty($moreforfilter)) {
}
$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
-$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
+$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
print ''; // You can use div-table-responsive-no-min if you dont need reserved height for your table
@@ -374,7 +396,13 @@ print '
';
-
+// Action column
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons('left');
+ print $searchpicto;
+ print ' ';
+}
// Ref
if (!empty($arrayfields['b.ref']['checked'])) {
print '';
@@ -423,7 +451,7 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
// Fields from hook
$parameters = array('arrayfields'=>$arrayfields);
-$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Date creation
if (!empty($arrayfields['b.datec']['checked'])) {
@@ -450,15 +478,20 @@ if (!empty($arrayfields['balance']['checked'])) {
print ' ';
}
// Action column
-print '';
-$searchpicto = $form->showFilterButtons();
-print $searchpicto;
-print ' ';
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons();
+ print $searchpicto;
+ print ' ';
+}
print ''."\n";
// Fields title label
// --------------------------------------------------------------------
print '';
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
+}
if (!empty($arrayfields['b.ref']['checked'])) {
print_liste_field_titre($arrayfields['b.ref']['label'], $_SERVER["PHP_SELF"], 'b.ref', '', $param, '', $sortfield, $sortorder);
}
@@ -487,7 +520,7 @@ if (!empty($arrayfields['toreconcile']['checked'])) {
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
// Hook fields
$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
-$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
if (!empty($arrayfields['b.datec']['checked'])) {
print_liste_field_titre($arrayfields['b.datec']['label'], $_SERVER["PHP_SELF"], "b.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
@@ -501,7 +534,9 @@ if (!empty($arrayfields['b.clos']['checked'])) {
if (!empty($arrayfields['balance']['checked'])) {
print_liste_field_titre($arrayfields['balance']['label'], $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
}
-print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
+}
print " \n";
@@ -532,7 +567,18 @@ foreach ($accounts as $key => $type) {
}
print '';
-
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($objecttmp->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
// Ref
if (!empty($arrayfields['b.ref']['checked'])) {
print ''.$objecttmp->getNomUrl(1).' ';
@@ -637,7 +683,7 @@ foreach ($accounts as $key => $type) {
print ''.$langs->trans("ConciliationDisabled").' ';
} else {
$result = $objecttmp->load_board($user, $objecttmp->id);
- if ($result < 0) {
+ if (is_numeric($result) && $result < 0) {
setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
} else {
print '';
@@ -669,7 +715,7 @@ foreach ($accounts as $key => $type) {
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
// Fields from hook
$parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
- $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $objecttmp); // Note that $action and $objecttmpect may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $objecttmp, $action); // Note that $action and $objecttmpect may have been modified by hook
print $hookmanager->resPrint;
// Date creation
if (!empty($arrayfields['b.datec']['checked'])) {
@@ -715,15 +761,17 @@ foreach ($accounts as $key => $type) {
}
// Action column
- print ' ';
- if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
- $selected = 0;
- if (in_array($objecttmp->id, $arrayofselected)) {
- $selected = 1;
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print ' ';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($objecttmp->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
}
- print ' ';
+ print ' ';
}
- print '';
if (!$i) {
$totalarray['nbfield']++;
}
diff --git a/htdocs/compta/bank/various_payment/card.php b/htdocs/compta/bank/various_payment/card.php
index 0b044f8f806..79f338cef85 100644
--- a/htdocs/compta/bank/various_payment/card.php
+++ b/htdocs/compta/bank/various_payment/card.php
@@ -410,7 +410,7 @@ if ($action == 'create') {
// Amount
print ' ';
print $form->editfieldkey('Amount', 'amount', '', $object, 0, 'string', '', 1).' ';
- print ' ';
+ print ' ';
print ' ';
// Bank
diff --git a/htdocs/compta/deplacement/card.php b/htdocs/compta/deplacement/card.php
index f8e5f3ba03b..e7929a12697 100644
--- a/htdocs/compta/deplacement/card.php
+++ b/htdocs/compta/deplacement/card.php
@@ -492,11 +492,8 @@ if ($action == 'create') {
}
}
- if ($user->rights->deplacement->supprimer) {
- print ''.$langs->trans('Delete').' ';
- } else {
- print ''.$langs->trans('Delete').' ';
- }
+ $permissiontodelete = $user->rights->deplacement->supprimer;
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete);
print '';
}
diff --git a/htdocs/compta/deplacement/stats/index.php b/htdocs/compta/deplacement/stats/index.php
index 50848654a71..1bf7706bf87 100644
--- a/htdocs/compta/deplacement/stats/index.php
+++ b/htdocs/compta/deplacement/stats/index.php
@@ -62,7 +62,7 @@ if ($userid > 0) {
}
}
-$nowyear = strftime("%Y", dol_now());
+$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$year = GETPOST('year') > 0 ?GETPOST('year') : $nowyear;
$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS)));
$endyear = $year;
diff --git a/htdocs/compta/facture/card-rec.php b/htdocs/compta/facture/card-rec.php
index 33b85f707e9..2a15c74c948 100644
--- a/htdocs/compta/facture/card-rec.php
+++ b/htdocs/compta/facture/card-rec.php
@@ -1677,10 +1677,8 @@ if ($action == 'create') {
}
}
- //if ($object->statut == Facture::STATUS_DRAFT && $user->rights->facture->supprimer)
- if ($user->rights->facture->supprimer) {
- print '';
- }
+ // Delete
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $user->rights->facture->supprimer);
print '';
diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php
index 1fb53bb47bd..10cf7b624fc 100644
--- a/htdocs/compta/facture/card.php
+++ b/htdocs/compta/facture/card.php
@@ -4000,7 +4000,9 @@ if ($action == 'create') {
$multicurrency_totaldeposits = $object->getSumDepositsUsed(1);
$multicurrency_resteapayer = price2num($object->multicurrency_total_ttc - $multicurrency_totalpaid - $multicurrency_totalcreditnotes - $multicurrency_totaldeposits, 'MT');
// Code to fix case of corrupted data
- if ($resteapayer == 0 && $multicurrency_resteapayer != 0) {
+ // TODO We should not need this. Also data comes from a not reliable value of $object->multicurrency_total_ttc that may be wrong if it was
+ // calculated by summing lines that were in a currency for some of them and into another for others (lines from discount/down payment into another currency for example)
+ if ($resteapayer == 0 && $multicurrency_resteapayer != 0 && $object->multicurrency_code != $conf->currency) {
$resteapayer = price2num($multicurrency_resteapayer / $object->multicurrency_tx, 'MT');
}
}
@@ -4361,39 +4363,28 @@ if ($action == 'create') {
$morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, $usercancreate, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, $usercancreate, 'string'.(isset($conf->global->THIRDPARTY_REF_INPUT_SIZE) ? ':'.$conf->global->THIRDPARTY_REF_INPUT_SIZE : ''), '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'customer');
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1, 'customer');
if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
$morehtmlref .= ' ('.$langs->trans("OtherBills").' )';
}
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
+ $morehtmlref .= ' ';
if ($usercancreate) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
@@ -5665,7 +5656,7 @@ if ($action == 'create') {
&& $usercancreate
&& !$objectidnext
&& $object->is_last_in_cycle()
- && $conf->global->INVOICE_USE_SITUATION_CREDIT_NOTE
+ && getDolGlobalInt('INVOICE_USE_SITUATION_CREDIT_NOTE')
) {
if ($usercanunvalidate) {
print ''.$langs->trans("CreateCreditNote").' ';
@@ -5717,33 +5708,32 @@ if ($action == 'create') {
$isErasable = $object->is_erasable();
$params = array(
'attr' => array(
- 'title' => '',
'class' => 'classfortooltip'
)
);
if ($usercandelete || ($usercancreate && $isErasable == 1)) { // isErasable = 1 means draft with temporary ref (draft can always be deleted with no need of permissions)
$enableDelete = false;
$deleteHref = '#';
+ $htmltooltip = '';
if ($isErasable == -4) {
- $params['attr']['title'] = $langs->trans('DisabledBecausePayments');
+ $htmltooltip = $langs->trans('DisabledBecausePayments');
} elseif ($isErasable == -3) {
- $params['attr']['title'] = $langs->trans('DisabledBecauseNotLastSituationInvoice');
+ $htmltooltip = $langs->trans('DisabledBecauseNotLastSituationInvoice');
} elseif ($isErasable == -2) {
- $params['attr']['title'] = $langs->trans('DisabledBecauseNotLastInvoice');
+ $htmltooltip = $langs->trans('DisabledBecauseNotLastInvoice');
} elseif ($isErasable == -1) {
- $params['attr']['title'] = $langs->trans('DisabledBecauseDispatchedInBookkeeping');
+ $htmltooltip = $langs->trans('DisabledBecauseDispatchedInBookkeeping');
} elseif ($isErasable <= 0) { // Any other cases
- $params['attr']['title'] = $langs->trans('DisabledBecauseNotErasable');
+ $htmltooltip = $langs->trans('DisabledBecauseNotErasable');
} elseif ($objectidnext) {
- $params['attr']['title'] = $langs->trans('DisabledBecauseReplacedInvoice');
+ $htmltooltip = $langs->trans('DisabledBecauseReplacedInvoice');
} else {
$deleteHref = $_SERVER["PHP_SELF"].'?facid='.$object->id.'&action=delete&token='.newToken();
$enableDelete = true;
}
- print dolGetButtonAction($langs->trans('Delete'), '', 'delete', $deleteHref, '', $enableDelete, $params);
+ print dolGetButtonAction($htmltooltip, $langs->trans('Delete'), 'delete', $deleteHref, '', $enableDelete, $params);
} else {
- $params['attr']['title'] = $langs->trans('NotAllowed');
- print dolGetButtonAction($langs->trans('Delete'), '', 'delete', '#', '', false, $params);
+ print dolGetButtonAction($langs->trans('Delete'), $langs->trans('Delete'), 'delete', '#', '', false);
}
}
print '';
@@ -5802,7 +5792,7 @@ if ($action == 'create') {
// Show online payment link
- $useonlinepayment = (!empty($conf->paypal->enabled) || !empty($conf->stripe->enabled) || !empty($conf->paybox->enabled));
+ $useonlinepayment = (isModEnabled('paypal') || isModEnabled('stripe') || isModEnabled('paybox'));
if ($object->statut != Facture::STATUS_DRAFT && $useonlinepayment) {
print ' '."\n";
diff --git a/htdocs/compta/facture/class/api_invoices.class.php b/htdocs/compta/facture/class/api_invoices.class.php
index 51c094d898e..4c1392e28eb 100644
--- a/htdocs/compta/facture/class/api_invoices.class.php
+++ b/htdocs/compta/facture/class/api_invoices.class.php
@@ -1452,7 +1452,6 @@ class Invoices extends DolibarrApi
$multicurrency_amounts[$id] = $newvalue;
}
-
// Creation of payment line
$paymentobj = new Paiement($this->db);
$paymentobj->datepaye = $datepaye;
diff --git a/htdocs/compta/facture/class/facture-rec.class.php b/htdocs/compta/facture/class/facture-rec.class.php
index da72411528d..532140481ab 100644
--- a/htdocs/compta/facture/class/facture-rec.class.php
+++ b/htdocs/compta/facture/class/facture-rec.class.php
@@ -1272,6 +1272,8 @@ class FactureRec extends CommonInvoice
$tmparray = dol_getdate($now);
$today = dol_mktime(23, 59, 59, $tmparray['mon'], $tmparray['mday'], $tmparray['year']); // Today is last second of current day
+ $this->output = null;
+
dol_syslog("createRecurringInvoices restrictioninvoiceid=".$restrictioninvoiceid." forcevalidation=".$forcevalidation);
$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'facture_rec';
diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php
index 67d5568e438..7cc4be35f70 100644
--- a/htdocs/compta/facture/class/facture.class.php
+++ b/htdocs/compta/facture/class/facture.class.php
@@ -40,7 +40,7 @@
* \brief File of class to manage invoices
*/
-include_once DOL_DOCUMENT_ROOT.'/core/class/commoninvoice.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/commoninvoice.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/commonobjectline.class.php';
require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
require_once DOL_DOCUMENT_ROOT.'/societe/class/client.class.php';
@@ -136,7 +136,7 @@ class Facture extends CommonInvoice
/**
* @var int Date expected for delivery
* @deprecated
- * @see delivery_date
+ * @see $delivery_date
*/
public $date_livraison;
@@ -148,7 +148,7 @@ class Facture extends CommonInvoice
/**
* @var string customer ref
* @deprecated
- * @see ref_customer
+ * @see $ref_customer
*/
public $ref_client;
@@ -3611,7 +3611,7 @@ class Facture extends CommonInvoice
global $mysoc, $conf, $langs;
- dol_syslog(get_class($this)."::addline id=$this->id,desc=$desc,pu_ht=$pu_ht,qty=$qty,txtva=$txtva, txlocaltax1=$txlocaltax1, txlocaltax2=$txlocaltax2, fk_product=$fk_product,remise_percent=$remise_percent,date_start=$date_start,date_end=$date_end,ventil=$ventil,info_bits=$info_bits,fk_remise_except=$fk_remise_except,price_base_type=$price_base_type,pu_ttc=$pu_ttc,type=$type, fk_unit=$fk_unit", LOG_DEBUG);
+ dol_syslog(get_class($this)."::addline id=$this->id, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, txlocaltax1=$txlocaltax1, txlocaltax2=$txlocaltax2, fk_product=$fk_product, remise_percent=$remise_percent, date_start=$date_start, date_end=$date_end, ventil=$ventil, info_bits=$info_bits, fk_remise_except=$fk_remise_except, price_base_type=$price_base_type, pu_ttc=$pu_ttc, type=$type, fk_unit=$fk_unit, desc=".dol_trunc($desc, 25), LOG_DEBUG);
if ($this->statut == self::STATUS_DRAFT) {
include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
@@ -5421,12 +5421,13 @@ class Facture extends CommonInvoice
* Send reminders by emails for ivoices that are due
* CAN BE A CRON TASK
*
- * @param int $nbdays Delay after due date (or before if delay is negative)
- * @param string $paymentmode '' or 'all' by default (no filter), or 'LIQ', 'CHQ', CB', ...
- * @param int|string $template Name (or id) of email template (Must be a template of type 'facture_send')
- * @return int 0 if OK, <>0 if KO (this function is used also by cron so only 0 is OK)
+ * @param int $nbdays Delay after due date (or before if delay is negative)
+ * @param string $paymentmode '' or 'all' by default (no filter), or 'LIQ', 'CHQ', CB', ...
+ * @param int|string $template Name (or id) of email template (Must be a template of type 'facture_send')
+ * @param string $forcerecipient Force email of recipient (for example to send the email to an accountant supervisor instead of the customer)
+ * @return int 0 if OK, <>0 if KO (this function is used also by cron so only 0 is OK)
*/
- public function sendEmailsRemindersOnInvoiceDueDate($nbdays = 0, $paymentmode = 'all', $template = '')
+ public function sendEmailsRemindersOnInvoiceDueDate($nbdays = 0, $paymentmode = 'all', $template = '', $forcerecipient = '')
{
global $conf, $langs, $user;
@@ -5469,11 +5470,11 @@ class Facture extends CommonInvoice
$sql .= " WHERE f.paye = 0";
$sql .= " AND f.fk_statut = ".self::STATUS_VALIDATED;
$sql .= " AND f.date_lim_reglement = '".$this->db->idate($tmpidate, 'gmt')."'";
- $sql .= " AND f.entity IN (".getEntity('facture').")";
+ $sql .= " AND f.entity IN (".getEntity('facture', 0).")"; // One batch process only one company (no sharing)
if (!empty($paymentmode) && $paymentmode != 'all') {
$sql .= " AND f.fk_mode_reglement = cp.id AND cp.code = '".$this->db->escape($paymentmode)."'";
}
- // TODO Add filter to check there is no payment started
+ // TODO Add a filter to check there is no payment started yet
$sql .= $this->db->order("date_lim_reglement", "ASC");
$resql = $this->db->query($sql);
@@ -5526,39 +5527,69 @@ class Facture extends CommonInvoice
$sendContent = make_substitutions($content, $substitutionarray, $outputlangs, 1);
// Recipient
- $to = '';
- $res = $tmpinvoice->fetch_thirdparty();
- $recipient = $tmpinvoice->thirdparty;
- if ($res > 0) {
- if (!empty($recipient->email)) {
- $to = $recipient->email;
+ $to = array();
+ if ($forcerecipient) { // If a recipient was forced
+ $to = array($forcerecipient);
+ } else {
+ $res = $tmpinvoice->fetch_thirdparty();
+ $recipient = $tmpinvoice->thirdparty;
+ if ($res > 0) {
+ $tmparraycontact = $tmpinvoice->liste_contact(-1, 'external', 0, 'BILLING');
+ if (is_array($tmparraycontact) && count($tmparraycontact) > 0) {
+ foreach ($tmparraycontact as $data_email) {
+ if (!empty($data_email['email'])) {
+ $to[] = $tmpinvoice->thirdparty->contact_get_property($data_email['id'], 'email');
+ }
+ }
+ }
+ if (empty($to) && !empty($recipient->email)) {
+ $to[] = $recipient->email;
+ } else {
+ $errormesg = "Failed to send remind to thirdparty id=".$tmpinvoice->socid.". No email defined for user.";
+ $error++;
+ }
} else {
- $errormesg = "Failed to send remind to thirdparty id=".$tmpinvoice->socid.". No email defined for user.";
+ $errormesg = "Failed to load recipient with thirdparty id=".$tmpinvoice->socid;
$error++;
}
- } else {
- $errormesg = "Failed to load recipient with thirdparty id=".$tmpinvoice->socid;
- $error++;
}
// Sender
- $from = $conf->global->MAIN_MAIL_EMAIL_FROM;
+ $from = getDolGlobalString('MAIN_MAIL_EMAIL_FROM');
+ if (!empty($arraymessage->email_from)) { // If a sender is defined into template, we use it in priority
+ $from = $arraymessage->email_from;
+ }
if (empty($from)) {
$errormesg = "Failed to get sender into global setup MAIN_MAIL_EMAIL_FROM";
$error++;
}
- if (!$error && $to) {
+ if (!$error && !empty($to)) {
$this->db->begin();
+ $to = implode(',', $to);
+ if (!empty($arraymessage->email_to)) { // If a recipient is defined into template, we add it
+ $to = $to.','.$arraymessage->email_to;
+ }
+
// Errors Recipient
$errors_to = $conf->global->MAIN_MAIL_ERRORS_TO;
$trackid = 'inv'.$tmpinvoice->id;
$sendcontext = 'standard';
+ $email_tocc = '';
+ if (!empty($arraymessage->email_tocc)) { // If a CC is defined into template, we use it
+ $email_tocc = $arraymessage->email_tocc;
+ }
+
+ $email_tobcc = '';
+ if (!empty($arraymessage->email_tobcc)) { // If a BCC is defined into template, we use it
+ $email_tobcc = $arraymessage->email_tobcc;
+ }
+
// Mail Creation
- $cMailFile = new CMailFile($sendTopic, $to, $from, $sendContent, array(), array(), array(), '', "", 0, 1, $errors_to, '', $trackid, '', $sendcontext, '');
+ $cMailFile = new CMailFile($sendTopic, $to, $from, $sendContent, array(), array(), array(), $email_tocc, $email_tobcc, 0, 1, $errors_to, '', $trackid, '', $sendcontext, '');
// Sending Mail
if ($cMailFile->sendfile()) {
@@ -5802,6 +5833,11 @@ class FactureLigne extends CommonInvoiceLine
if ($result) {
$objp = $this->db->fetch_object($result);
+ if (!$objp) {
+ $this->error = 'InvoiceLine with id '. $rowid .' not found sql='.$sql;
+ return 0;
+ }
+
$this->rowid = $objp->rowid;
$this->id = $objp->rowid;
$this->fk_facture = $objp->fk_facture;
diff --git a/htdocs/compta/facture/class/facturestats.class.php b/htdocs/compta/facture/class/facturestats.class.php
index 522fe9aa2e2..5637fd740a0 100644
--- a/htdocs/compta/facture/class/facturestats.class.php
+++ b/htdocs/compta/facture/class/facturestats.class.php
@@ -97,10 +97,19 @@ class FactureStats extends Stats
if ($this->userid > 0) {
$this->where .= ' AND f.fk_user_author = '.((int) $this->userid);
}
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
- $this->where .= " AND f.type IN (0,1,2,5)";
- } else {
- $this->where .= " AND f.type IN (0,1,2,3,5)";
+ if ($mode == 'customer') {
+ if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $this->where .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $this->where .= " AND f.type IN (0,1,2,3,5)";
+ }
+ }
+ if ($mode == 'supplier') {
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $this->where .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $this->where .= " AND f.type IN (0,1,2,3,5)";
+ }
}
if ($typentid) {
@@ -109,9 +118,7 @@ class FactureStats extends Stats
}
if ($categid) {
- $this->join .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_societe as cs ON cs.fk_soc = f.fk_soc';
- $this->join .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie as c ON c.rowid = cs.fk_categorie';
- $this->where .= ' AND c.rowid = '.((int) $categid);
+ $this->where .= ' AND EXISTS (SELECT rowid FROM '.MAIN_DB_PREFIX.'categorie_societe as cats WHERE cats.fk_soc = f.fk_soc AND cats.fk_categorie = '.((int) $categid).')';
}
}
diff --git a/htdocs/compta/facture/contact.php b/htdocs/compta/facture/contact.php
index 62705ffd876..b367301911d 100644
--- a/htdocs/compta/facture/contact.php
+++ b/htdocs/compta/facture/contact.php
@@ -58,6 +58,8 @@ if ($id > 0 || !empty($ref)) {
$result = restrictedArea($user, 'facture', $object->id);
+$usercancreate = $user->hasRight("facture", "creer");
+
/*
* Add a new contact
@@ -136,37 +138,25 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'customer');
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1, 'customer');
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->facture->creer) {
+ $morehtmlref .= ' ';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/compta/facture/document.php b/htdocs/compta/facture/document.php
index ee3700fd67e..5cec55e2439 100644
--- a/htdocs/compta/facture/document.php
+++ b/htdocs/compta/facture/document.php
@@ -81,6 +81,8 @@ if ($user->socid) {
}
$result = restrictedArea($user, 'facture', $object->id, '');
+$usercancreate = $user->hasRight("facture", "creer");
+
/*
* Actions
@@ -140,37 +142,25 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'customer');
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1, 'customer');
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->facture->creer) {
+ $morehtmlref .= ' ';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/compta/facture/info.php b/htdocs/compta/facture/info.php
index 0d70f095d31..1ea28b295c3 100644
--- a/htdocs/compta/facture/info.php
+++ b/htdocs/compta/facture/info.php
@@ -59,6 +59,8 @@ $isdraft = (($object->statut == Facture::STATUS_DRAFT) ? 1 : 0);
$result = restrictedArea($user, 'facture', $object->id, '', '', 'fk_soc', 'rowid', $isdraft);
+$usercancreate = $user->hasRight("facture", "creer");
+
/*
* View
@@ -96,37 +98,25 @@ $morehtmlref = '';
$morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
-$morehtmlref .= '
'.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'customer');
+$morehtmlref .= '
'.$object->thirdparty->getNomUrl(1, 'customer');
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= '
'.$langs->trans('Project').' ';
- if ($user->rights->facture->creer) {
+ $morehtmlref .= '
';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php
index ddfe7e5429f..46cf6b73ac4 100644
--- a/htdocs/compta/facture/list.php
+++ b/htdocs/compta/facture/list.php
@@ -73,15 +73,15 @@ $massaction = GETPOST('massaction', 'alpha');
$show_files = GETPOST('show_files', 'int');
$confirm = GETPOST('confirm', 'alpha');
$toselect = GETPOST('toselect', 'array');
+$optioncss = GETPOST('optioncss', 'alpha');
$contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'invoicelist';
if ($contextpage == 'poslist') {
- $_GET['optioncss'] = 'print';
+ $optioncss = 'print';
}
$lineid = GETPOST('lineid', 'int');
$userid = GETPOST('userid', 'int');
-$search_product_category = GETPOST('search_product_category', 'int');
$search_ref = GETPOST('sf_ref') ?GETPOST('sf_ref', 'alpha') : GETPOST('search_ref', 'alpha');
$search_refcustomer = GETPOST('search_refcustomer', 'alpha');
$search_type = GETPOST('search_type', 'int');
@@ -89,6 +89,7 @@ $search_project_ref = GETPOST('search_project_ref', 'alpha');
$search_project = GETPOST('search_project', 'alpha');
$search_company = GETPOST('search_company', 'alpha');
$search_company_alias = GETPOST('search_company_alias', 'alpha');
+$search_parent_name = trim(GETPOST('search_parent_name', 'alphanohtml'));
$search_montant_ht = GETPOST('search_montant_ht', 'alpha');
$search_montant_vat = GETPOST('search_montant_vat', 'alpha');
$search_montant_localtax1 = GETPOST('search_montant_localtax1', 'alpha');
@@ -137,10 +138,10 @@ $search_datelimit_endyear = GETPOST('search_datelimit_endyear', 'int');
$search_datelimit_start = dol_mktime(0, 0, 0, $search_datelimit_startmonth, $search_datelimit_startday, $search_datelimit_startyear);
$search_datelimit_end = dol_mktime(23, 59, 59, $search_datelimit_endmonth, $search_datelimit_endday, $search_datelimit_endyear);
$search_categ_cus = GETPOST("search_categ_cus", 'int');
+$search_product_category = GETPOST('search_product_category', 'int');
$search_fac_rec_source_title = GETPOST("search_fac_rec_source_title", 'alpha');
$search_btn = GETPOST('button_search', 'alpha');
$search_remove_btn = GETPOST('button_removefilter', 'alpha');
-$optioncss = GETPOST('optioncss', 'alpha');
$option = GETPOST('search_option');
if ($option == 'late') {
@@ -220,6 +221,7 @@ $arrayfields = array(
'p.title'=>array('label'=>"ProjectLabel", 'checked'=>0, 'enabled'=>(!isModEnabled('project') ? 0 : 1), 'position'=>41),
's.nom'=>array('label'=>"ThirdParty", 'checked'=>1, 'position'=>50),
's.name_alias'=>array('label'=>"AliasNameShort", 'checked'=>1, 'position'=>51),
+ 's2.nom'=>array('label'=>'ParentCompany', 'position'=>32, 'checked'=>0),
's.town'=>array('label'=>"Town", 'checked'=>-1, 'position'=>55),
's.zip'=>array('label'=>"Zip", 'checked'=>1, 'position'=>60),
'state.nom'=>array('label'=>"StateShort", 'checked'=>0, 'position'=>65),
@@ -245,14 +247,14 @@ $arrayfields = array(
'f.multicurrency_total_ttc'=>array('label'=>'MulticurrencyAmountTTC', 'checked'=>0, 'enabled'=>(!isModEnabled('multicurrency') ? 0 : 1), 'position'=>292),
'multicurrency_dynamount_payed'=>array('label'=>'MulticurrencyAlreadyPaid', 'checked'=>0, 'enabled'=>(!isModEnabled('multicurrency') ? 0 : 1), 'position'=>295),
'multicurrency_rtp'=>array('label'=>'MulticurrencyRemainderToPay', 'checked'=>0, 'enabled'=>(!isModEnabled('multicurrency') ? 0 : 1), 'position'=>296), // Not enabled by default because slow
- 'total_pa' => array('label' => ((isset($conf->global->MARGIN_TYPE) && $conf->global->MARGIN_TYPE == '1') ? 'BuyingPrice' : 'CostPrice'), 'checked' => 0, 'position' => 300, 'enabled' => (empty($conf->margin->enabled) || empty($user->rights->margins->liretous) ? 0 : 1)),
- 'total_margin' => array('label' => 'Margin', 'checked' => 0, 'position' => 301, 'enabled' => (empty($conf->margin->enabled) || empty($user->rights->margins->liretous) ? 0 : 1)),
- 'total_margin_rate' => array('label' => 'MarginRate', 'checked' => 0, 'position' => 302, 'enabled' => (empty($conf->margin->enabled) || empty($user->rights->margins->liretous) || empty($conf->global->DISPLAY_MARGIN_RATES) ? 0 : 1)),
- 'total_mark_rate' => array('label' => 'MarkRate', 'checked' => 0, 'position' => 303, 'enabled' => (empty($conf->margin->enabled) || empty($user->rights->margins->liretous) || empty($conf->global->DISPLAY_MARK_RATES) ? 0 : 1)),
+ 'total_pa' => array('label' => ((isset($conf->global->MARGIN_TYPE) && $conf->global->MARGIN_TYPE == '1') ? 'BuyingPrice' : 'CostPrice'), 'checked' => 0, 'position' => 300, 'enabled' => (!isModEnabled('margin') || empty($user->rights->margins->liretous) ? 0 : 1)),
+ 'total_margin' => array('label' => 'Margin', 'checked' => 0, 'position' => 301, 'enabled' => (!isModEnabled('margin') || empty($user->rights->margins->liretous) ? 0 : 1)),
+ 'total_margin_rate' => array('label' => 'MarginRate', 'checked' => 0, 'position' => 302, 'enabled' => (!isModEnabled('margin') || empty($user->rights->margins->liretous) || empty($conf->global->DISPLAY_MARGIN_RATES) ? 0 : 1)),
+ 'total_mark_rate' => array('label' => 'MarkRate', 'checked' => 0, 'position' => 303, 'enabled' => (!isModEnabled('margin') || empty($user->rights->margins->liretous) || empty($conf->global->DISPLAY_MARK_RATES) ? 0 : 1)),
'f.datec'=>array('label'=>"DateCreation", 'checked'=>0, 'position'=>500),
'f.tms'=>array('label'=>"DateModificationShort", 'checked'=>0, 'position'=>502),
- 'f.note_public'=>array('label'=>'NotePublic', 'checked'=>0, 'position'=>510, 'enabled'=>(empty($conf->global->MAIN_LIST_ALLOW_PUBLIC_NOTES))),
- 'f.note_private'=>array('label'=>'NotePrivate', 'checked'=>0, 'position'=>511, 'enabled'=>(empty($conf->global->MAIN_LIST_ALLOW_PRIVATE_NOTES))),
+ 'f.note_public'=>array('label'=>'NotePublic', 'checked'=>0, 'position'=>510, 'enabled'=>(!getDolGlobalInt('MAIN_LIST_HIDE_PUBLIC_NOTES'))),
+ 'f.note_private'=>array('label'=>'NotePrivate', 'checked'=>0, 'position'=>511, 'enabled'=>(!getDolGlobalInt('MAIN_LIST_HIDE_PRIVATE_NOTES'))),
'f.fk_fac_rec_source'=>array('label'=>'GeneratedFromTemplate', 'checked'=>0, 'position'=>520, 'enabled'=>'1'),
'f.fk_statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000),
);
@@ -317,6 +319,7 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter',
$search_project = '';
$search_company = '';
$search_company_alias = '';
+ $search_parent_name = '';
$search_montant_ht = '';
$search_montant_vat = '';
$search_montant_localtax1 = '';
@@ -336,7 +339,6 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter',
$search_town = '';
$search_zip = "";
$search_state = "";
- $search_type = '';
$search_country = '';
$search_type_thirdparty = '';
$search_date_startday = '';
@@ -491,7 +493,7 @@ if ($action == 'makepayment_confirm' && !empty($user->rights->facture->paiement)
$rsql .= " , pfd.date_traite as date_traite";
$rsql .= " , pfd.amount";
$rsql .= " , u.rowid as user_id, u.lastname, u.firstname, u.login";
- $rsql .= " FROM ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+ $rsql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
$rsql .= " , ".MAIN_DB_PREFIX."user as u";
$rsql .= " WHERE fk_facture = ".((int) $objecttmp->id);
$rsql .= " AND pfd.fk_user_demande = u.rowid";
@@ -553,9 +555,11 @@ $bankaccountstatic = new Account($db);
$facturestatic = new Facture($db);
$formcompany = new FormCompany($db);
$companystatic = new Societe($db);
+$companyparent = new Societe($db);
+$company_url_list = array();
$sql = 'SELECT';
-if ($sall || $search_product_category > 0 || $search_user > 0) {
+if ($sall || $search_user > 0) {
$sql = 'SELECT DISTINCT';
}
$sql .= ' f.rowid as id, f.ref, f.ref_client, f.fk_soc, f.type, f.note_private, f.note_public, f.increment, f.fk_mode_reglement, f.fk_cond_reglement, f.total_ht, f.total_tva, f.total_ttc,';
@@ -567,6 +571,8 @@ $sql .= ' f.paye as paye, f.fk_statut, f.close_code,';
$sql .= ' f.datec as date_creation, f.tms as date_update, f.date_closing as date_closing,';
$sql .= ' f.retained_warranty, f.retained_warranty_date_limit, f.situation_final, f.situation_cycle_ref, f.situation_counter,';
$sql .= ' s.rowid as socid, s.nom as name, s.name_alias as alias, s.email, s.phone, s.fax, s.address, s.town, s.zip, s.fk_pays, s.client, s.fournisseur, s.code_client, s.code_fournisseur, s.code_compta as code_compta_client, s.code_compta_fournisseur,';
+$sql .= " s.parent as fk_parent,";
+$sql .= " s2.nom as name2,";
$sql .= ' typent.code as typent_code,';
$sql .= ' state.code_departement as state_code, state.nom as state_name,';
$sql .= ' country.code as country_code,';
@@ -581,9 +587,6 @@ if (!$sall) {
$sql .= ', SUM(pf.amount) as dynamount_payed, SUM(pf.multicurrency_amount) as multicurrency_dynamount_payed';
}
*/
-if ($search_categ_cus && $search_categ_cus != -1) {
- $sql .= ", cc.fk_categorie, cc.fk_soc";
-}
// Add fields from extrafields
if (!empty($extrafields->attributes[$object->table_element]['label'])) {
foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
@@ -592,16 +595,13 @@ if (!empty($extrafields->attributes[$object->table_element]['label'])) {
}
// Add fields from hooks
$parameters = array();
-$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$sql .= $hookmanager->resPrint;
$sql .= ' FROM '.MAIN_DB_PREFIX.'societe as s';
+$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s2 ON s2.rowid = s.parent";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typent)";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)";
-if (!empty($search_categ_cus) && $search_categ_cus != '-1') {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_societe as cc ON s.rowid = cc.fk_soc"; // We'll need this table joined to the select in order to filter by categ
-}
-
$sql .= ', '.MAIN_DB_PREFIX.'facture as f';
if ($sortfield == "f.datef") {
$sql .= $db->hintindex('idx_facture_datef');
@@ -616,13 +616,9 @@ if (!$sall) {
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'paiement_facture as pf ON pf.fk_facture = f.rowid';
}
*/
-if ($sall || $search_product_category > 0) {
+if ($sall) {
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'facturedet as pd ON f.rowid=pd.fk_facture';
}
-if ($search_product_category > 0) {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_product as cp ON cp.fk_product=pd.fk_product';
-}
-
if (!empty($search_fac_rec_source_title)) {
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'facture_rec as facrec ON f.fk_fac_rec_source=facrec.rowid';
}
@@ -646,9 +642,6 @@ $sql .= ' AND f.entity IN ('.getEntity('invoice').')';
if (empty($user->rights->societe->client->voir) && !$socid) {
$sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
}
-if ($search_product_category > 0) {
- $sql .= " AND cp.fk_categorie = ".((int) $search_product_category);
-}
if ($socid > 0) {
$sql .= ' AND s.rowid = '.((int) $socid);
}
@@ -680,6 +673,9 @@ if ($search_company) {
if ($search_company_alias) {
$sql .= natural_search('s.name_alias', $search_company_alias);
}
+if ($search_parent_name) {
+ $sql .= natural_search('s2.nom', $search_parent_name);
+}
if ($search_town) {
$sql .= natural_search('s.town', $search_town);
}
@@ -746,12 +742,6 @@ if ($search_multicurrency_montant_ttc != '') {
if ($search_login) {
$sql .= natural_search(array('u.login', 'u.firstname', 'u.lastname'), $search_login);
}
-if ($search_categ_cus > 0) {
- $sql .= " AND cc.fk_categorie = ".((int) $search_categ_cus);
-}
-if ($search_categ_cus == -2) {
- $sql .= " AND cc.fk_categorie IS NULL";
-}
if ($search_status != '-1' && $search_status != '') {
if (is_numeric($search_status) && $search_status >= 0) {
if ($search_status == '0') {
@@ -813,11 +803,71 @@ if ($search_user > 0) {
if (!empty($search_fac_rec_source_title)) {
$sql .= natural_search('facrec.titre', $search_fac_rec_source_title);
}
+// Search for tag/category ($searchCategoryProductList is an array of ID)
+$searchCategoryProductList = $search_product_category ? array($search_product_category) : array();
+$searchCategoryProductOperator = 0;
+if (!empty($searchCategoryProductList)) {
+ $searchCategoryProductSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategoryProductList as $searchCategoryProduct) {
+ if (intval($searchCategoryProduct) == -2) {
+ $searchCategoryProductSqlList[] = "NOT EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."facturedet as fd WHERE fd.fk_facture = f.rowid AND fd.fk_product = ck.fk_product)";
+ } elseif (intval($searchCategoryProduct) > 0) {
+ if ($searchCategoryProductOperator == 0) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."facturedet as fd WHERE fd.fk_facture = f.rowid AND fd.fk_product = ck.fk_product AND ck.fk_categorie = ".((int) $searchCategoryProduct).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProduct);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."facturedet as fd WHERE fd.fk_facture = f.rowid AND fd.fk_product = ck.fk_product AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategoryProductOperator == 1) {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
+ }
+ }
+}
+$searchCategoryCustomerList = $search_categ_cus ? array($search_categ_cus) : array();;
+$searchCategoryCustomerOperator = 0;
+// Search for tag/category ($searchCategoryCustomerList is an array of ID)
+if (!empty($searchCategoryCustomerList)) {
+ $searchCategoryCustomerSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategoryCustomerList as $searchCategoryCustomer) {
+ if (intval($searchCategoryCustomer) == -2) {
+ $searchCategoryCustomerSqlList[] = "NOT EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as ck WHERE s.rowid = ck.fk_soc)";
+ } elseif (intval($searchCategoryCustomer) > 0) {
+ if ($searchCategoryCustomerOperator == 0) {
+ $searchCategoryCustomerSqlList[] = " EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as ck WHERE s.rowid = ck.fk_soc AND ck.fk_categorie = ".((int) $searchCategoryCustomer).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryCustomer);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategoryCustomerSqlList[] = " EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as ck WHERE s.rowid = ck.fk_soc AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategoryCustomerOperator == 1) {
+ if (!empty($searchCategoryCustomerSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryCustomerSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryCustomerSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryCustomerSqlList).")";
+ }
+ }
+}
// Add where from extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
// Add where from hooks
$parameters = array();
-$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$sql .= $hookmanager->resPrint;
// We disable this. It create a bug when searching with sall and sorting on status. Also it create performance troubles.
@@ -868,10 +918,10 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
$nbtotalofrecords = $db->num_rows($result);
*/
/* The fast and low memory method to get and count full list converts the sql into a sql count */
- if ($sall || $search_product_category > 0 || $search_user > 0) {
- $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/', 'SELECT COUNT(DISTINCT f.rowid) as nbtotalofrecords FROM', $sql);
+ if ($sall || $search_user > 0) {
+ $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/Ui', 'SELECT COUNT(DISTINCT f.rowid) as nbtotalofrecords FROM', $sql);
} else {
- $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/', 'SELECT COUNT(f.rowid) as nbtotalofrecords FROM', $sql);
+ $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/Ui', 'SELECT COUNT(f.rowid) as nbtotalofrecords FROM', $sql);
$sqlforcount = preg_replace('/LEFT JOIN '.MAIN_DB_PREFIX.'paiement_facture as pf ON pf.fk_facture = f.rowid/', '', $sqlforcount);
}
$sqlforcount = preg_replace('/GROUP BY.*$/', '', $sqlforcount);
@@ -1008,10 +1058,13 @@ if ($resql) {
$param .= '&search_type='.urlencode($search_type);
}
if ($search_company) {
- $param .= '&search_societe='.urlencode($search_company);
+ $param .= '&search_company='.urlencode($search_company);
}
if ($search_company_alias) {
- $param .= '&search_societe_alias='.urlencode($search_company_alias);
+ $param .= '&search_company_alias='.urlencode($search_company_alias);
+ }
+ if ($search_parent_name != '') {
+ $param .= '&search_parent_name='.urlencode($search_parent_name);
}
if ($search_town) {
$param .= '&search_town='.urlencode($search_town);
@@ -1022,6 +1075,9 @@ if ($resql) {
if ($search_country) {
$param .= "&search_country=".urlencode($search_country);
}
+ if ($search_type_thirdparty != '') {
+ $param .= '&search_type_thirdparty='.urlencode($search_type_thirdparty);
+ }
if ($search_sale > 0) {
$param .= '&search_sale='.urlencode($search_sale);
}
@@ -1099,7 +1155,7 @@ if ($resql) {
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
// Add $param from hooks
$parameters = array();
- $reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$param .= $hookmanager->resPrint;
$arrayofmassactions = array(
@@ -1217,7 +1273,7 @@ if ($resql) {
$moreforfilter .= '
';
}
$parameters = array();
- $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
if (empty($reshook)) {
$moreforfilter .= $hookmanager->resPrint;
} else {
@@ -1337,6 +1393,12 @@ if ($resql) {
if (!empty($arrayfields['s.name_alias']['checked'])) {
print ' ';
}
+ // Parent company
+ if (!empty($arrayfields['s2.nom']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+ }
// Town
if (!empty($arrayfields['s.town']['checked'])) {
print ' ';
@@ -1366,13 +1428,13 @@ if ($resql) {
// Payment mode
if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) {
print '';
- print $form->select_types_paiements($search_paymentmode, 'search_paymentmode', '', 0, 1, 1, 10, 1, '', 1);
+ print $form->select_types_paiements($search_paymentmode, 'search_paymentmode', '', 0, 1, 1, 0, 1, 'minwidth100 maxwidth100', 1);
print ' ';
}
// Payment terms
if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) {
print '';
- print $form->getSelectConditionsPaiements($search_paymentterms, 'search_paymentterms', -1, 1, 1);
+ print $form->getSelectConditionsPaiements($search_paymentterms, 'search_paymentterms', -1, 1, 1, 'minwidth100 maxwidth100');
print ' ';
}
// Module source
@@ -1498,7 +1560,7 @@ if ($resql) {
// Fields from hook
$parameters = array('arrayfields'=>$arrayfields);
- $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Date creation
if (!empty($arrayfields['f.datec']['checked'])) {
@@ -1586,6 +1648,9 @@ if ($resql) {
if (!empty($arrayfields['s.name_alias']['checked'])) {
print_liste_field_titre($arrayfields['s.name_alias']['label'], $_SERVER['PHP_SELF'], 's.name_alias', '', $param, '', $sortfield, $sortorder);
}
+ if (!empty($arrayfields['s2.nom']['checked'])) {
+ print_liste_field_titre($arrayfields['s2.nom']['label'], $_SERVER['PHP_SELF'], 's2.nom', '', $param, '', $sortfield, $sortorder);
+ }
if (!empty($arrayfields['s.town']['checked'])) {
print_liste_field_titre($arrayfields['s.town']['label'], $_SERVER["PHP_SELF"], 's.town', '', $param, '', $sortfield, $sortorder);
}
@@ -1680,7 +1745,7 @@ if ($resql) {
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
// Hook fields
$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
- $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
if (!empty($arrayfields['f.datec']['checked'])) {
print_liste_field_titre($arrayfields['f.datec']['label'], $_SERVER["PHP_SELF"], "f.datec", "", $param, 'align="center" class="nowrap"', $sortfield, $sortorder);
@@ -1715,6 +1780,7 @@ if ($resql) {
if ($num > 0) {
$i = 0;
+ $typenArray = $formcompany->typent_array(1);
$totalarray = array();
$totalarray['nbfield'] = 0;
$totalarray['val'] = array();
@@ -1735,7 +1801,6 @@ if ($resql) {
$total_margin = 0;
$savnbfield = $totalarray['nbfield'];
- $totalarray = array();
$totalarray['nbfield'] = 0;
$imaxinloop = ($limit ? min($num, $limit) : $num);
while ($i < $imaxinloop) {
@@ -1989,6 +2054,26 @@ if ($resql) {
$totalarray['nbfield']++;
}
}
+ // Parent company
+ if (!empty($arrayfields['s2.nom']['checked'])) {
+ print '';
+ if ($obj->fk_parent > 0) {
+ if (!isset($company_url_list[$obj->fk_parent])) {
+ $companyparent = new Societe($db);
+ $res = $companyparent->fetch($obj->fk_parent);
+ if ($res > 0) {
+ $company_url_list[$obj->fk_parent] = $companyparent->getNomUrl(1);
+ }
+ }
+ if (isset($company_url_list[$obj->fk_parent])) {
+ print $company_url_list[$obj->fk_parent];
+ }
+ }
+ print " ";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
// Town
if (!empty($arrayfields['s.town']['checked'])) {
print '';
@@ -2051,8 +2136,9 @@ if ($resql) {
// Payment mode
if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) {
- print ' ';
- $form->form_modes_reglement($_SERVER['PHP_SELF'], $obj->fk_mode_reglement, 'none', '', -1);
+ $s = $form->form_modes_reglement($_SERVER['PHP_SELF'], $obj->fk_mode_reglement, 'none', '', -1, 0, '', 1);
+ print ' ';
+ print $s;
print ' ';
if (!$i) {
$totalarray['nbfield']++;
@@ -2061,8 +2147,9 @@ if ($resql) {
// Payment terms
if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) {
- print '';
- $form->form_conditions_reglement($_SERVER['PHP_SELF'], $obj->fk_cond_reglement, 'none');
+ $s = $form->form_conditions_reglement($_SERVER['PHP_SELF'], $obj->fk_cond_reglement, 'none', 0, '', -1, -1, 1);
+ print ' ';
+ print $s;
print ' ';
if (!$i) {
$totalarray['nbfield']++;
@@ -2358,7 +2445,7 @@ if ($resql) {
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
// Fields from hook
$parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
- $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Date creation
if (!empty($arrayfields['f.datec']['checked'])) {
@@ -2471,7 +2558,7 @@ if ($resql) {
$db->free($resql);
$parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
- $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
print '
'."\n";
diff --git a/htdocs/compta/facture/note.php b/htdocs/compta/facture/note.php
index 451ccbab8c4..af08c6163e2 100644
--- a/htdocs/compta/facture/note.php
+++ b/htdocs/compta/facture/note.php
@@ -59,6 +59,8 @@ $hookmanager->initHooks(array('invoicenote'));
$result = restrictedArea($user, 'facture', $id, '');
+$usercancreate = $user->hasRight("facture", "creer");
+
/*
* Actions
@@ -118,37 +120,25 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= '
'.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'customer');
+ $morehtmlref .= '
'.$object->thirdparty->getNomUrl(1, 'customer');
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= '
'.$langs->trans('Project').' ';
- if ($user->rights->facture->creer) {
+ $morehtmlref .= '
';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/compta/facture/prelevement.php b/htdocs/compta/facture/prelevement.php
index c36b205b8fb..5664c2e3f54 100644
--- a/htdocs/compta/facture/prelevement.php
+++ b/htdocs/compta/facture/prelevement.php
@@ -114,11 +114,7 @@ if (empty($reshook)) {
}
$paymentservice = GETPOST('paymentservice');
- if (preg_match('/stripesepa/', $paymentservice)) {
- $result = $object->demande_prelevement_stripe($user, price2num(GETPOST('withdraw_request_amount', 'alpha')), $newtype, $sourcetype);
- } else {
- $result = $object->demande_prelevement($user, price2num(GETPOST('withdraw_request_amount', 'alpha')), $newtype, $sourcetype);
- }
+ $result = $object->demande_prelevement($user, price2num(GETPOST('withdraw_request_amount', 'alpha')), $newtype, $sourcetype);
if ($result > 0) {
$db->commit();
@@ -142,6 +138,21 @@ if (empty($reshook)) {
}
}
+ // Payment with Direct Debit Stripe
+ if ($action == 'sepastripepayment' && $usercancreate) {
+ $result = $object->makeStripeSepaRequest($user, GETPOST('did', 'int'), 'direct-debit', 'facture');
+ if ($result < 0) {
+ setEventMessages($object->error, $object->errors, 'errors');
+ } else {
+ // We refresh object data
+ $ret = $object->fetch($id, $ref);
+ $isdraft = (($object->statut == FactureFournisseur::STATUS_DRAFT) ? 1 : 0);
+ if ($ret > 0) {
+ $object->fetch_thirdparty();
+ }
+ }
+ }
+
// payments conditions
if ($action == 'setconditions' && $usercancreate) {
$object->fetch($id);
@@ -260,7 +271,7 @@ if ($object->id > 0) {
$resteapayeraffiche = $resteapayer;
if ($type == 'bank-transfer') {
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) { // Never use this
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) { // Not recommended
$filterabsolutediscount = "fk_invoice_supplier_source IS NULL"; // If we want deposit to be substracted to payments only and not to total of final invoice
$filtercreditnote = "fk_invoice_supplier_source IS NOT NULL"; // If we want deposit to be substracted to payments only and not to total of final invoice
} else {
@@ -273,7 +284,7 @@ if ($object->id > 0) {
$absolute_discount = price2num($absolute_discount, 'MT');
$absolute_creditnote = price2num($absolute_creditnote, 'MT');
} else {
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) { // Not recommended
$filterabsolutediscount = "fk_facture_source IS NULL"; // If we want deposit to be substracted to payments only and not to total of final invoice
$filtercreditnote = "fk_facture_source IS NOT NULL"; // If we want deposit to be substracted to payments only and not to total of final invoice
} else {
@@ -307,7 +318,7 @@ if ($object->id > 0) {
$sql = "SELECT pfd.rowid, pfd.traite, pfd.date_demande as date_demande";
$sql .= " , pfd.date_traite as date_traite";
$sql .= " , pfd.amount";
- $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+ $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
if ($type == 'bank-transfer') {
$sql .= " WHERE fk_facture_fourn = ".((int) $object->id);
} else {
@@ -345,7 +356,7 @@ if ($object->id > 0) {
$morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
}
// Thirdparty
- $morehtmlref .= '
'.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= '
'.$object->thirdparty->getNomUrl(1);
if ($type == 'bank-transfer') {
if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
$morehtmlref .= ' (
'.$langs->trans("OtherBills").' )';
@@ -359,33 +370,20 @@ if ($object->id > 0) {
if (isModEnabled('project')) {
$langs->load("projects");
$morehtmlref .= '
'.$langs->trans('Project').' ';
- if ($usercancreate) {
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
@@ -695,7 +693,7 @@ if ($object->id > 0) {
// For which amount ?
$sql = "SELECT SUM(pfd.amount) as amount";
- $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+ $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
if ($type == 'bank-transfer') {
$sql .= " WHERE fk_facture_fourn = ".((int) $object->id);
} else {
@@ -821,7 +819,7 @@ if ($object->id > 0) {
$sql = "SELECT pfd.rowid, pfd.traite, pfd.date_demande as date_demande,";
$sql .= " pfd.date_traite as date_traite, pfd.amount,";
$sql .= " u.rowid as user_id, u.email, u.lastname, u.firstname, u.login, u.statut as user_status";
- $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+ $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on pfd.fk_user_demande = u.rowid";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."prelevement_bons as pb ON pb.rowid = pfd.fk_prelevement_bons";
if ($type == 'bank-transfer') {
@@ -871,7 +869,8 @@ if ($object->id > 0) {
print '
';
if (!empty($conf->global->STRIPE_SEPA_DIRECT_DEBIT)) {
- print 'rowid.'&id='.$object->id.'&type='.urlencode($type).'">'.img_picto('', 'stripe', 'class="pictofixedwidth"').$langs->trans("SendToStripe").' ';
+ $langs->load("stripe");
+ print 'rowid.'&id='.$object->id.'&type='.urlencode($type).'">'.img_picto('', 'stripe', 'class="pictofixedwidth"').$langs->trans("RequestDirectDebitWithStripe").' ';
}
print ' ';
@@ -897,7 +896,7 @@ if ($object->id > 0) {
$sql = "SELECT pfd.rowid, pfd.traite, pfd.date_demande, pfd.date_traite, pfd.fk_prelevement_bons, pfd.amount,";
$sql .= " pb.ref,";
$sql .= " u.rowid as user_id, u.email, u.lastname, u.firstname, u.login, u.statut as user_status";
- $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+ $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on pfd.fk_user_demande = u.rowid";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."prelevement_bons as pb ON pb.rowid = pfd.fk_prelevement_bons";
if ($type == 'bank-transfer') {
diff --git a/htdocs/compta/facture/stats/index.php b/htdocs/compta/facture/stats/index.php
index 7bb430489b2..760a0eca4c8 100644
--- a/htdocs/compta/facture/stats/index.php
+++ b/htdocs/compta/facture/stats/index.php
@@ -64,7 +64,7 @@ if ($user->socid > 0) {
$socid = $user->socid;
}
-$nowyear = strftime("%Y", dol_now());
+$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$year = GETPOST('year') > 0 ? GETPOST('year', 'int') : $nowyear;
$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS)));
$endyear = $year;
diff --git a/htdocs/compta/facture/tpl/linkedobjectblock.tpl.php b/htdocs/compta/facture/tpl/linkedobjectblock.tpl.php
index c70416fec6e..6a16f4fa641 100644
--- a/htdocs/compta/facture/tpl/linkedobjectblock.tpl.php
+++ b/htdocs/compta/facture/tpl/linkedobjectblock.tpl.php
@@ -68,17 +68,13 @@ foreach ($linkedObjectBlock as $key => $objectlink) {
}
print '';
print '
'.$objectlink->getNomUrl(1).' ';
- print '
'.$objectlink->ref_client.' ';
+ print '
'.dol_escape_htmltag($objectlink->ref_client).' ';
print '
'.dol_print_date($objectlink->date, 'day').' ';
- print '
';
+ print ' ';
if (!empty($objectlink) && $objectlink->element == 'facture' && $user->hasRight('facture', 'lire')) {
- $sign = 1;
- if ($objectlink->type == Facture::TYPE_CREDIT_NOTE) {
- $sign = -1;
- }
if ($objectlink->statut != 3) {
// If not abandonned
- $total = $total + $sign * $objectlink->total_ht;
+ $total += $objectlink->total_ht;
echo price($objectlink->total_ht);
} else {
echo ''.price($objectlink->total_ht).' ';
diff --git a/htdocs/compta/facture/tpl/linkedobjectblockForRec.tpl.php b/htdocs/compta/facture/tpl/linkedobjectblockForRec.tpl.php
index d7e68e274fa..1bca663e1ef 100644
--- a/htdocs/compta/facture/tpl/linkedobjectblockForRec.tpl.php
+++ b/htdocs/compta/facture/tpl/linkedobjectblockForRec.tpl.php
@@ -47,7 +47,7 @@ foreach ($linkedObjectBlock as $key => $objectlink) {
?>
trans("RepeatableInvoice"); ?>
- getNomUrl(1); ?>
+ getNomUrl(1); ?>
date_when, 'day'); ?>
trans("PurchasesJournal"), '', '', 0, 0, '', '', $morequer
$form = new Form($db);
-$year_current = strftime("%Y", dol_now());
+$year_current = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$pastmonth = strftime("%m", dol_now()) - 1;
$pastmonthyear = $year_current;
if ($pastmonth == 0) {
@@ -95,7 +95,7 @@ $periodlink = '';
$exportlink = '';
$builddate = dol_now();
$description = $langs->trans("DescPurchasesJournal").' ';
-if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
$description .= $langs->trans("DepositsAreNotIncluded");
} else {
$description .= $langs->trans("DepositsAreIncluded");
@@ -119,7 +119,7 @@ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON p.rowid = fd.fk_product";
$sql .= " JOIN ".MAIN_DB_PREFIX."facture_fourn as f ON f.rowid = fd.fk_facture_fourn";
$sql .= " JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = f.fk_soc";
$sql .= " WHERE f.fk_statut > 0 AND f.entity IN (".getEntity('invoice').")";
-if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
$sql .= " AND f.type IN (0,1,2)";
} else {
$sql .= " AND f.type IN (0,1,2,3)";
diff --git a/htdocs/compta/journal/sellsjournal.php b/htdocs/compta/journal/sellsjournal.php
index d704e09ad68..0fc5a192271 100644
--- a/htdocs/compta/journal/sellsjournal.php
+++ b/htdocs/compta/journal/sellsjournal.php
@@ -77,7 +77,7 @@ $morequery = '&date_startyear='.$date_startyear.'&date_startmonth='.$date_startm
llxHeader('', $langs->trans("SellsJournal"), '', '', 0, 0, '', '', $morequery);
-$year_current = strftime("%Y", dol_now());
+$year_current = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$pastmonth = strftime("%m", dol_now()) - 1;
$pastmonthyear = $year_current;
if ($pastmonth == 0) {
diff --git a/htdocs/compta/localtax/clients.php b/htdocs/compta/localtax/clients.php
index 7f8e181f121..d5aef47c285 100644
--- a/htdocs/compta/localtax/clients.php
+++ b/htdocs/compta/localtax/clients.php
@@ -39,7 +39,7 @@ $local = GETPOST('localTaxType', 'int');
// Date range
$year = GETPOST("year", "int");
if (empty($year)) {
- $year_current = strftime("%Y", dol_now());
+ $year_current = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$year_start = $year_current;
} else {
$year_current = $year;
diff --git a/htdocs/compta/localtax/index.php b/htdocs/compta/localtax/index.php
index e9aab173337..ad0b86a161d 100644
--- a/htdocs/compta/localtax/index.php
+++ b/htdocs/compta/localtax/index.php
@@ -38,7 +38,7 @@ $localTaxType = GETPOST('localTaxType', 'int');
// Date range
$year = GETPOST("year", "int");
if (empty($year)) {
- $year_current = strftime("%Y", dol_now());
+ $year_current = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$year_start = $year_current;
} else {
$year_current = $year;
diff --git a/htdocs/compta/localtax/quadri_detail.php b/htdocs/compta/localtax/quadri_detail.php
index 0dfb0ab3c6d..66c58580df6 100644
--- a/htdocs/compta/localtax/quadri_detail.php
+++ b/htdocs/compta/localtax/quadri_detail.php
@@ -49,7 +49,7 @@ $local = GETPOST('localTaxType', 'int');
// Date range
$year = GETPOST("year", "int");
if (empty($year)) {
- $year_current = strftime("%Y", dol_now());
+ $year_current = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$year_start = $year_current;
} else {
$year_current = $year;
@@ -194,6 +194,9 @@ if ($conf->global->TAX_MODE_SELL_SERVICE == 'payment') $description.=' '.$lan
if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
$description.=' '.$langs->trans("DepositsAreNotIncluded");
}
+if (! empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $description.=' '.$langs->trans("SupplierDepositsAreNotIncluded");
+}
*/
if (!empty($conf->global->MAIN_MODULE_ACCOUNTING)) {
$description .= $langs->trans("ThisIsAnEstimatedValue");
diff --git a/htdocs/compta/paiement.php b/htdocs/compta/paiement.php
index dec5787302a..f2cd1fe18f9 100644
--- a/htdocs/compta/paiement.php
+++ b/htdocs/compta/paiement.php
@@ -414,7 +414,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie
json["amountPayment"] = $("#amountpayment").attr("value");
json["amounts"] = _elemToJson(form.find("input.amount"));
json["remains"] = _elemToJson(form.find("input.remain"));
-
+ json["token"] = "'.currentToken().'";
if (imgId != null) {
json["imgClicked"] = imgId;
}
@@ -750,7 +750,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie
$numdirectdebitopen = 0;
$totaldirectdebit = 0;
$sql = "SELECT COUNT(pfd.rowid) as nb, SUM(pfd.amount) as amount";
- $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+ $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
$sql .= " WHERE fk_facture = ".((int) $objp->facid);
$sql .= " AND pfd.traite = 0";
$sql .= " AND pfd.ext_payment_id IS NULL";
diff --git a/htdocs/compta/paiement/card.php b/htdocs/compta/paiement/card.php
index 89ee368b7d5..58a27c94974 100644
--- a/htdocs/compta/paiement/card.php
+++ b/htdocs/compta/paiement/card.php
@@ -520,13 +520,7 @@ if (!empty($conf->global->BILL_ADD_PAYMENT_VALIDATION)) {
}
if ($user->socid == 0 && $action == '') {
- if ($user->rights->facture->paiement) {
- if (!$disable_delete) {
- print ''.$langs->trans('Delete').' ';
- } else {
- print ''.$langs->trans('Delete').' ';
- }
- }
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $user->rights->facture->paiement && !$disable_delete);
}
print '';
diff --git a/htdocs/compta/paiement/cheque/card.php b/htdocs/compta/paiement/cheque/card.php
index 7b3eaceab3a..f28ebf2ebcf 100644
--- a/htdocs/compta/paiement/cheque/card.php
+++ b/htdocs/compta/paiement/cheque/card.php
@@ -82,6 +82,7 @@ $usercanread = $user->rights->banque->cheque;
$usercancreate = $user->rights->banque->cheque;
$usercandelete = $user->rights->banque->cheque;
+$permissiontodelete = $user->rights->banque->cheque;
/*
@@ -750,7 +751,7 @@ if ($user->socid == 0 && !empty($object->id) && $object->statut == 0 && $user->r
}
if ($user->socid == 0 && !empty($object->id) && $user->rights->banque->cheque) {
- print 'id.'&action=delete&token='.newToken().'&sortfield='.$sortfield.'&sortorder='.$sortorder.'">'.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete);
}
print '';
diff --git a/htdocs/compta/payment_sc/card.php b/htdocs/compta/payment_sc/card.php
index 1d93075bc5b..39bac75ba0c 100644
--- a/htdocs/compta/payment_sc/card.php
+++ b/htdocs/compta/payment_sc/card.php
@@ -253,9 +253,9 @@ if (!empty($conf->global->BILL_ADD_PAYMENT_VALIDATION))
if ($action == '') {
if ($user->rights->tax->charges->supprimer) {
if (!$disable_delete) {
- print ''.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', 1);
} else {
- print ''.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans("CantRemovePaymentWithOneInvoicePaid"), $langs->trans("Delete"), 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', 0);
}
}
}
diff --git a/htdocs/compta/payment_vat/card.php b/htdocs/compta/payment_vat/card.php
index 8beeaa1f229..6089f9dbcb5 100644
--- a/htdocs/compta/payment_vat/card.php
+++ b/htdocs/compta/payment_vat/card.php
@@ -308,9 +308,9 @@ if (!empty($conf->global->BILL_ADD_PAYMENT_VALIDATION))
if ($action == '') {
if ($user->rights->tax->charges->supprimer) {
if (!$disable_delete) {
- print ''.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', 1);
} else {
- print ''.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans("CantRemovePaymentVATPaid"), $langs->trans("Delete"), 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', 0);
}
}
}
diff --git a/htdocs/compta/paymentbybanktransfer/index.php b/htdocs/compta/paymentbybanktransfer/index.php
index 9e79cd98939..ba37fde1ba5 100644
--- a/htdocs/compta/paymentbybanktransfer/index.php
+++ b/htdocs/compta/paymentbybanktransfer/index.php
@@ -109,7 +109,7 @@ $sql .= " ".MAIN_DB_PREFIX."societe as s";
if (empty($user->rights->societe->client->voir) && !$socid) {
$sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
}
-$sql .= ", ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+$sql .= ", ".MAIN_DB_PREFIX."prelevement_demande as pfd";
$sql .= " WHERE s.rowid = f.fk_soc";
$sql .= " AND f.entity IN (".getEntity('supplier_invoice').")";
$sql .= " AND f.total_ttc > 0";
diff --git a/htdocs/compta/prelevement/card.php b/htdocs/compta/prelevement/card.php
index c03a2eea6b5..8be48493d08 100644
--- a/htdocs/compta/prelevement/card.php
+++ b/htdocs/compta/prelevement/card.php
@@ -285,7 +285,7 @@ if ($id > 0 || $ref) {
print ' '.$langs->trans("TransMetod").' ';
print $form->selectarray("methode", $object->methodes_trans);
print ' ';
- print '
';
+ print '
';
print '
';
print '';
print '
';
diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php
index fd9575dd982..344229dc0a8 100644
--- a/htdocs/compta/prelevement/class/bonprelevement.class.php
+++ b/htdocs/compta/prelevement/class/bonprelevement.class.php
@@ -22,9 +22,9 @@
*/
/**
- * \file htdocs/compta/prelevement/class/bonprelevement.class.php
- * \ingroup prelevement
- * \brief File of withdrawal receipts class
+ * \file htdocs/compta/prelevement/class/bonprelevement.class.php
+ * \ingroup prelevement
+ * \brief File of withdrawal receipts class
*/
require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
@@ -151,7 +151,7 @@ class BonPrelevement extends CommonObject
if ($result == 0) {
if ($line_id > 0) {
- $sql = "INSERT INTO ".MAIN_DB_PREFIX."prelevement_facture (";
+ $sql = "INSERT INTO ".MAIN_DB_PREFIX."prelevement (";
if ($type != 'bank-transfer') {
$sql .= "fk_facture";
} else {
@@ -353,7 +353,8 @@ class BonPrelevement extends CommonObject
if ($this->fetched == 1) {
if ($date < $this->date_trans) {
- $this->error = 'DateOfMovementLowerThanDateOfFileTransmission';
+ $langs->load("errors");
+ $this->error = $langs->trans('ErrorDateOfMovementLowerThanDateOfFileTransmission');
dol_syslog("bon-prelevment::set_infocredit 1027 ".$this->error);
return -1027;
}
@@ -419,8 +420,8 @@ class BonPrelevement extends CommonObject
} else {
$paiement = new Paiement($this->db);
}
- $paiement->datepaye = $date;
- $paiement->amounts = $cursoramounts; // Array with detail of dispatching of payments for each invoice
+ $paiement->datepaye = $date;
+ $paiement->amounts = $cursoramounts; // Array with detail of dispatching of payments for each invoice
if ($this->type == 'bank-transfer') {
$paiement->paiementid = 2;
@@ -576,7 +577,7 @@ class BonPrelevement extends CommonObject
}
$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_bons as p";
$sql .= " , ".MAIN_DB_PREFIX."prelevement_lignes as pl";
- $sql .= " , ".MAIN_DB_PREFIX."prelevement_facture as pf";
+ $sql .= " , ".MAIN_DB_PREFIX."prelevement as pf";
$sql .= " WHERE pf.fk_prelevement_lignes = pl.rowid";
$sql .= " AND pl.fk_prelevement_bons = p.rowid";
$sql .= " AND p.rowid = ".((int) $this->id);
@@ -634,7 +635,7 @@ class BonPrelevement extends CommonObject
} else {
$sql .= " FROM ".MAIN_DB_PREFIX."facture_fourn as f,";
}
- $sql .= " ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+ $sql .= " ".MAIN_DB_PREFIX."prelevement_demande as pfd";
$sql .= " WHERE f.entity IN (".getEntity('invoice').")";
if (empty($conf->global->WITHDRAWAL_ALLOW_ANY_INVOICE_STATUS)) {
$sql .= " AND f.fk_statut = ".Facture::STATUS_VALIDATED;
@@ -694,7 +695,7 @@ class BonPrelevement extends CommonObject
} else {
$sql .= " FROM ".MAIN_DB_PREFIX."facture as f";
}
- $sql .= ", ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+ $sql .= ", ".MAIN_DB_PREFIX."prelevement_demande as pfd";
$sql .= " WHERE f.entity IN (".getEntity('invoice').")";
if (empty($conf->global->WITHDRAWAL_ALLOW_ANY_INVOICE_STATUS)) {
$sql .= " AND f.fk_statut = ".Facture::STATUS_VALIDATED;
@@ -757,14 +758,14 @@ class BonPrelevement extends CommonObject
$error = 0;
- $datetimeprev = time();
+ $datetimeprev = dol_now('gmt');
//Choice the date of the execution direct debit
if (!empty($executiondate)) {
$datetimeprev = $executiondate;
}
- $month = strftime("%m", $datetimeprev);
- $year = strftime("%Y", $datetimeprev);
+ $month = dol_print_date($datetimeprev, "%m", 'gmt');
+ $year = dol_print_date($datetimeprev, "%Y", 'gmt');
$this->invoice_in_error = array();
$this->thirdparty_in_error = array();
@@ -787,7 +788,7 @@ class BonPrelevement extends CommonObject
$sql .= " FROM ".MAIN_DB_PREFIX."facture_fourn as f";
}
$sql .= ", ".MAIN_DB_PREFIX."societe as s";
- $sql .= ", ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+ $sql .= ", ".MAIN_DB_PREFIX."prelevement_demande as pfd";
$sql .= " WHERE f.entity IN (".getEntity('invoice').')';
if ($type != 'bank-transfer') {
$sql .= " AND f.rowid = pfd.fk_facture";
@@ -1013,7 +1014,7 @@ class BonPrelevement extends CommonObject
}
// Update invoice requests as done
- $sql = "UPDATE ".MAIN_DB_PREFIX."prelevement_facture_demande";
+ $sql = "UPDATE ".MAIN_DB_PREFIX."prelevement_demande";
$sql .= " SET traite = 1";
$sql .= ", date_traite = '".$this->db->idate($now)."'";
$sql .= ", fk_prelevement_bons = ".((int) $this->id);
@@ -1146,7 +1147,7 @@ class BonPrelevement extends CommonObject
}
if (!$error) {
- $sql = "DELETE FROM ".MAIN_DB_PREFIX."prelevement_facture WHERE fk_prelevement_lignes IN (SELECT rowid FROM ".MAIN_DB_PREFIX."prelevement_lignes WHERE fk_prelevement_bons = ".((int) $this->id).")";
+ $sql = "DELETE FROM ".MAIN_DB_PREFIX."prelevement WHERE fk_prelevement_lignes IN (SELECT rowid FROM ".MAIN_DB_PREFIX."prelevement_lignes WHERE fk_prelevement_bons = ".((int) $this->id).")";
$resql1 = $this->db->query($sql);
if (!$resql1) {
dol_print_error($this->db);
@@ -1170,7 +1171,7 @@ class BonPrelevement extends CommonObject
}
if (!$error) {
- $sql = "UPDATE ".MAIN_DB_PREFIX."prelevement_facture_demande SET fk_prelevement_bons = NULL, traite = 0 WHERE fk_prelevement_bons = ".((int) $this->id);
+ $sql = "UPDATE ".MAIN_DB_PREFIX."prelevement_demande SET fk_prelevement_bons = NULL, traite = 0 WHERE fk_prelevement_bons = ".((int) $this->id);
$resql4 = $this->db->query($sql);
if (!$resql4) {
dol_print_error($this->db);
@@ -1424,7 +1425,7 @@ class BonPrelevement extends CommonObject
$sql .= " FROM";
$sql .= " ".MAIN_DB_PREFIX."prelevement_lignes as pl,";
$sql .= " ".MAIN_DB_PREFIX."facture as f,";
- $sql .= " ".MAIN_DB_PREFIX."prelevement_facture as pf,";
+ $sql .= " ".MAIN_DB_PREFIX."prelevement as pf,";
$sql .= " ".MAIN_DB_PREFIX."societe as soc,";
$sql .= " ".MAIN_DB_PREFIX."c_country as c,";
$sql .= " ".MAIN_DB_PREFIX."societe_rib as rib";
@@ -1540,7 +1541,7 @@ class BonPrelevement extends CommonObject
$sql .= " FROM";
$sql .= " ".MAIN_DB_PREFIX."prelevement_lignes as pl,";
$sql .= " ".MAIN_DB_PREFIX."facture_fourn as f,";
- $sql .= " ".MAIN_DB_PREFIX."prelevement_facture as pf,";
+ $sql .= " ".MAIN_DB_PREFIX."prelevement as pf,";
$sql .= " ".MAIN_DB_PREFIX."societe as soc,";
$sql .= " ".MAIN_DB_PREFIX."c_country as c,";
$sql .= " ".MAIN_DB_PREFIX."societe_rib as rib";
@@ -1633,7 +1634,7 @@ class BonPrelevement extends CommonObject
$sql .= " FROM";
$sql .= " ".MAIN_DB_PREFIX."prelevement_lignes as pl,";
$sql .= " ".MAIN_DB_PREFIX."facture as f,";
- $sql .= " ".MAIN_DB_PREFIX."prelevement_facture as pf";
+ $sql .= " ".MAIN_DB_PREFIX."prelevement as pf";
$sql .= " WHERE pl.fk_prelevement_bons = ".((int) $this->id);
$sql .= " AND pl.rowid = pf.fk_prelevement_lignes";
$sql .= " AND pf.fk_facture = f.rowid";
@@ -1659,7 +1660,7 @@ class BonPrelevement extends CommonObject
$sql .= " FROM";
$sql .= " ".MAIN_DB_PREFIX."prelevement_lignes as pl,";
$sql .= " ".MAIN_DB_PREFIX."facture_fourn as f,";
- $sql .= " ".MAIN_DB_PREFIX."prelevement_facture as pf";
+ $sql .= " ".MAIN_DB_PREFIX."prelevement as pf";
$sql .= " WHERE pl.fk_prelevement_bons = ".((int) $this->id);
$sql .= " AND pl.rowid = pf.fk_prelevement_lignes";
$sql .= " AND pf.fk_facture_fourn = f.rowid";
@@ -1690,7 +1691,7 @@ class BonPrelevement extends CommonObject
fclose($this->file);
if (!empty($conf->global->MAIN_UMASK)) {
- @chmod($this->file, octdec($conf->global->MAIN_UMASK));
+ @chmod($this->filename, octdec($conf->global->MAIN_UMASK));
}
return $result;
@@ -1743,8 +1744,8 @@ class BonPrelevement extends CommonObject
// Date d'echeance C1
fputs($this->file, " ");
- fputs($this->file, strftime("%d%m", $this->date_echeance));
- fputs($this->file, substr(strftime("%y", $this->date_echeance), 1));
+ fputs($this->file, dol_print_date($this->date_echeance, "%d%m", 'gmt'));
+ fputs($this->file, substr(dol_print_date($this->date_echeance, "%y", 'gmt'), 1));
// Raison Sociale Destinataire C2
@@ -1969,8 +1970,8 @@ class BonPrelevement extends CommonObject
// Date d'echeance C1
fputs($this->file, " ");
- fputs($this->file, strftime("%d%m", $this->date_echeance));
- fputs($this->file, substr(strftime("%y", $this->date_echeance), 1));
+ fputs($this->file, dol_print_date($this->date_echeance, "%d%m", 'gmt'));
+ fputs($this->file, substr(dol_print_date($this->date_echeance, "%y", 'gmt'), 1));
// Raison Sociale C2
diff --git a/htdocs/compta/prelevement/class/rejetprelevement.class.php b/htdocs/compta/prelevement/class/rejetprelevement.class.php
index f88ff5201f3..27e27fe60bd 100644
--- a/htdocs/compta/prelevement/class/rejetprelevement.class.php
+++ b/htdocs/compta/prelevement/class/rejetprelevement.class.php
@@ -221,7 +221,7 @@ class RejetPrelevement
$userid = 0;
$sql = "SELECT fk_user_demande";
- $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+ $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
$sql .= " WHERE pfd.fk_prelevement_bons = ".((int) $this->bon_id);
$sql .= " AND pfd.fk_facture".($this->type == 'bank-transfer' ? '_fourn' : '').' = '.((int) $fac->id);
@@ -289,7 +289,7 @@ class RejetPrelevement
//Returns all invoices of a withdrawal
$sql = "SELECT f.rowid as facid, pl.amount";
- $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_facture as pf";
+ $sql .= " FROM ".MAIN_DB_PREFIX."prelevement as pf";
if ($this->type == 'bank-transfer') {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."facture_fourn as f ON (pf.fk_facture_fourn = f.rowid)";
} else {
diff --git a/htdocs/compta/prelevement/create.php b/htdocs/compta/prelevement/create.php
index 5d6a58b9215..37a2d74c5e3 100644
--- a/htdocs/compta/prelevement/create.php
+++ b/htdocs/compta/prelevement/create.php
@@ -348,7 +348,7 @@ if ($type == 'bank-transfer') {
$sql .= " FROM ".MAIN_DB_PREFIX."facture as f,";
}
$sql .= " ".MAIN_DB_PREFIX."societe as s,";
-$sql .= " ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+$sql .= " ".MAIN_DB_PREFIX."prelevement_demande as pfd";
$sql .= " WHERE s.rowid = f.fk_soc";
$sql .= " AND f.entity IN (".getEntity('invoice').")";
if (empty($conf->global->WITHDRAWAL_ALLOW_ANY_INVOICE_STATUS)) {
@@ -402,6 +402,9 @@ if ($resql) {
if (!empty($limit)) {
print '
';
}
+ if ($type != '') {
+ print '
';
+ }
$title = $langs->trans("InvoiceWaitingWithdraw");
if ($type == 'bank-transfer') {
diff --git a/htdocs/compta/prelevement/demandes.php b/htdocs/compta/prelevement/demandes.php
index 585c601da56..905c8f36415 100644
--- a/htdocs/compta/prelevement/demandes.php
+++ b/htdocs/compta/prelevement/demandes.php
@@ -137,7 +137,7 @@ if ($type != 'bank-transfer') {
$sql .= " FROM ".MAIN_DB_PREFIX."facture_fourn as f,";
}
$sql .= " ".MAIN_DB_PREFIX."societe as s,";
-$sql .= " ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+$sql .= " ".MAIN_DB_PREFIX."prelevement_demande as pfd";
if (empty($user->rights->societe->client->voir) && !$socid) {
$sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
}
diff --git a/htdocs/compta/prelevement/factures.php b/htdocs/compta/prelevement/factures.php
index d6009631ac2..0ed75b5c3b8 100644
--- a/htdocs/compta/prelevement/factures.php
+++ b/htdocs/compta/prelevement/factures.php
@@ -111,7 +111,7 @@ if ($id > 0 || $ref) {
print '
'.$langs->trans("TransData").' ';
print dol_print_date($object->date_trans, 'day');
- print ' '.$langs->trans("By").' '.$muser->getNomUrl(-1).' ';
+ print '
'.$langs->trans("By").' '.$muser->getNomUrl(-1).'
';
print ''.$langs->trans("TransMetod").' ';
print $object->methodes_trans[$object->method_trans];
print ' ';
@@ -177,7 +177,7 @@ $sql .= " f.rowid as facid, f.ref as ref, f.total_ttc,";
$sql .= " s.rowid as socid, s.nom as name, pl.statut, pl.amount as amount_requested";
$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_bons as p";
$sql .= ", ".MAIN_DB_PREFIX."prelevement_lignes as pl";
-$sql .= ", ".MAIN_DB_PREFIX."prelevement_facture as pf";
+$sql .= ", ".MAIN_DB_PREFIX."prelevement as pf";
if ($object->type != 'bank-transfer') {
$sql .= ", ".MAIN_DB_PREFIX."facture as f";
} else {
diff --git a/htdocs/compta/prelevement/fiche-rejet.php b/htdocs/compta/prelevement/fiche-rejet.php
index 0e59adfc166..de9eb46631c 100644
--- a/htdocs/compta/prelevement/fiche-rejet.php
+++ b/htdocs/compta/prelevement/fiche-rejet.php
@@ -106,7 +106,7 @@ if ($id > 0 || $ref) {
print ''.$langs->trans("TransData").' ';
print dol_print_date($object->date_trans, 'day');
- print ' '.$langs->trans("By").' '.$muser->getNomUrl(-1).' ';
+ print ' '.$langs->trans("By").' '.$muser->getNomUrl(-1).'';
print ''.$langs->trans("TransMetod").' ';
print $object->methodes_trans[$object->method_trans];
print ' ';
diff --git a/htdocs/compta/prelevement/fiche-stat.php b/htdocs/compta/prelevement/fiche-stat.php
index 8d88d761956..3b15676792e 100644
--- a/htdocs/compta/prelevement/fiche-stat.php
+++ b/htdocs/compta/prelevement/fiche-stat.php
@@ -100,7 +100,7 @@ if ($id > 0 || $ref) {
print ''.$langs->trans("TransData").' ';
print dol_print_date($object->date_trans, 'day');
- print ' '.$langs->trans("By").' '.$muser->getNomUrl(-1).' ';
+ print ' '.$langs->trans("By").' '.$muser->getNomUrl(-1).'';
print ''.$langs->trans("TransMetod").' ';
print $object->methodes_trans[$object->method_trans];
print ' ';
@@ -135,7 +135,7 @@ if ($id > 0 || $ref) {
print '';
print '';
- print '';
+ print ' ';
$labelfororderfield = 'WithdrawalFile';
if ($object->type == 'bank-transfer') {
$labelfororderfield = 'CreditTransferFile';
diff --git a/htdocs/compta/prelevement/index.php b/htdocs/compta/prelevement/index.php
index 830bd101d0a..d71314a08e2 100644
--- a/htdocs/compta/prelevement/index.php
+++ b/htdocs/compta/prelevement/index.php
@@ -109,7 +109,7 @@ $sql .= " ".MAIN_DB_PREFIX."societe as s";
if (empty($user->rights->societe->client->voir) && !$socid) {
$sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
}
-$sql .= " , ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+$sql .= " , ".MAIN_DB_PREFIX."prelevement_demande as pfd";
$sql .= " WHERE s.rowid = f.fk_soc";
$sql .= " AND f.entity IN (".getEntity('invoice').")";
$sql .= " AND f.total_ttc > 0";
diff --git a/htdocs/compta/prelevement/line.php b/htdocs/compta/prelevement/line.php
index 1fccef050d1..186546b74a9 100644
--- a/htdocs/compta/prelevement/line.php
+++ b/htdocs/compta/prelevement/line.php
@@ -262,7 +262,7 @@ if ($id) {
$sql .= " , s.rowid as socid, s.nom as name";
$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_bons as p";
$sql .= " , ".MAIN_DB_PREFIX."prelevement_lignes as pl";
- $sql .= " , ".MAIN_DB_PREFIX."prelevement_facture as pf";
+ $sql .= " , ".MAIN_DB_PREFIX."prelevement as pf";
if ($type == 'bank-transfer') {
$sql .= " , ".MAIN_DB_PREFIX."facture_fourn as f";
} else {
diff --git a/htdocs/compta/prelevement/list.php b/htdocs/compta/prelevement/list.php
index b84bc7f3d2d..4690fd3bbb2 100644
--- a/htdocs/compta/prelevement/list.php
+++ b/htdocs/compta/prelevement/list.php
@@ -114,7 +114,7 @@ $sql .= " , s.rowid as socid, s.nom as name, s.code_client, s.code_fournisseur,
$sql .= " , pl.amount, pl.statut as statut_ligne, pl.rowid as rowid_ligne";
$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_bons as p";
$sql .= " , ".MAIN_DB_PREFIX."prelevement_lignes as pl";
-$sql .= " , ".MAIN_DB_PREFIX."prelevement_facture as pf";
+$sql .= " , ".MAIN_DB_PREFIX."prelevement as pf";
if ($type == 'bank-transfer') {
$sql .= " , ".MAIN_DB_PREFIX."facture_fourn as f";
} else {
@@ -192,6 +192,9 @@ if ($result) {
print ' ';
print ' ';
print ' ';
+ if ($type != '') {
+ print ' ';
+ }
$title = $langs->trans("WithdrawalsLines");
if ($type == 'bank-transfer') {
diff --git a/htdocs/compta/prelevement/orders_list.php b/htdocs/compta/prelevement/orders_list.php
index 4fe9e23a8cd..5aca0730f67 100644
--- a/htdocs/compta/prelevement/orders_list.php
+++ b/htdocs/compta/prelevement/orders_list.php
@@ -161,7 +161,9 @@ if ($result) {
print ' ';
print ' ';
print ' ';
-
+ if ($type != '') {
+ print ' ';
+ }
$titlekey = "WithdrawalsReceipts";
$title = $langs->trans("WithdrawalsReceipts");
if ($type == 'bank-transfer') {
diff --git a/htdocs/compta/resultat/clientfourn.php b/htdocs/compta/resultat/clientfourn.php
index cd2106e50a4..eb76b7a7af7 100644
--- a/htdocs/compta/resultat/clientfourn.php
+++ b/htdocs/compta/resultat/clientfourn.php
@@ -189,6 +189,9 @@ if ($modecompta == "CREANCES-DETTES") {
} else {
$description .= $langs->trans("DepositsAreIncluded");
}
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $description .= $langs->trans("SupplierDepositsAreNotIncluded");
+ }
$builddate = dol_now();
//$exportlink=$langs->trans("NotYetAvailable");
} elseif ($modecompta == "RECETTES-DEPENSES") {
@@ -299,7 +302,7 @@ if ($modecompta == 'BOOKKEEPING') {
if (!empty($date_start) && !empty($date_end)) {
$sql .= " AND f.doc_date >= '".$db->idate($date_start)."' AND f.doc_date <= '".$db->idate($date_end)."'";
}
- $sql .= " GROUP BY pcg_type DESC";
+ $sql .= " GROUP BY pcg_type";
if ($showaccountdetail == 'no') {
$sql .= ", name, socid"; // group by "accounting group" (INCOME/EXPENSE), then "customer".
}
@@ -637,7 +640,7 @@ if ($modecompta == 'BOOKKEEPING') {
$sql .= ", ".MAIN_DB_PREFIX."facture_fourn as f";
$sql .= " WHERE f.fk_soc = s.rowid";
$sql .= " AND f.fk_statut IN (1,2)";
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
$sql .= " AND f.type IN (0,1,2)";
} else {
$sql .= " AND f.type IN (0,1,2,3)";
@@ -1341,7 +1344,7 @@ if ($modecompta == 'BOOKKEEPING') {
$sql = "SELECT date_format(f.datef,'%Y-%m') as dm, sum(f.total_tva) as amount";
$sql .= " FROM ".MAIN_DB_PREFIX."facture_fourn as f";
$sql .= " WHERE f.fk_statut IN (1,2)";
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
$sql .= " AND f.type IN (0,1,2)";
} else {
$sql .= " AND f.type IN (0,1,2,3)";
diff --git a/htdocs/compta/resultat/index.php b/htdocs/compta/resultat/index.php
index 5b2ca11be54..4012994be58 100644
--- a/htdocs/compta/resultat/index.php
+++ b/htdocs/compta/resultat/index.php
@@ -165,6 +165,9 @@ if ($modecompta == 'CREANCES-DETTES') {
} else {
$description .= " ".$langs->trans("DepositsAreIncluded");
}
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $description .= $langs->trans("SupplierDepositsAreNotIncluded");
+ }
$builddate = dol_now();
//$exportlink=$langs->trans("NotYetAvailable");
} elseif ($modecompta == "RECETTES-DEPENSES") {
@@ -330,7 +333,7 @@ if (isModEnabled('facture') && ($modecompta == 'CREANCES-DETTES' || $modecompta
$sql = "SELECT sum(f.total_ht) as amount_ht, sum(f.total_ttc) as amount_ttc, date_format(f.datef,'%Y-%m') as dm";
$sql .= " FROM ".MAIN_DB_PREFIX."facture_fourn as f";
$sql .= " WHERE f.fk_statut IN (1,2)";
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
$sql .= " AND f.type IN (0,1,2)";
} else {
$sql .= " AND f.type IN (0,1,2,3)";
@@ -438,7 +441,7 @@ if (isModEnabled('tax') && ($modecompta == 'CREANCES-DETTES' || $modecompta == "
$sql = "SELECT sum(f.total_tva) as amount, date_format(f.datef,'%Y-%m') as dm";
$sql .= " FROM ".MAIN_DB_PREFIX."facture_fourn as f";
$sql .= " WHERE f.fk_statut IN (1,2)";
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
$sql .= " AND f.type IN (0,1,2)";
} else {
$sql .= " AND f.type IN (0,1,2,3)";
diff --git a/htdocs/compta/resultat/result.php b/htdocs/compta/resultat/result.php
index 9a5a8325448..3f3e14e2d61 100644
--- a/htdocs/compta/resultat/result.php
+++ b/htdocs/compta/resultat/result.php
@@ -59,7 +59,7 @@ $nbofyear = 1;
// Date range
$year = GETPOST('year', 'int');
if (empty($year)) {
- $year_current = strftime("%Y", dol_now());
+ $year_current = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$month_current = strftime("%m", dol_now());
$year_start = $year_current - ($nbofyear - 1);
} else {
@@ -205,6 +205,9 @@ if ($modecompta == "CREANCES-DETTES") {
} else {
$description .= $langs->trans("DepositsAreIncluded");
}
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $description .= $langs->trans("SupplierDepositsAreNotIncluded");
+ }
$builddate = dol_now();
//$exportlink=$langs->trans("NotYetAvailable");
} elseif ($modecompta == "RECETTES-DEPENSES") {
@@ -231,8 +234,6 @@ if ($modecompta == "CREANCES-DETTES") {
$exportlink = '';
$description = $langs->trans("RulesResultBookkeepingPersonalized");
$description .= ' ('.$langs->trans("SeePageForSetup", DOL_URL_ROOT.'/accountancy/admin/categories_list.php?search_country_id='.$mysoc->country_id.'&mainmenu=accountancy&leftmenu=accountancy_admin', $langs->transnoentitiesnoconv("Accountancy").' / '.$langs->transnoentitiesnoconv("Setup").' / '.$langs->transnoentitiesnoconv("AccountingCategory")).')';
- //if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) $description.= $langs->trans("DepositsAreNotIncluded");
- //else $description.= $langs->trans("DepositsAreIncluded");
$builddate = dol_now();
}
diff --git a/htdocs/compta/sociales/note.php b/htdocs/compta/sociales/note.php
index c65b731109d..0f85b6ddf06 100644
--- a/htdocs/compta/sociales/note.php
+++ b/htdocs/compta/sociales/note.php
@@ -102,7 +102,7 @@ if ($id > 0 || !empty($ref)) {
$proj->fetch($object->fk_project);
$morehtmlref .= ' : '.$proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.dol_escape_htmltag($proj->title);
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
} else {
$morehtmlref .= '';
diff --git a/htdocs/compta/sociales/payments.php b/htdocs/compta/sociales/payments.php
index 95130dcf7f6..9956cf5153a 100644
--- a/htdocs/compta/sociales/payments.php
+++ b/htdocs/compta/sociales/payments.php
@@ -270,7 +270,7 @@ while ($i < min($num, $limit)) {
$payment_sc_static->id = $obj->pid;
$payment_sc_static->ref = $obj->pid;
- $payment_sc_static->date = $db->jdate($obj->datep);
+ $payment_sc_static->datep = $db->jdate($obj->datep);
$socialcontrib->id = $obj->rowid;
$socialcontrib->ref = empty($obj->label_sc) ? $obj->type_label : $obj->label_sc;
diff --git a/htdocs/compta/stats/byratecountry.php b/htdocs/compta/stats/byratecountry.php
index f19c37fb84a..fb8ad4de1a5 100644
--- a/htdocs/compta/stats/byratecountry.php
+++ b/htdocs/compta/stats/byratecountry.php
@@ -225,7 +225,9 @@ if ($conf->global->TAX_MODE_SELL_SERVICE == 'payment') {
if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
$description .= ' '.$langs->trans("DepositsAreNotIncluded");
}
-
+if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $description .= $langs->trans("SupplierDepositsAreNotIncluded");
+}
// Customers invoices
$elementcust = $langs->trans("CustomersInvoices");
$productcust = $langs->trans("ProductOrService");
@@ -256,6 +258,9 @@ if ($modecompta == "CREANCES-DETTES") {
} else {
$description .= $langs->trans("DepositsAreIncluded");
}
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $description .= $langs->trans("SupplierDepositsAreNotIncluded");
+ }
$builddate = dol_now();
} elseif ($modecompta == "RECETTES-DEPENSES") {
@@ -406,7 +411,7 @@ if ($modecompta == 'CREANCES-DETTES') {
$sql2 .= " WHERE ff.datef >= '".$db->idate($date_start)."'";
$sql2 .= " AND ff.datef <= '".$db->idate($date_end)."'";
$sql .= " AND ff.fk_statut in (1,2)";
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
$sql .= " AND ff.type IN (0,1,2,5)";
} else {
$sql .= " AND ff.type IN (0,1,2,3,5)";
diff --git a/htdocs/compta/stats/cabyprodserv.php b/htdocs/compta/stats/cabyprodserv.php
index 80a0a47538d..dc0fa94030c 100644
--- a/htdocs/compta/stats/cabyprodserv.php
+++ b/htdocs/compta/stats/cabyprodserv.php
@@ -247,7 +247,6 @@ if ($modecompta == "CREANCES-DETTES") {
} else {
$description .= $langs->trans("DepositsAreIncluded");
}
-
$builddate = dol_now();
} elseif ($modecompta == "RECETTES-DEPENSES") {
$name = $langs->trans("TurnoverCollected").', '.$langs->trans("ByProductsAndServices");
diff --git a/htdocs/compta/stats/index.php b/htdocs/compta/stats/index.php
index 8e20f5b0afd..4d65c201ffd 100644
--- a/htdocs/compta/stats/index.php
+++ b/htdocs/compta/stats/index.php
@@ -371,7 +371,7 @@ print ' ';
$now_show_delta = 0;
$minyear = substr($minyearmonth, 0, 4);
$maxyear = substr($maxyearmonth, 0, 4);
-$nowyear = strftime("%Y", dol_now());
+$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$nowyearmonth = strftime("%Y-%m", dol_now());
$maxyearmonth = max($maxyearmonth, $nowyearmonth);
$now = dol_now();
diff --git a/htdocs/compta/stats/supplier_turnover.php b/htdocs/compta/stats/supplier_turnover.php
index 53446163183..88e04e89303 100644
--- a/htdocs/compta/stats/supplier_turnover.php
+++ b/htdocs/compta/stats/supplier_turnover.php
@@ -310,7 +310,7 @@ print '';
$now_show_delta = 0;
$minyear = substr($minyearmonth, 0, 4);
$maxyear = substr($maxyearmonth, 0, 4);
-$nowyear = strftime("%Y", dol_now());
+$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$nowyearmonth = strftime("%Y-%m", dol_now());
$maxyearmonth = max($maxyearmonth, $nowyearmonth);
$now = dol_now();
diff --git a/htdocs/compta/tva/card.php b/htdocs/compta/tva/card.php
index ae2ddac9da0..e7c7678b818 100644
--- a/htdocs/compta/tva/card.php
+++ b/htdocs/compta/tva/card.php
@@ -75,17 +75,6 @@ $hookmanager->initHooks(array('taxvatcard', 'globalcard'));
// Fetch optionals attributes and labels
$extrafields->fetch_name_optionals_label($object->table_element);
-$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
-
-// Initialize array of search criterias
-$search_all = GETPOST("search_all", 'alpha');
-$search = array();
-foreach ($object->fields as $key => $val) {
- if (GETPOST('search_'.$key, 'alpha')) {
- $search[$key] = GETPOST('search_'.$key, 'alpha');
- }
-}
-
if (empty($action) && empty($id) && empty($ref)) {
$action = 'view';
}
diff --git a/htdocs/compta/tva/clients.php b/htdocs/compta/tva/clients.php
index aa639804ba0..d0ed3032684 100644
--- a/htdocs/compta/tva/clients.php
+++ b/htdocs/compta/tva/clients.php
@@ -154,6 +154,9 @@ if ($conf->global->TAX_MODE_SELL_SERVICE == 'payment') {
if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
$description .= ' '.$langs->trans("DepositsAreNotIncluded");
}
+if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $description .= $langs->trans("SupplierDepositsAreNotIncluded");
+}
if (!empty($conf->global->MAIN_MODULE_ACCOUNTING)) {
$description .= ' '.$langs->trans("ThisIsAnEstimatedValue");
}
diff --git a/htdocs/compta/tva/index.php b/htdocs/compta/tva/index.php
index 16b24361160..f0efe305d8c 100644
--- a/htdocs/compta/tva/index.php
+++ b/htdocs/compta/tva/index.php
@@ -211,6 +211,9 @@ if ($conf->global->TAX_MODE_SELL_SERVICE == 'payment') {
if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
$description .= ' '.$langs->trans("DepositsAreNotIncluded");
}
+if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $description .= $langs->trans("SupplierDepositsAreNotIncluded");
+}
if (!empty($conf->global->MAIN_MODULE_ACCOUNTING)) {
$description .= ' '.$langs->trans("ThisIsAnEstimatedValue");
}
diff --git a/htdocs/compta/tva/quadri_detail.php b/htdocs/compta/tva/quadri_detail.php
index 18b3c9c6b86..997c90e083c 100644
--- a/htdocs/compta/tva/quadri_detail.php
+++ b/htdocs/compta/tva/quadri_detail.php
@@ -164,6 +164,9 @@ if ($conf->global->TAX_MODE_SELL_SERVICE == 'payment') {
if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
$description .= ' '.$langs->trans("DepositsAreNotIncluded");
}
+if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $description .= $langs->trans("SupplierDepositsAreNotIncluded");
+}
if (!empty($conf->global->MAIN_MODULE_ACCOUNTING)) {
$description .= ' '.$langs->trans("ThisIsAnEstimatedValue");
}
diff --git a/htdocs/conf/conf.php.example b/htdocs/conf/conf.php.example
index 05c29459ee2..1cc028ff137 100644
--- a/htdocs/conf/conf.php.example
+++ b/htdocs/conf/conf.php.example
@@ -409,7 +409,6 @@ $dolibarr_cron_allow_cli='0';
//#################################
// Value to overwrite path to use shared libraries instead of embedded one
-//$dolibarr_lib_ADODB_PATH='/usr/share/php/adodb';
//$dolibarr_lib_TCPDF_PATH='/usr/share/php/tcpdf';
//$dolibarr_lib_FPDI_PATH='/usr/share/php/fpdi';
//$dolibarr_lib_FPDF_PATH='/usr/share/php/fpdf';
diff --git a/htdocs/contact/card.php b/htdocs/contact/card.php
index 11aebc8fc29..8e9c6f2a321 100644
--- a/htdocs/contact/card.php
+++ b/htdocs/contact/card.php
@@ -1473,39 +1473,38 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
// Categories
if (isModEnabled('categorie') && !empty($user->rights->categorie->lire)) {
print ''.$langs->trans("Categories").' ';
- print '';
+ print ' ';
print $form->showCategories($object->id, Categorie::TYPE_CONTACT, 1);
print ' ';
}
if (!empty($object->socid)) {
print ''.$langs->trans("ContactByDefaultFor").' ';
- print '';
+ print ' ';
print $formcompany->showRoles("roles", $object, 'view', $object->roles);
print ' ';
}
// Other attributes
- $cols = 3;
$parameters = array('socid'=>$socid);
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
$object->load_ref_elements();
if (isModEnabled("propal")) {
- print ''.$langs->trans("ContactForProposals").' ';
+ print ' '.$langs->trans("ContactForProposals").' ';
print $object->ref_propal ? $object->ref_propal : $langs->trans("NoContactForAnyProposal");
print ' ';
}
if (isModEnabled('commande') || isModEnabled("expedition")) {
- print '';
+ print ' ';
if (isModEnabled("expedition")) {
print $langs->trans("ContactForOrdersOrShipments");
} else {
print $langs->trans("ContactForOrders");
}
- print ' ';
+ print ' ';
$none = $langs->trans("NoContactForAnyOrder");
if (isModEnabled("expedition")) {
$none = $langs->trans("NoContactForAnyOrderOrShipments");
@@ -1515,18 +1514,18 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
}
if (isModEnabled('contrat')) {
- print ' '.$langs->trans("ContactForContracts").' ';
+ print ' '.$langs->trans("ContactForContracts").' ';
print $object->ref_contrat ? $object->ref_contrat : $langs->trans("NoContactForAnyContract");
print ' ';
}
if (isModEnabled('facture')) {
- print ''.$langs->trans("ContactForInvoices").' ';
+ print ' '.$langs->trans("ContactForInvoices").' ';
print $object->ref_facturation ? $object->ref_facturation : $langs->trans("NoContactForAnyInvoice");
print ' ';
}
- print ''.$langs->trans("DolibarrLogin").' ';
+ print ' '.$langs->trans("DolibarrLogin").' ';
if ($object->user_id) {
$dolibarr_user = new User($db);
$result = $dolibarr_user->fetch($object->user_id);
@@ -1579,7 +1578,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
// Delete
if ($user->rights->societe->contact->supprimer) {
- print ''.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken().($backtopage ? '&backtopage='.urlencode($backtopage) : ''), 'delete', $user->rights->societe->contact->supprimer);
}
}
diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php
index 638022b855a..d535da76199 100644
--- a/htdocs/contact/class/contact.class.php
+++ b/htdocs/contact/class/contact.class.php
@@ -1228,6 +1228,15 @@ class Contact extends CommonObject
$this->db->begin();
+ if (!$error && !$notrigger) {
+ // Call trigger
+ $result = $this->call_trigger('CONTACT_DELETE', $user);
+ if ($result < 0) {
+ $error++;
+ }
+ // End call triggers
+ }
+
if (!$error) {
// Get all rowid of element_contact linked to a type that is link to llx_socpeople
$sql = "SELECT ec.rowid";
@@ -1318,15 +1327,6 @@ class Contact extends CommonObject
}
}
- if (!$error && !$notrigger) {
- // Call trigger
- $result = $this->call_trigger('CONTACT_DELETE', $user);
- if ($result < 0) {
- $error++;
- }
- // End call triggers
- }
-
if (!$error) {
$this->db->commit();
return 1;
diff --git a/htdocs/contact/consumption.php b/htdocs/contact/consumption.php
index fcab597d43a..bbd5bf005d2 100644
--- a/htdocs/contact/consumption.php
+++ b/htdocs/contact/consumption.php
@@ -520,7 +520,7 @@ if ($sql_select) {
}
$text .= ' - '.(!empty($objp->label) ? $objp->label : $label);
- $description = (!empty($conf->global->PRODUIT_DESC_IN_FORM) ? '' : dol_htmlentitiesbr($objp->description));
+ $description = (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE') ? '' : dol_htmlentitiesbr($objp->description));
}
if (($objp->info_bits & 2) == 2) {
@@ -571,7 +571,7 @@ if ($sql_select) {
echo get_date_range($objp->date_start, $objp->date_end);
// Add description in form
- if (!empty($conf->global->PRODUIT_DESC_IN_FORM)) {
+ if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
print (!empty($objp->description) && $objp->description != $objp->product_label) ? ' '.dol_htmlentitiesbr($objp->description) : '';
}
} else {
@@ -608,7 +608,7 @@ if ($sql_select) {
// Show range
$prodreftxt .= get_date_range($objp->date_start, $objp->date_end);
// Add description in form
- if (!empty($conf->global->PRODUIT_DESC_IN_FORM))
+ if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE'))
{
$prodreftxt .= (!empty($objp->description) && $objp->description!=$objp->product_label)?' '.dol_htmlentitiesbr($objp->description):'';
}
diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php
index d165a0a4cc1..062d041c81a 100644
--- a/htdocs/contact/list.php
+++ b/htdocs/contact/list.php
@@ -399,15 +399,6 @@ if (isset($extrafields->attributes[$object->table_element]['label']) && is_array
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as co ON co.rowid = p.fk_pays";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = p.fk_soc";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_stcommcontact as st ON st.id = p.fk_stcommcontact";
-if (!empty($search_categ) && $search_categ != '-1') {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_contact as cc ON p.rowid = cc.fk_socpeople"; // We need this table joined to the select in order to filter by categ
-}
-if (!empty($search_categ_thirdparty) && $search_categ_thirdparty != '-1') {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_societe as cs ON s.rowid = cs.fk_soc"; // We need this table joined to the select in order to filter by categ
-}
-if (!empty($search_categ_supplier) && $search_categ_supplier != '-1') {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_fournisseur as cs2 ON s.rowid = cs2.fk_soc"; // We need this table joined to the select in order to filter by categ
-}
if (empty($user->rights->societe->client->voir) && !$socid) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON s.rowid = sc.fk_soc";
}
@@ -437,23 +428,95 @@ if ($search_priv != '0' && $search_priv != '1') {
}
}
-if ($search_categ > 0) {
- $sql .= " AND cc.fk_categorie = ".((int) $search_categ);
+$searchCategoryContactList = $search_categ ? array($search_categ) : array();
+$searchCategoryContactOperator = 0;
+// Search for tag/category ($searchCategoryContactList is an array of ID)
+if (!empty($searchCategoryContactList)) {
+ $searchCategoryContactSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategoryContactList as $searchCategoryContact) {
+ if (intval($searchCategoryContact) == -2) {
+ $searchCategoryContactSqlList[] = "NOT EXISTS (SELECT ck.fk_socpeople FROM ".MAIN_DB_PREFIX."categorie_contact as ck WHERE s.rowid = ck.fk_socpeople)";
+ } elseif (intval($searchCategoryContact) > 0) {
+ if ($searchCategoryContactOperator == 0) {
+ $searchCategoryContactSqlList[] = " EXISTS (SELECT ck.fk_socpeople FROM ".MAIN_DB_PREFIX."categorie_contact as ck WHERE s.rowid = ck.fk_socpeople AND ck.fk_categorie = ".((int) $searchCategoryContact).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryContact);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategoryContactSqlList[] = " EXISTS (SELECT ck.fk_socpeople FROM ".MAIN_DB_PREFIX."categorie_contact as ck WHERE s.rowid = ck.fk_socpeople AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategoryContactOperator == 1) {
+ if (!empty($searchCategoryContactSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryContactSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryContactSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryContactSqlList).")";
+ }
+ }
}
-if ($search_categ == -2) {
- $sql .= " AND cc.fk_categorie IS NULL";
+$searchCategoryCustomerList = $search_categ_thirdparty ? array($search_categ_thirdparty) : array();
+$searchCategoryCustomerOperator = 0;
+// Search for tag/category ($searchCategoryCustomerList is an array of ID)
+if (!empty($searchCategoryCustomerList)) {
+ $searchCategoryCustomerSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategoryCustomerList as $searchCategoryCustomer) {
+ if (intval($searchCategoryCustomer) == -2) {
+ $searchCategoryCustomerSqlList[] = "NOT EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as ck WHERE s.rowid = ck.fk_soc)";
+ } elseif (intval($searchCategoryCustomer) > 0) {
+ if ($searchCategoryCustomerOperator == 0) {
+ $searchCategoryCustomerSqlList[] = " EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as ck WHERE s.rowid = ck.fk_soc AND ck.fk_categorie = ".((int) $searchCategoryCustomer).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryCustomer);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategoryCustomerSqlList[] = " EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as ck WHERE s.rowid = ck.fk_soc AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategoryCustomerOperator == 1) {
+ if (!empty($searchCategoryCustomerSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryCustomerSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryCustomerSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryCustomerSqlList).")";
+ }
+ }
}
-if ($search_categ_thirdparty > 0) {
- $sql .= " AND cs.fk_categorie = ".((int) $search_categ_thirdparty);
-}
-if ($search_categ_thirdparty == -2) {
- $sql .= " AND cs.fk_categorie IS NULL";
-}
-if ($search_categ_supplier > 0) {
- $sql .= " AND cs2.fk_categorie = ".((int) $search_categ_supplier);
-}
-if ($search_categ_supplier == -2) {
- $sql .= " AND cs2.fk_categorie IS NULL";
+$searchCategorySupplierList = $search_categ_supplier ? array($search_categ_supplier) : array();
+$searchCategorySupplierOperator = 0;
+// Search for tag/category ($searchCategorySupplierList is an array of ID)
+if (!empty($searchCategorySupplierList)) {
+ $searchCategorySupplierSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategorySupplierList as $searchCategorySupplier) {
+ if (intval($searchCategorySupplier) == -2) {
+ $searchCategorySupplierSqlList[] = "NOT EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_fournisseur as ck WHERE s.rowid = ck.fk_soc)";
+ } elseif (intval($searchCategorySupplier) > 0) {
+ if ($searchCategorySupplierOperator == 0) {
+ $searchCategorySupplierSqlList[] = " EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_fournisseur as ck WHERE s.rowid = ck.fk_soc AND ck.fk_categorie = ".((int) $searchCategorySupplier).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategorySupplier);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategorySupplierSqlList[] = " EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_fournisseur as ck WHERE s.rowid = ck.fk_soc AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategorySupplierOperator == 1) {
+ if (!empty($searchCategorySupplierSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategorySupplierSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategorySupplierSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategorySupplierSqlList).")";
+ }
+ }
}
if ($sall) {
@@ -502,10 +565,19 @@ if (strlen($search_fax)) {
if (isModEnabled('socialnetworks')) {
foreach ($socialnetworks as $key => $value) {
if ($value['active'] && strlen($search_[$key])) {
- $sql .= " AND p.socialnetworks LIKE '%\"".$key."\":\"".$search_[$key]."%'";
+ $searchkeyinjsonformat = preg_replace('/"$/', '', preg_replace('/^"/', '', json_encode($search_[$key])));
+ if (in_array($db->type, array('mysql', 'mysqli'))) {
+ $sql .= " AND p.socialnetworks REGEXP '\"".$db->escape($db->escapeforlike($key))."\":\"[^\"]*".$db->escape($db->escapeforlike($searchkeyinjsonformat))."'";
+ } elseif ($db->type == 'pgsql') {
+ $sql .= " AND p.socialnetworks ~ '\"".$db->escape($db->escapeforlike($key))."\":\"[^\"]*".$db->escape($db->escapeforlike($searchkeyinjsonformat))."'";
+ } else {
+ // Works with all database but not reliable because search only for social network code starting with earched value
+ $sql .= " AND p.socialnetworks LIKE '%\"".$db->escape($db->escapeforlike($key))."\":\"".$db->escape($db->escapeforlike($searchkeyinjsonformat))."%'";
+ }
}
}
}
+//print $sql;
if (strlen($search_email)) {
$sql .= natural_search('p.email', $search_email);
}
@@ -557,6 +629,7 @@ if ($view == "recent") {
} else {
$sql .= $db->order($sortfield, $sortorder);
}
+//print $sql;
// Count total nb of records
$nbtotalofrecords = '';
@@ -938,7 +1011,7 @@ if (!empty($arrayfields['p.tms']['checked'])) {
// Status
if (!empty($arrayfields['p.statut']['checked'])) {
print ' ';
- print $form->selectarray('search_status', array('-1'=>'', '0'=>$langs->trans('ActivityCeased'), '1'=>$langs->trans('InActivity')), $search_status, 0, 0, 0, '', 0, 0, 0, '', 'minwidth75');
+ print $form->selectarray('search_status', array('-1'=>'', '0'=>$langs->trans('ActivityCeased'), '1'=>$langs->trans('InActivity')), $search_status, 0, 0, 0, '', 0, 0, 0, '', 'minwidth75 onrightofpage');
print ' ';
}
if (!empty($arrayfields['p.import_key']['checked'])) {
@@ -1222,7 +1295,7 @@ while ($i < min($num, $limit)) {
if (isModEnabled('socialnetworks')) {
foreach ($socialnetworks as $key => $value) {
if ($value['active'] && !empty($arrayfields['p.'.$key]['checked'])) {
- print ''.dol_print_socialnetworks($arraysocialnetworks[$key], $obj->rowid, $obj->socid, $key, $socialnetworks).' ';
+ print ''.(empty($arraysocialnetworks[$key]) ? '' : dol_print_socialnetworks($arraysocialnetworks[$key], $obj->rowid, $obj->socid, $key, $socialnetworks)).' ';
if (!$i) {
$totalarray['nbfield']++;
}
diff --git a/htdocs/contrat/agenda.php b/htdocs/contrat/agenda.php
index d46f2cb24a7..3a3c5440b30 100644
--- a/htdocs/contrat/agenda.php
+++ b/htdocs/contrat/agenda.php
@@ -76,6 +76,8 @@ if (!$sortorder) {
// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
$hookmanager->initHooks(array('agendacontract', 'globalcard'));
+$permissiontoadd = $user->rights->contrat->creer; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
+
/*
* Actions
@@ -166,40 +168,28 @@ if ($id > 0) {
$morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $permtoedit, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $permtoedit, 'string', '', null, null, '', 1, 'getFormatedSupplierRef');
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1);
if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
$morehtmlref .= ' ('.$langs->trans("OtherContracts").' )';
}
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->contrat->creer) {
+ $morehtmlref .= ' ';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->thirdparty->id, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->thirdparty->id, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php
index 0d03a1f2d78..b691524ad92 100644
--- a/htdocs/contrat/card.php
+++ b/htdocs/contrat/card.php
@@ -97,7 +97,9 @@ $extralabelslines = $extrafields->fetch_name_optionals_label($object->table_elem
$permissionnote = $user->rights->contrat->creer; // Used by the include of actions_setnotes.inc.php
$permissiondellink = $user->rights->contrat->creer; // Used by the include of actions_dellink.inc.php
-
+$permissiontodelete = ($user->rights->contrat->creer && $object->statut == $object::STATUS_DRAFT) || $user->rights->contrat->supprimer;
+$permissiontoadd = $user->rights->contrat->creer; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
+$permissiontoedit = $permissiontoadd;
$error = 0;
@@ -138,6 +140,8 @@ if (empty($reshook)) {
include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php'; // Must be include, not include_once
+ include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php'; // Must be include, not include_once
+
if ($action == 'confirm_active' && $confirm == 'yes' && $user->rights->contrat->activer) {
$result = $object->active_line($user, GETPOST('ligne', 'int'), GETPOST('date'), GETPOST('dateend'), GETPOST('comment'));
@@ -350,7 +354,8 @@ if (empty($reshook)) {
$lines[$i]->fk_fournprice,
$lines[$i]->pa_ht,
$array_options,
- $lines[$i]->fk_unit
+ $lines[$i]->fk_unit,
+ $num+1
);
if ($result < 0) {
@@ -402,6 +407,8 @@ if (empty($reshook)) {
$price_ttc = '';
$price_ttc_devise = '';
+ $rang = count($object->lines) + 1;
+
if (GETPOST('price_ht') !== '') {
$price_ht = price2num(GETPOST('price_ht'), 'MU', 2);
}
@@ -498,7 +505,7 @@ if (empty($reshook)) {
$filter = array('t.fk_product' => $prod->id, 't.fk_soc' => $object->thirdparty->id);
- $result = $prodcustprice->fetch_all('', '', 0, 0, $filter);
+ $result = $prodcustprice->fetchAll('', '', 0, 0, $filter);
if ($result) {
if (count($prodcustprice->lines) > 0) {
$pu_ht = price($prodcustprice->lines[0]->price);
@@ -609,7 +616,8 @@ if (empty($reshook)) {
$fk_fournprice,
$pa_ht,
$array_options,
- $fk_unit
+ $fk_unit,
+ $rang
);
}
@@ -686,16 +694,18 @@ if (empty($reshook)) {
$error++;
}
$objectline->fetch_optionals();
+
+ $objectline->oldcopy = dol_clone($objectline);
}
$db->begin();
if (!$error) {
if ($date_start_real_update == '') {
- $date_start_real_update = $objectline->date_ouverture;
+ $date_start_real_update = $objectline->date_start_real;
}
if ($date_end_real_update == '') {
- $date_end_real_update = $objectline->date_cloture;
+ $date_end_real_update = $objectline->date_end_real;
}
$vat_rate = GETPOST('eltva_tx');
@@ -739,13 +749,14 @@ if (empty($reshook)) {
$objectline->vat_src_code = $vat_src_code;
$objectline->localtax1_tx = is_numeric($localtax1_tx) ? $localtax1_tx : 0;
$objectline->localtax2_tx = is_numeric($localtax2_tx) ? $localtax2_tx : 0;
- $objectline->date_ouverture_prevue = $date_start_update;
- $objectline->date_ouverture = $date_start_real_update;
- $objectline->date_fin_validite = $date_end_update;
- $objectline->date_cloture = $date_end_real_update;
+ $objectline->date_start = $date_start_update;
+ $objectline->date_start_real = $date_start_real_update;
+ $objectline->date_end = $date_end_update;
+ $objectline->date_end_real = $date_end_real_update;
$objectline->fk_user_cloture = $user->id;
$objectline->fk_fournprice = $fk_fournprice;
$objectline->pa_ht = $pa_ht;
+ $objectline->rang = $objectline->rang;
if ($fk_unit > 0) {
$objectline->fk_unit = GETPOST('unit');
@@ -968,7 +979,6 @@ if (empty($reshook)) {
// Actions to build doc
$upload_dir = $conf->contrat->multidir_output[$object->entity];
- $permissiontoadd = $user->rights->contrat->creer;
include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
// Actions to send emails
@@ -1363,39 +1373,28 @@ if ($action == 'create') {
$morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->contrat->creer, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->contrat->creer, 'string', '', null, null, '', 1, 'getFormatedSupplierRef');
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1);
if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
$morehtmlref .= ' ('.$langs->trans("OtherContracts").' )';
}
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->contrat->creer) {
+ $morehtmlref .= ' ';
+ if ($permissiontoadd) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->thirdparty->id, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->thirdparty->id, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
@@ -1476,13 +1475,15 @@ if ($action == 'create') {
$productstatic = new Product($db);
$usemargins = 0;
- if (!empty($conf->margin->enabled) && !empty($object->element) && in_array($object->element, array('facture', 'propal', 'commande'))) {
+ if (isModEnabled('margin') && !empty($object->element) && in_array($object->element, array('facture', 'propal', 'commande'))) {
$usemargins = 1;
}
// Title line for service
$cursorline = 1;
- print '';
+
+
+ print '
';
while ($cursorline <= $nbofservices) {
print '
';
print '
';
@@ -1497,11 +1498,12 @@ if ($action == 'create') {
$sql = "SELECT cd.rowid, cd.statut, cd.label as label_det, cd.fk_product, cd.product_type, cd.description, cd.price_ht, cd.qty,";
$sql .= " cd.tva_tx, cd.vat_src_code, cd.remise_percent, cd.info_bits, cd.subprice, cd.multicurrency_subprice,";
- $sql .= " cd.date_ouverture_prevue as date_debut, cd.date_ouverture as date_debut_reelle,";
- $sql .= " cd.date_fin_validite as date_fin, cd.date_cloture as date_fin_reelle,";
+ $sql .= " cd.date_ouverture_prevue as date_start, cd.date_ouverture as date_start_real,";
+ $sql .= " cd.date_fin_validite as date_end, cd.date_cloture as date_end_real,";
$sql .= " cd.commentaire as comment, cd.fk_product_fournisseur_price as fk_fournprice, cd.buy_price_ht as pa_ht,";
$sql .= " cd.fk_unit,";
$sql .= " p.rowid as pid, p.ref as pref, p.label as plabel, p.fk_product_type as ptype, p.entity as pentity, p.tosell, p.tobuy, p.tobatch";
+ $sql .= " ,cd.rang";
$sql .= " FROM ".MAIN_DB_PREFIX."contratdet as cd";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON cd.fk_product = p.rowid";
$sql .= " WHERE cd.rowid = ".((int) $object->lines[$cursorline - 1]->id);
@@ -1510,6 +1512,8 @@ if ($action == 'create') {
if ($result) {
$total = 0;
+ $objp = $db->fetch_object($result);
+
print '';
print ''.$langs->trans("ServiceNb", $cursorline).' ';
print ''.$langs->trans("VAT").' ';
@@ -1522,13 +1526,31 @@ if ($action == 'create') {
print ''.$langs->trans("Unit").' ';
}
print ''.$langs->trans("ReductionShort").' ';
- if (!empty($conf->margin->enabled) && !empty($conf->global->MARGIN_SHOW_ON_CONTRACT)) {
+ if (isModEnabled('margin') && !empty($conf->global->MARGIN_SHOW_ON_CONTRACT)) {
print ''.$langs->trans("BuyingPrice").' ';
}
- print ' ';
+ //
+
+ if ($nbofservices > 1 && $conf->browser->layout != 'phone' && !empty($user->rights->contrat->creer)) {
+ print '';
+ if ($cursorline > 1) {
+ print 'id.'&action=up&token='.newToken().'&rowid='.$objp->rowid.'">';
+ echo img_up('default', 0, 'imgupforline');
+ print ' ';
+ }
+ if ($cursorline < $nbofservices) {
+ print 'id.'&action=down&token='.newToken().'&rowid='.$objp->rowid.'">';
+ echo img_down('default', 0, 'imgdownforline');
+ print ' ';
+ }
+ print ' ';
+ } else {
+ print ' ';
+ }
+
print " \n";
- $objp = $db->fetch_object($result);
+
// Line in view mode
if ($action != 'editline' || GETPOST('rowid') != $objp->rowid) {
@@ -1557,7 +1579,7 @@ if ($action == 'create') {
$description = $objp->description;
// Add description in form
- if (!empty($conf->global->PRODUIT_DESC_IN_FORM)) {
+ if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
$text .= (!empty($objp->description) && $objp->description != $objp->plabel) ? ' '.dol_htmlentitiesbr($objp->description) : '';
$description = ''; // Already added into main visible desc
}
@@ -1592,7 +1614,7 @@ if ($action == 'create') {
}
// Margin
- if (!empty($conf->margin->enabled) && !empty($conf->global->MARGIN_SHOW_ON_CONTRACT)) {
+ if (isModEnabled('margin') && !empty($conf->global->MARGIN_SHOW_ON_CONTRACT)) {
print ''.price($objp->pa_ht).' ';
}
@@ -1633,10 +1655,10 @@ if ($action == 'create') {
// Date planned
print $langs->trans("DateStartPlanned").': ';
- if ($objp->date_debut) {
- print dol_print_date($db->jdate($objp->date_debut), 'day');
+ if ($objp->date_start) {
+ print dol_print_date($db->jdate($objp->date_start), 'day');
// Warning si date prevu passee et pas en service
- if ($objp->statut == 0 && $db->jdate($objp->date_debut) < ($now - $conf->contrat->services->inactifs->warning_delay)) {
+ if ($objp->statut == 0 && $db->jdate($objp->date_start) < ($now - $conf->contrat->services->inactifs->warning_delay)) {
$warning_delay = $conf->contrat->services->inactifs->warning_delay / 3600 / 24;
$textlate = $langs->trans("Late").' = '.$langs->trans("DateReference").' > '.$langs->trans("DateToday").' '.(ceil($warning_delay) >= 0 ? '+' : '').ceil($warning_delay).' '.$langs->trans("days");
print " ".img_warning($textlate);
@@ -1646,9 +1668,9 @@ if ($action == 'create') {
}
print ' - ';
print $langs->trans("DateEndPlanned").': ';
- if ($objp->date_fin) {
- print dol_print_date($db->jdate($objp->date_fin), 'day');
- if ($objp->statut == 4 && $db->jdate($objp->date_fin) < ($now - $conf->contrat->services->expires->warning_delay)) {
+ if ($objp->date_end) {
+ print dol_print_date($db->jdate($objp->date_end), 'day');
+ if ($objp->statut == 4 && $db->jdate($objp->date_end) < ($now - $conf->contrat->services->expires->warning_delay)) {
$warning_delay = $conf->contrat->services->expires->warning_delay / 3600 / 24;
$textlate = $langs->trans("Late").' = '.$langs->trans("DateReference").' > '.$langs->trans("DateToday").' '.(ceil($warning_delay) >= 0 ? '+' : '').ceil($warning_delay).' '.$langs->trans("days");
print " ".img_warning($textlate);
@@ -1749,7 +1771,7 @@ if ($action == 'create') {
print ' ';
$colspan = 6;
- if (!empty($conf->margin->enabled) && !empty($conf->global->MARGIN_SHOW_ON_CONTRACT)) {
+ if (isModEnabled('margin') && !empty($conf->global->MARGIN_SHOW_ON_CONTRACT)) {
$colspan++;
}
if (!empty($conf->global->PRODUCT_USE_UNITS)) {
@@ -1760,9 +1782,9 @@ if ($action == 'create') {
print '';
print '';
print $langs->trans("DateStartPlanned").' ';
- print $form->selectDate($db->jdate($objp->date_debut), "date_start_update", $usehm, $usehm, ($db->jdate($objp->date_debut) > 0 ? 0 : 1), "update");
+ print $form->selectDate($db->jdate($objp->date_start), "date_start_update", $usehm, $usehm, ($db->jdate($objp->date_start) > 0 ? 0 : 1), "update");
print ' '.$langs->trans("DateEndPlanned").' ';
- print $form->selectDate($db->jdate($objp->date_fin), "date_end_update", $usehm, $usehm, ($db->jdate($objp->date_fin) > 0 ? 0 : 1), "update");
+ print $form->selectDate($db->jdate($objp->date_end), "date_end_update", $usehm, $usehm, ($db->jdate($objp->date_end) > 0 ? 0 : 1), "update");
print ' ';
print ' ';
@@ -1882,26 +1904,26 @@ if ($action == 'create') {
print '';
// Si pas encore active
- if (!$objp->date_debut_reelle) {
+ if (!$objp->date_start_real) {
print $langs->trans("DateStartReal").': ';
- if ($objp->date_debut_reelle) {
- print dol_print_date($db->jdate($objp->date_debut_reelle), 'day');
+ if ($objp->date_start_real) {
+ print dol_print_date($db->jdate($objp->date_start_real), 'day');
} else {
print $langs->trans("ContractStatusNotRunning");
}
}
// Si active et en cours
- if ($objp->date_debut_reelle && !$objp->date_fin_reelle) {
+ if ($objp->date_start_real && !$objp->date_end_real) {
print $langs->trans("DateStartReal").': ';
- print dol_print_date($db->jdate($objp->date_debut_reelle), 'day');
+ print dol_print_date($db->jdate($objp->date_start_real), 'day');
}
// Si desactive
- if ($objp->date_debut_reelle && $objp->date_fin_reelle) {
+ if ($objp->date_start_real && $objp->date_end_real) {
print $langs->trans("DateStartReal").': ';
- print dol_print_date($db->jdate($objp->date_debut_reelle), 'day');
+ print dol_print_date($db->jdate($objp->date_start_real), 'day');
print ' - ';
print $langs->trans("DateEndReal").': ';
- print dol_print_date($db->jdate($objp->date_fin_reelle), 'day');
+ print dol_print_date($db->jdate($objp->date_end_real), 'day');
}
if (!empty($objp->comment)) {
print " - ".$objp->comment;
@@ -1922,14 +1944,14 @@ if ($action == 'create') {
print '';
// Definie date debut et fin par defaut
- $dateactstart = $objp->date_debut;
+ $dateactstart = $objp->date_start;
if (GETPOST('remonth')) {
$dateactstart = dol_mktime(12, 0, 0, GETPOST('remonth'), GETPOST('reday'), GETPOST('reyear'));
} elseif (!$dateactstart) {
$dateactstart = time();
}
- $dateactend = $objp->date_fin;
+ $dateactend = $objp->date_end;
if (GETPOST('endmonth')) {
$dateactend = dol_mktime(12, 0, 0, GETPOST('endmonth'), GETPOST('endday'), GETPOST('endyear'));
} elseif (!$dateactend) {
@@ -1978,14 +2000,14 @@ if ($action == 'create') {
print '';
// Definie date debut et fin par defaut
- $dateactstart = $objp->date_debut_reelle;
+ $dateactstart = $objp->date_start_real;
if (GETPOST('remonth')) {
$dateactstart = dol_mktime(12, 0, 0, GETPOST('remonth'), GETPOST('reday'), GETPOST('reyear'));
} elseif (!$dateactstart) {
$dateactstart = time();
}
- $dateactend = $objp->date_fin_reelle;
+ $dateactend = $objp->date_end_real;
if (GETPOST('endmonth')) {
$dateactend = dol_mktime(12, 0, 0, GETPOST('endmonth'), GETPOST('endday'), GETPOST('endyear'));
} elseif (!$dateactend) {
@@ -2004,7 +2026,7 @@ if ($action == 'create') {
if ($objp->statut >= 4) {
if ($objp->statut == 4) {
print $langs->trans("DateEndReal").' ';
- print $form->selectDate($dateactend, "end", $usehm, $usehm, ($objp->date_fin_reelle > 0 ? 0 : 1), "closeline", 1, 1);
+ print $form->selectDate($dateactend, "end", $usehm, $usehm, ($objp->date_end_real > 0 ? 0 : 1), "closeline", 1, 1);
}
}
print '';
@@ -2172,15 +2194,8 @@ if ($action == 'create') {
print dolGetButtonAction($langs->trans('ToClone'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&socid='.$object->socid.'&action=clone&token='.newToken(), '', true, $params);
}
- // On peut supprimer entite si
- // - Droit de creer + mode brouillon (erreur creation)
- // - Droit de supprimer
- if (($user->rights->contrat->creer && $object->statut == $object::STATUS_DRAFT) || $user->rights->contrat->supprimer) {
- print dolGetButtonAction($langs->trans('Delete'), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), '', true, $params);
- } else {
- $params['attr']['title'] = $langs->trans("NotAllowed");
- print dolGetButtonAction($langs->trans('Delete'), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), '', false, $params);
- }
+ // Delete
+ print dolGetButtonAction($langs->trans('Delete'), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), '', $permissiontodelete, $params);
}
print "";
@@ -2206,12 +2221,21 @@ if ($action == 'create') {
$linktoelem = $form->showLinkToObjectBlock($object, null, array('contrat'));
$somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
+ // Show online signature link
+ if ($object->statut != Contrat::STATUS_DRAFT && $conf->global->CONTRACT_ALLOW_ONLINESIGN) {
+ print ' ';
+ require_once DOL_DOCUMENT_ROOT.'/core/lib/signature.lib.php';
+
+ print showOnlineSignatureUrl('contract', $object->ref).' ';
+ }
+
print '';
$MAXEVENT = 10;
$morehtmlcenter = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', DOL_URL_ROOT.'/contrat/agenda.php?id='.$object->id);
+
// List of actions on element
include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
$formactions = new FormActions($db);
@@ -2237,7 +2261,7 @@ $db->close();
?>
margin->enabled) && $action == 'editline') {
+if (isModEnabled('margin') && $action == 'editline') {
// TODO Why this ? To manage margin on contracts ?
?>
';
- $out .= '
'.img_picto($langs->trans($text_off), 'switch_off').' ';
- $out .= '
'.img_picto($langs->trans($text_on), 'switch_on').' ';
+ $out .= '
'.img_picto($langs->trans($text_off), 'switch_off').' ';
+ $out .= '
'.img_picto($langs->trans($text_on), 'switch_on').' ';
return $out;
}
diff --git a/htdocs/core/lib/bank.lib.php b/htdocs/core/lib/bank.lib.php
index 1792de89a60..736b200bea3 100644
--- a/htdocs/core/lib/bank.lib.php
+++ b/htdocs/core/lib/bank.lib.php
@@ -131,7 +131,12 @@ function bank_prepare_head(Account $object)
*/
function bank_admin_prepare_head($object)
{
- global $langs, $conf, $user;
+ global $langs, $conf, $user, $db;
+
+ $extrafields = new ExtraFields($db);
+ $extrafields->fetch_name_optionals_label('bank_account');
+ $extrafields->fetch_name_optionals_label('bank');
+
$h = 0;
$head = array();
@@ -153,12 +158,20 @@ function bank_admin_prepare_head($object)
complete_head_from_modules($conf, $langs, $object, $head, $h, 'bank_admin');
$head[$h][0] = DOL_URL_ROOT.'/admin/bank_extrafields.php';
- $head[$h][1] = $langs->trans("ExtraFields");
+ $head[$h][1] = $langs->trans("ExtraFields").' ('.$langs->trans("BankAccounts").')';
+ $nbExtrafields = $extrafields->attributes['bank_account']['count'];
+ if ($nbExtrafields > 0) {
+ $head[$h][1] .= '
'.$nbExtrafields.' ';
+ }
$head[$h][2] = 'attributes';
$h++;
$head[$h][0] = DOL_URL_ROOT.'/admin/bankline_extrafields.php';
- $head[$h][1] = $langs->trans("BanklineExtraFields");
+ $head[$h][1] = $langs->trans("ExtraFields").' ('.$langs->trans("BankTransactions").')';
+ $nbExtrafields = $extrafields->attributes['bank']['count'];
+ if ($nbExtrafields > 0) {
+ $head[$h][1] .= '
'.$nbExtrafields.' ';
+ }
$head[$h][2] = 'bankline_extrafields';
$h++;
diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php
index 99b7a75f459..3d0cb72e7c9 100644
--- a/htdocs/core/lib/company.lib.php
+++ b/htdocs/core/lib/company.lib.php
@@ -267,9 +267,23 @@ function societe_prepare_head(Societe $object)
if (!empty($user->rights->partnership->read)) {
$langs->load("partnership");
$nbPartnership = is_array($object->partnerships) ? count($object->partnerships) : 0;
- $head[$h][0] = DOL_URL_ROOT.'/societe/partnership.php?socid='.$object->id;
- $head[$h][1] = $langs->trans("Partnership");
- $head[$h][2] = 'partnership';
+ $head[$h][0] = DOL_URL_ROOT.'/partnership/partnership_list.php?socid='.$object->id;
+ $head[$h][1] = $langs->trans("Partnerships");
+ $nbNote = 0;
+ $sql = "SELECT COUNT(n.rowid) as nb";
+ $sql .= " FROM ".MAIN_DB_PREFIX."partnership as n";
+ $sql .= " WHERE fk_soc = ".((int) $object->id);
+ $resql = $db->query($sql);
+ if ($resql) {
+ $obj = $db->fetch_object($resql);
+ $nbNote = $obj->nb;
+ } else {
+ dol_print_error($db);
+ }
+ if ($nbNote > 0) {
+ $head[$h][1] .= '
'.$nbNote.' ';
+ }
+ $head[$h][2] = 'partnerships';
if ($nbPartnership > 0) {
$head[$h][1] .= '
'.$nbPartnership.' ';
}
@@ -438,7 +452,11 @@ function societe_prepare_head2($object)
*/
function societe_admin_prepare_head()
{
- global $langs, $conf, $user;
+ global $langs, $conf, $user, $db;
+
+ $extrafields = new ExtraFields($db);
+ $extrafields->fetch_name_optionals_label('societe');
+ $extrafields->fetch_name_optionals_label('socpeople');
$h = 0;
$head = array();
@@ -456,11 +474,19 @@ function societe_admin_prepare_head()
$head[$h][0] = DOL_URL_ROOT.'/societe/admin/societe_extrafields.php';
$head[$h][1] = $langs->trans("ExtraFieldsThirdParties");
+ $nbExtrafields = $extrafields->attributes['societe']['count'];
+ if ($nbExtrafields > 0) {
+ $head[$h][1] .= '
'.$nbExtrafields.' ';
+ }
$head[$h][2] = 'attributes';
$h++;
$head[$h][0] = DOL_URL_ROOT.'/societe/admin/contact_extrafields.php';
$head[$h][1] = $langs->trans("ExtraFieldsContacts");
+ $nbExtrafields = $extrafields->attributes['socpeople']['count'];
+ if ($nbExtrafields > 0) {
+ $head[$h][1] .= '
'.$nbExtrafields.' ';
+ }
$head[$h][2] = 'attributes_contacts';
$h++;
@@ -927,6 +953,7 @@ function show_contacts($conf, $langs, $db, $object, $backtopage = '', $showuserl
$search_name = GETPOST("search_name", 'alpha');
$search_address = GETPOST("search_address", 'alpha');
$search_poste = GETPOST("search_poste", 'alpha');
+ $search_note_private = GETPOST('search_note_private', 'alphanohtml');
$search_roles = GETPOST("search_roles", 'array');
$socialnetworks = getArrayOfSocialNetworks();
@@ -962,7 +989,7 @@ function show_contacts($conf, $langs, $db, $object, $backtopage = '', $showuserl
$sortfield = "t.lastname";
}
- if (!empty($conf->clicktodial->enabled)) {
+ if (isModEnabled('clicktodial')) {
$user->fetch_clicktodial(); // lecture des infos de clicktodial du user
}
@@ -976,6 +1003,7 @@ function show_contacts($conf, $langs, $db, $object, $backtopage = '', $showuserl
'name' =>array('type'=>'varchar(128)', 'label'=>'Name', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>1, 'index'=>1, 'position'=>10, 'searchall'=>1),
'poste' =>array('type'=>'varchar(128)', 'label'=>'PostOrFunction', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>2, 'index'=>1, 'position'=>20),
'address' =>array('type'=>'varchar(128)', 'label'=>'Address', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>3, 'index'=>1, 'position'=>30),
+ 'note_private' =>array('type'=>'text', 'label'=>'NotePrivate', 'enabled'=>(!getDolGlobalInt('MAIN_LIST_HIDE_PRIVATE_NOTES')), 'visible'=>3, 'position'=>35),
'role' =>array('type'=>'checkbox', 'label'=>'Role', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>4, 'index'=>1, 'position'=>40),
'statut' =>array('type'=>'integer', 'label'=>'Status', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'default'=>0, 'index'=>1, 'position'=>50, 'arrayofkeyval'=>array(0=>$contactstatic->LibStatut(0, 1), 1=>$contactstatic->LibStatut(1, 1))),
);
@@ -986,6 +1014,7 @@ function show_contacts($conf, $langs, $db, $object, $backtopage = '', $showuserl
't.name'=>array('label'=>"Name", 'checked'=>1, 'position'=>10),
't.poste'=>array('label'=>"PostOrFunction", 'checked'=>1, 'position'=>20),
't.address'=>array('label'=>(empty($conf->dol_optimize_smallscreen) ? $langs->trans("Address").' / '.$langs->trans("Phone").' / '.$langs->trans("Email") : $langs->trans("Address")), 'checked'=>1, 'position'=>30),
+ 't.note_private' => array('label' => 'NotePrivate', 'checked' => 0, 'position'=>35),
'sc.role'=>array('label'=>"ContactByDefaultFor", 'checked'=>1, 'position'=>40),
't.statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>50, 'class'=>'center'),
);
@@ -1020,6 +1049,7 @@ function show_contacts($conf, $langs, $db, $object, $backtopage = '', $showuserl
$search_roles = array();
$search_address = '';
$search_poste = '';
+ $search_note_private = '';
$search = array();
$search_array_options = array();
@@ -1076,6 +1106,9 @@ function show_contacts($conf, $langs, $db, $object, $backtopage = '', $showuserl
if ($search_address != '') {
$param .= '&search_address='.urlencode($search_address);
}
+ if ($search_note_private != '') {
+ $param .= '&search_note_private='.urlencode($search_note_private);
+ }
if ($optioncss != '') {
$param .= '&optioncss='.urlencode($optioncss);
}
@@ -1086,6 +1119,7 @@ function show_contacts($conf, $langs, $db, $object, $backtopage = '', $showuserl
$sql = "SELECT t.rowid, t.lastname, t.firstname, t.fk_pays as country_id, t.civility, t.poste, t.phone as phone_pro, t.phone_mobile, t.phone_perso, t.fax, t.email, t.socialnetworks, t.statut, t.photo,";
$sql .= " t.civility as civility_id, t.address, t.zip, t.town";
+ $sql .= ", t.note_private";
$sql .= " FROM ".MAIN_DB_PREFIX."socpeople as t";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople_extrafields as ef on (t.rowid = ef.fk_object)";
$sql .= " WHERE t.fk_soc = ".((int) $object->id);
@@ -1104,6 +1138,9 @@ function show_contacts($conf, $langs, $db, $object, $backtopage = '', $showuserl
if ($search_address) {
$sql .= natural_search($searchAddressPhoneDBFields, $search_address);
}
+ if ($search_note_private) {
+ $sql .= natural_search('t.note_private', $search_note_private);
+ }
if (count($search_roles) > 0) {
$sql .= " AND t.rowid IN (SELECT sc.fk_socpeople FROM ".MAIN_DB_PREFIX."societe_contacts as sc WHERE sc.fk_c_type_contact IN (".$db->sanitize(implode(',', $search_roles))."))";
}
@@ -1285,6 +1322,15 @@ function show_contacts($conf, $langs, $db, $object, $backtopage = '', $showuserl
print '';
}
+ // Note private
+ if (!empty($arrayfields['t.note_private']['checked'])) {
+ print '
';
+ if ($obj->note_private) {
+ print dol_string_nohtmltag($obj->note_private);
+ }
+ print ' ';
+ }
+
// Role
if (!empty($arrayfields['sc.role']['checked'])) {
print '
';
@@ -1443,6 +1489,11 @@ function show_actions_done($conf, $langs, $db, $filterobj, $objcon = '', $noprin
$sql = '';
if (isModEnabled('agenda')) {
+ require_once DOL_DOCUMENT_ROOT . '/core/class/hookmanager.class.php';
+ $hookmanager = new HookManager($db);
+ // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
+ $hookmanager->initHooks(array('agendadao'));
+
// Recherche histo sur actioncomm
if (is_object($objcon) && $objcon->id > 0) {
$sql = "SELECT DISTINCT a.id, a.label as label,";
@@ -1482,6 +1533,11 @@ function show_actions_done($conf, $langs, $db, $filterobj, $objcon = '', $noprin
}
}
+ // Fields from hook
+ $parameters = array('sql' => &$sql, 'filterobj' => $filterobj, 'objcon' => $objcon);
+ $reshook = $hookmanager->executeHooks('showActionsDoneListSelect', $parameters); // Note that $action and $object may have been modified by hook
+ if (!empty($hookmanager->resPrint)) $sql.= $hookmanager->resPrint;
+
$sql .= " FROM ".MAIN_DB_PREFIX."actioncomm as a";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on u.rowid = a.fk_user_action";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_actioncomm as c ON a.fk_action = c.id";
@@ -1493,6 +1549,11 @@ function show_actions_done($conf, $langs, $db, $filterobj, $objcon = '', $noprin
$sql .= " AND r.element_type = '".$db->escape($objcon->table_element)."' AND r.fk_element = ".((int) $objcon->id);
}
+ // Fields from hook
+ $parameters = array('sql' => &$sql, 'filterobj' => $filterobj, 'objcon' => $objcon);
+ $reshook = $hookmanager->executeHooks('showActionsDoneListFrom', $parameters); // Note that $action and $object may have been modified by hook
+ if (!empty($hookmanager->resPrint)) $sql.= $hookmanager->resPrint;
+
if (is_object($filterobj) && in_array(get_class($filterobj), array('Societe', 'Client', 'Fournisseur'))) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as sp ON a.fk_contact = sp.rowid";
} elseif (is_object($filterobj) && get_class($filterobj) == 'Dolresource') {
@@ -1593,6 +1654,11 @@ function show_actions_done($conf, $langs, $db, $filterobj, $objcon = '', $noprin
addOtherFilterSQL($sql, $donetodo, $now, $filters);
+ // Fields from hook
+ $parameters = array('sql' => &$sql, 'filterobj' => $filterobj, 'objcon' => $objcon, 'module' => $module);
+ $reshook = $hookmanager->executeHooks('showActionsDoneListWhere', $parameters); // Note that $action and $object may have been modified by hook
+ if (!empty($hookmanager->resPrint)) $sql.= $hookmanager->resPrint;
+
if (is_array($actioncode)) {
foreach ($actioncode as $code) {
$sql2 = addMailingEventTypeSQL($code, $objcon, $filterobj);
diff --git a/htdocs/core/lib/contact.lib.php b/htdocs/core/lib/contact.lib.php
index 948af4e2868..2dbf97d4785 100644
--- a/htdocs/core/lib/contact.lib.php
+++ b/htdocs/core/lib/contact.lib.php
@@ -70,9 +70,10 @@ function contact_prepare_head(Contact $object)
$sql = 'SELECT COUNT(n.rowid) as nb';
$sql .= ' FROM '.MAIN_DB_PREFIX.'projet as n';
$sql .= ' INNER JOIN '.MAIN_DB_PREFIX.'element_contact as cc ON (n.rowid = cc.element_id)';
- $sql .= ' WHERE cc.fk_socpeople = '.((int) $object->id);
- $sql .= ' AND cc.fk_c_type_contact IN (SELECT rowid FROM '.MAIN_DB_PREFIX.'c_type_contact WHERE element="project" AND source="external")';
- $sql .= ' AND n.entity IN ('.getEntity('project').')';
+ $sql .= " WHERE cc.fk_socpeople = ".((int) $object->id);
+ $sql .= " AND cc.fk_c_type_contact IN (SELECT rowid FROM ".MAIN_DB_PREFIX."c_type_contact WHERE element='project' AND source='external')";
+ $sql .= " AND n.entity IN (".getEntity('project').")";
+
$resql = $db->query($sql);
if ($resql) {
$obj = $db->fetch_object($resql);
@@ -191,10 +192,10 @@ function show_contacts_projects($conf, $langs, $db, $object, $backtopage = '', $
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_lead_status as cls on p.fk_opp_status = cls.rowid';
$sql .= ' INNER JOIN '.MAIN_DB_PREFIX.'element_contact as cc ON (p.rowid = cc.element_id)';
$sql .= ' INNER JOIN '.MAIN_DB_PREFIX.'c_type_contact as ctc ON (ctc.rowid = cc.fk_c_type_contact)';
- $sql .= ' WHERE cc.fk_socpeople = '.((int) $object->id);
- $sql .= ' AND ctc.element="project" AND ctc.source="external"';
- $sql .= ' AND p.entity IN ('.getEntity('project').')';
- $sql .= ' ORDER BY p.dateo DESC';
+ $sql .= " WHERE cc.fk_socpeople = ".((int) $object->id);
+ $sql .= " AND ctc.element='project' AND ctc.source='external'";
+ $sql .= " AND p.entity IN (".getEntity('project').")";
+ $sql .= " ORDER BY p.dateo DESC";
$result = $db->query($sql);
if ($result) {
diff --git a/htdocs/core/lib/date.lib.php b/htdocs/core/lib/date.lib.php
index 9aaf0771d44..03223a7b65a 100644
--- a/htdocs/core/lib/date.lib.php
+++ b/htdocs/core/lib/date.lib.php
@@ -169,7 +169,7 @@ function dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforend
} else {
$date->add($interval);
}
- //Change the behavior of PHP over data-interval when the result of this function is Feb 29 (non-leap years), 30 or Feb 31 (php returns March 1, 2 or 3 respectively)
+ //Change the behavior of PHP over data-interval when the result of this function is Feb 29 (non-leap years), 30 or Feb 31 (so php returns March 1, 2 or 3 respectively)
if ($ruleforendofmonth == 1 && $duration_unit == 'm') {
$timeyear = dol_print_date($time, '%Y');
$timemonth = dol_print_date($time, '%m');
diff --git a/htdocs/core/lib/ecm.lib.php b/htdocs/core/lib/ecm.lib.php
index f61ec0e060c..e7840505e8f 100644
--- a/htdocs/core/lib/ecm.lib.php
+++ b/htdocs/core/lib/ecm.lib.php
@@ -33,12 +33,21 @@
function ecm_prepare_dasboard_head($object)
{
global $langs, $conf, $user, $form;
- global $helptext1, $helptext2;
$h = 0;
$head = array();
+
+ $showmediasection = 0;
+ if (isModEnabled('mailing') || isModEnabled('website')) {
+ $showmediasection = 1;
+ }
+
$helptext = $langs->trans("ECMAreaDesc").' ';
- $helptext .= $langs->trans("ECMAreaDesc2");
+ $helptext .= $langs->trans("ECMAreaDesc2a").' ';
+ $helptext .= $langs->trans("ECMAreaDesc2b");
+ if ($showmediasection) {
+ $helptext .= ' '.$langs->trans("ECMAreaDesc3");
+ }
$head[$h][0] = DOL_URL_ROOT.'/ecm/index.php';
$head[$h][1] = $langs->trans("ECMSectionsManual").$form->textwithpicto('', $helptext, 1, 'info', '', 0, 3);
@@ -52,6 +61,13 @@ function ecm_prepare_dasboard_head($object)
$h++;
}
+ if ($showmediasection && getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) {
+ $head[$h][0] = DOL_URL_ROOT.'/ecm/index_medias.php?file_manager=1';
+ $head[$h][1] = $langs->trans("ECMSectionsMedias").$form->textwithpicto('', $helptext, 1, 'info', '', 0, 3);
+ $head[$h][2] = 'index_medias';
+ $h++;
+ }
+
// Show more tabs from modules
// Entries must be declared in modules descriptor with line
// $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab
diff --git a/htdocs/core/lib/fichinter.lib.php b/htdocs/core/lib/fichinter.lib.php
index eaa1f85d142..87c9ce4a3fc 100644
--- a/htdocs/core/lib/fichinter.lib.php
+++ b/htdocs/core/lib/fichinter.lib.php
@@ -139,7 +139,11 @@ function fichinter_prepare_head($object)
*/
function fichinter_admin_prepare_head()
{
- global $langs, $conf, $user;
+ global $langs, $conf, $user, $db;
+
+ $extrafields = new ExtraFields($db);
+ $extrafields->fetch_name_optionals_label('fichinter');
+ $extrafields->fetch_name_optionals_label('fichinterdet');
$h = 0;
$head = array();
@@ -159,19 +163,25 @@ function fichinter_admin_prepare_head()
$head[$h][0] = DOL_URL_ROOT.'/fichinter/admin/fichinter_extrafields.php';
$head[$h][1] = $langs->trans("ExtraFields");
+ $nbExtrafields = $extrafields->attributes['fichinter']['count'];
+ if ($nbExtrafields > 0) {
+ $head[$h][1] .= ''.$nbExtrafields.' ';
+ }
$head[$h][2] = 'attributes';
$h++;
$head[$h][0] = DOL_URL_ROOT.'/fichinter/admin/fichinterdet_extrafields.php';
$head[$h][1] = $langs->trans("ExtraFieldsLines");
+ $nbExtrafields = $extrafields->attributes['fichinterdet']['count'];
+ if ($nbExtrafields > 0) {
+ $head[$h][1] .= ''.$nbExtrafields.' ';
+ }
$head[$h][2] = 'attributesdet';
$h++;
-
-
complete_head_from_modules($conf, $langs, null, $head, $h, 'fichinter_admin', 'remove');
- return $head;
+ return $head;
}
/**
diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php
index 3be3c4c24f7..edbc348444e 100644
--- a/htdocs/core/lib/files.lib.php
+++ b/htdocs/core/lib/files.lib.php
@@ -319,7 +319,7 @@ function completeFileArrayWithDatabaseInfo(&$filearray, $relativedir)
// TODO Remove this when PRODUCT_USE_OLD_PATH_FOR_PHOTO will be removed
global $modulepart;
- if ($modulepart == 'produit' && !empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if ($modulepart == 'produit' && getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
global $object;
if (!empty($object->id)) {
if (isModEnabled("product")) {
@@ -401,8 +401,8 @@ function completeFileArrayWithDatabaseInfo(&$filearray, $relativedir)
/**
* Fast compare of 2 files identified by their properties ->name, ->date and ->size
*
- * @param string $a File 1
- * @param string $b File 2
+ * @param object $a File 1
+ * @param object $b File 2
* @return int 1, 0, 1
*/
function dol_compare_file($a, $b)
@@ -641,6 +641,12 @@ function dolReplaceInFile($srcfile, $arrayreplacement, $destfile = '', $newmask
return 0;
}
+ $srcexists = dol_is_file($srcfile);
+ if (!$srcexists) {
+ dol_syslog("files.lib.php::dolReplaceInFile failed to read src file", LOG_WARNING);
+ return -3;
+ }
+
$tmpdestfile = $destfile.'.tmp';
$newpathofsrcfile = dol_osencode($srcfile);
@@ -1372,7 +1378,7 @@ function dol_delete_dir($dir, $nophperrors = 0)
// Security:
// We refuse transversal using .. and pipes into filenames.
if (preg_match('/\.\./', $dir) || preg_match('/[<>|]/', $dir)) {
- dol_syslog("Refused to delete dir ".$dir, LOG_WARNING);
+ dol_syslog("Refused to delete dir ".$dir.' (contains invalid char sequence)', LOG_WARNING);
return false;
}
@@ -2033,6 +2039,7 @@ function dol_convert_file($fileinput, $ext = 'png', $fileoutput = '', $page = ''
* @param string $mode 'gz' or 'bz' or 'zip'
* @param string $errorstring Error string
* @return int <0 if KO, >0 if OK
+ * @see dol_uncompress(), dol_compress_dir()
*/
function dol_compress_file($inputfile, $outputfile, $mode = "gz", &$errorstring = null)
{
@@ -2159,6 +2166,7 @@ function dol_compress_file($inputfile, $outputfile, $mode = "gz", &$errorstring
* @param string $inputfile File to uncompress
* @param string $outputdir Target dir name
* @return array array('error'=>'Error code') or array() if no error
+ * @see dol_compress_file(), dol_compress_dir()
*/
function dol_uncompress($inputfile, $outputdir)
{
@@ -2282,10 +2290,14 @@ function dol_uncompress($inputfile, $outputdir)
* @param string $mode 'zip'
* @param string $excludefiles A regex pattern. For example: '/\.log$|\/temp\//'
* @param string $rootdirinzip Add a root dir level in zip file
+ * @param string $newmask Mask for new file (0 by default means $conf->global->MAIN_UMASK). Example: '0666'
* @return int <0 if KO, >0 if OK
+ * @see dol_uncompress(), dol_compress_file()
*/
-function dol_compress_dir($inputdir, $outputfile, $mode = "zip", $excludefiles = '', $rootdirinzip = '')
+function dol_compress_dir($inputdir, $outputfile, $mode = "zip", $excludefiles = '', $rootdirinzip = '', $newmask = 0)
{
+ global $conf;
+
$foundhandler = 0;
dol_syslog("Try to zip dir ".$inputdir." into ".$outputfile." mode=".$mode);
@@ -2315,6 +2327,7 @@ function dol_compress_dir($inputdir, $outputfile, $mode = "zip", $excludefiles =
}
else*/
//if (class_exists('ZipArchive') && !empty($conf->global->MAIN_USE_ZIPARCHIVE_FOR_ZIP_COMPRESS))
+
if (class_exists('ZipArchive')) {
$foundhandler = 1;
@@ -2359,6 +2372,16 @@ function dol_compress_dir($inputdir, $outputfile, $mode = "zip", $excludefiles =
// Zip archive will be created only after closing object
$zip->close();
+ if (empty($newmask) && !empty($conf->global->MAIN_UMASK)) {
+ $newmask = $conf->global->MAIN_UMASK;
+ }
+ if (empty($newmask)) { // This should no happen
+ dol_syslog("Warning: dol_copy called with empty value for newmask and no default value defined", LOG_WARNING);
+ $newmask = '0664';
+ }
+
+ @chmod($outputfile, octdec($newmask));
+
return 1;
}
}
@@ -2374,7 +2397,7 @@ function dol_compress_dir($inputdir, $outputfile, $mode = "zip", $excludefiles =
$langs->load("errors");
dol_syslog("Failed to open file ".$outputfile, LOG_ERR);
dol_syslog($e->getMessage(), LOG_ERR);
- $errormsg = $langs->trans("ErrorFailedToWriteInDir", $outputfile);
+ $errormsg = $langs->trans("ErrorFailedToBuildArchive", $outputfile).' - '.$e->getMessage();
return -1;
}
}
@@ -2522,7 +2545,7 @@ function dol_check_secure_access_document($modulepart, $original_file, $entity,
$original_file = $conf->facture->multidir_output[$entity].'/'.$original_file;
} elseif ($modulepart == 'apercupropal' && !empty($conf->propal->multidir_output[$entity])) {
// Wrapping pour les apercu propal
- if ($fuser->rights->propale->{$lire}) {
+ if ($fuser->rights->propal->{$lire}) {
$accessallowed = 1;
}
$original_file = $conf->propal->multidir_output[$entity].'/'.$original_file;
@@ -2594,7 +2617,7 @@ function dol_check_secure_access_document($modulepart, $original_file, $entity,
$original_file = $conf->expensereport->dir_output.'/'.$original_file;
} elseif ($modulepart == 'propalstats' && !empty($conf->propal->multidir_temp[$entity])) {
// Wrapping pour les images des stats propales
- if ($fuser->rights->propale->{$lire}) {
+ if ($fuser->rights->propal->{$lire}) {
$accessallowed = 1;
}
$original_file = $conf->propal->multidir_temp[$entity].'/'.$original_file;
@@ -2815,7 +2838,7 @@ function dol_check_secure_access_document($modulepart, $original_file, $entity,
//$sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."fichinter WHERE ref='".$db->escape($refname)."' AND entity=".$conf->entity;
} elseif (($modulepart == 'propal' || $modulepart == 'propale') && !empty($conf->propal->multidir_output[$entity])) {
// Wrapping pour les propales
- if ($fuser->rights->propale->{$lire} || preg_match('/^specimen/i', $original_file)) {
+ if ($fuser->rights->propal->{$lire} || preg_match('/^specimen/i', $original_file)) {
$accessallowed = 1;
}
$original_file = $conf->propal->multidir_output[$entity].'/'.$original_file;
diff --git a/htdocs/core/lib/fourn.lib.php b/htdocs/core/lib/fourn.lib.php
index c65013722d4..8ba05557220 100644
--- a/htdocs/core/lib/fourn.lib.php
+++ b/htdocs/core/lib/fourn.lib.php
@@ -58,7 +58,7 @@ function facturefourn_prepare_head($object)
if (!empty($conf->paymentbybanktransfer->enabled)) {
$nbStandingOrders = 0;
$sql = "SELECT COUNT(pfd.rowid) as nb";
- $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+ $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
$sql .= " WHERE pfd.fk_facture_fourn = ".((int) $object->id);
$sql .= " AND pfd.ext_payment_id IS NULL";
$resql = $db->query($sql);
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index 11a966695a2..b5450f7317f 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -1,7 +1,7 @@
* Copyright (C) 2003 Jean-Louis Bergamo
- * Copyright (C) 2004-2018 Laurent Destailleur
+ * Copyright (C) 2004-2022 Laurent Destailleur
* Copyright (C) 2004 Sebastien Di Cintio
* Copyright (C) 2004 Benoit Mortier
* Copyright (C) 2004 Christophe Combelles
@@ -18,6 +18,7 @@
* Copyright (C) 2020 Open-Dsi
* Copyright (C) 2021 Gauthier VERDOL
* Copyright (C) 2022 Anthony Berton
+ * Copyright (C) 2022 Ferran Marcet
*
* 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
@@ -966,10 +967,15 @@ function sanitizeVal($out = '', $check = 'alphanohtml', $filter = null, $options
break;
case 'custom':
- if (empty($filter)) {
- return 'BadFourthParameterForGETPOST';
+ if (!empty($out)) {
+ if (empty($filter)) {
+ return 'BadParameterForGETPOST - Param 3 of sanitizeVal()';
+ }
+ /*if (empty($options)) {
+ return 'BadParameterForGETPOST - Param 4 of sanitizeVal()';
+ }*/
+ $out = filter_var($out, $filter, $options);
}
- $out = filter_var($out, $filter, $options);
break;
}
@@ -1153,29 +1159,43 @@ function dol_buildpath($path, $type = 0, $returnemptyifnotfound = 0)
}
/**
- * Create a clone of instance of object (new instance with same value for properties)
- * With native = 0: Property that are reference are also new object (full isolation clone). This means $this->db of new object is not valid.
+ * Create a clone of instance of object (new instance with same value for each properties)
+ * With native = 0: Property that are reference are different memory area in the new object (full isolation clone). This means $this->db of new object may not be valid.
* With native = 1: Use PHP clone. Property that are reference are same pointer. This means $this->db of new object is still valid but point to same this->db than original object.
+ * With native = 2: Property that are reference are different memory area in the new object (full isolation clone). Only scalar and array values are cloned. This means $this->db of new object is not valid.
*
* @param object $object Object to clone
- * @param int $native 0=Full isolation method, 1=Native PHP method
+ * @param int $native 0=Full isolation method, 1=Native PHP method, 2=Full isolation method keeping only scalar and array properties (recommended)
* @return object Clone object
* @see https://php.net/manual/language.oop5.cloning.php
*/
function dol_clone($object, $native = 0)
{
- if (empty($native)) {
+ if ($native == 0) {
+ // deprecated method, use the method with native = 2 instead
$tmpsavdb = null;
if (isset($object->db) && isset($object->db->db) && is_object($object->db->db) && get_class($object->db->db) == 'PgSql\Connection') {
$tmpsavdb = $object->db;
- unset($object->db); // Such property can not be serialized when PgSql/Connection
+ unset($object->db); // Such property can not be serialized with pgsl (when object->db->db = 'PgSql\Connection')
}
- $myclone = unserialize(serialize($object)); // serialize then unserialize is hack to be sure to have a new object for all fields
+ $myclone = unserialize(serialize($object)); // serialize then unserialize is a hack to be sure to have a new object for all fields
- if ($tmpsavdb) {
+ if (!empty($tmpsavdb)) {
$object->db = $tmpsavdb;
}
+ } elseif ($native == 2) {
+ // recommended method to have a full isolated cloned object
+ $myclone = new stdClass();
+ $tmparray = get_object_vars($object); // return only public properties
+
+ if (is_array($tmparray)) {
+ foreach ($tmparray as $propertykey => $propertyval) {
+ if (is_scalar($propertyval) || is_array($propertyval)) {
+ $myclone->$propertykey = $propertyval;
+ }
+ }
+ }
} else {
$myclone = clone $object; // PHP clone is a shallow copy only, not a real clone, so properties of references will keep the reference (refering to the same target/variable)
}
@@ -1227,6 +1247,7 @@ function dol_sanitizeFileName($str, $newstr = '_', $unaccent = 1)
$tmp = dol_string_nospecial($unaccent ? dol_string_unaccent($str) : $str, $newstr, $filesystem_forbidden_chars);
$tmp = preg_replace('/\-\-+/', '_', $tmp);
$tmp = preg_replace('/\s+\-([^\s])/', ' _$1', $tmp);
+ $tmp = preg_replace('/\s+\-$/', '', $tmp);
$tmp = str_replace('..', '', $tmp);
return $tmp;
}
@@ -1251,6 +1272,7 @@ function dol_sanitizePathName($str, $newstr = '_', $unaccent = 1)
$tmp = dol_string_nospecial($unaccent ? dol_string_unaccent($str) : $str, $newstr, $filesystem_forbidden_chars);
$tmp = preg_replace('/\-\-+/', '_', $tmp);
$tmp = preg_replace('/\s+\-([^\s])/', ' _$1', $tmp);
+ $tmp = preg_replace('/\s+\-$/', '', $tmp);
$tmp = str_replace('..', '', $tmp);
return $tmp;
}
@@ -1788,10 +1810,10 @@ function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $di
/**
* Show tab header of a card
*
- * @param array $links Array of tabs. Currently initialized by calling a function xxx_admin_prepare_head
+ * @param array $links Array of tabs (0=>url, 1=>label, 2=>code, 3=>not used, 4=>text after link, 5=>morecssonlink). Currently initialized by calling a function xxx_admin_prepare_head. Note that label into $links[$i][1] must be already HTML escaped.
* @param string $active Active tab name (document', 'info', 'ldap', ....)
* @param string $title Title
- * @param int $notab -1 or 0=Add tab header, 1=no tab header (if you set this to 1, using print dol_get_fiche_end() to close tab is not required), -2=Add tab header with no seaparation under tab (to start a tab just after)
+ * @param int $notab -1 or 0=Add tab header, 1=no tab header (if you set this to 1, using print dol_get_fiche_end() to close tab is not required), -2=Add tab header with no sepaaration under tab (to start a tab just after), -3=Add tab header but no footer separation
* @param string $picto Add a picto on tab title
* @param int $pictoisfullpath If 1, image path is a full path. If you set this to 1, you can use url returned by dol_buildpath('/mymodyle/img/myimg.png',1) for $picto.
* @param string $morehtmlright Add more html content on right of tabs title
@@ -1809,10 +1831,10 @@ function dol_fiche_head($links = array(), $active = '0', $title = '', $notab = 0
/**
* Show tabs of a record
*
- * @param array $links Array of tabs. Note that label into $links[$i][1] must be already HTML escaped.
+ * @param array $links Array of tabs (0=>url, 1=>label, 2=>code, 3=>not used, 4=>text after link, 5=>morecssonlink). Currently initialized by calling a function xxx_admin_prepare_head. Note that label into $links[$i][1] must be already HTML escaped.
* @param string $active Active tab name
* @param string $title Title
- * @param int $notab -1 or 0=Add tab header, 1=no tab header (if you set this to 1, using print dol_get_fiche_end() to close tab is not required), -2=Add tab header with no seaparation under tab (to start a tab just after)
+ * @param int $notab -1 or 0=Add tab header, 1=no tab header (if you set this to 1, using print dol_get_fiche_end() to close tab is not required), -2=Add tab header with no seaparation under tab (to start a tab just after), -3=-2+'noborderbottom'
* @param string $picto Add a picto on tab title
* @param int $pictoisfullpath If 1, image path is a full path. If you set this to 1, you can use url returned by dol_buildpath('/mymodyle/img/myimg.png',1) for $picto.
* @param string $morehtmlright Add more html content on right of tabs title
@@ -1912,7 +1934,7 @@ function dol_get_fiche_head($links = array(), $active = '', $title = '', $notab
$out .= '\n";
}
- if (!$notab || $notab == -1 || $notab == -2) {
- $out .= "\n".''."\n";
+ if (!$notab || $notab == -1 || $notab == -2 || $notab == -3) {
+ $out .= "\n".'
'."\n";
}
$parameters = array('tabname' => $active, 'out' => $out);
@@ -2294,13 +2316,13 @@ function dol_banner_tab($object, $paramid, $morehtml = '', $shownav = 1, $fieldi
// Add alias for thirdparty
if (!empty($object->name_alias)) {
- $morehtmlref .= '
'.$object->name_alias.'
';
+ $morehtmlref .= '
'.$object->name_alias.'
';
}
// Add label
if (in_array($object->element, array('product', 'bank_account', 'project_task'))) {
if (!empty($object->label)) {
- $morehtmlref .= '
'.$object->label.'
';
+ $morehtmlref .= '
'.$object->label.'
';
}
}
@@ -2315,7 +2337,7 @@ function dol_banner_tab($object, $paramid, $morehtml = '', $shownav = 1, $fieldi
}
if (!empty($conf->global->MAIN_SHOW_TECHNICAL_ID) && ($conf->global->MAIN_SHOW_TECHNICAL_ID == '1' || preg_match('/'.preg_quote($object->element, '/').'/i', $conf->global->MAIN_SHOW_TECHNICAL_ID)) && !empty($object->id)) {
$morehtmlref .= '
';
- $morehtmlref .= '
';
+ $morehtmlref .= '
';
$morehtmlref .= $langs->trans("TechnicalID").': '.$object->id;
$morehtmlref .= '
';
}
@@ -2535,8 +2557,8 @@ function dol_print_date($time, $format = '', $tzoutput = 'auto', $outputlangs =
if ($tzoutput == 'tzserver') {
$to_gmt = false;
$offsettzstring = @date_default_timezone_get(); // Example 'Europe/Berlin' or 'Indian/Reunion'
- $offsettz = 0; // Timezone offset with server timezone, so 0
- $offsetdst = 0; // Dst offset with server timezone, so 0
+ $offsettz = 0; // Timezone offset with server timezone (because to_gmt is false), so 0
+ $offsetdst = 0; // Dst offset with server timezone (because to_gmt is false), so 0
} elseif ($tzoutput == 'tzuser' || $tzoutput == 'tzuserrel') {
$to_gmt = true;
$offsettzstring = (empty($_SESSION['dol_tz_string']) ? 'UTC' : $_SESSION['dol_tz_string']); // Example 'Europe/Berlin' or 'Indian/Reunion'
@@ -2546,8 +2568,8 @@ function dol_print_date($time, $format = '', $tzoutput = 'auto', $outputlangs =
$user_dt = new DateTime();
$user_dt->setTimezone($user_date_tz);
$user_dt->setTimestamp($tzoutput == 'tzuser' ? dol_now() : (int) $time);
- $offsettz = $user_dt->getOffset();
- } else { // old method (The 'tzuser' was processed like the 'tzuserrel')
+ $offsettz = $user_dt->getOffset(); // should include dst ?
+ } else { // with old method (The 'tzuser' was processed like the 'tzuserrel')
$offsettz = (empty($_SESSION['dol_tz']) ? 0 : $_SESSION['dol_tz']) * 60 * 60; // Will not be used anymore
$offsetdst = (empty($_SESSION['dol_dst']) ? 0 : $_SESSION['dol_dst']) * 60 * 60; // Will not be used anymore
}
@@ -2628,6 +2650,11 @@ function dol_print_date($time, $format = '', $tzoutput = 'auto', $outputlangs =
$format = str_replace('%A', '__A__', $format);
}
+ $useadodb = getDolGlobalInt('MAIN_USE_LEGACY_ADODB_FOR_DATE', 0);
+ //$useadodb = 1; // To switch to adodb
+ if (!empty($useadodb)) {
+ include_once DOL_DOCUMENT_ROOT.'/includes/adodbtime/adodb-time.inc.php';
+ }
// Analyze date
$reg = array();
@@ -2647,23 +2674,76 @@ function dol_print_date($time, $format = '', $tzoutput = 'auto', $outputlangs =
$ssec = (!empty($reg[6]) ? $reg[6] : '');
$time = dol_mktime($shour, $smin, $ssec, $smonth, $sday, $syear, true);
- $ret = adodb_strftime($format, $time + $offsettz + $offsetdst, $to_gmt);
+ if (empty($useadodb)) {
+ if ($to_gmt) {
+ $tzo = new DateTimeZone('UTC'); // when to_gmt is true, base for offsettz and offsetdst (so timetouse) is UTC
+ } else {
+ $tzo = new DateTimeZone(date_default_timezone_get()); // when to_gmt is false, base for offsettz and offsetdst (so timetouse) is PHP server
+ }
+ $dtts = new DateTime();
+ $dtts->setTimestamp($time);
+ $dtts->setTimezone($tzo);
+ $newformat = str_replace(
+ array('%Y', '%y', '%m', '%d', '%H', '%I', '%M', '%S', '%p', 'T', 'Z', '__a__', '__A__', '__b__', '__B__'),
+ array('Y', 'y', 'm', 'd', 'H', 'h', 'i', 's', 'A', '__£__', '__$__', '__{__', '__}__', '__[__', '__]__'),
+ $format);
+ $ret = $dtts->format($newformat);
+ $ret = str_replace(
+ array('__£__', '__$__', '__{__', '__}__', '__[__', '__]__'),
+ array('T', 'Z', '__a__', '__A__', '__b__', '__B__'),
+ $ret);
+ } else {
+ $ret = adodb_strftime($format, $time + $offsettz + $offsetdst, $to_gmt);
+ }
} else {
// Date is a timestamps
if ($time < 100000000000) { // Protection against bad date values
- $timetouse = $time + $offsettz + $offsetdst; // TODO Replace this with function Date PHP. We also should not use anymore offsettz and offsetdst but only offsettzstring.
+ $timetouse = $time + $offsettz + $offsetdst; // TODO We could be able to disable use of offsettz and offsetdst to use only offsettzstring.
- $ret = adodb_strftime($format, $timetouse, $to_gmt); // If to_gmt = false then adodb_strftime use TZ of server
+ if (empty($useadodb)) {
+ if ($to_gmt) {
+ $tzo = new DateTimeZone('UTC'); // when to_gmt is true, base for offsettz and offsetdst (so timetouse) is UTC
+ } else {
+ $tzo = new DateTimeZone(date_default_timezone_get()); // when to_gmt is false, base for offsettz and offsetdst (so timetouse) is PHP server
+ }
+ $dtts = new DateTime();
+ $dtts->setTimestamp($timetouse);
+ $dtts->setTimezone($tzo);
+ $newformat = str_replace(
+ array('%Y', '%y', '%m', '%d', '%H', '%I', '%M', '%S', '%p', 'T', 'Z', '__a__', '__A__', '__b__', '__B__'),
+ array('Y', 'y', 'm', 'd', 'H', 'h', 'i', 's', 'A', '__£__', '__$__', '__{__', '__}__', '__[__', '__]__'),
+ $format);
+ $ret = $dtts->format($newformat);
+ $ret = str_replace(
+ array('__£__', '__$__', '__{__', '__}__', '__[__', '__]__'),
+ array('T', 'Z', '__a__', '__A__', '__b__', '__B__'),
+ $ret);
+ } else {
+ $ret = adodb_strftime($format, $timetouse, $to_gmt); // If to_gmt = false then adodb_strftime use TZ of server
+ }
+ //var_dump($ret);exit;
} else {
$ret = 'Bad value '.$time.' for date';
}
}
if (preg_match('/__b__/i', $format)) {
- $timetouse = $time + $offsettz + $offsetdst; // TODO Replace this with function Date PHP. We also should not use anymore offsettz and offsetdst but only offsettzstring.
+ $timetouse = $time + $offsettz + $offsetdst; // TODO We could be able to disable use of offsettz and offsetdst to use only offsettzstring.
- // Here ret is string in PHP setup language (strftime was used). Now we convert to $outputlangs.
- $month = adodb_strftime('%m', $timetouse, $to_gmt); // If to_gmt = false then adodb_strftime use TZ of server
+ if (empty($useadodb)) {
+ if ($to_gmt) {
+ $tzo = new DateTimeZone('UTC'); // when to_gmt is true, base for offsettz and offsetdst (so timetouse) is UTC
+ } else {
+ $tzo = new DateTimeZone(date_default_timezone_get()); // when to_gmt is false, base for offsettz and offsetdst (so timetouse) is PHP server
+ }
+ $dtts = new DateTime();
+ $dtts->setTimestamp($timetouse);
+ $dtts->setTimezone($tzo);
+ $month = $dtts->format("m");
+ } else {
+ // After this ret is string in PHP setup language (strftime was used). Now we convert to $outputlangs.
+ $month = adodb_strftime('%m', $timetouse, $to_gmt); // If to_gmt = false then adodb_strftime use TZ of server
+ }
$month = sprintf("%02d", $month); // $month may be return with format '06' on some installation and '6' on other, so we force it to '06'.
if ($encodetooutput) {
$monthtext = $outputlangs->transnoentities('Month'.$month);
@@ -2682,8 +2762,21 @@ function dol_print_date($time, $format = '', $tzoutput = 'auto', $outputlangs =
//print "time=$time offsettz=$offsettz offsetdst=$offsetdst offsettzstring=$offsettzstring";
$timetouse = $time + $offsettz + $offsetdst; // TODO Replace this with function Date PHP. We also should not use anymore offsettz and offsetdst but only offsettzstring.
- $w = adodb_strftime('%w', $timetouse, $to_gmt); // If to_gmt = false then adodb_strftime use TZ of server
+ if (empty($useadodb)) {
+ if ($to_gmt) {
+ $tzo = new DateTimeZone('UTC');
+ } else {
+ $tzo = new DateTimeZone(date_default_timezone_get());
+ }
+ $dtts = new DateTime();
+ $dtts->setTimestamp($timetouse);
+ $dtts->setTimezone($tzo);
+ $w = $dtts->format("w");
+ } else {
+ $w = adodb_strftime('%w', $timetouse, $to_gmt); // If to_gmt = false then adodb_strftime use TZ of server
+ }
$dayweek = $outputlangs->transnoentitiesnoconv('Day'.$w);
+
$ret = str_replace('__A__', $dayweek, $ret);
$ret = str_replace('__a__', dol_substr($dayweek, 0, 3), $ret);
}
@@ -2714,7 +2807,6 @@ function dol_print_date($time, $format = '', $tzoutput = 'auto', $outputlangs =
*/
function dol_getdate($timestamp, $fast = false, $forcetimezone = '')
{
- //$datetimeobj = new DateTime('@'.$timestamp);
$datetimeobj = new DateTime();
$datetimeobj->setTimestamp($timestamp); // Use local PHP server timezone
if ($forcetimezone) {
@@ -3189,7 +3281,7 @@ function dol_print_phone($phone, $countrycode = '', $cid = 0, $socid = 0, $addli
global $conf, $user, $langs, $mysoc, $hookmanager;
// Clean phone parameter
- $phone = preg_replace("/[\s.-]/", "", trim($phone));
+ $phone = is_null($phone) ? '' : preg_replace("/[\s.-]/", "", trim($phone));
if (empty($phone)) {
return '';
}
@@ -3385,11 +3477,11 @@ function dol_print_phone($phone, $countrycode = '', $cid = 0, $socid = 0, $addli
}
}
if (!empty($addlink)) { // Link on phone number (+ link to add action if conf->global->AGENDA_ADDACTIONFORPHONE set)
- if ($conf->browser->layout == 'phone' || (!empty($conf->clicktodial->enabled) && !empty($conf->global->CLICKTODIAL_USE_TEL_LINK_ON_PHONE_NUMBERS))) { // If phone or option for, we use link of phone
+ if ($conf->browser->layout == 'phone' || (isModEnabled('clicktodial') && !empty($conf->global->CLICKTODIAL_USE_TEL_LINK_ON_PHONE_NUMBERS))) { // If phone or option for, we use link of phone
$newphoneform = $newphone;
$newphone = '
';
- } elseif (!empty($conf->clicktodial->enabled) && $addlink == 'AC_TEL') { // If click to dial, we use click to dial url
+ } elseif (isModEnabled('clicktodial') && $addlink == 'AC_TEL') { // If click to dial, we use click to dial url
if (empty($user->clicktodial_loaded)) {
$user->fetch_clicktodial();
}
@@ -3752,6 +3844,27 @@ function isValidPhone($phone)
}
+/**
+ * Return first letters of a strings.
+ * Example with nbofchar=1: 'ghi' will return 'g' but 'abc def' will return 'ad'
+ * Example with nbofchar=2: 'ghi' will return 'gh' but 'abc def' will return 'abde'
+ *
+ * @param string $s String to truncate
+ * @param int $nbofchar Nb of characters to keep
+ * @return string Return first chars.
+ */
+function dolGetFirstLetters($s, $nbofchar = 1)
+{
+ $ret = '';
+ $tmparray = explode(' ', $s);
+ foreach ($tmparray as $tmps) {
+ $ret .= dol_substr($tmps, 0, $nbofchar);
+ }
+
+ return $ret;
+}
+
+
/**
* Make a strlen call. Works even if mbstring module not enabled
*
@@ -3761,6 +3874,10 @@ function isValidPhone($phone)
*/
function dol_strlen($string, $stringencoding = 'UTF-8')
{
+ if (is_null($string)) {
+ return 0;
+ }
+
if (function_exists('mb_strlen')) {
return mb_strlen($string, $stringencoding);
} else {
@@ -3987,10 +4104,10 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $
'salary', 'shipment', 'state', 'supplier_invoice', 'supplier_invoicea', 'supplier_invoicer', 'supplier_invoiced',
'technic', 'ticket',
'error', 'warning',
- 'recent', 'reception', 'recruitmentcandidature', 'recruitmentjobposition', 'resource', 'recurring','rss',
+ 'recent', 'reception', 'recruitmentcandidature', 'recruitmentjobposition', 'replacement', 'resource', 'recurring','rss',
'shapes', 'square', 'stop-circle', 'supplier', 'supplier_proposal', 'supplier_order', 'supplier_invoice',
'timespent', 'title_setup', 'title_accountancy', 'title_bank', 'title_hrm', 'title_agenda',
- 'uncheck', 'user-cog', 'user-injured', 'user-md', 'vat', 'website', 'workstation', 'webhook', 'world', 'private',
+ 'uncheck', 'url', 'user-cog', 'user-injured', 'user-md', 'vat', 'website', 'workstation', 'webhook', 'world', 'private',
'conferenceorbooth', 'eventorganization'
))) {
$fakey = $pictowithouttext;
@@ -4033,13 +4150,13 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $
'partnership'=>'handshake', 'payment'=>'money-check-alt', 'payment_vat'=>'money-check-alt', 'phoning'=>'phone', 'phoning_mobile'=>'mobile-alt', 'phoning_fax'=>'fax', 'previous'=>'arrow-alt-circle-left', 'printer'=>'print', 'product'=>'cube', 'puce'=>'angle-right',
'recent' => 'question', 'reception'=>'dolly', 'recruitmentjobposition'=>'id-card-alt', 'recruitmentcandidature'=>'id-badge',
'resize'=>'crop', 'supplier_order'=>'dol-order_supplier', 'supplier_proposal'=>'file-signature',
- 'refresh'=>'redo', 'region'=>'map-marked', 'resource'=>'laptop-house', 'recurring'=>'history',
+ 'refresh'=>'redo', 'region'=>'map-marked', 'replacement'=>'exchange-alt', 'resource'=>'laptop-house', 'recurring'=>'history',
'service'=>'concierge-bell',
'state'=>'map-marked-alt', 'security'=>'key', 'salary'=>'wallet', 'shipment'=>'dolly', 'stock'=>'box-open', 'stats' => 'chart-bar', 'split'=>'code-branch', 'stripe'=>'stripe-s',
'supplier'=>'building', 'technic'=>'cogs',
'timespent'=>'clock', 'title_setup'=>'tools', 'title_accountancy'=>'money-check-alt', 'title_bank'=>'university', 'title_hrm'=>'umbrella-beach',
'title_agenda'=>'calendar-alt',
- 'uncheck'=>'times', 'uparrow'=>'share', 'vat'=>'money-check-alt', 'vcard'=>'address-card',
+ 'uncheck'=>'times', 'uparrow'=>'share', 'url'=>'external-link-alt', 'vat'=>'money-check-alt', 'vcard'=>'address-card',
'jabber'=>'comment-o',
'website'=>'globe-americas', 'workstation'=>'pallet', 'webhook'=>'bullseye', 'world'=>'globe', 'private'=>'user-lock',
'conferenceorbooth'=>'chalkboard-teacher', 'eventorganization'=>'project-diagram'
@@ -5555,8 +5672,8 @@ function vatrate($rate, $addpercent = false, $info_bits = 0, $usestarfornpr = 0,
* @param integer $form Type of format, HTML or not (not by default)
* @param Translate|string $outlangs Object langs for output. '' use default lang. 'none' use international separators.
* @param int $trunc 1=Truncate if there is more decimals than MAIN_MAX_DECIMALS_SHOWN (default), 0=Does not truncate. Deprecated because amount are rounded (to unit or total amount accurancy) before beeing inserted into database or after a computation, so this parameter should be useless.
- * @param int $rounding Minimum number of decimal to show. If 0, no change, if -1, we use min($conf->global->MAIN_MAX_DECIMALS_UNIT,$conf->global->MAIN_MAX_DECIMALS_TOT)
- * @param int $forcerounding Force the number of decimal to forcerounding decimal (-1=do not force)
+ * @param int $rounding MINIMUM number of decimal to show. 0=no change, -1=we use min($conf->global->MAIN_MAX_DECIMALS_UNIT,$conf->global->MAIN_MAX_DECIMALS_TOT)
+ * @param int|string $forcerounding Force the MAXIMUM of decimal to forcerounding decimal (-1=no change, 'MU' or 'MT' or numeric to round to MU or MT or to a given number of decimal)
* @param string $currency_code To add currency symbol (''=add nothing, 'auto'=Use default currency, 'XXX'=add currency symbols for XXX currency)
* @return string String with formated amount
*
@@ -5627,8 +5744,14 @@ function price($amount, $form = 0, $outlangs = '', $trunc = 1, $rounding = -1, $
}
// If force rounding
- if ($forcerounding >= 0) {
- $nbdecimal = $forcerounding;
+ if ((string) $forcerounding != '-1') {
+ if ($forcerounding == 'MU') {
+ $nbdecimal = $conf->global->MAIN_MAX_DECIMALS_UNIT;
+ } elseif ($forcerounding == 'MT') {
+ $nbdecimal = $conf->global->MAIN_MAX_DECIMALS_TOT;
+ } elseif ($forcerounding >= 0) {
+ $nbdecimal = $forcerounding;
+ }
}
// Format number
@@ -5686,6 +5809,11 @@ function price2num($amount, $rounding = '', $option = 0)
{
global $langs, $conf;
+ // Clean parameters
+ if (is_null($amount)) {
+ $amount = '';
+ }
+
// Round PHP function does not allow number like '1,234.56' nor '1.234,56' nor '1 234,56'
// Numbers must be '1234.56'
// Decimal delimiter for PHP and database SQL requests must be '.'
@@ -6371,7 +6499,7 @@ function get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer,
// Si le (pays vendeur = pays acheteur) alors la TVA par defaut=TVA du produit vendu. Fin de regle.
if (($seller_country_code == $buyer_country_code)
- || (in_array($seller_country_code, array('FR,MC')) && in_array($buyer_country_code, array('FR', 'MC')))) { // Warning ->country_code not always defined
+ || (in_array($seller_country_code, array('FR', 'MC')) && in_array($buyer_country_code, array('FR', 'MC')))) { // Warning ->country_code not always defined
//print 'VATRULE 2';
return get_product_vat_for_country($idprod, $thirdparty_seller, $idprodfournprice);
}
@@ -6581,7 +6709,7 @@ function get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart = '
$path = '';
$arrayforoldpath = array('cheque', 'category', 'holiday', 'supplier_invoice', 'invoice_supplier', 'mailing', 'supplier_payment');
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
$arrayforoldpath[] = 'product';
}
if (!empty($level) && in_array($modulepart, $arrayforoldpath)) {
@@ -6717,6 +6845,10 @@ function picto_required()
*/
function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto = 'UTF-8', $strip_tags = 0, $removedoublespaces = 1)
{
+ if (is_null($stringtoclean)) {
+ return '';
+ }
+
if ($removelinefeed == 2) {
$stringtoclean = preg_replace('/ ]*>(\n|\r)+/ims', ' ', $stringtoclean);
}
@@ -7019,6 +7151,10 @@ function dol_nl2br($stringtoencode, $nl2brmode = 0, $forxml = false)
*/
function dol_htmlentitiesbr($stringtoencode, $nl2brmode = 0, $pagecodefrom = 'UTF-8', $removelasteolbr = 1)
{
+ if (is_null($stringtoencode)) {
+ return '';
+ }
+
$newstring = $stringtoencode;
if (dol_textishtml($stringtoencode)) { // Check if text is already HTML or not
$newstring = preg_replace('/ /i', ' ', $newstring); // Replace " " by " ". It's same and avoid pb with FPDF.
@@ -7213,6 +7349,10 @@ function dol_nboflines_bis($text, $maxlinesize = 0, $charset = 'UTF-8')
*/
function dol_textishtml($msg, $option = 0)
{
+ if (is_null($msg)) {
+ return false;
+ }
+
if ($option == 1) {
if (preg_match('/projet) ? $object->projet->ref : '');
$substitutionarray['__PROJECT_NAME__'] = (is_object($object->projet) ? $object->projet->title : '');
}
+ if (is_object($object) && $object->element == 'project') {
+ $substitutionarray['__PROJECT_NAME__'] = $object->title;
+ }
if (is_object($object) && $object->element == 'shipping') {
$substitutionarray['__SHIPPINGTRACKNUM__'] = $object->tracking_number;
@@ -7685,6 +7828,9 @@ function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude = null,
if (is_object($object) && $object->element == 'contrat') {
$typeforonlinepayment = 'contract';
}
+ if (is_object($object) && $object->element == 'fichinter') {
+ $typeforonlinepayment = 'ficheinter';
+ }
$url = getOnlinePaymentUrl(0, $typeforonlinepayment, $substitutionarray['__REF__']);
$paymenturl = $url;
}
@@ -7717,6 +7863,11 @@ function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude = null,
} else {
$substitutionarray['__DIRECTDOWNLOAD_URL_CONTRACT__'] = '';
}
+ if (!empty($conf->global->FICHINTER_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element == 'fichinter') {
+ $substitutionarray['__DIRECTDOWNLOAD_URL_FICHINTER__'] = $object->getLastMainDocLink($object->element);
+ } else {
+ $substitutionarray['__DIRECTDOWNLOAD_URL_FICHINTER__'] = '';
+ }
if (!empty($conf->global->SUPPLIER_PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element == 'supplier_proposal') {
$substitutionarray['__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] = $object->getLastMainDocLink($object->element);
} else {
@@ -7735,6 +7886,9 @@ function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude = null,
if (is_object($object) && $object->element == 'contrat') {
$substitutionarray['__URL_CONTRACT__'] = DOL_MAIN_URL_ROOT."/contrat/card.php?id=".$object->id;
}
+ if (is_object($object) && $object->element == 'fichinter') {
+ $substitutionarray['__URL_FICHINTER__'] = DOL_MAIN_URL_ROOT."/fichinter/card.php?id=".$object->id;
+ }
if (is_object($object) && $object->element == 'supplier_proposal') {
$substitutionarray['__URL_SUPPLIER_PROPOSAL__'] = DOL_MAIN_URL_ROOT."/supplier_proposal/card.php?id=".$object->id;
}
@@ -8053,7 +8207,7 @@ function print_date_range($date_start, $date_end, $format = '', $outputlangs = '
*
* @param int $date_start Start date
* @param int $date_end End date
- * @param string $format Output format
+ * @param string $format Output date format ('day', 'dayhour', ...)
* @param Translate $outputlangs Output language
* @param integer $withparenthesis 1=Add parenthesis, 0=no parenthesis
* @return string String
@@ -8618,8 +8772,6 @@ function verifCond($strToEvaluate)
//print $strToEvaluate." \n";
$rights = true;
if (isset($strToEvaluate) && $strToEvaluate !== '') {
- //$str = 'if(!('.$strToEvaluate.')) $rights = false;';
- //dol_eval($str, 0, 1, '2'); // The dol_eval must contains all the global $xxx used into a condition
//var_dump($strToEvaluate);
$rep = dol_eval($strToEvaluate, 1, 1, '1'); // The dol_eval must contains all the global $xxx for all variables $xxx found into the string condition
$rights = $rep && (!is_string($rep) || strpos($rep, 'Bad string syntax to evaluate') === false);
@@ -8635,7 +8787,7 @@ function verifCond($strToEvaluate)
* @param string $s String to evaluate
* @param int $returnvalue 0=No return (used to execute eval($a=something)). 1=Value of eval is returned (used to eval($something)).
* @param int $hideerrors 1=Hide errors
- * @param string $onlysimplestring 0=Accept all chars, 1=Accept only simple string with char 'a-z0-9\s^$_+-.*\/>&|=!?():"\',/';', 2=Accept also ';[]'
+ * @param string $onlysimplestring '0' (used for computed property of extrafields)=Accept all chars, '1' (most common use)=Accept only simple string with char 'a-z0-9\s^$_+-.*>&|=!?():"\',/@';', '2' (not used)=Accept also ';[]'
* @return mixed Nothing or return result of eval
*/
function dol_eval($s, $returnvalue = 0, $hideerrors = 1, $onlysimplestring = '1')
@@ -8653,8 +8805,8 @@ function dol_eval($s, $returnvalue = 0, $hideerrors = 1, $onlysimplestring = '1'
// Test on dangerous char (used for RCE), we allow only characters to make PHP variable testing
if ($onlysimplestring == '1') {
// We must accept: '1 && getDolGlobalInt("doesnotexist1") && $conf->global->MAIN_FEATURES_LEVEL'
- // We must accept: '$conf->barcode->enabled && preg_match(\'/^(AAA|BBB)/\',$leftmenu)'
- // We must accept: '$user->rights->cabinetmed->read && $object->canvas=="patient@cabinetmed"'
+ // We must accept: '$conf->barcode->enabled || preg_match(\'/^AAA/\',$leftmenu)'
+ // We must accept: '$user->rights->cabinetmed->read && !$object->canvas=="patient@cabinetmed"'
if (preg_match('/[^a-z0-9\s'.preg_quote('^$_+-.*>&|=!?():"\',/@', '/').']/i', $s)) {
if ($returnvalue) {
return 'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s;
@@ -8662,7 +8814,8 @@ function dol_eval($s, $returnvalue = 0, $hideerrors = 1, $onlysimplestring = '1'
dol_syslog('Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s);
return '';
}
- // TODO We can exclude all () that is not '($db)' and 'getDolGlobalInt(' and 'getDolGlobalString(' and 'preg_match('
+ // TODO
+ // We can exclude all parenthesis ( that are not '($db' and 'getDolGlobalInt(' and 'getDolGlobalString(' and 'preg_match(' and 'isModEnabled('
// ...
}
} elseif ($onlysimplestring == '2') {
@@ -8705,7 +8858,7 @@ function dol_eval($s, $returnvalue = 0, $hideerrors = 1, $onlysimplestring = '1'
$forbiddenphpstrings = array('$$');
$forbiddenphpstrings = array_merge($forbiddenphpstrings, array('_ENV', '_SESSION', '_COOKIE', '_GET', '_POST', '_REQUEST'));
- $forbiddenphpfunctions = array("exec", "passthru", "shell_exec", "system", "proc_open", "popen", "eval", "dol_eval", "executeCLI", 'verifCond');
+ $forbiddenphpfunctions = array("exec", "passthru", "shell_exec", "system", "proc_open", "popen", "eval", "dol_eval", "executeCLI", "verifCond", "base64_decode");
$forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array("fopen", "file_put_contents", "fputs", "fputscsv", "fwrite", "fpassthru", "require", "include", "mkdir", "rmdir", "symlink", "touch", "unlink", "umask"));
$forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array("function", "call_user_func"));
@@ -9043,10 +9196,10 @@ function getLanguageCodeFromCountryCode($countrycode)
* @param string $type Value for object where objectvalue can be
* 'thirdparty' to add a tab in third party view
* 'intervention' to add a tab in intervention view
- * 'supplier_order' to add a tab in supplier order view
- * 'supplier_invoice' to add a tab in supplier invoice view
- * 'invoice' to add a tab in customer invoice view
- * 'order' to add a tab in customer order view
+ * 'supplier_order' to add a tab in purchase order view
+ * 'supplier_invoice' to add a tab in purchase invoice view
+ * 'invoice' to add a tab in sales invoice view
+ * 'order' to add a tab in sales order view
* 'contract' to add a tabl in contract view
* 'product' to add a tab in product view
* 'propal' to add a tab in propal view
@@ -10471,7 +10624,7 @@ function dolGetStatus($statusLabel = '', $statusLabelShort = '', $html = '', $st
* @param array $params = [ // Various params for future : recommended rather than adding more function arguments
* 'attr' => [ // to add or override button attributes
* 'xxxxx' => '', // your xxxxx attribute you want
- * 'class' => '', // to add more css class to the button class attribute
+ * 'class' => 'reposition', // to add more css class to the button class attribute
* 'classOverride' => '' // to replace class attribute of the button
* ],
* 'confirm' => [
@@ -10518,7 +10671,7 @@ function dolGetButtonAction($label, $text = '', $actionType = 'default', $url =
if (empty($userRight)) {
$attr['class'] = 'butActionRefused';
$attr['href'] = '';
- $attr['title'] = $langs->trans('NotEnoughPermissions');
+ $attr['title'] = (($label && $text && $label != $text) ? $label : $langs->trans('NotEnoughPermissions'));
}
if (!empty($id)) {
@@ -10574,7 +10727,7 @@ function dolGetButtonAction($label, $text = '', $actionType = 'default', $url =
$TCompiledAttr = array();
foreach ($attr as $key => $value) {
- $TCompiledAttr[] = $key.'="'.$value.'"';
+ $TCompiledAttr[] = $key.'= "'.$value.'"';
}
$compiledAttributes = empty($TCompiledAttr) ? '' : implode(' ', $TCompiledAttr);
@@ -11260,3 +11413,721 @@ function dolForgeCriteriaCallback($matches)
return $db->escape($operand).' '.$db->escape($operator)." ".$tmpescaped;
}
+
+
+
+/**
+ * Get timeline icon
+ * @param ActionComm $actionstatic actioncomm
+ * @param array $histo histo
+ * @param int $key key
+ * @return string
+ */
+function getTimelineIcon($actionstatic, &$histo, $key)
+{
+ global $conf, $langs;
+ $out = ''."\n";
+ $iconClass = 'fa fa-comments';
+ $img_picto = '';
+ $colorClass = '';
+ $pictoTitle = '';
+
+ if ($histo[$key]['percent'] == -1) {
+ $colorClass = 'timeline-icon-not-applicble';
+ $pictoTitle = $langs->trans('StatusNotApplicable');
+ } elseif ($histo[$key]['percent'] == 0) {
+ $colorClass = 'timeline-icon-todo';
+ $pictoTitle = $langs->trans('StatusActionToDo').' (0%)';
+ } elseif ($histo[$key]['percent'] > 0 && $histo[$key]['percent'] < 100) {
+ $colorClass = 'timeline-icon-in-progress';
+ $pictoTitle = $langs->trans('StatusActionInProcess').' ('.$histo[$key]['percent'].'%)';
+ } elseif ($histo[$key]['percent'] >= 100) {
+ $colorClass = 'timeline-icon-done';
+ $pictoTitle = $langs->trans('StatusActionDone').' (100%)';
+ }
+
+ if ($actionstatic->code == 'AC_TICKET_CREATE') {
+ $iconClass = 'fa fa-ticket';
+ } elseif ($actionstatic->code == 'AC_TICKET_MODIFY') {
+ $iconClass = 'fa fa-pencilxxx';
+ } elseif ($actionstatic->code == 'TICKET_MSG') {
+ $iconClass = 'fa fa-comments';
+ } elseif ($actionstatic->code == 'TICKET_MSG_PRIVATE') {
+ $iconClass = 'fa fa-mask';
+ } elseif (!empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
+ if ($actionstatic->type_picto) {
+ $img_picto = img_picto('', $actionstatic->type_picto);
+ } else {
+ if ($actionstatic->type_code == 'AC_RDV') {
+ $iconClass = 'fa fa-handshake';
+ } elseif ($actionstatic->type_code == 'AC_TEL') {
+ $iconClass = 'fa fa-phone';
+ } elseif ($actionstatic->type_code == 'AC_FAX') {
+ $iconClass = 'fa fa-fax';
+ } elseif ($actionstatic->type_code == 'AC_EMAIL') {
+ $iconClass = 'fa fa-envelope';
+ } elseif ($actionstatic->type_code == 'AC_INT') {
+ $iconClass = 'fa fa-shipping-fast';
+ } elseif ($actionstatic->type_code == 'AC_OTH_AUTO') {
+ $iconClass = 'fa fa-robot';
+ } elseif (!preg_match('/_AUTO/', $actionstatic->type_code)) {
+ $iconClass = 'fa fa-robot';
+ }
+ }
+ }
+
+ $out .= ''.$img_picto.' '."\n";
+ return $out;
+}
+
+/**
+ * getActionCommEcmList
+ *
+ * @param ActionComm $object Object ActionComm
+ * @return array Array of documents in index table
+ */
+function getActionCommEcmList($object)
+{
+ global $conf, $db;
+
+ $documents = array();
+
+ $sql = 'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename';
+ $sql .= ' FROM '.MAIN_DB_PREFIX.'ecm_files ecm';
+ $sql .= " WHERE ecm.filepath = 'agenda/".((int) $object->id)."'";
+ //$sql.= " ecm.src_object_type = '".$db->escape($object->element)."' AND ecm.src_object_id = ".((int) $object->id); // Old version didn't add object_type during upload
+ $sql .= ' ORDER BY ecm.position ASC';
+
+ $resql = $db->query($sql);
+ if ($resql) {
+ if ($db->num_rows($resql)) {
+ while ($obj = $db->fetch_object($resql)) {
+ $documents[$obj->id] = $obj;
+ }
+ }
+ }
+
+ return $documents;
+}
+
+
+
+/**
+ * Show html area with actions in messaging format.
+ * Note: Global parameter $param must be defined.
+ *
+ * @param Conf $conf Object conf
+ * @param Translate $langs Object langs
+ * @param DoliDB $db Object db
+ * @param mixed $filterobj Filter on object Adherent|Societe|Project|Product|CommandeFournisseur|Dolresource|Ticket|... to list events linked to an object
+ * @param Contact $objcon Filter on object contact to filter events on a contact
+ * @param int $noprint Return string but does not output it
+ * @param string $actioncode Filter on actioncode
+ * @param string $donetodo Filter on event 'done' or 'todo' or ''=nofilter (all).
+ * @param array $filters Filter on other fields
+ * @param string $sortfield Sort field
+ * @param string $sortorder Sort order
+ * @return string|void Return html part or void if noprint is 1
+ */
+function show_actions_messaging($conf, $langs, $db, $filterobj, $objcon = '', $noprint = 0, $actioncode = '', $donetodo = 'done', $filters = array(), $sortfield = 'a.datep,a.id', $sortorder = 'DESC')
+{
+ global $user, $conf;
+ global $form;
+
+ global $param, $massactionbutton;
+
+ dol_include_once('/comm/action/class/actioncomm.class.php');
+
+ // Check parameters
+ if (!is_object($filterobj) && !is_object($objcon)) {
+ dol_print_error('', 'BadParameter');
+ }
+
+ $histo = array();
+ $numaction = 0;
+ $now = dol_now();
+
+ $sortfield_list = explode(',', $sortfield);
+ $sortfield_label_list = array('a.id' => 'id', 'a.datep' => 'dp', 'a.percent' => 'percent');
+ $sortfield_new_list = array();
+ foreach ($sortfield_list as $sortfield_value) {
+ $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
+ }
+ $sortfield_new = implode(',', $sortfield_new_list);
+
+ if (isModEnabled('agenda')) {
+ // Search histo on actioncomm
+ if (is_object($objcon) && $objcon->id > 0) {
+ $sql = "SELECT DISTINCT a.id, a.label as label,";
+ } else {
+ $sql = "SELECT a.id, a.label as label,";
+ }
+ $sql .= " a.datep as dp,";
+ $sql .= " a.note as message,";
+ $sql .= " a.datep2 as dp2,";
+ $sql .= " a.percent as percent, 'action' as type,";
+ $sql .= " a.fk_element, a.elementtype,";
+ $sql .= " a.fk_contact,";
+ $sql .= " c.code as acode, c.libelle as alabel, c.picto as apicto,";
+ $sql .= " u.rowid as user_id, u.login as user_login, u.photo as user_photo, u.firstname as user_firstname, u.lastname as user_lastname";
+ if (is_object($filterobj) && get_class($filterobj) == 'Societe') {
+ $sql .= ", sp.lastname, sp.firstname";
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
+ $sql .= ", m.lastname, m.firstname";
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
+ $sql .= ", o.ref";
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
+ $sql .= ", o.ref";
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
+ $sql .= ", o.ref";
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') {
+ $sql .= ", o.ref";
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'Contrat') {
+ $sql .= ", o.ref";
+ }
+ $sql .= " FROM ".MAIN_DB_PREFIX."actioncomm as a";
+ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on u.rowid = a.fk_user_action";
+ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_actioncomm as c ON a.fk_action = c.id";
+
+ $force_filter_contact = false;
+ if (is_object($objcon) && $objcon->id > 0) {
+ $force_filter_contact = true;
+ $sql .= " INNER JOIN ".MAIN_DB_PREFIX."actioncomm_resources as r ON a.id = r.fk_actioncomm";
+ $sql .= " AND r.element_type = '".$db->escape($objcon->table_element)."' AND r.fk_element = ".((int) $objcon->id);
+ }
+
+ if (is_object($filterobj) && get_class($filterobj) == 'Societe') {
+ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as sp ON a.fk_contact = sp.rowid";
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'Dolresource') {
+ $sql .= " INNER JOIN ".MAIN_DB_PREFIX."element_resources as er";
+ $sql .= " ON er.resource_type = 'dolresource'";
+ $sql .= " AND er.element_id = a.id";
+ $sql .= " AND er.resource_id = ".((int) $filterobj->id);
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
+ $sql .= ", ".MAIN_DB_PREFIX."adherent as m";
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
+ $sql .= ", ".MAIN_DB_PREFIX."commande_fournisseur as o";
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
+ $sql .= ", ".MAIN_DB_PREFIX."product as o";
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
+ $sql .= ", ".MAIN_DB_PREFIX."ticket as o";
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') {
+ $sql .= ", ".MAIN_DB_PREFIX."bom_bom as o";
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'Contrat') {
+ $sql .= ", ".MAIN_DB_PREFIX."contrat as o";
+ }
+
+ $sql .= " WHERE a.entity IN (".getEntity('agenda').")";
+ if ($force_filter_contact === false) {
+ if (is_object($filterobj) && in_array(get_class($filterobj), array('Societe', 'Client', 'Fournisseur')) && $filterobj->id) {
+ $sql .= " AND a.fk_soc = ".((int) $filterobj->id);
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'Project' && $filterobj->id) {
+ $sql .= " AND a.fk_project = ".((int) $filterobj->id);
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
+ $sql .= " AND a.fk_element = m.rowid AND a.elementtype = 'member'";
+ if ($filterobj->id) {
+ $sql .= " AND a.fk_element = ".((int) $filterobj->id);
+ }
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
+ $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
+ if ($filterobj->id) {
+ $sql .= " AND a.fk_element = ".((int) $filterobj->id);
+ }
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
+ $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'product'";
+ if ($filterobj->id) {
+ $sql .= " AND a.fk_element = ".((int) $filterobj->id);
+ }
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
+ $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
+ if ($filterobj->id) {
+ $sql .= " AND a.fk_element = ".((int) $filterobj->id);
+ }
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') {
+ $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
+ if ($filterobj->id) {
+ $sql .= " AND a.fk_element = ".((int) $filterobj->id);
+ }
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'Contrat') {
+ $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
+ if ($filterobj->id) {
+ $sql .= " AND a.fk_element = ".((int) $filterobj->id);
+ }
+ }
+ }
+
+ // Condition on actioncode
+ if (!empty($actioncode)) {
+ if (empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
+ if ($actioncode == 'AC_NON_AUTO') {
+ $sql .= " AND c.type != 'systemauto'";
+ } elseif ($actioncode == 'AC_ALL_AUTO') {
+ $sql .= " AND c.type = 'systemauto'";
+ } else {
+ if ($actioncode == 'AC_OTH') {
+ $sql .= " AND c.type != 'systemauto'";
+ } elseif ($actioncode == 'AC_OTH_AUTO') {
+ $sql .= " AND c.type = 'systemauto'";
+ }
+ }
+ } else {
+ if ($actioncode == 'AC_NON_AUTO') {
+ $sql .= " AND c.type != 'systemauto'";
+ } elseif ($actioncode == 'AC_ALL_AUTO') {
+ $sql .= " AND c.type = 'systemauto'";
+ } else {
+ $sql .= " AND c.code = '".$db->escape($actioncode)."'";
+ }
+ }
+ }
+ if ($donetodo == 'todo') {
+ $sql .= " AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now)."'))";
+ } elseif ($donetodo == 'done') {
+ $sql .= " AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now)."'))";
+ }
+ if (is_array($filters) && $filters['search_agenda_label']) {
+ $sql .= natural_search('a.label', $filters['search_agenda_label']);
+ }
+ }
+
+ // Add also event from emailings. TODO This should be replaced by an automatic event ? May be it's too much for very large emailing.
+ if (isModEnabled('mailing') && !empty($objcon->email)
+ && (empty($actioncode) || $actioncode == 'AC_OTH_AUTO' || $actioncode == 'AC_EMAILING')) {
+ $langs->load("mails");
+
+ $sql2 = "SELECT m.rowid as id, m.titre as label, mc.date_envoi as dp, mc.date_envoi as dp2, '100' as percent, 'mailing' as type";
+ $sql2 .= ", null as fk_element, '' as elementtype, null as contact_id";
+ $sql2 .= ", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
+ $sql2 .= ", u.rowid as user_id, u.login as user_login, u.photo as user_photo, u.firstname as user_firstname, u.lastname as user_lastname"; // User that valid action
+ if (is_object($filterobj) && get_class($filterobj) == 'Societe') {
+ $sql2 .= ", '' as lastname, '' as firstname";
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
+ $sql2 .= ", '' as lastname, '' as firstname";
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
+ $sql2 .= ", '' as ref";
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
+ $sql2 .= ", '' as ref";
+ } elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
+ $sql2 .= ", '' as ref";
+ }
+ $sql2 .= " FROM ".MAIN_DB_PREFIX."mailing as m, ".MAIN_DB_PREFIX."mailing_cibles as mc, ".MAIN_DB_PREFIX."user as u";
+ $sql2 .= " WHERE mc.email = '".$db->escape($objcon->email)."'"; // Search is done on email.
+ $sql2 .= " AND mc.statut = 1";
+ $sql2 .= " AND u.rowid = m.fk_user_valid";
+ $sql2 .= " AND mc.fk_mailing=m.rowid";
+ }
+
+ if (!empty($sql) && !empty($sql2)) {
+ $sql = $sql." UNION ".$sql2;
+ } elseif (empty($sql) && !empty($sql2)) {
+ $sql = $sql2;
+ }
+
+ // TODO Add limit in nb of results
+ if ($sql) { // May not be defined if module Agenda is not enabled and mailing module disabled too
+ $sql .= $db->order($sortfield_new, $sortorder);
+
+ dol_syslog("function.lib::show_actions_messaging", LOG_DEBUG);
+ $resql = $db->query($sql);
+ if ($resql) {
+ $i = 0;
+ $num = $db->num_rows($resql);
+
+ while ($i < $num) {
+ $obj = $db->fetch_object($resql);
+
+ if ($obj->type == 'action') {
+ $contactaction = new ActionComm($db);
+ $contactaction->id = $obj->id;
+ $result = $contactaction->fetchResources();
+ if ($result < 0) {
+ dol_print_error($db);
+ setEventMessage("actions.lib::show_actions_messaging Error fetch ressource", 'errors');
+ }
+
+ //if ($donetodo == 'todo') $sql.= " AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now)."'))";
+ //elseif ($donetodo == 'done') $sql.= " AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now)."'))";
+ $tododone = '';
+ if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->datep > $now)) {
+ $tododone = 'todo';
+ }
+
+ $histo[$numaction] = array(
+ 'type'=>$obj->type,
+ 'tododone'=>$tododone,
+ 'id'=>$obj->id,
+ 'datestart'=>$db->jdate($obj->dp),
+ 'dateend'=>$db->jdate($obj->dp2),
+ 'note'=>$obj->label,
+ 'message'=>$obj->message,
+ 'percent'=>$obj->percent,
+
+ 'userid'=>$obj->user_id,
+ 'login'=>$obj->user_login,
+ 'userfirstname'=>$obj->user_firstname,
+ 'userlastname'=>$obj->user_lastname,
+ 'userphoto'=>$obj->user_photo,
+
+ 'contact_id'=>$obj->fk_contact,
+ 'socpeopleassigned' => $contactaction->socpeopleassigned,
+ 'lastname'=>$obj->lastname,
+ 'firstname'=>$obj->firstname,
+ 'fk_element'=>$obj->fk_element,
+ 'elementtype'=>$obj->elementtype,
+ // Type of event
+ 'acode'=>$obj->acode,
+ 'alabel'=>$obj->alabel,
+ 'libelle'=>$obj->alabel, // deprecated
+ 'apicto'=>$obj->apicto
+ );
+ } else {
+ $histo[$numaction] = array(
+ 'type'=>$obj->type,
+ 'tododone'=>'done',
+ 'id'=>$obj->id,
+ 'datestart'=>$db->jdate($obj->dp),
+ 'dateend'=>$db->jdate($obj->dp2),
+ 'note'=>$obj->label,
+ 'message'=>$obj->message,
+ 'percent'=>$obj->percent,
+ 'acode'=>$obj->acode,
+
+ 'userid'=>$obj->user_id,
+ 'login'=>$obj->user_login,
+ 'userfirstname'=>$obj->user_firstname,
+ 'userlastname'=>$obj->user_lastname,
+ 'userphoto'=>$obj->user_photo
+ );
+ }
+
+ $numaction++;
+ $i++;
+ }
+ } else {
+ dol_print_error($db);
+ }
+ }
+
+ // Set $out to show events
+ $out = '';
+
+ if (!isModEnabled('agenda')) {
+ $langs->loadLangs(array("admin", "errors"));
+ $out = info_admin($langs->trans("WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv("Module2400Name")), 0, 0, 'warning');
+ }
+
+ if (isModEnabled('agenda') || (isModEnabled('mailing') && !empty($objcon->email))) {
+ $delay_warning = $conf->global->MAIN_DELAY_ACTIONS_TODO * 24 * 60 * 60;
+
+ require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
+ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
+ require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
+
+ $formactions = new FormActions($db);
+
+ $actionstatic = new ActionComm($db);
+ $userstatic = new User($db);
+ $contactstatic = new Contact($db);
+ $userGetNomUrlCache = array();
+
+ $out .= '';
+ $out .= '
';
+ $out .= ' ';
+
+ if ($objcon && get_class($objcon) == 'Contact' &&
+ (is_null($filterobj) || get_class($filterobj) == 'Societe')) {
+ $out .= ' ';
+ } else {
+ $out .= ' ';
+ }
+ if ($filterobj && get_class($filterobj) == 'Societe') {
+ $out .= ' ';
+ }
+
+ $out .= "\n";
+
+ $out .= '';
+ $out .= '
';
+
+ $out .= '';
+
+ $out .= getTitleFieldOfList('Date', 0, $_SERVER["PHP_SELF"], 'a.datep', '', $param, '', $sortfield, $sortorder, '')."\n";
+
+ $out .= ''.$langs->trans("Search").' : ';
+ if ($donetodo) {
+ $out .= ' ';
+ }
+ $out .= '';
+ $out .= ' ';
+ //$out .= img_picto($langs->trans("Type"), 'type');
+ $out .= $formactions->select_type_actions($actioncode, "actioncode", '', empty($conf->global->AGENDA_USE_EVENT_TYPE) ? 1 : -1, 0, 0, 1, 'minwidth200imp');
+ $out .= ' ';
+ $out .= '';
+ $out .= ' ';
+ $out .= ' ';
+
+ $out .= '';
+ $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0, 'checkforselect', 1);
+ $out .= $searchpicto;
+ $out .= ' ';
+ $out .= ' ';
+
+
+ $out .= '
';
+
+ $out .= '';
+ $out .= '
';
+
+ $out .= "\n";
+
+ $out .= '';
+
+ if ($donetodo) {
+ $tmp = '';
+ if (get_class($filterobj) == 'Societe') {
+ $tmp .= '';
+ }
+ $tmp .= ($donetodo != 'done' ? $langs->trans("ActionsToDoShort") : '');
+ $tmp .= ($donetodo != 'done' && $donetodo != 'todo' ? ' / ' : '');
+ $tmp .= ($donetodo != 'todo' ? $langs->trans("ActionsDoneShort") : '');
+ //$out.=$langs->trans("ActionsToDoShort").' / '.$langs->trans("ActionsDoneShort");
+ if (get_class($filterobj) == 'Societe') {
+ $tmp .= ' ';
+ }
+ $out .= getTitleFieldOfList($tmp);
+ }
+
+
+ //require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php';
+ //$caction=new CActionComm($db);
+ //$arraylist=$caction->liste_array(1, 'code', '', (empty($conf->global->AGENDA_USE_EVENT_TYPE)?1:0), '', 1);
+
+ $actualCycleDate = false;
+
+ // Loop on each event to show it
+ foreach ($histo as $key => $value) {
+ $actionstatic->fetch($histo[$key]['id']); // TODO Do we need this, we already have a lot of data of line into $histo
+
+ $actionstatic->type_picto = $histo[$key]['apicto'];
+ $actionstatic->type_code = $histo[$key]['acode'];
+
+ $url = DOL_URL_ROOT.'/comm/action/card.php?id='.$histo[$key]['id'];
+
+ $tmpa = dol_getdate($histo[$key]['datestart'], false);
+ if ($actualCycleDate !== $tmpa['year'].'-'.$tmpa['yday']) {
+ $actualCycleDate = $tmpa['year'].'-'.$tmpa['yday'];
+ $out .= '';
+ $out .= '';
+ $out .= '';
+ $out .= dol_print_date($histo[$key]['datestart'], 'daytext', 'tzuserrel', $langs);
+ $out .= ' ';
+ $out .= ' ';
+ $out .= '';
+ }
+
+
+ $out .= ''."\n";
+ $out .= '';
+
+ $out .= getTimelineIcon($actionstatic, $histo, $key);
+
+ $out .= ''."\n";
+
+ $out .= '';
+ // Date
+ $out .= '
';
+ $out .= dol_print_date($histo[$key]['datestart'], 'dayhour', 'tzuserrel');
+ if ($histo[$key]['dateend'] && $histo[$key]['dateend'] != $histo[$key]['datestart']) {
+ $tmpa = dol_getdate($histo[$key]['datestart'], true);
+ $tmpb = dol_getdate($histo[$key]['dateend'], true);
+ if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
+ $out .= '-'.dol_print_date($histo[$key]['dateend'], 'hour', 'tzuserrel');
+ } else {
+ $out .= '-'.dol_print_date($histo[$key]['dateend'], 'dayhour', 'tzuserrel');
+ }
+ }
+ $late = 0;
+ if ($histo[$key]['percent'] == 0 && $histo[$key]['datestart'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
+ $late = 1;
+ }
+ if ($histo[$key]['percent'] == 0 && !$histo[$key]['datestart'] && $histo[$key]['dateend'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
+ $late = 1;
+ }
+ if ($histo[$key]['percent'] > 0 && $histo[$key]['percent'] < 100 && $histo[$key]['dateend'] && $histo[$key]['dateend'] < ($now - $delay_warning)) {
+ $late = 1;
+ }
+ if ($histo[$key]['percent'] > 0 && $histo[$key]['percent'] < 100 && !$histo[$key]['dateend'] && $histo[$key]['datestart'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
+ $late = 1;
+ }
+ if ($late) {
+ $out .= img_warning($langs->trans("Late")).' ';
+ }
+ $out .= "\n";
+
+ // Ref
+ $out .= '';
+
+ if (!empty($histo[$key]['message'])
+ && $actionstatic->code != 'AC_TICKET_CREATE'
+ && $actionstatic->code != 'AC_TICKET_MODIFY'
+ ) {
+ $out .= '
';
+ $out .= $histo[$key]['message'];
+ $out .= '
';
+ }
+
+ // Timeline footer
+ $footer = '';
+
+ // Contact for this action
+ if (isset($histo[$key]['socpeopleassigned']) && is_array($histo[$key]['socpeopleassigned']) && count($histo[$key]['socpeopleassigned']) > 0) {
+ $contactList = '';
+ foreach ($histo[$key]['socpeopleassigned'] as $cid => $Tab) {
+ $contact = new Contact($db);
+ $result = $contact->fetch($cid);
+
+ if ($result < 0) {
+ dol_print_error($db, $contact->error);
+ }
+
+ if ($result > 0) {
+ $contactList .= !empty($contactList) ? ', ' : '';
+ $contactList .= $contact->getNomUrl(1);
+ if (isset($histo[$key]['acode']) && $histo[$key]['acode'] == 'AC_TEL') {
+ if (!empty($contact->phone_pro)) {
+ $contactList .= '('.dol_print_phone($contact->phone_pro).')';
+ }
+ }
+ }
+ }
+
+ $footer .= $langs->trans('ActionOnContact').' : '.$contactList;
+ } elseif (empty($objcon->id) && isset($histo[$key]['contact_id']) && $histo[$key]['contact_id'] > 0) {
+ $contact = new Contact($db);
+ $result = $contact->fetch($histo[$key]['contact_id']);
+
+ if ($result < 0) {
+ dol_print_error($db, $contact->error);
+ }
+
+ if ($result > 0) {
+ $footer .= $contact->getNomUrl(1);
+ if (isset($histo[$key]['acode']) && $histo[$key]['acode'] == 'AC_TEL') {
+ if (!empty($contact->phone_pro)) {
+ $footer .= '('.dol_print_phone($contact->phone_pro).')';
+ }
+ }
+ }
+ }
+
+ $documents = getActionCommEcmList($actionstatic);
+ if (!empty($documents)) {
+ $footer .= '
';
+ foreach ($documents as $doc) {
+ $footer .= '
id.'" ';
+ $footer .= ' data-path="'.$doc->filepath.'"';
+ $footer .= ' data-filename="'.dol_escape_htmltag($doc->filename).'" ';
+ $footer .= '>';
+
+ $filePath = DOL_DATA_ROOT.'/'.$doc->filepath.'/'.$doc->filename;
+ $mime = dol_mimetype($filePath);
+ $file = $actionstatic->id.'/'.$doc->filename;
+ $thumb = $actionstatic->id.'/thumbs/'.substr($doc->filename, 0, strrpos($doc->filename, '.')).'_mini'.substr($doc->filename, strrpos($doc->filename, '.'));
+ $doclink = dol_buildpath('document.php', 1).'?modulepart=actions&attachment=0&file='.urlencode($file).'&entity='.$conf->entity;
+ $viewlink = dol_buildpath('viewimage.php', 1).'?modulepart=actions&file='.urlencode($thumb).'&entity='.$conf->entity;
+
+ $mimeAttr = ' mime="'.$mime.'" ';
+ $class = '';
+ if (in_array($mime, array('image/png', 'image/jpeg', 'application/pdf'))) {
+ $class .= ' documentpreview';
+ }
+
+ $footer .= '';
+ $footer .= img_mime($filePath).' '.$doc->filename;
+ $footer .= ' ';
+
+ $footer .= ' ';
+ }
+ $footer .= '
';
+ }
+
+ if (!empty($footer)) {
+ $out .= '';
+ }
+
+ $out .= '
'."\n"; // end timeline-item
+
+ $out .= ' ';
+ $out .= '';
+
+ $i++;
+ }
+
+ $out .= " \n";
+
+ if (empty($histo)) {
+ $out .= ''.$langs->trans("NoRecordFound").' ';
+ }
+ }
+
+ if ($noprint) {
+ return $out;
+ } else {
+ print $out;
+ }
+}
diff --git a/htdocs/core/lib/functions2.lib.php b/htdocs/core/lib/functions2.lib.php
index 5f497377798..807122144fc 100644
--- a/htdocs/core/lib/functions2.lib.php
+++ b/htdocs/core/lib/functions2.lib.php
@@ -1755,6 +1755,7 @@ function weight_convert($weight, &$from_unit, $to_unit)
* weigh_convert(320, $f, 0) retournera 0.32
*
*/
+ $weight = is_numeric($weight) ? $weight : 0;
while ($from_unit <> $to_unit) {
if ($from_unit > $to_unit) {
$weight = $weight * 10;
@@ -2236,7 +2237,7 @@ function dolGetElementUrl($objectid, $objecttype, $withpicto = 0, $option = '')
$module='facture';
}
- if (!empty($conf->$module->enabled)) {
+ if (isModEnabled($module)) {
$res = dol_include_once('/'.$classpath.'/'.$classfile.'.class.php');
if ($res) {
if (class_exists($classname)) {
diff --git a/htdocs/core/lib/functionsnumtoword.lib.php b/htdocs/core/lib/functionsnumtoword.lib.php
index 6de1e69de1f..f451f7370eb 100644
--- a/htdocs/core/lib/functionsnumtoword.lib.php
+++ b/htdocs/core/lib/functionsnumtoword.lib.php
@@ -16,13 +16,13 @@
* along with this program. If not, see .
* or see https://www.gnu.org/
*/
+
/**
* \file htdocs/core/lib/functionsnumtoword.lib.php
* \brief A set of functions for Dolibarr
* This file contains all frequently used functions.
*/
-
/**
* Function to return a number into a text.
* May use module NUMBERWORDS if found.
@@ -187,7 +187,7 @@ function dolNumberToWord($numero, $langs, $numorcurrency = 'number')
/*In dolibarr 3.6.2 (my current version) doesn't have $langs->default and
in case exist why ask $lang like a parameter?*/
- if (((is_object($langs) && $langs->default == 'es_MX') || (!is_object($langs) && $langs == 'es_MX')) && $numorcurrency == 'currency') {
+ if (((is_object($langs) && $langs->getDefaultLang(0) == 'es_MX') || (!is_object($langs) && $langs == 'es_MX')) && $numorcurrency == 'currency') {
if ($numero >= 1 && $numero < 2) {
return ("UN PESO ".$parte_decimal." / 100 M.N.");
} elseif ($numero >= 0 && $numero < 1) {
diff --git a/htdocs/core/lib/invoice.lib.php b/htdocs/core/lib/invoice.lib.php
index 54e639058c4..0d14b322953 100644
--- a/htdocs/core/lib/invoice.lib.php
+++ b/htdocs/core/lib/invoice.lib.php
@@ -2,7 +2,7 @@
/* Copyright (C) 2005-2012 Laurent Destailleur
* Copyright (C) 2005-2012 Regis Houssin
* Copyright (C) 2013 Florian Henry
- * Copyright (C) 2015 Juanjo Menent
+ * Copyright (C) 2015 Juanjo Menent
* Copyright (C) 2017 Charlie Benke
* Copyright (C) 2017 ATM-CONSULTING
*
@@ -59,7 +59,7 @@ function facture_prepare_head($object)
if (!empty($conf->prelevement->enabled)) {
$nbStandingOrders = 0;
$sql = "SELECT COUNT(pfd.rowid) as nb";
- $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+ $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
$sql .= " WHERE pfd.fk_facture = ".((int) $object->id);
$sql .= " AND pfd.ext_payment_id IS NULL";
$resql = $db->query($sql);
@@ -71,6 +71,8 @@ function facture_prepare_head($object)
} else {
dol_print_error($db);
}
+ $langs->load("banks");
+
$head[$h][0] = DOL_URL_ROOT.'/compta/facture/prelevement.php?facid='.urlencode($object->id);
$head[$h][1] = $langs->trans('StandingOrders');
if ($nbStandingOrders > 0) {
@@ -135,7 +137,13 @@ function facture_prepare_head($object)
*/
function invoice_admin_prepare_head()
{
- global $langs, $conf, $user;
+ global $langs, $conf, $user, $db;
+
+ $extrafields = new ExtraFields($db);
+ $extrafields->fetch_name_optionals_label('facture');
+ $extrafields->fetch_name_optionals_label('facturedet');
+ $extrafields->fetch_name_optionals_label('facture_rec');
+ $extrafields->fetch_name_optionals_label('facturedet_rec');
$h = 0;
$head = array();
@@ -158,25 +166,41 @@ function invoice_admin_prepare_head()
$head[$h][0] = DOL_URL_ROOT.'/compta/facture/admin/facture_cust_extrafields.php';
$head[$h][1] = $langs->trans("ExtraFieldsCustomerInvoices");
+ $nbExtrafields = $extrafields->attributes['facture']['count'];
+ if ($nbExtrafields > 0) {
+ $head[$h][1] .= ''.$nbExtrafields.' ';
+ }
$head[$h][2] = 'attributes';
$h++;
$head[$h][0] = DOL_URL_ROOT.'/compta/facture/admin/facturedet_cust_extrafields.php';
$head[$h][1] = $langs->trans("ExtraFieldsLines");
+ $nbExtrafields = $extrafields->attributes['facturedet']['count'];
+ if ($nbExtrafields > 0) {
+ $head[$h][1] .= ''.$nbExtrafields.' ';
+ }
$head[$h][2] = 'attributeslines';
$h++;
$head[$h][0] = DOL_URL_ROOT.'/compta/facture/admin/facture_rec_cust_extrafields.php';
$head[$h][1] = $langs->trans("ExtraFieldsCustomerInvoicesRec");
+ $nbExtrafields = $extrafields->attributes['facture_rec']['count'];
+ if ($nbExtrafields > 0) {
+ $head[$h][1] .= ''.$nbExtrafields.' ';
+ }
$head[$h][2] = 'attributesrec';
$h++;
$head[$h][0] = DOL_URL_ROOT.'/compta/facture/admin/facturedet_rec_cust_extrafields.php';
$head[$h][1] = $langs->trans("ExtraFieldsLinesRec");
+ $nbExtrafields = $extrafields->attributes['facturedet_rec']['count'];
+ if ($nbExtrafields > 0) {
+ $head[$h][1] .= ''.$nbExtrafields.' ';
+ }
$head[$h][2] = 'attributeslinesrec';
$h++;
- if ($conf->global->INVOICE_USE_SITUATION) { // Warning, implementation is seriously bugged and a new one not compatible is expected to become stable
+ if (!empty($conf->global->INVOICE_USE_SITUATION)) { // Warning, implementation is seriously bugged and a new one not compatible is expected to become stable
$head[$h][0] = DOL_URL_ROOT.'/admin/facture_situation.php';
$head[$h][1] = $langs->trans("InvoiceSituation");
$head[$h][2] = 'situation';
@@ -753,7 +777,10 @@ function getCustomerInvoiceLatestEditTable($maxCount = 5, $socid = 0)
$result .= ''.$companystatic->getNomUrl(1, 'customer').' ';
$result .= ''.dol_print_date($db->jdate($obj->datec), 'day').' ';
$result .= ''.price($obj->total_ttc).' ';
- $result .= ''.$objectstatic->getLibStatut(5).' ';
+
+ // Load amount of existing payment of invoice (needed for complete status)
+ $payment = $objectstatic->getSommePaiement();
+ $result .= ''.$objectstatic->getLibStatut(5, $payment).' ';
$result .= '';
diff --git a/htdocs/core/lib/invoice2.lib.php b/htdocs/core/lib/invoice2.lib.php
index 64365f32547..da01d93fc62 100644
--- a/htdocs/core/lib/invoice2.lib.php
+++ b/htdocs/core/lib/invoice2.lib.php
@@ -239,7 +239,7 @@ function rebuild_merge_pdf($db, $langs, $conf, $diroutputpdf, $newlangid, $filte
}
$pdf->SetFont(pdf_getPDFFont($langs));
- if ($conf->global->MAIN_DISABLE_PDF_COMPRESSION) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
//$pdf->SetCompression(false);
diff --git a/htdocs/core/lib/member.lib.php b/htdocs/core/lib/member.lib.php
index 6e0dcb3b83a..71a9849dc16 100644
--- a/htdocs/core/lib/member.lib.php
+++ b/htdocs/core/lib/member.lib.php
@@ -66,9 +66,23 @@ function member_prepare_head(Adherent $object)
if (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'member') {
if (!empty($user->rights->partnership->read)) {
$nbPartnership = is_array($object->partnerships) ? count($object->partnerships) : 0;
- $head[$h][0] = DOL_URL_ROOT.'/adherents/partnership.php?rowid='.$object->id;
- $head[$h][1] = $langs->trans("Partnership");
- $head[$h][2] = 'partnership';
+ $head[$h][0] = DOL_URL_ROOT.'/partnership/partnership_list.php?rowid='.$object->id;
+ $head[$h][1] = $langs->trans("Partnerships");
+ $nbNote = 0;
+ $sql = "SELECT COUNT(n.rowid) as nb";
+ $sql .= " FROM ".MAIN_DB_PREFIX."partnership as n";
+ $sql .= " WHERE fk_member = ".((int) $object->id);
+ $resql = $db->query($sql);
+ if ($resql) {
+ $obj = $db->fetch_object($resql);
+ $nbNote = $obj->nb;
+ } else {
+ dol_print_error($db);
+ }
+ if ($nbNote > 0) {
+ $head[$h][1] .= ''.$nbNote.' ';
+ }
+ $head[$h][2] = 'partnerships';
if ($nbPartnership > 0) {
$head[$h][1] .= ''.$nbPartnership.' ';
}
diff --git a/htdocs/core/lib/oauth.lib.php b/htdocs/core/lib/oauth.lib.php
index d48775fe84e..83359ef1c65 100644
--- a/htdocs/core/lib/oauth.lib.php
+++ b/htdocs/core/lib/oauth.lib.php
@@ -27,7 +27,7 @@
$supportedoauth2array = array(
'OAUTH_GOOGLE_NAME'=>array('callbackfile' => 'google', 'picto' => 'google', 'urlforapp' => 'OAUTH_GOOGLE_DESC', 'name'=>'Google', 'urlforcredentials'=>'https://console.developers.google.com/', 'availablescopes'=> 'userinfo_email,userinfo_profile,openid,email,profile,cloud_print,admin_directory_user,gmail_full'),
);
-if (!empty($conf->stripe->enabled)) {
+if (isModEnabled('stripe')) {
$supportedoauth2array['OAUTH_STRIPE_TEST_NAME'] = array('callbackfile' => 'stripetest', 'picto' => 'stripe', 'urlforapp' => '', 'name'=>'StripeTest', 'urlforcredentials'=>'', 'availablescopes'=>'read_write');
$supportedoauth2array['OAUTH_STRIPE_LIVE_NAME'] = array('callbackfile' => 'stripelive', 'picto' => 'stripe', 'urlforapp' => '', 'name'=>'StripeLive', 'urlforcredentials'=>'', 'availablescopes'=>'read_write');
}
diff --git a/htdocs/core/lib/order.lib.php b/htdocs/core/lib/order.lib.php
index 5c77f8ab821..a106bf62369 100644
--- a/htdocs/core/lib/order.lib.php
+++ b/htdocs/core/lib/order.lib.php
@@ -189,7 +189,7 @@ function order_admin_prepare_head()
/**
- * Return a HTML table that contains a pie chart of customer orders
+ * Return a HTML table that contains a pie chart of sales orders
*
* @param int $socid (Optional) Show only results from the customer with this id
* @return string A HTML table that contains a pie chart of customer invoices
diff --git a/htdocs/core/lib/payments.lib.php b/htdocs/core/lib/payments.lib.php
index 19a251d1b38..44691f7c2c4 100644
--- a/htdocs/core/lib/payments.lib.php
+++ b/htdocs/core/lib/payments.lib.php
@@ -150,15 +150,15 @@ function getValidOnlinePaymentMethods($paymentmethod = '')
$validpaymentmethod = array();
- if ((empty($paymentmethod) || $paymentmethod == 'paypal') && !empty($conf->paypal->enabled)) {
+ if ((empty($paymentmethod) || $paymentmethod == 'paypal') && isModEnabled('paypal')) {
$langs->load("paypal");
$validpaymentmethod['paypal'] = 'valid';
}
- if ((empty($paymentmethod) || $paymentmethod == 'paybox') && !empty($conf->paybox->enabled)) {
+ if ((empty($paymentmethod) || $paymentmethod == 'paybox') && isModEnabled('paybox')) {
$langs->load("paybox");
$validpaymentmethod['paybox'] = 'valid';
}
- if ((empty($paymentmethod) || $paymentmethod == 'stripe') && !empty($conf->stripe->enabled)) {
+ if ((empty($paymentmethod) || $paymentmethod == 'stripe') && isModEnabled('stripe')) {
$langs->load("stripe");
$validpaymentmethod['stripe'] = 'valid';
}
diff --git a/htdocs/core/lib/pdf.lib.php b/htdocs/core/lib/pdf.lib.php
index 7007b49b65f..f71a6ed6d3c 100644
--- a/htdocs/core/lib/pdf.lib.php
+++ b/htdocs/core/lib/pdf.lib.php
@@ -1281,9 +1281,9 @@ function pdf_pagefoot(&$pdf, $outputlangs, $paramfreetext, $fromcompany, $marge_
}
// Show page nb only on iso languages (so default Helvetica font)
if (strtolower(pdf_getPDFFont($outputlangs)) == 'helvetica') {
- $pdf->SetXY($dims['wk'] - $dims['rm'] - 15, -$posy);
- //print 'xxx'.$pdf->PageNo().'-'.$pdf->getAliasNbPages().'-'.$pdf->getAliasNumPage();exit;
- $pdf->MultiCell(15, 2, $pdf->PageNo().'/'.$pdf->getAliasNbPages(), 0, 'R', 0);
+ $pdf->SetXY($dims['wk'] - $dims['rm'] - 18, -$posy);
+ //$pdf->MultiCell(18, 2, $pdf->getPageNumGroupAlias().' / '.$pdf->getPageGroupAlias(), 0, 'R', 0);
+ $pdf->MultiCell(18, 2, $pdf->PageNo().' / '.$pdf->getAliasNbPages(), 0, 'R', 0);
}
// Show Draft Watermark
@@ -1567,7 +1567,7 @@ function pdf_getlinedesc($object, $i, $outputlangs, $hideref = 0, $hidedesc = 0,
$productCustomerPriceStatic = new Productcustomerprice($db);
$filter = array('fk_product' => $idprod, 'fk_soc' => $object->socid);
- $nbCustomerPrices = $productCustomerPriceStatic->fetch_all('', '', 1, 0, $filter);
+ $nbCustomerPrices = $productCustomerPriceStatic->fetchAll('', '', 1, 0, $filter);
if ($nbCustomerPrices > 0) {
$productCustomerPrice = $productCustomerPriceStatic->lines[0];
diff --git a/htdocs/core/lib/product.lib.php b/htdocs/core/lib/product.lib.php
index 6a9f49ce997..79d8ac57834 100644
--- a/htdocs/core/lib/product.lib.php
+++ b/htdocs/core/lib/product.lib.php
@@ -53,22 +53,36 @@ function product_prepare_head($object)
$head[$h][2] = 'card';
$h++;
- if (!empty($object->status) && $usercancreadprice) {
- $head[$h][0] = DOL_URL_ROOT."/product/price.php?id=".$object->id;
- $head[$h][1] = $langs->trans("SellingPrices");
- $head[$h][2] = 'price';
- $h++;
+ if (!empty($object->status)) {
+ if ($usercancreadprice) {
+ $head[$h][0] = DOL_URL_ROOT."/product/price.php?id=".$object->id;
+ $head[$h][1] = $langs->trans("SellingPrices");
+ $head[$h][2] = 'price';
+ $h++;
+ } else {
+ $head[$h][0] = '#';
+ $head[$h][1] = $langs->trans("SellingPrices");
+ $head[$h][2] = 'price';
+ $head[$h][5] = 'disabled';
+ $h++;
+ }
}
- if (!empty($object->status_buy) || (!empty($conf->margin->enabled) && !empty($object->status))) { // If margin is on and product on sell, we may need the cost price even if product os not on purchase
+ if (!empty($object->status_buy) || (isModEnabled('margin') && !empty($object->status))) { // If margin is on and product on sell, we may need the cost price even if product os not on purchase
if ((((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice")) && $user->rights->fournisseur->lire)
- || (!empty($conf->margin->enabled) && $user->hasRight("margin", "liretous"))
+ || (isModEnabled('margin') && $user->hasRight("margin", "liretous"))
) {
if ($usercancreadprice) {
$head[$h][0] = DOL_URL_ROOT."/product/fournisseurs.php?id=".$object->id;
$head[$h][1] = $langs->trans("BuyingPrices");
$head[$h][2] = 'suppliers';
$h++;
+ } else {
+ $head[$h][0] = '#';
+ $head[$h][1] = $langs->trans("BuyingPrices");
+ $head[$h][2] = 'suppliers';
+ $head[$h][5] = 'disabled';
+ $h++;
}
}
}
@@ -76,7 +90,7 @@ function product_prepare_head($object)
// Multilangs
if (getDolGlobalInt('MAIN_MULTILANGS')) {
$head[$h][0] = DOL_URL_ROOT."/product/traduction.php?id=".$object->id;
- $head[$h][1] = $langs->trans("Translation");
+ $head[$h][1] = $langs->trans("Translations");
$head[$h][2] = 'translation';
$h++;
}
@@ -183,7 +197,7 @@ function product_prepare_head($object)
$upload_dir = $conf->service->multidir_output[$object->entity].'/'.dol_sanitizeFileName($object->ref);
}
$nbFiles = count(dol_dir_list($upload_dir, 'files', 0, '', '(\.meta|_preview.*\.png)$'));
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
if (isModEnabled("product") && ($object->type == Product::TYPE_PRODUCT)) {
$upload_dir = $conf->product->multidir_output[$object->entity].'/'.get_exdir($object->id, 2, 0, 0, $object, 'product').$object->id.'/photos';
}
@@ -253,6 +267,24 @@ function productlot_prepare_head($object)
$head[$h][2] = 'documents';
$h++;
+ // Notes
+ if (empty($conf->global->MAIN_DISABLE_NOTES_TAB)) {
+ $nbNote = 0;
+ if (!empty($object->note_private)) {
+ $nbNote++;
+ }
+ if (!empty($object->note_public)) {
+ $nbNote++;
+ }
+ $head[$h][0] = DOL_URL_ROOT .'/product/stock/productlot_note.php?id=' . $object->id;
+ $head[$h][1] = $langs->trans('Notes');
+ if ($nbNote > 0) {
+ $head[$h][1] .= '' . $nbNote . ' ';
+ }
+ $head[$h][2] = 'note';
+ $h++;
+ }
+
// Show more tabs from modules
// Entries must be declared in modules descriptor with line
// $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab
@@ -393,7 +425,7 @@ function show_stats_for_company($product, $socid)
print '';
// Customer proposals
- if (isModEnabled("propal") && $user->rights->propale->lire) {
+ if (isModEnabled("propal") && $user->rights->propal->lire) {
$nblines++;
$ret = $product->load_stats_propale($socid);
if ($ret < 0) {
@@ -430,7 +462,7 @@ function show_stats_for_company($product, $socid)
print ' ';
print '';
}
- // Customer orders
+ // Sales orders
if (isModEnabled('commande') && $user->rights->commande->lire) {
$nblines++;
$ret = $product->load_stats_commande($socid);
@@ -570,7 +602,7 @@ function show_stats_for_company($product, $socid)
}
// MO
- if (!empty($conf->mrp->enabled) && !empty($user->rights->mrp->read)) {
+ if (isModEnabled('mrp') && !empty($user->rights->mrp->read)) {
$nblines++;
$ret = $product->load_stats_mo($socid);
if ($ret < 0) {
diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php
index 81c27deee76..a5c84e17ed7 100644
--- a/htdocs/core/lib/project.lib.php
+++ b/htdocs/core/lib/project.lib.php
@@ -168,7 +168,7 @@ function project_prepare_head(Project $project, $moreparam = '')
if (isModEnabled("expedition")) {
$nbElements += $project->getElementCount('shipping', 'expedition');
}
- if (!empty($conf->mrp->enabled)) {
+ if (isModEnabled('mrp')) {
$nbElements += $project->getElementCount('mrp', 'mrp_mo', 'fk_project');
}
if (isModEnabled('deplacement')) {
@@ -311,7 +311,7 @@ function project_prepare_head(Project $project, $moreparam = '')
$h++;
}
- $head[$h][0] = DOL_URL_ROOT.'/projet/info.php?id='.$project->id;
+ $head[$h][0] = DOL_URL_ROOT.'/projet/messaging.php?id='.$project->id;
$head[$h][1] = $langs->trans("Events");
if (isModEnabled('agenda') && (!empty($user->rights->agenda->myactions->read) || !empty($user->rights->agenda->allactions->read))) {
$head[$h][1] .= '/';
@@ -1051,238 +1051,6 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t
}
-/**
- * Output a task line into a pertime intput mode
- *
- * @param string $inc Line number (start to 0, then increased by recursive call)
- * @param string $parent Id of parent task to show (0 to show all)
- * @param User|null $fuser Restrict list to user if defined
- * @param Task[] $lines Array of lines
- * @param int $level Level (start to 0, then increased/decrease by recursive call)
- * @param string $projectsrole Array of roles user has on project
- * @param string $tasksrole Array of roles user has on task
- * @param string $mine Show only task lines I am assigned to
- * @param int $restricteditformytask 0=No restriction, 1=Enable add time only if task is a task i am affected to
- * @param int $preselectedday Preselected day
- * @param array $isavailable Array with data that say if user is available for several days for morning and afternoon
- * @param int $oldprojectforbreak Old project id of last project break
- * @return array Array with time spent for $fuser for each day of week on tasks in $lines and substasks
- */
-function projectLinesPerAction(&$inc, $parent, $fuser, $lines, &$level, &$projectsrole, &$tasksrole, $mine, $restricteditformytask, $preselectedday, &$isavailable, $oldprojectforbreak = 0)
-{
- global $conf, $db, $user, $langs;
- global $form, $formother, $projectstatic, $taskstatic, $thirdpartystatic;
-
- $lastprojectid = 0;
- $totalforeachline = array();
- $workloadforid = array();
- $lineswithoutlevel0 = array();
-
- $numlines = count($lines);
-
- // Create a smaller array with sublevels only to be used later. This increase dramatically performances.
- if ($parent == 0) { // Always and only if at first level
- for ($i = 0; $i < $numlines; $i++) {
- if ($lines[$i]->fk_task_parent) {
- $lineswithoutlevel0[] = $lines[$i];
- }
- }
- }
-
- if (empty($oldprojectforbreak)) {
- $oldprojectforbreak = (empty($conf->global->PROJECT_TIMESHEET_DISABLEBREAK_ON_PROJECT) ? 0 : -1); // 0 to start break , -1 no break
- }
-
- //dol_syslog('projectLinesPerDay inc='.$inc.' preselectedday='.$preselectedday.' task parent id='.$parent.' level='.$level." count(lines)=".$numlines." count(lineswithoutlevel0)=".count($lineswithoutlevel0));
- for ($i = 0; $i < $numlines; $i++) {
- if ($parent == 0) {
- $level = 0;
- }
-
- //if ($lines[$i]->fk_task_parent == $parent)
- //{
- // If we want all or we have a role on task, we show it
- if (empty($mine) || !empty($tasksrole[$lines[$i]->id])) {
- //dol_syslog("projectLinesPerWeek Found line ".$i.", a qualified task (i have role or want to show all tasks) with id=".$lines[$i]->id." project id=".$lines[$i]->fk_project);
-
- // Break on a new project
- if ($parent == 0 && $lines[$i]->fk_project != $lastprojectid) {
- $lastprojectid = $lines[$i]->fk_project;
- if ($preselectedday) {
- $projectstatic->id = $lines[$i]->fk_project;
- }
- }
-
- if (empty($workloadforid[$projectstatic->id])) {
- if ($preselectedday) {
- $projectstatic->loadTimeSpent($preselectedday, 0, $fuser->id); // Load time spent from table projet_task_time for the project into this->weekWorkLoad and this->weekWorkLoadPerTask for all days of a week
- $workloadforid[$projectstatic->id] = 1;
- }
- }
-
- $projectstatic->id = $lines[$i]->fk_project;
- $projectstatic->ref = $lines[$i]->project_ref;
- $projectstatic->title = $lines[$i]->project_label;
- $projectstatic->public = $lines[$i]->public;
- $projectstatic->status = $lines[$i]->project_status;
-
- $taskstatic->id = $lines[$i]->task_id;
- $taskstatic->ref = ($lines[$i]->task_ref ? $lines[$i]->task_ref : $lines[$i]->task_id);
- $taskstatic->label = $lines[$i]->task_label;
- $taskstatic->date_start = $lines[$i]->date_start;
- $taskstatic->date_end = $lines[$i]->date_end;
-
- $thirdpartystatic->id = $lines[$i]->socid;
- $thirdpartystatic->name = $lines[$i]->thirdparty_name;
- $thirdpartystatic->email = $lines[$i]->thirdparty_email;
-
- if (empty($oldprojectforbreak) || ($oldprojectforbreak != -1 && $oldprojectforbreak != $projectstatic->id)) {
- print '
'."\n";
- print '';
- print $projectstatic->getNomUrl(1, '', 0, $langs->transnoentitiesnoconv("YourRole").': '.$projectsrole[$lines[$i]->fk_project]);
- if ($projectstatic->title) {
- print ' - ';
- print $projectstatic->title;
- }
- print ' ';
- print ' ';
- }
-
- if ($oldprojectforbreak != -1) {
- $oldprojectforbreak = $projectstatic->id;
- }
-
- print '
'."\n";
-
- // User
- /*
- print '';
- print $fuser->getNomUrl(1, 'withproject', 'time');
- print ' ';
- */
-
- // Project
- print "";
- if ($oldprojectforbreak == -1) {
- print $projectstatic->getNomUrl(1, '', 0, $langs->transnoentitiesnoconv("YourRole").': '.$projectsrole[$lines[$i]->fk_project]);
- print ' '.$projectstatic->title;
- }
- print " ";
-
- // Thirdparty
- print '';
- if ($thirdpartystatic->id > 0) {
- print $thirdpartystatic->getNomUrl(1, 'project', 10);
- }
- print ' ';
-
- // Ref
- print '';
- print '';
- for ($k = 0; $k < $level; $k++) {
- print " ";
- }
- print $taskstatic->getNomUrl(1, 'withproject', 'time');
- // Label task
- print ' ';
- for ($k = 0; $k < $level; $k++) {
- print " ";
- }
- print $taskstatic->label;
- //print " ";
- //for ($k = 0 ; $k < $level ; $k++) print " ";
- //print get_date_range($lines[$i]->date_start,$lines[$i]->date_end,'',$langs,0);
- print " \n";
-
- // Date
- print '';
- print dol_print_date($lines[$i]->timespent_datehour, 'day');
- print ' ';
-
- $disabledproject = 1;
- $disabledtask = 1;
- //print "x".$lines[$i]->fk_project;
- //var_dump($lines[$i]);
- //var_dump($projectsrole[$lines[$i]->fk_project]);
- // If at least one role for project
- if ($lines[$i]->public || !empty($projectsrole[$lines[$i]->fk_project]) || $user->rights->projet->all->creer) {
- $disabledproject = 0;
- $disabledtask = 0;
- }
- // If $restricteditformytask is on and I have no role on task, i disable edit
- if ($restricteditformytask && empty($tasksrole[$lines[$i]->id])) {
- $disabledtask = 1;
- }
-
- // Hour
- print '';
- print dol_print_date($lines[$i]->timespent_datehour, 'hour');
- print ' ';
-
- $cssonholiday = '';
- if (!$isavailable[$preselectedday]['morning'] && !$isavailable[$preselectedday]['afternoon']) {
- $cssonholiday .= 'onholidayallday ';
- } elseif (!$isavailable[$preselectedday]['morning']) {
- $cssonholiday .= 'onholidaymorning ';
- } elseif (!$isavailable[$preselectedday]['afternoon']) {
- $cssonholiday .= 'onholidayafternoon ';
- }
-
- // Duration
- print '';
-
- $dayWorkLoad = $lines[$i]->timespent_duration;
- $totalforeachline[$preselectedday] += $lines[$i]->timespent_duration;
-
- $alreadyspent = '';
- if ($dayWorkLoad > 0) {
- $alreadyspent = convertSecondToTime($lines[$i]->timespent_duration, 'allhourmin');
- }
-
- print convertSecondToTime($lines[$i]->timespent_duration, 'allhourmin');
-
- $modeinput = 'hours';
-
- print '';
-
- print ' ';
-
- // Note
- print '';
- print '';
- print $lines[$i]->timespent_note;
- print ' ';
- print ' ';
-
- // Warning
- print '';
- /*if ((! $lines[$i]->public) && $disabledproject) print $form->textwithpicto('',$langs->trans("UserIsNotContactOfProject"));
- elseif ($disabledtask)
- {
- $titleassigntask = $langs->trans("AssignTaskToMe");
- if ($fuser->id != $user->id) $titleassigntask = $langs->trans("AssignTaskToUser", '...');
-
- print $form->textwithpicto('',$langs->trans("TaskIsNotAssignedToUser", $titleassigntask));
- }*/
- print ' ';
-
- print " \n";
- }
- //}
- //else
- //{
- //$level--;
- //}
- }
-
- return $totalforeachline;
-}
-
-
/**
* Output a task line into a pertime intput mode
*
@@ -1610,7 +1378,8 @@ function projectLinesPerDay(&$inc, $parent, $fuser, $lines, &$level, &$projectsr
// Duration
print '
';
- $dayWorkLoad = $projectstatic->weekWorkLoadPerTask[$preselectedday][$lines[$i]->id];
+ $dayWorkLoad = !empty($projectstatic->weekWorkLoadPerTask[$preselectedday][$lines[$i]->id]) ? $projectstatic->weekWorkLoadPerTask[$preselectedday][$lines[$i]->id] : 0;
+ if (!isset($totalforeachday[$preselectedday])) $totalforeachday[$preselectedday] = 0;
$totalforeachday[$preselectedday] += $dayWorkLoad;
$alreadyspent = '';
@@ -1628,13 +1397,14 @@ function projectLinesPerDay(&$inc, $parent, $fuser, $lines, &$level, &$projectsr
//$tableCell.=' ';
print $tableCell;
- $modeinput = 'hours';
+ // Comment for avoid unnecessary multiple calculation
+ /*$modeinput = 'hours';
print '';
+ print '';*/
print ' ';
@@ -1990,7 +1760,7 @@ function projectLinesPerWeek(&$inc, $firstdaytoshow, $fuser, $parent, $lines, &$
$modeinput = 'hours';
for ($idw = 0; $idw < 7; $idw++) {
$tmpday = dol_time_plus_duree($firstdaytoshow, $idw, 'd');
-
+ if (!isset($totalforeachday[$tmpday])) $totalforeachday[$tmpday] = 0;
$cssonholiday = '';
if (!$isavailable[$tmpday]['morning'] && !$isavailable[$tmpday]['afternoon']) {
$cssonholiday .= 'onholidayallday ';
@@ -2001,14 +1771,14 @@ function projectLinesPerWeek(&$inc, $firstdaytoshow, $fuser, $parent, $lines, &$
}
$tmparray = dol_getdate($tmpday);
- $dayWorkLoad = $projectstatic->weekWorkLoadPerTask[$tmpday][$lines[$i]->id];
+ $dayWorkLoad = (!empty($projectstatic->weekWorkLoadPerTask[$tmpday][$lines[$i]->id]) ? $projectstatic->weekWorkLoadPerTask[$tmpday][$lines[$i]->id] : 0);
$totalforeachday[$tmpday] += $dayWorkLoad;
$alreadyspent = '';
if ($dayWorkLoad > 0) {
$alreadyspent = convertSecondToTime($dayWorkLoad, 'allhourmin');
}
- $alttitle = $langs->trans("AddHereTimeSpentForDay", $tmparray['day'], $tmparray['mon']);
+ $alttitle = $langs->trans("AddHereTimeSpentForDay", !empty($tmparray['day']) ? $tmparray['day'] : 0, $tmparray['mon']);
global $numstartworkingday, $numendworkingday;
$cssweekend = '';
@@ -2288,7 +2058,8 @@ function projectLinesPerMonth(&$inc, $firstdaytoshow, $fuser, $parent, $lines, &
$year = $firstdaytoshowarray['year'];
$month = $firstdaytoshowarray['mon'];
foreach ($TWeek as $weekIndex => $weekNb) {
- $weekWorkLoad = $projectstatic->monthWorkLoadPerTask[$weekNb][$lines[$i]->id];
+ $weekWorkLoad = !empty($projectstatic->monthWorkLoadPerTask[$weekNb][$lines[$i]->id]) ? $projectstatic->monthWorkLoadPerTask[$weekNb][$lines[$i]->id] : 0 ;
+ if (!isset($totalforeachweek[$weekNb])) $totalforeachweek[$weekNb] = 0;
$totalforeachweek[$weekNb] += $weekWorkLoad;
$alreadyspent = '';
@@ -2447,6 +2218,7 @@ function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks
$arrayidtypeofcontact = array();
+ print '';
print '
';
print '
';
@@ -2646,12 +2418,12 @@ function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks
$plannedworkload = $objp->planned_workload;
$total_plannedworkload += $plannedworkload;
if (!in_array('plannedworkload', $hiddenfields)) {
- print ''.($plannedworkload ?convertSecondToTime($plannedworkload) : '').' ';
+ print ''.($plannedworkload ?convertSecondToTime($plannedworkload) : '').' ';
}
if (!in_array('declaredprogress', $hiddenfields)) {
$declaredprogressworkload = $objp->declared_progess_workload;
$total_declaredprogressworkload += $declaredprogressworkload;
- print '';
+ print ' ';
//print $objp->planned_workload.'-'.$objp->declared_progess_workload." ";
print ($plannedworkload ?round(100 * $declaredprogressworkload / $plannedworkload, 0).'%' : '');
print ' ';
diff --git a/htdocs/core/lib/propal.lib.php b/htdocs/core/lib/propal.lib.php
index 0b91188b47f..9d1401ea47a 100644
--- a/htdocs/core/lib/propal.lib.php
+++ b/htdocs/core/lib/propal.lib.php
@@ -181,7 +181,7 @@ function getCustomerProposalPieChart($socid = 0)
$result= '';
- if (empty($conf->propal->enabled) || empty($user->rights->propal->lire)) {
+ if (!isModEnabled('propal') || empty($user->rights->propal->lire)) {
return '';
}
diff --git a/htdocs/core/lib/security.lib.php b/htdocs/core/lib/security.lib.php
index 0d0a0de3e0d..8e1ed6cebd1 100644
--- a/htdocs/core/lib/security.lib.php
+++ b/htdocs/core/lib/security.lib.php
@@ -146,7 +146,7 @@ function dolEncrypt($chain, $key = '', $ciphering = "AES-256-CTR")
}
$ivseed = dolGetRandomBytes($ivlen);
- $newchain = openssl_encrypt($chain, $ciphering, $key, null, $ivseed);
+ $newchain = openssl_encrypt($chain, $ciphering, $key, 0, $ivseed);
return 'dolcrypt:'.$ciphering.':'.$ivseed.':'.$newchain;
} else {
return $chain;
@@ -180,9 +180,9 @@ function dolDecrypt($chain, $key = '')
if (function_exists('openssl_decrypt')) {
$tmpexplode = explode(':', $reg[2]);
if (!empty($tmpexplode[1]) && is_string($tmpexplode[0])) {
- $newchain = openssl_decrypt($tmpexplode[1], $ciphering, $key, null, $tmpexplode[0]);
+ $newchain = openssl_decrypt($tmpexplode[1], $ciphering, $key, 0, $tmpexplode[0]);
} else {
- $newchain = openssl_decrypt($tmpexplode[0], $ciphering, $key, null, null);
+ $newchain = openssl_decrypt($tmpexplode[0], $ciphering, $key, 0, null);
}
} else {
$newchain = 'Error function openssl_decrypt() not available';
@@ -391,6 +391,11 @@ function restrictedArea(User $user, $features, $objectid = 0, $tableandshare = '
return 1;
}
+ // To avoid access forbidden with numeric ref
+ if ($dbt_select != 'rowid' && $dbt_select != 'id') {
+ $objectid = "'".$objectid."'";
+ }
+
// Features/modules to check
$featuresarray = array($features);
if (preg_match('/&/', $features)) {
diff --git a/htdocs/core/lib/sendings.lib.php b/htdocs/core/lib/sendings.lib.php
index ffc455ab5f1..6d9598a04ae 100644
--- a/htdocs/core/lib/sendings.lib.php
+++ b/htdocs/core/lib/sendings.lib.php
@@ -180,7 +180,7 @@ function delivery_prepare_head($object)
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/link.class.php';
- $upload_dir = $conf->expedition->dir_output."/sending/".dol_sanitizeFileName($object->ref);
+ $upload_dir = $conf->expedition->dir_output."/sending/".dol_sanitizeFileName($tmpobject->ref);
$nbFiles = count(dol_dir_list($upload_dir, 'files', 0, '', '(\.meta|_preview.*\.png)$'));
$nbLinks = Link::count($db, $tmpobject->element, $tmpobject->id);
$head[$h][0] = DOL_URL_ROOT.'/expedition/document.php?id='.$tmpobject->id;
@@ -341,14 +341,14 @@ function show_list_sending_receive($origin, $origin_id, $filter = '')
$product_static->status_batch = $objp->product_tobatch;
$text = $product_static->getNomUrl(1);
$text .= ' - '.$label;
- $description = (!empty($conf->global->PRODUIT_DESC_IN_FORM) ? '' : dol_htmlentitiesbr($objp->description));
+ $description = (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE') ? '' : dol_htmlentitiesbr($objp->description));
print $form->textwithtooltip($text, $description, 3, '', '', $i);
// Show range
print_date_range($objp->date_start, $objp->date_end);
// Add description in form
- if (!empty($conf->global->PRODUIT_DESC_IN_FORM)) {
+ if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
print (!empty($objp->description) && $objp->description != $objp->product) ? ' '.dol_htmlentitiesbr($objp->description) : '';
}
diff --git a/htdocs/core/lib/signature.lib.php b/htdocs/core/lib/signature.lib.php
index d2f0c64f463..d26b20219ff 100644
--- a/htdocs/core/lib/signature.lib.php
+++ b/htdocs/core/lib/signature.lib.php
@@ -59,7 +59,7 @@ function showOnlineSignatureUrl($type, $ref)
*/
function getOnlineSignatureUrl($mode, $type, $ref = '', $localorexternal = 1)
{
- global $conf, $db, $langs, $dolibarr_main_url_root;
+ global $conf, $object, $dolibarr_main_url_root;
$ref = str_replace(' ', '', $ref);
$out = '';
@@ -116,6 +116,36 @@ function getOnlineSignatureUrl($mode, $type, $ref = '', $localorexternal = 1)
$out .= '&hashp='.$hashp;
}
}*/
+ } elseif ($type == 'contract') {
+ $securekeyseed = isset($conf->global->CONTRACT_ONLINE_SIGNATURE_SECURITY_TOKEN) ? $conf->global->CONTRACT_ONLINE_SIGNATURE_SECURITY_TOKEN : '';
+ $out = $urltouse.'/public/onlinesign/newonlinesign.php?source=contract&ref='.($mode ? '' : '');
+ if ($mode == 1) {
+ $out .= 'contract_ref';
+ }
+ if ($mode == 0) {
+ $out .= urlencode($ref);
+ }
+ $out .= ($mode ? ' ' : '');
+ if ($mode == 1) {
+ $out .= "hash('".$securekeyseed."' + '".$type."' + contract_ref)";
+ } else {
+ $out .= '&securekey='.dol_hash($securekeyseed.$type.$ref.(!isModEnabled('multicompany') ? '' : $object->entity), '0');
+ }
+ } elseif ($type == 'fichinter') {
+ $securekeyseed = isset($conf->global->FICHINTER_ONLINE_SIGNATURE_SECURITY_TOKEN) ? $conf->global->FICHINTER_ONLINE_SIGNATURE_SECURITY_TOKEN : '';
+ $out = $urltouse.'/public/onlinesign/newonlinesign.php?source=fichinter&ref='.($mode ? '' : '');
+ if ($mode == 1) {
+ $out .= 'fichinter_ref';
+ }
+ if ($mode == 0) {
+ $out .= urlencode($ref);
+ }
+ $out .= ($mode ? ' ' : '');
+ if ($mode == 1) {
+ $out .= "hash('".$securekeyseed."' + '".$type."' + fichinter_ref)";
+ } else {
+ $out .= '&securekey='.dol_hash($securekeyseed.$type.$ref.(!isModEnabled('multicompany') ? '' : $object->entity), '0');
+ }
}
// For multicompany
diff --git a/htdocs/core/lib/tax.lib.php b/htdocs/core/lib/tax.lib.php
index a0602dfd74e..29ced3591a1 100644
--- a/htdocs/core/lib/tax.lib.php
+++ b/htdocs/core/lib/tax.lib.php
@@ -174,10 +174,18 @@ function tax_by_thirdparty($type, $db, $y, $date_start, $date_end, $modetax, $di
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p on d.fk_product = p.rowid";
$sql .= " WHERE f.entity IN (".getEntity($invoicetable).")";
$sql .= " AND f.fk_statut in (1,2)"; // Validated or paid (partially or completely)
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
- $sql .= " AND f.type IN (0,1,2,5)";
+ if ($direction == 'buy') {
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $sql .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $sql .= " AND f.type IN (0,1,2,3,5)";
+ }
} else {
- $sql .= " AND f.type IN (0,1,2,3,5)";
+ if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $sql .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $sql .= " AND f.type IN (0,1,2,3,5)";
+ }
}
$sql .= " AND f.rowid = d.".$fk_facture;
$sql .= " AND s.rowid = f.fk_soc";
@@ -222,10 +230,18 @@ function tax_by_thirdparty($type, $db, $y, $date_start, $date_end, $modetax, $di
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p on d.fk_product = p.rowid";
$sql .= " WHERE f.entity IN (".getEntity($invoicetable).")";
$sql .= " AND f.fk_statut in (1,2)"; // Paid (partially or completely)
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
- $sql .= " AND f.type IN (0,1,2,5)";
+ if ($direction == 'buy') {
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $sql .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $sql .= " AND f.type IN (0,1,2,3,5)";
+ }
} else {
- $sql .= " AND f.type IN (0,1,2,3,5)";
+ if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $sql .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $sql .= " AND f.type IN (0,1,2,3,5)";
+ }
}
$sql .= " AND f.rowid = d.".$fk_facture;
$sql .= " AND s.rowid = f.fk_soc";
@@ -359,10 +375,18 @@ function tax_by_thirdparty($type, $db, $y, $date_start, $date_end, $modetax, $di
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p on d.fk_product = p.rowid";
$sql .= " WHERE f.entity IN (".getEntity($invoicetable).")";
$sql .= " AND f.fk_statut in (1,2)"; // Validated or paid (partially or completely)
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
- $sql .= " AND f.type IN (0,1,2,5)";
+ if ($direction == 'buy') {
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $sql .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $sql .= " AND f.type IN (0,1,2,3,5)";
+ }
} else {
- $sql .= " AND f.type IN (0,1,2,3,5)";
+ if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $sql .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $sql .= " AND f.type IN (0,1,2,3,5)";
+ }
}
$sql .= " AND f.rowid = d.".$fk_facture;
$sql .= " AND s.rowid = f.fk_soc";
@@ -407,10 +431,18 @@ function tax_by_thirdparty($type, $db, $y, $date_start, $date_end, $modetax, $di
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p on d.fk_product = p.rowid";
$sql .= " WHERE f.entity IN (".getEntity($invoicetable).")";
$sql .= " AND f.fk_statut in (1,2)"; // Paid (partially or completely)
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
- $sql .= " AND f.type IN (0,1,2,5)";
+ if ($direction == 'buy') {
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $sql .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $sql .= " AND f.type IN (0,1,2,3,5)";
+ }
} else {
- $sql .= " AND f.type IN (0,1,2,3,5)";
+ if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $sql .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $sql .= " AND f.type IN (0,1,2,3,5)";
+ }
}
$sql .= " AND f.rowid = d.".$fk_facture;
$sql .= " AND s.rowid = f.fk_soc";
@@ -730,10 +762,18 @@ function tax_by_rate($type, $db, $y, $q, $date_start, $date_end, $modetax, $dire
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p on d.fk_product = p.rowid";
$sql .= " WHERE f.entity IN (".getEntity($invoicetable).")";
$sql .= " AND f.fk_statut in (1,2)"; // Validated or paid (partially or completely)
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
- $sql .= " AND f.type IN (0,1,2,5)";
+ if ($direction == 'buy') {
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $sql .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $sql .= " AND f.type IN (0,1,2,3,5)";
+ }
} else {
- $sql .= " AND f.type IN (0,1,2,3,5)";
+ if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $sql .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $sql .= " AND f.type IN (0,1,2,3,5)";
+ }
}
if ($y && $m) {
$sql .= " AND f.datef >= '".$db->idate(dol_get_first_day($y, $m, false))."'";
@@ -776,10 +816,18 @@ function tax_by_rate($type, $db, $y, $q, $date_start, $date_end, $modetax, $dire
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p on d.fk_product = p.rowid";
$sql .= " WHERE f.entity IN (".getEntity($invoicetable).")";
$sql .= " AND f.fk_statut in (1,2)"; // Paid (partially or completely)
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
- $sql .= " AND f.type IN (0,1,2,5)";
+ if ($direction == 'buy') {
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $sql .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $sql .= " AND f.type IN (0,1,2,3,5)";
+ }
} else {
- $sql .= " AND f.type IN (0,1,2,3,5)";
+ if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $sql .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $sql .= " AND f.type IN (0,1,2,3,5)";
+ }
}
if ($y && $m) {
$sql .= " AND pa.datep >= '".$db->idate(dol_get_first_day($y, $m, false))."'";
@@ -915,10 +963,18 @@ function tax_by_rate($type, $db, $y, $q, $date_start, $date_end, $modetax, $dire
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p on d.fk_product = p.rowid";
$sql .= " WHERE f.entity IN (".getEntity($invoicetable).")";
$sql .= " AND f.fk_statut in (1,2)"; // Validated or paid (partially or completely)
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
- $sql .= " AND f.type IN (0,1,2,5)";
+ if ($direction == 'buy') {
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $sql .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $sql .= " AND f.type IN (0,1,2,3,5)";
+ }
} else {
- $sql .= " AND f.type IN (0,1,2,3,5)";
+ if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $sql .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $sql .= " AND f.type IN (0,1,2,3,5)";
+ }
}
if ($y && $m) {
$sql .= " AND f.datef >= '".$db->idate(dol_get_first_day($y, $m, false))."'";
@@ -961,10 +1017,18 @@ function tax_by_rate($type, $db, $y, $q, $date_start, $date_end, $modetax, $dire
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p on d.fk_product = p.rowid";
$sql .= " WHERE f.entity IN (".getEntity($invoicetable).")";
$sql .= " AND f.fk_statut in (1,2)"; // Paid (partially or completely)
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
- $sql .= " AND f.type IN (0,1,2,5)";
+ if ($direction == 'buy') {
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $sql .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $sql .= " AND f.type IN (0,1,2,3,5)";
+ }
} else {
- $sql .= " AND f.type IN (0,1,2,3,5)";
+ if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ $sql .= " AND f.type IN (0,1,2,5)";
+ } else {
+ $sql .= " AND f.type IN (0,1,2,3,5)";
+ }
}
if ($y && $m) {
$sql .= " AND pa.datep >= '".$db->idate(dol_get_first_day($y, $m, false))."'";
diff --git a/htdocs/core/lib/ticket.lib.php b/htdocs/core/lib/ticket.lib.php
index 9223c1c4dd8..5d0d691228e 100644
--- a/htdocs/core/lib/ticket.lib.php
+++ b/htdocs/core/lib/ticket.lib.php
@@ -268,719 +268,3 @@ function llxHeaderTicket($title, $head = "", $disablejs = 0, $disablehead = 0, $
print '';
}
-
-
-
-/**
- * Show html area with actions for ticket messaging.
- * Note: Global parameter $param must be defined.
- *
- * @param Conf $conf Object conf
- * @param Translate $langs Object langs
- * @param DoliDB $db Object db
- * @param mixed $filterobj Filter on object Adherent|Societe|Project|Product|CommandeFournisseur|Dolresource|Ticket|... to list events linked to an object
- * @param Contact $objcon Filter on object contact to filter events on a contact
- * @param int $noprint Return string but does not output it
- * @param string $actioncode Filter on actioncode
- * @param string $donetodo Filter on event 'done' or 'todo' or ''=nofilter (all).
- * @param array $filters Filter on other fields
- * @param string $sortfield Sort field
- * @param string $sortorder Sort order
- * @return string|void Return html part or void if noprint is 1
- */
-function show_ticket_messaging($conf, $langs, $db, $filterobj, $objcon = '', $noprint = 0, $actioncode = '', $donetodo = 'done', $filters = array(), $sortfield = 'a.datep,a.id', $sortorder = 'DESC')
-{
- global $user, $conf;
- global $form;
-
- global $param, $massactionbutton;
-
- dol_include_once('/comm/action/class/actioncomm.class.php');
-
- // Check parameters
- if (!is_object($filterobj) && !is_object($objcon)) {
- dol_print_error('', 'BadParameter');
- }
-
- $histo = array();
- $numaction = 0;
- $now = dol_now();
-
- $sortfield_list = explode(',', $sortfield);
- $sortfield_label_list = array('a.id' => 'id', 'a.datep' => 'dp', 'a.percent' => 'percent');
- $sortfield_new_list = array();
- foreach ($sortfield_list as $sortfield_value) {
- $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
- }
- $sortfield_new = implode(',', $sortfield_new_list);
-
- if (isModEnabled('agenda')) {
- // Search histo on actioncomm
- if (is_object($objcon) && $objcon->id > 0) {
- $sql = "SELECT DISTINCT a.id, a.label as label,";
- } else {
- $sql = "SELECT a.id, a.label as label,";
- }
- $sql .= " a.datep as dp,";
- $sql .= " a.note as message,";
- $sql .= " a.datep2 as dp2,";
- $sql .= " a.percent as percent, 'action' as type,";
- $sql .= " a.fk_element, a.elementtype,";
- $sql .= " a.fk_contact,";
- $sql .= " c.code as acode, c.libelle as alabel, c.picto as apicto,";
- $sql .= " u.rowid as user_id, u.login as user_login, u.photo as user_photo, u.firstname as user_firstname, u.lastname as user_lastname";
- if (is_object($filterobj) && get_class($filterobj) == 'Societe') {
- $sql .= ", sp.lastname, sp.firstname";
- } elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
- $sql .= ", m.lastname, m.firstname";
- } elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
- $sql .= ", o.ref";
- } elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
- $sql .= ", o.ref";
- } elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
- $sql .= ", o.ref";
- } elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') {
- $sql .= ", o.ref";
- } elseif (is_object($filterobj) && get_class($filterobj) == 'Contrat') {
- $sql .= ", o.ref";
- }
- $sql .= " FROM ".MAIN_DB_PREFIX."actioncomm as a";
- $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on u.rowid = a.fk_user_action";
- $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_actioncomm as c ON a.fk_action = c.id";
-
- $force_filter_contact = false;
- if (is_object($objcon) && $objcon->id > 0) {
- $force_filter_contact = true;
- $sql .= " INNER JOIN ".MAIN_DB_PREFIX."actioncomm_resources as r ON a.id = r.fk_actioncomm";
- $sql .= " AND r.element_type = '".$db->escape($objcon->table_element)."' AND r.fk_element = ".((int) $objcon->id);
- }
-
- if (is_object($filterobj) && get_class($filterobj) == 'Societe') {
- $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as sp ON a.fk_contact = sp.rowid";
- } elseif (is_object($filterobj) && get_class($filterobj) == 'Dolresource') {
- $sql .= " INNER JOIN ".MAIN_DB_PREFIX."element_resources as er";
- $sql .= " ON er.resource_type = 'dolresource'";
- $sql .= " AND er.element_id = a.id";
- $sql .= " AND er.resource_id = ".((int) $filterobj->id);
- } elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
- $sql .= ", ".MAIN_DB_PREFIX."adherent as m";
- } elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
- $sql .= ", ".MAIN_DB_PREFIX."commande_fournisseur as o";
- } elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
- $sql .= ", ".MAIN_DB_PREFIX."product as o";
- } elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
- $sql .= ", ".MAIN_DB_PREFIX."ticket as o";
- } elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') {
- $sql .= ", ".MAIN_DB_PREFIX."bom_bom as o";
- } elseif (is_object($filterobj) && get_class($filterobj) == 'Contrat') {
- $sql .= ", ".MAIN_DB_PREFIX."contrat as o";
- }
-
- $sql .= " WHERE a.entity IN (".getEntity('agenda').")";
- if ($force_filter_contact === false) {
- if (is_object($filterobj) && in_array(get_class($filterobj), array('Societe', 'Client', 'Fournisseur')) && $filterobj->id) {
- $sql .= " AND a.fk_soc = ".((int) $filterobj->id);
- } elseif (is_object($filterobj) && get_class($filterobj) == 'Project' && $filterobj->id) {
- $sql .= " AND a.fk_project = ".((int) $filterobj->id);
- } elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
- $sql .= " AND a.fk_element = m.rowid AND a.elementtype = 'member'";
- if ($filterobj->id) {
- $sql .= " AND a.fk_element = ".((int) $filterobj->id);
- }
- } elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
- $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
- if ($filterobj->id) {
- $sql .= " AND a.fk_element = ".((int) $filterobj->id);
- }
- } elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
- $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'product'";
- if ($filterobj->id) {
- $sql .= " AND a.fk_element = ".((int) $filterobj->id);
- }
- } elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
- $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
- if ($filterobj->id) {
- $sql .= " AND a.fk_element = ".((int) $filterobj->id);
- }
- } elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') {
- $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
- if ($filterobj->id) {
- $sql .= " AND a.fk_element = ".((int) $filterobj->id);
- }
- } elseif (is_object($filterobj) && get_class($filterobj) == 'Contrat') {
- $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
- if ($filterobj->id) {
- $sql .= " AND a.fk_element = ".((int) $filterobj->id);
- }
- }
- }
-
- // Condition on actioncode
- if (!empty($actioncode)) {
- if (empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
- if ($actioncode == 'AC_NON_AUTO') {
- $sql .= " AND c.type != 'systemauto'";
- } elseif ($actioncode == 'AC_ALL_AUTO') {
- $sql .= " AND c.type = 'systemauto'";
- } else {
- if ($actioncode == 'AC_OTH') {
- $sql .= " AND c.type != 'systemauto'";
- } elseif ($actioncode == 'AC_OTH_AUTO') {
- $sql .= " AND c.type = 'systemauto'";
- }
- }
- } else {
- if ($actioncode == 'AC_NON_AUTO') {
- $sql .= " AND c.type != 'systemauto'";
- } elseif ($actioncode == 'AC_ALL_AUTO') {
- $sql .= " AND c.type = 'systemauto'";
- } else {
- $sql .= " AND c.code = '".$db->escape($actioncode)."'";
- }
- }
- }
- if ($donetodo == 'todo') {
- $sql .= " AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now)."'))";
- } elseif ($donetodo == 'done') {
- $sql .= " AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now)."'))";
- }
- if (is_array($filters) && $filters['search_agenda_label']) {
- $sql .= natural_search('a.label', $filters['search_agenda_label']);
- }
- }
-
- // Add also event from emailings. TODO This should be replaced by an automatic event ? May be it's too much for very large emailing.
- if (isModEnabled('mailing') && !empty($objcon->email)
- && (empty($actioncode) || $actioncode == 'AC_OTH_AUTO' || $actioncode == 'AC_EMAILING')) {
- $langs->load("mails");
-
- $sql2 = "SELECT m.rowid as id, m.titre as label, mc.date_envoi as dp, mc.date_envoi as dp2, '100' as percent, 'mailing' as type";
- $sql2 .= ", null as fk_element, '' as elementtype, null as contact_id";
- $sql2 .= ", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
- $sql2 .= ", u.rowid as user_id, u.login as user_login, u.photo as user_photo, u.firstname as user_firstname, u.lastname as user_lastname"; // User that valid action
- if (is_object($filterobj) && get_class($filterobj) == 'Societe') {
- $sql2 .= ", '' as lastname, '' as firstname";
- } elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
- $sql2 .= ", '' as lastname, '' as firstname";
- } elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
- $sql2 .= ", '' as ref";
- } elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
- $sql2 .= ", '' as ref";
- } elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
- $sql2 .= ", '' as ref";
- }
- $sql2 .= " FROM ".MAIN_DB_PREFIX."mailing as m, ".MAIN_DB_PREFIX."mailing_cibles as mc, ".MAIN_DB_PREFIX."user as u";
- $sql2 .= " WHERE mc.email = '".$db->escape($objcon->email)."'"; // Search is done on email.
- $sql2 .= " AND mc.statut = 1";
- $sql2 .= " AND u.rowid = m.fk_user_valid";
- $sql2 .= " AND mc.fk_mailing=m.rowid";
- }
-
- if (!empty($sql) && !empty($sql2)) {
- $sql = $sql." UNION ".$sql2;
- } elseif (empty($sql) && !empty($sql2)) {
- $sql = $sql2;
- }
-
- // TODO Add limit in nb of results
- if ($sql) { // May not be defined if module Agenda is not enabled and mailing module disabled too
- $sql .= $db->order($sortfield_new, $sortorder);
-
- dol_syslog("ticket.lib::show_ticket_messaging", LOG_DEBUG);
- $resql = $db->query($sql);
- if ($resql) {
- $i = 0;
- $num = $db->num_rows($resql);
-
- while ($i < $num) {
- $obj = $db->fetch_object($resql);
-
- if ($obj->type == 'action') {
- $contactaction = new ActionComm($db);
- $contactaction->id = $obj->id;
- $result = $contactaction->fetchResources();
- if ($result < 0) {
- dol_print_error($db);
- setEventMessage("ticket.lib::show_ticket_messaging Error fetch ressource", 'errors');
- }
-
- //if ($donetodo == 'todo') $sql.= " AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now)."'))";
- //elseif ($donetodo == 'done') $sql.= " AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now)."'))";
- $tododone = '';
- if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->datep > $now)) {
- $tododone = 'todo';
- }
-
- $histo[$numaction] = array(
- 'type'=>$obj->type,
- 'tododone'=>$tododone,
- 'id'=>$obj->id,
- 'datestart'=>$db->jdate($obj->dp),
- 'dateend'=>$db->jdate($obj->dp2),
- 'note'=>$obj->label,
- 'message'=>$obj->message,
- 'percent'=>$obj->percent,
-
- 'userid'=>$obj->user_id,
- 'login'=>$obj->user_login,
- 'userfirstname'=>$obj->user_firstname,
- 'userlastname'=>$obj->user_lastname,
- 'userphoto'=>$obj->user_photo,
-
- 'contact_id'=>$obj->fk_contact,
- 'socpeopleassigned' => $contactaction->socpeopleassigned,
- 'lastname'=>$obj->lastname,
- 'firstname'=>$obj->firstname,
- 'fk_element'=>$obj->fk_element,
- 'elementtype'=>$obj->elementtype,
- // Type of event
- 'acode'=>$obj->acode,
- 'alabel'=>$obj->alabel,
- 'libelle'=>$obj->alabel, // deprecated
- 'apicto'=>$obj->apicto
- );
- } else {
- $histo[$numaction] = array(
- 'type'=>$obj->type,
- 'tododone'=>'done',
- 'id'=>$obj->id,
- 'datestart'=>$db->jdate($obj->dp),
- 'dateend'=>$db->jdate($obj->dp2),
- 'note'=>$obj->label,
- 'message'=>$obj->message,
- 'percent'=>$obj->percent,
- 'acode'=>$obj->acode,
-
- 'userid'=>$obj->user_id,
- 'login'=>$obj->user_login,
- 'userfirstname'=>$obj->user_firstname,
- 'userlastname'=>$obj->user_lastname,
- 'userphoto'=>$obj->user_photo
- );
- }
-
- $numaction++;
- $i++;
- }
- } else {
- dol_print_error($db);
- }
- }
-
- // Set $out to sow events
- $out = '';
-
- if (!isModEnabled('agenda')) {
- $langs->loadLangs(array("admin", "errors"));
- $out = info_admin($langs->trans("WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv("Module2400Name")), 0, 0, 'warning');
- }
-
- if (isModEnabled('agenda') || (isModEnabled('mailing') && !empty($objcon->email))) {
- $delay_warning = $conf->global->MAIN_DELAY_ACTIONS_TODO * 24 * 60 * 60;
-
- require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
- include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
- require_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
- require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
-
- $formactions = new FormActions($db);
-
- $actionstatic = new ActionComm($db);
- $userstatic = new User($db);
- $contactstatic = new Contact($db);
- $userGetNomUrlCache = array();
-
- $out .= '
';
- $out .= '
';
- $out .= ' ';
-
- if ($objcon && get_class($objcon) == 'Contact' &&
- (is_null($filterobj) || get_class($filterobj) == 'Societe')) {
- $out .= ' ';
- } else {
- $out .= ' ';
- }
- if ($filterobj && get_class($filterobj) == 'Societe') {
- $out .= ' ';
- }
-
- $out .= "\n";
-
- $out .= '';
- $out .= '
';
-
- $out .= '';
-
- $out .= getTitleFieldOfList('Date', 0, $_SERVER["PHP_SELF"], 'a.datep', '', $param, '', $sortfield, $sortorder, '')."\n";
-
- $out .= ''.$langs->trans("Search").' : ';
- if ($donetodo) {
- $out .= ' ';
- }
- $out .= '';
- $out .= ' ';
- //$out .= img_picto($langs->trans("Type"), 'type');
- $out .= $formactions->select_type_actions($actioncode, "actioncode", '', empty($conf->global->AGENDA_USE_EVENT_TYPE) ? 1 : -1, 0, 0, 1, 'minwidth200imp');
- $out .= ' ';
- $out .= '';
- $out .= ' ';
- $out .= ' ';
-
- $out .= '';
- $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0, 'checkforselect', 1);
- $out .= $searchpicto;
- $out .= ' ';
- $out .= ' ';
-
-
- $out .= '
';
-
- $out .= '';
- $out .= '
';
-
- $out .= "\n";
-
- $out .= '';
-
- if ($donetodo) {
- $tmp = '';
- if (get_class($filterobj) == 'Societe') {
- $tmp .= '';
- }
- $tmp .= ($donetodo != 'done' ? $langs->trans("ActionsToDoShort") : '');
- $tmp .= ($donetodo != 'done' && $donetodo != 'todo' ? ' / ' : '');
- $tmp .= ($donetodo != 'todo' ? $langs->trans("ActionsDoneShort") : '');
- //$out.=$langs->trans("ActionsToDoShort").' / '.$langs->trans("ActionsDoneShort");
- if (get_class($filterobj) == 'Societe') {
- $tmp .= ' ';
- }
- $out .= getTitleFieldOfList($tmp);
- }
-
-
- //require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php';
- //$caction=new CActionComm($db);
- //$arraylist=$caction->liste_array(1, 'code', '', (empty($conf->global->AGENDA_USE_EVENT_TYPE)?1:0), '', 1);
-
- $actualCycleDate = false;
-
- // Loop on each event to show it
- foreach ($histo as $key => $value) {
- $actionstatic->fetch($histo[$key]['id']); // TODO Do we need this, we already have a lot of data of line into $histo
-
- $actionstatic->type_picto = $histo[$key]['apicto'];
- $actionstatic->type_code = $histo[$key]['acode'];
-
- $url = DOL_URL_ROOT.'/comm/action/card.php?id='.$histo[$key]['id'];
-
- $tmpa = dol_getdate($histo[$key]['datestart'], false);
- if ($actualCycleDate !== $tmpa['year'].'-'.$tmpa['yday']) {
- $actualCycleDate = $tmpa['year'].'-'.$tmpa['yday'];
- $out .= '';
- $out .= '';
- $out .= '';
- $out .= dol_print_date($histo[$key]['datestart'], 'daytext', 'tzuserrel', $langs);
- $out .= ' ';
- $out .= ' ';
- $out .= '';
- }
-
-
- $out .= ''."\n";
- $out .= '';
-
- $out .= getTicketTimelineIcon($actionstatic, $histo, $key);
-
- $out .= ''."\n";
-
- $out .= '';
- // Date
- $out .= '
';
- $out .= dol_print_date($histo[$key]['datestart'], 'dayhour', 'tzuserrel');
- if ($histo[$key]['dateend'] && $histo[$key]['dateend'] != $histo[$key]['datestart']) {
- $tmpa = dol_getdate($histo[$key]['datestart'], true);
- $tmpb = dol_getdate($histo[$key]['dateend'], true);
- if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
- $out .= '-'.dol_print_date($histo[$key]['dateend'], 'hour', 'tzuserrel');
- } else {
- $out .= '-'.dol_print_date($histo[$key]['dateend'], 'dayhour', 'tzuserrel');
- }
- }
- $late = 0;
- if ($histo[$key]['percent'] == 0 && $histo[$key]['datestart'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
- $late = 1;
- }
- if ($histo[$key]['percent'] == 0 && !$histo[$key]['datestart'] && $histo[$key]['dateend'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
- $late = 1;
- }
- if ($histo[$key]['percent'] > 0 && $histo[$key]['percent'] < 100 && $histo[$key]['dateend'] && $histo[$key]['dateend'] < ($now - $delay_warning)) {
- $late = 1;
- }
- if ($histo[$key]['percent'] > 0 && $histo[$key]['percent'] < 100 && !$histo[$key]['dateend'] && $histo[$key]['datestart'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
- $late = 1;
- }
- if ($late) {
- $out .= img_warning($langs->trans("Late")).' ';
- }
- $out .= "\n";
-
- // Ref
- $out .= '';
-
- if (!empty($histo[$key]['message'])
- && $actionstatic->code != 'AC_TICKET_CREATE'
- && $actionstatic->code != 'AC_TICKET_MODIFY'
- ) {
- $out .= '
';
- $out .= $histo[$key]['message'];
- $out .= '
';
- }
-
- // Timeline footer
- $footer = '';
-
- // Contact for this action
- if (isset($histo[$key]['socpeopleassigned']) && is_array($histo[$key]['socpeopleassigned']) && count($histo[$key]['socpeopleassigned']) > 0) {
- $contactList = '';
- foreach ($histo[$key]['socpeopleassigned'] as $cid => $Tab) {
- $contact = new Contact($db);
- $result = $contact->fetch($cid);
-
- if ($result < 0) {
- dol_print_error($db, $contact->error);
- }
-
- if ($result > 0) {
- $contactList .= !empty($contactList) ? ', ' : '';
- $contactList .= $contact->getNomUrl(1);
- if (isset($histo[$key]['acode']) && $histo[$key]['acode'] == 'AC_TEL') {
- if (!empty($contact->phone_pro)) {
- $contactList .= '('.dol_print_phone($contact->phone_pro).')';
- }
- }
- }
- }
-
- $footer .= $langs->trans('ActionOnContact').' : '.$contactList;
- } elseif (empty($objcon->id) && isset($histo[$key]['contact_id']) && $histo[$key]['contact_id'] > 0) {
- $contact = new Contact($db);
- $result = $contact->fetch($histo[$key]['contact_id']);
-
- if ($result < 0) {
- dol_print_error($db, $contact->error);
- }
-
- if ($result > 0) {
- $footer .= $contact->getNomUrl(1);
- if (isset($histo[$key]['acode']) && $histo[$key]['acode'] == 'AC_TEL') {
- if (!empty($contact->phone_pro)) {
- $footer .= '('.dol_print_phone($contact->phone_pro).')';
- }
- }
- }
- }
-
- $documents = getTicketActionCommEcmList($actionstatic);
- if (!empty($documents)) {
- $footer .= '
';
- foreach ($documents as $doc) {
- $footer .= '
id.'" ';
- $footer .= ' data-path="'.$doc->filepath.'"';
- $footer .= ' data-filename="'.dol_escape_htmltag($doc->filename).'" ';
- $footer .= '>';
-
- $filePath = DOL_DATA_ROOT.'/'.$doc->filepath.'/'.$doc->filename;
- $mime = dol_mimetype($filePath);
- $file = $actionstatic->id.'/'.$doc->filename;
- $thumb = $actionstatic->id.'/thumbs/'.substr($doc->filename, 0, strrpos($doc->filename, '.')).'_mini'.substr($doc->filename, strrpos($doc->filename, '.'));
- $doclink = dol_buildpath('document.php', 1).'?modulepart=actions&attachment=0&file='.urlencode($file).'&entity='.$conf->entity;
- $viewlink = dol_buildpath('viewimage.php', 1).'?modulepart=actions&file='.urlencode($thumb).'&entity='.$conf->entity;
-
- $mimeAttr = ' mime="'.$mime.'" ';
- $class = '';
- if (in_array($mime, array('image/png', 'image/jpeg', 'application/pdf'))) {
- $class .= ' documentpreview';
- }
-
- $footer .= '';
- $footer .= img_mime($filePath).' '.$doc->filename;
- $footer .= ' ';
-
- $footer .= ' ';
- }
- $footer .= '
';
- }
-
- if (!empty($footer)) {
- $out .= '';
- }
-
- $out .= '
'."\n"; // end timeline-item
-
- $out .= ' ';
- $out .= '';
-
- $i++;
- }
-
- $out .= " \n";
-
- if (empty($histo)) {
- $out .= ''.$langs->trans("NoRecordFound").' ';
- }
- }
-
- if ($noprint) {
- return $out;
- } else {
- print $out;
- }
-}
-
-/**
- * Get timeline icon
- * @param ActionComm $actionstatic actioncomm
- * @param array $histo histo
- * @param int $key key
- * @return string
- */
-function getTicketTimelineIcon($actionstatic, &$histo, $key)
-{
- global $conf, $langs;
- $out = ''."\n";
- $iconClass = 'fa fa-comments';
- $img_picto = '';
- $colorClass = '';
- $pictoTitle = '';
-
- if ($histo[$key]['percent'] == -1) {
- $colorClass = 'timeline-icon-not-applicble';
- $pictoTitle = $langs->trans('StatusNotApplicable');
- } elseif ($histo[$key]['percent'] == 0) {
- $colorClass = 'timeline-icon-todo';
- $pictoTitle = $langs->trans('StatusActionToDo').' (0%)';
- } elseif ($histo[$key]['percent'] > 0 && $histo[$key]['percent'] < 100) {
- $colorClass = 'timeline-icon-in-progress';
- $pictoTitle = $langs->trans('StatusActionInProcess').' ('.$histo[$key]['percent'].'%)';
- } elseif ($histo[$key]['percent'] >= 100) {
- $colorClass = 'timeline-icon-done';
- $pictoTitle = $langs->trans('StatusActionDone').' (100%)';
- }
-
- if ($actionstatic->code == 'AC_TICKET_CREATE') {
- $iconClass = 'fa fa-ticket';
- } elseif ($actionstatic->code == 'AC_TICKET_MODIFY') {
- $iconClass = 'fa fa-pencilxxx';
- } elseif ($actionstatic->code == 'TICKET_MSG') {
- $iconClass = 'fa fa-comments';
- } elseif ($actionstatic->code == 'TICKET_MSG_PRIVATE') {
- $iconClass = 'fa fa-mask';
- } elseif (!empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
- if ($actionstatic->type_picto) {
- $img_picto = img_picto('', $actionstatic->type_picto);
- } else {
- if ($actionstatic->type_code == 'AC_RDV') {
- $iconClass = 'fa fa-handshake';
- } elseif ($actionstatic->type_code == 'AC_TEL') {
- $iconClass = 'fa fa-phone';
- } elseif ($actionstatic->type_code == 'AC_FAX') {
- $iconClass = 'fa fa-fax';
- } elseif ($actionstatic->type_code == 'AC_EMAIL') {
- $iconClass = 'fa fa-envelope';
- } elseif ($actionstatic->type_code == 'AC_INT') {
- $iconClass = 'fa fa-shipping-fast';
- } elseif ($actionstatic->type_code == 'AC_OTH_AUTO') {
- $iconClass = 'fa fa-robot';
- } elseif (!preg_match('/_AUTO/', $actionstatic->type_code)) {
- $iconClass = 'fa fa-robot';
- }
- }
- }
-
- $out .= ''.$img_picto.' '."\n";
- return $out;
-}
-
-/**
- * getTicketActionCommEcmList
- *
- * @param ActionComm $object Object ActionComm
- * @return array Array of documents in index table
- */
-function getTicketActionCommEcmList($object)
-{
- global $conf, $db;
-
- $documents = array();
-
- $sql = 'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename';
- $sql .= ' FROM '.MAIN_DB_PREFIX.'ecm_files ecm';
- $sql .= " WHERE ecm.filepath = 'agenda/".((int) $object->id)."'";
- //$sql.= " ecm.src_object_type = '".$db->escape($object->element)."' AND ecm.src_object_id = ".((int) $object->id); // Old version didn't add object_type during upload
- $sql .= ' ORDER BY ecm.position ASC';
-
- $resql = $db->query($sql);
- if ($resql) {
- if ($db->num_rows($resql)) {
- while ($obj = $db->fetch_object($resql)) {
- $documents[$obj->id] = $obj;
- }
- }
- }
-
- return $documents;
-}
diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php
index 9eb65532afc..273e7285273 100644
--- a/htdocs/core/lib/usergroups.lib.php
+++ b/htdocs/core/lib/usergroups.lib.php
@@ -99,7 +99,7 @@ function user_prepare_head(User $object)
$h++;
}
- if (!empty($conf->clicktodial->enabled)) {
+ if (isModEnabled('clicktodial')) {
$head[$h][0] = DOL_URL_ROOT.'/user/clicktodial.php?id='.$object->id;
$head[$h][1] = $langs->trans("ClickToDial");
$head[$h][2] = 'clicktodial';
@@ -157,7 +157,10 @@ function user_prepare_head(User $object)
if (empty($user->socid)) {
// Notes
$nbNote = 0;
- if (!empty($object->note)) {
+ if (!empty($object->note_public)) {
+ $nbNote++;
+ }
+ if (!empty($object->note_private)) {
$nbNote++;
}
$head[$h][0] = DOL_URL_ROOT.'/user/note.php?id='.$object->id;
diff --git a/htdocs/core/lib/website.lib.php b/htdocs/core/lib/website.lib.php
index 4b43230adda..c258e3198ce 100644
--- a/htdocs/core/lib/website.lib.php
+++ b/htdocs/core/lib/website.lib.php
@@ -936,7 +936,7 @@ function getSocialNetworkSharingLinks()
* @param string $langcode Language code ('' or 'en', 'fr', 'es', ...)
* @param array $otherfilters Other filters
* @param int $status 0 or 1, or -1 for both
- * @return string HTML content
+ * @return array Array with results of search
*/
function getPagesFromSearchCriterias($type, $algo, $searchstring, $max = 25, $sortfield = 'date_creation', $sortorder = 'DESC', $langcode = '', $otherfilters = 'null', $status = 1)
{
@@ -974,6 +974,8 @@ function getPagesFromSearchCriterias($type, $algo, $searchstring, $max = 25, $so
$found = 0;
if (!$error && (empty($max) || ($found < $max)) && (preg_match('/meta/', $algo) || preg_match('/content/', $algo))) {
+ include_once DOL_DOCUMENT_ROOT.'/website/class/websitepage.class.php';
+
$sql = 'SELECT wp.rowid FROM '.MAIN_DB_PREFIX.'website_page as wp';
if (is_array($otherfilters) && !empty($otherfilters['category'])) {
$sql .= ', '.MAIN_DB_PREFIX.'categorie_website_page as cwp';
@@ -983,7 +985,7 @@ function getPagesFromSearchCriterias($type, $algo, $searchstring, $max = 25, $so
$sql .= " AND wp.status = ".((int) $status);
}
if ($langcode) {
- $sql .= " AND wp.lang ='".$db->escape($langcode)."'";
+ $sql .= " AND wp.lang = '".$db->escape($langcode)."'";
}
if ($type) {
$tmparrayoftype = explode(',', $type);
@@ -996,11 +998,11 @@ function getPagesFromSearchCriterias($type, $algo, $searchstring, $max = 25, $so
$sql .= " AND (";
$searchalgo = '';
if (preg_match('/meta/', $algo)) {
- $searchalgo .= ($searchalgo ? ' OR ' : '')."wp.title LIKE '%".$db->escapeforlike($db->escape($searchstring))."%' OR wp.description LIKE '%".$db->escapeforlike($db->escape($searchstring))."%'";
- $searchalgo .= ($searchalgo ? ' OR ' : '')."wp.keywords LIKE '".$db->escapeforlike($db->escape($searchstring)).",%' OR wp.keywords LIKE '% ".$db->escapeforlike($db->escape($searchstring))."%'"; // TODO Use a better way to scan keywords
+ $searchalgo .= ($searchalgo ? ' OR ' : '')."wp.title LIKE '%".$db->escape($db->escapeforlike($searchstring))."%' OR wp.description LIKE '%".$db->escape($db->escapeforlike($searchstring))."%'";
+ $searchalgo .= ($searchalgo ? ' OR ' : '')."wp.keywords LIKE '".$db->escape($db->escapeforlike($searchstring)).",%' OR wp.keywords LIKE '% ".$db->escape($db->escapeforlike($searchstring))."%'"; // TODO Use a better way to scan keywords
}
if (preg_match('/content/', $algo)) {
- $searchalgo .= ($searchalgo ? ' OR ' : '')."wp.content LIKE '%".$db->escapeforlike($db->escape($searchstring))."%'";
+ $searchalgo .= ($searchalgo ? ' OR ' : '')."wp.content LIKE '%".$db->escape($db->escapeforlike($searchstring))."%'";
}
$sql .= $searchalgo;
if (is_array($otherfilters) && !empty($otherfilters['category'])) {
@@ -1012,6 +1014,7 @@ function getPagesFromSearchCriterias($type, $algo, $searchstring, $max = 25, $so
//print $sql;
$resql = $db->query($sql);
+
if ($resql) {
$i = 0;
while (($obj = $db->fetch_object($resql)) && ($i < $max || $max == 0)) {
diff --git a/htdocs/core/lib/website2.lib.php b/htdocs/core/lib/website2.lib.php
index 74e6bc4d9e8..0b836399f43 100644
--- a/htdocs/core/lib/website2.lib.php
+++ b/htdocs/core/lib/website2.lib.php
@@ -563,7 +563,7 @@ function dolSaveLicense($file, $content)
*/
function showWebsiteTemplates(Website $website)
{
- global $conf, $langs, $db, $form;
+ global $conf, $langs, $db, $form, $user;
$dirthemes = array('/doctemplates/websites');
if (!empty($conf->modules_parts['websitetemplates'])) { // Using this feature slow down application
@@ -582,17 +582,21 @@ function showWebsiteTemplates(Website $website)
// Title
print '';
print $form->textwithpicto($langs->trans("Templates"), $langs->trans("ThemeDir").' : '.join(", ", $dirthemes));
+ print ' ';
+ print 'ref).'&importsite=1" target="_blank" rel="noopener noreferrer external">';
+ print img_picto('', 'refresh');
+ print ' ';
print ' ';
print '';
$url = 'https://www.dolistore.com/43-web-site-templates';
print '';
- print $langs->trans('DownloadMoreSkins');
+ print img_picto('', 'globe', 'class="pictofixedwidth"').$langs->trans('DownloadMoreSkins');
print ' ';
print ' ';
print '';
- print '';
+ print '
';
if (count($dirthemes)) {
$i = 0;
@@ -603,11 +607,10 @@ function showWebsiteTemplates(Website $website)
$handle = opendir($dirtheme);
if (is_resource($handle)) {
while (($subdir = readdir($handle)) !== false) {
- if (is_file($dirtheme."/".$subdir) && substr($subdir, 0, 1) <> '.'
- && substr($subdir, 0, 3) <> 'CVS' && preg_match('/\.zip$/i', $subdir)) {
- $subdirwithoutzip = preg_replace('/\.zip$/i', '', $subdir);
+ if (is_file($dirtheme."/".$subdir) && substr($subdir, 0, 1) <> '.' && substr($subdir, 0, 3) <> 'CVS' && preg_match('/\.zip$/i', $subdir)) {
+ $subdirwithoutzip = preg_replace('/\.zip$/i', '', $subdir);
- // Disable not stable themes (dir ends with _exp or _dev)
+ // Disable not stable themes (dir ends with _exp or _dev)
if ($conf->global->MAIN_FEATURES_LEVEL < 2 && preg_match('/_dev$/i', $subdir)) {
continue;
}
@@ -615,38 +618,44 @@ function showWebsiteTemplates(Website $website)
continue;
}
- print '
';
+ print '
';
- $file = $dirtheme."/".$subdirwithoutzip.".jpg";
- $url = DOL_URL_ROOT.'/viewimage.php?modulepart=doctemplateswebsite&file='.$subdirwithoutzip.".jpg";
+ $templatedir = $dirtheme."/".$subdir;
+ $file = $dirtheme."/".$subdirwithoutzip.".jpg";
+ $url = DOL_URL_ROOT.'/viewimage.php?modulepart=doctemplateswebsite&file='.$subdirwithoutzip.".jpg";
if (!file_exists($file)) {
$url = DOL_URL_ROOT.'/public/theme/common/nophoto.png';
}
- $originalfile = basename($file);
- $entity = $conf->entity;
- $modulepart = 'doctemplateswebsite';
- $cache = '';
- $title = $file;
+ $originalfile = basename($file);
+ $entity = $conf->entity;
+ $modulepart = 'doctemplateswebsite';
+ $cache = '';
+ $title = $file;
- $ret = '';
- $urladvanced = getAdvancedPreviewUrl($modulepart, $originalfile, 1, '&entity='.$entity);
+ $ret = '';
+ $urladvanced = getAdvancedPreviewUrl($modulepart, $originalfile, 1, '&entity='.$entity);
if (!empty($urladvanced)) {
$ret .= '
';
} else {
- $ret .= ' ';
+ $ret .= ' ';
}
- print $ret;
- print ' ';
- print ' ';
+ print $ret;
+ print '
';
+ print '';
- print '
';
- print $subdir.' ('.dol_print_size(dol_filesize($dirtheme."/".$subdir), 1, 1).')';
- print '
ref).'&templateuserfile='.urlencode($subdir).'" class="button">'.$langs->trans("Load").' ';
- print '
';
+ print '
';
+ print $subdir;
+ print '
';
+ print '
'.dol_print_size(dol_filesize($dirtheme."/".$subdir), 1, 1).' - '.dol_print_date(dol_filemtime($templatedir), 'dayhour', 'tzuserrel').' ';
+ if ($user->hasRight('website', 'delete')) {
+ print '
ref).'&templateuserfile='.urlencode($subdir).'">'.img_picto('', 'delete').' ';
+ }
+ print '
ref).'&templateuserfile='.urlencode($subdir).'" class="button">'.$langs->trans("Load").' ';
+ print '
';
- $i++;
+ $i++;
}
}
}
diff --git a/htdocs/core/login/functions_ldap.php b/htdocs/core/login/functions_ldap.php
index cd4ed16eae6..faf0024d801 100644
--- a/htdocs/core/login/functions_ldap.php
+++ b/htdocs/core/login/functions_ldap.php
@@ -77,7 +77,7 @@ function check_user_password_ldap($usertotest, $passwordtotest, $entitytotest)
$ldapdn = $dolibarr_main_auth_ldap_dn;
$ldapadminlogin = $dolibarr_main_auth_ldap_admin_login;
$ldapadminpass = $dolibarr_main_auth_ldap_admin_pass;
- $ldapdebug = (empty($dolibarr_main_auth_ldap_debug) || $dolibarr_main_auth_ldap_debug == "false" ? false : true);
+ $ldapdebug = ((empty($dolibarr_main_auth_ldap_debug) || $dolibarr_main_auth_ldap_debug == "false") ? false : true);
if ($ldapdebug) {
print "DEBUG: Logging LDAP steps
\n";
@@ -94,9 +94,9 @@ function check_user_password_ldap($usertotest, $passwordtotest, $entitytotest)
if ($ldapdebug) {
dol_syslog("functions_ldap::check_user_password_ldap Server:".join(',', $ldap->server).", Port:".$ldap->serverPort.", Protocol:".$ldap->ldapProtocolVersion.", Type:".$ldap->serverType);
- dol_syslog("functions_ldap::check_user_password_ldap uid/samacountname=".$ldapuserattr.", dn=".$ldapdn.", Admin:".$ldap->searchUser.", Pass:".$ldap->searchPassword);
+ dol_syslog("functions_ldap::check_user_password_ldap uid/samaccountname=".$ldapuserattr.", dn=".$ldapdn.", Admin:".$ldap->searchUser.", Pass:".dol_trunc($ldap->searchPassword, 3));
print "DEBUG: Server:".join(',', $ldap->server).", Port:".$ldap->serverPort.", Protocol:".$ldap->ldapProtocolVersion.", Type:".$ldap->serverType."
\n";
- print "DEBUG: uid/samacountname=".$ldapuserattr.", dn=".$ldapdn.", Admin:".$ldap->searchUser.", Pass:".$ldap->searchPassword."
\n";
+ print "DEBUG: uid/samaccountname=".$ldapuserattr.", dn=".$ldapdn.", Admin:".$ldap->searchUser.", Pass:".dol_trunc($ldap->searchPassword, 3)."
\n";
}
$resultFetchLdapUser = 0;
diff --git a/htdocs/core/menus/init_menu_auguria.sql b/htdocs/core/menus/init_menu_auguria.sql
index 8dc3f1b1374..e6fc16a62d6 100644
--- a/htdocs/core/menus/init_menu_auguria.sql
+++ b/htdocs/core/menus/init_menu_auguria.sql
@@ -138,7 +138,7 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->stock->enabled', __HANDLER__, 'left', 3102__+MAX_llx_menu__, 'products', '', 3100__+MAX_llx_menu__, '/product/stock/list.php?mainmenu=products', 'List', 1, 'stocks', '$user->rights->stock->lire', '', 2, 1, __ENTITY__);
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->stock->enabled', __HANDLER__, 'left', 3104__+MAX_llx_menu__, 'products', '', 3100__+MAX_llx_menu__, '/product/stock/movement_list.php?mainmenu=products', 'Movements', 1, 'stocks', '$user->rights->stock->mouvement->lire', '', 2, 3, __ENTITY__);
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->stock->enabled && $conf->supplier_order->enabled', __HANDLER__, 'left', 3105__+MAX_llx_menu__, 'products', '', 3100__+MAX_llx_menu__, '/product/stock/replenish.php?mainmenu=products', 'Replenishments', 1, 'stocks', '$user->rights->stock->mouvement->creer && $user->rights->fournisseur->lire', '', 2, 4, __ENTITY__);
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->stock->enabled', __HANDLER__, 'left', 3106__+MAX_llx_menu__, 'products', '', 3100__+MAX_llx_menu__, '/product/stock/massstockmove.php?mainmenu=products', 'MassStockTransferShort', 1, 'stocks', '$user->rights->stock->mouvement->creer', '', 2, 5, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->stock->enabled', __HANDLER__, 'left', 3106__+MAX_llx_menu__, 'products', '', 3100__+MAX_llx_menu__, '/product/stock/massstockmove.php?init=1&mainmenu=products', 'MassStockTransferShort', 1, 'stocks', '$user->rights->stock->mouvement->creer', '', 2, 5, __ENTITY__);
-- Product - Categories
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->categorie->enabled', __HANDLER__, 'left', 3200__+MAX_llx_menu__, 'products', 'cat', 3__+MAX_llx_menu__, '/categories/index.php?mainmenu=products&leftmenu=cat&type=0', 'Categories', 0, 'categories', '$user->rights->categorie->lire', '', 2, 4, __ENTITY__);
@@ -157,15 +157,15 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->reception->enabled && $leftmenu=="receptions"', __HANDLER__, 'left', 1353__+MAX_llx_menu__, 'commercial', '', 1350__+MAX_llx_menu__, '/reception/stats/index.php?mainmenu=commercial&leftmenu=receptions', 'Statistics', 1, 'receptions', '$user->rights->reception->lire', '', 2, 2, __ENTITY__);
-- Commercial - Proposals
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled', __HANDLER__, 'left', 1100__+MAX_llx_menu__, 'commercial', 'propals', 5__+MAX_llx_menu__, '/comm/propal/index.php?mainmenu=commercial&leftmenu=propals', 'Proposals', 0, 'propal', '$user->rights->propale->lire', '', 2, 4, __ENTITY__);
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled', __HANDLER__, 'left', 1101__+MAX_llx_menu__, 'commercial', '', 1100__+MAX_llx_menu__, '/comm/propal/card.php?mainmenu=commercial&action=create&leftmenu=propals', 'NewPropal', 1, 'propal', '$user->rights->propale->creer', '', 2, 0, __ENTITY__);
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled', __HANDLER__, 'left', 1102__+MAX_llx_menu__, 'commercial', '', 1100__+MAX_llx_menu__, '/comm/propal/list.php?mainmenu=commercial&leftmenu=propals', 'List', 1, 'propal', '$user->rights->propale->lire', '', 2, 1, __ENTITY__);
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled && $leftmenu=="propals"', __HANDLER__, 'left', 1103__+MAX_llx_menu__, 'commercial', '', 1102__+MAX_llx_menu__, '/comm/propal/list.php?mainmenu=commercial&leftmenu=propals&search_status=0', 'PropalsDraft', 1, 'propal', '$user->rights->propale->lire', '', 2, 2, __ENTITY__);
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled && $leftmenu=="propals"', __HANDLER__, 'left', 1104__+MAX_llx_menu__, 'commercial', '', 1102__+MAX_llx_menu__, '/comm/propal/list.php?mainmenu=commercial&leftmenu=propals&search_status=1', 'PropalsOpened', 1, 'propal', '$user->rights->propale->lire', '', 2, 3, __ENTITY__);
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled && $leftmenu=="propals"', __HANDLER__, 'left', 1105__+MAX_llx_menu__, 'commercial', '', 1102__+MAX_llx_menu__, '/comm/propal/list.php?mainmenu=commercial&leftmenu=propals&search_status=2', 'PropalStatusSigned', 1, 'propal', '$user->rights->propale->lire', '', 2, 4, __ENTITY__);
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled && $leftmenu=="propals"', __HANDLER__, 'left', 1106__+MAX_llx_menu__, 'commercial', '', 1102__+MAX_llx_menu__, '/comm/propal/list.php?mainmenu=commercial&leftmenu=propals&search_status=3', 'PropalStatusNotSigned', 1, 'propal', '$user->rights->propale->lire', '', 2, 5, __ENTITY__);
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled && $leftmenu=="propals"', __HANDLER__, 'left', 1107__+MAX_llx_menu__, 'commercial', '', 1102__+MAX_llx_menu__, '/comm/propal/list.php?mainmenu=commercial&leftmenu=propals&search_status=4', 'PropalStatusBilled', 1, 'propal', '$user->rights->propale->lire', '', 2, 6, __ENTITY__);
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled', __HANDLER__, 'left', 1110__+MAX_llx_menu__, 'commercial', '', 1100__+MAX_llx_menu__, '/comm/propal/stats/index.php?mainmenu=commercial&leftmenu=propals', 'Statistics', 1, 'propal', '$user->rights->propale->lire', '', 2, 4, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled', __HANDLER__, 'left', 1100__+MAX_llx_menu__, 'commercial', 'propals', 5__+MAX_llx_menu__, '/comm/propal/index.php?mainmenu=commercial&leftmenu=propals', 'Proposals', 0, 'propal', '$user->rights->propal->lire', '', 2, 4, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled', __HANDLER__, 'left', 1101__+MAX_llx_menu__, 'commercial', '', 1100__+MAX_llx_menu__, '/comm/propal/card.php?mainmenu=commercial&action=create&leftmenu=propals', 'NewPropal', 1, 'propal', '$user->rights->propal->creer', '', 2, 0, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled', __HANDLER__, 'left', 1102__+MAX_llx_menu__, 'commercial', '', 1100__+MAX_llx_menu__, '/comm/propal/list.php?mainmenu=commercial&leftmenu=propals', 'List', 1, 'propal', '$user->rights->propal->lire', '', 2, 1, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled && $leftmenu=="propals"', __HANDLER__, 'left', 1103__+MAX_llx_menu__, 'commercial', '', 1102__+MAX_llx_menu__, '/comm/propal/list.php?mainmenu=commercial&leftmenu=propals&search_status=0', 'PropalsDraft', 1, 'propal', '$user->rights->propal->lire', '', 2, 2, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled && $leftmenu=="propals"', __HANDLER__, 'left', 1104__+MAX_llx_menu__, 'commercial', '', 1102__+MAX_llx_menu__, '/comm/propal/list.php?mainmenu=commercial&leftmenu=propals&search_status=1', 'PropalsOpened', 1, 'propal', '$user->rights->propal->lire', '', 2, 3, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled && $leftmenu=="propals"', __HANDLER__, 'left', 1105__+MAX_llx_menu__, 'commercial', '', 1102__+MAX_llx_menu__, '/comm/propal/list.php?mainmenu=commercial&leftmenu=propals&search_status=2', 'PropalStatusSigned', 1, 'propal', '$user->rights->propal->lire', '', 2, 4, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled && $leftmenu=="propals"', __HANDLER__, 'left', 1106__+MAX_llx_menu__, 'commercial', '', 1102__+MAX_llx_menu__, '/comm/propal/list.php?mainmenu=commercial&leftmenu=propals&search_status=3', 'PropalStatusNotSigned', 1, 'propal', '$user->rights->propal->lire', '', 2, 5, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled && $leftmenu=="propals"', __HANDLER__, 'left', 1107__+MAX_llx_menu__, 'commercial', '', 1102__+MAX_llx_menu__, '/comm/propal/list.php?mainmenu=commercial&leftmenu=propals&search_status=4', 'PropalStatusBilled', 1, 'propal', '$user->rights->propal->lire', '', 2, 6, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->propal->enabled', __HANDLER__, 'left', 1110__+MAX_llx_menu__, 'commercial', '', 1100__+MAX_llx_menu__, '/comm/propal/stats/index.php?mainmenu=commercial&leftmenu=propals', 'Statistics', 1, 'propal', '$user->rights->propal->lire', '', 2, 4, __ENTITY__);
-- Commercial - Customer's orders
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->commande->enabled', __HANDLER__, 'left', 1200__+MAX_llx_menu__, 'commercial', 'orders', 5__+MAX_llx_menu__, '/commande/index.php?mainmenu=commercial&leftmenu=orders', 'CustomersOrders', 0, 'orders', '$user->rights->commande->lire', '', 2, 5, __ENTITY__);
@@ -450,7 +450,7 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->adherent->enabled', __HANDLER__, 'left', 4202__+MAX_llx_menu__, 'members', '', 4200__+MAX_llx_menu__, '/adherents/list.php', 'List', 1, 'members', '$user->rights->adherent->lire', '', 2, 1, __ENTITY__);
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->adherent->enabled', __HANDLER__, 'left', 4203__+MAX_llx_menu__, 'members', '', 4202__+MAX_llx_menu__, '/adherents/list.php?mainmenu=members&leftmenu=members&statut=-1', 'MenuMembersToValidate', 2, 'members', '$user->rights->adherent->lire', '', 2, 2, __ENTITY__);
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->adherent->enabled', __HANDLER__, 'left', 4204__+MAX_llx_menu__, 'members', '', 4202__+MAX_llx_menu__, '/adherents/list.php?mainmenu=members&leftmenu=members&statut=1', 'MenuMembersValidated', 2, 'members', '$user->rights->adherent->lire', '', 2, 3, __ENTITY__);
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->adherent->enabled', __HANDLER__, 'left', 4205__+MAX_llx_menu__, 'members', '', 4204__+MAX_llx_menu__, '/adherents/list.php?mainmenu=members&leftmenu=members&statut=1&filter=withoutsubscription', 'WithoutSubscription', 2, 'members', '$user->rights->adherent->lire', '', 2, 4, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->adherent->enabled', __HANDLER__, 'left', 4205__+MAX_llx_menu__, 'members', '', 4204__+MAX_llx_menu__, '/adherents/list.php?mainmenu=members&leftmenu=members&statut=1&filter=waitingsubscription', 'WaitingSubscription', 2, 'members', '$user->rights->adherent->lire', '', 2, 4, __ENTITY__);
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->adherent->enabled', __HANDLER__, 'left', 4206__+MAX_llx_menu__, 'members', '', 4204__+MAX_llx_menu__, '/adherents/list.php?mainmenu=members&leftmenu=members&statut=1&filter=outofdate', 'UpToDate', 2, 'members', '$user->rights->adherent->lire', '', 2, 4, __ENTITY__);
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->adherent->enabled', __HANDLER__, 'left', 4207__+MAX_llx_menu__, 'members', '', 4204__+MAX_llx_menu__, '/adherents/list.php?mainmenu=members&leftmenu=members&statut=1&filter=uptodate', 'OutOfDate', 2, 'members', '$user->rights->adherent->lire', '', 2, 5, __ENTITY__);
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->adherent->enabled', __HANDLER__, 'left', 4208__+MAX_llx_menu__, 'members', '', 4202__+MAX_llx_menu__, '/adherents/list.php?mainmenu=members&leftmenu=members&statut=0', 'MenuMembersResiliated', 2, 'members', '$user->rights->adherent->lire', '', 2, 6, __ENTITY__);
@@ -473,9 +473,9 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left
-- HRM - Employee
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->hrm->enabled', __HANDLER__, 'left', 4600__+MAX_llx_menu__, 'hrm', 'hrm', 15__+MAX_llx_menu__, '/user/list.php?mainmenu=hrm&leftmenu=hrm&mode=employee', 'Employees', 0, 'hrm', '$user->rights->user->user->lire', '', 0, 1, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->hrm->enabled', __HANDLER__, 'left', 4600__+MAX_llx_menu__, 'hrm', 'hrm', 15__+MAX_llx_menu__, '/user/list.php?mainmenu=hrm&leftmenu=hrm&contextpage=employeelist', 'Employees', 0, 'hrm', '$user->rights->user->user->lire', '', 0, 1, __ENTITY__);
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->hrm->enabled', __HANDLER__, 'left', 4601__+MAX_llx_menu__, 'hrm', '', 4600__+MAX_llx_menu__, '/user/card.php?mainmenu=hrm&action=create&employee=1', 'NewEmployee', 1, 'hrm', '$user->rights->user->user->creer', '', 0, 1, __ENTITY__);
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->hrm->enabled', __HANDLER__, 'left', 4602__+MAX_llx_menu__, 'hrm', '', 4600__+MAX_llx_menu__, '/user/list.php?mainmenu=hrm&leftmenu=hrm&mode=employee&contextpage=employeelist', 'List', 1, 'hrm', '$user->rights->user->user->lire', '', 0, 2, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->hrm->enabled', __HANDLER__, 'left', 4602__+MAX_llx_menu__, 'hrm', '', 4600__+MAX_llx_menu__, '/user/list.php?mainmenu=hrm&leftmenu=hrm&contextpage=employeelist', 'List', 1, 'hrm', '$user->rights->user->user->lire', '', 0, 2, __ENTITY__);
-- HRM - Holiday
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5000__+MAX_llx_menu__, 'hrm', 'hrm', 15__+MAX_llx_menu__, '/holiday/list.php?mainmenu=hrm&leftmenu=hrm', 'CPTitreMenu', 0, 'holiday', '$user->rights->holiday->read', '', 0, 1, __ENTITY__);
diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php
index 5aa2ea009a0..a09f85e1f4e 100644
--- a/htdocs/core/menus/standard/eldy.lib.php
+++ b/htdocs/core/menus/standard/eldy.lib.php
@@ -205,10 +205,23 @@ function print_eldy_menu($db, $atarget, $type_user, &$tabMenu, &$menu, $noout =
'perms'=> ($user->hasRight('projet', 'lire') ? 1 : 0),
'module'=>'projet'
);
+
+ if ($mode == 'jmobile') {
+ $titleboth = $langs->trans("LeadsOrProjects");
+ } else {
+ $titleboth = $langs->trans("Projects");
+ }
+ if (empty($conf->global->PROJECT_USE_OPPORTUNITIES)) {
+ $titleboth = $langs->trans("Projects");
+ }
+ if (isset($conf->global->PROJECT_USE_OPPORTUNITIES) && $conf->global->PROJECT_USE_OPPORTUNITIES == 2) { // 2 = leads only
+ $titleboth = $langs->trans("Leads");
+ }
+
$menu_arr[] = array(
- 'name' => 'Projet',
+ 'name' => 'Project',
'link' => '/projet/index.php?mainmenu=project&leftmenu=',
- 'title' => (!empty($conf->global->PROJECT_USE_OPPORTUNITIES) && $conf->global->PROJECT_USE_OPPORTUNITIES == 2 ? "Leads" : "Projects"),
+ 'title' => $titleboth,
'level' => 0,
'enabled' => $showmode = isVisibleToUserType($type_user, $tmpentry, $listofmodulesforexternal),
'target' => $atarget,
@@ -397,7 +410,7 @@ function print_eldy_menu($db, $atarget, $type_user, &$tabMenu, &$menu, $noout =
}
$menu_arr[] = array(
'name' => 'Ticket',
- 'link' => '/ticket/index.php?mainmenu=ticket&leftmenu=',
+ 'link' => $link,
'title' => "Tickets",
'level' => 0,
'enabled' => $showmode = isVisibleToUserType($type_user, $tmpentry, $listofmodulesforexternal),
@@ -1102,7 +1115,7 @@ function get_left_menu_home($mainmenu, &$newmenu, $usemenuhider = 1, $leftmenu =
$newmenu->add("/admin/pdf.php?mainmenu=home", $langs->trans("PDF"), 1);
$warnpicto = '';
- if (!empty($conf->global->MAIN_MAIL_SENDMODE) && $conf->global->MAIN_MAIL_SENDMODE == 'mail' && empty($conf->global->MAIN_HIDE_WARNING_TO_ENCOURAGE_SMTP_SETUP)) {
+ if (getDolGlobalString('MAIN_MAIL_SENDMODE', 'mail') == 'mail' && empty($conf->global->MAIN_HIDE_WARNING_TO_ENCOURAGE_SMTP_SETUP)) {
$langs->load("errors");
$warnpicto = img_warning($langs->trans("WarningPHPMailD"));
}
@@ -1714,9 +1727,13 @@ function get_left_menu_accountancy($mainmenu, &$newmenu, $usemenuhider = 1, $lef
if ($nature) {
$langs->load('accountancy');
$journallabel = $langs->transnoentities($objp->label); // Labels in this table are set by loading llx_accounting_abc.sql. Label can be 'ACCOUNTING_SELL_JOURNAL', 'InventoryJournal', ...
- $newmenu->add('/accountancy/journal/'.$nature.'journal.php?mainmenu=accountancy&leftmenu=accountancy_journal&id_journal='.$objp->rowid, $journallabel, 2, $user->hasRight('accounting', 'comptarapport', 'lire'));
+
+ $key = $langs->trans("AccountingJournalType".strtoupper($objp->nature));
+ $transferlabel = ($objp->nature && $key != "AccountingJournalType".strtoupper($langs->trans($objp->nature)) ? $key : $objp->label);
+
+ $newmenu->add('/accountancy/journal/'.$nature.'journal.php?mainmenu=accountancy&leftmenu=accountancy_journal&id_journal='.$objp->rowid, $transferlabel, 2, $user->hasRight('accounting', 'comptarapport', 'lire'));
}
- $i++;
+ $i++;
}
} else {
// Should not happend. Entries are added
@@ -2040,7 +2057,7 @@ function get_left_menu_products($mainmenu, &$newmenu, $usemenuhider = 1, $leftme
$newmenu->add("/product/stock/list.php", $langs->trans("List"), 1, $user->hasRight('stock', 'lire'));
$newmenu->add("/product/stock/movement_list.php", $langs->trans("Movements"), 1, $user->hasRight('stock', 'mouvement', 'lire'));
- $newmenu->add("/product/stock/massstockmove.php", $langs->trans("MassStockTransferShort"), 1, $user->hasRight('stock', 'mouvement', 'creer'));
+ $newmenu->add("/product/stock/massstockmove.php?init=1", $langs->trans("MassStockTransferShort"), 1, $user->hasRight('stock', 'mouvement', 'creer'));
if (isModEnabled('supplier_order')) {
$newmenu->add("/product/stock/replenish.php", $langs->trans("Replenishment"), 1, $user->hasRight('stock', 'mouvement', 'creer') && $user->hasRight('fournisseur', 'lire'));
}
@@ -2238,9 +2255,9 @@ function get_left_menu_hrm($mainmenu, &$newmenu, $usemenuhider = 1, $leftmenu =
if (isModEnabled('hrm')) {
$langs->load("hrm");
- $newmenu->add("/user/list.php?mainmenu=hrm&leftmenu=hrm&mode=employee", $langs->trans("Employees"), 0, $user->hasRight('user', 'user', 'read'), '', $mainmenu, 'hrm', 0, '', '', '', img_picto('', 'user', 'class="paddingright pictofixedwidth"'));
+ $newmenu->add("/user/list.php?mainmenu=hrm&leftmenu=hrm&contextpage=employeelist", $langs->trans("Employees"), 0, $user->hasRight('user', 'user', 'read'), '', $mainmenu, 'hrm', 0, '', '', '', img_picto('', 'user', 'class="paddingright pictofixedwidth"'));
$newmenu->add("/user/card.php?mainmenu=hrm&leftmenu=hrm&action=create&employee=1", $langs->trans("NewEmployee"), 1, $user->hasRight('user', 'user', 'write'));
- $newmenu->add("/user/list.php?mainmenu=hrm&leftmenu=hrm&mode=employee&contextpage=employeelist", $langs->trans("List"), 1, $user->hasRight('user', 'user', 'read'));
+ $newmenu->add("/user/list.php?mainmenu=hrm&leftmenu=hrm&contextpage=employeelist", $langs->trans("List"), 1, $user->hasRight('user', 'user', 'read'));
$newmenu->add("/hrm/skill_list.php?mainmenu=hrm&leftmenu=hrm_sm", $langs->trans("SkillsManagement"), 0, $user->hasRight('hrm', 'all', 'read'), '', $mainmenu, 'hrm_sm', 0, '', '', '', img_picto('', 'shapes', 'class="paddingright pictofixedwidth"'));
@@ -2392,10 +2409,11 @@ function get_left_menu_members($mainmenu, &$newmenu, $usemenuhider = 1, $leftmen
$newmenu->add("/adherents/list.php?leftmenu=members", $langs->trans("List"), 1, $user->hasRight('adherent', 'read'));
$newmenu->add("/adherents/list.php?leftmenu=members&statut=-1", $langs->trans("MenuMembersToValidate"), 2, $user->hasRight('adherent', 'read'));
$newmenu->add("/adherents/list.php?leftmenu=members&statut=1", $langs->trans("MenuMembersValidated"), 2, $user->hasRight('adherent', 'read'));
- $newmenu->add("/adherents/list.php?leftmenu=members&statut=1&filter=withoutsubscription", $langs->trans("WithoutSubscription"), 3, $user->hasRight('adherent', 'read'));
+ $newmenu->add("/adherents/list.php?leftmenu=members&statut=1&filter=waitingsubscription", $langs->trans("WaitingSubscription"), 3, $user->hasRight('adherent', 'read'));
$newmenu->add("/adherents/list.php?leftmenu=members&statut=1&filter=uptodate", $langs->trans("UpToDate"), 3, $user->hasRight('adherent', 'read'));
$newmenu->add("/adherents/list.php?leftmenu=members&statut=1&filter=outofdate", $langs->trans("OutOfDate"), 3, $user->hasRight('adherent', 'read'));
$newmenu->add("/adherents/list.php?leftmenu=members&statut=0", $langs->trans("MenuMembersResiliated"), 2, $user->hasRight('adherent', 'read'));
+ $newmenu->add("/adherents/list.php?leftmenu=members&statut=-2", $langs->trans("MenuMembersExcluded"), 2, $user->hasRight('adherent', 'read'));
$newmenu->add("/adherents/stats/index.php?leftmenu=members", $langs->trans("MenuMembersStats"), 1, $user->hasRight('adherent', 'read'));
$newmenu->add("/adherents/cartes/carte.php?leftmenu=export", $langs->trans("MembersCards"), 1, $user->hasRight('adherent', 'export'));
diff --git a/htdocs/core/modules/DolibarrModules.class.php b/htdocs/core/modules/DolibarrModules.class.php
index 763973ac031..f6ee9da7d60 100644
--- a/htdocs/core/modules/DolibarrModules.class.php
+++ b/htdocs/core/modules/DolibarrModules.class.php
@@ -1881,7 +1881,7 @@ class DolibarrModules // Can not be abstract, because we need to instantiate it
$i = 0;
while ($i < $num) {
$obj2 = $this->db->fetch_object($resqlseladmin);
- dol_syslog(get_class($this)."::insert_permissions Add permission id '.$r_id.' to user id=".$obj2->rowid);
+ dol_syslog(get_class($this)."::insert_permissions Add permission id ".$r_id." to user id=".$obj2->rowid);
$tmpuser = new User($this->db);
$result = $tmpuser->fetch($obj2->rowid);
@@ -1968,13 +1968,14 @@ class DolibarrModules // Can not be abstract, because we need to instantiate it
$menu->menu_handler = 'all';
//$menu->module=strtolower($this->name); TODO When right_class will be same than module name
- $menu->module = empty($this->rights_class) ?strtolower($this->name) : $this->rights_class;
+ $menu->module = (empty($this->rights_class) ? strtolower($this->name) : $this->rights_class);
if (!$this->menu[$key]['fk_menu']) {
$menu->fk_menu = 0;
} else {
$foundparent = 0;
$fk_parent = $this->menu[$key]['fk_menu'];
+ $reg = array();
if (preg_match('/^r=/', $fk_parent)) { // old deprecated method
$fk_parent = str_replace('r=', '', $fk_parent);
if (isset($this->menu[$fk_parent]['rowid'])) {
diff --git a/htdocs/core/modules/asset/doc/doc_generic_asset_odt.modules.php b/htdocs/core/modules/asset/doc/doc_generic_asset_odt.modules.php
index b11e2a7e563..8be86dda944 100644
--- a/htdocs/core/modules/asset/doc/doc_generic_asset_odt.modules.php
+++ b/htdocs/core/modules/asset/doc/doc_generic_asset_odt.modules.php
@@ -173,7 +173,9 @@ class doc_generic_asset_odt extends ModelePDFAsset
if ($nbofiles) {
$texte .= '
';
}
diff --git a/htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php b/htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php
index 1e289930cf0..4b7c2bb0104 100644
--- a/htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php
+++ b/htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php
@@ -241,7 +241,7 @@ class pdf_standard_asset extends ModelePDFAsset
if (empty($object->lines[$i]->fk_product)) continue;
//var_dump($objphoto->ref);exit;
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
$pdir[0] = get_exdir($objphoto->id, 2, 0, 0, $objphoto, 'product').$objphoto->id."/photos/";
$pdir[1] = get_exdir(0, 0, 0, 0, $objphoto, 'product').dol_sanitizeFileName($objphoto->ref).'/';
} else {
@@ -347,7 +347,7 @@ class pdf_standard_asset extends ModelePDFAsset
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("PdfTitle")." ".$outputlangs->convToOutputCharset($object->thirdparty->name));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -383,10 +383,10 @@ class pdf_standard_asset extends ModelePDFAsset
$pdf->SetTextColor(0, 0, 0);
$tab_top = 90 + $top_shift;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 + $top_shift : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 + $top_shift : 10);
$tab_height = 130 - $top_shift;
$tab_height_newpage = 150;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$tab_height_newpage -= $top_shift;
}
@@ -430,7 +430,7 @@ class pdf_standard_asset extends ModelePDFAsset
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
// $this->_pagefoot($pdf,$object,$outputlangs,1);
@@ -488,7 +488,7 @@ class pdf_standard_asset extends ModelePDFAsset
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$height_note = $posyafter - $tab_top_newpage;
@@ -510,7 +510,7 @@ class pdf_standard_asset extends ModelePDFAsset
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
@@ -748,7 +748,7 @@ class pdf_standard_asset extends ModelePDFAsset
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
}
@@ -766,7 +766,7 @@ class pdf_standard_asset extends ModelePDFAsset
$pdf->useTemplate($tplidx);
}
$pagenb++;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
}
@@ -1170,8 +1170,7 @@ class pdf_standard_asset extends ModelePDFAsset
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'INVOICE_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext);
}
diff --git a/htdocs/core/modules/asset/mod_asset_standard.php b/htdocs/core/modules/asset/mod_asset_standard.php
index af28c0f9c5b..2e3ee3938e1 100644
--- a/htdocs/core/modules/asset/mod_asset_standard.php
+++ b/htdocs/core/modules/asset/mod_asset_standard.php
@@ -26,7 +26,7 @@
require_once DOL_DOCUMENT_ROOT.'/core/modules/asset/modules_asset.php';
/**
- * Class to manage customer order numbering rules standard
+ * Class to manage the Standard numbering rule for Asset
*/
class mod_asset_standard extends ModeleNumRefAsset
{
diff --git a/htdocs/core/modules/bank/doc/pdf_ban.modules.php b/htdocs/core/modules/bank/doc/pdf_ban.modules.php
index bbbd82ec1c7..ddc65b1ff8c 100644
--- a/htdocs/core/modules/bank/doc/pdf_ban.modules.php
+++ b/htdocs/core/modules/bank/doc/pdf_ban.modules.php
@@ -170,7 +170,7 @@ class pdf_ban extends ModeleBankAccountDoc
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("BAN"));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
diff --git a/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php b/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php
index e09fef45bf0..2995321eeb5 100644
--- a/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php
+++ b/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php
@@ -182,7 +182,7 @@ class pdf_sepamandate extends ModeleBankAccountDoc
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("SepaMandate"));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -654,9 +654,7 @@ class pdf_sepamandate extends ModeleBankAccountDoc
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
// phpcs:enable
- global $conf;
-
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'PAYMENTORDER_FREE_TEXT', null, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext);
}
}
diff --git a/htdocs/core/modules/barcode/modules_barcode.class.php b/htdocs/core/modules/barcode/modules_barcode.class.php
index 01a00405452..dac575cbb17 100644
--- a/htdocs/core/modules/barcode/modules_barcode.class.php
+++ b/htdocs/core/modules/barcode/modules_barcode.class.php
@@ -75,7 +75,7 @@ abstract class ModeleNumRefBarCode
*/
public function getNom($langs)
{
- return empty($this->name) ? $this->nom : $this->name;
+ return empty($this->name) ? get_class($this) : $this->name;
}
/** Return a numbering example
diff --git a/htdocs/core/modules/bom/doc/doc_generic_bom_odt.modules.php b/htdocs/core/modules/bom/doc/doc_generic_bom_odt.modules.php
index 2dcf5512dc1..bec28b941aa 100644
--- a/htdocs/core/modules/bom/doc/doc_generic_bom_odt.modules.php
+++ b/htdocs/core/modules/bom/doc/doc_generic_bom_odt.modules.php
@@ -169,7 +169,9 @@ class doc_generic_bom_odt extends ModelePDFBom
$texte .= '
';
}
diff --git a/htdocs/core/modules/bom/mod_bom_standard.php b/htdocs/core/modules/bom/mod_bom_standard.php
index f5a9fb75976..db2d0f2ed7f 100644
--- a/htdocs/core/modules/bom/mod_bom_standard.php
+++ b/htdocs/core/modules/bom/mod_bom_standard.php
@@ -25,7 +25,7 @@
require_once DOL_DOCUMENT_ROOT.'/core/modules/bom/modules_bom.php';
/**
- * Class to manage customer order numbering rules standard
+ * Class to manage the Standard numbering rule for BOM
*/
class mod_bom_standard extends ModeleNumRefboms
{
diff --git a/htdocs/core/modules/cheque/doc/pdf_blochet.class.php b/htdocs/core/modules/cheque/doc/pdf_blochet.class.php
index f32b2306624..3985cb6be90 100644
--- a/htdocs/core/modules/cheque/doc/pdf_blochet.class.php
+++ b/htdocs/core/modules/cheque/doc/pdf_blochet.class.php
@@ -155,7 +155,7 @@ class BordereauChequeBlochet extends ModeleChequeReceipts
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->transnoentities("CheckReceipt")." ".$number);
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -407,7 +407,7 @@ class BordereauChequeBlochet extends ModeleChequeReceipts
{
global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
// Line of free text
$substitutionarray = pdf_getSubstitutionArray($outputlangs, null, $object);
diff --git a/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php b/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php
index 9239ec0ed4b..5e94397bc91 100644
--- a/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php
+++ b/htdocs/core/modules/commande/doc/doc_generic_order_odt.modules.php
@@ -159,7 +159,7 @@ class doc_generic_order_odt extends ModelePDFCommandes
$texte .= $conf->global->COMMANDE_ADDON_PDF_ODT_PATH;
$texte .= '';
$texte .= '
';
- $texte .= ' ';
+ $texte .= ' ';
$texte .= '
';
// Scan directories
@@ -176,7 +176,9 @@ class doc_generic_order_odt extends ModelePDFCommandes
$texte .= '';
}
diff --git a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php
index ca8d5bd2a74..e0dff278f96 100644
--- a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php
+++ b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php
@@ -323,7 +323,7 @@ class pdf_einstein extends ModelePDFCommandes
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("PdfOrderTitle")." ".$outputlangs->convToOutputCharset($object->thirdparty->name));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -359,11 +359,11 @@ class pdf_einstein extends ModelePDFCommandes
$tab_top = 90 + $top_shift;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 + $top_shift : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 + $top_shift : 10);
// Incoterm
$height_incoterms = 0;
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
$desc_incoterms = $object->getIncotermsForPDF();
if ($desc_incoterms) {
$tab_top -= 2;
@@ -456,7 +456,7 @@ class pdf_einstein extends ModelePDFCommandes
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -608,7 +608,7 @@ class pdf_einstein extends ModelePDFCommandes
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
if (!empty($tplidx)) {
@@ -628,7 +628,7 @@ class pdf_einstein extends ModelePDFCommandes
$pdf->useTemplate($tplidx);
}
$pagenb++;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
}
@@ -871,7 +871,7 @@ class pdf_einstein extends ModelePDFCommandes
// If payment mode not forced or forced to VIR, show payment with BAN
if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'VIR') {
- if ($object->fk_account > 0 || $object->fk_bank > 0 || !empty($conf->global->FACTURE_RIB_NUMBER)) {
+ if ($object->fk_account > 0 || $object->fk_bank > 0 || getDolGlobalInt('FACTURE_RIB_NUMBER')) {
$bankid = ($object->fk_account <= 0 ? $conf->global->FACTURE_RIB_NUMBER : $object->fk_account);
if ($object->fk_bank > 0) {
$bankid = $object->fk_bank; // For backward compatibility when object->fk_account is forced with object->fk_bank
@@ -1535,8 +1535,7 @@ class pdf_einstein extends ModelePDFCommandes
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
// phpcs:enable
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'ORDER_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext, $this->page_largeur, $this->watermark);
}
}
diff --git a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php
index 77854c9d091..131e159196b 100644
--- a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php
+++ b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php
@@ -253,7 +253,7 @@ class pdf_eratosthene extends ModelePDFCommandes
$objphoto->fetch($object->lines[$i]->fk_product);
//var_dump($objphoto->ref);exit;
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
$pdir[0] = get_exdir($objphoto->id, 2, 0, 0, $objphoto, 'product').$objphoto->id."/photos/";
$pdir[1] = get_exdir(0, 0, 0, 0, $objphoto, 'product').dol_sanitizeFileName($objphoto->ref).'/';
} else {
@@ -365,7 +365,7 @@ class pdf_eratosthene extends ModelePDFCommandes
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("PdfOrderTitle")." ".$outputlangs->convToOutputCharset($object->thirdparty->name));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -392,13 +392,13 @@ class pdf_eratosthene extends ModelePDFCommandes
$tab_top = 90 + $top_shift;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 + $top_shift : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 + $top_shift : 10);
$tab_height = $this->page_hauteur - $tab_top - $heightforfooter - $heightforfreetext;
// Incoterm
$height_incoterms = 0;
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
$desc_incoterms = $object->getIncotermsForPDF();
if ($desc_incoterms) {
$tab_top -= 2;
@@ -466,7 +466,7 @@ class pdf_eratosthene extends ModelePDFCommandes
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
// $this->_pagefoot($pdf,$object,$outputlangs,1);
@@ -524,7 +524,7 @@ class pdf_eratosthene extends ModelePDFCommandes
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$height_note = $posyafter - $tab_top_newpage;
@@ -546,7 +546,7 @@ class pdf_eratosthene extends ModelePDFCommandes
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
@@ -642,7 +642,7 @@ class pdf_eratosthene extends ModelePDFCommandes
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- //if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs);
+ //if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
$pdf->setPage($pageposafter + 1);
}
} else {
@@ -832,7 +832,7 @@ class pdf_eratosthene extends ModelePDFCommandes
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
if (!empty($tplidx)) {
@@ -852,7 +852,7 @@ class pdf_eratosthene extends ModelePDFCommandes
$pdf->useTemplate($tplidx);
}
$pagenb++;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
}
@@ -1088,7 +1088,7 @@ class pdf_eratosthene extends ModelePDFCommandes
// If payment mode not forced or forced to VIR, show payment with BAN
if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'VIR') {
- if ($object->fk_account > 0 || $object->fk_bank > 0 || !empty($conf->global->FACTURE_RIB_NUMBER)) {
+ if ($object->fk_account > 0 || $object->fk_bank > 0 || getDolGlobalInt('FACTURE_RIB_NUMBER')) {
$bankid = ($object->fk_account <= 0 ? $conf->global->FACTURE_RIB_NUMBER : $object->fk_account);
if ($object->fk_bank > 0) {
$bankid = $object->fk_bank; // For backward compatibility when object->fk_account is forced with object->fk_bank
@@ -1720,8 +1720,7 @@ class pdf_eratosthene extends ModelePDFCommandes
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
// phpcs:enable
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'ORDER_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext, $this->page_largeur, $this->watermark);
}
diff --git a/htdocs/core/modules/commande/mod_commande_marbre.php b/htdocs/core/modules/commande/mod_commande_marbre.php
index 8c9ef0385eb..71a41d0b3c4 100644
--- a/htdocs/core/modules/commande/mod_commande_marbre.php
+++ b/htdocs/core/modules/commande/mod_commande_marbre.php
@@ -20,12 +20,12 @@
/**
* \file htdocs/core/modules/commande/mod_commande_marbre.php
* \ingroup commande
- * \brief File of class to manage customer order numbering rules Marbre
+ * \brief File of class to manage Sales Order numbering rules Marbre
*/
require_once DOL_DOCUMENT_ROOT.'/core/modules/commande/modules_commande.php';
/**
- * Class to manage customer order numbering rules Marbre
+ * Class to manage Sales Order numbering rules Marbre
*/
class mod_commande_marbre extends ModeleNumRefCommandes
{
diff --git a/htdocs/core/modules/commande/mod_commande_saphir.php b/htdocs/core/modules/commande/mod_commande_saphir.php
index ad2b109f2d1..07dcfdced9e 100644
--- a/htdocs/core/modules/commande/mod_commande_saphir.php
+++ b/htdocs/core/modules/commande/mod_commande_saphir.php
@@ -23,14 +23,14 @@
/**
* \file htdocs/core/modules/commande/mod_commande_saphir.php
* \ingroup commande
- * \brief Fichier contenant la classe du modele de numerotation de reference de commande Saphir
+ * \brief File of class to manage Sales Order numbering rules Saphir
*/
require_once DOL_DOCUMENT_ROOT.'/core/modules/commande/modules_commande.php';
/**
- * Class to manage customer order numbering rules Saphir
+ * Class to manage Sales Order numbering rules Saphir
*/
class mod_commande_saphir extends ModeleNumRefCommandes
{
diff --git a/htdocs/core/modules/contract/doc/doc_generic_contract_odt.modules.php b/htdocs/core/modules/contract/doc/doc_generic_contract_odt.modules.php
index 222286d5592..dad1ebc9122 100644
--- a/htdocs/core/modules/contract/doc/doc_generic_contract_odt.modules.php
+++ b/htdocs/core/modules/contract/doc/doc_generic_contract_odt.modules.php
@@ -51,8 +51,7 @@ class doc_generic_contract_odt extends ModelePDFContract
public $phpmin = array(7, 0);
/**
- * Dolibarr version of the loaded document
- * @var string
+ * @var string Dolibarr version of the loaded document
*/
public $version = 'dolibarr';
@@ -94,7 +93,7 @@ class doc_generic_contract_odt extends ModelePDFContract
$this->option_freetext = 1; // Support add of a personalised text
$this->option_draft_watermark = 0; // Support add of a watermark on drafts
- // Recupere emetteur
+ // Get source company
$this->emetteur = $mysoc;
if (!$this->emetteur->country_code) {
$this->emetteur->country_code = substr($langs->defaultlang, -2); // By default if not defined
@@ -123,7 +122,7 @@ class doc_generic_contract_odt extends ModelePDFContract
$texte .= ' ';
$texte .= ' ';
$texte .= ' ';
- $texte .= '';
+ $texte .= '';
// List of directories area
$texte .= '';
@@ -161,10 +160,25 @@ class doc_generic_contract_odt extends ModelePDFContract
$texte .= ' ';
// Scan directories
- if (count($listofdir)) {
- $texte .= $langs->trans("NumberOfModelFilesFound").': '.count($listoffiles).' ';
+ $nbofiles = count($listoffiles);
+ if (!empty($conf->global->CONTRACT_ADDON_PDF_ODT_PATH)) {
+ $texte .= $langs->trans("NumberOfModelFilesFound").': ';
+ //$texte.=$nbofiles?'':'';
+ $texte .= count($listoffiles);
+ //$texte.=$nbofiles?' ':'';
+ $texte .= ' ';
}
+ if ($nbofiles) {
+ $texte .= '';
+ }
// Add input to upload a new template file.
$texte .= ''.$langs->trans("UploadNewTemplate");
$maxfilesizearray = getMaxFileSizeArray();
@@ -228,7 +242,7 @@ class doc_generic_contract_odt extends ModelePDFContract
$sav_charset_output = $outputlangs->charset_output;
$outputlangs->charset_output = 'UTF-8';
- // Load traductions files required by page
+ // Load translation files required by page
$outputlangs->loadLangs(array("main", "dict", "companies", "bills"));
if ($conf->contrat->multidir_output[$object->entity]) {
@@ -382,16 +396,21 @@ class doc_generic_contract_odt extends ModelePDFContract
dol_syslog($e->getMessage(), LOG_INFO);
}
+ // Call the ODTSubstitution hook
+ $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray);
+ $reshook = $hookmanager->executeHooks('ODTSubstitution', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
+
foreach ($tmparray as $key => $value) {
try {
- if (preg_match('/logo$/', $key)) { // Image
+ if (preg_match('/logo$/', $key)) {
+ // Image
if (file_exists($value)) {
$odfHandler->setImage($key, $value);
} else {
$odfHandler->setVars($key, 'ErrorFileNotFound', true, 'UTF-8');
}
- } else // Text
- {
+ } else {
+ // Text
$odfHandler->setVars($key, $value, true, 'UTF-8');
}
} catch (OdfException $e) {
@@ -448,7 +467,7 @@ class doc_generic_contract_odt extends ModelePDFContract
}
// Call the beforeODTSave hook
- $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs);
+ $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray);
$reshook = $hookmanager->executeHooks('beforeODTSave', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
// Write new file
@@ -457,6 +476,7 @@ class doc_generic_contract_odt extends ModelePDFContract
$odfHandler->exportAsAttachedPDF($file);
} catch (Exception $e) {
$this->error = $e->getMessage();
+ dol_syslog($e->getMessage(), LOG_INFO);
return -1;
}
} else {
@@ -464,10 +484,12 @@ class doc_generic_contract_odt extends ModelePDFContract
$odfHandler->saveToDisk($file);
} catch (Exception $e) {
$this->error = $e->getMessage();
+ dol_syslog($e->getMessage(), LOG_INFO);
return -1;
}
}
+ $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray);
$reshook = $hookmanager->executeHooks('afterODTCreation', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
if (!empty($conf->global->MAIN_UMASK)) {
diff --git a/htdocs/core/modules/contract/doc/pdf_strato.modules.php b/htdocs/core/modules/contract/doc/pdf_strato.modules.php
index c395b51df7e..bc938accc92 100644
--- a/htdocs/core/modules/contract/doc/pdf_strato.modules.php
+++ b/htdocs/core/modules/contract/doc/pdf_strato.modules.php
@@ -256,7 +256,7 @@ class pdf_strato extends ModelePDFContract
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("ContractCard")." ".$outputlangs->convToOutputCharset($object->thirdparty->name));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -274,7 +274,7 @@ class pdf_strato extends ModelePDFContract
$pdf->SetTextColor(0, 0, 0);
$tab_top = 90;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 : 10);
// Display notes
if (!empty($object->note_public)) {
@@ -390,7 +390,7 @@ class pdf_strato extends ModelePDFContract
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -783,8 +783,7 @@ class pdf_strato extends ModelePDFContract
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'CONTRACT_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext);
}
}
diff --git a/htdocs/core/modules/delivery/doc/pdf_storm.modules.php b/htdocs/core/modules/delivery/doc/pdf_storm.modules.php
index fe8ca423a2b..bd47360d85d 100644
--- a/htdocs/core/modules/delivery/doc/pdf_storm.modules.php
+++ b/htdocs/core/modules/delivery/doc/pdf_storm.modules.php
@@ -238,7 +238,7 @@ class pdf_storm extends ModelePDFDeliveryOrder
$objphoto->fetch($object->lines[$i]->fk_product);
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
$pdir[0] = get_exdir($objphoto->id, 2, 0, 0, $objphoto, 'product').$objphoto->id."/photos/";
$pdir[1] = get_exdir(0, 0, 0, 0, $objphoto, 'product').dol_sanitizeFileName($objphoto->ref).'/';
} else {
@@ -324,7 +324,7 @@ class pdf_storm extends ModelePDFDeliveryOrder
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("DeliveryOrder"));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -343,7 +343,7 @@ class pdf_storm extends ModelePDFDeliveryOrder
$pdf->SetTextColor(0, 0, 0);
$tab_top = 90;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 : 10);
$tab_height = $this->page_hauteur - $tab_top - $heightforfooter - $heightforfreetext;
@@ -351,7 +351,7 @@ class pdf_storm extends ModelePDFDeliveryOrder
// Incoterm
$height_incoterms = 0;
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
$desc_incoterms = $object->getIncotermsForPDF();
if ($desc_incoterms) {
$tab_top -= 2;
@@ -445,7 +445,7 @@ class pdf_storm extends ModelePDFDeliveryOrder
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- //if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs);
+ //if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
$pdf->setPage($pageposbefore + 1);
$curY = $tab_top_newpage;
@@ -485,7 +485,7 @@ class pdf_storm extends ModelePDFDeliveryOrder
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -571,7 +571,7 @@ class pdf_storm extends ModelePDFDeliveryOrder
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
if (!empty($tplidx)) {
@@ -591,7 +591,7 @@ class pdf_storm extends ModelePDFDeliveryOrder
$pdf->useTemplate($tplidx);
}
$pagenb++;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
}
@@ -921,8 +921,7 @@ class pdf_storm extends ModelePDFDeliveryOrder
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'DELIVERY_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext);
}
diff --git a/htdocs/core/modules/delivery/doc/pdf_typhon.modules.php b/htdocs/core/modules/delivery/doc/pdf_typhon.modules.php
index 0f0657f1e60..5936f874a1b 100644
--- a/htdocs/core/modules/delivery/doc/pdf_typhon.modules.php
+++ b/htdocs/core/modules/delivery/doc/pdf_typhon.modules.php
@@ -284,7 +284,7 @@ class pdf_typhon extends ModelePDFDeliveryOrder
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("DeliveryOrder"));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -322,13 +322,13 @@ class pdf_typhon extends ModelePDFDeliveryOrder
$pdf->SetTextColor(0, 0, 0);
$tab_top = 90;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 : 10);
$tab_height = $this->page_hauteur - $tab_top - $heightforfooter - $heightforfreetext;
// Incoterm
$height_incoterms = 0;
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
$desc_incoterms = $object->getIncotermsForPDF();
if ($desc_incoterms) {
$tab_top -= 2;
@@ -401,7 +401,7 @@ class pdf_typhon extends ModelePDFDeliveryOrder
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -495,7 +495,7 @@ class pdf_typhon extends ModelePDFDeliveryOrder
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
if (!empty($tplidx)) {
@@ -515,7 +515,7 @@ class pdf_typhon extends ModelePDFDeliveryOrder
$pdf->useTemplate($tplidx);
}
$pagenb++;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
}
@@ -920,8 +920,7 @@ class pdf_typhon extends ModelePDFDeliveryOrder
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'DELIVERY_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext);
}
}
diff --git a/htdocs/core/modules/dons/html_cerfafr.modules.php b/htdocs/core/modules/dons/html_cerfafr.modules.php
index 792c8434ba4..83c2504be3d 100644
--- a/htdocs/core/modules/dons/html_cerfafr.modules.php
+++ b/htdocs/core/modules/dons/html_cerfafr.modules.php
@@ -120,18 +120,18 @@ class html_cerfafr extends ModeleDon
// This is not the proper way to do it but $formclass->form_modes_reglement
// prints the translation instead of returning it
- if ($don->modepaiementid) {
- $formclass->load_cache_types_paiements();
- $paymentmode = $formclass->cache_types_paiements[$don->modepaiementid]['label'];
+ $formclass->load_cache_types_paiements();
+ if ($don->modepaymentid) {
+ $paymentmode = $formclass->cache_types_paiements[$don->modepaymentid]['label'];
} else {
$paymentmode = '';
}
-
- if ($don->modepaymentcode == 'CHQ') {
+ $modepaymentcode = $formclass->cache_types_paiements[$don->modepaymentid]['code'];
+ if ($modepaymentcode == 'CHQ') {
$ModePaiement = '
Remise d\'espèces Chèque Virement, prélèvement, carte bancaire';
- } elseif ($don->modepaymentcode == 'LIQ') {
+ } elseif ($modepaymentcode == 'LIQ') {
$ModePaiement = '
Remise d\'espèces Chèque Virement, prélèvement, carte bancaire';
- } elseif ($don->modepaymentcode == 'VIR' || $don->modepaymentcode == 'PRE' || $don->modepaymentcode == 'CB') {
+ } elseif ($modepaymentcode == 'VIR' || $modepaymentcode == 'PRE' || $modepaymentcode == 'CB') {
$ModePaiement = '
Remise d\'espèces Chèque Virement, prélèvement, carte bancaire';
} else {
$ModePaiement = '
Remise d\'espèces Chèque Virement, prélèvement, carte bancaire';
diff --git a/htdocs/core/modules/expedition/doc/doc_generic_shipment_odt.modules.php b/htdocs/core/modules/expedition/doc/doc_generic_shipment_odt.modules.php
index cfb23269ca9..73793c5a757 100644
--- a/htdocs/core/modules/expedition/doc/doc_generic_shipment_odt.modules.php
+++ b/htdocs/core/modules/expedition/doc/doc_generic_shipment_odt.modules.php
@@ -175,7 +175,9 @@ class doc_generic_shipment_odt extends ModelePdfExpedition
$texte .= '
';
}
diff --git a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php
index c08beade8ec..ee99d38ae2b 100644
--- a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php
+++ b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php
@@ -210,7 +210,7 @@ class pdf_espadon extends ModelePdfExpedition
$objphoto->fetch($object->lines[$i]->fk_product);
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
$pdir = get_exdir($object->lines[$i]->fk_product, 2, 0, 0, $objphoto, 'product').$object->lines[$i]->fk_product."/photos/";
$dir = $conf->product->dir_output.'/'.$pdir;
} else {
@@ -312,7 +312,7 @@ class pdf_espadon extends ModelePdfExpedition
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Shipment"));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -330,7 +330,7 @@ class pdf_espadon extends ModelePdfExpedition
$pdf->SetTextColor(0, 0, 0);
$tab_top = 90;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 + $top_shift: 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 + $top_shift: 10);
$tab_height = $this->page_hauteur - $tab_top - $heightforfooter - $heightforfreetext;
@@ -338,7 +338,7 @@ class pdf_espadon extends ModelePdfExpedition
// Incoterm
$height_incoterms = 0;
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
$desc_incoterms = $object->getIncotermsForPDF();
if ($desc_incoterms) {
$tab_top -= 2;
@@ -428,7 +428,7 @@ class pdf_espadon extends ModelePdfExpedition
$pdf->AddPage();
$pagenb++;
if (!empty($tplidx)) $pdf->useTemplate($tplidx);
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs);
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
// $this->_pagefoot($pdf,$object,$outputlangs,1);
$pdf->setTopMargin($tab_top_newpage);
// The only function to edit the bottom margin of current page to set it.
@@ -482,7 +482,7 @@ class pdf_espadon extends ModelePdfExpedition
// apply note frame to last page
$pdf->setPage($pageposafternote);
if (!empty($tplidx)) $pdf->useTemplate($tplidx);
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs);
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
$height_note = $posyafter - $tab_top_newpage;
$pdf->Rect($this->marge_gauche, $tab_top_newpage - 1, $tab_width, $height_note + 1);
} else // No pagebreak
@@ -500,7 +500,7 @@ class pdf_espadon extends ModelePdfExpedition
$pageposafternote++;
$pdf->setPage($pageposafternote);
if (!empty($tplidx)) $pdf->useTemplate($tplidx);
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs);
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
$posyafter = $tab_top_newpage;
}
@@ -554,7 +554,7 @@ class pdf_espadon extends ModelePdfExpedition
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- //if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs);
+ //if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
$pdf->setPage($pageposbefore + 1);
$curY = $tab_top_newpage;
@@ -596,7 +596,7 @@ class pdf_espadon extends ModelePdfExpedition
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- //if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs);
+ //if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
$pdf->setPage($pageposafter + 1);
}
} else {
@@ -705,7 +705,7 @@ class pdf_espadon extends ModelePdfExpedition
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
if (!empty($tplidx)) {
@@ -725,7 +725,7 @@ class pdf_espadon extends ModelePdfExpedition
$pdf->useTemplate($tplidx);
}
$pagenb++;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
}
@@ -1197,8 +1197,7 @@ class pdf_espadon extends ModelePdfExpedition
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'SHIPPING_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext, $this->page_largeur, $this->watermark);
}
diff --git a/htdocs/core/modules/expedition/doc/pdf_merou.modules.php b/htdocs/core/modules/expedition/doc/pdf_merou.modules.php
index 1c457595e93..e847dc26fec 100644
--- a/htdocs/core/modules/expedition/doc/pdf_merou.modules.php
+++ b/htdocs/core/modules/expedition/doc/pdf_merou.modules.php
@@ -266,7 +266,7 @@ class pdf_merou extends ModelePdfExpedition
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Shipment"));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -281,7 +281,7 @@ class pdf_merou extends ModelePdfExpedition
$pdf->SetTextColor(0, 0, 0);
$tab_top = 52;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 : 10);
$tab_height = $this->page_hauteur - $tab_top - $heightforfooter - $heightforfreetext;
diff --git a/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php b/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php
index c51dfd374a5..9321e1ecf00 100644
--- a/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php
+++ b/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php
@@ -235,7 +235,7 @@ class pdf_rouget extends ModelePdfExpedition
$objphoto = new Product($this->db);
$objphoto->fetch($object->lines[$i]->fk_product);
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
$pdir = get_exdir($object->lines[$i]->fk_product, 2, 0, 0, $objphoto, 'product').$object->lines[$i]->fk_product."/photos/";
$dir = $conf->product->dir_output.'/'.$pdir;
} else {
@@ -337,7 +337,7 @@ class pdf_rouget extends ModelePdfExpedition
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Shipment"));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -355,13 +355,13 @@ class pdf_rouget extends ModelePdfExpedition
$pdf->SetTextColor(0, 0, 0);
$tab_top = 90;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 : 10);
$tab_height = $this->page_hauteur - $tab_top - $heightforfooter - $heightforfreetext;
// Incoterm
$height_incoterms = 0;
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
$desc_incoterms = $object->getIncotermsForPDF();
if ($desc_incoterms) {
$tab_top -= 2;
@@ -465,7 +465,7 @@ class pdf_rouget extends ModelePdfExpedition
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposbefore + 1);
@@ -510,7 +510,7 @@ class pdf_rouget extends ModelePdfExpedition
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -611,7 +611,7 @@ class pdf_rouget extends ModelePdfExpedition
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
if (!empty($tplidx)) {
@@ -631,7 +631,7 @@ class pdf_rouget extends ModelePdfExpedition
$pdf->useTemplate($tplidx);
}
$pagenb++;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
}
@@ -1142,8 +1142,7 @@ class pdf_rouget extends ModelePdfExpedition
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'SHIPPING_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext, $this->page_largeur, $this->watermark);
}
}
diff --git a/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php b/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php
index 411bc009b8e..f365173ddbe 100644
--- a/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php
+++ b/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php
@@ -268,7 +268,7 @@ class pdf_standard extends ModeleExpenseReport
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Trips"));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -286,7 +286,7 @@ class pdf_standard extends ModeleExpenseReport
$pdf->SetTextColor(0, 0, 0);
$tab_top = 95;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 65 : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 65 : 10);
$tab_height = $this->page_hauteur - $tab_top - $heightforfooter - $heightforfreetext;
@@ -361,7 +361,7 @@ class pdf_standard extends ModeleExpenseReport
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -390,7 +390,7 @@ class pdf_standard extends ModeleExpenseReport
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -447,7 +447,7 @@ class pdf_standard extends ModeleExpenseReport
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
if (!empty($tplidx)) {
@@ -467,7 +467,7 @@ class pdf_standard extends ModeleExpenseReport
$pdf->useTemplate($tplidx);
}
$pagenb++;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
}
@@ -1129,8 +1129,7 @@ class pdf_standard extends ModeleExpenseReport
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'EXPENSEREPORT_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext);
}
}
diff --git a/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php b/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php
index 061f18e5442..0b8fa2d4621 100644
--- a/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php
+++ b/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php
@@ -174,7 +174,9 @@ class doc_generic_invoice_odt extends ModelePDFFactures
$texte .= '
';
}
diff --git a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php
index 39fa07c638a..39d833de6cc 100644
--- a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php
+++ b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php
@@ -373,7 +373,7 @@ class pdf_crabe extends ModelePDFFactures
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($mysoc->name.($user->id > 0 ? ' - '.$outputlangs->convToOutputCharset($user->getFullName($outputlangs)) : ''));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("PdfInvoiceTitle")." ".$outputlangs->convToOutputCharset($object->thirdparty->name));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -448,7 +448,7 @@ class pdf_crabe extends ModelePDFFactures
// $tab_top is y where we must continue content (90 = 42 + 48: 42 is height of logo and ref, 48 is address blocks)
$tab_top = 90 + $top_shift; // top_shift is an addition for linked objects or addons (0 in most cases)
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 + $top_shift : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 + $top_shift : 10);
// You can add more thing under header here, if you increase $extra_under_address_shift too.
$extra_under_address_shift = 0;
@@ -491,7 +491,7 @@ class pdf_crabe extends ModelePDFFactures
// Incoterm
$height_incoterms = 0;
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
$desc_incoterms = $object->getIncotermsForPDF();
if ($desc_incoterms) {
$tab_top -= 2;
@@ -578,7 +578,7 @@ class pdf_crabe extends ModelePDFFactures
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposbefore + 1);
@@ -621,7 +621,7 @@ class pdf_crabe extends ModelePDFFactures
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -797,7 +797,7 @@ class pdf_crabe extends ModelePDFFactures
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
if (!empty($tplidx)) {
@@ -817,7 +817,7 @@ class pdf_crabe extends ModelePDFFactures
$pdf->useTemplate($tplidx);
}
$pagenb++;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
}
@@ -942,7 +942,7 @@ class pdf_crabe extends ModelePDFFactures
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($current_page);
@@ -1004,7 +1004,7 @@ class pdf_crabe extends ModelePDFFactures
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($current_page);
@@ -1134,10 +1134,10 @@ class pdf_crabe extends ModelePDFFactures
// Check a payment mode is defined
if (empty($object->mode_reglement_code)
&& empty($conf->global->FACTURE_CHQ_NUMBER)
- && empty($conf->global->FACTURE_RIB_NUMBER)) {
+ && !getDolGlobalInt('FACTURE_RIB_NUMBER')) {
$this->error = $outputlangs->transnoentities("ErrorNoPaiementModeConfigured");
} elseif (($object->mode_reglement_code == 'CHQ' && empty($conf->global->FACTURE_CHQ_NUMBER) && empty($object->fk_account) && empty($object->fk_bank))
- || ($object->mode_reglement_code == 'VIR' && empty($conf->global->FACTURE_RIB_NUMBER) && empty($object->fk_account) && empty($object->fk_bank))) {
+ || ($object->mode_reglement_code == 'VIR' && !getDolGlobalInt('FACTURE_RIB_NUMBER') && empty($object->fk_account) && empty($object->fk_bank))) {
// Avoid having any valid PDF with setup that is not complete
$outputlangs->load("errors");
@@ -1176,17 +1176,29 @@ class pdf_crabe extends ModelePDFFactures
$posy = $pdf->GetY();
}
+ // Show if Option VAT debit option is on also if transmitter is french
+ // Decret n°2099-1299 2022-10-07
+ // French mention : "Option pour le paiement de la taxe d'après les débits"
+ if ($this->emetteur->country_code == 'FR') {
+ if ($conf->global->TAX_MODE == 1) {
+ $pdf->SetXY($this->marge_gauche, $posy);
+ $pdf->writeHTMLCell(80, 5, '', '', $outputlangs->transnoentities("MentionVATDebitOptionIsOn"), 0, 1);
+
+ $posy = $pdf->GetY() + 1;
+ }
+ }
+
// Show online payment link
if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'CB' || $object->mode_reglement_code == 'VAD') {
$useonlinepayment = 0;
if (!empty($conf->global->PDF_SHOW_LINK_TO_ONLINE_PAYMENT)) {
- if (!empty($conf->paypal->enabled)) {
+ if (isModEnabled('paypal')) {
$useonlinepayment++;
}
- if (!empty($conf->stripe->enabled)) {
+ if (isModEnabled('stripe')) {
$useonlinepayment++;
}
- if (!empty($conf->paybox->enabled)) {
+ if (isModEnabled('paybox')) {
$useonlinepayment++;
}
}
@@ -1247,7 +1259,7 @@ class pdf_crabe extends ModelePDFFactures
// If payment mode not forced or forced to VIR, show payment with BAN
if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'VIR') {
- if ($object->fk_account > 0 || $object->fk_bank > 0 || !empty($conf->global->FACTURE_RIB_NUMBER)) {
+ if ($object->fk_account > 0 || $object->fk_bank > 0 || getDolGlobalInt('FACTURE_RIB_NUMBER')) {
$bankid = ($object->fk_account <= 0 ? $conf->global->FACTURE_RIB_NUMBER : $object->fk_account);
if ($object->fk_bank > 0) {
$bankid = $object->fk_bank; // For backward compatibility when object->fk_account is forced with object->fk_bank
@@ -2062,8 +2074,7 @@ class pdf_crabe extends ModelePDFFactures
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'INVOICE_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext, $this->page_largeur, $this->watermark);
}
}
diff --git a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php
index 94b6011b817..e11cd90bc43 100644
--- a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php
+++ b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php
@@ -285,7 +285,7 @@ class pdf_sponge extends ModelePDFFactures
$objphoto->fetch($object->lines[$i]->fk_product);
//var_dump($objphoto->ref);exit;
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
$pdir[0] = get_exdir($objphoto->id, 2, 0, 0, $objphoto, 'product').$objphoto->id."/photos/";
$pdir[1] = get_exdir(0, 0, 0, 0, $objphoto, 'product').dol_sanitizeFileName($objphoto->ref).'/';
} else {
@@ -400,7 +400,7 @@ class pdf_sponge extends ModelePDFFactures
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($mysoc->name.($user->id > 0 ? ' - '.$outputlangs->convToOutputCharset($user->getFullName($outputlangs)) : ''));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("PdfInvoiceTitle")." ".$outputlangs->convToOutputCharset($object->thirdparty->name));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -457,7 +457,7 @@ class pdf_sponge extends ModelePDFFactures
// $this->tab_top is y where we must continue content (90 = 42 + 48: 42 is height of logo and ref, 48 is address blocks)
$this->tab_top = 90 + $top_shift; // top_shift is an addition for linked objects or addons (0 in most cases)
- $this->tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 + $top_shift : 10);
+ $this->tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 + $top_shift : 10);
// You can add more thing under header here, if you increase $extra_under_address_shift too.
$extra_under_address_shift = 0;
@@ -506,7 +506,7 @@ class pdf_sponge extends ModelePDFFactures
// Incoterm
$height_incoterms = 0;
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
$desc_incoterms = $object->getIncotermsForPDF();
if ($desc_incoterms) {
$this->tab_top -= 2;
@@ -575,7 +575,7 @@ class pdf_sponge extends ModelePDFFactures
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs, $outputlangsbis);
}
// $this->_pagefoot($pdf,$object,$outputlangs,1);
@@ -633,7 +633,7 @@ class pdf_sponge extends ModelePDFFactures
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs, $outputlangsbis);
}
$height_note = $posyafter - $this->tab_top_newpage;
@@ -655,7 +655,7 @@ class pdf_sponge extends ModelePDFFactures
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs, $outputlangsbis);
}
@@ -957,7 +957,7 @@ class pdf_sponge extends ModelePDFFactures
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs, $outputlangsbis);
}
if (!empty($tplidx)) {
@@ -978,7 +978,7 @@ class pdf_sponge extends ModelePDFFactures
$pdf->useTemplate($tplidx);
}
$pagenb++;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs, $outputlangsbis);
}
}
@@ -1242,10 +1242,10 @@ class pdf_sponge extends ModelePDFFactures
// Check a payment mode is defined
if (empty($object->mode_reglement_code)
&& empty($conf->global->FACTURE_CHQ_NUMBER)
- && empty($conf->global->FACTURE_RIB_NUMBER)) {
+ && !getDolGlobalInt('FACTURE_RIB_NUMBER')) {
$this->error = $outputlangs->transnoentities("ErrorNoPaiementModeConfigured");
} elseif (($object->mode_reglement_code == 'CHQ' && empty($conf->global->FACTURE_CHQ_NUMBER) && empty($object->fk_account) && empty($object->fk_bank))
- || ($object->mode_reglement_code == 'VIR' && empty($conf->global->FACTURE_RIB_NUMBER) && empty($object->fk_account) && empty($object->fk_bank))) {
+ || ($object->mode_reglement_code == 'VIR' && !getDolGlobalInt('FACTURE_RIB_NUMBER') && empty($object->fk_account) && empty($object->fk_bank))) {
// Avoid having any valid PDF with setup that is not complete
$outputlangs->load("errors");
@@ -1259,7 +1259,7 @@ class pdf_sponge extends ModelePDFFactures
$posy = $pdf->GetY() + 1;
}
- // Show payment mode
+ // Show payment mode
if (!empty($object->mode_reglement_code)
&& $object->mode_reglement_code != 'CHQ'
&& $object->mode_reglement_code != 'VIR') {
@@ -1286,17 +1286,29 @@ class pdf_sponge extends ModelePDFFactures
$posy = $pdf->GetY();
}
- // Show online payment link
+ // Show if Option VAT debit option is on also if transmitter is french
+ // Decret n°2099-1299 2022-10-07
+ // French mention : "Option pour le paiement de la taxe d'après les débits"
+ if ($this->emetteur->country_code == 'FR') {
+ if ($conf->global->TAX_MODE == 1) {
+ $pdf->SetXY($this->marge_gauche, $posy);
+ $pdf->writeHTMLCell(80, 5, '', '', $outputlangs->transnoentities("MentionVATDebitOptionIsOn"), 0, 1);
+
+ $posy = $pdf->GetY() + 1;
+ }
+ }
+
+ // Show online payment link
if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'CB' || $object->mode_reglement_code == 'VAD') {
$useonlinepayment = 0;
if (!empty($conf->global->PDF_SHOW_LINK_TO_ONLINE_PAYMENT)) {
- if (!empty($conf->paypal->enabled)) {
+ if (isModEnabled('paypal')) {
$useonlinepayment++;
}
- if (!empty($conf->stripe->enabled)) {
+ if (isModEnabled('stripe')) {
$useonlinepayment++;
}
- if (!empty($conf->paybox->enabled)) {
+ if (isModEnabled('paybox')) {
$useonlinepayment++;
}
}
@@ -1358,7 +1370,7 @@ class pdf_sponge extends ModelePDFFactures
// If payment mode not forced or forced to VIR, show payment with BAN
if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'VIR') {
- if ($object->fk_account > 0 || $object->fk_bank > 0 || !empty($conf->global->FACTURE_RIB_NUMBER)) {
+ if ($object->fk_account > 0 || $object->fk_bank > 0 || getDolGlobalInt('FACTURE_RIB_NUMBER')) {
$bankid = ($object->fk_account <= 0 ? $conf->global->FACTURE_RIB_NUMBER : $object->fk_account);
if ($object->fk_bank > 0) {
$bankid = $object->fk_bank; // For backward compatibility when object->fk_account is forced with object->fk_bank
@@ -1472,7 +1484,7 @@ class pdf_sponge extends ModelePDFFactures
if ($posy > $this->page_hauteur - 4 - $this->heightforfooter) {
$this->_pagefoot($pdf, $object, $outputlangs, 1);
$pdf->addPage();
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs, $outputlangsbis);
$pdf->setY($this->tab_top_newpage);
} else {
@@ -1539,7 +1551,7 @@ class pdf_sponge extends ModelePDFFactures
if ($posy > $this->page_hauteur - 4 - $this->heightforfooter) {
$pdf->addPage();
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs, $outputlangsbis);
$pdf->setY($this->tab_top_newpage);
} else {
@@ -1562,7 +1574,7 @@ class pdf_sponge extends ModelePDFFactures
// Total remise
$total_line_remise = 0;
foreach ($object->lines as $i => $line) {
- $total_line_remise += pdfGetLineTotalDiscountAmount($object, $i, $outputlangs, 2); // TODO: add this method to core/lib/pdf.lib
+ $total_line_remise += (float) pdfGetLineTotalDiscountAmount($object, $i, $outputlangs, 2); // TODO: add this method to core/lib/pdf.lib
// Gestion remise sous forme de ligne négative
if ($line->total_ht < 0) {
$total_line_remise += -$line->total_ht;
@@ -2328,8 +2340,7 @@ class pdf_sponge extends ModelePDFFactures
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'INVOICE_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext, $this->page_largeur, $this->watermark);
}
diff --git a/htdocs/core/modules/fichinter/doc/pdf_soleil.modules.php b/htdocs/core/modules/fichinter/doc/pdf_soleil.modules.php
index 097870e21bc..7616fba5c6b 100644
--- a/htdocs/core/modules/fichinter/doc/pdf_soleil.modules.php
+++ b/htdocs/core/modules/fichinter/doc/pdf_soleil.modules.php
@@ -258,7 +258,7 @@ class pdf_soleil extends ModelePDFFicheinter
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("InterventionCard"));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -275,7 +275,7 @@ class pdf_soleil extends ModelePDFFicheinter
$pdf->SetTextColor(0, 0, 0);
$tab_top = 90;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 : 10);
$tab_height = $this->page_hauteur - $tab_top - $heightforfooter - $heightforfreetext;
@@ -378,7 +378,7 @@ class pdf_soleil extends ModelePDFFicheinter
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -415,7 +415,7 @@ class pdf_soleil extends ModelePDFFicheinter
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
if (!empty($tplidx)) {
@@ -435,7 +435,7 @@ class pdf_soleil extends ModelePDFFicheinter
$pdf->useTemplate($tplidx);
}
$pagenb++;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
}
@@ -741,8 +741,7 @@ class pdf_soleil extends ModelePDFFicheinter
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'FICHINTER_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext, $this->page_largeur, $this->watermark);
}
}
diff --git a/htdocs/core/modules/hrm/mod_evaluation_standard.php b/htdocs/core/modules/hrm/mod_evaluation_standard.php
index 4c5bb083870..b6b517b8fb9 100644
--- a/htdocs/core/modules/hrm/mod_evaluation_standard.php
+++ b/htdocs/core/modules/hrm/mod_evaluation_standard.php
@@ -26,7 +26,7 @@ dol_include_once('/core/modules/hrm/modules_evaluation.php');
/**
- * Class to manage customer order numbering rules standard
+ * Class to manage the Standard numbering rule for HR evaluation
*/
class mod_evaluation_standard extends ModeleNumRefEvaluation
{
diff --git a/htdocs/core/modules/import/import_csv.modules.php b/htdocs/core/modules/import/import_csv.modules.php
index 594ab96d955..22c12024c2b 100644
--- a/htdocs/core/modules/import/import_csv.modules.php
+++ b/htdocs/core/modules/import/import_csv.modules.php
@@ -458,17 +458,27 @@ class ImportCsv extends ModeleImports
$param_array = array('', $newval, 0, $arrayrecord[0]['val']); // Param to fetch parent from account, in chart.
}
- call_user_func_array(array($classinstance, $method), $param_array);
+ $result = call_user_func_array(array($classinstance, $method), $param_array);
+
+ // If duplicate record found
+ if (!($classinstance->id != '') && $result == -2) {
+ $this->errors[$error]['lib'] = $langs->trans('ErrorMultipleRecordFoundFromRef', $newval);
+ $this->errors[$error]['type'] = 'FOREIGNKEY';
+ $errorforthistable++;
+ $error++;
+ }
+
// If not found, try the fetch from label
if (!($classinstance->id != '') && $objimport->array_import_convertvalue[0][$val]['rule'] == 'fetchidfromcodeorlabel') {
$param_array = array('', '', $newval);
call_user_func_array(array($classinstance, $method), $param_array);
}
$this->cacheconvert[$file.'_'.$class.'_'.$method.'_'][$newval] = $classinstance->id;
+
//print 'We have made a '.$class.'->'.$method.' to get id from code '.$newval.'. ';
if ($classinstance->id != '') { // id may be 0, it is a found value
$newval = $classinstance->id;
- } else {
+ } elseif (! $error) {
if (!empty($objimport->array_import_convertvalue[0][$val]['dict'])) {
$this->errors[$error]['lib'] = $langs->trans('ErrorFieldValueNotIn', num2Alpha($key - 1), $newval, 'code', $langs->transnoentitiesnoconv($objimport->array_import_convertvalue[0][$val]['dict']));
} elseif (!empty($objimport->array_import_convertvalue[0][$val]['element'])) {
@@ -729,9 +739,13 @@ class ImportCsv extends ModeleImports
if (isModEnabled("socialnetworks") && strpos($fieldname, "socialnetworks") !== false) {
if (!in_array("socialnetworks", $listfields)) {
$listfields[] = "socialnetworks";
+ $socialkey = array_search("socialnetworks", $listfields); // Return position of 'socialnetworks' key in array
+ $listvalues[$socialkey] = '';
}
+ //var_dump($newval); var_dump($arrayrecord[($key - 1)]['type']);
if (!empty($newval) && $arrayrecord[($key - 1)]['type'] > 0) {
- $socialkey = array_search("socialnetworks", $listfields);
+ $socialkey = array_search("socialnetworks", $listfields); // Return position of 'socialnetworks' key in array
+ //var_dump('sk='.$socialkey); // socialkey=19
$socialnetwork = explode("_", $fieldname)[1];
if (empty($listvalues[$socialkey]) || $listvalues[$socialkey] == "null") {
$json = new stdClass();
@@ -833,7 +847,6 @@ class ImportCsv extends ModeleImports
if (empty($lastinsertid)) { // No insert done yet for a parent table
$sqlSelect = "SELECT ".$fname." FROM ".$tablename;
-
$data = array_combine($listfields, $listvalues);
$where = array(); // filters to forge SQL request
$filters = array(); // filters to forge output error message
@@ -849,8 +862,8 @@ class ImportCsv extends ModeleImports
$stringtosearch = json_encode($socialnetwork).':'.json_encode($json->$socialnetwork);
//var_dump($stringtosearch);
//var_dump($this->db->escape($stringtosearch)); // This provide a value for sql string (but not for a like)
- $where[] = $key." LIKE '%".$this->db->escapeforlike($this->db->escape($stringtosearch))."%'";
- $filters[] = $col." LIKE '%".$this->db->escapeforlike($this->db->escape($stringtosearch))."%'";
+ $where[] = $key." LIKE '%".$this->db->escape($this->db->escapeforlike($stringtosearch))."%'";
+ $filters[] = $col." LIKE '%".$this->db->escape($this->db->escapeforlike($stringtosearch))."%'";
//var_dump($where[1]); // This provide a value for sql string inside a like
} else {
$where[] = $key.' = '.$data[$key];
diff --git a/htdocs/core/modules/import/import_xlsx.modules.php b/htdocs/core/modules/import/import_xlsx.modules.php
index 3637ce105c1..35adc4476a0 100644
--- a/htdocs/core/modules/import/import_xlsx.modules.php
+++ b/htdocs/core/modules/import/import_xlsx.modules.php
@@ -502,17 +502,28 @@ class ImportXlsx extends ModeleImports
}*/
$param_array = array('', $newval, 0, $arrayrecord[0]['val']); // Param to fetch parent from account, in chart.
}
- call_user_func_array(array($classinstance, $method), $param_array);
+
+ $result = call_user_func_array(array($classinstance, $method), $param_array);
+
+ // If duplicate record found
+ if (!($classinstance->id != '') && $result == -2) {
+ $this->errors[$error]['lib'] = $langs->trans('ErrorMultipleRecordFoundFromRef', $newval);
+ $this->errors[$error]['type'] = 'FOREIGNKEY';
+ $errorforthistable++;
+ $error++;
+ }
+
// If not found, try the fetch from label
if (!($classinstance->id != '') && $objimport->array_import_convertvalue[0][$val]['rule'] == 'fetchidfromcodeorlabel') {
$param_array = array('', '', $newval);
call_user_func_array(array($classinstance, $method), $param_array);
}
$this->cacheconvert[$file . '_' . $class . '_' . $method . '_'][$newval] = $classinstance->id;
+
//print 'We have made a '.$class.'->'.$method.' to get id from code '.$newval.'. ';
if ($classinstance->id != '') { // id may be 0, it is a found value
$newval = $classinstance->id;
- } else {
+ } elseif (! $error) {
if (!empty($objimport->array_import_convertvalue[0][$val]['dict'])) {
$this->errors[$error]['lib'] = $langs->trans('ErrorFieldValueNotIn', $key, $newval, 'code', $langs->transnoentitiesnoconv($objimport->array_import_convertvalue[0][$val]['dict']));
} elseif (!empty($objimport->array_import_convertvalue[0][$val]['element'])) {
@@ -770,12 +781,14 @@ class ImportXlsx extends ModeleImports
}
// Define $listfields and $listvalues to build SQL request
- if ($conf->socialnetworks->enabled && strpos($fieldname, "socialnetworks") !== false) {
+ if (isModEnabled("socialnetworks") && strpos($fieldname, "socialnetworks") !== false) {
if (!in_array("socialnetworks", $listfields)) {
$listfields[] = "socialnetworks";
+ $socialkey = array_search("socialnetworks", $listfields); // Return position of 'socialnetworks' key in array. Example socialkey=19
+ $listvalues[$socialkey] = '';
}
if (!empty($newval) && $arrayrecord[($key)]['type'] > 0) {
- $socialkey = array_search("socialnetworks", $listfields);
+ $socialkey = array_search("socialnetworks", $listfields); // Return position of 'socialnetworks' key in array. Example socialkey=19
$socialnetwork = explode("_", $fieldname)[1];
if (empty($listvalues[$socialkey]) || $listvalues[$socialkey] == "null") {
$json = new stdClass();
@@ -797,7 +810,7 @@ class ImportXlsx extends ModeleImports
} elseif (empty($newval) && $arrayrecord[($key)]['type'] == 0) {
$listvalues[] = "''";
} else {
- $listvalues[] = "'" . $this->db->escape($newval) . "'";
+ $listvalues[] = "'".$this->db->escape($newval)."'";
}
}
}
@@ -810,7 +823,7 @@ class ImportXlsx extends ModeleImports
if (!empty($listfields) && is_array($objimport->array_import_fieldshidden[0])) {
// Loop on each hidden fields to add them into listfields/listvalues
foreach ($objimport->array_import_fieldshidden[0] as $key => $val) {
- if (!preg_match('/^' . preg_quote($alias, '/') . '\./', $key)) {
+ if (!preg_match('/^'.preg_quote($alias, '/').'\./', $key)) {
continue; // Not a field of current table
}
if ($val == 'user->id') {
@@ -876,17 +889,17 @@ class ImportXlsx extends ModeleImports
if (!empty($updatekeys)) {
// We do SELECT to get the rowid, if we already have the rowid, it's to be used below for related tables (extrafields)
- $where = array();
-
if (empty($lastinsertid)) { // No insert done yet for a parent table
$sqlSelect = "SELECT ".$fname." FROM " . $tablename;
$data = array_combine($listfields, $listvalues);
- $filters = array();
+
+ $where = array(); // filters to forge SQL request
+ $filters = array(); // filters to forge output error message
foreach ($updatekeys as $key) {
$col = $objimport->array_import_updatekeys[0][$key];
$key = preg_replace('/^.*\./i', '', $key);
- if ($conf->socialnetworks->enabled && strpos($key, "socialnetworks") !== false) {
+ if (isModEnabled("socialnetworks") && strpos($key, "socialnetworks") !== false) {
$tmp = explode("_", $key);
$key = $tmp[0];
$socialnetwork = $tmp[1];
@@ -895,8 +908,8 @@ class ImportXlsx extends ModeleImports
$stringtosearch = json_encode($socialnetwork).':'.json_encode($json->$socialnetwork);
//var_dump($stringtosearch);
//var_dump($this->db->escape($stringtosearch)); // This provide a value for sql string (but not for a like)
- $where[] = $key." LIKE '%".$this->db->escapeforlike($this->db->escape($stringtosearch))."%'";
- $filters[] = $col." LIKE '%".$this->db->escapeforlike($this->db->escape($stringtosearch))."%'";
+ $where[] = $key." LIKE '%".$this->db->escape($this->db->escapeforlike($stringtosearch))."%'";
+ $filters[] = $col." LIKE '%".$this->db->escape($this->db->escapeforlike($stringtosearch))."%'";
//var_dump($where[1]); // This provide a value for sql string inside a like
} else {
$where[] = $key.' = '.$data[$key];
diff --git a/htdocs/core/modules/mailings/eventorganization.modules.php b/htdocs/core/modules/mailings/eventorganization.modules.php
new file mode 100644
index 00000000000..84c27c5f673
--- /dev/null
+++ b/htdocs/core/modules/mailings/eventorganization.modules.php
@@ -0,0 +1,212 @@
+
+ * Copyright (C) 2005-2010 Laurent Destailleur
+ * Copyright (C) 2005-2009 Regis Houssin
+ *
+ * This file is an example to follow to add your own email selector inside
+ * the Dolibarr email tool.
+ * Follow instructions given in README file to know what to change to build
+ * your own emailing list selector.
+ * Code that need to be changed in this file are marked by "CHANGE THIS" tag.
+ */
+
+/**
+ * \file htdocs/core/modules/mailings/eventorganization.modules.php
+ * \ingroup mailing
+ * \brief Example file to provide a list of recipients for mailing module
+ */
+
+
+// Load Dolibarr Environment
+include_once DOL_DOCUMENT_ROOT.'/core/modules/mailings/modules_mailings.php';
+
+
+/**
+ * Class to manage a list of personalised recipients for mailing feature
+ */
+class mailing_eventorganization extends MailingTargets
+{
+ // This label is used if no translation is found for key XXX neither MailingModuleDescXXX where XXX=name is found
+ public $name = 'AttendeesOfOrganizedEvent';
+ public $desc = "Attendees of an organized event";
+
+ public $require_admin = 0;
+
+ public $require_module = array(); // This module allows to select by categories must be also enabled if category module is not activated
+
+ /**
+ * @var string String with name of icon for myobject. Must be the part after the 'object_' into object_myobject.png
+ */
+ public $picto = 'conferenceorbooth';
+
+ /**
+ * @var DoliDB Database handler.
+ */
+ public $db;
+
+ public $enabled = 'isModEnabled("eventorganization")';
+
+
+ /**
+ * Constructor
+ *
+ * @param DoliDB $db Database handler
+ */
+ public function __construct($db)
+ {
+ global $conf, $langs;
+ $langs->load('companies');
+
+ $this->db = $db;
+ }
+
+
+ // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
+ /**
+ * This is the main function that returns the array of emails
+ *
+ * @param int $mailing_id Id of mailing. No need to use it.
+ * @return int <0 if error, number of emails added if ok
+ */
+ public function add_to_target($mailing_id)
+ {
+ // phpcs:enable
+ global $conf, $langs;
+
+ $cibles = array();
+ $addDescription = '';
+
+ $sql = "SELECT p.ref, p.entity, e.rowid as id, e.fk_project, e.email as email, e.email_company as company_name, e.firstname as firstname, e.lastname as lastname,";
+ $sql .= " 'eventorganizationattendee' as source";
+ $sql .= " FROM ".MAIN_DB_PREFIX."eventorganization_conferenceorboothattendee as e,";
+ $sql .= " ".MAIN_DB_PREFIX."projet as p";
+ $sql .= " WHERE e.email <> ''";
+ $sql .= " AND e.fk_project = p.rowid";
+ $sql .= " AND p.entity IN (".getEntity('project').")";
+ $sql .= " AND e.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".((int) $mailing_id).")";
+ $sql .= " AND e.fk_project = ".((int) GETPOST('filter_eventorganization', 'int'));
+ $sql .= " ORDER BY e.email";
+
+ // Stock recipients emails into targets table
+ $result = $this->db->query($sql);
+ if ($result) {
+ $num = $this->db->num_rows($result);
+ $i = 0;
+ $j = 0;
+
+ dol_syslog(get_class($this)."::add_to_target mailing ".$num." targets found");
+
+ $old = '';
+ while ($i < $num) {
+ $obj = $this->db->fetch_object($result);
+ if ($old <> $obj->email) {
+ $otherTxt = ($obj->ref ? $langs->transnoentities("Project").'='.$obj->ref : '');
+ if (strlen($addDescription) > 0 && strlen($otherTxt) > 0) {
+ $otherTxt .= ";";
+ }
+ $otherTxt .= $addDescription;
+ $cibles[$j] = array(
+ 'email' => $obj->email,
+ 'fk_project' => $obj->fk_project,
+ 'lastname' => $obj->lastname,
+ 'firstname' => $obj->firstname,
+ 'other' => $otherTxt,
+ 'source_url' => $this->url($obj->id, $obj->source),
+ 'source_id' => $obj->id,
+ 'source_type' => $obj->source
+ );
+ $old = $obj->email;
+ $j++;
+ }
+
+ $i++;
+ }
+ } else {
+ dol_syslog($this->db->error());
+ $this->error = $this->db->error();
+ return -1;
+ }
+
+ return parent::addTargetsToDatabase($mailing_id, $cibles);
+ }
+
+
+ /**
+ * On the main mailing area, there is a box with statistics.
+ * If you want to add a line in this report you must provide an
+ * array of SQL request that returns two field:
+ * One called "label", One called "nb".
+ *
+ * @return array Array with SQL requests
+ */
+ public function getSqlArrayForStats()
+ {
+ // CHANGE THIS: Optionnal
+
+ //var $statssql=array();
+ //$this->statssql[0]="SELECT field1 as label, count(distinct(email)) as nb FROM mytable WHERE email IS NOT NULL";
+ return array();
+ }
+
+
+ /**
+ * Return here number of distinct emails returned by your selector.
+ * For example if this selector is used to extract 500 different
+ * emails from a text file, this function must return 500.
+ *
+ * @param string $sql Requete sql de comptage
+ * @return int|string Nb of recipient, or <0 if error, or '' if NA
+ */
+ public function getNbOfRecipients($sql = '')
+ {
+ global $conf;
+
+ $sql = "SELECT COUNT(DISTINCT(e.email)) as nb";
+ $sql .= " FROM ".MAIN_DB_PREFIX."eventorganization_conferenceorboothattendee as e, ";
+ $sql .= " ".MAIN_DB_PREFIX."projet as p";
+ $sql .= " WHERE e.email <> ''";
+ $sql .= " AND e.fk_project = p.rowid";
+ $sql .= " AND p.entity IN (".getEntity('project').")";
+
+ //print $sql;
+
+ // La requete doit retourner un champ "nb" pour etre comprise par parent::getNbOfRecipients
+ return parent::getNbOfRecipients($sql);
+ }
+
+ /**
+ * This is to add a form filter to provide variant of selector
+ * If used, the HTML select must be called "filter"
+ *
+ * @return string A html select zone
+ */
+ public function formFilter()
+ {
+ global $conf, $langs;
+
+ $langs->load("companies");
+
+ include_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
+ $formproject = new FormProjets($this->db);
+ $s .= $formproject->select_projects(-1, 0, "filter_eventorganization", 0, 0, 1, 1, 0, 0, 0, '', 1, 0, '', '', 'usage_organize_event=1');
+
+ return $s;
+ }
+
+
+ /**
+ * Can include an URL link on each record provided by selector shown on target page.
+ *
+ * @param int $id ID
+ * @param string $sourcetype Source type
+ * @return string Url link
+ */
+ public function url($id, $sourcetype = 'thirdparty')
+ {
+ if ($sourcetype == 'project') {
+ return ''.img_object('', "eventorganization").' ';
+ }
+
+ return '';
+ }
+}
diff --git a/htdocs/core/modules/mailings/thirdparties_services_expired.modules.php b/htdocs/core/modules/mailings/thirdparties_services_expired.modules.php
index 979782e61a5..1f8f3f82f7c 100644
--- a/htdocs/core/modules/mailings/thirdparties_services_expired.modules.php
+++ b/htdocs/core/modules/mailings/thirdparties_services_expired.modules.php
@@ -108,7 +108,7 @@ class mailing_thirdparties_services_expired extends MailingTargets
$now = dol_now();
// La requete doit retourner: id, email, name
- $sql = "SELECT s.rowid as id, s.email, s.nom as name, cd.rowid as cdid, cd.date_ouverture, cd.date_fin_validite, cd.fk_contrat";
+ $sql = "SELECT s.rowid as id, s.email, s.nom as name, cd.rowid as cdid, cd.date_ouverture as date_start_real, cd.date_fin_validite as date_end, cd.fk_contrat";
$sql .= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."contrat as c";
$sql .= ", ".MAIN_DB_PREFIX."contratdet as cd, ".MAIN_DB_PREFIX."product as p";
$sql .= " WHERE s.entity IN (".getEntity('societe').")";
@@ -135,8 +135,8 @@ class mailing_thirdparties_services_expired extends MailingTargets
'lastname' => $obj->name, // For thirdparties, lastname must be name
'firstname' => '', // For thirdparties, firstname is ''
'other' =>
- ('DateStart='.dol_print_date($this->db->jdate($obj->date_ouverture), 'day')).';'.
- ('DateEnd='.dol_print_date($this->db->jdate($obj->date_fin_validite), 'day')).';'.
+ ('DateStart='.dol_print_date($this->db->jdate($obj->date_start_real), 'day')).';'. // date start real
+ ('DateEnd='.dol_print_date($this->db->jdate($obj->date_end), 'day')).';'. // date end planned
('Contract='.$obj->fk_contrat).';'.
('ContactLine='.$obj->cdid),
'source_url' => $this->url($obj->id),
@@ -219,6 +219,7 @@ class mailing_thirdparties_services_expired extends MailingTargets
$s = '';
if (count($this->arrayofproducts)) {
+ $langs->loadLangs(array("products"));
$s .= ''.$langs->trans("ProductOrService").' ';
} else {
$s .= ''.$langs->trans("ContactsAllShort").' ';
diff --git a/htdocs/core/modules/member/doc/doc_generic_member_odt.class.php b/htdocs/core/modules/member/doc/doc_generic_member_odt.class.php
index 2ab951147b9..ed48c93c4de 100644
--- a/htdocs/core/modules/member/doc/doc_generic_member_odt.class.php
+++ b/htdocs/core/modules/member/doc/doc_generic_member_odt.class.php
@@ -164,7 +164,9 @@ class doc_generic_member_odt extends ModelePDFMember
$texte .= '';
}
diff --git a/htdocs/core/modules/member/doc/pdf_standard.class.php b/htdocs/core/modules/member/doc/pdf_standard.class.php
index 91206c2dd9f..5a038e67c6d 100644
--- a/htdocs/core/modules/member/doc/pdf_standard.class.php
+++ b/htdocs/core/modules/member/doc/pdf_standard.class.php
@@ -412,7 +412,7 @@ class pdf_standard extends CommonStickerGenerator
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($keywords);
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
diff --git a/htdocs/core/modules/modApi.class.php b/htdocs/core/modules/modApi.class.php
index 48420a264d3..30751fc5222 100644
--- a/htdocs/core/modules/modApi.class.php
+++ b/htdocs/core/modules/modApi.class.php
@@ -107,7 +107,7 @@ class modApi extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
@@ -152,37 +152,20 @@ class modApi extends DolibarrModules
$this->menu = array(); // List of menus to add
$r = 0;
- // Add here entries to declare new menus
- //
- // Example to declare a new Top Menu entry and its Left menu entry:
- // $this->menu[$r]=array( 'fk_menu'=>0, // Put 0 if this is a top menu
- // 'type'=>'top', // This is a Top menu entry
- // 'titre'=>'Api top menu',
- // 'mainmenu'=>'api',
- // 'leftmenu'=>'api',
- // 'url'=>'/api/pagetop.php',
- // 'langs'=>'mylangfile@api', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
- // 'position'=>100,
- // 'enabled'=>'$conf->api->enabled', // Define condition to show or hide menu entry. Use '$conf->api->enabled' if entry must be visible if module is enabled.
- // 'perms'=>'1', // Use 'perms'=>'$user->rights->api->level1->level2' if you want your menu with a permission rules
- // 'target'=>'',
- // 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both
- // $r++;
- //
- // Example to declare a Left Menu entry into an existing Top menu entry:
- // $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=xxx', // Use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode
- // 'type'=>'left', // This is a Left menu entry
- // 'titre'=>'Api left menu',
- // 'mainmenu'=>'xxx',
- // 'leftmenu'=>'api',
- // 'url'=>'/api/pagelevel2.php',
- // 'langs'=>'mylangfile@api', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
- // 'position'=>100,
- // 'enabled'=>'$conf->api->enabled', // Define condition to show or hide menu entry. Use '$conf->api->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected.
- // 'perms'=>'1', // Use 'perms'=>'$user->rights->api->level1->level2' if you want your menu with a permission rules
- // 'target'=>'',
- // 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both
- // $r++;
+ $this->menu[$r] = array('fk_menu'=>'fk_mainmenu=tools',
+ 'type'=>'left',
+ 'titre'=>'ApiExplorer',
+ 'prefix' => img_picto('', $this->picto, 'class="paddingright pictofixedwidth"'),
+ 'mainmenu'=>'tools',
+ 'leftmenu'=>'devtools_api',
+ 'url'=>'/api/index.php/explorer',
+ 'langs'=>'modulebuilder',
+ 'position'=>100,
+ 'perms'=>'1',
+ //'enabled'=>'isModEnabled("api") && preg_match(\'/^(devtools)/\',$leftmenu)',
+ 'enabled'=>'isModEnabled("api")',
+ 'target'=>'_apiexplorer',
+ 'user'=>0);
// Exports
diff --git a/htdocs/core/modules/modAsset.class.php b/htdocs/core/modules/modAsset.class.php
index fbe6134c797..a0fb405887e 100644
--- a/htdocs/core/modules/modAsset.class.php
+++ b/htdocs/core/modules/modAsset.class.php
@@ -137,7 +137,7 @@ class modAsset extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
diff --git a/htdocs/core/modules/modBlockedLog.class.php b/htdocs/core/modules/modBlockedLog.class.php
index 0a07fff6aaf..830f9f0f8b1 100644
--- a/htdocs/core/modules/modBlockedLog.class.php
+++ b/htdocs/core/modules/modBlockedLog.class.php
@@ -183,7 +183,7 @@ class modBlockedLog extends DolibarrModules
$result = $b->setObjectData($object, 'MODULE_SET', 0);
if ($result < 0) {
$this->error = $b->error;
- $this->errors = $b->erros;
+ $this->errors = $b->errors;
return 0;
}
@@ -226,7 +226,7 @@ class modBlockedLog extends DolibarrModules
$result = $b->setObjectData($object, 'MODULE_RESET', 0);
if ($result < 0) {
$this->error = $b->error;
- $this->errors = $b->erros;
+ $this->errors = $b->errors;
return 0;
}
diff --git a/htdocs/core/modules/modBom.class.php b/htdocs/core/modules/modBom.class.php
index d39affa4d78..6f2cc7ac4b2 100644
--- a/htdocs/core/modules/modBom.class.php
+++ b/htdocs/core/modules/modBom.class.php
@@ -156,7 +156,7 @@ class modBom extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
diff --git a/htdocs/core/modules/modBookCal.class.php b/htdocs/core/modules/modBookCal.class.php
new file mode 100644
index 00000000000..2703099cf77
--- /dev/null
+++ b/htdocs/core/modules/modBookCal.class.php
@@ -0,0 +1,539 @@
+
+ * Copyright (C) 2018-2019 Nicolas ZABOURI
+ * Copyright (C) 2019-2020 Frédéric France
+ *
+ * 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 .
+ */
+
+/**
+ * \defgroup bookcal Module BookCal
+ * \brief BookCal module descriptor.
+ *
+ * \file htdocs/bookcal/core/modules/modBookCal.class.php
+ * \ingroup bookcal
+ * \brief Description and activation file for module BookCal
+ */
+include_once DOL_DOCUMENT_ROOT.'/core/modules/DolibarrModules.class.php';
+
+/**
+ * Description and activation class for module BookCal
+ */
+class modBookCal extends DolibarrModules
+{
+ /**
+ * Constructor. Define names, constants, directories, boxes, permissions
+ *
+ * @param DoliDB $db Database handler
+ */
+ public function __construct($db)
+ {
+ global $langs, $conf;
+ $this->db = $db;
+
+ // Id for module (must be unique).
+ // Use here a free id (See in Home -> System information -> Dolibarr for list of used modules id).
+ $this->numero = 500000; // TODO Go on page https://wiki.dolibarr.org/index.php/List_of_modules_id to reserve an id number for your module
+
+ // Key text used to identify module (for permissions, menus, etc...)
+ $this->rights_class = 'bookcal';
+
+ // Family can be 'base' (core modules),'crm','financial','hr','projects','products','ecm','technic' (transverse modules),'interface' (link with external tools),'other','...'
+ // It is used to group modules by family in module setup page
+ $this->family = "other";
+
+ // Module position in the family on 2 digits ('01', '10', '20', ...)
+ $this->module_position = '50';
+
+ // Gives the possibility for the module, to provide his own family info and position of this family (Overwrite $this->family and $this->module_position. Avoid this)
+ //$this->familyinfo = array('myownfamily' => array('position' => '01', 'label' => $langs->trans("MyOwnFamily")));
+ // Module label (no space allowed), used if translation string 'ModuleBookCalName' not found (BookCal is name of module).
+ $this->name = preg_replace('/^mod/i', '', get_class($this));
+
+ // Module description, used if translation string 'ModuleBookCalDesc' not found (BookCal is name of module).
+ $this->description = "BookCalDescription";
+ // Used only if file README.md and README-LL.md not found.
+ $this->descriptionlong = "BookCalDescription";
+
+ // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated' or a version string like 'x.y.z'
+ $this->version = 'development';
+ // Url to the file with your last numberversion of this module
+ //$this->url_last_version = 'http://www.example.com/versionmodule.txt';
+
+ // Key used in llx_const table to save module status enabled/disabled (where BOOKCAL is value of property name of module in uppercase)
+ $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name);
+
+ // Name of image file used for this module.
+ // If file is in theme/yourtheme/img directory under name object_pictovalue.png, use this->picto='pictovalue'
+ // If file is in module/img directory under name object_pictovalue.png, use this->picto='pictovalue@module'
+ // To use a supported fa-xxx css style of font awesome, use this->picto='xxx'
+ $this->picto = 'fa-generic';
+
+ // Define some features supported by module (triggers, login, substitutions, menus, css, etc...)
+ $this->module_parts = array(
+ // Set this to 1 if module has its own trigger directory (core/triggers)
+ 'triggers' => 0,
+ // Set this to 1 if module has its own login method file (core/login)
+ 'login' => 0,
+ // Set this to 1 if module has its own substitution function file (core/substitutions)
+ 'substitutions' => 0,
+ // Set this to 1 if module has its own menus handler directory (core/menus)
+ 'menus' => 0,
+ // Set this to 1 if module overwrite template dir (core/tpl)
+ 'tpl' => 0,
+ // Set this to 1 if module has its own barcode directory (core/modules/barcode)
+ 'barcode' => 0,
+ // Set this to 1 if module has its own models directory (core/modules/xxx)
+ 'models' => 0,
+ // Set this to 1 if module has its own printing directory (core/modules/printing)
+ 'printing' => 0,
+ // Set this to 1 if module has its own theme directory (theme)
+ 'theme' => 0,
+ // Set this to relative path of css file if module has its own css file
+ 'css' => array(
+ // '/bookcal/css/bookcal.css.php',
+ ),
+ // Set this to relative path of js file if module must load a js on all pages
+ 'js' => array(
+ // '/bookcal/js/bookcal.js.php',
+ ),
+ // Set here all hooks context managed by module. To find available hook context, make a "grep -r '>initHooks(' *" on source code. You can also set hook context to 'all'
+ 'hooks' => array(
+ // 'data' => array(
+ // 'hookcontext1',
+ // 'hookcontext2',
+ // ),
+ // 'entity' => '0',
+ ),
+ // Set this to 1 if features of module are opened to external users
+ 'moduleforexternal' => 0,
+ );
+
+ // Data directories to create when module is enabled.
+ // Example: this->dirs = array("/bookcal/temp","/bookcal/subdir");
+ $this->dirs = array("/bookcal/temp");
+
+ // Config pages. Put here list of php page, stored into bookcal/admin directory, to use to setup module.
+ $this->config_page_url = array("setup.php@bookcal");
+
+ // Dependencies
+ // A condition to hide module
+ $this->hidden = false;
+ // List of module class names as string that must be enabled if this module is enabled. Example: array('always1'=>'modModuleToEnable1','always2'=>'modModuleToEnable2', 'FR1'=>'modModuleToEnableFR'...)
+ $this->depends = array();
+ $this->requiredby = array(); // List of module class names as string to disable if this one is disabled. Example: array('modModuleToDisable1', ...)
+ $this->conflictwith = array(); // List of module class names as string this module is in conflict with. Example: array('modModuleToDisable1', ...)
+
+ // The language file dedicated to your module
+ $this->langfiles = array("bookcal@bookcal");
+
+ // Prerequisites
+ $this->phpmin = array(7, 0); // Minimum version of PHP required by module
+ $this->need_dolibarr_version = array(17, -3); // Minimum version of Dolibarr required by module
+
+ // Messages at activation
+ $this->warnings_activation = array(); // Warning to show when we activate module. array('always'='text') or array('FR'='textfr','MX'='textmx'...)
+ $this->warnings_activation_ext = array(); // Warning to show when we activate an external module. array('always'='text') or array('FR'='textfr','MX'='textmx'...)
+ //$this->automatic_activation = array('FR'=>'BookCalWasAutomaticallyActivatedBecauseOfYourCountryChoice');
+ //$this->always_enabled = true; // If true, can't be disabled
+
+ // Constants
+ // List of particular constants to add when module is enabled (key, 'chaine', value, desc, visible, 'current' or 'allentities', deleteonunactive)
+ // Example: $this->const=array(1 => array('BOOKCAL_MYNEWCONST1', 'chaine', 'myvalue', 'This is a constant to add', 1),
+ // 2 => array('BOOKCAL_MYNEWCONST2', 'chaine', 'myvalue', 'This is another constant to add', 0, 'current', 1)
+ // );
+ $this->const = array();
+
+ // Some keys to add into the overwriting translation tables
+ /*$this->overwrite_translation = array(
+ 'en_US:ParentCompany'=>'Parent company or reseller',
+ 'fr_FR:ParentCompany'=>'Maison mère ou revendeur'
+ )*/
+
+ if (!isset($conf->bookcal) || !isset($conf->bookcal->enabled)) {
+ $conf->bookcal = new stdClass();
+ $conf->bookcal->enabled = 0;
+ }
+
+ // Array to add new pages in new tabs
+ $this->tabs = array();
+ // Example:
+ // $this->tabs[] = array('data'=>'objecttype:+tabname1:Title1:mylangfile@bookcal:$user->rights->bookcal->read:/bookcal/mynewtab1.php?id=__ID__'); // To add a new tab identified by code tabname1
+ // $this->tabs[] = array('data'=>'objecttype:+tabname2:SUBSTITUTION_Title2:mylangfile@bookcal:$user->rights->othermodule->read:/bookcal/mynewtab2.php?id=__ID__', // To add another new tab identified by code tabname2. Label will be result of calling all substitution functions on 'Title2' key.
+ // $this->tabs[] = array('data'=>'objecttype:-tabname:NU:conditiontoremove'); // To remove an existing tab identified by code tabname
+ //
+ // Where objecttype can be
+ // 'categories_x' to add a tab in category view (replace 'x' by type of category (0=product, 1=supplier, 2=customer, 3=member)
+ // 'contact' to add a tab in contact view
+ // 'contract' to add a tab in contract view
+ // 'group' to add a tab in group view
+ // 'intervention' to add a tab in intervention view
+ // 'invoice' to add a tab in customer invoice view
+ // 'invoice_supplier' to add a tab in supplier invoice view
+ // 'member' to add a tab in fundation member view
+ // 'opensurveypoll' to add a tab in opensurvey poll view
+ // 'order' to add a tab in customer order view
+ // 'order_supplier' to add a tab in supplier order view
+ // 'payment' to add a tab in payment view
+ // 'payment_supplier' to add a tab in supplier payment view
+ // 'product' to add a tab in product view
+ // 'propal' to add a tab in propal view
+ // 'project' to add a tab in project view
+ // 'stock' to add a tab in stock view
+ // 'thirdparty' to add a tab in third party view
+ // 'user' to add a tab in user view
+
+ // Dictionaries
+ $this->dictionaries = array();
+ /* Example:
+ $this->dictionaries=array(
+ 'langs'=>'bookcal@bookcal',
+ // List of tables we want to see into dictonnary editor
+ 'tabname'=>array("table1", "table2", "table3"),
+ // Label of tables
+ 'tablib'=>array("Table1", "Table2", "Table3"),
+ // Request to select fields
+ 'tabsql'=>array('SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table1 as f', 'SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table2 as f', 'SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table3 as f'),
+ // Sort order
+ 'tabsqlsort'=>array("label ASC", "label ASC", "label ASC"),
+ // List of fields (result of select to show dictionary)
+ 'tabfield'=>array("code,label", "code,label", "code,label"),
+ // List of fields (list of fields to edit a record)
+ 'tabfieldvalue'=>array("code,label", "code,label", "code,label"),
+ // List of fields (list of fields for insert)
+ 'tabfieldinsert'=>array("code,label", "code,label", "code,label"),
+ // Name of columns with primary key (try to always name it 'rowid')
+ 'tabrowid'=>array("rowid", "rowid", "rowid"),
+ // Condition to show each dictionary
+ 'tabcond'=>array($conf->bookcal->enabled, $conf->bookcal->enabled, $conf->bookcal->enabled)
+ // Help tooltip for each fields of the dictionary
+ 'tabhelp'=>array(array('code'=>$langs->trans('CodeTooltipHelp')))
+ );
+ */
+
+ // Boxes/Widgets
+ // Add here list of php file(s) stored in bookcal/core/boxes that contains a class to show a widget.
+ $this->boxes = array(
+ // 0 => array(
+ // 'file' => 'bookcalwidget1.php@bookcal',
+ // 'note' => 'Widget provided by BookCal',
+ // 'enabledbydefaulton' => 'Home',
+ // ),
+ // ...
+ );
+
+ // Cronjobs (List of cron jobs entries to add when module is enabled)
+ // unit_frequency must be 60 for minute, 3600 for hour, 86400 for day, 604800 for week
+ $this->cronjobs = array(
+ // 0 => array(
+ // 'label' => 'MyJob label',
+ // 'jobtype' => 'method',
+ // 'class' => '/bookcal/class/availabilities.class.php',
+ // 'objectname' => 'Availabilities',
+ // 'method' => 'doScheduledJob',
+ // 'parameters' => '',
+ // 'comment' => 'Comment',
+ // 'frequency' => 2,
+ // 'unitfrequency' => 3600,
+ // 'status' => 0,
+ // 'test' => '$conf->bookcal->enabled',
+ // 'priority' => 50,
+ // ),
+ );
+ // Example: $this->cronjobs=array(
+ // 0=>array('label'=>'My label', 'jobtype'=>'method', 'class'=>'/dir/class/file.class.php', 'objectname'=>'MyClass', 'method'=>'myMethod', 'parameters'=>'param1, param2', 'comment'=>'Comment', 'frequency'=>2, 'unitfrequency'=>3600, 'status'=>0, 'test'=>'$conf->bookcal->enabled', 'priority'=>50),
+ // 1=>array('label'=>'My label', 'jobtype'=>'command', 'command'=>'', 'parameters'=>'param1, param2', 'comment'=>'Comment', 'frequency'=>1, 'unitfrequency'=>3600*24, 'status'=>0, 'test'=>'$conf->bookcal->enabled', 'priority'=>50)
+ // );
+
+ // Permissions provided by this module
+ $this->rights = array();
+ $r = 0;
+ // Add here entries to declare new permissions
+ /* BEGIN MODULEBUILDER PERMISSIONS */
+ $this->rights[$r][0] = $this->numero . sprintf("%02d", $r + 1); // Permission id (must not be already used)
+ $this->rights[$r][1] = 'Read objects of BookCal'; // Permission label
+ $this->rights[$r][4] = 'availabilities';
+ $this->rights[$r][5] = 'read'; // In php code, permission will be checked by test if ($user->rights->bookcal->availabilities->read)
+ $r++;
+ $this->rights[$r][0] = $this->numero . sprintf("%02d", $r + 1); // Permission id (must not be already used)
+ $this->rights[$r][1] = 'Create/Update objects of BookCal'; // Permission label
+ $this->rights[$r][4] = 'availabilities';
+ $this->rights[$r][5] = 'write'; // In php code, permission will be checked by test if ($user->rights->bookcal->availabilities->write)
+ $r++;
+ $this->rights[$r][0] = $this->numero . sprintf("%02d", $r + 1); // Permission id (must not be already used)
+ $this->rights[$r][1] = 'Delete objects of BookCal'; // Permission label
+ $this->rights[$r][4] = 'availabilities';
+ $this->rights[$r][5] = 'delete'; // In php code, permission will be checked by test if ($user->rights->bookcal->availabilities->delete)
+ $r++;
+ /* END MODULEBUILDER PERMISSIONS */
+
+ // Main menu entries to add
+ $this->menu = array();
+ $r = 0;
+ // Add here entries to declare new menus
+ /* BEGIN MODULEBUILDER TOPMENU */
+ $this->menu[$r++] = array(
+ 'fk_menu'=>'', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode
+ 'type'=>'top', // This is a Top menu entry
+ 'titre'=>'ModuleBookCalName',
+ 'prefix' => img_picto('', $this->picto, 'class="paddingright pictofixedwidth valignmiddle"'),
+ 'mainmenu'=>'bookcal',
+ 'leftmenu'=>'',
+ 'url'=>'/bookcal/bookcalindex.php',
+ 'langs'=>'bookcal@bookcal', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
+ 'position'=>1000 + $r,
+ 'enabled'=>'$conf->bookcal->enabled', // Define condition to show or hide menu entry. Use '$conf->bookcal->enabled' if entry must be visible if module is enabled.
+ 'perms'=>'1', // Use 'perms'=>'$user->rights->bookcal->availabilities->read' if you want your menu with a permission rules
+ 'target'=>'',
+ 'user'=>2, // 0=Menu for internal users, 1=external users, 2=both
+ );
+ /* END MODULEBUILDER TOPMENU */
+ /* BEGIN MODULEBUILDER LEFTMENU AVAILABILITIES
+ $this->menu[$r++]=array(
+ 'fk_menu'=>'fk_mainmenu=bookcal', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode
+ 'type'=>'left', // This is a Left menu entry
+ 'titre'=>'Availabilities',
+ 'prefix' => img_picto('', $this->picto, 'class="paddingright pictofixedwidth valignmiddle"'),
+ 'mainmenu'=>'bookcal',
+ 'leftmenu'=>'availabilities',
+ 'url'=>'/bookcal/bookcalindex.php',
+ 'langs'=>'bookcal@bookcal', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
+ 'position'=>1000+$r,
+ 'enabled'=>'$conf->bookcal->enabled', // Define condition to show or hide menu entry. Use '$conf->bookcal->enabled' if entry must be visible if module is enabled.
+ 'perms'=>'$user->rights->bookcal->availabilities->read', // Use 'perms'=>'$user->rights->bookcal->level1->level2' if you want your menu with a permission rules
+ 'target'=>'',
+ 'user'=>2, // 0=Menu for internal users, 1=external users, 2=both
+ );
+ $this->menu[$r++]=array(
+ 'fk_menu'=>'fk_mainmenu=bookcal,fk_leftmenu=availabilities', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode
+ 'type'=>'left', // This is a Left menu entry
+ 'titre'=>'List_Availabilities',
+ 'mainmenu'=>'bookcal',
+ 'leftmenu'=>'bookcal_availabilities_list',
+ 'url'=>'/bookcal/availabilities_list.php',
+ 'langs'=>'bookcal@bookcal', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
+ 'position'=>1000+$r,
+ 'enabled'=>'$conf->bookcal->enabled', // Define condition to show or hide menu entry. Use '$conf->bookcal->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected.
+ 'perms'=>'$user->rights->bookcal->availabilities->read', // Use 'perms'=>'$user->rights->bookcal->level1->level2' if you want your menu with a permission rules
+ 'target'=>'',
+ 'user'=>2, // 0=Menu for internal users, 1=external users, 2=both
+ );
+ $this->menu[$r++]=array(
+ 'fk_menu'=>'fk_mainmenu=bookcal,fk_leftmenu=availabilities', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode
+ 'type'=>'left', // This is a Left menu entry
+ 'titre'=>'New_Availabilities',
+ 'mainmenu'=>'bookcal',
+ 'leftmenu'=>'bookcal_availabilities_new',
+ 'url'=>'/bookcal/availabilities_card.php?action=create',
+ 'langs'=>'bookcal@bookcal', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
+ 'position'=>1000+$r,
+ 'enabled'=>'$conf->bookcal->enabled', // Define condition to show or hide menu entry. Use '$conf->bookcal->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected.
+ 'perms'=>'$user->rights->bookcal->availabilities->write', // Use 'perms'=>'$user->rights->bookcal->level1->level2' if you want your menu with a permission rules
+ 'target'=>'',
+ 'user'=>2, // 0=Menu for internal users, 1=external users, 2=both
+ );
+ */
+
+ $this->menu[$r++]=array(
+ // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode
+ 'fk_menu'=>'fk_mainmenu=bookcal',
+ // This is a Left menu entry
+ 'type'=>'left',
+ 'titre'=>'List Availabilities',
+ 'mainmenu'=>'bookcal',
+ 'leftmenu'=>'bookcal_availabilities',
+ 'url'=>'/bookcal/availabilities_list.php',
+ // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
+ 'langs'=>'bookcal@bookcal',
+ 'position'=>1100+$r,
+ // Define condition to show or hide menu entry. Use '$conf->bookcal->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected.
+ 'enabled'=>'$conf->bookcal->enabled',
+ // Use 'perms'=>'$user->rights->bookcal->level1->level2' if you want your menu with a permission rules
+ 'perms'=>'1',
+ 'target'=>'',
+ // 0=Menu for internal users, 1=external users, 2=both
+ 'user'=>2,
+ );
+ $this->menu[$r++]=array(
+ // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode
+ 'fk_menu'=>'fk_mainmenu=bookcal,fk_leftmenu=bookcal_availabilities',
+ // This is a Left menu entry
+ 'type'=>'left',
+ 'titre'=>'New Availabilities',
+ 'mainmenu'=>'bookcal',
+ 'leftmenu'=>'bookcal_availabilities',
+ 'url'=>'/bookcal/availabilities_card.php?action=create',
+ // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
+ 'langs'=>'bookcal@bookcal',
+ 'position'=>1100+$r,
+ // Define condition to show or hide menu entry. Use '$conf->bookcal->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected.
+ 'enabled'=>'$conf->bookcal->enabled',
+ // Use 'perms'=>'$user->rights->bookcal->level1->level2' if you want your menu with a permission rules
+ 'perms'=>'1',
+ 'target'=>'',
+ // 0=Menu for internal users, 1=external users, 2=both
+ 'user'=>2
+ );
+
+ /* END MODULEBUILDER LEFTMENU AVAILABILITIES */
+ // Exports profiles provided by this module
+ $r = 1;
+ /* BEGIN MODULEBUILDER EXPORT AVAILABILITIES */
+ /*
+ $langs->load("bookcal@bookcal");
+ $this->export_code[$r]=$this->rights_class.'_'.$r;
+ $this->export_label[$r]='AvailabilitiesLines'; // Translation key (used only if key ExportDataset_xxx_z not found)
+ $this->export_icon[$r]='availabilities@bookcal';
+ // Define $this->export_fields_array, $this->export_TypeFields_array and $this->export_entities_array
+ $keyforclass = 'Availabilities'; $keyforclassfile='/bookcal/class/availabilities.class.php'; $keyforelement='availabilities@bookcal';
+ include DOL_DOCUMENT_ROOT.'/core/commonfieldsinexport.inc.php';
+ //$this->export_fields_array[$r]['t.fieldtoadd']='FieldToAdd'; $this->export_TypeFields_array[$r]['t.fieldtoadd']='Text';
+ //unset($this->export_fields_array[$r]['t.fieldtoremove']);
+ //$keyforclass = 'AvailabilitiesLine'; $keyforclassfile='/bookcal/class/availabilities.class.php'; $keyforelement='availabilitiesline@bookcal'; $keyforalias='tl';
+ //include DOL_DOCUMENT_ROOT.'/core/commonfieldsinexport.inc.php';
+ $keyforselect='availabilities'; $keyforaliasextra='extra'; $keyforelement='availabilities@bookcal';
+ include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php';
+ //$keyforselect='availabilitiesline'; $keyforaliasextra='extraline'; $keyforelement='availabilitiesline@bookcal';
+ //include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php';
+ //$this->export_dependencies_array[$r] = array('availabilitiesline'=>array('tl.rowid','tl.ref')); // To force to activate one or several fields if we select some fields that need same (like to select a unique key if we ask a field of a child to avoid the DISTINCT to discard them, or for computed field than need several other fields)
+ //$this->export_special_array[$r] = array('t.field'=>'...');
+ //$this->export_examplevalues_array[$r] = array('t.field'=>'Example');
+ //$this->export_help_array[$r] = array('t.field'=>'FieldDescHelp');
+ $this->export_sql_start[$r]='SELECT DISTINCT ';
+ $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'availabilities as t';
+ //$this->export_sql_end[$r] =' LEFT JOIN '.MAIN_DB_PREFIX.'availabilities_line as tl ON tl.fk_availabilities = t.rowid';
+ $this->export_sql_end[$r] .=' WHERE 1 = 1';
+ $this->export_sql_end[$r] .=' AND t.entity IN ('.getEntity('availabilities').')';
+ $r++; */
+ /* END MODULEBUILDER EXPORT AVAILABILITIES */
+
+ // Imports profiles provided by this module
+ $r = 1;
+ /* BEGIN MODULEBUILDER IMPORT AVAILABILITIES */
+ /*
+ $langs->load("bookcal@bookcal");
+ $this->import_code[$r]=$this->rights_class.'_'.$r;
+ $this->import_label[$r]='AvailabilitiesLines'; // Translation key (used only if key ExportDataset_xxx_z not found)
+ $this->import_icon[$r]='availabilities@bookcal';
+ $this->import_tables_array[$r] = array('t' => MAIN_DB_PREFIX.'bookcal_availabilities', 'extra' => MAIN_DB_PREFIX.'bookcal_availabilities_extrafields');
+ $this->import_tables_creator_array[$r] = array('t' => 'fk_user_author'); // Fields to store import user id
+ $import_sample = array();
+ $keyforclass = 'Availabilities'; $keyforclassfile='/bookcal/class/availabilities.class.php'; $keyforelement='availabilities@bookcal';
+ include DOL_DOCUMENT_ROOT.'/core/commonfieldsinimport.inc.php';
+ $import_extrafield_sample = array();
+ $keyforselect='availabilities'; $keyforaliasextra='extra'; $keyforelement='availabilities@bookcal';
+ include DOL_DOCUMENT_ROOT.'/core/extrafieldsinimport.inc.php';
+ $this->import_fieldshidden_array[$r] = array('extra.fk_object' => 'lastrowid-'.MAIN_DB_PREFIX.'bookcal_availabilities');
+ $this->import_regex_array[$r] = array();
+ $this->import_examplevalues_array[$r] = array_merge($import_sample, $import_extrafield_sample);
+ $this->import_updatekeys_array[$r] = array('t.ref' => 'Ref');
+ $this->import_convertvalue_array[$r] = array(
+ 't.ref' => array(
+ 'rule'=>'getrefifauto',
+ 'class'=>(empty($conf->global->BOOKCAL_AVAILABILITIES_ADDON) ? 'mod_availabilities_standard' : $conf->global->BOOKCAL_AVAILABILITIES_ADDON),
+ 'path'=>"/core/modules/commande/".(empty($conf->global->BOOKCAL_AVAILABILITIES_ADDON) ? 'mod_availabilities_standard' : $conf->global->BOOKCAL_AVAILABILITIES_ADDON).'.php'
+ 'classobject'=>'Availabilities',
+ 'pathobject'=>'/bookcal/class/availabilities.class.php',
+ ),
+ 't.fk_soc' => array('rule' => 'fetchidfromref', 'file' => '/societe/class/societe.class.php', 'class' => 'Societe', 'method' => 'fetch', 'element' => 'ThirdParty'),
+ 't.fk_user_valid' => array('rule' => 'fetchidfromref', 'file' => '/user/class/user.class.php', 'class' => 'User', 'method' => 'fetch', 'element' => 'user'),
+ 't.fk_mode_reglement' => array('rule' => 'fetchidfromcodeorlabel', 'file' => '/compta/paiement/class/cpaiement.class.php', 'class' => 'Cpaiement', 'method' => 'fetch', 'element' => 'cpayment'),
+ );
+ $r++; */
+ /* END MODULEBUILDER IMPORT AVAILABILITIES */
+ }
+
+ /**
+ * Function called when module is enabled.
+ * The init function add constants, boxes, permissions and menus (defined in constructor) into Dolibarr database.
+ * It also creates data directories
+ *
+ * @param string $options Options when enabling module ('', 'noboxes')
+ * @return int 1 if OK, 0 if KO
+ */
+ public function init($options = '')
+ {
+ global $conf, $langs;
+
+ //$result = $this->_load_tables('/install/mysql/', 'bookcal');
+ $result = $this->_load_tables('/bookcal/sql/');
+ if ($result < 0) {
+ return -1; // Do not activate module if error 'not allowed' returned when loading module SQL queries (the _load_table run sql with run_sql with the error allowed parameter set to 'default')
+ }
+
+ // Create extrafields during init
+ //include_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
+ //$extrafields = new ExtraFields($this->db);
+ //$result1=$extrafields->addExtraField('bookcal_myattr1', "New Attr 1 label", 'boolean', 1, 3, 'thirdparty', 0, 0, '', '', 1, '', 0, 0, '', '', 'bookcal@bookcal', '$conf->bookcal->enabled');
+ //$result2=$extrafields->addExtraField('bookcal_myattr2', "New Attr 2 label", 'varchar', 1, 10, 'project', 0, 0, '', '', 1, '', 0, 0, '', '', 'bookcal@bookcal', '$conf->bookcal->enabled');
+ //$result3=$extrafields->addExtraField('bookcal_myattr3', "New Attr 3 label", 'varchar', 1, 10, 'bank_account', 0, 0, '', '', 1, '', 0, 0, '', '', 'bookcal@bookcal', '$conf->bookcal->enabled');
+ //$result4=$extrafields->addExtraField('bookcal_myattr4', "New Attr 4 label", 'select', 1, 3, 'thirdparty', 0, 1, '', array('options'=>array('code1'=>'Val1','code2'=>'Val2','code3'=>'Val3')), 1,'', 0, 0, '', '', 'bookcal@bookcal', '$conf->bookcal->enabled');
+ //$result5=$extrafields->addExtraField('bookcal_myattr5', "New Attr 5 label", 'text', 1, 10, 'user', 0, 0, '', '', 1, '', 0, 0, '', '', 'bookcal@bookcal', '$conf->bookcal->enabled');
+
+ // Permissions
+ $this->remove($options);
+
+ $sql = array();
+
+ // Document templates
+ $moduledir = dol_sanitizeFileName('bookcal');
+ $myTmpObjects = array();
+ $myTmpObjects['Availabilities'] = array('includerefgeneration'=>0, 'includedocgeneration'=>0);
+
+ foreach ($myTmpObjects as $myTmpObjectKey => $myTmpObjectArray) {
+ if ($myTmpObjectKey == 'Availabilities') {
+ continue;
+ }
+ if ($myTmpObjectArray['includerefgeneration']) {
+ $src = DOL_DOCUMENT_ROOT.'/install/doctemplates/'.$moduledir.'/template_availabilitiess.odt';
+ $dirodt = DOL_DATA_ROOT.'/doctemplates/'.$moduledir;
+ $dest = $dirodt.'/template_availabilitiess.odt';
+
+ if (file_exists($src) && !file_exists($dest)) {
+ require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ dol_mkdir($dirodt);
+ $result = dol_copy($src, $dest, 0, 0);
+ if ($result < 0) {
+ $langs->load("errors");
+ $this->error = $langs->trans('ErrorFailToCopyFile', $src, $dest);
+ return 0;
+ }
+ }
+
+ $sql = array_merge($sql, array(
+ "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = 'standard_".strtolower($myTmpObjectKey)."' AND type = '".$this->db->escape(strtolower($myTmpObjectKey))."' AND entity = ".((int) $conf->entity),
+ "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('standard_".strtolower($myTmpObjectKey)."', '".$this->db->escape(strtolower($myTmpObjectKey))."', ".((int) $conf->entity).")",
+ "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = 'generic_".strtolower($myTmpObjectKey)."_odt' AND type = '".$this->db->escape(strtolower($myTmpObjectKey))."' AND entity = ".((int) $conf->entity),
+ "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('generic_".strtolower($myTmpObjectKey)."_odt', '".$this->db->escape(strtolower($myTmpObjectKey))."', ".((int) $conf->entity).")"
+ ));
+ }
+ }
+
+ return $this->_init($sql, $options);
+ }
+
+ /**
+ * Function called when module is disabled.
+ * Remove from database constants, boxes and permissions from Dolibarr database.
+ * Data directories are not deleted
+ *
+ * @param string $options Options when enabling module ('', 'noboxes')
+ * @return int 1 if OK, 0 if KO
+ */
+ public function remove($options = '')
+ {
+ $sql = array();
+ return $this->_remove($sql, $options);
+ }
+}
diff --git a/htdocs/core/modules/modCommande.class.php b/htdocs/core/modules/modCommande.class.php
index 6a88c14271b..f0486b5cb58 100644
--- a/htdocs/core/modules/modCommande.class.php
+++ b/htdocs/core/modules/modCommande.class.php
@@ -34,11 +34,10 @@ include_once DOL_DOCUMENT_ROOT.'/core/modules/DolibarrModules.class.php';
/**
- * Class to describe module customer orders
+ * Class to describe module Sales Orders
*/
class modCommande extends DolibarrModules
{
-
/**
* Constructor. Define names, constants, directories, boxes, permissions
*
diff --git a/htdocs/core/modules/modCron.class.php b/htdocs/core/modules/modCron.class.php
index 992015fe75e..93b243625f4 100644
--- a/htdocs/core/modules/modCron.class.php
+++ b/htdocs/core/modules/modCron.class.php
@@ -99,7 +99,7 @@ class modCron extends DolibarrModules
// Cronjobs
$this->cronjobs = array(
0=>array('entity'=>0, 'label'=>'PurgeDeleteTemporaryFilesShort', 'jobtype'=>'method', 'class'=>'core/class/utils.class.php', 'objectname'=>'Utils', 'method'=>'purgeFiles', 'parameters'=>'tempfilesold+logfiles', 'comment'=>'PurgeDeleteTemporaryFiles', 'frequency'=>2, 'unitfrequency'=>3600 * 24 * 7, 'priority'=>50, 'status'=>1, 'test'=>true),
- 1=>array('entity'=>0, 'label'=>'MakeLocalDatabaseDumpShort', 'jobtype'=>'method', 'class'=>'core/class/utils.class.php', 'objectname'=>'Utils', 'method'=>'dumpDatabase', 'parameters'=>'none,auto,1,auto,10', 'comment'=>'MakeLocalDatabaseDump', 'frequency'=>1, 'unitfrequency'=>3600 * 24 * 7, 'priority'=>90, 'status'=>0, 'test'=>'in_array($conf->db->type, array(\'mysql\', \'mysqli\'))'),
+ 1=>array('entity'=>0, 'label'=>'MakeLocalDatabaseDumpShort', 'jobtype'=>'method', 'class'=>'core/class/utils.class.php', 'objectname'=>'Utils', 'method'=>'dumpDatabase', 'parameters'=>'none,auto,1,auto,10,0,0', 'comment'=>'MakeLocalDatabaseDump', 'frequency'=>1, 'unitfrequency'=>3600 * 24 * 7, 'priority'=>90, 'status'=>0, 'test'=>'in_array($conf->db->type, array(\'mysql\', \'mysqli\'))'),
2=>array('entity'=>0, 'label'=>'MakeSendLocalDatabaseDumpShort', 'jobtype'=>'method', 'class'=>'core/class/utils.class.php', 'objectname'=>'Utils', 'method'=>'sendBackup', 'parameters'=>',,,,,sql', 'comment'=>'MakeSendLocalDatabaseDump', 'frequency'=>1, 'unitfrequency'=>604800, 'priority'=>91, 'status'=>0, 'test'=>'!empty($conf->global->MAIN_ALLOW_BACKUP_BY_EMAIL) && in_array($conf->db->type, array(\'mysql\', \'mysqli\'))'),
3=>array('entity'=>0, 'label'=>'CleanUnfinishedCronjobShort', 'jobtype'=>'method', 'class'=>'core/class/utils.class.php', 'objectname'=>'Utils', 'method'=>'cleanUnfinishedCronjob', 'parameters'=>'', 'comment'=>'CleanUnfinishedCronjob', 'frequency'=>5, 'unitfrequency'=>60, 'priority'=>10, 'status'=>0, 'test'=>'getDolGlobalInt("MAIN_FEATURES_LEVEL") >= 2'),
// 1=>array('entity'=>0, 'label'=>'My label', 'jobtype'=>'command', 'command'=>'', 'parameters'=>'', 'comment'=>'Comment', 'frequency'=>1, 'unitfrequency'=>3600*24)
diff --git a/htdocs/core/modules/modDataPolicy.class.php b/htdocs/core/modules/modDataPolicy.class.php
index 2768e7d1d7a..93f3e6f4024 100644
--- a/htdocs/core/modules/modDataPolicy.class.php
+++ b/htdocs/core/modules/modDataPolicy.class.php
@@ -162,7 +162,7 @@ class modDataPolicy extends DolibarrModules {
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
diff --git a/htdocs/core/modules/modDav.class.php b/htdocs/core/modules/modDav.class.php
index aeea231fd1e..356f043cea0 100644
--- a/htdocs/core/modules/modDav.class.php
+++ b/htdocs/core/modules/modDav.class.php
@@ -131,7 +131,7 @@ class modDav extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
diff --git a/htdocs/core/modules/modECM.class.php b/htdocs/core/modules/modECM.class.php
index e90b42a40aa..1ea7530be53 100644
--- a/htdocs/core/modules/modECM.class.php
+++ b/htdocs/core/modules/modECM.class.php
@@ -182,7 +182,22 @@ class modECM extends DolibarrModules
'langs'=>'ecm',
'position'=>103,
'perms'=>'$user->rights->ecm->read || $user->rights->ecm->upload',
- 'enabled'=>'($user->rights->ecm->read || $user->rights->ecm->upload) && !empty($conf->global->ECM_AUTO_TREE_ENABLED)',
+ 'enabled'=>'($user->rights->ecm->read || $user->rights->ecm->upload) && getDolGlobalInt("ECM_AUTO_TREE_ENABLED")',
+ 'target'=>'',
+ 'user'=>2, // 0=Menu for internal users, 1=external users, 2=both
+ );
+ $r++;
+
+ $this->menu[$r] = array(
+ 'fk_menu'=>'fk_mainmenu=ecm,fk_leftmenu=ecm',
+ 'type'=>'left',
+ 'titre'=>'ECMSectionsMedias',
+ 'mainmenu'=>'ecm',
+ 'url'=>'/ecm/index_medias.php?action=file_manager&mainmenu=ecm&leftmenu=ecm',
+ 'langs'=>'ecm',
+ 'position'=>104,
+ 'perms'=>'$user->rights->ecm->read || $user->rights->ecm->upload',
+ 'enabled'=>'($user->rights->ecm->read || $user->rights->ecm->upload) && getDolGlobalInt("MAIN_FEATURES_LEVEL") == 2',
'target'=>'',
'user'=>2, // 0=Menu for internal users, 1=external users, 2=both
);
diff --git a/htdocs/core/modules/modEmailCollector.class.php b/htdocs/core/modules/modEmailCollector.class.php
index 03c668910ce..514fe1be667 100644
--- a/htdocs/core/modules/modEmailCollector.class.php
+++ b/htdocs/core/modules/modEmailCollector.class.php
@@ -131,7 +131,7 @@ class modEmailCollector extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
diff --git a/htdocs/core/modules/modEventOrganization.class.php b/htdocs/core/modules/modEventOrganization.class.php
index 6708eb4192a..f037f26176c 100644
--- a/htdocs/core/modules/modEventOrganization.class.php
+++ b/htdocs/core/modules/modEventOrganization.class.php
@@ -62,7 +62,7 @@ class modEventOrganization extends DolibarrModules
// Key used in llx_const table to save module status enabled/disabled (where EVENTORGANIZATION is value of property name of module in uppercase)
$this->const_name = 'MAIN_MODULE_'.strtoupper($this->name);
- $this->picto = 'action';
+ $this->picto = 'conferenceorbooth';
// Define some features supported by module (triggers, login, substitutions, menus, css, etc...)
$this->module_parts = array(
@@ -169,7 +169,7 @@ class modEventOrganization extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
@@ -327,7 +327,7 @@ class modEventOrganization extends DolibarrModules
*/
public function init($options = '')
{
- global $conf, $langs;
+ global $conf, $langs, $user;
// Permissions
$this->remove($options);
@@ -370,6 +370,28 @@ class modEventOrganization extends DolibarrModules
$init = $this->_init($sql, $options);
+
+ // Insert some vars
+ include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
+ $formmail = new FormMail($this->db);
+
+ $template = $formmail->getEMailTemplate($this->db, 'conferenceorbooth', $user, $langs, 0, 1, '(EventOrganizationEmailAskConf)');
+ if ($template->id > 0) {
+ dolibarr_set_const($this->db, 'EVENTORGANIZATION_TEMPLATE_EMAIL_ASK_CONF', $template->id, 'chaine', 0, '', $conf->entity);
+ }
+ $template = $formmail->getEMailTemplate($this->db, 'conferenceorbooth', $user, $langs, 0, 1, '(EventOrganizationEmailAskBooth)');
+ if ($template->id > 0) {
+ dolibarr_set_const($this->db, 'EVENTORGANIZATION_TEMPLATE_EMAIL_ASK_BOOTH', $template->id, 'chaine', 0, '', $conf->entity);
+ }
+ $template = $formmail->getEMailTemplate($this->db, 'conferenceorbooth', $user, $langs, 0, 1, '(EventOrganizationEmailBoothPayment)');
+ if ($template->id > 0) {
+ dolibarr_set_const($this->db, 'EVENTORGANIZATION_TEMPLATE_EMAIL_AFT_SUBS_BOOTH', $template->id, 'chaine', 0, '', $conf->entity);
+ }
+ $template = $formmail->getEMailTemplate($this->db, 'conferenceorbooth', $user, $langs, 0, 1, '(EventOrganizationEmailRegistrationPayment)');
+ if ($template->id > 0) {
+ dolibarr_set_const($this->db, 'EVENTORGANIZATION_TEMPLATE_EMAIL_AFT_SUBS_EVENT', $template->id, 'chaine', 0, '', $conf->entity);
+ }
+
return $init;
}
diff --git a/htdocs/core/modules/modFacture.class.php b/htdocs/core/modules/modFacture.class.php
index 339e02cf393..85072c90cee 100644
--- a/htdocs/core/modules/modFacture.class.php
+++ b/htdocs/core/modules/modFacture.class.php
@@ -5,6 +5,7 @@
* Copyright (C) 2004 Benoit Mortier
* Copyright (C) 2005-2012 Regis Houssin
* Copyright (C) 2021 Alexandre Spangaro
+ * Copyright (C) 2022 Frédéric France
*
* 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
@@ -238,7 +239,7 @@ class modFacture extends DolibarrModules
$this->import_fields_array[$r] = array(
'f.ref' => 'InvoiceRef*',
'f.ref_ext' => 'ExternalRef',
- 'f.ref_client' => 'CutomerRef',
+ 'f.ref_client' => 'CustomerRef',
'f.type' => 'Type*',
'f.fk_soc' => 'Customer*',
'f.datec' => 'InvoiceDateCreation',
@@ -350,7 +351,7 @@ class modFacture extends DolibarrModules
)
);
- //Import Supplier Invoice Lines
+ // Import Invoice Lines
$r++;
$this->import_code[$r] = $this->rights_class.'_'.$r;
$this->import_label[$r] = "InvoiceLine"; // Translation key
diff --git a/htdocs/core/modules/modFckeditor.class.php b/htdocs/core/modules/modFckeditor.class.php
index 8c30d8a0a51..fa3a66c37cc 100644
--- a/htdocs/core/modules/modFckeditor.class.php
+++ b/htdocs/core/modules/modFckeditor.class.php
@@ -70,10 +70,9 @@ class modFckeditor extends DolibarrModules
// Constants
$this->const = array();
$this->const[0] = array("FCKEDITOR_ENABLE_SOCIETE", "yesno", "1", "WYSIWIG for the fields descriptions of elements (except products/services)");
- $this->const[1] = array("FCKEDITOR_ENABLE_PRODUCTDESC", "yesno", "1", "WYSIWIG for the fields description of products/services");
- $this->const[2] = array("FCKEDITOR_ENABLE_MAILING", "yesno", "1", "WYSIWIG for mass emailings");
- $this->const[3] = array("FCKEDITOR_ENABLE_DETAILS", "yesno", "1", "WYSIWIG for products details lines for all entities");
- $this->const[4] = array("FCKEDITOR_ENABLE_USERSIGN", "yesno", "1", "WYSIWIG for user signature");
+ $this->const[2] = array("FCKEDITOR_ENABLE_DETAILS", "yesno", "1", "WYSIWIG for products details lines for all entities");
+ $this->const[3] = array("FCKEDITOR_ENABLE_USERSIGN", "yesno", "1", "WYSIWIG for user signature");
+ $this->const[4] = array("FCKEDITOR_ENABLE_MAILING", "yesno", "1", "WYSIWIG for mass emailings");
$this->const[5] = array("FCKEDITOR_ENABLE_MAIL", "yesno", "1", "WYSIWIG for products details lines for all entities");
$this->const[6] = array("FCKEDITOR_SKIN", "string", "moono-lisa", "Skin by default for fckeditor");
diff --git a/htdocs/core/modules/modHRM.class.php b/htdocs/core/modules/modHRM.class.php
index 0da5663d452..09ff03cae9b 100644
--- a/htdocs/core/modules/modHRM.class.php
+++ b/htdocs/core/modules/modHRM.class.php
@@ -141,7 +141,7 @@ class modHRM extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
diff --git a/htdocs/core/modules/modKnowledgeManagement.class.php b/htdocs/core/modules/modKnowledgeManagement.class.php
index 634f36406a2..b331c56a917 100644
--- a/htdocs/core/modules/modKnowledgeManagement.class.php
+++ b/htdocs/core/modules/modKnowledgeManagement.class.php
@@ -184,7 +184,7 @@ class modKnowledgeManagement extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
diff --git a/htdocs/core/modules/modModuleBuilder.class.php b/htdocs/core/modules/modModuleBuilder.class.php
index 99c32e48bbd..2d6cafa9c2e 100644
--- a/htdocs/core/modules/modModuleBuilder.class.php
+++ b/htdocs/core/modules/modModuleBuilder.class.php
@@ -102,16 +102,18 @@ class modModuleBuilder extends DolibarrModules
//------------------
$this->menu = array();
- $this->menu[$r] = array('fk_menu'=>'fk_mainmenu=home,fk_leftmenu=admintools',
+ $this->menu[$r] = array('fk_menu'=>'fk_mainmenu=tools',
'type'=>'left',
'titre'=>'ModuleBuilder',
- 'mainmenu'=>'home',
- 'leftmenu'=>'admintools_modulebuilder',
- 'url'=>'/modulebuilder/index.php?mainmenu=home&leftmenu=admintools',
+ 'prefix' => img_picto('', $this->picto, 'class="paddingright pictofixedwidth"'),
+ 'mainmenu'=>'tools',
+ 'leftmenu'=>'devtools_modulebuilder',
+ 'url'=>'/modulebuilder/index.php?mainmenu=tools&leftmenu=devtools',
'langs'=>'modulebuilder',
'position'=>100,
- 'perms'=>'1',
- 'enabled'=>'$conf->modulebuilder->enabled && preg_match(\'/^(admintools|all)/\',$leftmenu) && ($user->admin || $conf->global->MODULEBUILDER_FOREVERYONE)',
+ 'perms'=>'$user->hasRight("modulebuilder", "run")',
+ //'enabled'=>'isModEnabled("modulebuilder") && preg_match(\'/^(devtools|all)/\',$leftmenu)',
+ 'enabled'=>'isModEnabled("modulebuilder")',
'target'=>'_modulebuilder',
'user'=>0);
}
diff --git a/htdocs/core/modules/modMrp.class.php b/htdocs/core/modules/modMrp.class.php
index f93ce224662..fb836c8393b 100644
--- a/htdocs/core/modules/modMrp.class.php
+++ b/htdocs/core/modules/modMrp.class.php
@@ -168,7 +168,7 @@ class modMrp extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
diff --git a/htdocs/core/modules/modMultiCurrency.class.php b/htdocs/core/modules/modMultiCurrency.class.php
index 54297d5e77c..f08c9a4b021 100644
--- a/htdocs/core/modules/modMultiCurrency.class.php
+++ b/htdocs/core/modules/modMultiCurrency.class.php
@@ -113,7 +113,7 @@ class modMultiCurrency extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
diff --git a/htdocs/core/modules/modPartnership.class.php b/htdocs/core/modules/modPartnership.class.php
index ccd67542830..8e8421540c7 100644
--- a/htdocs/core/modules/modPartnership.class.php
+++ b/htdocs/core/modules/modPartnership.class.php
@@ -199,7 +199,7 @@ class modPartnership extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
diff --git a/htdocs/core/modules/modProduct.class.php b/htdocs/core/modules/modProduct.class.php
index b190ecde121..940c4fb2f9a 100644
--- a/htdocs/core/modules/modProduct.class.php
+++ b/htdocs/core/modules/modProduct.class.php
@@ -211,7 +211,7 @@ class modProduct extends DolibarrModules
if (is_object($mysoc) && $usenpr) {
$this->export_fields_array[$r]['p.recuperableonly'] = 'NPR';
}
- if ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice") || !empty($conf->margin->enabled)) {
+ if ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice") || isModEnabled('margin')) {
$this->export_fields_array[$r] = array_merge($this->export_fields_array[$r], array('p.cost_price'=>'CostPrice'));
}
if (isModEnabled('stock')) {
@@ -625,7 +625,7 @@ class modProduct extends DolibarrModules
));
}
- if ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice") || !empty($conf->margin->enabled)) {
+ if ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice") || isModEnabled('margin')) {
$this->import_fields_array[$r] = array_merge($this->import_fields_array[$r], array('p.cost_price'=>'CostPrice'));
}
if (is_object($mysoc) && $usenpr) {
@@ -658,16 +658,7 @@ class modProduct extends DolibarrModules
}
// End add extra fields
$this->import_fieldshidden_array[$r] = array('extra.fk_object'=>'lastrowid-'.MAIN_DB_PREFIX.'product'); // aliastable.field => ('user->id' or 'lastrowid-'.tableparent)
- $this->import_regex_array[$r] = array(
- 'p.ref'=>'[^ ]',
- 'p.price_base_type' => 'HT|TTC',
- 'p.tosell'=>'^[0|1]$',
- 'p.tobuy'=>'^[0|1]$',
- 'p.fk_product_type'=>'^[0|1]$',
- 'p.datec'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$',
- 'p.recuperableonly' => '^[0|1]$',
- 'p.finished' => '^[0|1]$'
- );
+
// field order as per structure of table llx_product
$import_sample = array(
'p.ref' => "ref:PREF123456",
@@ -718,7 +709,7 @@ class modProduct extends DolibarrModules
'p.desiredstock' => ''
));
}
- if ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice") || !empty($conf->margin->enabled)) {
+ if ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice") || isModEnabled('margin')) {
$import_sample = array_merge($import_sample, array('p.cost_price'=>'90'));
}
if (is_object($mysoc) && $usenpr) {
diff --git a/htdocs/core/modules/modRecruitment.class.php b/htdocs/core/modules/modRecruitment.class.php
index f1fe6f2072c..8b2db1a115a 100644
--- a/htdocs/core/modules/modRecruitment.class.php
+++ b/htdocs/core/modules/modRecruitment.class.php
@@ -177,7 +177,7 @@ class modRecruitment extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
diff --git a/htdocs/core/modules/modResource.class.php b/htdocs/core/modules/modResource.class.php
index ab73c8828b4..59dc7878161 100644
--- a/htdocs/core/modules/modResource.class.php
+++ b/htdocs/core/modules/modResource.class.php
@@ -120,7 +120,7 @@ class modResource extends DolibarrModules
// 'order_supplier' to add a tab in supplier order view
// 'invoice_supplier' to add a tab in supplier invoice view
// 'invoice' to add a tab in customer invoice view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'product' to add a tab in product view
// 'stock' to add a tab in stock view
// 'propal' to add a tab in propal view
diff --git a/htdocs/core/modules/modService.class.php b/htdocs/core/modules/modService.class.php
index c7772eab608..868303c231b 100644
--- a/htdocs/core/modules/modService.class.php
+++ b/htdocs/core/modules/modService.class.php
@@ -176,7 +176,7 @@ class modService extends DolibarrModules
if (is_object($mysoc) && $usenpr) {
$this->export_fields_array[$r]['p.recuperableonly'] = 'NPR';
}
- if ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice") || !empty($conf->margin->enabled)) {
+ if ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice") || isModEnabled('margin')) {
$this->export_fields_array[$r] = array_merge($this->export_fields_array[$r], array('p.cost_price'=>'CostPrice'));
}
if (isModEnabled('stock')) {
@@ -572,7 +572,7 @@ class modService extends DolibarrModules
));
}
- if ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice") || !empty($conf->margin->enabled)) {
+ if ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice") || isModEnabled('margin')) {
$this->import_fields_array[$r] = array_merge($this->import_fields_array[$r], array('p.cost_price'=>'CostPrice'));
}
if (is_object($mysoc) && $usenpr) {
@@ -663,7 +663,7 @@ class modService extends DolibarrModules
'p.desiredstock' => ''
));
}
- if ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice") || !empty($conf->margin->enabled)) {
+ if ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice") || isModEnabled('margin')) {
$import_sample = array_merge($import_sample, array('p.cost_price'=>'90'));
}
if (is_object($mysoc) && $usenpr) {
diff --git a/htdocs/core/modules/modStockTransfer.class.php b/htdocs/core/modules/modStockTransfer.class.php
index a90b28be5aa..6c8f068adf6 100644
--- a/htdocs/core/modules/modStockTransfer.class.php
+++ b/htdocs/core/modules/modStockTransfer.class.php
@@ -51,7 +51,7 @@ class modStockTransfer extends DolibarrModules
$this->rights_class = 'stocktransfer';
// Family can be 'base' (core modules),'crm','financial','hr','projects','products','ecm','technic' (transverse modules),'interface' (link with external tools),'other','...'
// It is used to group modules by family in module setup page
- $this->family = "other";
+ $this->family = "products";
// Module position in the family on 2 digits ('01', '10', '20', ...)
$this->module_position = '90';
// Gives the possibility for the module, to provide his own family info and position of this family (Overwrite $this->family and $this->module_position. Avoid this)
@@ -125,7 +125,6 @@ class modStockTransfer extends DolibarrModules
$this->conflictwith = array(); // List of module class names as string this module is in conflict with. Example: array('modModuleToDisable1', ...)
$this->langfiles = array("stocktransfer@stocktransfer");
$this->phpmin = array(7, 0); // Minimum version of PHP required by module
- $this->need_dolibarr_version = array(11, -3); // Minimum version of Dolibarr required by module
$this->warnings_activation = array(); // Warning to show when we activate module. array('always'='text') or array('FR'='textfr','ES'='textes'...)
$this->warnings_activation_ext = array(); // Warning to show when we activate an external module. array('always'='text') or array('FR'='textfr','ES'='textes'...)
//$this->automatic_activation = array('FR'=>'StockTransferWasAutomaticallyActivatedBecauseOfYourCountryChoice');
@@ -138,12 +137,6 @@ class modStockTransfer extends DolibarrModules
// );
$this->const = array();
- // Some keys to add into the overwriting translation tables
- /*$this->overwrite_translation = array(
- 'en_US:ParentCompany'=>'Parent company or reseller',
- 'fr_FR:ParentCompany'=>'Maison mère ou revendeur'
- )*/
-
if (!isset($conf->stocktransfer) || !isset($conf->stocktransfer->enabled)) {
$conf->stocktransfer = new stdClass();
$conf->stocktransfer->enabled = 0;
@@ -166,7 +159,7 @@ class modStockTransfer extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
@@ -435,15 +428,6 @@ class modStockTransfer extends DolibarrModules
$result = $this->_load_tables('/install/mysql/tables/', 'stocktransfer');
if ($result < 0) return -1; // Do not activate module if error 'not allowed' returned when loading module SQL queries (the _load_table run sql with run_sql with the error allowed parameter set to 'default')
- // Create extrafields during init
- //include_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
- //$extrafields = new ExtraFields($this->db);
- //$result1=$extrafields->addExtraField('stocktransfer_myattr1', "New Attr 1 label", 'boolean', 1, 3, 'thirdparty', 0, 0, '', '', 1, '', 0, 0, '', '', 'stocktransfer@stocktransfer', '$conf->stocktransfer->enabled');
- //$result2=$extrafields->addExtraField('stocktransfer_myattr2', "New Attr 2 label", 'varchar', 1, 10, 'project', 0, 0, '', '', 1, '', 0, 0, '', '', 'stocktransfer@stocktransfer', '$conf->stocktransfer->enabled');
- //$result3=$extrafields->addExtraField('stocktransfer_myattr3', "New Attr 3 label", 'varchar', 1, 10, 'bank_account', 0, 0, '', '', 1, '', 0, 0, '', '', 'stocktransfer@stocktransfer', '$conf->stocktransfer->enabled');
- //$result4=$extrafields->addExtraField('stocktransfer_myattr4', "New Attr 4 label", 'select', 1, 3, 'thirdparty', 0, 1, '', array('options'=>array('code1'=>'Val1','code2'=>'Val2','code3'=>'Val3')), 1,'', 0, 0, '', '', 'stocktransfer@stocktransfer', '$conf->stocktransfer->enabled');
- //$result5=$extrafields->addExtraField('stocktransfer_myattr5', "New Attr 5 label", 'text', 1, 10, 'user', 0, 0, '', '', 1, '', 0, 0, '', '', 'stocktransfer@stocktransfer', '$conf->stocktransfer->enabled');
-
// Permissions
$this->remove($options);
diff --git a/htdocs/core/modules/modTakePos.class.php b/htdocs/core/modules/modTakePos.class.php
index 8096629c9a4..b06bf0fe8b0 100644
--- a/htdocs/core/modules/modTakePos.class.php
+++ b/htdocs/core/modules/modTakePos.class.php
@@ -142,7 +142,7 @@ class modTakePos extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
diff --git a/htdocs/core/modules/modWebhook.class.php b/htdocs/core/modules/modWebhook.class.php
index b1aaea23929..f29131cae89 100644
--- a/htdocs/core/modules/modWebhook.class.php
+++ b/htdocs/core/modules/modWebhook.class.php
@@ -1,5 +1,5 @@
+/* Copyright (C) 2004-2022 Laurent Destailleur
* Copyright (C) 2018-2019 Nicolas ZABOURI
* Copyright (C) 2019-2020 Frédéric France
*
@@ -67,7 +67,7 @@ class modWebhook extends DolibarrModules
$this->descriptionlong = "WebhookDescription";
// Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated' or a version string like 'x.y.z'
- $this->version = 'development';
+ $this->version = 'experimental';
// Url to the file with your last numberversion of this module
//$this->url_last_version = 'http://www.example.com/versionmodule.txt';
@@ -183,7 +183,7 @@ class modWebhook extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
diff --git a/htdocs/core/modules/modWebsite.class.php b/htdocs/core/modules/modWebsite.class.php
index bf229791ff3..6c87d1d799e 100644
--- a/htdocs/core/modules/modWebsite.class.php
+++ b/htdocs/core/modules/modWebsite.class.php
@@ -203,6 +203,7 @@ class modWebsite extends DolibarrModules
dol_mkdir($destroot);
+ // Copy templates in zip format (old)
$docs = dol_dir_list($srcroot, 'files', 0, 'website_.*(\.zip|\.jpg)$');
foreach ($docs as $cursorfile) {
$src = $srcroot.'/'.$cursorfile['name'];
@@ -217,6 +218,24 @@ class modWebsite extends DolibarrModules
}
}
+ // Copy templates in dir format (recommended)
+ $docs = dol_dir_list($srcroot, 'directories', 0, 'website_.*$');
+
+ foreach ($docs as $cursorfile) {
+ $src = $srcroot.'/'.$cursorfile['name'];
+ $dest = $destroot.'/'.$cursorfile['name'];
+
+ // Compress it
+ global $errormsg;
+ $errormsg = '';
+ $result = dol_compress_dir($src, $dest.'.zip', 'zip');
+ if ($result < 0) {
+ $error++;
+ $this->error = ($errormsg ? $errormsg : $langs->trans('ErrorFailToCreateZip', $dest));
+ $this->errors[] = ($errormsg ? $errormsg : $langs->trans('ErrorFailToCreateZip', $dest));
+ }
+ }
+
if ($error) {
return 0;
}
diff --git a/htdocs/core/modules/modWorkflow.class.php b/htdocs/core/modules/modWorkflow.class.php
index cc7e478e379..58da4876d32 100644
--- a/htdocs/core/modules/modWorkflow.class.php
+++ b/htdocs/core/modules/modWorkflow.class.php
@@ -93,7 +93,6 @@ class modWorkflow extends DolibarrModules
6=>array('WORKFLOW_ORDER_CLASSIFY_RECEIVED_RECEPTION', 'chaine', '1', 'WORKFLOW_ORDER_CLASSIFY_RECEIVED_RECEPTION', 0, 'current', 0),
7=>array('WORKFLOW_ORDER_CLASSIFY_RECEIVED_RECEPTION_CLOSED', 'chaine', '1', 'WORKFLOW_ORDER_CLASSIFY_RECEIVED_RECEPTION_CLOSED', 0, 'current', 0),
8=>array('WORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_SUPPLIER_ORDER', 'chaine', '1', 'WORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_SUPPLIER_ORDER', 0, 'current', 0),
- 9=>array('WORKFLOW_BILL_ON_RECEPTION', 'chaine', '1', 'WORKFLOW_BILL_ON_RECEPTION', 0, 'current', 0),
10=>array('WORKFLOW_TICKET_LINK_CONTRACT', 'chaine', '0', 'Automatically link a ticket to available contracts', 0, 'current', 0),
11=>array('WORKFLOW_TICKET_USE_PARENT_COMPANY_CONTRACTS', 'chaine', '0', 'Search among parent companies contracts when automatically linking a ticket to available contracts', 0, 'current', 0),
11=>array('WORKFLOW_TICKET_CREATE_INTERVENTION', 'chaine', '1', 'WORKFLOW_TICKET_CREATE_INTERVENTION', 0, 'current', 0)
diff --git a/htdocs/core/modules/modWorkstation.class.php b/htdocs/core/modules/modWorkstation.class.php
index 51094439df0..a8be0f23226 100644
--- a/htdocs/core/modules/modWorkstation.class.php
+++ b/htdocs/core/modules/modWorkstation.class.php
@@ -166,7 +166,7 @@ class modWorkstation extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
diff --git a/htdocs/core/modules/modZapier.class.php b/htdocs/core/modules/modZapier.class.php
index 6d05aa7b283..b14419e0982 100644
--- a/htdocs/core/modules/modZapier.class.php
+++ b/htdocs/core/modules/modZapier.class.php
@@ -172,7 +172,7 @@ class modZapier extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sales order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
diff --git a/htdocs/core/modules/movement/doc/pdf_standard.modules.php b/htdocs/core/modules/movement/doc/pdf_standard.modules.php
index 596a29c1e2d..064bdfbf3b7 100644
--- a/htdocs/core/modules/movement/doc/pdf_standard.modules.php
+++ b/htdocs/core/modules/movement/doc/pdf_standard.modules.php
@@ -447,7 +447,7 @@ class pdf_standard extends ModelePDFMovement
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Stock")." ".$outputlangs->convToOutputCharset($object->label));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -466,7 +466,7 @@ class pdf_standard extends ModelePDFMovement
$pdf->SetTextColor(0, 0, 0);
$tab_top = 42;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 : 10);
$tab_height = $this->page_hauteur - $tab_top - $heightforfooter - $heightforfreetext;
@@ -537,7 +537,7 @@ class pdf_standard extends ModelePDFMovement
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -672,7 +672,7 @@ class pdf_standard extends ModelePDFMovement
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
if (!empty($tplidx)) {
@@ -692,7 +692,7 @@ class pdf_standard extends ModelePDFMovement
$pdf->useTemplate($tplidx);
}
$pagenb++;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
}
@@ -1160,8 +1160,7 @@ class pdf_standard extends ModelePDFMovement
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'PRODUCT_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext);
}
}
diff --git a/htdocs/core/modules/mrp/doc/doc_generic_mo_odt.modules.php b/htdocs/core/modules/mrp/doc/doc_generic_mo_odt.modules.php
index 42b3c529fe4..b89c4eab2cd 100644
--- a/htdocs/core/modules/mrp/doc/doc_generic_mo_odt.modules.php
+++ b/htdocs/core/modules/mrp/doc/doc_generic_mo_odt.modules.php
@@ -175,7 +175,9 @@ class doc_generic_mo_odt extends ModelePDFMo
$texte .= '';
}
diff --git a/htdocs/core/modules/mrp/doc/pdf_vinci.modules.php b/htdocs/core/modules/mrp/doc/pdf_vinci.modules.php
index 20fd7b0472b..c5dc9dd8b19 100644
--- a/htdocs/core/modules/mrp/doc/pdf_vinci.modules.php
+++ b/htdocs/core/modules/mrp/doc/pdf_vinci.modules.php
@@ -286,7 +286,7 @@ class pdf_vinci extends ModelePDFMo
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Mo")." ".$outputlangs->convToOutputCharset($object->thirdparty->name));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -306,7 +306,7 @@ class pdf_vinci extends ModelePDFMo
$pdf->SetTextColor(0, 0, 0);
$tab_top = 90 + $top_shift;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 + $top_shift : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 + $top_shift : 10);
$tab_height = $this->page_hauteur - $tab_top - $heightforfooter - $heightforfreetext;
@@ -350,7 +350,7 @@ class pdf_vinci extends ModelePDFMo
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
// $this->_pagefoot($pdf,$object,$outputlangs,1);
@@ -408,7 +408,7 @@ class pdf_vinci extends ModelePDFMo
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$height_note = $posyafter - $tab_top_newpage;
@@ -430,7 +430,7 @@ class pdf_vinci extends ModelePDFMo
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
@@ -486,7 +486,7 @@ class pdf_vinci extends ModelePDFMo
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposbefore + 1);
@@ -532,7 +532,7 @@ class pdf_vinci extends ModelePDFMo
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- //if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs);
+ //if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
$pdf->setPage($pageposafter + 1);
} else {
// We found a page break
@@ -584,7 +584,7 @@ class pdf_vinci extends ModelePDFMo
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- //if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs);
+ //if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
$pdf->setPage($pageposafter + 1);
} else {
// We found a page break
@@ -1353,8 +1353,7 @@ class pdf_vinci extends ModelePDFMo
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'SUPPLIER_ORDER_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext);
}
diff --git a/htdocs/core/modules/printsheet/doc/pdf_standardlabel.class.php b/htdocs/core/modules/printsheet/doc/pdf_standardlabel.class.php
index c1b93be6653..0e9eefa1e45 100644
--- a/htdocs/core/modules/printsheet/doc/pdf_standardlabel.class.php
+++ b/htdocs/core/modules/printsheet/doc/pdf_standardlabel.class.php
@@ -294,7 +294,7 @@ class pdf_standardlabel extends CommonStickerGenerator
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($keywords);
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
diff --git a/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php b/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php
index 907b18daef3..0d380ce1537 100644
--- a/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php
+++ b/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php
@@ -317,7 +317,7 @@ class pdf_tcpdflabel extends CommonStickerGenerator
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($keywords);
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
diff --git a/htdocs/core/modules/product/doc/doc_generic_product_odt.modules.php b/htdocs/core/modules/product/doc/doc_generic_product_odt.modules.php
index 94d511367e2..821b6a24e10 100644
--- a/htdocs/core/modules/product/doc/doc_generic_product_odt.modules.php
+++ b/htdocs/core/modules/product/doc/doc_generic_product_odt.modules.php
@@ -334,7 +334,7 @@ class doc_generic_product_odt extends ModelePDFProduct
'__FROM_EMAIL__' => $this->emetteur->email,
'__TOTAL_TTC__' => $object->total_ttc,
'__TOTAL_HT__' => $object->total_ht,
- '__TOTAL_VAT__' => $object->total_vat
+ '__TOTAL_VAT__' => $object->total_tva
);
complete_substitutions_array($substitutionarray, $langs, $object);
// Call the ODTSubstitution hook
diff --git a/htdocs/core/modules/product/doc/pdf_standard.modules.php b/htdocs/core/modules/product/doc/pdf_standard.modules.php
index df1122a5748..89df34f8f73 100644
--- a/htdocs/core/modules/product/doc/pdf_standard.modules.php
+++ b/htdocs/core/modules/product/doc/pdf_standard.modules.php
@@ -213,7 +213,7 @@ class pdf_standard extends ModelePDFProduct
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Order")." ".$outputlangs->convToOutputCharset($object->thirdparty->name));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -233,7 +233,7 @@ class pdf_standard extends ModelePDFProduct
$tab_top = 42;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 : 10);
$tab_height = $this->page_hauteur - $tab_top - $heightforfooter - $heightforfreetext;
@@ -352,7 +352,7 @@ class pdf_standard extends ModelePDFProduct
{
$pdf->AddPage('','',true);
if (!empty($tplidx)) $pdf->useTemplate($tplidx);
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs);
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
$pdf->setPage($pageposafter+1);
}
}
@@ -484,7 +484,7 @@ class pdf_standard extends ModelePDFProduct
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs);
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
}
if (isset($object->lines[$i+1]->pagebreak) && $object->lines[$i+1]->pagebreak)
{
@@ -501,7 +501,7 @@ class pdf_standard extends ModelePDFProduct
$pdf->AddPage();
if (!empty($tplidx)) $pdf->useTemplate($tplidx);
$pagenb++;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs);
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
}
}
@@ -816,8 +816,7 @@ class pdf_standard extends ModelePDFProduct
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'PRODUCT_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext);
}
}
diff --git a/htdocs/core/modules/project/doc/doc_generic_project_odt.modules.php b/htdocs/core/modules/project/doc/doc_generic_project_odt.modules.php
index 0bfdbb0988d..2015da21f61 100644
--- a/htdocs/core/modules/project/doc/doc_generic_project_odt.modules.php
+++ b/htdocs/core/modules/project/doc/doc_generic_project_odt.modules.php
@@ -67,7 +67,9 @@ if (isModEnabled('deplacement')) {
if (isModEnabled('agenda')) {
require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
}
-
+if (isModEnabled('expedition')) {
+ require_once DOL_DOCUMENT_ROOT.'/expedition/class/expedition.class.php';
+}
/**
* Class to build documents using ODF templates generator
@@ -132,8 +134,8 @@ class doc_generic_project_odt extends ModelePDFProjects
// Get source company
$this->emetteur = $mysoc;
- if (!$this->emetteur->pays_code) {
- $this->emetteur->pays_code = substr($langs->defaultlang, -2); // Par defaut, si n'etait pas defini
+ if (!$this->emetteur->country_code) {
+ $this->emetteur->country_code = substr($langs->defaultlang, -2); // Par defaut, si n'etait pas defini
}
}
@@ -466,7 +468,9 @@ class doc_generic_project_odt extends ModelePDFProjects
$texte .= '';
}
@@ -941,7 +945,7 @@ class doc_generic_project_odt extends ModelePDFProjects
'title' => "ListProposalsAssociatedProject",
'class' => 'Propal',
'table' => 'propal',
- 'test' => $conf->propal->enabled && $user->rights->propale->lire
+ 'test' => $conf->propal->enabled && $user->rights->propal->lire
),
'order' => array(
'title' => "ListOrdersAssociatedProject",
diff --git a/htdocs/core/modules/project/doc/pdf_baleine.modules.php b/htdocs/core/modules/project/doc/pdf_baleine.modules.php
index 876249ba228..b5c3c6d215b 100644
--- a/htdocs/core/modules/project/doc/pdf_baleine.modules.php
+++ b/htdocs/core/modules/project/doc/pdf_baleine.modules.php
@@ -266,7 +266,7 @@ class pdf_baleine extends ModelePDFProjects
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Project"));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -284,7 +284,7 @@ class pdf_baleine extends ModelePDFProjects
$pdf->SetTextColor(0, 0, 0);
$tab_top = 50;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 : 10);
$tab_height = $this->page_hauteur - $tab_top - $heightforfooter - $heightforfreetext;
@@ -360,7 +360,7 @@ class pdf_baleine extends ModelePDFProjects
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -385,7 +385,7 @@ class pdf_baleine extends ModelePDFProjects
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -467,7 +467,7 @@ class pdf_baleine extends ModelePDFProjects
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
if (!empty($tplidx)) {
@@ -487,7 +487,7 @@ class pdf_baleine extends ModelePDFProjects
$pdf->useTemplate($tplidx);
}
$pagenb++;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
}
@@ -695,8 +695,7 @@ class pdf_baleine extends ModelePDFProjects
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'PROJECT_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext);
}
}
diff --git a/htdocs/core/modules/project/doc/pdf_beluga.modules.php b/htdocs/core/modules/project/doc/pdf_beluga.modules.php
index c3e673abf25..9947bb49b0b 100644
--- a/htdocs/core/modules/project/doc/pdf_beluga.modules.php
+++ b/htdocs/core/modules/project/doc/pdf_beluga.modules.php
@@ -315,7 +315,7 @@ class pdf_beluga extends ModelePDFProjects
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Project"));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -333,7 +333,7 @@ class pdf_beluga extends ModelePDFProjects
$pdf->SetTextColor(0, 0, 0);
$tab_top = 50;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 : 10);
$tab_height = $this->page_hauteur - $tab_top - $heightforfooter - $heightforfreetext;
@@ -374,7 +374,7 @@ class pdf_beluga extends ModelePDFProjects
'class'=>'Propal',
'table'=>'propal',
'datefieldname'=>'datep',
- 'test'=>$conf->propal->enabled && $user->rights->propale->lire,
+ 'test'=>$conf->propal->enabled && $user->rights->propal->lire,
'lang'=>'propal'),
'order'=>array(
'name'=>"CustomersOrders",
@@ -587,7 +587,7 @@ class pdf_beluga extends ModelePDFProjects
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -612,7 +612,7 @@ class pdf_beluga extends ModelePDFProjects
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -740,7 +740,7 @@ class pdf_beluga extends ModelePDFProjects
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation($this->orientation, 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
if (!empty($tplidx)) {
@@ -895,8 +895,7 @@ class pdf_beluga extends ModelePDFProjects
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'PROJECT_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext);
}
}
diff --git a/htdocs/core/modules/project/doc/pdf_timespent.modules.php b/htdocs/core/modules/project/doc/pdf_timespent.modules.php
index 02f728b5208..7af10dd170d 100644
--- a/htdocs/core/modules/project/doc/pdf_timespent.modules.php
+++ b/htdocs/core/modules/project/doc/pdf_timespent.modules.php
@@ -266,7 +266,7 @@ class pdf_timespent extends ModelePDFProjects
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Project"));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -284,7 +284,7 @@ class pdf_timespent extends ModelePDFProjects
$pdf->SetTextColor(0, 0, 0);
$tab_top = 50;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 : 10);
$tab_height = $this->page_hauteur - $tab_top - $heightforfooter - $heightforfreetext;
@@ -364,7 +364,7 @@ class pdf_timespent extends ModelePDFProjects
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -389,7 +389,7 @@ class pdf_timespent extends ModelePDFProjects
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -470,7 +470,7 @@ class pdf_timespent extends ModelePDFProjects
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
if (!empty($tplidx)) {
@@ -490,7 +490,7 @@ class pdf_timespent extends ModelePDFProjects
$pdf->useTemplate($tplidx);
}
$pagenb++;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
}
@@ -691,8 +691,7 @@ class pdf_timespent extends ModelePDFProjects
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'PROJECT_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext);
}
}
diff --git a/htdocs/core/modules/project/mod_project_universal.php b/htdocs/core/modules/project/mod_project_universal.php
index 47fd83842ed..1020c42ebf6 100644
--- a/htdocs/core/modules/project/mod_project_universal.php
+++ b/htdocs/core/modules/project/mod_project_universal.php
@@ -30,6 +30,11 @@ require_once DOL_DOCUMENT_ROOT.'/core/modules/project/modules_project.php';
*/
class mod_project_universal extends ModeleNumRefProjects
{
+ /**
+ * @var DoliDB $db
+ */
+ public $db;
+
/**
* Dolibarr version of the loaded document
* @var string
diff --git a/htdocs/core/modules/project/modules_project.php b/htdocs/core/modules/project/modules_project.php
index dc3f19d72fd..894df4bf8f3 100644
--- a/htdocs/core/modules/project/modules_project.php
+++ b/htdocs/core/modules/project/modules_project.php
@@ -127,6 +127,11 @@ abstract class ModeleNumRefProjects
*/
public $error = '';
+ /**
+ * @var string $version
+ */
+ public $version;
+
/**
* Return if a module can be used or not
*
diff --git a/htdocs/core/modules/project/task/doc/doc_generic_task_odt.modules.php b/htdocs/core/modules/project/task/doc/doc_generic_task_odt.modules.php
index ba386eedfe7..a7f3eab4a30 100644
--- a/htdocs/core/modules/project/task/doc/doc_generic_task_odt.modules.php
+++ b/htdocs/core/modules/project/task/doc/doc_generic_task_odt.modules.php
@@ -433,7 +433,9 @@ class doc_generic_task_odt extends ModelePDFTask
$texte .= '';
}
diff --git a/htdocs/core/modules/propale/doc/pdf_azur.modules.php b/htdocs/core/modules/propale/doc/pdf_azur.modules.php
index 026bc1ba57e..facb364cd23 100644
--- a/htdocs/core/modules/propale/doc/pdf_azur.modules.php
+++ b/htdocs/core/modules/propale/doc/pdf_azur.modules.php
@@ -243,8 +243,8 @@ class pdf_azur extends ModelePDFPropales
}
// Show Draft Watermark
- if ($object->statut == $object::STATUS_DRAFT && (!empty($conf->global->PROPALE_DRAFT_WATERMARK))) {
- $this->watermark = $conf->global->PROPALE_DRAFT_WATERMARK;
+ if ($object->statut == $object::STATUS_DRAFT && getDolGlobalString('PROPALE_DRAFT_WATERMARK')) {
+ $this->watermark = getDolGlobalString('PROPALE_DRAFT_WATERMARK');
}
$nblines = count($object->lines);
@@ -262,7 +262,7 @@ class pdf_azur extends ModelePDFPropales
$objphoto->fetch($object->lines[$i]->fk_product);
//var_dump($objphoto->ref);exit;
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
$pdir[0] = get_exdir($objphoto->id, 2, 0, 0, $objphoto, 'product').$objphoto->id."/photos/";
$pdir[1] = get_exdir(0, 0, 0, 0, $objphoto, 'product').dol_sanitizeFileName($objphoto->ref).'/';
} else {
@@ -373,7 +373,7 @@ class pdf_azur extends ModelePDFPropales
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("PdfCommercialProposalTitle")." ".$outputlangs->convToOutputCharset($object->thirdparty->name));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -419,11 +419,11 @@ class pdf_azur extends ModelePDFPropales
$tab_top = 90 + $top_shift;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 + $top_shift : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 + $top_shift : 10);
// Incoterm
$height_incoterms = 0;
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
$desc_incoterms = $object->getIncotermsForPDF();
if ($desc_incoterms) {
$tab_top -= 2;
@@ -522,7 +522,7 @@ class pdf_azur extends ModelePDFPropales
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposbefore + 1);
@@ -566,7 +566,7 @@ class pdf_azur extends ModelePDFPropales
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -723,7 +723,7 @@ class pdf_azur extends ModelePDFPropales
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
if (!empty($tplidx)) {
@@ -743,7 +743,7 @@ class pdf_azur extends ModelePDFPropales
$pdf->useTemplate($tplidx);
}
$pagenb++;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
}
@@ -814,7 +814,7 @@ class pdf_azur extends ModelePDFPropales
if (count($filetomerge->lines) > 0) {
foreach ($filetomerge->lines as $linefile) {
if (!empty($linefile->id) && !empty($linefile->file_name)) {
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
if (isModEnabled("product")) {
$filetomerge_dir = $conf->product->multidir_output[$entity_product_file].'/'.get_exdir($product->id, 2, 0, 0, $product, 'product').$product->id."/photos";
} elseif (isModEnabled("service")) {
@@ -961,8 +961,33 @@ class pdf_azur extends ModelePDFPropales
$posy = $pdf->GetY() + 1;
}
+ // Show delivery mode
+ if (empty($conf->global->PROPOSAL_PDF_HIDE_DELIVERYMODE) && $object->shipping_method_id > 0) {
+ $outputlangs->load("sendings");
+
+ $shipping_method_id = $object->shipping_method_id;
+ if (!empty($conf->global->SOCIETE_ASK_FOR_SHIPPING_METHOD) && !empty($this->emetteur->shipping_method_id)) {
+ $shipping_method_id = $this->emetteur->shipping_method_id;
+ }
+ $shipping_method_code = dol_getIdFromCode($this->db, $shipping_method_id, 'c_shipment_mode', 'rowid', 'code');
+ $shipping_method_label = dol_getIdFromCode($this->db, $shipping_method_id, 'c_shipment_mode', 'rowid', 'libelle');
+
+ $pdf->SetFont('', 'B', $default_font_size - 2);
+ $pdf->SetXY($this->marge_gauche, $posy);
+ $titre = $outputlangs->transnoentities("SendingMethod").':';
+ $pdf->MultiCell(43, 4, $titre, 0, 'L');
+
+ $pdf->SetFont('', '', $default_font_size - 2);
+ $pdf->SetXY($posxval, $posy);
+ $lib_condition_paiement = ($outputlangs->transnoentities("SendingMethod".strtoupper($shipping_method_code)) != "SendingMethod".strtoupper($shipping_method_code)) ? $outputlangs->trans("SendingMethod".strtoupper($shipping_method_code)) : $shipping_method_label;
+ $lib_condition_paiement = str_replace('\n', "\n", $lib_condition_paiement);
+ $pdf->MultiCell(67, 4, $lib_condition_paiement, 0, 'L');
+
+ $posy = $pdf->GetY() + 1;
+ }
+
// Show payments conditions
- if (empty($conf->global->PROPOSAL_PDF_HIDE_PAYMENTTERM) && ($object->cond_reglement_code || $object->cond_reglement)) {
+ if (empty($conf->global->PROPOSAL_PDF_HIDE_PAYMENTTERM) && $object->cond_reglement_code) {
$pdf->SetFont('', 'B', $default_font_size - 2);
$pdf->SetXY($this->marge_gauche, $posy);
$titre = $outputlangs->transnoentities("PaymentConditions").':';
@@ -981,22 +1006,6 @@ class pdf_azur extends ModelePDFPropales
}
if (empty($conf->global->PROPOSAL_PDF_HIDE_PAYMENTMODE)) {
- // Check a payment mode is defined
- /* Not required on a proposal
- if (empty($object->mode_reglement_code)
- && ! $conf->global->FACTURE_CHQ_NUMBER
- && ! $conf->global->FACTURE_RIB_NUMBER)
- {
- $pdf->SetXY($this->marge_gauche, $posy);
- $pdf->SetTextColor(200,0,0);
- $pdf->SetFont('','B', $default_font_size - 2);
- $pdf->MultiCell(90, 3, $outputlangs->transnoentities("ErrorNoPaiementModeConfigured"),0,'L',0);
- $pdf->SetTextColor(0,0,0);
-
- $posy=$pdf->GetY()+1;
- }
- */
-
// Show payment mode
if ($object->mode_reglement_code
&& $object->mode_reglement_code != 'CHQ'
@@ -1053,7 +1062,7 @@ class pdf_azur extends ModelePDFPropales
// If payment mode not forced or forced to VIR, show payment with BAN
if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'VIR') {
- if (!empty($object->fk_account) || !empty($object->fk_bank) || !empty($conf->global->FACTURE_RIB_NUMBER)) {
+ if (!empty($object->fk_account) || !empty($object->fk_bank) || getDolGlobalInt('FACTURE_RIB_NUMBER')) {
$bankid = (empty($object->fk_account) ? $conf->global->FACTURE_RIB_NUMBER : $object->fk_account);
if (!empty($object->fk_bank)) {
$bankid = $object->fk_bank; // For backward compatibility when object->fk_account is forced with object->fk_bank
@@ -1731,8 +1740,7 @@ class pdf_azur extends ModelePDFPropales
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'PROPOSAL_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext, $this->page_largeur, $this->watermark);
}
diff --git a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php
index d2aa3cf5390..f537ea2ef9d 100644
--- a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php
+++ b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php
@@ -217,8 +217,8 @@ class pdf_cyan extends ModelePDFPropales
$outputlangs->loadLangs(array("main", "dict", "companies", "bills", "products", "propal"));
// Show Draft Watermark
- if ($object->statut == $object::STATUS_DRAFT && (!empty($conf->global->PROPALE_DRAFT_WATERMARK))) {
- $this->watermark = $conf->global->PROPALE_DRAFT_WATERMARK;
+ if ($object->statut == $object::STATUS_DRAFT && getDolGlobalString('PROPALE_DRAFT_WATERMARK')) {
+ $this->watermark = getDolGlobalString('PROPALE_DRAFT_WATERMARK');
}
global $outputlangsbis;
@@ -249,7 +249,7 @@ class pdf_cyan extends ModelePDFPropales
$objphoto->fetch($object->lines[$i]->fk_product);
//var_dump($objphoto->ref);exit;
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
$pdir[0] = get_exdir($objphoto->id, 2, 0, 0, $objphoto, 'product').$objphoto->id."/photos/";
$pdir[1] = get_exdir(0, 0, 0, 0, $objphoto, 'product').dol_sanitizeFileName($objphoto->ref).'/';
} else {
@@ -360,7 +360,7 @@ class pdf_cyan extends ModelePDFPropales
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("PdfCommercialProposalTitle")." ".$outputlangs->convToOutputCharset($object->thirdparty->name));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -394,12 +394,12 @@ class pdf_cyan extends ModelePDFPropales
$tab_top = 90 + $top_shift;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 + $top_shift : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 + $top_shift : 10);
// Incoterm
$height_incoterms = 0;
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
$desc_incoterms = $object->getIncotermsForPDF();
if ($desc_incoterms) {
$tab_top -= 2;
@@ -481,7 +481,7 @@ class pdf_cyan extends ModelePDFPropales
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
// $this->_pagefoot($pdf,$object,$outputlangs,1);
@@ -539,7 +539,7 @@ class pdf_cyan extends ModelePDFPropales
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$height_note = $posyafter - $tab_top_newpage;
@@ -561,7 +561,7 @@ class pdf_cyan extends ModelePDFPropales
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
@@ -847,7 +847,7 @@ class pdf_cyan extends ModelePDFPropales
$pagenb++;
$pdf->setPage($pagenb);
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
if (!empty($tplidx)) {
@@ -868,7 +868,7 @@ class pdf_cyan extends ModelePDFPropales
$pdf->useTemplate($tplidx);
}
$pagenb++;
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
}
@@ -939,7 +939,7 @@ class pdf_cyan extends ModelePDFPropales
if (count($filetomerge->lines) > 0) {
foreach ($filetomerge->lines as $linefile) {
if (!empty($linefile->id) && !empty($linefile->file_name)) {
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
if (isModEnabled("product")) {
$filetomerge_dir = $conf->product->multidir_output[$entity_product_file].'/'.get_exdir($product->id, 2, 0, 0, $product, 'product').$product->id."/photos";
} elseif (isModEnabled("service")) {
@@ -1080,8 +1080,33 @@ class pdf_cyan extends ModelePDFPropales
$posy = $pdf->GetY() + 1;
}
+ // Show delivery mode
+ if (empty($conf->global->PROPOSAL_PDF_HIDE_DELIVERYMODE) && $object->shipping_method_id > 0) {
+ $outputlangs->load("sendings");
+
+ $shipping_method_id = $object->shipping_method_id;
+ if (!empty($conf->global->SOCIETE_ASK_FOR_SHIPPING_METHOD) && !empty($this->emetteur->shipping_method_id)) {
+ $shipping_method_id = $this->emetteur->shipping_method_id;
+ }
+ $shipping_method_code = dol_getIdFromCode($this->db, $shipping_method_id, 'c_shipment_mode', 'rowid', 'code');
+ $shipping_method_label = dol_getIdFromCode($this->db, $shipping_method_id, 'c_shipment_mode', 'rowid', 'libelle');
+
+ $pdf->SetFont('', 'B', $default_font_size - 2);
+ $pdf->SetXY($this->marge_gauche, $posy);
+ $titre = $outputlangs->transnoentities("SendingMethod").':';
+ $pdf->MultiCell(43, 4, $titre, 0, 'L');
+
+ $pdf->SetFont('', '', $default_font_size - 2);
+ $pdf->SetXY($posxval, $posy);
+ $lib_condition_paiement = ($outputlangs->transnoentities("SendingMethod".strtoupper($shipping_method_code)) != "SendingMethod".strtoupper($shipping_method_code)) ? $outputlangs->trans("SendingMethod".strtoupper($shipping_method_code)) : $shipping_method_label;
+ $lib_condition_paiement = str_replace('\n', "\n", $lib_condition_paiement);
+ $pdf->MultiCell(67, 4, $lib_condition_paiement, 0, 'L');
+
+ $posy = $pdf->GetY() + 1;
+ }
+
// Show payments conditions
- if (empty($conf->global->PROPOSAL_PDF_HIDE_PAYMENTTERM) && ($object->cond_reglement_code || $object->cond_reglement)) {
+ if (empty($conf->global->PROPOSAL_PDF_HIDE_PAYMENTTERM) && $object->cond_reglement_code) {
$pdf->SetFont('', 'B', $default_font_size - 2);
$pdf->SetXY($this->marge_gauche, $posy);
$titre = $outputlangs->transnoentities("PaymentConditions").':';
@@ -1100,22 +1125,6 @@ class pdf_cyan extends ModelePDFPropales
}
if (empty($conf->global->PROPOSAL_PDF_HIDE_PAYMENTMODE)) {
- // Check a payment mode is defined
- /* Not required on a proposal
- if (empty($object->mode_reglement_code)
- && ! $conf->global->FACTURE_CHQ_NUMBER
- && ! $conf->global->FACTURE_RIB_NUMBER)
- {
- $pdf->SetXY($this->marge_gauche, $posy);
- $pdf->SetTextColor(200,0,0);
- $pdf->SetFont('','B', $default_font_size - 2);
- $pdf->MultiCell(90, 3, $outputlangs->transnoentities("ErrorNoPaiementModeConfigured"),0,'L',0);
- $pdf->SetTextColor(0,0,0);
-
- $posy=$pdf->GetY()+1;
- }
- */
-
// Show payment mode
if ($object->mode_reglement_code
&& $object->mode_reglement_code != 'CHQ'
@@ -1172,7 +1181,7 @@ class pdf_cyan extends ModelePDFPropales
// If payment mode not forced or forced to VIR, show payment with BAN
if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'VIR') {
- if ($object->fk_account > 0 || $object->fk_bank > 0 || !empty($conf->global->FACTURE_RIB_NUMBER)) {
+ if ($object->fk_account > 0 || $object->fk_bank > 0 || getDolGlobalInt('FACTURE_RIB_NUMBER')) {
$bankid = ($object->fk_account <= 0 ? $conf->global->FACTURE_RIB_NUMBER : $object->fk_account);
if ($object->fk_bank > 0) {
$bankid = $object->fk_bank; // For backward compatibility when object->fk_account is forced with object->fk_bank
@@ -1819,8 +1828,7 @@ class pdf_cyan extends ModelePDFPropales
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'PROPOSAL_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext, $this->page_largeur, $this->watermark);
}
diff --git a/htdocs/core/modules/propale/mod_propale_marbre.php b/htdocs/core/modules/propale/mod_propale_marbre.php
index 28d66dfc40a..54dd0096b2e 100644
--- a/htdocs/core/modules/propale/mod_propale_marbre.php
+++ b/htdocs/core/modules/propale/mod_propale_marbre.php
@@ -27,7 +27,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/modules/propale/modules_propale.php';
/**
- * Class to manage customer order numbering rules Marbre
+ * Class to manage business proposition rules Marbre
*/
class mod_propale_marbre extends ModeleNumRefPropales
{
diff --git a/htdocs/core/modules/rapport/pdf_paiement.class.php b/htdocs/core/modules/rapport/pdf_paiement.class.php
index 8cb10e0a0f8..5440c8e1201 100644
--- a/htdocs/core/modules/rapport/pdf_paiement.class.php
+++ b/htdocs/core/modules/rapport/pdf_paiement.class.php
@@ -303,7 +303,7 @@ class pdf_paiement
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
//$pdf->SetKeyWords();
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
diff --git a/htdocs/core/modules/reception/doc/doc_generic_reception_odt.modules.php b/htdocs/core/modules/reception/doc/doc_generic_reception_odt.modules.php
index 4d8edca7f64..4ebc742b4bb 100644
--- a/htdocs/core/modules/reception/doc/doc_generic_reception_odt.modules.php
+++ b/htdocs/core/modules/reception/doc/doc_generic_reception_odt.modules.php
@@ -168,7 +168,9 @@ class doc_generic_reception_odt extends ModelePdfReception
$texte .= '';
}
diff --git a/htdocs/core/modules/reception/doc/pdf_squille.modules.php b/htdocs/core/modules/reception/doc/pdf_squille.modules.php
index fb0e59fcb3a..cc24bda817d 100644
--- a/htdocs/core/modules/reception/doc/pdf_squille.modules.php
+++ b/htdocs/core/modules/reception/doc/pdf_squille.modules.php
@@ -152,7 +152,7 @@ class pdf_squille extends ModelePdfReception
$objphoto = new Product($this->db);
$objphoto->fetch($object->lines[$i]->fk_product);
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
$pdir = get_exdir($object->lines[$i]->fk_product, 2, 0, 0, $objphoto, 'product').$object->lines[$i]->fk_product."/photos/";
$dir = $conf->product->dir_output.'/'.$pdir;
} else {
@@ -251,7 +251,7 @@ class pdf_squille extends ModelePdfReception
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Reception"));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
@@ -269,13 +269,13 @@ class pdf_squille extends ModelePdfReception
$pdf->SetTextColor(0, 0, 0);
$tab_top = 90;
- $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD) ? 42 : 10);
+ $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 : 10);
$tab_height = $this->page_hauteur - $tab_top - $heightforfooter - $heightforfreetext;
// Incoterm
$height_incoterms = 0;
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
$desc_incoterms = $object->getIncotermsForPDF();
if ($desc_incoterms) {
$tab_top -= 2;
@@ -381,7 +381,7 @@ class pdf_squille extends ModelePdfReception
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposbefore + 1);
@@ -439,7 +439,7 @@ class pdf_squille extends ModelePdfReception
if (!empty($tplidx)) {
$pdf->useTemplate($tplidx);
}
- if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
+ if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
$this->_pagehead($pdf, $object, 0, $outputlangs);
}
$pdf->setPage($pageposafter + 1);
@@ -1078,8 +1078,7 @@ class pdf_squille extends ModelePdfReception
*/
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{
- global $conf;
- $showdetails = empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 0 : $conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS;
+ $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'RECEPTION_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext, $this->page_largeur, $this->watermark);
}
}
diff --git a/htdocs/core/modules/societe/mod_codeclient_monkey.php b/htdocs/core/modules/societe/mod_codeclient_monkey.php
index a7ae44323a1..19a5309a374 100644
--- a/htdocs/core/modules/societe/mod_codeclient_monkey.php
+++ b/htdocs/core/modules/societe/mod_codeclient_monkey.php
@@ -151,7 +151,7 @@ class mod_codeclient_monkey extends ModeleThirdPartyCode
}
$date = dol_now();
- $yymm = strftime("%y%m", $date);
+ $yymm = dol_print_date($date, "%y%m", 'tzuserrel');
if ($max >= (pow(10, 5) - 1)) {
$num = $max + 1; // If counter > 99999, we do not format on 5 chars, we take number as it is
diff --git a/htdocs/core/modules/societe/mod_codecompta_digitaria.php b/htdocs/core/modules/societe/mod_codecompta_digitaria.php
index dddd01a602d..2ff2313c998 100644
--- a/htdocs/core/modules/societe/mod_codecompta_digitaria.php
+++ b/htdocs/core/modules/societe/mod_codecompta_digitaria.php
@@ -102,7 +102,8 @@ class mod_codecompta_digitaria extends ModeleAccountancyCode
$texte .= ' ';
$texte .= ' ';
$texte .= ' ';
- $texte .= '';
@@ -758,7 +787,7 @@ if (($action == "create") || ($action == "edit")) {
print dol_get_fiche_end();
- print "\n\n\n";
+ print "\n\n".'
'."\n";
if (!$user->rights->cron->create) {
print '
'.$langs->trans("Edit").' ';
} else {
diff --git a/htdocs/cron/class/cronjob.class.php b/htdocs/cron/class/cronjob.class.php
index 033e6512bd8..d26c83f4772 100644
--- a/htdocs/cron/class/cronjob.class.php
+++ b/htdocs/cron/class/cronjob.class.php
@@ -1,5 +1,5 @@
+/* Copyright (C) 2007-2022 Laurent Destailleur
* Copyright (C) 2013 Florian Henry
*
* This program is free software; you can redistribute it and/or modify
@@ -23,6 +23,7 @@
// Put here all includes required by your class file
require_once DOL_DOCUMENT_ROOT."/core/class/commonobject.class.php";
+require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php";
/**
@@ -142,6 +143,11 @@ class Cronjob extends CommonObject
*/
public $pid;
+ /**
+ * @var string Email when an error occurs
+ */
+ public $email_alert;
+
/**
* @var int User ID of creation
*/
@@ -168,10 +174,16 @@ class Cronjob extends CommonObject
public $libname;
/**
- * @var string A test condition to know if job is visible/qualified
+ * @var string A test condition to know if job is visible/qualified
*/
public $test;
+ /**
+ * @var string Autodelete
+ */
+ public $autodelete;
+
+
const STATUS_DISABLED = 0;
const STATUS_ENABLED = 1;
const STATUS_ARCHIVED = 2;
@@ -428,6 +440,7 @@ class Cronjob extends CommonObject
$sql .= " t.status,";
$sql .= " t.processing,";
$sql .= " t.pid,";
+ $sql .= " t.email_alert,";
$sql .= " t.fk_user_author,";
$sql .= " t.fk_user_mod,";
$sql .= " t.note as note_private,";
@@ -477,6 +490,7 @@ class Cronjob extends CommonObject
$this->status = $obj->status;
$this->processing = $obj->processing;
$this->pid = $obj->pid;
+ $this->email_alert = $obj->email_alert;
$this->fk_user_author = $obj->fk_user_author;
$this->fk_user_mod = $obj->fk_user_mod;
$this->note_private = $obj->note_private;
@@ -538,6 +552,7 @@ class Cronjob extends CommonObject
$sql .= " t.status,";
$sql .= " t.processing,";
$sql .= " t.pid,";
+ $sql .= " t.email_alert,";
$sql .= " t.fk_user_author,";
$sql .= " t.fk_user_mod,";
$sql .= " t.note as note_private,";
@@ -576,7 +591,7 @@ class Cronjob extends CommonObject
$sql .= " WHERE ".implode(' AND ', $sqlwhere);
}
- dol_syslog(get_class($this)."::fetch_all", LOG_DEBUG);
+ dol_syslog(get_class($this)."::fetchAll", LOG_DEBUG);
$resql = $this->db->query($sql);
if ($resql) {
$num = $this->db->num_rows($resql);
@@ -615,6 +630,7 @@ class Cronjob extends CommonObject
$line->status = $obj->status;
$line->processing = $obj->processing;
$line->pid = $obj->pid;
+ $line->email_alert = $obj->email_alert;
$line->fk_user_author = $obj->fk_user_author;
$line->fk_user_mod = $obj->fk_user_mod;
$line->note_private = $obj->note_private;
@@ -716,10 +732,12 @@ class Cronjob extends CommonObject
if (empty($this->processing)) {
$this->processing = 0;
}
-
if (empty($this->pid)) {
$this->pid = null;
}
+ if (empty($this->email_alert)) {
+ $this->email_alert = '';
+ }
// Check parameters
// Put here code to add a control on parameters values
@@ -764,7 +782,7 @@ class Cronjob extends CommonObject
// Update request
$sql = "UPDATE ".MAIN_DB_PREFIX."cronjob SET";
- $sql .= " entity=".(isset($this->entity) ? $this->db->escape($this->entity) : $conf->entity).",";
+ $sql .= " entity=".(isset($this->entity) ? ((int) $this->entity) : $conf->entity).",";
$sql .= " label=".(isset($this->label) ? "'".$this->db->escape($this->label)."'" : "null").",";
$sql .= " jobtype=".(isset($this->jobtype) ? "'".$this->db->escape($this->jobtype)."'" : "null").",";
$sql .= " command=".(isset($this->command) ? "'".$this->db->escape($this->command)."'" : "null").",";
@@ -774,7 +792,7 @@ class Cronjob extends CommonObject
$sql .= " params=".(isset($this->params) ? "'".$this->db->escape($this->params)."'" : "null").",";
$sql .= " md5params=".(isset($this->md5params) ? "'".$this->db->escape($this->md5params)."'" : "null").",";
$sql .= " module_name=".(isset($this->module_name) ? "'".$this->db->escape($this->module_name)."'" : "null").",";
- $sql .= " priority=".(isset($this->priority) ? $this->priority : "null").",";
+ $sql .= " priority=".(isset($this->priority) ? ((int) $this->priority) : "null").",";
$sql .= " datelastrun=".(dol_strlen($this->datelastrun) != 0 ? "'".$this->db->idate($this->datelastrun)."'" : 'null').",";
$sql .= " datenextrun=".(dol_strlen($this->datenextrun) != 0 ? "'".$this->db->idate($this->datenextrun)."'" : 'null').",";
$sql .= " dateend=".(dol_strlen($this->dateend) != 0 ? "'".$this->db->idate($this->dateend)."'" : 'null').",";
@@ -786,8 +804,9 @@ class Cronjob extends CommonObject
$sql .= " frequency=".(isset($this->frequency) ? $this->frequency : "null").",";
$sql .= " status=".(isset($this->status) ? $this->status : "null").",";
$sql .= " processing=".((isset($this->processing) && $this->processing > 0) ? $this->processing : "0").",";
- $sql .= " pid=".(isset($this->pid) ? $this->pid : "null").",";
- $sql .= " fk_user_mod=".$user->id.",";
+ $sql .= " pid=".(isset($this->pid) ? ((int) $this->pid) : "null").",";
+ $sql .= " email_alert = ".(isset($this->email_alert) ? "'".$this->db->escape($this->email_alert)."'" : "null").",";
+ $sql .= " fk_user_mod = ".((int) $user->id).",";
$sql .= " note=".(isset($this->note_private) ? "'".$this->db->escape($this->note_private)."'" : "null").",";
$sql .= " nbrun=".((isset($this->nbrun) && $this->nbrun > 0) ? $this->nbrun : "null").",";
$sql .= " maxrun=".((isset($this->maxrun) && $this->maxrun > 0) ? $this->maxrun : "0").",";
@@ -940,6 +959,7 @@ class Cronjob extends CommonObject
$this->status = 0;
$this->processing = 0;
$this->pid = null;
+ $this->email_alert = '';
$this->fk_user_author = 0;
$this->fk_user_mod = 0;
$this->note_private = '';
@@ -1130,6 +1150,7 @@ class Cronjob extends CommonObject
@set_time_limit($ExecTimeLimit); // Need more than 240 on Windows 7/64
error_reporting($err);
}
+ $MemoryLimit = 0;
if (!empty($MemoryLimit)) {
@ini_set('memory_limit', $MemoryLimit);
}
@@ -1207,7 +1228,8 @@ class Cronjob extends CommonObject
dol_syslog(get_class($this)."::run_jobs START ".$this->objectname."->".$this->methodename."(".$this->params.");", LOG_DEBUG);
// Create Object for the called module
- $object = new $this->objectname($this->db);
+ $nameofclass = $this->objectname;
+ $object = new $nameofclass($this->db);
if ($this->entity > 0) {
$object->entity = $this->entity; // We work on a dedicated entity
}
@@ -1240,13 +1262,13 @@ class Cronjob extends CommonObject
dol_syslog(get_class($this)."::run_jobs END result=".$result." error=".$errmsg, LOG_ERR);
$this->error = $errmsg;
- $this->lastoutput = ($object->output ? $object->output."\n" : "").$errmsg;
+ $this->lastoutput = (!empty($object->output) ? $object->output."\n" : "").$errmsg;
$this->lastresult = is_numeric($result) ? $result : -1;
$retval = $this->lastresult;
$error++;
} else {
dol_syslog(get_class($this)."::run_jobs END");
- $this->lastoutput = $object->output;
+ $this->lastoutput = (!empty($object->output) ? $object->output : "");
$this->lastresult = var_export($result, true);
$retval = $this->lastresult;
}
@@ -1341,6 +1363,16 @@ class Cronjob extends CommonObject
}
$conf->setEntityValues($this->db, $savcurrententity);
+
+ if ($error && !empty($this->email_alert)) {
+ include_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
+ $subject = $langs->trans("ErrorInBatch", $this->label);
+ $msg = $langs->trans("ErrorInBatch", $this->label);
+ $from = getDolGlobalString('MAIN_MAIL_EMAIL_FROM');
+ $cmailfile = new CMailFile($subject, $this->email_alert, $from, $msg);
+ $result = $cmailfile->sendfile(); // Do not test result
+ }
+
return $error ?-1 : 1;
}
@@ -1377,21 +1409,30 @@ class Cronjob extends CommonObject
if (empty($this->datenextrun)) {
if (empty($this->datestart)) {
- $this->datenextrun = $now + ($this->frequency * $this->unitfrequency);
+ if ($this->unitfrequency == 2678400) {
+ $this->datenextrun = dol_time_plus_duree($now, $this->frequency, 'm');
+ } else {
+ $this->datenextrun = $now + ($this->frequency * $this->unitfrequency);
+ }
} else {
- $this->datenextrun = $this->datestart + ($this->frequency * $this->unitfrequency);
+ if ($this->unitfrequency == 2678400) {
+ $this->datenextrun = dol_time_plus_duree($this->datestart, $this->frequency, 'm');
+ } else {
+ $this->datenextrun = $this->datestart + ($this->frequency * $this->unitfrequency);
+ }
}
}
if ($this->datenextrun < $now && $this->frequency > 0 && $this->unitfrequency > 0) {
// Loop until date is after future
while ($this->datenextrun < $now) {
- $this->datenextrun += ($this->frequency * $this->unitfrequency);
-
- // TODO For exact frequency (every month, every year, ...), use instead a dol_time_plus_duree($time, $duration_value, $duration_unit)
+ if ($this->unitfrequency == 2678400) {
+ $this->datenextrun = dol_time_plus_duree($this->datenextrun, $this->frequency, 'm');
+ } else {
+ $this->datenextrun += ($this->frequency * $this->unitfrequency);
+ }
}
} else {
- //$this->datenextrun=$this->datenextrun + ($this->frequency * $this->unitfrequency);
dol_syslog(get_class($this)."::reprogram_jobs datenextrun is already in future, we do not change it");
}
diff --git a/htdocs/cron/list.php b/htdocs/cron/list.php
index a2c3b1d4807..ae53242d836 100644
--- a/htdocs/cron/list.php
+++ b/htdocs/cron/list.php
@@ -420,7 +420,7 @@ if (!empty($conf->global->CRON_WARNING_DELAY_HOURS)) {
$text .= $langs->trans("WarningCronDelayed", $conf->global->CRON_WARNING_DELAY_HOURS);
}
print info_admin($text);
-print ' ';
+//print ' ';
//$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
$selectedfields = '';
@@ -447,7 +447,7 @@ print ' ';
print ' ';
print ' ';
print ' ';
-print '';
+print ' ';
print $form->selectarray('search_status', array('0'=>$langs->trans("Disabled"), '1'=>$langs->trans("Scheduled")), $search_status, 1);
print ' ';
$searchpicto = $form->showFilterButtons();
@@ -460,18 +460,18 @@ print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "t.rowid", "", $param, '',
print_liste_field_titre("CronLabel", $_SERVER["PHP_SELF"], "t.label", "", $param, '', $sortfield, $sortorder);
print_liste_field_titre("Prority", $_SERVER["PHP_SELF"], "t.priority", "", $param, '', $sortfield, $sortorder);
print_liste_field_titre("CronModule", $_SERVER["PHP_SELF"], "t.module_name", "", $param, '', $sortfield, $sortorder);
-print_liste_field_titre("CronType", '', '', "", $param, '', $sortfield, $sortorder);
+print_liste_field_titre("CronType", '', '', "", $param, '', $sortfield, $sortorder, 'tdoverflowmax100 ');
print_liste_field_titre("CronFrequency", '', "", "", $param, '', $sortfield, $sortorder);
//print_liste_field_titre("CronDtStart", $_SERVER["PHP_SELF"], "t.datestart", "", $param, 'align="center"', $sortfield, $sortorder);
//print_liste_field_titre("CronDtEnd", $_SERVER["PHP_SELF"], "t.dateend", "", $param, 'align="center"', $sortfield, $sortorder);
-print_liste_field_titre("CronNbRun", $_SERVER["PHP_SELF"], "t.nbrun", "", $param, 'align="right"', $sortfield, $sortorder);
-print_liste_field_titre("CronDtLastLaunch", $_SERVER["PHP_SELF"], "t.datelastrun", "", $param, 'align="center"', $sortfield, $sortorder);
-print_liste_field_titre("Duration", $_SERVER["PHP_SELF"], "", "", $param, 'align="center"', $sortfield, $sortorder);
-print_liste_field_titre("CronLastResult", $_SERVER["PHP_SELF"], "t.lastresult", "", $param, 'align="center"', $sortfield, $sortorder);
+print_liste_field_titre("CronNbRun", $_SERVER["PHP_SELF"], "t.nbrun", "", $param, '', $sortfield, $sortorder, 'right tdoverflowmax50');
+print_liste_field_titre("CronDtLastLaunch", $_SERVER["PHP_SELF"], "t.datelastrun", "", $param, '', $sortfield, $sortorder, 'center ');
+print_liste_field_titre("Duration", $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'center ');
+print_liste_field_titre("CronLastResult", $_SERVER["PHP_SELF"], "t.lastresult", "", $param, '', $sortfield, $sortorder, 'center ');
print_liste_field_titre("CronLastOutput", $_SERVER["PHP_SELF"], "t.lastoutput", "", $param, '', $sortfield, $sortorder);
-print_liste_field_titre("CronDtNextLaunch", $_SERVER["PHP_SELF"], "t.datenextrun", "", $param, 'align="center"', $sortfield, $sortorder);
-print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "t.status,t.priority", "", $param, 'align="center"', $sortfield, $sortorder);
-print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", "", $param, 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
+print_liste_field_titre("CronDtNextLaunch", $_SERVER["PHP_SELF"], "t.datenextrun", "", $param, '', $sortfield, $sortorder, 'center ');
+print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "t.status,t.priority", "", $param, '', $sortfield, $sortorder, 'center ');
+print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'center maxwidthsearch ');
print " \n";
@@ -560,19 +560,20 @@ if ($num > 0) {
print $form->textwithpicto($text, $texttoshow, 1);
print '';
- print '';
+ $s = '';
if ($obj->unitfrequency == "60") {
- print $langs->trans('CronEach')." ".($obj->frequency)." ".$langs->trans('Minutes');
- }
- if ($obj->unitfrequency == "3600") {
- print $langs->trans('CronEach')." ".($obj->frequency)." ".$langs->trans('Hours');
- }
- if ($obj->unitfrequency == "86400") {
- print $langs->trans('CronEach')." ".($obj->frequency)." ".$langs->trans('Days');
- }
- if ($obj->unitfrequency == "604800") {
- print $langs->trans('CronEach')." ".($obj->frequency)." ".$langs->trans('Weeks');
+ $s = ($obj->frequency)." ".($obj->frequency > 1 ? $langs->trans('Minutes') : $langs->trans('Minute'));
+ } elseif ($obj->unitfrequency == "3600") {
+ $s = ($obj->frequency)." ".($obj->frequency > 1 ? $langs->trans('Hours') : $langs->trans('Hour'));
+ } elseif ($obj->unitfrequency == "86400") {
+ $s = ($obj->frequency)." ".($obj->frequency > 1 ? $langs->trans('Days') : $langs->trans('Day'));
+ } elseif ($obj->unitfrequency == "604800") {
+ $s = ($obj->frequency)." ".($obj->frequency > 1 ? $langs->trans('Weeks') : $langs->trans('Week'));
+ } elseif ($obj->unitfrequency == "2678400") {
+ $s = ($obj->frequency)." ".($obj->frequency > 1 ? $langs->trans('Months') : $langs->trans('Month'));
}
+ print ' ';
+ print $s;
print ' ';
/*
diff --git a/htdocs/datapolicy/class/datapolicycron.class.php b/htdocs/datapolicy/class/datapolicycron.class.php
index 44152f0c68b..fb76767bf1e 100644
--- a/htdocs/datapolicy/class/datapolicycron.class.php
+++ b/htdocs/datapolicy/class/datapolicycron.class.php
@@ -451,8 +451,8 @@ class DataPolicyCron
$this->db->begin();
foreach ($arrayofparameters as $key => $params) {
- if ($conf->global->$key != '' && is_numeric($conf->global->$key) && (int) $conf->global->$key > 0) {
- $sql = sprintf($params['sql'], (int) $conf->entity, (int) $conf->global->$key, (int) $conf->global->$key);
+ if (getDolGlobalInt($key) > 0) {
+ $sql = sprintf($params['sql'], (int) $conf->entity, (int) getDolGlobalInt($key), (int) getDolGlobalInt($key));
$resql = $this->db->query($sql);
diff --git a/htdocs/dav/fileserver.php b/htdocs/dav/fileserver.php
index dd46992d211..7abe3f2bacf 100644
--- a/htdocs/dav/fileserver.php
+++ b/htdocs/dav/fileserver.php
@@ -157,7 +157,7 @@ if (!empty($conf->global->DAV_ALLOW_PUBLIC_DIR)) {
// Private dir
$nodes[] = new \Sabre\DAV\FS\Directory($privateDir);
// ECM dir
-if (!empty($conf->ecm->enabled) && !empty($conf->global->DAV_ALLOW_ECM_DIR)) {
+if (isModEnabled('ecm') && !empty($conf->global->DAV_ALLOW_ECM_DIR)) {
$nodes[] = new \Sabre\DAV\FS\Directory($ecmDir);
}
diff --git a/htdocs/debugbar/class/TraceableDB.php b/htdocs/debugbar/class/TraceableDB.php
index 785af37fc94..0b862f4df70 100644
--- a/htdocs/debugbar/class/TraceableDB.php
+++ b/htdocs/debugbar/class/TraceableDB.php
@@ -102,11 +102,12 @@ class TraceableDB extends DoliDB
/**
* Start transaction
*
- * @return int 1 if transaction successfuly opened or already opened, 0 if error
+ * @param string $textinlog Add a small text into log. '' by default.
+ * @return int 1 if transaction successfuly opened or already opened, 0 if error
*/
- public function begin()
+ public function begin($textinlog = '')
{
- return $this->db->begin();
+ return $this->db->begin($textinlog);
}
/**
diff --git a/htdocs/delivery/card.php b/htdocs/delivery/card.php
index 0fbdc85924c..b98b75015ab 100644
--- a/htdocs/delivery/card.php
+++ b/htdocs/delivery/card.php
@@ -52,7 +52,7 @@ if (isModEnabled('project')) {
// Load translation files required by the page
$langs->loadLangs(array('bills', 'deliveries', 'orders', 'sendings'));
-if (!empty($conf->incoterm->enabled)) {
+if (isModEnabled('incoterm')) {
$langs->load('incoterm');
}
@@ -186,7 +186,7 @@ if ($action == 'setdate_delivery' && $user->rights->expedition->delivery->creer)
if ($result < 0) {
$mesg = ''.$object->error.'
';
}
-} elseif ($action == 'set_incoterms' && !empty($conf->incoterm->enabled)) {
+} elseif ($action == 'set_incoterms' && isModEnabled('incoterm')) {
// Set incoterm
$result = $object->setIncoterms((int) GETPOST('incoterm_id', 'int'), GETPOST('location_incoterms', 'alpha'));
}
@@ -328,45 +328,33 @@ if ($action == 'create') {
$morehtmlref .= $form->editfieldval("RefCustomer", '', $expedition->ref_customer, $expedition, $user->rights->expedition->creer, 'string'.(isset($conf->global->THIRDPARTY_REF_INPUT_SIZE) ? ':'.$conf->global->THIRDPARTY_REF_INPUT_SIZE : ''), '', null, null, '', 1);
$morehtmlref .= ' '.$langs->trans("RefDeliveryReceipt").' : '.$object->ref;
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$expedition->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$expedition->thirdparty->getNomUrl(1);
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if (0) { // Do not change on shipment
+ $morehtmlref .= ' ';
+ if (0) { // Do not change on shipment
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- // $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $expedition->id, $expedition->socid, $expedition->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($expedition->socid, $expedition->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$expedition->id, $expedition->socid, $expedition->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $objectsrc->socid, $objectsrc->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
- $morehtmlref .= ' : ';
if (!empty($objectsrc->fk_project)) {
$proj = new Project($db);
$proj->fetch($objectsrc->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
$morehtmlref .= '';
- $morehtmlright = $langs->trans("StatusReceipt").' : '.$object->getLibStatut(6).' ';
+ $morehtmlstatus = $langs->trans("StatusReceipt").' : '.$object->getLibStatut(6).' ';
- dol_banner_tab($expedition, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref, '', 0, '', $morehtmlright);
+ dol_banner_tab($expedition, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref, '', 0, '', $morehtmlstatus);
print '';
@@ -451,7 +439,7 @@ if ($action == 'create') {
print '';
// Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
print '
';
print '';
print $langs->trans('IncotermLabel');
@@ -577,11 +565,11 @@ if ($action == 'create') {
}
$text .= ' '.$object->lines[$i]->product_ref.'';
$text .= ' - '.$label;
- $description = (!empty($conf->global->PRODUIT_DESC_IN_FORM) ? '' : dol_htmlentitiesbr($object->lines[$i]->description));
+ $description = (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE') ? '' : dol_htmlentitiesbr($object->lines[$i]->description));
//print $description;
print $form->textwithtooltip($text, $description, 3, '', '', $i);
print_date_range($object->lines[$i]->date_start, $object->lines[$i]->date_end);
- if (!empty($conf->global->PRODUIT_DESC_IN_FORM)) {
+ if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
print (!empty($object->lines[$i]->description) && $object->lines[$i]->description != $object->lines[$i]->product_label) ? ' '.dol_htmlentitiesbr($object->lines[$i]->description) : '';
}
} else {
diff --git a/htdocs/don/card.php b/htdocs/don/card.php
index 761a1ea9522..91a13a93093 100644
--- a/htdocs/don/card.php
+++ b/htdocs/don/card.php
@@ -487,7 +487,8 @@ if ($action == 'create') {
// Payment mode
print " ".$langs->trans("PaymentMode")." \n";
$selected = GETPOST('modepayment', 'int');
- $form->select_types_paiements($selected, 'modepayment', 'CRDT', 0, 1);
+ print img_picto('', 'payment', 'class="pictofixedwidth"');
+ print $form->select_types_paiements($selected, 'modepayment', 'CRDT', 0, 1, 0, 0, 1, 'maxwidth200 widthcentpercentminusx', 1);
print " \n";
// Public note
@@ -516,7 +517,8 @@ if ($action == 'create') {
if (isModEnabled('project')) {
print "".$langs->trans("Project")." ";
- $formproject->select_projects(-1, $projectid, 'fk_project', 0, 0, 1, 1, 0, 0, 0, '', 0, 0, 'maxwidth500');
+ print img_picto('', 'project', 'class="pictofixedwidth"');
+ print $formproject->select_projects(-1, $projectid, 'fk_project', 0, 0, 1, 1, 0, 0, 0, '', 1, 0, 'maxwidth500');
print " \n";
}
@@ -919,7 +921,7 @@ if (!empty($id) && $action != 'edit') {
$somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
// Show online payment link
- $useonlinepayment = (!empty($conf->paypal->enabled) || !empty($conf->stripe->enabled) || !empty($conf->paybox->enabled));
+ $useonlinepayment = (isModEnabled('paypal') || isModEnabled('stripe') || isModEnabled('paybox'));
if ($useonlinepayment) { //$object->statut != Facture::STATUS_DRAFT &&
print ' '."\n";
diff --git a/htdocs/don/class/paymentdonation.class.php b/htdocs/don/class/paymentdonation.class.php
index e4928ac9363..b42f5fb4e4d 100644
--- a/htdocs/don/class/paymentdonation.class.php
+++ b/htdocs/don/class/paymentdonation.class.php
@@ -65,7 +65,7 @@ class PaymentDonation extends CommonObject
public $amounts = array(); // Array of amounts
public $fk_typepayment; // Payment mode ID
- public $paymenttype; // Payment mode ID
+ public $paymenttype; // Payment mode ID or Code. TODO Use only the code in this field.
public $num_payment;
@@ -188,12 +188,12 @@ class PaymentDonation extends CommonObject
$sql = "INSERT INTO ".MAIN_DB_PREFIX."payment_donation (fk_donation, datec, datep, amount,";
$sql .= " fk_typepayment, num_payment, note, ext_payment_id, ext_payment_site,";
$sql .= " fk_user_creat, fk_bank)";
- $sql .= " VALUES ($this->chid, '".$this->db->idate($now)."',";
+ $sql .= " VALUES (".((int) $this->chid).", '".$this->db->idate($now)."',";
$sql .= " '".$this->db->idate($this->datepaid)."',";
- $sql .= " ".price2num($totalamount).",";
+ $sql .= " ".((float) price2num($totalamount)).",";
$sql .= " ".((int) $this->paymenttype).", '".$this->db->escape($this->num_payment)."', '".$this->db->escape($this->note_public)."', ";
$sql .= " ".($this->ext_payment_id ? "'".$this->db->escape($this->ext_payment_id)."'" : "null").", ".($this->ext_payment_site ? "'".$this->db->escape($this->ext_payment_site)."'" : "null").",";
- $sql .= " ".$user->id.", 0)";
+ $sql .= " ".((int) $user->id).", 0)";
dol_syslog(get_class($this)."::create", LOG_DEBUG);
$resql = $this->db->query($sql);
@@ -269,8 +269,8 @@ class PaymentDonation extends CommonObject
$this->tms = $this->db->jdate($obj->tms);
$this->datep = $this->db->jdate($obj->datep);
$this->amount = $obj->amount;
- $this->fk_typepayment = $obj->fk_typepayment; // For backward compatibility
- $this->paymenttype = $obj->fk_typepayment;
+ $this->fk_typepayment = $obj->fk_typepayment; // Id on type of payent
+ $this->paymenttype = $obj->fk_typepayment; // Id on type of payment. We should store the code into paymenttype.
$this->num_payment = $obj->num_payment;
$this->note_public = $obj->note_public;
$this->fk_bank = $obj->fk_bank;
diff --git a/htdocs/don/payment/card.php b/htdocs/don/payment/card.php
index f5507e5e6c7..19f40bc984e 100644
--- a/htdocs/don/payment/card.php
+++ b/htdocs/don/payment/card.php
@@ -214,9 +214,9 @@ print '';
if (empty($action)) {
if ($user->rights->don->supprimer) {
if (!$disable_delete) {
- print '
'.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans('Delete'), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), '', 1);
} else {
- print '
'.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans("CantRemovePaymentWithOneInvoicePaid"), $langs->trans('Delete'), 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), '', 1);
}
}
}
diff --git a/htdocs/don/payment/payment.php b/htdocs/don/payment/payment.php
index 6a2cc78f128..358c0b208e9 100644
--- a/htdocs/don/payment/payment.php
+++ b/htdocs/don/payment/payment.php
@@ -95,7 +95,7 @@ if ($action == 'add_payment') {
// Create a line of payments
$payment = new PaymentDonation($db);
$payment->chid = $chid;
- $payment->datepaid = $datepaid;
+ $payment->datep = $datepaid;
$payment->amounts = $amounts; // Tableau de montant
$payment->paymenttype = GETPOST("paymenttype", 'int');
$payment->num_payment = GETPOST("num_payment", 'alphanohtml');
@@ -192,14 +192,14 @@ if ($action == 'create') {
print '';
print '
'.$langs->trans("PaymentMode").' ';
- $form->select_types_paiements(GETPOSTISSET("paymenttype") ? GETPOST("paymenttype") : $object->paymenttype, "paymenttype");
+ $form->select_types_paiements(GETPOSTISSET("paymenttype") ? GETPOST("paymenttype") : $object->fk_typepayment, "paymenttype");
print " \n";
print '';
print '
';
print ''.$langs->trans('AccountToCredit').' ';
print '';
- $form->select_comptes(GETPOSTISSET("accountid") ? GETPOST("accountid") : $object->accountid, "accountid", 0, '', 2); // Show open bank account list
+ $form->select_comptes(GETPOSTISSET("accountid") ? GETPOST("accountid") : "0", "accountid", 0, '', 2); // Show open bank account list
print ' ';
// Number
diff --git a/htdocs/don/stats/index.php b/htdocs/don/stats/index.php
index 4109c30d335..e9c2b82ae22 100644
--- a/htdocs/don/stats/index.php
+++ b/htdocs/don/stats/index.php
@@ -41,7 +41,7 @@ if ($user->socid > 0) {
$socid = $user->socid;
}
-$nowyear = strftime("%Y", dol_now());
+$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$year = GETPOST('year') > 0 ?GETPOST('year') : $nowyear;
$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS)));
$endyear = $year;
diff --git a/htdocs/ecm/class/ecmfiles.class.php b/htdocs/ecm/class/ecmfiles.class.php
index 3f4df8b847b..ab7b13aba90 100644
--- a/htdocs/ecm/class/ecmfiles.class.php
+++ b/htdocs/ecm/class/ecmfiles.class.php
@@ -751,7 +751,13 @@ class EcmFiles extends CommonObject
}
// If you need to delete child tables to, you can insert them here
-
+ if (!$error) {
+ $result = $this->deleteExtraFields();
+ if (!$result) {
+ dol_syslog(get_class($this)."::delete error ".$this->error, LOG_ERR);
+ $error++;
+ }
+ }
if (!$error) {
$sql = 'DELETE FROM '.MAIN_DB_PREFIX.$this->table_element;
$sql .= ' WHERE rowid='.((int) $this->id);
diff --git a/htdocs/ecm/dir_add_card.php b/htdocs/ecm/dir_add_card.php
index 01a1cfb63a9..3f20188db56 100644
--- a/htdocs/ecm/dir_add_card.php
+++ b/htdocs/ecm/dir_add_card.php
@@ -283,11 +283,10 @@ if (empty($action) || $action == 'delete_section') {
// Actions buttons
print '
';
- if ($user->rights->ecm->setup) {
- print '
'.$langs->trans('Delete').' ';
- } else {
- print '
'.$langs->trans('Delete').' ';
- }
+
+ // Delete
+ print dolGetButtonAction($langs->trans('Delete'), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), '', $user->rights->ecm->setup);
+
print '
';
}
diff --git a/htdocs/ecm/dir_card.php b/htdocs/ecm/dir_card.php
index c36cebfc80c..adfd405790f 100644
--- a/htdocs/ecm/dir_card.php
+++ b/htdocs/ecm/dir_card.php
@@ -464,31 +464,19 @@ if ($action != 'edit' && $action != 'delete' && $action != 'deletefile') {
print '
'.$langs->trans('ECMAddSection').' ';
}
- //if (count($filearrayall) == 0)
- //{
- if ($permtoadd) {
- print '
'.$langs->trans('Delete').' ';
- } else {
- print '
'.$langs->trans('Delete').' ';
- }
- /*}
- else
- {
- if (count($filearray) > 0)
- print '
'.$langs->trans('Delete').' ';
- else
- print '
'.$langs->trans('Delete').' ';
- }*/
+ print dolGetButtonAction($langs->trans('Delete'), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken().($module ? '&module='.urlencode($module) : '').'§ion='.urlencode($section).($backtopage ? '&backtopage='.urlencode($backtopage) : ''), '', $permtoadd);
+
print '
';
}
+
// Confirm remove file
if ($action == 'deletefile') {
print $form->formconfirm($_SERVER["PHP_SELF"].'?section='.urlencode(GETPOST("section", 'alpha')).'&urlfile='.urlencode(GETPOST("urlfile")).($backtopage ? '&backtopage='.urlencode($backtopage) : ''), $langs->trans('DeleteFile'), $langs->trans('ConfirmDeleteFile'), 'confirm_deletefile');
}
-// Confirm remove file
-if ($action == 'delete_dir') {
+// Confirm remove dir
+if ($action == 'delete' || $action == 'delete_dir') {
$relativepathwithoutslash = preg_replace('/[\/]$/', '', $relativepath);
//Form to close proposal (signed or not)
diff --git a/htdocs/ecm/file_card.php b/htdocs/ecm/file_card.php
index 1b572e44eb8..8202335fbc3 100644
--- a/htdocs/ecm/file_card.php
+++ b/htdocs/ecm/file_card.php
@@ -424,16 +424,9 @@ if ($action != 'edit') {
if ($user->rights->ecm->setup) {
print ''.$langs->trans('Edit').' ';
}
- /*
- if ($user->rights->ecm->setup)
- {
- print ''.$langs->trans('Delete').' ';
- }
- else
- {
- print ''.$langs->trans('Delete').' ';
- }
- */
+
+ //print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $user->rights->ecm->setup);
+
print '';
}
diff --git a/htdocs/ecm/index.php b/htdocs/ecm/index.php
index 79c4d7dcc24..9eb512bc96d 100644
--- a/htdocs/ecm/index.php
+++ b/htdocs/ecm/index.php
@@ -328,6 +328,9 @@ print dol_get_fiche_head($head, 'index', '', -1, '');
// Add filemanager component
$module = 'ecm';
+if (empty($url)) {
+ $url = DOL_URL_ROOT.'/ecm/index.php'; // Must be an url without param
+}
include DOL_DOCUMENT_ROOT.'/core/tpl/filemanager.tpl.php';
// End of page
diff --git a/htdocs/ecm/index_auto.php b/htdocs/ecm/index_auto.php
index 9d9ff5a463f..342d7d74129 100644
--- a/htdocs/ecm/index_auto.php
+++ b/htdocs/ecm/index_auto.php
@@ -443,6 +443,7 @@ if (empty($action) || $action == 'file_manager' || preg_match('/refresh/i', $act
// Auto section
if (count($sectionauto)) {
$htmltooltip = $langs->trans("ECMAreaDesc2");
+ $htmltooltip .= ' '.$langs->trans("ECMAreaDesc2b");
$sectionauto = dol_sort_array($sectionauto, 'label', 'ASC', true, false);
@@ -476,6 +477,7 @@ if (empty($action) || $action == 'file_manager' || preg_match('/refresh/i', $act
$htmltooltip .= ''.$langs->trans("Description").' : '.$val['desc'];
print $form->textwithpicto('', $htmltooltip, 1, 'info');
print '';
+
print '';
$nbofentries++;
diff --git a/htdocs/ecm/index_medias.php b/htdocs/ecm/index_medias.php
new file mode 100644
index 00000000000..f5ad347bccf
--- /dev/null
+++ b/htdocs/ecm/index_medias.php
@@ -0,0 +1,312 @@
+
+ * Copyright (C) 2008-2010 Regis Houssin
+ *
+ * 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 .
+ *
+ * You can call this page with param module=medias to get a filemanager for medias.
+ */
+
+/**
+ * \file htdocs/ecm/index_medias.php
+ * \ingroup ecm
+ * \brief Main page for ECM section of public media directories area
+ */
+
+// Load Dolibarr environment
+require '../main.inc.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/ecm.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/treeview.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmdirectory.class.php';
+
+// Load translation files required by the page
+$langs->loadLangs(array('ecm', 'companies', 'other', 'users', 'orders', 'propal', 'bills', 'contracts'));
+
+// Get parameters
+$action = GETPOST('action', 'aZ09');
+
+$socid = GETPOST('socid', 'int');
+$file_manager = GETPOST('file_manager', 'alpha');
+$section = GETPOST('section', 'int') ? GETPOST('section', 'int') : GETPOST('section_id', 'int');
+if (!$section) {
+ $section = 0;
+}
+$section_dir = GETPOST('section_dir', 'alpha');
+$overwritefile = GETPOST('overwritefile', 'int');
+
+if (empty($action) && $file_manager) {
+ $action = 'file_manager';
+}
+
+$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
+$sortfield = GETPOST('sortfield', 'aZ09comma');
+$sortorder = GETPOST('sortorder', 'aZ09comma');
+$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
+if (empty($page) || $page == -1) {
+ $page = 0;
+} // If $page is not defined, or '' or -1
+$offset = $limit * $page;
+$pageprev = $page - 1;
+$pagenext = $page + 1;
+if (!$sortorder) {
+ $sortorder = "ASC";
+}
+if (!$sortfield) {
+ $sortfield = "name";
+}
+
+
+$ecmdir = new EcmDirectory($db);
+if ($section > 0) {
+ $result = $ecmdir->fetch($section);
+ if (!($result > 0)) {
+ dol_print_error($db, $ecmdir->error);
+ exit;
+ }
+}
+
+$form = new Form($db);
+$ecmdirstatic = new EcmDirectory($db);
+$userstatic = new User($db);
+
+$error = 0;
+
+// Security check
+if ($user->socid) {
+ $socid = $user->socid;
+}
+$result = restrictedArea($user, 'ecm', 0);
+
+$permtouploadfile = ($user->hasRight('ecm', 'setup') || $user->hasRight('mailing', 'creer') || $user->hasRight('website', 'write'));
+$diroutput = $conf->medias->multidir_output[$conf->entity];
+
+$relativepath = $section_dir;
+$upload_dir = preg_replace('/\/$/', '', $diroutput).'/'.preg_replace('/^\//', '', $relativepath);
+
+$websitekey = '';
+
+$permissiontoadd = $permtouploadfile; // Used by the include of actions_addupdatedelete.inc.php and actions_linkedfiles
+
+
+/*
+ * Actions
+ */
+
+$savbacktopage = $backtopage;
+$backtopage = $_SERVER["PHP_SELF"].'?file_manager=1&website='.urlencode($websitekey).'&pageid='.urlencode($pageid).(GETPOST('section_dir', 'alpha') ? '§ion_dir='.urlencode(GETPOST('section_dir', 'alpha')) : ''); // used after a confirm_deletefile into actions_linkedfiles.inc.php
+if ($sortfield) {
+ $backtopage .= '&sortfield='.urlencode($sortfield);
+}
+if ($sortorder) {
+ $backtopage .= '&sortorder='.urlencode($sortorder);
+}
+include DOL_DOCUMENT_ROOT.'/core/actions_linkedfiles.inc.php'; // This manage 'sendit', 'confirm_deletefile', 'renamefile' action when submitting new file.
+
+$backtopage = $savbacktopage;
+
+if ($action == 'renamefile') { // Must be after include DOL_DOCUMENT_ROOT.'/core/actions_linkedfiles.inc.php'; If action were renamefile, we set it to 'file_manager'
+ $action = 'file_manager';
+}
+
+
+// Add directory
+if ($action == 'add' && $permtouploadfile) {
+ $ecmdir->ref = 'NOTUSEDYET';
+ $ecmdir->label = GETPOST("label");
+ $ecmdir->description = GETPOST("desc");
+
+ $id = $ecmdir->create($user);
+ if ($id > 0) {
+ header("Location: ".$_SERVER["PHP_SELF"]);
+ exit;
+ } else {
+ setEventMessages('Error '.$langs->trans($ecmdir->error), null, 'errors');
+ $action = "create";
+ }
+
+ clearstatcache();
+}
+
+// Remove directory
+if ($action == 'confirm_deletesection' && GETPOST('confirm', 'alpha') == 'yes') {
+ $result = $ecmdir->delete($user);
+ setEventMessages($langs->trans("ECMSectionWasRemoved", $ecmdir->label), null, 'mesgs');
+
+ clearstatcache();
+}
+
+// Refresh directory view
+// This refresh list of dirs, not list of files (for preformance reason). List of files is refresh only if dir was not synchronized.
+// To refresh content of dir with cache, just open the dir in edit mode.
+if ($action == 'refreshmanual') {
+ $ecmdirtmp = new EcmDirectory($db);
+
+ // This part of code is same than into file ecm/ajax/ecmdatabase.php TODO Remove duplicate
+ clearstatcache();
+
+ $diroutputslash = str_replace('\\', '/', $conf->ecm->dir_output);
+ $diroutputslash .= '/';
+
+ // Scan directory tree on disk
+ $disktree = dol_dir_list($conf->ecm->dir_output, 'directories', 1, '', '^temp$', '', '', 0);
+
+ // Scan directory tree in database
+ $sqltree = $ecmdirstatic->get_full_arbo(0);
+
+ $adirwascreated = 0;
+
+ // Now we compare both trees to complete missing trees into database
+ //var_dump($disktree);
+ //var_dump($sqltree);
+ foreach ($disktree as $dirdesc) { // Loop on tree onto disk
+ $dirisindatabase = 0;
+ foreach ($sqltree as $dirsqldesc) {
+ if ($conf->ecm->dir_output.'/'.$dirsqldesc['fullrelativename'] == $dirdesc['fullname']) {
+ $dirisindatabase = 1;
+ break;
+ }
+ }
+
+ if (!$dirisindatabase) {
+ $txt = "Directory found on disk ".$dirdesc['fullname'].", not found into database so we add it";
+ dol_syslog($txt);
+ //print $txt." \n";
+
+ // We must first find the fk_parent of directory to create $dirdesc['fullname']
+ $fk_parent = -1;
+ $relativepathmissing = str_replace($diroutputslash, '', $dirdesc['fullname']);
+ $relativepathtosearchparent = $relativepathmissing;
+ //dol_syslog("Try to find parent id for directory ".$relativepathtosearchparent);
+ if (preg_match('/\//', $relativepathtosearchparent)) {
+ //while (preg_match('/\//',$relativepathtosearchparent))
+ $relativepathtosearchparent = preg_replace('/\/[^\/]*$/', '', $relativepathtosearchparent);
+ $txt = "Is relative parent path ".$relativepathtosearchparent." for ".$relativepathmissing." found in sql tree ?";
+ dol_syslog($txt);
+ //print $txt." -> ";
+ $parentdirisindatabase = 0;
+ foreach ($sqltree as $dirsqldesc) {
+ if ($dirsqldesc['fullrelativename'] == $relativepathtosearchparent) {
+ $parentdirisindatabase = $dirsqldesc['id'];
+ break;
+ }
+ }
+ if ($parentdirisindatabase > 0) {
+ dol_syslog("Yes with id ".$parentdirisindatabase);
+ //print "Yes with id ".$parentdirisindatabase." \n";
+ $fk_parent = $parentdirisindatabase;
+ //break; // We found parent, we can stop the while loop
+ } else {
+ dol_syslog("No");
+ //print "No \n";
+ }
+ } else {
+ dol_syslog("Parent is root");
+ $fk_parent = 0; // Parent is root
+ }
+
+ if ($fk_parent >= 0) {
+ $ecmdirtmp->ref = 'NOTUSEDYET';
+ $ecmdirtmp->label = dol_basename($dirdesc['fullname']);
+ $ecmdirtmp->description = '';
+ $ecmdirtmp->fk_parent = $fk_parent;
+
+ $txt = "We create directory ".$ecmdirtmp->label." with parent ".$fk_parent;
+ dol_syslog($txt);
+ //print $ecmdirtmp->cachenbofdoc." \n";exit;
+ $id = $ecmdirtmp->create($user);
+ if ($id > 0) {
+ $newdirsql = array('id'=>$id,
+ 'id_mere'=>$ecmdirtmp->fk_parent,
+ 'label'=>$ecmdirtmp->label,
+ 'description'=>$ecmdirtmp->description,
+ 'fullrelativename'=>$relativepathmissing);
+ $sqltree[] = $newdirsql; // We complete fulltree for following loops
+ //var_dump($sqltree);
+ $adirwascreated = 1;
+ } else {
+ dol_syslog("Failed to create directory ".$ecmdirtmp->label, LOG_ERR);
+ }
+ } else {
+ $txt = "Parent of ".$dirdesc['fullname']." not found";
+ dol_syslog($txt);
+ //print $txt." \n";
+ }
+ }
+ }
+
+ // Loop now on each sql tree to check if dir exists
+ foreach ($sqltree as $dirdesc) { // Loop on each sqltree to check dir is on disk
+ $dirtotest = $conf->ecm->dir_output.'/'.$dirdesc['fullrelativename'];
+ if (!dol_is_dir($dirtotest)) {
+ $ecmdirtmp->id = $dirdesc['id'];
+ $ecmdirtmp->delete($user, 'databaseonly');
+ //exit;
+ }
+ }
+
+ $sql = "UPDATE ".MAIN_DB_PREFIX."ecm_directories set cachenbofdoc = -1 WHERE cachenbofdoc < 0"; // If pb into cahce counting, we set to value -1 = "unknown"
+ dol_syslog("sql = ".$sql);
+ $db->query($sql);
+
+ // If a directory was added, the fulltree array is not correctly completed and sorted, so we clean
+ // it to be sure that fulltree array is not used without reloading it.
+ if ($adirwascreated) {
+ $sqltree = null;
+ }
+}
+
+
+
+/*
+ * View
+ */
+
+// Define height of file area (depends on $_SESSION["dol_screenheight"])
+//print $_SESSION["dol_screenheight"];
+$maxheightwin = (isset($_SESSION["dol_screenheight"]) && $_SESSION["dol_screenheight"] > 466) ? ($_SESSION["dol_screenheight"] - 136) : 660; // Also into index_auto.php file
+
+$moreheadcss = '';
+$moreheadjs = '';
+
+//$morejs=array();
+$morejs = array('includes/jquery/plugins/blockUI/jquery.blockUI.js', 'core/js/blockUI.js'); // Used by ecm/tpl/enabledfiletreeajax.tpl.pgp
+if (empty($conf->global->MAIN_ECM_DISABLE_JS)) {
+ $morejs[] = "includes/jquery/plugins/jqueryFileTree/jqueryFileTree.js";
+}
+
+$moreheadjs .= ''."\n";
+
+llxHeader($moreheadcss.$moreheadjs, $langs->trans("ECMArea"), '', '', '', '', $morejs, '', 0, 0);
+
+$head = ecm_prepare_dasboard_head('');
+print dol_get_fiche_head($head, 'index_medias', '', -1, '');
+
+
+// Add filemanager component
+$module = 'medias';
+if (empty($url)) {
+ $url = DOL_URL_ROOT.'/ecm/index_medias.php'; // Must be an url without param
+}
+include DOL_DOCUMENT_ROOT.'/core/tpl/filemanager.tpl.php';
+
+// End of page
+print dol_get_fiche_end();
+
+llxFooter();
+
+$db->close();
diff --git a/htdocs/ecm/search.php b/htdocs/ecm/search.php
index e92a888f21b..4c45ec06403 100644
--- a/htdocs/ecm/search.php
+++ b/htdocs/ecm/search.php
@@ -159,7 +159,7 @@ if (isModEnabled('holiday')) {
if (isModEnabled("banque")) {
$langs->load("banks"); $rowspan++; $sectionauto[] = array('level'=>1, 'module'=>'banque', 'test'=>isModEnabled('banque'), 'label'=>$langs->trans("BankAccount"), 'desc'=>$langs->trans("ECMDocsBy", $langs->transnoentitiesnoconv("BankAccount")));
}
-if (!empty($conf->mrp->enabled)) {
+if (isModEnabled('mrp')) {
$langs->load("mrp"); $rowspan++; $sectionauto[] = array('level'=>1, 'module'=>'mrp-mo', 'test'=>isModEnabled('mrp'), 'label'=>$langs->trans("MOs"), 'desc'=>$langs->trans("ECMDocsBy", $langs->transnoentitiesnoconv("ManufacturingOrders")));
}
if (isModEnabled('recruitment')) {
@@ -172,9 +172,6 @@ if (isModEnabled('recruitment')) {
//***********************
print load_fiche_titre($langs->trans("ECMArea").' - '.$langs->trans("Search"));
-//print $langs->trans("ECMAreaDesc")." ";
-//print $langs->trans("ECMAreaDesc2")." ";
-//print " \n";
print $langs->trans("FeatureNotYetAvailable").'. ';
// Tool bar
diff --git a/htdocs/ecm/tpl/enablefiletreeajax.tpl.php b/htdocs/ecm/tpl/enablefiletreeajax.tpl.php
index 1f5e52e4577..a7e601bf053 100644
--- a/htdocs/ecm/tpl/enablefiletreeajax.tpl.php
+++ b/htdocs/ecm/tpl/enablefiletreeajax.tpl.php
@@ -24,6 +24,7 @@ if (empty($conf) || !is_object($conf)) {
print "Error, template enablefiletreeajax.tpl.php can't be called as URL";
exit;
}
+// Must have set $module, $nameforformuserfile, $preopened
?>
@@ -57,7 +58,7 @@ $(document).ready(function() {
multiFolder: false },
// Called if we click on a file (not a dir)
function(file) {
- console.log("We click on a file");
+ console.log("We click on a file "+file);
$("#mesg").hide();
loadandshowpreview(file,0);
},
@@ -65,7 +66,7 @@ $(document).ready(function() {
function(elem) {
id=elem.attr('id').substr(12); // We get id that is 'fmdirlia_id_xxx' (id we want is xxx)
rel=elem.attr('rel')
- console.log("We click on a dir, we call the ajaxdirtree.php with modulepart=, param=");
+ console.log("We click on a dir id="+id+", we call the ajaxdirtree.php with modulepart=, param=");
console.log("We also save id and dir name into _section_id|dir (vars into form to attach new file in filemanager.tpl.php) with id="+id+" and rel="+rel);
jQuery("#_section_dir").val(rel);
jQuery("#_section_id").val(id);
diff --git a/htdocs/emailcollector/class/emailcollector.class.php b/htdocs/emailcollector/class/emailcollector.class.php
index f5da262e0c1..8d72666ad53 100644
--- a/htdocs/emailcollector/class/emailcollector.class.php
+++ b/htdocs/emailcollector/class/emailcollector.class.php
@@ -28,12 +28,12 @@ require_once DOL_DOCUMENT_ROOT .'/core/class/commonobject.class.php';
require_once DOL_DOCUMENT_ROOT .'/core/lib/files.lib.php';
require_once DOL_DOCUMENT_ROOT .'/comm/propal/class/propal.class.php'; // Customer Proposal
-require_once DOL_DOCUMENT_ROOT .'/commande/class/commande.class.php'; // Customer Order
+require_once DOL_DOCUMENT_ROOT .'/commande/class/commande.class.php'; // Sale Order
require_once DOL_DOCUMENT_ROOT .'/compta/facture/class/facture.class.php'; // Customer Invoice
require_once DOL_DOCUMENT_ROOT .'/contact/class/contact.class.php'; // Contact / Address
require_once DOL_DOCUMENT_ROOT .'/expedition/class/expedition.class.php'; // Shipping / Delivery
-require_once DOL_DOCUMENT_ROOT .'/fourn/class/fournisseur.commande.class.php'; // Supplier Order
-require_once DOL_DOCUMENT_ROOT .'/fourn/class/fournisseur.facture.class.php'; // Supplier Invoice
+require_once DOL_DOCUMENT_ROOT .'/fourn/class/fournisseur.commande.class.php'; // Purchase Order
+require_once DOL_DOCUMENT_ROOT .'/fourn/class/fournisseur.facture.class.php'; // Purchase Invoice
require_once DOL_DOCUMENT_ROOT .'/projet/class/project.class.php'; // Project
require_once DOL_DOCUMENT_ROOT .'/reception/class/reception.class.php'; // Reception
require_once DOL_DOCUMENT_ROOT .'/recruitment/class/recruitmentcandidature.class.php'; // Recruiting
@@ -1766,7 +1766,7 @@ class EmailCollector extends CommonObject
if ($reg[1] == 'pro') { // Customer Proposal
$objectemail = new Propal($this->db);
}
- if ($reg[1] == 'ord') { // Customer Order
+ if ($reg[1] == 'ord') { // Sale Order
$objectemail = new Commande($this->db);
}
if ($reg[1] == 'shi') { // Shipment
diff --git a/htdocs/eventorganization/class/conferenceorboothattendee.class.php b/htdocs/eventorganization/class/conferenceorboothattendee.class.php
index 222a0c78946..909758ca3f2 100644
--- a/htdocs/eventorganization/class/conferenceorboothattendee.class.php
+++ b/htdocs/eventorganization/class/conferenceorboothattendee.class.php
@@ -103,12 +103,13 @@ class ConferenceOrBoothAttendee extends CommonObject
public $fields = array(
'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>0, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'comment'=>"Id"),
'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>'1', 'position'=>10, 'notnull'=>1, 'visible'=>2, 'index'=>1, 'comment'=>"Reference of object"),
- 'fk_actioncomm' => array('type'=>'integer:ActionComm:comm/action/class/actioncomm.class.php:1', 'label'=>'ConferenceOrBooth', 'enabled'=>'1', 'position'=>55, 'notnull'=>0, 'visible'=>0, 'index'=>1, 'picto'=>'agenda'),
+ 'fk_actioncomm' => array('type'=>'integer:ActionComm:comm/action/class/actioncomm.class.php:1', 'label'=>'ConferenceOrBooth', 'enabled'=>'1', 'position'=>15, 'notnull'=>0, 'visible'=>0, 'index'=>1, 'picto'=>'agenda'),
'fk_project' => array('type'=>'integer:Project:projet/class/project.class.php:1', 'label'=>'Project', 'enabled'=>"isModEnabled('project')", 'position'=>20, 'notnull'=>1, 'visible'=>0, 'index'=>1, 'picto'=>'project', 'css'=>'tdoverflowmax150 maxwidth500'),
'email' => array('type'=>'mail', 'label'=>'EmailAttendee', 'enabled'=>'1', 'position'=>30, 'notnull'=>1, 'visible'=>1, 'index'=>1, 'autofocusoncreate'=>1, 'searchall'=>1),
'firstname' => array('type'=>'varchar(100)', 'label'=>'Firstname', 'enabled'=>'1', 'position'=>31, 'notnull'=>0, 'visible'=>1, 'index'=>1, 'searchall'=>1),
'lastname' => array('type'=>'varchar(100)', 'label'=>'Lastname', 'enabled'=>'1', 'position'=>32, 'notnull'=>0, 'visible'=>1, 'index'=>1, 'searchall'=>1),
'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:status = 1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'ThirdParty', 'enabled'=>'$conf->societe->enabled', 'position'=>40, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'help'=>"OrganizationEventLinkToThirdParty", 'picto'=>'company', 'css'=>'tdoverflowmax150 maxwidth500'),
+ 'email_company' => array('type'=>'mail', 'label'=>'EmailCompany', 'enabled'=>'1', 'position'=>41, 'notnull'=>0, 'visible'=>-2, 'searchall'=>1),
'date_subscription' => array('type'=>'datetime', 'label'=>'DateOfRegistration', 'enabled'=>'1', 'position'=>56, 'notnull'=>1, 'visible'=>1, 'showoncombobox'=>'1',),
'fk_invoice' => array('type'=>'integer:Facture:compta/facture/class/facture.class.php', 'label'=>'Invoice', 'enabled'=>'$conf->facture->enabled', 'position'=>57, 'notnull'=>0, 'visible'=>-1, 'index'=>0, 'picto'=>'bill', 'css'=>'tdoverflowmax150 maxwidth500'),
'amount' => array('type'=>'price', 'label'=>'AmountPaid', 'enabled'=>'1', 'position'=>57, 'notnull'=>0, 'visible'=>1, 'default'=>'null', 'isameasure'=>'1', 'help'=>"AmountOfSubscriptionPaid",),
@@ -125,11 +126,13 @@ class ConferenceOrBoothAttendee extends CommonObject
);
public $rowid;
public $ref;
- public $fk_soc;
public $fk_actioncomm;
+ public $fk_project;
public $email;
public $firstname;
public $lastname;
+ public $fk_soc;
+ public $email_company;
public $date_subscription;
public $fk_invoice;
public $amount;
diff --git a/htdocs/eventorganization/conferenceorbooth_card.php b/htdocs/eventorganization/conferenceorbooth_card.php
index 46e41dec78e..b6932c2cf09 100644
--- a/htdocs/eventorganization/conferenceorbooth_card.php
+++ b/htdocs/eventorganization/conferenceorbooth_card.php
@@ -203,7 +203,7 @@ if (!empty($withproject)) {
$morehtmlref .= $projectstatic->title;
// Thirdparty
if (isset($projectstatic->thirdparty->id) && $projectstatic->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$projectstatic->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$projectstatic->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '';
diff --git a/htdocs/eventorganization/conferenceorbooth_contact.php b/htdocs/eventorganization/conferenceorbooth_contact.php
index 2c304bd8562..7810114aec1 100644
--- a/htdocs/eventorganization/conferenceorbooth_contact.php
+++ b/htdocs/eventorganization/conferenceorbooth_contact.php
@@ -187,7 +187,7 @@ if (!empty($withproject)) {
$morehtmlref .= $projectstatic->title;
// Thirdparty
if (isset($projectstatic->thirdparty->id) && $projectstatic->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$projectstatic->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$projectstatic->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '';
diff --git a/htdocs/eventorganization/conferenceorbooth_document.php b/htdocs/eventorganization/conferenceorbooth_document.php
index 56b34f68b03..78f74ded42d 100644
--- a/htdocs/eventorganization/conferenceorbooth_document.php
+++ b/htdocs/eventorganization/conferenceorbooth_document.php
@@ -160,7 +160,7 @@ if (!empty($withproject)) {
$morehtmlref .= $projectstatic->title;
// Thirdparty
if (isset($projectstatic->thirdparty->id) && $projectstatic->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$projectstatic->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$projectstatic->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '';
diff --git a/htdocs/eventorganization/conferenceorbooth_list.php b/htdocs/eventorganization/conferenceorbooth_list.php
index 520435c9cdc..f69d86c62e7 100644
--- a/htdocs/eventorganization/conferenceorbooth_list.php
+++ b/htdocs/eventorganization/conferenceorbooth_list.php
@@ -287,7 +287,7 @@ if ($projectid > 0) {
$morehtmlref .= $project->title;
// Thirdparty
if (isset($project->thirdparty->id) && $project->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$project->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$project->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '';
@@ -348,8 +348,15 @@ if ($projectid > 0) {
}
print '';
- // Date start - end
- print ''.$langs->trans("DateStart").' - '.$langs->trans("DateEnd").' ';
+ // Budget
+ print ' '.$langs->trans("Budget").' ';
+ if (strcmp($project->budget_amount, '')) {
+ print ''.price($project->budget_amount, '', $langs, 1, 0, 0, $conf->currency).' ';
+ }
+ print ' ';
+
+ // Date start - end project
+ print ''.$langs->trans("Dates").' ('.$langs->trans("Project").') ';
$start = dol_print_date($project->date_start, 'day');
print ($start ? $start : '?');
$end = dol_print_date($project->date_end, 'day');
@@ -360,13 +367,23 @@ if ($projectid > 0) {
}
print ' ';
- // Budget
- print ''.$langs->trans("Budget").' ';
- if (strcmp($project->budget_amount, '')) {
- print price($project->budget_amount, '', $langs, 1, 0, 0, $conf->currency);
+ // Date start - end of event
+ print ' '.$langs->trans("Dates").' ('.$langs->trans("Event").') ';
+ $start = dol_print_date($project->date_start_event, 'day');
+ print ($start ? $start : '?');
+ $end = dol_print_date($project->date_end_event, 'day');
+ print ' - ';
+ print ($end ? $end : '?');
+ if ($object->hasDelay()) {
+ print img_warning("Late");
}
print ' ';
+ // Location event
+ print ''.$langs->trans("Location").' ';
+ print $project->location;
+ print ' ';
+
// Other attributes
$cols = 2;
$objectconf = $object;
diff --git a/htdocs/eventorganization/conferenceorboothattendee_card.php b/htdocs/eventorganization/conferenceorboothattendee_card.php
index 20d7e588bf3..9bab2a7f49d 100644
--- a/htdocs/eventorganization/conferenceorboothattendee_card.php
+++ b/htdocs/eventorganization/conferenceorboothattendee_card.php
@@ -234,7 +234,7 @@ if (!empty($withproject)) {
$morehtmlref .= $projectstatic->title;
// Thirdparty
if ($projectstatic->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$projectstatic->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$projectstatic->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '';
diff --git a/htdocs/eventorganization/conferenceorboothattendee_list.php b/htdocs/eventorganization/conferenceorboothattendee_list.php
index 167a79959f5..1bc9c12d4f6 100644
--- a/htdocs/eventorganization/conferenceorboothattendee_list.php
+++ b/htdocs/eventorganization/conferenceorboothattendee_list.php
@@ -413,7 +413,7 @@ if ($projectstatic->id > 0 || $confOrBooth > 0) {
$morehtmlref .= $projectstatic->title;
// Thirdparty
if ($projectstatic->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$projectstatic->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$projectstatic->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '';
@@ -474,8 +474,15 @@ if ($projectstatic->id > 0 || $confOrBooth > 0) {
}
print '';
- // Date start - end
- print ''.$langs->trans("DateStart").' - '.$langs->trans("DateEnd").' ';
+ // Budget
+ print ' '.$langs->trans("Budget").' ';
+ if (strcmp($projectstatic->budget_amount, '')) {
+ print ''.price($projectstatic->budget_amount, '', $langs, 1, 0, 0, $conf->currency).' ';
+ }
+ print ' ';
+
+ // Date start - end project
+ print ''.$langs->trans("Dates").' ('.$langs->trans("Project").') ';
$start = dol_print_date($projectstatic->date_start, 'day');
print ($start ? $start : '?');
$end = dol_print_date($projectstatic->date_end, 'day');
@@ -486,13 +493,23 @@ if ($projectstatic->id > 0 || $confOrBooth > 0) {
}
print ' ';
- // Budget
- print ''.$langs->trans("Budget").' ';
- if (strcmp($projectstatic->budget_amount, '')) {
- print price($projectstatic->budget_amount, '', $langs, 1, 0, 0, $conf->currency);
+ // Date start - end of event
+ print ' '.$langs->trans("Dates").' ('.$langs->trans("Event").') ';
+ $start = dol_print_date($projectstatic->date_start_event, 'day');
+ print ($start ? $start : '?');
+ $end = dol_print_date($projectstatic->date_end_event, 'day');
+ print ' - ';
+ print ($end ? $end : '?');
+ if ($projectstatic->hasDelay()) {
+ print img_warning("Late");
}
print ' ';
+ // Location event
+ print ''.$langs->trans("Location").' ';
+ print $projectstatic->location;
+ print ' ';
+
// Other attributes
$cols = 2;
$objectconf = $object;
diff --git a/htdocs/expedition/card.php b/htdocs/expedition/card.php
index 6d31298e3c2..ab8c4a28cbc 100644
--- a/htdocs/expedition/card.php
+++ b/htdocs/expedition/card.php
@@ -65,7 +65,7 @@ if (isModEnabled('project')) {
// Load translation files required by the page
$langs->loadLangs(array("sendings", "companies", "bills", 'deliveries', 'orders', 'stocks', 'other', 'propal'));
-if (!empty($conf->incoterm->enabled)) {
+if (isModEnabled('incoterm')) {
$langs->load('incoterm');
}
if (isModEnabled('productbatch')) {
@@ -164,7 +164,7 @@ if (empty($reshook)) {
}
// Set incoterm
- if ($action == 'set_incoterms' && !empty($conf->incoterm->enabled)) {
+ if ($action == 'set_incoterms' && isModEnabled('incoterm')) {
$result = $object->setIncoterms(GETPOST('incoterm_id', 'int'), GETPOST('location_incoterms', 'alpha'));
}
@@ -224,6 +224,8 @@ if (empty($reshook)) {
$object->size_units = GETPOST('size_units', 'int');
$object->weight_units = GETPOST('weight_units', 'int');
+ $product = new Product($db);
+
// We will loop on each line of the original document to complete the shipping object with various info and quantity to deliver
$classname = ucfirst($object->origin);
$objectsrc = new $classname($db);
@@ -259,7 +261,17 @@ if (empty($reshook)) {
$stockLocation = "ent1".$i."_0";
$qty = "qtyl".$i;
- if (isModEnabled('productbatch') && $objectsrc->lines[$i]->product_tobatch) { // If product need a batch number
+ $is_batch_or_serial=0;
+ if (!empty($objectsrc->lines[$i]->fk_product)) {
+ $resultFetch = $product->fetch($objectsrc->lines[$i]->fk_product, '', '', '', 1, 1, 1);
+ if ($resultFetch < 0) {
+ setEventMessages($product->error, $product->errors, 'errors');
+ }
+ $is_batch_or_serial = $product->status_batch;
+ }
+
+ // If product need a batch or serial number
+ if (isModEnabled('productbatch') && $objectsrc->lines[$i]->product_tobatch) {
if (GETPOSTISSET($batch)) {
//shipment line with batch-enable product
$qty .= '_'.$j;
@@ -274,6 +286,12 @@ if (empty($reshook)) {
//var_dump($sub_qty[$j]['q']);
//var_dump($sub_qty[$j]['id_batch']);
+ //var_dump($qty);var_dump($batch);var_dump($sub_qty[$j]['q']);var_dump($sub_qty[$j]['id_batch']);
+ if ($is_batch_or_serial==2 && $sub_qty[$j]['q']>1) {
+ setEventMessages($langs->trans("TooManyQtyForSerialNumber", $product->ref, ''), null, 'errors');
+ $totalqty=0;
+ break 2;
+ }
$j++;
$batch = "batchl".$i."_".$j;
$qty = "qtyl".$i.'_'.$j;
@@ -328,7 +346,6 @@ if (empty($reshook)) {
}
//var_dump($batch_line[2]);
-
if ($totalqty > 0 && !$error) { // There is at least one thing to ship and no error
for ($i = 0; $i < $num; $i++) {
$qty = "qtyl".$i;
@@ -1009,7 +1026,7 @@ if ($action == 'create') {
// Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
print '';
print ''.$form->textwithpicto($langs->trans("IncotermLabel"), $object->label_incoterms, 1).' ';
print '';
@@ -1143,7 +1160,7 @@ if ($action == 'create') {
$product_static->status_buy = $line->product_tobuy;
$product_static->status_batch = $line->product_tobatch;
- $showdescinproductdesc = (getDolGlobalString('PRODUIT_DESC_IN_FORM') == 2 ? 1 : 0);
+ $showdescinproductdesc = getDolGlobalString('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE');
$text = $product_static->getNomUrl(1);
$text .= ' - '.(!empty($line->label) ? $line->label : $line->product_label);
@@ -1742,39 +1759,25 @@ if ($action == 'create') {
$morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_customer', $object->ref_customer, $object, $user->rights->expedition->creer, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", 'ref_customer', $object->ref_customer, $object, $user->rights->expedition->creer, 'string'.(isset($conf->global->THIRDPARTY_REF_INPUT_SIZE) ? ':'.$conf->global->THIRDPARTY_REF_INPUT_SIZE : ''), '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1);
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if (0) { // Do not change on shipment
+ $morehtmlref .= ' ';
+ if (0) { // Do not change on shipment
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- // $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $objectsrc->socid, $objectsrc->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
- // We don't have project on shipment, so we will use the project or source object instead
- // TODO Add project on shipment
- $morehtmlref .= ' : ';
- if (!empty($objectsrc->fk_project)) {
+ if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
$proj = new Project($db);
$proj->fetch($objectsrc->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
@@ -1982,7 +1985,7 @@ if ($action == 'create') {
print ' ';
// Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
print '';
print '';
print $langs->trans('IncotermLabel');
@@ -2202,10 +2205,10 @@ if ($action == 'create') {
$text = $product_static->getNomUrl(1);
$text .= ' - '.$label;
- $description = (!empty($conf->global->PRODUIT_DESC_IN_FORM) ? '' : dol_htmlentitiesbr($lines[$i]->description));
+ $description = (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE') ? '' : dol_htmlentitiesbr($lines[$i]->description));
print $form->textwithtooltip($text, $description, 3, '', '', $i);
print_date_range(!empty($lines[$i]->date_start) ? $lines[$i]->date_start : '', !empty($lines[$i]->date_end) ? $lines[$i]->date_end : '');
- if (!empty($conf->global->PRODUIT_DESC_IN_FORM)) {
+ if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
print (!empty($lines[$i]->description) && $lines[$i]->description != $lines[$i]->product) ? ' '.dol_htmlentitiesbr($lines[$i]->description) : '';
}
print " \n";
diff --git a/htdocs/expedition/class/expedition.class.php b/htdocs/expedition/class/expedition.class.php
index 0790b54daa3..0b8668a6c1a 100644
--- a/htdocs/expedition/class/expedition.class.php
+++ b/htdocs/expedition/class/expedition.class.php
@@ -84,6 +84,13 @@ class Expedition extends CommonObject
*/
public $picto = 'dolly';
+
+ /**
+ * @var array Array with all fields and their property. Do not use it as a static var. It may be modified by constructor.
+ */
+ public $fields = array();
+
+
public $socid;
/**
@@ -733,7 +740,8 @@ class Expedition extends CommonObject
} else {
$qty = $obj->edbqty;
}
- if ($qty <= 0) {
+
+ if ($qty == 0 || ($qty < 0 && !getDolGlobalInt('SHIPMENT_ALLOW_NEGATIVE_QTY'))) {
continue;
}
dol_syslog(get_class($this)."::valid movement index ".$i." ed.rowid=".$obj->rowid." edb.rowid=".$obj->edbrowid);
@@ -2141,8 +2149,9 @@ class Expedition extends CommonObject
}
}
if ($shipments_match_order) {
- dol_syslog("Qty for the ".count($order->lines)." lines of order have same value for shipments with status Expedition::STATUS_CLOSED=".self::STATUS_CLOSED.', so we close order');
- $order->cloture($user);
+ dol_syslog("Qty for the ".count($order->lines)." lines of the origin order is same than qty for lines in the shipment we close (shipments_match_order is true), with new status Expedition::STATUS_CLOSED=".self::STATUS_CLOSED.', so we close order');
+ // We close the order
+ $order->cloture($user); // Note this may also create an invoice if module workflow ask it
}
}
@@ -2242,21 +2251,6 @@ class Expedition extends CommonObject
}
}
- // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
- /**
- * Classify the shipping as invoiced (used when WORKFLOW_BILL_ON_SHIPMENT is on)
- *
- * @deprecated
- * @see setBilled()
- * @return int <0 if ko, >0 if ok
- */
- public function set_billed()
- {
- // phpcs:enable
- dol_syslog(get_class($this)."::set_billed is deprecated, use setBilled instead", LOG_NOTICE);
- return $this->setBilled();
- }
-
/**
* Classify the shipping as invoiced (used when WORKFLOW_BILL_ON_SHIPMENT is on)
*
diff --git a/htdocs/expedition/class/expeditionstats.class.php b/htdocs/expedition/class/expeditionstats.class.php
index 8eb31896f38..aa4e40fcb8f 100644
--- a/htdocs/expedition/class/expeditionstats.class.php
+++ b/htdocs/expedition/class/expeditionstats.class.php
@@ -131,6 +131,54 @@ class ExpeditionStats extends Stats
return $this->_getNbByYear($sql);
}
+ /**
+ * Return the orders amount by month for a year
+ *
+ * @param int $year Year to scan
+ * @param int $format 0=Label of abscissa is a translated text, 1=Label of abscissa is month number, 2=Label of abscissa is first letter of month
+ * @return array Array with amount by month
+ */
+ public function getAmountByMonth($year, $format = 0)
+ {
+ global $user;
+
+ $sql = "SELECT date_format(c.date_valid,'%m') as dm, SUM(c.".$this->field.")";
+ $sql .= " FROM ".$this->from;
+ if (empty($user->rights->societe->client->voir) && !$this->socid) {
+ $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
+ }
+ $sql .= $this->join;
+ $sql .= " WHERE ".$this->where;
+ $sql .= " GROUP BY dm";
+ $sql .= $this->db->order('dm', 'DESC');
+
+ $res = $this->_getAmountByMonth($year, $sql, $format);
+ return $res;
+ }
+
+ /**
+ * Return the orders amount average by month for a year
+ *
+ * @param int $year year for stats
+ * @return array array with number by month
+ */
+ public function getAverageByMonth($year)
+ {
+ global $user;
+
+ $sql = "SELECT date_format(c.date_valid,'%m') as dm, AVG(c.".$this->field.")";
+ $sql .= " FROM ".$this->from;
+ if (empty($user->rights->societe->client->voir) && !$this->socid) {
+ $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
+ }
+ $sql .= $this->join;
+ $sql .= " WHERE ".$this->where;
+ $sql .= " GROUP BY dm";
+ $sql .= $this->db->order('dm', 'DESC');
+
+ return $this->_getAverageByMonth($year, $sql);
+ }
+
/**
* Return nb, total and average
*
diff --git a/htdocs/expedition/contact.php b/htdocs/expedition/contact.php
index 4c540adcd9e..48822121fa3 100644
--- a/htdocs/expedition/contact.php
+++ b/htdocs/expedition/contact.php
@@ -148,39 +148,25 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $form->editfieldkey("RefCustomer", '', $object->ref_customer, $object, $user->rights->expedition->creer, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", '', $object->ref_customer, $object, $user->rights->expedition->creer, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1);
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if (0) { // Do not change on shipment
+ $morehtmlref .= ' ';
+ if (0) { // Do not change on shipment
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- // $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $objectsrc->socid, $objectsrc->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
- // We don't have project on shipment, so we will use the project or source object instead
- // TODO Add project on shipment
- $morehtmlref .= ' : ';
- if (!empty($objectsrc->fk_project)) {
+ if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
$proj = new Project($db);
$proj->fetch($objectsrc->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/expedition/document.php b/htdocs/expedition/document.php
index 71e325677e6..517c1cea8d2 100644
--- a/htdocs/expedition/document.php
+++ b/htdocs/expedition/document.php
@@ -66,8 +66,26 @@ if (!$sortfield) {
$object = new Expedition($db);
-if ($object->fetch($id, $ref)) {
+if ($id > 0 || !empty($ref)) {
+ $object->fetch($id, $ref);
$object->fetch_thirdparty();
+
+ if (!empty($object->origin)) {
+ $typeobject = $object->origin;
+ $origin = $object->origin;
+ $object->fetch_origin();
+ }
+
+ // Linked documents
+ if ($typeobject == 'commande' && $object->$typeobject->id && isModEnabled('commande')) {
+ $objectsrc = new Commande($db);
+ $objectsrc->fetch($object->$typeobject->id);
+ }
+ if ($typeobject == 'propal' && $object->$typeobject->id && isModEnabled("propal")) {
+ $objectsrc = new Propal($db);
+ $objectsrc->fetch($object->$typeobject->id);
+ }
+
$upload_dir = $conf->expedition->dir_output."/sending/".dol_sanitizeFileName($object->ref);
}
@@ -118,43 +136,29 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref = '';
// Ref customer
- $morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
- $morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
+ $morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_customer', $object->ref_customer, $object, 0, 'string', '', 0, 1);
+ $morehtmlref .= $form->editfieldval("RefCustomer", 'ref_customer', $object->ref_customer, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= '
'.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= '
'.$object->thirdparty->getNomUrl(1);
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= '
'.$langs->trans('Project').' ';
- if (0) { // Do not change on shipment
+ $morehtmlref .= '
';
+ if (0) { // Do not change on shipment
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- // $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $objectsrc->socid, $objectsrc->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
- // We don't have project on shipment, so we will use the project or source object instead
- // TODO Add project on shipment
- $morehtmlref .= ' : ';
if (!empty($objectsrc->fk_project)) {
$proj = new Project($db);
$proj->fetch($objectsrc->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/expedition/list.php b/htdocs/expedition/list.php
index e697c0be6c3..3b06f005787 100644
--- a/htdocs/expedition/list.php
+++ b/htdocs/expedition/list.php
@@ -258,7 +258,7 @@ $helpurl = 'EN:Module_Shipments|FR:Module_Expéditions|ES:Módulo_Ex
llxHeader('', $langs->trans('ListOfSendings'), $helpurl);
$sql = 'SELECT';
-if ($sall || $search_product_category > 0 || $search_user > 0) {
+if ($sall || $search_user > 0) {
$sql = 'SELECT DISTINCT';
}
$sql .= " e.rowid, e.ref, e.ref_customer, e.date_expedition as date_expedition, e.weight, e.weight_units, e.date_delivery as delivery_date, e.fk_statut, e.billed, e.tracking_number, e.fk_shipping_method,";
@@ -288,13 +288,10 @@ $sql .= " FROM ".MAIN_DB_PREFIX."expedition as e";
if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (e.rowid = ef.fk_object)";
}
-if ($sall || $search_product_category > 0) {
+if ($sall) {
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'expeditiondet as ed ON e.rowid=ed.fk_expedition';
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'commandedet as pd ON pd.rowid=ed.fk_origin_line';
}
-if ($search_product_category > 0) {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_product as cp ON cp.fk_product=pd.fk_product';
-}
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = e.fk_soc";
if (($search_categ_cus > 0) || ($search_categ_cus == -2)) {
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_societe as cc ON s.rowid = cc.fk_soc"; // We'll need this table joined to the select in order to filter by categ
@@ -326,9 +323,7 @@ $reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object
$sql .= $hookmanager->resPrint;
$sql .= " WHERE e.entity IN (".getEntity('expedition').")";
-if ($search_product_category > 0) {
- $sql .= " AND cp.fk_categorie = ".((int) $search_product_category);
-}
+
if ($socid > 0) {
$sql .= " AND s.rowid = ".((int) $socid);
}
@@ -408,7 +403,36 @@ if ($search_categ_cus > 0) {
if ($search_categ_cus == -2) {
$sql .= " AND cc.fk_categorie IS NULL";
}
-
+// Search for tag/category ($searchCategoryProductList is an array of ID)
+$searchCategoryProductOperator = -1;
+$searchCategoryProductList = array($search_product_category);
+if (!empty($searchCategoryProductList)) {
+ $searchCategoryProductSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategoryProductList as $searchCategoryProduct) {
+ if (intval($searchCategoryProduct) == -2) {
+ $searchCategoryProductSqlList[] = "NOT EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."expeditiondet as ed, ".MAIN_DB_PREFIX."commandedet as cd WHERE ed.fk_expedition = e.rowid AND ed.fk_origin_line = cd.rowid AND cd.fk_product = ck.fk_product)";
+ } elseif (intval($searchCategoryProduct) > 0) {
+ if ($searchCategoryProductOperator == 0) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."expeditiondet as ed, ".MAIN_DB_PREFIX."commandedet as cd WHERE ed.fk_expedition = e.rowid AND ed.fk_origin_line = cd.rowid AND cd.fk_product = ck.fk_product AND ck.fk_categorie = ".((int) $searchCategoryProduct).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProduct);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."expeditiondet as ed, ".MAIN_DB_PREFIX."commandedet as cd WHERE ed.fk_expedition = e.rowid AND ed.fk_origin_line = cd.rowid AND cd.fk_product = ck.fk_product AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategoryProductOperator == 1) {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
+ }
+ }
+}
// Add where from extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
@@ -526,7 +550,7 @@ $param .= $hookmanager->resPrint;
$arrayofmassactions = array(
'builddoc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
- 'classifyclose'=>$langs->trans("Close"),
+ 'classifyclose' => img_picto('', 'stop-circle', 'class="pictofixedwidth"').$langs->trans("Close"),
'presend' => img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
);
if (in_array($massaction, array('presend'))) {
@@ -593,7 +617,7 @@ if (isModEnabled('categorie') && $user->rights->categorie->lire && ($user->right
$moreforfilter .= img_picto($tmptitle, 'category');
//$cate_arbo = $form->select_all_categories(Categorie::TYPE_PRODUCT, null, 'parent', null, null, 1);
//$moreforfilter .= $form->selectarray('search_product_category', $cate_arbo, $search_product_category, 1, 0, 0, '', 0, 0, 0, 0, 'maxwidth300', 1);
- $moreforfilter .= $formother->select_categories(Categorie::TYPE_PRODUCT, $search_product_category, 'parent', 1, $tmptitle);
+ $moreforfilter .= $formother->select_categories(Categorie::TYPE_PRODUCT, $search_product_category, 'search_product_category', 1, $tmptitle);
$moreforfilter .= '
';
}
diff --git a/htdocs/expedition/note.php b/htdocs/expedition/note.php
index d23bb0298ea..4401af0b20c 100644
--- a/htdocs/expedition/note.php
+++ b/htdocs/expedition/note.php
@@ -109,39 +109,25 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $form->editfieldkey("RefCustomer", '', $object->ref_customer, $object, $user->rights->expedition->creer, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefCustomer", '', $object->ref_customer, $object, $user->rights->expedition->creer, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1);
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if (0) { // Do not change on shipment
+ $morehtmlref .= ' ';
+ if (0) { // Do not change on shipment
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- // $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $objectsrc->socid, $objectsrc->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
- // We don't have project on shipment, so we will use the project or source object instead
- // TODO Add project on shipment
- $morehtmlref .= ' : ';
- if (!empty($objectsrc->fk_project)) {
+ if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
$proj = new Project($db);
$proj->fetch($objectsrc->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/expedition/shipment.php b/htdocs/expedition/shipment.php
index 7619ef140f8..9394269a03a 100644
--- a/htdocs/expedition/shipment.php
+++ b/htdocs/expedition/shipment.php
@@ -161,7 +161,7 @@ if (empty($reshook)) {
if ($result < 0) {
setEventMessages($object->error, $object->errors, 'errors');
}
- } elseif ($action == 'set_incoterms' && !empty($conf->incoterm->enabled)) {
+ } elseif ($action == 'set_incoterms' && isModEnabled('incoterm')) {
// Set incoterm
$result = $object->setIncoterms(GETPOST('incoterm_id', 'int'), GETPOST('location_incoterms', 'alpha'));
if ($result < 0) {
@@ -283,39 +283,28 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref = '';
// Ref customer
- $morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, $user->rights->commande->creer, 'string', '', 0, 1);
- $morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, $user->rights->commande->creer, 'string', '', null, null, '', 1);
+ $morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_customer', $object->ref_client, $object, $user->rights->commande->creer, 'string', '', 0, 1);
+ $morehtmlref .= $form->editfieldval("RefCustomer", 'ref_customer', $object->ref_client, $object, $user->rights->commande->creer, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= '
'.$langs->trans('ThirdParty').' : '.$soc->getNomUrl(1);
+ $morehtmlref .= '
'.$soc->getNomUrl(1);
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= '
'.$langs->trans('Project').' ';
- if ($user->rights->commande->creer) {
+ $morehtmlref .= '
';
+ if (0) { // Do not change on shipment
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $objectsrc->socid, $objectsrc->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
- if (!empty($object->fk_project)) {
+ if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
$proj = new Project($db);
- $proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $proj->fetch($objectsrc->fk_project);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
@@ -523,7 +512,7 @@ if ($id > 0 || !empty($ref)) {
// TODO How record was recorded OrderMode (llx_c_input_method)
// Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
print '
';
print '';
print $langs->trans('IncotermLabel');
@@ -733,7 +722,7 @@ if ($id > 0 || !empty($ref)) {
$text = $product_static->getNomUrl(1);
$text .= ' - '.$label;
- $description = ($conf->global->PRODUIT_DESC_IN_FORM ? '' : dol_htmlentitiesbr($objp->description)).' ';
+ $description = (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE') ? '' : dol_htmlentitiesbr($objp->description)).' ';
$description .= $product_static->show_photos('product', $conf->product->multidir_output[$product_static->entity], 1, 1, 0, 0, 0, 80);
print $form->textwithtooltip($text, $description, 3, '', '', $i);
@@ -741,7 +730,7 @@ if ($id > 0 || !empty($ref)) {
print_date_range($db->jdate($objp->date_start), $db->jdate($objp->date_end));
// Add description in form
- if (!empty($conf->global->PRODUIT_DESC_IN_FORM)) {
+ if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
print ($objp->description && $objp->description != $objp->product_label) ? ' '.dol_htmlentitiesbr($objp->description) : '';
}
diff --git a/htdocs/expedition/stats/month.php b/htdocs/expedition/stats/month.php
index 34842efaaf3..398bc381715 100644
--- a/htdocs/expedition/stats/month.php
+++ b/htdocs/expedition/stats/month.php
@@ -47,11 +47,12 @@ $WIDTH = DolGraph::getDefaultGraphSizeForStats('width');
$HEIGHT = DolGraph::getDefaultGraphSizeForStats('height');
$mesg = '';
+$mode = '';
print load_fiche_titre($langs->trans("StatisticsOfSendings").' '.$year, $mesg);
-$stats = new ExpeditionStats($db);
-$data = $stats->getNbExpeditionByMonth($year);
+$stats = new ExpeditionStats($db, $socid, $mode);
+$data = $stats->getNbByMonth($year);
dol_mkdir($conf->expedition->dir_temp);
diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php
index bb4f41861ec..33ec1fede7b 100644
--- a/htdocs/expensereport/card.php
+++ b/htdocs/expensereport/card.php
@@ -418,7 +418,7 @@ if (empty($reshook)) {
// FROM
$expediteur = new User($db);
$expediteur->fetch($object->fk_user_author);
- $emailFrom = $expediteur->email;
+ $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
if ($emailTo && $emailFrom) {
$filename = array(); $filedir = array(); $mimetype = array();
@@ -525,7 +525,7 @@ if (empty($reshook)) {
// FROM
$expediteur = new User($db);
$expediteur->fetch($object->fk_user_author);
- $emailFrom = $expediteur->email;
+ $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
if ($emailFrom && $emailTo) {
$filename = array(); $filedir = array(); $mimetype = array();
@@ -641,7 +641,7 @@ if (empty($reshook)) {
// FROM
$expediteur = new User($db);
$expediteur->fetch($object->fk_user_approve > 0 ? $object->fk_user_approve : $object->fk_user_validator);
- $emailFrom = $expediteur->email;
+ $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
if ($emailFrom && $emailTo) {
$filename = array(); $filedir = array(); $mimetype = array();
@@ -749,7 +749,7 @@ if (empty($reshook)) {
// FROM
$expediteur = new User($db);
$expediteur->fetch($object->fk_user_refuse);
- $emailFrom = $expediteur->email;
+ $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
if ($emailFrom && $emailTo) {
$filename = array(); $filedir = array(); $mimetype = array();
@@ -863,7 +863,7 @@ if (empty($reshook)) {
// FROM
$expediteur = new User($db);
$expediteur->fetch($object->fk_user_cancel);
- $emailFrom = $expediteur->email;
+ $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
if ($emailFrom && $emailTo) {
$filename = array(); $filedir = array(); $mimetype = array();
@@ -1043,7 +1043,7 @@ if (empty($reshook)) {
// FROM
$expediteur = new User($db);
$expediteur->fetch($user->id);
- $emailFrom = $expediteur->email;
+ $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
if ($emailFrom && $emailTo) {
$filename = array(); $filedir = array(); $mimetype = array();
@@ -1694,44 +1694,6 @@ if ($action == 'create') {
$linkback = ''.$langs->trans("BackToList").' ';
$morehtmlref = '';
- /*
- // Ref customer
- $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, $user->rights->commande->creer, 'string', '', 0, 1);
- $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, $user->rights->commande->creer, 'string', '', null, null, '', 1);
- // Thirdparty
- $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . $soc->getNomUrl(1);
- // Project
- if (isModEnabled('project'))
- {
- $langs->load("projects");
- $morehtmlref.='
'.$langs->trans('Project') . ' ';
- if ($user->rights->commande->creer)
- {
- if ($action != 'classify')
- $morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref.='
';
- $morehtmlref.=' ';
- $morehtmlref.=' ';
- $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref.=' ';
- $morehtmlref.=' ';
- } else {
- $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
- }
- } else {
- if (!empty($object->fk_project)) {
- $proj = new Project($db);
- $proj->fetch($object->fk_project);
- $morehtmlref.='
';
- $morehtmlref.=$proj->ref;
- $morehtmlref.=' ';
- } else {
- $morehtmlref.='';
- }
- }
- }*/
$morehtmlref .= '
';
dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php
index 896bb29cf43..f1e6cf355db 100644
--- a/htdocs/expensereport/list.php
+++ b/htdocs/expensereport/list.php
@@ -532,7 +532,7 @@ if ($resql) {
}
$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
- $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
+ $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
print '';
@@ -540,6 +540,13 @@ if ($resql) {
// Filters
print '
';
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons('left');
+ print $searchpicto;
+ print ' ';
+ }
if (!empty($arrayfields['d.ref']['checked'])) {
print '';
print ' ';
@@ -626,14 +633,19 @@ if ($resql) {
print ' ';
}
// Action column
- print '';
- $searchpicto = $form->showFilterButtons();
- print $searchpicto;
- print ' ';
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons();
+ print $searchpicto;
+ print ' ';
+ }
print " \n";
print '
';
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
+ }
if (!empty($arrayfields['d.ref']['checked'])) {
print_liste_field_titre($arrayfields['d.ref']['label'], $_SERVER["PHP_SELF"], "d.ref", "", $param, '', $sortfield, $sortorder);
}
@@ -676,7 +688,9 @@ if ($resql) {
if (!empty($arrayfields['d.fk_statut']['checked'])) {
print_liste_field_titre($arrayfields['d.fk_statut']['label'], $_SERVER["PHP_SELF"], "d.fk_statut", "", $param, 'align="right"', $sortfield, $sortorder);
}
- print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
+ }
print " \n";
$total_total_ht = 0;
@@ -712,6 +726,18 @@ if ($resql) {
print '
';
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->rowid, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
// Ref
if (!empty($arrayfields['d.ref']['checked'])) {
print '';
@@ -856,15 +882,17 @@ if ($resql) {
}
}
// Action column
- print ' ';
- if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
- $selected = 0;
- if (in_array($obj->rowid, $arrayofselected)) {
- $selected = 1;
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print ' ';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->rowid, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
}
- print ' ';
+ print ' ';
}
- print '';
if (!$i) {
$totalarray['nbfield']++;
}
diff --git a/htdocs/expensereport/payment/card.php b/htdocs/expensereport/payment/card.php
index 316dccd91d8..db6c21e202f 100644
--- a/htdocs/expensereport/payment/card.php
+++ b/htdocs/expensereport/payment/card.php
@@ -238,12 +238,13 @@ if ($resql) {
*/
print '';
+// Delete
if ($action == '') {
if ($user->rights->expensereport->supprimer) {
if (!$disable_delete) {
- print '
'.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', 1);
} else {
- print '
'.$langs->trans('Delete').' ';
+ print dolGetButtonAction($title_button, $langs->trans("Delete"), 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', 0);
}
}
}
diff --git a/htdocs/expensereport/stats/index.php b/htdocs/expensereport/stats/index.php
index b4d11320411..e9fdd03a2be 100644
--- a/htdocs/expensereport/stats/index.php
+++ b/htdocs/expensereport/stats/index.php
@@ -54,7 +54,7 @@ if ($user->socid) {
}
$result = restrictedArea($user, 'expensereport', $id, '');
-$nowyear = strftime("%Y", dol_now());
+$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$year = GETPOST('year') > 0 ? GETPOST('year', 'int') : $nowyear;
$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS)));
$endyear = $year;
diff --git a/htdocs/exports/class/export.class.php b/htdocs/exports/class/export.class.php
index 883ba7ea11e..cf0383dd08c 100644
--- a/htdocs/exports/class/export.class.php
+++ b/htdocs/exports/class/export.class.php
@@ -700,7 +700,7 @@ class Export
// Export of compute field does not work. $obj contains $obj->alias_field and formula may contains $obj->field
// Also the formula may contains objects of class that are not loaded.
$computestring = $this->array_export_special[$indice][$key];
- //$tmp = dol_eval($computestring, 1, 0);
+ //$tmp = dol_eval($computestring, 1, 0, '1');
//$obj->$alias = $tmp;
$this->error = "ERROPNOTSUPPORTED. Operation ".$computestring." not supported. Export of 'computed' extrafields is not yet supported, please remove field.";
diff --git a/htdocs/fichinter/card-rec.php b/htdocs/fichinter/card-rec.php
index 6c07ec6837d..2f82b16e1ad 100644
--- a/htdocs/fichinter/card-rec.php
+++ b/htdocs/fichinter/card-rec.php
@@ -741,11 +741,9 @@ if ($action == 'create') {
print $langs->trans("AddIntervention").'
';
}
- if ($user->rights->ficheinter->supprimer) {
- print '';
- }
+ // Delete
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $user->rights->ficheinter->supprimer);
+
print '';
} else {
print $langs->trans("ErrorRecordNotFound");
diff --git a/htdocs/fichinter/card.php b/htdocs/fichinter/card.php
index 8b3868bf195..89205de02d5 100644
--- a/htdocs/fichinter/card.php
+++ b/htdocs/fichinter/card.php
@@ -104,6 +104,7 @@ $result = restrictedArea($user, 'ficheinter', $id, 'fichinter');
$permissionnote = $user->rights->ficheinter->creer; // Used by the include of actions_setnotes.inc.php
$permissiondellink = $user->rights->ficheinter->creer; // Used by the include of actions_dellink.inc.php
+$permissiontodelete = (($object->statut == Fichinter::STATUS_DRAFT && $user->rights->ficheinter->creer) || $user->rights->ficheinter->supprimer);
/*
@@ -1158,7 +1159,7 @@ if ($action == 'create') {
$morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, $user->rights->ficheinter->creer, 'string', '', 0, 1);
$morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, $user->rights->ficheinter->creer, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ''.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'customer');
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1, 'customer');
// Project
if (isModEnabled('project')) {
$langs->load("projects");
@@ -1688,10 +1689,7 @@ if ($action == 'create') {
}
// Delete
- if (($object->statut == Fichinter::STATUS_DRAFT && $user->rights->ficheinter->creer) || $user->rights->ficheinter->supprimer) {
- print '';
- }
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete);
}
}
}
@@ -1715,6 +1713,19 @@ if ($action == 'create') {
$linktoelem = $form->showLinkToObjectBlock($object, null, array('fichinter'));
$somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
+ // Show direct download link
+ if ($object->statut != Fichinter::STATUS_DRAFT && !empty($conf->global->FICHINTER_ALLOW_EXTERNAL_DOWNLOAD)) {
+ print ' '."\n";
+ print showDirectDownloadLink($object).' ';
+ }
+
+ // Show online signature link
+ if ($object->statut != Fichinter::STATUS_DRAFT && !empty($conf->global->FICHINTER_ALLOW_ONLINE_SIGN)) {
+ print ' ';
+ require_once DOL_DOCUMENT_ROOT.'/core/lib/signature.lib.php';
+
+ print showOnlineSignatureUrl('fichinter', $object->ref).' ';
+ }
print '';
diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php
index 7a5f3bc73ad..e36598d04bc 100644
--- a/htdocs/fichinter/class/fichinter.class.php
+++ b/htdocs/fichinter/class/fichinter.class.php
@@ -442,7 +442,7 @@ class Fichinter extends CommonObject
$sql .= " f.datec, f.dateo, f.datee, f.datet, f.fk_user_author,";
$sql .= " f.date_valid as datev,";
$sql .= " f.tms as datem,";
- $sql .= " f.duree, f.fk_projet as fk_project, f.note_public, f.note_private, f.model_pdf, f.extraparams, fk_contrat, f.entity as entity";
+ $sql .= " f.duree, f.fk_projet as fk_project, f.note_public, f.note_private, f.model_pdf, f.last_main_doc, f.extraparams, fk_contrat, f.entity as entity";
$sql .= " FROM ".MAIN_DB_PREFIX."fichinter as f";
if ($ref) {
$sql .= " WHERE f.entity IN (".getEntity('intervention').")";
@@ -482,6 +482,8 @@ class Fichinter extends CommonObject
$this->extraparams = (array) json_decode($obj->extraparams, true);
+ $this->last_main_doc = $obj->last_main_doc;
+
if ($this->statut == 0) {
$this->brouillon = 1;
}
diff --git a/htdocs/fichinter/list.php b/htdocs/fichinter/list.php
index 731442695d2..587089c2d35 100644
--- a/htdocs/fichinter/list.php
+++ b/htdocs/fichinter/list.php
@@ -126,8 +126,8 @@ $arrayfields = array(
'f.description'=>array('label'=>'Description', 'checked'=>1),
'f.datec'=>array('label'=>'DateCreation', 'checked'=>0, 'position'=>500),
'f.tms'=>array('label'=>'DateModificationShort', 'checked'=>0, 'position'=>500),
- 'f.note_public'=>array('label'=>'NotePublic', 'checked'=>0, 'position'=>510, 'enabled'=>(empty($conf->global->MAIN_LIST_ALLOW_PUBLIC_NOTES))),
- 'f.note_private'=>array('label'=>'NotePrivate', 'checked'=>0, 'position'=>511, 'enabled'=>(empty($conf->global->MAIN_LIST_ALLOW_PRIVATE_NOTES))),
+ 'f.note_public'=>array('label'=>'NotePublic', 'checked'=>0, 'position'=>510, 'enabled'=>(!getDolGlobalInt('MAIN_LIST_HIDE_PUBLIC_NOTES'))),
+ 'f.note_private'=>array('label'=>'NotePrivate', 'checked'=>0, 'position'=>511, 'enabled'=>(!getDolGlobalInt('MAIN_LIST_HIDE_PRIVATE_NOTES'))),
'f.fk_statut'=>array('label'=>'Status', 'checked'=>1, 'position'=>1000),
'fd.description'=>array('label'=>"DescriptionOfLine", 'checked'=>1, 'enabled'=>empty($conf->global->FICHINTER_DISABLE_DETAILS) ? 1 : 0),
'fd.date'=>array('label'=>'DateOfLine', 'checked'=>1, 'enabled'=>empty($conf->global->FICHINTER_DISABLE_DETAILS) ? 1 : 0),
@@ -328,7 +328,7 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
$resql = $db->query($sql);
$nbtotalofrecords = $db->num_rows($resql);
/* The fast and low memory method to get and count full list converts the sql into a sql count */
- /*$sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
+ /*$sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/Ui', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
$resql = $db->query($sqlforcount);
if ($resql) {
$objforcount = $db->fetch_object($resql);
@@ -493,7 +493,7 @@ if (!empty($moreforfilter)) {
}
$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
-$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields
+$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
print '
';
@@ -503,7 +503,7 @@ print '
';
// Action column
-if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
print '';
$searchpicto = $form->showFilterButtons('left');
print $searchpicto;
@@ -588,7 +588,7 @@ if (!empty($arrayfields['fd.duree']['checked'])) {
print ' ';
}
// Action column
-if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
print '';
$searchpicto = $form->showFilterButtons();
print $searchpicto;
@@ -602,6 +602,10 @@ $totalarray['nbfield'] = 0;
// Fields title label
// --------------------------------------------------------------------
print ' ';
+// Action column
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
+}
if (!empty($arrayfields['f.ref']['checked'])) {
print_liste_field_titre($arrayfields['f.ref']['label'], $_SERVER["PHP_SELF"], "f.ref", "", $param, '', $sortfield, $sortorder);
}
@@ -650,7 +654,11 @@ if (!empty($arrayfields['fd.date']['checked'])) {
if (!empty($arrayfields['fd.duree']['checked'])) {
print_liste_field_titre($arrayfields['fd.duree']['label'], $_SERVER["PHP_SELF"], "fd.duree", "", $param, '', $sortfield, $sortorder, 'right ');
}
-print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
+
+// Action column
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
+}
print " \n";
@@ -687,7 +695,18 @@ while ($i < $imaxinloop) {
$companystatic->status = $obj->thirdpartystatus;
print '';
-
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->rowid, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
if (!empty($arrayfields['f.ref']['checked'])) {
print "";
@@ -848,7 +867,7 @@ while ($i < $imaxinloop) {
$totalarray['val']['fd.duree'] += $obj->duree;
}
// Action column
- if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
print ' ';
if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
$selected = 0;
diff --git a/htdocs/fichinter/stats/index.php b/htdocs/fichinter/stats/index.php
index f1ab4b08fec..162afb68077 100644
--- a/htdocs/fichinter/stats/index.php
+++ b/htdocs/fichinter/stats/index.php
@@ -43,7 +43,7 @@ if ($user->socid > 0) {
$socid = $user->socid;
}
-$nowyear = strftime("%Y", dol_now());
+$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$year = GETPOST('year') > 0 ? GETPOST('year', 'int') : $nowyear;
$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS)));
$endyear = $year;
diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php
index ccd85e47810..910b56ddae4 100644
--- a/htdocs/filefunc.inc.php
+++ b/htdocs/filefunc.inc.php
@@ -34,7 +34,7 @@ if (!defined('DOL_APPLICATION_TITLE')) {
define('DOL_APPLICATION_TITLE', 'Dolibarr');
}
if (!defined('DOL_VERSION')) {
- define('DOL_VERSION', '17.0.0-alpha'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c
+ define('DOL_VERSION', '17.0.0-beta'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c
}
if (!defined('EURO')) {
@@ -253,7 +253,7 @@ if (empty($dolibarr_main_data_root)) {
// Define some constants
define('DOL_CLASS_PATH', 'class/'); // Filesystem path to class dir (defined only for some code that want to be compatible with old versions without this parameter)
define('DOL_DATA_ROOT', $dolibarr_main_data_root); // Filesystem data (documents)
-// Try to autodetect DOL_MAIN_URL_ROOT and DOL_URL_ROOT.
+// Try to autodetect DOL_MAIN_URL_ROOT and DOL_URL_ROOT when root is not directly the main domain.
// Note: autodetect works only in case 1, 2, 3 and 4 of phpunit test CoreTest.php. For case 5, 6, only setting value into conf.php will works.
$tmp = '';
$found = 0;
@@ -283,7 +283,8 @@ foreach ($paths as $tmppath) { // We check to find (B+start of C)=A
}
//print "found=".$found." dolibarr_main_url_root=".$dolibarr_main_url_root."\n";
if (!$found) {
- $tmp = $dolibarr_main_url_root; // If autodetect fails (Ie: when using apache alias that point outside default DOCUMENT_ROOT).
+ // There is no subdir that compose the main url root or autodetect fails (Ie: when using apache alias that point outside default DOCUMENT_ROOT).
+ $tmp = $dolibarr_main_url_root;
} else {
$tmp = 'http'.(((empty($_SERVER["HTTPS"]) || $_SERVER["HTTPS"] != 'on') && (empty($_SERVER["SERVER_PORT"]) || $_SERVER["SERVER_PORT"] != 443)) ? '' : 's').'://'.$_SERVER["SERVER_NAME"].((empty($_SERVER["SERVER_PORT"]) || $_SERVER["SERVER_PORT"] == 80 || $_SERVER["SERVER_PORT"] == 443) ? '' : ':'.$_SERVER["SERVER_PORT"]).($tmp3 ? (preg_match('/^\//', $tmp3) ? '' : '/').$tmp3 : '');
}
@@ -311,9 +312,6 @@ define('MAIN_DB_PREFIX', $dolibarr_main_db_prefix);
* To use other version than embeded libraries, define here constant to path. Use '' to use include class path autodetect.
*/
// Path to root libraries
-if (!defined('ADODB_PATH')) {
- define('ADODB_PATH', (!isset($dolibarr_lib_ADODB_PATH)) ?DOL_DOCUMENT_ROOT.'/includes/adodbtime/' : (empty($dolibarr_lib_ADODB_PATH) ? '' : $dolibarr_lib_ADODB_PATH.'/'));
-}
if (!defined('TCPDF_PATH')) {
define('TCPDF_PATH', (empty($dolibarr_lib_TCPDF_PATH)) ?DOL_DOCUMENT_ROOT.'/includes/tecnickcom/tcpdf/' : $dolibarr_lib_TCPDF_PATH.'/');
}
@@ -354,10 +352,6 @@ if (!defined('DOL_DEFAULT_TTF_BOLD')) {
* Include functions
*/
-if (!defined('ADODB_DATE_VERSION')) {
- include_once ADODB_PATH.'adodb-time.inc.php';
-}
-
// If password is encoded, we decode it. Note: When page is called for install, $dolibarr_main_db_pass may not be defined yet.
if ((!empty($dolibarr_main_db_pass) && preg_match('/crypted:/i', $dolibarr_main_db_pass)) || !empty($dolibarr_main_db_encrypted_pass)) {
if (!empty($dolibarr_main_db_pass) && preg_match('/crypted:/i', $dolibarr_main_db_pass)) {
diff --git a/htdocs/fourn/card.php b/htdocs/fourn/card.php
index 00a3ba55caa..f3260d8ea48 100644
--- a/htdocs/fourn/card.php
+++ b/htdocs/fourn/card.php
@@ -106,7 +106,7 @@ if (empty($reshook)) {
setEventMessages($object->error, $object->errors, 'errors');
}
}
- // terms of the settlement
+ // Set payment terms of the settlement
if ($action == 'setconditions' && $user->rights->societe->creer) {
$object->fetch($id);
$result = $object->setPaymentTerms(GETPOST('cond_reglement_supplier_id', 'int'));
@@ -114,7 +114,7 @@ if (empty($reshook)) {
dol_print_error($db, $object->error);
}
}
- // mode de reglement
+ // Payment mode
if ($action == 'setmode' && $user->rights->societe->creer) {
$object->fetch($id);
$result = $object->setPaymentMethods(GETPOST('mode_reglement_supplier_id', 'int'));
@@ -123,6 +123,15 @@ if (empty($reshook)) {
}
}
+ // Bank account
+ if ($action == 'setbankaccount' && $user->rights->societe->creer) {
+ $object->fetch($id);
+ $result = $object->setBankAccount(GETPOST('fk_account', 'int'));
+ if ($result < 0) {
+ setEventMessages($object->error, $object->errors, 'errors');
+ }
+ }
+
// update supplier order min amount
if ($action == 'setsupplier_order_min_amount') {
$object->fetch($id);
@@ -276,7 +285,7 @@ if ($object->id > 0) {
print " ";
print ' ';
- // Mode de reglement par defaut
+ // Default payment mode
print '';
print '';
print $langs->trans('PaymentMode');
@@ -294,6 +303,26 @@ if ($object->id > 0) {
print " ";
print ' ';
+ if (isModEnabled("banque")) {
+ // Default bank account for payments
+ print '';
+ print '';
+ print ' ';
+ if ($action == 'editbankaccount') {
+ $form->formSelectAccount($_SERVER['PHP_SELF'].'?socid='.$object->id, $object->fk_account, 'fk_account', 1);
+ } else {
+ $form->formSelectAccount($_SERVER['PHP_SELF'].'?socid='.$object->id, $object->fk_account, 'none');
+ }
+ print " ";
+ print ' ';
+ }
+
// Relative discounts (Discounts-Drawbacks-Rebates)
print '';
print '';
@@ -848,7 +877,7 @@ if ($object->id > 0) {
if ($object->status == 1) {
print dolGetButtonAction('', $langs->trans('AddSupplierProposal'), 'default', DOL_URL_ROOT.'/supplier_proposal/card.php?action=create&socid='.$object->id, '');
} else {
- print dolGetButtonAction($langs->trans('ThirdPartyIsClosed'), $langs->trans('AddSupplierProposalGR'), 'default', $_SERVER['PHP_SELF'].'#', '', false);
+ print dolGetButtonAction($langs->trans('ThirdPartyIsClosed'), $langs->trans('AddSupplierProposal'), 'default', $_SERVER['PHP_SELF'].'#', '', false);
}
}
@@ -865,7 +894,7 @@ if ($object->id > 0) {
if (!empty($orders2invoice) && $orders2invoice > 0) {
if ($object->status == 1) {
// Company is open
- print dolGetButtonAction('', $langs->trans('CreateInvoiceForThisSupplierGR'), 'default', DOL_URL_ROOT.'/fourn/commande/list.php?socid='.$object->id.'&search_billed=0&autoselectall=1', '');
+ print dolGetButtonAction('', $langs->trans('CreateInvoiceForThisSupplier'), 'default', DOL_URL_ROOT.'/fourn/commande/list.php?socid='.$object->id.'&search_billed=0&autoselectall=1', '');
} else {
print dolGetButtonAction('', $langs->trans('CreateInvoiceForThisCustomer'), 'default', $_SERVER['PHP_SELF'].'#', '', false);
}
diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php
index 770276e96b8..3e58ceddfce 100644
--- a/htdocs/fourn/class/fournisseur.commande.class.php
+++ b/htdocs/fourn/class/fournisseur.commande.class.php
@@ -1398,7 +1398,7 @@ class CommandeFournisseur extends CommonOrder
$sql .= ", '".$this->db->escape($this->ref_supplier)."'";
$sql .= ", '".$this->db->escape($this->note_private)."'";
$sql .= ", '".$this->db->escape($this->note_public)."'";
- $sql .= ", ".((int) $conf->entity);
+ $sql .= ", ".setEntity($this);
$sql .= ", ".((int) $this->socid);
$sql .= ", ".($this->fk_project > 0 ? ((int) $this->fk_project) : "null");
$sql .= ", '".$this->db->idate($date)."'";
@@ -1832,7 +1832,7 @@ class CommandeFournisseur extends CommonOrder
// If we want a dedicated supplier price, we must provide $fk_prod_fourn_price.
$result = $prod->get_buyprice($fk_prod_fourn_price, $qty, $fk_product, 'none', (isset($this->fk_soc) ? $this->fk_soc : $this->socid)); // Search on couple $fk_prod_fourn_price/$qty first, then on triplet $qty/$fk_product/$ref_supplier/$this->fk_soc
- // If supplier order created from customer order, we take best supplier price
+ // If supplier order created from sales order, we take best supplier price
// If $pu (defined previously from pu_ht or pu_ttc) is not defined at all, we also take the best supplier price
if ($result > 0 && ($origin == 'commande' || $pu === '')) {
$pu = $prod->fourn_pu; // Unit price supplier price set by get_buyprice
@@ -2608,11 +2608,11 @@ class CommandeFournisseur extends CommonOrder
}
/**
- * Update a supplier order from a customer order
+ * Update a supplier order from a sales order
*
* @param User $user User that create
- * @param int $idc Id of supplier order to update
- * @param int $comclientid Id of customer order to use as template
+ * @param int $idc Id of purchase order to update
+ * @param int $comclientid Id of sale order to use as template
* @return int <0 if KO, >0 if OK
*/
public function updateFromCommandeClient($user, $idc, $comclientid)
@@ -3187,26 +3187,28 @@ class CommandeFournisseur extends CommonOrder
* @param int $hidedesc Hide description
* @param int $hideref Hide ref
* @param null|array $moreparams Array to provide more information
- * @return int 0 if KO, 1 if OK
+ * @return int < 0 if KO, 0 = no doc generated, > 0 if OK
*/
public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
{
global $conf, $langs;
- $langs->load("suppliers");
- $outputlangs->load("products");
-
if (!dol_strlen($modele)) {
- $modele = '';
- if ($this->model_pdf) {
+ $modele = ''; // No doc template/generation by default
+
+ if (!empty($this->model_pdf)) {
$modele = $this->model_pdf;
} elseif (!empty($conf->global->COMMANDE_SUPPLIER_ADDON_PDF)) {
$modele = $conf->global->COMMANDE_SUPPLIER_ADDON_PDF;
}
}
+
if (empty($modele)) {
return 0;
} else {
+ $langs->load("suppliers");
+ $outputlangs->load("products");
+
$modelpath = "core/modules/supplier_order/doc/";
return $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
}
diff --git a/htdocs/fourn/class/fournisseur.product.class.php b/htdocs/fourn/class/fournisseur.product.class.php
index 16bc43474d8..ec923f91118 100644
--- a/htdocs/fourn/class/fournisseur.product.class.php
+++ b/htdocs/fourn/class/fournisseur.product.class.php
@@ -419,7 +419,11 @@ class ProductFournisseur extends Product
$productfournisseurprice->array_options[$key] = $value;
}
$res = $productfournisseurprice->update($user);
- if ($res < 0) $error++;
+ if ($res < 0) {
+ $this->error = $productfournisseurprice->error;
+ $this->errors = $productfournisseurprice->errors;
+ $error++;
+ }
}
}
}
@@ -506,6 +510,7 @@ class ProductFournisseur extends Product
if ($resql) {
$this->product_fourn_price_id = $this->db->last_insert_id(MAIN_DB_PREFIX."product_fournisseur_price");
} else {
+ $this->error = $this->db->lasterror();
$error++;
}
@@ -518,7 +523,11 @@ class ProductFournisseur extends Product
$productfournisseurprice->array_options[$key] = $value;
}
$res = $productfournisseurprice->update($user);
- if ($res < 0) $error++;
+ if ($res < 0) {
+ $this->error = $productfournisseurprice->error;
+ $this->errors = $productfournisseurprice->errors;
+ $error++;
+ }
}
}
}
diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php
index 5e3eb8d7890..5dbe81ca4a4 100644
--- a/htdocs/fourn/commande/card.php
+++ b/htdocs/fourn/commande/card.php
@@ -65,7 +65,7 @@ if (isModEnabled('variants')) {
// Load translation files required by the page
$langs->loadLangs(array('admin', 'orders', 'sendings', 'companies', 'bills', 'propal', 'receptions', 'supplier_proposal', 'deliveries', 'products', 'stocks', 'productbatch'));
-if (!empty($conf->incoterm->enabled)) {
+if (isModEnabled('incoterm')) {
$langs->load('incoterm');
}
@@ -1241,7 +1241,7 @@ if (empty($reshook)) {
$object->fk_incoterms = GETPOST('incoterm_id', 'int');
$object->location_incoterms = GETPOST('location_incoterms', 'alpha');
$object->multicurrency_code = GETPOST('multicurrency_code', 'alpha');
- $object->multicurrency_tx = GETPOST('originmulticurrency_tx', 'int');
+ $object->multicurrency_tx = price2num(GETPOST('originmulticurrency_tx', 'alpha'));
$object->fk_project = GETPOST('projectid', 'int');
// Fill array 'array_options' with data from add form
@@ -1777,7 +1777,7 @@ if ($action == 'create') {
}
// Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
$fkincoterms = (!empty($object->fk_incoterms) ? $object->fk_incoterms : ($socid > 0 ? $societe->fk_incoterms : ''));
$locincoterms = (!empty($object->location_incoterms) ? $object->location_incoterms : ($socid > 0 ? $societe->location_incoterms : ''));
print ' ';
@@ -2033,9 +2033,8 @@ if ($action == 'create') {
$morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $usercancreate, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $usercancreate, 'string'.(isset($conf->global->THIRDPARTY_REF_INPUT_SIZE) ? ':'.$conf->global->THIRDPARTY_REF_INPUT_SIZE : ''), '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty');
+ $morehtmlref .= ' ';
if (!empty($conf->global->MAIN_CAN_EDIT_SUPPLIER_ON_SUPPLIER_ORDER) && !empty($usercancreate) && $action == 'edit_thirdparty') {
- $morehtmlref .= ' : ';
$morehtmlref .= '';
$morehtmlref .= ' ';
$morehtmlref .= ' ';
@@ -2047,7 +2046,7 @@ if ($action == 'create') {
if (!empty($conf->global->MAIN_CAN_EDIT_SUPPLIER_ON_SUPPLIER_ORDER) && $object->statut == CommandeFournisseur::STATUS_DRAFT) {
$morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetThirdParty')).' ';
}
- $morehtmlref .= ' : '.$object->thirdparty->getNomUrl(1, 'supplier');
+ $morehtmlref .= $object->thirdparty->getNomUrl(1, 'supplier');
if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
$morehtmlref .= ' ('.$langs->trans("OtherOrders").' )';
}
@@ -2056,32 +2055,21 @@ if ($action == 'create') {
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($usercancreate) {
+ $morehtmlref .= ' ';
+ if ($permissiontoadd) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify' && $caneditproject) {
- $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects((empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, 'projectid', 0, 0, 1, 1, 1, 0, 0, '', 1, 0, 'maxwidth500');
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
@@ -2121,7 +2109,7 @@ if ($action == 'create') {
print ' ';
// Relative and absolute discounts
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
$filterabsolutediscount = "fk_invoice_supplier_source IS NULL"; // If we want deposit to be substracted to payments only and not to total of final invoice
$filtercreditnote = "fk_invoice_supplier_source IS NOT NULL"; // If we want deposit to be substracted to payments only and not to total of final invoice
} else {
@@ -2290,7 +2278,7 @@ if ($action == 'create') {
print '';
// Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
print '';
print '';
print $langs->trans('IncotermLabel');
@@ -2373,7 +2361,7 @@ if ($action == 'create') {
print '
';
// Margin Infos
- /*if (!empty($conf->margin->enabled)) {
+ /*if (isModEnabled('margin')) {
$formmargin->displayMarginInfos($object);
}*/
diff --git a/htdocs/fourn/commande/contact.php b/htdocs/fourn/commande/contact.php
index 92859d2eb1f..3ca1eca77bf 100644
--- a/htdocs/fourn/commande/contact.php
+++ b/htdocs/fourn/commande/contact.php
@@ -50,9 +50,12 @@ $hookmanager->initHooks(array('ordersuppliercardcontact'));
$object = new CommandeFournisseur($db);
+$usercancreate = ($user->rights->fournisseur->commande->creer || $user->rights->supplier_order->creer);
+$permissiontoadd = $usercancreate; // Used by the include of actions_addupdatedelete.inc.php
+
/*
- * Add a new contact
+ * Actions
*/
if ($action == 'addcontact' && ($user->rights->fournisseur->commande->creer || $user->rights->supplier_order->creer)) {
@@ -100,6 +103,7 @@ if ($action == 'addcontact' && ($user->rights->fournisseur->commande->creer || $
/*
* View
*/
+
$form = new Form($db);
$formcompany = new FormCompany($db);
$contactstatic = new Contact($db);
@@ -134,37 +138,25 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1);
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->fournisseur->commande->creer || $user->rights->supplier_order->creer) {
- if ($action != 'classify') {
- //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ' ';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
+ if ($action != 'classify' && $caneditproject) {
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/fourn/commande/dispatch.php b/htdocs/fourn/commande/dispatch.php
index 1a8834941c9..c639e622337 100644
--- a/htdocs/fourn/commande/dispatch.php
+++ b/htdocs/fourn/commande/dispatch.php
@@ -100,6 +100,9 @@ if (!isModEnabled('stock')) {
accessforbidden();
}
+$usercancreate = ($user->rights->fournisseur->commande->creer || $user->rights->supplier_order->creer);
+$permissiontoadd = $usercancreate; // Used by the include of actions_addupdatedelete.inc.php
+
/*
* Actions
@@ -541,37 +544,25 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1);
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->fournisseur->commande->creer || $user->rights->supplier_order->creer) {
- if ($action != 'classify') {
- //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ' ';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
+ if ($action != 'classify' && $caneditproject) {
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
@@ -1162,8 +1153,8 @@ if ($id > 0 || !empty($ref)) {
}
// Product
print ' '.$langs->trans("Product").' ';
- print ''.$langs->trans("DateCreation").' ';
- print ''.$langs->trans("DateDeliveryPlanned").' ';
+ print ''.$langs->trans("DateCreation").' ';
+ print ''.$langs->trans("DateDeliveryPlanned").' ';
if (isModEnabled('productbatch')) {
print ''.$langs->trans("batch_number").' ';
if (empty($conf->global->PRODUCT_DISABLE_SELLBY)) {
@@ -1204,7 +1195,7 @@ if ($id > 0 || !empty($ref)) {
// Reception ref
if (isModEnabled("reception")) {
- print '';
+ print ' ';
if (!empty($objp->fk_reception)) {
$reception = new Reception($db);
$reception->fetch($objp->fk_reception);
@@ -1215,7 +1206,7 @@ if ($id > 0 || !empty($ref)) {
}
// Product
- print ' ';
+ print ' ';
if (empty($conf->cache['product'][$objp->fk_product])) {
$tmpproduct = new Product($db);
$tmpproduct->fetch($objp->fk_product);
@@ -1226,9 +1217,14 @@ if ($id > 0 || !empty($ref)) {
print $tmpproduct->getNomUrl(1);
print ' - '.$objp->label;
print " \n";
- print ''.dol_print_date($db->jdate($objp->datec), 'day').' ';
- print ''.dol_print_date($db->jdate($objp->date_delivery), 'day').' ';
+ // Date creation
+ print ''.dol_print_date($db->jdate($objp->datec), 'day').' ';
+
+ // Date delivery
+ print ''.dol_print_date($db->jdate($objp->date_delivery), 'day').' ';
+
+ // Batch / Eat by / Sell by
if (isModEnabled('productbatch')) {
if ($objp->batch) {
include_once DOL_DOCUMENT_ROOT.'/product/stock/class/productlot.class.php';
@@ -1263,7 +1259,7 @@ if ($id > 0 || !empty($ref)) {
print '';
// Warehouse
- print '';
+ print ' ';
if ($action == 'editline' && $lineid == $objp->dispatchlineid) {
if (count($listwarehouses) > 1) {
print $formproduct->selectWarehouses(GETPOST("fk_entrepot") ?GETPOST("fk_entrepot") : ($objp->warehouse_id ? $objp->warehouse_id : ''), "fk_entrepot", '', 1, 0, $objp->fk_product, '', 1, 1, null, 'csswarehouse');
@@ -1327,6 +1323,8 @@ if ($id > 0 || !empty($ref)) {
}
print ' ';
}
+
+ // Action
if ($action != 'editline' || $lineid != $objp->dispatchlineid) {
if (empty($reception->id) || ($reception->statut == Reception::STATUS_DRAFT)) { // only allow edit on draft reception
print '';
diff --git a/htdocs/fourn/commande/document.php b/htdocs/fourn/commande/document.php
index 0eba3dbc601..b3dfb8b9ece 100644
--- a/htdocs/fourn/commande/document.php
+++ b/htdocs/fourn/commande/document.php
@@ -130,37 +130,25 @@ if ($object->id > 0) {
$morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1);
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->fournisseur->commande->creer || $user->rights->supplier_order->creer) {
- if ($action != 'classify') {
- //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ' ';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
+ if ($action != 'classify' && $caneditproject) {
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/fourn/commande/info.php b/htdocs/fourn/commande/info.php
index 698fead1a43..fc3918a32f3 100644
--- a/htdocs/fourn/commande/info.php
+++ b/htdocs/fourn/commande/info.php
@@ -84,6 +84,8 @@ if (empty($user->rights->fournisseur->commande->lire)) {
// Init Hooks
$hookmanager->initHooks(array('ordersuppliercardinfo'));
+$usercancreate = ($user->rights->fournisseur->commande->creer || $user->rights->supplier_order->creer);
+$permissiontoadd = $usercancreate; // Used by the include of actions_addupdatedelete.inc.php
/*
@@ -141,37 +143,25 @@ $morehtmlref = '';
$morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
-$morehtmlref .= '
'.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+$morehtmlref .= '
'.$object->thirdparty->getNomUrl(1);
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= '
'.$langs->trans('Project').' ';
- if ($user->rights->fournisseur->commande->creer || $user->rights->supplier_order->creer) {
- if ($action != 'classify') {
- //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= '
';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
+ if ($action != 'classify' && $caneditproject) {
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/fourn/commande/list.php b/htdocs/fourn/commande/list.php
index 82e36af6943..1a39a8cf378 100644
--- a/htdocs/fourn/commande/list.php
+++ b/htdocs/fourn/commande/list.php
@@ -196,8 +196,8 @@ $arrayfields = array(
'country.code_iso'=>array('label'=>"Country", 'enabled'=>1, 'position'=>49),
'typent.code'=>array('label'=>"ThirdPartyType", 'enabled'=>$checkedtypetiers, 'position'=>50),
'u.login'=>array('label'=>"AuthorRequest", 'enabled'=>1, 'position'=>51),
- 'cf.note_public'=>array('label'=>'NotePublic', 'checked'=>0, 'enabled'=>(empty($conf->global->MAIN_LIST_ALLOW_PUBLIC_NOTES)), 'position'=>100),
- 'cf.note_private'=>array('label'=>'NotePrivate', 'checked'=>0, 'enabled'=>(empty($conf->global->MAIN_LIST_ALLOW_PRIVATE_NOTES)), 'position'=>110),
+ 'cf.note_public'=>array('label'=>'NotePublic', 'checked'=>0, 'enabled'=>(!getDolGlobalInt('MAIN_LIST_HIDE_PUBLIC_NOTES')), 'position'=>100),
+ 'cf.note_private'=>array('label'=>'NotePrivate', 'checked'=>0, 'enabled'=>(!getDolGlobalInt('MAIN_LIST_HIDE_PRIVATE_NOTES')), 'position'=>110),
);
foreach ($object->fields as $key => $val) {
// If $val['visible']==0, then we never show the field
@@ -527,7 +527,7 @@ if (empty($reshook)) {
}
}
- $cmd->classifyBilled($user); // TODO Move this in workflow like done for customer orders
+ $cmd->classifyBilled($user); // TODO Move this in workflow like done for sales orders
if (!empty($createbills_onebythird) && empty($TFactThird[$cmd->socid])) {
$TFactThird[$cmd->socid] = $objecttmp;
@@ -752,7 +752,7 @@ if ($search_billed > 0) {
$help_url = '';
$sql = 'SELECT';
-if ($sall || $search_product_category > 0) {
+if ($sall) {
$sql = 'SELECT DISTINCT';
}
$sql .= ' s.rowid as socid, s.nom as name, s.name_alias as alias, s.town, s.zip, s.fk_pays, s.client, s.fournisseur, s.code_client, s.email,';
@@ -782,12 +782,9 @@ $sql .= ", ".MAIN_DB_PREFIX."commande_fournisseur as cf";
if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (cf.rowid = ef.fk_object)";
}
-if ($sall || $search_product_category > 0) {
+if ($sall) {
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'commande_fournisseurdet as pd ON cf.rowid=pd.fk_commande';
}
-if ($search_product_category > 0) {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_product as cp ON cp.fk_product=pd.fk_product';
-}
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u ON cf.fk_user_author = u.rowid";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet as p ON p.rowid = cf.fk_projet";
// We'll need this table joined to the select in order to filter by sale
@@ -826,9 +823,6 @@ if ($search_request_author) {
if ($search_billed != '' && $search_billed >= 0) {
$sql .= " AND cf.billed = ".((int) $search_billed);
}
-if ($search_product_category > 0) {
- $sql .= " AND cp.fk_categorie = ".((int) $search_product_category);
-}
//Required triple check because statut=0 means draft filter
if (GETPOST('statut', 'intcomma') !== '') {
$sql .= " AND cf.fk_statut IN (".$db->sanitize($db->escape($db->escape(GETPOST('statut', 'intcomma')))).")";
@@ -920,6 +914,36 @@ if ($search_multicurrency_montant_ttc != '') {
if ($search_project_ref != '') {
$sql .= natural_search("p.ref", $search_project_ref);
}
+// Search for tag/category ($searchCategoryProductList is an array of ID)
+$searchCategoryProductOperator = -1;
+$searchCategoryProductList = array($search_product_category);
+if (!empty($searchCategoryProductList)) {
+ $searchCategoryProductSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategoryProductList as $searchCategoryProduct) {
+ if (intval($searchCategoryProduct) == -2) {
+ $searchCategoryProductSqlList[] = "NOT EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."commande_fournisseurdet as cd WHERE cd.fk_commande = cf.rowid AND cd.fk_product = ck.fk_product)";
+ } elseif (intval($searchCategoryProduct) > 0) {
+ if ($searchCategoryProductOperator == 0) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."commande_fournisseurdet as cd WHERE cd.fk_commande = cf.rowid AND cd.fk_product = ck.fk_product AND ck.fk_categorie = ".((int) $searchCategoryProduct).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProduct);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."commande_fournisseurdet as cd WHERE cd.fk_commande = cf.rowid AND cd.fk_product = ck.fk_product AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategoryProductOperator == 1) {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
+ }
+ }
+}
// Add where from extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
// Add where from hooks
@@ -1259,7 +1283,7 @@ if ($resql) {
}
$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
- $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
+ $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
$selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
if (GETPOST('autoselectall', 'int')) {
@@ -1276,6 +1300,13 @@ if ($resql) {
print '
'."\n";
print '';
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons('left');
+ print $searchpicto;
+ print ' ';
+ }
// Ref
if (!empty($arrayfields['cf.ref']['checked'])) {
print ' ';
@@ -1460,15 +1491,20 @@ if ($resql) {
print '';
}
// Action column
- print '';
- $searchpicto = $form->showFilterButtons();
- print $searchpicto;
- print ' ';
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons();
+ print $searchpicto;
+ print ' ';
+ }
print " \n";
// Fields title
print '';
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
+ }
if (!empty($arrayfields['cf.ref']['checked'])) {
print_liste_field_titre($arrayfields['cf.ref']['label'], $_SERVER["PHP_SELF"], "cf.ref", "", $param, '', $sortfield, $sortorder);
}
@@ -1565,7 +1601,9 @@ if ($resql) {
if (!empty($arrayfields['cf.note_private']['checked'])) {
print_liste_field_titre($arrayfields['cf.note_private']['label'], $_SERVER["PHP_SELF"], "cf.note_private", "", $param, '', $sortfield, $sortorder, 'center ');
}
- print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
+ }
print " \n";
@@ -1608,7 +1646,18 @@ if ($resql) {
$objectstatic->statut = $obj->fk_statut;
print '';
-
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->rowid, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
// Ref
if (!empty($arrayfields['cf.ref']['checked'])) {
print '';
@@ -1915,15 +1964,17 @@ if ($resql) {
}
// Action column
- print ' ';
- if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
- $selected = 0;
- if (in_array($obj->rowid, $arrayofselected)) {
- $selected = 1;
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print ' ';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->rowid, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
}
- print ' ';
+ print ' ';
}
- print '';
if (!$i) {
$totalarray['nbfield']++;
}
diff --git a/htdocs/fourn/commande/note.php b/htdocs/fourn/commande/note.php
index 167c506b651..33648dd9817 100644
--- a/htdocs/fourn/commande/note.php
+++ b/htdocs/fourn/commande/note.php
@@ -56,6 +56,8 @@ $object->fetch($id, $ref);
// Permissions
$permissionnote = ($user->rights->fournisseur->commande->creer || $user->rights->supplier_order->creer); // Used by the include of actions_setnotes.inc.php
+$usercancreate = ($user->rights->fournisseur->commande->creer || $user->rights->supplier_order->creer);
+$permissiontoadd = $usercancreate; // Used by the include of actions_addupdatedelete.inc.php
/*
@@ -110,37 +112,25 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1);
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->fournisseur->commande->creer || $user->rights->supplier_order->creer) {
- if ($action != 'classify') {
- //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ' ';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
+ if ($action != 'classify' && $caneditproject) {
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/fourn/facture/card-rec.php b/htdocs/fourn/facture/card-rec.php
index 71ba4f6928a..ead5a5f8ea8 100644
--- a/htdocs/fourn/facture/card-rec.php
+++ b/htdocs/fourn/facture/card-rec.php
@@ -1621,10 +1621,8 @@ if ($action == 'create') {
}
}
- //if ($object->statut == Facture::STATUS_DRAFT && ($user->rights->fournisseur->facture->supprimer || $user->rights->supplier_invoice->supprimer))
- if (($user->rights->fournisseur->facture->supprimer || $user->rights->supplier_invoice->supprimer)) {
- print '';
- }
+ // Delete
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=ask_deleteinvoice&token='.newToken(), 'delete', ($user->rights->fournisseur->facture->supprimer || $user->rights->supplier_invoice->supprimer));
print '';
diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php
index 74f8705133b..1738dd69868 100644
--- a/htdocs/fourn/facture/card.php
+++ b/htdocs/fourn/facture/card.php
@@ -64,7 +64,7 @@ if (isModEnabled('accounting')) {
$langs->loadLangs(array('bills', 'compta', 'suppliers', 'companies', 'products', 'banks', 'admin'));
-if (!empty($conf->incoterm->enabled)) {
+if (isModEnabled('incoterm')) {
$langs->load('incoterm');
}
@@ -399,7 +399,7 @@ if (empty($reshook)) {
} else {
$db->commit();
}
- } elseif ($action == 'set_incoterms' && !empty($conf->incoterm->enabled)) {
+ } elseif ($action == 'set_incoterms' && isModEnabled('incoterm')) {
// Set incoterm
$result = $object->setIncoterms(GETPOST('incoterm_id', 'int'), GETPOST('location_incoterms', 'alpha'));
} elseif ($action == 'setmode' && $usercancreate) {
@@ -2429,7 +2429,7 @@ if ($action == 'create') {
}
// Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
print ' ';
print ''.$form->textwithpicto($langs->trans("IncotermLabel"), !empty($objectsrc->label_incoterms) ? $objectsrc->label_incoterms : '', 1).' ';
print '';
@@ -2629,7 +2629,9 @@ if ($action == 'create') {
$multicurrency_totaldeposits = $object->getSumDepositsUsed(1);
$multicurrency_resteapayer = price2num($object->multicurrency_total_ttc - $multicurrency_totalpaid - $multicurrency_totalcreditnotes - $multicurrency_totaldeposits, 'MT');
// Code to fix case of corrupted data
- if ($resteapayer == 0 && $multicurrency_resteapayer != 0) {
+ // TODO We should not need this. Also data comes from not reliable value of $object->multicurrency_total_ttc that may be wrong if it was
+ // calculated by summing lines that were in a currency for some of them and into another for others (lines from discount/down payment into another currency for example)
+ if ($resteapayer == 0 && $multicurrency_resteapayer != 0 && $object->multicurrency_code != $conf->currency) {
$resteapayer = price2num($multicurrency_resteapayer / $object->multicurrency_tx, 'MT');
}
}
@@ -2639,7 +2641,7 @@ if ($action == 'create') {
}
$resteapayeraffiche = $resteapayer;
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) { // Never use this
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) { // Never use this
$filterabsolutediscount = "fk_invoice_supplier_source IS NULL"; // If we want deposit to be substracted to payments only and not to total of final invoice
$filtercreditnote = "fk_invoice_supplier_source IS NOT NULL"; // If we want deposit to be substracted to payments only and not to total of final invoice
} else {
@@ -2871,39 +2873,28 @@ if ($action == 'create') {
$morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $usercancreate, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $usercancreate, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'supplier');
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1, 'supplier');
if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
$morehtmlref .= ' ('.$langs->trans("OtherBills").' )';
}
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($usercancreate) {
+ $morehtmlref .= ' ';
+ if ($permissiontoadd) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects((empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
@@ -2917,7 +2908,7 @@ if ($action == 'create') {
print '';
print '
';
- print '
';
+ print '';
// Type
print ''.$langs->trans('Type').' ';
@@ -3000,8 +2991,8 @@ if ($action == 'create') {
print ' '.$form->editfieldval("Label", 'label', $object->label, $object, $usercancreate).' ';
print ' ';
- $form_permission = ($object->statut < FactureFournisseur::STATUS_CLOSED) && $usercancreate && ($object->getSommePaiement() <= 0);
- $form_permission2 = ($object->statut < FactureFournisseur::STATUS_CLOSED) && $usercancreate;
+ //$form_permission = ($object->statut < FactureFournisseur::STATUS_CLOSED) && $usercancreate && ($object->getSommePaiement() <= 0);
+ $form_permission = ($object->statut < FactureFournisseur::STATUS_CLOSED) && $usercancreate;
// Date
print '';
@@ -3013,11 +3004,11 @@ if ($action == 'create') {
// Default terms of the settlement
$langs->load('bills');
print ' ';
- print '';
+ print '';
print ' ';
@@ -3031,9 +3022,9 @@ if ($action == 'create') {
// Due date
print ' ';
- print $form->editfieldkey("DateMaxPayment", 'date_lim_reglement', $object->date_echeance, $object, $form_permission2, 'datepicker');
+ print $form->editfieldkey("DateMaxPayment", 'date_lim_reglement', $object->date_echeance, $object, $form_permission, 'datepicker');
print ' ';
- print $form->editfieldval("DateMaxPayment", 'date_lim_reglement', $object->date_echeance, $object, $form_permission2, 'datepicker');
+ print $form->editfieldval("DateMaxPayment", 'date_lim_reglement', $object->date_echeance, $object, $form_permission, 'datepicker');
if ($action != 'editdate_lim_reglement' && $object->hasDelay()) {
print img_warning($langs->trans('Late'));
}
@@ -3042,10 +3033,10 @@ if ($action == 'create') {
// Mode of payment
$langs->load('bills');
print ' ';
- print '';
+ print '';
@@ -3127,7 +3118,7 @@ if ($action == 'create') {
}
// Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
print ' ';
print '';
print $langs->trans('IncotermLabel');
@@ -3152,7 +3143,7 @@ if ($action == 'create') {
if (isModEnabled('intracommreport')) {
$langs->loadLangs(array("intracommreport"));
print ' ';
- print '';
+ print '';
print $langs->trans('IntracommReportTransportMode');
print ' ';
if ($action != 'editmode' && ($user->rights->fournisseur->facture->creer || $user->rights->supplier_invoice->creer)) {
@@ -3265,7 +3256,7 @@ if ($action == 'create') {
if (isModEnabled("banque")) {
$nbrows++; $nbcols++;
}
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
$nbrows++;
}
if (isModEnabled("multicurrency")) {
@@ -3298,7 +3289,7 @@ if ($action == 'create') {
$i = 0;
print '';
- print '
';
+ print '';
print '';
print ''.($object->type == FactureFournisseur::TYPE_CREDIT_NOTE ? $langs->trans("PaymentsBack") : $langs->trans('Payments')).' ';
print ''.$langs->trans('Date').' ';
@@ -3324,12 +3315,13 @@ if ($action == 'create') {
$paymentstatic->type_label = $objp->payment_type;
print ' ';
- print '';
+ print ' ';
print $paymentstatic->getNomUrl(1);
print ' ';
print ''.dol_print_date($db->jdate($objp->dp), 'day').' ';
- print '';
- print $form->form_modes_reglement(null, $objp->paiement_type, 'none').' '.$objp->num_payment;
+ $s = $form->form_modes_reglement(null, $objp->paiement_type, 'none', '', 1, 0, '', 1).' '.$objp->num_payment;
+ print ' ';
+ print $s;
print ' ';
if (isModEnabled("banque")) {
$bankaccountstatic->id = $objp->baid;
@@ -3781,21 +3773,26 @@ if ($action == 'create') {
// Delete
$isErasable = $object->is_erasable();
- if ($action != 'confirm_edit' && ($user->rights->fournisseur->facture->supprimer || ($usercancreate && $isErasable == 1))) { // isErasable = 1 means draft with temporary ref (draft can always be deleted with no need of permissions)
- //var_dump($isErasable);
+ if ($action != 'confirm_edit' && ($usercandelete || ($usercancreate && $isErasable == 1))) { // isErasable = 1 means draft with temporary ref (draft can always be deleted with no need of permissions)
+ $enableDelete = false;
+ $htmltooltip = '';
+ $params = (empty($conf->use_javascript_ajax) ? array() : array('attr' => array('class' => 'reposition')));
+ //var_dump($isErasable); var_dump($params);
if ($isErasable == -4) {
- print ''.$langs->trans('Delete').' ';
+ $htmltooltip = $langs->trans("DisabledBecausePayments");
} elseif ($isErasable == -3) { // Should never happen with supplier invoice
- print ''.$langs->trans('Delete').' ';
+ $htmltooltip = $langs->trans("DisabledBecauseNotLastSituationInvoice");
} elseif ($isErasable == -2) { // Should never happen with supplier invoice
- print ''.$langs->trans('Delete').' ';
+ $htmltooltip = $langs->trans("DisabledBecauseNotLastInvoice");
} elseif ($isErasable == -1) {
- print ''.$langs->trans('Delete').' ';
+ $htmltooltip = $langs->trans("DisabledBecauseDispatchedInBookkeeping");
} elseif ($isErasable <= 0) { // Any other cases
- print ''.$langs->trans('Delete').' ';
+ $htmltooltip = $langs->trans("DisabledBecauseNotErasable");
} else {
- print 'id.'&action=delete&token='.newToken().'">'.$langs->trans('Delete').' ';
+ $enableDelete = true;
+ $htmltooltip = '';
}
+ print dolGetButtonAction($htmltooltip, $langs->trans("Delete"), 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), $object->id, $enableDelete, $params);
}
print '';
diff --git a/htdocs/fourn/facture/contact.php b/htdocs/fourn/facture/contact.php
index f9f7a754b8f..542b37db092 100644
--- a/htdocs/fourn/facture/contact.php
+++ b/htdocs/fourn/facture/contact.php
@@ -51,6 +51,9 @@ $hookmanager->initHooks(array('invoicesuppliercardcontact'));
$object = new FactureFournisseur($db);
+$usercancreate = ($user->rights->fournisseur->facture->creer || $user->rights->supplier_invoice->creer);
+$permissiontoadd = $usercancreate;
+
/*
* Ajout d'un nouveau contact
@@ -133,40 +136,28 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1);
if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
$morehtmlref .= ' ('.$langs->trans("OtherBills").' )';
}
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->facture->creer) {
+ $morehtmlref .= ' ';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/fourn/facture/document.php b/htdocs/fourn/facture/document.php
index fa08b721370..03012acbcaf 100644
--- a/htdocs/fourn/facture/document.php
+++ b/htdocs/fourn/facture/document.php
@@ -112,40 +112,28 @@ if ($object->id > 0) {
$morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1);
if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
$morehtmlref .= ' ('.$langs->trans("OtherBills").' )';
}
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->facture->creer) {
+ $morehtmlref .= ' ';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/fourn/facture/info.php b/htdocs/fourn/facture/info.php
index a4322c2448e..9223d47b791 100644
--- a/htdocs/fourn/facture/info.php
+++ b/htdocs/fourn/facture/info.php
@@ -49,6 +49,9 @@ $hookmanager->initHooks(array('invoicesuppliercardinfo'));
$object = new FactureFournisseur($db);
+$usercancreate = ($user->rights->fournisseur->facture->creer || $user->rights->supplier_invoice->creer);
+$permissiontoadd = $usercancreate;
+
/*
* View
@@ -75,40 +78,28 @@ $morehtmlref = '';
$morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
-$morehtmlref .= '
'.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+$morehtmlref .= '
'.$object->thirdparty->getNomUrl(1);
if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
$morehtmlref .= ' (
'.$langs->trans("OtherBills").' )';
}
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= '
'.$langs->trans('Project').' ';
- if ($user->rights->facture->creer) {
+ $morehtmlref .= '
';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->thirdparty->id, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->thirdparty->id, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php
index 6e006704a83..0f7a2660bf8 100644
--- a/htdocs/fourn/facture/list.php
+++ b/htdocs/fourn/facture/list.php
@@ -72,7 +72,6 @@ $search_all = trim((GETPOST('search_all', 'alphanohtml') != '') ?GETPOST('search
$search_label = GETPOST("search_label", "alpha");
$search_amount_no_tax = GETPOST("search_amount_no_tax", "alpha");
$search_amount_all_tax = GETPOST("search_amount_all_tax", "alpha");
-$search_product_category = GETPOST('search_product_category', 'int');
$search_ref = GETPOST('sf_ref') ?GETPOST('sf_ref', 'alpha') : GETPOST('search_ref', 'alpha');
$search_refsupplier = GETPOST('search_refsupplier', 'alpha');
$search_type = GETPOST('search_type', 'int');
@@ -116,10 +115,10 @@ $search_datelimit_endmonth = GETPOST('search_datelimit_endmonth', 'int');
$search_datelimit_endyear = GETPOST('search_datelimit_endyear', 'int');
$search_datelimit_start = dol_mktime(0, 0, 0, $search_datelimit_startmonth, $search_datelimit_startday, $search_datelimit_startyear);
$search_datelimit_end = dol_mktime(23, 59, 59, $search_datelimit_endmonth, $search_datelimit_endday, $search_datelimit_endyear);
-$toselect = GETPOST('toselect', 'array');
$search_btn = GETPOST('button_search', 'alpha');
$search_remove_btn = GETPOST('button_removefilter', 'alpha');
$search_categ_sup = trim(GETPOST("search_categ_sup", 'int'));
+$search_product_category = GETPOST('search_product_category', 'int');
$option = GETPOST('search_option');
if ($option == 'late') {
@@ -162,9 +161,9 @@ $search_array_options = $extrafields->getOptionalsFromPost($object->table_elemen
$fieldstosearchall = array(
'f.ref'=>'Ref',
'f.ref_supplier'=>'RefSupplier',
- 'pd.description'=>'Description',
- 's.nom'=>"ThirdParty",
'f.note_public'=>'NotePublic',
+ 's.nom'=>"ThirdParty",
+ 'pd.description'=>'Description',
);
if (empty($user->socid)) {
$fieldstosearchall["f.note_private"] = "NotePrivate";
@@ -296,10 +295,10 @@ if (empty($reshook)) {
$search_datelimit_end = '';
$toselect = array();
$search_array_options = array();
+ $search_categ_sup = 0;
$filter = '';
$option = '';
$socid = "";
- $search_categ_sup = 0;
}
// Mass actions
@@ -346,7 +345,7 @@ if (empty($reshook)) {
$rsql .= " , pfd.date_traite as date_traite";
$rsql .= " , pfd.amount";
$rsql .= " , u.rowid as user_id, u.lastname, u.firstname, u.login";
- $rsql .= " FROM ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+ $rsql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
$rsql .= " , ".MAIN_DB_PREFIX."user as u";
$rsql .= " WHERE fk_facture_fourn = ".((int) $objecttmp->id);
$rsql .= " AND pfd.fk_user_demande = u.rowid";
@@ -406,7 +405,7 @@ $formcompany = new FormCompany($db);
$thirdparty = new Societe($db);
$sql = "SELECT";
-if ($search_all || $search_product_category > 0) {
+if ($search_all) {
$sql = 'SELECT DISTINCT';
}
$sql .= " f.rowid as facid, f.ref, f.ref_supplier, f.type, f.datef, f.date_lim_reglement as datelimite, f.fk_mode_reglement, f.fk_cond_reglement,";
@@ -421,9 +420,6 @@ $sql .= " state.code_departement as state_code, state.nom as state_name,";
$sql .= " country.code as country_code,";
$sql .= " p.rowid as project_id, p.ref as project_ref, p.title as project_label,";
$sql .= ' u.login, u.lastname, u.firstname, u.email as user_email, u.statut as user_statut, u.entity, u.photo, u.office_phone, u.office_fax, u.user_mobile, u.job, u.gender';
-if ($search_categ_sup && $search_categ_sup != '-1') {
- $sql .= ", cs.fk_categorie, cs.fk_soc";
-}
// We need dynamount_payed to be able to sort on status (value is surely wrong because we can count several lines several times due to other left join or link with contacts. But what we need is just 0 or > 0)
// TODO Better solution to be able to sort on already payed or remain to pay is to store amount_payed in a denormalized field.
if (!$search_all) {
@@ -437,16 +433,12 @@ if (!empty($extrafields->attributes[$object->table_element]['label'])) {
}
// Add fields from hooks
$parameters = array();
-$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$sql .= $hookmanager->resPrint;
$sql .= ' FROM '.MAIN_DB_PREFIX.'societe as s';
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typent)";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)";
-if (!empty($search_categ_sup) && $search_categ_supplier != '-1') {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_fournisseur as cs ON s.rowid = cs.fk_soc";
-}
-
$sql .= ', '.MAIN_DB_PREFIX.'facture_fourn as f';
if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (f.rowid = ef.fk_object)";
@@ -454,12 +446,9 @@ if (isset($extrafields->attributes[$object->table_element]['label']) && is_array
if (!$search_all) {
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'paiementfourn_facturefourn as pf ON pf.fk_facturefourn = f.rowid';
}
-if ($search_all || $search_product_category > 0) {
+if ($search_all) {
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'facture_fourn_det as pd ON f.rowid=pd.fk_facture_fourn';
}
-if ($search_product_category > 0) {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_product as cp ON cp.fk_product=pd.fk_product';
-}
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'user AS u ON f.fk_user_author = u.rowid';
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet as p ON p.rowid = f.fk_projet";
// We'll need this table joined to the select in order to filter by sale
@@ -479,9 +468,6 @@ $sql .= ' AND f.entity IN ('.getEntity('facture_fourn').')';
if (empty($user->rights->societe->client->voir) && !$socid) {
$sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
}
-if ($search_product_category > 0) {
- $sql .= " AND cp.fk_categorie = ".((int) $search_product_category);
-}
if ($socid > 0) {
$sql .= ' AND s.rowid = '.((int) $socid);
}
@@ -598,11 +584,65 @@ if ($option == 'late') {
if ($search_label) {
$sql .= natural_search('f.libelle', $search_label);
}
-if ($search_categ_sup > 0) {
- $sql .= " AND cs.fk_categorie = ".((int) $search_categ_sup);
+$searchCategorySupplierList = $search_categ_sup ? array($search_categ_sup) : array();
+$searchCategorySupplierOperator = 0;
+// Search for tag/category ($searchCategorySupplierList is an array of ID)
+if (!empty($searchCategorySupplierList)) {
+ $searchCategorySupplierSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategorySupplierList as $searchCategorySupplier) {
+ if (intval($searchCategorySupplier) == -2) {
+ $searchCategorySupplierSqlList[] = "NOT EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_fournisseur as ck WHERE s.rowid = ck.fk_soc)";
+ } elseif (intval($searchCategorySupplier) > 0) {
+ if ($searchCategorySupplierOperator == 0) {
+ $searchCategorySupplierSqlList[] = " EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_fournisseur as ck WHERE s.rowid = ck.fk_soc AND ck.fk_categorie = ".((int) $searchCategorySupplier).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategorySupplier);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategorySupplierSqlList[] = " EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_fournisseur as ck WHERE s.rowid = ck.fk_soc AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategorySupplierOperator == 1) {
+ if (!empty($searchCategorySupplierSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategorySupplierSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategorySupplierSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategorySupplierSqlList).")";
+ }
+ }
}
-if ($search_categ_sup == -2) {
- $sql .= " AND cs.fk_categorie IS NULL";
+// Search for tag/category ($searchCategoryProductList is an array of ID)
+$searchCategoryProductList = $search_product_category ? array($search_product_category) : array();
+$searchCategoryProductOperator = 0;
+if (!empty($searchCategoryProductList)) {
+ $searchCategoryProductSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategoryProductList as $searchCategoryProduct) {
+ if (intval($searchCategoryProduct) == -2) {
+ $searchCategoryProductSqlList[] = "NOT EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."facture_fourn_det as fd WHERE fd.fk_facture_fourn = f.rowid AND p.rowid = ck.fk_product)";
+ } elseif (intval($searchCategoryProduct) > 0) {
+ if ($searchCategoryProductOperator == 0) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."facture_fourn_det as fd WHERE fd.fk_facture_fourn = f.rowid AND p.rowid = ck.fk_product AND ck.fk_categorie = ".((int) $searchCategoryProduct).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProduct);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."facture_fourn_det as fd WHERE fd.fk_facture_fourn = f.rowid AND p.rowid = ck.fk_product AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategoryProductOperator == 1) {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
+ }
+ }
}
if ($search_status != '' && $search_status >= 0) {
$sql .= " AND f.fk_statut = ".((int) $search_status);
@@ -624,7 +664,7 @@ if ($search_user > 0) {
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
// Add where from hooks
$parameters = array();
-$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$sql .= $hookmanager->resPrint;
if (!$search_all) {
@@ -640,9 +680,6 @@ if (!$search_all) {
$sql .= ' country.code,';
$sql .= " p.rowid, p.ref, p.title,";
$sql .= " u.login, u.lastname, u.firstname, u.email, u.statut, u.entity, u.photo, u.office_phone, u.office_fax, u.user_mobile, u.job, u.gender";
- if ($search_categ_sup && $search_categ_sup != '-1') {
- $sql .= ", cs.fk_categorie, cs.fk_soc";
- }
if (!empty($extrafields->attributes[$object->table_element]['label'])) {
foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
//prevent error with sql_mode=only_full_group_by
@@ -651,7 +688,7 @@ if (!$search_all) {
}
// Add GroupBy from hooks
$parameters = array('all' => $search_all, 'fieldstosearchall' => $fieldstosearchall);
- $reshook = $hookmanager->executeHooks('printFieldListGroupBy', $parameters, $object); // Note that $action and $object may have been modified by hook
+ $reshook = $hookmanager->executeHooks('printFieldListGroupBy', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$sql .= $hookmanager->resPrint;
} else {
$sql .= natural_search(array_keys($fieldstosearchall), $search_all);
@@ -659,7 +696,7 @@ if (!$search_all) {
// Add HAVING from hooks
$parameters = array();
-$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$sql .= empty($hookmanager->resPrint) ? "" : " HAVING 1=1 ".$hookmanager->resPrint;
$sql .= $db->order($sortfield, $sortorder);
@@ -678,1053 +715,702 @@ $sql .= $db->plimit($limit + 1, $offset);
//print $sql;
$resql = $db->query($sql);
-if ($resql) {
- $num = $db->num_rows($resql);
+if (!$resql) {
+ dol_print_error($db);
+}
- $arrayofselected = is_array($toselect) ? $toselect : array();
+$num = $db->num_rows($resql);
- if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all) {
- $obj = $db->fetch_object($resql);
- $id = $obj->facid;
+$arrayofselected = is_array($toselect) ? $toselect : array();
- header("Location: ".DOL_URL_ROOT.'/fourn/facture/card.php?facid='.$id);
- exit;
- }
+if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all) {
+ $obj = $db->fetch_object($resql);
+ $id = $obj->facid;
- llxHeader('', $langs->trans("SuppliersInvoices"), 'EN:Suppliers_Invoices|FR:FactureFournisseur|ES:Facturas_de_proveedores');
+ header("Location: ".DOL_URL_ROOT.'/fourn/facture/card.php?facid='.$id);
+ exit;
+}
- if ($socid) {
- $soc = new Societe($db);
- $soc->fetch($socid);
- if (empty($search_company)) {
- $search_company = $soc->name;
- $search_company_alias = $soc->name_alias;
- }
- }
+llxHeader('', $langs->trans("SuppliersInvoices"), 'EN:Suppliers_Invoices|FR:FactureFournisseur|ES:Facturas_de_proveedores');
- $param = '&socid='.$socid;
- if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
- $param .= '&contextpage='.urlencode($contextpage);
- }
- if ($limit > 0 && $limit != $conf->liste_limit) {
- $param .= '&limit='.urlencode($limit);
- }
- if ($search_all) {
- $param .= '&search_all='.urlencode($search_all);
- }
- if ($search_date_startday) {
- $param .= '&search_date_startday='.urlencode($search_date_startday);
- }
- if ($search_date_startmonth) {
- $param .= '&search_date_startmonth='.urlencode($search_date_startmonth);
- }
- if ($search_date_startyear) {
- $param .= '&search_date_startyear='.urlencode($search_date_startyear);
- }
- if ($search_date_endday) {
- $param .= '&search_date_endday='.urlencode($search_date_endday);
- }
- if ($search_date_endmonth) {
- $param .= '&search_date_endmonth='.urlencode($search_date_endmonth);
- }
- if ($search_date_endyear) {
- $param .= '&search_date_endyear='.urlencode($search_date_endyear);
- }
- if ($search_datelimit_startday) {
- $param .= '&search_datelimit_startday='.urlencode($search_datelimit_startday);
- }
- if ($search_datelimit_startmonth) {
- $param .= '&search_datelimit_startmonth='.urlencode($search_datelimit_startmonth);
- }
- if ($search_datelimit_startyear) {
- $param .= '&search_datelimit_startyear='.urlencode($search_datelimit_startyear);
- }
- if ($search_datelimit_endday) {
- $param .= '&search_datelimit_endday='.urlencode($search_datelimit_endday);
- }
- if ($search_datelimit_endmonth) {
- $param .= '&search_datelimit_endmonth='.urlencode($search_datelimit_endmonth);
- }
- if ($search_datelimit_endyear) {
- $param .= '&search_datelimit_endyear='.urlencode($search_datelimit_endyear);
- }
- if ($search_ref) {
- $param .= '&search_ref='.urlencode($search_ref);
- }
- if ($search_refsupplier) {
- $param .= '&search_refsupplier='.urlencode($search_refsupplier);
- }
- if ($search_type != '') {
- $param .= '&search_type='.urlencode($search_type);
- }
- if ($search_label) {
- $param .= '&search_label='.urlencode($search_label);
- }
- if ($search_company) {
- $param .= '&search_company='.urlencode($search_company);
- }
- if ($search_company_alias) {
- $param .= '&search_company_alias='.urlencode($search_company_alias);
- }
- if ($search_login) {
- $param .= '&search_login='.urlencode($search_login);
- }
- if ($search_montant_ht != '') {
- $param .= '&search_montant_ht='.urlencode($search_montant_ht);
- }
- if ($search_montant_vat != '') {
- $param .= '&search_montant_vat='.urlencode($search_montant_vat);
- }
- if ($search_montant_localtax1 != '') {
- $param .= '&search_montant_localtax1='.urlencode($search_montant_localtax1);
- }
- if ($search_montant_localtax2 != '') {
- $param .= '&search_montant_localtax2='.urlencode($search_montant_localtax2);
- }
- if ($search_montant_ttc != '') {
- $param .= '&search_montant_ttc='.urlencode($search_montant_ttc);
- }
- if ($search_multicurrency_code != '') {
- $param .= '&search_multicurrency_code='.urlencode($search_multicurrency_code);
- }
- if ($search_multicurrency_tx != '') {
- $param .= '&search_multicurrency_tx='.urlencode($search_multicurrency_tx);
- }
- if ($search_multicurrency_montant_ht != '') {
- $param .= '&search_multicurrency_montant_ht='.urlencode($search_multicurrency_montant_ht);
- }
- if ($search_multicurrency_montant_vat != '') {
- $param .= '&search_multicurrency_montant_vat='.urlencode($search_multicurrency_montant_vat);
- }
- if ($search_multicurrency_montant_ttc != '') {
- $param .= '&search_multicurrency_montant_ttc='.urlencode($search_multicurrency_montant_ttc);
- }
- if ($search_amount_no_tax) {
- $param .= '&search_amount_no_tax='.urlencode($search_amount_no_tax);
- }
- if ($search_amount_all_tax) {
- $param .= '&search_amount_all_tax='.urlencode($search_amount_all_tax);
- }
- if ($search_status >= 0) {
- $param .= "&search_status=".urlencode($search_status);
- }
- if ($show_files) {
- $param .= '&show_files='.urlencode($show_files);
- }
- if ($option) {
- $param .= "&search_option=".urlencode($option);
- }
- if ($optioncss != '') {
- $param .= '&optioncss='.urlencode($optioncss);
- }
- if ($search_categ_sup > 0) {
- $param .= '&search_categ_sup='.urlencode($search_categ_sup);
- }
- if ($search_type_thirdparty != '' && $search_type_thirdparty > 0) {
- $param .= '&search_type_thirdparty='.urlencode($search_type_thirdparty);
+if ($socid) {
+ $soc = new Societe($db);
+ $soc->fetch($socid);
+ if (empty($search_company)) {
+ $search_company = $soc->name;
+ $search_company_alias = $soc->name_alias;
}
+}
- // Add $param from extra fields
- include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
- // Add $param from hooks
- $parameters = array();
- $reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
- $param .= $hookmanager->resPrint;
+$param = '&socid='.$socid;
+if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
+ $param .= '&contextpage='.urlencode($contextpage);
+}
+if ($limit > 0 && $limit != $conf->liste_limit) {
+ $param .= '&limit='.urlencode($limit);
+}
+if ($search_all) {
+ $param .= '&search_all='.urlencode($search_all);
+}
+if ($search_date_startday) {
+ $param .= '&search_date_startday='.urlencode($search_date_startday);
+}
+if ($search_date_startmonth) {
+ $param .= '&search_date_startmonth='.urlencode($search_date_startmonth);
+}
+if ($search_date_startyear) {
+ $param .= '&search_date_startyear='.urlencode($search_date_startyear);
+}
+if ($search_date_endday) {
+ $param .= '&search_date_endday='.urlencode($search_date_endday);
+}
+if ($search_date_endmonth) {
+ $param .= '&search_date_endmonth='.urlencode($search_date_endmonth);
+}
+if ($search_date_endyear) {
+ $param .= '&search_date_endyear='.urlencode($search_date_endyear);
+}
+if ($search_datelimit_startday) {
+ $param .= '&search_datelimit_startday='.urlencode($search_datelimit_startday);
+}
+if ($search_datelimit_startmonth) {
+ $param .= '&search_datelimit_startmonth='.urlencode($search_datelimit_startmonth);
+}
+if ($search_datelimit_startyear) {
+ $param .= '&search_datelimit_startyear='.urlencode($search_datelimit_startyear);
+}
+if ($search_datelimit_endday) {
+ $param .= '&search_datelimit_endday='.urlencode($search_datelimit_endday);
+}
+if ($search_datelimit_endmonth) {
+ $param .= '&search_datelimit_endmonth='.urlencode($search_datelimit_endmonth);
+}
+if ($search_datelimit_endyear) {
+ $param .= '&search_datelimit_endyear='.urlencode($search_datelimit_endyear);
+}
+if ($search_ref) {
+ $param .= '&search_ref='.urlencode($search_ref);
+}
+if ($search_refsupplier) {
+ $param .= '&search_refsupplier='.urlencode($search_refsupplier);
+}
+if ($search_type != '') {
+ $param .= '&search_type='.urlencode($search_type);
+}
+if ($search_label) {
+ $param .= '&search_label='.urlencode($search_label);
+}
+if ($search_company) {
+ $param .= '&search_company='.urlencode($search_company);
+}
+if ($search_company_alias) {
+ $param .= '&search_company_alias='.urlencode($search_company_alias);
+}
+if ($search_login) {
+ $param .= '&search_login='.urlencode($search_login);
+}
+if ($search_montant_ht != '') {
+ $param .= '&search_montant_ht='.urlencode($search_montant_ht);
+}
+if ($search_montant_vat != '') {
+ $param .= '&search_montant_vat='.urlencode($search_montant_vat);
+}
+if ($search_montant_localtax1 != '') {
+ $param .= '&search_montant_localtax1='.urlencode($search_montant_localtax1);
+}
+if ($search_montant_localtax2 != '') {
+ $param .= '&search_montant_localtax2='.urlencode($search_montant_localtax2);
+}
+if ($search_montant_ttc != '') {
+ $param .= '&search_montant_ttc='.urlencode($search_montant_ttc);
+}
+if ($search_multicurrency_code != '') {
+ $param .= '&search_multicurrency_code='.urlencode($search_multicurrency_code);
+}
+if ($search_multicurrency_tx != '') {
+ $param .= '&search_multicurrency_tx='.urlencode($search_multicurrency_tx);
+}
+if ($search_multicurrency_montant_ht != '') {
+ $param .= '&search_multicurrency_montant_ht='.urlencode($search_multicurrency_montant_ht);
+}
+if ($search_multicurrency_montant_vat != '') {
+ $param .= '&search_multicurrency_montant_vat='.urlencode($search_multicurrency_montant_vat);
+}
+if ($search_multicurrency_montant_ttc != '') {
+ $param .= '&search_multicurrency_montant_ttc='.urlencode($search_multicurrency_montant_ttc);
+}
+if ($search_amount_no_tax) {
+ $param .= '&search_amount_no_tax='.urlencode($search_amount_no_tax);
+}
+if ($search_amount_all_tax) {
+ $param .= '&search_amount_all_tax='.urlencode($search_amount_all_tax);
+}
+if ($search_status >= 0) {
+ $param .= "&search_status=".urlencode($search_status);
+}
+if ($show_files) {
+ $param .= '&show_files='.urlencode($show_files);
+}
+if ($option) {
+ $param .= "&search_option=".urlencode($option);
+}
+if ($optioncss != '') {
+ $param .= '&optioncss='.urlencode($optioncss);
+}
+if ($search_categ_sup > 0) {
+ $param .= '&search_categ_sup='.urlencode($search_categ_sup);
+}
+if ($search_type_thirdparty != '' && $search_type_thirdparty > 0) {
+ $param .= '&search_type_thirdparty='.urlencode($search_type_thirdparty);
+}
- // List of mass actions available
- $arrayofmassactions = array(
- 'validate'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
- 'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
- //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
- //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
+// Add $param from extra fields
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
+// Add $param from hooks
+$parameters = array();
+$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+$param .= $hookmanager->resPrint;
+
+// List of mass actions available
+$arrayofmassactions = array(
+ 'validate'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
+ 'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
+ //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
+ //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
+);
+
+if (isModEnabled('paymentbybanktransfer') && !empty($user->rights->paymentbybanktransfer->create)) {
+ $langs->load('withdrawals');
+ $arrayofmassactions['banktransfertrequest'] = img_picto('', 'payment', 'class="pictofixedwidth"').$langs->trans("MakeBankTransferOrder");
+}
+if ($user->rights->fournisseur->facture->supprimer) {
+ $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
+}
+if (in_array($massaction, array('presend', 'predelete'))) {
+ $arrayofmassactions = array();
+}
+$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
+
+$url = DOL_URL_ROOT.'/fourn/facture/card.php?action=create';
+if (!empty($socid)) {
+ $url .= '&socid='.urlencode($socid);
+}
+$newcardbutton = dolGetButtonTitle($langs->trans('NewBill'), '', 'fa fa-plus-circle', $url, '', ($user->rights->fournisseur->facture->creer || $user->rights->supplier_invoice->creer));
+
+$i = 0;
+print '
'."\n";
+if ($optioncss != '') {
+ print ' ';
+}
+print ' ';
+print ' ';
+print ' ';
+print ' ';
+print ' ';
+print ' ';
+
+print_barre_liste($langs->trans("BillsSuppliers").($socid ? ' '.$soc->name : ''), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'supplier_invoice', 0, $newcardbutton, '', $limit, 0, 0, 1);
+
+$topicmail = "SendBillRef";
+$modelmail = "invoice_supplier_send";
+$objecttmp = new FactureFournisseur($db);
+$trackid = 'sinv'.$object->id;
+include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
+
+if ($search_all) {
+ foreach ($fieldstosearchall as $key => $val) {
+ $fieldstosearchall[$key] = $langs->trans($val);
+ }
+ print ''.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
';
+}
+
+// If the user can view prospects other than his'
+$moreforfilter = '';
+if ($user->rights->user->user->lire) {
+ $langs->load("commercial");
+ $moreforfilter .= '';
+ $tmptitle = $langs->trans('ThirdPartiesOfSaleRepresentative');
+ $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$formother->select_salesrepresentatives($search_sale, 'search_sale', $user, 0, $tmptitle, 'maxwidth200');
+ $moreforfilter .= '
';
+}
+// If the user can view prospects other than his'
+if ($user->rights->user->user->lire) {
+ $moreforfilter .= '';
+ $tmptitle = $langs->trans('LinkedToSpecificUsers');
+ $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$form->select_dolusers($search_user, 'search_user', $tmptitle, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth200');
+ $moreforfilter .= '
';
+}
+// If the user can view prospects other than his'
+if (isModEnabled('categorie') && $user->rights->categorie->lire && ($user->rights->produit->lire || $user->rights->service->lire)) {
+ include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
+ $moreforfilter .= '';
+ $tmptitle = $langs->trans('IncludingProductWithTag');
+ $cate_arbo = $form->select_all_categories(Categorie::TYPE_PRODUCT, null, 'parent', null, null, 1);
+ $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$form->selectarray('search_product_category', $cate_arbo, $search_product_category, $tmptitle, 0, 0, '', 0, 0, 0, 0, 'maxwidth300 widthcentpercentminusx', 1);
+ $moreforfilter .= '
';
+}
+
+if (isModEnabled('categorie')) {
+ require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
+ $moreforfilter .= '';
+ $tmptitle = $langs->trans('SuppliersCategoriesShort');
+ $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$formother->select_categories('supplier', $search_categ_sup, 'search_categ_sup', 1, $tmptitle);
+ $moreforfilter .= '
';
+}
+$parameters = array();
+$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+if (empty($reshook)) {
+ $moreforfilter .= $hookmanager->resPrint;
+} else {
+ $moreforfilter = $hookmanager->resPrint;
+}
+
+if ($moreforfilter) {
+ print '';
+ print $moreforfilter;
+ print '
';
+}
+
+$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
+$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
+if ($massactionbutton) {
+ $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
+}
+
+print '';
+print '
'."\n";
+
+// Line for filters
+print '';
+// Action column
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons('left');
+ print $searchpicto;
+ print ' ';
+}
+// Ref
+if (!empty($arrayfields['f.ref']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+}
+// Ref supplier
+if (!empty($arrayfields['f.ref_supplier']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+}
+// Type
+if (!empty($arrayfields['f.type']['checked'])) {
+ print '';
+ $listtype = array(
+ FactureFournisseur::TYPE_STANDARD=>$langs->trans("InvoiceStandard"),
+ FactureFournisseur::TYPE_REPLACEMENT=>$langs->trans("InvoiceReplacement"),
+ FactureFournisseur::TYPE_CREDIT_NOTE=>$langs->trans("InvoiceAvoir"),
+ FactureFournisseur::TYPE_DEPOSIT=>$langs->trans("InvoiceDeposit"),
);
+ /*
+ if (!empty($conf->global->INVOICE_USE_SITUATION))
+ {
+ $listtype[Facture::TYPE_SITUATION] = $langs->trans("InvoiceSituation");
+ }
+ */
+ //$listtype[Facture::TYPE_PROFORMA]=$langs->trans("InvoiceProForma"); // A proformat invoice is not an invoice but must be an order.
+ print $form->selectarray('search_type', $listtype, $search_type, 1, 0, 0, '', 0, 0, 0, 'ASC', 'maxwidth100');
+ print ' ';
+}
+// Label
+if (!empty($arrayfields['f.label']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+}
+// Date invoice
+if (!empty($arrayfields['f.datef']['checked'])) {
+ print '';
+ print '';
+ print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
+ print '
';
+ print '';
+ print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
+ print '
';
+ print ' ';
+}
+// Date due
+if (!empty($arrayfields['f.date_lim_reglement']['checked'])) {
+ print '';
+ print '';
+ /*
+ print $langs->trans('From').' ';
+ print $form->selectDate($search_datelimit_start ? $search_datelimit_start : -1, 'search_datelimit_start', 0, 0, 1);
+ print '
';
+ print '';
+ print $langs->trans('to').' ';*/
+ print $form->selectDate($search_datelimit_end ? $search_datelimit_end : -1, 'search_datelimit_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("Before"));
+ print ' '.$langs->trans("Alert");
+ print '
';
+ print ' ';
+}
+// Project
+if (!empty($arrayfields['p.ref']['checked'])) {
+ print ' ';
+}
+// Thirpdarty
+if (!empty($arrayfields['s.nom']['checked'])) {
+ print ' 0 ? " disabled" : "").'> ';
+}
+// Alias
+if (!empty($arrayfields['s.name_alias']['checked'])) {
+ print ' ';
+}
+// Town
+if (!empty($arrayfields['s.town']['checked'])) {
+ print ' ';
+}
+// Zip
+if (!empty($arrayfields['s.zip']['checked'])) {
+ print ' ';
+}
+// State
+if (!empty($arrayfields['state.nom']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+}
+// Country
+if (!empty($arrayfields['country.code_iso']['checked'])) {
+ print '';
+ print $form->select_country($search_country, 'search_country', '', 0, 'minwidth100imp maxwidth100');
+ print ' ';
+}
+// Company type
+if (!empty($arrayfields['typent.code']['checked'])) {
+ print '';
+ print $form->selectarray("search_type_thirdparty", $formcompany->typent_array(0), $search_type_thirdparty, 1, 0, 0, '', 0, 0, 0, (empty($conf->global->SOCIETE_SORT_ON_TYPEENT) ? 'ASC' : $conf->global->SOCIETE_SORT_ON_TYPEENT), '', 1);
+ print ' ';
+}
+// Condition of payment
+if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) {
+ print '';
+ print $form->getSelectConditionsPaiements($search_paymentcond, 'search_paymentcond', -1, 1, 1, 'maxwidth100');
+ print ' ';
+}
+// Payment mode
+if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) {
+ print '';
+ print $form->select_types_paiements($search_paymentmode, 'search_paymentmode', '', 0, 1, 1, 20, 1, 'maxwidth100', 1);
+ print ' ';
+}
+if (!empty($arrayfields['f.total_ht']['checked'])) {
+ // Amount without tax
+ print '';
+ print ' ';
+ print ' ';
+}
+if (!empty($arrayfields['f.total_vat']['checked'])) {
+ // Amount vat
+ print '';
+ print ' ';
+ print ' ';
+}
+if (!empty($arrayfields['f.total_localtax1']['checked'])) {
+ // Amount tax 1
+ print '';
+ print ' ';
+ print ' ';
+}
+if (!empty($arrayfields['f.total_localtax2']['checked'])) {
+ // Amount tax 2
+ print '';
+ print ' ';
+ print ' ';
+}
+if (!empty($arrayfields['f.total_ttc']['checked'])) {
+ // Amount inc tac
+ print '';
+ print ' ';
+ print ' ';
+}
+if (!empty($arrayfields['u.login']['checked'])) {
+ // Author
+ print '';
+ print ' ';
+ print ' ';
+}
+if (!empty($arrayfields['dynamount_payed']['checked'])) {
+ print '';
+ print ' ';
+}
+if (!empty($arrayfields['rtp']['checked'])) {
+ print '';
+ print ' ';
+}
+if (!empty($arrayfields['f.multicurrency_code']['checked'])) {
+ // Currency
+ print '';
+ print $form->selectMultiCurrency($search_multicurrency_code, 'search_multicurrency_code', 1);
+ print ' ';
+}
+if (!empty($arrayfields['f.multicurrency_tx']['checked'])) {
+ // Currency rate
+ print '';
+ print ' ';
+ print ' ';
+}
+if (!empty($arrayfields['f.multicurrency_total_ht']['checked'])) {
+ // Amount
+ print '';
+ print ' ';
+ print ' ';
+}
+if (!empty($arrayfields['f.multicurrency_total_vat']['checked'])) {
+ // Amount
+ print '';
+ print ' ';
+ print ' ';
+}
+if (!empty($arrayfields['f.multicurrency_total_ttc']['checked'])) {
+ // Amount
+ print '';
+ print ' ';
+ print ' ';
+}
+if (!empty($arrayfields['multicurrency_dynamount_payed']['checked'])) {
+ print '';
+ print ' ';
+}
+if (!empty($arrayfields['multicurrency_rtp']['checked'])) {
+ print '';
+ print ' ';
+}
+// Extra fields
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
- if (isModEnabled('paymentbybanktransfer') && !empty($user->rights->paymentbybanktransfer->create)) {
- $langs->load('withdrawals');
- $arrayofmassactions['banktransfertrequest'] = img_picto('', 'payment', 'class="pictofixedwidth"').$langs->trans("MakeBankTransferOrder");
- }
- if ($user->rights->fournisseur->facture->supprimer) {
- $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
- }
- if (in_array($massaction, array('presend', 'predelete'))) {
- $arrayofmassactions = array();
- }
- $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
-
- $url = DOL_URL_ROOT.'/fourn/facture/card.php?action=create';
- if (!empty($socid)) {
- $url .= '&socid='.urlencode($socid);
- }
- $newcardbutton = dolGetButtonTitle($langs->trans('NewBill'), '', 'fa fa-plus-circle', $url, '', ($user->rights->fournisseur->facture->creer || $user->rights->supplier_invoice->creer));
-
- $i = 0;
- print ''."\n";
- if ($optioncss != '') {
- print ' ';
- }
- print ' ';
- print ' ';
- print ' ';
- print ' ';
- print ' ';
- print ' ';
-
- print_barre_liste($langs->trans("BillsSuppliers").($socid ? ' '.$soc->name : ''), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'supplier_invoice', 0, $newcardbutton, '', $limit, 0, 0, 1);
-
- $topicmail = "SendBillRef";
- $modelmail = "invoice_supplier_send";
- $objecttmp = new FactureFournisseur($db);
- $trackid = 'sinv'.$object->id;
- include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
-
- if ($search_all) {
- foreach ($fieldstosearchall as $key => $val) {
- $fieldstosearchall[$key] = $langs->trans($val);
- }
- print ''.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
';
- }
-
- // If the user can view prospects other than his'
- $moreforfilter = '';
- if ($user->rights->user->user->lire) {
- $langs->load("commercial");
- $moreforfilter .= '';
- $tmptitle = $langs->trans('ThirdPartiesOfSaleRepresentative');
- $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$formother->select_salesrepresentatives($search_sale, 'search_sale', $user, 0, $tmptitle, 'maxwidth200');
- $moreforfilter .= '
';
- }
- // If the user can view prospects other than his'
- if ($user->rights->user->user->lire) {
- $moreforfilter .= '';
- $tmptitle = $langs->trans('LinkedToSpecificUsers');
- $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$form->select_dolusers($search_user, 'search_user', $tmptitle, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth200');
- $moreforfilter .= '
';
- }
- // If the user can view prospects other than his'
- if (isModEnabled('categorie') && $user->rights->categorie->lire && ($user->rights->produit->lire || $user->rights->service->lire)) {
- include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
- $moreforfilter .= '';
- $tmptitle = $langs->trans('IncludingProductWithTag');
- $cate_arbo = $form->select_all_categories(Categorie::TYPE_PRODUCT, null, 'parent', null, null, 1);
- $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$form->selectarray('search_product_category', $cate_arbo, $search_product_category, $tmptitle, 0, 0, '', 0, 0, 0, 0, 'maxwidth300 widthcentpercentminusx', 1);
- $moreforfilter .= '
';
- }
-
- if (isModEnabled('categorie')) {
- require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
- $moreforfilter .= '';
- $tmptitle = $langs->trans('SuppliersCategoriesShort');
- $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$formother->select_categories('supplier', $search_categ_sup, 'search_categ_sup', 1, $tmptitle);
- $moreforfilter .= '
';
- }
- $parameters = array();
- $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters); // Note that $action and $object may have been modified by hook
- if (empty($reshook)) {
- $moreforfilter .= $hookmanager->resPrint;
- } else {
- $moreforfilter = $hookmanager->resPrint;
- }
-
- if ($moreforfilter) {
- print '';
- print $moreforfilter;
- print '
';
- }
-
- $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
- $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
- if ($massactionbutton) {
- $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
- }
-
- print '';
- print '
'."\n";
-
- // Line for filters
- print '';
- // Ref
- if (!empty($arrayfields['f.ref']['checked'])) {
- print '';
- print ' ';
- print ' ';
- }
- // Ref supplier
- if (!empty($arrayfields['f.ref_supplier']['checked'])) {
- print '';
- print ' ';
- print ' ';
- }
- // Type
- if (!empty($arrayfields['f.type']['checked'])) {
- print '';
- $listtype = array(
- FactureFournisseur::TYPE_STANDARD=>$langs->trans("InvoiceStandard"),
- FactureFournisseur::TYPE_REPLACEMENT=>$langs->trans("InvoiceReplacement"),
- FactureFournisseur::TYPE_CREDIT_NOTE=>$langs->trans("InvoiceAvoir"),
- FactureFournisseur::TYPE_DEPOSIT=>$langs->trans("InvoiceDeposit"),
- );
- /*
- if (!empty($conf->global->INVOICE_USE_SITUATION))
- {
- $listtype[Facture::TYPE_SITUATION] = $langs->trans("InvoiceSituation");
- }
- */
- //$listtype[Facture::TYPE_PROFORMA]=$langs->trans("InvoiceProForma"); // A proformat invoice is not an invoice but must be an order.
- print $form->selectarray('search_type', $listtype, $search_type, 1, 0, 0, '', 0, 0, 0, 'ASC', 'maxwidth100');
- print ' ';
- }
- // Label
- if (!empty($arrayfields['f.label']['checked'])) {
- print '';
- print ' ';
- print ' ';
- }
- // Date invoice
- if (!empty($arrayfields['f.datef']['checked'])) {
- print '';
- print '';
- print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
- print '
';
- print '';
- print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
- print '
';
- print ' ';
- }
- // Date due
- if (!empty($arrayfields['f.date_lim_reglement']['checked'])) {
- print '';
- print '';
- /*
- print $langs->trans('From').' ';
- print $form->selectDate($search_datelimit_start ? $search_datelimit_start : -1, 'search_datelimit_start', 0, 0, 1);
- print '
';
- print '';
- print $langs->trans('to').' ';*/
- print $form->selectDate($search_datelimit_end ? $search_datelimit_end : -1, 'search_datelimit_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("Before"));
- print ' '.$langs->trans("Alert");
- print '
';
- print ' ';
- }
- // Project
- if (!empty($arrayfields['p.ref']['checked'])) {
- print ' ';
- }
- // Thirpdarty
- if (!empty($arrayfields['s.nom']['checked'])) {
- print ' 0 ? " disabled" : "").'> ';
- }
- // Alias
- if (!empty($arrayfields['s.name_alias']['checked'])) {
- print ' ';
- }
- // Town
- if (!empty($arrayfields['s.town']['checked'])) {
- print ' ';
- }
- // Zip
- if (!empty($arrayfields['s.zip']['checked'])) {
- print ' ';
- }
- // State
- if (!empty($arrayfields['state.nom']['checked'])) {
- print '';
- print ' ';
- print ' ';
- }
- // Country
- if (!empty($arrayfields['country.code_iso']['checked'])) {
- print '';
- print $form->select_country($search_country, 'search_country', '', 0, 'minwidth100imp maxwidth100');
- print ' ';
- }
- // Company type
- if (!empty($arrayfields['typent.code']['checked'])) {
- print '';
- print $form->selectarray("search_type_thirdparty", $formcompany->typent_array(0), $search_type_thirdparty, 1, 0, 0, '', 0, 0, 0, (empty($conf->global->SOCIETE_SORT_ON_TYPEENT) ? 'ASC' : $conf->global->SOCIETE_SORT_ON_TYPEENT), '', 1);
- print ' ';
- }
- // Condition of payment
- if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) {
- print '';
- print $form->getSelectConditionsPaiements($search_paymentcond, 'search_paymentcond', -1, 1, 1, 'maxwidth100');
- print ' ';
- }
- // Payment mode
- if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) {
- print '';
- print $form->select_types_paiements($search_paymentmode, 'search_paymentmode', '', 0, 1, 1, 20, 1, 'maxwidth100', 1);
- print ' ';
- }
- if (!empty($arrayfields['f.total_ht']['checked'])) {
- // Amount without tax
- print '';
- print ' ';
- print ' ';
- }
- if (!empty($arrayfields['f.total_vat']['checked'])) {
- // Amount vat
- print '';
- print ' ';
- print ' ';
- }
- if (!empty($arrayfields['f.total_localtax1']['checked'])) {
- // Amount tax 1
- print '';
- print ' ';
- print ' ';
- }
- if (!empty($arrayfields['f.total_localtax2']['checked'])) {
- // Amount tax 2
- print '';
- print ' ';
- print ' ';
- }
- if (!empty($arrayfields['f.total_ttc']['checked'])) {
- // Amount inc tac
- print '';
- print ' ';
- print ' ';
- }
- if (!empty($arrayfields['u.login']['checked'])) {
- // Author
- print '';
- print ' ';
- print ' ';
- }
- if (!empty($arrayfields['dynamount_payed']['checked'])) {
- print '';
- print ' ';
- }
- if (!empty($arrayfields['rtp']['checked'])) {
- print '';
- print ' ';
- }
- if (!empty($arrayfields['f.multicurrency_code']['checked'])) {
- // Currency
- print '';
- print $form->selectMultiCurrency($search_multicurrency_code, 'search_multicurrency_code', 1);
- print ' ';
- }
- if (!empty($arrayfields['f.multicurrency_tx']['checked'])) {
- // Currency rate
- print '';
- print ' ';
- print ' ';
- }
- if (!empty($arrayfields['f.multicurrency_total_ht']['checked'])) {
- // Amount
- print '';
- print ' ';
- print ' ';
- }
- if (!empty($arrayfields['f.multicurrency_total_vat']['checked'])) {
- // Amount
- print '';
- print ' ';
- print ' ';
- }
- if (!empty($arrayfields['f.multicurrency_total_ttc']['checked'])) {
- // Amount
- print '';
- print ' ';
- print ' ';
- }
- if (!empty($arrayfields['multicurrency_dynamount_payed']['checked'])) {
- print '';
- print ' ';
- }
- if (!empty($arrayfields['multicurrency_rtp']['checked'])) {
- print '';
- print ' ';
- }
- // Extra fields
- include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
-
- // Fields from hook
- $parameters = array('arrayfields'=>$arrayfields);
- $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
- print $hookmanager->resPrint;
- // Date creation
- if (!empty($arrayfields['f.datec']['checked'])) {
- print '';
- print ' ';
- }
- // Date modification
- if (!empty($arrayfields['f.tms']['checked'])) {
- print '';
- print ' ';
- }
- // Status
- if (!empty($arrayfields['f.fk_statut']['checked'])) {
- print '';
- $liststatus = array('0'=>$langs->trans("Draft"), '1'=>$langs->trans("Unpaid"), '2'=>$langs->trans("Paid"));
- print $form->selectarray('search_status', $liststatus, $search_status, 1, 0, 0, '', 0, 0, 0, '', '', 1);
- print ' ';
- }
- // Action column
+// Fields from hook
+$parameters = array('arrayfields'=>$arrayfields);
+$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+print $hookmanager->resPrint;
+// Date creation
+if (!empty($arrayfields['f.datec']['checked'])) {
+ print '';
+ print ' ';
+}
+// Date modification
+if (!empty($arrayfields['f.tms']['checked'])) {
+ print '';
+ print ' ';
+}
+// Status
+if (!empty($arrayfields['f.fk_statut']['checked'])) {
+ print '';
+ $liststatus = array('0'=>$langs->trans("Draft"), '1'=>$langs->trans("Unpaid"), '2'=>$langs->trans("Paid"));
+ print $form->selectarray('search_status', $liststatus, $search_status, 1, 0, 0, '', 0, 0, 0, '', '', 1);
+ print ' ';
+}
+// Action column
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
print '';
$searchpicto = $form->showFilterButtons();
print $searchpicto;
print ' ';
+}
- print " \n";
+print "\n";
- print '';
- if (!empty($arrayfields['f.ref']['checked'])) {
- print_liste_field_titre($arrayfields['f.ref']['label'], $_SERVER['PHP_SELF'], 'f.ref,f.rowid', '', $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['f.ref_supplier']['checked'])) {
- print_liste_field_titre($arrayfields['f.ref_supplier']['label'], $_SERVER["PHP_SELF"], 'f.ref_supplier', '', $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['f.type']['checked'])) {
- print_liste_field_titre($arrayfields['f.type']['label'], $_SERVER["PHP_SELF"], 'f.type', '', $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['f.label']['checked'])) {
- print_liste_field_titre($arrayfields['f.label']['label'], $_SERVER['PHP_SELF'], "f.libelle,f.rowid", '', $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['f.datef']['checked'])) {
- print_liste_field_titre($arrayfields['f.datef']['label'], $_SERVER['PHP_SELF'], 'f.datef,f.rowid', '', $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['f.date_lim_reglement']['checked'])) {
- print_liste_field_titre($arrayfields['f.date_lim_reglement']['label'], $_SERVER['PHP_SELF'], "f.date_lim_reglement", '', $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.ref']['checked'])) {
- print_liste_field_titre($arrayfields['p.ref']['label'], $_SERVER['PHP_SELF'], "p.ref", '', $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['s.nom']['checked'])) {
- print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER['PHP_SELF'], 's.nom', '', $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['s.name_alias']['checked'])) {
- print_liste_field_titre($arrayfields['s.name_alias']['label'], $_SERVER['PHP_SELF'], 's.name_alias', '', $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['s.town']['checked'])) {
- print_liste_field_titre($arrayfields['s.town']['label'], $_SERVER["PHP_SELF"], 's.town', '', $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['s.zip']['checked'])) {
- print_liste_field_titre($arrayfields['s.zip']['label'], $_SERVER["PHP_SELF"], 's.zip', '', $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['state.nom']['checked'])) {
- print_liste_field_titre($arrayfields['state.nom']['label'], $_SERVER["PHP_SELF"], "state.name_alias", "", $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['state.name_alias']['checked'])) {
- print_liste_field_titre($arrayfields['state.name_alias']['label'], $_SERVER["PHP_SELF"], "state.nom", "", $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['country.code_iso']['checked'])) {
- print_liste_field_titre($arrayfields['country.code_iso']['label'], $_SERVER["PHP_SELF"], "country.code_iso", "", $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['typent.code']['checked'])) {
- print_liste_field_titre($arrayfields['typent.code']['label'], $_SERVER["PHP_SELF"], "typent.code", "", $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) {
- print_liste_field_titre($arrayfields['f.fk_cond_reglement']['label'], $_SERVER["PHP_SELF"], "f.fk_cond_reglement", "", $param, "", $sortfield, $sortorder);
- }
- if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) {
- print_liste_field_titre($arrayfields['f.fk_mode_reglement']['label'], $_SERVER["PHP_SELF"], "f.fk_mode_reglement", "", $param, "", $sortfield, $sortorder);
- }
- if (!empty($arrayfields['f.total_ht']['checked'])) {
- print_liste_field_titre($arrayfields['f.total_ht']['label'], $_SERVER['PHP_SELF'], 'f.total_ht', '', $param, '', $sortfield, $sortorder, 'right ');
- }
- if (!empty($arrayfields['f.total_vat']['checked'])) {
- print_liste_field_titre($arrayfields['f.total_vat']['label'], $_SERVER['PHP_SELF'], 'f.total_tva', '', $param, '', $sortfield, $sortorder, 'right ');
- }
- if (!empty($arrayfields['f.total_localtax1']['checked'])) {
- print_liste_field_titre($arrayfields['f.total_localtax1']['label'], $_SERVER['PHP_SELF'], 'f.localtax1', '', $param, '', $sortfield, $sortorder, 'right ');
- }
- if (!empty($arrayfields['f.total_localtax2']['checked'])) {
- print_liste_field_titre($arrayfields['f.total_localtax2']['label'], $_SERVER['PHP_SELF'], 'f.localtax2', '', $param, '', $sortfield, $sortorder, 'right ');
- }
- if (!empty($arrayfields['f.total_ttc']['checked'])) {
- print_liste_field_titre($arrayfields['f.total_ttc']['label'], $_SERVER['PHP_SELF'], 'f.total_ttc', '', $param, '', $sortfield, $sortorder, 'right ');
- }
- if (!empty($arrayfields['u.login']['checked'])) {
- print_liste_field_titre($arrayfields['u.login']['label'], $_SERVER["PHP_SELF"], 'u.login', '', $param, 'align="center"', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['dynamount_payed']['checked'])) {
- print_liste_field_titre($arrayfields['dynamount_payed']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
- }
- if (!empty($arrayfields['rtp']['checked'])) {
- print_liste_field_titre($arrayfields['rtp']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
- }
- if (!empty($arrayfields['f.multicurrency_code']['checked'])) {
- print_liste_field_titre($arrayfields['f.multicurrency_code']['label'], $_SERVER['PHP_SELF'], 'f.multicurrency_code', '', $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['f.multicurrency_tx']['checked'])) {
- print_liste_field_titre($arrayfields['f.multicurrency_tx']['label'], $_SERVER['PHP_SELF'], 'f.multicurrency_tx', '', $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['f.multicurrency_total_ht']['checked'])) {
- print_liste_field_titre($arrayfields['f.multicurrency_total_ht']['label'], $_SERVER['PHP_SELF'], 'f.multicurrency_total_ht', '', $param, 'class="right"', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['f.multicurrency_total_vat']['checked'])) {
- print_liste_field_titre($arrayfields['f.multicurrency_total_vat']['label'], $_SERVER['PHP_SELF'], 'f.multicurrency_total_tva', '', $param, 'class="right"', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['f.multicurrency_total_ttc']['checked'])) {
- print_liste_field_titre($arrayfields['f.multicurrency_total_ttc']['label'], $_SERVER['PHP_SELF'], 'f.multicurrency_total_ttc', '', $param, 'class="right"', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['multicurrency_dynamount_payed']['checked'])) {
- print_liste_field_titre($arrayfields['multicurrency_dynamount_payed']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'class="right"', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['multicurrency_rtp']['checked'])) {
- print_liste_field_titre($arrayfields['multicurrency_rtp']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'class="right"', $sortfield, $sortorder);
- }
- // Extra fields
- include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
- // Hook fields
- $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
- $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
- print $hookmanager->resPrint;
- if (!empty($arrayfields['f.datec']['checked'])) {
- print_liste_field_titre($arrayfields['f.datec']['label'], $_SERVER["PHP_SELF"], "f.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
- }
- if (!empty($arrayfields['f.tms']['checked'])) {
- print_liste_field_titre($arrayfields['f.tms']['label'], $_SERVER["PHP_SELF"], "f.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
- }
- if (!empty($arrayfields['f.fk_statut']['checked'])) {
- print_liste_field_titre($arrayfields['f.fk_statut']['label'], $_SERVER["PHP_SELF"], "fk_statut,paye,type", "", $param, '', $sortfield, $sortorder, 'right ');
- }
+print ' ';
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
- print " \n";
+}
+if (!empty($arrayfields['f.ref']['checked'])) {
+ print_liste_field_titre($arrayfields['f.ref']['label'], $_SERVER['PHP_SELF'], 'f.ref,f.rowid', '', $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['f.ref_supplier']['checked'])) {
+ print_liste_field_titre($arrayfields['f.ref_supplier']['label'], $_SERVER["PHP_SELF"], 'f.ref_supplier', '', $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['f.type']['checked'])) {
+ print_liste_field_titre($arrayfields['f.type']['label'], $_SERVER["PHP_SELF"], 'f.type', '', $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['f.label']['checked'])) {
+ print_liste_field_titre($arrayfields['f.label']['label'], $_SERVER['PHP_SELF'], "f.libelle,f.rowid", '', $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['f.datef']['checked'])) {
+ print_liste_field_titre($arrayfields['f.datef']['label'], $_SERVER['PHP_SELF'], 'f.datef,f.rowid', '', $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['f.date_lim_reglement']['checked'])) {
+ print_liste_field_titre($arrayfields['f.date_lim_reglement']['label'], $_SERVER['PHP_SELF'], "f.date_lim_reglement", '', $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.ref']['checked'])) {
+ print_liste_field_titre($arrayfields['p.ref']['label'], $_SERVER['PHP_SELF'], "p.ref", '', $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['s.nom']['checked'])) {
+ print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER['PHP_SELF'], 's.nom', '', $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['s.name_alias']['checked'])) {
+ print_liste_field_titre($arrayfields['s.name_alias']['label'], $_SERVER['PHP_SELF'], 's.name_alias', '', $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['s.town']['checked'])) {
+ print_liste_field_titre($arrayfields['s.town']['label'], $_SERVER["PHP_SELF"], 's.town', '', $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['s.zip']['checked'])) {
+ print_liste_field_titre($arrayfields['s.zip']['label'], $_SERVER["PHP_SELF"], 's.zip', '', $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['state.nom']['checked'])) {
+ print_liste_field_titre($arrayfields['state.nom']['label'], $_SERVER["PHP_SELF"], "state.name_alias", "", $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['state.name_alias']['checked'])) {
+ print_liste_field_titre($arrayfields['state.name_alias']['label'], $_SERVER["PHP_SELF"], "state.nom", "", $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['country.code_iso']['checked'])) {
+ print_liste_field_titre($arrayfields['country.code_iso']['label'], $_SERVER["PHP_SELF"], "country.code_iso", "", $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['typent.code']['checked'])) {
+ print_liste_field_titre($arrayfields['typent.code']['label'], $_SERVER["PHP_SELF"], "typent.code", "", $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) {
+ print_liste_field_titre($arrayfields['f.fk_cond_reglement']['label'], $_SERVER["PHP_SELF"], "f.fk_cond_reglement", "", $param, "", $sortfield, $sortorder);
+}
+if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) {
+ print_liste_field_titre($arrayfields['f.fk_mode_reglement']['label'], $_SERVER["PHP_SELF"], "f.fk_mode_reglement", "", $param, "", $sortfield, $sortorder);
+}
+if (!empty($arrayfields['f.total_ht']['checked'])) {
+ print_liste_field_titre($arrayfields['f.total_ht']['label'], $_SERVER['PHP_SELF'], 'f.total_ht', '', $param, '', $sortfield, $sortorder, 'right ');
+}
+if (!empty($arrayfields['f.total_vat']['checked'])) {
+ print_liste_field_titre($arrayfields['f.total_vat']['label'], $_SERVER['PHP_SELF'], 'f.total_tva', '', $param, '', $sortfield, $sortorder, 'right ');
+}
+if (!empty($arrayfields['f.total_localtax1']['checked'])) {
+ print_liste_field_titre($arrayfields['f.total_localtax1']['label'], $_SERVER['PHP_SELF'], 'f.localtax1', '', $param, '', $sortfield, $sortorder, 'right ');
+}
+if (!empty($arrayfields['f.total_localtax2']['checked'])) {
+ print_liste_field_titre($arrayfields['f.total_localtax2']['label'], $_SERVER['PHP_SELF'], 'f.localtax2', '', $param, '', $sortfield, $sortorder, 'right ');
+}
+if (!empty($arrayfields['f.total_ttc']['checked'])) {
+ print_liste_field_titre($arrayfields['f.total_ttc']['label'], $_SERVER['PHP_SELF'], 'f.total_ttc', '', $param, '', $sortfield, $sortorder, 'right ');
+}
+if (!empty($arrayfields['u.login']['checked'])) {
+ print_liste_field_titre($arrayfields['u.login']['label'], $_SERVER["PHP_SELF"], 'u.login', '', $param, 'align="center"', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['dynamount_payed']['checked'])) {
+ print_liste_field_titre($arrayfields['dynamount_payed']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
+}
+if (!empty($arrayfields['rtp']['checked'])) {
+ print_liste_field_titre($arrayfields['rtp']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
+}
+if (!empty($arrayfields['f.multicurrency_code']['checked'])) {
+ print_liste_field_titre($arrayfields['f.multicurrency_code']['label'], $_SERVER['PHP_SELF'], 'f.multicurrency_code', '', $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['f.multicurrency_tx']['checked'])) {
+ print_liste_field_titre($arrayfields['f.multicurrency_tx']['label'], $_SERVER['PHP_SELF'], 'f.multicurrency_tx', '', $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['f.multicurrency_total_ht']['checked'])) {
+ print_liste_field_titre($arrayfields['f.multicurrency_total_ht']['label'], $_SERVER['PHP_SELF'], 'f.multicurrency_total_ht', '', $param, 'class="right"', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['f.multicurrency_total_vat']['checked'])) {
+ print_liste_field_titre($arrayfields['f.multicurrency_total_vat']['label'], $_SERVER['PHP_SELF'], 'f.multicurrency_total_tva', '', $param, 'class="right"', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['f.multicurrency_total_ttc']['checked'])) {
+ print_liste_field_titre($arrayfields['f.multicurrency_total_ttc']['label'], $_SERVER['PHP_SELF'], 'f.multicurrency_total_ttc', '', $param, 'class="right"', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['multicurrency_dynamount_payed']['checked'])) {
+ print_liste_field_titre($arrayfields['multicurrency_dynamount_payed']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'class="right"', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['multicurrency_rtp']['checked'])) {
+ print_liste_field_titre($arrayfields['multicurrency_rtp']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'class="right"', $sortfield, $sortorder);
+}
+// Extra fields
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
+// Hook fields
+$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
+$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+print $hookmanager->resPrint;
+if (!empty($arrayfields['f.datec']['checked'])) {
+ print_liste_field_titre($arrayfields['f.datec']['label'], $_SERVER["PHP_SELF"], "f.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
+}
+if (!empty($arrayfields['f.tms']['checked'])) {
+ print_liste_field_titre($arrayfields['f.tms']['label'], $_SERVER["PHP_SELF"], "f.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
+}
+if (!empty($arrayfields['f.fk_statut']['checked'])) {
+ print_liste_field_titre($arrayfields['f.fk_statut']['label'], $_SERVER["PHP_SELF"], "fk_statut,paye,type", "", $param, '', $sortfield, $sortorder, 'right ');
+}
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
+}
+print "\n";
- $facturestatic = new FactureFournisseur($db);
- $supplierstatic = new Fournisseur($db);
- $projectstatic = new Project($db);
- $userstatic = new User($db);
+$facturestatic = new FactureFournisseur($db);
+$supplierstatic = new Fournisseur($db);
+$projectstatic = new Project($db);
+$userstatic = new User($db);
- if ($num > 0) {
- $i = 0;
- $totalarray = array();
- $totalarray['nbfield']=0;
- $totalarray['val'] = array();
- $totalarray['val']['f.total_ht']=0;
- $totalarray['val']['f.total_vat']=0;
- $totalarray['val']['f.total_localtax1']=0;
- $totalarray['val']['f.total_localtax1']=0;
- $totalarray['val']['f.total_ttc']=0;
+if ($num > 0) {
+ $i = 0;
+ $totalarray = array();
+ $totalarray['nbfield']=0;
+ $totalarray['val'] = array();
+ $totalarray['val']['f.total_ht']=0;
+ $totalarray['val']['f.total_vat']=0;
+ $totalarray['val']['f.total_localtax1']=0;
+ $totalarray['val']['f.total_localtax1']=0;
+ $totalarray['val']['f.total_ttc']=0;
- while ($i < min($num, $limit)) {
- $obj = $db->fetch_object($resql);
+ while ($i < min($num, $limit)) {
+ $obj = $db->fetch_object($resql);
- $datelimit = $db->jdate($obj->datelimite);
- $facturestatic->id = $obj->facid;
- $facturestatic->ref = $obj->ref;
- $facturestatic->type = $obj->type;
- $facturestatic->ref_supplier = $obj->ref_supplier;
- $facturestatic->date_echeance = $db->jdate($obj->datelimite);
- $facturestatic->statut = $obj->fk_statut;
- $facturestatic->note_public = $obj->note_public;
- $facturestatic->note_private = $obj->note_private;
- $facturestatic->multicurrency_code = $obj->multicurrency_code;
- $facturestatic->multicurrency_tx = $obj->multicurrency_tx;
- $facturestatic->multicurrency_total_ht = $obj->multicurrency_total_ht;
- $facturestatic->multicurrency_total_tva = $obj->multicurrency_total_vat;
- $facturestatic->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
+ $datelimit = $db->jdate($obj->datelimite);
+ $facturestatic->id = $obj->facid;
+ $facturestatic->ref = $obj->ref;
+ $facturestatic->type = $obj->type;
+ $facturestatic->ref_supplier = $obj->ref_supplier;
+ $facturestatic->date_echeance = $db->jdate($obj->datelimite);
+ $facturestatic->statut = $obj->fk_statut;
+ $facturestatic->note_public = $obj->note_public;
+ $facturestatic->note_private = $obj->note_private;
+ $facturestatic->multicurrency_code = $obj->multicurrency_code;
+ $facturestatic->multicurrency_tx = $obj->multicurrency_tx;
+ $facturestatic->multicurrency_total_ht = $obj->multicurrency_total_ht;
+ $facturestatic->multicurrency_total_tva = $obj->multicurrency_total_vat;
+ $facturestatic->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
- $thirdparty->id = $obj->socid;
- $thirdparty->name = $obj->name;
- $thirdparty->name_alias = $obj->alias;
- $thirdparty->client = $obj->client;
- $thirdparty->fournisseur = $obj->fournisseur;
- $thirdparty->code_client = $obj->code_client;
- $thirdparty->code_compta_client = $obj->code_compta_client;
- $thirdparty->code_fournisseur = $obj->code_fournisseur;
- $thirdparty->code_compta_fournisseur = $obj->code_compta_fournisseur;
- $thirdparty->email = $obj->email;
- $thirdparty->country_code = $obj->country_code;
+ $thirdparty->id = $obj->socid;
+ $thirdparty->name = $obj->name;
+ $thirdparty->name_alias = $obj->alias;
+ $thirdparty->client = $obj->client;
+ $thirdparty->fournisseur = $obj->fournisseur;
+ $thirdparty->code_client = $obj->code_client;
+ $thirdparty->code_compta_client = $obj->code_compta_client;
+ $thirdparty->code_fournisseur = $obj->code_fournisseur;
+ $thirdparty->code_compta_fournisseur = $obj->code_compta_fournisseur;
+ $thirdparty->email = $obj->email;
+ $thirdparty->country_code = $obj->country_code;
- $paiement = $facturestatic->getSommePaiement();
- $totalcreditnotes = $facturestatic->getSumCreditNotesUsed();
- $totaldeposits = $facturestatic->getSumDepositsUsed();
- $totalpay = $paiement + $totalcreditnotes + $totaldeposits;
- $remaintopay = $obj->total_ttc - $totalpay;
- $multicurrency_paiement = $facturestatic->getSommePaiement(1);
- $multicurrency_totalcreditnotes = $facturestatic->getSumCreditNotesUsed(1);
- $multicurrency_totaldeposits = $facturestatic->getSumDepositsUsed(1);
- $multicurrency_totalpay = $multicurrency_paiement + $multicurrency_totalcreditnotes + $multicurrency_totaldeposits;
- $multicurrency_remaintopay = price2num($facturestatic->multicurrency_total_ttc - $multicurrency_totalpay);
+ $paiement = $facturestatic->getSommePaiement();
+ $totalcreditnotes = $facturestatic->getSumCreditNotesUsed();
+ $totaldeposits = $facturestatic->getSumDepositsUsed();
+ $totalpay = $paiement + $totalcreditnotes + $totaldeposits;
+ $remaintopay = $obj->total_ttc - $totalpay;
+ $multicurrency_paiement = $facturestatic->getSommePaiement(1);
+ $multicurrency_totalcreditnotes = $facturestatic->getSumCreditNotesUsed(1);
+ $multicurrency_totaldeposits = $facturestatic->getSumDepositsUsed(1);
+ $multicurrency_totalpay = $multicurrency_paiement + $multicurrency_totalcreditnotes + $multicurrency_totaldeposits;
+ $multicurrency_remaintopay = price2num($facturestatic->multicurrency_total_ttc - $multicurrency_totalpay);
- $facturestatic->alreadypaid = ($paiement ? $paiement : 0);
- $facturestatic->paye = $obj->paye;
- $facturestatic->statut = $obj->fk_statut;
- $facturestatic->type = $obj->type;
+ $facturestatic->alreadypaid = ($paiement ? $paiement : 0);
+ $facturestatic->paye = $obj->paye;
+ $facturestatic->statut = $obj->fk_statut;
+ $facturestatic->type = $obj->type;
- //If invoice has been converted and the conversion has been used, we dont have remain to pay on invoice
- if ($facturestatic->type == FactureFournisseur::TYPE_CREDIT_NOTE) {
- if ($facturestatic->isCreditNoteUsed()) {
- $remaintopay = -$facturestatic->getSumFromThisCreditNotesNotUsed();
- }
+ //If invoice has been converted and the conversion has been used, we dont have remain to pay on invoice
+ if ($facturestatic->type == FactureFournisseur::TYPE_CREDIT_NOTE) {
+ if ($facturestatic->isCreditNoteUsed()) {
+ $remaintopay = -$facturestatic->getSumFromThisCreditNotesNotUsed();
}
+ }
- print '';
- if (!empty($arrayfields['f.ref']['checked'])) {
- print '';
-
- print '';
- // Picto + Ref
- print '';
- print $facturestatic->getNomUrl(1, '', 0, 0, '', 0, -1, 1);
-
- $filename = dol_sanitizeFileName($obj->ref);
- $filedir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($obj->facid, 2, 0, 0, $facturestatic, 'invoice_supplier').dol_sanitizeFileName($obj->ref);
- $subdir = get_exdir($obj->facid, 2, 0, 0, $facturestatic, 'invoice_supplier').dol_sanitizeFileName($obj->ref);
- print $formfile->getDocumentsLink('facture_fournisseur', $subdir, $filedir);
- print '
';
-
- print " \n";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Supplier ref
- if (!empty($arrayfields['f.ref_supplier']['checked'])) {
- print '';
- print $obj->ref_supplier;
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Type
- if (!empty($arrayfields['f.type']['checked'])) {
- print '';
- print $facturestatic->getLibType();
- print " ";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Label
- if (!empty($arrayfields['f.label']['checked'])) {
- print '';
- print $obj->label;
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Date
- if (!empty($arrayfields['f.datef']['checked'])) {
- print '';
- print dol_print_date($db->jdate($obj->datef), 'day');
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Date limit
- if (!empty($arrayfields['f.date_lim_reglement']['checked'])) {
- print ''.dol_print_date($datelimit, 'day');
- if ($facturestatic->hasDelay()) {
- print img_warning($langs->trans('Alert').' - '.$langs->trans('Late'));
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Project
- if (!empty($arrayfields['p.ref']['checked'])) {
- print '';
- if ($obj->project_id > 0) {
- $projectstatic->id = $obj->project_id;
- $projectstatic->ref = $obj->project_ref;
- $projectstatic->title = $obj->project_label;
- print $projectstatic->getNomUrl(1);
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Third party
- if (!empty($arrayfields['s.nom']['checked'])) {
- print '';
- print $thirdparty->getNomUrl(1, 'supplier', 0, 0, -1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1);
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Alias
- if (!empty($arrayfields['s.name_alias']['checked'])) {
- print '';
- print $thirdparty->name_alias;
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Town
- if (!empty($arrayfields['s.town']['checked'])) {
- print '';
- print $obj->town;
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Zip
- if (!empty($arrayfields['s.zip']['checked'])) {
- print '';
- print dol_escape_htmltag($obj->zip);
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // State
- if (!empty($arrayfields['state.nom']['checked'])) {
- print "".$obj->state_name." \n";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Country
- if (!empty($arrayfields['country.code_iso']['checked'])) {
- print '';
- $tmparray = getCountry($obj->fk_pays, 'all');
- print $tmparray['label'];
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Type ent
- if (!empty($arrayfields['typent.code']['checked'])) {
- print '';
- if (empty($typenArray)) {
- $typenArray = $formcompany->typent_array(1);
- }
- print $typenArray[$obj->typent_code];
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Payment condition
- if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) {
- print '';
- $form->form_conditions_reglement($_SERVER['PHP_SELF'], $obj->fk_cond_reglement, 'none', 1);
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Payment mode
- if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) {
- print '';
- $form->form_modes_reglement($_SERVER['PHP_SELF'], $obj->fk_mode_reglement, 'none', '', -1);
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Amount HT
- if (!empty($arrayfields['f.total_ht']['checked'])) {
- print ''.price($obj->total_ht)." \n";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- if (!$i) {
- $totalarray['pos'][$totalarray['nbfield']] = 'f.total_ht';
- }
- $totalarray['val']['f.total_ht'] += $obj->total_ht;
- }
- // Amount VAT
- if (!empty($arrayfields['f.total_vat']['checked'])) {
- print ''.price($obj->total_vat)." \n";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- if (!$i) {
- $totalarray['pos'][$totalarray['nbfield']] = 'f.total_vat';
- }
- $totalarray['val']['f.total_vat'] += $obj->total_vat;
- }
- // Amount LocalTax1
- if (!empty($arrayfields['f.total_localtax1']['checked'])) {
- print ''.price($obj->total_localtax1)." \n";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- if (!$i) {
- $totalarray['pos'][$totalarray['nbfield']] = 'f.total_localtax1';
- }
- $totalarray['val']['f.total_localtax1'] += $obj->total_localtax1;
- }
- // Amount LocalTax2
- if (!empty($arrayfields['f.total_localtax2']['checked'])) {
- print ''.price($obj->total_localtax2)." \n";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- if (!$i) {
- $totalarray['pos'][$totalarray['nbfield']] = 'f.total_localtax2';
- }
- $totalarray['val']['f.total_localtax2'] += $obj->total_localtax2;
- }
- // Amount TTC
- if (!empty($arrayfields['f.total_ttc']['checked'])) {
- print ''.price($obj->total_ttc)." \n";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- if (!$i) {
- $totalarray['pos'][$totalarray['nbfield']] = 'f.total_ttc';
- }
- $totalarray['val']['f.total_ttc'] += $obj->total_ttc;
- }
-
- $userstatic->id = $obj->fk_user_author;
- $userstatic->login = $obj->login;
- $userstatic->lastname = $obj->lastname;
- $userstatic->firstname = $obj->firstname;
- $userstatic->email = $obj->user_email;
- $userstatic->statut = $obj->user_statut;
- $userstatic->entity = $obj->entity;
- $userstatic->photo = $obj->photo;
- $userstatic->office_phone = $obj->office_phone;
- $userstatic->office_fax = $obj->office_fax;
- $userstatic->user_mobile = $obj->user_mobile;
- $userstatic->job = $obj->job;
- $userstatic->gender = $obj->gender;
-
- // Author
- if (!empty($arrayfields['u.login']['checked'])) {
- print '';
- if ($userstatic->id) {
- print $userstatic->getLoginUrl(-1);
- } else {
- print ' ';
- }
- print " \n";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- if (!empty($arrayfields['dynamount_payed']['checked'])) {
- print ''.(!empty($totalpay) ?price($totalpay, 0, $langs) : '').' '; // TODO Use a denormalized field
- if (!$i) {
- $totalarray['nbfield']++;
- }
- if (!$i) {
- $totalarray['pos'][$totalarray['nbfield']] = 'totalam';
- }
- $totalarray['val']['totalam'] += $totalpay;
- }
-
- if (!empty($arrayfields['rtp']['checked'])) {
- print ''.(!empty($remaintopay) ?price($remaintopay, 0, $langs) : ' ').' '; // TODO Use a denormalized field
- if (!$i) {
- $totalarray['nbfield']++;
- }
- if (!$i) {
- $totalarray['pos'][$totalarray['nbfield']] = 'rtp';
- }
- $totalarray['val']['rtp'] += $remaintopay;
- }
-
- // Currency
- if (!empty($arrayfields['f.multicurrency_code']['checked'])) {
- print ''.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)." \n";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Currency rate
- if (!empty($arrayfields['f.multicurrency_tx']['checked'])) {
- print '';
- $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code);
- print " \n";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Amount HT
- if (!empty($arrayfields['f.multicurrency_total_ht']['checked'])) {
- print ''.price($obj->multicurrency_total_ht)." \n";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Amount VAT
- if (!empty($arrayfields['f.multicurrency_total_vat']['checked'])) {
- print ''.price($obj->multicurrency_total_vat)." \n";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Amount TTC
- if (!empty($arrayfields['f.multicurrency_total_ttc']['checked'])) {
- print ''.price($obj->multicurrency_total_ttc)." \n";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- if (!empty($arrayfields['multicurrency_dynamount_payed']['checked'])) {
- print ''.(!empty($multicurrency_totalpay) ?price($multicurrency_totalpay, 0, $langs) : '').' '; // TODO Use a denormalized field
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Pending amount
- if (!empty($arrayfields['multicurrency_rtp']['checked'])) {
- print '';
- print (!empty($multicurrency_remaintopay) ? price($multicurrency_remaintopay, 0, $langs) : '');
- print ' '; // TODO Use a denormalized field
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
-
- // Extra fields
- include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
- // Fields from hook
- $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
- $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
- print $hookmanager->resPrint;
-
- // Date creation
- if (!empty($arrayfields['f.datec']['checked'])) {
- print '';
- print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Date modification
- if (!empty($arrayfields['f.tms']['checked'])) {
- print '';
- print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser');
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Status
- if (!empty($arrayfields['f.fk_statut']['checked'])) {
- print '';
- print $facturestatic->LibStatut($obj->paye, $obj->fk_statut, 5, $paiement, $obj->type);
- print " ";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Action column
+ print ' ';
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
print '';
if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
$selected = 0;
@@ -1734,49 +1420,441 @@ if ($resql) {
print ' ';
}
print ' ';
+ }
+ if (!empty($arrayfields['f.ref']['checked'])) {
+ print '';
+
+ print '';
+ // Picto + Ref
+ print '';
+ print $facturestatic->getNomUrl(1, '', 0, 0, '', 0, -1, 1);
+
+ $filename = dol_sanitizeFileName($obj->ref);
+ $filedir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($obj->facid, 2, 0, 0, $facturestatic, 'invoice_supplier').dol_sanitizeFileName($obj->ref);
+ $subdir = get_exdir($obj->facid, 2, 0, 0, $facturestatic, 'invoice_supplier').dol_sanitizeFileName($obj->ref);
+ print $formfile->getDocumentsLink('facture_fournisseur', $subdir, $filedir);
+ print '
';
+
+ print " \n";
if (!$i) {
$totalarray['nbfield']++;
}
-
- print " \n";
-
- $i++;
}
- // Show total line
- include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
+ // Supplier ref
+ if (!empty($arrayfields['f.ref_supplier']['checked'])) {
+ print '';
+ print $obj->ref_supplier;
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Type
+ if (!empty($arrayfields['f.type']['checked'])) {
+ print '';
+ print $facturestatic->getLibType();
+ print " ";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Label
+ if (!empty($arrayfields['f.label']['checked'])) {
+ print '';
+ print $obj->label;
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Date
+ if (!empty($arrayfields['f.datef']['checked'])) {
+ print '';
+ print dol_print_date($db->jdate($obj->datef), 'day');
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Date limit
+ if (!empty($arrayfields['f.date_lim_reglement']['checked'])) {
+ print ''.dol_print_date($datelimit, 'day');
+ if ($facturestatic->hasDelay()) {
+ print img_warning($langs->trans('Alert').' - '.$langs->trans('Late'));
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Project
+ if (!empty($arrayfields['p.ref']['checked'])) {
+ print '';
+ if ($obj->project_id > 0) {
+ $projectstatic->id = $obj->project_id;
+ $projectstatic->ref = $obj->project_ref;
+ $projectstatic->title = $obj->project_label;
+ print $projectstatic->getNomUrl(1);
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Third party
+ if (!empty($arrayfields['s.nom']['checked'])) {
+ print '';
+ print $thirdparty->getNomUrl(1, 'supplier', 0, 0, -1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1);
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Alias
+ if (!empty($arrayfields['s.name_alias']['checked'])) {
+ print '';
+ print $thirdparty->name_alias;
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Town
+ if (!empty($arrayfields['s.town']['checked'])) {
+ print '';
+ print $obj->town;
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Zip
+ if (!empty($arrayfields['s.zip']['checked'])) {
+ print '';
+ print dol_escape_htmltag($obj->zip);
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // State
+ if (!empty($arrayfields['state.nom']['checked'])) {
+ print "".$obj->state_name." \n";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Country
+ if (!empty($arrayfields['country.code_iso']['checked'])) {
+ print '';
+ $tmparray = getCountry($obj->fk_pays, 'all');
+ print $tmparray['label'];
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Type ent
+ if (!empty($arrayfields['typent.code']['checked'])) {
+ print '';
+ if (empty($typenArray)) {
+ $typenArray = $formcompany->typent_array(1);
+ }
+ print $typenArray[$obj->typent_code];
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Payment condition
+ if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) {
+ $s = $form->form_conditions_reglement($_SERVER['PHP_SELF'], $obj->fk_cond_reglement, 'none', 1, '', -1, -1, 1);
+ print '';
+ print dol_escape_htmltag($s);
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Payment mode
+ if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) {
+ $s = $form->form_modes_reglement($_SERVER['PHP_SELF'], $obj->fk_mode_reglement, 'none', '', -1, 0, '', 1);
+ print '';
+ print dol_escape_htmltag($s);
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Amount HT
+ if (!empty($arrayfields['f.total_ht']['checked'])) {
+ print ''.price($obj->total_ht)." \n";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ if (!$i) {
+ $totalarray['pos'][$totalarray['nbfield']] = 'f.total_ht';
+ }
+ $totalarray['val']['f.total_ht'] += $obj->total_ht;
+ }
+ // Amount VAT
+ if (!empty($arrayfields['f.total_vat']['checked'])) {
+ print ''.price($obj->total_vat)." \n";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ if (!$i) {
+ $totalarray['pos'][$totalarray['nbfield']] = 'f.total_vat';
+ }
+ $totalarray['val']['f.total_vat'] += $obj->total_vat;
+ }
+ // Amount LocalTax1
+ if (!empty($arrayfields['f.total_localtax1']['checked'])) {
+ print ''.price($obj->total_localtax1)." \n";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ if (!$i) {
+ $totalarray['pos'][$totalarray['nbfield']] = 'f.total_localtax1';
+ }
+ $totalarray['val']['f.total_localtax1'] += $obj->total_localtax1;
+ }
+ // Amount LocalTax2
+ if (!empty($arrayfields['f.total_localtax2']['checked'])) {
+ print ''.price($obj->total_localtax2)." \n";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ if (!$i) {
+ $totalarray['pos'][$totalarray['nbfield']] = 'f.total_localtax2';
+ }
+ $totalarray['val']['f.total_localtax2'] += $obj->total_localtax2;
+ }
+ // Amount TTC
+ if (!empty($arrayfields['f.total_ttc']['checked'])) {
+ print ''.price($obj->total_ttc)." \n";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ if (!$i) {
+ $totalarray['pos'][$totalarray['nbfield']] = 'f.total_ttc';
+ }
+ $totalarray['val']['f.total_ttc'] += $obj->total_ttc;
+ }
+
+ $userstatic->id = $obj->fk_user_author;
+ $userstatic->login = $obj->login;
+ $userstatic->lastname = $obj->lastname;
+ $userstatic->firstname = $obj->firstname;
+ $userstatic->email = $obj->user_email;
+ $userstatic->statut = $obj->user_statut;
+ $userstatic->entity = $obj->entity;
+ $userstatic->photo = $obj->photo;
+ $userstatic->office_phone = $obj->office_phone;
+ $userstatic->office_fax = $obj->office_fax;
+ $userstatic->user_mobile = $obj->user_mobile;
+ $userstatic->job = $obj->job;
+ $userstatic->gender = $obj->gender;
+
+ // Author
+ if (!empty($arrayfields['u.login']['checked'])) {
+ print '';
+ if ($userstatic->id) {
+ print $userstatic->getLoginUrl(-1);
+ } else {
+ print ' ';
+ }
+ print " \n";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ if (!empty($arrayfields['dynamount_payed']['checked'])) {
+ print ''.(!empty($totalpay) ?price($totalpay, 0, $langs) : '').' '; // TODO Use a denormalized field
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ if (!$i) {
+ $totalarray['pos'][$totalarray['nbfield']] = 'totalam';
+ }
+ $totalarray['val']['totalam'] += $totalpay;
+ }
+
+ if (!empty($arrayfields['rtp']['checked'])) {
+ print ''.(!empty($remaintopay) ?price($remaintopay, 0, $langs) : ' ').' '; // TODO Use a denormalized field
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ if (!$i) {
+ $totalarray['pos'][$totalarray['nbfield']] = 'rtp';
+ }
+ $totalarray['val']['rtp'] += $remaintopay;
+ }
+
+ // Currency
+ if (!empty($arrayfields['f.multicurrency_code']['checked'])) {
+ print ''.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)." \n";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Currency rate
+ if (!empty($arrayfields['f.multicurrency_tx']['checked'])) {
+ print '';
+ $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code);
+ print " \n";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Amount HT
+ if (!empty($arrayfields['f.multicurrency_total_ht']['checked'])) {
+ print ''.price($obj->multicurrency_total_ht)." \n";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Amount VAT
+ if (!empty($arrayfields['f.multicurrency_total_vat']['checked'])) {
+ print ''.price($obj->multicurrency_total_vat)." \n";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Amount TTC
+ if (!empty($arrayfields['f.multicurrency_total_ttc']['checked'])) {
+ print ''.price($obj->multicurrency_total_ttc)." \n";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ if (!empty($arrayfields['multicurrency_dynamount_payed']['checked'])) {
+ print ''.(!empty($multicurrency_totalpay) ?price($multicurrency_totalpay, 0, $langs) : '').' '; // TODO Use a denormalized field
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Pending amount
+ if (!empty($arrayfields['multicurrency_rtp']['checked'])) {
+ print '';
+ print (!empty($multicurrency_remaintopay) ? price($multicurrency_remaintopay, 0, $langs) : '');
+ print ' '; // TODO Use a denormalized field
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+
+ // Extra fields
+ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
+ // Fields from hook
+ $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
+ $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+ print $hookmanager->resPrint;
+
+ // Date creation
+ if (!empty($arrayfields['f.datec']['checked'])) {
+ print '';
+ print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Date modification
+ if (!empty($arrayfields['f.tms']['checked'])) {
+ print '';
+ print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser');
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Status
+ if (!empty($arrayfields['f.fk_statut']['checked'])) {
+ print '';
+ print $facturestatic->LibStatut($obj->paye, $obj->fk_statut, 5, $paiement, $obj->type);
+ print " ";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Action column
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->facid, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+
+ print "\n";
+
+ $i++;
}
- $db->free($resql);
-
- $parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
- $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters); // Note that $action and $object may have been modified by hook
- print $hookmanager->resPrint;
-
- print "
\n";
- print '
';
-
- print " \n";
-
- $hidegeneratedfilelistifempty = 1;
- if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
- $hidegeneratedfilelistifempty = 0;
- }
-
- // Show list of available documents
- $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
- $urlsource .= str_replace('&', '&', $param);
-
- $filedir = $diroutputmassaction;
- $genallowed = $user->rights->facture->lire;
- $delallowed = $user->rights->facture->creer;
- $title = '';
-
- print $formfile->showdocuments('massfilesarea_supplier_invoice', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
-} else {
- dol_print_error($db);
+ // Show total line
+ include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
}
+// If no record found
+if ($num == 0) {
+ $colspan = 1;
+ foreach ($arrayfields as $key => $val) {
+ if (!empty($val['checked'])) {
+ $colspan++;
+ }
+ }
+ print ' '.$langs->trans("NoRecordFound").' ';
+}
+
+$db->free($resql);
+
+$parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
+$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+print $hookmanager->resPrint;
+
+print "
\n";
+print '
';
+
+print " \n";
+
+$hidegeneratedfilelistifempty = 1;
+if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
+ $hidegeneratedfilelistifempty = 0;
+}
+
+// Show list of available documents
+$urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
+$urlsource .= str_replace('&', '&', $param);
+
+$filedir = $diroutputmassaction;
+$genallowed = $user->rights->facture->lire;
+$delallowed = $user->rights->facture->creer;
+$title = '';
+
+print $formfile->showdocuments('massfilesarea_supplier_invoice', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
+
// End of page
llxFooter();
$db->close();
diff --git a/htdocs/fourn/facture/note.php b/htdocs/fourn/facture/note.php
index e1eb788723f..1c61fdc8e07 100644
--- a/htdocs/fourn/facture/note.php
+++ b/htdocs/fourn/facture/note.php
@@ -53,6 +53,8 @@ $result = restrictedArea($user, 'fournisseur', $id, 'facture_fourn', 'facture');
$object = new FactureFournisseur($db);
$object->fetch($id, $ref);
+$usercancreate = ($user->rights->fournisseur->facture->creer || $user->rights->supplier_invoice->creer);
+$permissiontoadd = $usercancreate;
$permissionnote = ($user->rights->fournisseur->facture->creer || $user->rights->supplier_invoice->creer); // Used by the include of actions_setnotes.inc.php
@@ -106,40 +108,28 @@ if ($object->id > 0) {
$morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= '
'.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= '
'.$object->thirdparty->getNomUrl(1);
if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
$morehtmlref .= ' (
'.$langs->trans("OtherBills").' )';
}
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= '
'.$langs->trans('Project').' ';
- if ($user->rights->fournisseur->commande->creer || $user->rights->supplier_order->creer) {
+ $morehtmlref .= '
';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- // $morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/fourn/facture/paiement.php b/htdocs/fourn/facture/paiement.php
index bac4fd1b616..bad8d19bd28 100644
--- a/htdocs/fourn/facture/paiement.php
+++ b/htdocs/fourn/facture/paiement.php
@@ -431,7 +431,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie
json["amountPayment"] = $("#amountpayment").attr("value");
json["amounts"] = _elemToJson(form.find("input.amount"));
json["remains"] = _elemToJson(form.find("input.remain"));
-
+ json["token"] = "'.currentToken().'";
if (imgId != null) {
json["imgClicked"] = imgId;
}
@@ -718,7 +718,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie
$numdirectdebitopen = 0;
$totaldirectdebit = 0;
$sql = "SELECT COUNT(pfd.rowid) as nb, SUM(pfd.amount) as amount";
- $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
+ $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
$sql .= " WHERE fk_facture_fourn = ".((int) $objp->facid);
$sql .= " AND pfd.traite = 0";
$sql .= " AND pfd.ext_payment_id IS NULL";
diff --git a/htdocs/fourn/paiement/card.php b/htdocs/fourn/paiement/card.php
index c7c1297e0e8..a11cf769204 100644
--- a/htdocs/fourn/paiement/card.php
+++ b/htdocs/fourn/paiement/card.php
@@ -374,9 +374,9 @@ if ($result > 0) {
if ($user->socid == 0 && $action == '') {
if ($user->rights->fournisseur->facture->supprimer) {
if ($allow_delete) {
- print '
'.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', 1);
} else {
- print '
'.$langs->trans('Delete').' ';
+ print dolGetButtonAction($title_button, $langs->trans("Delete"), 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', 0);
}
}
}
diff --git a/htdocs/fourn/paiement/document.php b/htdocs/fourn/paiement/document.php
index e26734ed9c6..2e61322997a 100644
--- a/htdocs/fourn/paiement/document.php
+++ b/htdocs/fourn/paiement/document.php
@@ -123,7 +123,7 @@ if ($object->id > 0) {
$morehtmlref .= $object->num_payment ? ' - '.$object->num_payment : '';
// Thirdparty
- $morehtmlref .= '
'.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= '
'.$object->thirdparty->getNomUrl(1);
// Amount
$morehtmlref .= '
'.$langs->trans('Amount').' : '. price($object->amount, '', $langs, 0, 0, -1, $conf->currency);
diff --git a/htdocs/holiday/card.php b/htdocs/holiday/card.php
index 1443a92a113..0a8f7a5c760 100644
--- a/htdocs/holiday/card.php
+++ b/htdocs/holiday/card.php
@@ -5,7 +5,7 @@
* Copyright (C) 2013 Juanjo Menent
* Copyright (C) 2017 Alexandre Spangaro
* Copyright (C) 2014-2017 Ferran Marcet
- * Copyright (C) 2018 Frédéric France
+ * Copyright (C) 2018-2022 Frédéric France
* Copyright (C) 2020-2021 Udo Tamm
* Copyright (C) 2022 Anthony Berton
*
@@ -261,6 +261,12 @@ if (empty($reshook)) {
$error++;
}
+ // Fill array 'array_options' with data from add form
+ $ret = $extrafields->setOptionalsFromPost(null, $object);
+ if ($ret < 0) {
+ $error++;
+ }
+
$result = 0;
if (!$error) {
@@ -668,7 +674,7 @@ if (empty($reshook)) {
// If status pending validation and validator = user
if ($object->statut == Holiday::STATUS_VALIDATED && $user->id == $object->fk_validator) {
- $object->date_refuse = dol_print_date('dayhour', dol_now());
+ $object->date_refuse = dol_now();
$object->fk_user_refuse = $user->id;
$object->statut = Holiday::STATUS_REFUSED;
$object->status = Holiday::STATUS_REFUSED;
diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php
index 8f16676f9ce..85cc0961363 100644
--- a/htdocs/holiday/list.php
+++ b/htdocs/holiday/list.php
@@ -3,7 +3,7 @@
* Copyright (C) 2013-2020 Laurent Destailleur
* Copyright (C) 2012-2016 Regis Houssin
* Copyright (C) 2018 Charlene Benke
- * Copyright (C) 2019-2021 Frédéric France
+ * Copyright (C) 2019-2022 Frédéric France
*
* 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
@@ -126,7 +126,7 @@ $arrayfields = array(
'cp.date_debut'=>array('label'=>$langs->trans("DateStart"), 'checked'=>1, 'position'=>40),
'cp.date_fin'=>array('label'=>$langs->trans("DateEnd"), 'checked'=>1, 'position'=>42),
'cp.date_valid'=>array('label'=>$langs->trans("DateValidation"), 'checked'=>1, 'position'=>60),
- 'cp.date_approve'=>array('label'=>$langs->trans("DateApprove"), 'checked'=>1, 'position'=>70),
+ 'cp.date_approval'=>array('label'=>$langs->trans("DateApprove"), 'checked'=>1, 'position'=>70),
'cp.date_create'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500),
'cp.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>501),
'cp.statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000),
@@ -271,6 +271,8 @@ $sql .= " cp.statut as status,";
$sql .= " cp.fk_validator,";
$sql .= " cp.date_valid,";
$sql .= " cp.fk_user_valid,";
+$sql .= " cp.date_approval,";
+$sql .= " cp.fk_user_approve,";
$sql .= " cp.date_refuse,";
$sql .= " cp.fk_user_refuse,";
$sql .= " cp.date_cancel,";
@@ -538,7 +540,7 @@ if ($resql) {
}
$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
- $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
+ $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
@@ -553,7 +555,13 @@ if ($resql) {
// Filters
print '';
-
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons('left');
+ print $searchpicto;
+ print ' ';
+ }
if (!empty($arrayfields['cp.ref']['checked'])) {
print '';
print ' ';
@@ -636,12 +644,18 @@ if ($resql) {
print ' ';
}
- // End date
+ // Date validation
if (!empty($arrayfields['cp.date_valid']['checked'])) {
print '';
print ' ';
}
+ // Date appoval
+ if (!empty($arrayfields['cp.date_approval']['checked'])) {
+ print '';
+ print ' ';
+ }
+
// Extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
// Fields from hook
@@ -673,14 +687,19 @@ if ($resql) {
}
// Action column
- print '';
- $searchpicto = $form->showFilterButtons();
- print $searchpicto;
- print ' ';
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons();
+ print $searchpicto;
+ print ' ';
+ }
print " \n";
print '';
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'maxwidthsearch center ');
+ }
if (!empty($arrayfields['cp.ref']['checked'])) {
print_liste_field_titre($arrayfields['cp.ref']['label'], $_SERVER["PHP_SELF"], "cp.ref", "", $param, '', $sortfield, $sortorder);
}
@@ -705,6 +724,9 @@ if ($resql) {
if (!empty($arrayfields['cp.date_valid']['checked'])) {
print_liste_field_titre($arrayfields['cp.date_valid']['label'], $_SERVER["PHP_SELF"], "cp.date_valid", "", $param, '', $sortfield, $sortorder, 'center ');
}
+ if (!empty($arrayfields['cp.date_approval']['checked'])) {
+ print_liste_field_titre($arrayfields['cp.date_approval']['label'], $_SERVER["PHP_SELF"], "cp.date_approval", "", $param, '', $sortfield, $sortorder, 'center ');
+ }
// Extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
// Hook fields
@@ -720,7 +742,9 @@ if ($resql) {
if (!empty($arrayfields['cp.statut']['checked'])) {
print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "cp.statut", "", $param, '', $sortfield, $sortorder, 'right ');
}
- print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'maxwidthsearch center ');
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'maxwidthsearch center ');
+ }
print " \n";
$listhalfday = array('morning'=>$langs->trans("Morning"), "afternoon"=>$langs->trans("Afternoon"));
@@ -778,7 +802,18 @@ if ($resql) {
$endhalfday = ($obj->halfday == 1 || $obj->halfday == 2) ? 'morning' : 'afternoon';
print '';
-
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->rowid, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
if (!empty($arrayfields['cp.ref']['checked'])) {
print '';
print $holidaystatic->getNomUrl(1, 1);
@@ -839,18 +874,20 @@ if ($resql) {
$totalarray['nbfield']++;
}
}
+ // Date validation
if (!empty($arrayfields['cp.date_valid']['checked'])) { // date_valid is both date_valid but also date_approval
- print ' ';
+ print ' ';
print dol_print_date($db->jdate($obj->date_valid), 'day');
print ' ';
if (!$i) $totalarray['nbfield']++;
}
- /*if (!empty($arrayfields['cp.date_approve']['checked'])) {
- print '';
- print dol_print_date($db->jdate($obj->date_approve), 'day');
- print ' ';
- if (!$i) $totalarray['nbfield']++;
- }*/
+ // Date approval
+ if (!empty($arrayfields['cp.date_approval']['checked'])) {
+ print '';
+ print dol_print_date($db->jdate($obj->date_approval), 'day');
+ print ' ';
+ if (!$i) $totalarray['nbfield']++;
+ }
// Extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
@@ -880,15 +917,17 @@ if ($resql) {
}
// Action column
- print '';
- if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
- $selected = 0;
- if (in_array($obj->rowid, $arrayofselected)) {
- $selected = 1;
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print ' ';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->rowid, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
}
- print ' ';
+ print ' ';
}
- print '';
if (!$i) {
$totalarray['nbfield']++;
}
@@ -910,6 +949,8 @@ if ($resql) {
}
}
}
+ // status
+ print ' ';
print ' ';
}
}
diff --git a/htdocs/hrm/admin/job_extrafields.php b/htdocs/hrm/admin/job_extrafields.php
index 8dff50f4b6f..6ac0773c00f 100644
--- a/htdocs/hrm/admin/job_extrafields.php
+++ b/htdocs/hrm/admin/job_extrafields.php
@@ -67,7 +67,7 @@ require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php';
* View
*/
-$textobject = $langs->transnoentitiesnoconv("Job");
+$textobject = $langs->transnoentitiesnoconv("JobPosition");
$help_url = '';
$page_name = "HrmSetup";
diff --git a/htdocs/hrm/class/evaluation.class.php b/htdocs/hrm/class/evaluation.class.php
index 879acff61fa..b35a23a6389 100644
--- a/htdocs/hrm/class/evaluation.class.php
+++ b/htdocs/hrm/class/evaluation.class.php
@@ -119,7 +119,7 @@ class Evaluation extends CommonObject
'status' => array('type'=>'smallint', 'label'=>'Status', 'enabled'=>'1', 'position'=>1000, 'notnull'=>1, 'default'=>0, 'visible'=>5, 'index'=>1, 'arrayofkeyval'=>array('0'=>'Draft', '1'=>'Validated', '6' => 'Closed'),),
'date_eval' => array('type'=>'date', 'label'=>'DateEval', 'enabled'=>'1', 'position'=>502, 'notnull'=>1, 'visible'=>1,),
'fk_user' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'User', 'enabled'=>'1', 'position'=>504, 'notnull'=>1, 'visible'=>1,),
- 'fk_job' => array('type'=>'integer:Job:/hrm/class/job.class.php', 'label'=>'Job', 'enabled'=>'1', 'position'=>505, 'notnull'=>1, 'visible'=>1,),
+ 'fk_job' => array('type'=>'integer:Job:/hrm/class/job.class.php', 'label'=>'JobPosition', 'enabled'=>'1', 'position'=>505, 'notnull'=>1, 'visible'=>1,),
);
public $rowid;
public $ref;
diff --git a/htdocs/hrm/class/position.class.php b/htdocs/hrm/class/position.class.php
index 19246dc2313..5d0c04a4f47 100644
--- a/htdocs/hrm/class/position.class.php
+++ b/htdocs/hrm/class/position.class.php
@@ -110,10 +110,10 @@ class Position extends CommonObject
'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>'1', 'position'=>501, 'notnull'=>0, 'visible'=>-2,),
'fk_contrat' => array('type'=>'integer:Contrat:contrat/class/contrat.class.php', 'label'=>'fk_contrat', 'enabled'=>'1', 'position'=>50, 'notnull'=>0, 'visible'=>0,),
'fk_user' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'Employee', 'enabled'=>'1', 'position'=>55, 'notnull'=>1, 'visible'=>1, 'default'=>0),
- 'fk_job' => array('type'=>'integer:Job:/hrm/class/job.class.php', 'label'=>'Job', 'enabled'=>'1', 'position'=>56, 'notnull'=>1, 'visible'=>1,),
+ 'fk_job' => array('type'=>'integer:Job:/hrm/class/job.class.php', 'label'=>'JobPosition', 'enabled'=>'1', 'position'=>56, 'notnull'=>1, 'visible'=>1,),
'date_start' => array('type'=>'date', 'label'=>'DateStart', 'enabled'=>'1', 'position'=>51, 'notnull'=>1, 'visible'=>1,),
'date_end' => array('type'=>'date', 'label'=>'DateEnd', 'enabled'=>'1', 'position'=>52, 'notnull'=>0, 'visible'=>1,),
- 'abort_comment' => array('type'=>'varchar(255)', 'label'=>'AbandonmentComment', 'enabled'=>'1', 'position'=>502, 'notnull'=>0, 'visible'=>1,),
+ 'abort_comment' => array('type'=>'varchar(255)', 'label'=>'AbandonmentComment', 'enabled'=>'getDolGlobalInt("HRM_JOB_POSITON_ENDING_COMMENT")', 'position'=>502, 'notnull'=>0, 'visible'=>1,),
'note_public' => array('type'=>'html', 'label'=>'NotePublic', 'enabled'=>'1', 'position'=>70, 'notnull'=>0, 'visible'=>0,),
'note_private' => array('type'=>'html', 'label'=>'NotePrivate', 'enabled'=>'1', 'position'=>71, 'notnull'=>0, 'visible'=>0,),
'fk_user_creat' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserAuthor', 'enabled'=>'1', 'position'=>510, 'notnull'=>1, 'visible'=>-2, 'foreignkey'=>'user.rowid',),
diff --git a/htdocs/hrm/core/tpl/objectline_title.tpl.php b/htdocs/hrm/core/tpl/objectline_title.tpl.php
index 3801288543a..ae835ea2bca 100644
--- a/htdocs/hrm/core/tpl/objectline_title.tpl.php
+++ b/htdocs/hrm/core/tpl/objectline_title.tpl.php
@@ -65,7 +65,7 @@ print ''.$langs->trans('Label').' ';
print ''.$langs->trans('Description').' ';
// Note
-print ''.$langs->trans('EmployeeRank').' ';
+print ''.$form->textwithpicto($langs->trans("Level"), $langs->trans('EmployeeRank')).' ';
//print ' '; // No width to allow autodim
diff --git a/htdocs/hrm/core/tpl/skilldet.fiche.tpl.php b/htdocs/hrm/core/tpl/skilldet.fiche.tpl.php
index 60bb56ff173..81e3f9f2155 100644
--- a/htdocs/hrm/core/tpl/skilldet.fiche.tpl.php
+++ b/htdocs/hrm/core/tpl/skilldet.fiche.tpl.php
@@ -43,7 +43,7 @@ $value_private .= "\n";
/*
// Special cases
if ($module == 'propal') {
-$permission = $user->rights->propale->creer;
+$permission = $user->rights->propal->creer;
} elseif ($module == 'supplier_proposal') {
$permission = $user->rights->supplier_proposal->creer;
} elseif ($module == 'fichinter') {
diff --git a/htdocs/hrm/establishment/card.php b/htdocs/hrm/establishment/card.php
index f1bddce44e4..8e00473bca2 100644
--- a/htdocs/hrm/establishment/card.php
+++ b/htdocs/hrm/establishment/card.php
@@ -420,8 +420,13 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
* Action bar
*/
print '';
+
+ // Modify
print '
'.$langs->trans('Modify').' ';
- print '
'.$langs->trans('Delete').' ';
+
+ // Delete
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete);
+
print '
';
}
diff --git a/htdocs/hrm/evaluation_agenda.php b/htdocs/hrm/evaluation_agenda.php
index a6c6c2a9406..732b91d756f 100644
--- a/htdocs/hrm/evaluation_agenda.php
+++ b/htdocs/hrm/evaluation_agenda.php
@@ -158,7 +158,7 @@ if ($object->id > 0) {
$morehtmlref .= ' '.$langs->trans('Employee').' : '.$u_position->getNomUrl(1);
$job = new Job($db);
$job->fetch($object->fk_job);
- $morehtmlref .= ' '.$langs->trans('Job').' : '.$job->getNomUrl(1);
+ $morehtmlref .= ' '.$langs->trans('JobPosition').' : '.$job->getNomUrl(1);
$morehtmlref .= ' ';
diff --git a/htdocs/hrm/evaluation_card.php b/htdocs/hrm/evaluation_card.php
index 9f9b937a467..08854e2d88e 100644
--- a/htdocs/hrm/evaluation_card.php
+++ b/htdocs/hrm/evaluation_card.php
@@ -94,7 +94,9 @@ $upload_dir = $conf->hrm->multidir_output[isset($object->entity) ? $object->enti
//if ($user->socid > 0) $socid = $user->socid;
//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
-if (empty($conf->hrm->enabled)) accessforbidden();
+if (!isModEnabled("hrm")) {
+ accessforbidden();
+}
if (!$permissiontoread || ($action === 'create' && !$permissiontoadd)) accessforbidden();
@@ -283,11 +285,7 @@ if ($action == 'create') {
print dol_get_fiche_end();
- print '';
- print ' ';
- print ' ';
- print ' '; // Cancel for create does not post form if we don't know the backtopage
- print '
';
+ print $form->buttonsSaveCancel("Create", "Cancel");
print '';
}
@@ -321,9 +319,7 @@ if (($id || $ref) && $action == 'edit') {
print dol_get_fiche_end();
- print ' ';
- print ' ';
- print '
';
+ print $form->buttonsSaveCancel();
print '';
}
@@ -381,8 +377,10 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
$formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneAsk', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
}
- // Confirmation of action xxxx
+ // Confirmation of action xxxx (You can use it for xxx = 'close', xxx = 'reopen', ...)
if ($action == 'xxx') {
+ $text = $langs->trans('ConfirmActionMyObject', $object->ref);
+
$formquestion = array();
$formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('XXX'), $text, 'confirm_xxx', $formquestion, 0, 1, 220);
@@ -412,7 +410,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
$morehtmlref .= ' '.$langs->trans('Employee').' : '.$u_position->getNomUrl(1);
$job = new Job($db);
$job->fetch($object->fk_job);
- $morehtmlref .= ' '.$langs->trans('Job').' : '.$job->getNomUrl(1);
+ $morehtmlref .= ' '.$langs->trans('JobPosition').' : '.$job->getNomUrl(1);
$morehtmlref .= '';
@@ -446,11 +444,16 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
* Lines
*/
- if (!empty($object->table_element_line)) {
- if ($object->status == Evaluation::STATUS_DRAFT) {
- $result = $object->getLinesArray();
+ if (!empty($object->table_element_line) && $object->status == Evaluation::STATUS_DRAFT) {
+ // Show object lines
+ $result = $object->getLinesArray();
+ if ($result < 0) {
+ dol_print_error($db, $object->error, $object->errors);
+ }
- print ' id.(($action != 'editline') ? '' : '#line_'.GETPOST('lineid', 'int')).'" method="POST">
+ print ' ';
+
+ print ' id.(($action != 'editline') ? '' : '#line_'.GETPOST('lineid', 'int')).'" method="POST">
@@ -458,46 +461,44 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
';
- if (!empty($conf->use_javascript_ajax) && $object->status == 0) {
- include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
- }
-
- print '';
- /*if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) {
- print '
';
- print '';
- print ''.$langs->trans('Skill').' ';
- print ''.$langs->trans('Description').' ';
- print ''.$langs->trans('Rank').' ';
- print ' ';
- }*/
-
-
- if (!empty($object->lines)) {
- $conf->modules_parts['tpl']['hrm']='/hrm/core/tpl/'; // Pour utilisation du tpl hrm sur cet écran
- print '';
- $object->printObjectLines($action, $mysoc, null, GETPOST('lineid', 'int'), 1, '');
- print '
';
- }
-
-
-
- if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) {
- print '
';
-
- if ($object->status == $object::STATUS_DRAFT && $permissiontoadd) {
- print '
';
- print ' ';
- print '
';
- }
- }
-
-
- print '
';
-
- print " \n";
- print " ";
+ if (!empty($conf->use_javascript_ajax) && $object->status == 0) {
+ include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
}
+
+ $conf->modules_parts['tpl']['hrm']='/hrm/core/tpl/'; // Pour utilisation du tpl hrm sur cet écran
+
+ print '';
+ if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) {
+ print '
';
+ }
+
+ //if (!empty($object->lines)) {
+ $object->printObjectLines($action, $mysoc, null, GETPOST('lineid', 'int'), 1);
+ //}
+
+ // Form to add new line
+ /*
+ if ($object->status == 0 && $permissiontoadd && $action != 'selectlines') {
+ if ($action != 'editline') {
+ // Add products/services form
+
+ $parameters = array();
+ $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+ if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+ if (empty($reshook))
+ $object->formAddObjectLine(1, $mysoc, $soc);
+ }
+ }
+ */
+
+ if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) {
+ print '
';
+ }
+ print '
';
+
+ print "\n";
+
+ print " ";
}
// list of comparison
diff --git a/htdocs/hrm/evaluation_contact.php b/htdocs/hrm/evaluation_contact.php
index 1c1d9ed26fd..4ea2e8e81be 100644
--- a/htdocs/hrm/evaluation_contact.php
+++ b/htdocs/hrm/evaluation_contact.php
@@ -31,8 +31,9 @@ require '../main.inc.php';
require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
-require_once DOL_DOCUMENT_ROOT . '/hrm/class/evaluation.class.php';
-require_once DOL_DOCUMENT_ROOT . '/hrm/lib/hrm_evaluation.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/hrm/class/evaluation.class.php';
+require_once DOL_DOCUMENT_ROOT.'/hrm/lib/hrm_evaluation.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/hrm/class/job.class.php';
// Load translation files required by the page
$langs->loadLangs(array('hrm', 'companies', 'other', 'mails'));
@@ -138,43 +139,13 @@ if ($object->id) {
$linkback = ''.$langs->trans("BackToList").' ';
$morehtmlref = '';
- /*
- // Ref customer
- $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1);
- $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1);
- // Thirdparty
- $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . (is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : '');
- // Project
- if (isModEnabled('project'))
- {
- $langs->load("projects");
- $morehtmlref.='
'.$langs->trans('Project') . ' ';
- if ($permissiontoadd)
- {
- if ($action != 'classify')
- //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref.=' : ';
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref.='
';
- $morehtmlref.=' ';
- $morehtmlref.=' ';
- $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref.=' ';
- $morehtmlref.=' ';
- } else {
- $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
- }
- } else {
- if (!empty($object->fk_project)) {
- $proj = new Project($db);
- $proj->fetch($object->fk_project);
- $morehtmlref .= ': '.$proj->getNomUrl();
- } else {
- $morehtmlref .= '';
- }
- }
- }*/
+ $morehtmlref .= $langs->trans('Label').' : '.$object->label;
+ $u_position = new User(($db));
+ $u_position->fetch($object->fk_user);
+ $morehtmlref .= '
'.$langs->trans('Employee').' : '.$u_position->getNomUrl(1);
+ $job = new Job($db);
+ $job->fetch($object->fk_job);
+ $morehtmlref .= '
'.$langs->trans('JobPosition').' : '.$job->getNomUrl(1);
$morehtmlref .= '
';
dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref, '', 0, '', '', 1);
diff --git a/htdocs/hrm/evaluation_document.php b/htdocs/hrm/evaluation_document.php
index 23f9d260f0f..84bc6023291 100644
--- a/htdocs/hrm/evaluation_document.php
+++ b/htdocs/hrm/evaluation_document.php
@@ -33,9 +33,9 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
-require_once DOL_DOCUMENT_ROOT . '/hrm/class/evaluation.class.php';
-require_once DOL_DOCUMENT_ROOT . '/hrm/lib/hrm_evaluation.lib.php';
-require_once DOL_DOCUMENT_ROOT . '/hrm/class/job.class.php';
+require_once DOL_DOCUMENT_ROOT.'/hrm/class/evaluation.class.php';
+require_once DOL_DOCUMENT_ROOT.'/hrm/lib/hrm_evaluation.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/hrm/class/job.class.php';
// Load translation files required by the page
$langs->loadLangs(array('hrm', 'companies', 'other', 'mails'));
@@ -138,7 +138,7 @@ if ($object->id) {
$morehtmlref .= ' '.$langs->trans('Employee').' : '.$u_position->getNomUrl(1);
$job = new Job($db);
$job->fetch($object->fk_job);
- $morehtmlref .= ' '.$langs->trans('Job').' : '.$job->getNomUrl(1);
+ $morehtmlref .= ' '.$langs->trans('JobPosition').' : '.$job->getNomUrl(1);
$morehtmlref .= '';
dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
diff --git a/htdocs/hrm/evaluation_list.php b/htdocs/hrm/evaluation_list.php
index f475cef7af7..cf3272b894e 100644
--- a/htdocs/hrm/evaluation_list.php
+++ b/htdocs/hrm/evaluation_list.php
@@ -54,6 +54,7 @@ $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
$id = GETPOST('id', 'int');
+$ref = GETPOST('ref', 'alpha');
// Load variable for pagination
$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
diff --git a/htdocs/hrm/evaluation_note.php b/htdocs/hrm/evaluation_note.php
index 5c02b533bb7..ff0921cc59e 100644
--- a/htdocs/hrm/evaluation_note.php
+++ b/htdocs/hrm/evaluation_note.php
@@ -113,7 +113,7 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= ' '.$langs->trans('Employee').' : '.$u_position->getNomUrl(1);
$job = new Job($db);
$job->fetch($object->fk_job);
- $morehtmlref .= ' '.$langs->trans('Job').' : '.$job->getNomUrl(1);
+ $morehtmlref .= ' '.$langs->trans('JobPosition').' : '.$job->getNomUrl(1);
$morehtmlref .= '';
diff --git a/htdocs/hrm/index.php b/htdocs/hrm/index.php
index 05967606a8e..d81044d4a23 100644
--- a/htdocs/hrm/index.php
+++ b/htdocs/hrm/index.php
@@ -187,7 +187,7 @@ print '';
// Latest leave requests
-if (isModEnabled('holiday') && $user->rights->holiday->read) {
+if (isModEnabled('holiday') && $user->hasRight('holiday', 'read')) {
$sql = "SELECT u.rowid as uid, u.lastname, u.firstname, u.login, u.email, u.photo, u.statut as user_status,";
$sql .= " x.rowid, x.ref, x.fk_type, x.date_debut as date_start, x.date_fin as date_end, x.halfday, x.tms as dm, x.statut as status";
$sql .= " FROM ".MAIN_DB_PREFIX."holiday as x, ".MAIN_DB_PREFIX."user as u";
diff --git a/htdocs/hrm/lib/hrm.lib.php b/htdocs/hrm/lib/hrm.lib.php
index 2fef293784d..88a851f0137 100644
--- a/htdocs/hrm/lib/hrm.lib.php
+++ b/htdocs/hrm/lib/hrm.lib.php
@@ -54,13 +54,13 @@ function hrmAdminPrepareHead()
$head[$h][2] = 'establishments';
$h++;
- $head[$h][0] = DOL_URL_ROOT . '/hrm/admin/evaluation_extrafields.php';
- $head[$h][1] = $langs->trans("EvaluationsExtraFields");
- $nbExtrafields = $extrafields->attributes['hrm_evaluation']['count'];
+ $head[$h][0] = DOL_URL_ROOT . '/hrm/admin/skill_extrafields.php';
+ $head[$h][1] = $langs->trans("SkillsExtraFields");
+ $nbExtrafields = $extrafields->attributes['hrm_skill']['count'];
if ($nbExtrafields > 0) {
$head[$h][1] .= '
'.$nbExtrafields.' ';
}
- $head[$h][2] = 'evaluationsAttributes';
+ $head[$h][2] = 'skillsAttributes';
$h++;
$head[$h][0] = DOL_URL_ROOT . '/hrm/admin/job_extrafields.php';
@@ -72,13 +72,13 @@ function hrmAdminPrepareHead()
$head[$h][2] = 'jobsAttributes';
$h++;
- $head[$h][0] = DOL_URL_ROOT . '/hrm/admin/skill_extrafields.php';
- $head[$h][1] = $langs->trans("SkillsExtraFields");
- $nbExtrafields = $extrafields->attributes['hrm_skill']['count'];
+ $head[$h][0] = DOL_URL_ROOT . '/hrm/admin/evaluation_extrafields.php';
+ $head[$h][1] = $langs->trans("EvaluationsExtraFields");
+ $nbExtrafields = $extrafields->attributes['hrm_evaluation']['count'];
if ($nbExtrafields > 0) {
$head[$h][1] .= '
'.$nbExtrafields.' ';
}
- $head[$h][2] = 'skillsAttributes';
+ $head[$h][2] = 'evaluationsAttributes';
$h++;
// Show more tabs from modules
diff --git a/htdocs/hrm/position_list.php b/htdocs/hrm/position_list.php
index e79af867a74..739dc8bee02 100644
--- a/htdocs/hrm/position_list.php
+++ b/htdocs/hrm/position_list.php
@@ -54,6 +54,7 @@ $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
$id = GETPOST('id', 'int');
+$ref = GETPOST('ref', 'alpha');
// Load variable for pagination
$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
@@ -115,11 +116,11 @@ $arrayfields = array();
foreach ($object->fields as $key => $val) {
// If $val['visible']==0, then we never show the field
if (!empty($val['visible'])) {
- $visible = (int) dol_eval($val['visible'], 1, 1, '1');
+ $visible = (int) dol_eval($val['visible'], 1);
$arrayfields['t.'.$key] = array(
'label'=>$val['label'],
'checked'=>(($visible < 0) ? 0 : 1),
- 'enabled'=>($visible != 3 && dol_eval($val['enabled'], 1, 1, '1')),
+ 'enabled'=>(abs($visible) != 3 && dol_eval($val['enabled'], 1)),
'position'=>$val['position'],
'help'=> isset($val['help']) ? $val['help'] : ''
);
@@ -136,18 +137,15 @@ $permissiontoread = $user->rights->hrm->all->read;
$permissiontoadd = $user->rights->hrm->all->write;
$permissiontodelete = $user->rights->hrm->all->delete;
-// Security check
-if (empty($conf->hrm->enabled)) {
- accessforbidden('Module not enabled');
-}
-
// Security check (enable the most restrictive one)
if ($user->socid > 0) accessforbidden();
//if ($user->socid > 0) accessforbidden();
//$socid = 0; if ($user->socid > 0) $socid = $user->socid;
//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
-if (empty($conf->hrm->enabled)) accessforbidden();
+if (!isModEnabled('hrm')) {
+ accessforbidden('Module hrm not enabled');
+}
if (!$permissiontoread) accessforbidden();
@@ -250,23 +248,23 @@ foreach ($search as $key => $val) {
}
$mode_search = (($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key])) ? 1 : 0);
if ((strpos($object->fields[$key]['type'], 'integer:') === 0) || (strpos($object->fields[$key]['type'], 'sellist:') === 0) || !empty($object->fields[$key]['arrayofkeyval'])) {
- if ($search[$key] == '-1' || $search[$key] === '0') {
+ if ($search[$key] == '-1' || ($search[$key] === '0' && (empty($object->fields[$key]['arrayofkeyval']) || !array_key_exists('0', $object->fields[$key]['arrayofkeyval'])))) {
$search[$key] = '';
}
$mode_search = 2;
}
if ($search[$key] != '') {
- $sql .= natural_search($key, $search[$key], (($key == 'status') ? 2 : $mode_search));
+ $sql .= natural_search("t.".$db->escape($key), $search[$key], (($key == 'status') ? 2 : $mode_search));
}
} else {
if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') {
$columnName=preg_replace('/(_dtstart|_dtend)$/', '', $key);
if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) {
if (preg_match('/_dtstart$/', $key)) {
- $sql .= " AND t." . $columnName . " >= '" . $db->idate($search[$key]) . "'";
+ $sql .= " AND t.".$db->escape($columnName)." >= '".$db->idate($search[$key])."'";
}
if (preg_match('/_dtend$/', $key)) {
- $sql .= " AND t." . $columnName . " <= '" . $db->idate($search[$key]) . "'";
+ $sql .= " AND t.".$db->escape($columnName)." <= '".$db->idate($search[$key])."'";
}
}
}
@@ -290,7 +288,7 @@ $sql .= $hookmanager->resPrint;
/* If a group by is required
$sql .= " GROUP BY ";
foreach($object->fields as $key => $val) {
- $sql .= "t.".$key.", ";
+ $sql .= "t.".$db->escape($key).", ";
}
// Add fields from extrafields
if (!empty($extrafields->attributes[$object->table_element]['label'])) {
@@ -305,8 +303,6 @@ $sql .= $hookmanager->resPrint;
$sql = preg_replace('/,\s*$/', '', $sql);
*/
-$sql .= $db->order($sortfield, $sortorder);
-
// Count total nb of records
$nbtotalofrecords = '';
if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
@@ -316,24 +312,24 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
$page = 0;
$offset = 0;
}
+ $db->free($resql);
}
-// if total of record found is smaller than limit, no need to do paging and to restart another select with limits set.
-if (is_numeric($nbtotalofrecords) && ($limit > $nbtotalofrecords || empty($limit))) {
- $num = $nbtotalofrecords;
-} else {
- if ($limit) {
- $sql .= $db->plimit($limit + 1, $offset);
- }
- $resql = $db->query($sql);
- if (!$resql) {
- dol_print_error($db);
- exit;
- }
-
- $num = $db->num_rows($resql);
+// Complete request and execute it with limit
+$sql .= $db->order($sortfield, $sortorder);
+if ($limit) {
+ $sql .= $db->plimit($limit + 1, $offset);
}
+$resql = $db->query($sql);
+if (!$resql) {
+ dol_print_error($db);
+ exit;
+}
+
+$num = $db->num_rows($resql);
+
+
// Direct jump if only one record found
if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all && !$page) {
$obj = $db->fetch_object($resql);
@@ -366,6 +362,9 @@ llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', '');
$arrayofselected = is_array($toselect) ? $toselect : array();
$param = '';
+if (!empty($mode)) {
+ $param .= '&mode='.urlencode($mode);
+}
if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
$param .= '&contextpage='.urlencode($contextpage);
}
@@ -374,11 +373,17 @@ if ($limit > 0 && $limit != $conf->liste_limit) {
}
foreach ($search as $key => $val) {
- if (is_array($search[$key]) && count($search[$key])) {
+ if (is_array($search[$key])) {
foreach ($search[$key] as $skey) {
- $param .= '&search_'.$key.'[]='.urlencode($skey);
+ if ($skey != '') {
+ $param .= '&search_'.$key.'[]='.urlencode($skey);
+ }
}
- } else {
+ } elseif (preg_match('/(_dtstart|_dtend)$/', $key) && !empty($val)) {
+ $param .= '&search_'.$key.'month='.((int) GETPOST('search_'.$key.'month', 'int'));
+ $param .= '&search_'.$key.'day='.((int) GETPOST('search_'.$key.'day', 'int'));
+ $param .= '&search_'.$key.'year='.((int) GETPOST('search_'.$key.'year', 'int'));
+ } elseif ($search[$key] != '') {
$param .= '&search_'.$key.'='.urlencode($search[$key]);
}
}
@@ -399,7 +404,7 @@ $arrayofmassactions = array(
//'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
//'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
);
-if ($permissiontodelete) {
+if (!empty($permissiontodelete)) {
$arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
}
if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete'))) {
@@ -418,6 +423,7 @@ print '
';
print '
';
print '
';
print '
';
+print '
';
$newcardbutton = dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/hrm/position.php', 1).'?action=create', '', $permissiontoadd);
@@ -431,9 +437,12 @@ $trackid = 'xxxx'.$object->id;
include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
if ($search_all) {
+ $setupstring = '';
foreach ($fieldstosearchall as $key => $val) {
$fieldstosearchall[$key] = $langs->trans($val);
+ $setupstring .= $key."=".$val.";";
}
+ print ''."\n";
print '
'.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'
';
}
@@ -457,7 +466,7 @@ if (!empty($moreforfilter)) {
}
$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
-$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
+$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields
$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
print '
'; // You can use div-table-responsive-no-min if you dont need reserved height for your table
@@ -467,7 +476,15 @@ print '
';
+// Action column
+if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print '';
+ $searchpicto = $form->showFilterButtons('left');
+ print $searchpicto;
+ print ' ';
+}
foreach ($object->fields as $key => $val) {
+ $searchkey = empty($search[$key]) ? '' : $search[$key];
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
if ($key == 'status') {
$cssforfield .= ($cssforfield ? ' ' : '').'center';
@@ -475,7 +492,7 @@ foreach ($object->fields as $key => $val) {
$cssforfield .= ($cssforfield ? ' ' : '').'center';
} elseif (in_array($val['type'], array('timestamp'))) {
$cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
- } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
+ } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
$cssforfield .= ($cssforfield ? ' ' : '').'right';
}
if (!empty($arrayfields['t.'.$key]['checked'])) {
@@ -483,9 +500,7 @@ foreach ($object->fields as $key => $val) {
if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100', 1);
} elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) {
- print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', 'maxwidth125', 1);
- } elseif (!preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
- print ' ';
+ print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', $cssforfield.' maxwidth250', 1);
} elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
print '';
print $form->selectDate($search[$key.'_dtstart'] ? $search[$key.'_dtstart'] : '', "search_".$key."_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
@@ -493,6 +508,12 @@ foreach ($object->fields as $key => $val) {
print '
';
print $form->selectDate($search[$key.'_dtend'] ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
print '
';
+ } elseif ($key == 'lang') {
+ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
+ $formadmin = new FormAdmin($db);
+ print $formadmin->select_language($search[$key], 'search_lang', 0, null, 1, 0, 0, 'minwidth150 maxwidth200', 2);
+ } else {
+ print '
';
}
print '';
}
@@ -505,16 +526,23 @@ $parameters = array('arrayfields'=>$arrayfields);
$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Action column
-print '
';
-$searchpicto = $form->showFilterButtons();
-print $searchpicto;
-print ' ';
+if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print '
';
+ $searchpicto = $form->showFilterButtons();
+ print $searchpicto;
+ print ' ';
+}
print ''."\n";
+$totalarray = array();
+$totalarray['nbfield'] = 0;
// Fields title label
// --------------------------------------------------------------------
print '
';
+if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+}
foreach ($object->fields as $key => $val) {
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
if ($key == 'status') {
@@ -523,21 +551,26 @@ foreach ($object->fields as $key => $val) {
$cssforfield .= ($cssforfield ? ' ' : '').'center';
} elseif (in_array($val['type'], array('timestamp'))) {
$cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
- } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
+ } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $key != 'rowid' && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
$cssforfield .= ($cssforfield ? ' ' : '').'right';
}
+ $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label
if (!empty($arrayfields['t.'.$key]['checked'])) {
print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''))."\n";
+ $totalarray['nbfield']++;
}
}
// Extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
// Hook fields
-$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
+$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder, 'totalarray'=>&$totalarray);
$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Action column
-print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+}
+$totalarray['nbfield']++;
print ' '."\n";
@@ -555,9 +588,11 @@ if (isset($extrafields->attributes[$object->table_element]['computed']) && is_ar
// Loop on record
// --------------------------------------------------------------------
$i = 0;
+$savnbfield = $totalarray['nbfield'];
$totalarray = array();
$totalarray['nbfield'] = 0;
-while ($i < ($limit ? min($num, $limit) : $num)) {
+$imaxinloop = ($limit ? min($num, $limit) : $num);
+while ($i < $imaxinloop) {
$obj = $db->fetch_object($resql);
if (empty($obj)) {
break; // Should not happen
@@ -566,75 +601,107 @@ while ($i < ($limit ? min($num, $limit) : $num)) {
// Store properties in $object
$object->setVarsFromFetchObj($obj);
- // Show here line of result
- print '
';
- foreach ($object->fields as $key => $val) {
- $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
- if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
- $cssforfield .= ($cssforfield ? ' ' : '').'center';
- } elseif ($key == 'status') {
- $cssforfield .= ($cssforfield ? ' ' : '').'center';
+ if ($mode == 'kanban') {
+ if ($i == 0) {
+ print ' ';
+ print '';
}
-
- if (in_array($val['type'], array('timestamp'))) {
- $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
- } elseif ($key == 'ref') {
- $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
+ // Output Kanban
+ print $object->getKanbanView('');
+ if ($i == ($imaxinloop - 1)) {
+ print '
';
+ print ' ';
}
-
- if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) {
- $cssforfield .= ($cssforfield ? ' ' : '').'right';
- }
- //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100';
-
- if (!empty($arrayfields['t.'.$key]['checked'])) {
- print '
';
- if ($key == 'status') {
- print $object->getLibStatut(5);
- } elseif ($key == 'rowid') {
- print $object->getNomUrl(1);
- } else {
- print $object->showOutputField($val, $key, $object->$key, '');
+ } else {
+ // Show here line of result
+ $j = 0;
+ print ' ';
+ // Action column
+ if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($object->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
}
print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
- if (!$i) {
- $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key;
- }
- if (!isset($totalarray['val'])) {
- $totalarray['val'] = array();
- }
- if (!isset($totalarray['val']['t.'.$key])) {
- $totalarray['val']['t.'.$key] = 0;
- }
- $totalarray['val']['t.'.$key] += $object->$key;
- }
}
- }
- // Extra fields
- include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
- // Fields from hook
- $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
- $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
- print $hookmanager->resPrint;
- // Action column
- print '';
- if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
- $selected = 0;
- if (in_array($object->id, $arrayofselected)) {
- $selected = 1;
- }
- print ' ';
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
+ foreach ($object->fields as $key => $val) {
+ $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
+ if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'center';
+ } elseif ($key == 'status') {
+ $cssforfield .= ($cssforfield ? ' ' : '').'center';
+ }
- print ' '."\n";
+ if (in_array($val['type'], array('timestamp'))) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
+ } elseif ($key == 'ref') {
+ $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
+ }
+
+ if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) {
+ $cssforfield .= ($cssforfield ? ' ' : '').'right';
+ }
+ //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100';
+
+ if (!empty($arrayfields['t.'.$key]['checked'])) {
+ print '
';
+ if ($key == 'status') {
+ print $object->getLibStatut(5);
+ } elseif ($key == 'rowid') {
+ print $object->showOutputField($val, $key, $object->id, '');
+ } else {
+ print $object->showOutputField($val, $key, $object->$key, '');
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
+ if (!$i) {
+ $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key;
+ }
+ if (!isset($totalarray['val'])) {
+ $totalarray['val'] = array();
+ }
+ if (!isset($totalarray['val']['t.'.$key])) {
+ $totalarray['val']['t.'.$key] = 0;
+ }
+ $totalarray['val']['t.'.$key] += $object->$key;
+ }
+ }
+ }
+ // Extra fields
+ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
+ // Fields from hook
+ $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
+ $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
+ print $hookmanager->resPrint;
+ // Action column
+ if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print '
';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($object->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+
+ print ''."\n";
+ }
$i++;
}
@@ -650,14 +717,14 @@ if ($num == 0) {
$colspan++;
}
}
- print '
'.$langs->trans("NoRecordFound").' ';
+ print '
'.$langs->trans("NoRecordFound").' ';
}
$db->free($resql);
$parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
-$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
print '
'."\n";
diff --git a/htdocs/hrm/skill_list.php b/htdocs/hrm/skill_list.php
index 664d54212a3..ddf385b170e 100644
--- a/htdocs/hrm/skill_list.php
+++ b/htdocs/hrm/skill_list.php
@@ -344,21 +344,6 @@ if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $
llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', '');
-// Example : Adding jquery code
-// print '';
-
$arrayofselected = is_array($toselect) ? $toselect : array();
$param = '';
diff --git a/htdocs/hrm/skill_tab.php b/htdocs/hrm/skill_tab.php
index d479a843776..1682d304fbb 100644
--- a/htdocs/hrm/skill_tab.php
+++ b/htdocs/hrm/skill_tab.php
@@ -74,8 +74,8 @@ $hookmanager->initHooks(array('skilltab', 'globalcard')); // Note that conf->hoo
include DOL_DOCUMENT_ROOT . '/core/actions_fetchobject.inc.php'; // Must be include, not include_once.
// Permissions
-$permissiontoread = $user->rights->hrm->all->read;
-$permissiontoadd = $user->rights->hrm->all->write; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
+$permissiontoread = $user->hasRight('hrm', 'all', 'read');
+$permissiontoadd = $user->hasRight('hrm', 'all', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
// Security check (enable the most restrictive one)
if ($user->socid > 0) accessforbidden();
diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php
index c5dbf6b0eac..9a33bd25c05 100644
--- a/htdocs/imports/import.php
+++ b/htdocs/imports/import.php
@@ -492,7 +492,8 @@ if ($step == 2 && $datatoimport) {
$text = $objmodelimport->getDriverDescForKey($key);
print '
'.$form->textwithpicto($objmodelimport->getDriverLabelForKey($key), $text).' ';
print '
';
- print '';
+ $filename = $langs->trans("ExampleOfImportFile").'_'.$datatoimport.'.'.$key;
+ print ' ';
print img_picto('', 'download', 'class="paddingright opacitymedium"');
print $langs->trans("DownloadEmptyExampleShort");
print ' ';
@@ -583,7 +584,8 @@ if ($step == 3 && $datatoimport) {
$text = $objmodelimport->getDriverDescForKey($format);
print $form->textwithpicto($objmodelimport->getDriverLabelForKey($format), $text);
print ' ';
- print '';
+ $filename = $langs->trans("ExampleOfImportFile").'_'.$datatoimport.'.'.$format;
+ print ' ';
print img_picto('', 'download', 'class="paddingright opacitymedium"');
print $langs->trans("DownloadEmptyExampleShort");
print ' ';
@@ -1066,6 +1068,7 @@ if ($step == 4 && $datatoimport) {
print ''."\n";
// List of source fields
+
$var = false;
$lefti = 1;
foreach ($fieldssource as $key => $val) {
@@ -1088,6 +1091,7 @@ if ($step == 4 && $datatoimport) {
print '
';
// Set the list of all possible target fields in Dolibarr.
+
$optionsall = array();
foreach ($fieldstarget as $code => $line) {
//var_dump($line);
@@ -1139,8 +1143,7 @@ if ($step == 4 && $datatoimport) {
$entityicon = !empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity; // $entityicon must string name of picto of the field like 'project', 'company', 'contact', 'modulename', ...
$entitylang = $entitytolang[$entity] ? $entitytolang[$entity] : $objimport->array_import_label[0]; // $entitylang must be a translation key to describe object the field is related to, like 'Company', 'Contact', 'MyModyle', ...
- //print ' => '.img_object('', $entityicon).' '.$langs->trans($entitylang).' ';
- print '
=> ';
+ print '
=> ';
print '
';
//var_dump($_SESSION['dol_array_match_file_to_database_select']);
@@ -1508,7 +1511,7 @@ if ($step == 4 && $datatoimport) {
print ' ';
print $obj->label;
print ' ';
- print '';
+ print ' ';
if (empty($obj->fk_user)) {
print $langs->trans("Everybody");
} else {
@@ -2336,7 +2339,7 @@ $db->close();
*/
function show_elem($fieldssource, $pos, $key, $var, $nostyle = '')
{
- global $langs;
+ global $conf, $langs;
$height = '32px';
@@ -2382,7 +2385,7 @@ function show_elem($fieldssource, $pos, $key, $var, $nostyle = '')
if (isset($fieldssource[$pos]['imported']) && $fieldssource[$pos]['imported'] == false) {
print ' ';
} else {
- print ' ';
+ print ' ';
}
print $langs->trans("Column").' '.num2Alpha($pos - 1).' (#'.$pos.')';
if (empty($fieldssource[$pos]['example1'])) {
@@ -2394,7 +2397,12 @@ function show_elem($fieldssource, $pos, $key, $var, $nostyle = '')
if (!utf8_check($example)) {
$example = utf8_encode($example);
}
- print ' - ';
+ if (!empty($conf->dol_optimize_smallscreen)) {
+ //print ' ';
+ print ' - ';
+ } else {
+ print ' - ';
+ }
//print ''.$langs->trans("ExampleOnFirstLine").': ';
print ''.$example.' ';
}
diff --git a/htdocs/includes/adodbtime/README.txt b/htdocs/includes/adodbtime/README.txt
deleted file mode 100644
index 3e2969a2868..00000000000
--- a/htdocs/includes/adodbtime/README.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-README
-======
-
-ADOdb Date Library, part of the ADOdb abstraction library
-
-See Wiki: https://adodb.org/dokuwiki/doku.php?id=v5:datetime:datetime_index
-Download: https://github.com/ADOdb/ADOdb/blob/master/adodb-time.inc.php
diff --git a/htdocs/includes/adodbtime/adodb-time.inc.php b/htdocs/includes/adodbtime/adodb-time.inc.php
deleted file mode 100644
index 030196db275..00000000000
--- a/htdocs/includes/adodbtime/adodb-time.inc.php
+++ /dev/null
@@ -1,1459 +0,0 @@
- 4 digit year conversion. The maximum is billions of years in the
-future, but this is a theoretical limit as the computation of that year
-would take too long with the current implementation of adodb_mktime().
-
-This library replaces native functions as follows:
-
-
- getdate() with adodb_getdate()
- date() with adodb_date()
- gmdate() with adodb_gmdate()
- mktime() with adodb_mktime()
- gmmktime() with adodb_gmmktime()
- strftime() with adodb_strftime()
- strftime() with adodb_gmstrftime()
-
-
-The parameters are identical, except that adodb_date() accepts a subset
-of date()'s field formats. Mktime() will convert from local time to GMT,
-and date() will convert from GMT to local time, but daylight savings is
-not handled currently.
-
-This library is independant of the rest of ADOdb, and can be used
-as standalone code.
-
-PERFORMANCE
-
-For high speed, this library uses the native date functions where
-possible, and only switches to PHP code when the dates fall outside
-the 32-bit signed integer range.
-
-GREGORIAN CORRECTION
-
-Pope Gregory shortened October of A.D. 1582 by ten days. Thursday,
-October 4, 1582 (Julian) was followed immediately by Friday, October 15,
-1582 (Gregorian).
-
-Since 0.06, we handle this correctly, so:
-
-adodb_mktime(0,0,0,10,15,1582) - adodb_mktime(0,0,0,10,4,1582)
- == 24 * 3600 (1 day)
-
-=============================================================================
-
-COPYRIGHT
-
-(c) 2003-2014 John Lim and released under BSD-style license except for code by
-jackbbs, which includes adodb_mktime, adodb_get_gmt_diff, adodb_is_leap_year
-and originally found at http://www.php.net/manual/en/function.mktime.php
-
-=============================================================================
-
-BUG REPORTS
-
-These should be posted to the ADOdb forums at
-
- http://phplens.com/lens/lensforum/topics.php?id=4
-
-=============================================================================
-
-FUNCTION DESCRIPTIONS
-
-** FUNCTION adodb_time()
-
-Returns the current time measured in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) as an unsigned integer.
-
-** FUNCTION adodb_getdate($date=false)
-
-Returns an array containing date information, as getdate(), but supports
-dates greater than 1901 to 2038. The local date/time format is derived from a
-heuristic the first time adodb_getdate is called.
-
-
-** FUNCTION adodb_date($fmt, $timestamp = false)
-
-Convert a timestamp to a formatted local date. If $timestamp is not defined, the
-current timestamp is used. Unlike the function date(), it supports dates
-outside the 1901 to 2038 range.
-
-The format fields that adodb_date supports:
-
-
- a - "am" or "pm"
- A - "AM" or "PM"
- d - day of the month, 2 digits with leading zeros; i.e. "01" to "31"
- D - day of the week, textual, 3 letters; e.g. "Fri"
- F - month, textual, long; e.g. "January"
- g - hour, 12-hour format without leading zeros; i.e. "1" to "12"
- G - hour, 24-hour format without leading zeros; i.e. "0" to "23"
- h - hour, 12-hour format; i.e. "01" to "12"
- H - hour, 24-hour format; i.e. "00" to "23"
- i - minutes; i.e. "00" to "59"
- j - day of the month without leading zeros; i.e. "1" to "31"
- l (lowercase 'L') - day of the week, textual, long; e.g. "Friday"
- L - boolean for whether it is a leap year; i.e. "0" or "1"
- m - month; i.e. "01" to "12"
- M - month, textual, 3 letters; e.g. "Jan"
- n - month without leading zeros; i.e. "1" to "12"
- O - Difference to Greenwich time in hours; e.g. "+0200"
- Q - Quarter, as in 1, 2, 3, 4
- r - RFC 2822 formatted date; e.g. "Thu, 21 Dec 2000 16:01:07 +0200"
- s - seconds; i.e. "00" to "59"
- S - English ordinal suffix for the day of the month, 2 characters;
- i.e. "st", "nd", "rd" or "th"
- t - number of days in the given month; i.e. "28" to "31"
- T - Timezone setting of this machine; e.g. "EST" or "MDT"
- U - seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)
- w - day of the week, numeric, i.e. "0" (Sunday) to "6" (Saturday)
- Y - year, 4 digits; e.g. "1999"
- y - year, 2 digits; e.g. "99"
- z - day of the year; i.e. "0" to "365"
- Z - timezone offset in seconds (i.e. "-43200" to "43200").
- The offset for timezones west of UTC is always negative,
- and for those east of UTC is always positive.
-
-
-Unsupported:
-
- B - Swatch Internet time
- I (capital i) - "1" if Daylight Savings Time, "0" otherwise.
- W - ISO-8601 week number of year, weeks starting on Monday
-
-
-
-
-** FUNCTION adodb_date2($fmt, $isoDateString = false)
-Same as adodb_date, but 2nd parameter accepts iso date, eg.
-
- adodb_date2('d-M-Y H:i','2003-12-25 13:01:34');
-
-
-** FUNCTION adodb_gmdate($fmt, $timestamp = false)
-
-Convert a timestamp to a formatted GMT date. If $timestamp is not defined, the
-current timestamp is used. Unlike the function date(), it supports dates
-outside the 1901 to 2038 range.
-
-
-** FUNCTION adodb_mktime($hr, $min, $sec[, $month, $day, $year])
-
-Converts a local date to a unix timestamp. Unlike the function mktime(), it supports
-dates outside the 1901 to 2038 range. All parameters are optional.
-
-
-** FUNCTION adodb_gmmktime($hr, $min, $sec [, $month, $day, $year])
-
-Converts a gmt date to a unix timestamp. Unlike the function gmmktime(), it supports
-dates outside the 1901 to 2038 range. Differs from gmmktime() in that all parameters
-are currently compulsory.
-
-** FUNCTION adodb_gmstrftime($fmt, $timestamp = false)
-Convert a timestamp to a formatted GMT date.
-
-** FUNCTION adodb_strftime($fmt, $timestamp = false)
-
-Convert a timestamp to a formatted local date. Internally converts $fmt into
-adodb_date format, then echo result.
-
-For best results, you can define the local date format yourself. Define a global
-variable $ADODB_DATE_LOCALE which is an array, 1st element is date format using
-adodb_date syntax, and 2nd element is the time format, also in adodb_date syntax.
-
- eg. $ADODB_DATE_LOCALE = array('d/m/Y','H:i:s');
-
- Supported format codes:
-
-
- %a - abbreviated weekday name according to the current locale
- %A - full weekday name according to the current locale
- %b - abbreviated month name according to the current locale
- %B - full month name according to the current locale
- %c - preferred date and time representation for the current locale
- %d - day of the month as a decimal number (range 01 to 31)
- %D - same as %m/%d/%y
- %e - day of the month as a decimal number, a single digit is preceded by a space (range ' 1' to '31')
- %h - same as %b
- %H - hour as a decimal number using a 24-hour clock (range 00 to 23)
- %I - hour as a decimal number using a 12-hour clock (range 01 to 12)
- %m - month as a decimal number (range 01 to 12)
- %M - minute as a decimal number
- %n - newline character
- %p - either `am' or `pm' according to the given time value, or the corresponding strings for the current locale
- %r - time in a.m. and p.m. notation
- %R - time in 24 hour notation
- %S - second as a decimal number
- %t - tab character
- %T - current time, equal to %H:%M:%S
- %x - preferred date representation for the current locale without the time
- %X - preferred time representation for the current locale without the date
- %y - year as a decimal number without a century (range 00 to 99)
- %Y - year as a decimal number including the century
- %Z - time zone or name or abbreviation
- %% - a literal `%' character
-
-
- Unsupported codes:
-
- %C - century number (the year divided by 100 and truncated to an integer, range 00 to 99)
- %g - like %G, but without the century.
- %G - The 4-digit year corresponding to the ISO week number (see %V).
- This has the same format and value as %Y, except that if the ISO week number belongs
- to the previous or next year, that year is used instead.
- %j - day of the year as a decimal number (range 001 to 366)
- %u - weekday as a decimal number [1,7], with 1 representing Monday
- %U - week number of the current year as a decimal number, starting
- with the first Sunday as the first day of the first week
- %V - The ISO 8601:1988 week number of the current year as a decimal number,
- range 01 to 53, where week 1 is the first week that has at least 4 days in the
- current year, and with Monday as the first day of the week. (Use %G or %g for
- the year component that corresponds to the week number for the specified timestamp.)
- %w - day of the week as a decimal, Sunday being 0
- %W - week number of the current year as a decimal number, starting with the
- first Monday as the first day of the first week
-
-
-=============================================================================
-
-NOTES
-
-Useful url for generating test timestamps:
- http://www.4webhelp.net/us/timestamp.php
-
-Possible future optimizations include
-
-a. Using an algorithm similar to Plauger's in "The Standard C Library"
-(page 428, xttotm.c _Ttotm() function). Plauger's algorithm will not
-work outside 32-bit signed range, so i decided not to implement it.
-
-b. Implement daylight savings, which looks awfully complicated, see
- http://webexhibits.org/daylightsaving/
-
-
-CHANGELOG
-- 16 Jan 2011 0.36
-Added adodb_time() which returns current time. If > 2038, will return as float
-
-- 7 Feb 2011 0.35
-Changed adodb_date to be symmetric with adodb_mktime. See $jan1_71. fix for bc.
-
-- 13 July 2010 0.34
-Changed adodb_get_gm_diff to use DateTimeZone().
-
-- 11 Feb 2008 0.33
-* Bug in 0.32 fix for hour handling. Fixed.
-
-- 1 Feb 2008 0.32
-* Now adodb_mktime(0,0,0,12+$m,20,2040) works properly.
-
-- 10 Jan 2008 0.31
-* Now adodb_mktime(0,0,0,24,1,2037) works correctly.
-
-- 15 July 2007 0.30
-Added PHP 5.2.0 compatability fixes.
- * gmtime behaviour for 1970 has changed. We use the actual date if it is between 1970 to 2038 to get the
- * timezone, otherwise we use the current year as the baseline to retrieve the timezone.
- * Also the timezone's in php 5.2.* support historical data better, eg. if timezone today was +8, but
- in 1970 it was +7:30, then php 5.2 return +7:30, while this library will use +8.
- *
-
-- 19 March 2006 0.24
-Changed strftime() locale detection, because some locales prepend the day of week to the date when %c is used.
-
-- 10 Feb 2006 0.23
-PHP5 compat: when we detect PHP5, the RFC2822 format for gmt 0000hrs is changed from -0000 to +0000.
- In PHP4, we will still use -0000 for 100% compat with PHP4.
-
-- 08 Sept 2005 0.22
-In adodb_date2(), $is_gmt not supported properly. Fixed.
-
-- 18 July 2005 0.21
-In PHP 4.3.11, the 'r' format has changed. Leading 0 in day is added. Changed for compat.
-Added support for negative months in adodb_mktime().
-
-- 24 Feb 2005 0.20
-Added limited strftime/gmstrftime support. x10 improvement in performance of adodb_date().
-
-- 21 Dec 2004 0.17
-In adodb_getdate(), the timestamp was accidentally converted to gmt when $is_gmt is false.
-Also adodb_mktime(0,0,0) did not work properly. Both fixed thx Mauro.
-
-- 17 Nov 2004 0.16
-Removed intval typecast in adodb_mktime() for secs, allowing:
- adodb_mktime(0,0,0 + 2236672153,1,1,1934);
-Suggested by Ryan.
-
-- 18 July 2004 0.15
-All params in adodb_mktime were formerly compulsory. Now only the hour, min, secs is compulsory.
-This brings it more in line with mktime (still not identical).
-
-- 23 June 2004 0.14
-
-Allow you to define your own daylights savings function, adodb_daylight_sv.
-If the function is defined (somewhere in an include), then you can correct for daylights savings.
-
-In this example, we apply daylights savings in June or July, adding one hour. This is extremely
-unrealistic as it does not take into account time-zone, geographic location, current year.
-
-function adodb_daylight_sv(&$arr, $is_gmt)
-{
- if ($is_gmt) return;
- $m = $arr['mon'];
- if ($m == 6 || $m == 7) $arr['hours'] += 1;
-}
-
-This is only called by adodb_date() and not by adodb_mktime().
-
-The format of $arr is
-Array (
- [seconds] => 0
- [minutes] => 0
- [hours] => 0
- [mday] => 1 # day of month, eg 1st day of the month
- [mon] => 2 # month (eg. Feb)
- [year] => 2102
- [yday] => 31 # days in current year
- [leap] => # true if leap year
- [ndays] => 28 # no of days in current month
- )
-
-
-- 28 Apr 2004 0.13
-Fixed adodb_date to properly support $is_gmt. Thx to Dimitar Angelov.
-
-- 20 Mar 2004 0.12
-Fixed month calculation error in adodb_date. 2102-June-01 appeared as 2102-May-32.
-
-- 26 Oct 2003 0.11
-Because of daylight savings problems (some systems apply daylight savings to
-January!!!), changed adodb_get_gmt_diff() to ignore daylight savings.
-
-- 9 Aug 2003 0.10
-Fixed bug with dates after 2038.
-See http://phplens.com/lens/lensforum/msgs.php?id=6980
-
-- 1 July 2003 0.09
-Added support for Q (Quarter).
-Added adodb_date2(), which accepts ISO date in 2nd param
-
-- 3 March 2003 0.08
-Added support for 'S' adodb_date() format char. Added constant ADODB_ALLOW_NEGATIVE_TS
-if you want PHP to handle negative timestamps between 1901 to 1969.
-
-- 27 Feb 2003 0.07
-All negative numbers handled by adodb now because of RH 7.3+ problems.
-See http://bugs.php.net/bug.php?id=20048&edit=2
-
-- 4 Feb 2003 0.06
-Fixed a typo, 1852 changed to 1582! This means that pre-1852 dates
-are now correctly handled.
-
-- 29 Jan 2003 0.05
-
-Leap year checking differs under Julian calendar (pre 1582). Also
-leap year code optimized by checking for most common case first.
-
-We also handle month overflow correctly in mktime (eg month set to 13).
-
-Day overflow for less than one month's days is supported.
-
-- 28 Jan 2003 0.04
-
-Gregorian correction handled. In PHP5, we might throw an error if
-mktime uses invalid dates around 5-14 Oct 1582. Released with ADOdb 3.10.
-Added limbo 5-14 Oct 1582 check, when we set to 15 Oct 1582.
-
-- 27 Jan 2003 0.03
-
-Fixed some more month problems due to gmt issues. Added constant ADODB_DATE_VERSION.
-Fixed calculation of days since start of year for <1970.
-
-- 27 Jan 2003 0.02
-
-Changed _adodb_getdate() to inline leap year checking for better performance.
-Fixed problem with time-zones west of GMT +0000.
-
-- 24 Jan 2003 0.01
-
-First implementation.
-*/
-
-
-/* Initialization */
-
-/*
- Version Number
-*/
-define('ADODB_DATE_VERSION',0.35);
-
-$ADODB_DATETIME_CLASS = (PHP_VERSION >= 5.2);
-
-/*
- This code was originally for windows. But apparently this problem happens
- also with Linux, RH 7.3 and later!
-
- glibc-2.2.5-34 and greater has been changed to return -1 for dates <
- 1970. This used to work. The problem exists with RedHat 7.3 and 8.0
- echo (mktime(0, 0, 0, 1, 1, 1960)); // prints -1
-
- References:
- http://bugs.php.net/bug.php?id=20048&edit=2
- http://lists.debian.org/debian-glibc/2002/debian-glibc-200205/msg00010.html
-*/
-
-if (!defined('ADODB_ALLOW_NEGATIVE_TS')) define('ADODB_NO_NEGATIVE_TS',1);
-
-function adodb_date_test_date($y1,$m,$d=13)
-{
- $h = round(rand()% 24);
- $t = adodb_mktime($h,0,0,$m,$d,$y1);
- $rez = adodb_date('Y-n-j H:i:s',$t);
- if ($h == 0) $h = '00';
- else if ($h < 10) $h = '0'.$h;
- if ("$y1-$m-$d $h:00:00" != $rez) {
- print "$y1 error, expected=$y1-$m-$d $h:00:00, adodb=$rez ";
- return false;
- }
- return true;
-}
-
-function adodb_date_test_strftime($fmt)
-{
- $s1 = strftime($fmt);
- $s2 = adodb_strftime($fmt);
-
- if ($s1 == $s2) return true;
-
- echo "error for $fmt, strftime=$s1, adodb=$s2 ";
- return false;
-}
-
-/**
- Test Suite
-*/
-function adodb_date_test()
-{
-
- for ($m=-24; $m<=24; $m++)
- echo "$m :",adodb_date('d-m-Y',adodb_mktime(0,0,0,1+$m,20,2040))," ";
-
- error_reporting(E_ALL);
- print "Testing adodb_date and adodb_mktime. version=".ADODB_DATE_VERSION.' PHP='.PHP_VERSION." ";
- @set_time_limit(0);
- $fail = false;
-
- // This flag disables calling of PHP native functions, so we can properly test the code
- if (!defined('ADODB_TEST_DATES')) define('ADODB_TEST_DATES',1);
-
- $t = time();
-
-
- $fmt = 'Y-m-d H:i:s';
- echo '';
- echo 'adodb: ',adodb_date($fmt,$t),' ';
- echo 'php : ',date($fmt,$t),' ';
- echo ' ';
-
- adodb_date_test_strftime('%Y %m %x %X');
- adodb_date_test_strftime("%A %d %B %Y");
- adodb_date_test_strftime("%H %M S");
-
- $t = adodb_mktime(0,0,0);
- if (!(adodb_date('Y-m-d') == date('Y-m-d'))) print 'Error in '.adodb_mktime(0,0,0).' ';
-
- $t = adodb_mktime(0,0,0,6,1,2102);
- if (!(adodb_date('Y-m-d',$t) == '2102-06-01')) print 'Error in '.adodb_date('Y-m-d',$t).' ';
-
- $t = adodb_mktime(0,0,0,2,1,2102);
- if (!(adodb_date('Y-m-d',$t) == '2102-02-01')) print 'Error in '.adodb_date('Y-m-d',$t).' ';
-
-
- print "Testing gregorian <=> julian conversion
";
- $t = adodb_mktime(0,0,0,10,11,1492);
- //http://www.holidayorigins.com/html/columbus_day.html - Friday check
- if (!(adodb_date('D Y-m-d',$t) == 'Fri 1492-10-11')) print 'Error in Columbus landing ';
-
- $t = adodb_mktime(0,0,0,2,29,1500);
- if (!(adodb_date('Y-m-d',$t) == '1500-02-29')) print 'Error in julian leap years ';
-
- $t = adodb_mktime(0,0,0,2,29,1700);
- if (!(adodb_date('Y-m-d',$t) == '1700-03-01')) print 'Error in gregorian leap years ';
-
- print adodb_mktime(0,0,0,10,4,1582).' ';
- print adodb_mktime(0,0,0,10,15,1582);
- $diff = (adodb_mktime(0,0,0,10,15,1582) - adodb_mktime(0,0,0,10,4,1582));
- if ($diff != 3600*24) print " Error in gregorian correction = ".($diff/3600/24)." days ";
-
- print " 15 Oct 1582, Fri=".(adodb_dow(1582,10,15) == 5 ? 'Fri' : 'Error ')." ";
- print " 4 Oct 1582, Thu=".(adodb_dow(1582,10,4) == 4 ? 'Thu' : 'Error ')." ";
-
- print "
Testing overflow
";
-
- $t = adodb_mktime(0,0,0,3,33,1965);
- if (!(adodb_date('Y-m-d',$t) == '1965-04-02')) print 'Error in day overflow 1 ';
- $t = adodb_mktime(0,0,0,4,33,1971);
- if (!(adodb_date('Y-m-d',$t) == '1971-05-03')) print 'Error in day overflow 2 ';
- $t = adodb_mktime(0,0,0,1,60,1965);
- if (!(adodb_date('Y-m-d',$t) == '1965-03-01')) print 'Error in day overflow 3 '.adodb_date('Y-m-d',$t).' ';
- $t = adodb_mktime(0,0,0,12,32,1965);
- if (!(adodb_date('Y-m-d',$t) == '1966-01-01')) print 'Error in day overflow 4 '.adodb_date('Y-m-d',$t).' ';
- $t = adodb_mktime(0,0,0,12,63,1965);
- if (!(adodb_date('Y-m-d',$t) == '1966-02-01')) print 'Error in day overflow 5 '.adodb_date('Y-m-d',$t).' ';
- $t = adodb_mktime(0,0,0,13,3,1965);
- if (!(adodb_date('Y-m-d',$t) == '1966-01-03')) print 'Error in mth overflow 1 ';
-
- print "Testing 2-digit => 4-digit year conversion
";
- if (adodb_year_digit_check(00) != 2000) print "Err 2-digit 2000 ";
- if (adodb_year_digit_check(10) != 2010) print "Err 2-digit 2010 ";
- if (adodb_year_digit_check(20) != 2020) print "Err 2-digit 2020 ";
- if (adodb_year_digit_check(30) != 2030) print "Err 2-digit 2030 ";
- if (adodb_year_digit_check(40) != 1940) print "Err 2-digit 1940 ";
- if (adodb_year_digit_check(50) != 1950) print "Err 2-digit 1950 ";
- if (adodb_year_digit_check(90) != 1990) print "Err 2-digit 1990 ";
-
- // Test string formating
- print "
Testing date formating
";
-
- $fmt = '\d\a\t\e T Y-m-d H:i:s a A d D F g G h H i j l L m M n O \R\F\C2822 r s t U w y Y z Z 2003';
- $s1 = date($fmt,0);
- $s2 = adodb_date($fmt,0);
- if ($s1 != $s2) {
- print " date() 0 failed $s1 $s2 ";
- }
- flush();
- for ($i=100; --$i > 0; ) {
-
- $ts = 3600.0*((rand()%60000)+(rand()%60000))+(rand()%60000);
- $s1 = date($fmt,$ts);
- $s2 = adodb_date($fmt,$ts);
- //print "$s1 $s2 ";
- $pos = strcmp($s1,$s2);
-
- if (($s1) != ($s2)) {
- for ($j=0,$k=strlen($s1); $j < $k; $j++) {
- if ($s1[$j] != $s2[$j]) {
- print substr($s1,$j).' ';
- break;
- }
- }
- print "Error date(): $ts
- \"$s1\" (date len=".strlen($s1).")
- \"$s2\" (adodb_date len=".strlen($s2).") ";
- $fail = true;
- }
-
- $a1 = getdate($ts);
- $a2 = adodb_getdate($ts);
- $rez = array_diff($a1,$a2);
- if (sizeof($rez)>0) {
- print "Error getdate() $ts ";
- print_r($a1);
- print " ";
- print_r($a2);
- print "
";
- $fail = true;
- }
- }
-
- // Test generation of dates outside 1901-2038
- print "
Testing random dates between 100 and 4000
";
- adodb_date_test_date(100,1);
- for ($i=100; --$i >= 0;) {
- $y1 = 100+rand(0,1970-100);
- $m = rand(1,12);
- adodb_date_test_date($y1,$m);
-
- $y1 = 3000-rand(0,3000-1970);
- adodb_date_test_date($y1,$m);
- }
- print '';
- $start = 1960+rand(0,10);
- $yrs = 12;
- $i = 365.25*86400*($start-1970);
- $offset = 36000+rand(10000,60000);
- $max = 365*$yrs*86400;
- $lastyear = 0;
-
- // we generate a timestamp, convert it to a date, and convert it back to a timestamp
- // and check if the roundtrip broke the original timestamp value.
- print "Testing $start to ".($start+$yrs).", or $max seconds, offset=$offset: ";
- $cnt = 0;
- for ($max += $i; $i < $max; $i += $offset) {
- $ret = adodb_date('m,d,Y,H,i,s',$i);
- $arr = explode(',',$ret);
- if ($lastyear != $arr[2]) {
- $lastyear = $arr[2];
- print " $lastyear ";
- flush();
- }
- $newi = adodb_mktime($arr[3],$arr[4],$arr[5],$arr[0],$arr[1],$arr[2]);
- if ($i != $newi) {
- print "Error at $i, adodb_mktime returned $newi ($ret)";
- $fail = true;
- break;
- }
- $cnt += 1;
- }
- echo "Tested $cnt dates ";
- if (!$fail) print "
Passed !
";
- else print "Failed :-(
";
-}
-
-function adodb_time()
-{
- $d = new DateTime();
- return $d->format('U');
-}
-
-/**
- Returns day of week, 0 = Sunday,... 6=Saturday.
- Algorithm from PEAR::Date_Calc
-*/
-function adodb_dow($year, $month, $day)
-{
-/*
-Pope Gregory removed 10 days - October 5 to October 14 - from the year 1582 and
-proclaimed that from that time onwards 3 days would be dropped from the calendar
-every 400 years.
-
-Thursday, October 4, 1582 (Julian) was followed immediately by Friday, October 15, 1582 (Gregorian).
-*/
- if ($year <= 1582) {
- if ($year < 1582 ||
- ($year == 1582 && ($month < 10 || ($month == 10 && $day < 15)))) $greg_correction = 3;
- else
- $greg_correction = 0;
- } else
- $greg_correction = 0;
-
- if($month > 2)
- $month -= 2;
- else {
- $month += 10;
- $year--;
- }
-
- $day = floor((13 * $month - 1) / 5) +
- $day + ($year % 100) +
- floor(($year % 100) / 4) +
- floor(($year / 100) / 4) - 2 *
- floor($year / 100) + 77 + $greg_correction;
-
- return $day - 7 * floor($day / 7);
-}
-
-
-/**
- Checks for leap year, returns true if it is. No 2-digit year check. Also
- handles julian calendar correctly.
-*/
-function _adodb_is_leap_year($year)
-{
- if ($year % 4 != 0) return false;
-
- if ($year % 400 == 0) {
- return true;
- // if gregorian calendar (>1582), century not-divisible by 400 is not leap
- } else if ($year > 1582 && $year % 100 == 0 ) {
- return false;
- }
-
- return true;
-}
-
-
-/**
- checks for leap year, returns true if it is. Has 2-digit year check
-*/
-function adodb_is_leap_year($year)
-{
- return _adodb_is_leap_year(adodb_year_digit_check($year));
-}
-
-/**
- Fix 2-digit years. Works for any century.
- Assumes that if 2-digit is more than 30 years in future, then previous century.
-*/
-function adodb_year_digit_check($y)
-{
- if ($y < 100) {
-
- $yr = (integer) date("Y");
- $century = (integer) ($yr /100);
-
- if ($yr%100 > 50) {
- $c1 = $century + 1;
- $c0 = $century;
- } else {
- $c1 = $century;
- $c0 = $century - 1;
- }
- $c1 *= 100;
- // if 2-digit year is less than 30 years in future, set it to this century
- // otherwise if more than 30 years in future, then we set 2-digit year to the prev century.
- if (($y + $c1) < $yr+30) $y = $y + $c1;
- else $y = $y + $c0*100;
- }
- return $y;
-}
-
-function adodb_get_gmt_diff_ts($ts)
-{
- if (0 <= $ts && $ts <= 0x7FFFFFFF) { // check if number in 32-bit signed range) {
- $arr = getdate($ts);
- $y = $arr['year'];
- $m = $arr['mon'];
- $d = $arr['mday'];
- return adodb_get_gmt_diff($y,$m,$d);
- } else {
- return adodb_get_gmt_diff(false,false,false);
- }
-
-}
-
-/**
- get local time zone offset from GMT. Does not handle historical timezones before 1970.
-*/
-function adodb_get_gmt_diff($y,$m,$d)
-{
-static $TZ,$tzo;
-global $ADODB_DATETIME_CLASS;
-
- if (!defined('ADODB_TEST_DATES')) $y = false;
- else if ($y < 1970 || $y >= 2038) $y = false;
-
- if ($ADODB_DATETIME_CLASS && $y !== false) {
- $dt = new DateTime();
- $dt->setISODate($y,$m,$d);
- if (empty($tzo)) {
- $tzo = new DateTimeZone(date_default_timezone_get());
- # $tzt = timezone_transitions_get( $tzo );
- }
- return -$tzo->getOffset($dt);
- } else {
- if (isset($TZ)) return $TZ;
- $y = date('Y');
- /*
- if (function_exists('date_default_timezone_get') && function_exists('timezone_offset_get')) {
- $tzonename = date_default_timezone_get();
- if ($tzonename) {
- $tobj = new DateTimeZone($tzonename);
- $TZ = -timezone_offset_get($tobj,new DateTime("now",$tzo));
- }
- }
- */
- if (empty($TZ)) $TZ = mktime(0,0,0,12,2,$y) - gmmktime(0,0,0,12,2,$y);
- }
- return $TZ;
-}
-
-/**
- Returns an array with date info.
-*/
-function adodb_getdate($d=false,$fast=false)
-{
- if ($d === false) return getdate();
- if (!defined('ADODB_TEST_DATES')) {
- if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range
- if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0) // if windows, must be +ve integer
- return @getdate($d);
- }
- }
- return _adodb_getdate($d);
-}
-
-/*
-// generate $YRS table for _adodb_getdate()
-function adodb_date_gentable($out=true)
-{
-
- for ($i=1970; $i >= 1600; $i-=10) {
- $s = adodb_gmmktime(0,0,0,1,1,$i);
- echo "$i => $s, ";
- }
-}
-adodb_date_gentable();
-
-for ($i=1970; $i > 1500; $i--) {
-
-echo " $i ";
- adodb_date_test_date($i,1,1);
-}
-
-*/
-
-
-$_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31);
-$_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31);
-
-function adodb_validdate($y,$m,$d)
-{
-global $_month_table_normal,$_month_table_leaf;
-
- if (_adodb_is_leap_year($y)) $marr = $_month_table_leaf;
- else $marr = $_month_table_normal;
-
- if ($m > 12 || $m < 1) return false;
-
- if ($d > 31 || $d < 1) return false;
-
- if ($marr[$m] < $d) return false;
-
- if ($y < 1000 && $y > 3000) return false;
-
- return true;
-}
-
-/**
- Low-level function that returns the getdate() array. We have a special
- $fast flag, which if set to true, will return fewer array values,
- and is much faster as it does not calculate dow, etc.
-*/
-function _adodb_getdate($origd=false,$fast=false,$is_gmt=false)
-{
-static $YRS;
-global $_month_table_normal,$_month_table_leaf;
-
- $d = $origd - ($is_gmt ? 0 : adodb_get_gmt_diff_ts($origd));
- $_day_power = 86400;
- $_hour_power = 3600;
- $_min_power = 60;
-
- if ($d < -12219321600) $d -= 86400*10; // if 15 Oct 1582 or earlier, gregorian correction
-
- $_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31);
- $_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31);
-
- $d366 = $_day_power * 366;
- $d365 = $_day_power * 365;
-
- if ($d < 0) {
-
- if (empty($YRS)) $YRS = array(
- 1970 => 0,
- 1960 => -315619200,
- 1950 => -631152000,
- 1940 => -946771200,
- 1930 => -1262304000,
- 1920 => -1577923200,
- 1910 => -1893456000,
- 1900 => -2208988800,
- 1890 => -2524521600,
- 1880 => -2840140800,
- 1870 => -3155673600,
- 1860 => -3471292800,
- 1850 => -3786825600,
- 1840 => -4102444800,
- 1830 => -4417977600,
- 1820 => -4733596800,
- 1810 => -5049129600,
- 1800 => -5364662400,
- 1790 => -5680195200,
- 1780 => -5995814400,
- 1770 => -6311347200,
- 1760 => -6626966400,
- 1750 => -6942499200,
- 1740 => -7258118400,
- 1730 => -7573651200,
- 1720 => -7889270400,
- 1710 => -8204803200,
- 1700 => -8520336000,
- 1690 => -8835868800,
- 1680 => -9151488000,
- 1670 => -9467020800,
- 1660 => -9782640000,
- 1650 => -10098172800,
- 1640 => -10413792000,
- 1630 => -10729324800,
- 1620 => -11044944000,
- 1610 => -11360476800,
- 1600 => -11676096000);
-
- if ($is_gmt) $origd = $d;
- // The valid range of a 32bit signed timestamp is typically from
- // Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT
- //
-
- # old algorithm iterates through all years. new algorithm does it in
- # 10 year blocks
-
- /*
- # old algo
- for ($a = 1970 ; --$a >= 0;) {
- $lastd = $d;
-
- if ($leaf = _adodb_is_leap_year($a)) $d += $d366;
- else $d += $d365;
-
- if ($d >= 0) {
- $year = $a;
- break;
- }
- }
- */
-
- $lastsecs = 0;
- $lastyear = 1970;
- foreach($YRS as $year => $secs) {
- if ($d >= $secs) {
- $a = $lastyear;
- break;
- }
- $lastsecs = $secs;
- $lastyear = $year;
- }
-
- $d -= $lastsecs;
- if (!isset($a)) $a = $lastyear;
-
- //echo ' yr=',$a,' ', $d,'.';
-
- for (; --$a >= 0;) {
- $lastd = $d;
-
- if ($leaf = _adodb_is_leap_year($a)) $d += $d366;
- else $d += $d365;
-
- if ($d >= 0) {
- $year = $a;
- break;
- }
- }
- /**/
-
- $secsInYear = 86400 * ($leaf ? 366 : 365) + $lastd;
-
- $d = $lastd;
- $mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal;
- for ($a = 13 ; --$a > 0;) {
- $lastd = $d;
- $d += $mtab[$a] * $_day_power;
- if ($d >= 0) {
- $month = $a;
- $ndays = $mtab[$a];
- break;
- }
- }
-
- $d = $lastd;
- $day = $ndays + ceil(($d+1) / ($_day_power));
-
- $d += ($ndays - $day+1)* $_day_power;
- $hour = floor($d/$_hour_power);
-
- } else {
- for ($a = 1970 ;; $a++) {
- $lastd = $d;
-
- if ($leaf = _adodb_is_leap_year($a)) $d -= $d366;
- else $d -= $d365;
- if ($d < 0) {
- $year = $a;
- break;
- }
- }
- $secsInYear = $lastd;
- $d = $lastd;
- $mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal;
- for ($a = 1 ; $a <= 12; $a++) {
- $lastd = $d;
- $d -= $mtab[$a] * $_day_power;
- if ($d < 0) {
- $month = $a;
- $ndays = $mtab[$a];
- break;
- }
- }
- $d = $lastd;
- $day = ceil(($d+1) / $_day_power);
- $d = $d - ($day-1) * $_day_power;
- $hour = floor($d /$_hour_power);
- }
-
- $d -= $hour * $_hour_power;
- $min = floor($d/$_min_power);
- $secs = $d - $min * $_min_power;
- if ($fast) {
- return array(
- 'seconds' => $secs,
- 'minutes' => $min,
- 'hours' => $hour,
- 'mday' => $day,
- 'mon' => $month,
- 'year' => $year,
- 'yday' => floor($secsInYear/$_day_power),
- 'leap' => $leaf,
- 'ndays' => $ndays
- );
- }
-
-
- $dow = adodb_dow($year,$month,$day);
-
- return array(
- 'seconds' => $secs,
- 'minutes' => $min,
- 'hours' => $hour,
- 'mday' => $day,
- 'wday' => $dow,
- 'mon' => $month,
- 'year' => $year,
- 'yday' => floor($secsInYear/$_day_power),
- 'weekday' => gmdate('l',$_day_power*(3+$dow)),
- 'month' => gmdate('F',mktime(0,0,0,$month,2,1971)),
- 0 => $origd
- );
-}
-/*
- if ($isphp5)
- $dates .= sprintf('%s%04d',($gmt<=0)?'+':'-',abs($gmt)/36);
- else
- $dates .= sprintf('%s%04d',($gmt<0)?'+':'-',abs($gmt)/36);
- break;*/
-function adodb_tz_offset($gmt,$isphp5)
-{
- $zhrs = abs($gmt)/3600;
- $hrs = floor($zhrs);
- if ($isphp5)
- return sprintf('%s%02d%02d',($gmt<=0)?'+':'-',floor($zhrs),($zhrs-$hrs)*60);
- else
- return sprintf('%s%02d%02d',($gmt<0)?'+':'-',floor($zhrs),($zhrs-$hrs)*60);
-}
-
-
-function adodb_gmdate($fmt,$d=false)
-{
- return adodb_date($fmt,$d,true);
-}
-
-// accepts unix timestamp and iso date format in $d
-function adodb_date2($fmt, $d=false, $is_gmt=false)
-{
- if ($d !== false) {
- if (!preg_match(
- "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ -]?(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|",
- ($d), $rr)) return adodb_date($fmt,false,$is_gmt);
-
- if ($rr[1] <= 100 && $rr[2]<= 1) return adodb_date($fmt,false,$is_gmt);
-
- // h-m-s-MM-DD-YY
- if (!isset($rr[5])) $d = adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1],false,$is_gmt);
- else $d = @adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1],false,$is_gmt);
- }
-
- return adodb_date($fmt,$d,$is_gmt);
-}
-
-
-/**
- Return formatted date based on timestamp $d
-*/
-function adodb_date($fmt,$d=false,$is_gmt=false)
-{
-static $daylight;
-global $ADODB_DATETIME_CLASS;
-static $jan1_1971;
-
-
- if (!isset($daylight)) {
- $daylight = function_exists('adodb_daylight_sv');
- if (empty($jan1_1971)) $jan1_1971 = mktime(0,0,0,1,1,1971); // we only use date() when > 1970 as adodb_mktime() only uses mktime() when > 1970
- }
-
- if ($d === false) return ($is_gmt)? @gmdate($fmt): @date($fmt);
- if (!defined('ADODB_TEST_DATES')) {
- if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range
-
- if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= $jan1_1971) // if windows, must be +ve integer
- return ($is_gmt)? @gmdate($fmt,$d): @date($fmt,$d);
-
- }
- }
- $_day_power = 86400;
-
- $arr = _adodb_getdate($d,true,$is_gmt);
-
- if ($daylight) adodb_daylight_sv($arr, $is_gmt);
-
- $year = $arr['year'];
- $month = $arr['mon'];
- $day = $arr['mday'];
- $hour = $arr['hours'];
- $min = $arr['minutes'];
- $secs = $arr['seconds'];
-
- $max = strlen($fmt);
- $dates = '';
-
- $isphp5 = PHP_VERSION >= 5;
-
- /*
- at this point, we have the following integer vars to manipulate:
- $year, $month, $day, $hour, $min, $secs
- */
- for ($i=0; $i < $max; $i++) {
- switch($fmt[$i]) {
- case 'e':
- $dates .= date('e');
- break;
- case 'T':
- if ($ADODB_DATETIME_CLASS) {
- $dt = new DateTime();
- $dt->SetDate($year,$month,$day);
- $dates .= $dt->Format('T');
- } else
- $dates .= date('T');
- break;
- // YEAR
- case 'L': $dates .= $arr['leap'] ? '1' : '0'; break;
- case 'r': // Thu, 21 Dec 2000 16:01:07 +0200
-
- // 4.3.11 uses '04 Jun 2004'
- // 4.3.8 uses ' 4 Jun 2004'
- $dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))).', '
- . ($day<10?'0'.$day:$day) . ' '.date('M',mktime(0,0,0,$month,2,1971)).' '.$year.' ';
-
- if ($hour < 10) $dates .= '0'.$hour; else $dates .= $hour;
-
- if ($min < 10) $dates .= ':0'.$min; else $dates .= ':'.$min;
-
- if ($secs < 10) $dates .= ':0'.$secs; else $dates .= ':'.$secs;
-
- $gmt = adodb_get_gmt_diff($year,$month,$day);
-
- $dates .= ' '.adodb_tz_offset($gmt,$isphp5);
- break;
-
- case 'Y': $dates .= $year; break;
- case 'y': $dates .= substr($year,strlen($year)-2,2); break;
- // MONTH
- case 'm': if ($month<10) $dates .= '0'.$month; else $dates .= $month; break;
- case 'Q': $dates .= ($month+3)>>2; break;
- case 'n': $dates .= $month; break;
- case 'M': $dates .= date('M',mktime(0,0,0,$month,2,1971)); break;
- case 'F': $dates .= date('F',mktime(0,0,0,$month,2,1971)); break;
- // DAY
- case 't': $dates .= $arr['ndays']; break;
- case 'z': $dates .= $arr['yday']; break;
- case 'w': $dates .= adodb_dow($year,$month,$day); break;
- case 'l': $dates .= gmdate('l',$_day_power*(3+adodb_dow($year,$month,$day))); break;
- case 'D': $dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))); break;
- case 'j': $dates .= $day; break;
- case 'd': if ($day<10) $dates .= '0'.$day; else $dates .= $day; break;
- case 'S':
- $d10 = $day % 10;
- if ($d10 == 1) $dates .= 'st';
- else if ($d10 == 2 && $day != 12) $dates .= 'nd';
- else if ($d10 == 3) $dates .= 'rd';
- else $dates .= 'th';
- break;
-
- // HOUR
- case 'Z':
- $dates .= ($is_gmt) ? 0 : -adodb_get_gmt_diff($year,$month,$day); break;
- case 'O':
- $gmt = ($is_gmt) ? 0 : adodb_get_gmt_diff($year,$month,$day);
-
- $dates .= adodb_tz_offset($gmt,$isphp5);
- break;
-
- case 'H':
- if ($hour < 10) $dates .= '0'.$hour;
- else $dates .= $hour;
- break;
- case 'h':
- if ($hour > 12) $hh = $hour - 12;
- else {
- if ($hour == 0) $hh = '12';
- else $hh = $hour;
- }
-
- if ($hh < 10) $dates .= '0'.$hh;
- else $dates .= $hh;
- break;
-
- case 'G':
- $dates .= $hour;
- break;
-
- case 'g':
- if ($hour > 12) $hh = $hour - 12;
- else {
- if ($hour == 0) $hh = '12';
- else $hh = $hour;
- }
- $dates .= $hh;
- break;
- // MINUTES
- case 'i': if ($min < 10) $dates .= '0'.$min; else $dates .= $min; break;
- // SECONDS
- case 'U': $dates .= $d; break;
- case 's': if ($secs < 10) $dates .= '0'.$secs; else $dates .= $secs; break;
- // AM/PM
- // Note 00:00 to 11:59 is AM, while 12:00 to 23:59 is PM
- case 'a':
- if ($hour>=12) $dates .= 'pm';
- else $dates .= 'am';
- break;
- case 'A':
- if ($hour>=12) $dates .= 'PM';
- else $dates .= 'AM';
- break;
- default:
- $dates .= $fmt[$i]; break;
- // ESCAPE
- case "\\":
- $i++;
- if ($i < $max) $dates .= $fmt[$i];
- break;
- }
- }
- return $dates;
-}
-
-/**
- Returns a timestamp given a GMT/UTC time.
- Note that $is_dst is not implemented and is ignored.
-*/
-function adodb_gmmktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false)
-{
- return adodb_mktime($hr,$min,$sec,$mon,$day,$year,$is_dst,true);
-}
-
-/**
- Return a timestamp given a local time. Originally by jackbbs.
- Note that $is_dst is not implemented and is ignored.
-
- Not a very fast algorithm - O(n) operation. Could be optimized to O(1).
-*/
-function adodb_mktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false,$is_gmt=false)
-{
- if (!defined('ADODB_TEST_DATES')) {
-
- if ($mon === false) {
- return $is_gmt? @gmmktime($hr,$min,$sec): @mktime($hr,$min,$sec);
- }
-
- // for windows, we don't check 1970 because with timezone differences,
- // 1 Jan 1970 could generate negative timestamp, which is illegal
- $usephpfns = (1970 < $year && $year < 2038
- || !defined('ADODB_NO_NEGATIVE_TS') && (1901 < $year && $year < 2038)
- );
-
-
- if ($usephpfns && ($year + $mon/12+$day/365.25+$hr/(24*365.25) >= 2038)) $usephpfns = false;
-
- if ($usephpfns) {
- return $is_gmt ?
- @gmmktime($hr,$min,$sec,$mon,$day,$year):
- @mktime($hr,$min,$sec,$mon,$day,$year);
- }
- }
-
- $gmt_different = ($is_gmt) ? 0 : adodb_get_gmt_diff($year,$mon,$day);
-
- /*
- # disabled because some people place large values in $sec.
- # however we need it for $mon because we use an array...
- $hr = intval($hr);
- $min = intval($min);
- $sec = intval($sec);
- */
- $mon = intval($mon);
- $day = intval($day);
- $year = intval($year);
-
-
- $year = adodb_year_digit_check($year);
-
- if ($mon > 12) {
- $y = floor(($mon-1)/ 12);
- $year += $y;
- $mon -= $y*12;
- } else if ($mon < 1) {
- $y = ceil((1-$mon) / 12);
- $year -= $y;
- $mon += $y*12;
- }
-
- $_day_power = 86400;
- $_hour_power = 3600;
- $_min_power = 60;
-
- $_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31);
- $_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31);
-
- $_total_date = 0;
- if ($year >= 1970) {
- for ($a = 1970 ; $a <= $year; $a++) {
- $leaf = _adodb_is_leap_year($a);
- if ($leaf == true) {
- $loop_table = $_month_table_leaf;
- $_add_date = 366;
- } else {
- $loop_table = $_month_table_normal;
- $_add_date = 365;
- }
- if ($a < $year) {
- $_total_date += $_add_date;
- } else {
- for($b=1;$b<$mon;$b++) {
- $_total_date += $loop_table[$b];
- }
- }
- }
- $_total_date +=$day-1;
- $ret = $_total_date * $_day_power + $hr * $_hour_power + $min * $_min_power + $sec + $gmt_different;
-
- } else {
- for ($a = 1969 ; $a >= $year; $a--) {
- $leaf = _adodb_is_leap_year($a);
- if ($leaf == true) {
- $loop_table = $_month_table_leaf;
- $_add_date = 366;
- } else {
- $loop_table = $_month_table_normal;
- $_add_date = 365;
- }
- if ($a > $year) { $_total_date += $_add_date;
- } else {
- for($b=12;$b>$mon;$b--) {
- $_total_date += $loop_table[$b];
- }
- }
- }
- $_total_date += $loop_table[$mon] - $day;
-
- $_day_time = $hr * $_hour_power + $min * $_min_power + $sec;
- $_day_time = $_day_power - $_day_time;
- $ret = -( $_total_date * $_day_power + $_day_time - $gmt_different);
- if ($ret < -12220185600) $ret += 10*86400; // if earlier than 5 Oct 1582 - gregorian correction
- else if ($ret < -12219321600) $ret = -12219321600; // if in limbo, reset to 15 Oct 1582.
- }
- //print " dmy=$day/$mon/$year $hr:$min:$sec => " .$ret;
- return $ret;
-}
-
-function adodb_gmstrftime($fmt, $ts=false)
-{
- return adodb_strftime($fmt,$ts,true);
-}
-
-// hack - convert to adodb_date
-function adodb_strftime($fmt, $ts=false,$is_gmt=false)
-{
-global $ADODB_DATE_LOCALE;
-
- if (!defined('ADODB_TEST_DATES')) {
- if ((abs($ts) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range
- if (!defined('ADODB_NO_NEGATIVE_TS') || $ts >= 0) // if windows, must be +ve integer
- return ($is_gmt)? @gmstrftime($fmt,$ts): @strftime($fmt,$ts);
-
- }
- }
-
- if (empty($ADODB_DATE_LOCALE)) {
- /*
- $tstr = strtoupper(gmstrftime('%c',31366800)); // 30 Dec 1970, 1 am
- $sep = substr($tstr,2,1);
- $hasAM = strrpos($tstr,'M') !== false;
- */
- # see http://phplens.com/lens/lensforum/msgs.php?id=14865 for reasoning, and changelog for version 0.24
- $dstr = gmstrftime('%x',31366800); // 30 Dec 1970, 1 am
- $sep = substr($dstr,2,1);
- $tstr = strtoupper(gmstrftime('%X',31366800)); // 30 Dec 1970, 1 am
- $hasAM = strrpos($tstr,'M') !== false;
-
- $ADODB_DATE_LOCALE = array();
- $ADODB_DATE_LOCALE[] = strncmp($tstr,'30',2) == 0 ? 'd'.$sep.'m'.$sep.'y' : 'm'.$sep.'d'.$sep.'y';
- $ADODB_DATE_LOCALE[] = ($hasAM) ? 'h:i:s a' : 'H:i:s';
-
- }
- $inpct = false;
- $fmtdate = '';
- for ($i=0,$max = strlen($fmt); $i < $max; $i++) {
- $ch = $fmt[$i];
- if ($ch == '%') {
- if ($inpct) {
- $fmtdate .= '%';
- $inpct = false;
- } else
- $inpct = true;
- } else if ($inpct) {
-
- $inpct = false;
- switch($ch) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- case 'E':
- case 'O':
- /* ignore format modifiers */
- $inpct = true;
- break;
-
- case 'a': $fmtdate .= 'D'; break;
- case 'A': $fmtdate .= 'l'; break;
- case 'h':
- case 'b': $fmtdate .= 'M'; break;
- case 'B': $fmtdate .= 'F'; break;
- case 'c': $fmtdate .= $ADODB_DATE_LOCALE[0].$ADODB_DATE_LOCALE[1]; break;
- case 'C': $fmtdate .= '\C?'; break; // century
- case 'd': $fmtdate .= 'd'; break;
- case 'D': $fmtdate .= 'm/d/y'; break;
- case 'e': $fmtdate .= 'j'; break;
- case 'g': $fmtdate .= '\g?'; break; //?
- case 'G': $fmtdate .= '\G?'; break; //?
- case 'H': $fmtdate .= 'H'; break;
- case 'I': $fmtdate .= 'h'; break;
- case 'j': $fmtdate .= '?z'; $parsej = true; break; // wrong as j=1-based, z=0-basd
- case 'm': $fmtdate .= 'm'; break;
- case 'M': $fmtdate .= 'i'; break;
- case 'n': $fmtdate .= "\n"; break;
- case 'p': $fmtdate .= 'a'; break;
- case 'r': $fmtdate .= 'h:i:s a'; break;
- case 'R': $fmtdate .= 'H:i:s'; break;
- case 'S': $fmtdate .= 's'; break;
- case 't': $fmtdate .= "\t"; break;
- case 'T': $fmtdate .= 'H:i:s'; break;
- case 'u': $fmtdate .= '?u'; $parseu = true; break; // wrong strftime=1-based, date=0-based
- case 'U': $fmtdate .= '?U'; $parseU = true; break;// wrong strftime=1-based, date=0-based
- case 'x': $fmtdate .= $ADODB_DATE_LOCALE[0]; break;
- case 'X': $fmtdate .= $ADODB_DATE_LOCALE[1]; break;
- case 'w': $fmtdate .= '?w'; $parseu = true; break; // wrong strftime=1-based, date=0-based
- case 'W': $fmtdate .= '?W'; $parseU = true; break;// wrong strftime=1-based, date=0-based
- case 'y': $fmtdate .= 'y'; break;
- case 'Y': $fmtdate .= 'Y'; break;
- case 'Z': $fmtdate .= 'T'; break;
- }
- } else if (('A' <= ($ch) && ($ch) <= 'Z' ) || ('a' <= ($ch) && ($ch) <= 'z' ))
- $fmtdate .= "\\".$ch;
- else
- $fmtdate .= $ch;
- }
- //echo "fmt=",$fmtdate," ";
- if ($ts === false) $ts = time();
- $ret = adodb_date($fmtdate, $ts, $is_gmt);
- return $ret;
-}
diff --git a/htdocs/includes/ckeditor/ckeditor/adapters/jquery.js b/htdocs/includes/ckeditor/ckeditor/adapters/jquery.js
deleted file mode 100644
index 0defc720496..00000000000
--- a/htdocs/includes/ckeditor/ckeditor/adapters/jquery.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-*/
-(function(a){if("undefined"==typeof a)throw Error("jQuery should be loaded before CKEditor jQuery adapter.");if("undefined"==typeof CKEDITOR)throw Error("CKEditor should be loaded before CKEditor jQuery adapter.");CKEDITOR.config.jqueryOverrideVal="undefined"==typeof CKEDITOR.config.jqueryOverrideVal?!0:CKEDITOR.config.jqueryOverrideVal;a.extend(a.fn,{ckeditorGet:function(){var a=this.eq(0).data("ckeditorInstance");if(!a)throw"CKEditor is not initialized yet, use ckeditor() with a callback.";return a},
-ckeditor:function(g,e){if(!CKEDITOR.env.isCompatible)throw Error("The environment is incompatible.");if("function"!==typeof g){var m=e;e=g;g=m}var k=[];e=e||{};this.each(function(){var b=a(this),c=b.data("ckeditorInstance"),f=b.data("_ckeditorInstanceLock"),h=this,l=new a.Deferred;k.push(l.promise());if(c&&!f)g&&g.apply(c,[this]),l.resolve();else if(f)c.once("instanceReady",function(){setTimeout(function d(){c.element?(c.element.$==h&&g&&g.apply(c,[h]),l.resolve()):setTimeout(d,100)},0)},null,null,
-9999);else{if(e.autoUpdateElement||"undefined"==typeof e.autoUpdateElement&&CKEDITOR.config.autoUpdateElement)e.autoUpdateElementJquery=!0;e.autoUpdateElement=!1;b.data("_ckeditorInstanceLock",!0);c=a(this).is("textarea")?CKEDITOR.replace(h,e):CKEDITOR.inline(h,e);b.data("ckeditorInstance",c);c.on("instanceReady",function(e){var d=e.editor;setTimeout(function n(){if(d.element){e.removeListener();d.on("dataReady",function(){b.trigger("dataReady.ckeditor",[d])});d.on("setData",function(a){b.trigger("setData.ckeditor",
-[d,a.data])});d.on("getData",function(a){b.trigger("getData.ckeditor",[d,a.data])},999);d.on("destroy",function(){b.trigger("destroy.ckeditor",[d])});d.on("save",function(){a(h.form).trigger("submit");return!1},null,null,20);if(d.config.autoUpdateElementJquery&&b.is("textarea")&&a(h.form).length){var c=function(){b.ckeditor(function(){d.updateElement()})};a(h.form).on("submit",c);a(h.form).on("form-pre-serialize",c);b.on("destroy.ckeditor",function(){a(h.form).off("submit",c);a(h.form).off("form-pre-serialize",
-c)})}d.on("destroy",function(){b.removeData("ckeditorInstance")});b.removeData("_ckeditorInstanceLock");b.trigger("instanceReady.ckeditor",[d]);g&&g.apply(d,[h]);l.resolve()}else setTimeout(n,100)},0)},null,null,9999)}});var f=new a.Deferred;this.promise=f.promise();a.when.apply(this,k).then(function(){f.resolve()});this.editor=this.eq(0).data("ckeditorInstance");return this}});CKEDITOR.config.jqueryOverrideVal&&(a.fn.val=CKEDITOR.tools.override(a.fn.val,function(g){return function(e){if(arguments.length){var m=
-this,k=[],f=this.each(function(){var b=a(this),c=b.data("ckeditorInstance");if(b.is("textarea")&&c){var f=new a.Deferred;c.setData(e,function(){f.resolve()});k.push(f.promise());return!0}return g.call(b,e)});if(k.length){var b=new a.Deferred;a.when.apply(this,k).done(function(){b.resolveWith(m)});return b.promise()}return f}var f=a(this).eq(0),c=f.data("ckeditorInstance");return f.is("textarea")&&c?c.getData():g.call(f)}}))})(window.jQuery);
\ No newline at end of file
diff --git a/htdocs/includes/maximebf/debugbar/src/DebugBar/JavascriptRenderer.php b/htdocs/includes/maximebf/debugbar/src/DebugBar/JavascriptRenderer.php
index 16689992c4c..7f7ed84e0dd 100644
--- a/htdocs/includes/maximebf/debugbar/src/DebugBar/JavascriptRenderer.php
+++ b/htdocs/includes/maximebf/debugbar/src/DebugBar/JavascriptRenderer.php
@@ -762,7 +762,7 @@ class JavascriptRenderer
return $uris;
}
- if (substr($uri, 0, 1) === '/' || preg_match('/^([a-zA-Z]+:\/\/|[a-zA-Z]:\/|[a-zA-Z]:\\\)/', $uri)) {
+ if ($uri && (substr($uri, 0, 1) === '/' || preg_match('/^([a-zA-Z]+:\/\/|[a-zA-Z]:\/|[a-zA-Z]:\\\)/', $uri))) {
return $uri;
}
return rtrim($root, '/') . "/$uri";
@@ -778,7 +778,7 @@ class JavascriptRenderer
protected function filterAssetArray($array, $type = null)
{
$types = array('css', 'js', 'inline_css', 'inline_js', 'inline_head');
- $typeIndex = array_search(strtolower($type), $types);
+ $typeIndex = is_null($type) ? false : array_search(strtolower($type), $types);
return $typeIndex !== false ? $array[$typeIndex] : $array;
}
diff --git a/htdocs/index.php b/htdocs/index.php
index 97b82fb93ba..d08e2a0b510 100644
--- a/htdocs/index.php
+++ b/htdocs/index.php
@@ -106,8 +106,8 @@ if (!empty($conf->global->MAIN_MOTD)) {
* Show security warnings
*/
-// Security warning repertoire install existe (si utilisateur admin)
-if ($user->admin && empty($conf->global->MAIN_REMOVE_INSTALL_WARNING)) {
+// Security warning if install.lock file is missing or if conf file is writable
+if (empty($conf->global->MAIN_REMOVE_INSTALL_WARNING)) {
$message = '';
// Check if install lock file is present
@@ -127,7 +127,7 @@ if ($user->admin && empty($conf->global->MAIN_REMOVE_INSTALL_WARNING)) {
}
if ($message) {
- print $message;
+ print $message.' ';
//$message.=' ';
//print info_admin($langs->trans("WarningUntilDirRemoved",DOL_DOCUMENT_ROOT."/install"));
}
@@ -194,7 +194,7 @@ if (empty($conf->global->MAIN_DISABLE_GLOBAL_WORKBOARD)) {
$dashboardlines[$board->element.'_signed'] = $board->load_board($user, "signed");
}
- // Number of customer orders a deal
+ // Number of sales orders a deal
if (isModEnabled('commande') && empty($conf->global->MAIN_DISABLE_BLOCK_CUSTOMER) && $user->hasRight('commande', 'lire')) {
include_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
$board = new Commande($db);
@@ -558,7 +558,7 @@ if (empty($conf->global->MAIN_DISABLE_GLOBAL_WORKBOARD)) {
}
$textLateTitle = $langs->trans("NActionsLate", $board->nbtodolate);
- $textLateTitle .= ' ('.$langs->trans("Late").' = '.$langs->trans("DateReference").' > '.$langs->trans("DateToday").' '.(ceil($board->warning_delay) >= 0 ? '+' : '').ceil($board->warning_delay).' '.$langs->trans("days").')';
+ $textLateTitle .= ' ('.$langs->trans("Late").' = '.$langs->trans("DateReference").' > '.$langs->trans("DateToday").' '.(ceil(empty($board->warning_delay) ? 0 : $board->warning_delay) >= 0 ? '+' : '').ceil(empty($board->warning_delay) ? 0 : $board->warning_delay).' '.$langs->trans("days").')';
if ($board->id == 'bank_account') {
$textLateTitle .= ''.$langs->trans("IfYouDontReconcileDisableProperty", $langs->transnoentitiesnoconv("Conciliable")).' ';
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate.zip b/htdocs/install/doctemplates/websites/website_template-corporate.zip
deleted file mode 100644
index e7f645d168a..00000000000
Binary files a/htdocs/install/doctemplates/websites/website_template-corporate.zip and /dev/null differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/LICENSE b/htdocs/install/doctemplates/websites/website_template-corporate/LICENSE
new file mode 100644
index 00000000000..8b137891791
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/LICENSE
@@ -0,0 +1 @@
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/README.md b/htdocs/install/doctemplates/websites/website_template-corporate/README.md
new file mode 100644
index 00000000000..12ac388316c
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/README.md
@@ -0,0 +1 @@
+This template has been developed by DoliCloud (https://www.dolicloud.com) for Dolibarr ERP CRM.
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/.dolibarr b/htdocs/install/doctemplates/websites/website_template-corporate/containers/.dolibarr
new file mode 100644
index 00000000000..0ef9997b4ab
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/.dolibarr
@@ -0,0 +1,2 @@
+# Some properties for Dolibarr web site CMS
+param=value
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/.htaccess b/htdocs/install/doctemplates/websites/website_template-corporate/containers/.htaccess
new file mode 100644
index 00000000000..ed27b33461f
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/.htaccess
@@ -0,0 +1,2 @@
+# Order allow,deny
+# Deny from all
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/LICENSE b/htdocs/install/doctemplates/websites/website_template-corporate/containers/LICENSE
new file mode 100644
index 00000000000..8b137891791
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/LICENSE
@@ -0,0 +1 @@
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/README.md b/htdocs/install/doctemplates/websites/website_template-corporate/containers/README.md
new file mode 100644
index 00000000000..12ac388316c
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/README.md
@@ -0,0 +1 @@
+This template has been developed by DoliCloud (https://www.dolicloud.com) for Dolibarr ERP CRM.
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/blog-our-company-is-now-on-dolibarr.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/blog-our-company-is-now-on-dolibarr.php
new file mode 100644
index 00000000000..99c4f10314b
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/blog-our-company-is-now-on-dolibarr.php
@@ -0,0 +1,5 @@
+ref.'/page180.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/blog-our-new-web-site-has-been-launched.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/blog-our-new-web-site-has-been-launched.php
new file mode 100644
index 00000000000..248bb708f48
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/blog-our-new-web-site-has-been-launched.php
@@ -0,0 +1,5 @@
+ref.'/page181.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/blog.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/blog.php
new file mode 100644
index 00000000000..43a0212d3f6
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/blog.php
@@ -0,0 +1,5 @@
+ref.'/page179.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/careers.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/careers.php
new file mode 100644
index 00000000000..a2c8a7165a7
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/careers.php
@@ -0,0 +1,5 @@
+ref.'/page182.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/carriere.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/carriere.php
new file mode 100644
index 00000000000..f32f4818ac4
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/carriere.php
@@ -0,0 +1,5 @@
+ref.'/page183.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/clients-testimonials.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/clients-testimonials.php
new file mode 100644
index 00000000000..2c01e32e135
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/clients-testimonials.php
@@ -0,0 +1,5 @@
+ref.'/page184.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/contact.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/contact.php
new file mode 100644
index 00000000000..2c9c69905fa
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/contact.php
@@ -0,0 +1,5 @@
+ref.'/page185.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/faq.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/faq.php
new file mode 100644
index 00000000000..94f01880f4e
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/faq.php
@@ -0,0 +1,5 @@
+ref.'/page186.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/footer.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/footer.php
new file mode 100644
index 00000000000..533ddc027a2
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/footer.php
@@ -0,0 +1,5 @@
+ref.'/page187.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/header.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/header.php
new file mode 100644
index 00000000000..831c7ded51a
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/header.php
@@ -0,0 +1,5 @@
+ref.'/page188.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/home.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/home.php
new file mode 100644
index 00000000000..86a6639e327
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/home.php
@@ -0,0 +1,5 @@
+ref.'/page189.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/htmlheader.html b/htdocs/install/doctemplates/websites/website_template-corporate/containers/htmlheader.html
new file mode 100644
index 00000000000..948c6713c3d
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/htmlheader.html
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/index.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/index.php
new file mode 100644
index 00000000000..5ac34065524
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/index.php
@@ -0,0 +1,11 @@
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/javascript.js.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/javascript.js.php
new file mode 100644
index 00000000000..f58102cf00b
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/javascript.js.php
@@ -0,0 +1,13 @@
+
+/* JS content (all pages) */
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/manifest.json.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/manifest.json.php
new file mode 100644
index 00000000000..b61531d6c11
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/manifest.json.php
@@ -0,0 +1,13 @@
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/our-team.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/our-team.php
new file mode 100644
index 00000000000..1afe5d1523d
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/our-team.php
@@ -0,0 +1,5 @@
+ref.'/page190.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page179.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page179.tpl.php
new file mode 100644
index 00000000000..7a474b5595e
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page179.tpl.php
@@ -0,0 +1,99 @@
+
+
+
+Blog
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ load("main");
+ $fuser = new User($db);
+ $arrayofblogs = $websitepage->fetchAll($website->id, 'DESC', 'date_creation', 5, 0, array('type_container'=>'blogpost', 'status'=>1, 'lang'=>'null,'.$websitepage->lang));
+ foreach($arrayofblogs as $blog)
+ {
+ print '
';
+ }
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page180.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page180.tpl.php
new file mode 100644
index 00000000000..538fc1764e4
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page180.tpl.php
@@ -0,0 +1,84 @@
+
+
+
+Our company is now on Dolibarr ERP CRM
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Like several thousands of companies, our company (name ?>) has moved all its information system to
Dolibarr ERP CRM . More than 20 applications have been replaced by only one, easier to use and fully integrated.
+ This is an important step in improving all of our services.
+
+
+
+
+
+
+ Screenshot of our new Open Source solution
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page181.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page181.tpl.php
new file mode 100644
index 00000000000..a8a484ccf44
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page181.tpl.php
@@ -0,0 +1,85 @@
+
+
+
+
Our new web site has been launched
+
+
+
+
+
+
+
+
+
+use_manifest) { print '
'."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Our new website, based on Dolibarr CMS, has been launched.
+ Now it is modern and directly integrated with the internal management tools of the company. Many new online services will be available for our customers...
+
+
+
+
+
+
+
+ Theme of our new web site
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page182.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page182.tpl.php
new file mode 100644
index 00000000000..49735b4f21a
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page182.tpl.php
@@ -0,0 +1,129 @@
+
+
+
+
Careers
+
+
+
+
+
+
+
+
+
+use_manifest) { print '
'."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page183.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page183.tpl.php
new file mode 100644
index 00000000000..bf4d4c92682
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page183.tpl.php
@@ -0,0 +1,84 @@
+
+
+
+Carrière
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page184.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page184.tpl.php
new file mode 100644
index 00000000000..fca2346bede
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page184.tpl.php
@@ -0,0 +1,78 @@
+
+
+
+Clients Testimonials
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
What they say about us
+
+ Send us your testimonial (by email to
email; ?> )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page185.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page185.tpl.php
new file mode 100644
index 00000000000..f478da7021f
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page185.tpl.php
@@ -0,0 +1,84 @@
+
+
+
+Contact
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page186.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page186.tpl.php
new file mode 100644
index 00000000000..111e4615774
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page186.tpl.php
@@ -0,0 +1,91 @@
+
+
+
+FAQ
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page187.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page187.tpl.php
new file mode 100644
index 00000000000..615a2214885
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page187.tpl.php
@@ -0,0 +1,132 @@
+
+
+
+Footer
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page188.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page188.tpl.php
new file mode 100644
index 00000000000..99e9ddd3e9f
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page188.tpl.php
@@ -0,0 +1,134 @@
+
+
+
+Header and Top Menu
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page189.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page189.tpl.php
new file mode 100644
index 00000000000..8e0d8fbbea5
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page189.tpl.php
@@ -0,0 +1,576 @@
+
+
+
+Home
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Boost your business
+
+
+
We provide powerful solutions for all businesses
+
+
+
+
+
+
+
+
+
+
+
+
+
Best prices on the market
+
+
+
Our optimized processes allows us to provide you very competitive prices
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Our sales representative are also technicians.
+
+
+
+
+
+
+
+
Take a look at our offers...
+
+
+
+
+
+
+
+
Our customer-supplier relationship is very appreciated by our customers
+
+
+
+
+
+
+
+
We continue to follow and assist you after the sale. Contact us at any time.
+
+
+
+
+
+
+
+
+
+
+
Looking for
+
a high quality service?
+
With a lot of experience, hiring us is a security for your business!
+
+
+
11
+
Years of Experience
+
+
+
+ query($sql); $obj = $db->fetch_object($resql); print $obj->nb; ?>
+
+
Experts
+
+
+
+ query($sql); $obj = $db->fetch_object($resql); print $obj->nb; ?>
+
+
Trusted Clients
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
our plans
+
+
+
+
+
+
+
+
FREE
+
The best choice for personal use
+
The service 1 for free
+
+ 0€ / month
+
+
+
Available features are :
+
+
+
+
+
+
+
+
+
+
+
+
STARTER
+
For small companiess
+
The service 1 and product 1 at low price
+
+ 29€ / month
+
+
+
Available features are :
+
+
+
+ Service 1
+
+
+
+ Product 1
+
+
+
+
+
+
+
+
+
+
+
+
+
PREMIUM
+
For large companies
+
The full option package for a one shot price
+
+
+ 2499€
+
+
+
Available features are :
+
+
+
+ Service 1
+
+
+ Service 2
+
+
+ Product 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
our team
+
+
+
+
+
+
+
Albert Einstein
+
CEO
+
+
+
+
+
+
+
+
+
Pierre Curie
+
CTO
+
+
+
+
+
+
+
+
+
Marie Curie
+
Bookkeeper
+
+
+
+
+
+
+
+
+
John Doe
+
Project leader
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
successful cases
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Albert Einstein
+
+
Scientist, www.emc2.org
+
+
+
+
+
+
+ They did everything, with almost no time or effort for me. The best part was that I could trust their team to represent our company professionally with our clients.
+
+
+
+
+
+
+
+
+
+
+
+ Pierre Curie
+
+
CEO “Cyclonic”
+
+
+
+
+
+
+ Their course gave me the confidence to implement new techniques in my work. I learn “how” to write – “what” and “why” also became much clearer.
+
+
+
+
+
+
+
+
+
+
+
+ Marie Curie
+
+
CTO "Cyclonic"
+
+
+
+
+
+
+ We were skeptical to work with a consultant to optimize our sales emails, but they were highly recommended by many other startups we knew. They helped us to reach our objective of 20% turnover increase, in 4 monthes.
+
+
+
+
+
+
+
+
+
+
+
+ John Doe
+
+
Sale representative
+
+
+
+
+
+
+ Their work on our website and Internet marketing has made a significant different to our business. We’ve seen a +40% increase in quote requests from our website.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Latest News
+
+ fetchAll($website->id, 'DESC', 'date_creation', $MAXNEWS, 0, array('type_container'=>'blogpost', 'status'=>1, 'lang'=>'null,'.$websitepage->lang));
+ foreach($arrayofblogs as $blog)
+ {
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page190.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page190.tpl.php
new file mode 100644
index 00000000000..63255c34db5
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page190.tpl.php
@@ -0,0 +1,115 @@
+
+
+
+Our team
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
The crew...
+ query($sql);
+ if (! $resql) dol_print_error($db);
+ while ($obj = $db->fetch_object($resql))
+ {
+ $arrayofusers[]=$obj->rowid;
+ }
+
+ print '
';
+ foreach($arrayofusers as $id)
+ {
+ $fuser->fetch($id);
+
+ print '
';
+ print '
';
+ print '
';
+ if ($fuser->photo) print Form::showphoto('userphoto', $fuser, 100, 0, 0, 'photowithmargin', '', 0);
+ //print '
';
+ else print '
';
+ print '
';
+ print '
';
+ print '
'.$fuser->firstname.'
';
+ print '
';
+ //print 'September 24, 2018 ';
+ if ($fuser->job) print ''.$fuser->job.' ';
+ else print ' ';
+ print ' ';
+ print '
';
+ print '
';
+ print '
';
+ }
+ print '
';
+
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page191.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page191.tpl.php
new file mode 100644
index 00000000000..b52ee75825e
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page191.tpl.php
@@ -0,0 +1,110 @@
+
+
+
+Partners
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page192.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page192.tpl.php
new file mode 100644
index 00000000000..4f17f5da805
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page192.tpl.php
@@ -0,0 +1,186 @@
+
+
+
+Pricing
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
FREE
+
The best choice for personal use
+
The service 1 for free
+
+ 0€ / month
+
+
+
Available features are :
+
+
+
+
+
+
+
+
+
+
+
+
STARTER
+
For small companiess
+
The service 1 and product 1 at low price
+
+ 29€ / month
+
+
+
Available features are :
+
+
+
+ Service 1
+
+
+
+ Product 1
+
+
+
+
+
+
+
+
+
+
+
+
+
PREMIUM
+
For large companies
+
The full option package for a one shot price
+
+
+ 2499€
+
+
+
Available features are :
+
+
+
+ Service 1
+
+
+ Service 2
+
+
+ Product 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page193.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page193.tpl.php
new file mode 100644
index 00000000000..4e6f65e80a5
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page193.tpl.php
@@ -0,0 +1,100 @@
+
+
+
+Privacy Policies
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page194.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page194.tpl.php
new file mode 100644
index 00000000000..e4aa79e1291
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page194.tpl.php
@@ -0,0 +1,84 @@
+
+
+
+Product P
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page195.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page195.tpl.php
new file mode 100644
index 00000000000..0e1774d931b
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page195.tpl.php
@@ -0,0 +1,112 @@
+
+
+
+Search Page
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ load("main");
+
+ if (function_exists('getPagesFromSearchCriterias'))
+ {
+ if (GETPOSTISSET('s'))
+ {
+ $listofpages = getPagesFromSearchCriterias('page', 'meta', GETPOST('s', 'alphanohtml'));
+ if ($listofpages['code'] == 'OK')
+ {
+ foreach($listofpages['list'] as $websitepagefound)
+ {
+ print '';
+ }
+ }
+ else
+ {
+ // If error, show message
+ print $listofpages['message'];
+ }
+ }
+ }
+ else
+ {
+ print $weblangs->trans("FeatureNotYetAvailable");
+ }
+ ?>
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/page196.tpl.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page196.tpl.php
new file mode 100644
index 00000000000..d52718bcfc8
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/page196.tpl.php
@@ -0,0 +1,82 @@
+
+
+
+Service S
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/partners.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/partners.php
new file mode 100644
index 00000000000..44e501d9f4d
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/partners.php
@@ -0,0 +1,5 @@
+ref.'/page191.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/pricing.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/pricing.php
new file mode 100644
index 00000000000..d2866cadf43
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/pricing.php
@@ -0,0 +1,5 @@
+ref.'/page192.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/privacy-policies.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/privacy-policies.php
new file mode 100644
index 00000000000..59dc87944fe
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/privacy-policies.php
@@ -0,0 +1,5 @@
+ref.'/page193.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/product-p.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/product-p.php
new file mode 100644
index 00000000000..beac94b27c8
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/product-p.php
@@ -0,0 +1,5 @@
+ref.'/page194.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/robots.txt b/htdocs/install/doctemplates/websites/website_template-corporate/containers/robots.txt
new file mode 100644
index 00000000000..2b844f479d6
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/robots.txt
@@ -0,0 +1,4 @@
+# Robot file. Generated with Dolibarr
+User-agent: *
+Allow: /public/
+Disallow: /administrator/
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/search.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/search.php
new file mode 100644
index 00000000000..359c5bf3b26
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/search.php
@@ -0,0 +1,5 @@
+ref.'/page195.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/service-s.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/service-s.php
new file mode 100644
index 00000000000..f69f6e7a13e
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/service-s.php
@@ -0,0 +1,5 @@
+ref.'/page196.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/styles.css.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/styles.css.php
new file mode 100644
index 00000000000..3307c499765
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/styles.css.php
@@ -0,0 +1,20608 @@
+
+/* CSS content (all pages) */
+body.bodywebsite { margin: 0; font-family: 'Open Sans', sans-serif; }
+.bodywebsite h1 { margin-top: 0; margin-bottom: 0; padding: 10px;}
+.bodywebsite a:focus,
+.bodywebsite button:focus {
+ outline: none !important;
+}
+.bodywebsite button::-moz-focus-inner {
+ border: 0;
+}
+.bodywebsite :focus {
+ outline: none;
+}
+.bodywebsite input,
+.bodywebsite select,
+.bodywebsite textarea {
+ outline: 0;
+}
+.bodywebsite p {
+ margin: 0;
+}
+.bodywebsite q {
+ font-size: 18px;
+ color: #fff;
+}
+.bodywebsite dl {
+ margin-bottom: 0;
+}
+.bodywebsite dt {
+ font-weight: 400;
+}
+html .bodywebsite p a:hover {
+ text-decoration: none;
+}
+.bodywebsite form {
+ margin-bottom: 0;
+}
+.bodywebsite .text-left {
+ text-align: left;
+}
+.bodywebsite .text-center {
+ text-align: center;
+}
+.bodywebsite .text-right {
+ text-align: right;
+}
+.bodywebsite .page .text-middle {
+ vertical-align: middle;
+}
+.bodywebsite .centpercent {
+ width: 100%;
+}
+.bodywebsite .page-head {
+ position: relative;
+ z-index: 90;
+ /* must be lower than 100 */
+ background-color: #fff;
+}
+.bodywebsite .page-content {
+ position: relative;
+ z-index: 1;
+}
+.bodywebsite .page-foot {
+ background-color: #000;
+}
+.bodywebsite input,
+.bodywebsite button,
+.bodywebsite select,
+.bodywebsite textarea {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+.bodywebsite a {
+ display: inline-block;
+ text-decoration: none;
+ transition: 0.33s all ease-out;
+}
+.bodywebsite a,
+.bodywebsite a:active,
+.bodywebsite a:focus {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite h3 a,
+.bodywebsite h3 a:active
+{
+ font-weight: normal !important;
+}
+.bodywebsite a:hover,
+.bodywebsite a:focus {
+ color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?>;
+ text-decoration: none;
+}
+.bodywebsite a:focus {
+ outline: 0;
+}
+.bodywebsite a[href*='callto'],
+.bodywebsite a[href*='mailto'] {
+ white-space: nowrap;
+}
+.bodywebsite img {
+ vertical-align: middle;
+ max-width: 100%;
+}
+.bodywebsite .img-responsive {
+ max-width: 100%;
+ height: auto;
+}
+.bodywebsite .img-circle {
+ border-radius: 50%;
+}
+.bodywebsite hr {
+ margin-top: 0;
+ margin-bottom: 0;
+ border: 0;
+ border-top: 1px solid #2a2b2b;
+}
+.bodywebsite .margin-lr-30 {
+ margin-left: 30px !important;
+ margin-right: 30px !important;
+}
+.bodywebsite .unit-left,
+.bodywebsite .unit-body {
+ white-space: nowrap;
+ display: inline-block;
+ vertical-align: middle;
+}
+.bodywebsite .unit-left {
+ padding-right: 10px;
+}
+.bodywebsite [role="button"] {
+ cursor: pointer;
+}
+.bodywebsite #sectionnews .nohover {
+ color: #000;
+}
+.bodywebsite .blog-box {
+ box-shadow: -1px -1px 12px 5px rgba(85, 85, 85, 0.1) !important;
+}
+.bodywebsite .blog-box:hover {
+ box-shadow: -1px -1px 12px 5px rgba(65, 65, 65, 0.3) !important;
+}
+.bodywebsite .margin-top-5 {
+ margin-top: 5px !important;
+}
+.bodywebsite .margin-top-10 {
+ margin-top: 10px !important;
+}
+.bodywebsite .rights {
+ display: inline-block;
+ margin: 0;
+ line-height: 1.5;
+ letter-spacing: .025em;
+ vertical-align: baseline;
+}
+.bodywebsite .rights * {
+ display: inline;
+ margin-right: .25em;
+}
+.bodywebsite .page-foot-default .rights {
+ color: #fff;
+ font-weight: 300;
+}
+.bodywebsite .page-foot .brand + * {
+ margin-top: 22px;
+}
+.bodywebsite .page-foot * + .link-block {
+ margin-top: 15px;
+}
+.bodywebsite .page-foot .footer-title + * {
+ margin-top: 30px;
+}
+.bodywebsite .page-foot .contact-info * + .unit {
+ margin-top: 15px;
+}
+.bodywebsite .privacy-link {
+ margin-top: 30px;
+}
+.bodywebsite .one-page-section * + .group-xl {
+ margin-top: 40px;
+}
+@media (min-width: 768px) {
+ .bodywebsite .one-page-section * + .group-xl {
+ margin-top: 60px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .one-page-section * + .group-xl {
+ margin-top: 100px;
+ }
+}
+.bodywebsite h1,
+.bodywebsite h2,
+.bodywebsite h3,
+.bodywebsite h4,
+.bodywebsite h5,
+.bodywebsite h6,
+.bodywebsite .h1,
+.bodywebsite .h2,
+.bodywebsite .h3,
+.bodywebsite .h4,
+.bodywebsite .h5,
+.bodywebsite .h6 {
+ margin-top: 0;
+ margin-bottom: 0;
+ font-family: "Roboto", Helvetica, Arial, sans-serif;
+ font-weight: 700;
+ color: #000;
+}
+.bodywebsite h1 > span,
+.bodywebsite h2 > span,
+.bodywebsite h3 > span,
+.bodywebsite h4 > span,
+.bodywebsite h5 > span,
+.bodywebsite h6 > span,
+.bodywebsite .h1 > span,
+.bodywebsite .h2 > span,
+.bodywebsite .h3 > span,
+.bodywebsite .h4 > span,
+.bodywebsite .h5 > span,
+.bodywebsite .h6 > span {
+ display: inline-block;
+ font-size: inherit;
+}
+.bodywebsite h1 a,
+.bodywebsite h2 a,
+.bodywebsite h3 a,
+.bodywebsite h4 a,
+.bodywebsite h5 a,
+.bodywebsite h6 a,
+.bodywebsite .h1 a,
+.bodywebsite .h2 a,
+.bodywebsite .h3 a,
+.bodywebsite .h4 a,
+.bodywebsite .h5 a,
+.bodywebsite .h6 a {
+ display: inline;
+ font: inherit;
+ letter-spacing: inherit;
+ transition: .33s all ease;
+}
+.bodywebsite h1 a:hover,
+.bodywebsite h2 a:hover,
+.bodywebsite h3 a:hover,
+.bodywebsite h4 a:hover,
+.bodywebsite h5 a:hover,
+.bodywebsite h6 a:hover,
+.bodywebsite .h1 a:hover,
+.bodywebsite .h2 a:hover,
+.bodywebsite .h3 a:hover,
+.bodywebsite .h4 a:hover,
+.bodywebsite .h5 a:hover,
+.bodywebsite .h6 a:hover {
+ color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?>;
+}
+.bodywebsite h1,
+.bodywebsite .h1 {
+ font-size: 18px;
+ line-height: 1.35;
+ text-transform: uppercase;
+}
+@media (min-width: 1200px) {
+ .bodywebsite h1,
+ .bodywebsite .h1 {
+ line-height: 1.2;
+ font-size: 33px;
+ }
+}
+.bodywebsite h1.small,
+.bodywebsite .h1.small {
+ font-size: 40px;
+}
+@media (min-width: 768px) {
+ .bodywebsite h1.small,
+ .bodywebsite .h1.small {
+ font-size: 40px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite h1.small,
+ .bodywebsite .h1.small {
+ font-size: 60px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite h1.small,
+ .bodywebsite .h1.small {
+ font-size: 72px;
+ line-height: 1.2;
+ }
+}
+.bodywebsite h2,
+.bodywebsite .h2 {
+ font-weight: 500;
+ font-size: 15px;
+ line-height: 1.2;
+}
+@media (min-width: 576px) {
+ .bodywebsite h2,
+ .bodywebsite .h2 {
+ line-height: 1.33333;
+ font-size: 18px;
+ }
+}
+.bodywebsite .text-big-18 {
+ font-size: 18px;
+}
+.bodywebsite .text-big-19 {
+ font-size: 19px;
+}
+.bodywebsite .text-small {
+ font-size: 12px;
+}
+.bodywebsite .text-small-16 {
+ font-size: 16px;
+}
+.bodywebsite small,
+.bodywebsite .small {
+ font-size: 12px;
+ line-height: 18px;
+}
+.bodywebsite code {
+ padding: 5px 7px;
+ font-size: 75%;
+ color: #fe4a21;
+ background-color: #f9f9f9;
+ border-radius: 2px;
+}
+.bodywebsite em {
+ font-family: Helvetica, Arial, sans-serif;
+ font-size: inherit;
+ font-style: italic;
+ font-weight: 700;
+ line-height: inherit;
+ color: #767877;
+}
+.bodywebsite address {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+.bodywebsite .context-dark,
+.bodywebsite .bg-black,
+.bodywebsite .bg-accent {
+ color: rgba(255, 255, 255, 0.5);
+}
+.bodywebsite .context-dark a,
+.bodywebsite .bg-black a,
+.bodywebsite .bg-accent a,
+.bodywebsite .bg-black a:active,
+.bodywebsite .bg-accent a:active,
+.bodywebsite .context-dark a:focus,
+.bodywebsite .bg-black a:focus,
+.bodywebsite .bg-accent a:focus,
+.bodywebsite .bg-cello a:focus {
+ color: #fff;
+}
+.bodywebsite .context-dark a:hover,
+.bodywebsite .bg-black a:hover,
+.bodywebsite .bg-accent a:hover
+{
+ color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?>;
+}
+.bodywebsite .context-dark .text-extra-large-bordered,
+.bodywebsite .bg-black .text-extra-large-bordered,
+.bodywebsite .bg-gray-darker .text-extra-large-bordered,
+.bodywebsite .bg-gray-dark .text-extra-large-bordered,
+.bodywebsite .bg-mine-shaft .text-extra-large-bordered,
+.bodywebsite .bg-cod-gray .text-extra-large-bordered,
+.bodywebsite .bg-accent .text-extra-large-bordered,
+.bodywebsite .bg-cello .text-extra-large-bordered {
+ color: #fff;
+}
+.bodywebsite .bg-black {
+ background: #000;
+ fill: #000;
+}
+.bodywebsite .bg-accent {
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ fill: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .bg-accent.bg-default-outline-btn .btn-white-outline:hover {
+ background: #3a3c3e;
+ border-color: #3a3c3e;
+}
+.bodywebsite .bg-porcelain {
+ background: #e5e7e9;
+ fill: #e5e7e9;
+}
+.bodywebsite .bg-cape-cod {
+ background: #444;
+ fill: #3a3c3e;
+}
+.bodywebsite #sectionfirstclass .bg-cape-cod {
+ background: #fff;
+ fill: #3a3c3e;
+}
+.bodywebsite .page .text-primary {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?> !important;
+}
+.bodywebsite .page a.text-primary:focus,
+.bodywebsite .page a.text-primary:hover {
+ color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?> !important;
+}
+.bodywebsite .page .text-secondary {
+ color: #00030a !important;
+}
+.bodywebsite .page a.text-secondary:focus,
+.bodywebsite .page a.text-secondary:hover {
+ color: black !important;
+}
+.bodywebsite .page .text-red-orange {
+ color: #ff4b22 !important;
+}
+.bodywebsite .page a.text-red-orange:focus,
+.bodywebsite .page a.text-red-orange:hover {
+ color: #ee2c00 !important;
+}
+.bodywebsite .page .text-black {
+ color: #000 !important;
+}
+.bodywebsite .page a.text-black:focus,
+.bodywebsite .page a.text-black:hover {
+ color: black !important;
+}
+.bodywebsite .page .text-silver {
+ color: #cdcdcd !important;
+}
+.bodywebsite .page a.text-silver:focus,
+.bodywebsite .page a.text-silver:hover {
+ color: #b4b4b4 !important;
+}
+.bodywebsite .page .text-dark {
+ color: #2a2b2b !important;
+}
+.bodywebsite .page a.text-dark:focus,
+.bodywebsite .page a.text-dark:hover {
+ color: #111111 !important;
+}
+.bodywebsite .page .text-gray {
+ color: #9f9f9f !important;
+}
+.bodywebsite .page a.text-gray:focus,
+.bodywebsite .page a.text-gray:hover {
+ color: #868686 !important;
+}
+.bodywebsite .page .text-gray-light {
+ color: #dedede !important;
+}
+.bodywebsite .page a.text-gray-light:focus,
+.bodywebsite .page a.text-gray-light:hover {
+ color: #c5c5c5 !important;
+}
+.bodywebsite .page .text-white {
+ color: #fff !important;
+ text-shadow: 1px 1px 8px #222;
+}
+.bodywebsite .page a.text-white:focus,
+.bodywebsite .page a.text-white:hover {
+ color: #e6e6e6 !important;
+}
+.bodywebsite .page .text-white-05 {
+ color: rgba(255, 255, 255, 0.5) !important;
+}
+.bodywebsite .page a.text-white-05:focus,
+.bodywebsite .page a.text-white-05:hover {
+ color: rgba(230, 230, 230, 0.5) !important;
+}
+.bodywebsite .page .text-white-03 {
+ color: rgba(255, 255, 255, 0.3) !important;
+}
+.bodywebsite .page a.text-white-03:focus,
+.bodywebsite .page a.text-white-03:hover {
+ color: rgba(230, 230, 230, 0.3) !important;
+}
+.bodywebsite .page .text-white-08 {
+ color: rgba(255, 255, 255, 0.8) !important;
+}
+.bodywebsite .page a.text-white-08:focus,
+.bodywebsite .page a.text-white-08:hover {
+ color: rgba(230, 230, 230, 0.8) !important;
+}
+.bodywebsite .page .text-tundora {
+ color: #414141 !important;
+}
+.bodywebsite .page a.text-tundora:focus,
+.bodywebsite .page a.text-tundora:hover {
+ color: #282828 !important;
+}
+.bodywebsite .page .text-black-05 {
+ color: rgba(0, 0, 0, 0.5) !important;
+}
+.bodywebsite .page a.text-black-05:focus,
+.bodywebsite .page a.text-black-05:hover {
+ color: rgba(0, 0, 0, 0.5) !important;
+}
+.bodywebsite .page .text-bismark {
+ color: #496a8a !important;
+}
+.bodywebsite .page a.text-bismark:focus,
+.bodywebsite .page a.text-bismark:hover {
+ color: #375069 !important;
+}
+.bodywebsite .page .text-black-08 {
+ color: rgba(0, 0, 0, 0.8) !important;
+}
+.bodywebsite .page a.text-black-08:focus,
+.bodywebsite .page a.text-black-08:hover {
+ color: rgba(0, 0, 0, 0.8) !important;
+}
+.bodywebsite .page .text-gray-darker {
+ color: #00030a !important;
+}
+.bodywebsite .page a.text-gray-darker:focus,
+.bodywebsite .page a.text-gray-darker:hover {
+ color: black !important;
+}
+.bodywebsite .page .text-abbey {
+ color: #464a4d !important;
+}
+.bodywebsite .page a.text-abbey:focus,
+.bodywebsite .page a.text-abbey:hover {
+ color: #2e3032 !important;
+}
+.bodywebsite .page .text-rolling-stone {
+ color: #74787C !important;
+}
+.bodywebsite .page a.text-rolling-stone:focus,
+.bodywebsite .page a.text-rolling-stone:hover {
+ color: #5b5f62 !important;
+}
+.bodywebsite .page .text-fuel-yellow {
+ color: #F0B922 !important;
+}
+.bodywebsite .page a.text-fuel-yellow:focus,
+.bodywebsite .page a.text-fuel-yellow:hover {
+ color: #d19d0e !important;
+}
+.bodywebsite .hidden {
+ display: none;
+}
+.bodywebsite .text-italic {
+ font-style: italic;
+}
+.bodywebsite .text-normal {
+ font-style: normal;
+}
+.bodywebsite .text-none {
+ text-transform: none;
+}
+.bodywebsite .text-underline {
+ text-decoration: underline;
+}
+.bodywebsite .text-strike {
+ text-decoration: line-through;
+}
+.bodywebsite .text-thin {
+ font-weight: 100;
+}
+.bodywebsite .text-light {
+ font-weight: 300;
+}
+.bodywebsite .text-regular {
+ font-weight: 400;
+}
+.bodywebsite .text-medium {
+ font-weight: 500;
+}
+.bodywebsite .text-sbold {
+ font-weight: 600;
+}
+.bodywebsite .text-bold,
+.bodywebsite strong {
+ font-weight: 700;
+}
+.bodywebsite .text-ubold {
+ font-weight: 900;
+}
+.bodywebsite .text-spacing-0 {
+ letter-spacing: 0;
+}
+.bodywebsite .text-spacing-40 {
+ letter-spacing: 0.04em;
+}
+.bodywebsite .text-spacing-inverse-20 {
+ letter-spacing: -0.02em;
+}
+.bodywebsite .text-spacing-120 {
+ letter-spacing: 0.12em;
+}
+.bodywebsite .btn {
+ max-width: 100%;
+ font-family: "Roboto", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ font-weight: 700;
+ border-radius: 0;
+ border: 2px solid;
+ text-transform: uppercase;
+ transition: 0.3s ease-out;
+ padding: 11px 15px;
+}
+@media (min-width: 992px) {
+ .bodywebsite .btn {
+ padding: 12px 35px;
+ }
+}
+.bodywebsite .btn:focus,
+.bodywebsite .btn:active,
+.bodywebsite .btn:active:focus {
+ outline: none;
+}
+.bodywebsite .btn:active,
+.bodywebsite .btn.active {
+ box-shadow: none;
+}
+.bodywebsite .btn-smaller {
+ padding: 8px 25px;
+}
+.bodywebsite .btn-small {
+ padding-left: 20px;
+ padding-right: 20px;
+}
+@media (min-width: 768px) {
+ .bodywebsite .btn {
+ min-width: 190px;
+ }
+}
+html .bodywebsite .btn-default,
+html .bodywebsite .btn-default:active,
+html .bodywebsite .btn-default.active,
+html .bodywebsite .btn-default:active:focus,
+html .bodywebsite .btn-default.active:focus,
+html .bodywebsite .btn-default:focus:active,
+html .bodywebsite .btn-default:focus {
+ color: #fff;
+ background-color: #464a4d;
+ border-color: #464a4d;
+}
+.bodywebsite .open > html .btn-default.dropdown-toggle,
+html .bodywebsite .btn-default:hover {
+ color: #fff;
+ background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+html .bodywebsite .btn-default.disabled,
+html .bodywebsite .btn-default[disabled],
+.bodywebsite fieldset[disabled] html .btn-default {
+ pointer-events: none;
+ opacity: .5;
+}
+html .bodywebsite .btn-default .badge {
+ color: #464a4d;
+ background-color: #fff;
+}
+html .bodywebsite .btn-primary,
+html .bodywebsite .btn-primary:active,
+html .bodywebsite .btn-primary.active,
+html .bodywebsite .btn-primary:active:focus,
+html .bodywebsite .btn-primary.active:focus,
+html .bodywebsite .btn-primary:focus:active,
+html .bodywebsite .btn-primary:focus {
+ color: #fff;
+ background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ /* border: 0; */
+}
+.bodywebsite .open > html .btn-primary.dropdown-toggle {
+ color: #fff;
+ background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ /* border: none; */
+}
+html .bodywebsite .btn-primary:hover {
+ color: #fff;
+ box-shadow: 1px 1px 8px #aaa;
+}
+html .bodywebsite .btn-primary.disabled,
+html .bodywebsite .btn-primary[disabled],
+.bodywebsite fieldset[disabled] html .btn-primary {
+ pointer-events: none;
+ opacity: .5;
+}
+html .bodywebsite .btn-primary .badge {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ background-color: #fff;
+}
+html .bodywebsite .btn-primary-contrast,
+html .bodywebsite .btn-primary-contrast:active,
+html .bodywebsite .btn-primary-contrast.active,
+html .bodywebsite .btn-primary-contrast:active:focus,
+html .bodywebsite .btn-primary-contrast.active:focus,
+html .bodywebsite .btn-primary-contrast:focus:active,
+html .bodywebsite .btn-primary-contrast:focus {
+ color: #fff;
+ background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .open > html .btn-primary-contrast.dropdown-toggle,
+html .bodywebsite .btn-primary-contrast:hover {
+ color: #fff;
+ background-color: #42b294;
+ border-color: #42b294;
+}
+html .bodywebsite .btn-primary-contrast.disabled,
+html .bodywebsite .btn-primary-contrast[disabled],
+.bodywebsite fieldset[disabled] html .btn-primary-contrast {
+ pointer-events: none;
+ opacity: .5;
+}
+html .bodywebsite .btn-primary-contrast .badge {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ background-color: #fff;
+}
+html .bodywebsite .btn-primary-outline,
+html .bodywebsite .btn-primary-outline:active,
+html .bodywebsite .btn-primary-outline.active,
+html .bodywebsite .btn-primary-outline:active:focus,
+html .bodywebsite .btn-primary-outline.active:focus,
+html .bodywebsite .btn-primary-outline:focus:active,
+html .bodywebsite .btn-primary-outline:focus {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ background-color: transparent;
+ border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .open > html .btn-primary-outline.dropdown-toggle,
+html .bodywebsite .btn-primary-outline:hover {
+ color: #fff;
+ background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+html .bodywebsite .btn-primary-outline.disabled,
+html .bodywebsite .btn-primary-outline[disabled],
+.bodywebsite fieldset[disabled] html .btn-primary-outline {
+ pointer-events: none;
+ opacity: .5;
+}
+html .bodywebsite .btn-primary-outline .badge {
+ color: transparent;
+ background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+html .bodywebsite .btn-cello-outline,
+html .bodywebsite .btn-cello-outline:active,
+html .bodywebsite .btn-cello-outline.active,
+html .bodywebsite .btn-cello-outline:active:focus,
+html .bodywebsite .btn-cello-outline.active:focus,
+html .bodywebsite .btn-cello-outline:focus:active,
+html .bodywebsite .btn-cello-outline:focus {
+ color: #1e3953;
+ background-color: transparent;
+ border-color: #1e3953;
+}
+.bodywebsite .open > html .btn-cello-outline.dropdown-toggle,
+html .bodywebsite .btn-cello-outline:hover {
+ color: #fff;
+ background-color: #1e3953;
+ border-color: #1e3953;
+}
+html .bodywebsite .btn-cello-outline.disabled,
+html .bodywebsite .btn-cello-outline[disabled],
+.bodywebsite fieldset[disabled] html .btn-cello-outline {
+ pointer-events: none;
+ opacity: .5;
+}
+html .bodywebsite .btn-cello-outline .badge {
+ color: transparent;
+ background-color: #1e3953;
+}
+html .bodywebsite .btn-white-outline,
+html .bodywebsite .btn-white-outline:active,
+html .bodywebsite .btn-white-outline.active,
+html .bodywebsite .btn-white-outline:active:focus,
+html .bodywebsite .btn-white-outline.active:focus,
+html .bodywebsite .btn-white-outline:focus:active,
+html .bodywebsite .btn-white-outline:focus {
+ color: #fff;
+ background-color: transparent;
+ border-color: #fff;
+}
+.bodywebsite .open > html .btn-white-outline.dropdown-toggle,
+html .bodywebsite .btn-white-outline:hover {
+ color: #fff;
+ background-color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?>;
+ border-color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?>;
+}
+html .bodywebsite .btn-white-outline.disabled,
+html .bodywebsite .btn-white-outline[disabled],
+.bodywebsite fieldset[disabled] html .btn-white-outline {
+ pointer-events: none;
+ opacity: .5;
+}
+html .bodywebsite .btn-white-outline .badge {
+ color: transparent;
+ background-color: #fff;
+}
+html .bodywebsite .btn-white-outline-variant-1,
+html .bodywebsite .btn-white-outline-variant-1:active,
+html .bodywebsite .btn-white-outline-variant-1.active,
+html .bodywebsite .btn-white-outline-variant-1:active:focus,
+html .bodywebsite .btn-white-outline-variant-1.active:focus,
+html .bodywebsite .btn-white-outline-variant-1:focus:active,
+html .bodywebsite .btn-white-outline-variant-1:focus {
+ color: #fff;
+ background-color: transparent;
+ border-color: #fff;
+}
+.bodywebsite .open > html .btn-white-outline-variant-1.dropdown-toggle,
+html .bodywebsite .btn-white-outline-variant-1:hover {
+ color: #fff;
+ background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+html .bodywebsite .btn-white-outline-variant-1.disabled,
+html .bodywebsite .btn-white-outline-variant-1[disabled],
+.bodywebsite fieldset[disabled] html .btn-white-outline-variant-1 {
+ pointer-events: none;
+ opacity: .5;
+}
+html .bodywebsite .btn-white-outline-variant-1 .badge {
+ color: transparent;
+ background-color: #fff;
+}
+html .bodywebsite .btn-silver-outline,
+html .bodywebsite .btn-silver-outline:active,
+html .bodywebsite .btn-silver-outline.active,
+html .bodywebsite .btn-silver-outline:active:focus,
+html .bodywebsite .btn-silver-outline.active:focus,
+html .bodywebsite .btn-silver-outline:focus:active,
+html .bodywebsite .btn-silver-outline:focus {
+ color: #000;
+ background-color: transparent;
+ border-color: #cdcdcd;
+}
+.bodywebsite .open > html .btn-silver-outline.dropdown-toggle,
+html .bodywebsite .btn-silver-outline:hover {
+ color: #fff;
+ background-color: #cdcdcd;
+ border-color: #cdcdcd;
+}
+html .bodywebsite .btn-silver-outline.disabled,
+html .bodywebsite .btn-silver-outline[disabled],
+.bodywebsite fieldset[disabled] html .btn-silver-outline {
+ pointer-events: none;
+ opacity: .5;
+}
+html .bodywebsite .btn-silver-outline .badge {
+ color: transparent;
+ background-color: #000;
+}
+html .bodywebsite .btn-black-outline,
+html .bodywebsite .btn-black-outline:active,
+html .bodywebsite .btn-black-outline.active,
+html .bodywebsite .btn-black-outline:active:focus,
+html .bodywebsite .btn-black-outline.active:focus,
+html .bodywebsite .btn-black-outline:focus:active,
+html .bodywebsite .btn-black-outline:focus {
+ color: #000;
+ background-color: transparent;
+ border-color: #000;
+}
+.bodywebsite .open > html .btn-black-outline.dropdown-toggle,
+html .bodywebsite .btn-black-outline:hover {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+html .bodywebsite .btn-black-outline.disabled,
+html .bodywebsite .btn-black-outline[disabled],
+.bodywebsite fieldset[disabled] html .btn-black-outline {
+ pointer-events: none;
+ opacity: .5;
+}
+html .bodywebsite .btn-black-outline .badge {
+ color: transparent;
+ background-color: #000;
+}
+html .bodywebsite .btn-cello,
+html .bodywebsite .btn-cello:active,
+html .bodywebsite .btn-cello.active,
+html .bodywebsite .btn-cello:active:focus,
+html .bodywebsite .btn-cello.active:focus,
+html .bodywebsite .btn-cello:focus:active,
+html .bodywebsite .btn-cello:focus {
+ color: #fff;
+ background-color: #1e3953;
+ border-color: #1e3953;
+}
+.bodywebsite .open > html .btn-cello.dropdown-toggle,
+html .bodywebsite .btn-cello:hover {
+ color: #fff;
+ background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+html .bodywebsite .btn-cello.disabled,
+html .bodywebsite .btn-cello[disabled],
+.bodywebsite fieldset[disabled] html .btn-cello {
+ pointer-events: none;
+ opacity: .5;
+}
+html .bodywebsite .btn-cello .badge {
+ color: #1e3953;
+ background-color: #fff;
+}
+.bodywebsite .btn-xs {
+ padding: 12px 25px;
+ font-size: 11px;
+ line-height: 1.71429;
+ border-radius: 0;
+}
+@media (min-width: 768px) {
+ .bodywebsite .btn-xs {
+ min-width: 165px;
+ }
+}
+.bodywebsite .btn-sm {
+ padding: 10px 20px;
+ font-size: 13px;
+ line-height: 1.71429;
+ border-radius: 0;
+}
+@media (min-width: 768px) {
+ .bodywebsite .btn-sm {
+ min-width: 170px;
+ }
+}
+.bodywebsite .btn-lg {
+ padding: 14px 30px;
+ font-size: 14px;
+ line-height: 1.71429;
+ border-radius: 0;
+}
+@media (min-width: 768px) {
+ .bodywebsite .btn-lg {
+ min-width: 270px;
+ padding: 18px 40px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .btn-lg-bigger {
+ padding-top: 28px;
+ padding-bottom: 28px;
+ }
+}
+.bodywebsite .btn-xl {
+ padding: 20px 35px;
+ font-size: 15px;
+ line-height: 1.71429;
+ border-radius: 0;
+}
+@media (min-width: 768px) {
+ .bodywebsite .btn-xl {
+ padding: 21px 50px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .btn-xl {
+ min-width: 270px;
+ }
+}
+.bodywebsite .btn-min-width-0 {
+ min-width: 0;
+}
+.bodywebsite .btn-block {
+ min-width: 30px;
+ max-width: 100%;
+}
+.bodywebsite .btn-rect {
+ border-radius: 0;
+}
+.bodywebsite .btn-round {
+ border-radius: 12px;
+}
+.bodywebsite .btn-circle {
+ border-radius: 35px;
+}
+.bodywebsite .btn-round-bottom {
+ border-radius: 0 0 5px 5px;
+}
+.bodywebsite .btn-shadow {
+ box-shadow: -3px 3px 3px 0 rgba(0, 0, 0, 0.14);
+}
+.bodywebsite .btn.btn-icon {
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ vertical-align: middle;
+}
+.bodywebsite .btn.btn-icon .icon {
+ position: relative;
+ top: 1px;
+ display: inline-block;
+ width: auto;
+ height: auto;
+ line-height: 0;
+ vertical-align: middle;
+ transition: 0s;
+}
+.bodywebsite .btn.btn-icon-left .icon {
+ margin-right: 10px;
+}
+.bodywebsite .btn.btn-icon-right {
+ -webkit-flex-direction: row-reverse;
+ -ms-flex-direction: row-reverse;
+ flex-direction: row-reverse;
+}
+.bodywebsite .btn.btn-icon-right .icon {
+ margin-left: 10px;
+}
+.bodywebsite .btn-icon-only {
+ background: none;
+ border: none;
+ display: inline-block;
+ padding: 0;
+ outline: none;
+ outline-offset: 0;
+ cursor: pointer;
+ -webkit-appearance: none;
+ font-size: 0;
+ line-height: 0;
+ transition: .33s all ease;
+}
+.bodywebsite .btn-icon-only::-moz-focus-inner {
+ border: none;
+ padding: 0;
+}
+.bodywebsite .btn-icon-only.btn-icon-only-primary,
+.bodywebsite .btn-icon-only.btn-icon-only-primary:active,
+.bodywebsite .btn-icon-only.btn-icon-only-primary:focus {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .btn-icon-only.btn-icon-only-primary:hover {
+ color: #000;
+}
+.bodywebsite .btn-icon-only {
+ padding: 9px 18px;
+}
+.bodywebsite .btn-icon-single {
+ display: inline-block;
+ padding: 0;
+ min-width: 0;
+}
+.bodywebsite .btn-icon-default {
+ color: #000;
+}
+.bodywebsite .btn-icon-default:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .btn-cello-outline.btn-icon .icon {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ transition: .33s all ease;
+}
+.bodywebsite .btn-cello-outline.btn-icon:hover.btn-icon .icon {
+ color: #fff;
+}
+.bodywebsite .button-block * + .btn {
+ margin-top: 0;
+}
+.bodywebsite .icon {
+ display: inline-block;
+ text-align: center;
+}
+.bodywebsite .icon:before {
+ display: inline-block;
+ font-style: normal;
+ speak: none;
+ text-transform: none;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.bodywebsite [class*='icon-circle'] {
+ border-radius: 50%;
+ overflow: hidden;
+}
+.bodywebsite [class*='icon-round'] {
+ border-radius: 4px;
+ overflow: hidden;
+}
+.bodywebsite .page .icon-default {
+ color: #9f9f9f;
+}
+.bodywebsite .page .icon-black {
+ color: #000;
+}
+.bodywebsite .page .icon-primary {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .page .icon-gunsmoke {
+ color: #767877;
+}
+.bodywebsite .page .icon-tundora {
+ color: #414141;
+}
+.bodywebsite .page .icon-gray-dark-filled {
+ color: #fff;
+ background: #2a2b2b;
+}
+.bodywebsite .page .icon-san-juan-filled {
+ color: #fff;
+ background: #2e5275;
+}
+.bodywebsite .page .icon-silver-chalice-filled {
+ color: #fff;
+ background: #ababab;
+}
+.bodywebsite .page .icon-abbey-filled {
+ color: #fff;
+ background: #464a4d;
+}
+.bodywebsite .page .icon-white {
+ color: #fff;
+}
+.bodywebsite .page a.icon-default,
+.bodywebsite .page a.icon-default:active,
+.bodywebsite .page a.icon-default:focus {
+ color: #9f9f9f;
+}
+.bodywebsite .page a.icon-default:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .page a.icon-primary,
+.bodywebsite .page a.icon-primary:active,
+.bodywebsite .page a.icon-primary:focus {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .page a.icon-primary:hover {
+ color: #fff;
+}
+.bodywebsite .page a.icon-abbey-filled:hover {
+ color: #fff;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .page a.icon-tundora-inverse,
+.bodywebsite .page a.icon-tundora-inverse:active,
+.bodywebsite .page a.icon-tundora-inverse:focus {
+ color: #414141;
+}
+.bodywebsite .page a.icon-tundora-inverse:hover {
+ color: #fff;
+}
+.bodywebsite .page a.icon-gray-dark-filled,
+.bodywebsite .page a.icon-gray-dark-filled:active,
+.bodywebsite .page a.icon-gray-dark-filled:focus {
+ color: #fff;
+ background: #2a2b2b;
+}
+.bodywebsite .page a.icon-gray-dark-filled:hover {
+ color: #fff;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .page a.icon-silver-chalice-filled,
+.bodywebsite .page a.icon-silver-chalice-filled:active,
+.bodywebsite .page a.icon-silver-chalice-filled:focus {
+ color: #fff;
+ background: #ababab;
+}
+.bodywebsite .page a.icon-silver-chalice-filled:hover {
+ color: #fff;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .page a.icon-san-juan-filled,
+.bodywebsite .page a.icon-san-juan-filled:active,
+.bodywebsite .page a.icon-san-juan-filled:focus {
+ color: #fff;
+ background: #2e5275;
+}
+.bodywebsite .page a.icon-san-juan-filled:hover {
+ color: #fff;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .page .icon-xxs {
+ width: 18px;
+ height: 18px;
+ font-size: 18px;
+ line-height: 18px;
+}
+.bodywebsite .page .icon-xxs-small {
+ width: 16px;
+ height: 16px;
+ font-size: 16px;
+ line-height: 16px;
+}
+.bodywebsite .page .icon-xxs-smaller {
+ width: 14px;
+ height: 14px;
+ font-size: 14px;
+ line-height: 14px;
+}
+.bodywebsite .page .icon-xxs-smallest {
+ width: 12px;
+ height: 12px;
+ font-size: 12px;
+ line-height: 12px;
+}
+.bodywebsite .page .icon-xs {
+ width: 22px;
+ height: 22px;
+ font-size: 22px;
+ line-height: 22px;
+}
+.bodywebsite .page .icon-xs-smaller {
+ width: 20px;
+ height: 20px;
+ font-size: 20px;
+ line-height: 20px;
+}
+.bodywebsite .page .icon-sm {
+ width: 24px;
+ height: 24px;
+ font-size: 24px;
+ line-height: 24px;
+}
+.bodywebsite .page .icon-sm-custom {
+ width: 24px;
+ height: 24px;
+ font-size: 24px;
+ line-height: 24px;
+}
+@media (min-width: 992px) {
+ .bodywebsite .page .icon-sm-custom {
+ width: 30px;
+ height: 30px;
+ font-size: 30px;
+ line-height: 30px;
+ }
+}
+.bodywebsite .page .icon-md {
+ width: 36px;
+ height: 36px;
+ font-size: 36px;
+ line-height: 36px;
+}
+.bodywebsite .page .icon-md-custom {
+ width: 26px;
+ height: 26px;
+ font-size: 26px;
+ line-height: 26px;
+}
+@media (min-width: 992px) {
+ .bodywebsite .page .icon-md-custom {
+ width: 36px;
+ height: 36px;
+ font-size: 36px;
+ line-height: 36px;
+ }
+}
+.bodywebsite .page .icon-md-smaller {
+ width: 30px;
+ height: 30px;
+ font-size: 30px;
+ line-height: 30px;
+}
+.bodywebsite .page .icon-lg {
+ width: 45px;
+ height: 45px;
+ font-size: 45px;
+ line-height: 45px;
+}
+.bodywebsite .page .icon-lg-variant-1 {
+ width: 42px;
+ height: 42px;
+ font-size: 42px;
+ line-height: 42px;
+}
+.bodywebsite .page .icon-lg-variant-2 {
+ width: 44px;
+ height: 44px;
+ font-size: 44px;
+ line-height: 44px;
+}
+.bodywebsite .page .icon-lg-bigger {
+ width: 50px;
+ height: 50px;
+ font-size: 50px;
+ line-height: 50px;
+}
+.bodywebsite .page .icon-xl {
+ width: 60px;
+ height: 60px;
+ font-size: 60px;
+ line-height: 60px;
+}
+.bodywebsite .page [class*='icon-round'].icon-xxs-smallest,
+.bodywebsite .page [class*='icon-circle'].icon-xxs-smallest {
+ width: 26px;
+ height: 26px;
+ line-height: 26px;
+}
+.bodywebsite .icon-shift-1 {
+ position: relative;
+ top: 2px;
+}
+.bodywebsite .icon-shift-2 {
+ position: relative;
+ top: 2px;
+}
+@media (min-width: 992px) {
+ .bodywebsite .icon-shift-2 {
+ top: 4px;
+ }
+}
+.bodywebsite .icon-1:before,
+.bodywebsite .icon-2:before,
+.bodywebsite .icon-4:before,
+.bodywebsite .icon-5:before,
+.bodywebsite .icon-6:before,
+.bodywebsite .icon-3:before {
+ content: '';
+ display: inline-block;
+ width: 40px;
+ height: 40px;
+}
+.bodywebsite .thumbnail {
+ position: relative;
+ z-index: 1;
+ width: 100%;
+ max-height: 100%;
+ overflow: hidden;
+ padding: 0;
+ margin: 0;
+ border: none;
+ border-radius: 0;
+ background-color: transparent;
+}
+.bodywebsite .thumbnail .caption {
+ padding: 0;
+}
+.bodywebsite .thumbnail {
+ box-shadow: none;
+}
+.bodywebsite .thumbnail-variant-1 {
+ background-color: transparent;
+ text-align: center;
+}
+.bodywebsite .thumbnail-variant-1 .thumbnail-image {
+ position: relative;
+ display: inline-block;
+ overflow: hidden;
+ pointer-events: none;
+}
+.bodywebsite .thumbnail-variant-1 .thumbnail-image,
+.bodywebsite .thumbnail-variant-1 .thumbnail-image > img {
+ border-radius: 600px;
+}
+.bodywebsite .thumbnail-variant-1 .thumbnail-image > img {
+ width: auto;
+ pointer-events: auto;
+}
+.bodywebsite .thumbnail-variant-1 .thumbnail-image-inner {
+ position: absolute;
+ top: 0;
+ right: 1px;
+ bottom: 0;
+ left: 1px;
+ z-index: 2;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ padding: 20px 5px 5px;
+ background: rgba(0, 0, 0, 0.4);
+ border-radius: 600px;
+}
+.bodywebsite .thumbnail-variant-1 .thumbnail-image-inner * {
+ pointer-events: auto;
+}
+.bodywebsite .thumbnail-variant-1 .thumbnail-image-inner > * + * {
+ margin-top: 0;
+ margin-left: 20px;
+}
+.bodywebsite .thumbnail-variant-1 .header {
+ line-height: 1.2;
+}
+.bodywebsite .thumbnail-variant-1 * + p {
+ margin-top: 0;
+}
+.bodywebsite .thumbnail-variant-1 * + .thumbnail-caption {
+ margin-top: 18px;
+}
+@media (min-width: 992px) {
+ .bodywebsite .desktop .thumbnail-variant-1 .thumbnail-image-inner {
+ opacity: 0;
+ visibility: hidden;
+ transform: rotate3d(0, 1, 0, 60deg);
+ transition: .55s all ease;
+ background: rgba(0, 0, 0, 0.6);
+ }
+ .bodywebsite .desktop .thumbnail-variant-1 .thumbnail-image:hover .thumbnail-image-inner {
+ opacity: 1;
+ visibility: visible;
+ transform: rotate3d(0, 1, 0, 0deg);
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .thumbnail-variant-1 * + .thumbnail-caption {
+ margin-top: 30px;
+ }
+}
+.bodywebsite .thumbnail-variant-2 {
+ min-height: 300px;
+ padding: 30px 0 0;
+ overflow: visible;
+ text-align: center;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: flex-end;
+ -ms-flex-pack: end;
+ justify-content: flex-end;
+}
+.bodywebsite .thumbnail-variant-2-wrap {
+ padding-bottom: 25px;
+}
+.bodywebsite .thumbnail-variant-2 .thumbnail-image {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ overflow: hidden;
+}
+.bodywebsite .thumbnail-variant-2 .thumbnail-image > img {
+ position: absolute;
+ top: 20%;
+ left: 50%;
+ transform: translate(-50%, -20%);
+ width: auto;
+ min-width: 101%;
+ max-width: none;
+ height: auto;
+ min-height: 100%;
+ max-height: none;
+}
+.bodywebsite .thumbnail-variant-2:before {
+ content: '';
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1;
+ background: rgba(0, 0, 0, 0.5);
+}
+.bodywebsite .thumbnail-variant-2 .thumbnail-inner {
+ position: relative;
+ z-index: 2;
+ padding: 30px 10px;
+}
+.bodywebsite .thumbnail-variant-2 .thumbnail-caption {
+ position: relative;
+ z-index: 3;
+ width: calc(66%);
+ padding: 17px 8px 25px;
+ margin: 31px 17px -25px 17px;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .thumbnail-variant-2 .thumbnail-caption * {
+ color: #fff;
+}
+.bodywebsite .thumbnail-variant-2 .thumbnail-caption a,
+.bodywebsite .thumbnail-variant-2 .thumbnail-caption a:active,
+.bodywebsite .thumbnail-variant-2 .thumbnail-caption a:focus {
+ color: #fff;
+}
+.bodywebsite .thumbnail-variant-2 .thumbnail-caption a:hover {
+ color: #9f9f9f;
+}
+.bodywebsite .thumbnail-variant-2 .text-header {
+ font-size: 18px;
+ font-weight: 700;
+}
+.bodywebsite .thumbnail-variant-2 .text-caption {
+ font-style: italic;
+ line-height: 1.3;
+ font-family: "Roboto", Helvetica, Arial, sans-serif;
+}
+@media (min-width: 768px) {
+ .bodywebsite .thumbnail-variant-2 .text-caption {
+ font-size: 16px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .desktop .thumbnail-variant-2:before {
+ top: 40px;
+ }
+ .bodywebsite .desktop .thumbnail-variant-2 .thumbnail-inner > * {
+ position: relative;
+ transform: translateY(14px);
+ transition: 0.4s all ease-in-out;
+ }
+ .bodywebsite .desktop .thumbnail-variant-2:before,
+ .bodywebsite .desktop .thumbnail-variant-2 .thumbnail-inner {
+ opacity: 0;
+ visibility: hidden;
+ transition: 0.33s all ease-out;
+ }
+ .bodywebsite .desktop .thumbnail-variant-2:hover:before {
+ top: 0;
+ left: 0;
+ right: 0;
+ }
+ .bodywebsite .desktop .thumbnail-variant-2:hover .thumbnail-inner > * {
+ transform: translateY(0);
+ }
+ .bodywebsite .desktop .thumbnail-variant-2:hover:before,
+ .bodywebsite .desktop .thumbnail-variant-2:hover .thumbnail-inner {
+ opacity: 1;
+ visibility: visible;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .thumbnail-variant-2 .thumbnail-caption {
+ width: calc(84%);
+ margin: 31px 8px -25px 8px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .thumbnail-variant-2 {
+ width: calc(78%);
+ margin: 0 11px 0;
+ }
+ .bodywebsite .thumbnail-variant-2 .thumbnail-caption {
+ width: calc(66%);
+ margin: 31px 17px -25px 17px;
+ }
+}
+.bodywebsite .ie-11 .thumbnail-variant-2 {
+ min-height: 0;
+}
+.bodywebsite .thumbnail-variant-3 {
+ width: 100.025%;
+ text-align: center;
+}
+.bodywebsite .thumbnail-variant-3 img {
+ position: relative;
+ left: 50%;
+ transform: translateX(-50%);
+ width: auto;
+ max-width: none;
+ min-width: 100.5%;
+}
+.bodywebsite .thumbnail-variant-3 .link-external {
+ position: absolute;
+ top: -30px;
+ right: -30px;
+ z-index: 1;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ width: 200px;
+ height: 110px;
+ padding: 55px 15px 5px;
+ vertical-align: bottom;
+ line-height: 40px;
+ background: #fafafa;
+ transform-origin: 74% 110%;
+ transform: rotate(45deg);
+ will-change: transform;
+ text-align: center;
+ /**
+ @bugfix: color flickering in child objects on hover
+ @affected: IE Edge
+ */
+ transition: top 0.28s cubic-bezier(0.79, 0.14, 0.15, 0.86), right 0.28s cubic-bezier(0.79, 0.14, 0.15, 0.86), opacity 0.28s cubic-bezier(0.79, 0.14, 0.15, 0.86), visibility 0.28s cubic-bezier(0.79, 0.14, 0.15, 0.86);
+}
+.bodywebsite .thumbnail-variant-3 .link-external .icon {
+ transition: none;
+ transform: rotate(-45deg);
+ color: #000;
+ vertical-align: bottom;
+}
+.bodywebsite .thumbnail-variant-3 .link-external:hover {
+ top: -12px;
+ right: -12px;
+}
+.bodywebsite .thumbnail-variant-3 .link-original {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: flex-end;
+ -ms-flex-align: end;
+ align-items: flex-end;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+}
+.bodywebsite .thumbnail-variant-3 .link-original,
+.bodywebsite .thumbnail-variant-3 .link-original:active,
+.bodywebsite .thumbnail-variant-3 .link-original:focus,
+.bodywebsite .thumbnail-variant-3 .link-original:hover {
+ color: #fff;
+}
+.bodywebsite .thumbnail-variant-3 .link-original:before {
+ content: '\e8ff';
+ position: relative;
+ left: 20px;
+ bottom: 30px;
+ z-index: 3;
+ font-family: 'Material Icons';
+ font-size: 140px;
+ line-height: 1;
+ opacity: .2;
+ transition: .33s all ease;
+}
+.bodywebsite .thumbnail-variant-3 .caption {
+ position: absolute;
+ top: -2px;
+ right: 0;
+ bottom: -2px;
+ left: 0;
+ padding: 15px;
+ transition: 0.33s all ease-in-out;
+ background: rgba(0, 0, 0, 0.6);
+}
+@media (min-width: 992px) {
+ .bodywebsite .desktop .thumbnail-variant-3 figure img {
+ will-change: transform;
+ transition: 0.4s ease-out;
+ }
+ .bodywebsite .desktop .thumbnail-variant-3 .caption,
+ .bodywebsite .desktop .thumbnail-variant-3 .link-external {
+ opacity: 0;
+ visibility: hidden;
+ }
+ .bodywebsite .desktop .thumbnail-variant-3 .link-external {
+ right: -50px;
+ top: -50px;
+ }
+ .bodywebsite .desktop .thumbnail-variant-3:hover .caption,
+ .bodywebsite .desktop .thumbnail-variant-3:hover .link-external {
+ opacity: 1;
+ visibility: visible;
+ }
+ .bodywebsite .desktop .thumbnail-variant-3:hover figure img {
+ transform: translateX(-50%) scale(1.08);
+ }
+ .bodywebsite .desktop .thumbnail-variant-3:hover .link-external {
+ right: -30px;
+ top: -30px;
+ }
+ .bodywebsite .desktop .thumbnail-variant-3:hover .link-external:hover {
+ top: -20px;
+ right: -20px;
+ }
+}
+.bodywebsite .thumbnail-variant-3 > * + * {
+ margin-top: 0;
+}
+@media (min-width: 768px) {
+ .bodywebsite .thumbnail-wrap {
+ padding: 0 5px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .thumbnail-wrap {
+ padding: 0 9px;
+ }
+}
+.bodywebsite .thumbnail-variant-4 {
+ position: relative;
+ overflow: hidden;
+ box-shadow: 0px 0px 13px 0px rgba(1, 3, 4, 0.15);
+}
+.bodywebsite .thumbnail-variant-4 .thumbnail-image {
+ background: #000;
+}
+.bodywebsite .thumbnail-variant-4 .thumbnail-image img {
+ opacity: .92;
+}
+.bodywebsite .thumbnail-variant-4 .caption {
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ padding: 16px 15px;
+ text-align: center;
+ color: #000;
+ background: #fff;
+}
+.bodywebsite .thumbnail-variant-4 .text-light {
+ color: #0d0d0d;
+}
+@media (min-width: 992px) {
+ .bodywebsite .desktop .thumbnail-variant-4 .thumbnail-image img {
+ position: relative;
+ will-change: transform;
+ opacity: 1;
+ transition: opacity .7s, transform .7s;
+ transform: scale3d(1.0001, 1.0001, 1);
+ }
+ .bodywebsite .desktop .thumbnail-variant-4 .caption,
+ .bodywebsite .desktop .thumbnail-variant-4 .caption-header {
+ transition: transform 0.55s;
+ transform: translate3d(0, 200%, 0);
+ }
+ .bodywebsite .desktop .thumbnail-variant-4 .caption-header {
+ transition-delay: 0.05s;
+ }
+ .bodywebsite .desktop .thumbnail-variant-4:hover .thumbnail-image img {
+ opacity: .9;
+ transform: scale3d(1.07, 1.07, 1);
+ }
+ .bodywebsite .desktop .thumbnail-variant-4:hover .caption,
+ .bodywebsite .desktop .thumbnail-variant-4:hover .caption-header {
+ transform: translate3d(0, 0, 0);
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .thumbnail-variant-4 .caption {
+ padding: 20px 15px;
+ }
+}
+.bodywebsite .thumbnail-profile .thumbnail-image img {
+ width: 100%;
+}
+.bodywebsite .thumbnail-profile .thumbnail-caption {
+ padding: 20px;
+ background: #f2f3f7;
+}
+.bodywebsite .thumbnail-profile .thumbnail-caption-inner {
+ margin-bottom: -12px;
+ -webkit-align-items: flex-end;
+ -ms-flex-align: end;
+ align-items: flex-end;
+ transform: translateY(-12px);
+ text-align: center;
+}
+.bodywebsite .thumbnail-profile .thumbnail-caption-inner > * {
+ display: inline-block;
+ margin-top: 12px;
+ -webkit-flex-shrink: 0;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+}
+.bodywebsite .thumbnail-profile .thumbnail-caption-inner,
+.bodywebsite .thumbnail-profile .thumbnail-caption-inner > ul {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+}
+.bodywebsite .thumbnail-profile .thumbnail-caption-inner ul {
+ position: relative;
+ margin-bottom: -3px;
+ transform: translateY(-3px);
+ -webkit-flex-grow: 2;
+ -ms-flex-positive: 2;
+ flex-grow: 2;
+}
+.bodywebsite .thumbnail-profile .thumbnail-caption-inner ul > li {
+ display: inline-block;
+ margin-top: 3px;
+ padding: 0 7px;
+}
+.bodywebsite .thumbnail-profile .thumbnail-caption-inner .btn-wrap {
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+}
+@media (min-width: 576px) {
+ .bodywebsite .thumbnail-profile .thumbnail-caption-inner,
+ .bodywebsite .thumbnail-profile .thumbnail-caption-inner ul {
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .thumbnail-profile .thumbnail-caption-inner ul {
+ -webkit-justify-content: space-around;
+ -ms-flex-pack: distribute;
+ justify-content: space-around;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .thumbnail-profile .thumbnail-caption-inner {
+ text-align: left;
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ }
+ .bodywebsite .thumbnail-profile .thumbnail-caption-inner .btn-wrap {
+ text-align: right;
+ }
+}
+@media (max-width: 767px) {
+ .bodywebsite .thumbnail-variant-2 {
+ max-width: 300px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ .bodywebsite .thumbnail-variant-3,
+ .bodywebsite .thumbnail-profile {
+ max-width: 370px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+.bodywebsite .thumbnail-block {
+ display: block;
+}
+.bodywebsite .thumbnail-block > img,
+.bodywebsite .thumbnail-block a > img {
+ width: 100%;
+ height: auto;
+}
+.bodywebsite .thumbnail-variant-5 {
+ padding: 40px 20px;
+ display: inline-block;
+}
+.bodywebsite .thumbnail-variant-5,
+.bodywebsite .thumbnail-variant-5 img {
+ transition: 0.2s ease-in-out;
+}
+@media (min-width: 992px) {
+ .bodywebsite .thumbnail-variant-5 {
+ border-top: 5px solid transparent;
+ border-bottom: 5px solid transparent;
+ }
+ .bodywebsite .thumbnail-variant-5 .thumbnail-variant-5-img-wrap {
+ position: relative;
+ display: inline-block;
+ }
+ .bodywebsite .thumbnail-variant-5 .thumbnail-variant-5-img-wrap:before {
+ content: '';
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ border-radius: 50%;
+ background: rgba(0, 0, 0, 0.4);
+ transition: 0.2s ease-in-out;
+ }
+ .bodywebsite .thumbnail-variant-5 {
+ box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.15);
+ border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ }
+ .bodywebsite .thumbnail-variant-5:hover .thumbnail-variant-5-img-wrap:before {
+ opacity: 0;
+ }
+ .bodywebsite .thumbnail-variant-5:hover img {
+ will-change: transform;
+ -webkit-transform: scale(1.18);
+ transform: scale(1.18);
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .thumbnail-variant-5 {
+ padding: 40px 50px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .thumbnail-variant-5 {
+ padding: 65px 50px;
+ }
+}
+.bodywebsite .thumbnail-variant-5 * + h2 {
+ margin-top: 36px;
+}
+.bodywebsite .thumbnail-variant-5 h2 + * {
+ margin-top: 0;
+}
+.bodywebsite .thumbnail-variant-5 .link-group + .link-group {
+ margin-top: 7px;
+}
+.bodywebsite .thumbnail-variant-5 .divider-fullwidth {
+ margin-top: 12px;
+ margin-bottom: 17px;
+}
+.bodywebsite .thumbnail-with-img * + .thumbnail-title {
+ margin-top: 22px;
+}
+.bodywebsite .thumbnail-with-img .thumbnail-title + * {
+ margin-top: 10px;
+}
+.bodywebsite .thumbnail-profile-info h4 + * {
+ margin-top: 0;
+}
+.bodywebsite .thumbnail-profile-info * + .profile-quote {
+ margin-top: 15px;
+}
+.bodywebsite .thumbnail-profile-info .profile-quote + * {
+ margin-top: 15px;
+}
+.bodywebsite .thumbnail-profile-info * + .list-progress {
+ margin-top: 35px;
+}
+@media (min-width: 992px) {
+ .bodywebsite .thumbnail-profile-info * + .profile-quote {
+ margin-top: 0;
+ }
+ .bodywebsite .thumbnail-profile-info .profile-quote + * {
+ margin-top: 0;
+ }
+}
+.bodywebsite figure img {
+ margin: 18px;
+ border: 1px solid #ccc;
+ box-shadow: 1px 1px 25px #aaa;
+ max-width: calc(44%);
+}
+.bodywebsite figure img {
+ width: 100%;
+ height: auto;
+ max-width: none;
+}
+.bodywebsite .figure .caption {
+ padding: 15px;
+}
+.bodywebsite .rd-mailform {
+ position: relative;
+}
+.bodywebsite label {
+ margin-bottom: 0;
+}
+.bodywebsite input::-webkit-autofill + .form-label {
+ display: none;
+ transition: none;
+}
+.bodywebsite .form-label,
+.bodywebsite .form-input {
+ font-weight: 400;
+}
+.bodywebsite .input-sm,
+.bodywebsite .input-lg,
+.bodywebsite .form-input {
+ font-size: 14px;
+}
+.bodywebsite .input-sm,
+.bodywebsite .input-sm:focus,
+.bodywebsite .input-lg,
+.bodywebsite .input-lg:focus,
+.bodywebsite .form-input,
+.bodywebsite .form-input:focus {
+ box-shadow: none;
+}
+.bodywebsite textarea.form-input {
+ height: 166px;
+ min-height: 52px;
+ max-height: 249px;
+ resize: vertical;
+}
+.bodywebsite .form-input {
+ height: auto;
+ min-height: 20px;
+ border: 0px solid #dedede;
+ border-radius: 0;
+ -webkit-appearance: none;
+ line-height: 24px;
+}
+.bodywebsite .form-input:focus {
+ outline: 0;
+}
+.bodywebsite .form-wrap {
+ position: relative;
+ margin-bottom: 0;
+}
+.bodywebsite .form-wrap + .form-wrap {
+ margin-top: 10px;
+}
+.bodywebsite .form-label {
+ position: absolute;
+ top: 26px;
+ left: 19px;
+ font-size: 14px;
+ color: #9f9f9f;
+ pointer-events: none;
+ z-index: 9;
+ transition: .3s;
+ transform: translateY(-50%);
+ will-change: transform;
+}
+.bodywebsite .form-label.focus {
+ opacity: 0;
+}
+.bodywebsite .form-label.auto-fill {
+ color: #9f9f9f;
+}
+@media (min-width: 768px) {
+ .bodywebsite .form-label-outside {
+ position: static;
+ margin-bottom: 8px;
+ }
+ .bodywebsite .form-label-outside,
+ .bodywebsite .form-label-outside.focus,
+ .bodywebsite .form-label-outside.auto-fill {
+ transform: none;
+ color: #9f9f9f;
+ font-size: 14px;
+ }
+}
+.bodywebsite .form-wrap-outside {
+ margin-top: 10px;
+}
+.bodywebsite .form-wrap-outside .form-label-outside {
+ position: absolute;
+ top: -15px;
+ left: 0;
+}
+.bodywebsite .form-wrap-outside .form-label-outside.focus {
+ opacity: 1;
+}
+@media (min-width: 768px) {
+ .bodywebsite .form-wrap-outside .form-label-outside {
+ top: -30px;
+ }
+}
+.bodywebsite .form-border-bottom {
+ border-bottom: 3px solid maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .form-validation {
+ position: absolute;
+ right: 10px;
+ top: 2px;
+ font-size: 11px;
+ line-height: 11px;
+ color: #fe4a21;
+ margin-top: 2px;
+ transition: .3s;
+}
+.bodywebsite form.label-outside .form-validation {
+ top: 12px;
+}
+.bodywebsite .has-error .help-block,
+.bodywebsite .has-error .control-label,
+.bodywebsite .has-error .radio,
+.bodywebsite .has-error .checkbox,
+.bodywebsite .has-error .radio-inline,
+.bodywebsite .has-error .checkbox-inline,
+.bodywebsite .has-error.radio label,
+.bodywebsite .has-error.checkbox label,
+.bodywebsite .has-error.radio-inline label,
+.bodywebsite .has-error.checkbox-inline label {
+ color: #fe4a21;
+}
+.bodywebsite .has-error .form-input:not(.form-input-impressed),
+.bodywebsite .has-error .form-input:not(.form-input-impressed):focus {
+ border-color: #fe4a21;
+ box-shadow: none;
+}
+.bodywebsite .has-error .form-input-impressed,
+.bodywebsite .has-error .form-input-impressed:focus {
+ box-shadow: inset 0 0 0 1px #fe4a21;
+}
+.bodywebsite .has-error .input-group-addon {
+ color: #fff;
+ border-color: #fe4a21;
+ background-color: #fe4a21;
+}
+.bodywebsite .form-inline .has-error ~ button[type='submit'] {
+ border-color: #fe4a21;
+ background: #fe4a21;
+}
+.bodywebsite .has-error .form-validation {
+ color: #fe4a21;
+}
+.bodywebsite .has-success .help-block,
+.bodywebsite .has-success .control-label,
+.bodywebsite .has-success .radio,
+.bodywebsite .has-success .checkbox,
+.bodywebsite .has-success .radio-inline,
+.bodywebsite .has-success .checkbox-inline,
+.bodywebsite .has-success.radio label,
+.bodywebsite .has-success.checkbox label,
+.bodywebsite .has-success.radio-inline label,
+.bodywebsite .has-success.checkbox-inline label {
+ color: #58c476;
+}
+.bodywebsite .has-success .form-input:not(.form-input-impressed),
+.bodywebsite .has-success .form-input:not(.form-input-impressed):focus {
+ border-color: #dff0d8;
+ box-shadow: none;
+}
+.bodywebsite .has-success .form-input-impressed,
+.bodywebsite .has-success .form-input-impressed:focus {
+ box-shadow: inset 0 0 0 1px #dff0d8;
+}
+.bodywebsite .has-success .input-group-addon {
+ color: #fff;
+ border-color: #dff0d8;
+ background-color: #dff0d8;
+}
+.bodywebsite .form-inline .has-success ~ button[type='submit'] {
+ border-color: #dff0d8;
+ background: #dff0d8;
+}
+.bodywebsite .has-success .form-validation {
+ color: #58c476;
+}
+.bodywebsite .has-warning .help-block,
+.bodywebsite .has-warning .control-label,
+.bodywebsite .has-warning .radio,
+.bodywebsite .has-warning .checkbox,
+.bodywebsite .has-warning .radio-inline,
+.bodywebsite .has-warning .checkbox-inline,
+.bodywebsite .has-warning.radio label,
+.bodywebsite .has-warning.checkbox label,
+.bodywebsite .has-warning.radio-inline label,
+.bodywebsite .has-warning.checkbox-inline label {
+ color: #c49558;
+}
+.bodywebsite .has-warning .form-input:not(.form-input-impressed),
+.bodywebsite .has-warning .form-input:not(.form-input-impressed):focus {
+ border-color: #fcf8e3;
+ box-shadow: none;
+}
+.bodywebsite .has-warning .form-input-impressed,
+.bodywebsite .has-warning .form-input-impressed:focus {
+ box-shadow: inset 0 0 0 1px #fcf8e3;
+}
+.bodywebsite .has-warning .input-group-addon {
+ color: #fff;
+ border-color: #fcf8e3;
+ background-color: #fcf8e3;
+}
+.bodywebsite .form-inline .has-warning ~ button[type='submit'] {
+ border-color: #fcf8e3;
+ background: #fcf8e3;
+}
+.bodywebsite .has-warning .form-validation {
+ color: #c49558;
+}
+.bodywebsite .has-info .help-block,
+.bodywebsite .has-info .control-label,
+.bodywebsite .has-info .radio,
+.bodywebsite .has-info .checkbox,
+.bodywebsite .has-info .radio-inline,
+.bodywebsite .has-info .checkbox-inline,
+.bodywebsite .has-info.radio label,
+.bodywebsite .has-info.checkbox label,
+.bodywebsite .has-info.radio-inline label,
+.bodywebsite .has-info.checkbox-inline label {
+ color: #3e9cf6;
+}
+.bodywebsite .has-info .form-input:not(.form-input-impressed),
+.bodywebsite .has-info .form-input:not(.form-input-impressed):focus {
+ border-color: #d9edf7;
+ box-shadow: none;
+}
+.bodywebsite .has-info .form-input-impressed,
+.bodywebsite .has-info .form-input-impressed:focus {
+ box-shadow: inset 0 0 0 1px #d9edf7;
+}
+.bodywebsite .has-info .input-group-addon {
+ color: #fff;
+ border-color: #d9edf7;
+ background-color: #d9edf7;
+}
+.bodywebsite .form-inline .has-info ~ button[type='submit'] {
+ border-color: #d9edf7;
+ background: #d9edf7;
+}
+.bodywebsite .has-info .form-validation {
+ color: #3e9cf6;
+}
+.bodywebsite #form-output-global {
+ position: fixed;
+ bottom: 30px;
+ left: 15px;
+ visibility: hidden;
+ transform: translateX(-500px);
+ transition: .3s all ease;
+ z-index: 9999999;
+}
+.bodywebsite #form-output-global.active {
+ transform: translateX(0);
+ visibility: visible;
+}
+@media (min-width: 576px) {
+ .bodywebsite #form-output-global {
+ left: 30px;
+ }
+}
+.bodywebsite .form-output {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ font-size: 14px;
+ line-height: 1.5;
+ margin-top: 2px;
+ transition: .3s;
+ opacity: 0;
+ visibility: hidden;
+}
+.bodywebsite .form-output.active {
+ opacity: 1;
+ visibility: visible;
+}
+.bodywebsite .form-output.error {
+ color: #fe4a21;
+}
+.bodywebsite .form-output.success {
+ color: #58c476;
+}
+.bodywebsite .radio .radio-custom,
+.bodywebsite .radio-inline .radio-custom,
+.bodywebsite .checkbox .checkbox-custom,
+.bodywebsite .checkbox-inline .checkbox-custom {
+ opacity: 0;
+}
+.bodywebsite .radio .radio-custom,
+.bodywebsite .radio .radio-custom-dummy,
+.bodywebsite .radio-inline .radio-custom,
+.bodywebsite .radio-inline .radio-custom-dummy,
+.bodywebsite .checkbox .checkbox-custom,
+.bodywebsite .checkbox .checkbox-custom-dummy,
+.bodywebsite .checkbox-inline .checkbox-custom,
+.bodywebsite .checkbox-inline .checkbox-custom-dummy {
+ position: absolute;
+ width: 18px;
+ height: 18px;
+ margin-left: -20px;
+ margin-top: 3px;
+ outline: none;
+ cursor: pointer;
+}
+.bodywebsite .radio .radio-custom-dummy,
+.bodywebsite .radio-inline .radio-custom-dummy,
+.bodywebsite .checkbox .checkbox-custom-dummy,
+.bodywebsite .checkbox-inline .checkbox-custom-dummy {
+ pointer-events: none;
+}
+.bodywebsite .radio .radio-custom-dummy:after,
+.bodywebsite .radio-inline .radio-custom-dummy:after,
+.bodywebsite .checkbox .checkbox-custom-dummy:after,
+.bodywebsite .checkbox-inline .checkbox-custom-dummy:after {
+ position: absolute;
+ opacity: 0;
+ transition: .22s;
+}
+.bodywebsite .radio .radio-custom:focus,
+.bodywebsite .radio-inline .radio-custom:focus,
+.bodywebsite .checkbox .checkbox-custom:focus,
+.bodywebsite .checkbox-inline .checkbox-custom:focus {
+ outline: none;
+}
+.bodywebsite .radio-custom:checked + .radio-custom-dummy:after,
+.bodywebsite .checkbox-custom:checked + .checkbox-custom-dummy:after {
+ opacity: 1;
+}
+.bodywebsite .radio,
+.bodywebsite .radio-inline {
+ padding-left: 30px;
+}
+.bodywebsite .radio .radio-custom-dummy,
+.bodywebsite .radio-inline .radio-custom-dummy {
+ margin-top: 2px;
+ border-radius: 50%;
+ margin-left: -30px;
+ background: transparent;
+ border: 2px solid #000;
+}
+.bodywebsite .radio .radio-custom-dummy:after,
+.bodywebsite .radio-inline .radio-custom-dummy:after {
+ content: '';
+ top: 3px;
+ right: 3px;
+ bottom: 3px;
+ left: 3px;
+ background: #00030a;
+ border-radius: 50%;
+}
+.bodywebsite .form-wrap-color .radio-inline,
+.bodywebsite .form-wrap-size .radio-inline {
+ padding-left: 0;
+}
+.bodywebsite .form-wrap-color .radio-control,
+.bodywebsite .form-wrap-size .radio-control {
+ position: relative;
+ display: block;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ margin-top: 23px;
+ margin-bottom: 23px;
+}
+.bodywebsite .form-wrap-color .radio-control:after,
+.bodywebsite .form-wrap-size .radio-control:after {
+ bottom: 0;
+}
+.bodywebsite .form-wrap-color .radio-control:after,
+.bodywebsite .form-wrap-size .radio-control:after {
+ content: '';
+ position: absolute;
+ left: 50%;
+ bottom: -23px;
+ transform: translateX(-50%);
+ width: 0;
+ max-width: 100%;
+ height: 3px;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ visibility: hidden;
+ transition: .2s;
+}
+.bodywebsite .form-wrap-color .radio-custom:checked ~ .radio-control:after,
+.bodywebsite .form-wrap-size .radio-custom:checked ~ .radio-control:after {
+ visibility: visible;
+ width: 100%;
+}
+.bodywebsite .form-wrap-color .radio-custom-dummy,
+.bodywebsite .form-wrap-size .radio-custom-dummy {
+ display: none;
+}
+.bodywebsite .form-wrap-size .radio-inline {
+ padding-left: 2px;
+ padding-right: 2px;
+}
+.bodywebsite .form-wrap-size .radio-inline + .radio-inline {
+ margin-left: 1px;
+}
+.bodywebsite .form-wrap-size .radio-control {
+ color: #9f9f9f;
+ text-align: center;
+ text-transform: uppercase;
+ transition: .2s;
+}
+.bodywebsite .form-wrap-size .radio-control:hover {
+ color: #000;
+}
+.bodywebsite .form-wrap-size .radio-custom:checked ~ .radio-control {
+ color: #000;
+}
+.bodywebsite .checkbox,
+.bodywebsite .checkbox-inline {
+ padding-left: 38px;
+ color: #000;
+}
+.bodywebsite .checkbox .checkbox-custom-dummy,
+.bodywebsite .checkbox-inline .checkbox-custom-dummy {
+ pointer-events: none;
+ border-radius: 2px;
+ margin-left: 0;
+ left: 0;
+ background: #fff;
+ box-shadow: none;
+ border: 2px solid #dedede;
+}
+.bodywebsite .checkbox .checkbox-custom-dummy:after,
+.bodywebsite .checkbox-inline .checkbox-custom-dummy:after {
+ content: '\e5ca';
+ font-family: 'Material Icons';
+ font-size: 22px;
+ line-height: 10px;
+ position: absolute;
+ top: 0;
+ left: -1px;
+ color: #2a2b2b;
+}
+.bodywebsite .checkbox-small {
+ padding-left: 26px;
+}
+.bodywebsite .checkbox-small .checkbox-custom-dummy {
+ margin-top: 6px;
+ width: 12px;
+ height: 12px;
+ border-width: 1px;
+ border-radius: 1px;
+}
+.bodywebsite .checkbox-small .checkbox-custom-dummy:after {
+ top: -1px;
+ left: -2px;
+ font-size: 18px;
+}
+.bodywebsite .textarea-lined-wrap {
+ position: relative;
+ line-height: 2.39;
+}
+.bodywebsite .textarea-lined-wrap textarea {
+ height: 203px;
+ resize: none;
+ overflow: hidden;
+ line-height: 2.39;
+ background-color: transparent;
+}
+.bodywebsite .textarea-lined-wrap-xs textarea {
+ height: 68px;
+}
+.bodywebsite .page .form-classic-bordered .form-label,
+.bodywebsite .page .form-classic-bordered .form-label-outside,
+.bodywebsite .page .form-classic-bordered .form-input {
+ color: #000;
+}
+.bodywebsite .page .form-classic-bordered .form-input {
+ border: 1px solid #dedede;
+}
+.bodywebsite .page .form-modern .form-input,
+.bodywebsite .page .form-modern .form-label {
+ color: #9f9f9f;
+}
+.bodywebsite .page .form-modern input {
+ height: auto;
+ min-height: 20px;
+}
+.bodywebsite .page .form-modern .form-input:focus {
+ border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .page .form-modern .form-input {
+ padding: 6px 0;
+ border-radius: 0;
+ border-width: 0 0 1px 0;
+ border-color: #dedede;
+ background-color: transparent;
+}
+.bodywebsite .page .form-modern .form-label {
+ left: 0;
+ top: 18px;
+}
+.bodywebsite .page .form-modern .form-validation {
+ top: auto;
+ left: auto;
+ right: 0;
+ bottom: -12px;
+ font-style: italic;
+}
+.bodywebsite .page .form-modern .has-error .help-block,
+.bodywebsite .page .form-modern .has-error .control-label,
+.bodywebsite .page .form-modern .has-error .radio,
+.bodywebsite .page .form-modern .has-error .checkbox,
+.bodywebsite .page .form-modern .has-error .radio-inline,
+.bodywebsite .page .form-modern .has-error .checkbox-inline,
+.bodywebsite .page .form-modern .has-error.radio label,
+.bodywebsite .page .form-modern .has-error.checkbox label,
+.bodywebsite .page .form-modern .has-error.radio-inline label,
+.bodywebsite .page .form-modern .has-error.checkbox-inline label {
+ color: #fe4a21;
+}
+.bodywebsite .page .form-modern .has-error .form-input:not(.form-input-impressed),
+.bodywebsite .page .form-modern .has-error .form-input:not(.form-input-impressed):focus {
+ border-color: #fe4a21;
+ box-shadow: none;
+}
+.bodywebsite .page .form-modern .has-error .form-input-impressed,
+.bodywebsite .page .form-modern .has-error .form-input-impressed:focus {
+ box-shadow: inset 0 0 0 1px #fe4a21;
+}
+.bodywebsite .page .form-modern .has-error .input-group-addon {
+ color: #fff;
+ border-color: #fe4a21;
+ background-color: #fe4a21;
+}
+.bodywebsite .form-inline .page .form-modern .has-error ~ button[type='submit'] {
+ border-color: #fe4a21;
+ background: #fe4a21;
+}
+.bodywebsite .page .form-modern .has-error .form-validation {
+ color: #fe4a21;
+}
+.bodywebsite .page .form-modern.form-darker .form-input,
+.bodywebsite .page .form-modern.form-darker .form-label {
+ color: #000;
+}
+.bodywebsite .page .form-modern.form-darker .form-label:not(.focus) + .form-input {
+ border-color: #cdcdcd;
+}
+.bodywebsite .page .form-modern.form-inverse .form-label,
+.bodywebsite .page .form-modern.form-inverse .form-input {
+ color: #9f9f9f;
+ background-color: transparent;
+}
+.bodywebsite .page .form-modern.form-inverse .form-label.text-white-05,
+.bodywebsite .page .form-modern.form-inverse .form-input.text-white-05 {
+ color: rgba(255, 255, 255, 0.5);
+}
+.bodywebsite .stacktable {
+ width: 100%;
+ text-align: left;
+}
+.bodywebsite .st-head-row {
+ padding-top: 1em;
+}
+.bodywebsite .st-head-row.st-head-row-main {
+ font-size: 1.5em;
+ padding-top: 0;
+}
+.bodywebsite .st-key {
+ width: 49%;
+ text-align: right;
+ padding-right: 1%;
+}
+.bodywebsite .st-val {
+ width: 49%;
+ padding-left: 1%;
+}
+.bodywebsite .stacktable.large-only {
+ display: none;
+}
+.bodywebsite .stacktable.small-only {
+ display: table;
+}
+@media (min-width: 768px) {
+ .bodywebsite .stacktable.large-only {
+ display: table;
+ }
+ .bodywebsite .stacktable.small-only {
+ display: none;
+ }
+}
+.bodywebsite .section-relative {
+ position: relative;
+}
+.bodywebsite #sectionfooter h4,
+.bodywebsite #sectiontestimonies h1 {
+ color: #fff;
+}
+@media (min-width: 768px) {
+ .bodywebsite .section-with-counters {
+ padding-top: 1px;
+ padding-bottom: 1px;
+ }
+ .bodywebsite .section-with-counters > div {
+ position: relative;
+ box-shadow: 2px 2px 27px 0px rgba(1, 3, 4, 0.35);
+ z-index: 2;
+ margin-top: -30px;
+ margin-bottom: -30px;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .section-image-aside {
+ position: relative;
+ }
+}
+.bodywebsite .section-image-aside-img {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ width: 190%;
+ -webkit-background-size: cover;
+ background-size: cover;
+}
+@media (min-width: 768px) {
+ .bodywebsite .section-image-aside-img {
+ width: 50vw;
+ }
+}
+.bodywebsite .section-image-aside-left .section-image-aside-img {
+ right: -50%;
+}
+@media (min-width: 768px) {
+ .bodywebsite .section-image-aside-left .section-image-aside-img {
+ right: 0;
+ }
+}
+.bodywebsite .section-image-aside-right .section-image-aside-img {
+ left: -50%;
+}
+@media (min-width: 768px) {
+ .bodywebsite .section-image-aside-right .section-image-aside-img {
+ left: 0;
+ }
+}
+.bodywebsite .section-15 {
+ padding-top: 15px;
+ padding-bottom: 15px;
+}
+.bodywebsite .section-30 {
+ padding-top: 30px;
+ padding-bottom: 30px;
+}
+.bodywebsite .section-35 {
+ padding-top: 35px;
+ padding-bottom: 35px;
+}
+.bodywebsite .section-40 {
+ padding-top: 40px;
+ padding-bottom: 40px;
+}
+.bodywebsite .section-45 {
+ padding-top: 45px;
+ padding-bottom: 45px;
+}
+.bodywebsite .section-50 {
+ padding-top: 50px;
+ padding-bottom: 50px;
+}
+.bodywebsite .section-60 {
+ padding-top: 60px;
+ padding-bottom: 60px;
+}
+.bodywebsite .section-66 {
+ padding-top: 66px;
+ padding-bottom: 66px;
+}
+.bodywebsite .section-75 {
+ padding-top: 75px;
+ padding-bottom: 75px;
+}
+.bodywebsite .section-90 {
+ padding-top: 90px;
+ padding-bottom: 90px;
+}
+.bodywebsite .section-100 {
+ padding-top: 100px;
+ padding-bottom: 100px;
+}
+.bodywebsite .section-120 {
+ padding-top: 120px;
+ padding-bottom: 120px;
+}
+.bodywebsite .section-130 {
+ padding-top: 130px;
+ padding-bottom: 130px;
+}
+.bodywebsite .section-145 {
+ padding-top: 145px;
+ padding-bottom: 145px;
+}
+.bodywebsite .section-165 {
+ padding-top: 165px;
+ padding-bottom: 165px;
+}
+@media (min-width: 576px) {
+ .bodywebsite .section-sm-15 {
+ padding-top: 15px;
+ padding-bottom: 15px;
+ }
+ .bodywebsite .section-sm-30 {
+ padding-top: 30px;
+ padding-bottom: 30px;
+ }
+ .bodywebsite .section-sm-35 {
+ padding-top: 35px;
+ padding-bottom: 35px;
+ }
+ .bodywebsite .section-sm-40 {
+ padding-top: 40px;
+ padding-bottom: 40px;
+ }
+ .bodywebsite .section-sm-45 {
+ padding-top: 45px;
+ padding-bottom: 45px;
+ }
+ .bodywebsite .section-sm-50 {
+ padding-top: 50px;
+ padding-bottom: 50px;
+ }
+ .bodywebsite .section-sm-60 {
+ padding-top: 60px;
+ padding-bottom: 60px;
+ }
+ .bodywebsite .section-sm-66 {
+ padding-top: 66px;
+ padding-bottom: 66px;
+ }
+ .bodywebsite .section-sm-75 {
+ padding-top: 75px;
+ padding-bottom: 75px;
+ }
+ .bodywebsite .section-sm-90 {
+ padding-top: 90px;
+ padding-bottom: 90px;
+ }
+ .bodywebsite .section-sm-100 {
+ padding-top: 100px;
+ padding-bottom: 100px;
+ }
+ .bodywebsite .section-sm-120 {
+ padding-top: 120px;
+ padding-bottom: 120px;
+ }
+ .bodywebsite .section-sm-130 {
+ padding-top: 130px;
+ padding-bottom: 130px;
+ }
+ .bodywebsite .section-sm-145 {
+ padding-top: 145px;
+ padding-bottom: 145px;
+ }
+ .bodywebsite .section-sm-165 {
+ padding-top: 165px;
+ padding-bottom: 165px;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .section-md-15 {
+ padding-top: 15px;
+ padding-bottom: 15px;
+ }
+ .bodywebsite .section-md-30 {
+ padding-top: 30px;
+ padding-bottom: 30px;
+ }
+ .bodywebsite .section-md-35 {
+ padding-top: 35px;
+ padding-bottom: 35px;
+ }
+ .bodywebsite .section-md-40 {
+ padding-top: 40px;
+ padding-bottom: 40px;
+ }
+ .bodywebsite .section-md-45 {
+ padding-top: 45px;
+ padding-bottom: 45px;
+ }
+ .bodywebsite .section-md-50 {
+ padding-top: 50px;
+ padding-bottom: 50px;
+ }
+ .bodywebsite .section-md-60 {
+ padding-top: 60px;
+ padding-bottom: 60px;
+ }
+ .bodywebsite .section-md-66 {
+ padding-top: 66px;
+ padding-bottom: 66px;
+ }
+ .bodywebsite .section-md-75 {
+ padding-top: 75px;
+ padding-bottom: 75px;
+ }
+ .bodywebsite .section-md-90 {
+ padding-top: 90px;
+ padding-bottom: 90px;
+ }
+ .bodywebsite .section-md-100 {
+ padding-top: 100px;
+ padding-bottom: 100px;
+ }
+ .bodywebsite .section-md-120 {
+ padding-top: 120px;
+ padding-bottom: 120px;
+ }
+ .bodywebsite .section-md-130 {
+ padding-top: 130px;
+ padding-bottom: 130px;
+ }
+ .bodywebsite .section-md-145 {
+ padding-top: 145px;
+ padding-bottom: 145px;
+ }
+ .bodywebsite .section-md-165 {
+ padding-top: 165px;
+ padding-bottom: 165px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .section-lg-15 {
+ padding-top: 15px;
+ padding-bottom: 15px;
+ }
+ .bodywebsite .section-lg-30 {
+ padding-top: 30px;
+ padding-bottom: 30px;
+ }
+ .bodywebsite .section-lg-35 {
+ padding-top: 35px;
+ padding-bottom: 35px;
+ }
+ .bodywebsite .section-lg-40 {
+ padding-top: 40px;
+ padding-bottom: 40px;
+ }
+ .bodywebsite .section-lg-45 {
+ padding-top: 45px;
+ padding-bottom: 45px;
+ }
+ .bodywebsite .section-lg-50 {
+ padding-top: 50px;
+ padding-bottom: 50px;
+ }
+ .bodywebsite .section-lg-60 {
+ padding-top: 60px;
+ padding-bottom: 60px;
+ }
+ .bodywebsite .section-lg-66 {
+ padding-top: 66px;
+ padding-bottom: 66px;
+ }
+ .bodywebsite .section-lg-75 {
+ padding-top: 75px;
+ padding-bottom: 75px;
+ }
+ .bodywebsite .section-lg-90 {
+ padding-top: 90px;
+ padding-bottom: 90px;
+ }
+ .bodywebsite .section-lg-100 {
+ padding-top: 100px;
+ padding-bottom: 100px;
+ }
+ .bodywebsite .section-lg-120 {
+ padding-top: 120px;
+ padding-bottom: 120px;
+ }
+ .bodywebsite .section-lg-130 {
+ padding-top: 130px;
+ padding-bottom: 130px;
+ }
+ .bodywebsite .section-lg-145 {
+ padding-top: 145px;
+ padding-bottom: 145px;
+ }
+ .bodywebsite .section-lg-165 {
+ padding-top: 165px;
+ padding-bottom: 165px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .section-xl-15 {
+ padding-top: 15px;
+ padding-bottom: 15px;
+ }
+ .bodywebsite .section-xl-30 {
+ padding-top: 30px;
+ padding-bottom: 30px;
+ }
+ .bodywebsite .section-xl-35 {
+ padding-top: 35px;
+ padding-bottom: 35px;
+ }
+ .bodywebsite .section-xl-40 {
+ padding-top: 40px;
+ padding-bottom: 40px;
+ }
+ .bodywebsite .section-xl-45 {
+ padding-top: 45px;
+ padding-bottom: 45px;
+ }
+ .bodywebsite .section-xl-50 {
+ padding-top: 50px;
+ padding-bottom: 50px;
+ }
+ .bodywebsite .section-xl-60 {
+ padding-top: 60px;
+ padding-bottom: 60px;
+ }
+ .bodywebsite .section-xl-66 {
+ padding-top: 66px;
+ padding-bottom: 66px;
+ }
+ .bodywebsite .section-xl-75 {
+ padding-top: 75px;
+ padding-bottom: 75px;
+ }
+ .bodywebsite .section-xl-90 {
+ padding-top: 90px;
+ padding-bottom: 90px;
+ }
+ .bodywebsite .section-xl-100 {
+ padding-top: 100px;
+ padding-bottom: 100px;
+ }
+ .bodywebsite .section-xl-120 {
+ padding-top: 120px;
+ padding-bottom: 120px;
+ }
+ .bodywebsite .section-xl-130 {
+ padding-top: 130px;
+ padding-bottom: 130px;
+ }
+ .bodywebsite .section-xl-145 {
+ padding-top: 145px;
+ padding-bottom: 145px;
+ }
+ .bodywebsite .section-xl-165 {
+ padding-top: 165px;
+ padding-bottom: 165px;
+ }
+}
+@media (min-width: 1800px) {
+ .bodywebsite .section-xxl-15 {
+ padding-top: 15px;
+ padding-bottom: 15px;
+ }
+ .bodywebsite .section-xxl-30 {
+ padding-top: 30px;
+ padding-bottom: 30px;
+ }
+ .bodywebsite .section-xxl-35 {
+ padding-top: 35px;
+ padding-bottom: 35px;
+ }
+ .bodywebsite .section-xxl-40 {
+ padding-top: 40px;
+ padding-bottom: 40px;
+ }
+ .bodywebsite .section-xxl-45 {
+ padding-top: 45px;
+ padding-bottom: 45px;
+ }
+ .bodywebsite .section-xxl-50 {
+ padding-top: 50px;
+ padding-bottom: 50px;
+ }
+ .bodywebsite .section-xxl-60 {
+ padding-top: 60px;
+ padding-bottom: 60px;
+ }
+ .bodywebsite .section-xxl-66 {
+ padding-top: 66px;
+ padding-bottom: 66px;
+ }
+ .bodywebsite .section-xxl-75 {
+ padding-top: 75px;
+ padding-bottom: 75px;
+ }
+ .bodywebsite .section-xxl-90 {
+ padding-top: 90px;
+ padding-bottom: 90px;
+ }
+ .bodywebsite .section-xxl-100 {
+ padding-top: 100px;
+ padding-bottom: 100px;
+ }
+ .bodywebsite .section-xxl-120 {
+ padding-top: 120px;
+ padding-bottom: 120px;
+ }
+ .bodywebsite .section-xxl-130 {
+ padding-top: 130px;
+ padding-bottom: 130px;
+ }
+ .bodywebsite .section-xxl-145 {
+ padding-top: 145px;
+ padding-bottom: 145px;
+ }
+ .bodywebsite .section-xxl-165 {
+ padding-top: 165px;
+ padding-bottom: 165px;
+ }
+}
+.bodywebsite .section-top-15 {
+ padding-top: 15px;
+}
+.bodywebsite .section-top-30 {
+ padding-top: 30px;
+}
+.bodywebsite .section-top-35 {
+ padding-top: 35px;
+}
+.bodywebsite .section-top-40 {
+ padding-top: 40px;
+}
+.bodywebsite .section-top-45 {
+ padding-top: 45px;
+}
+.bodywebsite .section-top-50 {
+ padding-top: 50px;
+}
+.bodywebsite .section-top-60 {
+ padding-top: 60px;
+}
+.bodywebsite .section-top-66 {
+ padding-top: 66px;
+}
+.bodywebsite .section-top-75 {
+ padding-top: 75px;
+}
+.bodywebsite .section-top-90 {
+ padding-top: 90px;
+}
+.bodywebsite .section-top-100 {
+ padding-top: 100px;
+}
+.bodywebsite .section-top-120 {
+ padding-top: 120px;
+}
+.bodywebsite .section-top-130 {
+ padding-top: 130px;
+}
+.bodywebsite .section-top-145 {
+ padding-top: 145px;
+}
+.bodywebsite .section-top-165 {
+ padding-top: 165px;
+}
+@media (min-width: 576px) {
+ .bodywebsite .section-sm-top-15 {
+ padding-top: 15px;
+ }
+ .bodywebsite .section-sm-top-30 {
+ padding-top: 30px;
+ }
+ .bodywebsite .section-sm-top-35 {
+ padding-top: 35px;
+ }
+ .bodywebsite .section-sm-top-40 {
+ padding-top: 40px;
+ }
+ .bodywebsite .section-sm-top-45 {
+ padding-top: 45px;
+ }
+ .bodywebsite .section-sm-top-50 {
+ padding-top: 50px;
+ }
+ .bodywebsite .section-sm-top-60 {
+ padding-top: 60px;
+ }
+ .bodywebsite .section-sm-top-66 {
+ padding-top: 66px;
+ }
+ .bodywebsite .section-sm-top-75 {
+ padding-top: 75px;
+ }
+ .bodywebsite .section-sm-top-90 {
+ padding-top: 90px;
+ }
+ .bodywebsite .section-sm-top-100 {
+ padding-top: 100px;
+ }
+ .bodywebsite .section-sm-top-120 {
+ padding-top: 120px;
+ }
+ .bodywebsite .section-sm-top-130 {
+ padding-top: 130px;
+ }
+ .bodywebsite .section-sm-top-145 {
+ padding-top: 145px;
+ }
+ .bodywebsite .section-sm-top-165 {
+ padding-top: 165px;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .section-md-top-15 {
+ padding-top: 15px;
+ }
+ .bodywebsite .section-md-top-30 {
+ padding-top: 30px;
+ }
+ .bodywebsite .section-md-top-35 {
+ padding-top: 35px;
+ }
+ .bodywebsite .section-md-top-40 {
+ padding-top: 40px;
+ }
+ .bodywebsite .section-md-top-45 {
+ padding-top: 45px;
+ }
+ .bodywebsite .section-md-top-50 {
+ padding-top: 50px;
+ }
+ .bodywebsite .section-md-top-60 {
+ padding-top: 60px;
+ }
+ .bodywebsite .section-md-top-66 {
+ padding-top: 66px;
+ }
+ .bodywebsite .section-md-top-75 {
+ padding-top: 75px;
+ }
+ .bodywebsite .section-md-top-90 {
+ padding-top: 90px;
+ }
+ .bodywebsite .section-md-top-100 {
+ padding-top: 100px;
+ }
+ .bodywebsite .section-md-top-120 {
+ padding-top: 120px;
+ }
+ .bodywebsite .section-md-top-130 {
+ padding-top: 130px;
+ }
+ .bodywebsite .section-md-top-145 {
+ padding-top: 145px;
+ }
+ .bodywebsite .section-md-top-165 {
+ padding-top: 165px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .section-lg-top-15 {
+ padding-top: 15px;
+ }
+ .bodywebsite .section-lg-top-30 {
+ padding-top: 30px;
+ }
+ .bodywebsite .section-lg-top-35 {
+ padding-top: 35px;
+ }
+ .bodywebsite .section-lg-top-40 {
+ padding-top: 40px;
+ }
+ .bodywebsite .section-lg-top-45 {
+ padding-top: 45px;
+ }
+ .bodywebsite .section-lg-top-50 {
+ padding-top: 50px;
+ }
+ .bodywebsite .section-lg-top-60 {
+ padding-top: 60px;
+ }
+ .bodywebsite .section-lg-top-66 {
+ padding-top: 66px;
+ }
+ .bodywebsite .section-lg-top-75 {
+ padding-top: 75px;
+ }
+ .bodywebsite .section-lg-top-90 {
+ padding-top: 90px;
+ }
+ .bodywebsite .section-lg-top-100 {
+ padding-top: 100px;
+ }
+ .bodywebsite .section-lg-top-120 {
+ padding-top: 120px;
+ }
+ .bodywebsite .section-lg-top-130 {
+ padding-top: 130px;
+ }
+ .bodywebsite .section-lg-top-145 {
+ padding-top: 145px;
+ }
+ .bodywebsite .section-lg-top-165 {
+ padding-top: 165px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .section-xl-top-15 {
+ padding-top: 15px;
+ }
+ .bodywebsite .section-xl-top-30 {
+ padding-top: 30px;
+ }
+ .bodywebsite .section-xl-top-35 {
+ padding-top: 35px;
+ }
+ .bodywebsite .section-xl-top-40 {
+ padding-top: 40px;
+ }
+ .bodywebsite .section-xl-top-45 {
+ padding-top: 45px;
+ }
+ .bodywebsite .section-xl-top-50 {
+ padding-top: 50px;
+ }
+ .bodywebsite .section-xl-top-60 {
+ padding-top: 60px;
+ }
+ .bodywebsite .section-xl-top-66 {
+ padding-top: 66px;
+ }
+ .bodywebsite .section-xl-top-75 {
+ padding-top: 75px;
+ }
+ .bodywebsite .section-xl-top-90 {
+ padding-top: 90px;
+ }
+ .bodywebsite .section-xl-top-100 {
+ padding-top: 100px;
+ }
+ .bodywebsite .section-xl-top-120 {
+ padding-top: 120px;
+ }
+ .bodywebsite .section-xl-top-130 {
+ padding-top: 130px;
+ }
+ .bodywebsite .section-xl-top-145 {
+ padding-top: 145px;
+ }
+ .bodywebsite .section-xl-top-165 {
+ padding-top: 165px;
+ }
+}
+@media (min-width: 1800px) {
+ .bodywebsite .section-xxl-top-15 {
+ padding-top: 15px;
+ }
+ .bodywebsite .section-xxl-top-30 {
+ padding-top: 30px;
+ }
+ .bodywebsite .section-xxl-top-35 {
+ padding-top: 35px;
+ }
+ .bodywebsite .section-xxl-top-40 {
+ padding-top: 40px;
+ }
+ .bodywebsite .section-xxl-top-45 {
+ padding-top: 45px;
+ }
+ .bodywebsite .section-xxl-top-50 {
+ padding-top: 50px;
+ }
+ .bodywebsite .section-xxl-top-60 {
+ padding-top: 60px;
+ }
+ .bodywebsite .section-xxl-top-66 {
+ padding-top: 66px;
+ }
+ .bodywebsite .section-xxl-top-75 {
+ padding-top: 75px;
+ }
+ .bodywebsite .section-xxl-top-90 {
+ padding-top: 90px;
+ }
+ .bodywebsite .section-xxl-top-100 {
+ padding-top: 100px;
+ }
+ .bodywebsite .section-xxl-top-120 {
+ padding-top: 120px;
+ }
+ .bodywebsite .section-xxl-top-130 {
+ padding-top: 130px;
+ }
+ .bodywebsite .section-xxl-top-145 {
+ padding-top: 145px;
+ }
+ .bodywebsite .section-xxl-top-165 {
+ padding-top: 165px;
+ }
+}
+.bodywebsite .section-bottom-15 {
+ padding-bottom: 15px;
+}
+.bodywebsite .section-bottom-30 {
+ padding-bottom: 30px;
+}
+.bodywebsite .section-bottom-35 {
+ padding-bottom: 35px;
+}
+.bodywebsite .section-bottom-40 {
+ padding-bottom: 40px;
+}
+.bodywebsite .section-bottom-45 {
+ padding-bottom: 45px;
+}
+.bodywebsite .section-bottom-50 {
+ padding-bottom: 50px;
+}
+.bodywebsite .section-bottom-60 {
+ padding-bottom: 60px;
+}
+.bodywebsite .section-bottom-66 {
+ padding-bottom: 66px;
+}
+.bodywebsite .section-bottom-75 {
+ padding-bottom: 75px;
+}
+.bodywebsite .section-bottom-90 {
+ padding-bottom: 90px;
+}
+.bodywebsite .section-bottom-100 {
+ padding-bottom: 100px;
+}
+.bodywebsite .section-bottom-120 {
+ padding-bottom: 120px;
+}
+.bodywebsite .section-bottom-130 {
+ padding-bottom: 130px;
+}
+.bodywebsite .section-bottom-145 {
+ padding-bottom: 145px;
+}
+.bodywebsite .section-bottom-165 {
+ padding-bottom: 165px;
+}
+@media (min-width: 576px) {
+ .bodywebsite .section-sm-bottom-15 {
+ padding-bottom: 15px;
+ }
+ .bodywebsite .section-sm-bottom-30 {
+ padding-bottom: 30px;
+ }
+ .bodywebsite .section-sm-bottom-35 {
+ padding-bottom: 35px;
+ }
+ .bodywebsite .section-sm-bottom-40 {
+ padding-bottom: 40px;
+ }
+ .bodywebsite .section-sm-bottom-45 {
+ padding-bottom: 45px;
+ }
+ .bodywebsite .section-sm-bottom-50 {
+ padding-bottom: 50px;
+ }
+ .bodywebsite .section-sm-bottom-60 {
+ padding-bottom: 60px;
+ }
+ .bodywebsite .section-sm-bottom-66 {
+ padding-bottom: 66px;
+ }
+ .bodywebsite .section-sm-bottom-75 {
+ padding-bottom: 75px;
+ }
+ .bodywebsite .section-sm-bottom-90 {
+ padding-bottom: 90px;
+ }
+ .bodywebsite .section-sm-bottom-100 {
+ padding-bottom: 100px;
+ }
+ .bodywebsite .section-sm-bottom-120 {
+ padding-bottom: 120px;
+ }
+ .bodywebsite .section-sm-bottom-130 {
+ padding-bottom: 130px;
+ }
+ .bodywebsite .section-sm-bottom-145 {
+ padding-bottom: 145px;
+ }
+ .bodywebsite .section-sm-bottom-165 {
+ padding-bottom: 165px;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .section-md-bottom-15 {
+ padding-bottom: 15px;
+ }
+ .bodywebsite .section-md-bottom-30 {
+ padding-bottom: 30px;
+ }
+ .bodywebsite .section-md-bottom-35 {
+ padding-bottom: 35px;
+ }
+ .bodywebsite .section-md-bottom-40 {
+ padding-bottom: 40px;
+ }
+ .bodywebsite .section-md-bottom-45 {
+ padding-bottom: 45px;
+ }
+ .bodywebsite .section-md-bottom-50 {
+ padding-bottom: 50px;
+ }
+ .bodywebsite .section-md-bottom-60 {
+ padding-bottom: 60px;
+ }
+ .bodywebsite .section-md-bottom-66 {
+ padding-bottom: 66px;
+ }
+ .bodywebsite .section-md-bottom-75 {
+ padding-bottom: 75px;
+ }
+ .bodywebsite .section-md-bottom-90 {
+ padding-bottom: 90px;
+ }
+ .bodywebsite .section-md-bottom-100 {
+ padding-bottom: 100px;
+ }
+ .bodywebsite .section-md-bottom-120 {
+ padding-bottom: 120px;
+ }
+ .bodywebsite .section-md-bottom-130 {
+ padding-bottom: 130px;
+ }
+ .bodywebsite .section-md-bottom-145 {
+ padding-bottom: 145px;
+ }
+ .bodywebsite .section-md-bottom-165 {
+ padding-bottom: 165px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .section-lg-bottom-15 {
+ padding-bottom: 15px;
+ }
+ .bodywebsite .section-lg-bottom-30 {
+ padding-bottom: 30px;
+ }
+ .bodywebsite .section-lg-bottom-35 {
+ padding-bottom: 35px;
+ }
+ .bodywebsite .section-lg-bottom-40 {
+ padding-bottom: 40px;
+ }
+ .bodywebsite .section-lg-bottom-45 {
+ padding-bottom: 45px;
+ }
+ .bodywebsite .section-lg-bottom-50 {
+ padding-bottom: 50px;
+ }
+ .bodywebsite .section-lg-bottom-60 {
+ padding-bottom: 60px;
+ }
+ .bodywebsite .section-lg-bottom-66 {
+ padding-bottom: 66px;
+ }
+ .bodywebsite .section-lg-bottom-75 {
+ padding-bottom: 75px;
+ }
+ .bodywebsite .section-lg-bottom-90 {
+ padding-bottom: 90px;
+ }
+ .bodywebsite .section-lg-bottom-100 {
+ padding-bottom: 100px;
+ }
+ .bodywebsite .section-lg-bottom-120 {
+ padding-bottom: 120px;
+ }
+ .bodywebsite .section-lg-bottom-130 {
+ padding-bottom: 130px;
+ }
+ .bodywebsite .section-lg-bottom-145 {
+ padding-bottom: 145px;
+ }
+ .bodywebsite .section-lg-bottom-165 {
+ padding-bottom: 165px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .section-xl-bottom-15 {
+ padding-bottom: 15px;
+ }
+ .bodywebsite .section-xl-bottom-30 {
+ padding-bottom: 30px;
+ }
+ .bodywebsite .section-xl-bottom-35 {
+ padding-bottom: 35px;
+ }
+ .bodywebsite .section-xl-bottom-40 {
+ padding-bottom: 40px;
+ }
+ .bodywebsite .section-xl-bottom-45 {
+ padding-bottom: 45px;
+ }
+ .bodywebsite .section-xl-bottom-50 {
+ padding-bottom: 50px;
+ }
+ .bodywebsite .section-xl-bottom-60 {
+ padding-bottom: 60px;
+ }
+ .bodywebsite .section-xl-bottom-66 {
+ padding-bottom: 66px;
+ }
+ .bodywebsite .section-xl-bottom-75 {
+ padding-bottom: 75px;
+ }
+ .bodywebsite .section-xl-bottom-90 {
+ padding-bottom: 90px;
+ }
+ .bodywebsite .section-xl-bottom-100 {
+ padding-bottom: 100px;
+ }
+ .bodywebsite .section-xl-bottom-120 {
+ padding-bottom: 120px;
+ }
+ .bodywebsite .section-xl-bottom-130 {
+ padding-bottom: 130px;
+ }
+ .bodywebsite .section-xl-bottom-145 {
+ padding-bottom: 145px;
+ }
+ .bodywebsite .section-xl-bottom-165 {
+ padding-bottom: 165px;
+ }
+}
+@media (min-width: 1800px) {
+ .bodywebsite .section-xxl-bottom-15 {
+ padding-bottom: 15px;
+ }
+ .bodywebsite .section-xxl-bottom-30 {
+ padding-bottom: 30px;
+ }
+ .bodywebsite .section-xxl-bottom-35 {
+ padding-bottom: 35px;
+ }
+ .bodywebsite .section-xxl-bottom-40 {
+ padding-bottom: 40px;
+ }
+ .bodywebsite .section-xxl-bottom-45 {
+ padding-bottom: 45px;
+ }
+ .bodywebsite .section-xxl-bottom-50 {
+ padding-bottom: 50px;
+ }
+ .bodywebsite .section-xxl-bottom-60 {
+ padding-bottom: 60px;
+ }
+ .bodywebsite .section-xxl-bottom-66 {
+ padding-bottom: 66px;
+ }
+ .bodywebsite .section-xxl-bottom-75 {
+ padding-bottom: 75px;
+ }
+ .bodywebsite .section-xxl-bottom-90 {
+ padding-bottom: 90px;
+ }
+ .bodywebsite .section-xxl-bottom-100 {
+ padding-bottom: 100px;
+ }
+ .bodywebsite .section-xxl-bottom-120 {
+ padding-bottom: 120px;
+ }
+ .bodywebsite .section-xxl-bottom-130 {
+ padding-bottom: 130px;
+ }
+ .bodywebsite .section-xxl-bottom-145 {
+ padding-bottom: 145px;
+ }
+ .bodywebsite .section-xxl-bottom-165 {
+ padding-bottom: 165px;
+ }
+}
+html .bodywebsite .group {
+ -webkit-transform: translateY(-15px);
+ transform: translateY(-15px);
+ margin-bottom: -15px;
+ margin-left: -15px;
+}
+html .bodywebsite .group > *,
+html .bodywebsite .group > *:first-child {
+ display: inline-block;
+ margin-top: 15px;
+ margin-left: 15px;
+}
+html .bodywebsite .group-xs {
+ -webkit-transform: translateY(-5px);
+ transform: translateY(-5px);
+ margin-bottom: -5px;
+ margin-left: -5px;
+}
+html .bodywebsite .group-xs > *,
+html .bodywebsite .group-xs > *:first-child {
+ display: inline-block;
+ margin-top: 5px;
+ margin-left: 5px;
+}
+html .bodywebsite .group-sm {
+ -webkit-transform: translateY(-10px);
+ transform: translateY(-10px);
+ margin-bottom: -10px;
+ margin-left: -10px;
+}
+html .bodywebsite .group-sm > *,
+html .bodywebsite .group-sm > *:first-child {
+ display: inline-block;
+ margin-top: 10px;
+ margin-left: 10px;
+}
+html .bodywebsite .group-md {
+ -webkit-transform: translateY(-15px);
+ transform: translateY(-15px);
+ margin-bottom: -15px;
+ margin-left: -15px;
+}
+html .bodywebsite .group-md > *,
+html .bodywebsite .group-md > *:first-child {
+ display: inline-block;
+ margin-top: 15px;
+ margin-left: 15px;
+}
+html .bodywebsite .group-lg {
+ -webkit-transform: translateY(-20px);
+ transform: translateY(-20px);
+ margin-bottom: -20px;
+ margin-left: -20px;
+}
+html .bodywebsite .group-lg > *,
+html .bodywebsite .group-lg > *:first-child {
+ display: inline-block;
+ margin-top: 20px;
+ margin-left: 20px;
+}
+html .bodywebsite .group-xl {
+ -webkit-transform: translateY(-30px);
+ transform: translateY(-30px);
+ margin-bottom: -30px;
+ margin-left: -30px;
+}
+html .bodywebsite .group-xl > *,
+html .bodywebsite .group-xl > *:first-child {
+ display: inline-block;
+ margin-top: 30px;
+ margin-left: 30px;
+}
+html .bodywebsite .group-top > *,
+html .bodywebsite .group-top > *:first-child {
+ vertical-align: top;
+}
+html .bodywebsite .group-middle > *,
+html .bodywebsite .group-middle > *:first-child {
+ vertical-align: middle;
+}
+html .bodywebsite .group-bottom > *,
+html .bodywebsite .group-bottom > *:first-child {
+ vertical-align: bottom;
+}
+html .bodywebsite .group-inline > * {
+ display: inline;
+}
+html .bodywebsite .group-inline > *:not(:last-child) {
+ margin-right: .25em;
+}
+html .bodywebsite .group-xl-responsive {
+ -webkit-transform: translateY(-18px);
+ transform: translateY(-18px);
+ margin-bottom: -18px;
+ margin-left: -18px;
+}
+html .bodywebsite .group-xl-responsive > *,
+html .bodywebsite .group-xl-responsive > *:first-child {
+ display: inline-block;
+ margin-top: 18px;
+ margin-left: 18px;
+}
+@media (min-width: 768px) {
+ html .bodywebsite .group-xl-responsive {
+ -webkit-transform: translateY(-30px);
+ transform: translateY(-30px);
+ margin-bottom: -30px;
+ margin-left: -30px;
+ }
+ html .bodywebsite .group-xl-responsive > *,
+ html .bodywebsite .group-xl-responsive > *:first-child {
+ display: inline-block;
+ margin-top: 30px;
+ margin-left: 30px;
+ }
+}
+.bodywebsite .group-flex-center {
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+}
+.bodywebsite .relative {
+ position: relative;
+}
+.bodywebsite .static {
+ position: static;
+}
+.bodywebsite .block-top-level {
+ position: relative;
+ z-index: 3;
+}
+.bodywebsite .height-fill {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -webkit-align-items: stretch;
+ -ms-flex-align: stretch;
+ align-items: stretch;
+}
+.bodywebsite .height-fill > * {
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+}
+.bodywebsite .centered {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+}
+.bodywebsite .align-bottom {
+ -webkit-align-self: flex-end;
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+}
+.bodywebsite .block-centered {
+ margin-left: auto;
+ margin-right: auto;
+}
+@media (max-width: 767px) {
+ .bodywebsite .responsive-centered {
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+.bodywebsite .overflow-hidden {
+ overflow: hidden;
+}
+.bodywebsite .page .white-space-normal {
+ white-space: normal;
+}
+.bodywebsite * + h1,
+.bodywebsite * + .h1 {
+ margin-top: 20px;
+}
+@media (min-width: 768px) {
+ .bodywebsite * + h1,
+ .bodywebsite * + .h1 {
+ margin-top: 27px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite * + h1,
+ .bodywebsite * + .h1 {
+ margin-top: 34px;
+ }
+}
+.bodywebsite * + h2,
+.bodywebsite * + .h2 {
+ margin-top: 25px;
+}
+.bodywebsite * + h3,
+.bodywebsite * + .h3 {
+ margin-top: 17px;
+}
+.bodywebsite * + h4,
+.bodywebsite * + .h4 {
+ margin-top: 15px;
+}
+.bodywebsite h1 + *,
+.bodywebsite .h1 + * {
+ margin-top: 25px;
+}
+.bodywebsite h2 + *,
+.bodywebsite .h2 + * {
+ margin-top: 18px;
+}
+.bodywebsite h3 + *,
+.bodywebsite .h3 + * {
+ margin-top: 19px;
+}
+.bodywebsite h4 + *,
+.bodywebsite .h4 + * {
+ margin-top: 18px;
+}
+.bodywebsite * + p,
+.bodywebsite * + p {
+ margin-top: 14px;
+}
+.bodywebsite * + .text-big {
+ margin-top: 20px;
+}
+.bodywebsite hr + * {
+ margin-top: 18px;
+}
+@media (min-width: 1200px) {
+ .bodywebsite hr + * {
+ margin-top: 26px;
+ }
+}
+.bodywebsite * + .big {
+ margin-top: 6px;
+}
+.bodywebsite * + .text-large {
+ margin-top: 10px;
+}
+.bodywebsite * + .text-bigger {
+ margin-top: 28px;
+}
+.bodywebsite * + .btn {
+ margin-top: 30px;
+}
+@media (min-width: 1200px) {
+ .bodywebsite * + .btn {
+ margin-top: 44px;
+ }
+}
+.bodywebsite * + .link {
+ margin-top: 18px;
+}
+.bodywebsite * + .contact-info {
+ margin-top: 16px;
+}
+.bodywebsite * + .list-inline {
+ margin-top: 32px;
+}
+.bodywebsite * + .list-terms {
+ margin-top: 42px;
+}
+@media (min-width: 1200px) {
+ .bodywebsite * + .list-terms {
+ margin-top: 62px;
+ }
+}
+.bodywebsite * + .list-marked,
+.bodywebsite * + .list-ordered {
+ margin-top: 22px;
+}
+.bodywebsite * + .link-wrap {
+ margin-top: 8px;
+}
+.bodywebsite * + .link-iconed {
+ margin-top: 2px;
+}
+.bodywebsite .contact-info {
+ vertical-align: baseline;
+}
+.bodywebsite .contact-info a {
+ display: inline-block;
+}
+.bodywebsite .contact-info dl dt,
+.bodywebsite .contact-info dl dd {
+ display: inline-block;
+}
+.bodywebsite .contact-info dl dt:after {
+ content: ':';
+ display: inline-block;
+ text-align: center;
+}
+.bodywebsite .contact-info .dl-inline dt {
+ padding-right: 0;
+}
+.bodywebsite .grid-system p {
+ color: #00030a;
+}
+@media (max-width: 1199px) {
+ .bodywebsite .grid-system p {
+ width: 100%;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+}
+.bodywebsite .object-inline,
+.bodywebsite .object-inline-baseline {
+ white-space: nowrap;
+}
+.bodywebsite .object-inline > * + *,
+.bodywebsite .object-inline-baseline > * + * {
+ margin-top: 0;
+ margin-left: 5px;
+}
+.bodywebsite .object-inline {
+ vertical-align: middle;
+}
+.bodywebsite .object-inline > * {
+ display: inline-block;
+ vertical-align: middle;
+}
+.bodywebsite .object-inline-baseline {
+ vertical-align: baseline;
+}
+.bodywebsite .object-inline-baseline > * {
+ display: inline-block;
+ vertical-align: baseline;
+}
+.bodywebsite .row-no-gutter {
+ margin-left: 0;
+ margin-right: 0;
+}
+.bodywebsite .row-no-gutter [class*='col'] {
+ padding: 0;
+}
+.bodywebsite .text-width-1 {
+ max-width: 400px;
+}
+@media (min-width: 992px) {
+ .bodywebsite .text-width-1 {
+ max-width: 310px;
+ }
+}
+.bodywebsite .min-width-1 {
+ min-width: 100%;
+}
+@media (min-width: 576px) {
+ .bodywebsite .min-width-1 {
+ min-width: 270px;
+ }
+}
+.bodywebsite .img-shadow {
+ box-shadow: -3px 2px 4px 0px rgba(0, 0, 0, 0.58);
+}
+@media (min-width: 768px) {
+ .bodywebsite .img-shadow {
+ box-shadow: -5px 4px 8px 0px rgba(0, 0, 0, 0.58);
+ }
+}
+.bodywebsite .box {
+ box-shadow: 0 5px 23px 0 rgba(0, 0, 0, 0.3);
+ padding: 50px 30px;
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+@media (min-width: 992px) {
+ .bodywebsite .box {
+ padding: 55px 30px 65px 44px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .box {
+ padding: 54px 40px 85px 54px;
+ }
+}
+.bodywebsite .box-xs {
+ padding: 38px 20px;
+}
+.bodywebsite .page .box-list-xs {
+ box-shadow: 0 5px 13px 0 rgba(0, 0, 0, 0.2);
+}
+.bodywebsite .page .box-list-xs .box-xs + .box-xs {
+ border-top: 1px solid #1c2e3f;
+}
+@media (min-width: 768px) {
+ .bodywebsite .page .box-list-xs {
+ max-width: 170px;
+ }
+}
+.bodywebsite .group-item {
+ width: 100%;
+ max-width: 220px;
+ margin-left: auto;
+ margin-right: auto;
+}
+@media (min-width: 576px) {
+ .bodywebsite .group-item {
+ max-width: 300px;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .group-item {
+ min-width: 40%;
+ max-width: 0;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .group-item {
+ min-width: 272px;
+ }
+ .bodywebsite .group-item-sm {
+ min-width: 195px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .border-modern {
+ position: relative;
+ }
+ .bodywebsite .border-modern .border-modern-item-1,
+ .bodywebsite .border-modern .border-modern-item-2,
+ .bodywebsite .border-modern .border-modern-item-3,
+ .bodywebsite .border-modern .border-modern-item-4 {
+ position: absolute;
+ width: 45px;
+ height: 45px;
+ border-left: 3px solid maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ border-top: 3px solid maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ }
+ .bodywebsite .border-modern .border-modern-item-1,
+ .bodywebsite .border-modern .border-modern-item-2 {
+ top: -27px;
+ }
+ .bodywebsite .border-modern .border-modern-item-3,
+ .bodywebsite .border-modern .border-modern-item-4 {
+ bottom: -68px;
+ }
+ .bodywebsite .border-modern .border-modern-item-1,
+ .bodywebsite .border-modern .border-modern-item-3 {
+ left: 0px;
+ }
+ .bodywebsite .border-modern .border-modern-item-2,
+ .bodywebsite .border-modern .border-modern-item-4 {
+ right: 0px;
+ }
+ .bodywebsite .border-modern .border-modern-item-2 {
+ transform: rotate(90deg);
+ }
+ .bodywebsite .border-modern .border-modern-item-3 {
+ transform: rotate(-90deg);
+ }
+ .bodywebsite .border-modern .border-modern-item-4 {
+ transform: rotate(180deg);
+ }
+}
+.bodywebsite .pagination-custom {
+ display: inline-block;
+ position: relative;
+ transform: translateY(-4px);
+ margin-bottom: -4px;
+}
+.bodywebsite .pagination-custom > * {
+ margin-top: 4px;
+}
+.bodywebsite .pagination-custom > *:not(:last-child) {
+ margin-right: 4px;
+}
+.bodywebsite .pagination-custom .page-item {
+ display: inline-block;
+ line-height: 1;
+}
+.bodywebsite .pagination-custom .page-item:first-child .page-link,
+.bodywebsite .pagination-custom .page-item:last-child .page-link {
+ padding-left: 25px;
+ padding-right: 25px;
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .pagination-custom .page-item .page-link {
+ display: block;
+ width: auto;
+ min-width: 52px;
+ height: 52px;
+ padding: 10px 20px;
+ border: 2px solid;
+ border-radius: 0;
+ font: 700 14px/14px "Roboto", Helvetica, Arial, sans-serif;
+ text-transform: uppercase;
+ vertical-align: middle;
+}
+.bodywebsite .pagination-custom .page-item .page-link:after {
+ content: '';
+ height: 108%;
+ width: 0;
+ display: inline-block;
+ vertical-align: middle;
+}
+.bodywebsite .pagination-custom .page-item .page-link,
+.bodywebsite .pagination-custom .page-item .page-link:active,
+.bodywebsite .pagination-custom .page-item .page-link:focus {
+ color: #000;
+ background: transparent;
+ border-color: #cdcdcd;
+}
+.bodywebsite .pagination-custom .page-item .page-link:hover {
+ color: #fff;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .pagination-custom .page-item.disabled,
+.bodywebsite .pagination-custom .page-item.active {
+ pointer-events: none;
+}
+.bodywebsite .pagination-custom .page-item.active .page-link {
+ color: #fff;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .pagination-custom .page-item.disabled .page-link {
+ color: #f9f9f9;
+ background: #cdcdcd;
+ border-color: #cdcdcd;
+}
+.bodywebsite .label-custom {
+ padding: .35em .3em .25em;
+ font-weight: 400;
+ font-size: 70%;
+ text-transform: uppercase;
+}
+.bodywebsite .mac .label-custom {
+ padding-top: .4em;
+}
+.bodywebsite .label-custom.label-danger {
+ color: #fff;
+ background: #fe4a21;
+ box-shadow: inset 0 8px 12px rgba(0, 0, 0, 0.25);
+}
+.bodywebsite .label-custom.label-info {
+ color: #fff;
+ background: #3e9cf6;
+ box-shadow: inset 0 8px 12px rgba(0, 0, 0, 0.25);
+}
+.bodywebsite blockquote {
+ font: inherit;
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+.bodywebsite blockquote q:before,
+.bodywebsite blockquote q:after {
+ content: none;
+}
+.bodywebsite blockquote cite {
+ font-style: normal;
+}
+.bodywebsite .quote-default {
+ position: relative;
+ padding: 43px 0 43px 6px;
+ color: #00030a;
+}
+.bodywebsite .quote-default svg {
+ fill: #ddd;
+}
+.bodywebsite .quote-default .quote-open,
+.bodywebsite .quote-default .quote-close {
+ position: absolute;
+ left: 30px;
+}
+.bodywebsite .quote-default .quote-open {
+ top: 0;
+}
+.bodywebsite .quote-default .quote-close {
+ bottom: 0;
+}
+.bodywebsite .quote-bordered {
+ padding-top: 14px;
+}
+.bodywebsite .quote-bordered .quote-body {
+ position: relative;
+ padding-bottom: 10px;
+}
+.bodywebsite .quote-bordered h6 {
+ font-size: 18px;
+}
+.bodywebsite .quote-bordered .quote-body-inner {
+ position: relative;
+ padding: 37px 22px 29px 34px;
+ border-style: solid;
+ border-width: 1px 1px 0 1px;
+ border-color: #e5e7e9;
+}
+.bodywebsite .quote-bordered .quote-body-inner:before,
+.bodywebsite .quote-bordered .quote-body-inner:after {
+ content: '';
+ position: absolute;
+ bottom: -10px;
+ height: 10px;
+ border-style: solid;
+ border-color: #e5e7e9;
+ background-color: transparent;
+}
+.bodywebsite .quote-bordered .quote-body-inner:before {
+ left: 10px;
+ width: 46px;
+ border-width: 1px 1px 0 0;
+ transform: skew(45deg);
+ transform-origin: 100% 100%;
+}
+.bodywebsite .quote-bordered .quote-body-inner:after {
+ right: 10px;
+ width: calc(34%);
+ border-width: 1px 0 0 1px;
+ transform: skew(-45deg);
+ transform-origin: 0 100%;
+}
+.bodywebsite .quote-bordered .quote-open {
+ position: absolute;
+ top: -10px;
+ left: 34px;
+ z-index: 2;
+}
+.bodywebsite .quote-bordered .quote-open > svg {
+ fill: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .quote-bordered .quote-footer {
+ padding-left: 25px;
+}
+.bodywebsite .quote-bordered cite {
+ font-size: 17px;
+ font-weight: 900;
+ line-height: 21px;
+ color: #fff;
+}
+.bodywebsite .quote-bordered * + .quote-footer {
+ margin-top: 9px;
+}
+.bodywebsite .quote-bordered cite + p {
+ margin-top: 0;
+}
+.bodywebsite .quote-bordered-inverse cite,
+.bodywebsite .quote-bordered-inverse q {
+ color: #000;
+}
+.bodywebsite .quote-minimal-bordered {
+ position: relative;
+ padding: 16px 0 26px;
+ text-align: center;
+}
+.bodywebsite .quote-minimal-bordered q {
+ font: 400 20px "Roboto", Helvetica, Arial, sans-serif;
+ font-style: italic;
+ color: #464a4d;
+}
+.bodywebsite .quote-minimal-bordered q:before,
+.bodywebsite .quote-minimal-bordered q:after {
+ content: '"';
+}
+.bodywebsite .quote-minimal-bordered:before,
+.bodywebsite .quote-minimal-bordered:after {
+ content: '';
+ position: absolute;
+ left: 50%;
+ width: 270px;
+ height: 1px;
+ transform: translateX(-50%);
+ background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, #dedede 50%, rgba(0, 0, 0, 0) 100%);
+ background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, #dedede 50%, rgba(0, 0, 0, 0) 100%);
+ background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, #dedede 50%, rgba(0, 0, 0, 0) 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffffff', endColorstr='#00000000', GradientType=1);
+}
+.bodywebsite .quote-minimal-bordered:before {
+ top: 0;
+}
+.bodywebsite .quote-minimal-bordered:after {
+ bottom: 0;
+}
+@media (min-width: 768px) {
+ .bodywebsite .quote-minimal-bordered q {
+ font-size: 24px;
+ line-height: 1.55;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .quote-minimal-bordered q {
+ font-size: 30px;
+ }
+}
+.bodywebsite .quote-minimal q {
+ font-size: 18px;
+ font-weight: 300;
+ font-style: italic;
+ line-height: 1.2;
+ color: #000;
+}
+.bodywebsite .quote-minimal cite {
+ font: 700 15px "Roboto", Helvetica, Arial, sans-serif;
+ line-height: 1.1;
+ color: #000;
+}
+.bodywebsite .quote-minimal .caption {
+ color: #9f9f9f;
+}
+.bodywebsite .quote-minimal.quote-minimal-inverse q {
+ color: #fff;
+}
+.bodywebsite .quote-minimal.quote-minimal-inverse cite {
+ color: #fff;
+}
+.bodywebsite .quote-minimal.quote-minimal-inverse .caption {
+ color: rgba(255, 255, 255, 0.5);
+}
+.bodywebsite .quote-minimal * + .caption {
+ margin-top: 0;
+}
+.bodywebsite .quote-minimal * + .quote-meta {
+ margin-top: 20px;
+}
+.bodywebsite .quote-strict q,
+.bodywebsite .quote-strict cite {
+ color: #000;
+}
+.bodywebsite .quote-strict q {
+ font-size: 19px;
+ font-weight: 300;
+ font-style: italic;
+ line-height: 28px;
+}
+.bodywebsite .quote-strict cite {
+ display: block;
+ font: 700 16px/21px "Roboto", Helvetica, Arial, sans-serif;
+ text-transform: uppercase;
+}
+.bodywebsite .quote-strict * + cite {
+ margin-top: 20px;
+}
+.bodywebsite .quote-strict.quote-strict-inverse q,
+.bodywebsite .quote-strict.quote-strict-inverse cite {
+ color: #fff;
+}
+.bodywebsite .quote-vertical {
+ max-width: 360px;
+ margin-left: auto;
+ margin-right: auto;
+ text-align: center;
+}
+.bodywebsite .quote-vertical q {
+ font-size: 16px;
+ line-height: 1.57895;
+ font-weight: 100;
+ color: rgba(0, 0, 0, 0.5);
+}
+.bodywebsite .quote-vertical cite {
+ display: block;
+ color: #000;
+ font: 700 14px/18px "Roboto", Helvetica, Arial, sans-serif;
+}
+.bodywebsite .quote-vertical .quote-open > svg {
+ fill: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .quote-vertical .quote-image,
+.bodywebsite .quote-vertical .quote-image > img {
+ border-radius: 600px;
+}
+.bodywebsite .quote-vertical .quote-image > img {
+ width: auto;
+}
+.bodywebsite .quote-vertical * + cite {
+ margin-top: 16px;
+}
+.bodywebsite .quote-vertical * + .caption {
+ margin-top: 0;
+}
+.bodywebsite .quote-vertical * + .quote-text {
+ margin-top: 25px;
+}
+.bodywebsite .quote-vertical * + .quote-meta {
+ margin-top: 25px;
+}
+.bodywebsite .quote-vertical.quote-vertical-inverse q,
+.bodywebsite .quote-vertical.quote-vertical-inverse cite {
+ color: #fff;
+}
+.bodywebsite .quote-vertical.quote-vertical-inverse .cite {
+ color: rgba(255, 255, 255, 0.5);
+}
+.bodywebsite .quote-vertical.quote-vertical-inverse .quote-open > svg {
+ fill: #fff;
+}
+.bodywebsite .quote-review cite {
+ font: 700 14px/18px "Roboto", Helvetica, Arial, sans-serif;
+ text-transform: uppercase;
+ letter-spacing: -0.025em;
+ color: #000;
+}
+.bodywebsite .quote-review .quote-header {
+ position: relative;
+ transform: translateY(-2px);
+ margin-bottom: -2px;
+}
+.bodywebsite .quote-review .quote-header > * {
+ margin-top: 2px;
+}
+.bodywebsite .quote-review .quote-header > *:not(:last-child) {
+ margin-right: 10px;
+}
+.bodywebsite .quote-review .quote-header > * {
+ display: inline-block;
+ vertical-align: middle;
+}
+.bodywebsite .quote-review * + .quote-body {
+ margin-top: 10px;
+}
+.bodywebsite * + .quote-review {
+ margin-top: 35px;
+}
+@media (min-width: 768px) {
+ .bodywebsite .quote-minimal q {
+ font-size: 22px;
+ }
+ .bodywebsite .quote-minimal cite {
+ font-size: 19px;
+ }
+ .bodywebsite .quote-minimal * + .quote-meta {
+ margin-top: 37px;
+ }
+ .bodywebsite * + .quote-review {
+ margin-top: 45px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .quote-minimal q {
+ font-size: 24px;
+ }
+ .bodywebsite .quote-vertical q {
+ font-size: 19px;
+ }
+}
+.bodywebsite .quote-left .divider-fullwidth {
+ margin-top: 20px;
+ background: #bcd;
+}
+.bodywebsite .quote-left .quote-name {
+ font-size: 18px;
+ font-weight: 500;
+ color: #fff;
+}
+@media (min-width: 992px) {
+ .bodywebsite .quote-left .quote-name {
+ font-size: 24px;
+ }
+}
+.bodywebsite .quote-left .quote-desc-text {
+ font-size: 26px;
+ line-height: 1;
+ font-style: italic;
+ font-weight: 700;
+}
+@media (min-width: 992px) {
+ .bodywebsite .quote-left .quote-desc-text {
+ font-size: 36px;
+ }
+}
+.bodywebsite .quote-left .quote-body {
+ margin-top: 27px;
+ padding-left: 75px;
+ position: relative;
+ text-align: left;
+}
+.bodywebsite .quote-left .quote-body:before {
+ content: '';
+ position: absolute;
+ top: 6px;
+ left: 0;
+ width: 50px;
+ height: 36px;
+ background: url("medias/image/ref; ?>/icon-quote.png") no-repeat top left;
+ opacity: .5;
+}
+.bodywebsite .quote-left .quote-body q {
+ color: #fff;
+}
+.bodywebsite .quote-left .h4 + *,
+.bodywebsite .quote-left h5 + * {
+ margin-top: 0;
+}
+.bodywebsite .page .box-text > * {
+ display: inline;
+ margin: 0 .25em 0 0;
+}
+.bodywebsite .icon-box-horizontal .unit-left {
+ min-width: 48px;
+}
+.bodywebsite .icon-box-horizontal [class*='icon-md'] {
+ margin-top: -2px;
+}
+.bodywebsite .icon-box-horizontal [class*='icon-lg'] {
+ margin-top: -5px;
+}
+.bodywebsite .icon-box-horizontal * + p {
+ margin-top: 9px;
+}
+.bodywebsite .icon-box-vertical * + p {
+ margin-top: 9px;
+}
+.bodywebsite .icon-box-vertical-sm {
+ max-width: 370px;
+}
+@media (max-width: 767px) {
+ .bodywebsite .icon-box-vertical-sm {
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+.bodywebsite .icon-box {
+ position: relative;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ width: 100%;
+ padding: 35px 30px;
+ text-align: center;
+ cursor: default;
+}
+@media (min-width: 768px) {
+ .bodywebsite .icon-box:before,
+ .bodywebsite .icon-box:after {
+ content: '';
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ border: 1px solid #e5e7e9;
+ pointer-events: none;
+ transition: .33s all ease;
+ }
+ .bodywebsite .icon-box.icon-box-top-line:before {
+ border-width: 1px 0 0 0;
+ }
+ .bodywebsite .icon-box:before {
+ top: 0;
+ left: 0;
+ border-width: 0 0 0 0;
+ }
+ .bodywebsite .icon-box:after {
+ bottom: 0;
+ right: 0;
+ border-width: 0 1px 1px 0;
+ }
+}
+.bodywebsite .icon-box .icon:after {
+ opacity: 0;
+}
+.bodywebsite .icon-box .btn:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .icon-box .box-top,
+.bodywebsite .icon-box .box-body {
+ position: relative;
+ will-change: transform;
+ transition: .33s all ease;
+ -webkit-filter: blur(0);
+}
+.bodywebsite .icon-box .box-top {
+ top: 0;
+}
+.bodywebsite .icon-box .box-body {
+ max-width: 100%;
+}
+.bodywebsite .icon-box .box-header {
+ bottom: 0;
+}
+.bodywebsite .icon-box .box-icon {
+ min-height: 46px;
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+}
+.bodywebsite .icon-box * + .box-header {
+ margin-top: 10px;
+}
+.bodywebsite .icon-box * + .box-body {
+ margin-top: 22px;
+}
+.bodywebsite .icon-box .box-body + .btn {
+ margin-top: 18px;
+}
+.bodywebsite .icon-box.hover .box-top,
+.bodywebsite .icon-box:hover .box-top {
+ -webkit-transform: translateY(-7px);
+ transform: translateY(-7px);
+}
+.bodywebsite .icon-box.hover .btn,
+.bodywebsite .icon-box.hover .box-body,
+.bodywebsite .icon-box:hover .btn,
+.bodywebsite .icon-box:hover .box-body {
+ -webkit-transform: translateY(7px);
+ transform: translateY(7px);
+}
+@media (min-width: 992px) {
+ .bodywebsite .desktop .icon-box .icon-box-overlay {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ right: 0;
+ left: 0;
+ opacity: 0;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ transition: 0.2s ease-in-out;
+ }
+ .bodywebsite .desktop .icon-box:hover .icon-box-overlay {
+ opacity: 1;
+ z-index: 5;
+ -webkit-transform: scale(1.05);
+ transform: scale(1.05);
+ }
+ .bodywebsite .desktop .icon-box:hover .btn {
+ z-index: 6;
+ }
+ .bodywebsite .desktop .icon-box:hover .box-body,
+ .bodywebsite .desktop .icon-box:hover .box-top {
+ z-index: 6;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .icon-box {
+ padding: 67px 37px 61px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+@media (min-width: 1400px) {
+ .bodywebsite .icon-box {
+ padding: 67px 110px 61px;
+ }
+}
+@media (min-width: 1800px) {
+ .bodywebsite .icon-box {
+ padding: 90px 165px 82px;
+ }
+}
+.bodywebsite .list-blocks {
+ counter-reset: li;
+}
+.bodywebsite .list-blocks > li {
+ display: block;
+}
+.bodywebsite .list-blocks .block-list-counter:before {
+ position: relative;
+ content: counter(li, decimal-leading-zero);
+ counter-increment: li;
+ font: 700 30px/30px "Roboto", Helvetica, Arial, sans-serif;
+ letter-spacing: -0.025em;
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .list-blocks > li + li {
+ margin-top: 50px;
+}
+.bodywebsite .block-image-plate {
+ display: block;
+ width: 100%;
+}
+.bodywebsite .block-image-plate .block-header {
+ max-width: 400px;
+}
+.bodywebsite .block-image-plate .block-inner {
+ position: relative;
+ padding: 45px 30px;
+}
+.bodywebsite .block-image-plate .block-inner:after {
+ content: '';
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 0;
+ background: rgba(0, 0, 0, 0.7);
+}
+.bodywebsite .block-image-plate .block-inner > * {
+ position: relative;
+ z-index: 2;
+}
+.bodywebsite .block-image-plate * + .block-text {
+ margin-top: 18px;
+}
+.bodywebsite .block-image-plate * + .block-body {
+ margin-top: 22px;
+}
+@media (max-width: 767px) {
+ .bodywebsite .block-image-plate {
+ margin-left: -16px;
+ margin-right: -15px;
+ width: calc(132%);
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .block-image-plate .block-header {
+ max-width: 340px;
+ }
+ .bodywebsite .block-image-plate .block-header h3 {
+ line-height: 1.2;
+ }
+ .bodywebsite .block-image-plate .block-inner {
+ padding: 60px 12.5% 60px 8.33333%;
+ }
+ .bodywebsite .block-image-plate .block-body {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: flex-start;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ }
+ .bodywebsite .block-image-plate .block-left {
+ -webkit-flex-shrink: 0;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+ -webkit-flex-basis: 11.11111%;
+ -ms-flex-preferred-size: 11.11111%;
+ flex-basis: 11.11111%;
+ max-width: 11.11111%;
+ max-width: 100px;
+ }
+ .bodywebsite .block-image-plate .block-body {
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ }
+ .bodywebsite .block-image-plate * + .block-text {
+ margin-top: 0;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .block-image-plate .block-header {
+ max-width: 410px;
+ }
+ .bodywebsite .block-image-plate .block-inner {
+ padding-right: 16%;
+ padding-top: 90px;
+ padding-bottom: 95px;
+ }
+}
+.bodywebsite .block-vacation {
+ position: relative;
+ width: 100%;
+ padding: 39px 9% 45px;
+ border-radius: 4px;
+ background: #fff;
+ box-shadow: -1px 0px 10px 0px rgba(65, 65, 65, 0.12);
+}
+.bodywebsite .block-vacation,
+.bodywebsite .block-vacation:active,
+.bodywebsite .block-vacation:focus,
+.bodywebsite .block-vacation:hover {
+ color: #9f9f9f;
+}
+.bodywebsite .block-vacation:hover {
+ box-shadow: -3px 5px 12px 0px rgba(65, 65, 65, 0.16);
+}
+.bodywebsite .block-vacation * + .block-meta {
+ margin-top: 14px;
+}
+@media (min-width: 1200px) {
+ .bodywebsite .block-vacation * + .block-meta {
+ margin-top: 5px;
+ }
+}
+.bodywebsite .block-shadow {
+ position: relative;
+ width: 100%;
+ padding-top: 30px;
+ overflow: hidden;
+ border-radius: 0;
+ background: #fff;
+ box-shadow: 0px 1px 10px 0px rgba(65, 65, 65, 0.12);
+ text-align: center;
+}
+.bodywebsite .block-shadow .block-inner {
+ padding: 0 40px;
+}
+.bodywebsite .block-shadow * + .block-footer {
+ margin-top: 32px;
+}
+.bodywebsite .block-shadow * + .icon-block {
+ margin-top: 40px;
+}
+@media (min-width: 768px) {
+ .bodywebsite .block-shadow {
+ padding-top: 38px;
+ }
+ .bodywebsite .block-shadow .block-inner {
+ padding: 0 70px;
+ }
+ .bodywebsite .block-shadow * + .icon-block {
+ margin-top: 60px;
+ }
+}
+.bodywebsite .box-counter {
+ text-align: center;
+}
+.bodywebsite .box-counter .box-header {
+ text-transform: uppercase;
+}
+.bodywebsite .box-counter * + .box-header {
+ margin-top: 10px;
+}
+@media (min-width: 768px) and (max-width: 1199px) {
+ .bodywebsite .box-counter .box-header {
+ font-size: 15px;
+ }
+}
+.bodywebsite .box-counter-inverse .box-header {
+ color: rgba(255, 255, 255, 0.2);
+}
+.bodywebsite .box-counter-inverse .counter {
+ color: #dedede;
+}
+.bodywebsite .box-counter-inverse-lighter .box-header {
+ color: rgba(255, 255, 255, 0.35);
+}
+.bodywebsite .box-counter-inverse-lighter .counter {
+ color: #dedede;
+}
+.bodywebsite .box-container-small {
+ display: inline-block;
+ width: 100%;
+ max-width: 280px;
+}
+.bodywebsite .post-single .post-footer {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ position: relative;
+ transform: translateY(-10px);
+ margin-bottom: -10px;
+}
+.bodywebsite .post-single .post-footer > * {
+ margin-top: 10px;
+}
+.bodywebsite .post-single .post-footer > *:not(:last-child) {
+ margin-right: 20px;
+}
+.bodywebsite .post-single * + .post-header {
+ margin-top: 15px;
+}
+.bodywebsite .post-single * + .post-meta {
+ margin-top: 20px;
+}
+.bodywebsite .post-single * + .post-body {
+ margin-top: 20px;
+}
+.bodywebsite .post-single * + .post-footer {
+ margin-top: 42px;
+}
+.bodywebsite .post-single + * {
+ margin-top: 40px;
+}
+@media (min-width: 768px) {
+ .bodywebsite .post-single * + .post-header {
+ margin-top: 22px;
+ }
+ .bodywebsite .post-single * + .post-meta {
+ margin-top: 10px;
+ }
+}
+.bodywebsite .post-info * + .post-main {
+ margin-top: 30px;
+}
+.bodywebsite .post-info * + .post-body {
+ margin-top: 20px;
+}
+@media (min-width: 768px) {
+ .bodywebsite .post-info .post-main {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ }
+ .bodywebsite .post-info .post-left {
+ -webkit-flex-basis: 33.33333%;
+ -ms-flex-preferred-size: 33.33333%;
+ flex-basis: 33.33333%;
+ max-width: 33.33333%;
+ padding-right: 25px;
+ }
+ .bodywebsite .post-info .post-body {
+ -webkit-flex-basis: 66.66667%;
+ -ms-flex-preferred-size: 66.66667%;
+ flex-basis: 66.66667%;
+ max-width: 66.66667%;
+ }
+ .bodywebsite .post-info * + .post-body {
+ margin-top: 0;
+ }
+}
+.bodywebsite .post-minimal {
+ position: relative;
+ border-radius: 4px;
+ overflow: hidden;
+ background: #fff;
+ box-shadow: -1px 0px 10px 0px rgba(65, 65, 65, 0.12);
+}
+.bodywebsite .post-minimal .post-body {
+ padding: 20px;
+}
+.bodywebsite .post-minimal * + p {
+ margin-top: 8px;
+}
+.bodywebsite .post-minimal * + .post-meta {
+ margin-top: 5px;
+}
+@media (max-width: 575px) {
+ .bodywebsite .post-minimal {
+ display: inline-block;
+ width: 100%;
+ max-width: 300px;
+ }
+}
+@media (min-width: 576px) {
+ .bodywebsite .post-minimal {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ }
+ .bodywebsite .post-minimal .post-left {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -webkit-align-items: stretch;
+ -ms-flex-align: stretch;
+ align-items: stretch;
+ -webkit-flex-shrink: 0;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+ -webkit-align-self: stretch;
+ -ms-flex-item-align: stretch;
+ align-self: stretch;
+ width: 220px;
+ }
+ .bodywebsite .post-minimal .post-image {
+ position: relative;
+ -webkit-flex-shrink: 0;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+ -webkit-align-self: stretch;
+ -ms-flex-item-align: stretch;
+ align-self: stretch;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ overflow: hidden;
+ }
+ .bodywebsite .post-minimal .post-image img {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ height: auto;
+ width: auto;
+ min-height: 100%;
+ min-width: 100%;
+ z-index: 1;
+ }
+ .bodywebsite .post-minimal .post-body {
+ padding: 30px 24px 30px 27px;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .post-minimal .post-body {
+ padding: 40px 26px 40px 50px;
+ }
+}
+.bodywebsite .post-preview {
+ max-width: 320px;
+}
+.bodywebsite .post-preview a {
+ display: block;
+}
+.bodywebsite .post-preview .post-image,
+.bodywebsite .post-preview .post-image img {
+ border-radius: 5px;
+}
+.bodywebsite .post-preview .post-image img {
+ width: auto;
+}
+.bodywebsite .post-preview .post-header {
+ line-height: 1.5;
+ color: #000;
+ transition: .33s all ease;
+}
+.bodywebsite .post-preview .list-meta > li {
+ display: inline-block;
+ font-size: 12px;
+ font-style: italic;
+ color: #9b9b9b;
+}
+.bodywebsite .post-preview .list-meta > li:not(:last-child):after {
+ content: '/';
+}
+.bodywebsite .post-preview:hover .post-header {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .post-preview * + .post-meta {
+ margin-top: 5px;
+}
+.bodywebsite .post-preview.post-preview-inverse > li {
+ color: rgba(255, 255, 255, 0.5);
+}
+.bodywebsite .post-preview.post-preview-inverse .post-header {
+ color: #fff;
+}
+.bodywebsite .post-preview.post-preview-inverse:hover .post-header {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .blog-timeline > dt {
+ font: 700 25px "Roboto", Helvetica, Arial, sans-serif;
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .blog-timeline > dd {
+ margin-top: 20px;
+}
+@media (min-width: 768px) {
+ .bodywebsite .blog-timeline {
+ word-spacing: 0;
+ white-space: nowrap;
+ }
+ .bodywebsite .blog-timeline > * {
+ display: inline-block;
+ }
+ .bodywebsite .blog-timeline > dt {
+ min-width: 65px;
+ padding-right: 20px;
+ margin-top: -0.15em;
+ vertical-align: top;
+ }
+ .bodywebsite .blog-timeline > dd {
+ margin-top: 0;
+ width: calc(0%);
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .blog-timeline > dt {
+ min-width: 100px;
+ padding-right: 30px;
+ }
+}
+.bodywebsite .post-boxed {
+ max-width: 330px;
+ margin-right: auto;
+ margin-left: auto;
+ padding-top: 10px;
+ text-align: center;
+ box-shadow: -1px 0px 10px 0px rgba(65, 65, 65, 0.12);
+ transition: .3s all ease;
+}
+.bodywebsite .post-boxed-img-wrap a {
+ display: block;
+}
+.bodywebsite .post-boxed-title {
+ font: 500 18px/28px "Roboto", Helvetica, Arial, sans-serif;
+}
+.bodywebsite .post-boxed-title {
+ color: #000;
+}
+.bodywebsite .post-boxed-title a {
+ display: inline;
+ color: #000;
+}
+.bodywebsite .post-boxed-title a:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .post-boxed img {
+ max-width: 75%;
+}
+.bodywebsite .post-boxed .list-inline {
+ font-size: 12px;
+ letter-spacing: .05em;
+}
+.bodywebsite .post-boxed-caption {
+ padding: 20px;
+}
+.bodywebsite #sectionteam .post-boxed-caption {
+ height: 140px;
+}
+.bodywebsite .post-boxed .post-boxed-title + * {
+ margin-top: 5px;
+}
+@media (min-width: 768px) {
+ .bodywebsite .post-boxed .post-boxed-caption {
+ padding: 28px 42px 36px 28px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .post-boxed:hover {
+ box-shadow: -3px 5px 12px 0px rgba(65, 65, 65, 0.16);
+ }
+}
+.bodywebsite .post-minimal .post-image {
+ height: 100%;
+}
+.bodywebsite .post-minimal .post-image img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+.bodywebsite * + .post-blockquote {
+ margin-top: 30px;
+}
+.bodywebsite .post-blockquote + * {
+ margin-top: 30px;
+}
+@media (min-width: 768px) {
+ .bodywebsite * + .post-blockquote {
+ margin-top: 50px;
+ }
+ .bodywebsite .post-blockquote + * {
+ margin-top: 50px;
+ }
+}
+.bodywebsite * + .post-comment-block,
+.bodywebsite * + .post-comment-form {
+ margin-top: 40px;
+}
+.bodywebsite .post-comment-form h4 + * {
+ margin-top: 15px;
+}
+.bodywebsite .comment figure,
+.bodywebsite .comment figure img {
+ border-radius: 50%;
+ max-width: 71px;
+}
+.bodywebsite .comment time {
+ font-size: 12px;
+ line-height: 1;
+ color: #9b9b9b;
+}
+.bodywebsite .comment .user {
+ font-size: 16px;
+ line-height: 1.33333;
+ font-weight: 700;
+ text-transform: uppercase;
+ color: #000;
+}
+.bodywebsite .comment .list-icon-meta {
+ position: relative;
+ transform: translateY(0);
+ margin-bottom: 0;
+}
+.bodywebsite .comment .list-icon-meta > * {
+ margin-top: 0;
+}
+.bodywebsite .comment .list-icon-meta > *:not(:last-child) {
+ margin-right: 8px;
+}
+.bodywebsite .comment .list-icon-meta > li {
+ display: inline-block;
+}
+.bodywebsite .comment .list-icon-meta li {
+ font-size: 12px;
+ line-height: 1;
+ font-weight: 400;
+}
+.bodywebsite .comment .comment-body {
+ padding: 17px 22px;
+ border: 1px solid #dedede;
+ border-radius: 7px;
+}
+.bodywebsite .comment .comment-body-header {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-align-items: flex-start;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ position: relative;
+ transform: translateY(-5px);
+ margin-bottom: -5px;
+}
+.bodywebsite .comment .comment-body-header > * {
+ margin-top: 5px;
+}
+.bodywebsite .comment .comment-body-header > *:not(:last-child) {
+ margin-right: 5px;
+}
+@media (min-width: 768px) {
+ .bodywebsite .comment .comment-body-header {
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ }
+}
+.bodywebsite .comment .comment-body-header > * {
+ -webkit-flex-shrink: 0;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+}
+.bodywebsite .comment .comment-meta {
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ position: relative;
+ transform: translateY(-5px);
+ margin-bottom: -5px;
+}
+.bodywebsite .comment .comment-meta > * {
+ margin-top: 5px;
+}
+.bodywebsite .comment .comment-meta > *:not(:last-child) {
+ margin-right: 10px;
+}
+@media (min-width: 768px) {
+ .bodywebsite .comment .comment-meta > * {
+ display: inline-block;
+ vertical-align: baseline;
+ }
+}
+.bodywebsite .comment .comment-body-text {
+ margin-top: 10px;
+}
+.bodywebsite .comment-minimal .author {
+ font: 700 14px/18px "Roboto", Helvetica, Arial, sans-serif;
+ text-transform: uppercase;
+ letter-spacing: -0.025em;
+ color: #000;
+}
+.bodywebsite .comment-minimal * + .comment-body {
+ margin-top: 10px;
+}
+.bodywebsite * + .comment-minimal {
+ margin-top: 35px;
+}
+.bodywebsite .comment-group-reply {
+ padding-left: 12%;
+}
+.bodywebsite .comment + * {
+ margin-top: 21px;
+}
+.bodywebsite * + .comment-group {
+ margin-top: 30px;
+}
+@media (min-width: 768px) {
+ .bodywebsite .comment > .unit > .unit-left {
+ margin-top: 16px;
+ }
+ .bodywebsite * + .comment-minimal {
+ margin-top: 45px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite * + .post-comment {
+ margin-top: 80px;
+ }
+}
+.bodywebsite .page-title {
+ text-align: center;
+}
+.bodywebsite .page-title > * {
+ letter-spacing: 0;
+ text-transform: uppercase;
+}
+.bodywebsite .page-title .page-title-inner {
+ position: relative;
+ display: inline-block;
+}
+.bodywebsite .page-title .page-title-left,
+.bodywebsite .page-title .page-title-right {
+ position: absolute;
+ top: 50%;
+ width: auto;
+ overflow: hidden;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+.bodywebsite .page-title .page-title-left *,
+.bodywebsite .page-title .page-title-right * {
+ display: inline;
+ white-space: nowrap;
+}
+.bodywebsite .page-title .page-title-left {
+ left: 0;
+ text-align: right;
+ transform: translate(-100%, -50%);
+}
+.bodywebsite .page-title .page-title-left * {
+ padding-right: .85em;
+}
+.bodywebsite .page-title .page-title-left *:nth-last-child(odd) {
+ color: rgba(255, 255, 255, 0.1);
+}
+.bodywebsite .page-title .page-title-left *:nth-last-child(even) {
+ color: rgba(255, 255, 255, 0.2);
+}
+.bodywebsite .page-title .page-title-right {
+ right: 0;
+ text-align: left;
+ transform: translate(100%, -50%);
+}
+.bodywebsite .page-title .page-title-right * {
+ padding-left: .85em;
+}
+.bodywebsite .page-title .page-title-right *:nth-child(odd) {
+ color: rgba(255, 255, 255, 0.1);
+}
+.bodywebsite .page-title .page-title-right *:nth-child(even) {
+ color: rgba(255, 255, 255, 0.2);
+}
+.bodywebsite .page-title-wrap {
+ background: #000;
+ background-attachment: fixed;
+ -webkit-background-size: cover;
+ background-size: cover;
+ background-position: center 80%;
+}
+@media (min-width: 768px) {
+ .bodywebsite .page-title {
+ text-align: left;
+ }
+}
+.bodywebsite .preloader {
+ position: fixed;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ right: 0;
+ z-index: 10000;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ padding: 20px;
+ background: #fff;
+ transition: .3s all ease;
+}
+.bodywebsite .preloader.loaded {
+ opacity: 0;
+ visibility: hidden;
+}
+.bodywebsite .preloader-body {
+ text-align: center;
+}
+.bodywebsite .preloader-body p {
+ position: relative;
+ right: -8px;
+}
+.bodywebsite .cssload-container {
+ width: 100%;
+ height: 36px;
+ text-align: center;
+}
+.bodywebsite .cssload-speeding-wheel {
+ width: 36px;
+ height: 36px;
+ margin: 0 auto;
+ border: 3px solid maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ border-radius: 50%;
+ border-left-color: transparent;
+ border-bottom-color: transparent;
+ animation: cssload-spin 0.88s infinite linear;
+}
+@-webkit-keyframes cssload-spin {
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+@keyframes cssload-spin {
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+.bodywebsite .pricing-table {
+ overflow: hidden;
+ background: #fff;
+ text-align: center;
+ box-shadow: -1px 2px 5px 0 rgba(65, 65, 65, 0.12);
+}
+.bodywebsite .pricing-table-header {
+ font-size: 18px;
+ text-transform: uppercase;
+ letter-spacing: .05em;
+ color: #464a4d;
+}
+.bodywebsite .pricing-table-body {
+ padding: 35px 30px;
+}
+.bodywebsite .pricing-table-label {
+ padding: 17px 15px;
+ text-align: center;
+ background: #3a3c3e;
+}
+.bodywebsite .pricing-table-label p {
+ font: 700 14px "Roboto", Helvetica, Arial, sans-serif;
+ letter-spacing: .05em;
+ text-transform: uppercase;
+ color: #fff;
+}
+.bodywebsite .pricing-table .pricing-list {
+ font-size: 16px;
+ font-weight: 300;
+ color: #00030a;
+}
+.bodywebsite .pricing-table .pricing-list span {
+ display: inline-block;
+ margin-right: .25em;
+}
+.bodywebsite .pricing-table .pricing-list > li + li {
+ margin-top: 12px;
+}
+.bodywebsite .pricing-table * + .price-object {
+ margin-top: 22px;
+}
+.bodywebsite .pricing-table * + .pricing-list {
+ margin-top: 22px;
+}
+.bodywebsite .pricing-object {
+ font-family: "Roboto", Helvetica, Arial, sans-serif;
+ font-weight: 900;
+ font-size: 0;
+ line-height: 0;
+ color: #000;
+}
+.bodywebsite .pricing-object > * {
+ margin-top: 0;
+}
+.bodywebsite .pricing-object .price {
+ font-family: Helvetica, Arial, sans-serif;
+ font-weight: 900;
+}
+.bodywebsite .pricing-object .small {
+ position: relative;
+ font: 700 10px "Roboto", Helvetica, Arial, sans-serif;
+ color: inherit;
+ text-transform: uppercase;
+}
+.bodywebsite .pricing-object .small-middle {
+ vertical-align: middle;
+}
+.bodywebsite .pricing-object .small-bottom {
+ vertical-align: bottom;
+}
+.bodywebsite .pricing-object-sm {
+ font-size: 32px;
+ line-height: .8;
+}
+.bodywebsite .pricing-object-sm .small {
+ font-size: 12px;
+}
+.bodywebsite .pricing-object-sm .small-middle {
+ margin-right: 3px;
+}
+.bodywebsite .pricing-object-sm .small-bottom {
+ margin-left: 1px;
+ vertical-align: bottom;
+}
+.bodywebsite .price-irrelevant {
+ color: #9f9f9f;
+ text-decoration: line-through;
+}
+.bodywebsite .pricing-object-md {
+ font-size: 53px;
+ line-height: 1;
+}
+.bodywebsite .pricing-object-md .price {
+ line-height: .5;
+}
+.bodywebsite .pricing-object-md .small {
+ font-size: 17px;
+ font-weight: 400;
+}
+.bodywebsite .pricing-object-md .small-middle {
+ font-size: 23px;
+}
+.bodywebsite .pricing-object-md .small-bottom {
+ bottom: -0.25em;
+}
+.bodywebsite .pricing-object-lg,
+.bodywebsite .pricing-object-xl {
+ font-size: 64px;
+ line-height: .7;
+}
+.bodywebsite .pricing-object-lg .small,
+.bodywebsite .pricing-object-xl .small {
+ font-size: 9px;
+}
+.bodywebsite .pricing-object-lg .small-top,
+.bodywebsite .pricing-object-xl .small-top {
+ top: 11px;
+ margin-right: 5px;
+ font-size: 14px;
+ vertical-align: top;
+ font-weight: 700;
+}
+.bodywebsite .pricing-object-lg .small-bottom,
+.bodywebsite .pricing-object-xl .small-bottom {
+ bottom: -10px;
+ margin-left: -2px;
+ font-weight: 700;
+ vertical-align: bottom;
+}
+.bodywebsite .price-current .small {
+ position: relative;
+ font-family: "Roboto", Helvetica, Arial, sans-serif;
+ font-weight: 400;
+}
+.bodywebsite .price-current .small-middle {
+ vertical-align: middle;
+ top: -0.3em;
+}
+.bodywebsite .price-current .small-bottom {
+ top: .3em;
+}
+@media (min-width: 768px) {
+ .bodywebsite .pricing-object-lg {
+ font-size: 72px;
+ }
+ .bodywebsite .pricing-object-xl {
+ font-size: 54px;
+ }
+ .bodywebsite .pricing-object-xl .small-middle {
+ font-size: 30px;
+ }
+ .bodywebsite .pricing-object-xl .small-bottom {
+ font-size: 25px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .pricing-object-xl {
+ font-size: 76px;
+ }
+}
+.bodywebsite .panel.bg-accent.bg-default-outline-btn.text-center {
+ background: transparent;
+}
+.bodywebsite .product .product-label {
+ padding: 7px 11px;
+ min-width: 90px;
+ font: 700 12px/16px "Roboto", Helvetica, Arial, sans-serif;
+ letter-spacing: .05em;
+ text-align: center;
+ border-radius: 0 0 7px 7px;
+}
+.bodywebsite .product .product-rating {
+ position: relative;
+ transform: translateY(-2px);
+ margin-bottom: -2px;
+}
+.bodywebsite .product .product-rating > * {
+ margin-top: 2px;
+}
+.bodywebsite .product .product-rating > *:not(:last-child) {
+ margin-right: 5px;
+}
+.bodywebsite .product .product-rating > * {
+ display: inline-block;
+ vertical-align: middle;
+}
+.bodywebsite .product .product-color {
+ display: inline-block;
+ width: 24px;
+ height: 24px;
+ font-size: 0;
+ line-height: 0;
+ border-radius: 50%;
+ background: #000;
+ vertical-align: middle;
+}
+.bodywebsite .product .product-size {
+ font: 700 14px/18px "Roboto", Helvetica, Arial, sans-serif;
+ color: #000;
+}
+.bodywebsite .product * + .product-brand,
+.bodywebsite .product .product-brand + * {
+ margin-top: 0;
+}
+.bodywebsite .one-screen-page .page {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+}
+.bodywebsite .one-screen-page .page-inner {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ min-height: 100vh;
+ text-align: center;
+}
+.bodywebsite .one-screen-page .page-inner,
+.bodywebsite .one-screen-page .page-inner > * {
+ width: 100%;
+}
+.bodywebsite .one-screen-page .page-head,
+.bodywebsite .one-screen-page .page-foot {
+ padding: 0;
+ background: transparent;
+}
+.bodywebsite .one-screen-page .page-head-inner {
+ padding: calc(5em) 0 calc(3em);
+}
+.bodywebsite .one-screen-page .page-content {
+ padding: calc(5em) 0;
+}
+.bodywebsite .one-screen-page .page-foot-inner {
+ padding: calc(3em) 0 calc(5em);
+}
+.bodywebsite .one-screen-page .rights {
+ color: #fff;
+}
+.bodywebsite .one-screen-page .rights a,
+.bodywebsite .one-screen-page .rights a:active,
+.bodywebsite .one-screen-page .rights a:focus {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .one-screen-page .rights a:hover {
+ color: #ababab;
+}
+@media (min-width: 576px) {
+ .bodywebsite .one-screen-page .page-inner {
+ text-align: left;
+ }
+}
+@media (min-width: 1800px) {
+ .bodywebsite .one-screen-page .page-head-inner {
+ padding: 50px 0 10px;
+ }
+ .bodywebsite .one-screen-page .page-content {
+ padding: 30px 0;
+ }
+ .bodywebsite .one-screen-page .page-foot-inner {
+ padding: 50px 0 23px;
+ }
+}
+.bodywebsite .ie-10 .one-screen-page,
+.bodywebsite .ie-11 .one-screen-page {
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+.bodywebsite .inset-left-0 {
+ padding-left: 0;
+}
+.bodywebsite .inset-left-10 {
+ padding-left: 10px;
+}
+.bodywebsite .inset-left-15 {
+ padding-left: 15px;
+}
+.bodywebsite .inset-left-20 {
+ padding-left: 20px;
+}
+.bodywebsite .inset-left-30 {
+ padding-left: 30px;
+}
+.bodywebsite .inset-left-40 {
+ padding-left: 40px;
+}
+.bodywebsite .inset-left-50 {
+ padding-left: 50px;
+}
+.bodywebsite .inset-left-60 {
+ padding-left: 60px;
+}
+.bodywebsite .inset-left-70 {
+ padding-left: 70px;
+}
+.bodywebsite .inset-left-85 {
+ padding-left: 85px;
+}
+.bodywebsite .inset-left-100 {
+ padding-left: 100px;
+}
+@media (min-width: 576px) {
+ .bodywebsite .inset-sm-left-0 {
+ padding-left: 0;
+ }
+ .bodywebsite .inset-sm-left-10 {
+ padding-left: 10px;
+ }
+ .bodywebsite .inset-sm-left-15 {
+ padding-left: 15px;
+ }
+ .bodywebsite .inset-sm-left-20 {
+ padding-left: 20px;
+ }
+ .bodywebsite .inset-sm-left-30 {
+ padding-left: 30px;
+ }
+ .bodywebsite .inset-sm-left-40 {
+ padding-left: 40px;
+ }
+ .bodywebsite .inset-sm-left-50 {
+ padding-left: 50px;
+ }
+ .bodywebsite .inset-sm-left-60 {
+ padding-left: 60px;
+ }
+ .bodywebsite .inset-sm-left-70 {
+ padding-left: 70px;
+ }
+ .bodywebsite .inset-sm-left-85 {
+ padding-left: 85px;
+ }
+ .bodywebsite .inset-sm-left-100 {
+ padding-left: 100px;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .inset-md-left-0 {
+ padding-left: 0;
+ }
+ .bodywebsite .inset-md-left-10 {
+ padding-left: 10px;
+ }
+ .bodywebsite .inset-md-left-15 {
+ padding-left: 15px;
+ }
+ .bodywebsite .inset-md-left-20 {
+ padding-left: 20px;
+ }
+ .bodywebsite .inset-md-left-30 {
+ padding-left: 30px;
+ }
+ .bodywebsite .inset-md-left-40 {
+ padding-left: 40px;
+ }
+ .bodywebsite .inset-md-left-50 {
+ padding-left: 50px;
+ }
+ .bodywebsite .inset-md-left-60 {
+ padding-left: 60px;
+ }
+ .bodywebsite .inset-md-left-70 {
+ padding-left: 70px;
+ }
+ .bodywebsite .inset-md-left-85 {
+ padding-left: 85px;
+ }
+ .bodywebsite .inset-md-left-100 {
+ padding-left: 100px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .inset-lg-left-0 {
+ padding-left: 0;
+ }
+ .bodywebsite .inset-lg-left-10 {
+ padding-left: 10px;
+ }
+ .bodywebsite .inset-lg-left-15 {
+ padding-left: 15px;
+ }
+ .bodywebsite .inset-lg-left-20 {
+ padding-left: 20px;
+ }
+ .bodywebsite .inset-lg-left-30 {
+ padding-left: 30px;
+ }
+ .bodywebsite .inset-lg-left-40 {
+ padding-left: 40px;
+ }
+ .bodywebsite .inset-lg-left-50 {
+ padding-left: 50px;
+ }
+ .bodywebsite .inset-lg-left-60 {
+ padding-left: 60px;
+ }
+ .bodywebsite .inset-lg-left-70 {
+ padding-left: 70px;
+ }
+ .bodywebsite .inset-lg-left-85 {
+ padding-left: 85px;
+ }
+ .bodywebsite .inset-lg-left-100 {
+ padding-left: 100px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .inset-xl-left-0 {
+ padding-left: 0;
+ }
+ .bodywebsite .inset-xl-left-10 {
+ padding-left: 10px;
+ }
+ .bodywebsite .inset-xl-left-15 {
+ padding-left: 15px;
+ }
+ .bodywebsite .inset-xl-left-20 {
+ padding-left: 20px;
+ }
+ .bodywebsite .inset-xl-left-30 {
+ padding-left: 30px;
+ }
+ .bodywebsite .inset-xl-left-40 {
+ padding-left: 40px;
+ }
+ .bodywebsite .inset-xl-left-50 {
+ padding-left: 50px;
+ }
+ .bodywebsite .inset-xl-left-60 {
+ padding-left: 60px;
+ }
+ .bodywebsite .inset-xl-left-70 {
+ padding-left: 70px;
+ }
+ .bodywebsite .inset-xl-left-85 {
+ padding-left: 85px;
+ }
+ .bodywebsite .inset-xl-left-100 {
+ padding-left: 100px;
+ }
+}
+@media (min-width: 1800px) {
+ .bodywebsite .inset-xxl-left-0 {
+ padding-left: 0;
+ }
+ .bodywebsite .inset-xxl-left-10 {
+ padding-left: 10px;
+ }
+ .bodywebsite .inset-xxl-left-15 {
+ padding-left: 15px;
+ }
+ .bodywebsite .inset-xxl-left-20 {
+ padding-left: 20px;
+ }
+ .bodywebsite .inset-xxl-left-30 {
+ padding-left: 30px;
+ }
+ .bodywebsite .inset-xxl-left-40 {
+ padding-left: 40px;
+ }
+ .bodywebsite .inset-xxl-left-50 {
+ padding-left: 50px;
+ }
+ .bodywebsite .inset-xxl-left-60 {
+ padding-left: 60px;
+ }
+ .bodywebsite .inset-xxl-left-70 {
+ padding-left: 70px;
+ }
+ .bodywebsite .inset-xxl-left-85 {
+ padding-left: 85px;
+ }
+ .bodywebsite .inset-xxl-left-100 {
+ padding-left: 100px;
+ }
+}
+.bodywebsite .inset-right-0 {
+ padding-right: 0;
+}
+.bodywebsite .inset-right-10 {
+ padding-right: 10px;
+}
+.bodywebsite .inset-right-15 {
+ padding-right: 15px;
+}
+.bodywebsite .inset-right-20 {
+ padding-right: 20px;
+}
+.bodywebsite .inset-right-30 {
+ padding-right: 30px;
+}
+.bodywebsite .inset-right-40 {
+ padding-right: 40px;
+}
+.bodywebsite .inset-right-50 {
+ padding-right: 50px;
+}
+.bodywebsite .inset-right-60 {
+ padding-right: 60px;
+}
+.bodywebsite .inset-right-70 {
+ padding-right: 70px;
+}
+.bodywebsite .inset-right-85 {
+ padding-right: 85px;
+}
+.bodywebsite .inset-right-100 {
+ padding-right: 100px;
+}
+@media (min-width: 576px) {
+ .bodywebsite .inset-sm-right-0 {
+ padding-right: 0;
+ }
+ .bodywebsite .inset-sm-right-10 {
+ padding-right: 10px;
+ }
+ .bodywebsite .inset-sm-right-15 {
+ padding-right: 15px;
+ }
+ .bodywebsite .inset-sm-right-20 {
+ padding-right: 20px;
+ }
+ .bodywebsite .inset-sm-right-30 {
+ padding-right: 30px;
+ }
+ .bodywebsite .inset-sm-right-40 {
+ padding-right: 40px;
+ }
+ .bodywebsite .inset-sm-right-50 {
+ padding-right: 50px;
+ }
+ .bodywebsite .inset-sm-right-60 {
+ padding-right: 60px;
+ }
+ .bodywebsite .inset-sm-right-70 {
+ padding-right: 70px;
+ }
+ .bodywebsite .inset-sm-right-85 {
+ padding-right: 85px;
+ }
+ .bodywebsite .inset-sm-right-100 {
+ padding-right: 100px;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .inset-md-right-0 {
+ padding-right: 0;
+ }
+ .bodywebsite .inset-md-right-10 {
+ padding-right: 10px;
+ }
+ .bodywebsite .inset-md-right-15 {
+ padding-right: 15px;
+ }
+ .bodywebsite .inset-md-right-20 {
+ padding-right: 20px;
+ }
+ .bodywebsite .inset-md-right-30 {
+ padding-right: 30px;
+ }
+ .bodywebsite .inset-md-right-40 {
+ padding-right: 40px;
+ }
+ .bodywebsite .inset-md-right-50 {
+ padding-right: 50px;
+ }
+ .bodywebsite .inset-md-right-60 {
+ padding-right: 60px;
+ }
+ .bodywebsite .inset-md-right-70 {
+ padding-right: 70px;
+ }
+ .bodywebsite .inset-md-right-85 {
+ padding-right: 85px;
+ }
+ .bodywebsite .inset-md-right-100 {
+ padding-right: 100px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .inset-lg-right-0 {
+ padding-right: 0;
+ }
+ .bodywebsite .inset-lg-right-10 {
+ padding-right: 10px;
+ }
+ .bodywebsite .inset-lg-right-15 {
+ padding-right: 15px;
+ }
+ .bodywebsite .inset-lg-right-20 {
+ padding-right: 20px;
+ }
+ .bodywebsite .inset-lg-right-30 {
+ padding-right: 30px;
+ }
+ .bodywebsite .inset-lg-right-40 {
+ padding-right: 40px;
+ }
+ .bodywebsite .inset-lg-right-50 {
+ padding-right: 50px;
+ }
+ .bodywebsite .inset-lg-right-60 {
+ padding-right: 60px;
+ }
+ .bodywebsite .inset-lg-right-70 {
+ padding-right: 70px;
+ }
+ .bodywebsite .inset-lg-right-85 {
+ padding-right: 85px;
+ }
+ .bodywebsite .inset-lg-right-100 {
+ padding-right: 100px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .inset-xl-right-0 {
+ padding-right: 0;
+ }
+ .bodywebsite .inset-xl-right-10 {
+ padding-right: 10px;
+ }
+ .bodywebsite .inset-xl-right-15 {
+ padding-right: 15px;
+ }
+ .bodywebsite .inset-xl-right-20 {
+ padding-right: 20px;
+ }
+ .bodywebsite .inset-xl-right-30 {
+ padding-right: 30px;
+ }
+ .bodywebsite .inset-xl-right-40 {
+ padding-right: 40px;
+ }
+ .bodywebsite .inset-xl-right-50 {
+ padding-right: 50px;
+ }
+ .bodywebsite .inset-xl-right-60 {
+ padding-right: 60px;
+ }
+ .bodywebsite .inset-xl-right-70 {
+ padding-right: 70px;
+ }
+ .bodywebsite .inset-xl-right-85 {
+ padding-right: 85px;
+ }
+ .bodywebsite .inset-xl-right-100 {
+ padding-right: 100px;
+ }
+}
+@media (min-width: 1800px) {
+ .bodywebsite .inset-xxl-right-0 {
+ padding-right: 0;
+ }
+ .bodywebsite .inset-xxl-right-10 {
+ padding-right: 10px;
+ }
+ .bodywebsite .inset-xxl-right-15 {
+ padding-right: 15px;
+ }
+ .bodywebsite .inset-xxl-right-20 {
+ padding-right: 20px;
+ }
+ .bodywebsite .inset-xxl-right-30 {
+ padding-right: 30px;
+ }
+ .bodywebsite .inset-xxl-right-40 {
+ padding-right: 40px;
+ }
+ .bodywebsite .inset-xxl-right-50 {
+ padding-right: 50px;
+ }
+ .bodywebsite .inset-xxl-right-60 {
+ padding-right: 60px;
+ }
+ .bodywebsite .inset-xxl-right-70 {
+ padding-right: 70px;
+ }
+ .bodywebsite .inset-xxl-right-85 {
+ padding-right: 85px;
+ }
+ .bodywebsite .inset-xxl-right-100 {
+ padding-right: 100px;
+ }
+}
+.bodywebsite .container + .container {
+ margin-top: 60px;
+}
+.bodywebsite h3.section-title {
+ color: #000;
+}
+.bodywebsite h4 + .section-title {
+ margin-top: 2px;
+}
+.bodywebsite h4 + .comment-list {
+ margin-top: 30px;
+}
+.bodywebsite h3 + p {
+ margin-top: 15px;
+}
+.bodywebsite h3 + p.h4 {
+ margin-top: 2px;
+}
+.bodywebsite h3 + .row {
+ margin-top: 40px;
+}
+.bodywebsite h3 + * {
+ margin-top: 40px;
+}
+.bodywebsite .row + .row {
+ margin-top: 60px;
+}
+.bodywebsite * + .row.list-md-dashed {
+ margin-top: 60px;
+}
+.bodywebsite .row + .button-block {
+ margin-top: 60px;
+}
+.bodywebsite .slick-slider + .slick-slider.carousel-parent {
+ margin-top: 35px;
+}
+.bodywebsite .quote-left + .button-block {
+ margin-top: 22px;
+}
+.bodywebsite .aside-title + * {
+ margin-top: 22px;
+}
+.bodywebsite * + .button-group {
+ margin-top: 25px;
+}
+html .bodywebsite .page .offset-top-0 {
+ margin-top: 0;
+}
+html .bodywebsite .page .offset-top-2 {
+ margin-top: 2px;
+}
+html .bodywebsite .page .offset-top-5 {
+ margin-top: 5px;
+}
+html .bodywebsite .page .offset-top-10 {
+ margin-top: 10px;
+}
+html .bodywebsite .page .offset-top-15 {
+ margin-top: 15px;
+}
+html .bodywebsite .page .offset-top-22 {
+ margin-top: 22px;
+}
+html .bodywebsite .page .offset-top-27 {
+ margin-top: 27px;
+}
+html .bodywebsite .page .offset-top-30 {
+ margin-top: 30px;
+}
+html .bodywebsite .page .offset-top-35 {
+ margin-top: 35px;
+}
+html .bodywebsite .page .offset-top-40 {
+ margin-top: 40px;
+}
+html .bodywebsite .page .offset-top-45 {
+ margin-top: 45px;
+}
+html .bodywebsite .page .offset-top-50 {
+ margin-top: 50px;
+}
+html .bodywebsite .page .offset-top-60 {
+ margin-top: 60px;
+}
+html .bodywebsite .page .offset-top-75 {
+ margin-top: 75px;
+}
+html .bodywebsite .page .offset-top-90 {
+ margin-top: 90px;
+}
+html .bodywebsite .page .offset-top-100 {
+ margin-top: 100px;
+}
+html .bodywebsite .page .offset-top-120 {
+ margin-top: 120px;
+}
+@media (min-width: 576px) {
+ html .bodywebsite .page .offset-sm-top-0 {
+ margin-top: 0;
+ }
+ html .bodywebsite .page .offset-sm-top-2 {
+ margin-top: 2px;
+ }
+ html .bodywebsite .page .offset-sm-top-5 {
+ margin-top: 5px;
+ }
+ html .bodywebsite .page .offset-sm-top-10 {
+ margin-top: 10px;
+ }
+ html .bodywebsite .page .offset-sm-top-15 {
+ margin-top: 15px;
+ }
+ html .bodywebsite .page .offset-sm-top-22 {
+ margin-top: 22px;
+ }
+ html .bodywebsite .page .offset-sm-top-27 {
+ margin-top: 27px;
+ }
+ html .bodywebsite .page .offset-sm-top-30 {
+ margin-top: 30px;
+ }
+ html .bodywebsite .page .offset-sm-top-35 {
+ margin-top: 35px;
+ }
+ html .bodywebsite .page .offset-sm-top-40 {
+ margin-top: 40px;
+ }
+ html .bodywebsite .page .offset-sm-top-45 {
+ margin-top: 45px;
+ }
+ html .bodywebsite .page .offset-sm-top-50 {
+ margin-top: 50px;
+ }
+ html .bodywebsite .page .offset-sm-top-60 {
+ margin-top: 60px;
+ }
+ html .bodywebsite .page .offset-sm-top-75 {
+ margin-top: 75px;
+ }
+ html .bodywebsite .page .offset-sm-top-90 {
+ margin-top: 90px;
+ }
+ html .bodywebsite .page .offset-sm-top-100 {
+ margin-top: 100px;
+ }
+ html .bodywebsite .page .offset-sm-top-120 {
+ margin-top: 120px;
+ }
+}
+@media (min-width: 768px) {
+ html .bodywebsite .page .offset-md-top-0 {
+ margin-top: 0;
+ }
+ html .bodywebsite .page .offset-md-top-2 {
+ margin-top: 2px;
+ }
+ html .bodywebsite .page .offset-md-top-5 {
+ margin-top: 5px;
+ }
+ html .bodywebsite .page .offset-md-top-10 {
+ margin-top: 10px;
+ }
+ html .bodywebsite .page .offset-md-top-15 {
+ margin-top: 15px;
+ }
+ html .bodywebsite .page .offset-md-top-22 {
+ margin-top: 22px;
+ }
+ html .bodywebsite .page .offset-md-top-27 {
+ margin-top: 27px;
+ }
+ html .bodywebsite .page .offset-md-top-30 {
+ margin-top: 30px;
+ }
+ html .bodywebsite .page .offset-md-top-35 {
+ margin-top: 35px;
+ }
+ html .bodywebsite .page .offset-md-top-40 {
+ margin-top: 40px;
+ }
+ html .bodywebsite .page .offset-md-top-45 {
+ margin-top: 45px;
+ }
+ html .bodywebsite .page .offset-md-top-50 {
+ margin-top: 50px;
+ }
+ html .bodywebsite .page .offset-md-top-60 {
+ margin-top: 60px;
+ }
+ html .bodywebsite .page .offset-md-top-75 {
+ margin-top: 75px;
+ }
+ html .bodywebsite .page .offset-md-top-90 {
+ margin-top: 90px;
+ }
+ html .bodywebsite .page .offset-md-top-100 {
+ margin-top: 100px;
+ }
+ html .bodywebsite .page .offset-md-top-120 {
+ margin-top: 120px;
+ }
+}
+@media (min-width: 992px) {
+ html .bodywebsite .page .offset-lg-top-0 {
+ margin-top: 0;
+ }
+ html .bodywebsite .page .offset-lg-top-2 {
+ margin-top: 2px;
+ }
+ html .bodywebsite .page .offset-lg-top-5 {
+ margin-top: 5px;
+ }
+ html .bodywebsite .page .offset-lg-top-10 {
+ margin-top: 10px;
+ }
+ html .bodywebsite .page .offset-lg-top-15 {
+ margin-top: 15px;
+ }
+ html .bodywebsite .page .offset-lg-top-22 {
+ margin-top: 22px;
+ }
+ html .bodywebsite .page .offset-lg-top-27 {
+ margin-top: 27px;
+ }
+ html .bodywebsite .page .offset-lg-top-30 {
+ margin-top: 30px;
+ }
+ html .bodywebsite .page .offset-lg-top-35 {
+ margin-top: 35px;
+ }
+ html .bodywebsite .page .offset-lg-top-40 {
+ margin-top: 40px;
+ }
+ html .bodywebsite .page .offset-lg-top-45 {
+ margin-top: 45px;
+ }
+ html .bodywebsite .page .offset-lg-top-50 {
+ margin-top: 50px;
+ }
+ html .bodywebsite .page .offset-lg-top-60 {
+ margin-top: 60px;
+ }
+ html .bodywebsite .page .offset-lg-top-75 {
+ margin-top: 75px;
+ }
+ html .bodywebsite .page .offset-lg-top-90 {
+ margin-top: 90px;
+ }
+ html .bodywebsite .page .offset-lg-top-100 {
+ margin-top: 100px;
+ }
+ html .bodywebsite .page .offset-lg-top-120 {
+ margin-top: 120px;
+ }
+}
+@media (min-width: 1200px) {
+ html .bodywebsite .page .offset-xl-top-0 {
+ margin-top: 0;
+ }
+ html .bodywebsite .page .offset-xl-top-2 {
+ margin-top: 2px;
+ }
+ html .bodywebsite .page .offset-xl-top-5 {
+ margin-top: 5px;
+ }
+ html .bodywebsite .page .offset-xl-top-10 {
+ margin-top: 10px;
+ }
+ html .bodywebsite .page .offset-xl-top-15 {
+ margin-top: 15px;
+ }
+ html .bodywebsite .page .offset-xl-top-22 {
+ margin-top: 22px;
+ }
+ html .bodywebsite .page .offset-xl-top-27 {
+ margin-top: 27px;
+ }
+ html .bodywebsite .page .offset-xl-top-30 {
+ margin-top: 30px;
+ }
+ html .bodywebsite .page .offset-xl-top-35 {
+ margin-top: 35px;
+ }
+ html .bodywebsite .page .offset-xl-top-40 {
+ margin-top: 40px;
+ }
+ html .bodywebsite .page .offset-xl-top-45 {
+ margin-top: 45px;
+ }
+ html .bodywebsite .page .offset-xl-top-50 {
+ margin-top: 50px;
+ }
+ html .bodywebsite .page .offset-xl-top-60 {
+ margin-top: 60px;
+ }
+ html .bodywebsite .page .offset-xl-top-75 {
+ margin-top: 75px;
+ }
+ html .bodywebsite .page .offset-xl-top-90 {
+ margin-top: 90px;
+ }
+ html .bodywebsite .page .offset-xl-top-100 {
+ margin-top: 100px;
+ }
+ html .bodywebsite .page .offset-xl-top-120 {
+ margin-top: 120px;
+ }
+}
+@media (min-width: 1800px) {
+ html .bodywebsite .page .offset-xxl-top-0 {
+ margin-top: 0;
+ }
+ html .bodywebsite .page .offset-xxl-top-2 {
+ margin-top: 2px;
+ }
+ html .bodywebsite .page .offset-xxl-top-5 {
+ margin-top: 5px;
+ }
+ html .bodywebsite .page .offset-xxl-top-10 {
+ margin-top: 10px;
+ }
+ html .bodywebsite .page .offset-xxl-top-15 {
+ margin-top: 15px;
+ }
+ html .bodywebsite .page .offset-xxl-top-22 {
+ margin-top: 22px;
+ }
+ html .bodywebsite .page .offset-xxl-top-27 {
+ margin-top: 27px;
+ }
+ html .bodywebsite .page .offset-xxl-top-30 {
+ margin-top: 30px;
+ }
+ html .bodywebsite .page .offset-xxl-top-35 {
+ margin-top: 35px;
+ }
+ html .bodywebsite .page .offset-xxl-top-40 {
+ margin-top: 40px;
+ }
+ html .bodywebsite .page .offset-xxl-top-45 {
+ margin-top: 45px;
+ }
+ html .bodywebsite .page .offset-xxl-top-50 {
+ margin-top: 50px;
+ }
+ html .bodywebsite .page .offset-xxl-top-60 {
+ margin-top: 60px;
+ }
+ html .bodywebsite .page .offset-xxl-top-75 {
+ margin-top: 75px;
+ }
+ html .bodywebsite .page .offset-xxl-top-90 {
+ margin-top: 90px;
+ }
+ html .bodywebsite .page .offset-xxl-top-100 {
+ margin-top: 100px;
+ }
+ html .bodywebsite .page .offset-xxl-top-120 {
+ margin-top: 120px;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .shift-sm-top-1 {
+ margin-top: -18px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .shift-sm-top-1 {
+ margin-top: -23px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .shift-md-top-1 {
+ margin-top: -33px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .shift-md-top-1 {
+ margin-top: -43px;
+ }
+}
+.bodywebsite .row-0 {
+ margin-bottom: 0px;
+}
+.bodywebsite .row-0:empty {
+ margin-bottom: 0;
+}
+.bodywebsite .row-0 > * {
+ margin-bottom: 0px;
+}
+.bodywebsite .row-15 {
+ margin-bottom: -15px;
+}
+.bodywebsite .row-15:empty {
+ margin-bottom: 0;
+}
+.bodywebsite .row-15 > * {
+ margin-bottom: 15px;
+}
+.bodywebsite .row-20 {
+ margin-bottom: -20px;
+}
+.bodywebsite .row-20:empty {
+ margin-bottom: 0;
+}
+.bodywebsite .row-20 > * {
+ margin-bottom: 20px;
+}
+.bodywebsite .row-30 {
+ margin-bottom: -30px;
+}
+.bodywebsite .row-30:empty {
+ margin-bottom: 0;
+}
+.bodywebsite .row-30 > * {
+ margin-bottom: 30px;
+}
+.bodywebsite .row-40 {
+ margin-bottom: -40px;
+}
+.bodywebsite .row-40:empty {
+ margin-bottom: 0;
+}
+.bodywebsite .row-40 > * {
+ margin-bottom: 40px;
+}
+.bodywebsite .row-50 {
+ margin-bottom: -50px;
+}
+.bodywebsite .row-50:empty {
+ margin-bottom: 0;
+}
+.bodywebsite .row-50 > * {
+ margin-bottom: 50px;
+}
+.bodywebsite .row-60 {
+ margin-bottom: -60px;
+}
+.bodywebsite .row-60:empty {
+ margin-bottom: 0;
+}
+.bodywebsite .row-60 > * {
+ margin-bottom: 60px;
+}
+@media (min-width: 576px) {
+ .bodywebsite .row-sm-50 {
+ margin-bottom: -50px;
+ }
+ .bodywebsite .row-sm-50:empty {
+ margin-bottom: 0;
+ }
+ .bodywebsite .row-sm-50 > * {
+ margin-bottom: 50px;
+ }
+ .bodywebsite .row-sm-0 {
+ margin-bottom: 0px;
+ }
+ .bodywebsite .row-sm-0:empty {
+ margin-bottom: 0;
+ }
+ .bodywebsite .row-sm-0 > * {
+ margin-bottom: 0px;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .row-md-60 {
+ margin-bottom: -60px;
+ }
+ .bodywebsite .row-md-60:empty {
+ margin-bottom: 0;
+ }
+ .bodywebsite .row-md-60 > * {
+ margin-bottom: 60px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .row-md-30 {
+ margin-bottom: -30px;
+ }
+ .bodywebsite .row-md-30:empty {
+ margin-bottom: 0;
+ }
+ .bodywebsite .row-md-30 > * {
+ margin-bottom: 30px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .row-xl-100 {
+ margin-bottom: -100px;
+ }
+ .bodywebsite .row-xl-100:empty {
+ margin-bottom: 0;
+ }
+ .bodywebsite .row-xl-100 > * {
+ margin-bottom: 100px;
+ }
+ .bodywebsite .row-xl-90 {
+ margin-bottom: -90px;
+ }
+ .bodywebsite .row-xl-90:empty {
+ margin-bottom: 0;
+ }
+ .bodywebsite .row-xl-90 > * {
+ margin-bottom: 90px;
+ }
+}
+.bodywebsite .link {
+ display: inline-block;
+}
+.bodywebsite .link-inline {
+ font: inherit;
+ line-height: inherit;
+ text-decoration: underline;
+}
+.bodywebsite .link-underline,
+.bodywebsite .link-underline:active,
+.bodywebsite .link-underline:focus {
+ text-decoration: underline;
+}
+.bodywebsite .link-underline:hover {
+ text-decoration: none;
+}
+.bodywebsite .link-circle {
+ border-radius: 50%;
+}
+.bodywebsite .link-circle .icon,
+.bodywebsite .link-circle .icon:before {
+ position: static;
+}
+.bodywebsite .link-bold {
+ font: 700 18px/22px "Roboto", Helvetica, Arial, sans-serif;
+}
+.bodywebsite .link-group {
+ white-space: nowrap;
+}
+.bodywebsite .link-group * {
+ vertical-align: middle;
+}
+.bodywebsite .link-group span {
+ display: inline-block;
+}
+.bodywebsite .link-group span + *,
+.bodywebsite .link-group * + span {
+ margin-left: 5px;
+}
+.bodywebsite .link-group.link-group-animated .icon {
+ position: relative;
+ right: 0;
+ transition: .22s;
+}
+.bodywebsite .link-group.link-group-animated:hover .icon {
+ right: -5px;
+}
+.bodywebsite .link-group-baseline * {
+ vertical-align: baseline;
+}
+.bodywebsite .link-icon,
+.bodywebsite .link-icon * {
+ vertical-align: middle;
+}
+.bodywebsite .link-icon .icon {
+ margin-right: 5px;
+}
+.bodywebsite .link-icon-mod .icon {
+ position: relative;
+ top: -3px;
+}
+.bodywebsite .link-image img {
+ width: auto;
+ transition: .44s all ease;
+ opacity: .5;
+}
+.bodywebsite .link-image:hover img {
+ opacity: 1;
+}
+.bodywebsite .link-image-wrap {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ min-height: 126px;
+}
+.bodywebsite * + .link-image-wrap {
+ margin-top: 13px;
+}
+.bodywebsite .page .link-primary-inline {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .page .link-primary-inline.active,
+.bodywebsite .page .link-primary-inline:active,
+.bodywebsite .page .link-primary-inline:focus {
+ color: #9b9b9b;
+}
+.bodywebsite .page .link-primary-inline.hover,
+.bodywebsite .page .link-primary-inline:hover {
+ color: #42b294;
+}
+.bodywebsite .page .link-default,
+.bodywebsite .page .link-default:active,
+.bodywebsite .page .link-default:focus {
+ color: #9f9f9f;
+}
+.bodywebsite .page .link-default:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .page .link-primary,
+.bodywebsite .page .link-primary:active,
+.bodywebsite .page .link-primary:focus {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .page .link-primary:hover {
+ color: #00030a;
+}
+.bodywebsite .page .link-primary-inverse,
+.bodywebsite .page .link-primary-inverse:active,
+.bodywebsite .page .link-primary-inverse:focus {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .page .link-primary-inverse:hover {
+ color: #ddd;
+}
+.bodywebsite .page .link-primary-inverse-v2,
+.bodywebsite .page .link-primary-inverse-v2:active,
+.bodywebsite .page .link-primary-inverse-v2:focus {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .page .link-primary-inverse-v2:hover {
+ color: #fff;
+}
+.bodywebsite .page .link-secondary,
+.bodywebsite .page .link-secondary:active,
+.bodywebsite .page .link-secondary:focus {
+ color: #00030a;
+}
+.bodywebsite .page .link-secondary:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .page .link-tundora,
+.bodywebsite .page .link-tundora:active,
+.bodywebsite .page .link-tundora:focus {
+ color: #414141;
+}
+.bodywebsite .page .link-tundora:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .page .link-tundora-inverse,
+.bodywebsite .page .link-tundora-inverse:active,
+.bodywebsite .page .link-tundora-inverse:focus {
+ color: #414141;
+}
+.bodywebsite .page .link-tundora-inverse:hover {
+ color: #fff;
+}
+.bodywebsite .page .link-secondary,
+.bodywebsite .page .link-secondary:active,
+.bodywebsite .page .link-secondary:focus {
+ color: #000;
+}
+.bodywebsite .page .link-secondary:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .page .link-gray-light,
+.bodywebsite .page .link-gray-light:active,
+.bodywebsite .page .link-gray-light:focus {
+ color: #dedede;
+}
+.bodywebsite .page .link-gray-light:hover {
+ color: #000;
+}
+.bodywebsite .page .link-white,
+.bodywebsite .page .link-white:active,
+.bodywebsite .page .link-white:focus {
+ color: #fff;
+}
+.bodywebsite .page .link-white:hover {
+ color: #fff;
+}
+.bodywebsite .page .link-black,
+.bodywebsite .page .link-black:active,
+.bodywebsite .page .link-black:focus {
+ color: #000;
+}
+.bodywebsite .page .link-black:hover {
+ color: maincolorbis) ? 'rgb(50, 120, 180)' : '#'.$website->maincolorbis; ?>;
+}
+.bodywebsite .page .link-black:hover {
+ text-decoration: underline;
+}
+.bodywebsite .page .link-gray-dark-filled,
+.bodywebsite .page .link-gray-dark-filled:active,
+.bodywebsite .page .link-gray-dark-filled:focus {
+ color: #fff;
+ background: #2a2b2b;
+}
+.bodywebsite .page .link-gray-dark-filled:hover {
+ color: #fff;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .page .link-shop {
+ width: 25px;
+ height: 25px;
+ font-size: 25px;
+ line-height: 25px;
+}
+.bodywebsite .page .link-shop,
+.bodywebsite .page .link-shop:active,
+.bodywebsite .page .link-shop:focus {
+ color: #00030a;
+}
+.bodywebsite .page .link-shop:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite ul,
+.bodywebsite ol {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+.bodywebsite dl {
+ margin: 0;
+}
+.bodywebsite dt {
+ font-weight: inherit;
+}
+.bodywebsite .list > li + li {
+ margin-top: 5px;
+}
+.bodywebsite .list-xl > li + li {
+ margin-top: 44px;
+}
+.bodywebsite .list-inline {
+ margin-left: -5px;
+ margin-right: -5px;
+ vertical-align: baseline;
+}
+.bodywebsite .list-inline > li {
+ display: inline-block;
+ padding-left: 8px;
+ padding-right: 8px;
+}
+.bodywebsite .list-inline-xs {
+ margin-left: -6px;
+ margin-right: -6px;
+}
+.bodywebsite .list-inline-xs > li {
+ display: inline-block;
+ padding-left: 6px;
+ padding-right: 6px;
+}
+.bodywebsite .list-inline-sm {
+ margin-left: -10px;
+ margin-right: -10px;
+}
+.bodywebsite .list-inline-sm > li {
+ display: inline-block;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+.bodywebsite .list-inline-md {
+ margin-left: -15px;
+ margin-right: -15px;
+}
+.bodywebsite .list-inline-md > li {
+ display: inline-block;
+ padding-left: 15px;
+ padding-right: 15px;
+}
+.bodywebsite .list-objects-inline {
+ margin-bottom: -4px;
+ margin-left: -22px;
+ transform: translateY(-4px);
+}
+.bodywebsite .list-objects-inline > *,
+.bodywebsite .list-objects-inline > *:first-child {
+ display: inline-block;
+ vertical-align: middle;
+ margin-top: 4px;
+ margin-left: 22px;
+}
+.bodywebsite .list-objects-inline > li > * {
+ display: inline-block;
+ vertical-align: middle;
+}
+.bodywebsite .list-objects-inline > li > * + * {
+ margin-left: 5px;
+}
+.bodywebsite .list-terms dt + dd {
+ margin-top: 10px;
+}
+.bodywebsite .list-terms dd + dt {
+ margin-top: 31px;
+}
+.bodywebsite .list-terms-variant-1 dt {
+ font: 700 16px/22px "Roboto", Helvetica, Arial, sans-serif;
+ letter-spacing: -0.025em;
+ color: #000;
+}
+.bodywebsite .list-terms-variant-1 dt + dd {
+ margin-top: 18px;
+}
+.bodywebsite .list-terms-variant-1 dd + dt {
+ margin-top: 40px;
+}
+@media (min-width: 1200px) {
+ .bodywebsite .list-terms-variant-1 dt {
+ font-size: 24px;
+ line-height: 1.2;
+ }
+ .bodywebsite .list-terms-variant-1 dd + dt {
+ margin-top: 50px;
+ }
+}
+.bodywebsite .list-inline-dashed {
+ margin-left: -15px;
+}
+.bodywebsite .list-inline-dashed li {
+ padding-left: 15px;
+ padding-right: 10px;
+}
+.bodywebsite .list-inline-dashed li:after {
+ content: '|';
+ position: relative;
+ right: -12.5px;
+ color: #e5e7e9;
+}
+.bodywebsite .list-inline-dashed li:last-child {
+ padding-right: 0;
+}
+.bodywebsite .list-inline-dashed li:last-child:after {
+ display: none;
+}
+@media (min-width: 992px) {
+ .bodywebsite .list-md-dashed > * {
+ position: relative;
+ }
+ .bodywebsite .list-md-dashed > *:after {
+ content: '';
+ position: absolute;
+ font-weight: 100;
+ top: 0;
+ right: -6%;
+ height: 73px;
+ -webkit-transform: translateX(-50%) skew(-21deg);
+ transform: translateX(-50%) skew(-21deg);
+ width: 1px;
+ background: #48494a;
+ }
+}
+@media (min-width: 992px) and (min-width: 1200px) {
+ .bodywebsite .list-md-dashed > *:after {
+ right: -3%;
+ height: 120px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .list-md-dashed > *:last-child::after {
+ display: none;
+ }
+}
+.bodywebsite .dl-inline {
+ vertical-align: middle;
+}
+.bodywebsite .dl-inline dt,
+.bodywebsite .dl-inline dd {
+ display: inline-block;
+ vertical-align: middle;
+}
+.bodywebsite .dl-inline dt {
+ padding-right: 5px;
+}
+.bodywebsite .dl-inline dt:after {
+ content: ':';
+}
+.bodywebsite .dl-inline .pricing-object-sm {
+ position: relative;
+ top: -5px;
+}
+.bodywebsite .list-terms-inline dt,
+.bodywebsite .list-terms-inline dd {
+ display: inline-block;
+}
+.bodywebsite .list-terms-inline dt {
+ color: #000;
+}
+.bodywebsite .list-terms-inline dd {
+ color: #9f9f9f;
+}
+.bodywebsite .list-terms-inline dt:after {
+ content: ':';
+}
+.bodywebsite .list-index {
+ counter-reset: li;
+}
+.bodywebsite .list-index > li .list-index-counter:before {
+ content: counter(li, decimal-leading-zero);
+ counter-increment: li;
+}
+.bodywebsite .list-marked li {
+ color: #000;
+ position: relative;
+ padding-left: 32px;
+}
+.bodywebsite .list-marked li:before {
+ position: absolute;
+ top: 1px;
+ left: 0;
+ content: '\e005';
+ font-family: "fl-flat-icons-set-2";
+ display: inline-block;
+ margin-right: 11px;
+ font-size: 13px;
+ line-height: inherit;
+ vertical-align: middle;
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .list-marked li:not(:last-child):after {
+ content: ';';
+}
+.bodywebsite .list-marked li:last-child:after {
+ content: '.';
+}
+.bodywebsite .list-marked li + li {
+ margin-top: 11px;
+}
+.bodywebsite .list-marked-spacing-lg li {
+ padding-left: 26px;
+}
+@media (min-width: 992px) and (max-width: 1799px) {
+ .bodywebsite .list-marked li {
+ padding-left: 24px;
+ font-size: 13px;
+ }
+ .bodywebsite .list-marked li:before {
+ font-size: 11px;
+ }
+}
+.bodywebsite .list-marked-variant-2 > li > a {
+ position: relative;
+ display: inline-block;
+}
+.bodywebsite .list-marked-variant-2 > li > a:hover:before {
+ left: 4px;
+}
+.bodywebsite .list-marked-variant-2 > li + li {
+ margin-top: 14px;
+}
+.bodywebsite .list-ordered {
+ counter-reset: li;
+}
+.bodywebsite .list-ordered li {
+ color: #000;
+}
+.bodywebsite .list-ordered li:before {
+ display: inline-block;
+ margin-right: 13px;
+ width: 15px;
+ content: counter(li, decimal) ".";
+ counter-increment: li;
+}
+.bodywebsite .list-ordered li:not(:last-child):after {
+ content: ';';
+}
+.bodywebsite .list-ordered li:last-child:after {
+ content: '.';
+}
+.bodywebsite .list-ordered li + li {
+ margin-top: 11px;
+}
+.bodywebsite .list-tags > li {
+ display: inline-block;
+ font-style: italic;
+}
+.bodywebsite .list-tags > li a,
+.bodywebsite .list-tags > li a:active,
+.bodywebsite .list-tags > li a:focus {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .list-tags > li a:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .list-tags > li:after {
+ content: ',';
+ display: inline-block;
+ color: #f9f9f9;
+}
+.bodywebsite .list-tags > li:last-child:after {
+ display: none;
+}
+.bodywebsite .list-numbered {
+ counter-reset: li;
+}
+.bodywebsite .list-numbered > li {
+ position: relative;
+ padding-left: 30px;
+}
+.bodywebsite .list-numbered > li:before {
+ position: absolute;
+ top: 0;
+ left: 0;
+ content: counter(li, decimal) ".";
+ counter-increment: li;
+}
+.bodywebsite .list-numbered > li + li {
+ margin-top: 10px;
+}
+.bodywebsite .list-icon-pack {
+ margin-top: 6px;
+}
+.bodywebsite .list-icon-pack > li {
+ margin-top: 25px;
+}
+.bodywebsite .list-icon-pack > li span {
+ display: block;
+}
+.bodywebsite .list-icon-pack > li span + span {
+ margin-left: .25em;
+}
+.bodywebsite .list-icon-pack h6 + *,
+.bodywebsite .list-icon-pack .h6 + * {
+ margin-top: 2px;
+}
+.bodywebsite .list-links > li {
+ display: inline-block;
+}
+.bodywebsite .list-links > li:after {
+ content: ';';
+}
+.bodywebsite .list-links > li:last-child:after {
+ display: none;
+}
+.bodywebsite .list-hashtags > li {
+ display: inline-block;
+}
+.bodywebsite .list-hashtags > li a {
+ color: inherit;
+}
+.bodywebsite .list-hashtags > li a:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .list-hashtags > li > a:before {
+ content: '#';
+}
+.bodywebsite .list-marked-bordered {
+ color: #000;
+}
+.bodywebsite .list-marked-bordered li a {
+ display: block;
+ padding: 10px 7px;
+ border-bottom: 1px solid #f9f9f9;
+}
+.bodywebsite .list-marked-bordered li a:before {
+ position: relative;
+ display: inline-block;
+ padding-right: 10px;
+ font-family: "Font Awesome 5 Free";
+ font-weight: 600;
+ font-size: initial;
+ line-height: inherit;
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ content: '\f105';
+}
+.bodywebsite .list-marked-bordered li a span {
+ color: inherit;
+ transition: color .33s;
+}
+.bodywebsite .list-marked-bordered li a span:first-child {
+ color: #000;
+}
+.bodywebsite .list-marked-bordered li a:hover,
+.bodywebsite .list-marked-bordered li a:hover span:nth-child(n) {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .list-marked-bordered li span:not(:last-child) {
+ margin-right: .25em;
+}
+.bodywebsite .list-bordered-horizontal {
+ position: relative;
+ transform: translateY(-7px);
+ margin-bottom: -7px;
+}
+.bodywebsite .list-bordered-horizontal > * {
+ margin-top: 7px;
+}
+.bodywebsite .list-bordered-horizontal > *:not(:last-child) {
+ margin-right: 35px;
+}
+@media (min-width: 768px) {
+ .bodywebsite .list-bordered-horizontal > li {
+ display: inline-block;
+ }
+ .bodywebsite .list-bordered-horizontal > li:not(:last-child) {
+ position: relative;
+ }
+ .bodywebsite .list-bordered-horizontal > li:not(:last-child):after {
+ content: '';
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+ right: -20px;
+ width: 1px;
+ height: 22px;
+ background: #dedede;
+ }
+}
+.bodywebsite .list-tag-blocks {
+ position: relative;
+ transform: translateY(-6px);
+ margin-bottom: -6px;
+}
+.bodywebsite .list-tag-blocks > * {
+ margin-top: 6px;
+}
+.bodywebsite .list-tag-blocks > *:not(:last-child) {
+ margin-right: 6px;
+}
+.bodywebsite .list-tag-blocks li {
+ display: inline-block;
+ font-size: 11px;
+ font-weight: 700;
+ text-transform: uppercase;
+}
+.bodywebsite .list-tag-blocks li a {
+ display: inline-block;
+ padding: 6px 19px;
+ border-radius: 0;
+ border: 1px solid transparent;
+}
+.bodywebsite .list-tag-blocks li a,
+.bodywebsite .list-tag-blocks li a:active,
+.bodywebsite .list-tag-blocks li a:focus {
+ color: #000;
+ background: #fff;
+}
+.bodywebsite .list-tag-blocks li a:hover {
+ background: transparent;
+ border-color: #cdcdcd;
+}
+.bodywebsite .list-progress {
+ font-family: "Roboto", Helvetica, Arial, sans-serif;
+ color: #00030a;
+}
+.bodywebsite .list-progress li + li {
+ margin-top: 23px;
+}
+.bodywebsite .list-progress p {
+ padding-right: 40px;
+}
+.bodywebsite .list-tags-inline > li {
+ display: inline;
+}
+.bodywebsite .list-tags-inline > li a {
+ color: inherit;
+}
+.bodywebsite .list-tags-inline > li a:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .list-tags-inline > li:not(:last-child):after {
+ content: ',';
+}
+.bodywebsite .list-rating {
+ font-size: 0;
+ line-height: 0;
+}
+.bodywebsite .list-rating > li {
+ display: inline-block;
+}
+.bodywebsite .list-rating .icon {
+ color: #ffd400;
+}
+.bodywebsite .list-wide-bordered {
+ color: #00030a;
+ font: 400 14px/22px "Roboto", Helvetica, Arial, sans-serif;
+ border-top: 1px solid #dedede;
+}
+.bodywebsite .list-wide-bordered dl {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ width: 100%;
+ font-weight: 700;
+}
+.bodywebsite .list-wide-bordered dl dt {
+ padding-right: 15px;
+}
+.bodywebsite .list-wide-bordered dl dd {
+ font-weight: 700;
+ font-size: 14px;
+}
+.bodywebsite .list-wide-bordered li {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ min-height: 54px;
+ padding: 10px 20px;
+ border-bottom: 1px solid #dedede;
+}
+.bodywebsite .list-wide-bordered + .list-wide-bordered {
+ border-top: 0;
+}
+@media (min-width: 768px) {
+ .bodywebsite .list-wide-bordered {
+ font-size: 16px;
+ }
+ .bodywebsite .list-wide-bordered li {
+ min-height: 73px;
+ padding: 20px 30px;
+ }
+}
+.bodywebsite .object-wrap {
+ position: relative;
+ overflow: hidden;
+}
+.bodywebsite .object-wrap-right > .object-wrap-body {
+ right: 0;
+}
+.bodywebsite .object-wrap-left > .object-wrap-body {
+ left: 0;
+}
+@media (min-width: 768px) {
+ .bodywebsite .object-wrap-sm-right > .object-wrap-body {
+ right: 0;
+ }
+ .bodywebsite .object-wrap-sm-left > .object-wrap-body {
+ left: 0;
+ }
+}
+
+@media (max-width: 767px) {
+ .bodywebsite .object-wrap-body {
+ position: relative;
+ overflow: hidden;
+ min-height: 300px;
+ width: 100%;
+ }
+ .bodywebsite .object-wrap-body > img {
+ position: absolute;
+ min-width: 100%;
+ max-width: none;
+ height: auto;
+ max-height: none;
+ top: 20%;
+ left: 50%;
+ transform: translate(-50%, -20%);
+ }
+ .bodywebsite .page .text-primary {
+ word-break: break-all;
+ }
+ .bodywebsite figure img {
+ margin: unset;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .object-wrap-body {
+ overflow: hidden;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ width: 100vw;
+ min-width: 1px;
+ max-width: none;
+ height: 100%;
+ min-height: 100%;
+ max-height: none;
+ margin: 0;
+ background: inherit;
+ z-index: 0;
+ }
+ .bodywebsite .object-wrap-body > img {
+ position: relative;
+ height: auto;
+ min-height: 100.5%;
+ width: auto;
+ min-width: 102%;
+ max-width: none;
+ left: 50%;
+ transform: translateX(-50%);
+ }
+ .bodywebsite .object-wrap-body + * {
+ margin-top: 0;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .sm-width-c6 {
+ width: calc(50vw);
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .md-width-c7d20 {
+ width: calc(150vw);
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .md-width-c7d20 {
+ width: calc(167.5vw);
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .md-width-c5dm20 {
+ width: calc(-50vw);
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .md-width-c5dm20 {
+ width: calc(-67.5vw);
+ }
+}
+.bodywebsite .bg-wrap {
+ position: relative;
+}
+.bodywebsite .bg-wrap:before {
+ content: '';
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ width: 120vw;
+ left: 50%;
+ transform: translateX(-50%);
+ background: inherit;
+ z-index: -1;
+}
+.bodywebsite .bg-wrap-sm-left {
+ z-index: 1;
+}
+@media (min-width: 992px) {
+ .bodywebsite .bg-wrap-sm-left:before {
+ width: 100vw;
+ right: 0;
+ transform: none;
+ }
+}
+.bodywebsite .bg-wrap-sm-right {
+ z-index: 1;
+}
+@media (min-width: 992px) {
+ .bodywebsite .bg-wrap-sm-right:before {
+ width: 100vw;
+ left: 0;
+ transform: none;
+ }
+}
+@media (min-width: 576px) {
+ .bodywebsite .wrap-justify {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: space-around;
+ -ms-flex-pack: distribute;
+ justify-content: space-around;
+ }
+ .bodywebsite .wrap-justify > * + * {
+ margin-top: 0;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .wrap-justify {
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .wrap-justify {
+ padding-right: 30px;
+ }
+}
+.bodywebsite .link-wrap {
+ line-height: 1;
+}
+.bodywebsite .link-wrap a {
+ display: inline;
+ line-height: 1;
+}
+.bodywebsite [class*='bg-decoration-wrap'] {
+ position: relative;
+ overflow: hidden;
+}
+.bodywebsite [class*='bg-decoration-wrap'] .bg-decoration-content {
+ position: relative;
+ z-index: 2;
+}
+.bodywebsite [class*='bg-decoration-wrap'] .bg-decoration-object {
+ top: 0;
+ bottom: auto;
+}
+.bodywebsite .bg-decoration-bottom .bg-decoration-object {
+ top: auto;
+ bottom: 0;
+}
+@media (min-width: 768px) {
+ .bodywebsite .bg-decoration-wrap-sm .bg-decoration-object {
+ height: 50%;
+ position: absolute;
+ right: 0;
+ left: 0;
+ }
+ .bodywebsite .bg-decoration-bottom-sm .bg-decoration-object {
+ height: 34%;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .bg-decoration-object {
+ height: 50%;
+ position: absolute;
+ right: 0;
+ left: 0;
+ }
+ .bodywebsite .bg-decoration-bottom-mod .bg-decoration-object {
+ height: 45%;
+ }
+}
+.bodywebsite .divider-fullwidth {
+ height: 1px;
+ width: 100%;
+}
+.bodywebsite .hr {
+ border: none;
+ height: 1px;
+ width: 100%;
+}
+.bodywebsite .tabs-custom .nav-tabs {
+ display: block;
+ word-spacing: 0;
+ border: 0;
+}
+.bodywebsite .tabs-custom .nav-tabs:before,
+.bodywebsite .tabs-custom .nav-tabs:after {
+ display: none;
+}
+.bodywebsite .tabs-custom .nav-tabs .nav-item {
+ float: none;
+ border: 0;
+ cursor: pointer;
+ transition: .33s all ease;
+}
+.bodywebsite .tabs-custom .nav-tabs .nav-item .nav-link.active {
+ cursor: default;
+ border: 0;
+}
+.bodywebsite .tabs-custom .nav-tabs .nav-link {
+ margin: 0;
+ border: 0;
+}
+.bodywebsite * + .tabs-custom {
+ margin-top: 35px;
+}
+@media (min-width: 992px) {
+ .bodywebsite * + .tabs-custom {
+ margin-top: 50px;
+ }
+}
+.bodywebsite .tabs-custom.tabs-corporate .nav-tabs,
+.bodywebsite .tabs-custom.tabs-line .nav-tabs,
+.bodywebsite .tabs-custom.tabs-minimal .nav-tabs {
+ font-size: 0;
+ line-height: 0;
+}
+.bodywebsite .tabs-custom.tabs-corporate .nav-tabs {
+ border: 1px solid #dedede;
+}
+.bodywebsite .tabs-custom.tabs-corporate .nav-tabs li {
+ margin: -1px 0;
+}
+.bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .nav-link {
+ padding: 8px 10px;
+ font: 700 11px/18px "Roboto", Helvetica, Arial, sans-serif;
+ color: #000;
+ background: transparent;
+ border-bottom: 1px solid #dedede;
+ text-align: center;
+ vertical-align: middle;
+}
+.bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .nav-link:after {
+ font: 400 17px 'Material Design Icons';
+ color: transparent;
+ position: relative;
+ top: -12px;
+ display: inline-block;
+ margin-left: 5px;
+ content: '\f236';
+ vertical-align: middle;
+ transition: .33s all ease;
+}
+.bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .nav-link:first-child {
+ border-top: 1px solid #dedede;
+}
+.bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .nav-link:hover,
+.bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .active.nav-link {
+ color: #fff;
+ background: #3a3c3e;
+ border-color: #3a3c3e;
+}
+.bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .nav-link:hover:after,
+.bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .active.nav-link:after {
+ top: -1px;
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .tabs-custom.tabs-corporate .tab-content {
+ padding: 22px 0 0;
+}
+.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item,
+.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item {
+ margin: 0;
+}
+.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item + .nav-item,
+.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item + .nav-item {
+ margin-top: -1px;
+}
+.bodywebsite .tabs-custom.tabs-line .tab-content,
+.bodywebsite .tabs-custom.tabs-minimal .tab-content {
+ padding: 22px 0 0;
+}
+.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item .nav-link {
+ font: 400 11px/16px "Roboto", Helvetica, Arial, sans-serif;
+ letter-spacing: -0.05em;
+ text-transform: uppercase;
+ color: #9b9b9b;
+}
+.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item .nav-link:hover,
+.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item .active.nav-link {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item .nav-link {
+ font: 700 11px/24px "Roboto", Helvetica, Arial, sans-serif;
+ color: #000;
+}
+.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item .nav-link:hover,
+.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item .active.nav-link {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .tabs-custom.tabs-line .nav-tabs {
+ text-align: center;
+}
+.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item {
+ display: block;
+ margin: 0 -1px;
+}
+.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item .nav-link {
+ padding: 8px 15px;
+ border: 1px solid #e5e7e9;
+}
+.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item .nav-link:last-child {
+ margin-right: 0;
+ border-bottom-width: 1px;
+}
+.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item .nav-link:hover,
+.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item .active.nav-link {
+ color: #fff;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .tabs-custom.tabs-minimal .nav-tabs {
+ text-align: center;
+}
+.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item {
+ display: block;
+}
+.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item .nav-link {
+ padding: 7px 15px;
+ border: 1px solid #e5e7e9;
+}
+.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item .nav-link:last-child {
+ border-bottom-width: 1px;
+}
+.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item .nav-link:hover,
+.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item .active.nav-link {
+ color: #fff;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+@media (min-width: 768px) {
+ .bodywebsite .tabs-custom.tabs-line .nav-item,
+ .bodywebsite .tabs-custom.tabs-minimal .nav-item {
+ margin: 0;
+ }
+ .bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item .nav-link {
+ font-size: 14px;
+ line-height: 24px;
+ }
+ .bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item .nav-link {
+ font-size: 14px;
+ line-height: 24px;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-corporate .nav-tabs,
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ width: 100%;
+ text-align: left;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs .nav-item .nav-link,
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item .nav-link {
+ position: relative;
+ z-index: 10;
+ display: inline-block;
+ border: 0;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs .nav-item + .nav-item,
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item + .nav-item {
+ margin-top: 0;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .tab-content,
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .tab-content {
+ padding: 40px 0 0;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-corporate .nav-tabs .nav-item,
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-corporate .nav-tabs .nav-link {
+ display: block;
+ border: 0;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs {
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ border-bottom: 2px solid #e5e7e9;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs .nav-item .nav-link {
+ padding: 8px 0 8px 0;
+ margin: 0 30px 0 0;
+ font-weight: 700;
+ background: transparent;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs .nav-item .nav-link:after {
+ content: '';
+ position: absolute;
+ left: 0;
+ right: 100%;
+ bottom: -1px;
+ border-bottom: 2px solid maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ opacity: 0;
+ visibility: hidden;
+ transition: .33s all ease;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs .nav-item .nav-link:hover,
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs .nav-item .active.nav-link {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ background: transparent;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs .nav-item .active.nav-link:after {
+ right: 0;
+ opacity: 1;
+ visibility: visible;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs {
+ margin-top: -10px;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item {
+ display: inline-block;
+ margin: 10px 15px 0 0;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item .nav-link {
+ position: relative;
+ bottom: -1px;
+ z-index: 10;
+ display: inline-block;
+ padding: 0 0 5px 0;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item .nav-link:after {
+ content: '';
+ position: absolute;
+ left: 0;
+ right: 100%;
+ bottom: 0;
+ border-bottom: 2px solid maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ opacity: 0;
+ visibility: hidden;
+ transition: .33s all ease;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item .nav-link:last-child {
+ margin-right: 0;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item .nav-link:hover,
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item .active.nav-link {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ background: transparent;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item .active.nav-link:after {
+ right: 0;
+ opacity: 1;
+ visibility: visible;
+ }
+}
+.bodywebsite .tabs-vertical .nav-tabs {
+ position: relative;
+}
+.bodywebsite .tabs-vertical .nav-tabs > .nav-item {
+ z-index: 10;
+ display: block;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+}
+.bodywebsite .tabs-vertical.tabs-corporate .nav-tabs {
+ width: 100%;
+}
+.bodywebsite .tabs-vertical.tabs-corporate .nav-tabs .nav-item {
+ display: block;
+}
+.bodywebsite .tabs-vertical.tabs-corporate .nav-tabs .nav-item .nav-link {
+ position: relative;
+ padding: 8px 10px;
+}
+.bodywebsite .tabs-vertical.tabs-corporate .nav-tabs .nav-item .nav-link:hover,
+.bodywebsite .tabs-vertical.tabs-corporate .nav-tabs .nav-item .active.nav-link {
+ border-color: #3a3c3e;
+}
+.bodywebsite .tabs-vertical.tabs-corporate .tab-content {
+ padding: 30px 0 0;
+}
+.bodywebsite .tabs-vertical.tabs-minimal .nav-tabs {
+ border-right: 1px solid #ddd;
+}
+.bodywebsite .tabs-vertical.tabs-minimal .nav-tabs .nav-item .nav-link {
+ position: relative;
+ right: -1px;
+ padding: 0 16px 0 0;
+ text-align: right;
+ border-right: 1px solid transparent;
+ background-color: transparent;
+}
+.bodywebsite .tabs-vertical.tabs-minimal .nav-tabs .nav-item .nav-link:hover,
+.bodywebsite .tabs-vertical.tabs-minimal .nav-tabs .nav-item .nav-link.resp-tab-active {
+ border-right-color: #00030a;
+}
+.bodywebsite .tabs-vertical.tabs-minimal .nav-tabs .nav-item + .nav-item {
+ margin-top: 16px;
+}
+@media (min-width: 768px) {
+ .bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .nav-link {
+ font-size: 16px;
+ line-height: 26px;
+ }
+ .bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .nav-link:after {
+ font-size: 25px;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-corporate .nav-tabs {
+ position: relative;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-corporate .nav-tabs .nav-item {
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ -webkit-flex-shrink: 0;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-corporate .nav-tabs .nav-item .nav-link {
+ display: block;
+ padding: 21px 10px 19px;
+ }
+ .bodywebsite .tabs-custom.tabs-horizontal.tabs-corporate .tab-content {
+ padding: 30px 0 0;
+ }
+ .bodywebsite .tabs-custom.tabs-vertical {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: flex-start;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .bodywebsite .tabs-custom.tabs-vertical .nav-tabs {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: stretch;
+ -ms-flex-align: stretch;
+ align-items: stretch;
+ -webkit-flex-shrink: 0;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+ max-width: 50%;
+ }
+ .bodywebsite .tabs-custom.tabs-vertical .nav-tabs .nav-item {
+ width: 100%;
+ }
+ .bodywebsite .tabs-custom.tabs-vertical .nav-tabs .nav-item .nav-link {
+ text-align: left;
+ }
+ .bodywebsite .tabs-custom.tabs-vertical .nav-tabs .nav-item .nav-link:hover,
+ .bodywebsite .tabs-custom.tabs-vertical .nav-tabs .nav-item .active.nav-link {
+ border-color: #3a3c3e;
+ }
+ .bodywebsite .tabs-custom.tabs-vertical .nav-tabs .nav-item .nav-link:hover:after,
+ .bodywebsite .tabs-custom.tabs-vertical .nav-tabs .nav-item .active.nav-link:after {
+ right: 15px;
+ }
+ .bodywebsite .tabs-custom.tabs-vertical .tab-content {
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ }
+ .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .nav-tabs {
+ width: auto;
+ min-width: 240px;
+ border-width: 0 0 1px 0;
+ }
+ .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .nav-tabs .nav-item {
+ margin: 0;
+ }
+ .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .nav-tabs .nav-item .nav-link {
+ padding: 23px 44px 22px 30px;
+ border-width: 1px 0 0 0;
+ text-align: left;
+ }
+ .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .nav-tabs .nav-item .nav-link:after {
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+ right: 26px;
+ content: '\f238';
+ transition: .33s all ease;
+ }
+ .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .nav-tabs .nav-item .nav-link:hover:after,
+ .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .nav-tabs .nav-item .active.nav-link:after {
+ right: 15px;
+ top: 50%;
+ }
+ .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .tab-content {
+ padding: 0 0 0 30px;
+ margin-top: -5px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .nav-tabs {
+ min-width: 300px;
+ }
+ .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .tab-content {
+ padding: 0 0 0 44px;
+ }
+}
+.bodywebsite .card-group.card-group-custom {
+ margin-bottom: 0;
+}
+.bodywebsite .card-group.card-group-custom .card-heading + .card-collapse > .card-body,
+.bodywebsite .card-group.card-group-custom .card-heading + .card-collapse > .list-group {
+ border-top: 0;
+}
+.bodywebsite .card-group.card-group-custom .card + .card {
+ margin-top: 0;
+}
+.bodywebsite .card-group.card-group-corporate .card + .card {
+ margin-top: 30px;
+}
+.bodywebsite .card-custom {
+ margin: 0;
+ background: inherit;
+ border: 0;
+ border-radius: 0;
+ box-shadow: none;
+}
+.bodywebsite .card-custom a {
+ display: block;
+}
+.bodywebsite .card-custom .card-heading {
+ padding: 0;
+ border-bottom: 0;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.bodywebsite .card-custom .card-body {
+ padding: 0;
+ border: 0;
+}
+.bodywebsite * + .card-group-custom {
+ margin-top: 35px;
+}
+@media (min-width: 768px) {
+ .bodywebsite * + .card-group-custom {
+ margin-top: 50px;
+ }
+}
+.bodywebsite .card-light:first-child .card-title {
+ border-top: 1px solid #dedede;
+}
+.bodywebsite .card-light .card-title {
+ border-bottom: 1px solid #dedede;
+}
+.bodywebsite .card-light .card-title:nth-child(n + 2) {
+ margin-top: -1px;
+}
+.bodywebsite .card-light .card-title a {
+ position: relative;
+ padding: 24px 55px 22px 32px;
+ font: 500 18px/24px "Roboto", Helvetica, Arial, sans-serif;
+ color: #000;
+ transition: 1.5s all ease;
+}
+.bodywebsite .card-light .card-title a .card-arrow:after {
+ opacity: 0;
+ visibility: hidden;
+}
+.bodywebsite .card-light .card-title a.collapsed .card-arrow:after {
+ opacity: 1;
+ visibility: visible;
+}
+.bodywebsite .card-light .card-arrow {
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+ right: 26px;
+ transition: .33s;
+ will-change: transform;
+}
+.bodywebsite .card-light .card-arrow:before,
+.bodywebsite .card-light .card-arrow:after {
+ content: '';
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .card-light .card-arrow:before {
+ width: 14px;
+ height: 2px;
+ right: 0;
+}
+.bodywebsite .card-light .card-arrow:after {
+ width: 2px;
+ height: 14px;
+ right: 6px;
+ transition: .2s all ease;
+}
+.bodywebsite .card-light .card-collapse {
+ position: relative;
+ margin-top: -1px;
+ border-bottom: 1px solid #dedede;
+ color: #9f9f9f;
+ will-change: transform;
+}
+.bodywebsite .card-light .card-body {
+ padding: 25px 44px 25px 32px;
+}
+@media (max-width: 767px) {
+ .bodywebsite .card-light .card-title a,
+ .bodywebsite .card-light .card-body {
+ padding-left: 15px;
+ }
+}
+.bodywebsite .card-corporate .card-title a,
+.bodywebsite .card-corporate .card-collapse {
+ background: #fff;
+ box-shadow: -1px 0px 10px 0px rgba(65, 65, 65, 0.12);
+}
+.bodywebsite .card-corporate .card-collapse.in {
+ box-shadow: -1px 0 5px 0 rgba(65, 65, 65, 0.12);
+}
+.bodywebsite .card-corporate .card-collapse.in:before {
+ content: '';
+ position: absolute;
+ top: -1px;
+ height: 1px;
+ background: #ededed;
+ left: 0;
+ width: 100%;
+}
+.bodywebsite .card-corporate .card-title a {
+ position: relative;
+ z-index: 1;
+ padding: 24px 82px 22px 32px;
+ font: 500 18px/24px "Roboto", Helvetica, Arial, sans-serif;
+ color: #000;
+ transition: 1.3s all ease;
+ letter-spacing: -0.025em;
+ border-radius: 6px 6px 0 0;
+}
+.bodywebsite .card-corporate .card-title a .card-arrow:after {
+ opacity: 0;
+ visibility: hidden;
+}
+.bodywebsite .card-corporate .card-title a.collapsed {
+ border-radius: 6px;
+}
+.bodywebsite .card-corporate .card-title a.collapsed .card-arrow {
+ border-radius: 0 6px 6px 0;
+}
+.bodywebsite .card-corporate .card-title a.collapsed .card-arrow:after {
+ opacity: 1;
+ visibility: visible;
+}
+.bodywebsite .card-corporate .card-arrow {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ right: 0;
+ z-index: 2;
+ width: 70px;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ border-radius: 0 6px 0 0;
+ transition: 1.3s all ease;
+}
+.bodywebsite .card-corporate .card-arrow:before,
+.bodywebsite .card-corporate .card-arrow:after {
+ content: '';
+ position: absolute;
+ top: 50%;
+ z-index: 4;
+ transform: translateY(-50%);
+ background: #fff;
+}
+.bodywebsite .card-corporate .card-arrow:before {
+ width: 14px;
+ height: 2px;
+ right: 28px;
+}
+.bodywebsite .card-corporate .card-arrow:after {
+ width: 2px;
+ height: 14px;
+ right: 34px;
+}
+.bodywebsite .card-corporate .card-collapse {
+ position: relative;
+ z-index: 2;
+ color: #9f9f9f;
+ border-radius: 0 0 6px 6px;
+}
+.bodywebsite .card-corporate .card-body {
+ padding: 25px 44px 25px 32px;
+}
+@media (max-width: 767px) {
+ .bodywebsite .card-corporate .card-title a,
+ .bodywebsite .card-corporate .card-body {
+ padding-left: 25px;
+ }
+}
+.bodywebsite .card-lg {
+ position: relative;
+ padding: 50px 15px;
+}
+.bodywebsite .card-lg:before {
+ content: '';
+ position: absolute;
+ top: -45px;
+ left: 50%;
+ width: 55px;
+ height: 55px;
+ margin-left: -10px;
+ background: #fff;
+ transform: translateX(-50%) rotate(-45deg);
+}
+@media (min-width: 768px) {
+ .bodywebsite .card-lg {
+ padding: 90px 35px 100px;
+ }
+}
+.bodywebsite table {
+ background-color: transparent;
+}
+.bodywebsite caption {
+ padding-top: 17px 25px 18px;
+ padding-bottom: 17px 25px 18px;
+ color: #dedede;
+ text-align: left;
+}
+.bodywebsite th {
+ text-align: left;
+}
+.bodywebsite .table {
+ width: 100%;
+ max-width: 100%;
+ margin-bottom: 0;
+ color: #00030a;
+}
+.bodywebsite .table > thead > tr > th,
+.bodywebsite .table > thead > tr > td,
+.bodywebsite .table > tbody > tr > th,
+.bodywebsite .table > tbody > tr > td,
+.bodywebsite .table > tfoot > tr > th,
+.bodywebsite .table > tfoot > tr > td {
+ line-height: 1.71429;
+ vertical-align: top;
+ border-top: 0;
+}
+.bodywebsite .table > tbody > tr > th,
+.bodywebsite .table > tbody > tr > td,
+.bodywebsite .table > tfoot > tr > th,
+.bodywebsite .table > tfoot > tr > td {
+ padding: 17px 25px 18px;
+ line-height: 1.71429;
+ vertical-align: top;
+ border-bottom: 1px solid #d9d9d9;
+}
+.bodywebsite .table > thead > tr > th {
+ font-family: "Playfair Display", Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ font-weight: 700;
+ padding: 26px 25px;
+ vertical-align: bottom;
+ background: #f6f7fa;
+ border-bottom: 0;
+}
+@media (min-width: 576px) {
+ .bodywebsite .table > thead > tr > th {
+ padding: 34px 25px 29px;
+ }
+}
+.bodywebsite .table > tfoot > tr > td {
+ font-weight: 700;
+}
+.bodywebsite .table > caption + thead > tr:first-child > th,
+.bodywebsite .table > caption + thead > tr:first-child > td,
+.bodywebsite .table > colgroup + thead > tr:first-child > th,
+.bodywebsite .table > colgroup + thead > tr:first-child > td,
+.bodywebsite .table > thead:first-child > tr:first-child > th,
+.bodywebsite .table > thead:first-child > tr:first-child > td {
+ border-top: 0;
+}
+.bodywebsite .table > tbody + tbody {
+ border-top: 0;
+}
+.bodywebsite .table .table {
+ background-color: #fff;
+}
+.bodywebsite .table-condensed > thead > tr > th,
+.bodywebsite .table-condensed > thead > tr > td,
+.bodywebsite .table-condensed > tbody > tr > th,
+.bodywebsite .table-condensed > tbody > tr > td,
+.bodywebsite .table-condensed > tfoot > tr > th,
+.bodywebsite .table-condensed > tfoot > tr > td {
+ padding: 5px;
+}
+.bodywebsite .table-bordered {
+ border: 1px solid #d9d9d9;
+}
+.bodywebsite .table-bordered > thead > tr > th,
+.bodywebsite .table-bordered > thead > tr > td,
+.bodywebsite .table-bordered > tbody > tr > th,
+.bodywebsite .table-bordered > tbody > tr > td,
+.bodywebsite .table-bordered > tfoot > tr > th,
+.bodywebsite .table-bordered > tfoot > tr > td {
+ border: 1px solid #d9d9d9;
+}
+.bodywebsite .table-bordered > thead > tr > th,
+.bodywebsite .table-bordered > thead > tr > td {
+ border-bottom-width: 2px;
+}
+.bodywebsite .table-primary {
+ background: #fff;
+}
+.bodywebsite .table-primary thead > tr > th {
+ color: #fff;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .table-striped > tbody > tr:nth-of-type(even) {
+ background-color: #f6f7fa;
+}
+.bodywebsite .table-striped > tbody > tr:nth-of-type(odd) {
+ background-color: #fff;
+}
+.bodywebsite .table-striped > tbody > tr > td {
+ border-bottom: 0;
+}
+.bodywebsite .table-hover > tbody > tr:hover {
+ background-color: #f6f7fa;
+}
+.bodywebsite table col[class*="col-"] {
+ position: static;
+ float: none;
+ display: table-column;
+}
+.bodywebsite table td[class*="col-"],
+.bodywebsite table th[class*="col-"] {
+ position: static;
+ float: none;
+ display: table-cell;
+}
+.bodywebsite .table-active,
+.bodywebsite .table-active > th,
+.bodywebsite .table-active > td {
+ background-color: #f6f7fa;
+}
+.bodywebsite .table-hover .table-active:hover {
+ background-color: #e6e8f1;
+}
+.bodywebsite .table-hover .table-active:hover > td,
+.bodywebsite .table-hover .table-active:hover > th {
+ background-color: #e6e8f1;
+}
+.bodywebsite .table-success,
+.bodywebsite .table-success > th,
+.bodywebsite .table-success > td {
+ background-color: #dff0d8;
+}
+.bodywebsite .table-hover .table-success:hover {
+ background-color: #d0e9c6;
+}
+.bodywebsite .table-hover .table-success:hover > td,
+.bodywebsite .table-hover .table-success:hover > th {
+ background-color: #d0e9c6;
+}
+.bodywebsite .table-info,
+.bodywebsite .table-info > th,
+.bodywebsite .table-info > td {
+ background-color: #d9edf7;
+}
+.bodywebsite .table-hover .table-info:hover {
+ background-color: #c4e3f3;
+}
+.bodywebsite .table-hover .table-info:hover > td,
+.bodywebsite .table-hover .table-info:hover > th {
+ background-color: #c4e3f3;
+}
+.bodywebsite .table-warning,
+.bodywebsite .table-warning > th,
+.bodywebsite .table-warning > td {
+ background-color: #fcf8e3;
+}
+.bodywebsite .table-hover .table-warning:hover {
+ background-color: #faf2cc;
+}
+.bodywebsite .table-hover .table-warning:hover > td,
+.bodywebsite .table-hover .table-warning:hover > th {
+ background-color: #faf2cc;
+}
+.bodywebsite .table-danger,
+.bodywebsite .table-danger > th,
+.bodywebsite .table-danger > td {
+ background-color: #fe4a21;
+}
+.bodywebsite .table-hover .table-danger:hover {
+ background-color: #fe3508;
+}
+.bodywebsite .table-hover .table-danger:hover > td,
+.bodywebsite .table-hover .table-danger:hover > th {
+ background-color: #fe3508;
+}
+.bodywebsite .table-responsive {
+ overflow-x: auto;
+ min-height: 0.01%;
+}
+@media (max-width: 575px) {
+ .bodywebsite .table-responsive {
+ width: 100%;
+ margin-bottom: 1.28571;
+ overflow-y: hidden;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ border: 1px solid #d9d9d9;
+ }
+ .bodywebsite .table-responsive > .table {
+ margin-bottom: 0;
+ }
+ .bodywebsite .table-responsive > .table > thead > tr > th,
+ .bodywebsite .table-responsive > .table > thead > tr > td,
+ .bodywebsite .table-responsive > .table > tbody > tr > th,
+ .bodywebsite .table-responsive > .table > tbody > tr > td,
+ .bodywebsite .table-responsive > .table > tfoot > tr > th,
+ .bodywebsite .table-responsive > .table > tfoot > tr > td {
+ white-space: nowrap;
+ }
+ .bodywebsite .table-responsive > .table-bordered {
+ border: 0;
+ }
+ .bodywebsite .table-responsive > .table-bordered > thead > tr > th:first-child,
+ .bodywebsite .table-responsive > .table-bordered > thead > tr > td:first-child,
+ .bodywebsite .table-responsive > .table-bordered > tbody > tr > th:first-child,
+ .bodywebsite .table-responsive > .table-bordered > tbody > tr > td:first-child,
+ .bodywebsite .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+ .bodywebsite .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+ border-left: 0;
+ }
+ .bodywebsite .table-responsive > .table-bordered > thead > tr > th:last-child,
+ .bodywebsite .table-responsive > .table-bordered > thead > tr > td:last-child,
+ .bodywebsite .table-responsive > .table-bordered > tbody > tr > th:last-child,
+ .bodywebsite .table-responsive > .table-bordered > tbody > tr > td:last-child,
+ .bodywebsite .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+ .bodywebsite .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+ border-right: 0;
+ }
+ .bodywebsite .table-responsive > .table-bordered > tbody > tr:last-child > th,
+ .bodywebsite .table-responsive > .table-bordered > tbody > tr:last-child > td,
+ .bodywebsite .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+ .bodywebsite .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+ border-bottom: 0;
+ }
+}
+.bodywebsite .jumbotron-custom {
+ font-weight: 900;
+ font-size: 35px;
+ line-height: 1.2;
+ letter-spacing: .01em;
+}
+.bodywebsite .jumbotron-custom > span {
+ font-size: 31px;
+ line-height: 1.2;
+}
+@media (min-width: 768px) {
+ .bodywebsite .jumbotron-custom {
+ font-size: 45px;
+ }
+ .bodywebsite .jumbotron-custom > span {
+ font-size: 41px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .jumbotron-custom {
+ font-size: 55px;
+ }
+ .bodywebsite .jumbotron-custom > span {
+ font-size: 51px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .jumbotron-custom {
+ font-size: 65px;
+ }
+ .bodywebsite .jumbotron-custom > span {
+ font-size: 61px;
+ }
+}
+.bodywebsite [class^="thin-icon-"]:before,
+.bodywebsite [class*=" thin-icon-"]:before,
+.bodywebsite .thin-ico {
+ font-family: "Thin Regular";
+ font-weight: 400;
+ font-style: normal;
+ font-size: inherit;
+ text-transform: none;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.bodywebsite .thin-icon-volume-on:before {
+ content: '\e800';
+}
+.bodywebsite .thin-icon-gift:before {
+ content: '\e801';
+}
+.bodywebsite .thin-icon-cup:before {
+ content: '\e802';
+}
+.bodywebsite .thin-icon-folder:before {
+ content: '\e803';
+}
+.bodywebsite .thin-icon-dublicate:before {
+ content: '\e804';
+}
+.bodywebsite .thin-icon-tag:before {
+ content: '\e805';
+}
+.bodywebsite .thin-icon-chat:before {
+ content: '\e806';
+}
+.bodywebsite .thin-icon-clock:before {
+ content: '\e807';
+}
+.bodywebsite .thin-icon-microphone:before {
+ content: '\e808';
+}
+.bodywebsite .thin-icon-map-marker:before {
+ content: '\e809';
+}
+.bodywebsite .thin-icon-mobile:before {
+ content: '\e80a';
+}
+.bodywebsite .thin-icon-cloud-charge:before {
+ content: '\e80b';
+}
+.bodywebsite .thin-icon-resize:before {
+ content: '\e80c';
+}
+.bodywebsite .thin-icon-cake:before {
+ content: '\e80d';
+}
+.bodywebsite .thin-icon-case:before {
+ content: '\e80e';
+}
+.bodywebsite .thin-icon-address:before {
+ content: '\e80f';
+}
+.bodywebsite .thin-icon-phone-support:before {
+ content: '\e810';
+}
+.bodywebsite .thin-icon-fullscreen:before {
+ content: '\e811';
+}
+.bodywebsite .thin-icon-db:before {
+ content: '\e812';
+}
+.bodywebsite .thin-icon-music:before {
+ content: '\e813';
+}
+.bodywebsite .thin-icon-network:before {
+ content: '\e814';
+}
+.bodywebsite .thin-icon-db-network:before {
+ content: '\e815';
+}
+.bodywebsite .thin-icon-dropbox-upload:before {
+ content: '\e816';
+}
+.bodywebsite .thin-icon-phone-call:before {
+ content: '\e817';
+}
+.bodywebsite .thin-icon-briefcase-2:before {
+ content: '\e818';
+}
+.bodywebsite .thin-icon-card:before {
+ content: '\e819';
+}
+.bodywebsite .thin-icon-support:before {
+ content: '\e81a';
+}
+.bodywebsite .thin-icon-pull:before {
+ content: '\e81b';
+}
+.bodywebsite .thin-icon-desktop:before {
+ content: '\e81c';
+}
+.bodywebsite .thin-icon-pass:before {
+ content: '\e81d';
+}
+.bodywebsite .thin-icon-picture:before {
+ content: '\e81e';
+}
+.bodywebsite .thin-icon-email:before {
+ content: '\e81f';
+}
+.bodywebsite .thin-icon-push:before {
+ content: '\e820';
+}
+.bodywebsite .thin-icon-house:before {
+ content: '\e821';
+}
+.bodywebsite .thin-icon-download:before {
+ content: '\e822';
+}
+.bodywebsite .thin-icon-storage:before {
+ content: '\e823';
+}
+.bodywebsite .thin-icon-milk:before {
+ content: '\e824';
+}
+.bodywebsite .thin-icon-external-right:before {
+ content: '\e825';
+}
+.bodywebsite .thin-icon-email-open:before {
+ content: '\e826';
+}
+.bodywebsite .thin-icon-planet:before {
+ content: '\e827';
+}
+.bodywebsite .thin-icon-pointer:before {
+ content: '\e828';
+}
+.bodywebsite .thin-icon-email-search:before {
+ content: '\e829';
+}
+.bodywebsite .thin-icon-external-left:before {
+ content: '\e82a';
+}
+.bodywebsite .thin-icon-shirt:before {
+ content: '\e82b';
+}
+.bodywebsite .thin-icon-document-edit:before {
+ content: '\e82c';
+}
+.bodywebsite .thin-icon-document-delete:before {
+ content: '\e82d';
+}
+.bodywebsite .thin-icon-money:before {
+ content: '\e82e';
+}
+.bodywebsite .thin-icon-eye:before {
+ content: '\e82f';
+}
+.bodywebsite .thin-icon-settings:before {
+ content: '\e830';
+}
+.bodywebsite .thin-icon-arrow-bottom-right:before {
+ content: '\e831';
+}
+.bodywebsite .thin-icon-arrow-right:before {
+ content: '\e832';
+}
+.bodywebsite .thin-icon-flag:before {
+ content: '\e833';
+}
+.bodywebsite .thin-icon-star:before {
+ content: '\e834';
+}
+.bodywebsite .thin-icon-calculator:before {
+ content: '\e835';
+}
+.bodywebsite .thin-icon-safe:before {
+ content: '\e836';
+}
+.bodywebsite .thin-icon-cart:before {
+ content: '\e837';
+}
+.bodywebsite .thin-icon-bullhorn:before {
+ content: '\e838';
+}
+.bodywebsite .thin-icon-anchor:before {
+ content: '\e839';
+}
+.bodywebsite .thin-icon-globe:before {
+ content: '\e83a';
+}
+.bodywebsite .thin-icon-statistics:before {
+ content: '\e83b';
+}
+.bodywebsite .thin-icon-thumb-up:before {
+ content: '\e83c';
+}
+.bodywebsite .thin-icon-headphones:before {
+ content: '\e83d';
+}
+.bodywebsite .thin-icon-bell:before {
+ content: '\e83e';
+}
+.bodywebsite .thin-icon-study:before {
+ content: '\e83f';
+}
+.bodywebsite .thin-icon-cart-add:before {
+ content: '\e840';
+}
+.bodywebsite .thin-icon-cart-delete:before {
+ content: '\e841';
+}
+.bodywebsite .thin-icon-satelite:before {
+ content: '\e842';
+}
+.bodywebsite .thin-icon-home:before {
+ content: '\e843';
+}
+.bodywebsite .thin-icon-time:before {
+ content: '\e844';
+}
+.bodywebsite .thin-icon-book:before {
+ content: '\e845';
+}
+.bodywebsite .thin-icon-bookmark:before {
+ content: '\e846';
+}
+.bodywebsite .thin-icon-key:before {
+ content: '\e847';
+}
+.bodywebsite .thin-icon-timer:before {
+ content: '\e848';
+}
+.bodywebsite .thin-icon-saturn:before {
+ content: '\e849';
+}
+.bodywebsite .thin-icon-notes:before {
+ content: '\e84a';
+}
+.bodywebsite .thin-icon-ambulance:before {
+ content: '\e84b';
+}
+.bodywebsite .thin-icon-briefcase:before {
+ content: '\e84c';
+}
+.bodywebsite .thin-icon-layers:before {
+ content: '\e84d';
+}
+.bodywebsite .thin-icon-delivery:before {
+ content: '\e84e';
+}
+.bodywebsite .thin-icon-tint:before {
+ content: '\e84f';
+}
+.bodywebsite .thin-icon-trash:before {
+ content: '\e850';
+}
+.bodywebsite .thin-icon-lightbulb:before {
+ content: '\e851';
+}
+.bodywebsite .thin-icon-calendar:before {
+ content: '\e852';
+}
+.bodywebsite .thin-icon-chart:before {
+ content: '\e853';
+}
+.bodywebsite .thin-icon-documents:before {
+ content: '\e854';
+}
+.bodywebsite .thin-icon-checklist:before {
+ content: '\e855';
+}
+.bodywebsite .thin-icon-camera-web:before {
+ content: '\e856';
+}
+.bodywebsite .thin-icon-camera:before {
+ content: '\e857';
+}
+.bodywebsite .thin-icon-lock:before {
+ content: '\e858';
+}
+.bodywebsite .thin-icon-umbrella:before {
+ content: '\e859';
+}
+.bodywebsite .thin-icon-user:before {
+ content: '\e85a';
+}
+.bodywebsite .thin-icon-love:before {
+ content: '\e85b';
+}
+.bodywebsite .thin-icon-hanger:before {
+ content: '\e85c';
+}
+.bodywebsite .thin-icon-car:before {
+ content: '\e85d';
+}
+.bodywebsite .thin-icon-cloth:before {
+ content: '\e85e';
+}
+.bodywebsite .thin-icon-box:before {
+ content: '\e85f';
+}
+.bodywebsite .thin-icon-attachment:before {
+ content: '\e860';
+}
+.bodywebsite .thin-icon-cd:before {
+ content: '\e861';
+}
+.bodywebsite .thin-icon-love-broken:before {
+ content: '\e862';
+}
+.bodywebsite .thin-icon-volume-off:before {
+ content: '\e863';
+}
+.bodywebsite .slideOutUp {
+ -webkit-animation-name: slideOutUp;
+ animation-name: slideOutUp;
+}
+.bodywebsite .counter {
+ font: 900 45px/45px "Roboto", Helvetica, Arial, sans-serif;
+ margin-bottom: 0;
+ color: #fff;
+}
+.bodywebsite .counter-bold {
+ font-weight: 700;
+}
+.bodywebsite .counter-k:after {
+ content: 'k';
+}
+.bodywebsite * + .counter-title {
+ margin-top: 0;
+}
+.bodywebsite .countdown-default {
+ color: #000;
+}
+.bodywebsite .countdown-default .countdown-section {
+ position: relative;
+ display: inline-block;
+ min-width: 90px;
+ padding: 0 10px;
+ text-align: center;
+}
+.bodywebsite .countdown-default .countdown-section > * {
+ display: block;
+}
+.bodywebsite .countdown-default .countdown-section:after {
+ position: absolute;
+ top: 35%;
+ transform: translateY(-35%);
+ border-radius: 20px;
+ background: #000;
+}
+.bodywebsite .countdown-default .countdown-section:nth-last-child(n + 3):after {
+ content: '';
+ right: -2px;
+ width: 5px;
+ height: 5px;
+}
+@media (max-width: 767px) {
+ .bodywebsite .countdown-default .countdown-section:last-child {
+ display: none;
+ }
+}
+.bodywebsite .countdown-default .countdown-amount {
+ font-family: Helvetica, Arial, sans-serif;
+ font-size: 30px;
+ font-weight: 900;
+ line-height: 1;
+}
+.bodywebsite .countdown-default .countdown-period {
+ margin-top: 10px;
+ font-size: 12px;
+ text-transform: uppercase;
+ letter-spacing: -0.025em;
+ color: rgba(0, 0, 0, 0.4);
+}
+.bodywebsite .countdown-default.countdown-inverse .countdown-section:after {
+ background: #fff;
+}
+.bodywebsite .countdown-default.countdown-inverse .countdown-period {
+ color: rgba(255, 255, 255, 0.4);
+}
+@media (min-width: 768px) {
+ .bodywebsite .countdown-default .countdown-section {
+ min-width: 150px;
+ }
+ .bodywebsite .countdown-default .countdown-section:not(:last-child):after {
+ content: '';
+ top: 50%;
+ right: -5px;
+ transform: translateY(-50%);
+ width: 10px;
+ height: 10px;
+ }
+ .bodywebsite .countdown-default .countdown-amount {
+ font-size: 50px;
+ }
+ .bodywebsite .countdown-default .countdown-period {
+ font-size: 14px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .countdown-default .countdown-section {
+ min-width: 200px;
+ }
+ .bodywebsite .countdown-default .countdown-amount {
+ font-size: 72px;
+ }
+}
+.bodywebsite .countdown-inverse {
+ color: #fff;
+}
+.bodywebsite .owl-carousel .animated {
+ -webkit-animation-duration: 1000ms;
+ animation-duration: 1000ms;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+}
+.bodywebsite .owl-carousel .owl-animated-in {
+ z-index: 0;
+}
+.bodywebsite .owl-carousel .owl-animated-out {
+ z-index: 1;
+}
+.bodywebsite .owl-carousel .fadeOut {
+ -webkit-animation-name: fadeOut;
+ animation-name: fadeOut;
+}
+@-webkit-keyframes fadeOut {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
+@keyframes fadeOut {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
+.bodywebsite .owl-height {
+ -webkit-transition: height 500ms ease-in-out;
+ -moz-transition: height 500ms ease-in-out;
+ -ms-transition: height 500ms ease-in-out;
+ -o-transition: height 500ms ease-in-out;
+ transition: height 500ms ease-in-out;
+}
+.bodywebsite .owl-carousel {
+ display: none;
+ width: 100%;
+ -webkit-tap-highlight-color: transparent;
+ /* position relative and z-index fix webkit rendering fonts issue */
+ position: relative;
+ z-index: 1;
+}
+.bodywebsite .owl-carousel .owl-stage {
+ position: relative;
+ -ms-touch-action: pan-Y;
+}
+.bodywebsite .owl-carousel .owl-stage:after {
+ content: ".";
+ display: block;
+ clear: both;
+ visibility: hidden;
+ line-height: 0;
+ height: 0;
+}
+.bodywebsite .owl-carousel .owl-stage-outer {
+ position: relative;
+ overflow: hidden;
+ /* fix for flashing background */
+ -webkit-transform: translate3d(0px, 0px, 0px);
+}
+.bodywebsite .owl-carousel .owl-controls .owl-nav .owl-prev,
+.bodywebsite .owl-carousel .owl-controls .owl-nav .owl-next,
+.bodywebsite .owl-carousel .owl-controls .owl-dot {
+ cursor: pointer;
+ cursor: hand;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.bodywebsite .owl-carousel.owl-loaded {
+ display: block;
+}
+.bodywebsite .owl-carousel.owl-loading {
+ opacity: 0;
+ display: block;
+}
+.bodywebsite .owl-carousel.owl-hidden {
+ opacity: 0;
+}
+.bodywebsite .owl-carousel .owl-refresh .owl-item {
+ display: none;
+}
+.bodywebsite .owl-carousel .owl-item {
+ position: relative;
+ min-height: 1px;
+ float: left;
+ -webkit-tap-highlight-color: transparent;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.bodywebsite .owl-carousel.owl-text-select-on .owl-item {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.bodywebsite .owl-carousel .owl-grab {
+ cursor: move;
+ cursor: -webkit-grab;
+ cursor: grab;
+}
+.bodywebsite .owl-carousel.owl-rtl {
+ direction: rtl;
+}
+.bodywebsite .owl-carousel.owl-rtl .owl-item {
+ float: right;
+}
+.bodywebsite .no-js .owl-carousel {
+ display: block;
+}
+.bodywebsite .owl-carousel .owl-item .owl-lazy {
+ opacity: 0;
+ -webkit-transition: opacity 400ms ease;
+ -moz-transition: opacity 400ms ease;
+ -ms-transition: opacity 400ms ease;
+ -o-transition: opacity 400ms ease;
+ transition: opacity 400ms ease;
+}
+.bodywebsite .owl-carousel .owl-video-wrapper {
+ position: relative;
+ height: 100%;
+ background: #000;
+}
+.bodywebsite .owl-carousel .owl-video-play-icon {
+ position: absolute;
+ height: 80px;
+ width: 80px;
+ left: 50%;
+ top: 50%;
+ margin-left: -40px;
+ margin-top: -40px;
+ font-family: "Font Awesome 5 Free";
+ font-weight: 600;
+ font-size: initial;
+ cursor: pointer;
+ z-index: 1;
+ -webkit-transition: scale 100ms ease;
+ -moz-transition: scale 100ms ease;
+ -ms-transition: scale 100ms ease;
+ -o-transition: scale 100ms ease;
+ transition: scale 100ms ease;
+}
+.bodywebsite .owl-carousel .owl-video-play-icon:before {
+ content: '\f144';
+}
+.bodywebsite .owl-carousel .owl-video-play-icon:hover {
+ -webkit-transform: scale(1.3);
+ transform: scale(1.3);
+}
+.bodywebsite .owl-carousel .owl-video-playing .owl-video-tn,
+.bodywebsite .owl-carousel .owl-video-playing .owl-video-play-icon {
+ display: none;
+}
+.bodywebsite .owl-carousel .owl-video-tn {
+ opacity: 0;
+ height: 100%;
+ background-position: center center;
+ background-repeat: no-repeat;
+ -webkit-background-size: contain;
+ -moz-background-size: contain;
+ -o-background-size: contain;
+ background-size: contain;
+ -webkit-transition: opacity 400ms ease;
+ -moz-transition: opacity 400ms ease;
+ -ms-transition: opacity 400ms ease;
+ -o-transition: opacity 400ms ease;
+ transition: opacity 400ms ease;
+}
+.bodywebsite .owl-carousel .owl-video-frame {
+ position: relative;
+ z-index: 1;
+}
+.bodywebsite .owl-carousel .owl-stage {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: stretch;
+ -ms-flex-align: stretch;
+ align-items: stretch;
+}
+.bodywebsite .owl-carousel .owl-item {
+ float: none;
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ -webkit-flex-shrink: 0;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+ -webkit-align-items: stretch;
+ -ms-flex-align: stretch;
+ align-items: stretch;
+}
+.bodywebsite .owl-carousel .item {
+ width: 100%;
+}
+.bodywebsite .owl-carousel-center .owl-item {
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+}
+.bodywebsite .owl-carousel-center .owl-stage {
+ -webkit-justify-content: space-around;
+ -ms-flex-pack: distribute;
+ justify-content: space-around;
+}
+.bodywebsite .owl-prev,
+.bodywebsite .owl-next {
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+ color: #000;
+ transition: .22s;
+}
+.bodywebsite .owl-prev.disabled,
+.bodywebsite .owl-next.disabled {
+ opacity: 0;
+}
+.bodywebsite .owl-prev:hover,
+.bodywebsite .owl-next:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .owl-prev {
+ left: 0;
+}
+.bodywebsite .owl-prev:before {
+ content: '\e5c4';
+}
+.bodywebsite .owl-next {
+ right: 0;
+}
+.bodywebsite .owl-next:before {
+ content: '\e5c8';
+}
+.bodywebsite .owl-dots {
+ text-align: center;
+}
+.bodywebsite .owl-dot {
+ display: inline-block;
+}
+.bodywebsite .owl-numbering-default {
+ padding-bottom: 15px;
+}
+.bodywebsite .owl-numbering-default > * {
+ display: inline-block;
+}
+.bodywebsite .owl-numbering-default .numbering-current {
+ min-width: 16px;
+ font: 700 25px "Roboto", Helvetica, Arial, sans-serif;
+ color: #000;
+ transition: .33s all ease;
+}
+.bodywebsite .owl-numbering-default .numbering-separator {
+ position: relative;
+ display: inline-block;
+ margin: 0 10px;
+}
+.bodywebsite .owl-numbering-default .numbering-separator:after {
+ position: absolute;
+ top: -23px;
+ left: -12px;
+ content: '';
+ width: 2px;
+ height: 51px;
+ transform-origin: 50% 75%;
+ transform: rotate(30deg);
+ background: rgba(0, 0, 0, 0.3);
+}
+.bodywebsite .owl-numbering-default .numbering-count {
+ position: relative;
+ top: 19px;
+ left: -7px;
+ font: 400 18px "Roboto", Helvetica, Arial, sans-serif;
+ color: rgba(0, 0, 0, 0.3);
+}
+.bodywebsite .owl-carousel-inverse .owl-next,
+.bodywebsite .owl-carousel-inverse .owl-prev {
+ color: #fff;
+}
+.bodywebsite .owl-carousel-inverse .owl-next:hover,
+.bodywebsite .owl-carousel-inverse .owl-prev:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .owl-carousel-inverse .owl-numbering-default .numbering-current {
+ color: #fff;
+}
+.bodywebsite .owl-carousel-inverse .owl-numbering-default .numbering-separator:after {
+ background: rgba(255, 255, 255, 0.3);
+}
+.bodywebsite .owl-carousel-inverse .owl-numbering-default .numbering-count {
+ color: rgba(255, 255, 255, 0.3);
+}
+.bodywebsite .owl-carousel-dark .owl-next,
+.bodywebsite .owl-carousel-dark .owl-prev {
+ color: #000;
+}
+.bodywebsite .owl-carousel-dark .owl-next:hover,
+.bodywebsite .owl-carousel-dark .owl-prev:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .owl-nav-position-numbering .owl-next,
+.bodywebsite .owl-nav-position-numbering .owl-prev {
+ top: auto;
+ bottom: -53px;
+ transform: none;
+}
+.bodywebsite .owl-nav-position-numbering .owl-prev {
+ left: auto;
+ right: calc(92%);
+}
+.bodywebsite .owl-nav-position-numbering .owl-next {
+ right: auto;
+ left: calc(92%);
+}
+.bodywebsite .owl-nav-position-numbering + .owl-numbering {
+ margin-top: 15px;
+}
+.bodywebsite .owl-nav-bottom-left .owl-nav {
+ margin-top: 15px;
+}
+.bodywebsite .owl-nav-bottom-left .owl-next,
+.bodywebsite .owl-nav-bottom-left .owl-prev {
+ display: inline-block;
+ position: static;
+ top: auto;
+ transform: none;
+}
+.bodywebsite .owl-nav-bottom-left .owl-prev {
+ left: auto;
+}
+.bodywebsite .owl-nav-bottom-left .owl-next {
+ right: auto;
+ margin-left: 10px;
+}
+.bodywebsite .owl-style-minimal .item {
+ width: 100%;
+}
+.bodywebsite .owl-style-minimal .item img {
+ width: 100%;
+}
+.bodywebsite .owl-style-minimal .owl-dots {
+ margin-top: 10px;
+ text-align: center;
+}
+.bodywebsite .owl-style-minimal .owl-dot {
+ width: 8px;
+ height: 8px;
+ border-radius: 10px;
+ background: #dedede;
+ transition: .33s all ease;
+}
+.bodywebsite .owl-style-minimal .owl-dot.active,
+.bodywebsite .owl-style-minimal .owl-dot:hover {
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .owl-style-minimal .owl-dot + .owl-dot {
+ margin-left: 8px;
+}
+.bodywebsite .owl-style-minimal-inverse .owl-dot {
+ background: #74787C;
+}
+@media (min-width: 992px) {
+ .bodywebsite .owl-spacing-1 {
+ padding-right: 60px;
+ padding-left: 60px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .owl-spacing-1 {
+ padding: 0;
+ }
+ .bodywebsite .owl-spacing-1 .owl-item {
+ padding-right: 41px;
+ padding-left: 41px;
+ }
+ .bodywebsite .owl-spacing-1 .owl-prev {
+ left: -6%;
+ }
+ .bodywebsite .owl-spacing-1 .owl-next {
+ right: -6%;
+ }
+}
+.bodywebsite .owl-nav-classic .owl-nav {
+ display: none;
+}
+@media (min-width: 992px) {
+ .bodywebsite .owl-nav-classic .owl-dots {
+ display: none !important;
+ }
+ .bodywebsite .owl-nav-classic .owl-nav {
+ display: block;
+ }
+ .bodywebsite .owl-nav-classic .owl-nav .owl-prev,
+ .bodywebsite .owl-nav-classic .owl-nav .owl-next {
+ top: 39%;
+ transform: translateY(-45%);
+ width: 45px;
+ height: 45px;
+ line-height: 45px;
+ color: #fff;
+ background: rgba(255, 255, 255, 0.2);
+ text-align: center;
+ font: 400 20px/45px 'fl-flat-icons-set-2';
+ }
+ .bodywebsite .owl-nav-classic .owl-nav .owl-prev:hover,
+ .bodywebsite .owl-nav-classic .owl-nav .owl-next:hover {
+ color: #fff;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ }
+ .bodywebsite .owl-nav-classic .owl-nav .owl-prev {
+ padding-right: 3px;
+ }
+ .bodywebsite .owl-nav-classic .owl-nav .owl-prev:before {
+ position: relative;
+ display: inline-block;
+ content: '\e015';
+ transform: scale(-1, 1);
+ }
+ .bodywebsite .owl-nav-classic .owl-nav .owl-next {
+ padding-left: 3px;
+ }
+ .bodywebsite .owl-nav-classic .owl-nav .owl-next:before {
+ content: '\e015';
+ }
+}
+.bodywebsite .owl-nav-modern .owl-nav {
+ display: none;
+}
+@media (min-width: 1400px) {
+ .bodywebsite .owl-nav-modern .owl-dots {
+ display: none !important;
+ }
+ .bodywebsite .owl-nav-modern .owl-nav {
+ display: block;
+ }
+ .bodywebsite .owl-nav-modern .owl-nav .owl-prev:before,
+ .bodywebsite .owl-nav-modern .owl-nav .owl-next:before {
+ content: '';
+ }
+ .bodywebsite .owl-nav-modern .owl-nav .owl-prev:hover,
+ .bodywebsite .owl-nav-modern .owl-nav .owl-next:hover {
+ opacity: 0.5;
+ }
+ .bodywebsite .owl-nav-modern .owl-nav .owl-prev {
+ left: -58px;
+ }
+ .bodywebsite .owl-nav-modern .owl-nav .owl-next {
+ right: -50px;
+ }
+ .bodywebsite .owl-nav-modern .owl-nav .owl-next {
+ -webkit-transform: rotate(180deg);
+ transform: rotate(180deg);
+ }
+}
+@-webkit-keyframes rd-navbar-slide-down {
+ 0% {
+ transform: translateY(-100%);
+ }
+ 100% {
+ transform: translateY(0);
+ }
+}
+
+.rd-navbar-group.rd-navbar-search-wrap.toggle-original-elements.active {
+ overflow: hidden;
+}
+
+.bodywebsite .rd-navbar-wrap,
+.bodywebsite .rd-navbar-static .rd-navbar-megamenu,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu,
+.bodywebsite .rd-navbar-static .rd-navbar-inner,
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav-wrap,
+.bodywebsite .rd-navbar-fixed .rd-navbar-submenu,
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-group,
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle,
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:before,
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:after,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-search,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-group,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search {
+ transition: 0.3s all cubic-bezier(0.785, 0.135, 0.15, 0.86);
+}
+.bodywebsite .rd-navbar,
+.bodywebsite .rd-navbar.rd-navbar--is-clone {
+ display: none;
+}
+.bodywebsite .rd-navbar-fixed,
+.bodywebsite .rd-navbar-static,
+.bodywebsite .rd-navbar-fullwidth,
+.bodywebsite .rd-navbar-sidebar {
+ display: block;
+}
+.bodywebsite .rd-navbar--no-transition,
+.bodywebsite .rd-navbar--no-transition * {
+ transition: none !important;
+}
+.bodywebsite .rd-navbar-wrap {
+ position: relative;
+ z-index: 10;
+}
+.bodywebsite .rd-navbar-wrap,
+.bodywebsite .rd-navbar,
+.bodywebsite .rd-navbar-brand,
+.bodywebsite .rd-navbar-slogan,
+.bodywebsite .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-megamenu,
+.bodywebsite .rd-navbar-collapse-items,
+.bodywebsite .brand-name,
+.bodywebsite .rd-navbar-nav,
+.bodywebsite .rd-navbar-panel,
+.bodywebsite .rd-navbar-search-form-input,
+.bodywebsite .rd-navbar-search-form-submit,
+.bodywebsite .rd-navbar-search-toggle,
+.bodywebsite .rd-navbar-live-search-results,
+.bodywebsite .rd-navbar-search-form {
+ transition: 0.33s all ease-out;
+}
+.bodywebsite .rd-navbar-collapse-toggle {
+ display: inline-block;
+ position: relative;
+ width: 48px;
+ height: 48px;
+ line-height: 48px;
+ cursor: pointer;
+ color: #00030a;
+ display: none;
+}
+.bodywebsite .rd-navbar-collapse-toggle span {
+ top: 50%;
+ margin-top: -3px;
+}
+.bodywebsite .rd-navbar-collapse-toggle span,
+.bodywebsite .rd-navbar-collapse-toggle span:before,
+.bodywebsite .rd-navbar-collapse-toggle span:after {
+ position: absolute;
+ width: 6px;
+ height: 6px;
+ line-height: 6px;
+ text-align: center;
+ background: #00030a;
+ left: 50%;
+ margin-left: -3px;
+ border-radius: 50%;
+ transition: .3s all ease;
+}
+.bodywebsite .rd-navbar-collapse-toggle span:before,
+.bodywebsite .rd-navbar-collapse-toggle span:after {
+ content: '';
+}
+.bodywebsite .rd-navbar-collapse-toggle span:before {
+ bottom: 100%;
+ margin-bottom: 3px;
+}
+.bodywebsite .rd-navbar-collapse-toggle span:after {
+ top: 100%;
+ margin-top: 3px;
+}
+.bodywebsite .rd-navbar-collapse-toggle.active span {
+ transform: scale(0.7);
+}
+.bodywebsite .rd-navbar-collapse-toggle.active span:before {
+ transform: translateY(18px);
+}
+.bodywebsite .rd-navbar-collapse-toggle.active span:after {
+ transform: translateY(-18px);
+}
+.bodywebsite .rd-navbar--has-sidebar body {
+ padding-left: 270px;
+}
+.bodywebsite .rd-navbar--is-stuck {
+ border-bottom: 1px solid #e5e7e9;
+}
+.bodywebsite .rd-navbar.rd-navbar-fixed + .rd-navbar.rd-navbar--is-clone,
+.bodywebsite .rd-navbar.rd-navbar-sidebar + .rd-navbar.rd-navbar--is-clone {
+ display: none;
+}
+.bodywebsite .rd-navbar {
+ display: none;
+ background: #fff;
+ box-shadow: none;
+}
+.bodywebsite .rd-navbar-toggle {
+ display: inline-block;
+ position: relative;
+ width: 48px;
+ height: 48px;
+ line-height: 48px;
+ cursor: pointer;
+ color: #000;
+ background-color: transparent;
+ border: none;
+ display: none;
+}
+.bodywebsite .rd-navbar-toggle span {
+ position: relative;
+ display: block;
+ margin: auto;
+ transition: .3s all ease;
+}
+.bodywebsite .rd-navbar-toggle span:after,
+.bodywebsite .rd-navbar-toggle span:before {
+ content: "";
+ position: absolute;
+ left: 0;
+ top: -8px;
+ transition: .3s all ease;
+}
+.bodywebsite .rd-navbar-toggle span:after {
+ top: 8px;
+}
+.bodywebsite .rd-navbar-toggle span:after,
+.bodywebsite .rd-navbar-toggle span:before,
+.bodywebsite .rd-navbar-toggle span {
+ width: 24px;
+ height: 4px;
+ background-color: #000;
+ backface-visibility: hidden;
+ border-radius: 2px;
+}
+.bodywebsite .rd-navbar-toggle span {
+ transform: rotate(180deg);
+}
+.bodywebsite .rd-navbar-toggle span:before,
+.bodywebsite .rd-navbar-toggle span:after {
+ transform-origin: 1.71429px center;
+}
+.bodywebsite .rd-navbar-toggle.active span {
+ transform: rotate(360deg);
+}
+.bodywebsite .rd-navbar-toggle.active span:before,
+.bodywebsite .rd-navbar-toggle.active span:after {
+ top: 0;
+ width: 15px;
+}
+.bodywebsite .rd-navbar-toggle.active span:before {
+ -webkit-transform: rotate3d(0, 0, 1, -40deg);
+ transform: rotate3d(0, 0, 1, -40deg);
+}
+.bodywebsite .rd-navbar-toggle.active span:after {
+ -webkit-transform: rotate3d(0, 0, 1, 40deg);
+ transform: rotate3d(0, 0, 1, 40deg);
+}
+.bodywebsite .rd-navbar-toggle:focus {
+ outline: none;
+}
+.bodywebsite .rd-navbar-brand {
+ transition: none !important;
+}
+.bodywebsite .rd-navbar-brand svg {
+ fill: #000;
+}
+.bodywebsite .rd-navbar-search .rd-navbar-search-toggle,
+.bodywebsite .rd-navbar-search .rd-search-submit,
+.bodywebsite .buttonwithnoborder {
+ background: none;
+ border: none;
+ display: inline-block;
+ padding: 0;
+ outline: none;
+ outline-offset: 0;
+ cursor: pointer;
+ -webkit-appearance: none;
+}
+.bodywebsite .rd-navbar-search .rd-navbar-search-toggle::-moz-focus-inner,
+.bodywebsite .rd-navbar-search .rd-search-submit::-moz-focus-inner {
+ border: none;
+ padding: 0;
+}
+.bodywebsite .rd-navbar-search .form-input::-ms-clear {
+ display: none;
+}
+.bodywebsite .rd-navbar-search-toggle {
+ display: inline-block;
+ width: 36px;
+ height: 36px;
+ text-align: center;
+ font-family: "Font Awesome 5 Free";
+ font-weight: 600;
+ font-size: initial;
+}
+.bodywebsite .rd-navbar-search-toggle:before {
+ content: '\f002';
+ position: absolute;
+ left: 0;
+ top: 0;
+}
+.bodywebsite .rd-navbar-search-toggle:after {
+ display: none;
+}
+.bodywebsite .rd-navbar-aside {
+ pointer-events: none;
+}
+.bodywebsite .rd-navbar-aside > * {
+ pointer-events: auto;
+}
+.bodywebsite .rd-navbar-aside-toggle {
+ display: none;
+ pointer-events: auto;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-search-form-input input,
+.bodywebsite .rd-navbar-sidebar .rd-navbar-search-form-input input,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-search-form-input input {
+ width: 100%;
+ padding: 0 10px;
+ font-size: 16px;
+}
+.bodywebsite .rd-navbar-static:after,
+.bodywebsite .rd-navbar-fullwidth:after {
+ content: '';
+ background: #fff;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-brand,
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li > a,
+.bodywebsite .rd-navbar-static .rd-navbar-search-toggle,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-brand,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > a,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-search-toggle {
+ position: relative;
+ z-index: 2;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-inner,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-inner {
+ position: relative;
+ max-width: 1200px;
+ padding-left: 15px;
+ padding-right: 15px;
+ margin-left: auto;
+ margin-right: auto;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li > a,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > a {
+ position: relative;
+ padding: 5px 0;
+ font-size: 13px;
+ line-height: 1.2;
+ color: #00030a;
+ background: transparent;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li > a .label,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > a .label {
+ position: absolute;
+ left: 0;
+ margin: -18px 0 0 0;
+}
+@media (min-width: 1200px) {
+ .bodywebsite .rd-navbar-static .rd-navbar-nav > li > a,
+ .bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > a {
+ font-size: 14px;
+ }
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li.active > a,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li.active > a {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ background: transparent;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li.focus > a,
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li > a:hover,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li.focus > a,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > a:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ background: transparent;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav .rd-navbar-submenu > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-static .rd-navbar-nav .rd-navbar-submenu > .rd-navbar-megamenu,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav .rd-navbar-submenu > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav .rd-navbar-submenu > .rd-navbar-megamenu {
+ opacity: 0;
+ visibility: hidden;
+ font-size: 14px;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav .rd-navbar-submenu.focus,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav .rd-navbar-submenu.focus {
+ opacity: 1;
+ visibility: visible;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu > .rd-navbar-megamenu,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu > .rd-navbar-megamenu {
+ transform: translateY(30px);
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu.opened > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu.opened > .rd-navbar-megamenu,
+.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu.focus > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu.focus > .rd-navbar-megamenu,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu.opened > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu.opened > .rd-navbar-megamenu,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu.focus > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu.focus > .rd-navbar-megamenu {
+ transform: translateY(0);
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu > .rd-navbar-dropdown {
+ transform: translateX(-20px);
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu.focus > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu.opened > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu.focus > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu.opened > .rd-navbar-dropdown {
+ transform: translateX(0);
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu.focus > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu.opened > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu.focus > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu.opened > .rd-navbar-dropdown {
+ display: block;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li {
+ display: inline-block;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav li.rd-navbar--has-dropdown,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav li.rd-navbar--has-dropdown {
+ position: relative;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav li.focus > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-static .rd-navbar-nav li.focus > .rd-navbar-megamenu,
+.bodywebsite .rd-navbar-static .rd-navbar-nav li.opened > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-static .rd-navbar-nav li.opened > .rd-navbar-megamenu,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav li.focus > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav li.focus > .rd-navbar-megamenu,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav li.opened > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav li.opened > .rd-navbar-megamenu {
+ opacity: 1;
+ visibility: visible;
+ transform: translateY(0);
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > .rd-navbar-dropdown {
+ position: absolute;
+ left: 0;
+ z-index: 5;
+ display: block;
+ margin-top: 27px;
+ text-align: left;
+ background: #fff;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-list li,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-list li {
+ padding-left: 5px;
+ padding-right: 5px;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a,
+.bodywebsite .rd-navbar-static .rd-navbar-list > li > a,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a {
+ position: relative;
+ display: block;
+ width: 100%;
+ padding-left: 0;
+ padding-right: 14px;
+ font-size: 14px;
+ line-height: 1.3;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a,
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:before,
+.bodywebsite .rd-navbar-static .rd-navbar-list > li > a,
+.bodywebsite .rd-navbar-static .rd-navbar-list > li > a:before,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:before,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a:before {
+ transition: .33s all ease;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:before,
+.bodywebsite .rd-navbar-static .rd-navbar-list > li > a:before,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:before,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a:before {
+ position: absolute;
+ top: 0;
+ left: -6px;
+ content: '\f105';
+ font-family: "Font Awesome 5 Free";
+ font-weight: 600;
+ font-size: initial;
+ line-height: inherit;
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ opacity: 0;
+ visibility: hidden;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:hover,
+.bodywebsite .rd-navbar-static .rd-navbar-list > li > a:hover,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:hover,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a:hover {
+ padding-left: 14px;
+ padding-right: 0;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:hover:before,
+.bodywebsite .rd-navbar-static .rd-navbar-list > li > a:hover:before,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:hover:before,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a:hover:before {
+ left: 0;
+ opacity: 1;
+ visibility: visible;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a,
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:focus,
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:active,
+.bodywebsite .rd-navbar-static .rd-navbar-list > li > a,
+.bodywebsite .rd-navbar-static .rd-navbar-list > li > a:focus,
+.bodywebsite .rd-navbar-static .rd-navbar-list > li > a:active,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:focus,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:active,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a:focus,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a:active {
+ color: #9f9f9f;
+ background: transparent;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:hover,
+.bodywebsite .rd-navbar-static .rd-navbar-list > li > a:hover,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:hover,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ background: transparent;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li + li,
+.bodywebsite .rd-navbar-static .rd-navbar-list > li + li,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li + li,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li + li {
+ margin-top: 14px;
+}
+@media (min-width: 1200px) {
+ .bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a,
+ .bodywebsite .rd-navbar-static .rd-navbar-list > li > a,
+ .bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a,
+ .bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a {
+ font-size: 16px;
+ }
+}
+@media (min-width: 1800px) {
+ .bodywebsite .rd-navbar-static .rd-navbar-dropdown > li + li,
+ .bodywebsite .rd-navbar-static .rd-navbar-list > li + li,
+ .bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li + li,
+ .bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li + li {
+ margin-top: 17px;
+ }
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-static .rd-navbar-megamenu,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu {
+ box-shadow: 0 0 13px 0 rgba(0, 0, 0, 0.13);
+ border-top: 2px solid maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown {
+ width: 188px;
+ padding: 25px 25px 30px;
+ margin-left: -32px;
+ background: #fff;
+}
+@media (min-width: 1200px) {
+ .bodywebsite .rd-navbar-static .rd-navbar-dropdown,
+ .bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown {
+ width: 235px;
+ }
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown .rd-navbar-dropdown {
+ position: absolute;
+ left: 100%;
+ margin-left: 91px;
+ top: -20px;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a {
+ display: block;
+ width: 100%;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a,
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:focus,
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:active,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:focus,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:active {
+ color: #9f9f9f;
+ background: transparent;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:hover,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ background: transparent;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li.focus > a,
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li.opened > a,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li.focus > a,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li.opened > a {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ background: transparent;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-megamenu,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu {
+ position: absolute;
+ z-index: 4;
+ display: table;
+ table-layout: fixed;
+ width: calc(70%);
+ left: 15px;
+ max-width: 1200px;
+ margin-top: 27px;
+ text-align: left;
+ background: #fff;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-megamenu > li,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu > li {
+ position: relative;
+ display: table-cell;
+ padding: 34px 20px 30px 35px;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-megamenu > li + li,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu > li + li {
+ border-left: 1px solid #ededed;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-megamenu * + .rd-megamenu-header,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu * + .rd-megamenu-header {
+ margin-top: 40px;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-megamenu * + .rd-navbar-list,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu * + .rd-navbar-list {
+ margin-top: 20px;
+}
+@media (min-width: 1200px) {
+ .bodywebsite .rd-navbar-static .rd-navbar-megamenu,
+ .bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu {
+ width: 1140px;
+ }
+ .bodywebsite .rd-navbar-static .rd-navbar-megamenu > li,
+ .bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu > li {
+ padding: 44px 25px 50px 45px;
+ }
+}
+.bodywebsite .rd-navbar-static .rd-navbar-submenu-toggle,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-submenu-toggle {
+ display: none;
+ cursor: pointer;
+ z-index: 100;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-submenu-toggle:hover,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-submenu-toggle:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li > .rd-navbar-submenu-toggle,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > .rd-navbar-submenu-toggle {
+ display: none;
+ -webkit-align-self: center;
+ -ms-flex-item-align: center;
+ align-self: center;
+ width: 24px;
+ text-align: center;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li > .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > .rd-navbar-submenu-toggle::after {
+ content: '\f107';
+ position: relative;
+ display: inline-block;
+ font-family: "Font Awesome 5 Free";
+ font-weight: 600;
+ font-size: initial;
+ text-align: center;
+ transition: 0.4s all ease;
+ z-index: 2;
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ will-change: transform;
+ -webkit-filter: blur(0);
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li li.focus > .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li li.opened > .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li li > a:hover + .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li li.focus > .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li li.opened > .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li li > a:hover + .rd-navbar-submenu-toggle::after {
+ -webkit-transform: rotate(-90deg);
+ transform: rotate(-90deg);
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li.focus > .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li.opened > .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li > a:hover + .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li.focus > .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li.opened > .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > a:hover + .rd-navbar-submenu-toggle::after {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown .rd-navbar-submenu-toggle,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown .rd-navbar-submenu-toggle {
+ display: none;
+ vertical-align: middle;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown .rd-navbar-submenu-toggle::after {
+ top: 1px;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li.focus > .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li.opened > .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:hover + .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li.focus > .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li.opened > .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:hover + .rd-navbar-submenu-toggle::after {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .rd-navbar-static.rd-navbar--is-clone,
+.bodywebsite .rd-navbar-fullwidth.rd-navbar--is-clone {
+ display: none;
+}
+.bodywebsite .rd-navbar-static.rd-navbar--is-clone.rd-navbar--is-stuck,
+.bodywebsite .rd-navbar-fullwidth.rd-navbar--is-clone.rd-navbar--is-stuck {
+ display: block;
+}
+.bodywebsite .rd-navbar-static.rd-navbar--is-stuck,
+.bodywebsite .rd-navbar-static.rd-navbar--is-clone,
+.bodywebsite .rd-navbar-fullwidth.rd-navbar--is-stuck,
+.bodywebsite .rd-navbar-fullwidth.rd-navbar--is-clone {
+ position: fixed;
+ left: 0;
+ top: 0;
+ right: 0;
+ z-index: 999;
+ background: #fff;
+}
+.bodywebsite .rd-navbar-static.rd-navbar--is-stuck .rd-navbar-megamenu,
+.bodywebsite .rd-navbar-static.rd-navbar--is-clone .rd-navbar-megamenu,
+.bodywebsite .rd-navbar-fullwidth.rd-navbar--is-stuck .rd-navbar-megamenu,
+.bodywebsite .rd-navbar-fullwidth.rd-navbar--is-clone .rd-navbar-megamenu {
+ margin-top: 18px;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-megamenu,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu {
+ position: absolute;
+ transform: translateY(30px);
+ text-align: left;
+ visibility: hidden;
+ opacity: 0;
+}
+.bodywebsite .rd-navbar-static .rd-navbar--has-dropdown,
+.bodywebsite .rd-navbar-fullwidth .rd-navbar--has-dropdown {
+ position: relative;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-collapse-toggle,
+.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-toggle {
+ display: inline-block;
+ z-index: 9999;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-sidebar .rd-navbar-dropdown {
+ display: block;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-collapse-items,
+.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-items {
+ position: absolute;
+ width: 260px;
+ padding: 25px 15px;
+ box-shadow: none;
+ color: #00030a;
+ background: #fff;
+ font-size: 16px;
+ line-height: 34px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-collapse-items li > *,
+.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-items li > * {
+ vertical-align: middle;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-collapse-items li + li,
+.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-items li + li {
+ margin-top: 10px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-collapse-items .icon,
+.bodywebsite .rd-navbar-fixed .rd-navbar-collapse-items a,
+.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-items .icon,
+.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-items a {
+ display: inline-block;
+ font-size: 16px;
+ line-height: 30px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-collapse-items .icon,
+.bodywebsite .rd-navbar-fixed .rd-navbar-collapse-items a[class*="fa"]:before,
+.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-items .icon,
+.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-items a[class*="fa"]:before {
+ display: inline-block;
+ width: 30px;
+ height: 30px;
+ padding-right: 5px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav,
+.bodywebsite .rd-navbar-sidebar {
+ width: 270px;
+ left: 0;
+ top: 0;
+ font-size: 16px;
+ line-height: 34px;
+ color: #00030a;
+ background: #fff;
+ z-index: 998;
+}
+.bodywebsite .rd-navbar-static-smooth .rd-navbar {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ z-index: 9999;
+}
+.bodywebsite .rd-navbar-static {
+ display: block;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li {
+ display: inline-block;
+}
+.bodywebsite .rd-navbar-static .rd-navbar-nav > li + li {
+ margin-left: 10px;
+}
+.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search,
+.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search {
+ position: static;
+ z-index: 2;
+}
+.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search .rd-search,
+.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search .rd-search {
+ position: absolute;
+ top: -1px;
+ right: 4px;
+ bottom: 0;
+ left: 0;
+ z-index: 5;
+ opacity: 0;
+ visibility: hidden;
+}
+.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search .rd-search-submit,
+.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search .rd-search-submit {
+ width: 39px;
+ height: 39px;
+ line-height: 38px;
+}
+.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search .rd-search-results-live,
+.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search .rd-search-results-live {
+ padding: 0;
+ border: 0;
+ background: #fff;
+}
+.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search .rd-search-results-live > *,
+.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search .rd-search-results-live > * {
+ display: none;
+ padding: 16px;
+ border: 1px solid #e5e7e9;
+ border-top: 0;
+ border-radius: 0 0 3px 3px;
+}
+.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search .form-label,
+.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search .form-label {
+ border: 0;
+}
+.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search.active .rd-search,
+.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search.active .rd-search {
+ opacity: 1;
+ visibility: visible;
+ transition: .22s;
+}
+.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search.active .rd-search-results-live > *,
+.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search.active .rd-search-results-live > * {
+ display: block;
+}
+.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search-wrap.active .rd-navbar-nav-inner,
+.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search-wrap.active .rd-navbar-nav-inner {
+ position: relative;
+}
+.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search.active + .rd-navbar-nav,
+.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search.active + .rd-navbar-nav {
+ opacity: 0;
+ visibility: hidden;
+ pointer-events: none;
+}
+.bodywebsite .rd-navbar-static.rd-navbar--is-clone {
+ display: block;
+ transform: translateY(-105%);
+ transition: .33s all ease;
+}
+.bodywebsite .rd-navbar-static.rd-navbar--is-clone.rd-navbar--is-stuck {
+ transform: translateY(0);
+}
+.bodywebsite .rd-navbar-static.rd-navbar--is-clone .rd-navbar-inner,
+.bodywebsite .rd-navbar-static.rd-navbar--is-stuck .rd-navbar-inner {
+ padding: 13px 30px;
+}
+.bodywebsite .rd-navbar-static.rd-navbar--is-clone .rd-navbar-nav-wrap,
+.bodywebsite .rd-navbar-static.rd-navbar--is-stuck .rd-navbar-nav-wrap {
+ margin-top: 0;
+}
+.bodywebsite .rd-navbar-fullwidth {
+ display: block;
+ text-align: center;
+}
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav {
+ width: 100%;
+}
+.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li + li {
+ margin-left: 20px;
+}
+.bodywebsite .rd-navbar-fullwidth.rd-navbar--is-stuck .rd-navbar-panel {
+ display: none;
+}
+.bodywebsite .rd-navbar-fixed {
+ display: block;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-brand {
+ /*position: fixed; */
+ top: 10px;
+ left: 64px;
+ z-index: 17;
+ display: block;
+ overflow: hidden;
+ text-align: left;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-brand .brand-slogan {
+ display: none;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-panel {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ /* position: fixed; */
+ left: 0;
+ top: 0;
+ right: 0;
+ padding: 4px;
+ height: 56px;
+ color: #9f9f9f;
+ z-index: 999;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-panel:before {
+ content: '';
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ right: 0;
+ box-shadow: none;
+ border-bottom: 1px solid #e5e7e9;
+ background: #fff;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-toggle {
+ display: inline-block;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav-wrap {
+ position: fixed;
+ top: 56px;
+ left: 0;
+ bottom: -56px;
+ z-index: 998;
+ width: 270px;
+ padding: 0 0 56px;
+ color: #fff;
+ background: #fff;
+ border-right: 1px solid #e5e7e9;
+ transform: translateX(-105%);
+ pointer-events: none;
+ overflow: hidden;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav-wrap.active {
+ transform: translateX(0);
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav-inner {
+ position: relative;
+ z-index: 100000;
+ height: 100%;
+ padding: 10px 0 20px;
+ pointer-events: auto;
+ -webkit-overflow-scrolling: touch;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav-inner::-webkit-scrollbar {
+ width: 4px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav-inner::-webkit-scrollbar-thumb {
+ background: white;
+ border: none;
+ border-radius: 0;
+ opacity: .2;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav-inner::-webkit-scrollbar-track {
+ background: #fff;
+ border: none;
+ border-radius: 0;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav {
+ display: block;
+ font-size: 16px;
+ line-height: 26px;
+ text-align: left;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li > a {
+ display: block;
+ font-size: 16px;
+ padding: 14px 56px 14px 16px;
+ color: #464a4d;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li:hover > a,
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li:hover > a:hover,
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.focus > a,
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.focus > a:hover,
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.active > a,
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.active > a:hover,
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.opened > a,
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.opened > a:hover {
+ color: #fff;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li:hover > .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.focus > .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.active > .rd-navbar-submenu-toggle::after,
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.opened > .rd-navbar-submenu-toggle::after {
+ color: #fff;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav > li + li {
+ margin-top: 4px;
+}
+.bodywebsite .rd-navbar-fixed .label-custom {
+ position: relative;
+ top: -1px;
+ display: inline-block;
+ margin: 0 0 0 8px;
+ font-size: 60%;
+ line-height: 1;
+ padding: 6px .5em 5px;
+ vertical-align: middle;
+}
+.bodywebsite .iphone .rd-navbar-fixed .label-custom,
+.bodywebsite .ipad .rd-navbar-fixed .label-custom,
+.bodywebsite .mac .rd-navbar-fixed .label-custom {
+ padding: 6px .5em 4px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-dropdown > li > a,
+.bodywebsite .rd-navbar-fixed .rd-navbar-list > li > a {
+ font-family: "Roboto", Helvetica, Arial, sans-serif;
+ font-size: 12px;
+ line-height: 1.2;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-megamenu .rd-megamenu-header {
+ padding: 0 15px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-megamenu > li {
+ padding-top: 15px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-megamenu * + .rd-megamenu-header {
+ margin-top: 15px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-megamenu * + .rd-navbar-list {
+ margin-top: 10px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fixed .rd-navbar-megamenu {
+ display: none;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-submenu {
+ position: relative;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-submenu li > a {
+ font-size: 14px;
+ padding-left: 30px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-submenu .rd-navbar-dropdown li li > a,
+.bodywebsite .rd-navbar-fixed .rd-navbar-submenu .rd-navbar-megamenu ul li li > a {
+ padding-left: 48px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-submenu.opened > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fixed .rd-navbar-submenu.opened > .rd-navbar-megamenu {
+ display: block;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-search,
+.bodywebsite .rd-navbar-fixed .rd-navbar-btn-wrap {
+ display: block;
+ padding: 16px 5px;
+}
+.bodywebsite .rd-navbar-fixed .rd-search .rd-search-results-live {
+ display: none;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-btn-wrap {
+ padding: 16px 10px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-btn-wrap .btn {
+ width: 100%;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li .rd-navbar-megamenu {
+ transition: opacity 0.3s, height 0.4s ease;
+ opacity: 0;
+ height: 0;
+ overflow: hidden;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.opened > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.opened > .rd-navbar-megamenu {
+ padding: 3px 0;
+ opacity: 1;
+ height: auto;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.opened > .rd-navbar-submenu-toggle {
+ color: #fff;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.opened > .rd-navbar-submenu-toggle::after {
+ transform: rotate(180deg);
+ margin-top: -24px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-submenu-toggle::after {
+ content: '\f107';
+ position: absolute;
+ top: 24px;
+ right: 0;
+ margin-top: -18px;
+ width: 65px;
+ height: 44px;
+ font-family: "Font Awesome 5 Free";
+ font-weight: 600;
+ font-size: initial;
+ line-height: 42px;
+ text-align: center;
+ transition: 0.4s all ease;
+ z-index: 2;
+ cursor: pointer;
+ color: #000;
+ will-change: transform;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-collapse,
+.bodywebsite .rd-navbar-fixed .rd-navbar-search-toggle {
+ position: fixed;
+ top: 4px;
+ height: 48px;
+ z-index: 1000;
+ background-color: transparent;
+ border: none;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-collapse:focus,
+.bodywebsite .rd-navbar-fixed .rd-navbar-search-toggle:focus {
+ outline: none;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-aside {
+ top: 0;
+ right: 0;
+ width: 100%;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-aside,
+.bodywebsite .rd-navbar-fixed .rd-navbar-aside .rd-navbar-aside-toggle {
+ position: fixed;
+ z-index: 1000;
+ display: block;
+ height: 48px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-aside.active .rd-navbar-aside-content {
+ visibility: visible;
+ opacity: 1;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle {
+ top: 4px;
+ right: 4px;
+ display: inline-block;
+ position: relative;
+ width: 48px;
+ height: 48px;
+ line-height: 48px;
+ cursor: pointer;
+ color: #000;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle span {
+ top: 50%;
+ margin-top: -3px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle span,
+.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle span:before,
+.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle span:after {
+ position: absolute;
+ width: 6px;
+ height: 6px;
+ line-height: 6px;
+ text-align: center;
+ background: #000;
+ left: 50%;
+ margin-left: -3px;
+ border-radius: 50%;
+ transition: .3s all ease;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle span:before,
+.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle span:after {
+ content: '';
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle span:before {
+ bottom: 100%;
+ margin-bottom: 3px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle span:after {
+ top: 100%;
+ margin-top: 3px;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle.active span {
+ transform: scale(0.7);
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle.active span:before {
+ transform: translateY(18px);
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle.active span:after {
+ transform: translateY(-18px);
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-aside-content {
+ position: absolute;
+ top: calc(107%);
+ right: 0;
+ width: calc(102%);
+ padding: 20px 35px;
+ margin: 0 -1px;
+ pointer-events: auto;
+ opacity: 0;
+ visibility: hidden;
+ transition: 0.23s all ease-out;
+}
+@media (min-width: 768px) {
+ .bodywebsite .rd-navbar-fixed .rd-navbar-aside-content {
+ width: auto;
+ }
+}
+.bodywebsite .rd-navbar-fixed.rd-navbar--is-clone {
+ display: none;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-fixed--visible {
+ display: block;
+}
+.bodywebsite .rd-navbar-fixed .rd-navbar-fixed--hidden {
+ display: none;
+}
+.bodywebsite html.rd-navbar-fixed-linked .page {
+ padding-top: 56px;
+}
+.bodywebsite html.rd-navbar-sidebar-linked body {
+ padding-left: 270px;
+}
+.bodywebsite .rd-navbar-sidebar {
+ position: fixed;
+ display: block;
+}
+.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li:hover > a,
+.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li:hover > a:hover,
+.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.focus > a,
+.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.focus > a:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ background: transparent;
+}
+.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li:hover > .rd-navbar-submenu-toggle,
+.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.focus > .rd-navbar-submenu-toggle {
+ color: #fff;
+}
+.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li:hover > .rd-navbar-submenu-toggle:hover,
+.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.focus > .rd-navbar-submenu-toggle:hover {
+ cursor: pointer;
+ color: #fff;
+}
+.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li .rd-navbar-megamenu {
+ transition: opacity 0.3s, height 0.4s ease;
+ opacity: 0;
+ height: 0;
+ overflow: hidden;
+}
+.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.opened > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.opened > .rd-navbar-megamenu {
+ opacity: 1;
+ height: auto;
+}
+.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.opened > a {
+ background: transparent;
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.opened > .rd-navbar-submenu-toggle {
+ color: #fff;
+}
+.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.opened > .rd-navbar-submenu-toggle::after {
+ -webkit-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+.bodywebsite .rd-navbar-sidebar .rd-navbar-submenu-toggle::after {
+ content: '\f078';
+ position: absolute;
+ top: 22px;
+ right: 0;
+ margin-top: -22px;
+ width: 65px;
+ height: 44px;
+ font-family: "Font Awesome 5 Free";
+ font-weight: 600;
+ font-size: initial;
+ line-height: 42px;
+ text-align: center;
+ transition: 0.4s all ease;
+ z-index: 2;
+}
+.bodywebsite .rd-navbar-sidebar .rd-navbar-brand {
+ text-align: center;
+}
+.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-items {
+ top: 0;
+ left: 0;
+ padding-top: 45px;
+ transform: scale(0.7);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ visibility: hidden;
+}
+.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse {
+ position: absolute;
+ top: 4px;
+ left: 4px;
+ display: inline-block;
+ z-index: 1;
+}
+.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse.active .rd-navbar-collapse-items {
+ opacity: 1;
+ visibility: visible;
+ transform: scale(1);
+}
+.bodywebsite .rd-navbar-default .rd-navbar-nav > li > a {
+ font-family: "Roboto", Helvetica, Arial, sans-serif;
+ font-weight: 700;
+ line-height: 1.2;
+ text-transform: uppercase;
+ color: #00030a;
+}
+.bodywebsite .rd-navbar-default .rd-navbar-search .form-input,
+.bodywebsite .rd-navbar-default .rd-navbar-search .form-label {
+ font-size: 16px;
+ line-height: 1.3;
+ color: #9b9b9b;
+}
+.bodywebsite .rd-navbar-default .rd-navbar-search .form-label {
+ top: 18px;
+ left: 22px;
+}
+.bodywebsite .rd-navbar-default .rd-navbar-search .form-input {
+ padding: 7px 45px 10px 22px;
+ height: auto;
+ min-height: 20px;
+ border: 1px solid #e5e7e9;
+ border-radius: 3px;
+}
+.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle,
+.bodywebsite .rd-navbar-default .rd-navbar-search .rd-search-submit {
+ font-size: 25px;
+}
+.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle,
+.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle:active,
+.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle:focus,
+.bodywebsite .rd-navbar-default .rd-navbar-search .rd-search-submit,
+.bodywebsite .rd-navbar-default .rd-navbar-search .rd-search-submit:active,
+.bodywebsite .rd-navbar-default .rd-navbar-search .rd-search-submit:focus {
+ color: #00030a;
+}
+.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle:hover,
+.bodywebsite .rd-navbar-default .rd-navbar-search .rd-search-submit:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle,
+.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle:before,
+.bodywebsite .rd-navbar-default .rd-navbar-search .rd-search-submit,
+.bodywebsite .rd-navbar-default .rd-navbar-search .rd-search-submit:before {
+ font-family: 'Material Icons';
+}
+.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle {
+ position: relative;
+}
+.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle:after {
+ content: '\e5cd';
+}
+.bodywebsite .rd-navbar-default.rd-navbar-fixed .rd-navbar-shop {
+ position: fixed;
+ top: 15px;
+ right: 15px;
+ z-index: 1001;
+}
+.bodywebsite .rd-navbar-default.rd-navbar-fixed .rd-navbar-search .rd-navbar-search-toggle {
+ display: none;
+}
+.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-inner,
+.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-group {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+}
+.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-inner {
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ padding: 44px 15px 42px;
+ font-size: 0;
+ line-height: 0;
+}
+.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-panel {
+ min-width: 100px;
+}
+.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-group {
+ -webkit-justify-content: flex-end;
+ -ms-flex-pack: end;
+ justify-content: flex-end;
+}
+.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-nav-inner {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row-reverse;
+ -ms-flex-direction: row-reverse;
+ flex-direction: row-reverse;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ margin-right: 12px;
+}
+.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-nav {
+ z-index: 0;
+ margin-right: 40px;
+ transition: .25s;
+}
+.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-nav > li + li {
+ margin-left: 32px;
+}
+@media (min-width: 1200px) {
+ .bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-nav {
+ margin-right: 77px;
+ }
+ .bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-nav > li + li {
+ margin-left: 48px;
+ }
+}
+.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-toggle .rd-navbar-nav > li .rd-navbar-toggle {
+ display: none;
+}
+.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-nav > li > .rd-navbar-dropdown {
+ margin-top: 54px;
+}
+.bodywebsite .rd-navbar-default.rd-navbar-static.rd-navbar--is-clone .rd-navbar-inner,
+.bodywebsite .rd-navbar-default.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-inner {
+ padding: 18px 15px;
+}
+.bodywebsite .rd-navbar-default.rd-navbar-static.rd-navbar--is-clone .rd-navbar-nav > li > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-default.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-nav > li > .rd-navbar-dropdown {
+ margin-top: 49px;
+}
+.bodywebsite .rd-navbar-corporate-dark .rd-navbar-nav > li > a {
+ font-weight: 700;
+ font-size: 14px;
+ letter-spacing: .05em;
+ text-transform: uppercase;
+}
+.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .form-input,
+.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .form-label {
+ font-size: 16px;
+ line-height: 1.3;
+ color: #9b9b9b;
+}
+.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .form-label {
+ top: 18px;
+ left: 22px;
+}
+.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .form-input {
+ padding: 7px 45px 7px 22px;
+ height: auto;
+ min-height: 20px;
+ border: 1px solid #e5e7e9;
+ border-radius: 3px;
+}
+.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .rd-navbar-search-toggle,
+.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .rd-search-submit {
+ text-align: center;
+ color: #000;
+}
+.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .rd-navbar-search-toggle:before,
+.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .rd-search-submit:before {
+ position: static;
+ display: inline-block;
+ font-family: 'fl-bigmug-line';
+ font-size: 20px;
+}
+.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .rd-navbar-search-toggle:hover,
+.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .rd-search-submit:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .rd-navbar-search-toggle:after {
+ display: none;
+}
+.bodywebsite .rd-navbar-corporate-dark .rd-navbar-aside {
+ width: 100%;
+ font-size: 14px;
+ line-height: 1.71429;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-fixed .rd-navbar-aside-content {
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #000;
+ background: #111;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-fixed .rd-navbar-aside .list-units > li + li {
+ margin-top: 10px;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-fixed .rd-navbar-aside * + .rd-navbar-aside-group {
+ margin-top: 14px;
+}
+@media (min-width: 576px) {
+ .bodywebsite .rd-navbar-corporate-dark.rd-navbar-fixed .rd-navbar-aside-content {
+ width: auto;
+ }
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-group {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-inner {
+ padding: 0;
+ font-size: 0;
+ line-height: 0;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-panel {
+ min-width: 100px;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside {
+ position: relative;
+ z-index: 2;
+ background: #3a3c3e;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside:after {
+ content: '';
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 50%;
+ transform: translateX(-50%);
+ background: inherit;
+ width: 102vw;
+ z-index: -1;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-content,
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-group {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-content {
+ padding: 12px 15px;
+ margin-bottom: -5px;
+ transform: translateY(-5px);
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-group {
+ -webkit-flex-shrink: 0;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-group:first-child {
+ margin-top: 7px;
+ -webkit-flex-grow: 8;
+ -ms-flex-positive: 8;
+ flex-grow: 8;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ margin-right: 20px;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-group:last-child {
+ margin-top: 5px;
+ -webkit-justify-content: flex-end;
+ -ms-flex-pack: end;
+ justify-content: flex-end;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .list-units li {
+ display: inline-block;
+ margin-top: 0;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .list-units li:not(:last-child) {
+ margin-right: 25px;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-group {
+ /* padding: 35px 15px; */
+ padding-top: 18px;
+ padding-bottom: 18px;
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav-inner {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row-reverse;
+ -ms-flex-direction: row-reverse;
+ flex-direction: row-reverse;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav {
+ margin-right: 23px;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav > li {
+ padding-left: 5px;
+ padding-right: 5px;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav > li > a {
+ font-size: 13px;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav > li.rd-navbar-submenu {
+ margin-right: -18px;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav > li > .rd-navbar-submenu-toggle {
+ display: inline-block;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav > li + li {
+ margin-left: 32px;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav .rd-navbar-dropdown > li {
+ padding-left: 5px;
+ padding-right: 5px;
+}
+@media (min-width: 1200px) {
+ .bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav > li > a {
+ font-size: 14px;
+ }
+ .bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav > li + li {
+ margin-left: 29px;
+ }
+ .bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .list-units li:not(:last-child) {
+ margin-right: 50px;
+ }
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-search {
+ position: static;
+ z-index: 2;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-search .rd-search {
+ position: absolute;
+ top: -2px;
+ /* right: -2px; */
+ bottom: 0;
+ left: 0;
+ z-index: 5;
+ opacity: 0;
+ visibility: hidden;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-search .rd-search-submit {
+ width: 39px;
+ height: 39px;
+ line-height: 38px;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-search-wrap.active .rd-navbar-nav-wrap {
+ position: relative;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-search.active + .rd-navbar-nav {
+ opacity: 0;
+ visibility: hidden;
+ pointer-events: none;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-toggle .rd-navbar-nav > li .rd-navbar-toggle {
+ display: none;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static.rd-navbar--is-clone .rd-navbar-aside,
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-aside {
+ display: none;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static.rd-navbar--is-clone .rd-navbar-group,
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-group {
+ padding-top: 18px;
+ padding-bottom: 18px;
+}
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static.rd-navbar--is-clone .rd-navbar-nav > li > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-nav > li > .rd-navbar-dropdown {
+ margin-top: 18px;
+}
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-nav > li > a {
+ font: 400 16px "Roboto", Helvetica, Arial, sans-serif;
+ letter-spacing: .025em;
+}
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .form-input,
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .form-label {
+ font-size: 16px;
+ line-height: 1.3;
+ color: #9b9b9b;
+}
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .form-label {
+ top: 18px;
+ left: 22px;
+}
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .form-input {
+ padding: 7px 22px 10px;
+ height: auto;
+ min-height: 20px;
+ border: 1px solid #e5e7e9;
+ border-radius: 3px;
+}
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle,
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-search-submit {
+ text-align: center;
+}
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:before,
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-search-submit:before {
+ font-family: 'fl-bigmug-line';
+ position: static;
+ display: inline-block;
+}
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:before,
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:after {
+ font-size: 20px;
+}
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:before {
+ font-family: 'fl-bigmug-line';
+ color: #000;
+}
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:after {
+ font-family: 'Material Icons';
+}
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:hover:before {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle,
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:before,
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:after {
+ width: 36px;
+ height: 36px;
+ text-align: center;
+}
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:before,
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:after {
+ display: block;
+ position: absolute;
+ left: 0;
+ top: 0;
+}
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:before {
+ content: "";
+ transform: scale(1) rotate(0deg);
+}
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:after {
+ content: "";
+ opacity: 0;
+ transform: scale(0) rotate(-90deg);
+}
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle.active:before {
+ opacity: 0;
+ transform: scale(0) rotate(90deg);
+}
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle.active:after {
+ opacity: 1;
+ transform: scale(1) rotate(0deg);
+}
+.bodywebsite .rd-navbar-corporate-light .rd-navbar-aside {
+ width: 100%;
+ font-size: 14px;
+ line-height: 1.71429;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search {
+ padding: 0;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-search {
+ opacity: 0;
+ visibility: hidden;
+ position: fixed;
+ width: 100%;
+ padding: 8px 10px;
+ transform: translateY(-80%);
+ background: #fff;
+ border: 1px solid #e5e7e9;
+ border-top: 0;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search.active .rd-search {
+ opacity: 1;
+ visibility: visible;
+ transform: translateY(0);
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .form-input {
+ padding: 7px 46px 10px 22px;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-navbar-search-toggle,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-search-submit {
+ font-size: 20px;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-navbar-search-toggle,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-navbar-search-toggle:active,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-navbar-search-toggle:focus,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-search-submit,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-search-submit:active,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-search-submit:focus {
+ color: #000;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-navbar-search-toggle:hover,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-search-submit:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-navbar-search-toggle {
+ position: fixed;
+ right: 56px;
+ top: 10px;
+ z-index: 1000;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-search-submit {
+ right: 10px;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-aside-content {
+ border: 1px solid #e5e7e9;
+ background: #fff;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-aside .list-units > li + li {
+ margin-top: 10px;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-aside * + .rd-navbar-aside-group {
+ margin-top: 14px;
+}
+@media (min-width: 576px) {
+ .bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-aside-content {
+ width: auto;
+ }
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-btn-wrap {
+ padding: 16px 5px;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-group {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-inner {
+ padding: 0;
+ font-size: 0;
+ line-height: 0;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-panel {
+ min-width: 100px;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside {
+ position: relative;
+ z-index: 100;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside-wrap,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-content,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-group {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside-wrap {
+ position: relative;
+ z-index: 1001;
+ padding: 6px 20px 6px 10px;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside-wrap:after {
+ content: '';
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 50%;
+ transform: translateX(-50%);
+ border-bottom: 1px solid #e5e7e9;
+ width: 101vw;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside-wrap > * + * {
+ margin-left: 10px;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-content {
+ margin-bottom: -5px;
+ transform: translateY(-5px);
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-group {
+ -webkit-flex-shrink: 0;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-group:first-child {
+ margin-top: 7px;
+ -webkit-flex-grow: 8;
+ -ms-flex-positive: 8;
+ flex-grow: 8;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ margin-right: 20px;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-group:last-child {
+ margin-top: 5px;
+ -webkit-justify-content: flex-end;
+ -ms-flex-pack: end;
+ justify-content: flex-end;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside .list-units li {
+ display: inline-block;
+ margin-top: 0;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside .list-units li:not(:last-child) {
+ margin-right: 30px;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-group {
+ padding: 35px 15px;
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-nav-inner {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row-reverse;
+ -ms-flex-direction: row-reverse;
+ flex-direction: row-reverse;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-nav {
+ margin-right: 40px;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-nav > li > a {
+ font-size: 15px;
+ padding: 7px 0;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-nav > li.rd-navbar-submenu {
+ margin-right: -24px;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-nav > li > .rd-navbar-submenu-toggle {
+ position: relative;
+ top: 2px;
+ display: inline-block;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-nav > li + li {
+ margin-left: 37px;
+}
+@media (min-width: 1200px) {
+ .bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-nav > li > a {
+ font-size: 16px;
+ }
+ .bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-nav > li + li {
+ margin-left: 48px;
+ }
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search {
+ position: relative;
+ z-index: 1500;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search .form-label {
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search .form-input,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search .form-label {
+ color: #fff;
+ font-size: 30px;
+ font-weight: 700;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search .form-label {
+ top: 24px;
+ left: 0;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search .form-input {
+ padding: 10px 50px 9px 0;
+ background-color: transparent;
+ border: 0;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search .btn {
+ -webkit-flex-shrink: 0;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: -1000;
+ opacity: 0;
+ visibility: hidden;
+ background: rgba(0, 0, 0, 0.96);
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-inner {
+ width: 540px;
+ margin-top: 75px;
+ margin-left: auto;
+ margin-right: auto;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ border-bottom: 1px solid #fff;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-submit {
+ position: relative;
+ left: 0;
+ top: 0;
+ width: 39px;
+ height: 39px;
+ font-size: 25px;
+ line-height: 39px;
+ transform: none;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-submit,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-submit:active,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-submit:focus {
+ color: #fff;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-submit:hover {
+ color: #ababab;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live {
+ position: relative;
+ display: block;
+ top: auto;
+ right: auto;
+ bottom: auto;
+ left: auto;
+ margin-top: 60px;
+ margin-left: auto;
+ margin-right: auto;
+ width: 800px;
+ font-size: 20px;
+ background-color: transparent;
+ opacity: 1;
+ visibility: visible;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live > * {
+ display: block;
+ padding: 0;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .active .search_list li {
+ top: 0;
+ opacity: 1;
+ visibility: visible;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search-quick-result {
+ display: none;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list {
+ margin: 0;
+ background-color: transparent;
+ text-align: left;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li {
+ position: relative;
+ top: 30px;
+ display: inline-block;
+ width: 48%;
+ padding: 0 15px;
+ text-align: left;
+ transition: 0.5s all ease-in-out;
+ opacity: 0;
+ visibility: hidden;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list .search_all {
+ top: 0;
+ margin-top: 40px;
+ display: inline-block;
+ width: 100%;
+ text-align: right;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(0) {
+ transition-delay: 0s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(1) {
+ transition-delay: 0.15s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(2) {
+ transition-delay: 0.3s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(3) {
+ transition-delay: 0.45s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(4) {
+ transition-delay: 0.6s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(5) {
+ transition-delay: 0.75s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(6) {
+ transition-delay: 0.9s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(7) {
+ transition-delay: 1.05s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(8) {
+ transition-delay: 1.2s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(9) {
+ transition-delay: 1.35s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(10) {
+ transition-delay: 1.5s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(0) {
+ transition-delay: 0s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(1) {
+ transition-delay: 0.2s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(2) {
+ transition-delay: 0.4s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(3) {
+ transition-delay: 0.6s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(4) {
+ transition-delay: 0.8s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(5) {
+ transition-delay: 1s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(6) {
+ transition-delay: 1.2s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(7) {
+ transition-delay: 1.4s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(8) {
+ transition-delay: 1.6s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(9) {
+ transition-delay: 1.8s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(10) {
+ transition-delay: 2s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .result-item:only-child {
+ top: 0;
+ width: 100%;
+ text-align: center;
+ transition-delay: 0s;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .result-item:nth-child(n + 3) {
+ margin-top: 50px;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_title {
+ font: 700 30px/26px Helvetica, Arial, sans-serif;
+ font-style: italic;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_title a,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_title a:active,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_title a:focus {
+ color: #fff;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_title a:hover {
+ color: #ababab;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_title + p {
+ margin-top: 16px;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_error {
+ line-height: 1.35;
+ text-align: center;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit {
+ display: inline-block;
+ padding: 10px 35px;
+ border: 2px solid;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit:active,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit.active,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit:active:focus,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit.active:focus,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit:focus:active,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit:focus {
+ color: #fff;
+ background-color: transparent;
+ border-color: #fff;
+}
+.bodywebsite .open > .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit.dropdown-toggle,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit:hover {
+ color: #414141;
+ background-color: #fff;
+ border-color: #fff;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit.disabled,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit[disabled],
+.bodywebsite fieldset[disabled] .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit {
+ pointer-events: none;
+ opacity: .5;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit .badge {
+ color: transparent;
+ background-color: #fff;
+}
+@media (min-width: 1600px) and (min-height: 767px) {
+ .bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search .rd-search-inner {
+ margin-top: 10%;
+ }
+}
+@media (max-height: 767px) {
+ .bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search .rd-search-results-live .result-item:nth-child(5),
+ .bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search .rd-search-results-live .result-item:nth-child(6) {
+ display: none;
+ }
+ .bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search .rd-search-results-live .search_list > li.search_all {
+ transition-delay: 0.8s;
+ }
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search.active .rd-search {
+ display: block;
+ z-index: 10000;
+ margin: 0;
+ opacity: 1;
+ visibility: visible;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search.active .rd-navbar-search-toggle {
+ z-index: 10002;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search.active .rd-navbar-search-toggle:after {
+ color: #fff;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search.active .rd-navbar-search-toggle:hover:after {
+ color: #ababab;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-toggle .rd-navbar-nav > li .rd-navbar-toggle {
+ display: none;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static.rd-navbar--is-clone .rd-navbar-aside-wrap,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-aside-wrap {
+ position: absolute;
+ top: -60px;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static.rd-navbar--is-clone .rd-navbar-group,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-group {
+ padding-top: 17px;
+ padding-bottom: 17px;
+}
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static.rd-navbar--is-clone .rd-navbar-nav > li > .rd-navbar-dropdown,
+.bodywebsite .rd-navbar-corporate-light.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-nav > li > .rd-navbar-dropdown {
+ margin-top: 50px;
+}
+html .bodywebsite.boxed.rd-navbar--has-sidebar body {
+ padding-left: 300px;
+ padding-right: 30px;
+}
+html .bodywebsite.boxed .rd-navbar--is-clone {
+ max-width: 1920px;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+
+.bodywebsite .rd-parallax-inner {
+ position: relative;
+ overflow: hidden;
+ -webkit-transform: translate3d(0px, 0px, 0px);
+ transform: translate3d(0px, 0px, 0px);
+ z-index: 1;
+}
+.bodywebsite .rd-parallax-layer[data-type="media"] {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ height: 100%;
+ pointer-events: none;
+}
+.bodywebsite .rd-parallax-layer[data-type="media"] iframe {
+ width: 100%;
+ height: 100%;
+}
+.bodywebsite .rd-parallax-layer[data-url] {
+ -webkit-background-size: cover;
+ background-size: cover;
+ background-position: center center;
+}
+.bodywebsite .rd-parallax[class*="rd-parallax-overlay"] {
+ background-color: #000;
+ color: #fff;
+}
+.bodywebsite .rd-parallax[class*="rd-parallax-overlay"] .rd-parallax-layer[data-type="media"] {
+ opacity: 0.2;
+}
+.bodywebsite .rd-parallax[class*="rd-parallax-overlay"] .rd-parallax-layer[data-type="media"] + * {
+ position: relative;
+}
+.bodywebsite .rd-parallax.rd-parallax-overlay-2 .rd-parallax-layer[data-type="media"] {
+ opacity: 0.8;
+}
+.bodywebsite .google-map-markers {
+ display: none;
+}
+.bodywebsite .google-map-container {
+ width: 100%;
+}
+.bodywebsite .google-map {
+ height: 250px;
+ color: #333;
+}
+.bodywebsite .google-map img {
+ max-width: none !important;
+}
+@media (min-width: 576px) {
+ .bodywebsite .google-map {
+ height: 250px;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .google-map {
+ height: 400px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .google-map {
+ height: 450px;
+ }
+}
+@media (min-width: 1800px) {
+ .bodywebsite .google-map {
+ height: 532px;
+ }
+}
+.bodywebsite .rd-search {
+ position: relative;
+}
+.bodywebsite .rd-search .form-wrap {
+ display: block;
+ margin: 0;
+ font-size: 0;
+}
+.bodywebsite .rd-search label * {
+ margin-top: 0;
+}
+.bodywebsite .rd-search .rd-search-submit {
+ top: 19px;
+ right: -4px;
+ background-color: transparent;
+ border: none;
+ transform: translateY(-50%);
+}
+.bodywebsite .rd-search .text-mobile {
+ display: block;
+}
+.bodywebsite .rd-search .text-default {
+ display: none;
+}
+@media (min-width: 768px) {
+ .bodywebsite .rd-search .text-mobile {
+ display: none;
+ }
+ .bodywebsite .rd-search .text-default {
+ display: block;
+ }
+}
+.bodywebsite .rd-search-submit {
+ background: none;
+ border: none;
+ padding: 0;
+ outline: none;
+ outline-offset: 0;
+ -webkit-appearance: none;
+ display: inline-block;
+ position: relative;
+ width: 48px;
+ height: 48px;
+ line-height: 48px;
+ cursor: pointer;
+ color: #00030a;
+ text-align: center;
+ font-size: 22px;
+ position: absolute;
+ right: 0;
+ transition: color .33s;
+}
+.bodywebsite .rd-search-submit::-moz-focus-inner {
+ border: none;
+ padding: 0;
+}
+.bodywebsite .rd-search-submit:before {
+ font-family: "Font Awesome 5 Free";
+ font-weight: 600;
+ font-size: initial;
+}
+.bodywebsite .rd-search-submit.active {
+ transform: scale(0.7);
+}
+.bodywebsite .rd-search-submit:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .rd-search-minimal {
+ position: relative;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: stretch;
+ -ms-flex-align: stretch;
+ align-items: stretch;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ padding-left: 40px;
+ border-bottom: 1px solid #dedede;
+}
+.bodywebsite .rd-search-minimal:before {
+ content: '\e8b6';
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+ left: 10px;
+ font: 400 21px 'Material Icons';
+ color: #000;
+}
+.bodywebsite .rd-search-minimal .form-wrap {
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+}
+.bodywebsite .rd-search-minimal .form-label,
+.bodywebsite .rd-search-minimal .form-input {
+ font: 400 16px/24px "Roboto", Helvetica, Arial, sans-serif;
+ color: rgba(0, 0, 0, 0.2);
+ letter-spacing: -0.025em;
+}
+.bodywebsite .rd-search-minimal .form-label {
+ top: 29px;
+}
+.bodywebsite .rd-search-minimal .form-input {
+ padding: 17px 20px;
+}
+.bodywebsite .rd-search-minimal button[type='submit'] {
+ padding: 0 20px;
+ -webkit-flex-shrink: 0;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+}
+@media (min-width: 768px) {
+ .bodywebsite .rd-search-minimal .form-label,
+ .bodywebsite .rd-search-minimal .form-input {
+ font-size: 19px;
+ }
+}
+.bodywebsite .rd-search-classic {
+ overflow: hidden;
+ border: 1px solid #dedede;
+ border-radius: 0;
+}
+.bodywebsite .rd-search-classic .form-input {
+ min-height: 50px;
+ padding: 13px 50px 15px 19px;
+ border: 0;
+}
+.bodywebsite .rd-search-classic .rd-search-submit {
+ position: absolute;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ width: 40px;
+ line-height: 0;
+ height: auto;
+ transform: none;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ text-align: left;
+}
+.bodywebsite .rd-search-classic .rd-search-submit:before {
+ font: 400 25px 'Material Icons';
+}
+.bodywebsite .search_error {
+ max-width: 100%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.bodywebsite .rd-search-results-live {
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 100%;
+ z-index: 998;
+ margin: -3px 0 0;
+ font-size: 14px;
+ line-height: 34px;
+ text-align: left;
+ color: #9f9f9f;
+ opacity: 0;
+ visibility: hidden;
+}
+.bodywebsite .rd-search-results-live > * {
+ padding: 16px;
+ border: 0px solid #dedede;
+ border-top: 0;
+}
+.bodywebsite .rd-search-results-live .search-quick-result {
+ font: 700 14px/24px "Roboto", Helvetica, Arial, sans-serif;
+ color: #000;
+ letter-spacing: .06em;
+ text-transform: uppercase;
+}
+.bodywebsite .rd-search-results-live .search_list {
+ margin-top: 10px;
+ font-size: 16px;
+ line-height: 30px;
+}
+.bodywebsite .rd-search-results-live .search_list li + li {
+ margin-top: 20px;
+}
+.bodywebsite .rd-search-results-live .search_list .search_error {
+ padding-bottom: 10px;
+ font-size: 14px;
+ line-height: 1.1;
+}
+.bodywebsite .rd-search-results-live .search_link,
+.bodywebsite .rd-search-results-live .search_link:active,
+.bodywebsite .rd-search-results-live .search_link:focus {
+ color: #464a4d;
+}
+.bodywebsite .rd-search-results-live .search_link:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .rd-search-results-live p {
+ margin-top: 0;
+ font-size: 14px;
+ line-height: 1.6;
+}
+.bodywebsite .rd-search-results-live .search_title {
+ margin-bottom: 0;
+ font-family: "Roboto", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ font-weight: 700;
+ color: #000;
+}
+.bodywebsite .rd-search-results-live .search_submit {
+ display: block;
+ padding: 6px 20px;
+ font-size: 14px;
+ font-weight: 700;
+ text-align: center;
+ color: #fff;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ border-radius: 5px;
+ border: 0;
+ text-transform: uppercase;
+ transition: 0.3s ease-out;
+}
+.bodywebsite .rd-search-results-live .search_submit:hover {
+ color: #fff;
+ background: #3a3c3e;
+}
+.bodywebsite .rd-search-results-live .match {
+ display: none;
+}
+@media (min-width: 1200px) {
+ .bodywebsite .rd-search-results-live .search_link p {
+ display: block;
+ }
+}
+.bodywebsite .rd-navbar-fixed-linked .rd-search-results-live {
+ display: none;
+}
+.bodywebsite .rd-search-results-live.active.cleared {
+ opacity: 0;
+ visibility: hidden;
+ transition-delay: .08s;
+}
+.bodywebsite .active .rd-search-results-live {
+ display: block;
+ opacity: 1;
+ visibility: visible;
+}
+.bodywebsite .rd-search-results .search_list {
+ text-align: left;
+ padding-left: 0;
+ font-size: 14px;
+ list-style-type: none;
+ counter-reset: result;
+}
+.bodywebsite .rd-search-results .result-item {
+ position: relative;
+ padding-left: 40px;
+ color: #9f9f9f;
+}
+.bodywebsite .rd-search-results .result-item:before {
+ position: absolute;
+ top: -1px;
+ left: 0;
+ content: counter(result, decimal-leading-zero) ".";
+ counter-increment: result;
+ font: 500 19px "Roboto", Helvetica, Arial, sans-serif;
+ line-height: 1;
+ color: #cdcdcd;
+}
+.bodywebsite .rd-search-results .result-item:only-child:before {
+ display: none;
+}
+.bodywebsite .rd-search-results .search {
+ color: #fff;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .rd-search-results .search_error .search {
+ color: #9f9f9f;
+ background-color: transparent;
+}
+.bodywebsite .rd-search-results .match em {
+ font: 700 12px/16px "Roboto", Helvetica, Arial, sans-serif;
+ font-style: normal;
+ text-transform: uppercase;
+ color: #000;
+}
+.bodywebsite .rd-search-results * + p {
+ margin-top: 10px;
+}
+.bodywebsite .rd-search-results * + .match {
+ margin-top: 5px;
+}
+.bodywebsite .rd-search-results * + .result-item {
+ margin-top: 35px;
+}
+@media (min-width: 576px) {
+ .bodywebsite .rd-search-results .result-item {
+ padding-left: 60px;
+ }
+ .bodywebsite .rd-search-results .result-item:before {
+ left: 15px;
+ font-size: 19px;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .rd-search-results .result-item:before {
+ top: 0;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .rd-search-results .result-item {
+ padding-left: 85px;
+ }
+ .bodywebsite .rd-search-results .result-item:before {
+ top: 0;
+ left: 40px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .rd-search-results .result-item {
+ padding-left: 100px;
+ }
+ .bodywebsite .rd-search-results .result-item:before {
+ left: 44px;
+ }
+}
+.bodywebsite .twitter-item-minimal .tweet-user {
+ font-size: 16px;
+ font-weight: 700;
+}
+.bodywebsite .twitter-item-minimal .tweet-user a,
+.bodywebsite .twitter-item-minimal .tweet-user a:active,
+.bodywebsite .twitter-item-minimal .tweet-user a:focus {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .twitter-item-minimal .tweet-user a:hover {
+ color: #000;
+}
+.bodywebsite .twitter-item-minimal .tweet-user a:before {
+ content: '-';
+}
+.bodywebsite .twitter-item-minimal .tweet-text a,
+.bodywebsite .twitter-item-minimal .tweet-text a:active,
+.bodywebsite .twitter-item-minimal .tweet-text a:focus {
+ color: #000;
+}
+.bodywebsite .twitter-item-minimal .tweet-text a:hover {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .twitter-item-minimal * + .tweet-text {
+ margin-top: 0;
+}
+.bodywebsite .twitter-item-minimal * + .tweet-user {
+ margin-top: 10px;
+}
+.bodywebsite .twitter-item-minimal + .twitter-item-minimal {
+ margin-top: 25px;
+}
+.bodywebsite .twitter-widget {
+ overflow: hidden;
+ background: #fff;
+ border-radius: 6px;
+ box-shadow: -1px 0px 10px 0px rgba(65, 65, 65, 0.12);
+}
+.bodywebsite .twitter-widget > a {
+ display: block;
+ color: #9f9f9f;
+}
+.bodywebsite .twitter-widget .tweet-text a,
+.bodywebsite .twitter-widget .tweet-text a:active,
+.bodywebsite .twitter-widget .tweet-text a:focus {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .twitter-widget .tweet-text a:hover {
+ color: #000;
+}
+.bodywebsite .twitter-widget .twitter-widget-time {
+ color: #9f9f9f;
+}
+.bodywebsite .twitter-widget .twitter-widget-meta > * {
+ line-height: 1.1;
+}
+.bodywebsite .twitter-widget .twitter-widget-meta > * + * {
+ margin-top: 5px;
+}
+.bodywebsite .twitter-widget .twitter-widget-media {
+ position: relative;
+ z-index: 1;
+ overflow: hidden;
+}
+.bodywebsite .twitter-widget .twitter-widget-media > img {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ min-height: 101%;
+}
+.bodywebsite .twitter-widget .twitter-widget-media:empty {
+ display: none;
+}
+.bodywebsite .twitter-widget .twitter-widget-media:not(:empty) {
+ padding-bottom: 42.5170068%;
+}
+.bodywebsite .twitter-widget .tweet-avatar {
+ display: block;
+ width: 48px;
+ height: 48px;
+ background: #dedede;
+}
+.bodywebsite .twitter-widget .twitter-widget-header {
+ padding: 30px 30px 0 30px;
+}
+.bodywebsite .twitter-widget .twitter-widget-inset {
+ padding: 25px 30px 15px;
+}
+.bodywebsite .twitter-widget .twitter-widget-footer {
+ padding: 15px 30px;
+}
+.bodywebsite * + .twitter-widget {
+ margin-top: 30px;
+}
+.bodywebsite .swiper-container {
+ margin: 0 auto;
+ position: relative;
+ overflow: hidden;
+ /* Fix of Webkit flickering */
+ z-index: 1;
+ height: auto;
+}
+.bodywebsite .swiper-container .swiper-wrapper {
+ height: auto;
+ min-height: 36.25vw;
+}
+@media (min-width: 1800px) {
+ .bodywebsite .swiper-container .swiper-wrapper {
+ height: auto;
+ min-height: 680px;
+ }
+}
+.bodywebsite .swiper-container-no-flexbox .swiper-slide {
+ float: left;
+}
+.bodywebsite .swiper-container-vertical > .swiper-wrapper {
+ -webkit-box-orient: vertical;
+ -moz-box-orient: vertical;
+ -ms-flex-direction: column;
+ -webkit-flex-direction: column;
+ flex-direction: column;
+}
+.bodywebsite .swiper-wrapper {
+ position: relative;
+ width: 100%;
+ z-index: 1;
+ display: -webkit-box;
+ display: -moz-box;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-transition-property: -webkit-transform;
+ -moz-transition-property: -moz-transform;
+ -o-transition-property: -o-transform;
+ -ms-transition-property: -ms-transform;
+ transition-property: transform;
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ -webkit-align-self: stretch;
+ -ms-flex-item-align: stretch;
+ align-self: stretch;
+ -webkit-align-items: stretch;
+ -ms-flex-align: stretch;
+ align-items: stretch;
+}
+.bodywebsite .swiper-container-android .swiper-slide,
+.bodywebsite .swiper-wrapper {
+ -webkit-transform: translate3d(0px, 0, 0);
+ -moz-transform: translate3d(0px, 0, 0);
+ -o-transform: translate(0px, 0px);
+ -ms-transform: translate3d(0px, 0, 0);
+ transform: translate3d(0px, 0, 0);
+}
+.bodywebsite .swiper-container-multirow > .swiper-wrapper {
+ -webkit-box-lines: multiple;
+ -moz-box-lines: multiple;
+ -ms-flex-wrap: wrap;
+ -webkit-flex-wrap: wrap;
+ flex-wrap: wrap;
+}
+.bodywebsite .swiper-container-free-mode > .swiper-wrapper {
+ -webkit-transition-timing-function: ease-out;
+ -moz-transition-timing-function: ease-out;
+ -ms-transition-timing-function: ease-out;
+ -o-transition-timing-function: ease-out;
+ transition-timing-function: ease-out;
+ margin: 0 auto;
+}
+.bodywebsite .swiper-slide {
+ position: relative;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-flex-shrink: 0;
+ -ms-flex: 0 0 auto;
+ flex-shrink: 0;
+ width: 100%;
+ min-height: inherit;
+}
+.bodywebsite .swiper-container .swiper-notification {
+ position: absolute;
+ left: 0;
+ top: 0;
+ pointer-events: none;
+ opacity: 0;
+ z-index: -1000;
+}
+.bodywebsite .swiper-wp8-horizontal {
+ -ms-touch-action: pan-y;
+ touch-action: pan-y;
+}
+.bodywebsite .swiper-wp8-vertical {
+ -ms-touch-action: pan-x;
+ touch-action: pan-x;
+}
+.bodywebsite .swiper-nav {
+ position: absolute;
+ top: 50%;
+ right: 0;
+ left: 0;
+ z-index: 10;
+ pointer-events: none;
+ transform: translateY(-50%);
+}
+.bodywebsite .swiper-button-prev,
+.bodywebsite .swiper-button-next {
+ z-index: 10;
+ width: 48px;
+ height: 48px;
+ background-size: 48px 48px;
+ color: #fff;
+ transition: 180ms ease-in-out;
+ text-align: center;
+ cursor: pointer;
+ pointer-events: auto;
+}
+.bodywebsite .swiper-button-prev:hover,
+.bodywebsite .swiper-button-next:hover {
+ opacity: .7;
+}
+.bodywebsite .swiper-button-prev.swiper-button-disabled,
+.bodywebsite .swiper-button-next.swiper-button-disabled {
+ opacity: 0;
+ cursor: auto;
+ pointer-events: none;
+}
+.bodywebsite .swiper-button-next {
+ transform: rotate(180deg);
+}
+.bodywebsite .swiper-pagination-wrap {
+ position: absolute;
+ bottom: 20px;
+ left: 50%;
+ width: 100%;
+ transform: translate3d(-50%, 0, 0);
+ z-index: 10;
+}
+@media (min-width: 992px) {
+ .bodywebsite .swiper-pagination-wrap {
+ bottom: 35px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .swiper-pagination-wrap {
+ bottom: 55px;
+ }
+}
+.bodywebsite .swiper-pagination {
+ display: block;
+ width: 100%;
+ text-align: center;
+ transition: 300ms;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ z-index: 10;
+}
+@media (min-width: 768px) {
+ .bodywebsite .swiper-pagination {
+ text-align: left;
+ }
+}
+.bodywebsite .swiper-pagination.swiper-pagination-hidden {
+ opacity: 0;
+}
+.bodywebsite .swiper-pagination-bullet {
+ display: inline-block;
+ width: 6px;
+ height: 6px;
+ border-radius: 20px;
+ background: #cdcdcd;
+ pointer-events: none;
+ transition: all 0.2s ease-out;
+}
+.bodywebsite .swiper-pagination-bullet + * {
+ margin-left: 10px;
+}
+@media (min-width: 768px) {
+ .bodywebsite .swiper-pagination-bullet {
+ width: 12px;
+ height: 12px;
+ pointer-events: auto;
+ }
+ .bodywebsite .swiper-pagination-bullet + * {
+ margin-left: 20px;
+ }
+}
+.bodywebsite .swiper-pagination-clickable .swiper-pagination-bullet {
+ cursor: pointer;
+}
+.bodywebsite .swiper-pagination-white .swiper-pagination-bullet {
+ background: #fff;
+}
+.bodywebsite .swiper-pagination-bullet:hover,
+.bodywebsite .swiper-pagination-bullet-active {
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .swiper-pagination-white .swiper-pagination-bullet-active {
+ background: #fff;
+}
+.bodywebsite .swiper-pagination-black .swiper-pagination-bullet-active {
+ background: #000;
+}
+.bodywebsite .swiper-container-vertical > .swiper-pagination {
+ right: 10px;
+ top: 50%;
+ -webkit-transform: translate3d(0px, -50%, 0);
+ -moz-transform: translate3d(0px, -50%, 0);
+ -o-transform: translate(0px, -50%);
+ -ms-transform: translate3d(0px, -50%, 0);
+ transform: translate3d(0px, -50%, 0);
+}
+.bodywebsite .swiper-container-vertical > .swiper-pagination .swiper-pagination-bullet {
+ margin: 5px 0;
+ display: block;
+}
+.bodywebsite .swiper-container-horizontal > .swiper-pagination {
+ bottom: 20px;
+ left: 0;
+ width: 100%;
+}
+.bodywebsite .swiper-container-horizontal > .swiper-pagination .swiper-pagination-bullet {
+ margin: 0 5px;
+}
+
+.bodywebsite .swiper-container-coverflow .swiper-wrapper {
+ /* Windows 8 IE 10 fix */
+ -ms-perspective: 1200px;
+}
+.bodywebsite .swiper-container-fade.swiper-container-free-mode .swiper-slide {
+ -webkit-transition-timing-function: ease-out;
+ transition-timing-function: ease-out;
+}
+.bodywebsite .swiper-container-fade .swiper-slide {
+ pointer-events: none;
+}
+.bodywebsite .swiper-container-fade .swiper-slide .swiper-slide {
+ pointer-events: none;
+}
+.bodywebsite .swiper-container-fade .swiper-slide-active,
+.bodywebsite .swiper-container-fade .swiper-slide-active .swiper-slide-active {
+ pointer-events: auto;
+}
+.bodywebsite .swiper-container-cube {
+ overflow: visible;
+}
+.bodywebsite .swiper-container-cube .swiper-slide {
+ pointer-events: none;
+ visibility: hidden;
+ -webkit-transform-origin: 0 0;
+ -moz-transform-origin: 0 0;
+ -ms-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-backface-visibility: hidden;
+ -moz-backface-visibility: hidden;
+ -ms-backface-visibility: hidden;
+ backface-visibility: hidden;
+ width: 100%;
+ height: 100%;
+ z-index: 1;
+}
+.bodywebsite .swiper-container-cube.swiper-container-rtl .swiper-slide {
+ -webkit-transform-origin: 100% 0;
+ -moz-transform-origin: 100% 0;
+ -ms-transform-origin: 100% 0;
+ transform-origin: 100% 0;
+}
+.bodywebsite .swiper-container-cube .swiper-slide-active,
+.bodywebsite .swiper-container-cube .swiper-slide-next,
+.bodywebsite .swiper-container-cube .swiper-slide-prev,
+.bodywebsite .swiper-container-cube .swiper-slide-next + .swiper-slide {
+ pointer-events: auto;
+ visibility: visible;
+}
+.bodywebsite .swiper-container-cube .swiper-slide-shadow-top,
+.bodywebsite .swiper-container-cube .swiper-slide-shadow-bottom,
+.bodywebsite .swiper-container-cube .swiper-slide-shadow-left,
+.bodywebsite .swiper-container-cube .swiper-slide-shadow-right {
+ z-index: 0;
+ -webkit-backface-visibility: hidden;
+ -moz-backface-visibility: hidden;
+ -ms-backface-visibility: hidden;
+ backface-visibility: hidden;
+}
+.bodywebsite .swiper-container-cube .swiper-cube-shadow {
+ position: absolute;
+ left: 0;
+ bottom: 0px;
+ width: 100%;
+ height: 100%;
+ background: #000;
+ opacity: 0.6;
+ -webkit-filter: blur(50px);
+ filter: blur(50px);
+ z-index: 0;
+}
+.bodywebsite .swiper-scrollbar {
+ position: relative;
+ -ms-touch-action: none;
+}
+.bodywebsite .swiper-container-horizontal > .swiper-scrollbar {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 50;
+ height: 5px;
+ width: 100%;
+}
+.bodywebsite .swiper-container-vertical > .swiper-scrollbar {
+ position: absolute;
+ right: 3px;
+ top: 1%;
+ z-index: 50;
+ width: 5px;
+ height: 98%;
+}
+.bodywebsite .swiper-scrollbar-drag {
+ height: 100%;
+ width: 100%;
+ position: relative;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+ left: 0;
+ top: 0;
+}
+.bodywebsite .swiper-scrollbar-cursor-drag {
+ cursor: move;
+}
+.bodywebsite .swiper-lazy-preloader {
+ width: 42px;
+ height: 42px;
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ margin-left: -21px;
+ margin-top: -21px;
+ z-index: 10;
+ -webkit-transform-origin: 50%;
+ -moz-transform-origin: 50%;
+ transform-origin: 50%;
+ -webkit-animation: swiper-preloader-spin 1s steps(12, end) infinite;
+ -moz-animation: swiper-preloader-spin 1s steps(12, end) infinite;
+ animation: swiper-preloader-spin 1s steps(12, end) infinite;
+}
+.bodywebsite .swiper-lazy-preloader:after {
+ display: block;
+ content: "";
+ width: 100%;
+ height: 100%;
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
+ background-position: 50%;
+ -webkit-background-size: 100%;
+ background-size: 100%;
+ background-repeat: no-repeat;
+}
+.bodywebsite .swiper-lazy-preloader-white:after {
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
+}
+@-webkit-keyframes swiper-preloader-spin {
+ 100% {
+ -webkit-transform: rotate(360deg);
+ }
+}
+@keyframes swiper-preloader-spin {
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+.bodywebsite .swiper-slide > .vide__body,
+.bodywebsite .swiper-slide > .parallax_cnt {
+ height: 100%;
+}
+.bodywebsite .swiper-slide {
+ position: relative;
+ text-align: center;
+ white-space: nowrap;
+ background-position: center center;
+ overflow: hidden;
+}
+.bodywebsite .swiper-slide:not(.vide):not(.rd-parallax):before,
+.bodywebsite .swiper-slide .parallax_cnt:before,
+.bodywebsite .swiper-slide .vide__body:before {
+ content: '';
+ display: inline-block;
+ height: 50%;
+}
+.bodywebsite .swiper-slide-caption {
+ display: inline-block;
+ width: 100%;
+ max-height: 100%;
+ margin-left: -0.25em;
+ vertical-align: middle;
+ white-space: normal;
+ z-index: 1;
+}
+.bodywebsite .swiper-variant-1,
+.bodywebsite .swiper-variant-1 .swiper-wrapper {
+ height: auto;
+ min-height: calc(44vh);
+}
+.bodywebsite .swiper-variant-1 .swiper-slide-caption {
+ padding: 40px 0 40px;
+}
+.bodywebsite .swiper-variant-1 .swiper-button-prev,
+.bodywebsite .swiper-variant-1 .swiper-button-next {
+ display: none;
+}
+.bodywebsite .swiper-variant-1 .slider-text {
+ display: none;
+}
+.bodywebsite .swiper-variant-1 .jumbotron-custom + * {
+ margin-top: 5px;
+}
+.bodywebsite .swiper-variant-1 * + .button-block {
+ margin-top: 27px;
+}
+@media (min-width: 768px) {
+ .bodywebsite .swiper-variant-1,
+ .bodywebsite .swiper-variant-1 .swiper-wrapper {
+ height: auto;
+ min-height: 36.25vw;
+ }
+ .bodywebsite .swiper-variant-1 .swiper-slide-caption {
+ padding: 60px 0 115px;
+ }
+ .bodywebsite .swiper-variant-1 .slider-header {
+ font-size: 50px;
+ }
+ .bodywebsite .swiper-variant-1 .slider-text {
+ display: block;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .swiper-variant-1 .swiper-slide-caption {
+ padding: 100px 0 155px;
+ }
+ .bodywebsite .swiper-variant-1 .swiper-button-prev,
+ .bodywebsite .swiper-variant-1 .swiper-button-next {
+ position: absolute;
+ top: 50%;
+ transform: translateY(-59%);
+ z-index: 10;
+ display: block;
+ transition: .3s all ease;
+ }
+ .bodywebsite .swiper-variant-1 .swiper-button-prev {
+ left: 5.1%;
+ transform: scale(-1, 1);
+ }
+ .bodywebsite .swiper-variant-1 .swiper-button-next {
+ right: 5.1%;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .swiper-variant-1 .slider-header {
+ font-size: 59px;
+ }
+ .bodywebsite .swiper-variant-1 .swiper-button-prev {
+ left: 20px;
+ }
+ .bodywebsite .swiper-variant-1 .swiper-button-next {
+ right: 20px;
+ }
+}
+@media (min-width: 1599px) {
+ .bodywebsite .swiper-variant-1 .swiper-button-prev {
+ left: calc(50vw - 1170px / 2 - 170px + (1170px / 12) * 0);
+ }
+ .bodywebsite .swiper-variant-1 .swiper-button-next {
+ right: calc(50vw - 1170px / 2 - 170px + (1170px / 12) * 0);
+ }
+}
+@media (min-width: 1800px) {
+ .bodywebsite .swiper-variant-1,
+ .bodywebsite .swiper-variant-1 .swiper-wrapper {
+ height: auto;
+ min-height: 680px;
+ }
+}
+.bodywebsite .ui-to-top {
+ width: 40px;
+ height: 40px;
+ font-size: 18px;
+ line-height: 38px;
+ border-radius: 50%;
+ position: fixed;
+ right: 15px;
+ bottom: 15px;
+ overflow: hidden;
+ text-align: center;
+ text-decoration: none;
+ z-index: 20;
+ transition: .3s all ease;
+ box-shadow: 0 0 1px 0px rgba(55, 195, 134, 0.3);
+ transform: translateY(100px);
+}
+.bodywebsite .ui-to-top,
+.bodywebsite .ui-to-top:active,
+.bodywebsite .ui-to-top:focus {
+ color: #fff;
+ background: maincolor) ? 'rgb(150, 150, 150)' : '#'.$website->maincolor; ?>;
+ opacity: 0.6;
+}
+.bodywebsite .ui-to-top:hover {
+ color: #fff;
+ background: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?>;
+ box-shadow: 0 0 1px 0px rgba(0, 0, 0, 0.4);
+}
+.bodywebsite .ui-to-top:focus {
+ outline: 0;
+}
+.bodywebsite .ui-to-top.active {
+ transform: translateY(0);
+}
+.bodywebsite .mobile .ui-to-top,
+.bodywebsite .tablet .ui-to-top {
+ display: none !important;
+}
+@media (min-width: 576px) {
+ .bodywebsite .ui-to-top {
+ right: 40px;
+ bottom: 40px;
+ }
+}
+.bodywebsite .progress-bar-wrap {
+ max-width: 100%;
+ width: 210px;
+}
+@media (min-width: 576px) and (max-width: 767px) {
+ .bodywebsite .progress-bar-wrap {
+ max-width: 120px;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .progress-bar-wrap {
+ max-width: 150px;
+ }
+}
+.bodywebsite .progress-bar {
+ position: relative;
+ width: 100%;
+ margin: 0;
+ font-family: "Roboto", Helvetica, Arial, sans-serif;
+}
+.bodywebsite .progress-bar .progress-bar__body {
+ position: absolute;
+ right: 50%;
+ width: 100%;
+ top: 50%;
+ padding: 0;
+ margin: 0;
+ white-space: nowrap;
+ font-size: 34px;
+ font-weight: 400;
+ line-height: 26px;
+ color: #00030a;
+ text-align: right;
+}
+.bodywebsite .progress-bar .progress-bar__body:after {
+ content: '%';
+}
+.bodywebsite .progress-bar .progress-bar__stroke,
+.bodywebsite .progress-bar .progress-bar__trail {
+ stroke-linejoin: round;
+}
+.bodywebsite .progress-bar-horizontal {
+ position: relative;
+ font-family: "Roboto", Helvetica, Arial, sans-serif;
+ text-align: right;
+}
+.bodywebsite .progress-bar-horizontal > svg {
+ margin-top: 3px;
+ border-radius: 3px;
+}
+.bodywebsite .progress-bar-horizontal .progress-bar__body {
+ position: absolute;
+ top: -27px;
+ margin-top: 0;
+ padding-right: 0;
+}
+.bodywebsite .progress-bar-horizontal .progress-bar__body:after {
+ content: '%';
+}
+.bodywebsite .progress-bar-radial {
+ position: relative;
+ padding-bottom: 100%;
+}
+.bodywebsite .progress-bar-radial > svg {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ left: 0;
+ top: 0;
+ border-radius: 5px;
+ overflow: hidden;
+}
+.bodywebsite .progress-bar-radial .progress-bar__stroke,
+.bodywebsite .progress-bar-radial .progress-bar__trail {
+ stroke-location: outside;
+}
+.bodywebsite .progress-bar-radial .progress-bar__body {
+ transform: translate(50%, -50%);
+}
+.bodywebsite .progress-bar-default .progress-bar__stroke {
+ stroke: #9f9f9f;
+}
+.bodywebsite .progress-bar-default .progress-bar__trail {
+ stroke: rgba(159, 159, 159, 0.05);
+}
+.bodywebsite .progress-bar-primary .progress-bar__stroke {
+ stroke: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .progress-bar-primary .progress-bar__trail {
+ stroke: #F8F9FB;
+}
+.bodywebsite .progress-bar-bermuda-gray .progress-bar__stroke {
+ stroke: #6f8fad;
+}
+.bodywebsite .progress-bar-bermuda-gray .progress-bar__trail {
+ stroke: #F8F9FB;
+}
+.bodywebsite .progress-bar-contessa .progress-bar__stroke {
+ stroke: #e76752;
+}
+.bodywebsite .progress-bar-contessa .progress-bar__trail {
+ stroke: #F8F9FB;
+}
+.bodywebsite .progress-bar-red-orange-1 .progress-bar__stroke {
+ stroke: #f8333c;
+}
+.bodywebsite .progress-bar-red-orange-1 .progress-bar__trail {
+ stroke: #ededed;
+}
+.bodywebsite .progress-bar-dodger-blue .progress-bar__stroke {
+ stroke: #45a4ff;
+}
+.bodywebsite .progress-bar-dodger-blue .progress-bar__trail {
+ stroke: #ededed;
+}
+.bodywebsite .progress-bar-gorse .progress-bar__stroke {
+ stroke: #fde74c;
+}
+.bodywebsite .progress-bar-gorse .progress-bar__trail {
+ stroke: #ededed;
+}
+.bodywebsite .progress-bar-old-gold .progress-bar__stroke {
+ stroke: #ecd746;
+}
+.bodywebsite .progress-bar-old-gold .progress-bar__trail {
+ stroke: #F8F9FB;
+}
+.bodywebsite .progress-bar-secondary-2 .progress-bar__stroke {
+ stroke: #dedede;
+}
+.bodywebsite .progress-bar-secondary-2 .progress-bar__trail {
+ stroke: gray;
+}
+.bodywebsite .progress-bar-secondary-1 .progress-bar__stroke {
+ stroke: #dedede;
+}
+.bodywebsite .progress-bar-secondary-1 .progress-bar__trail {
+ stroke: rgba(159, 159, 159, 0.05);
+}
+.bodywebsite .progress-bar-secondary-3 .progress-bar__stroke {
+ stroke: #c49558;
+}
+.bodywebsite .progress-bar-secondary-3 .progress-bar__trail {
+ stroke: rgba(159, 159, 159, 0.05);
+}
+.bodywebsite .progress-bar-secondary-4 .progress-bar__stroke {
+ stroke: #fe4a21;
+}
+.bodywebsite .progress-bar-secondary-4 .progress-bar__trail {
+ stroke: rgba(159, 159, 159, 0.05);
+}
+.bodywebsite .countdown-wrap {
+ max-width: 720px;
+ max-height: 134px;
+}
+.bodywebsite .countdown-wrap .time_circles > div {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: column-reverse;
+ -ms-flex-direction: column-reverse;
+ flex-direction: column-reverse;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ font-size: 0;
+ line-height: 0;
+}
+.bodywebsite .countdown-wrap div > h4 {
+ position: relative;
+ margin-top: -2px;
+ font: 500 12px "Roboto", Helvetica, Arial, sans-serif !important;
+ color: rgba(0, 0, 0, 0.2);
+ letter-spacing: -0.025em;
+ bottom: auto !important;
+ text-transform: uppercase;
+}
+@media (min-width: 576px) {
+ .bodywebsite .countdown-wrap div > h4 {
+ font-size: 14px !important;
+ }
+}
+.bodywebsite .countdown-wrap span {
+ font: 900 18px "Roboto", Helvetica, Arial, sans-serif !important;
+ font-style: normal;
+ color: #000;
+}
+@media (min-width: 576px) {
+ .bodywebsite .countdown-wrap span {
+ font-size: 40px !important;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .countdown-wrap span {
+ font-size: 45px !important;
+ line-height: 1;
+ }
+}
+.bodywebsite .slick-slider {
+ position: relative;
+ display: block;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -ms-touch-action: pan-y;
+ touch-action: pan-y;
+ -webkit-tap-highlight-color: transparent;
+}
+.bodywebsite .slick-list {
+ position: relative;
+ overflow: hidden;
+ display: block;
+ margin: 0;
+ padding: 0;
+}
+.bodywebsite .slick-list:focus {
+ outline: none;
+}
+.bodywebsite .slick-list.dragging {
+ cursor: pointer;
+ cursor: hand;
+}
+.bodywebsite .slick-slider .slick-track,
+.bodywebsite .slick-slider .slick-list {
+ -webkit-transform: translate3d(0, 0, 0);
+ -moz-transform: translate3d(0, 0, 0);
+ -ms-transform: translate3d(0, 0, 0);
+ -o-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+}
+.bodywebsite .slick-track {
+ position: relative;
+ left: 0;
+ top: 0;
+ display: block;
+}
+.bodywebsite .slick-track:before,
+.bodywebsite .slick-track:after {
+ content: "";
+ display: table;
+}
+.bodywebsite .slick-track:after {
+ clear: both;
+}
+.bodywebsite .slick-loading .slick-track {
+ visibility: hidden;
+}
+.bodywebsite .slick-slide {
+ float: left;
+ min-height: 1px;
+ display: none;
+}
+.bodywebsite [dir="rtl"] .slick-slide {
+ float: right;
+}
+.bodywebsite .slick-slide img {
+ display: block;
+}
+.bodywebsite .slick-slide.slick-loading img {
+ display: none;
+}
+.bodywebsite .slick-slide.dragging img {
+ pointer-events: none;
+}
+.bodywebsite .slick-initialized .slick-slide {
+ display: block;
+}
+.bodywebsite .slick-loading .slick-slide {
+ visibility: hidden;
+}
+.bodywebsite .slick-vertical .slick-slide {
+ display: block;
+ height: auto;
+ border: 1px solid transparent;
+}
+.bodywebsite .slick-arrow.slick-hidden {
+ display: none;
+}
+.bodywebsite .slick-loading .slick-list {
+ background: #fff url("medias/image/ref; ?>/ajax-loading.gif") center center no-repeat;
+}
+.bodywebsite .slick-prev,
+.bodywebsite .slick-next {
+ position: absolute;
+ display: block;
+ height: 20px;
+ width: 20px;
+ line-height: 0;
+ font-size: 0;
+ cursor: pointer;
+ background: rgba(0, 0, 0, 0.6);
+ color: transparent;
+ top: 50%;
+ -webkit-transform: translate(0, -50%);
+ -ms-transform: translate(0, -50%);
+ transform: translate(0, -50%);
+ padding: 0;
+ border: none;
+ outline: none;
+ z-index: 999;
+}
+.bodywebsite .slick-prev:hover,
+.bodywebsite .slick-prev:focus,
+.bodywebsite .slick-next:hover,
+.bodywebsite .slick-next:focus {
+ outline: none;
+ background: transparent;
+ color: transparent;
+}
+.bodywebsite .slick-prev:hover:before,
+.bodywebsite .slick-prev:focus:before,
+.bodywebsite .slick-next:hover:before,
+.bodywebsite .slick-next:focus:before {
+ opacity: 1;
+}
+.bodywebsite .slick-prev.slick-disabled:before,
+.bodywebsite .slick-next.slick-disabled:before {
+ opacity: 0.25;
+}
+.bodywebsite .slick-prev:before,
+.bodywebsite .slick-next:before {
+ font-family: "Roboto", Helvetica, Arial, sans-serif;
+ font-size: 20px;
+ line-height: 1;
+ color: white;
+ opacity: 0.75;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.bodywebsite .slick-prev {
+ left: 0;
+}
+.bodywebsite [dir="rtl"] .slick-prev {
+ left: auto;
+ right: 0;
+}
+.bodywebsite .slick-prev:before {
+ content: "←";
+}
+.bodywebsite [dir="rtl"] .slick-prev:before {
+ content: "→";
+}
+.bodywebsite .slick-next {
+ right: 0;
+}
+.bodywebsite [dir="rtl"] .slick-next {
+ left: 0;
+ right: auto;
+}
+.bodywebsite .slick-next:before {
+ content: "→";
+}
+.bodywebsite [dir="rtl"] .slick-next:before {
+ content: "←";
+}
+.bodywebsite .slick-slider {
+ margin-top: 30px;
+}
+.bodywebsite .slick-slider *:focus {
+ outline: 0;
+}
+.bodywebsite .slick-dots {
+ display: block;
+ margin-top: 20px;
+ list-style: none;
+ width: 100%;
+ padding: 0;
+ text-align: center;
+ font-size: 0;
+ line-height: 0;
+ word-spacing: 0;
+}
+.bodywebsite .slick-dots li {
+ position: relative;
+ display: inline-block;
+ height: 20px;
+ width: 20px;
+ margin: 0 5px;
+ padding: 0;
+ cursor: pointer;
+}
+.bodywebsite .slick-dots li button {
+ background: none;
+ border: none;
+ display: inline-block;
+ padding: 0;
+ outline: none;
+ outline-offset: 0;
+ cursor: pointer;
+ -webkit-appearance: none;
+ width: 8px;
+ height: 8px;
+ border-radius: 100px;
+ background: #ababab;
+}
+.bodywebsite .slick-dots li button::-moz-focus-inner {
+ border: none;
+ padding: 0;
+}
+.bodywebsite .slick-dots li.slick-active button,
+.bodywebsite .slick-dots li:hover button {
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .slick-dots-variant-1 .slick-dots li button {
+ height: 12px;
+ width: 12px;
+ background: rgba(58, 60, 62, 0.5);
+ transition: .33s all ease;
+ position: relative;
+}
+.bodywebsite .slick-dots-variant-1 .slick-dots li button:after {
+ content: '';
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 19px;
+ height: 19px;
+ border: 4px solid #fff;
+ opacity: 0;
+ border-radius: 50%;
+ -webkit-transform: translate(-50%, -50%) scale(0);
+ transform: translate(-50%, -50%) scale(0);
+ transition: 180ms ease-in-out;
+}
+.bodywebsite .slick-dots-variant-1 .slick-dots li.slick-active button,
+.bodywebsite .slick-dots-variant-1 .slick-dots li:hover button {
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .slick-dots-variant-1 .slick-dots li.slick-active button:after,
+.bodywebsite .slick-dots-variant-1 .slick-dots li:hover button:after {
+ opacity: 1;
+ -webkit-transform: translate(-50%, -50%) scale(1);
+ transform: translate(-50%, -50%) scale(1);
+}
+.bodywebsite .slick-carousel-complex-variant-1 {
+ position: relative;
+ padding-bottom: 60px;
+}
+.bodywebsite .slick-carousel-complex-variant-1:after {
+ content: '';
+ position: absolute;
+ top: 80px;
+ left: 50%;
+ bottom: 0;
+ transform: translateX(-50%);
+ width: 101vw;
+ background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .slick-carousel-complex-variant-1 > * {
+ position: relative;
+ z-index: 2;
+}
+.bodywebsite .slick-carousel-complex-variant-1 .slick-slider {
+ margin-bottom: 0;
+}
+.bodywebsite .slick-carousel-complex-variant-1 .slick-dots {
+ margin-top: 30px;
+}
+@media (min-width: 768px) {
+ .bodywebsite .slick-carousel-complex-variant-1 {
+ padding-bottom: 90px;
+ }
+}
+.bodywebsite .slick-slider-images .item {
+ padding: 0 15px;
+ text-align: right;
+}
+.bodywebsite .slick-slider-images .item img {
+ display: inline-block;
+ transform: scale(0.75);
+ transform-origin: 100% 50%;
+ will-change: transform;
+ cursor: pointer;
+ transition: .5s all ease;
+}
+.bodywebsite .slick-slider-images .item.slick-center {
+ text-align: center;
+}
+.bodywebsite .slick-slider-images .item.slick-center img {
+ transform-origin: 50% 50%;
+ transform: scale(1);
+}
+.bodywebsite .slick-slider-images .item.slick-center + * {
+ text-align: left;
+}
+.bodywebsite .slick-slider-images .item.slick-center + * img {
+ transform-origin: 0 50%;
+}
+.bodywebsite .slick-carousel-round-image .item img {
+ border-radius: 50%;
+}
+.bodywebsite .carousel-testimonials-home .slick-slide {
+ text-align: center;
+}
+.bodywebsite #sectiontestimonies.maincolorbackground {
+ background-image: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+@media (min-width: 576px) {
+ .bodywebsite .carousel-testimonials-home .slick-slide {
+ text-align: left;
+ }
+}
+.bodywebsite .carousel-testimonials-home .slick-dots li button {
+ background: rgba(246, 247, 250, 0.5);
+}
+.bodywebsite .carousel-testimonials-home .item {
+ padding-left: 10px;
+ padding-right: 10px;
+}
+@media (min-width: 1200px) {
+ .bodywebsite .carousel-testimonials-home .item {
+ padding-left: 0;
+ padding-right: 0;
+ }
+}
+@media (min-width: 576px) {
+ .bodywebsite .carousel-testimonials-home .slick-dots {
+ display: none !important;
+ }
+}
+.bodywebsite .carousel-testimonials-home .slick-images .item {
+ padding-left: 0;
+ padding-right: 0;
+}
+.bodywebsite .carousel-testimonials-home .slick-images .item .imp-wrap {
+ text-align: center;
+ position: relative;
+ padding: 10px;
+}
+.bodywebsite .carousel-testimonials-home .slick-images .item .imp-wrap:after {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%) scale(0);
+ content: '';
+ display: inline-block;
+ margin-left: 0px;
+ border: 1px solid #fccb56;
+ width: 116px;
+ height: 116px;
+ border-radius: 50%;
+ transition: 200ms ease-in-out;
+ opacity: 0;
+ pointer-events: none;
+}
+.bodywebsite .carousel-testimonials-home .slick-images .item .imp-wrap img {
+ display: inline-block;
+ border-radius: 50%;
+ cursor: pointer;
+}
+.bodywebsite .carousel-testimonials-home .slick-images .item:hover .imp-wrap:after,
+.bodywebsite .carousel-testimonials-home .slick-images .item.slick-current .imp-wrap:after {
+ transform: translate(-50%, -50%) scale(1);
+ opacity: 1;
+}
+.bodywebsite .carousel-testimonials-home .quote-desc {
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+}
+.bodywebsite .websitemaincolor {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .maincolor {
+ color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .maincolorbis {
+ color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?> !important;
+}
+.bodywebsite .maincolorbackground {
+ background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>;
+}
+.bodywebsite .maincolorbisbackground {
+ background-color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?> !important;
+ border-color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?> !important;
+}
+.bodywebsite .maincolorbisbackground:hover {
+ box-shadow: 1px 1px 8px #aaa;
+}
+.bodywebsite textarea:focus,
+.bodywebsite button:focus {
+ border: unset !important;
+}
+.bodywebsite .marginrightonly {
+ margin-right: 10px !important;
+}
+.bodywebsite .inline-block {
+ display: inline-block;
+}
+.bodywebsite .valignmiddle {
+ vertical-align: middle;
+}
+.bodywebsite .center {
+ text-align: center;
+}
+.bodywebsite button.buttonwithnoborder.toggle-original.active {
+ display: none;
+}
+.bodywebsite .rd-navbar-nav-wrap.active .toggle-original span.icon.icon-xs.icon-dusty-gray.fa.fa-search {
+ display: none;
+}
+.bodywebsite ul.rd-navbar-list {
+ padding-top: 20px;
+}
+.bodywebsite .photouser:hover,
+.bodywebsite .photouser:active {
+ border: 2px solid #eee;
+}
+.bodywebsite .imp-wrap {
+ display: inline-block;
+}
+.bodywebsite .imp-wrap img {
+ border-radius: 50px;
+}
+.bodywebsite .text-green {
+ color: #6ca;
+}
+.bodywebsite .plan-tile .plan-title {
+ padding: 20px 0 0;
+ font-size: 20px;
+ font-weight: bold;
+ text-align: center;
+}
+.bodywebsite .plan-tile .plan-tag {
+ color: #687484;
+ text-align: center;
+ font-size: 16px;
+ padding: 0 5px 10px;
+ font-weight: 300;
+ min-height: 70px;
+}
+.bodywebsite .plan-tile .plan-pricer .plan-price-title {
+ display: block;
+ text-align: center;
+ color: #8492A6;
+ font-style: italic;
+ position: absolute;
+ top: 30px;
+ transform: translateX(-50%);
+ -webkit-transform: translateX(-50%);
+ left: 50%;
+ font-size: 16px;
+ width: 100%;
+ font-weight: 300;
+}
+.bodywebsite .plan-tile .plan-feat {
+ display: block;
+ font-size: 14px;
+ color: #3C4858;
+ text-align: center;
+ padding: 22px 10px;
+ min-height: 90px;
+}
+.bodywebsite .plan-tile .plan-pricer .plan-price {
+ border-bottom: 1px solid #d5dadf;
+ border-top: 1px solid #d5dadf;
+ padding: 20px 0 20px;
+ display: block;
+}
+.bodywebsite .plan-tile .plan-pricer .plan-price > span {
+ color: #3C4858;
+ font-size: 32px;
+}
+.bodywebsite .plan-tile .plan-pricer .plan-price > span > sup {
+ font-size: 13px;
+ top: -0.9em;
+}
+.bodywebsite .plan-tile .plan-pricer {
+ padding: 5px 0;
+ text-align: center;
+ max-width: 90%;
+ position: relative;
+ margin: auto;
+}
+.bodywebsite .pricing-plan-slider .plan-tile .plan-btn {
+ position: absolute;
+ bottom: 0px;
+ left: 0;
+ width: 100%;
+}
+.bodywebsite .plan-tile .plan-btn {
+ text-align: center;
+ padding: 0 15px 15px 15px;
+}
+.bodywebsite .plan-features {
+ padding-top: 20px;
+ padding-bottom: 20px;
+ padding-left: 20px;
+ padding-right: 20px;
+}
+.bodywebsite .formcontact div {
+ margin: 2px;
+}
+.bodywebsite section#sectionfooterdolibarr {
+ padding-left: 3px;
+ padding-right: 3px;
+ padding-bottom: 10px;
+}
+.bodywebsite button.buttonwithnoborder.toggle-original {
+ font-family: "Font Awesome 5 Free";
+ font-weight: 600;
+ font-size: initial;
+ /* If removed, the search icon is not visible */
+}
+.bodywebsite .rd-navbar-fixed .buttonsearchwhenstatic {
+ display: none;
+}
+.bodywebsite input[type="text"] {
+ display: block;
+ width: 100%;
+ padding: 11px 35px;
+ font-size: 14px;
+ line-height: 1.25;
+ background-image: none;
+ background-clip: padding-box;
+ border: 1px solid #ced4da;
+ border-radius: 0.25rem;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+}
+@media print {
+ .bodywebsite *,
+ .bodywebsite *::before,
+ .bodywebsite *::after {
+ text-shadow: none !important;
+ box-shadow: none !important;
+ }
+ .bodywebsite a,
+ .bodywebsite a:visited {
+ text-decoration: underline;
+ }
+ .bodywebsite abbr[title]::after {
+ content: " (" attr(title) ")";
+ }
+ .bodywebsite pre {
+ white-space: pre-wrap !important;
+ }
+ .bodywebsite pre,
+ .bodywebsite blockquote {
+ border: 1px solid #999;
+ page-break-inside: avoid;
+ }
+ .bodywebsite thead {
+ display: table-header-group;
+ }
+ .bodywebsite tr,
+ .bodywebsite img {
+ page-break-inside: avoid;
+ }
+ .bodywebsite p,
+ .bodywebsite h2,
+ .bodywebsite h3 {
+ orphans: 3;
+ widows: 3;
+ }
+ .bodywebsite h2,
+ .bodywebsite h3 {
+ page-break-after: avoid;
+ }
+ .bodywebsite .navbar {
+ display: none;
+ }
+ .bodywebsite .badge {
+ border: 1px solid #000;
+ }
+ .bodywebsite .table {
+ border-collapse: collapse !important;
+ }
+ .bodywebsite .table td,
+ .bodywebsite .table th {
+ background-color: #fff !important;
+ }
+ .bodywebsite .table-bordered th,
+ .bodywebsite .table-bordered td {
+ border: 1px solid #ddd !important;
+ }
+}
+.bodywebsite *,
+.bodywebsite *::before,
+.bodywebsite *::after {
+ box-sizing: border-box;
+}
+html .bodywebsite {
+ font-family: sans-serif;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+ -ms-overflow-style: scrollbar;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+@-ms-viewport {
+ width: device-width;
+}
+.bodywebsite article,
+.bodywebsite aside,
+.bodywebsite dialog,
+.bodywebsite figcaption,
+.bodywebsite figure,
+.bodywebsite footer,
+.bodywebsite header,
+.bodywebsite hgroup,
+.bodywebsite main,
+.bodywebsite nav,
+.bodywebsite section {
+ display: block;
+}
+.bodywebsite {
+ margin: 0;
+ font-family: "Roboto", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 1.71429;
+ text-align: left;
+ background-color: #fff;
+}
+.bodywebsite [tabindex="-1"]:focus {
+ outline: none !important;
+}
+.bodywebsite hr {
+ box-sizing: content-box;
+ height: 0;
+ overflow: visible;
+}
+.bodywebsite h1,
+.bodywebsite h2,
+.bodywebsite h3,
+.bodywebsite h4,
+.bodywebsite h5,
+.bodywebsite h6 {
+ margin-top: 0;
+ margin-bottom: 0.5rem;
+}
+.bodywebsite abbr[title],
+.bodywebsite abbr[data-original-title] {
+ text-decoration: underline;
+ text-decoration: underline dotted;
+ cursor: help;
+ border-bottom: 0;
+}
+.bodywebsite address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit;
+}
+.bodywebsite ol,
+.bodywebsite ul,
+.bodywebsite dl {
+ margin-top: 0;
+}
+.bodywebsite ol ol,
+.bodywebsite ul ul,
+.bodywebsite ol ul,
+.bodywebsite ul ol {
+ margin-bottom: 0;
+}
+.bodywebsite dt {
+ font-weight: inherit;
+}
+.bodywebsite dd {
+ margin-bottom: .5rem;
+ margin-left: 0;
+}
+.bodywebsite blockquote {
+ margin: 0 0 1rem;
+}
+.bodywebsite dfn {
+ font-style: italic;
+}
+.bodywebsite b,
+.bodywebsite strong {
+ font-weight: bolder;
+}
+.bodywebsite small {
+ font-size: 80%;
+}
+.bodywebsite sub,
+.bodywebsite sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+.bodywebsite sub {
+ bottom: -0.25em;
+}
+.bodywebsite sup {
+ top: -0.5em;
+}
+.bodywebsite a {
+ text-decoration: none;
+ -webkit-text-decoration-skip: objects;
+}
+.bodywebsite a:hover {
+ text-decoration: none;
+}
+.bodywebsite a:not([href]):not([tabindex]) {
+ color: inherit;
+ text-decoration: none;
+}
+.bodywebsite a:not([href]):not([tabindex]):focus,
+.bodywebsite a:not([href]):not([tabindex]):hover {
+ color: inherit;
+ text-decoration: none;
+}
+.bodywebsite a:not([href]):not([tabindex]):focus {
+ outline: 0;
+}
+.bodywebsite pre,
+.bodywebsite code,
+.bodywebsite kbd,
+.bodywebsite samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+.bodywebsite pre {
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
+ -ms-overflow-style: scrollbar;
+}
+.bodywebsite figure {
+ margin: 0 0 1rem;
+}
+.bodywebsite img {
+ vertical-align: middle;
+ border-style: none;
+}
+.bodywebsite svg:not(:root) {
+ overflow: hidden;
+}
+.bodywebsite a,
+.bodywebsite area,
+.bodywebsite button,
+.bodywebsite [role="button"],
+.bodywebsite input:not([type="range"]),
+.bodywebsite label,
+.bodywebsite select,
+.bodywebsite summary,
+.bodywebsite textarea {
+ touch-action: manipulation;
+}
+.bodywebsite table {
+ border-collapse: collapse;
+}
+.bodywebsite caption {
+ padding-top: 17px 25px 18px;
+ padding-bottom: 17px 25px 18px;
+ color: #dedede;
+ text-align: left;
+ caption-side: bottom;
+}
+.bodywebsite th {
+ text-align: inherit;
+}
+.bodywebsite label {
+ display: inline-block;
+ margin-bottom: .5rem;
+}
+.bodywebsite button {
+ border-radius: 0;
+}
+.bodywebsite button:focus {
+ outline: 1px dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+}
+.bodywebsite input,
+.bodywebsite button,
+.bodywebsite select,
+.bodywebsite optgroup,
+.bodywebsite textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+.bodywebsite button,
+.bodywebsite input {
+ overflow: visible;
+}
+.bodywebsite button,
+.bodywebsite select {
+ text-transform: none;
+}
+.bodywebsite button,
+html .bodywebsite [type="button"],
+.bodywebsite [type="reset"],
+.bodywebsite [type="submit"] {
+ -webkit-appearance: button;
+}
+.bodywebsite button::-moz-focus-inner,
+.bodywebsite [type="button"]::-moz-focus-inner,
+.bodywebsite [type="reset"]::-moz-focus-inner,
+.bodywebsite [type="submit"]::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
+}
+.bodywebsite input[type="radio"],
+.bodywebsite input[type="checkbox"] {
+ box-sizing: border-box;
+ padding: 0;
+}
+.bodywebsite input[type="date"],
+.bodywebsite input[type="time"],
+.bodywebsite input[type="datetime-local"],
+.bodywebsite input[type="month"] {
+ -webkit-appearance: listbox;
+}
+.bodywebsite textarea {
+ overflow: auto;
+ resize: vertical;
+}
+.bodywebsite fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+.bodywebsite legend {
+ display: block;
+ width: 100%;
+ max-width: 100%;
+ padding: 0;
+ margin-bottom: .5rem;
+ font-size: 1.5rem;
+ line-height: inherit;
+ color: inherit;
+ white-space: normal;
+}
+.bodywebsite progress {
+ vertical-align: baseline;
+}
+.bodywebsite [type="number"]::-webkit-inner-spin-button,
+.bodywebsite [type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+.bodywebsite [type="search"] {
+ outline-offset: -2px;
+ -webkit-appearance: none;
+}
+.bodywebsite [type="search"]::-webkit-search-cancel-button,
+.bodywebsite [type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+.bodywebsite ::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+.bodywebsite output {
+ display: inline-block;
+}
+.bodywebsite summary {
+ display: list-item;
+}
+.bodywebsite template {
+ display: none;
+}
+.bodywebsite [hidden] {
+ display: none !important;
+}
+.bodywebsite h1,
+.bodywebsite h2,
+.bodywebsite h3,
+.bodywebsite h4,
+.bodywebsite h5,
+.bodywebsite h6,
+.bodywebsite .h1,
+.bodywebsite .h2,
+.bodywebsite .h3,
+.bodywebsite .h4,
+.bodywebsite .h5,
+.bodywebsite .h6 {
+ margin-bottom: 0.5rem;
+ font-family: "Roboto", Helvetica, Arial, sans-serif;
+ font-weight: 700;
+ line-height: 1.1;
+ color: #000;
+}
+.bodywebsite h1,
+.bodywebsite .h1 {
+ font-size: 45px;
+}
+.bodywebsite h2,
+.bodywebsite .h2 {
+ font-size: 24px;
+}
+.bodywebsite h3,
+.bodywebsite .h3 {
+ font-size: 33px;
+}
+.bodywebsite h4,
+.bodywebsite .h4 {
+ font-size: 18px;
+}
+.bodywebsite .lead {
+ font-size: 24px;
+ font-weight: 300;
+}
+.bodywebsite hr {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+ border: 0;
+ border-top: 1px solid #2a2b2b;
+}
+.bodywebsite small,
+.bodywebsite .small {
+ font-size: 80%;
+ font-weight: 400;
+}
+.bodywebsite mark,
+.bodywebsite .mark {
+ padding: 5px 10px;
+ background-color: #37c386;
+}
+.bodywebsite .list-unstyled {
+ padding-left: 0;
+ list-style: none;
+}
+.bodywebsite .list-inline {
+ padding-left: 0;
+ list-style: none;
+}
+.bodywebsite .list-inline-item {
+ display: inline-block;
+}
+.bodywebsite .list-inline-item:not(:last-child) {
+ margin-right: 5px;
+}
+.bodywebsite .initialism {
+ font-size: 90%;
+ text-transform: uppercase;
+}
+.bodywebsite .blockquote {
+ margin-bottom: 1rem;
+ font-size: 17.5px;
+}
+.bodywebsite .blockquote-footer {
+ display: block;
+ font-size: 80%;
+ color: #dedede;
+}
+.bodywebsite .blockquote-footer::before {
+ content: "\2014 \00A0";
+}
+.bodywebsite .img-fluid {
+ max-width: 100%;
+ height: auto;
+}
+.bodywebsite code,
+.bodywebsite kbd,
+.bodywebsite pre,
+.bodywebsite samp {
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+}
+.bodywebsite code {
+ padding: 10px 5px;
+ font-size: 90%;
+ color: #00030a;
+ background-color: #edeff4;
+ border-radius: 0;
+}
+.bodywebsite a > code {
+ padding: 0;
+ color: inherit;
+ background-color: inherit;
+}
+.bodywebsite kbd {
+ padding: 10px 5px;
+ font-size: 90%;
+ color: #fff;
+ background-color: #212529;
+ border-radius: 3px;
+ box-shadow: inset 0 -0.1rem 0 rgba(0, 0, 0, 0.25);
+}
+.bodywebsite kbd kbd {
+ padding: 0;
+ font-size: 100%;
+ font-weight: 700;
+ box-shadow: none;
+}
+.bodywebsite pre {
+ display: block;
+ margin-top: 0;
+ margin-bottom: 1rem;
+ font-size: 90%;
+ color: #212529;
+}
+.bodywebsite pre code {
+ padding: 0;
+ font-size: inherit;
+ color: inherit;
+ background-color: transparent;
+ border-radius: 0;
+}
+.bodywebsite .pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll;
+}
+.bodywebsite .container {
+ width: 100%;
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto;
+}
+@media (min-width: 576px) {
+ .bodywebsite .container {
+ max-width: 540px;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .container {
+ max-width: 720px;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .container {
+ max-width: 960px;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .container {
+ max-width: 1170px;
+ }
+}
+.bodywebsite .container-fluid {
+ width: 100%;
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto;
+}
+.bodywebsite .row {
+ display: flex;
+ flex-wrap: wrap;
+ /*margin-right: -15px;
+ margin-left: -15px; */
+}
+.bodywebsite .no-gutters {
+ margin-right: 0;
+ margin-left: 0;
+}
+.bodywebsite .no-gutters > .col,
+.bodywebsite .no-gutters > [class*="col-"] {
+ padding-right: 0;
+ padding-left: 0;
+}
+.bodywebsite .col-1,
+.bodywebsite .col-2,
+.bodywebsite .col-3,
+.bodywebsite .col-4,
+.bodywebsite .col-5,
+.bodywebsite .col-6,
+.bodywebsite .col-7,
+.bodywebsite .col-8,
+.bodywebsite .col-9,
+.bodywebsite .col-10,
+.bodywebsite .col-11,
+.bodywebsite .col-12,
+.bodywebsite .col,
+.bodywebsite .col-auto,
+.bodywebsite .col-sm-1,
+.bodywebsite .col-sm-2,
+.bodywebsite .col-sm-3,
+.bodywebsite .col-sm-4,
+.bodywebsite .col-sm-5,
+.bodywebsite .col-sm-6,
+.bodywebsite .col-sm-7,
+.bodywebsite .col-sm-8,
+.bodywebsite .col-sm-9,
+.bodywebsite .col-sm-10,
+.bodywebsite .col-sm-11,
+.bodywebsite .col-sm-12,
+.bodywebsite .col-sm,
+.bodywebsite .col-sm-auto,
+.bodywebsite .col-md-1,
+.bodywebsite .col-md-2,
+.bodywebsite .col-md-3,
+.bodywebsite .col-md-4,
+.bodywebsite .col-md-5,
+.bodywebsite .col-md-6,
+.bodywebsite .col-md-7,
+.bodywebsite .col-md-8,
+.bodywebsite .col-md-9,
+.bodywebsite .col-md-10,
+.bodywebsite .col-md-11,
+.bodywebsite .col-md-12,
+.bodywebsite .col-md,
+.bodywebsite .col-md-auto,
+.bodywebsite .col-lg-1,
+.bodywebsite .col-lg-2,
+.bodywebsite .col-lg-3,
+.bodywebsite .col-lg-4,
+.bodywebsite .col-lg-5,
+.bodywebsite .col-lg-6,
+.bodywebsite .col-lg-7,
+.bodywebsite .col-lg-8,
+.bodywebsite .col-lg-9,
+.bodywebsite .col-lg-10,
+.bodywebsite .col-lg-11,
+.bodywebsite .col-lg-12,
+.bodywebsite .col-lg,
+.bodywebsite .col-lg-auto,
+.bodywebsite .col-xl-1,
+.bodywebsite .col-xl-2,
+.bodywebsite .col-xl-3,
+.bodywebsite .col-xl-4,
+.bodywebsite .col-xl-5,
+.bodywebsite .col-xl-6,
+.bodywebsite .col-xl-7,
+.bodywebsite .col-xl-8,
+.bodywebsite .col-xl-9,
+.bodywebsite .col-xl-10,
+.bodywebsite .col-xl-11,
+.bodywebsite .col-xl-12,
+.bodywebsite .col-xl,
+.bodywebsite .col-xl-auto,
+.bodywebsite .col-xxl-1,
+.bodywebsite .col-xxl-2,
+.bodywebsite .col-xxl-3,
+.bodywebsite .col-xxl-4,
+.bodywebsite .col-xxl-5,
+.bodywebsite .col-xxl-6,
+.bodywebsite .col-xxl-7,
+.bodywebsite .col-xxl-8,
+.bodywebsite .col-xxl-9,
+.bodywebsite .col-xxl-10,
+.bodywebsite .col-xxl-11,
+.bodywebsite .col-xxl-12,
+.bodywebsite .col-xxl,
+.bodywebsite .col-xxl-auto {
+ position: relative;
+ width: 100%;
+ min-height: 1px;
+ padding-right: 15px;
+ padding-left: 15px
+}
+.bodywebsite .col {
+ flex-basis: 0;
+ flex-grow: 1;
+ max-width: 100%;
+}
+.bodywebsite .col-auto {
+ flex: 0 0 auto;
+ width: auto;
+ max-width: none;
+}
+.bodywebsite .col-1 {
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%;
+}
+.bodywebsite .col-2 {
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%;
+}
+.bodywebsite .col-3 {
+ flex: 0 0 25%;
+ max-width: 25%;
+}
+.bodywebsite .col-4 {
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%;
+}
+.bodywebsite .col-5 {
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%;
+}
+.bodywebsite .col-6 {
+ flex: 0 0 50%;
+ max-width: 50%;
+}
+.bodywebsite .col-7 {
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%;
+}
+.bodywebsite .col-8 {
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%;
+}
+.bodywebsite .col-9 {
+ flex: 0 0 75%;
+ max-width: 75%;
+}
+.bodywebsite .col-10 {
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%;
+}
+.bodywebsite .col-11 {
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%;
+}
+.bodywebsite .col-12 {
+ flex: 0 0 100%;
+ max-width: 100%;
+}
+.bodywebsite .order-first {
+ order: -1;
+}
+.bodywebsite .order-1 {
+ order: 1;
+}
+.bodywebsite .order-2 {
+ order: 2;
+}
+.bodywebsite .order-3 {
+ order: 3;
+}
+.bodywebsite .order-4 {
+ order: 4;
+}
+.bodywebsite .order-5 {
+ order: 5;
+}
+.bodywebsite .order-6 {
+ order: 6;
+}
+.bodywebsite .order-7 {
+ order: 7;
+}
+.bodywebsite .order-8 {
+ order: 8;
+}
+.bodywebsite .order-9 {
+ order: 9;
+}
+.bodywebsite .order-10 {
+ order: 10;
+}
+.bodywebsite .order-11 {
+ order: 11;
+}
+.bodywebsite .order-12 {
+ order: 12;
+}
+.bodywebsite .offset-1 {
+ margin-left: 8.33333%;
+}
+.bodywebsite .offset-2 {
+ margin-left: 16.66667%;
+}
+.bodywebsite .offset-3 {
+ margin-left: 25%;
+}
+.bodywebsite .offset-4 {
+ margin-left: 33.33333%;
+}
+.bodywebsite .offset-5 {
+ margin-left: 41.66667%;
+}
+.bodywebsite .offset-6 {
+ margin-left: 50%;
+}
+.bodywebsite .offset-7 {
+ margin-left: 58.33333%;
+}
+.bodywebsite .offset-8 {
+ margin-left: 66.66667%;
+}
+.bodywebsite .offset-9 {
+ margin-left: 75%;
+}
+.bodywebsite .offset-10 {
+ margin-left: 83.33333%;
+}
+.bodywebsite .offset-11 {
+ margin-left: 91.66667%;
+}
+@media (min-width: 576px) {
+ .bodywebsite .col-sm {
+ flex-basis: 0;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .bodywebsite .col-sm-auto {
+ flex: 0 0 auto;
+ width: auto;
+ max-width: none;
+ }
+ .bodywebsite .col-sm-1 {
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%;
+ }
+ .bodywebsite .col-sm-2 {
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%;
+ }
+ .bodywebsite .col-sm-3 {
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .bodywebsite .col-sm-4 {
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%;
+ }
+ .bodywebsite .col-sm-5 {
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%;
+ }
+ .bodywebsite .col-sm-6 {
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .bodywebsite .col-sm-7 {
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%;
+ }
+ .bodywebsite .col-sm-8 {
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%;
+ }
+ .bodywebsite .col-sm-9 {
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .bodywebsite .col-sm-10 {
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%;
+ }
+ .bodywebsite .col-sm-11 {
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%;
+ }
+ .bodywebsite .col-sm-12 {
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .bodywebsite .order-sm-first {
+ order: -1;
+ }
+ .bodywebsite .order-sm-1 {
+ order: 1;
+ }
+ .bodywebsite .order-sm-2 {
+ order: 2;
+ }
+ .bodywebsite .order-sm-3 {
+ order: 3;
+ }
+ .bodywebsite .order-sm-4 {
+ order: 4;
+ }
+ .bodywebsite .order-sm-5 {
+ order: 5;
+ }
+ .bodywebsite .order-sm-6 {
+ order: 6;
+ }
+ .bodywebsite .order-sm-7 {
+ order: 7;
+ }
+ .bodywebsite .order-sm-8 {
+ order: 8;
+ }
+ .bodywebsite .order-sm-9 {
+ order: 9;
+ }
+ .bodywebsite .order-sm-10 {
+ order: 10;
+ }
+ .bodywebsite .order-sm-11 {
+ order: 11;
+ }
+ .bodywebsite .order-sm-12 {
+ order: 12;
+ }
+ .bodywebsite .offset-sm-0 {
+ margin-left: 0;
+ }
+ .bodywebsite .offset-sm-1 {
+ margin-left: 8.33333%;
+ }
+ .bodywebsite .offset-sm-2 {
+ margin-left: 16.66667%;
+ }
+ .bodywebsite .offset-sm-3 {
+ margin-left: 25%;
+ }
+ .bodywebsite .offset-sm-4 {
+ margin-left: 33.33333%;
+ }
+ .bodywebsite .offset-sm-5 {
+ margin-left: 41.66667%;
+ }
+ .bodywebsite .offset-sm-6 {
+ margin-left: 50%;
+ }
+ .bodywebsite .offset-sm-7 {
+ margin-left: 58.33333%;
+ }
+ .bodywebsite .offset-sm-8 {
+ margin-left: 66.66667%;
+ }
+ .bodywebsite .offset-sm-9 {
+ margin-left: 75%;
+ }
+ .bodywebsite .offset-sm-10 {
+ margin-left: 83.33333%;
+ }
+ .bodywebsite .offset-sm-11 {
+ margin-left: 91.66667%;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .col-md {
+ flex-basis: 0;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .bodywebsite .col-md-auto {
+ flex: 0 0 auto;
+ width: auto;
+ max-width: none;
+ }
+ .bodywebsite .col-md-1 {
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%;
+ }
+ .bodywebsite .col-md-2 {
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%;
+ }
+ .bodywebsite .col-md-3 {
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .bodywebsite .col-md-4 {
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%;
+ }
+ .bodywebsite .col-md-5 {
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%;
+ }
+ .bodywebsite .col-md-6 {
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .bodywebsite .col-md-7 {
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%;
+ }
+ .bodywebsite .col-md-8 {
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%;
+ }
+ .bodywebsite .col-md-9 {
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .bodywebsite .col-md-10 {
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%;
+ }
+ .bodywebsite .col-md-11 {
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%;
+ }
+ .bodywebsite .col-md-12 {
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .bodywebsite .order-md-first {
+ order: -1;
+ }
+ .bodywebsite .order-md-1 {
+ order: 1;
+ }
+ .bodywebsite .order-md-2 {
+ order: 2;
+ }
+ .bodywebsite .order-md-3 {
+ order: 3;
+ }
+ .bodywebsite .order-md-4 {
+ order: 4;
+ }
+ .bodywebsite .order-md-5 {
+ order: 5;
+ }
+ .bodywebsite .order-md-6 {
+ order: 6;
+ }
+ .bodywebsite .order-md-7 {
+ order: 7;
+ }
+ .bodywebsite .order-md-8 {
+ order: 8;
+ }
+ .bodywebsite .order-md-9 {
+ order: 9;
+ }
+ .bodywebsite .order-md-10 {
+ order: 10;
+ }
+ .bodywebsite .order-md-11 {
+ order: 11;
+ }
+ .bodywebsite .order-md-12 {
+ order: 12;
+ }
+ .bodywebsite .offset-md-0 {
+ margin-left: 0;
+ }
+ .bodywebsite .offset-md-1 {
+ margin-left: 8.33333%;
+ }
+ .bodywebsite .offset-md-2 {
+ margin-left: 16.66667%;
+ }
+ .bodywebsite .offset-md-3 {
+ margin-left: 25%;
+ }
+ .bodywebsite .offset-md-4 {
+ margin-left: 33.33333%;
+ }
+ .bodywebsite .offset-md-5 {
+ margin-left: 41.66667%;
+ }
+ .bodywebsite .offset-md-6 {
+ margin-left: 50%;
+ }
+ .bodywebsite .offset-md-7 {
+ margin-left: 58.33333%;
+ }
+ .bodywebsite .offset-md-8 {
+ margin-left: 66.66667%;
+ }
+ .bodywebsite .offset-md-9 {
+ margin-left: 75%;
+ }
+ .bodywebsite .offset-md-10 {
+ margin-left: 83.33333%;
+ }
+ .bodywebsite .offset-md-11 {
+ margin-left: 91.66667%;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .col-lg {
+ flex-basis: 0;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .bodywebsite .col-lg-auto {
+ flex: 0 0 auto;
+ width: auto;
+ max-width: none;
+ }
+ .bodywebsite .col-lg-1 {
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%;
+ }
+ .bodywebsite .col-lg-2 {
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%;
+ }
+ .bodywebsite .col-lg-3 {
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .bodywebsite .col-lg-4 {
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%;
+ }
+ .bodywebsite .col-lg-5 {
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%;
+ }
+ .bodywebsite .col-lg-6 {
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .bodywebsite .col-lg-7 {
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%;
+ }
+ .bodywebsite .col-lg-8 {
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%;
+ }
+ .bodywebsite .col-lg-9 {
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .bodywebsite .col-lg-10 {
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%;
+ }
+ .bodywebsite .col-lg-11 {
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%;
+ }
+ .bodywebsite .col-lg-12 {
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .bodywebsite .order-lg-first {
+ order: -1;
+ }
+ .bodywebsite .order-lg-1 {
+ order: 1;
+ }
+ .bodywebsite .order-lg-2 {
+ order: 2;
+ }
+ .bodywebsite .order-lg-3 {
+ order: 3;
+ }
+ .bodywebsite .order-lg-4 {
+ order: 4;
+ }
+ .bodywebsite .order-lg-5 {
+ order: 5;
+ }
+ .bodywebsite .order-lg-6 {
+ order: 6;
+ }
+ .bodywebsite .order-lg-7 {
+ order: 7;
+ }
+ .bodywebsite .order-lg-8 {
+ order: 8;
+ }
+ .bodywebsite .order-lg-9 {
+ order: 9;
+ }
+ .bodywebsite .order-lg-10 {
+ order: 10;
+ }
+ .bodywebsite .order-lg-11 {
+ order: 11;
+ }
+ .bodywebsite .order-lg-12 {
+ order: 12;
+ }
+ .bodywebsite .offset-lg-0 {
+ margin-left: 0;
+ }
+ .bodywebsite .offset-lg-1 {
+ margin-left: 8.33333%;
+ }
+ .bodywebsite .offset-lg-2 {
+ margin-left: 16.66667%;
+ }
+ .bodywebsite .offset-lg-3 {
+ margin-left: 25%;
+ }
+ .bodywebsite .offset-lg-4 {
+ margin-left: 33.33333%;
+ }
+ .bodywebsite .offset-lg-5 {
+ margin-left: 41.66667%;
+ }
+ .bodywebsite .offset-lg-6 {
+ margin-left: 50%;
+ }
+ .bodywebsite .offset-lg-7 {
+ margin-left: 58.33333%;
+ }
+ .bodywebsite .offset-lg-8 {
+ margin-left: 66.66667%;
+ }
+ .bodywebsite .offset-lg-9 {
+ margin-left: 75%;
+ }
+ .bodywebsite .offset-lg-10 {
+ margin-left: 83.33333%;
+ }
+ .bodywebsite .offset-lg-11 {
+ margin-left: 91.66667%;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .col-xl {
+ flex-basis: 0;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .bodywebsite .col-xl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ max-width: none;
+ }
+ .bodywebsite .col-xl-1 {
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%;
+ }
+ .bodywebsite .col-xl-2 {
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%;
+ }
+ .bodywebsite .col-xl-3 {
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .bodywebsite .col-xl-4 {
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%;
+ }
+ .bodywebsite .col-xl-5 {
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%;
+ }
+ .bodywebsite .col-xl-6 {
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .bodywebsite .col-xl-7 {
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%;
+ }
+ .bodywebsite .col-xl-8 {
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%;
+ }
+ .bodywebsite .col-xl-9 {
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .bodywebsite .col-xl-10 {
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%;
+ }
+ .bodywebsite .col-xl-11 {
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%;
+ }
+ .bodywebsite .col-xl-12 {
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .bodywebsite .order-xl-first {
+ order: -1;
+ }
+ .bodywebsite .order-xl-1 {
+ order: 1;
+ }
+ .bodywebsite .order-xl-2 {
+ order: 2;
+ }
+ .bodywebsite .order-xl-3 {
+ order: 3;
+ }
+ .bodywebsite .order-xl-4 {
+ order: 4;
+ }
+ .bodywebsite .order-xl-5 {
+ order: 5;
+ }
+ .bodywebsite .order-xl-6 {
+ order: 6;
+ }
+ .bodywebsite .order-xl-7 {
+ order: 7;
+ }
+ .bodywebsite .order-xl-8 {
+ order: 8;
+ }
+ .bodywebsite .order-xl-9 {
+ order: 9;
+ }
+ .bodywebsite .order-xl-10 {
+ order: 10;
+ }
+ .bodywebsite .order-xl-11 {
+ order: 11;
+ }
+ .bodywebsite .order-xl-12 {
+ order: 12;
+ }
+ .bodywebsite .offset-xl-0 {
+ margin-left: 0;
+ }
+ .bodywebsite .offset-xl-1 {
+ margin-left: 8.33333%;
+ }
+ .bodywebsite .offset-xl-2 {
+ margin-left: 16.66667%;
+ }
+ .bodywebsite .offset-xl-3 {
+ margin-left: 25%;
+ }
+ .bodywebsite .offset-xl-4 {
+ margin-left: 33.33333%;
+ }
+ .bodywebsite .offset-xl-5 {
+ margin-left: 41.66667%;
+ }
+ .bodywebsite .offset-xl-6 {
+ margin-left: 50%;
+ }
+ .bodywebsite .offset-xl-7 {
+ margin-left: 58.33333%;
+ }
+ .bodywebsite .offset-xl-8 {
+ margin-left: 66.66667%;
+ }
+ .bodywebsite .offset-xl-9 {
+ margin-left: 75%;
+ }
+ .bodywebsite .offset-xl-10 {
+ margin-left: 83.33333%;
+ }
+ .bodywebsite .offset-xl-11 {
+ margin-left: 91.66667%;
+ }
+}
+@media (min-width: 1800px) {
+ .bodywebsite .col-xxl {
+ flex-basis: 0;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .bodywebsite .col-xxl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ max-width: none;
+ }
+ .bodywebsite .col-xxl-1 {
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%;
+ }
+ .bodywebsite .col-xxl-2 {
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%;
+ }
+ .bodywebsite .col-xxl-3 {
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .bodywebsite .col-xxl-4 {
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%;
+ }
+ .bodywebsite .col-xxl-5 {
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%;
+ }
+ .bodywebsite .col-xxl-6 {
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .bodywebsite .col-xxl-7 {
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%;
+ }
+ .bodywebsite .col-xxl-8 {
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%;
+ }
+ .bodywebsite .col-xxl-9 {
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .bodywebsite .col-xxl-10 {
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%;
+ }
+ .bodywebsite .col-xxl-11 {
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%;
+ }
+ .bodywebsite .col-xxl-12 {
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .bodywebsite .order-xxl-first {
+ order: -1;
+ }
+ .bodywebsite .order-xxl-1 {
+ order: 1;
+ }
+ .bodywebsite .order-xxl-2 {
+ order: 2;
+ }
+ .bodywebsite .order-xxl-3 {
+ order: 3;
+ }
+ .bodywebsite .order-xxl-4 {
+ order: 4;
+ }
+ .bodywebsite .order-xxl-5 {
+ order: 5;
+ }
+ .bodywebsite .order-xxl-6 {
+ order: 6;
+ }
+ .bodywebsite .order-xxl-7 {
+ order: 7;
+ }
+ .bodywebsite .order-xxl-8 {
+ order: 8;
+ }
+ .bodywebsite .order-xxl-9 {
+ order: 9;
+ }
+ .bodywebsite .order-xxl-10 {
+ order: 10;
+ }
+ .bodywebsite .order-xxl-11 {
+ order: 11;
+ }
+ .bodywebsite .order-xxl-12 {
+ order: 12;
+ }
+ .bodywebsite .offset-xxl-0 {
+ margin-left: 0;
+ }
+ .bodywebsite .offset-xxl-1 {
+ margin-left: 8.33333%;
+ }
+ .bodywebsite .offset-xxl-2 {
+ margin-left: 16.66667%;
+ }
+ .bodywebsite .offset-xxl-3 {
+ margin-left: 25%;
+ }
+ .bodywebsite .offset-xxl-4 {
+ margin-left: 33.33333%;
+ }
+ .bodywebsite .offset-xxl-5 {
+ margin-left: 41.66667%;
+ }
+ .bodywebsite .offset-xxl-6 {
+ margin-left: 50%;
+ }
+ .bodywebsite .offset-xxl-7 {
+ margin-left: 58.33333%;
+ }
+ .bodywebsite .offset-xxl-8 {
+ margin-left: 66.66667%;
+ }
+ .bodywebsite .offset-xxl-9 {
+ margin-left: 75%;
+ }
+ .bodywebsite .offset-xxl-10 {
+ margin-left: 83.33333%;
+ }
+ .bodywebsite .offset-xxl-11 {
+ margin-left: 91.66667%;
+ }
+}
+.bodywebsite .table {
+ width: 100%;
+ max-width: 100%;
+ margin-bottom: 1rem;
+ background-color: transparent;
+}
+.bodywebsite .table th,
+.bodywebsite .table td {
+ padding: 17px 25px 18px;
+ vertical-align: top;
+ border-top: 1px solid #d9d9d9;
+}
+.bodywebsite .table thead th {
+ vertical-align: bottom;
+ border-bottom: 2px solid #d9d9d9;
+}
+.bodywebsite .table tbody + tbody {
+ border-top: 2px solid #d9d9d9;
+}
+.bodywebsite .table .table {
+ background-color: #fff;
+}
+.bodywebsite .table-sm th,
+.bodywebsite .table-sm td {
+ padding: 0.3rem;
+}
+.bodywebsite .table-bordered {
+ border: 1px solid #d9d9d9;
+}
+.bodywebsite .table-bordered th,
+.bodywebsite .table-bordered td {
+ border: 1px solid #d9d9d9;
+}
+.bodywebsite .table-bordered thead th,
+.bodywebsite .table-bordered thead td {
+ border-bottom-width: 2px;
+}
+.bodywebsite .table-striped tbody tr:nth-of-type(odd) {
+ background-color: rgba(0, 0, 0, 0.05);
+}
+.bodywebsite .table-hover tbody tr:hover {
+ background-color: rgba(0, 0, 0, 0.075);
+}
+.bodywebsite .table-primary,
+.bodywebsite .table-primary > th,
+.bodywebsite .table-primary > td {
+ background-color: #b8daff;
+}
+.bodywebsite .table-hover .table-primary:hover {
+ background-color: #9fcdff;
+}
+.bodywebsite .table-hover .table-primary:hover > td,
+.bodywebsite .table-hover .table-primary:hover > th {
+ background-color: #9fcdff;
+}
+.bodywebsite .table-secondary,
+.bodywebsite .table-secondary > th,
+.bodywebsite .table-secondary > td {
+ background-color: #dddfe2;
+}
+.bodywebsite .table-hover .table-secondary:hover {
+ background-color: #cfd2d6;
+}
+.bodywebsite .table-hover .table-secondary:hover > td,
+.bodywebsite .table-hover .table-secondary:hover > th {
+ background-color: #cfd2d6;
+}
+.bodywebsite .table-success,
+.bodywebsite .table-success > th,
+.bodywebsite .table-success > td {
+ background-color: #c3e6cb;
+}
+.bodywebsite .table-hover .table-success:hover {
+ background-color: #b1dfbb;
+}
+.bodywebsite .table-hover .table-success:hover > td,
+.bodywebsite .table-hover .table-success:hover > th {
+ background-color: #b1dfbb;
+}
+.bodywebsite .table-info,
+.bodywebsite .table-info > th,
+.bodywebsite .table-info > td {
+ background-color: #bee5eb;
+}
+.bodywebsite .table-hover .table-info:hover {
+ background-color: #abdde5;
+}
+.bodywebsite .table-hover .table-info:hover > td,
+.bodywebsite .table-hover .table-info:hover > th {
+ background-color: #abdde5;
+}
+.bodywebsite .table-warning,
+.bodywebsite .table-warning > th,
+.bodywebsite .table-warning > td {
+ background-color: #ffeeba;
+}
+.bodywebsite .table-hover .table-warning:hover {
+ background-color: #ffe8a1;
+}
+.bodywebsite .table-hover .table-warning:hover > td,
+.bodywebsite .table-hover .table-warning:hover > th {
+ background-color: #ffe8a1;
+}
+.bodywebsite .table-danger,
+.bodywebsite .table-danger > th,
+.bodywebsite .table-danger > td {
+ background-color: #f5c6cb;
+}
+.bodywebsite .table-hover .table-danger:hover {
+ background-color: #f1b0b7;
+}
+.bodywebsite .table-hover .table-danger:hover > td,
+.bodywebsite .table-hover .table-danger:hover > th {
+ background-color: #f1b0b7;
+}
+.bodywebsite .table-light,
+.bodywebsite .table-light > th,
+.bodywebsite .table-light > td {
+ background-color: #fdfdfe;
+}
+.bodywebsite .table-hover .table-light:hover {
+ background-color: #ececf6;
+}
+.bodywebsite .table-hover .table-light:hover > td,
+.bodywebsite .table-hover .table-light:hover > th {
+ background-color: #ececf6;
+}
+.bodywebsite .table-dark,
+.bodywebsite .table-dark > th,
+.bodywebsite .table-dark > td {
+ background-color: #c6c8ca;
+}
+.bodywebsite .table-hover .table-dark:hover {
+ background-color: #b9bbbe;
+}
+.bodywebsite .table-hover .table-dark:hover > td,
+.bodywebsite .table-hover .table-dark:hover > th {
+ background-color: #b9bbbe;
+}
+.bodywebsite .table-active,
+.bodywebsite .table-active > th,
+.bodywebsite .table-active > td {
+ background-color: rgba(0, 0, 0, 0.075);
+}
+.bodywebsite .table-hover .table-active:hover {
+ background-color: rgba(0, 0, 0, 0.075);
+}
+.bodywebsite .table-hover .table-active:hover > td,
+.bodywebsite .table-hover .table-active:hover > th {
+ background-color: rgba(0, 0, 0, 0.075);
+}
+.bodywebsite .table .thead-dark th {
+ color: #fff;
+ background-color: #212529;
+ border-color: #32383e;
+}
+.bodywebsite .table .thead-light th {
+ color: #495057;
+ background-color: #e9ecef;
+ border-color: #d9d9d9;
+}
+.bodywebsite .table-dark {
+ color: #fff;
+ background-color: #212529;
+}
+.bodywebsite .table-dark th,
+.bodywebsite .table-dark td,
+.bodywebsite .table-dark thead th {
+ border-color: #32383e;
+}
+.bodywebsite .table-dark.table-bordered {
+ border: 0;
+}
+.bodywebsite .table-dark.table-striped tbody tr:nth-of-type(odd) {
+ background-color: rgba(255, 255, 255, 0.05);
+}
+.bodywebsite .table-dark.table-hover tbody tr:hover {
+ background-color: rgba(255, 255, 255, 0.075);
+}
+@media (max-width: 575px) {
+ .bodywebsite .table-responsive-sm {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ }
+ .bodywebsite .table-responsive-sm.table-bordered {
+ border: 0;
+ }
+}
+@media (max-width: 767px) {
+ .bodywebsite .table-responsive-md {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ }
+ .bodywebsite .table-responsive-md.table-bordered {
+ border: 0;
+ }
+}
+@media (max-width: 991px) {
+ .bodywebsite .table-responsive-lg {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ }
+ .bodywebsite .table-responsive-lg.table-bordered {
+ border: 0;
+ }
+}
+@media (max-width: 1199px) {
+ .bodywebsite .table-responsive-xl {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ }
+ .bodywebsite .table-responsive-xl.table-bordered {
+ border: 0;
+ }
+}
+@media (max-width: 1799px) {
+ .bodywebsite .table-responsive-xxl {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ }
+ .bodywebsite .table-responsive-xxl.table-bordered {
+ border: 0;
+ }
+}
+.bodywebsite .table-responsive {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+}
+.bodywebsite .table-responsive.table-bordered {
+ border: 0;
+}
+.bodywebsite .form-input {
+ display: block;
+ width: 100%;
+ padding: 11px 35px;
+ font-size: 14px;
+ line-height: 1.25;
+ background-image: none;
+ background-clip: padding-box;
+ border: 1px solid #ced4da;
+ border-radius: 0.25rem;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+}
+.bodywebsite .form-input::-ms-expand {
+ background-color: transparent;
+ border: 0;
+}
+.bodywebsite .form-input:focus {
+ color: #495057;
+ background-color: #fff;
+ border-color: #80bdff;
+ outline: none;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+}
+.bodywebsite .form-input::placeholder {
+ color: #868e96;
+ opacity: 1;
+}
+.bodywebsite .form-input:disabled,
+.bodywebsite .form-input[readonly] {
+ background-color: #e9ecef;
+ opacity: 1;
+}
+.bodywebsite select.form-input:not([size]):not([multiple]) {
+ height: calc(4.25rem);
+}
+.bodywebsite .form-input-file,
+.bodywebsite .form-input-range {
+ display: block;
+}
+.bodywebsite .col-form-label {
+ padding-top: calc(12px);
+ padding-bottom: calc(12px);
+ margin-bottom: 0;
+ line-height: 1.25;
+}
+.bodywebsite .col-form-label-lg {
+ padding-top: calc(13px);
+ padding-bottom: calc(13px);
+ font-size: 18px;
+ line-height: 1.5;
+}
+.bodywebsite .col-form-label-sm {
+ padding-top: calc(6px);
+ padding-bottom: calc(6px);
+ font-size: 12px;
+ line-height: 1.5;
+}
+.bodywebsite .col-form-legend {
+ padding-top: 11px;
+ padding-bottom: 11px;
+ margin-bottom: 0;
+ font-size: 14px;
+}
+.bodywebsite .form-input-plaintext {
+ padding-top: 11px;
+ padding-bottom: 11px;
+ margin-bottom: 0;
+ line-height: 1.25;
+ background-color: transparent;
+ border: solid transparent;
+ border-width: 1px 0;
+}
+.bodywebsite .form-input-plaintext.form-input-sm,
+.bodywebsite .input-group-sm > .form-input-plaintext.form-input,
+.bodywebsite .input-group-sm > .form-input-plaintext.input-group-addon,
+.bodywebsite .input-group-sm > .input-group-btn > .form-input-plaintext.btn,
+.bodywebsite .form-input-plaintext.form-input-lg,
+.bodywebsite .input-group-lg > .form-input-plaintext.form-input,
+.bodywebsite .input-group-lg > .form-input-plaintext.input-group-addon,
+.bodywebsite .input-group-lg > .input-group-btn > .form-input-plaintext.btn {
+ padding-right: 0;
+ padding-left: 0;
+}
+.bodywebsite .form-input-sm,
+.bodywebsite .input-group-sm > .form-input,
+.bodywebsite .input-group-sm > .input-group-addon,
+.bodywebsite .input-group-sm > .input-group-btn > .btn {
+ padding: 5px 25px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 0.2rem;
+}
+.bodywebsite select.form-input-sm:not([size]):not([multiple]),
+.bodywebsite .input-group-sm > select.form-input:not([size]):not([multiple]),
+.bodywebsite .input-group-sm > select.input-group-addon:not([size]):not([multiple]),
+.bodywebsite .input-group-sm > .input-group-btn > select.btn:not([size]):not([multiple]) {
+ height: calc(3.8125rem);
+}
+.bodywebsite .form-input-lg,
+.bodywebsite .input-group-lg > .form-input,
+.bodywebsite .input-group-lg > .input-group-addon,
+.bodywebsite .input-group-lg > .input-group-btn > .btn {
+ padding: 12px 50px;
+ font-size: 18px;
+ line-height: 1.5;
+ border-radius: 0.3rem;
+}
+.bodywebsite select.form-input-lg:not([size]):not([multiple]),
+.bodywebsite .input-group-lg > select.form-input:not([size]):not([multiple]),
+.bodywebsite .input-group-lg > select.input-group-addon:not([size]):not([multiple]),
+.bodywebsite .input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) {
+ height: calc(4.875rem);
+}
+.bodywebsite .form-label {
+ margin-bottom: 1rem;
+}
+.bodywebsite .form-text {
+ display: block;
+ margin-top: 0.25rem;
+}
+.bodywebsite .form-row {
+ display: flex;
+ flex-wrap: wrap;
+ margin-right: -5px;
+ margin-left: -5px;
+}
+.bodywebsite .form-row > .col,
+.bodywebsite .form-row > [class*="col-"] {
+ padding-right: 5px;
+ padding-left: 5px;
+}
+.bodywebsite .form-check {
+ position: relative;
+ display: block;
+ margin-bottom: 0.5rem;
+}
+.bodywebsite .form-check.disabled .form-check-label {
+ color: #dedede;
+}
+.bodywebsite .form-check-label {
+ padding-left: 1.25rem;
+ margin-bottom: 0;
+}
+.bodywebsite .form-check-input {
+ position: absolute;
+ margin-top: 0.25rem;
+ margin-left: -1.25rem;
+}
+.bodywebsite .form-check-inline {
+ display: inline-block;
+ margin-right: 0.75rem;
+}
+.bodywebsite .form-check-inline .form-check-label {
+ vertical-align: middle;
+}
+.bodywebsite .was-validated .form-input:valid,
+.bodywebsite .form-input.is-valid,
+.bodywebsite .was-validated .custom-select:valid,
+.bodywebsite .custom-select.is-valid {
+ border-color: #98bf44;
+}
+.bodywebsite .was-validated .form-input:valid:focus,
+.bodywebsite .form-input.is-valid:focus,
+.bodywebsite .was-validated .custom-select:valid:focus,
+.bodywebsite .custom-select.is-valid:focus {
+ box-shadow: 0 0 0 0.2rem rgba(152, 191, 68, 0.25);
+}
+.bodywebsite .was-validated .form-check-input:valid + .form-check-label,
+.bodywebsite .form-check-input.is-valid + .form-check-label {
+ color: #98bf44;
+}
+.bodywebsite .was-validated .custom-control-input:valid ~ .custom-control-indicator,
+.bodywebsite .custom-control-input.is-valid ~ .custom-control-indicator {
+ background-color: rgba(152, 191, 68, 0.25);
+}
+.bodywebsite .was-validated .custom-control-input:valid ~ .custom-control-description,
+.bodywebsite .custom-control-input.is-valid ~ .custom-control-description {
+ color: #98bf44;
+}
+.bodywebsite .was-validated .custom-file-input:valid ~ .custom-file-control,
+.bodywebsite .custom-file-input.is-valid ~ .custom-file-control {
+ border-color: #98bf44;
+}
+.bodywebsite .was-validated .custom-file-input:valid ~ .custom-file-control::before,
+.bodywebsite .custom-file-input.is-valid ~ .custom-file-control::before {
+ border-color: inherit;
+}
+.bodywebsite .was-validated .custom-file-input:valid:focus,
+.bodywebsite .custom-file-input.is-valid:focus {
+ box-shadow: 0 0 0 0.2rem rgba(152, 191, 68, 0.25);
+}
+.bodywebsite .was-validated .form-input:invalid,
+.bodywebsite .form-input.is-invalid,
+.bodywebsite .was-validated .custom-select:invalid,
+.bodywebsite .custom-select.is-invalid {
+ border-color: #f5543f;
+}
+.bodywebsite .was-validated .form-input:invalid:focus,
+.bodywebsite .form-input.is-invalid:focus,
+.bodywebsite .was-validated .custom-select:invalid:focus,
+.bodywebsite .custom-select.is-invalid:focus {
+ box-shadow: 0 0 0 0.2rem rgba(245, 84, 63, 0.25);
+}
+.bodywebsite .was-validated .form-check-input:invalid + .form-check-label,
+.bodywebsite .form-check-input.is-invalid + .form-check-label {
+ color: #f5543f;
+}
+.bodywebsite .was-validated .custom-control-input:invalid ~ .custom-control-indicator,
+.bodywebsite .custom-control-input.is-invalid ~ .custom-control-indicator {
+ background-color: rgba(245, 84, 63, 0.25);
+}
+.bodywebsite .was-validated .custom-control-input:invalid ~ .custom-control-description,
+.bodywebsite .custom-control-input.is-invalid ~ .custom-control-description {
+ color: #f5543f;
+}
+.bodywebsite .was-validated .custom-file-input:invalid ~ .custom-file-control,
+.bodywebsite .custom-file-input.is-invalid ~ .custom-file-control {
+ border-color: #f5543f;
+}
+.bodywebsite .was-validated .custom-file-input:invalid ~ .custom-file-control::before,
+.bodywebsite .custom-file-input.is-invalid ~ .custom-file-control::before {
+ border-color: inherit;
+}
+.bodywebsite .was-validated .custom-file-input:invalid:focus,
+.bodywebsite .custom-file-input.is-invalid:focus {
+ box-shadow: 0 0 0 0.2rem rgba(245, 84, 63, 0.25);
+}
+.bodywebsite .form-inline {
+ display: flex;
+ flex-flow: row wrap;
+ align-items: center;
+}
+.bodywebsite .form-inline .form-check {
+ width: 100%;
+}
+@media (min-width: 576px) {
+ .bodywebsite .form-inline label {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-bottom: 0;
+ }
+ .bodywebsite .form-inline .form-label {
+ display: flex;
+ flex: 0 0 auto;
+ flex-flow: row wrap;
+ align-items: center;
+ margin-bottom: 0;
+ }
+ .bodywebsite .form-inline .form-input {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+ }
+ .bodywebsite .form-inline .form-input-plaintext {
+ display: inline-block;
+ }
+ .bodywebsite .form-inline .input-group {
+ width: auto;
+ }
+ .bodywebsite .form-inline .form-check {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: auto;
+ margin-top: 0;
+ margin-bottom: 0;
+ }
+ .bodywebsite .form-inline .form-check-label {
+ padding-left: 0;
+ }
+ .bodywebsite .form-inline .form-check-input {
+ position: relative;
+ margin-top: 0;
+ margin-right: 0.25rem;
+ margin-left: 0;
+ }
+ .bodywebsite .form-inline .custom-control {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding-left: 0;
+ }
+ .bodywebsite .form-inline .custom-control-indicator {
+ position: static;
+ display: inline-block;
+ margin-right: 0.25rem;
+ vertical-align: text-bottom;
+ }
+ .bodywebsite .form-inline .has-feedback .form-input-feedback {
+ top: 0;
+ }
+}
+.bodywebsite .btn {
+ display: inline-block;
+ font-weight: 700;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: middle;
+ user-select: none;
+ border: 1px solid transparent;
+ padding: 11px 35px;
+ font-size: 14px;
+ line-height: 1.25;
+ border-radius: 5px;
+ transition: all 0.15s ease-in-out;
+}
+.bodywebsite .btn:focus,
+.bodywebsite .btn:hover {
+ text-decoration: none;
+}
+.bodywebsite .btn:focus,
+.bodywebsite .btn.focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+}
+.bodywebsite .btn.disabled,
+.bodywebsite .btn:disabled {
+ opacity: .65;
+ box-shadow: none;
+}
+.bodywebsite .btn:not([disabled]):not(.disabled):active,
+.bodywebsite .btn:not([disabled]):not(.disabled).active {
+ background-image: none;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25), 0;
+}
+.bodywebsite a.btn.disabled,
+.bodywebsite fieldset[disabled] a.btn {
+ pointer-events: none;
+}
+.bodywebsite .btn-primary {
+ color: #fff;
+ background-color: #007bff;
+ border-color: #007bff;
+ box-shadow: 0;
+}
+.bodywebsite .btn-primary:focus,
+.bodywebsite .btn-primary.focus {
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);
+}
+.bodywebsite .btn-primary.maincolorbisbackground:focus,
+.bodywebsite .btn-primary.maincolorbisbackground.focus {
+ box-shadow: 0 0 0 0.2rem rgba(0, 255, 123, 0.5);
+}
+.bodywebsite .btn-primary.maincolorbisbackground:hover {
+ box-shadow: 1px 1px 8px #aaa;
+}
+.bodywebsite .btn-primary.disabled,
+.bodywebsite .btn-primary:disabled {
+ background-color: #007bff;
+ border-color: #007bff;
+}
+.bodywebsite .btn-primary:not([disabled]):not(.disabled):active,
+.bodywebsite .btn-primary:not([disabled]):not(.disabled).active,
+.bodywebsite .show > .btn-primary.dropdown-toggle {
+ color: #fff;
+ background-color: #0062cc;
+ border-color: #005cbf;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);
+}
+.bodywebsite .btn-secondary {
+ color: #fff;
+ background-color: #868e96;
+ border-color: #868e96;
+ box-shadow: 0;
+}
+.bodywebsite .btn-secondary:hover {
+ color: #fff;
+ background-color: #727b84;
+ border-color: #6c757d;
+}
+.bodywebsite .btn-secondary:focus,
+.bodywebsite .btn-secondary.focus {
+ box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5);
+}
+.bodywebsite .btn-secondary.disabled,
+.bodywebsite .btn-secondary:disabled {
+ background-color: #868e96;
+ border-color: #868e96;
+}
+.bodywebsite .btn-secondary:not([disabled]):not(.disabled):active,
+.bodywebsite .btn-secondary:not([disabled]):not(.disabled).active,
+.bodywebsite .show > .btn-secondary.dropdown-toggle {
+ color: #fff;
+ background-color: #6c757d;
+ border-color: #666e76;
+ box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5);
+}
+.bodywebsite .btn-success {
+ color: #fff;
+ background-color: #28a745;
+ border-color: #28a745;
+ box-shadow: 0;
+}
+.bodywebsite .btn-success:hover {
+ color: #fff;
+ background-color: #218838;
+ border-color: #1e7e34;
+}
+.bodywebsite .btn-success:focus,
+.bodywebsite .btn-success.focus {
+ box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
+}
+.bodywebsite .btn-success.disabled,
+.bodywebsite .btn-success:disabled {
+ background-color: #28a745;
+ border-color: #28a745;
+}
+.bodywebsite .btn-success:not([disabled]):not(.disabled):active,
+.bodywebsite .btn-success:not([disabled]):not(.disabled).active,
+.bodywebsite .show > .btn-success.dropdown-toggle {
+ color: #fff;
+ background-color: #1e7e34;
+ border-color: #1c7430;
+ box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
+}
+.bodywebsite .btn-info {
+ color: #fff;
+ background-color: #17a2b8;
+ border-color: #17a2b8;
+ box-shadow: 0;
+}
+.bodywebsite .btn-info:hover {
+ color: #fff;
+ background-color: #138496;
+ border-color: #117a8b;
+}
+.bodywebsite .btn-info:focus,
+.bodywebsite .btn-info.focus {
+ box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
+}
+.bodywebsite .btn-info.disabled,
+.bodywebsite .btn-info:disabled {
+ background-color: #17a2b8;
+ border-color: #17a2b8;
+}
+.bodywebsite .btn-info:not([disabled]):not(.disabled):active,
+.bodywebsite .btn-info:not([disabled]):not(.disabled).active,
+.bodywebsite .show > .btn-info.dropdown-toggle {
+ color: #fff;
+ background-color: #117a8b;
+ border-color: #10707f;
+ box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
+}
+.bodywebsite .btn-warning {
+ color: #111;
+ background-color: #ffc107;
+ border-color: #ffc107;
+ box-shadow: 0;
+}
+.bodywebsite .btn-warning:hover {
+ color: #111;
+ background-color: #e0a800;
+ border-color: #d39e00;
+}
+.bodywebsite .btn-warning:focus,
+.bodywebsite .btn-warning.focus {
+ box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
+}
+.bodywebsite .btn-warning.disabled,
+.bodywebsite .btn-warning:disabled {
+ background-color: #ffc107;
+ border-color: #ffc107;
+}
+.bodywebsite .btn-warning:not([disabled]):not(.disabled):active,
+.bodywebsite .btn-warning:not([disabled]):not(.disabled).active,
+.bodywebsite .show > .btn-warning.dropdown-toggle {
+ color: #111;
+ background-color: #d39e00;
+ border-color: #c69500;
+ box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
+}
+.bodywebsite .btn-danger {
+ color: #fff;
+ background-color: #dc3545;
+ border-color: #dc3545;
+ box-shadow: 0;
+}
+.bodywebsite .btn-danger:hover {
+ color: #fff;
+ background-color: #c82333;
+ border-color: #bd2130;
+}
+.bodywebsite .btn-danger:focus,
+.bodywebsite .btn-danger.focus {
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
+}
+.bodywebsite .btn-danger.disabled,
+.bodywebsite .btn-danger:disabled {
+ background-color: #dc3545;
+ border-color: #dc3545;
+}
+.bodywebsite .btn-danger:not([disabled]):not(.disabled):active,
+.bodywebsite .btn-danger:not([disabled]):not(.disabled).active,
+.bodywebsite .show > .btn-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #bd2130;
+ border-color: #b21f2d;
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
+}
+.bodywebsite .btn-light {
+ color: #111;
+ background-color: #f8f9fa;
+ border-color: #f8f9fa;
+ box-shadow: 0;
+}
+.bodywebsite .btn-light:hover {
+ color: #111;
+ background-color: #e2e6ea;
+ border-color: #dae0e5;
+}
+.bodywebsite .btn-light:focus,
+.bodywebsite .btn-light.focus {
+ box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
+}
+.bodywebsite .btn-light.disabled,
+.bodywebsite .btn-light:disabled {
+ background-color: #f8f9fa;
+ border-color: #f8f9fa;
+}
+.bodywebsite .btn-light:not([disabled]):not(.disabled):active,
+.bodywebsite .btn-light:not([disabled]):not(.disabled).active,
+.bodywebsite .show > .btn-light.dropdown-toggle {
+ color: #111;
+ background-color: #dae0e5;
+ border-color: #d3d9df;
+ box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
+}
+.bodywebsite .btn-dark {
+ color: #fff;
+ background-color: #343a40;
+ border-color: #343a40;
+ box-shadow: 0;
+}
+.bodywebsite .btn-dark:hover {
+ color: #fff;
+ background-color: #23272b;
+ border-color: #1d2124;
+}
+.bodywebsite .btn-dark:focus,
+.bodywebsite .btn-dark.focus {
+ box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
+}
+.bodywebsite .btn-dark.disabled,
+.bodywebsite .btn-dark:disabled {
+ background-color: #343a40;
+ border-color: #343a40;
+}
+.bodywebsite .btn-dark:not([disabled]):not(.disabled):active,
+.bodywebsite .btn-dark:not([disabled]):not(.disabled).active,
+.bodywebsite .show > .btn-dark.dropdown-toggle {
+ color: #fff;
+ background-color: #1d2124;
+ border-color: #171a1d;
+ box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
+}
+.bodywebsite .btn-outline-primary {
+ color: #007bff;
+ background-color: transparent;
+ background-image: none;
+ border-color: #007bff;
+}
+.bodywebsite .btn-outline-primary:hover {
+ color: #fff;
+ background-color: #007bff;
+ border-color: #007bff;
+}
+.bodywebsite .btn-outline-primary:focus,
+.bodywebsite .btn-outline-primary.focus {
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);
+}
+.bodywebsite .btn-outline-primary.disabled,
+.bodywebsite .btn-outline-primary:disabled {
+ color: #007bff;
+ background-color: transparent;
+}
+.bodywebsite .btn-outline-primary:not([disabled]):not(.disabled):active,
+.bodywebsite .btn-outline-primary:not([disabled]):not(.disabled).active,
+.bodywebsite .show > .btn-outline-primary.dropdown-toggle {
+ color: #fff;
+ background-color: #007bff;
+ border-color: #007bff;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);
+}
+.bodywebsite .btn-outline-secondary {
+ color: #868e96;
+ background-color: transparent;
+ background-image: none;
+ border-color: #868e96;
+}
+.bodywebsite .btn-outline-secondary:hover {
+ color: #fff;
+ background-color: #868e96;
+ border-color: #868e96;
+}
+.bodywebsite .btn-outline-secondary:focus,
+.bodywebsite .btn-outline-secondary.focus {
+ box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5);
+}
+.bodywebsite .btn-outline-secondary.disabled,
+.bodywebsite .btn-outline-secondary:disabled {
+ color: #868e96;
+ background-color: transparent;
+}
+.bodywebsite .btn-outline-secondary:not([disabled]):not(.disabled):active,
+.bodywebsite .btn-outline-secondary:not([disabled]):not(.disabled).active,
+.bodywebsite .show > .btn-outline-secondary.dropdown-toggle {
+ color: #fff;
+ background-color: #868e96;
+ border-color: #868e96;
+ box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5);
+}
+.bodywebsite .btn-outline-success {
+ color: #28a745;
+ background-color: transparent;
+ background-image: none;
+ border-color: #28a745;
+}
+.bodywebsite .btn-outline-success:hover {
+ color: #fff;
+ background-color: #28a745;
+ border-color: #28a745;
+}
+.bodywebsite .btn-outline-success:focus,
+.bodywebsite .btn-outline-success.focus {
+ box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
+}
+.bodywebsite .btn-outline-success.disabled,
+.bodywebsite .btn-outline-success:disabled {
+ color: #28a745;
+ background-color: transparent;
+}
+.bodywebsite .btn-outline-success:not([disabled]):not(.disabled):active,
+.bodywebsite .btn-outline-success:not([disabled]):not(.disabled).active,
+.bodywebsite .show > .btn-outline-success.dropdown-toggle {
+ color: #fff;
+ background-color: #28a745;
+ border-color: #28a745;
+ box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
+}
+.bodywebsite .btn-outline-info {
+ color: #17a2b8;
+ background-color: transparent;
+ background-image: none;
+ border-color: #17a2b8;
+}
+.bodywebsite .btn-outline-info:hover {
+ color: #fff;
+ background-color: #17a2b8;
+ border-color: #17a2b8;
+}
+.bodywebsite .btn-outline-info:focus,
+.bodywebsite .btn-outline-info.focus {
+ box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
+}
+.bodywebsite .btn-outline-info.disabled,
+.bodywebsite .btn-outline-info:disabled {
+ color: #17a2b8;
+ background-color: transparent;
+}
+.bodywebsite .btn-outline-info:not([disabled]):not(.disabled):active,
+.bodywebsite .btn-outline-info:not([disabled]):not(.disabled).active,
+.bodywebsite .show > .btn-outline-info.dropdown-toggle {
+ color: #fff;
+ background-color: #17a2b8;
+ border-color: #17a2b8;
+ box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
+}
+.bodywebsite .btn-outline-warning {
+ color: #ffc107;
+ background-color: transparent;
+ background-image: none;
+ border-color: #ffc107;
+}
+.bodywebsite .btn-outline-warning:hover {
+ color: #fff;
+ background-color: #ffc107;
+ border-color: #ffc107;
+}
+.bodywebsite .btn-outline-warning:focus,
+.bodywebsite .btn-outline-warning.focus {
+ box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
+}
+.bodywebsite .btn-outline-warning.disabled,
+.bodywebsite .btn-outline-warning:disabled {
+ color: #ffc107;
+ background-color: transparent;
+}
+.bodywebsite .btn-outline-warning:not([disabled]):not(.disabled):active,
+.bodywebsite .btn-outline-warning:not([disabled]):not(.disabled).active,
+.bodywebsite .show > .btn-outline-warning.dropdown-toggle {
+ color: #fff;
+ background-color: #ffc107;
+ border-color: #ffc107;
+ box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
+}
+.bodywebsite .btn-outline-danger {
+ color: #dc3545;
+ background-color: transparent;
+ background-image: none;
+ border-color: #dc3545;
+}
+.bodywebsite .btn-outline-danger:hover {
+ color: #fff;
+ background-color: #dc3545;
+ border-color: #dc3545;
+}
+.bodywebsite .btn-outline-danger:focus,
+.bodywebsite .btn-outline-danger.focus {
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
+}
+.bodywebsite .btn-outline-danger.disabled,
+.bodywebsite .btn-outline-danger:disabled {
+ color: #dc3545;
+ background-color: transparent;
+}
+.bodywebsite .btn-outline-danger:not([disabled]):not(.disabled):active,
+.bodywebsite .btn-outline-danger:not([disabled]):not(.disabled).active,
+.bodywebsite .show > .btn-outline-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #dc3545;
+ border-color: #dc3545;
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
+}
+.bodywebsite .btn-outline-light {
+ color: #f8f9fa;
+ background-color: transparent;
+ background-image: none;
+ border-color: #f8f9fa;
+}
+.bodywebsite .btn-outline-light:hover {
+ color: #00030a;
+ background-color: #f8f9fa;
+ border-color: #f8f9fa;
+}
+.bodywebsite .btn-outline-light:focus,
+.bodywebsite .btn-outline-light.focus {
+ box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
+}
+.bodywebsite .btn-outline-light.disabled,
+.bodywebsite .btn-outline-light:disabled {
+ color: #f8f9fa;
+ background-color: transparent;
+}
+.bodywebsite .btn-outline-light:not([disabled]):not(.disabled):active,
+.bodywebsite .btn-outline-light:not([disabled]):not(.disabled).active,
+.bodywebsite .show > .btn-outline-light.dropdown-toggle {
+ color: #00030a;
+ background-color: #f8f9fa;
+ border-color: #f8f9fa;
+ box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
+}
+.bodywebsite .btn-outline-dark {
+ color: #343a40;
+ background-color: transparent;
+ background-image: none;
+ border-color: #343a40;
+}
+.bodywebsite .btn-outline-dark:hover {
+ color: #fff;
+ background-color: #343a40;
+ border-color: #343a40;
+}
+.bodywebsite .btn-outline-dark:focus,
+.bodywebsite .btn-outline-dark.focus {
+ box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
+}
+.bodywebsite .btn-outline-dark.disabled,
+.bodywebsite .btn-outline-dark:disabled {
+ color: #343a40;
+ background-color: transparent;
+}
+.bodywebsite .btn-outline-dark:not([disabled]):not(.disabled):active,
+.bodywebsite .btn-outline-dark:not([disabled]):not(.disabled).active,
+.bodywebsite .show > .btn-outline-dark.dropdown-toggle {
+ color: #fff;
+ background-color: #343a40;
+ border-color: #343a40;
+ box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
+}
+.bodywebsite .btn-link {
+ font-weight: 400;
+ color: #37c386;
+ background-color: transparent;
+}
+.bodywebsite .btn-link:hover {
+ color: #26875d;
+ text-decoration: none;
+ background-color: transparent;
+ border-color: transparent;
+}
+.bodywebsite .btn-link:focus,
+.bodywebsite .btn-link.focus {
+ border-color: transparent;
+ box-shadow: none;
+}
+.bodywebsite .btn-link:disabled,
+.bodywebsite .btn-link.disabled {
+ color: #dedede;
+}
+.bodywebsite .btn-lg,
+.bodywebsite .btn-group-lg > .btn {
+ padding: 12px 50px;
+ font-size: 18px;
+ line-height: 1.5;
+ border-radius: 6px;
+}
+.bodywebsite .btn-sm,
+.bodywebsite .btn-group-sm > .btn {
+ padding: 5px 25px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+.bodywebsite .btn-block {
+ display: block;
+ width: 100%;
+}
+.bodywebsite .btn-block + .btn-block {
+ margin-top: 0.5rem;
+}
+.bodywebsite input[type="submit"].btn-block,
+.bodywebsite input[type="reset"].btn-block,
+.bodywebsite input[type="button"].btn-block {
+ width: 100%;
+}
+.bodywebsite .fade {
+ opacity: 0;
+ transition: opacity 0.15s linear;
+}
+.bodywebsite .fade.show {
+ opacity: 1;
+}
+.bodywebsite .collapse {
+ display: none;
+}
+.bodywebsite .collapse.show {
+ display: block;
+}
+.bodywebsite tr.collapse.show {
+ display: table-row;
+}
+.bodywebsite tbody.collapse.show {
+ display: table-row-group;
+}
+.bodywebsite .collapsing {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ transition: height 0.35s ease;
+}
+.bodywebsite .dropup,
+.bodywebsite .dropdown {
+ position: relative;
+}
+.bodywebsite .dropdown-toggle::after {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0;
+ border-left: 0.3em solid transparent;
+}
+.bodywebsite .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+.bodywebsite .dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 10rem;
+ padding: 0.5rem 0;
+ margin: 0.125rem 0 0;
+ font-size: 14px;
+ text-align: left;
+ list-style: none;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0;
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.175);
+}
+.bodywebsite .dropup .dropdown-menu {
+ margin-top: 0;
+ margin-bottom: 0.125rem;
+}
+.bodywebsite .dropup .dropdown-toggle::after {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0.3em solid;
+ border-left: 0.3em solid transparent;
+}
+.bodywebsite .dropup .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+.bodywebsite .dropdown-divider {
+ height: 0;
+ margin: 0.5rem 0;
+ overflow: hidden;
+ border-top: 1px solid #e5e5e5;
+}
+.bodywebsite .dropdown-item {
+ display: block;
+ width: 100%;
+ padding: 0.25rem 1.5rem;
+ clear: both;
+ font-weight: 400;
+ color: #2a2b2b;
+ text-align: inherit;
+ white-space: nowrap;
+ background: none;
+ border: 0;
+}
+.bodywebsite .dropdown-item:focus,
+.bodywebsite .dropdown-item:hover {
+ color: #1d1e1e;
+ text-decoration: none;
+ background-color: #f5f5f5;
+}
+.bodywebsite .dropdown-item.active,
+.bodywebsite .dropdown-item:active {
+ color: #2a2b2b;
+ text-decoration: none;
+ background-color: #37c386;
+}
+.bodywebsite .dropdown-item.disabled,
+.bodywebsite .dropdown-item:disabled {
+ color: #dedede;
+ background-color: transparent;
+}
+.bodywebsite .dropdown-menu.show {
+ display: block;
+}
+.bodywebsite .dropdown-header {
+ display: block;
+ padding: 0.5rem 1.5rem;
+ margin-bottom: 0;
+ font-size: 12px;
+ color: #dedede;
+ white-space: nowrap;
+}
+.bodywebsite .btn-group,
+.bodywebsite .btn-group-vertical {
+ position: relative;
+ display: inline-flex;
+ vertical-align: middle;
+}
+.bodywebsite .btn-group > .btn,
+.bodywebsite .btn-group-vertical > .btn {
+ position: relative;
+ flex: 0 1 auto;
+}
+.bodywebsite .btn-group > .btn:hover,
+.bodywebsite .btn-group-vertical > .btn:hover {
+ z-index: 2;
+}
+.bodywebsite .btn-group > .btn:focus,
+.bodywebsite .btn-group > .btn:active,
+.bodywebsite .btn-group > .btn.active,
+.bodywebsite .btn-group-vertical > .btn:focus,
+.bodywebsite .btn-group-vertical > .btn:active,
+.bodywebsite .btn-group-vertical > .btn.active {
+ z-index: 2;
+}
+.bodywebsite .btn-group .btn + .btn,
+.bodywebsite .btn-group .btn + .btn-group,
+.bodywebsite .btn-group .btn-group + .btn,
+.bodywebsite .btn-group .btn-group + .btn-group,
+.bodywebsite .btn-group-vertical .btn + .btn,
+.bodywebsite .btn-group-vertical .btn + .btn-group,
+.bodywebsite .btn-group-vertical .btn-group + .btn,
+.bodywebsite .btn-group-vertical .btn-group + .btn-group {
+ margin-left: -1px;
+}
+.bodywebsite .btn-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+}
+.bodywebsite .btn-toolbar .input-group {
+ width: auto;
+}
+.bodywebsite .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+ border-radius: 0;
+}
+.bodywebsite .btn-group > .btn:first-child {
+ margin-left: 0;
+}
+.bodywebsite .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.bodywebsite .btn-group > .btn:last-child:not(:first-child),
+.bodywebsite .btn-group > .dropdown-toggle:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.bodywebsite .btn-group > .btn-group {
+ float: left;
+}
+.bodywebsite .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+.bodywebsite .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.bodywebsite .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.bodywebsite .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.bodywebsite .btn + .dropdown-toggle-split {
+ padding-right: 26.25px;
+ padding-left: 26.25px;
+}
+.bodywebsite .btn + .dropdown-toggle-split::after {
+ margin-left: 0;
+}
+.bodywebsite .btn-sm + .dropdown-toggle-split,
+.bodywebsite .btn-group-sm > .btn + .dropdown-toggle-split {
+ padding-right: 18.75px;
+ padding-left: 18.75px;
+}
+.bodywebsite .btn-lg + .dropdown-toggle-split,
+.bodywebsite .btn-group-lg > .btn + .dropdown-toggle-split {
+ padding-right: 37.5px;
+ padding-left: 37.5px;
+}
+.bodywebsite .btn-group.show .dropdown-toggle {
+ box-shadow: 0;
+}
+.bodywebsite .btn-group.show .dropdown-toggle.btn-link {
+ box-shadow: none;
+}
+.bodywebsite .btn-group-vertical {
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+}
+.bodywebsite .btn-group-vertical .btn,
+.bodywebsite .btn-group-vertical .btn-group {
+ width: 100%;
+}
+.bodywebsite .btn-group-vertical > .btn + .btn,
+.bodywebsite .btn-group-vertical > .btn + .btn-group,
+.bodywebsite .btn-group-vertical > .btn-group + .btn,
+.bodywebsite .btn-group-vertical > .btn-group + .btn-group {
+ margin-top: -1px;
+ margin-left: 0;
+}
+.bodywebsite .btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+ border-radius: 0;
+}
+.bodywebsite .btn-group-vertical > .btn:first-child:not(:last-child) {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.bodywebsite .btn-group-vertical > .btn:last-child:not(:first-child) {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.bodywebsite .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+.bodywebsite .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.bodywebsite .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.bodywebsite .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.bodywebsite [data-toggle="buttons"] > .btn input[type="radio"],
+.bodywebsite [data-toggle="buttons"] > .btn input[type="checkbox"],
+.bodywebsite [data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
+.bodywebsite [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none;
+}
+.bodywebsite .input-group {
+ position: relative;
+ display: flex;
+ align-items: stretch;
+ width: 100%;
+}
+.bodywebsite .input-group .form-input {
+ position: relative;
+ z-index: 2;
+ flex: 1 1 auto;
+ width: 1%;
+ margin-bottom: 0;
+}
+.bodywebsite .input-group .form-input:focus,
+.bodywebsite .input-group .form-input:active,
+.bodywebsite .input-group .form-input:hover {
+ z-index: 3;
+}
+.bodywebsite .input-group-addon,
+.bodywebsite .input-group-btn,
+.bodywebsite .input-group .form-input {
+ display: flex;
+ align-items: center;
+}
+.bodywebsite .input-group-addon:not(:first-child):not(:last-child),
+.bodywebsite .input-group-btn:not(:first-child):not(:last-child),
+.bodywebsite .input-group .form-input:not(:first-child):not(:last-child) {
+ border-radius: 0;
+}
+.bodywebsite .input-group-addon,
+.bodywebsite .input-group-btn {
+ white-space: nowrap;
+}
+.bodywebsite .input-group-addon {
+ padding: 11px 35px;
+ margin-bottom: 0;
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 1.25;
+ color: #495057;
+ text-align: center;
+ background-color: #e9ecef;
+ border: 1px solid #ced4da;
+ border-radius: 0.25rem;
+}
+.bodywebsite .input-group-addon.form-input-sm,
+.bodywebsite .input-group-sm > .input-group-addon,
+.bodywebsite .input-group-sm > .input-group-btn > .input-group-addon.btn {
+ padding: 5px 25px;
+ font-size: 12px;
+ border-radius: 0.2rem;
+}
+.bodywebsite .input-group-addon.form-input-lg,
+.bodywebsite .input-group-lg > .input-group-addon,
+.bodywebsite .input-group-lg > .input-group-btn > .input-group-addon.btn {
+ padding: 12px 50px;
+ font-size: 18px;
+ border-radius: 0.3rem;
+}
+.bodywebsite .input-group-addon input[type="radio"],
+.bodywebsite .input-group-addon input[type="checkbox"] {
+ margin-top: 0;
+}
+.bodywebsite .input-group .form-input:not(:last-child),
+.bodywebsite .input-group-addon:not(:last-child),
+.bodywebsite .input-group-btn:not(:last-child) > .btn,
+.bodywebsite .input-group-btn:not(:last-child) > .btn-group > .btn,
+.bodywebsite .input-group-btn:not(:last-child) > .dropdown-toggle,
+.bodywebsite .input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle),
+.bodywebsite .input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.bodywebsite .input-group-addon:not(:last-child) {
+ border-right: 0;
+}
+.bodywebsite .input-group .form-input:not(:first-child),
+.bodywebsite .input-group-addon:not(:first-child),
+.bodywebsite .input-group-btn:not(:first-child) > .btn,
+.bodywebsite .input-group-btn:not(:first-child) > .btn-group > .btn,
+.bodywebsite .input-group-btn:not(:first-child) > .dropdown-toggle,
+.bodywebsite .input-group-btn:not(:last-child) > .btn:not(:first-child),
+.bodywebsite .input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.bodywebsite .form-input + .input-group-addon:not(:first-child) {
+ border-left: 0;
+}
+.bodywebsite .input-group-btn {
+ position: relative;
+ align-items: stretch;
+ font-size: 0;
+ white-space: nowrap;
+}
+.bodywebsite .input-group-btn > .btn {
+ position: relative;
+}
+.bodywebsite .input-group-btn > .btn + .btn {
+ margin-left: -1px;
+}
+.bodywebsite .input-group-btn > .btn:focus,
+.bodywebsite .input-group-btn > .btn:active,
+.bodywebsite .input-group-btn > .btn:hover {
+ z-index: 3;
+}
+.bodywebsite .input-group-btn:first-child > .btn + .btn {
+ margin-left: 0;
+}
+.bodywebsite .input-group-btn:not(:last-child) > .btn,
+.bodywebsite .input-group-btn:not(:last-child) > .btn-group {
+ margin-right: -1px;
+}
+.bodywebsite .input-group-btn:not(:first-child) > .btn,
+.bodywebsite .input-group-btn:not(:first-child) > .btn-group {
+ z-index: 2;
+ margin-left: 0;
+}
+.bodywebsite .input-group-btn:not(:first-child) > .btn:first-child,
+.bodywebsite .input-group-btn:not(:first-child) > .btn-group:first-child {
+ margin-left: -1px;
+}
+.bodywebsite .input-group-btn:not(:first-child) > .btn:focus,
+.bodywebsite .input-group-btn:not(:first-child) > .btn:active,
+.bodywebsite .input-group-btn:not(:first-child) > .btn:hover,
+.bodywebsite .input-group-btn:not(:first-child) > .btn-group:focus,
+.bodywebsite .input-group-btn:not(:first-child) > .btn-group:active,
+.bodywebsite .input-group-btn:not(:first-child) > .btn-group:hover {
+ z-index: 3;
+}
+.bodywebsite .custom-control {
+ position: relative;
+ display: inline-flex;
+ min-height: 1.71429rem;
+ padding-left: 1.5rem;
+ margin-right: 1rem;
+}
+.bodywebsite .custom-control-input {
+ position: absolute;
+ z-index: -1;
+ opacity: 0;
+}
+.bodywebsite .custom-control-input:checked ~ .custom-control-indicator {
+ color: #fff;
+ background-color: #007bff;
+ box-shadow: none;
+}
+.bodywebsite .custom-control-input:focus ~ .custom-control-indicator {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+}
+.bodywebsite .custom-control-input:active ~ .custom-control-indicator {
+ color: #fff;
+ background-color: #b3d7ff;
+ box-shadow: none;
+}
+.bodywebsite .custom-control-input:disabled ~ .custom-control-indicator {
+ background-color: #e9ecef;
+}
+.bodywebsite .custom-control-input:disabled ~ .custom-control-description {
+ color: #868e96;
+}
+.bodywebsite .custom-control-indicator {
+ position: absolute;
+ top: 0.35714rem;
+ left: 0;
+ display: block;
+ width: 1rem;
+ height: 1rem;
+ pointer-events: none;
+ user-select: none;
+ background-color: #ddd;
+ background-repeat: no-repeat;
+ background-position: center center;
+ background-size: 50% 50%;
+ box-shadow: inset 0 0.25rem 0.25rem rgba(0, 0, 0, 0.1);
+}
+.bodywebsite .custom-checkbox .custom-control-indicator {
+ border-radius: 0.25rem;
+}
+.bodywebsite .custom-checkbox .custom-control-input:checked ~ .custom-control-indicator {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E");
+}
+.bodywebsite .custom-checkbox .custom-control-input:indeterminate ~ .custom-control-indicator {
+ background-color: #007bff;
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E");
+ box-shadow: none;
+}
+.bodywebsite .custom-radio .custom-control-indicator {
+ border-radius: 50%;
+}
+.bodywebsite .custom-radio .custom-control-input:checked ~ .custom-control-indicator {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E");
+}
+.bodywebsite .custom-controls-stacked {
+ display: flex;
+ flex-direction: column;
+}
+.bodywebsite .custom-controls-stacked .custom-control {
+ margin-bottom: 0.25rem;
+}
+.bodywebsite .custom-controls-stacked .custom-control + .custom-control {
+ margin-left: 0;
+}
+.bodywebsite .custom-select {
+ display: inline-block;
+ max-width: 100%;
+ height: calc(4.25rem);
+ padding: 0.375rem 1.75rem 0.375rem 0.75rem;
+ line-height: 1.5;
+ color: #495057;
+ vertical-align: middle;
+ background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center;
+ background-size: 8px 10px;
+ border: 1px solid #ced4da;
+ border-radius: 0.25rem;
+ appearance: none;
+}
+.bodywebsite .custom-select:focus {
+ border-color: #80bdff;
+ outline: none;
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 5px rgba(128, 189, 255, 0.5);
+}
+.bodywebsite .custom-select[multiple] {
+ height: auto;
+ background-image: none;
+}
+.bodywebsite .custom-select:disabled {
+ color: #868e96;
+ background-color: #e9ecef;
+}
+.bodywebsite .custom-select::-ms-expand {
+ opacity: 0;
+}
+.bodywebsite .custom-select-sm {
+ height: calc(3.8125rem);
+ padding-top: 0.375rem;
+ padding-bottom: 0.375rem;
+ font-size: 75%;
+}
+.bodywebsite .custom-file {
+ position: relative;
+ display: inline-block;
+ max-width: 100%;
+ height: calc(4.25rem);
+ margin-bottom: 0;
+}
+.bodywebsite .custom-file-input {
+ min-width: 14rem;
+ max-width: 100%;
+ height: calc(4.25rem);
+ margin: 0;
+ opacity: 0;
+}
+.bodywebsite .custom-file-input:focus ~ .custom-file-control {
+ box-shadow: 0 0 0 0.075rem #fff, 0 0 0 0.2rem #007bff;
+}
+.bodywebsite .custom-file-control {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 5;
+ height: calc(4.25rem);
+ padding: 0.375rem 0.75rem;
+ line-height: 1.5;
+ color: #495057;
+ pointer-events: none;
+ user-select: none;
+ background-color: #fff;
+ border: 1px solid #ced4da;
+ border-radius: 0.25rem;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.bodywebsite .custom-file-control:lang(en):empty::after {
+ content: "Choose file...";
+}
+.bodywebsite .custom-file-control::before {
+ position: absolute;
+ top: -1px;
+ right: -1px;
+ bottom: -1px;
+ z-index: 6;
+ display: block;
+ height: calc(4.25rem);
+ padding: 0.375rem 0.75rem;
+ line-height: 1.5;
+ color: #495057;
+ background-color: #e9ecef;
+ border: 1px solid #ced4da;
+ border-radius: 0 0.25rem 0.25rem 0;
+}
+.bodywebsite .custom-file-control:lang(en)::before {
+ content: "Browse";
+}
+.bodywebsite .nav {
+ display: flex;
+ flex-wrap: wrap;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+.bodywebsite .nav-link {
+ display: block;
+ padding: 0.5rem 1rem;
+}
+.bodywebsite .nav-link:focus,
+.bodywebsite .nav-link:hover {
+ text-decoration: none;
+}
+.bodywebsite .nav-link.disabled {
+ color: #868e96;
+}
+.bodywebsite .nav-tabs {
+ border-bottom: 1px solid #ddd;
+}
+.bodywebsite .nav-tabs .nav-item {
+ margin-bottom: -1px;
+}
+.bodywebsite .nav-tabs .nav-link {
+ border: 1px solid transparent;
+ border-top-left-radius: 0.25rem;
+ border-top-right-radius: 0.25rem;
+}
+.bodywebsite .nav-tabs .nav-link:focus,
+.bodywebsite .nav-tabs .nav-link:hover {
+ border-color: #f9f9f9 #f9f9f9 #ddd;
+}
+.bodywebsite .nav-tabs .nav-link.disabled {
+ color: #868e96;
+ background-color: transparent;
+ border-color: transparent;
+}
+.bodywebsite .nav-tabs .nav-link.active,
+.bodywebsite .nav-tabs .nav-item.show .nav-link {
+ color: #495057;
+ background-color: #fff;
+ border-color: #ddd #ddd #fff;
+}
+.bodywebsite .nav-tabs .dropdown-menu {
+ margin-top: -1px;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.bodywebsite .nav-pills .nav-link {
+ border-radius: 0;
+}
+.bodywebsite .nav-pills .nav-link.active,
+.bodywebsite .nav-pills .show > .nav-link {
+ color: #fff;
+ background-color: #007bff;
+}
+.bodywebsite .nav-fill .nav-item {
+ flex: 1 1 auto;
+ text-align: center;
+}
+.bodywebsite .nav-justified .nav-item {
+ flex-basis: 0;
+ flex-grow: 1;
+ text-align: center;
+}
+.bodywebsite .tab-content > .tab-pane {
+ display: none;
+}
+.bodywebsite .tab-content > .active {
+ display: block;
+}
+.bodywebsite .navbar {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0.5rem 1rem;
+}
+.bodywebsite .navbar > .container,
+.bodywebsite .navbar > .container-fluid {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: space-between;
+}
+.bodywebsite .navbar-brand {
+ display: inline-block;
+ padding-top: 0.3125rem;
+ padding-bottom: 0.3125rem;
+ margin-right: 1rem;
+ font-size: 1.25rem;
+ line-height: inherit;
+ white-space: nowrap;
+}
+.bodywebsite .navbar-brand:focus,
+.bodywebsite .navbar-brand:hover {
+ text-decoration: none;
+}
+.bodywebsite .navbar-nav {
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+.bodywebsite .navbar-nav .nav-link {
+ padding-right: 0;
+ padding-left: 0;
+}
+.bodywebsite .navbar-nav .dropdown-menu {
+ position: static;
+ float: none;
+}
+.bodywebsite .navbar-text {
+ display: inline-block;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+.bodywebsite .navbar-collapse {
+ flex-basis: 100%;
+ flex-grow: 1;
+ align-items: center;
+}
+.bodywebsite .navbar-toggler {
+ padding: 0.25rem 0.75rem;
+ font-size: 1.25rem;
+ line-height: 1;
+ background: transparent;
+ border: 1px solid transparent;
+ border-radius: 0.25rem;
+}
+.bodywebsite .navbar-toggler:focus,
+.bodywebsite .navbar-toggler:hover {
+ text-decoration: none;
+}
+.bodywebsite .navbar-toggler-icon {
+ display: inline-block;
+ width: 1.5em;
+ height: 1.5em;
+ vertical-align: middle;
+ content: "";
+ background: no-repeat center center;
+ background-size: 100% 100%;
+}
+@media (max-width: 575px) {
+ .bodywebsite .navbar-expand-sm > .container,
+ .bodywebsite .navbar-expand-sm > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+@media (min-width: 576px) {
+ .bodywebsite .navbar-expand-sm {
+ flex-flow: row nowrap;
+ justify-content: flex-start;
+ }
+ .bodywebsite .navbar-expand-sm .navbar-nav {
+ flex-direction: row;
+ }
+ .bodywebsite .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .bodywebsite .navbar-expand-sm .navbar-nav .dropdown-menu-right {
+ right: 0;
+ left: auto;
+ }
+ .bodywebsite .navbar-expand-sm .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
+ }
+ .bodywebsite .navbar-expand-sm > .container,
+ .bodywebsite .navbar-expand-sm > .container-fluid {
+ flex-wrap: nowrap;
+ }
+ .bodywebsite .navbar-expand-sm .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .bodywebsite .navbar-expand-sm .navbar-toggler {
+ display: none;
+ }
+ .bodywebsite .navbar-expand-sm .dropup .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ }
+}
+@media (max-width: 767px) {
+ .bodywebsite .navbar-expand-md > .container,
+ .bodywebsite .navbar-expand-md > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .navbar-expand-md {
+ flex-flow: row nowrap;
+ justify-content: flex-start;
+ }
+ .bodywebsite .navbar-expand-md .navbar-nav {
+ flex-direction: row;
+ }
+ .bodywebsite .navbar-expand-md .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .bodywebsite .navbar-expand-md .navbar-nav .dropdown-menu-right {
+ right: 0;
+ left: auto;
+ }
+ .bodywebsite .navbar-expand-md .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
+ }
+ .bodywebsite .navbar-expand-md > .container,
+ .bodywebsite .navbar-expand-md > .container-fluid {
+ flex-wrap: nowrap;
+ }
+ .bodywebsite .navbar-expand-md .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .bodywebsite .navbar-expand-md .navbar-toggler {
+ display: none;
+ }
+ .bodywebsite .navbar-expand-md .dropup .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ }
+}
+@media (max-width: 991px) {
+ .bodywebsite .navbar-expand-lg > .container,
+ .bodywebsite .navbar-expand-lg > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .navbar-expand-lg {
+ flex-flow: row nowrap;
+ justify-content: flex-start;
+ }
+ .bodywebsite .navbar-expand-lg .navbar-nav {
+ flex-direction: row;
+ }
+ .bodywebsite .navbar-expand-lg .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .bodywebsite .navbar-expand-lg .navbar-nav .dropdown-menu-right {
+ right: 0;
+ left: auto;
+ }
+ .bodywebsite .navbar-expand-lg .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
+ }
+ .bodywebsite .navbar-expand-lg > .container,
+ .bodywebsite .navbar-expand-lg > .container-fluid {
+ flex-wrap: nowrap;
+ }
+ .bodywebsite .navbar-expand-lg .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .bodywebsite .navbar-expand-lg .navbar-toggler {
+ display: none;
+ }
+ .bodywebsite .navbar-expand-lg .dropup .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ }
+}
+@media (max-width: 1199px) {
+ .bodywebsite .navbar-expand-xl > .container,
+ .bodywebsite .navbar-expand-xl > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .navbar-expand-xl {
+ flex-flow: row nowrap;
+ justify-content: flex-start;
+ }
+ .bodywebsite .navbar-expand-xl .navbar-nav {
+ flex-direction: row;
+ }
+ .bodywebsite .navbar-expand-xl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .bodywebsite .navbar-expand-xl .navbar-nav .dropdown-menu-right {
+ right: 0;
+ left: auto;
+ }
+ .bodywebsite .navbar-expand-xl .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
+ }
+ .bodywebsite .navbar-expand-xl > .container,
+ .bodywebsite .navbar-expand-xl > .container-fluid {
+ flex-wrap: nowrap;
+ }
+ .bodywebsite .navbar-expand-xl .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .bodywebsite .navbar-expand-xl .navbar-toggler {
+ display: none;
+ }
+ .bodywebsite .navbar-expand-xl .dropup .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ }
+}
+@media (max-width: 1799px) {
+ .bodywebsite .navbar-expand-xxl > .container,
+ .bodywebsite .navbar-expand-xxl > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+@media (min-width: 1800px) {
+ .bodywebsite .navbar-expand-xxl {
+ flex-flow: row nowrap;
+ justify-content: flex-start;
+ }
+ .bodywebsite .navbar-expand-xxl .navbar-nav {
+ flex-direction: row;
+ }
+ .bodywebsite .navbar-expand-xxl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .bodywebsite .navbar-expand-xxl .navbar-nav .dropdown-menu-right {
+ right: 0;
+ left: auto;
+ }
+ .bodywebsite .navbar-expand-xxl .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
+ }
+ .bodywebsite .navbar-expand-xxl > .container,
+ .bodywebsite .navbar-expand-xxl > .container-fluid {
+ flex-wrap: nowrap;
+ }
+ .bodywebsite .navbar-expand-xxl .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .bodywebsite .navbar-expand-xxl .navbar-toggler {
+ display: none;
+ }
+ .bodywebsite .navbar-expand-xxl .dropup .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ }
+}
+.bodywebsite .navbar-expand {
+ flex-flow: row nowrap;
+ justify-content: flex-start;
+}
+.bodywebsite .navbar-expand > .container,
+.bodywebsite .navbar-expand > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
+}
+.bodywebsite .navbar-expand .navbar-nav {
+ flex-direction: row;
+}
+.bodywebsite .navbar-expand .navbar-nav .dropdown-menu {
+ position: absolute;
+}
+.bodywebsite .navbar-expand .navbar-nav .dropdown-menu-right {
+ right: 0;
+ left: auto;
+}
+.bodywebsite .navbar-expand .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
+}
+.bodywebsite .navbar-expand > .container,
+.bodywebsite .navbar-expand > .container-fluid {
+ flex-wrap: nowrap;
+}
+.bodywebsite .navbar-expand .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+}
+.bodywebsite .navbar-expand .navbar-toggler {
+ display: none;
+}
+.bodywebsite .navbar-expand .dropup .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+}
+.bodywebsite .navbar-light .navbar-brand {
+ color: rgba(0, 0, 0, 0.9);
+}
+.bodywebsite .navbar-light .navbar-brand:focus,
+.bodywebsite .navbar-light .navbar-brand:hover {
+ color: rgba(0, 0, 0, 0.9);
+}
+.bodywebsite .navbar-light .navbar-nav .nav-link {
+ color: rgba(0, 0, 0, 0.5);
+}
+.bodywebsite .navbar-light .navbar-nav .nav-link:focus,
+.bodywebsite .navbar-light .navbar-nav .nav-link:hover {
+ color: rgba(0, 0, 0, 0.7);
+}
+.bodywebsite .navbar-light .navbar-nav .nav-link.disabled {
+ color: rgba(0, 0, 0, 0.3);
+}
+.bodywebsite .navbar-light .navbar-nav .show > .nav-link,
+.bodywebsite .navbar-light .navbar-nav .active > .nav-link,
+.bodywebsite .navbar-light .navbar-nav .nav-link.show,
+.bodywebsite .navbar-light .navbar-nav .nav-link.active {
+ color: rgba(0, 0, 0, 0.9);
+}
+.bodywebsite .navbar-light .navbar-toggler {
+ color: rgba(0, 0, 0, 0.5);
+ border-color: rgba(0, 0, 0, 0.1);
+}
+.bodywebsite .navbar-light .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E");
+}
+.bodywebsite .navbar-light .navbar-text {
+ color: rgba(0, 0, 0, 0.5);
+}
+.bodywebsite .navbar-light .navbar-text a {
+ color: rgba(0, 0, 0, 0.9);
+}
+.bodywebsite .navbar-light .navbar-text a:focus,
+.bodywebsite .navbar-light .navbar-text a:hover {
+ color: rgba(0, 0, 0, 0.9);
+}
+.bodywebsite .navbar-dark .navbar-brand {
+ color: #fff;
+}
+.bodywebsite .navbar-dark .navbar-brand:focus,
+.bodywebsite .navbar-dark .navbar-brand:hover {
+ color: #fff;
+}
+.bodywebsite .navbar-dark .navbar-nav .nav-link {
+ color: rgba(255, 255, 255, 0.5);
+}
+.bodywebsite .navbar-dark .navbar-nav .nav-link:focus,
+.bodywebsite .navbar-dark .navbar-nav .nav-link:hover {
+ color: rgba(255, 255, 255, 0.75);
+}
+.bodywebsite .navbar-dark .navbar-nav .nav-link.disabled {
+ color: rgba(255, 255, 255, 0.25);
+}
+.bodywebsite .navbar-dark .navbar-nav .show > .nav-link,
+.bodywebsite .navbar-dark .navbar-nav .active > .nav-link,
+.bodywebsite .navbar-dark .navbar-nav .nav-link.show,
+.bodywebsite .navbar-dark .navbar-nav .nav-link.active {
+ color: #fff;
+}
+.bodywebsite .navbar-dark .navbar-toggler {
+ color: rgba(255, 255, 255, 0.5);
+ border-color: rgba(255, 255, 255, 0.1);
+}
+.bodywebsite .navbar-dark .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E");
+}
+.bodywebsite .navbar-dark .navbar-text {
+ color: rgba(255, 255, 255, 0.5);
+}
+.bodywebsite .navbar-dark .navbar-text a {
+ color: #fff;
+}
+.bodywebsite .navbar-dark .navbar-text a:focus,
+.bodywebsite .navbar-dark .navbar-text a:hover {
+ color: #fff;
+}
+.bodywebsite .jumbotron {
+ padding: 2rem 1rem;
+ margin-bottom: 2rem;
+ background-color: #e9ecef;
+ border-radius: 6px;
+}
+@media (min-width: 576px) {
+ .bodywebsite .jumbotron {
+ padding: 4rem 2rem;
+ }
+}
+.bodywebsite .jumbotron-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ border-radius: 0;
+}
+.bodywebsite .alert {
+ position: relative;
+ padding: 0.75rem 1.25rem;
+ margin-bottom: 1rem;
+ border: 1px solid transparent;
+ border-radius: 0.25rem;
+}
+.bodywebsite .alert-heading {
+ color: inherit;
+}
+.bodywebsite .alert-link {
+ font-weight: 700;
+}
+.bodywebsite .alert-dismissible .close {
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: 0.75rem 1.25rem;
+ color: inherit;
+}
+.bodywebsite .alert-primary {
+ color: #004085;
+ background-color: #cce5ff;
+ border-color: #b8daff;
+}
+.bodywebsite .alert-primary hr {
+ border-top-color: #9fcdff;
+}
+.bodywebsite .alert-primary .alert-link {
+ color: #002752;
+}
+.bodywebsite .alert-secondary {
+ color: #464a4e;
+ background-color: #e7e8ea;
+ border-color: #dddfe2;
+}
+.bodywebsite .alert-secondary hr {
+ border-top-color: #cfd2d6;
+}
+.bodywebsite .alert-secondary .alert-link {
+ color: #2e3133;
+}
+.bodywebsite .alert-success {
+ color: #155724;
+ background-color: #d4edda;
+ border-color: #c3e6cb;
+}
+.bodywebsite .alert-success hr {
+ border-top-color: #b1dfbb;
+}
+.bodywebsite .alert-success .alert-link {
+ color: #0b2e13;
+}
+.bodywebsite .alert-info {
+ color: #0c5460;
+ background-color: #d1ecf1;
+ border-color: #bee5eb;
+}
+.bodywebsite .alert-info hr {
+ border-top-color: #abdde5;
+}
+.bodywebsite .alert-info .alert-link {
+ color: #062c33;
+}
+.bodywebsite .alert-warning {
+ color: #856404;
+ background-color: #fff3cd;
+ border-color: #ffeeba;
+}
+.bodywebsite .alert-warning hr {
+ border-top-color: #ffe8a1;
+}
+.bodywebsite .alert-warning .alert-link {
+ color: #533f03;
+}
+.bodywebsite .alert-danger {
+ color: #721c24;
+ background-color: #f8d7da;
+ border-color: #f5c6cb;
+}
+.bodywebsite .alert-danger hr {
+ border-top-color: #f1b0b7;
+}
+.bodywebsite .alert-danger .alert-link {
+ color: #491217;
+}
+.bodywebsite .alert-light {
+ color: #818182;
+ background-color: #fefefe;
+ border-color: #fdfdfe;
+}
+.bodywebsite .alert-light hr {
+ border-top-color: #ececf6;
+}
+.bodywebsite .alert-light .alert-link {
+ color: #686868;
+}
+.bodywebsite .alert-dark {
+ color: #1b1e21;
+ background-color: #d6d8d9;
+ border-color: #c6c8ca;
+}
+.bodywebsite .alert-dark hr {
+ border-top-color: #b9bbbe;
+}
+.bodywebsite .alert-dark .alert-link {
+ color: #040505;
+}
+@keyframes progress-bar-stripes {
+ from {
+ background-position: 1rem 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+.bodywebsite .progress {
+ display: flex;
+ height: 1rem;
+ overflow: hidden;
+ font-size: 0.75rem;
+ background-color: #e9ecef;
+ border-radius: 0.25rem;
+}
+.bodywebsite .progress-bar {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #fff;
+ background-color: #007bff;
+}
+.bodywebsite .progress-bar-striped {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-size: 1rem 1rem;
+}
+.bodywebsite .progress-bar-animated {
+ animation: progress-bar-stripes 1s linear infinite;
+}
+.bodywebsite .media {
+ display: flex;
+ align-items: flex-start;
+}
+.bodywebsite .media-body {
+ flex: 1;
+}
+.bodywebsite .list-group {
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+}
+.bodywebsite .list-group-item-action {
+ width: 100%;
+ color: #495057;
+ text-align: inherit;
+}
+.bodywebsite .list-group-item-action:focus,
+.bodywebsite .list-group-item-action:hover {
+ color: #495057;
+ text-decoration: none;
+ background-color: #f8f9fa;
+}
+.bodywebsite .list-group-item-action:active {
+ color: #212529;
+ background-color: #e9ecef;
+}
+.bodywebsite .list-group-item {
+ position: relative;
+ display: block;
+ padding: 0.75rem 1.25rem;
+ margin-bottom: -1px;
+ background-color: #fff;
+ border: 1px solid rgba(0, 0, 0, 0.125);
+}
+.bodywebsite .list-group-item:first-child {
+ border-top-left-radius: 0.25rem;
+ border-top-right-radius: 0.25rem;
+}
+.bodywebsite .list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom-right-radius: 0.25rem;
+ border-bottom-left-radius: 0.25rem;
+}
+.bodywebsite .list-group-item:focus,
+.bodywebsite .list-group-item:hover {
+ text-decoration: none;
+}
+.bodywebsite .list-group-item.disabled,
+.bodywebsite .list-group-item:disabled {
+ color: #868e96;
+ background-color: #fff;
+}
+.bodywebsite .list-group-item.active {
+ z-index: 2;
+ color: #fff;
+ background-color: #007bff;
+ border-color: #007bff;
+}
+.bodywebsite .list-group-flush .list-group-item {
+ border-right: 0;
+ border-left: 0;
+ border-radius: 0;
+}
+.bodywebsite .list-group-flush:first-child .list-group-item:first-child {
+ border-top: 0;
+}
+.bodywebsite .list-group-flush:last-child .list-group-item:last-child {
+ border-bottom: 0;
+}
+.bodywebsite .list-group-item-primary {
+ color: #004085;
+ background-color: #b8daff;
+}
+.bodywebsite a.list-group-item-primary,
+.bodywebsite button.list-group-item-primary {
+ color: #004085;
+}
+.bodywebsite a.list-group-item-primary:focus,
+.bodywebsite a.list-group-item-primary:hover,
+.bodywebsite button.list-group-item-primary:focus,
+.bodywebsite button.list-group-item-primary:hover {
+ color: #004085;
+ background-color: #9fcdff;
+}
+.bodywebsite a.list-group-item-primary.active,
+.bodywebsite button.list-group-item-primary.active {
+ color: #fff;
+ background-color: #004085;
+ border-color: #004085;
+}
+.bodywebsite .list-group-item-secondary {
+ color: #464a4e;
+ background-color: #dddfe2;
+}
+.bodywebsite a.list-group-item-secondary,
+.bodywebsite button.list-group-item-secondary {
+ color: #464a4e;
+}
+.bodywebsite a.list-group-item-secondary:focus,
+.bodywebsite a.list-group-item-secondary:hover,
+.bodywebsite button.list-group-item-secondary:focus,
+.bodywebsite button.list-group-item-secondary:hover {
+ color: #464a4e;
+ background-color: #cfd2d6;
+}
+.bodywebsite a.list-group-item-secondary.active,
+.bodywebsite button.list-group-item-secondary.active {
+ color: #fff;
+ background-color: #464a4e;
+ border-color: #464a4e;
+}
+.bodywebsite .list-group-item-success {
+ color: #155724;
+ background-color: #c3e6cb;
+}
+.bodywebsite a.list-group-item-success,
+.bodywebsite button.list-group-item-success {
+ color: #155724;
+}
+.bodywebsite a.list-group-item-success:focus,
+.bodywebsite a.list-group-item-success:hover,
+.bodywebsite button.list-group-item-success:focus,
+.bodywebsite button.list-group-item-success:hover {
+ color: #155724;
+ background-color: #b1dfbb;
+}
+.bodywebsite a.list-group-item-success.active,
+.bodywebsite button.list-group-item-success.active {
+ color: #fff;
+ background-color: #155724;
+ border-color: #155724;
+}
+.bodywebsite .list-group-item-info {
+ color: #0c5460;
+ background-color: #bee5eb;
+}
+.bodywebsite a.list-group-item-info,
+.bodywebsite button.list-group-item-info {
+ color: #0c5460;
+}
+.bodywebsite a.list-group-item-info:focus,
+.bodywebsite a.list-group-item-info:hover,
+.bodywebsite button.list-group-item-info:focus,
+.bodywebsite button.list-group-item-info:hover {
+ color: #0c5460;
+ background-color: #abdde5;
+}
+.bodywebsite a.list-group-item-info.active,
+.bodywebsite button.list-group-item-info.active {
+ color: #fff;
+ background-color: #0c5460;
+ border-color: #0c5460;
+}
+.bodywebsite .list-group-item-warning {
+ color: #856404;
+ background-color: #ffeeba;
+}
+.bodywebsite a.list-group-item-warning,
+.bodywebsite button.list-group-item-warning {
+ color: #856404;
+}
+.bodywebsite a.list-group-item-warning:focus,
+.bodywebsite a.list-group-item-warning:hover,
+.bodywebsite button.list-group-item-warning:focus,
+.bodywebsite button.list-group-item-warning:hover {
+ color: #856404;
+ background-color: #ffe8a1;
+}
+.bodywebsite a.list-group-item-warning.active,
+.bodywebsite button.list-group-item-warning.active {
+ color: #fff;
+ background-color: #856404;
+ border-color: #856404;
+}
+.bodywebsite .list-group-item-danger {
+ color: #721c24;
+ background-color: #f5c6cb;
+}
+.bodywebsite a.list-group-item-danger,
+.bodywebsite button.list-group-item-danger {
+ color: #721c24;
+}
+.bodywebsite a.list-group-item-danger:focus,
+.bodywebsite a.list-group-item-danger:hover,
+.bodywebsite button.list-group-item-danger:focus,
+.bodywebsite button.list-group-item-danger:hover {
+ color: #721c24;
+ background-color: #f1b0b7;
+}
+.bodywebsite a.list-group-item-danger.active,
+.bodywebsite button.list-group-item-danger.active {
+ color: #fff;
+ background-color: #721c24;
+ border-color: #721c24;
+}
+.bodywebsite .list-group-item-light {
+ color: #818182;
+ background-color: #fdfdfe;
+}
+.bodywebsite a.list-group-item-light,
+.bodywebsite button.list-group-item-light {
+ color: #818182;
+}
+.bodywebsite a.list-group-item-light:focus,
+.bodywebsite a.list-group-item-light:hover,
+.bodywebsite button.list-group-item-light:focus,
+.bodywebsite button.list-group-item-light:hover {
+ color: #818182;
+ background-color: #ececf6;
+}
+.bodywebsite a.list-group-item-light.active,
+.bodywebsite button.list-group-item-light.active {
+ color: #fff;
+ background-color: #818182;
+ border-color: #818182;
+}
+.bodywebsite .list-group-item-dark {
+ color: #1b1e21;
+ background-color: #c6c8ca;
+}
+.bodywebsite a.list-group-item-dark,
+.bodywebsite button.list-group-item-dark {
+ color: #1b1e21;
+}
+.bodywebsite a.list-group-item-dark:focus,
+.bodywebsite a.list-group-item-dark:hover,
+.bodywebsite button.list-group-item-dark:focus,
+.bodywebsite button.list-group-item-dark:hover {
+ color: #1b1e21;
+ background-color: #b9bbbe;
+}
+.bodywebsite a.list-group-item-dark.active,
+.bodywebsite button.list-group-item-dark.active {
+ color: #fff;
+ background-color: #1b1e21;
+ border-color: #1b1e21;
+}
+.bodywebsite .close {
+ float: right;
+ font-size: 1.5rem;
+ font-weight: 700;
+ line-height: 1;
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ opacity: .5;
+}
+.bodywebsite .close:focus,
+.bodywebsite .close:hover {
+ color: #000;
+ text-decoration: none;
+ opacity: .75;
+}
+.bodywebsite button.close {
+ padding: 0;
+ background: transparent;
+ border: 0;
+ -webkit-appearance: none;
+}
+.bodywebsite .tooltip {
+ position: absolute;
+ z-index: 1070;
+ display: block;
+ margin: 0;
+ font-family: "Roboto", Helvetica, Arial, sans-serif;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.71429;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: 12px;
+ word-wrap: break-word;
+ opacity: 0;
+}
+.bodywebsite .tooltip.show {
+ opacity: 1;
+}
+.bodywebsite .tooltip .arrow {
+ position: absolute;
+ display: block;
+ width: 6px;
+ height: 6px;
+}
+.bodywebsite .tooltip .arrow::before {
+ position: absolute;
+ border-color: transparent;
+ border-style: solid;
+}
+.bodywebsite .tooltip.bs-tooltip-top,
+.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="top"] {
+ padding: 6px 0;
+}
+.bodywebsite .tooltip.bs-tooltip-top .arrow,
+.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="top"] .arrow {
+ bottom: 0;
+}
+.bodywebsite .tooltip.bs-tooltip-top .arrow::before,
+.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="top"] .arrow::before {
+ margin-left: -4px;
+ content: "";
+ border-width: 6px 6px 0;
+ border-top-color: #37c386;
+}
+.bodywebsite .tooltip.bs-tooltip-right,
+.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="right"] {
+ padding: 0 6px;
+}
+.bodywebsite .tooltip.bs-tooltip-right .arrow,
+.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="right"] .arrow {
+ left: 0;
+}
+.bodywebsite .tooltip.bs-tooltip-right .arrow::before,
+.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="right"] .arrow::before {
+ margin-top: -4px;
+ content: "";
+ border-width: 6px 6px 6px 0;
+ border-right-color: #37c386;
+}
+.bodywebsite .tooltip.bs-tooltip-bottom,
+.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="bottom"] {
+ padding: 6px 0;
+}
+.bodywebsite .tooltip.bs-tooltip-bottom .arrow,
+.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="bottom"] .arrow {
+ top: 0;
+}
+.bodywebsite .tooltip.bs-tooltip-bottom .arrow::before,
+.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="bottom"] .arrow::before {
+ margin-left: -4px;
+ content: "";
+ border-width: 0 6px 6px;
+ border-bottom-color: #37c386;
+}
+.bodywebsite .tooltip.bs-tooltip-left,
+.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="left"] {
+ padding: 0 6px;
+}
+.bodywebsite .tooltip.bs-tooltip-left .arrow,
+.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="left"] .arrow {
+ right: 0;
+}
+.bodywebsite .tooltip.bs-tooltip-left .arrow::before,
+.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="left"] .arrow::before {
+ right: 0;
+ margin-top: -4px;
+ content: "";
+ border-width: 6px 0 6px 6px;
+ border-left-color: #37c386;
+}
+.bodywebsite .tooltip-inner {
+ max-width: 200px;
+ padding: 6px 10px;
+ color: #fff;
+ text-align: center;
+ background-color: #37c386;
+ border-radius: 0;
+}
+.bodywebsite .popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1060;
+ display: block;
+ max-width: 276px;
+ font-family: "Roboto", Helvetica, Arial, sans-serif;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.71429;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: 12px;
+ word-wrap: break-word;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 6px;
+ box-shadow: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.2);
+}
+.bodywebsite .popover .arrow {
+ position: absolute;
+ display: block;
+ width: 0.8rem;
+ height: 0.4rem;
+}
+.bodywebsite .popover .arrow::before,
+.bodywebsite .popover .arrow::after {
+ position: absolute;
+ display: block;
+ border-color: transparent;
+ border-style: solid;
+}
+.bodywebsite .popover .arrow::before {
+ content: "";
+ border-width: 0.8rem;
+}
+.bodywebsite .popover .arrow::after {
+ content: "";
+ border-width: 0.8rem;
+}
+.bodywebsite .popover.bs-popover-top,
+.bodywebsite .popover.bs-popover-auto[x-placement^="top"] {
+ margin-bottom: 0.8rem;
+}
+.bodywebsite .popover.bs-popover-top .arrow,
+.bodywebsite .popover.bs-popover-auto[x-placement^="top"] .arrow {
+ bottom: 0;
+}
+.bodywebsite .popover.bs-popover-top .arrow::before,
+.bodywebsite .popover.bs-popover-auto[x-placement^="top"] .arrow::before,
+.bodywebsite .popover.bs-popover-top .arrow::after,
+.bodywebsite .popover.bs-popover-auto[x-placement^="top"] .arrow::after {
+ border-bottom-width: 0;
+}
+.bodywebsite .popover.bs-popover-top .arrow::before,
+.bodywebsite .popover.bs-popover-auto[x-placement^="top"] .arrow::before {
+ bottom: -0.8rem;
+ margin-left: -0.8rem;
+ border-top-color: rgba(0, 0, 0, 0.25);
+}
+.bodywebsite .popover.bs-popover-top .arrow::after,
+.bodywebsite .popover.bs-popover-auto[x-placement^="top"] .arrow::after {
+ bottom: calc(0.2rem);
+ margin-left: -0.8rem;
+ border-top-color: #fff;
+}
+.bodywebsite .popover.bs-popover-right,
+.bodywebsite .popover.bs-popover-auto[x-placement^="right"] {
+ margin-left: 0.8rem;
+}
+.bodywebsite .popover.bs-popover-right .arrow,
+.bodywebsite .popover.bs-popover-auto[x-placement^="right"] .arrow {
+ left: 0;
+}
+.bodywebsite .popover.bs-popover-right .arrow::before,
+.bodywebsite .popover.bs-popover-auto[x-placement^="right"] .arrow::before,
+.bodywebsite .popover.bs-popover-right .arrow::after,
+.bodywebsite .popover.bs-popover-auto[x-placement^="right"] .arrow::after {
+ margin-top: -0.8rem;
+ border-left-width: 0;
+}
+.bodywebsite .popover.bs-popover-right .arrow::before,
+.bodywebsite .popover.bs-popover-auto[x-placement^="right"] .arrow::before {
+ left: -0.8rem;
+ border-right-color: rgba(0, 0, 0, 0.25);
+}
+.bodywebsite .popover.bs-popover-right .arrow::after,
+.bodywebsite .popover.bs-popover-auto[x-placement^="right"] .arrow::after {
+ left: calc(0.2rem);
+ border-right-color: #fff;
+}
+.bodywebsite .popover.bs-popover-bottom,
+.bodywebsite .popover.bs-popover-auto[x-placement^="bottom"] {
+ margin-top: 0.8rem;
+}
+.bodywebsite .popover.bs-popover-bottom .arrow,
+.bodywebsite .popover.bs-popover-auto[x-placement^="bottom"] .arrow {
+ top: 0;
+}
+.bodywebsite .popover.bs-popover-bottom .arrow::before,
+.bodywebsite .popover.bs-popover-auto[x-placement^="bottom"] .arrow::before,
+.bodywebsite .popover.bs-popover-bottom .arrow::after,
+.bodywebsite .popover.bs-popover-auto[x-placement^="bottom"] .arrow::after {
+ margin-left: -0.8rem;
+ border-top-width: 0;
+}
+.bodywebsite .popover.bs-popover-bottom .arrow::before,
+.bodywebsite .popover.bs-popover-auto[x-placement^="bottom"] .arrow::before {
+ top: -0.8rem;
+ border-bottom-color: rgba(0, 0, 0, 0.25);
+}
+.bodywebsite .popover.bs-popover-bottom .arrow::after,
+.bodywebsite .popover.bs-popover-auto[x-placement^="bottom"] .arrow::after {
+ top: calc(0.2rem);
+ border-bottom-color: #fff;
+}
+.bodywebsite .popover.bs-popover-bottom .popover-header::before,
+.bodywebsite .popover.bs-popover-auto[x-placement^="bottom"] .popover-header::before {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ display: block;
+ width: 20px;
+ margin-left: -10px;
+ content: "";
+ border-bottom: 1px solid #f7f7f7;
+}
+.bodywebsite .popover.bs-popover-left,
+.bodywebsite .popover.bs-popover-auto[x-placement^="left"] {
+ margin-right: 0.8rem;
+}
+.bodywebsite .popover.bs-popover-left .arrow,
+.bodywebsite .popover.bs-popover-auto[x-placement^="left"] .arrow {
+ right: 0;
+}
+.bodywebsite .popover.bs-popover-left .arrow::before,
+.bodywebsite .popover.bs-popover-auto[x-placement^="left"] .arrow::before,
+.bodywebsite .popover.bs-popover-left .arrow::after,
+.bodywebsite .popover.bs-popover-auto[x-placement^="left"] .arrow::after {
+ margin-top: -0.8rem;
+ border-right-width: 0;
+}
+.bodywebsite .popover.bs-popover-left .arrow::before,
+.bodywebsite .popover.bs-popover-auto[x-placement^="left"] .arrow::before {
+ right: -0.8rem;
+ border-left-color: rgba(0, 0, 0, 0.25);
+}
+.bodywebsite .popover.bs-popover-left .arrow::after,
+.bodywebsite .popover.bs-popover-auto[x-placement^="left"] .arrow::after {
+ right: calc(0.2rem);
+ border-left-color: #fff;
+}
+.bodywebsite .popover-header {
+ padding: 0.5rem 0.75rem;
+ margin-bottom: 0;
+ font-size: 14px;
+ color: inherit;
+ background-color: #f7f7f7;
+ border-bottom: 1px solid #ebebeb;
+ border-top-left-radius: calc(5px);
+ border-top-right-radius: calc(5px);
+}
+.bodywebsite .popover-header:empty {
+ display: none;
+}
+.bodywebsite .popover-body {
+ padding: 0.5rem 0.75rem;
+ color: #212529;
+}
+.bodywebsite .carousel {
+ position: relative;
+}
+.bodywebsite .carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden;
+}
+.bodywebsite .carousel-item {
+ position: relative;
+ display: none;
+ align-items: center;
+ width: 100%;
+ transition: transform 0.6s ease;
+ backface-visibility: hidden;
+ perspective: 1000px;
+}
+.bodywebsite .carousel-item.active,
+.bodywebsite .carousel-item-next,
+.bodywebsite .carousel-item-prev {
+ display: block;
+}
+.bodywebsite .carousel-item-next,
+.bodywebsite .carousel-item-prev {
+ position: absolute;
+ top: 0;
+}
+.bodywebsite .carousel-item-next.carousel-item-left,
+.bodywebsite .carousel-item-prev.carousel-item-right {
+ transform: translateX(0);
+}
+@supports (transform-style: preserve-3d) {
+ .bodywebsite .carousel-item-next.carousel-item-left,
+ .bodywebsite .carousel-item-prev.carousel-item-right {
+ transform: translate3d(0, 0, 0);
+ }
+}
+.bodywebsite .carousel-item-next,
+.bodywebsite .active.carousel-item-right {
+ transform: translateX(100%);
+}
+@supports (transform-style: preserve-3d) {
+ .bodywebsite .carousel-item-next,
+ .bodywebsite .active.carousel-item-right {
+ transform: translate3d(100%, 0, 0);
+ }
+}
+.bodywebsite .carousel-item-prev,
+.bodywebsite .active.carousel-item-left {
+ transform: translateX(-100%);
+}
+@supports (transform-style: preserve-3d) {
+ .bodywebsite .carousel-item-prev,
+ .bodywebsite .active.carousel-item-left {
+ transform: translate3d(-100%, 0, 0);
+ }
+}
+.bodywebsite .carousel-control-prev,
+.bodywebsite .carousel-control-next {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 15%;
+ color: #fff;
+ text-align: center;
+ opacity: 0.5;
+}
+.bodywebsite .carousel-control-prev:focus,
+.bodywebsite .carousel-control-prev:hover,
+.bodywebsite .carousel-control-next:focus,
+.bodywebsite .carousel-control-next:hover {
+ color: #fff;
+ text-decoration: none;
+ outline: 0;
+ opacity: .9;
+}
+.bodywebsite .carousel-control-prev {
+ left: 0;
+}
+.bodywebsite .carousel-control-next {
+ right: 0;
+}
+.bodywebsite .carousel-control-prev-icon,
+.bodywebsite .carousel-control-next-icon {
+ display: inline-block;
+ width: 20px;
+ height: 20px;
+ background: transparent no-repeat center center;
+ background-size: 100% 100%;
+}
+.bodywebsite .carousel-control-prev-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E");
+}
+.bodywebsite .carousel-control-next-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E");
+}
+.bodywebsite .carousel-indicators {
+ position: absolute;
+ right: 0;
+ bottom: 10px;
+ left: 0;
+ z-index: 15;
+ display: flex;
+ justify-content: center;
+ padding-left: 0;
+ margin-right: 15%;
+ margin-left: 15%;
+ list-style: none;
+}
+.bodywebsite .carousel-indicators li {
+ position: relative;
+ flex: 0 1 auto;
+ width: 30px;
+ height: 3px;
+ margin-right: 3px;
+ margin-left: 3px;
+ text-indent: -999px;
+ background-color: rgba(255, 255, 255, 0.5);
+}
+.bodywebsite .carousel-indicators li::before {
+ position: absolute;
+ top: -10px;
+ left: 0;
+ display: inline-block;
+ width: 100%;
+ height: 10px;
+ content: "";
+}
+.bodywebsite .carousel-indicators li::after {
+ position: absolute;
+ bottom: -10px;
+ left: 0;
+ display: inline-block;
+ width: 100%;
+ height: 10px;
+ content: "";
+}
+.bodywebsite .carousel-indicators .active {
+ background-color: #fff;
+}
+.bodywebsite .carousel-caption {
+ position: absolute;
+ right: 15%;
+ bottom: 20px;
+ left: 15%;
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: #fff;
+ text-align: center;
+}
+.bodywebsite .align-baseline {
+ vertical-align: baseline !important;
+}
+.bodywebsite .align-top {
+ vertical-align: top !important;
+}
+.bodywebsite .align-middle {
+ vertical-align: middle !important;
+}
+.bodywebsite .align-bottom {
+ vertical-align: bottom !important;
+}
+.bodywebsite .align-text-bottom {
+ vertical-align: text-bottom !important;
+}
+.bodywebsite .align-text-top {
+ vertical-align: text-top !important;
+}
+.bodywebsite .bg-primary {
+ background-color: #007bff !important;
+}
+.bodywebsite a.bg-primary:focus,
+.bodywebsite a.bg-primary:hover {
+ background-color: #0062cc !important;
+}
+.bodywebsite .bg-secondary {
+ background-color: #868e96 !important;
+}
+.bodywebsite a.bg-secondary:focus,
+.bodywebsite a.bg-secondary:hover {
+ background-color: #6c757d !important;
+}
+.bodywebsite .bg-success {
+ background-color: #28a745 !important;
+}
+.bodywebsite a.bg-success:focus,
+.bodywebsite a.bg-success:hover {
+ background-color: #1e7e34 !important;
+}
+.bodywebsite .bg-info {
+ background-color: #17a2b8 !important;
+}
+.bodywebsite a.bg-info:focus,
+.bodywebsite a.bg-info:hover {
+ background-color: #117a8b !important;
+}
+.bodywebsite .bg-warning {
+ background-color: #ffc107 !important;
+}
+.bodywebsite a.bg-warning:focus,
+.bodywebsite a.bg-warning:hover {
+ background-color: #d39e00 !important;
+}
+.bodywebsite .bg-danger {
+ background-color: #dc3545 !important;
+}
+.bodywebsite a.bg-danger:focus,
+.bodywebsite a.bg-danger:hover {
+ background-color: #bd2130 !important;
+}
+.bodywebsite .bg-light {
+ background-color: #f8f9fa !important;
+}
+.bodywebsite a.bg-light:focus,
+.bodywebsite a.bg-light:hover {
+ background-color: #dae0e5 !important;
+}
+.bodywebsite .bg-dark {
+ background-color: #343a40 !important;
+}
+.bodywebsite a.bg-dark:focus,
+.bodywebsite a.bg-dark:hover {
+ background-color: #1d2124 !important;
+}
+.bodywebsite .bg-default {
+ background-color: #fff !important;
+}
+.bodywebsite .bg-transparent {
+ background-color: transparent !important;
+}
+.bodywebsite .border {
+ border: 1px solid #e9ecef !important;
+}
+.bodywebsite .border-0 {
+ border: 0 !important;
+}
+.bodywebsite .border-top-0 {
+ border-top: 0 !important;
+}
+.bodywebsite .border-right-0 {
+ border-right: 0 !important;
+}
+.bodywebsite .border-bottom-0 {
+ border-bottom: 0 !important;
+}
+.bodywebsite .border-left-0 {
+ border-left: 0 !important;
+}
+.bodywebsite .border-primary {
+ border-color: #007bff !important;
+}
+.bodywebsite .border-secondary {
+ border-color: #868e96 !important;
+}
+.bodywebsite .border-success {
+ border-color: #28a745 !important;
+}
+.bodywebsite .border-info {
+ border-color: #17a2b8 !important;
+}
+.bodywebsite .border-warning {
+ border-color: #ffc107 !important;
+}
+.bodywebsite .border-danger {
+ border-color: #dc3545 !important;
+}
+.bodywebsite .border-light {
+ border-color: #f8f9fa !important;
+}
+.bodywebsite .border-dark {
+ border-color: #343a40 !important;
+}
+.bodywebsite .border-white {
+ border-color: #fff !important;
+}
+.bodywebsite .rounded {
+ border-radius: 0 !important;
+}
+.bodywebsite .rounded-top {
+ border-top-left-radius: 0 !important;
+ border-top-right-radius: 0 !important;
+}
+.bodywebsite .rounded-right {
+ border-top-right-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+}
+.bodywebsite .rounded-bottom {
+ border-bottom-right-radius: 0 !important;
+ border-bottom-left-radius: 0 !important;
+}
+.bodywebsite .rounded-left {
+ border-top-left-radius: 0 !important;
+ border-bottom-left-radius: 0 !important;
+}
+.bodywebsite .rounded-circle {
+ border-radius: 50% !important;
+}
+.bodywebsite .rounded-0 {
+ border-radius: 0 !important;
+}
+.bodywebsite .clearfix::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+.bodywebsite .d-none {
+ display: none !important;
+}
+.bodywebsite .d-inline {
+ display: inline !important;
+}
+.bodywebsite .d-inline-block {
+ display: inline-block !important;
+}
+.bodywebsite .d-block {
+ display: block !important;
+}
+.bodywebsite .d-table {
+ display: table !important;
+}
+.bodywebsite .d-table-row {
+ display: table-row !important;
+}
+.bodywebsite .d-table-cell {
+ display: table-cell !important;
+}
+.bodywebsite .d-flex {
+ display: flex !important;
+}
+.bodywebsite .d-inline-flex {
+ display: inline-flex !important;
+}
+@media (min-width: 576px) {
+ .bodywebsite .d-sm-none {
+ display: none !important;
+ }
+ .bodywebsite .d-sm-inline {
+ display: inline !important;
+ }
+ .bodywebsite .d-sm-inline-block {
+ display: inline-block !important;
+ }
+ .bodywebsite .d-sm-block {
+ display: block !important;
+ }
+ .bodywebsite .d-sm-table {
+ display: table !important;
+ }
+ .bodywebsite .d-sm-table-row {
+ display: table-row !important;
+ }
+ .bodywebsite .d-sm-table-cell {
+ display: table-cell !important;
+ }
+ .bodywebsite .d-sm-flex {
+ display: flex !important;
+ }
+ .bodywebsite .d-sm-inline-flex {
+ display: inline-flex !important;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .d-md-none {
+ display: none !important;
+ }
+ .bodywebsite .d-md-inline {
+ display: inline !important;
+ }
+ .bodywebsite .d-md-inline-block {
+ display: inline-block !important;
+ }
+ .bodywebsite .d-md-block {
+ display: block !important;
+ }
+ .bodywebsite .d-md-table {
+ display: table !important;
+ }
+ .bodywebsite .d-md-table-row {
+ display: table-row !important;
+ }
+ .bodywebsite .d-md-table-cell {
+ display: table-cell !important;
+ }
+ .bodywebsite .d-md-flex {
+ display: flex !important;
+ }
+ .bodywebsite .d-md-inline-flex {
+ display: inline-flex !important;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .d-lg-none {
+ display: none !important;
+ }
+ .bodywebsite .d-lg-inline {
+ display: inline !important;
+ }
+ .bodywebsite .d-lg-inline-block {
+ display: inline-block !important;
+ }
+ .bodywebsite .d-lg-block {
+ display: block !important;
+ }
+ .bodywebsite .d-lg-table {
+ display: table !important;
+ }
+ .bodywebsite .d-lg-table-row {
+ display: table-row !important;
+ }
+ .bodywebsite .d-lg-table-cell {
+ display: table-cell !important;
+ }
+ .bodywebsite .d-lg-flex {
+ display: flex !important;
+ }
+ .bodywebsite .d-lg-inline-flex {
+ display: inline-flex !important;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .d-xl-none {
+ display: none !important;
+ }
+ .bodywebsite .d-xl-inline {
+ display: inline !important;
+ }
+ .bodywebsite .d-xl-inline-block {
+ display: inline-block !important;
+ }
+ .bodywebsite .d-xl-block {
+ display: block !important;
+ }
+ .bodywebsite .d-xl-table {
+ display: table !important;
+ }
+ .bodywebsite .d-xl-table-row {
+ display: table-row !important;
+ }
+ .bodywebsite .d-xl-table-cell {
+ display: table-cell !important;
+ }
+ .bodywebsite .d-xl-flex {
+ display: flex !important;
+ }
+ .bodywebsite .d-xl-inline-flex {
+ display: inline-flex !important;
+ }
+}
+@media (min-width: 1800px) {
+ .bodywebsite .d-xxl-none {
+ display: none !important;
+ }
+ .bodywebsite .d-xxl-inline {
+ display: inline !important;
+ }
+ .bodywebsite .d-xxl-inline-block {
+ display: inline-block !important;
+ }
+ .bodywebsite .d-xxl-block {
+ display: block !important;
+ }
+ .bodywebsite .d-xxl-table {
+ display: table !important;
+ }
+ .bodywebsite .d-xxl-table-row {
+ display: table-row !important;
+ }
+ .bodywebsite .d-xxl-table-cell {
+ display: table-cell !important;
+ }
+ .bodywebsite .d-xxl-flex {
+ display: flex !important;
+ }
+ .bodywebsite .d-xxl-inline-flex {
+ display: inline-flex !important;
+ }
+}
+.bodywebsite .d-print-block {
+ display: none !important;
+}
+@media print {
+ .bodywebsite .d-print-block {
+ display: block !important;
+ }
+}
+.bodywebsite .d-print-inline {
+ display: none !important;
+}
+@media print {
+ .bodywebsite .d-print-inline {
+ display: inline !important;
+ }
+}
+.bodywebsite .d-print-inline-block {
+ display: none !important;
+}
+@media print {
+ .bodywebsite .d-print-inline-block {
+ display: inline-block !important;
+ }
+}
+@media print {
+ .bodywebsite .d-print-none {
+ display: none !important;
+ }
+}
+.bodywebsite .embed-responsive {
+ position: relative;
+ display: block;
+ width: 100%;
+ padding: 0;
+ overflow: hidden;
+}
+.bodywebsite .embed-responsive::before {
+ display: block;
+ content: "";
+}
+.bodywebsite .embed-responsive .embed-responsive-item,
+.bodywebsite .embed-responsive iframe,
+.bodywebsite .embed-responsive embed,
+.bodywebsite .embed-responsive object,
+.bodywebsite .embed-responsive video {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ border: 0;
+}
+.bodywebsite .embed-responsive-21by9::before {
+ padding-top: 42.85714%;
+}
+.bodywebsite .embed-responsive-16by9::before {
+ padding-top: 56.25%;
+}
+.bodywebsite .embed-responsive-4by3::before {
+ padding-top: 75%;
+}
+.bodywebsite .embed-responsive-1by1::before {
+ padding-top: 100%;
+}
+.bodywebsite .flex-row {
+ flex-direction: row !important;
+}
+.bodywebsite .flex-column {
+ flex-direction: column !important;
+}
+.bodywebsite .flex-row-reverse {
+ flex-direction: row-reverse !important;
+}
+.bodywebsite .flex-column-reverse {
+ flex-direction: column-reverse !important;
+}
+.bodywebsite .flex-wrap {
+ flex-wrap: wrap !important;
+}
+.bodywebsite .flex-nowrap {
+ flex-wrap: nowrap !important;
+}
+.bodywebsite .flex-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+}
+.bodywebsite .justify-content-start {
+ justify-content: flex-start !important;
+}
+.bodywebsite .justify-content-end {
+ justify-content: flex-end !important;
+}
+.bodywebsite .justify-content-center {
+ justify-content: center !important;
+}
+.bodywebsite .justify-content-between {
+ justify-content: space-between !important;
+}
+.bodywebsite .justify-content-around {
+ justify-content: space-around !important;
+}
+.bodywebsite .align-items-start {
+ align-items: flex-start !important;
+}
+.bodywebsite .align-items-end {
+ align-items: flex-end !important;
+}
+.bodywebsite .align-items-center {
+ align-items: center !important;
+}
+.bodywebsite .align-items-baseline {
+ align-items: baseline !important;
+}
+.bodywebsite .align-items-stretch {
+ align-items: stretch !important;
+}
+.bodywebsite .align-content-start {
+ align-content: flex-start !important;
+}
+.bodywebsite .align-content-end {
+ align-content: flex-end !important;
+}
+.bodywebsite .align-content-center {
+ align-content: center !important;
+}
+.bodywebsite .align-content-between {
+ align-content: space-between !important;
+}
+.bodywebsite .align-content-around {
+ align-content: space-around !important;
+}
+.bodywebsite .align-content-stretch {
+ align-content: stretch !important;
+}
+.bodywebsite .align-self-auto {
+ align-self: auto !important;
+}
+.bodywebsite .align-self-start {
+ align-self: flex-start !important;
+}
+.bodywebsite .align-self-end {
+ align-self: flex-end !important;
+}
+.bodywebsite .align-self-center {
+ align-self: center !important;
+}
+.bodywebsite .align-self-baseline {
+ align-self: baseline !important;
+}
+.bodywebsite .align-self-stretch {
+ align-self: stretch !important;
+}
+@media (min-width: 576px) {
+ .bodywebsite .flex-sm-row {
+ flex-direction: row !important;
+ }
+ .bodywebsite .flex-sm-column {
+ flex-direction: column !important;
+ }
+ .bodywebsite .flex-sm-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+ .bodywebsite .flex-sm-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+ .bodywebsite .flex-sm-wrap {
+ flex-wrap: wrap !important;
+ }
+ .bodywebsite .flex-sm-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .bodywebsite .flex-sm-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+ .bodywebsite .justify-content-sm-start {
+ justify-content: flex-start !important;
+ }
+ .bodywebsite .justify-content-sm-end {
+ justify-content: flex-end !important;
+ }
+ .bodywebsite .justify-content-sm-center {
+ justify-content: center !important;
+ }
+ .bodywebsite .justify-content-sm-between {
+ justify-content: space-between !important;
+ }
+ .bodywebsite .justify-content-sm-around {
+ justify-content: space-around !important;
+ }
+ .bodywebsite .align-items-sm-start {
+ align-items: flex-start !important;
+ }
+ .bodywebsite .align-items-sm-end {
+ align-items: flex-end !important;
+ }
+ .bodywebsite .align-items-sm-center {
+ align-items: center !important;
+ }
+ .bodywebsite .align-items-sm-baseline {
+ align-items: baseline !important;
+ }
+ .bodywebsite .align-items-sm-stretch {
+ align-items: stretch !important;
+ }
+ .bodywebsite .align-content-sm-start {
+ align-content: flex-start !important;
+ }
+ .bodywebsite .align-content-sm-end {
+ align-content: flex-end !important;
+ }
+ .bodywebsite .align-content-sm-center {
+ align-content: center !important;
+ }
+ .bodywebsite .align-content-sm-between {
+ align-content: space-between !important;
+ }
+ .bodywebsite .align-content-sm-around {
+ align-content: space-around !important;
+ }
+ .bodywebsite .align-content-sm-stretch {
+ align-content: stretch !important;
+ }
+ .bodywebsite .align-self-sm-auto {
+ align-self: auto !important;
+ }
+ .bodywebsite .align-self-sm-start {
+ align-self: flex-start !important;
+ }
+ .bodywebsite .align-self-sm-end {
+ align-self: flex-end !important;
+ }
+ .bodywebsite .align-self-sm-center {
+ align-self: center !important;
+ }
+ .bodywebsite .align-self-sm-baseline {
+ align-self: baseline !important;
+ }
+ .bodywebsite .align-self-sm-stretch {
+ align-self: stretch !important;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .flex-md-row {
+ flex-direction: row !important;
+ }
+ .bodywebsite .flex-md-column {
+ flex-direction: column !important;
+ }
+ .bodywebsite .flex-md-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+ .bodywebsite .flex-md-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+ .bodywebsite .flex-md-wrap {
+ flex-wrap: wrap !important;
+ }
+ .bodywebsite .flex-md-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .bodywebsite .flex-md-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+ .bodywebsite .justify-content-md-start {
+ justify-content: flex-start !important;
+ }
+ .bodywebsite .justify-content-md-end {
+ justify-content: flex-end !important;
+ }
+ .bodywebsite .justify-content-md-center {
+ justify-content: center !important;
+ }
+ .bodywebsite .justify-content-md-between {
+ justify-content: space-between !important;
+ }
+ .bodywebsite .justify-content-md-around {
+ justify-content: space-around !important;
+ }
+ .bodywebsite .align-items-md-start {
+ align-items: flex-start !important;
+ }
+ .bodywebsite .align-items-md-end {
+ align-items: flex-end !important;
+ }
+ .bodywebsite .align-items-md-center {
+ align-items: center !important;
+ }
+ .bodywebsite .align-items-md-baseline {
+ align-items: baseline !important;
+ }
+ .bodywebsite .align-items-md-stretch {
+ align-items: stretch !important;
+ }
+ .bodywebsite .align-content-md-start {
+ align-content: flex-start !important;
+ }
+ .bodywebsite .align-content-md-end {
+ align-content: flex-end !important;
+ }
+ .bodywebsite .align-content-md-center {
+ align-content: center !important;
+ }
+ .bodywebsite .align-content-md-between {
+ align-content: space-between !important;
+ }
+ .bodywebsite .align-content-md-around {
+ align-content: space-around !important;
+ }
+ .bodywebsite .align-content-md-stretch {
+ align-content: stretch !important;
+ }
+ .bodywebsite .align-self-md-auto {
+ align-self: auto !important;
+ }
+ .bodywebsite .align-self-md-start {
+ align-self: flex-start !important;
+ }
+ .bodywebsite .align-self-md-end {
+ align-self: flex-end !important;
+ }
+ .bodywebsite .align-self-md-center {
+ align-self: center !important;
+ }
+ .bodywebsite .align-self-md-baseline {
+ align-self: baseline !important;
+ }
+ .bodywebsite .align-self-md-stretch {
+ align-self: stretch !important;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .flex-lg-row {
+ flex-direction: row !important;
+ }
+ .bodywebsite .flex-lg-column {
+ flex-direction: column !important;
+ }
+ .bodywebsite .flex-lg-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+ .bodywebsite .flex-lg-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+ .bodywebsite .flex-lg-wrap {
+ flex-wrap: wrap !important;
+ }
+ .bodywebsite .flex-lg-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .bodywebsite .flex-lg-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+ .bodywebsite .justify-content-lg-start {
+ justify-content: flex-start !important;
+ }
+ .bodywebsite .justify-content-lg-end {
+ justify-content: flex-end !important;
+ }
+ .bodywebsite .justify-content-lg-center {
+ justify-content: center !important;
+ }
+ .bodywebsite .justify-content-lg-between {
+ justify-content: space-between !important;
+ }
+ .bodywebsite .justify-content-lg-around {
+ justify-content: space-around !important;
+ }
+ .bodywebsite .align-items-lg-start {
+ align-items: flex-start !important;
+ }
+ .bodywebsite .align-items-lg-end {
+ align-items: flex-end !important;
+ }
+ .bodywebsite .align-items-lg-center {
+ align-items: center !important;
+ }
+ .bodywebsite .align-items-lg-baseline {
+ align-items: baseline !important;
+ }
+ .bodywebsite .align-items-lg-stretch {
+ align-items: stretch !important;
+ }
+ .bodywebsite .align-content-lg-start {
+ align-content: flex-start !important;
+ }
+ .bodywebsite .align-content-lg-end {
+ align-content: flex-end !important;
+ }
+ .bodywebsite .align-content-lg-center {
+ align-content: center !important;
+ }
+ .bodywebsite .align-content-lg-between {
+ align-content: space-between !important;
+ }
+ .bodywebsite .align-content-lg-around {
+ align-content: space-around !important;
+ }
+ .bodywebsite .align-content-lg-stretch {
+ align-content: stretch !important;
+ }
+ .bodywebsite .align-self-lg-auto {
+ align-self: auto !important;
+ }
+ .bodywebsite .align-self-lg-start {
+ align-self: flex-start !important;
+ }
+ .bodywebsite .align-self-lg-end {
+ align-self: flex-end !important;
+ }
+ .bodywebsite .align-self-lg-center {
+ align-self: center !important;
+ }
+ .bodywebsite .align-self-lg-baseline {
+ align-self: baseline !important;
+ }
+ .bodywebsite .align-self-lg-stretch {
+ align-self: stretch !important;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .flex-xl-row {
+ flex-direction: row !important;
+ }
+ .bodywebsite .flex-xl-column {
+ flex-direction: column !important;
+ }
+ .bodywebsite .flex-xl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+ .bodywebsite .flex-xl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+ .bodywebsite .flex-xl-wrap {
+ flex-wrap: wrap !important;
+ }
+ .bodywebsite .flex-xl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .bodywebsite .flex-xl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+ .bodywebsite .justify-content-xl-start {
+ justify-content: flex-start !important;
+ }
+ .bodywebsite .justify-content-xl-end {
+ justify-content: flex-end !important;
+ }
+ .bodywebsite .justify-content-xl-center {
+ justify-content: center !important;
+ }
+ .bodywebsite .justify-content-xl-between {
+ justify-content: space-between !important;
+ }
+ .bodywebsite .justify-content-xl-around {
+ justify-content: space-around !important;
+ }
+ .bodywebsite .align-items-xl-start {
+ align-items: flex-start !important;
+ }
+ .bodywebsite .align-items-xl-end {
+ align-items: flex-end !important;
+ }
+ .bodywebsite .align-items-xl-center {
+ align-items: center !important;
+ }
+ .bodywebsite .align-items-xl-baseline {
+ align-items: baseline !important;
+ }
+ .bodywebsite .align-items-xl-stretch {
+ align-items: stretch !important;
+ }
+ .bodywebsite .align-content-xl-start {
+ align-content: flex-start !important;
+ }
+ .bodywebsite .align-content-xl-end {
+ align-content: flex-end !important;
+ }
+ .bodywebsite .align-content-xl-center {
+ align-content: center !important;
+ }
+ .bodywebsite .align-content-xl-between {
+ align-content: space-between !important;
+ }
+ .bodywebsite .align-content-xl-around {
+ align-content: space-around !important;
+ }
+ .bodywebsite .align-content-xl-stretch {
+ align-content: stretch !important;
+ }
+ .bodywebsite .align-self-xl-auto {
+ align-self: auto !important;
+ }
+ .bodywebsite .align-self-xl-start {
+ align-self: flex-start !important;
+ }
+ .bodywebsite .align-self-xl-end {
+ align-self: flex-end !important;
+ }
+ .bodywebsite .align-self-xl-center {
+ align-self: center !important;
+ }
+ .bodywebsite .align-self-xl-baseline {
+ align-self: baseline !important;
+ }
+ .bodywebsite .align-self-xl-stretch {
+ align-self: stretch !important;
+ }
+}
+@media (min-width: 1800px) {
+ .bodywebsite .flex-xxl-row {
+ flex-direction: row !important;
+ }
+ .bodywebsite .flex-xxl-column {
+ flex-direction: column !important;
+ }
+ .bodywebsite .flex-xxl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+ .bodywebsite .flex-xxl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+ .bodywebsite .flex-xxl-wrap {
+ flex-wrap: wrap !important;
+ }
+ .bodywebsite .flex-xxl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .bodywebsite .flex-xxl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+ .bodywebsite .justify-content-xxl-start {
+ justify-content: flex-start !important;
+ }
+ .bodywebsite .justify-content-xxl-end {
+ justify-content: flex-end !important;
+ }
+ .bodywebsite .justify-content-xxl-center {
+ justify-content: center !important;
+ }
+ .bodywebsite .justify-content-xxl-between {
+ justify-content: space-between !important;
+ }
+ .bodywebsite .justify-content-xxl-around {
+ justify-content: space-around !important;
+ }
+ .bodywebsite .align-items-xxl-start {
+ align-items: flex-start !important;
+ }
+ .bodywebsite .align-items-xxl-end {
+ align-items: flex-end !important;
+ }
+ .bodywebsite .align-items-xxl-center {
+ align-items: center !important;
+ }
+ .bodywebsite .align-items-xxl-baseline {
+ align-items: baseline !important;
+ }
+ .bodywebsite .align-items-xxl-stretch {
+ align-items: stretch !important;
+ }
+ .bodywebsite .align-content-xxl-start {
+ align-content: flex-start !important;
+ }
+ .bodywebsite .align-content-xxl-end {
+ align-content: flex-end !important;
+ }
+ .bodywebsite .align-content-xxl-center {
+ align-content: center !important;
+ }
+ .bodywebsite .align-content-xxl-between {
+ align-content: space-between !important;
+ }
+ .bodywebsite .align-content-xxl-around {
+ align-content: space-around !important;
+ }
+ .bodywebsite .align-content-xxl-stretch {
+ align-content: stretch !important;
+ }
+ .bodywebsite .align-self-xxl-auto {
+ align-self: auto !important;
+ }
+ .bodywebsite .align-self-xxl-start {
+ align-self: flex-start !important;
+ }
+ .bodywebsite .align-self-xxl-end {
+ align-self: flex-end !important;
+ }
+ .bodywebsite .align-self-xxl-center {
+ align-self: center !important;
+ }
+ .bodywebsite .align-self-xxl-baseline {
+ align-self: baseline !important;
+ }
+ .bodywebsite .align-self-xxl-stretch {
+ align-self: stretch !important;
+ }
+}
+.bodywebsite .float-left {
+ float: left !important;
+}
+.bodywebsite .float-right {
+ float: right !important;
+}
+.bodywebsite .float-none {
+ float: none !important;
+}
+@media (min-width: 576px) {
+ .bodywebsite .float-sm-left {
+ float: left !important;
+ }
+ .bodywebsite .float-sm-right {
+ float: right !important;
+ }
+ .bodywebsite .float-sm-none {
+ float: none !important;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .float-md-left {
+ float: left !important;
+ }
+ .bodywebsite .float-md-right {
+ float: right !important;
+ }
+ .bodywebsite .float-md-none {
+ float: none !important;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .float-lg-left {
+ float: left !important;
+ }
+ .bodywebsite .float-lg-right {
+ float: right !important;
+ }
+ .bodywebsite .float-lg-none {
+ float: none !important;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .float-xl-left {
+ float: left !important;
+ }
+ .bodywebsite .float-xl-right {
+ float: right !important;
+ }
+ .bodywebsite .float-xl-none {
+ float: none !important;
+ }
+}
+@media (min-width: 1800px) {
+ .bodywebsite .float-xxl-left {
+ float: left !important;
+ }
+ .bodywebsite .float-xxl-right {
+ float: right !important;
+ }
+ .bodywebsite .float-xxl-none {
+ float: none !important;
+ }
+}
+.bodywebsite .position-static {
+ position: static !important;
+}
+.bodywebsite .position-relative {
+ position: relative !important;
+}
+.bodywebsite .position-absolute {
+ position: absolute !important;
+}
+.bodywebsite .position-fixed {
+ position: fixed !important;
+}
+.bodywebsite .position-sticky {
+ position: sticky !important;
+}
+.bodywebsite .dolsticky {
+ position: sticky;
+ top: 0;
+ z-index: 100;
+}
+.bodywebsite .fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1030;
+}
+.bodywebsite .fixed-bottom {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1030;
+}
+@supports (position: sticky) {
+ .bodywebsite .sticky-top {
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+}
+.bodywebsite .sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ clip-path: inset(50%);
+ border: 0;
+}
+.bodywebsite .sr-only-focusable:active,
+.bodywebsite .sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ overflow: visible;
+ clip: auto;
+ white-space: normal;
+ clip-path: none;
+}
+.bodywebsite .w-25 {
+ width: 25% !important;
+}
+.bodywebsite .w-50 {
+ width: 50% !important;
+}
+.bodywebsite .w-75 {
+ width: 75% !important;
+}
+.bodywebsite .w-100 {
+ width: 100% !important;
+}
+.bodywebsite .h-25 {
+ height: 25% !important;
+}
+.bodywebsite .h-50 {
+ height: 50% !important;
+}
+.bodywebsite .h-75 {
+ height: 75% !important;
+}
+.bodywebsite .h-100 {
+ height: 100% !important;
+}
+.bodywebsite .mw-100 {
+ max-width: 100% !important;
+}
+.bodywebsite .mh-100 {
+ max-height: 100% !important;
+}
+.bodywebsite .m-0 {
+ margin: 0 !important;
+}
+.bodywebsite .mt-0,
+.bodywebsite .my-0 {
+ margin-top: 0 !important;
+}
+.bodywebsite .mr-0,
+.bodywebsite .mx-0 {
+ margin-right: 0 !important;
+}
+.bodywebsite .mb-0,
+.bodywebsite .my-0 {
+ margin-bottom: 0 !important;
+}
+.bodywebsite .ml-0,
+.bodywebsite .mx-0 {
+ margin-left: 0 !important;
+}
+.bodywebsite .m-1 {
+ margin: 0.25rem !important;
+}
+.bodywebsite .mt-1,
+.bodywebsite .my-1 {
+ margin-top: 0.25rem !important;
+}
+.bodywebsite .mr-1,
+.bodywebsite .mx-1 {
+ margin-right: 0.25rem !important;
+}
+.bodywebsite .mb-1,
+.bodywebsite .my-1 {
+ margin-bottom: 0.25rem !important;
+}
+.bodywebsite .ml-1,
+.bodywebsite .mx-1 {
+ margin-left: 0.25rem !important;
+}
+.bodywebsite .m-2 {
+ margin: 0.5rem !important;
+}
+.bodywebsite .mt-2,
+.bodywebsite .my-2 {
+ margin-top: 0.5rem !important;
+}
+.bodywebsite .mr-2,
+.bodywebsite .mx-2 {
+ margin-right: 0.5rem !important;
+}
+.bodywebsite .mb-2,
+.bodywebsite .my-2 {
+ margin-bottom: 0.5rem !important;
+}
+.bodywebsite .ml-2,
+.bodywebsite .mx-2 {
+ margin-left: 0.5rem !important;
+}
+.bodywebsite .m-3 {
+ margin: 1rem !important;
+}
+.bodywebsite .mt-3,
+.bodywebsite .my-3 {
+ margin-top: 1rem !important;
+}
+.bodywebsite .mr-3,
+.bodywebsite .mx-3 {
+ margin-right: 1rem !important;
+}
+.bodywebsite .mb-3,
+.bodywebsite .my-3 {
+ margin-bottom: 1rem !important;
+}
+.bodywebsite .ml-3,
+.bodywebsite .mx-3 {
+ margin-left: 1rem !important;
+}
+.bodywebsite .m-4 {
+ margin: 1.5rem !important;
+}
+.bodywebsite .mt-4,
+.bodywebsite .my-4 {
+ margin-top: 1.5rem !important;
+}
+.bodywebsite .mr-4,
+.bodywebsite .mx-4 {
+ margin-right: 1.5rem !important;
+}
+.bodywebsite .mb-4,
+.bodywebsite .my-4 {
+ margin-bottom: 1.5rem !important;
+}
+.bodywebsite .ml-4,
+.bodywebsite .mx-4 {
+ margin-left: 1.5rem !important;
+}
+.bodywebsite .m-5 {
+ margin: 3rem !important;
+}
+.bodywebsite .mt-5,
+.bodywebsite .my-5 {
+ margin-top: 3rem !important;
+}
+.bodywebsite .mr-5,
+.bodywebsite .mx-5 {
+ margin-right: 3rem !important;
+}
+.bodywebsite .mb-5,
+.bodywebsite .my-5 {
+ margin-bottom: 3rem !important;
+}
+.bodywebsite .ml-5,
+.bodywebsite .mx-5 {
+ margin-left: 3rem !important;
+}
+.bodywebsite .p-0 {
+ padding: 0 !important;
+}
+.bodywebsite .pt-0,
+.bodywebsite .py-0 {
+ padding-top: 0 !important;
+}
+.bodywebsite .pr-0,
+.bodywebsite .px-0 {
+ padding-right: 0 !important;
+}
+.bodywebsite .pb-0,
+.bodywebsite .py-0 {
+ padding-bottom: 0 !important;
+}
+.bodywebsite .pl-0,
+.bodywebsite .px-0 {
+ padding-left: 0 !important;
+}
+.bodywebsite .p-1 {
+ padding: 0.25rem !important;
+}
+.bodywebsite .pt-1,
+.bodywebsite .py-1 {
+ padding-top: 0.25rem !important;
+}
+.bodywebsite .pr-1,
+.bodywebsite .px-1 {
+ padding-right: 0.25rem !important;
+}
+.bodywebsite .pb-1,
+.bodywebsite .py-1 {
+ padding-bottom: 0.25rem !important;
+}
+.bodywebsite .pl-1,
+.bodywebsite .px-1 {
+ padding-left: 0.25rem !important;
+}
+.bodywebsite .p-2 {
+ padding: 0.5rem !important;
+}
+.bodywebsite .pt-2,
+.bodywebsite .py-2 {
+ padding-top: 0.5rem !important;
+}
+.bodywebsite .pr-2,
+.bodywebsite .px-2 {
+ padding-right: 0.5rem !important;
+}
+.bodywebsite .pb-2,
+.bodywebsite .py-2 {
+ padding-bottom: 0.5rem !important;
+}
+.bodywebsite .pl-2,
+.bodywebsite .px-2 {
+ padding-left: 0.5rem !important;
+}
+.bodywebsite .p-3 {
+ padding: 1rem !important;
+}
+.bodywebsite .pt-3,
+.bodywebsite .py-3 {
+ padding-top: 1rem !important;
+}
+.bodywebsite .pr-3,
+.bodywebsite .px-3 {
+ padding-right: 1rem !important;
+}
+.bodywebsite .pb-3,
+.bodywebsite .py-3 {
+ padding-bottom: 1rem !important;
+}
+.bodywebsite .pl-3,
+.bodywebsite .px-3 {
+ padding-left: 1rem !important;
+}
+.bodywebsite .p-4 {
+ padding: 1.5rem !important;
+}
+.bodywebsite .pt-4,
+.bodywebsite .py-4 {
+ padding-top: 1.5rem !important;
+}
+.bodywebsite .pr-4,
+.bodywebsite .px-4 {
+ padding-right: 1.5rem !important;
+}
+.bodywebsite .pb-4,
+.bodywebsite .py-4 {
+ padding-bottom: 1.5rem !important;
+}
+.bodywebsite .pl-4,
+.bodywebsite .px-4 {
+ padding-left: 1.5rem !important;
+}
+.bodywebsite .p-5 {
+ padding: 3rem !important;
+}
+.bodywebsite .pt-5,
+.bodywebsite .py-5 {
+ padding-top: 3rem !important;
+}
+.bodywebsite .pr-5,
+.bodywebsite .px-5 {
+ padding-right: 3rem !important;
+}
+.bodywebsite .pb-5,
+.bodywebsite .py-5 {
+ padding-bottom: 3rem !important;
+}
+.bodywebsite .pl-5,
+.bodywebsite .px-5 {
+ padding-left: 3rem !important;
+}
+.bodywebsite .m-auto {
+ margin: auto !important;
+}
+.bodywebsite .mt-auto,
+.bodywebsite .my-auto {
+ margin-top: auto !important;
+}
+.bodywebsite .mr-auto,
+.bodywebsite .mx-auto {
+ margin-right: auto !important;
+}
+.bodywebsite .mb-auto,
+.bodywebsite .my-auto {
+ margin-bottom: auto !important;
+}
+.bodywebsite .ml-auto,
+.bodywebsite .mx-auto {
+ margin-left: auto !important;
+}
+@media (min-width: 576px) {
+ .bodywebsite .m-sm-0 {
+ margin: 0 !important;
+ }
+ .bodywebsite .mt-sm-0,
+ .bodywebsite .my-sm-0 {
+ margin-top: 0 !important;
+ }
+ .bodywebsite .mr-sm-0,
+ .bodywebsite .mx-sm-0 {
+ margin-right: 0 !important;
+ }
+ .bodywebsite .mb-sm-0,
+ .bodywebsite .my-sm-0 {
+ margin-bottom: 0 !important;
+ }
+ .bodywebsite .ml-sm-0,
+ .bodywebsite .mx-sm-0 {
+ margin-left: 0 !important;
+ }
+ .bodywebsite .m-sm-1 {
+ margin: 0.25rem !important;
+ }
+ .bodywebsite .mt-sm-1,
+ .bodywebsite .my-sm-1 {
+ margin-top: 0.25rem !important;
+ }
+ .bodywebsite .mr-sm-1,
+ .bodywebsite .mx-sm-1 {
+ margin-right: 0.25rem !important;
+ }
+ .bodywebsite .mb-sm-1,
+ .bodywebsite .my-sm-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .bodywebsite .ml-sm-1,
+ .bodywebsite .mx-sm-1 {
+ margin-left: 0.25rem !important;
+ }
+ .bodywebsite .m-sm-2 {
+ margin: 0.5rem !important;
+ }
+ .bodywebsite .mt-sm-2,
+ .bodywebsite .my-sm-2 {
+ margin-top: 0.5rem !important;
+ }
+ .bodywebsite .mr-sm-2,
+ .bodywebsite .mx-sm-2 {
+ margin-right: 0.5rem !important;
+ }
+ .bodywebsite .mb-sm-2,
+ .bodywebsite .my-sm-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .bodywebsite .ml-sm-2,
+ .bodywebsite .mx-sm-2 {
+ margin-left: 0.5rem !important;
+ }
+ .bodywebsite .m-sm-3 {
+ margin: 1rem !important;
+ }
+ .bodywebsite .mt-sm-3,
+ .bodywebsite .my-sm-3 {
+ margin-top: 1rem !important;
+ }
+ .bodywebsite .mr-sm-3,
+ .bodywebsite .mx-sm-3 {
+ margin-right: 1rem !important;
+ }
+ .bodywebsite .mb-sm-3,
+ .bodywebsite .my-sm-3 {
+ margin-bottom: 1rem !important;
+ }
+ .bodywebsite .ml-sm-3,
+ .bodywebsite .mx-sm-3 {
+ margin-left: 1rem !important;
+ }
+ .bodywebsite .m-sm-4 {
+ margin: 1.5rem !important;
+ }
+ .bodywebsite .mt-sm-4,
+ .bodywebsite .my-sm-4 {
+ margin-top: 1.5rem !important;
+ }
+ .bodywebsite .mr-sm-4,
+ .bodywebsite .mx-sm-4 {
+ margin-right: 1.5rem !important;
+ }
+ .bodywebsite .mb-sm-4,
+ .bodywebsite .my-sm-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .bodywebsite .ml-sm-4,
+ .bodywebsite .mx-sm-4 {
+ margin-left: 1.5rem !important;
+ }
+ .bodywebsite .m-sm-5 {
+ margin: 3rem !important;
+ }
+ .bodywebsite .mt-sm-5,
+ .bodywebsite .my-sm-5 {
+ margin-top: 3rem !important;
+ }
+ .bodywebsite .mr-sm-5,
+ .bodywebsite .mx-sm-5 {
+ margin-right: 3rem !important;
+ }
+ .bodywebsite .mb-sm-5,
+ .bodywebsite .my-sm-5 {
+ margin-bottom: 3rem !important;
+ }
+ .bodywebsite .ml-sm-5,
+ .bodywebsite .mx-sm-5 {
+ margin-left: 3rem !important;
+ }
+ .bodywebsite .p-sm-0 {
+ padding: 0 !important;
+ }
+ .bodywebsite .pt-sm-0,
+ .bodywebsite .py-sm-0 {
+ padding-top: 0 !important;
+ }
+ .bodywebsite .pr-sm-0,
+ .bodywebsite .px-sm-0 {
+ padding-right: 0 !important;
+ }
+ .bodywebsite .pb-sm-0,
+ .bodywebsite .py-sm-0 {
+ padding-bottom: 0 !important;
+ }
+ .bodywebsite .pl-sm-0,
+ .bodywebsite .px-sm-0 {
+ padding-left: 0 !important;
+ }
+ .bodywebsite .p-sm-1 {
+ padding: 0.25rem !important;
+ }
+ .bodywebsite .pt-sm-1,
+ .bodywebsite .py-sm-1 {
+ padding-top: 0.25rem !important;
+ }
+ .bodywebsite .pr-sm-1,
+ .bodywebsite .px-sm-1 {
+ padding-right: 0.25rem !important;
+ }
+ .bodywebsite .pb-sm-1,
+ .bodywebsite .py-sm-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .bodywebsite .pl-sm-1,
+ .bodywebsite .px-sm-1 {
+ padding-left: 0.25rem !important;
+ }
+ .bodywebsite .p-sm-2 {
+ padding: 0.5rem !important;
+ }
+ .bodywebsite .pt-sm-2,
+ .bodywebsite .py-sm-2 {
+ padding-top: 0.5rem !important;
+ }
+ .bodywebsite .pr-sm-2,
+ .bodywebsite .px-sm-2 {
+ padding-right: 0.5rem !important;
+ }
+ .bodywebsite .pb-sm-2,
+ .bodywebsite .py-sm-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .bodywebsite .pl-sm-2,
+ .bodywebsite .px-sm-2 {
+ padding-left: 0.5rem !important;
+ }
+ .bodywebsite .p-sm-3 {
+ padding: 1rem !important;
+ }
+ .bodywebsite .pt-sm-3,
+ .bodywebsite .py-sm-3 {
+ padding-top: 1rem !important;
+ }
+ .bodywebsite .pr-sm-3,
+ .bodywebsite .px-sm-3 {
+ padding-right: 1rem !important;
+ }
+ .bodywebsite .pb-sm-3,
+ .bodywebsite .py-sm-3 {
+ padding-bottom: 1rem !important;
+ }
+ .bodywebsite .pl-sm-3,
+ .bodywebsite .px-sm-3 {
+ padding-left: 1rem !important;
+ }
+ .bodywebsite .p-sm-4 {
+ padding: 1.5rem !important;
+ }
+ .bodywebsite .pt-sm-4,
+ .bodywebsite .py-sm-4 {
+ padding-top: 1.5rem !important;
+ }
+ .bodywebsite .pr-sm-4,
+ .bodywebsite .px-sm-4 {
+ padding-right: 1.5rem !important;
+ }
+ .bodywebsite .pb-sm-4,
+ .bodywebsite .py-sm-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .bodywebsite .pl-sm-4,
+ .bodywebsite .px-sm-4 {
+ padding-left: 1.5rem !important;
+ }
+ .bodywebsite .p-sm-5 {
+ padding: 3rem !important;
+ }
+ .bodywebsite .pt-sm-5,
+ .bodywebsite .py-sm-5 {
+ padding-top: 3rem !important;
+ }
+ .bodywebsite .pr-sm-5,
+ .bodywebsite .px-sm-5 {
+ padding-right: 3rem !important;
+ }
+ .bodywebsite .pb-sm-5,
+ .bodywebsite .py-sm-5 {
+ padding-bottom: 3rem !important;
+ }
+ .bodywebsite .pl-sm-5,
+ .bodywebsite .px-sm-5 {
+ padding-left: 3rem !important;
+ }
+ .bodywebsite .m-sm-auto {
+ margin: auto !important;
+ }
+ .bodywebsite .mt-sm-auto,
+ .bodywebsite .my-sm-auto {
+ margin-top: auto !important;
+ }
+ .bodywebsite .mr-sm-auto,
+ .bodywebsite .mx-sm-auto {
+ margin-right: auto !important;
+ }
+ .bodywebsite .mb-sm-auto,
+ .bodywebsite .my-sm-auto {
+ margin-bottom: auto !important;
+ }
+ .bodywebsite .ml-sm-auto,
+ .bodywebsite .mx-sm-auto {
+ margin-left: auto !important;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .m-md-0 {
+ margin: 0 !important;
+ }
+ .bodywebsite .mt-md-0,
+ .bodywebsite .my-md-0 {
+ margin-top: 0 !important;
+ }
+ .bodywebsite .mr-md-0,
+ .bodywebsite .mx-md-0 {
+ margin-right: 0 !important;
+ }
+ .bodywebsite .mb-md-0,
+ .bodywebsite .my-md-0 {
+ margin-bottom: 0 !important;
+ }
+ .bodywebsite .ml-md-0,
+ .bodywebsite .mx-md-0 {
+ margin-left: 0 !important;
+ }
+ .bodywebsite .m-md-1 {
+ margin: 0.25rem !important;
+ }
+ .bodywebsite .mt-md-1,
+ .bodywebsite .my-md-1 {
+ margin-top: 0.25rem !important;
+ }
+ .bodywebsite .mr-md-1,
+ .bodywebsite .mx-md-1 {
+ margin-right: 0.25rem !important;
+ }
+ .bodywebsite .mb-md-1,
+ .bodywebsite .my-md-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .bodywebsite .ml-md-1,
+ .bodywebsite .mx-md-1 {
+ margin-left: 0.25rem !important;
+ }
+ .bodywebsite .m-md-2 {
+ margin: 0.5rem !important;
+ }
+ .bodywebsite .mt-md-2,
+ .bodywebsite .my-md-2 {
+ margin-top: 0.5rem !important;
+ }
+ .bodywebsite .mr-md-2,
+ .bodywebsite .mx-md-2 {
+ margin-right: 0.5rem !important;
+ }
+ .bodywebsite .mb-md-2,
+ .bodywebsite .my-md-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .bodywebsite .ml-md-2,
+ .bodywebsite .mx-md-2 {
+ margin-left: 0.5rem !important;
+ }
+ .bodywebsite .m-md-3 {
+ margin: 1rem !important;
+ }
+ .bodywebsite .mt-md-3,
+ .bodywebsite .my-md-3 {
+ margin-top: 1rem !important;
+ }
+ .bodywebsite .mr-md-3,
+ .bodywebsite .mx-md-3 {
+ margin-right: 1rem !important;
+ }
+ .bodywebsite .mb-md-3,
+ .bodywebsite .my-md-3 {
+ margin-bottom: 1rem !important;
+ }
+ .bodywebsite .ml-md-3,
+ .bodywebsite .mx-md-3 {
+ margin-left: 1rem !important;
+ }
+ .bodywebsite .m-md-4 {
+ margin: 1.5rem !important;
+ }
+ .bodywebsite .mt-md-4,
+ .bodywebsite .my-md-4 {
+ margin-top: 1.5rem !important;
+ }
+ .bodywebsite .mr-md-4,
+ .bodywebsite .mx-md-4 {
+ margin-right: 1.5rem !important;
+ }
+ .bodywebsite .mb-md-4,
+ .bodywebsite .my-md-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .bodywebsite .ml-md-4,
+ .bodywebsite .mx-md-4 {
+ margin-left: 1.5rem !important;
+ }
+ .bodywebsite .m-md-5 {
+ margin: 3rem !important;
+ }
+ .bodywebsite .mt-md-5,
+ .bodywebsite .my-md-5 {
+ margin-top: 3rem !important;
+ }
+ .bodywebsite .mr-md-5,
+ .bodywebsite .mx-md-5 {
+ margin-right: 3rem !important;
+ }
+ .bodywebsite .mb-md-5,
+ .bodywebsite .my-md-5 {
+ margin-bottom: 3rem !important;
+ }
+ .bodywebsite .ml-md-5,
+ .bodywebsite .mx-md-5 {
+ margin-left: 3rem !important;
+ }
+ .bodywebsite .p-md-0 {
+ padding: 0 !important;
+ }
+ .bodywebsite .pt-md-0,
+ .bodywebsite .py-md-0 {
+ padding-top: 0 !important;
+ }
+ .bodywebsite .pr-md-0,
+ .bodywebsite .px-md-0 {
+ padding-right: 0 !important;
+ }
+ .bodywebsite .pb-md-0,
+ .bodywebsite .py-md-0 {
+ padding-bottom: 0 !important;
+ }
+ .bodywebsite .pl-md-0,
+ .bodywebsite .px-md-0 {
+ padding-left: 0 !important;
+ }
+ .bodywebsite .p-md-1 {
+ padding: 0.25rem !important;
+ }
+ .bodywebsite .pt-md-1,
+ .bodywebsite .py-md-1 {
+ padding-top: 0.25rem !important;
+ }
+ .bodywebsite .pr-md-1,
+ .bodywebsite .px-md-1 {
+ padding-right: 0.25rem !important;
+ }
+ .bodywebsite .pb-md-1,
+ .bodywebsite .py-md-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .bodywebsite .pl-md-1,
+ .bodywebsite .px-md-1 {
+ padding-left: 0.25rem !important;
+ }
+ .bodywebsite .p-md-2 {
+ padding: 0.5rem !important;
+ }
+ .bodywebsite .pt-md-2,
+ .bodywebsite .py-md-2 {
+ padding-top: 0.5rem !important;
+ }
+ .bodywebsite .pr-md-2,
+ .bodywebsite .px-md-2 {
+ padding-right: 0.5rem !important;
+ }
+ .bodywebsite .pb-md-2,
+ .bodywebsite .py-md-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .bodywebsite .pl-md-2,
+ .bodywebsite .px-md-2 {
+ padding-left: 0.5rem !important;
+ }
+ .bodywebsite .p-md-3 {
+ padding: 1rem !important;
+ }
+ .bodywebsite .pt-md-3,
+ .bodywebsite .py-md-3 {
+ padding-top: 1rem !important;
+ }
+ .bodywebsite .pr-md-3,
+ .bodywebsite .px-md-3 {
+ padding-right: 1rem !important;
+ }
+ .bodywebsite .pb-md-3,
+ .bodywebsite .py-md-3 {
+ padding-bottom: 1rem !important;
+ }
+ .bodywebsite .pl-md-3,
+ .bodywebsite .px-md-3 {
+ padding-left: 1rem !important;
+ }
+ .bodywebsite .p-md-4 {
+ padding: 1.5rem !important;
+ }
+ .bodywebsite .pt-md-4,
+ .bodywebsite .py-md-4 {
+ padding-top: 1.5rem !important;
+ }
+ .bodywebsite .pr-md-4,
+ .bodywebsite .px-md-4 {
+ padding-right: 1.5rem !important;
+ }
+ .bodywebsite .pb-md-4,
+ .bodywebsite .py-md-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .bodywebsite .pl-md-4,
+ .bodywebsite .px-md-4 {
+ padding-left: 1.5rem !important;
+ }
+ .bodywebsite .p-md-5 {
+ padding: 3rem !important;
+ }
+ .bodywebsite .pt-md-5,
+ .bodywebsite .py-md-5 {
+ padding-top: 3rem !important;
+ }
+ .bodywebsite .pr-md-5,
+ .bodywebsite .px-md-5 {
+ padding-right: 3rem !important;
+ }
+ .bodywebsite .pb-md-5,
+ .bodywebsite .py-md-5 {
+ padding-bottom: 3rem !important;
+ }
+ .bodywebsite .pl-md-5,
+ .bodywebsite .px-md-5 {
+ padding-left: 3rem !important;
+ }
+ .bodywebsite .m-md-auto {
+ margin: auto !important;
+ }
+ .bodywebsite .mt-md-auto,
+ .bodywebsite .my-md-auto {
+ margin-top: auto !important;
+ }
+ .bodywebsite .mr-md-auto,
+ .bodywebsite .mx-md-auto {
+ margin-right: auto !important;
+ }
+ .bodywebsite .mb-md-auto,
+ .bodywebsite .my-md-auto {
+ margin-bottom: auto !important;
+ }
+ .bodywebsite .ml-md-auto,
+ .bodywebsite .mx-md-auto {
+ margin-left: auto !important;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .m-lg-0 {
+ margin: 0 !important;
+ }
+ .bodywebsite .mt-lg-0,
+ .bodywebsite .my-lg-0 {
+ margin-top: 0 !important;
+ }
+ .bodywebsite .mr-lg-0,
+ .bodywebsite .mx-lg-0 {
+ margin-right: 0 !important;
+ }
+ .bodywebsite .mb-lg-0,
+ .bodywebsite .my-lg-0 {
+ margin-bottom: 0 !important;
+ }
+ .bodywebsite .ml-lg-0,
+ .bodywebsite .mx-lg-0 {
+ margin-left: 0 !important;
+ }
+ .bodywebsite .m-lg-1 {
+ margin: 0.25rem !important;
+ }
+ .bodywebsite .mt-lg-1,
+ .bodywebsite .my-lg-1 {
+ margin-top: 0.25rem !important;
+ }
+ .bodywebsite .mr-lg-1,
+ .bodywebsite .mx-lg-1 {
+ margin-right: 0.25rem !important;
+ }
+ .bodywebsite .mb-lg-1,
+ .bodywebsite .my-lg-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .bodywebsite .ml-lg-1,
+ .bodywebsite .mx-lg-1 {
+ margin-left: 0.25rem !important;
+ }
+ .bodywebsite .m-lg-2 {
+ margin: 0.5rem !important;
+ }
+ .bodywebsite .mt-lg-2,
+ .bodywebsite .my-lg-2 {
+ margin-top: 0.5rem !important;
+ }
+ .bodywebsite .mr-lg-2,
+ .bodywebsite .mx-lg-2 {
+ margin-right: 0.5rem !important;
+ }
+ .bodywebsite .mb-lg-2,
+ .bodywebsite .my-lg-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .bodywebsite .ml-lg-2,
+ .bodywebsite .mx-lg-2 {
+ margin-left: 0.5rem !important;
+ }
+ .bodywebsite .m-lg-3 {
+ margin: 1rem !important;
+ }
+ .bodywebsite .mt-lg-3,
+ .bodywebsite .my-lg-3 {
+ margin-top: 1rem !important;
+ }
+ .bodywebsite .mr-lg-3,
+ .bodywebsite .mx-lg-3 {
+ margin-right: 1rem !important;
+ }
+ .bodywebsite .mb-lg-3,
+ .bodywebsite .my-lg-3 {
+ margin-bottom: 1rem !important;
+ }
+ .bodywebsite .ml-lg-3,
+ .bodywebsite .mx-lg-3 {
+ margin-left: 1rem !important;
+ }
+ .bodywebsite .m-lg-4 {
+ margin: 1.5rem !important;
+ }
+ .bodywebsite .mt-lg-4,
+ .bodywebsite .my-lg-4 {
+ margin-top: 1.5rem !important;
+ }
+ .bodywebsite .mr-lg-4,
+ .bodywebsite .mx-lg-4 {
+ margin-right: 1.5rem !important;
+ }
+ .bodywebsite .mb-lg-4,
+ .bodywebsite .my-lg-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .bodywebsite .ml-lg-4,
+ .bodywebsite .mx-lg-4 {
+ margin-left: 1.5rem !important;
+ }
+ .bodywebsite .m-lg-5 {
+ margin: 3rem !important;
+ }
+ .bodywebsite .mt-lg-5,
+ .bodywebsite .my-lg-5 {
+ margin-top: 3rem !important;
+ }
+ .bodywebsite .mr-lg-5,
+ .bodywebsite .mx-lg-5 {
+ margin-right: 3rem !important;
+ }
+ .bodywebsite .mb-lg-5,
+ .bodywebsite .my-lg-5 {
+ margin-bottom: 3rem !important;
+ }
+ .bodywebsite .ml-lg-5,
+ .bodywebsite .mx-lg-5 {
+ margin-left: 3rem !important;
+ }
+ .bodywebsite .p-lg-0 {
+ padding: 0 !important;
+ }
+ .bodywebsite .pt-lg-0,
+ .bodywebsite .py-lg-0 {
+ padding-top: 0 !important;
+ }
+ .bodywebsite .pr-lg-0,
+ .bodywebsite .px-lg-0 {
+ padding-right: 0 !important;
+ }
+ .bodywebsite .pb-lg-0,
+ .bodywebsite .py-lg-0 {
+ padding-bottom: 0 !important;
+ }
+ .bodywebsite .pl-lg-0,
+ .bodywebsite .px-lg-0 {
+ padding-left: 0 !important;
+ }
+ .bodywebsite .p-lg-1 {
+ padding: 0.25rem !important;
+ }
+ .bodywebsite .pt-lg-1,
+ .bodywebsite .py-lg-1 {
+ padding-top: 0.25rem !important;
+ }
+ .bodywebsite .pr-lg-1,
+ .bodywebsite .px-lg-1 {
+ padding-right: 0.25rem !important;
+ }
+ .bodywebsite .pb-lg-1,
+ .bodywebsite .py-lg-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .bodywebsite .pl-lg-1,
+ .bodywebsite .px-lg-1 {
+ padding-left: 0.25rem !important;
+ }
+ .bodywebsite .p-lg-2 {
+ padding: 0.5rem !important;
+ }
+ .bodywebsite .pt-lg-2,
+ .bodywebsite .py-lg-2 {
+ padding-top: 0.5rem !important;
+ }
+ .bodywebsite .pr-lg-2,
+ .bodywebsite .px-lg-2 {
+ padding-right: 0.5rem !important;
+ }
+ .bodywebsite .pb-lg-2,
+ .bodywebsite .py-lg-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .bodywebsite .pl-lg-2,
+ .bodywebsite .px-lg-2 {
+ padding-left: 0.5rem !important;
+ }
+ .bodywebsite .p-lg-3 {
+ padding: 1rem !important;
+ }
+ .bodywebsite .pt-lg-3,
+ .bodywebsite .py-lg-3 {
+ padding-top: 1rem !important;
+ }
+ .bodywebsite .pr-lg-3,
+ .bodywebsite .px-lg-3 {
+ padding-right: 1rem !important;
+ }
+ .bodywebsite .pb-lg-3,
+ .bodywebsite .py-lg-3 {
+ padding-bottom: 1rem !important;
+ }
+ .bodywebsite .pl-lg-3,
+ .bodywebsite .px-lg-3 {
+ padding-left: 1rem !important;
+ }
+ .bodywebsite .p-lg-4 {
+ padding: 1.5rem !important;
+ }
+ .bodywebsite .pt-lg-4,
+ .bodywebsite .py-lg-4 {
+ padding-top: 1.5rem !important;
+ }
+ .bodywebsite .pr-lg-4,
+ .bodywebsite .px-lg-4 {
+ padding-right: 1.5rem !important;
+ }
+ .bodywebsite .pb-lg-4,
+ .bodywebsite .py-lg-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .bodywebsite .pl-lg-4,
+ .bodywebsite .px-lg-4 {
+ padding-left: 1.5rem !important;
+ }
+ .bodywebsite .p-lg-5 {
+ padding: 3rem !important;
+ }
+ .bodywebsite .pt-lg-5,
+ .bodywebsite .py-lg-5 {
+ padding-top: 3rem !important;
+ }
+ .bodywebsite .pr-lg-5,
+ .bodywebsite .px-lg-5 {
+ padding-right: 3rem !important;
+ }
+ .bodywebsite .pb-lg-5,
+ .bodywebsite .py-lg-5 {
+ padding-bottom: 3rem !important;
+ }
+ .bodywebsite .pl-lg-5,
+ .bodywebsite .px-lg-5 {
+ padding-left: 3rem !important;
+ }
+ .bodywebsite .m-lg-auto {
+ margin: auto !important;
+ }
+ .bodywebsite .mt-lg-auto,
+ .bodywebsite .my-lg-auto {
+ margin-top: auto !important;
+ }
+ .bodywebsite .mr-lg-auto,
+ .bodywebsite .mx-lg-auto {
+ margin-right: auto !important;
+ }
+ .bodywebsite .mb-lg-auto,
+ .bodywebsite .my-lg-auto {
+ margin-bottom: auto !important;
+ }
+ .bodywebsite .ml-lg-auto,
+ .bodywebsite .mx-lg-auto {
+ margin-left: auto !important;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .m-xl-0 {
+ margin: 0 !important;
+ }
+ .bodywebsite .mt-xl-0,
+ .bodywebsite .my-xl-0 {
+ margin-top: 0 !important;
+ }
+ .bodywebsite .mr-xl-0,
+ .bodywebsite .mx-xl-0 {
+ margin-right: 0 !important;
+ }
+ .bodywebsite .mb-xl-0,
+ .bodywebsite .my-xl-0 {
+ margin-bottom: 0 !important;
+ }
+ .bodywebsite .ml-xl-0,
+ .bodywebsite .mx-xl-0 {
+ margin-left: 0 !important;
+ }
+ .bodywebsite .m-xl-1 {
+ margin: 0.25rem !important;
+ }
+ .bodywebsite .mt-xl-1,
+ .bodywebsite .my-xl-1 {
+ margin-top: 0.25rem !important;
+ }
+ .bodywebsite .mr-xl-1,
+ .bodywebsite .mx-xl-1 {
+ margin-right: 0.25rem !important;
+ }
+ .bodywebsite .mb-xl-1,
+ .bodywebsite .my-xl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .bodywebsite .ml-xl-1,
+ .bodywebsite .mx-xl-1 {
+ margin-left: 0.25rem !important;
+ }
+ .bodywebsite .m-xl-2 {
+ margin: 0.5rem !important;
+ }
+ .bodywebsite .mt-xl-2,
+ .bodywebsite .my-xl-2 {
+ margin-top: 0.5rem !important;
+ }
+ .bodywebsite .mr-xl-2,
+ .bodywebsite .mx-xl-2 {
+ margin-right: 0.5rem !important;
+ }
+ .bodywebsite .mb-xl-2,
+ .bodywebsite .my-xl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .bodywebsite .ml-xl-2,
+ .bodywebsite .mx-xl-2 {
+ margin-left: 0.5rem !important;
+ }
+ .bodywebsite .m-xl-3 {
+ margin: 1rem !important;
+ }
+ .bodywebsite .mt-xl-3,
+ .bodywebsite .my-xl-3 {
+ margin-top: 1rem !important;
+ }
+ .bodywebsite .mr-xl-3,
+ .bodywebsite .mx-xl-3 {
+ margin-right: 1rem !important;
+ }
+ .bodywebsite .mb-xl-3,
+ .bodywebsite .my-xl-3 {
+ margin-bottom: 1rem !important;
+ }
+ .bodywebsite .ml-xl-3,
+ .bodywebsite .mx-xl-3 {
+ margin-left: 1rem !important;
+ }
+ .bodywebsite .m-xl-4 {
+ margin: 1.5rem !important;
+ }
+ .bodywebsite .mt-xl-4,
+ .bodywebsite .my-xl-4 {
+ margin-top: 1.5rem !important;
+ }
+ .bodywebsite .mr-xl-4,
+ .bodywebsite .mx-xl-4 {
+ margin-right: 1.5rem !important;
+ }
+ .bodywebsite .mb-xl-4,
+ .bodywebsite .my-xl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .bodywebsite .ml-xl-4,
+ .bodywebsite .mx-xl-4 {
+ margin-left: 1.5rem !important;
+ }
+ .bodywebsite .m-xl-5 {
+ margin: 3rem !important;
+ }
+ .bodywebsite .mt-xl-5,
+ .bodywebsite .my-xl-5 {
+ margin-top: 3rem !important;
+ }
+ .bodywebsite .mr-xl-5,
+ .bodywebsite .mx-xl-5 {
+ margin-right: 3rem !important;
+ }
+ .bodywebsite .mb-xl-5,
+ .bodywebsite .my-xl-5 {
+ margin-bottom: 3rem !important;
+ }
+ .bodywebsite .ml-xl-5,
+ .bodywebsite .mx-xl-5 {
+ margin-left: 3rem !important;
+ }
+ .bodywebsite .p-xl-0 {
+ padding: 0 !important;
+ }
+ .bodywebsite .pt-xl-0,
+ .bodywebsite .py-xl-0 {
+ padding-top: 0 !important;
+ }
+ .bodywebsite .pr-xl-0,
+ .bodywebsite .px-xl-0 {
+ padding-right: 0 !important;
+ }
+ .bodywebsite .pb-xl-0,
+ .bodywebsite .py-xl-0 {
+ padding-bottom: 0 !important;
+ }
+ .bodywebsite .pl-xl-0,
+ .bodywebsite .px-xl-0 {
+ padding-left: 0 !important;
+ }
+ .bodywebsite .p-xl-1 {
+ padding: 0.25rem !important;
+ }
+ .bodywebsite .pt-xl-1,
+ .bodywebsite .py-xl-1 {
+ padding-top: 0.25rem !important;
+ }
+ .bodywebsite .pr-xl-1,
+ .bodywebsite .px-xl-1 {
+ padding-right: 0.25rem !important;
+ }
+ .bodywebsite .pb-xl-1,
+ .bodywebsite .py-xl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .bodywebsite .pl-xl-1,
+ .bodywebsite .px-xl-1 {
+ padding-left: 0.25rem !important;
+ }
+ .bodywebsite .p-xl-2 {
+ padding: 0.5rem !important;
+ }
+ .bodywebsite .pt-xl-2,
+ .bodywebsite .py-xl-2 {
+ padding-top: 0.5rem !important;
+ }
+ .bodywebsite .pr-xl-2,
+ .bodywebsite .px-xl-2 {
+ padding-right: 0.5rem !important;
+ }
+ .bodywebsite .pb-xl-2,
+ .bodywebsite .py-xl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .bodywebsite .pl-xl-2,
+ .bodywebsite .px-xl-2 {
+ padding-left: 0.5rem !important;
+ }
+ .bodywebsite .p-xl-3 {
+ padding: 1rem !important;
+ }
+ .bodywebsite .pt-xl-3,
+ .bodywebsite .py-xl-3 {
+ padding-top: 1rem !important;
+ }
+ .bodywebsite .pr-xl-3,
+ .bodywebsite .px-xl-3 {
+ padding-right: 1rem !important;
+ }
+ .bodywebsite .pb-xl-3,
+ .bodywebsite .py-xl-3 {
+ padding-bottom: 1rem !important;
+ }
+ .bodywebsite .pl-xl-3,
+ .bodywebsite .px-xl-3 {
+ padding-left: 1rem !important;
+ }
+ .bodywebsite .p-xl-4 {
+ padding: 1.5rem !important;
+ }
+ .bodywebsite .pt-xl-4,
+ .bodywebsite .py-xl-4 {
+ padding-top: 1.5rem !important;
+ }
+ .bodywebsite .pr-xl-4,
+ .bodywebsite .px-xl-4 {
+ padding-right: 1.5rem !important;
+ }
+ .bodywebsite .pb-xl-4,
+ .bodywebsite .py-xl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .bodywebsite .pl-xl-4,
+ .bodywebsite .px-xl-4 {
+ padding-left: 1.5rem !important;
+ }
+ .bodywebsite .p-xl-5 {
+ padding: 3rem !important;
+ }
+ .bodywebsite .pt-xl-5,
+ .bodywebsite .py-xl-5 {
+ padding-top: 3rem !important;
+ }
+ .bodywebsite .pr-xl-5,
+ .bodywebsite .px-xl-5 {
+ padding-right: 3rem !important;
+ }
+ .bodywebsite .pb-xl-5,
+ .bodywebsite .py-xl-5 {
+ padding-bottom: 3rem !important;
+ }
+ .bodywebsite .pl-xl-5,
+ .bodywebsite .px-xl-5 {
+ padding-left: 3rem !important;
+ }
+ .bodywebsite .m-xl-auto {
+ margin: auto !important;
+ }
+ .bodywebsite .mt-xl-auto,
+ .bodywebsite .my-xl-auto {
+ margin-top: auto !important;
+ }
+ .bodywebsite .mr-xl-auto,
+ .bodywebsite .mx-xl-auto {
+ margin-right: auto !important;
+ }
+ .bodywebsite .mb-xl-auto,
+ .bodywebsite .my-xl-auto {
+ margin-bottom: auto !important;
+ }
+ .bodywebsite .ml-xl-auto,
+ .bodywebsite .mx-xl-auto {
+ margin-left: auto !important;
+ }
+}
+@media (min-width: 1800px) {
+ .bodywebsite .m-xxl-0 {
+ margin: 0 !important;
+ }
+ .bodywebsite .mt-xxl-0,
+ .bodywebsite .my-xxl-0 {
+ margin-top: 0 !important;
+ }
+ .bodywebsite .mr-xxl-0,
+ .bodywebsite .mx-xxl-0 {
+ margin-right: 0 !important;
+ }
+ .bodywebsite .mb-xxl-0,
+ .bodywebsite .my-xxl-0 {
+ margin-bottom: 0 !important;
+ }
+ .bodywebsite .ml-xxl-0,
+ .bodywebsite .mx-xxl-0 {
+ margin-left: 0 !important;
+ }
+ .bodywebsite .m-xxl-1 {
+ margin: 0.25rem !important;
+ }
+ .bodywebsite .mt-xxl-1,
+ .bodywebsite .my-xxl-1 {
+ margin-top: 0.25rem !important;
+ }
+ .bodywebsite .mr-xxl-1,
+ .bodywebsite .mx-xxl-1 {
+ margin-right: 0.25rem !important;
+ }
+ .bodywebsite .mb-xxl-1,
+ .bodywebsite .my-xxl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .bodywebsite .ml-xxl-1,
+ .bodywebsite .mx-xxl-1 {
+ margin-left: 0.25rem !important;
+ }
+ .bodywebsite .m-xxl-2 {
+ margin: 0.5rem !important;
+ }
+ .bodywebsite .mt-xxl-2,
+ .bodywebsite .my-xxl-2 {
+ margin-top: 0.5rem !important;
+ }
+ .bodywebsite .mr-xxl-2,
+ .bodywebsite .mx-xxl-2 {
+ margin-right: 0.5rem !important;
+ }
+ .bodywebsite .mb-xxl-2,
+ .bodywebsite .my-xxl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .bodywebsite .ml-xxl-2,
+ .bodywebsite .mx-xxl-2 {
+ margin-left: 0.5rem !important;
+ }
+ .bodywebsite .m-xxl-3 {
+ margin: 1rem !important;
+ }
+ .bodywebsite .mt-xxl-3,
+ .bodywebsite .my-xxl-3 {
+ margin-top: 1rem !important;
+ }
+ .bodywebsite .mr-xxl-3,
+ .bodywebsite .mx-xxl-3 {
+ margin-right: 1rem !important;
+ }
+ .bodywebsite .mb-xxl-3,
+ .bodywebsite .my-xxl-3 {
+ margin-bottom: 1rem !important;
+ }
+ .bodywebsite .ml-xxl-3,
+ .bodywebsite .mx-xxl-3 {
+ margin-left: 1rem !important;
+ }
+ .bodywebsite .m-xxl-4 {
+ margin: 1.5rem !important;
+ }
+ .bodywebsite .mt-xxl-4,
+ .bodywebsite .my-xxl-4 {
+ margin-top: 1.5rem !important;
+ }
+ .bodywebsite .mr-xxl-4,
+ .bodywebsite .mx-xxl-4 {
+ margin-right: 1.5rem !important;
+ }
+ .bodywebsite .mb-xxl-4,
+ .bodywebsite .my-xxl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .bodywebsite .ml-xxl-4,
+ .bodywebsite .mx-xxl-4 {
+ margin-left: 1.5rem !important;
+ }
+ .bodywebsite .m-xxl-5 {
+ margin: 3rem !important;
+ }
+ .bodywebsite .mt-xxl-5,
+ .bodywebsite .my-xxl-5 {
+ margin-top: 3rem !important;
+ }
+ .bodywebsite .mr-xxl-5,
+ .bodywebsite .mx-xxl-5 {
+ margin-right: 3rem !important;
+ }
+ .bodywebsite .mb-xxl-5,
+ .bodywebsite .my-xxl-5 {
+ margin-bottom: 3rem !important;
+ }
+ .bodywebsite .ml-xxl-5,
+ .bodywebsite .mx-xxl-5 {
+ margin-left: 3rem !important;
+ }
+ .bodywebsite .p-xxl-0 {
+ padding: 0 !important;
+ }
+ .bodywebsite .pt-xxl-0,
+ .bodywebsite .py-xxl-0 {
+ padding-top: 0 !important;
+ }
+ .bodywebsite .pr-xxl-0,
+ .bodywebsite .px-xxl-0 {
+ padding-right: 0 !important;
+ }
+ .bodywebsite .pb-xxl-0,
+ .bodywebsite .py-xxl-0 {
+ padding-bottom: 0 !important;
+ }
+ .bodywebsite .pl-xxl-0,
+ .bodywebsite .px-xxl-0 {
+ padding-left: 0 !important;
+ }
+ .bodywebsite .p-xxl-1 {
+ padding: 0.25rem !important;
+ }
+ .bodywebsite .pt-xxl-1,
+ .bodywebsite .py-xxl-1 {
+ padding-top: 0.25rem !important;
+ }
+ .bodywebsite .pr-xxl-1,
+ .bodywebsite .px-xxl-1 {
+ padding-right: 0.25rem !important;
+ }
+ .bodywebsite .pb-xxl-1,
+ .bodywebsite .py-xxl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .bodywebsite .pl-xxl-1,
+ .bodywebsite .px-xxl-1 {
+ padding-left: 0.25rem !important;
+ }
+ .bodywebsite .p-xxl-2 {
+ padding: 0.5rem !important;
+ }
+ .bodywebsite .pt-xxl-2,
+ .bodywebsite .py-xxl-2 {
+ padding-top: 0.5rem !important;
+ }
+ .bodywebsite .pr-xxl-2,
+ .bodywebsite .px-xxl-2 {
+ padding-right: 0.5rem !important;
+ }
+ .bodywebsite .pb-xxl-2,
+ .bodywebsite .py-xxl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .bodywebsite .pl-xxl-2,
+ .bodywebsite .px-xxl-2 {
+ padding-left: 0.5rem !important;
+ }
+ .bodywebsite .p-xxl-3 {
+ padding: 1rem !important;
+ }
+ .bodywebsite .pt-xxl-3,
+ .bodywebsite .py-xxl-3 {
+ padding-top: 1rem !important;
+ }
+ .bodywebsite .pr-xxl-3,
+ .bodywebsite .px-xxl-3 {
+ padding-right: 1rem !important;
+ }
+ .bodywebsite .pb-xxl-3,
+ .bodywebsite .py-xxl-3 {
+ padding-bottom: 1rem !important;
+ }
+ .bodywebsite .pl-xxl-3,
+ .bodywebsite .px-xxl-3 {
+ padding-left: 1rem !important;
+ }
+ .bodywebsite .p-xxl-4 {
+ padding: 1.5rem !important;
+ }
+ .bodywebsite .pt-xxl-4,
+ .bodywebsite .py-xxl-4 {
+ padding-top: 1.5rem !important;
+ }
+ .bodywebsite .pr-xxl-4,
+ .bodywebsite .px-xxl-4 {
+ padding-right: 1.5rem !important;
+ }
+ .bodywebsite .pb-xxl-4,
+ .bodywebsite .py-xxl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .bodywebsite .pl-xxl-4,
+ .bodywebsite .px-xxl-4 {
+ padding-left: 1.5rem !important;
+ }
+ .bodywebsite .p-xxl-5 {
+ padding: 3rem !important;
+ }
+ .bodywebsite .pt-xxl-5,
+ .bodywebsite .py-xxl-5 {
+ padding-top: 3rem !important;
+ }
+ .bodywebsite .pr-xxl-5,
+ .bodywebsite .px-xxl-5 {
+ padding-right: 3rem !important;
+ }
+ .bodywebsite .pb-xxl-5,
+ .bodywebsite .py-xxl-5 {
+ padding-bottom: 3rem !important;
+ }
+ .bodywebsite .pl-xxl-5,
+ .bodywebsite .px-xxl-5 {
+ padding-left: 3rem !important;
+ }
+ .bodywebsite .m-xxl-auto {
+ margin: auto !important;
+ }
+ .bodywebsite .mt-xxl-auto,
+ .bodywebsite .my-xxl-auto {
+ margin-top: auto !important;
+ }
+ .bodywebsite .mr-xxl-auto,
+ .bodywebsite .mx-xxl-auto {
+ margin-right: auto !important;
+ }
+ .bodywebsite .mb-xxl-auto,
+ .bodywebsite .my-xxl-auto {
+ margin-bottom: auto !important;
+ }
+ .bodywebsite .ml-xxl-auto,
+ .bodywebsite .mx-xxl-auto {
+ margin-left: auto !important;
+ }
+}
+.bodywebsite .text-justify {
+ text-align: justify !important;
+}
+.bodywebsite .text-nowrap {
+ white-space: nowrap !important;
+}
+.bodywebsite .text-truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.bodywebsite .text-left {
+ text-align: left !important;
+}
+.bodywebsite .text-right {
+ text-align: right !important;
+}
+.bodywebsite .text-center {
+ text-align: center !important;
+}
+@media (min-width: 576px) {
+ .bodywebsite .text-sm-left {
+ text-align: left !important;
+ }
+ .bodywebsite .text-sm-right {
+ text-align: right !important;
+ }
+ .bodywebsite .text-sm-center {
+ text-align: center !important;
+ }
+}
+@media (min-width: 768px) {
+ .bodywebsite .text-md-left {
+ text-align: left !important;
+ }
+ .bodywebsite .text-md-right {
+ text-align: right !important;
+ }
+ .bodywebsite .text-md-center {
+ text-align: center !important;
+ }
+}
+@media (min-width: 992px) {
+ .bodywebsite .text-lg-left {
+ text-align: left !important;
+ }
+ .bodywebsite .text-lg-right {
+ text-align: right !important;
+ }
+ .bodywebsite .text-lg-center {
+ text-align: center !important;
+ }
+}
+@media (min-width: 1200px) {
+ .bodywebsite .text-xl-left {
+ text-align: left !important;
+ }
+ .bodywebsite .text-xl-right {
+ text-align: right !important;
+ }
+ .bodywebsite .text-xl-center {
+ text-align: center !important;
+ }
+}
+@media (min-width: 1800px) {
+ .bodywebsite .text-xxl-left {
+ text-align: left !important;
+ }
+ .bodywebsite .text-xxl-right {
+ text-align: right !important;
+ }
+ .bodywebsite .text-xxl-center {
+ text-align: center !important;
+ }
+}
+.bodywebsite .text-lowercase {
+ text-transform: lowercase !important;
+}
+.bodywebsite .text-uppercase {
+ text-transform: uppercase !important;
+}
+.bodywebsite .text-capitalize {
+ text-transform: capitalize !important;
+}
+.bodywebsite .font-weight-light {
+ font-weight: 300 !important;
+}
+.bodywebsite .font-weight-normal {
+ font-weight: 400 !important;
+}
+.bodywebsite .font-weight-bold {
+ font-weight: 700 !important;
+}
+.bodywebsite .font-italic {
+ font-style: italic !important;
+}
+.bodywebsite .text-white {
+ color: #fff !important;
+}
+.bodywebsite .text-primary {
+ color: #007bff !important;
+}
+.bodywebsite a.text-primary:focus,
+.bodywebsite a.text-primary:hover {
+ color: #0062cc !important;
+}
+.bodywebsite .text-secondary {
+ color: #868e96 !important;
+}
+.bodywebsite a.text-secondary:focus,
+.bodywebsite a.text-secondary:hover {
+ color: #6c757d !important;
+}
+.bodywebsite .text-success {
+ color: #28a745 !important;
+}
+.bodywebsite a.text-success:focus,
+.bodywebsite a.text-success:hover {
+ color: #1e7e34 !important;
+}
+.bodywebsite .text-info {
+ color: #17a2b8 !important;
+}
+.bodywebsite a.text-info:focus,
+.bodywebsite a.text-info:hover {
+ color: #117a8b !important;
+}
+.bodywebsite .text-warning {
+ color: #ffc107 !important;
+}
+.bodywebsite a.text-warning:focus,
+.bodywebsite a.text-warning:hover {
+ color: #d39e00 !important;
+}
+.bodywebsite .text-danger {
+ color: #dc3545 !important;
+}
+.bodywebsite a.text-danger:focus,
+.bodywebsite a.text-danger:hover {
+ color: #bd2130 !important;
+}
+.bodywebsite .text-light {
+ color: #f8f9fa !important;
+}
+.bodywebsite a.text-light:focus,
+.bodywebsite a.text-light:hover {
+ color: #dae0e5 !important;
+}
+.bodywebsite .text-dark {
+ color: #343a40 !important;
+}
+.bodywebsite a.text-dark:focus,
+.bodywebsite a.text-dark:hover {
+ color: #1d2124 !important;
+}
+.bodywebsite .text-muted {
+ color: #dedede !important;
+}
+.bodywebsite .text-hide {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+.bodywebsite .visible {
+ visibility: visible !important;
+}
+.bodywebsite .invisible {
+ visibility: hidden !important;
+}
+.bodywebsite .animated {
+ -webkit-animation-duration: 1s;
+ animation-duration: 1s;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+ opacity: 1;
+}
+.bodywebsite .animated:not(.page) {
+ will-change: transform;
+}
+.bodywebsite .animated.infinite {
+ -webkit-animation-iteration-count: infinite;
+ animation-iteration-count: infinite;
+}
+.bodywebsite .animated.hinge {
+ -webkit-animation-duration: 2s;
+ animation-duration: 2s;
+}
+html .bodywebsite:not(.lt-ie10) .not-animated {
+ opacity: 0;
+}
+@-webkit-keyframes fadeInUp {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+@keyframes fadeInUp {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+.bodywebsite .fadeInUp {
+ -webkit-animation-name: fadeInUp;
+ animation-name: fadeInUp;
+}
+@-webkit-keyframes fadeInUpBig {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 2000px, 0);
+ transform: translate3d(0, 2000px, 0);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+@keyframes fadeInUpBig {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 2000px, 0);
+ transform: translate3d(0, 2000px, 0);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+.bodywebsite .fadeInUpBig {
+ -webkit-animation-name: fadeInUpBig;
+ animation-name: fadeInUpBig;
+}
+
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/test2.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/test2.php
new file mode 100644
index 00000000000..9939ba32bf6
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/test2.php
@@ -0,0 +1,4 @@
+ref.'/page126.tpl.php';
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/containers/wrapper.php b/htdocs/install/doctemplates/websites/website_template-corporate/containers/wrapper.php
new file mode 100644
index 00000000000..26adb3ef220
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/containers/wrapper.php
@@ -0,0 +1,278 @@
+entity;
+$original_file = GETPOST("file", "alpha");
+$l = GETPOST('l', 'aZ09');
+$limit = GETPOST('limit', 'int');
+
+// Parameters for RSS
+$rss = GETPOST('rss', 'aZ09');
+if ($rss) {
+ $original_file = 'blog.rss';
+}
+
+// If we have a hash public (hashp), we guess the original_file.
+if (!empty($hashp)) {
+ include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
+ $ecmfile = new EcmFiles($db);
+ $result = $ecmfile->fetch(0, '', '', '', $hashp);
+ if ($result > 0) {
+ $tmp = explode('/', $ecmfile->filepath, 2); // $ecmfile->filepath is relative to document directory
+ // filepath can be 'users/X' or 'X/propale/PR11111'
+ if (is_numeric($tmp[0])) { // If first tmp is numeric, it is subdir of company for multicompany, we take next part.
+ $tmp = explode('/', $tmp[1], 2);
+ }
+ $moduleparttocheck = $tmp[0]; // moduleparttocheck is first part of path
+
+ if ($modulepart) { // Not required, so often not defined, for link using public hashp parameter.
+ if ($moduleparttocheck == $modulepart) {
+ // We remove first level of directory
+ $original_file = (($tmp[1] ? $tmp[1].'/' : '').$ecmfile->filename); // this is relative to module dir
+ //var_dump($original_file); exit;
+ } else {
+ print 'Bad link. File is from another module part.';
+ }
+ } else {
+ $modulepart = $moduleparttocheck;
+ $original_file = (($tmp[1] ? $tmp[1].'/' : '').$ecmfile->filename); // this is relative to module dir
+ }
+ } else {
+ print "ErrorFileNotFoundWithSharedLink";
+ exit;
+ }
+}
+
+// Define attachment (attachment=true to force choice popup 'open'/'save as')
+$attachment = true;
+if (preg_match('/\.(html|htm)$/i', $original_file)) {
+ $attachment = false;
+}
+if (isset($_GET["attachment"])) {
+ $attachment = (GETPOST("attachment", 'alphanohtml') ? true : false);
+}
+if (!empty($conf->global->MAIN_DISABLE_FORCE_SAVEAS_WEBSITE)) {
+ $attachment = false;
+}
+
+// Define mime type
+$type = 'application/octet-stream';
+if (GETPOSTISSET('type')) {
+ $type = GETPOST('type', 'alpha');
+} else {
+ $type = dol_mimetype($original_file);
+}
+
+// Security: Delete string ../ into $original_file
+$original_file = str_replace("../", "/", $original_file);
+
+// Cache or not
+if (GETPOST("cache", 'aZ09') || image_format_supported($original_file) >= 0) {
+ // Important: Following code is to avoid page request by browser and PHP CPU at
+ // each Dolibarr page access.
+ header('Cache-Control: max-age=3600, public, must-revalidate');
+ header('Pragma: cache'); // This is to avoid having Pragma: no-cache
+}
+
+$refname = basename(dirname($original_file)."/");
+
+// Get RSS news
+if ($rss) {
+ $format = 'rss';
+ $type = '';
+ $cachedelay = 0;
+ $filename = $original_file;
+ $dir_temp = $conf->website->dir_temp;
+
+ include_once DOL_DOCUMENT_ROOT.'/website/class/website.class.php';
+ include_once DOL_DOCUMENT_ROOT.'/website/class/websitepage.class.php';
+ $website = new Website($db);
+ $websitepage = new WebsitePage($db);
+
+ $website->fetch('', $websitekey);
+
+ $filters = array('type_container'=>'blogpost', 'status'=>1);
+ if ($l) {
+ $filters['lang'] = $l;
+ }
+
+ $MAXNEWS = ($limit ? $limit : 20);
+ $arrayofblogs = $websitepage->fetchAll($website->id, 'DESC', 'date_creation', $MAXNEWS, 0, $filters);
+ $eventarray = array();
+ if (is_array($arrayofblogs)) {
+ foreach ($arrayofblogs as $blog) {
+ $blog->fullpageurl = $website->virtualhost.'/'.$blog->pageurl.'.php';
+ $eventarray[] = $blog;
+ }
+ }
+
+ require_once DOL_DOCUMENT_ROOT."/core/lib/xcal.lib.php";
+ require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php";
+ require_once DOL_DOCUMENT_ROOT."/core/lib/files.lib.php";
+
+ dol_syslog("build_exportfile Build export file format=".$format.", type=".$type.", cachedelay=".$cachedelay.", filename=".$filename.", filters size=".count($filters), LOG_DEBUG);
+
+ // Clean parameters
+ if (!$filename) {
+ $extension = 'rss';
+ $filename = $format.'.'.$extension;
+ }
+
+ // Create dir and define output file (definitive and temporary)
+ $result = dol_mkdir($dir_temp);
+ $outputfile = $dir_temp.'/'.$filename;
+
+ $result = 0;
+
+ $buildfile = true;
+
+ if ($cachedelay) {
+ $nowgmt = dol_now();
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ if (dol_filemtime($outputfile) > ($nowgmt - $cachedelay)) {
+ dol_syslog("build_exportfile file ".$outputfile." is not older than now - cachedelay (".$nowgmt." - ".$cachedelay."). Build is canceled");
+ $buildfile = false;
+ }
+ }
+
+ if ($buildfile) {
+ $outputlangs = new Translate('', $conf);
+ $outputlangs->setDefaultLang($l);
+ $outputlangs->loadLangs(array("main", "other"));
+ $title = $desc = $outputlangs->transnoentities('LatestBlogPosts');
+
+ // Create temp file
+ $outputfiletmp = tempnam($dir_temp, 'tmp'); // Temporary file (allow call of function by different threads
+ @chmod($outputfiletmp, octdec($conf->global->MAIN_UMASK));
+
+ // Write file
+ $result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l);
+
+ if ($result >= 0) {
+ if (dol_move($outputfiletmp, $outputfile, 0, 1)) {
+ $result = 1;
+ } else {
+ $error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile;
+ dol_syslog("build_exportfile ".$error, LOG_ERR);
+ dol_delete_file($outputfiletmp, 0, 1);
+ print $error;
+ exit(-1);
+ }
+ } else {
+ dol_syslog("build_exportfile build_xxxfile function fails to for format=".$format." outputfiletmp=".$outputfile, LOG_ERR);
+ dol_delete_file($outputfiletmp, 0, 1);
+ $langs->load("errors");
+ print $langs->trans("ErrorFailToCreateFile", $outputfile);
+ exit(-1);
+ }
+ }
+
+ if ($result >= 0) {
+ $attachment = false;
+ if (isset($_GET["attachment"])) {
+ $attachment = $_GET["attachment"];
+ }
+ //$attachment = false;
+ $contenttype = 'application/rss+xml';
+ if (isset($_GET["contenttype"])) {
+ $contenttype = $_GET["contenttype"];
+ }
+ //$contenttype='text/plain';
+ $outputencoding = 'UTF-8';
+
+ if ($contenttype) {
+ header('Content-Type: '.$contenttype.($outputencoding ? '; charset='.$outputencoding : ''));
+ }
+ if ($attachment) {
+ header('Content-Disposition: attachment; filename="'.$filename.'"');
+ }
+
+ // Ajout directives pour resoudre bug IE
+ //header('Cache-Control: Public, must-revalidate');
+ //header('Pragma: public');
+ if ($cachedelay) {
+ header('Cache-Control: max-age='.$cachedelay.', private, must-revalidate');
+ } else {
+ header('Cache-Control: private, must-revalidate');
+ }
+
+ // Clean parameters
+ $outputfile = $dir_temp.'/'.$filename;
+ $result = readfile($outputfile);
+ if (!$result) {
+ print 'File '.$outputfile.' was empty.';
+ }
+
+ // header("Location: ".DOL_URL_ROOT.'/document.php?modulepart=agenda&file='.urlencode($filename));
+ exit;
+ }
+} elseif ($modulepart == "mycompany" && preg_match('/^\/?logos\//', $original_file)) {
+ // Get logos
+ readfile(dol_osencode($conf->mycompany->dir_output."/".$original_file));
+} else {
+ // Find the subdirectory name as the reference
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ $check_access = dol_check_secure_access_document($modulepart, $original_file, $entity, $refname);
+ $accessallowed = empty($check_access['accessallowed']) ? '' : $check_access['accessallowed'];
+ $sqlprotectagainstexternals = empty($check_access['sqlprotectagainstexternals']) ? '' : $check_access['sqlprotectagainstexternals'];
+ $fullpath_original_file = empty($check_access['original_file']) ? '' : $check_access['original_file']; // $fullpath_original_file is now a full path name
+ if ($hashp) {
+ $accessallowed = 1; // When using hashp, link is public so we force $accessallowed
+ $sqlprotectagainstexternals = '';
+ }
+
+ // Security:
+ // Limit access if permissions are wrong
+ if (!$accessallowed) {
+ print 'Access forbidden';
+ exit;
+ }
+
+ clearstatcache();
+
+ $filename = basename($fullpath_original_file);
+
+ // Output file on browser
+ dol_syslog("wrapper.php download $fullpath_original_file filename=$filename content-type=$type");
+ $fullpath_original_file_osencoded = dol_osencode($fullpath_original_file); // New file name encoded in OS encoding charset
+
+ // This test if file exists should be useless. We keep it to find bug more easily
+ if (!file_exists($fullpath_original_file_osencoded)) {
+ print "ErrorFileDoesNotExists: ".$original_file;
+ exit;
+ }
+
+ // Permissions are ok and file found, so we return it
+ //top_httphead($type);
+ header('Content-Type: '.$type);
+ header('Content-Description: File Transfer');
+ if ($encoding) {
+ header('Content-Encoding: '.$encoding);
+ }
+ // Add MIME Content-Disposition from RFC 2183 (inline=automatically displayed, attachment=need user action to open)
+ if ($attachment) {
+ header('Content-Disposition: attachment; filename="'.$filename.'"');
+ } else {
+ header('Content-Disposition: inline; filename="'.$filename.'"');
+ }
+ header('Content-Length: '.dol_filesize($fullpath_original_file));
+
+ readfile($fullpath_original_file_osencoded);
+}
+if (is_object($db)) {
+ $db->close();
+}
+// END PHP
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/ajax-loading.gif b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/ajax-loading.gif
new file mode 100644
index 00000000000..f7e0378a8ca
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/ajax-loading.gif differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/alberteinstein.jpg b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/alberteinstein.jpg
new file mode 100644
index 00000000000..869d4762746
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/alberteinstein.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/apache.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/apache.png
new file mode 100644
index 00000000000..73a380ba51c
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/apache.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/background_coder.webp b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/background_coder.webp
new file mode 100644
index 00000000000..b2e8e72e9dd
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/background_coder.webp differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/background_computer_coffee.webp b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/background_computer_coffee.webp
new file mode 100644
index 00000000000..792fdadeeee
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/background_computer_coffee.webp differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/background_dolibarr.webp b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/background_dolibarr.webp
new file mode 100644
index 00000000000..66d7c020d21
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/background_dolibarr.webp differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/background_rough-horn.webp b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/background_rough-horn.webp
new file mode 100644
index 00000000000..7c9420b5591
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/background_rough-horn.webp differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/background_sunset.webp b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/background_sunset.webp
new file mode 100644
index 00000000000..a89a14fdec8
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/background_sunset.webp differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/briefcase.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/briefcase.png
new file mode 100644
index 00000000000..bf6fa1aa05c
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/briefcase.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/calendar.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/calendar.png
new file mode 100644
index 00000000000..d065bdcf9f4
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/calendar.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/daviddoe.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/daviddoe.png
new file mode 100644
index 00000000000..ec1fe6eacb9
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/daviddoe.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/dolibarr.ico b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/dolibarr.ico
new file mode 100644
index 00000000000..611e4bf150e
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/dolibarr.ico differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/dolibarr_256x256.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/dolibarr_256x256.png
new file mode 100644
index 00000000000..970f841001b
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/dolibarr_256x256.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/dolibarr_logo.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/dolibarr_logo.png
new file mode 100644
index 00000000000..8edd0660e60
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/dolibarr_logo.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/icon-5.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/icon-5.png
new file mode 100644
index 00000000000..319e564ed3c
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/icon-5.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/icon-6.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/icon-6.png
new file mode 100644
index 00000000000..6991f9b0e72
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/icon-6.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/icon-quote.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/icon-quote.png
new file mode 100644
index 00000000000..3e903027e37
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/icon-quote.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/light-bulb.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/light-bulb.png
new file mode 100644
index 00000000000..deaa9cf4ae1
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/light-bulb.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/mariadb.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/mariadb.png
new file mode 100644
index 00000000000..26caeaea837
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/mariadb.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/mariecurie.jpg b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/mariecurie.jpg
new file mode 100644
index 00000000000..c6aab3154f1
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/mariecurie.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/organization.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/organization.png
new file mode 100644
index 00000000000..c77120cefae
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/organization.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/ovh.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/ovh.png
new file mode 100644
index 00000000000..c4036d82bed
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/ovh.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/package.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/package.png
new file mode 100644
index 00000000000..f6ca65c0447
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/package.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/php.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/php.png
new file mode 100644
index 00000000000..7b3e8ce8f6f
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/php.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/pierrecurie.jpg b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/pierrecurie.jpg
new file mode 100644
index 00000000000..8ea6696ba45
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/pierrecurie.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/apache_mini.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/apache_mini.png
new file mode 100644
index 00000000000..438d91ed1f9
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/apache_mini.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/apache_small.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/apache_small.png
new file mode 100644
index 00000000000..29580ebc5b0
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/apache_small.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/mariadb_mini.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/mariadb_mini.png
new file mode 100644
index 00000000000..ed00343bf25
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/mariadb_mini.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/mariadb_small.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/mariadb_small.png
new file mode 100644
index 00000000000..fd206b7d0c4
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/mariadb_small.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/ovh_mini.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/ovh_mini.png
new file mode 100644
index 00000000000..a4f3dc65994
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/ovh_mini.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/ovh_small.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/ovh_small.png
new file mode 100644
index 00000000000..77dae0c33ac
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/ovh_small.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/php_mini.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/php_mini.png
new file mode 100644
index 00000000000..67b1977d1c5
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/php_mini.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/php_small.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/php_small.png
new file mode 100644
index 00000000000..ee42122929d
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/php_small.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/ubuntu_mini.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/ubuntu_mini.png
new file mode 100644
index 00000000000..8218af0ea05
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/ubuntu_mini.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/ubuntu_small.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/ubuntu_small.png
new file mode 100644
index 00000000000..0f5df4b61ae
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/thumbs/ubuntu_small.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/ubuntu.png b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/ubuntu.png
new file mode 100644
index 00000000000..4bd8dbe0a0c
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-corporate/medias/image/websitekey/ubuntu.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/medias/js/websitekey/extlib.min.js b/htdocs/install/doctemplates/websites/website_template-corporate/medias/js/websitekey/extlib.min.js
new file mode 100644
index 00000000000..7e0209f1df6
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/medias/js/websitekey/extlib.min.js
@@ -0,0 +1,853 @@
+
+
+/**
+ * @module Popper.js
+ * @author Federico Zivolo
+ * @see https://github.com/FezVrasta/popper.js
+ * @license MIT
+ * @version 1.11.0
+ */
+(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=window.getComputedStyle(e,null);return t?o[t]:o}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e||-1!==['HTML','BODY','#document'].indexOf(e.nodeName))return window.document.body;var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll)/.test(r+s+p)?e:n(o(e))}function r(e){var o=e&&e.offsetParent,i=o&&o.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TD','TABLE'].indexOf(o.nodeName)&&'static'===t(o,'position')?r(o):o:window.document.documentElement}function p(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||r(e.firstElementChild)===e)}function s(e){return null===e.parentNode?e:s(e.parentNode)}function d(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return window.document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=o?e:t,n=o?t:e,a=document.createRange();a.setStart(i,0),a.setEnd(n,0);var f=a.commonAncestorContainer;if(e!==f&&t!==f||i.contains(n))return p(f)?f:r(f);var l=s(e);return l.host?d(l.host,t):d(e,s(t).host)}function a(e){var t=1=o.clientWidth&&i>=o.clientHeight}),f=0i[e]&&!t.escapeWithReference&&(n=z(p[o],i[e]-('right'===e?p.width:p.height))),pe({},o,n)}};return n.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';p=se({},p,s[t](e))}),e.offsets.popper=p,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,i=t.reference,n=e.placement.split('-')[0],r=V,p=-1!==['top','bottom'].indexOf(n),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(i[s])&&(e.offsets.popper[d]=r(i[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){if(!F(e.instance.modifiers,'arrow','keepTogether'))return e;var o=t.element;if('string'==typeof o){if(o=e.instance.popper.querySelector(o),!o)return e;}else if(!e.instance.popper.contains(o))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var i=e.placement.split('-')[0],n=e.offsets,r=n.popper,p=n.reference,s=-1!==['left','right'].indexOf(i),d=s?'height':'width',a=s?'top':'left',f=s?'left':'top',l=s?'bottom':'right',m=O(o)[d];p[l]-mr[l]&&(e.offsets.popper[a]+=p[a]+m-r[l]);var h=p[a]+p[d]/2-m/2,g=h-c(e.offsets.popper)[a];return g=_(z(r[d]-m,g),0),e.arrowElement=o,e.offsets.arrow={},e.offsets.arrow[a]=Math.round(g),e.offsets.arrow[f]='',e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=w(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement),i=e.placement.split('-')[0],n=L(i),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case fe.FLIP:p=[i,n];break;case fe.CLOCKWISE:p=K(i);break;case fe.COUNTERCLOCKWISE:p=K(i,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(i!==s||p.length===d+1)return e;i=e.placement.split('-')[0],n=L(i);var a=e.offsets.popper,f=e.offsets.reference,l=V,m='left'===i&&l(a.right)>l(f.left)||'right'===i&&l(a.left)l(f.top)||'bottom'===i&&l(a.top)l(o.right),g=l(a.top)l(o.bottom),b='left'===i&&h||'right'===i&&c||'top'===i&&g||'bottom'===i&&u,y=-1!==['top','bottom'].indexOf(i),w=!!t.flipVariations&&(y&&'start'===r&&h||y&&'end'===r&&c||!y&&'start'===r&&g||!y&&'end'===r&&u);(m||b||w)&&(e.flipped=!0,(m||b)&&(i=p[d+1]),w&&(r=j(r)),e.placement=i+(r?'-'+r:''),e.offsets.popper=se({},e.offsets.popper,S(e.instance.popper,e.offsets.reference,e.placement)),e=N(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],i=e.offsets,n=i.popper,r=i.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return n[p?'left':'top']=r[t]-(s?n[p?'width':'height']:0),e.placement=L(t),e.offsets.popper=c(n),e}},hide:{order:800,enabled:!0,fn:function(e){if(!F(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=T(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.right0?n:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(t){e(t).trigger(r.end)},supportsTransitionEnd:function(){return Boolean(r)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(e,n,i){for(var s in i)if(Object.prototype.hasOwnProperty.call(i,s)){var r=i[s],o=n[s],l=o&&a.isElement(o)?"element":t(o);if(!new RegExp(r).test(l))throw new Error(e.toUpperCase()+': Option "'+s+'" provided type "'+l+'" but expected type "'+r+'".')}}};return r=i(),e.fn.emulateTransitionEnd=s,a.supportsTransitionEnd()&&(e.event.special[a.TRANSITION_END]=n()),a}(),r=function(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t},o=function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e},a=function(){var t="alert",n=e.fn[t],i={CLOSE:"close.bs.alert",CLOSED:"closed.bs.alert",CLICK_DATA_API:"click.bs.alert.data-api"},o={ALERT:"alert",FADE:"fade",SHOW:"show"},a=function(){function t(t){this._element=t}var n=t.prototype;return n.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},n.dispose=function(){e.removeData(this._element,"bs.alert"),this._element=null},n._getRootElement=function(t){var n=s.getSelectorFromElement(t),i=!1;return n&&(i=e(n)[0]),i||(i=e(t).closest("."+o.ALERT)[0]),i},n._triggerCloseEvent=function(t){var n=e.Event(i.CLOSE);return e(t).trigger(n),n},n._removeElement=function(t){var n=this;e(t).removeClass(o.SHOW),s.supportsTransitionEnd()&&e(t).hasClass(o.FADE)?e(t).one(s.TRANSITION_END,function(e){return n._destroyElement(t,e)}).emulateTransitionEnd(150):this._destroyElement(t)},n._destroyElement=function(t){e(t).detach().trigger(i.CLOSED).remove()},t._jQueryInterface=function(n){return this.each(function(){var i=e(this),s=i.data("bs.alert");s||(s=new t(this),i.data("bs.alert",s)),"close"===n&&s[n](this)})},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},r(t,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}}]),t}();return e(document).on(i.CLICK_DATA_API,{DISMISS:'[data-dismiss="alert"]'}.DISMISS,a._handleDismiss(new a)),e.fn[t]=a._jQueryInterface,e.fn[t].Constructor=a,e.fn[t].noConflict=function(){return e.fn[t]=n,a._jQueryInterface},a}(),l=function(){var t="button",n=e.fn[t],i={ACTIVE:"active",BUTTON:"btn",FOCUS:"focus"},s={DATA_TOGGLE_CARROT:'[data-toggle^="button"]',DATA_TOGGLE:'[data-toggle="buttons"]',INPUT:"input",ACTIVE:".active",BUTTON:".btn"},o={CLICK_DATA_API:"click.bs.button.data-api",FOCUS_BLUR_DATA_API:"focus.bs.button.data-api blur.bs.button.data-api"},a=function(){function t(t){this._element=t}var n=t.prototype;return n.toggle=function(){var t=!0,n=!0,r=e(this._element).closest(s.DATA_TOGGLE)[0];if(r){var o=e(this._element).find(s.INPUT)[0];if(o){if("radio"===o.type)if(o.checked&&e(this._element).hasClass(i.ACTIVE))t=!1;else{var a=e(r).find(s.ACTIVE)[0];a&&e(a).removeClass(i.ACTIVE)}if(t){if(o.hasAttribute("disabled")||r.hasAttribute("disabled")||o.classList.contains("disabled")||r.classList.contains("disabled"))return;o.checked=!e(this._element).hasClass(i.ACTIVE),e(o).trigger("change")}o.focus(),n=!1}}n&&this._element.setAttribute("aria-pressed",!e(this._element).hasClass(i.ACTIVE)),t&&e(this._element).toggleClass(i.ACTIVE)},n.dispose=function(){e.removeData(this._element,"bs.button"),this._element=null},t._jQueryInterface=function(n){return this.each(function(){var i=e(this).data("bs.button");i||(i=new t(this),e(this).data("bs.button",i)),"toggle"===n&&i[n]()})},r(t,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}}]),t}();return e(document).on(o.CLICK_DATA_API,s.DATA_TOGGLE_CARROT,function(t){t.preventDefault();var n=t.target;e(n).hasClass(i.BUTTON)||(n=e(n).closest(s.BUTTON)),a._jQueryInterface.call(e(n),"toggle")}).on(o.FOCUS_BLUR_DATA_API,s.DATA_TOGGLE_CARROT,function(t){var n=e(t.target).closest(s.BUTTON)[0];e(n).toggleClass(i.FOCUS,/^focus(in)?$/.test(t.type))}),e.fn[t]=a._jQueryInterface,e.fn[t].Constructor=a,e.fn[t].noConflict=function(){return e.fn[t]=n,a._jQueryInterface},a}(),h=function(){var t="carousel",n="bs.carousel",i="."+n,o=e.fn[t],a={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},l={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},h={NEXT:"next",PREV:"prev",LEFT:"left",RIGHT:"right"},c={SLIDE:"slide"+i,SLID:"slid"+i,KEYDOWN:"keydown"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i,TOUCHEND:"touchend"+i,LOAD_DATA_API:"load.bs.carousel.data-api",CLICK_DATA_API:"click.bs.carousel.data-api"},u={CAROUSEL:"carousel",ACTIVE:"active",SLIDE:"slide",RIGHT:"carousel-item-right",LEFT:"carousel-item-left",NEXT:"carousel-item-next",PREV:"carousel-item-prev",ITEM:"carousel-item"},d={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},f=function(){function o(t,n){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(n),this._element=e(t)[0],this._indicatorsElement=e(this._element).find(d.INDICATORS)[0],this._addEventListeners()}var f=o.prototype;return f.next=function(){this._isSliding||this._slide(h.NEXT)},f.nextWhenVisible=function(){!document.hidden&&e(this._element).is(":visible")&&"hidden"!==e(this._element).css("visibility")&&this.next()},f.prev=function(){this._isSliding||this._slide(h.PREV)},f.pause=function(t){t||(this._isPaused=!0),e(this._element).find(d.NEXT_PREV)[0]&&s.supportsTransitionEnd()&&(s.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},f.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},f.to=function(t){var n=this;this._activeElement=e(this._element).find(d.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)e(this._element).one(c.SLID,function(){return n.to(t)});else{if(i===t)return this.pause(),void this.cycle();var s=t>i?h.NEXT:h.PREV;this._slide(s,this._items[t])}},f.dispose=function(){e(this._element).off(i),e.removeData(this._element,n),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},f._getConfig=function(n){return n=e.extend({},a,n),s.typeCheckConfig(t,n,l),n},f._addEventListeners=function(){var t=this;this._config.keyboard&&e(this._element).on(c.KEYDOWN,function(e){return t._keydown(e)}),"hover"===this._config.pause&&(e(this._element).on(c.MOUSEENTER,function(e){return t.pause(e)}).on(c.MOUSELEAVE,function(e){return t.cycle(e)}),"ontouchstart"in document.documentElement&&e(this._element).on(c.TOUCHEND,function(){t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout(function(e){return t.cycle(e)},500+t._config.interval)}))},f._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next();break;default:return}},f._getItemIndex=function(t){return this._items=e.makeArray(e(t).parent().find(d.ITEM)),this._items.indexOf(t)},f._getItemByDirection=function(t,e){var n=t===h.NEXT,i=t===h.PREV,s=this._getItemIndex(e),r=this._items.length-1;if((i&&0===s||n&&s===r)&&!this._config.wrap)return e;var o=(s+(t===h.PREV?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},f._triggerSlideEvent=function(t,n){var i=this._getItemIndex(t),s=this._getItemIndex(e(this._element).find(d.ACTIVE_ITEM)[0]),r=e.Event(c.SLIDE,{relatedTarget:t,direction:n,from:s,to:i});return e(this._element).trigger(r),r},f._setActiveIndicatorElement=function(t){if(this._indicatorsElement){e(this._indicatorsElement).find(d.ACTIVE).removeClass(u.ACTIVE);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&e(n).addClass(u.ACTIVE)}},f._slide=function(t,n){var i,r,o,a=this,l=e(this._element).find(d.ACTIVE_ITEM)[0],f=this._getItemIndex(l),_=n||l&&this._getItemByDirection(t,l),g=this._getItemIndex(_),m=Boolean(this._interval);if(t===h.NEXT?(i=u.LEFT,r=u.NEXT,o=h.LEFT):(i=u.RIGHT,r=u.PREV,o=h.RIGHT),_&&e(_).hasClass(u.ACTIVE))this._isSliding=!1;else if(!this._triggerSlideEvent(_,o).isDefaultPrevented()&&l&&_){this._isSliding=!0,m&&this.pause(),this._setActiveIndicatorElement(_);var p=e.Event(c.SLID,{relatedTarget:_,direction:o,from:f,to:g});s.supportsTransitionEnd()&&e(this._element).hasClass(u.SLIDE)?(e(_).addClass(r),s.reflow(_),e(l).addClass(i),e(_).addClass(i),e(l).one(s.TRANSITION_END,function(){e(_).removeClass(i+" "+r).addClass(u.ACTIVE),e(l).removeClass(u.ACTIVE+" "+r+" "+i),a._isSliding=!1,setTimeout(function(){return e(a._element).trigger(p)},0)}).emulateTransitionEnd(600)):(e(l).removeClass(u.ACTIVE),e(_).addClass(u.ACTIVE),this._isSliding=!1,e(this._element).trigger(p)),m&&this.cycle()}},o._jQueryInterface=function(t){return this.each(function(){var i=e(this).data(n),s=e.extend({},a,e(this).data());"object"==typeof t&&e.extend(s,t);var r="string"==typeof t?t:s.slide;if(i||(i=new o(this,s),e(this).data(n,i)),"number"==typeof t)i.to(t);else if("string"==typeof r){if("undefined"==typeof i[r])throw new Error('No method named "'+r+'"');i[r]()}else s.interval&&(i.pause(),i.cycle())})},o._dataApiClickHandler=function(t){var i=s.getSelectorFromElement(this);if(i){var r=e(i)[0];if(r&&e(r).hasClass(u.CAROUSEL)){var a=e.extend({},e(r).data(),e(this).data()),l=this.getAttribute("data-slide-to");l&&(a.interval=!1),o._jQueryInterface.call(e(r),a),l&&e(r).data(n).to(l),t.preventDefault()}}},r(o,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}},{key:"Default",get:function(){return a}}]),o}();return e(document).on(c.CLICK_DATA_API,d.DATA_SLIDE,f._dataApiClickHandler),e(window).on(c.LOAD_DATA_API,function(){e(d.DATA_RIDE).each(function(){var t=e(this);f._jQueryInterface.call(t,t.data())})}),e.fn[t]=f._jQueryInterface,e.fn[t].Constructor=f,e.fn[t].noConflict=function(){return e.fn[t]=o,f._jQueryInterface},f}(),c=function(){var t="collapse",n="bs.collapse",i=e.fn[t],o={toggle:!0,parent:""},a={toggle:"boolean",parent:"(string|element)"},l={SHOW:"show.bs.collapse",SHOWN:"shown.bs.collapse",HIDE:"hide.bs.collapse",HIDDEN:"hidden.bs.collapse",CLICK_DATA_API:"click.bs.collapse.data-api"},h={SHOW:"show",COLLAPSE:"collapse",COLLAPSING:"collapsing",COLLAPSED:"collapsed"},c={WIDTH:"width",HEIGHT:"height"},u={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},d=function(){function i(t,n){this._isTransitioning=!1,this._element=t,this._config=this._getConfig(n),this._triggerArray=e.makeArray(e('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'));for(var i=e(u.DATA_TOGGLE),r=0;r0&&this._triggerArray.push(o)}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var d=i.prototype;return d.toggle=function(){e(this._element).hasClass(h.SHOW)?this.hide():this.show()},d.show=function(){var t=this;if(!this._isTransitioning&&!e(this._element).hasClass(h.SHOW)){var r,o;if(this._parent&&((r=e.makeArray(e(this._parent).children().children(u.ACTIVES))).length||(r=null)),!(r&&(o=e(r).data(n))&&o._isTransitioning)){var a=e.Event(l.SHOW);if(e(this._element).trigger(a),!a.isDefaultPrevented()){r&&(i._jQueryInterface.call(e(r),"hide"),o||e(r).data(n,null));var c=this._getDimension();e(this._element).removeClass(h.COLLAPSE).addClass(h.COLLAPSING),this._element.style[c]=0,this._triggerArray.length&&e(this._triggerArray).removeClass(h.COLLAPSED).attr("aria-expanded",!0),this.setTransitioning(!0);var d=function(){e(t._element).removeClass(h.COLLAPSING).addClass(h.COLLAPSE).addClass(h.SHOW),t._element.style[c]="",t.setTransitioning(!1),e(t._element).trigger(l.SHOWN)};if(s.supportsTransitionEnd()){var f="scroll"+(c[0].toUpperCase()+c.slice(1));e(this._element).one(s.TRANSITION_END,d).emulateTransitionEnd(600),this._element.style[c]=this._element[f]+"px"}else d()}}}},d.hide=function(){var t=this;if(!this._isTransitioning&&e(this._element).hasClass(h.SHOW)){var n=e.Event(l.HIDE);if(e(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",s.reflow(this._element),e(this._element).addClass(h.COLLAPSING).removeClass(h.COLLAPSE).removeClass(h.SHOW),this._triggerArray.length)for(var r=0;r0},g._getPopperConfig=function(){var t=this,n={};"function"==typeof this._config.offset?n.fn=function(n){return n.offsets=e.extend({},n.offsets,t._config.offset(n.offsets)||{}),n}:n.offset=this._config.offset;var i={placement:this._getPlacement(),modifiers:{offset:n,flip:{enabled:this._config.flip}}};return this._inNavbar&&(i.modifiers.applyStyle={enabled:!this._inNavbar}),i},a._jQueryInterface=function(t){return this.each(function(){var n=e(this).data(i),s="object"==typeof t?t:null;if(n||(n=new a(this,s),e(this).data(i,n)),"string"==typeof t){if("undefined"==typeof n[t])throw new Error('No method named "'+t+'"');n[t]()}})},a._clearMenus=function(t){if(!t||3!==t.which&&("keyup"!==t.type||9===t.which))for(var n=e.makeArray(e(u.DATA_TOGGLE)),s=0;s0&&r--,40===t.which&&rdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},u._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},u._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip"},u={SHOW:"show",OUT:"out"},d={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,INSERTED:"inserted"+i,CLICK:"click"+i,FOCUSIN:"focusin"+i,FOCUSOUT:"focusout"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i},f={FADE:"fade",SHOW:"show"},_={TOOLTIP:".tooltip",TOOLTIP_INNER:".tooltip-inner",ARROW:".arrow"},g={HOVER:"hover",FOCUS:"focus",CLICK:"click",MANUAL:"manual"},m=function(){function o(t,e){this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var m=o.prototype;return m.enable=function(){this._isEnabled=!0},m.disable=function(){this._isEnabled=!1},m.toggleEnabled=function(){this._isEnabled=!this._isEnabled},m.toggle=function(t){if(this._isEnabled)if(t){var n=this.constructor.DATA_KEY,i=e(t.currentTarget).data(n);i||(i=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(e(this.getTipElement()).hasClass(f.SHOW))return void this._leave(null,this);this._enter(null,this)}},m.dispose=function(){clearTimeout(this._timeout),e.removeData(this.element,this.constructor.DATA_KEY),e(this.element).off(this.constructor.EVENT_KEY),e(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&e(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},m.show=function(){var t=this;if("none"===e(this.element).css("display"))throw new Error("Please use show on visible elements");var i=e.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){e(this.element).trigger(i);var r=e.contains(this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!r)return;var a=this.getTipElement(),l=s.getUID(this.constructor.NAME);a.setAttribute("id",l),this.element.setAttribute("aria-describedby",l),this.setContent(),this.config.animation&&e(a).addClass(f.FADE);var h="function"==typeof this.config.placement?this.config.placement.call(this,a,this.element):this.config.placement,c=this._getAttachment(h);this.addAttachmentClass(c);var d=!1===this.config.container?document.body:e(this.config.container);e(a).data(this.constructor.DATA_KEY,this),e.contains(this.element.ownerDocument.documentElement,this.tip)||e(a).appendTo(d),e(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,a,{placement:c,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:_.ARROW}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){t._handlePopperPlacementChange(e)}}),e(a).addClass(f.SHOW),"ontouchstart"in document.documentElement&&e("body").children().on("mouseover",null,e.noop);var g=function(){t.config.animation&&t._fixTransition();var n=t._hoverState;t._hoverState=null,e(t.element).trigger(t.constructor.Event.SHOWN),n===u.OUT&&t._leave(null,t)};s.supportsTransitionEnd()&&e(this.tip).hasClass(f.FADE)?e(this.tip).one(s.TRANSITION_END,g).emulateTransitionEnd(o._TRANSITION_DURATION):g()}},m.hide=function(t){var n=this,i=this.getTipElement(),r=e.Event(this.constructor.Event.HIDE),o=function(){n._hoverState!==u.SHOW&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),e(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),t&&t()};e(this.element).trigger(r),r.isDefaultPrevented()||(e(i).removeClass(f.SHOW),"ontouchstart"in document.documentElement&&e("body").children().off("mouseover",null,e.noop),this._activeTrigger[g.CLICK]=!1,this._activeTrigger[g.FOCUS]=!1,this._activeTrigger[g.HOVER]=!1,s.supportsTransitionEnd()&&e(this.tip).hasClass(f.FADE)?e(i).one(s.TRANSITION_END,o).emulateTransitionEnd(150):o(),this._hoverState="")},m.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},m.isWithContent=function(){return Boolean(this.getTitle())},m.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-tooltip-"+t)},m.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},m.setContent=function(){var t=e(this.getTipElement());this.setElementContent(t.find(_.TOOLTIP_INNER),this.getTitle()),t.removeClass(f.FADE+" "+f.SHOW)},m.setElementContent=function(t,n){var i=this.config.html;"object"==typeof n&&(n.nodeType||n.jquery)?i?e(n).parent().is(t)||t.empty().append(n):t.text(e(n).text()):t[i?"html":"text"](n)},m.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},m._getAttachment=function(t){return h[t.toUpperCase()]},m._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)e(t.element).on(t.constructor.Event.CLICK,t.config.selector,function(e){return t.toggle(e)});else if(n!==g.MANUAL){var i=n===g.HOVER?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,s=n===g.HOVER?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;e(t.element).on(i,t.config.selector,function(e){return t._enter(e)}).on(s,t.config.selector,function(e){return t._leave(e)})}e(t.element).closest(".modal").on("hide.bs.modal",function(){return t.hide()})}),this.config.selector?this.config=e.extend({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},m._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},m._enter=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusin"===t.type?g.FOCUS:g.HOVER]=!0),e(n.getTipElement()).hasClass(f.SHOW)||n._hoverState===u.SHOW?n._hoverState=u.SHOW:(clearTimeout(n._timeout),n._hoverState=u.SHOW,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===u.SHOW&&n.show()},n.config.delay.show):n.show())},m._leave=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusout"===t.type?g.FOCUS:g.HOVER]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=u.OUT,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===u.OUT&&n.hide()},n.config.delay.hide):n.hide())},m._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},m._getConfig=function(n){return"number"==typeof(n=e.extend({},this.constructor.Default,e(this.element).data(),n)).delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),s.typeCheckConfig(t,n,this.constructor.DefaultType),n},m._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},m._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(a);null!==n&&n.length>0&&t.removeClass(n.join(""))},m._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},m._fixTransition=function(){var t=this.getTipElement(),n=this.config.animation;null===t.getAttribute("x-placement")&&(e(t).removeClass(f.FADE),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},o._jQueryInterface=function(t){return this.each(function(){var n=e(this).data("bs.tooltip"),i="object"==typeof t&&t;if((n||!/dispose|hide/.test(t))&&(n||(n=new o(this,i),e(this).data("bs.tooltip",n)),"string"==typeof t)){if("undefined"==typeof n[t])throw new Error('No method named "'+t+'"');n[t]()}})},r(o,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}},{key:"Default",get:function(){return c}},{key:"NAME",get:function(){return t}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return d}},{key:"EVENT_KEY",get:function(){return i}},{key:"DefaultType",get:function(){return l}}]),o}();return e.fn[t]=m._jQueryInterface,e.fn[t].Constructor=m,e.fn[t].noConflict=function(){return e.fn[t]=o,m._jQueryInterface},m}(),_=function(){var t="popover",n=".bs.popover",i=e.fn[t],s=new RegExp("(^|\\s)bs-popover\\S+","g"),a=e.extend({},f.Default,{placement:"right",trigger:"click",content:"",template:''}),l=e.extend({},f.DefaultType,{content:"(string|element|function)"}),h={FADE:"fade",SHOW:"show"},c={TITLE:".popover-header",CONTENT:".popover-body"},u={HIDE:"hide"+n,HIDDEN:"hidden"+n,SHOW:"show"+n,SHOWN:"shown"+n,INSERTED:"inserted"+n,CLICK:"click"+n,FOCUSIN:"focusin"+n,FOCUSOUT:"focusout"+n,MOUSEENTER:"mouseenter"+n,MOUSELEAVE:"mouseleave"+n},d=function(i){function d(){return i.apply(this,arguments)||this}o(d,i);var f=d.prototype;return f.isWithContent=function(){return this.getTitle()||this._getContent()},f.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-popover-"+t)},f.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},f.setContent=function(){var t=e(this.getTipElement());this.setElementContent(t.find(c.TITLE),this.getTitle()),this.setElementContent(t.find(c.CONTENT),this._getContent()),t.removeClass(h.FADE+" "+h.SHOW)},f._getContent=function(){return this.element.getAttribute("data-content")||("function"==typeof this.config.content?this.config.content.call(this.element):this.config.content)},f._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(s);null!==n&&n.length>0&&t.removeClass(n.join(""))},d._jQueryInterface=function(t){return this.each(function(){var n=e(this).data("bs.popover"),i="object"==typeof t?t:null;if((n||!/destroy|hide/.test(t))&&(n||(n=new d(this,i),e(this).data("bs.popover",n)),"string"==typeof t)){if("undefined"==typeof n[t])throw new Error('No method named "'+t+'"');n[t]()}})},r(d,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}},{key:"Default",get:function(){return a}},{key:"NAME",get:function(){return t}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return u}},{key:"EVENT_KEY",get:function(){return n}},{key:"DefaultType",get:function(){return l}}]),d}(f);return e.fn[t]=d._jQueryInterface,e.fn[t].Constructor=d,e.fn[t].noConflict=function(){return e.fn[t]=i,d._jQueryInterface},d}(),g=function(){var t="scrollspy",n=e.fn[t],i={offset:10,method:"auto",target:""},o={offset:"number",method:"string",target:"(string|element)"},a={ACTIVATE:"activate.bs.scrollspy",SCROLL:"scroll.bs.scrollspy",LOAD_DATA_API:"load.bs.scrollspy.data-api"},l={DROPDOWN_ITEM:"dropdown-item",DROPDOWN_MENU:"dropdown-menu",ACTIVE:"active"},h={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},c={OFFSET:"offset",POSITION:"position"},u=function(){function n(t,n){var i=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(n),this._selector=this._config.target+" "+h.NAV_LINKS+","+this._config.target+" "+h.LIST_ITEMS+","+this._config.target+" "+h.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,e(this._scrollElement).on(a.SCROLL,function(t){return i._process(t)}),this.refresh(),this._process()}var u=n.prototype;return u.refresh=function(){var t=this,n=this._scrollElement!==this._scrollElement.window?c.POSITION:c.OFFSET,i="auto"===this._config.method?n:this._config.method,r=i===c.POSITION?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),e.makeArray(e(this._selector)).map(function(t){var n,o=s.getSelectorFromElement(t);if(o&&(n=e(o)[0]),n){var a=n.getBoundingClientRect();if(a.width||a.height)return[e(n)[i]().top+r,o]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(e){t._offsets.push(e[0]),t._targets.push(e[1])})},u.dispose=function(){e.removeData(this._element,"bs.scrollspy"),e(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},u._getConfig=function(n){if("string"!=typeof(n=e.extend({},i,n)).target){var r=e(n.target).attr("id");r||(r=s.getUID(t),e(n.target).attr("id",r)),n.target="#"+r}return s.typeCheckConfig(t,n,o),n},u._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},u._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},u._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},u._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var s=this._offsets.length;s--;)this._activeTarget!==this._targets[s]&&t>=this._offsets[s]&&("undefined"==typeof this._offsets[s+1]||t li > .active",DATA_TOGGLE:'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',DROPDOWN_TOGGLE:".dropdown-toggle",DROPDOWN_ACTIVE_CHILD:"> .dropdown-menu .active"},a=function(){function t(t){this._element=t}var a=t.prototype;return a.show=function(){var t=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&e(this._element).hasClass(i.ACTIVE)||e(this._element).hasClass(i.DISABLED))){var r,a,l=e(this._element).closest(o.NAV_LIST_GROUP)[0],h=s.getSelectorFromElement(this._element);if(l){var c="UL"===l.nodeName?o.ACTIVE_UL:o.ACTIVE;a=e.makeArray(e(l).find(c)),a=a[a.length-1]}var u=e.Event(n.HIDE,{relatedTarget:this._element}),d=e.Event(n.SHOW,{relatedTarget:a});if(a&&e(a).trigger(u),e(this._element).trigger(d),!d.isDefaultPrevented()&&!u.isDefaultPrevented()){h&&(r=e(h)[0]),this._activate(this._element,l);var f=function(){var i=e.Event(n.HIDDEN,{relatedTarget:t._element}),s=e.Event(n.SHOWN,{relatedTarget:a});e(a).trigger(i),e(t._element).trigger(s)};r?this._activate(r,r.parentNode,f):f()}}},a.dispose=function(){e.removeData(this._element,"bs.tab"),this._element=null},a._activate=function(t,n,r){var a,l=this,h=(a="UL"===n.nodeName?e(n).find(o.ACTIVE_UL):e(n).children(o.ACTIVE))[0],c=r&&s.supportsTransitionEnd()&&h&&e(h).hasClass(i.FADE),u=function(){return l._transitionComplete(t,h,c,r)};h&&c?e(h).one(s.TRANSITION_END,u).emulateTransitionEnd(150):u(),h&&e(h).removeClass(i.SHOW)},a._transitionComplete=function(t,n,r,a){if(n){e(n).removeClass(i.ACTIVE);var l=e(n.parentNode).find(o.DROPDOWN_ACTIVE_CHILD)[0];l&&e(l).removeClass(i.ACTIVE),"tab"===n.getAttribute("role")&&n.setAttribute("aria-selected",!1)}if(e(t).addClass(i.ACTIVE),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),r?(s.reflow(t),e(t).addClass(i.SHOW)):e(t).removeClass(i.FADE),t.parentNode&&e(t.parentNode).hasClass(i.DROPDOWN_MENU)){var h=e(t).closest(o.DROPDOWN)[0];h&&e(h).find(o.DROPDOWN_TOGGLE).addClass(i.ACTIVE),t.setAttribute("aria-expanded",!0)}a&&a()},t._jQueryInterface=function(n){return this.each(function(){var i=e(this),s=i.data("bs.tab");if(s||(s=new t(this),i.data("bs.tab",s)),"string"==typeof n){if("undefined"==typeof s[n])throw new Error('No method named "'+n+'"');s[n]()}})},r(t,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}}]),t}();return e(document).on(n.CLICK_DATA_API,o.DATA_TOGGLE,function(t){t.preventDefault(),a._jQueryInterface.call(e(this),"show")}),e.fn.tab=a._jQueryInterface,e.fn.tab.Constructor=a,e.fn.tab.noConflict=function(){return e.fn.tab=t,a._jQueryInterface},a}();return function(){if("undefined"==typeof e)throw new Error("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||t[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(),t.Util=s,t.Alert=a,t.Button=l,t.Carousel=h,t.Collapse=c,t.Dropdown=u,t.Modal=d,t.Popover=_,t.Scrollspy=g,t.Tab=m,t.Tooltip=f,t}({},$,Popper);
+
+
+/**
+ * @module Regula
+ * @description An annotation-based form-validation framework in Javascript
+ * @license BSD
+ * @version 1.3.4
+ * @copyright Robert Nyman, http://www.robertnyman.com
+ */
+(function(e,t){typeof define=="function"&&define.amd?define("utils/MapUtils",t):(typeof e.regulaModules=="undefined"&&(e.regulaModules={}),e.regulaModules.MapUtils=t())})(this,function(){return{iterateOverMap:function(e,t){var n=0;for(var r in e)e.hasOwnProperty(r)&&r!=="__size__"&&(t.call(e,r,e[r],n),n++)},exists:function(e,t){var n=!1,r=0;while(!n&&r0&&(typeof r=="undefined"||o&&o.test(a))&&s.push(u);return s}function n(e,t){var n=e.getAttribute&&e.getAttribute(t)||null;if(!n){var r=e.attributes;for(var i=0;i0)for(var s in e)e.hasOwnProperty(s)&&s!="__size__"&&t.put(i,s,e[s]);return i}function f(e,t,n,i){var s=o[y.constraintType],a=W(t,s,i),f={group:n,constraintName:e.constraintName,custom:u[s].custom,compound:u[s].compound,async:u[s].async,constraintParameters:y.params,failingElements:e.failingElements,message:a};return r.reportAsSingleViolation||(f.composingConstraintViolations=e.composingConstraintViolations||[]),f}var l=[],c=[];for(var h=0;h0){v=[];for(var h=0;h0){v===null&&(v=[]);var T=0;for(var h=0;h0)throw new r.Exception.IllegalArgumentException("No constraints have been bound to the specified elements: "+i.explode(p)+". "+r.explodeParameters(e));return n=M(n),D(n,e)}function N(e){var t=[],n={asyncContexts:[],syncContexts:[]};for(var s in a)if(a.hasOwnProperty(s)){var o=a[s];for(var u=0;u0)throw new r.Exception.IllegalArgumentException("No constraints have been bound to the specified elements: "+i.explode(t)+". "+r.explodeParameters(e));return n=M(n),D(n,e)}function C(e){var t=!1,n={groupedContexts:{}},i=0;while(i0)throw new r.Exception.IllegalArgumentException("The following elements: "+i.explode(n)+" were not found in one or more of the following group(s): ["+i.explode(t,",").replace(/,/g,", ")+"]. "+r.explodeParameters(e));var m=_(o);return e.groups=m.groups,o=m.uniqueConstraintsToValidate,P(e,o,s)}function A(e){var t=!1,n={groupedContexts:{}},r=0;while(r0&&(n=B(e));if(e.asyncContexts.length>0){if(!t.callback)throw new r.Exception.IllegalArgumentException("One or more constraints to be validated are asynchronous, but a callback has not been provided.");j(e,function(e){n.length>0?n=n.concat(e):n=e,t.callback(n)})}else t.callback&&t.callback(n);return n}function P(e,t,n){var i=F(e.groups,e.independent,t);if(n){if(!e.callback)throw new r.Exception.IllegalArgumentException("One or more constraints to be validated are asynchronous, but a callback has not been provided.");if(!e.independent&&i.length>0){var s=i[0].group,o=t.groupedContexts[s];t.groupedContexts={},t.groupedContexts[s]=o}I(e.groups,e.independent,t,function(t){i.length>0?i=i.concat(t):i=t,e.callback(i)})}else e.callback&&e.callback(i);return i}function H(e,t,n){var i=a[e];if(!i)throw new r.Exception.IllegalArgumentException("Undefined group in group list (group: "+e+", elementId: "+t+", constraint: "+n+")");var s=i[t];if(!s)throw new r.Exception.IllegalArgumentException("No constraints have been defined for the element with id: "+t+" in group "+e);var o=s[n];if(!o)throw new r.Exception.IllegalArgumentException("Constraint "+n+" in group "+e+" hasn't been bound to the element with id "+t);return{group:e,elementId:t,elementConstraint:n,params:o,async:u[n].async}}function B(e){var t=[],n=0;while(n0},max:function(e){var t=!0;return g(this,e)&&(t=parseFloat(this.value)<=parseFloat(e.value)),t},min:function(e){var t=!0;return g(this,e)&&(t=parseFloat(this.value)>=parseFloat(e.value)),t},range:function(e){var t=!0;return g(this,e)&&(t=this.value.replace(/\s/g,"")!=""&&parseFloat(this.value)<=parseFloat(e.max)&&parseFloat(this.value)>=parseFloat(e.min)),t},notBlank:function(e){return this.value.replace(/\s/g,"")!=""},blank:function(e){return this.value.replace(/\s/g,"")===""},matches:function(e){var t=!0;if(g(this,e)){var n,r;typeof e["regex"]=="string"?r=e.regex.replace(/^\//,"").replace(/\/$/,""):r=e.regex,typeof e["flags"]!="undefined"?n=new RegExp(r.toString().replace(/^\//,"").replace(/\/[^\/]*$/,""),e.flags):n=new RegExp(r),t=n.test(this.value)}return t},email:function(e){var t=!0;return g(this,e)&&(t=/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(this.value)),t},alpha:function(e){var t=!0;return g(this,e)&&(t=/^[A-Za-z]+$/.test(this.value)),t},numeric:function(e){var t=!0;return g(this,e)&&(t=/^[0-9]+$/.test(this.value)),t},integer:function(e){var t=!0;return g(this,e)&&(t=/^-?[0-9]+$/.test(this.value)),t},real:function(e){var t=!0;return g(this,e)&&(t=/^-?([0-9]+(\.[0-9]+)?|\.[0-9]+)$/.test(this.value)),t},alphaNumeric:function(e){var t=!0;return g(this,e)&&(t=/^[0-9A-Za-z]+$/.test(this.value)),t},completelyFilled:function(e){var t=[];for(var n=0;n=e.min&&this.value.length<=e.max),t},digits:function(e){var t=!0;if(g(this,e)){var n=this.value.replace(/\s/g,""),r=n.split(/\./);t=!1,n.length>0&&(r.length==1&&(r[1]=""),e.integer>0?t=r[0].length<=e.integer:t=!0,e.fraction>0&&(t=t&&r[1].length<=e.fraction))}return t},past:function(e){var t=!0;if(g(this,e)){var n=y.call(this,e);t=n.dateToValidaten.dateToTestAgainst}return t},url:function(e){var t=!0;return g(this,e)&&(t=/^([a-z]([a-z]|\d|\+|-|\.)*):(\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?((\[(|(v[\da-f]{1,}\.(([a-z]|\d|-|\.|_|~)|[!\$&'\(\)\*\+,;=]|:)+))\])|((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=])*)(:\d*)?)(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*|(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)){0})(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(this.value)),t},step:function(e){var t=!0;if(g(this,e)){var n=parseFloat(this.value),r=parseFloat(e.max),i=parseFloat(e.min),s=parseFloat(e.value);t=n<=r&&n>=i&&n%s===0}return t},html5Required:function(e){return!this.validity.valueMissing},html5Email:w,html5URL:w,html5Number:w,html5DateTime:w,html5DateTimeLocal:w,html5Date:w,html5Month:w,html5Time:w,html5Week:w,html5Range:w,html5Tel:w,html5Color:w,html5Pattern:function(e){return!this.validity.patternMismatch},html5MaxLength:function(e){return!this.validity.tooLong},html5Min:function(e){return!this.validity.rowUnderflow},html5Max:function(e){return!this.validity.rowOverflow},html5Step:function(e){return!this.validity.stepMismatch}};return{Validator:d,init:p,wrapValidatorWithEmptyCheck:b,initializePublicValidators:h,compoundValidator:m,validate:E,runValidatorFor:U,interpolateConstraintDefaultMessage:W,createPublicValidator:v}}),function(e,t){typeof define=="function"&&define.amd?define("domain/CompositionGraph",t):(typeof e.regulaModules=="undefined"&&(e.regulaModules={}),e.regulaModules.CompositionGraph=t())}(this,function(){function n(n){var r=n.type,i=n.name,s=n.parent,o=typeof e[r]=="undefined"?{visited:!1,name:i,type:r,parents:[],children:[]}:e[r];s==null?t.children.push(o):(s.children.push(o),o.parents.push(s)),e[r]=o}function r(){var e={},n=function r(t,n){var i=typeof e[t.type]=="undefined"?{visited:t.visited,name:t.name,type:t.type,parents:[],children:[]}:e[t.type];n!==null&&i.parents.push(n);for(var s=0;s0&&(s={error:!0,message:n.generateExceptionMessage(e,o[t.constraintType],"You seem to have provided some optional or required parameters for @"+o[t.constraintType]+", but you are still missing the following "+u.length+" required parameter(s): "+i.explode(u,", ")),data:null}),s}function d(e,n){var r=t.getNodeByType(s[e]);r==null&&(t.addNode({type:s[e],name:e,parent:null}),r=t.getNodeByType(s[e]));for(var i=0;i0&&t.successful)t=c(e),n.push(t.data);return t.data=n,t}function c(e){var n={successful:!0,message:"",data:null},i=e.shift();return r(i).length==0&&(i=e.shift()),i=="@"?n=h(e):n={successful:!1,message:t.generateExceptionMessage(o,a,"Invalid constraint. Constraint definitions need to start with '@'")+" "+n.message,data:null},n}function h(e){var r={Between:"Range",Matches:"Pattern",Empty:"Blank",NotEmpty:"NotBlank",IsAlpha:"Alpha",IsNumeric:"Integer",IsAlphaNumeric:"AlphaNumeric"},i=p(e);if(i.successful){a=i.data,a=r[a]?r[a]:a;if(n.constraintDefinitions[a]){i=m(e);if(i.successful){i=n.verifyConstraintDefinition(o,a,i.data);if(i.successful){var s=i.data;i.data={element:o,constraintName:a,definedParameters:s}}}}else i={successful:!1,message:t.generateExceptionMessage(o,a,"I cannot find the specified constraint name. If this is a custom constraint, you need to define it before you bind to it")+" "+i.message,data:null}}else i={successful:!1,message:t.generateExceptionMessage(o,a,"Invalid constraint name in constraint definition")+" "+i.message,data:null};return i}function p(e){var n=r(e.shift()),i=d(n.charAt(0));if(i.successful){var s=1;while(s0&&i(n)==","&&s.successful)n.shift(),s=g(n),s.successful&&(e.put(u,s.data.name,s.data.value),r(i(n)).length==0&&n.shift());if(s.successful){var f=n.shift();r(f).length==0&&(f=n.shift()),f!=")"?s={successful:!1,message:t.generateExceptionMessage(o,a,"Cannot find matching closing ) in parameter list")+" "+s.message,data:null}:s.data=u}}else s={successful:!1,message:t.generateExceptionMessage(o,a,"Invalid parameter definition")+" "+s.message,data:null}}}else i(n)!==undefined&&i(n)!="@"&&(s={successful:!1,message:t.generateExceptionMessage(o,a,"Unexpected character '"+i(n)+"'"+" after constraint definition")+" "+s.message,data:null});return s}function g(e){var n=y(e);if(n.successful){var r=n.data,i=e.shift();i=="="?(n=b(e),n.successful?n.data={name:r,value:n.data}:n={successful:!1,message:t.generateExceptionMessage(o,a,"Invalid parameter value")+" "+n.message,data:null}):(e.unshift(i),n={successful:!1,message:t.generateExceptionMessage(o,a,"'=' expected after parameter name "+n.message),data:null})}else n={successful:!1,message:t.generateExceptionMessage(o,a,"Invalid parameter name. You might have unmatched parentheses")+" "+n.message,data:null};return n}function y(e){var n=r(e.shift());n.length==0&&(n=e.shift());var i={successful:!1,message:t.generateExceptionMessage(o,a,"Invalid starting character for parameter name. Can only include A-Z, a-z, and _"),data:null};if(typeof n!="undefined"){i=d(n.charAt(0));if(i.successful){var s=1;while(s0&&s.successful&&!u)i(e)=='"'?(u=!0,e.shift()):(s=k(e),r+=s.data);u||(s={successful:!1,message:t.generateExceptionMessage(o,a,"Unterminated string literal"),data:null})}else e.unshift(n),s={successful:!1,message:t.generateExceptionMessage(o,a,"Invalid quoted string"),data:null};return s.successful=s.successful&&u,s.data=r,s}function k(e){var t="",n=e.shift();return n=="\\"&&(t=e.shift()),{successful:!0,message:"",data:n+t}}function L(e){var n="",r=e.shift(),s={successful:!0,message:"",data:null};if(r=="/"){n=r;var u=!1;while(e.length>0&&s.successful&&!u)i(e)=="/"?(n+=e.shift(),u=!0):(s=k(e),n+=s.data);u||(s={successful:!1,message:t.generateExceptionMessage(o,a,"Unterminated regex literal"),data:null})}else e.unshift(r),s={successful:!1,message:t.generateExceptionMessage(o,a,"Not a regular expression"),data:null};return s.successful=s.successful&&u,s.data=n,s}function A(e){var n=e.shift(),i={successful:!0,message:"",data:null};return r(n)=="true"||r(n)=="false"?i={successful:!0,message:"",data:n==="true"}:(e.unshift(n),i={successful:!1,message:t.generateExceptionMessage(o,a,"Not a boolean"),data:null}),i}function O(e){var n=[],s=e.shift(),u={successful:!0,message:"",data:null};if(s=="["){r(i(e)).length==0&&e.shift(),i(e)=="]"?u={successful:!0,message:"",data:""}:u=M(e);if(u.successful){n.push(u.data),r(i(e)).length==0&&e.shift();while(e.length>0&&i(e)==","&&u.successful)e.shift(),u=M(e),n.push(u.data),r(i(e)).length==0&&e.shift();u.data=n,s=e.shift(),r(s).length==0&&e.shift(),s!="]"&&(u={successful:!1,message:t.generateExceptionMessage(o,a,"Cannot find matching closing ] in group definition")+" "+u.message,data:null})}else u={successful:!1,message:t.generateExceptionMessage(o,a,"Invalid group definition")+" "+u.message,data:null}}else e.unshift(s),u={successful:!1,message:t.generateExceptionMessage(o,a,"Not a valid group definition"),data:null};return u}function M(e){var n={successful:!0,message:"",data:""},i=r(e.shift());i.length==0&&(i=e.shift()),n=d(i.charAt(0));if(n.successful){var s=1;while(s0){var o=0;while(o0?h=t.deletedGroupIndices.pop():h=t.firstCustomGroupIndex++,t.Group[c]=h,t.ReverseGroup[h]=c,o[c]={}}o[c][n.id]||(o[c][n.id]={}),o[c][n.id][r]=u}if(i.constraintDefinitions[r].html5)if(n.getAttribute("type")!==null&&i.constraintDefinitions[r].inputType!==null&&n.getAttribute("type")!==i.constraintDefinitions[r].inputType)a={successful:!1,message:s.generateExceptionMessage(n,r,"Element type of "+n.getAttribute("type")+" conflicts with type of constraint @"+r+": "+i.constraintDefinitions[r].inputType),data:null};else{var p=i.constraintDefinitions[r].attribute,d=i.constraintDefinitions[r].inputType;(p!==null&&n.getAttribute(p)===null||d!==null&&n.getAttribute("type")===null)&&y(n,r,u)}return a}function y(e,t,n){if(t===i.ReverseConstraint[i.Constraint.HTML5Required])e.setAttribute("required","true");else{var r=i.constraintDefinitions[t];for(var s=0;s0&&!t)throw new s.Exception.IllegalArgumentException("Element with id "+r+" does not have any constraints bound to it. "+s.explodeParameters(e))}function w(e){var n=e.elementId,r=e.group,s=e.constraint,u=typeof o[t.ReverseGroup[t.Group.Default]][n]!="undefined";if(u&&typeof r!="undefined"&&typeof s=="undefined"){var a=t.ReverseGroup[r];u=typeof a!="undefined"&&typeof o[a][n]!="undefined"}else if(u&&typeof r=="undefined"&&typeof s!="undefined"){var f=i.ReverseConstraint[s];u=typeof f!="undefined"&&typeof o[t.ReverseGroup[t.Group.Default]][n][f]!="undefined"}else if(u&&typeof r!="undefined"&&typeof s!="undefined"){var a=t.ReverseGroup[r],f=i.ReverseConstraint[s];u=typeof a!="undefined"&&typeof f!="undefined"&&typeof o[a][n]!="undefined"&&typeof o[a][n][f]!="undefined"}return u}var o=null,u={};return{initializeBoundConstraints:a,resetBoundConstraints:f,getBoundConstraints:l,removeElementAndGroupFromBoundConstraintsIfEmpty:c,bindAfterParsing:p,bindHTML5ValidationConstraints:d,bindFromOptions:v,unbind:b,isBound:w}}),function(e,t){typeof define=="function"&&define.amd?define("regula",["utils/MapUtils","utils/DOMUtils","service/BindingService","service/ExceptionService","service/ConstraintService","service/ValidationService","service/GroupService"],t):(e.regula=t(e.regulaModules.MapUtils,e.regulaModules.DOMUtils,e.regulaModules.BindingService,e.regulaModules.ExceptionService,e.regulaModules.ConstraintService,e.regulaModules.ValidationService,e.regulaModules.GroupService),e.regula._modules=e.regulaModules,e.regulaModules=undefined)}(this,function(e,t,n,r,i,s,o){function f(t){e.iterateOverMap(t,function(e,t,n){typeof u[e]!="undefined"&&(u[e]=t)})}function l(e){var i={successful:!0,message:"",data:null};if(typeof e=="undefined"||!e)n.resetBoundConstraints(),u.enableHTML5Validation&&t.supportsHTML5Validation()&&(i=n.bindHTML5ValidationConstraints({element:null})),i.successful&&(i=n.bindAfterParsing({element:null}));else{var s=e.elements;if(typeof s=="undefined"||!s)u.enableHTML5Validation&&t.supportsHTML5Validation()&&typeof e.element!="undefined"&&e.element!==null&&(i=n.bindHTML5ValidationConstraints({element:e.element})),i.successful&&(i=n.bindFromOptions(e));else{var o=0;while(i.successful&&o0&&n.extend(!0,t,{elements:this.get()})),regula.bind(t),this},unbind:function(t){return this instanceof e&&(t||(t={}),this.get().length>0&&n.extend(!0,t,{elements:this.get()})),regula.unbind(t),this},isBound:function(t){return this instanceof e&&(t||(t={}),this.get().length>0&&n.extend(!0,t,{element:this.get(0)})),regula.isBound(t),this},validate:function(t){return this instanceof e&&(t||(t={}),this.get().length>0&&n.extend(!0,t,{elements:this.get()})),regula.validate(t)},custom:function(e){return regula.custom(e),this},compound:function(e){return regula.compound(e),this},override:function(e){return regula.override(e),this}};i.on=i.bind,i.off=i.unbind,n.fn.regula=t,n.regula=t});
+
+
+/**
+ * @module jQuery Count To
+ * @author Matt Huggins
+ * @see https://github.com/mhuggins/jquery-countTo
+ * @license MIT
+ */
+!function(t){function e(t,e){return t.toFixed(e.decimals)}var o=function(e,i){this.$element=t(e),this.options=t.extend({},o.DEFAULTS,this.dataOptions(),i),this.init()};o.DEFAULTS={from:0,to:0,speed:1e3,refreshInterval:100,decimals:0,formatter:e,onUpdate:null,onComplete:null},o.prototype.init=function(){this.value=this.options.from,this.loops=Math.ceil(this.options.speed/this.options.refreshInterval),this.loopCount=0,this.increment=(this.options.to-this.options.from)/this.loops},o.prototype.dataOptions=function(){var t={from:this.$element.data("from"),to:this.$element.data("to"),speed:this.$element.data("speed"),refreshInterval:this.$element.data("refresh-interval"),decimals:this.$element.data("decimals")},e=Object.keys(t);for(var o in e){var i=e[o];"undefined"==typeof t[i]&&delete t[i]}return t},o.prototype.update=function(){this.value+=this.increment,this.loopCount++,this.render(),"function"==typeof this.options.onUpdate&&this.options.onUpdate.call(this.$element,this.value),this.loopCount>=this.loops&&(clearInterval(this.interval),this.value=this.options.to,"function"==typeof this.options.onComplete&&this.options.onComplete.call(this.$element,this.value))},o.prototype.render=function(){var t=this.options.formatter.call(this.$element,this.value,this.options);this.$element.text(t)},o.prototype.restart=function(){this.stop(),this.init(),this.start()},o.prototype.start=function(){this.stop(),this.render(),this.interval=setInterval(this.update.bind(this),this.options.refreshInterval)},o.prototype.stop=function(){this.interval&&clearInterval(this.interval)},o.prototype.toggle=function(){this.interval?this.stop():this.start()},t.fn.countTo=function(e){return this.each(function(){var i=t(this),n=i.data("countTo"),s=!n||"object"==typeof e,r="object"==typeof e?e:{},a="string"==typeof e?e:"start";s&&(n&&n.stop(),i.data("countTo",n=new o(this,r))),n[a].call(n)})}}(jQuery);
+
+
+/**
+ * @module Swiper
+ * @description Most modern mobile touch slider and framework with hardware accelerated transitions
+ * @author Vladimir Kharlampidi
+ * @see http://www.idangero.us/swiper/
+ * @licesne MIT
+ * @version 3.4.2
+ */
+!function(){"use strict";var e,a=function(t,s){function r(e){return Math.floor(e)}function i(){var e=y.params.autoplay,a=y.slides.eq(y.activeIndex);a.attr("data-swiper-autoplay")&&(e=a.attr("data-swiper-autoplay")||y.params.autoplay),y.autoplayTimeoutId=setTimeout(function(){y.params.loop?(y.fixLoop(),y._slideNext(),y.emit("onAutoplay",y)):y.isEnd?s.autoplayStopOnLast?y.stopAutoplay():(y._slideTo(0),y.emit("onAutoplay",y)):(y._slideNext(),y.emit("onAutoplay",y))},e)}function n(a,t){var s=e(a.target);if(!s.is(t))if("string"==typeof t)s=s.parents(t);else if(t.nodeType){var r;return s.parents().each(function(e,a){a===t&&(r=t)}),r?t:void 0}if(0!==s.length)return s[0]}function o(e,a){a=a||{};var t=new(window.MutationObserver||window.WebkitMutationObserver)(function(e){e.forEach(function(e){y.onResize(!0),y.emit("onObserverUpdate",y,e)})});t.observe(e,{attributes:void 0===a.attributes||a.attributes,childList:void 0===a.childList||a.childList,characterData:void 0===a.characterData||a.characterData}),y.observers.push(t)}function l(e){e.originalEvent&&(e=e.originalEvent);var a=e.keyCode||e.charCode;if(!y.params.allowSwipeToNext&&(y.isHorizontal()&&39===a||!y.isHorizontal()&&40===a))return!1;if(!y.params.allowSwipeToPrev&&(y.isHorizontal()&&37===a||!y.isHorizontal()&&38===a))return!1;if(!(e.shiftKey||e.altKey||e.ctrlKey||e.metaKey||document.activeElement&&document.activeElement.nodeName&&("input"===document.activeElement.nodeName.toLowerCase()||"textarea"===document.activeElement.nodeName.toLowerCase()))){if(37===a||39===a||38===a||40===a){var t=!1;if(y.container.parents("."+y.params.slideClass).length>0&&0===y.container.parents("."+y.params.slideActiveClass).length)return;var s={left:window.pageXOffset,top:window.pageYOffset},r=window.innerWidth,i=window.innerHeight,n=y.container.offset();y.rtl&&(n.left=n.left-y.container[0].scrollLeft);for(var o=[[n.left,n.top],[n.left+y.width,n.top],[n.left,n.top+y.height],[n.left+y.width,n.top+y.height]],l=0;l=s.left&&p[0]<=s.left+r&&p[1]>=s.top&&p[1]<=s.top+i&&(t=!0)}if(!t)return}y.isHorizontal()?(37!==a&&39!==a||(e.preventDefault?e.preventDefault():e.returnValue=!1),(39===a&&!y.rtl||37===a&&y.rtl)&&y.slideNext(),(37===a&&!y.rtl||39===a&&y.rtl)&&y.slidePrev()):(38!==a&&40!==a||(e.preventDefault?e.preventDefault():e.returnValue=!1),40===a&&y.slideNext(),38===a&&y.slidePrev()),y.emit("onKeyPress",y,a)}}function p(e){var a=0,t=0,s=0,r=0;return"detail"in e&&(t=e.detail),"wheelDelta"in e&&(t=-e.wheelDelta/120),"wheelDeltaY"in e&&(t=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(a=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(a=t,t=0),s=10*a,r=10*t,"deltaY"in e&&(r=e.deltaY),"deltaX"in e&&(s=e.deltaX),(s||r)&&e.deltaMode&&(1===e.deltaMode?(s*=40,r*=40):(s*=800,r*=800)),s&&!a&&(a=s<1?-1:1),r&&!t&&(t=r<1?-1:1),{spinX:a,spinY:t,pixelX:s,pixelY:r}}function d(e){e.originalEvent&&(e=e.originalEvent);var a=0,t=y.rtl?-1:1,s=p(e);if(y.params.mousewheelForceToAxis)if(y.isHorizontal()){if(!(Math.abs(s.pixelX)>Math.abs(s.pixelY)))return;a=s.pixelX*t}else{if(!(Math.abs(s.pixelY)>Math.abs(s.pixelX)))return;a=s.pixelY}else a=Math.abs(s.pixelX)>Math.abs(s.pixelY)?-s.pixelX*t:-s.pixelY;if(0!==a){if(y.params.mousewheelInvert&&(a=-a),y.params.freeMode){var r=y.getWrapperTranslate()+a*y.params.mousewheelSensitivity,i=y.isBeginning,n=y.isEnd;if(r>=y.minTranslate()&&(r=y.minTranslate()),r<=y.maxTranslate()&&(r=y.maxTranslate()),y.setWrapperTransition(0),y.setWrapperTranslate(r),y.updateProgress(),y.updateActiveIndex(),(!i&&y.isBeginning||!n&&y.isEnd)&&y.updateClasses(),y.params.freeModeSticky?(clearTimeout(y.mousewheel.timeout),y.mousewheel.timeout=setTimeout(function(){y.slideReset()},300)):y.params.lazyLoading&&y.lazy&&y.lazy.load(),y.emit("onScroll",y,e),y.params.autoplay&&y.params.autoplayDisableOnInteraction&&y.stopAutoplay(),0===r||r===y.maxTranslate())return}else{if((new window.Date).getTime()-y.mousewheel.lastScrollTime>60)if(a<0)if(y.isEnd&&!y.params.loop||y.animating){if(y.params.mousewheelReleaseOnEdges)return!0}else y.slideNext(),y.emit("onScroll",y,e);else if(y.isBeginning&&!y.params.loop||y.animating){if(y.params.mousewheelReleaseOnEdges)return!0}else y.slidePrev(),y.emit("onScroll",y,e);y.mousewheel.lastScrollTime=(new window.Date).getTime()}return e.preventDefault?e.preventDefault():e.returnValue=!1,!1}}function m(a,t){a=e(a);var s,r,i,n=y.rtl?-1:1;s=a.attr("data-swiper-parallax")||"0",r=a.attr("data-swiper-parallax-x"),i=a.attr("data-swiper-parallax-y"),r||i?(r=r||"0",i=i||"0"):y.isHorizontal()?(r=s,i="0"):(i=s,r="0"),r=r.indexOf("%")>=0?parseInt(r,10)*t*n+"%":r*t*n+"px",i=i.indexOf("%")>=0?parseInt(i,10)*t+"%":i*t+"px",a.transform("translate3d("+r+", "+i+",0px)")}function u(e){return 0!==e.indexOf("on")&&(e=e[0]!==e[0].toUpperCase()?"on"+e[0].toUpperCase()+e.substring(1):"on"+e),e}if(!(this instanceof a))return new a(t,s);var c={direction:"horizontal",touchEventsTarget:"container",initialSlide:0,speed:300,autoplay:!1,autoplayDisableOnInteraction:!0,autoplayStopOnLast:!1,iOSEdgeSwipeDetection:!1,iOSEdgeSwipeThreshold:20,freeMode:!1,freeModeMomentum:!0,freeModeMomentumRatio:1,freeModeMomentumBounce:!0,freeModeMomentumBounceRatio:1,freeModeMomentumVelocityRatio:1,freeModeSticky:!1,freeModeMinimumVelocity:.02,autoHeight:!1,setWrapperSize:!1,virtualTranslate:!1,effect:"slide",coverflow:{rotate:50,stretch:0,depth:100,modifier:1,slideShadows:!0},flip:{slideShadows:!0,limitRotation:!0},cube:{slideShadows:!0,shadow:!0,shadowOffset:20,shadowScale:.94},fade:{crossFade:!1},parallax:!1,zoom:!1,zoomMax:3,zoomMin:1,zoomToggle:!0,scrollbar:null,scrollbarHide:!0,scrollbarDraggable:!1,scrollbarSnapOnRelease:!1,keyboardControl:!1,mousewheelControl:!1,mousewheelReleaseOnEdges:!1,mousewheelInvert:!1,mousewheelForceToAxis:!1,mousewheelSensitivity:1,mousewheelEventsTarged:"container",hashnav:!1,hashnavWatchState:!1,history:!1,replaceState:!1,breakpoints:void 0,spaceBetween:0,slidesPerView:1,slidesPerColumn:1,slidesPerColumnFill:"column",slidesPerGroup:1,centeredSlides:!1,slidesOffsetBefore:0,slidesOffsetAfter:0,roundLengths:!1,touchRatio:1,touchAngle:45,simulateTouch:!0,shortSwipes:!0,longSwipes:!0,longSwipesRatio:.5,longSwipesMs:300,followFinger:!0,onlyExternal:!1,threshold:0,touchMoveStopPropagation:!0,touchReleaseOnEdges:!1,uniqueNavElements:!0,pagination:null,paginationElement:"span",paginationClickable:!1,paginationHide:!1,paginationBulletRender:null,paginationProgressRender:null,paginationFractionRender:null,paginationCustomRender:null,paginationType:"bullets",resistance:!0,resistanceRatio:.85,nextButton:null,prevButton:null,watchSlidesProgress:!1,watchSlidesVisibility:!1,grabCursor:!1,preventClicks:!0,preventClicksPropagation:!0,slideToClickedSlide:!1,lazyLoading:!1,lazyLoadingInPrevNext:!1,lazyLoadingInPrevNextAmount:1,lazyLoadingOnTransitionStart:!1,preloadImages:!0,updateOnImagesReady:!0,loop:!1,loopAdditionalSlides:0,loopedSlides:null,control:void 0,controlInverse:!1,controlBy:"slide",normalizeSlideIndex:!0,allowSwipeToPrev:!0,allowSwipeToNext:!0,swipeHandler:null,noSwiping:!0,noSwipingClass:"swiper-no-swiping",passiveListeners:!0,containerModifierClass:"swiper-container-",slideClass:"swiper-slide",slideActiveClass:"swiper-slide-active",slideDuplicateActiveClass:"swiper-slide-duplicate-active",slideVisibleClass:"swiper-slide-visible",slideDuplicateClass:"swiper-slide-duplicate",slideNextClass:"swiper-slide-next",slideDuplicateNextClass:"swiper-slide-duplicate-next",slidePrevClass:"swiper-slide-prev",slideDuplicatePrevClass:"swiper-slide-duplicate-prev",wrapperClass:"swiper-wrapper",bulletClass:"swiper-pagination-bullet",bulletActiveClass:"swiper-pagination-bullet-active",buttonDisabledClass:"swiper-button-disabled",paginationCurrentClass:"swiper-pagination-current",paginationTotalClass:"swiper-pagination-total",paginationHiddenClass:"swiper-pagination-hidden",paginationProgressbarClass:"swiper-pagination-progressbar",paginationClickableClass:"swiper-pagination-clickable",paginationModifierClass:"swiper-pagination-",lazyLoadingClass:"swiper-lazy",lazyStatusLoadingClass:"swiper-lazy-loading",lazyStatusLoadedClass:"swiper-lazy-loaded",lazyPreloaderClass:"swiper-lazy-preloader",notificationClass:"swiper-notification",preloaderClass:"preloader",zoomContainerClass:"swiper-zoom-container",observer:!1,observeParents:!1,a11y:!1,prevSlideMessage:"Previous slide",nextSlideMessage:"Next slide",firstSlideMessage:"This is the first slide",lastSlideMessage:"This is the last slide",paginationBulletMessage:"Go to slide {{index}}",runCallbacksOnInit:!0},g=s&&s.virtualTranslate;s=s||{};var h={};for(var v in s)if("object"!=typeof s[v]||null===s[v]||s[v].nodeType||s[v]===window||s[v]===document||"undefined"!=typeof Dom7&&s[v]instanceof Dom7||"undefined"!=typeof jQuery&&s[v]instanceof jQuery)h[v]=s[v];else{h[v]={};for(var f in s[v])h[v][f]=s[v][f]}for(var w in c)if(void 0===s[w])s[w]=c[w];else if("object"==typeof s[w])for(var x in c[w])void 0===s[w][x]&&(s[w][x]=c[w][x]);var y=this;if(y.params=s,y.originalParams=h,y.classNames=[],void 0!==e&&"undefined"!=typeof Dom7&&(e=Dom7),(void 0!==e||(e="undefined"==typeof Dom7?window.Dom7||window.Zepto||window.jQuery:Dom7))&&(y.$=e,y.currentBreakpoint=void 0,y.getActiveBreakpoint=function(){if(!y.params.breakpoints)return!1;var e,a=!1,t=[];for(e in y.params.breakpoints)y.params.breakpoints.hasOwnProperty(e)&&t.push(e);t.sort(function(e,a){return parseInt(e,10)>parseInt(a,10)});for(var s=0;s=window.innerWidth&&!a&&(a=e);return a||"max"},y.setBreakpoint=function(){var e=y.getActiveBreakpoint();if(e&&y.currentBreakpoint!==e){var a=e in y.params.breakpoints?y.params.breakpoints[e]:y.originalParams,t=y.params.loop&&a.slidesPerView!==y.params.slidesPerView;for(var s in a)y.params[s]=a[s];y.currentBreakpoint=e,t&&y.destroyLoop&&y.reLoop(!0)}},y.params.breakpoints&&y.setBreakpoint(),y.container=e(t),0!==y.container.length)){if(y.container.length>1){var T=[];return y.container.each(function(){T.push(new a(this,s))}),T}y.container[0].swiper=y,y.container.data("swiper",y),y.classNames.push(y.params.containerModifierClass+y.params.direction),y.params.freeMode&&y.classNames.push(y.params.containerModifierClass+"free-mode"),y.support.flexbox||(y.classNames.push(y.params.containerModifierClass+"no-flexbox"),y.params.slidesPerColumn=1),y.params.autoHeight&&y.classNames.push(y.params.containerModifierClass+"autoheight"),(y.params.parallax||y.params.watchSlidesVisibility)&&(y.params.watchSlidesProgress=!0),y.params.touchReleaseOnEdges&&(y.params.resistanceRatio=0),["cube","coverflow","flip"].indexOf(y.params.effect)>=0&&(y.support.transforms3d?(y.params.watchSlidesProgress=!0,y.classNames.push(y.params.containerModifierClass+"3d")):y.params.effect="slide"),"slide"!==y.params.effect&&y.classNames.push(y.params.containerModifierClass+y.params.effect),"cube"===y.params.effect&&(y.params.resistanceRatio=0,y.params.slidesPerView=1,y.params.slidesPerColumn=1,y.params.slidesPerGroup=1,y.params.centeredSlides=!1,y.params.spaceBetween=0,y.params.virtualTranslate=!0),"fade"!==y.params.effect&&"flip"!==y.params.effect||(y.params.slidesPerView=1,y.params.slidesPerColumn=1,y.params.slidesPerGroup=1,y.params.watchSlidesProgress=!0,y.params.spaceBetween=0,void 0===g&&(y.params.virtualTranslate=!0)),y.params.grabCursor&&y.support.touch&&(y.params.grabCursor=!1),y.wrapper=y.container.children("."+y.params.wrapperClass),y.params.pagination&&(y.paginationContainer=e(y.params.pagination),y.params.uniqueNavElements&&"string"==typeof y.params.pagination&&y.paginationContainer.length>1&&1===y.container.find(y.params.pagination).length&&(y.paginationContainer=y.container.find(y.params.pagination)),"bullets"===y.params.paginationType&&y.params.paginationClickable?y.paginationContainer.addClass(y.params.paginationModifierClass+"clickable"):y.params.paginationClickable=!1,y.paginationContainer.addClass(y.params.paginationModifierClass+y.params.paginationType)),(y.params.nextButton||y.params.prevButton)&&(y.params.nextButton&&(y.nextButton=e(y.params.nextButton),y.params.uniqueNavElements&&"string"==typeof y.params.nextButton&&y.nextButton.length>1&&1===y.container.find(y.params.nextButton).length&&(y.nextButton=y.container.find(y.params.nextButton))),y.params.prevButton&&(y.prevButton=e(y.params.prevButton),y.params.uniqueNavElements&&"string"==typeof y.params.prevButton&&y.prevButton.length>1&&1===y.container.find(y.params.prevButton).length&&(y.prevButton=y.container.find(y.params.prevButton)))),y.isHorizontal=function(){return"horizontal"===y.params.direction},y.rtl=y.isHorizontal()&&("rtl"===y.container[0].dir.toLowerCase()||"rtl"===y.container.css("direction")),y.rtl&&y.classNames.push(y.params.containerModifierClass+"rtl"),y.rtl&&(y.wrongRTL="-webkit-box"===y.wrapper.css("display")),y.params.slidesPerColumn>1&&y.classNames.push(y.params.containerModifierClass+"multirow"),y.device.android&&y.classNames.push(y.params.containerModifierClass+"android"),y.container.addClass(y.classNames.join(" ")),y.translate=0,y.progress=0,y.velocity=0,y.lockSwipeToNext=function(){y.params.allowSwipeToNext=!1,!1===y.params.allowSwipeToPrev&&y.params.grabCursor&&y.unsetGrabCursor()},y.lockSwipeToPrev=function(){y.params.allowSwipeToPrev=!1,!1===y.params.allowSwipeToNext&&y.params.grabCursor&&y.unsetGrabCursor()},y.lockSwipes=function(){y.params.allowSwipeToNext=y.params.allowSwipeToPrev=!1,y.params.grabCursor&&y.unsetGrabCursor()},y.unlockSwipeToNext=function(){y.params.allowSwipeToNext=!0,!0===y.params.allowSwipeToPrev&&y.params.grabCursor&&y.setGrabCursor()},y.unlockSwipeToPrev=function(){y.params.allowSwipeToPrev=!0,!0===y.params.allowSwipeToNext&&y.params.grabCursor&&y.setGrabCursor()},y.unlockSwipes=function(){y.params.allowSwipeToNext=y.params.allowSwipeToPrev=!0,y.params.grabCursor&&y.setGrabCursor()},y.setGrabCursor=function(e){y.container[0].style.cursor="move",y.container[0].style.cursor=e?"-webkit-grabbing":"-webkit-grab",y.container[0].style.cursor=e?"-moz-grabbin":"-moz-grab",y.container[0].style.cursor=e?"grabbing":"grab"},y.unsetGrabCursor=function(){y.container[0].style.cursor=""},y.params.grabCursor&&y.setGrabCursor(),y.imagesToLoad=[],y.imagesLoaded=0,y.loadImage=function(e,a,t,s,r,i){function n(){i&&i()}var o;e.complete&&r?n():a?(o=new window.Image,o.onload=n,o.onerror=n,s&&(o.sizes=s),t&&(o.srcset=t),a&&(o.src=a)):n()},y.preloadImages=function(){y.imagesToLoad=y.container.find("img");for(var e=0;e1)for(e=0;ey.slides.length)break;a.push(y.slides.eq(s)[0])}else a.push(y.slides.eq(y.activeIndex)[0]);for(e=0;et?r:t}t&&y.wrapper.css("height",t+"px")},y.updateContainerSize=function(){var e,a;e=void 0!==y.params.width?y.params.width:y.container[0].clientWidth,a=void 0!==y.params.height?y.params.height:y.container[0].clientHeight,0===e&&y.isHorizontal()||0===a&&!y.isHorizontal()||(e=e-parseInt(y.container.css("padding-left"),10)-parseInt(y.container.css("padding-right"),10),a=a-parseInt(y.container.css("padding-top"),10)-parseInt(y.container.css("padding-bottom"),10),y.width=e,y.height=a,y.size=y.isHorizontal()?y.width:y.height)},y.updateSlidesSize=function(){y.slides=y.wrapper.children("."+y.params.slideClass),y.snapGrid=[],y.slidesGrid=[],y.slidesSizesGrid=[];var e,a=y.params.spaceBetween,t=-y.params.slidesOffsetBefore,s=0,i=0;if(void 0!==y.size){"string"==typeof a&&a.indexOf("%")>=0&&(a=parseFloat(a.replace("%",""))/100*y.size),y.virtualSize=-a,y.rtl?y.slides.css({marginLeft:"",marginTop:""}):y.slides.css({marginRight:"",marginBottom:""});var n;y.params.slidesPerColumn>1&&(n=Math.floor(y.slides.length/y.params.slidesPerColumn)===y.slides.length/y.params.slidesPerColumn?y.slides.length:Math.ceil(y.slides.length/y.params.slidesPerColumn)*y.params.slidesPerColumn,"auto"!==y.params.slidesPerView&&"row"===y.params.slidesPerColumnFill&&(n=Math.max(n,y.params.slidesPerView*y.params.slidesPerColumn)));var o,l=y.params.slidesPerColumn,p=n/l,d=p-(y.params.slidesPerColumn*p-y.slides.length);for(e=0;e1){var u,c,g;"column"===y.params.slidesPerColumnFill?(c=Math.floor(e/l),g=e-c*l,(c>d||c===d&&g===l-1)&&++g>=l&&(g=0,c++),u=c+g*n/l,m.css({"-webkit-box-ordinal-group":u,"-moz-box-ordinal-group":u,"-ms-flex-order":u,"-webkit-order":u,order:u})):(g=Math.floor(e/p),c=e-g*p),m.css("margin-"+(y.isHorizontal()?"top":"left"),0!==g&&y.params.spaceBetween&&y.params.spaceBetween+"px").attr("data-swiper-column",c).attr("data-swiper-row",g)}"none"!==m.css("display")&&("auto"===y.params.slidesPerView?(o=y.isHorizontal()?m.outerWidth(!0):m.outerHeight(!0),y.params.roundLengths&&(o=r(o))):(o=(y.size-(y.params.slidesPerView-1)*a)/y.params.slidesPerView,y.params.roundLengths&&(o=r(o)),y.isHorizontal()?y.slides[e].style.width=o+"px":y.slides[e].style.height=o+"px"),y.slides[e].swiperSlideSize=o,y.slidesSizesGrid.push(o),y.params.centeredSlides?(t=t+o/2+s/2+a,0===s&&0!==e&&(t=t-y.size/2-a),0===e&&(t=t-y.size/2-a),Math.abs(t)<.001&&(t=0),i%y.params.slidesPerGroup==0&&y.snapGrid.push(t),y.slidesGrid.push(t)):(i%y.params.slidesPerGroup==0&&y.snapGrid.push(t),y.slidesGrid.push(t),t=t+o+a),y.virtualSize+=o+a,s=o,i++)}y.virtualSize=Math.max(y.virtualSize,y.size)+y.params.slidesOffsetAfter;var h;if(y.rtl&&y.wrongRTL&&("slide"===y.params.effect||"coverflow"===y.params.effect)&&y.wrapper.css({width:y.virtualSize+y.params.spaceBetween+"px"}),y.support.flexbox&&!y.params.setWrapperSize||(y.isHorizontal()?y.wrapper.css({width:y.virtualSize+y.params.spaceBetween+"px"}):y.wrapper.css({height:y.virtualSize+y.params.spaceBetween+"px"})),y.params.slidesPerColumn>1&&(y.virtualSize=(o+y.params.spaceBetween)*n,y.virtualSize=Math.ceil(y.virtualSize/y.params.slidesPerColumn)-y.params.spaceBetween,y.isHorizontal()?y.wrapper.css({width:y.virtualSize+y.params.spaceBetween+"px"}):y.wrapper.css({height:y.virtualSize+y.params.spaceBetween+"px"}),y.params.centeredSlides)){for(h=[],e=0;e1&&y.snapGrid.push(y.virtualSize-y.size)}0===y.snapGrid.length&&(y.snapGrid=[0]),0!==y.params.spaceBetween&&(y.isHorizontal()?y.rtl?y.slides.css({marginLeft:a+"px"}):y.slides.css({marginRight:a+"px"}):y.slides.css({marginBottom:a+"px"})),y.params.watchSlidesProgress&&y.updateSlidesOffset()}},y.updateSlidesOffset=function(){for(var e=0;ey.size&&(s=!0));for(a=y.activeIndex-1;a>=0;a--)y.slides[a]&&!s&&(r+=y.slides[a].swiperSlideSize,t++,r>y.size&&(s=!0))}else for(e=y.activeIndex+1;e=0&&i0&&n<=y.size||i<=0&&n>=y.size)&&y.slides.eq(t).addClass(y.params.slideVisibleClass)}s.progress=y.rtl?-r:r}}},y.updateProgress=function(e){void 0===e&&(e=y.translate||0);var a=y.maxTranslate()-y.minTranslate(),t=y.isBeginning,s=y.isEnd;0===a?(y.progress=0,y.isBeginning=y.isEnd=!0):(y.progress=(e-y.minTranslate())/a,y.isBeginning=y.progress<=0,y.isEnd=y.progress>=1),y.isBeginning&&!t&&y.emit("onReachBeginning",y),y.isEnd&&!s&&y.emit("onReachEnd",y),y.params.watchSlidesProgress&&y.updateSlidesProgress(e),y.emit("onProgress",y,y.progress)},y.updateActiveIndex=function(){var e,a,t,s=y.rtl?y.translate:-y.translate;for(a=0;a=y.slidesGrid[a]&&s=y.slidesGrid[a]&&s=y.slidesGrid[a]&&(e=a);y.params.normalizeSlideIndex&&(e<0||void 0===e)&&(e=0),(t=Math.floor(e/y.params.slidesPerGroup))>=y.snapGrid.length&&(t=y.snapGrid.length-1),e!==y.activeIndex&&(y.snapIndex=t,y.previousIndex=y.activeIndex,y.activeIndex=e,y.updateClasses(),y.updateRealIndex())},y.updateRealIndex=function(){y.realIndex=parseInt(y.slides.eq(y.activeIndex).attr("data-swiper-slide-index")||y.activeIndex,10)},y.updateClasses=function(){y.slides.removeClass(y.params.slideActiveClass+" "+y.params.slideNextClass+" "+y.params.slidePrevClass+" "+y.params.slideDuplicateActiveClass+" "+y.params.slideDuplicateNextClass+" "+y.params.slideDuplicatePrevClass);var a=y.slides.eq(y.activeIndex);a.addClass(y.params.slideActiveClass),s.loop&&(a.hasClass(y.params.slideDuplicateClass)?y.wrapper.children("."+y.params.slideClass+":not(."+y.params.slideDuplicateClass+')[data-swiper-slide-index="'+y.realIndex+'"]').addClass(y.params.slideDuplicateActiveClass):y.wrapper.children("."+y.params.slideClass+"."+y.params.slideDuplicateClass+'[data-swiper-slide-index="'+y.realIndex+'"]').addClass(y.params.slideDuplicateActiveClass));var t=a.next("."+y.params.slideClass).addClass(y.params.slideNextClass);y.params.loop&&0===t.length&&(t=y.slides.eq(0)).addClass(y.params.slideNextClass);var r=a.prev("."+y.params.slideClass).addClass(y.params.slidePrevClass);if(y.params.loop&&0===r.length&&(r=y.slides.eq(-1)).addClass(y.params.slidePrevClass),s.loop&&(t.hasClass(y.params.slideDuplicateClass)?y.wrapper.children("."+y.params.slideClass+":not(."+y.params.slideDuplicateClass+')[data-swiper-slide-index="'+t.attr("data-swiper-slide-index")+'"]').addClass(y.params.slideDuplicateNextClass):y.wrapper.children("."+y.params.slideClass+"."+y.params.slideDuplicateClass+'[data-swiper-slide-index="'+t.attr("data-swiper-slide-index")+'"]').addClass(y.params.slideDuplicateNextClass),r.hasClass(y.params.slideDuplicateClass)?y.wrapper.children("."+y.params.slideClass+":not(."+y.params.slideDuplicateClass+')[data-swiper-slide-index="'+r.attr("data-swiper-slide-index")+'"]').addClass(y.params.slideDuplicatePrevClass):y.wrapper.children("."+y.params.slideClass+"."+y.params.slideDuplicateClass+'[data-swiper-slide-index="'+r.attr("data-swiper-slide-index")+'"]').addClass(y.params.slideDuplicatePrevClass)),y.paginationContainer&&y.paginationContainer.length>0){var i,n=y.params.loop?Math.ceil((y.slides.length-2*y.loopedSlides)/y.params.slidesPerGroup):y.snapGrid.length;if(y.params.loop?((i=Math.ceil((y.activeIndex-y.loopedSlides)/y.params.slidesPerGroup))>y.slides.length-1-2*y.loopedSlides&&(i-=y.slides.length-2*y.loopedSlides),i>n-1&&(i-=n),i<0&&"bullets"!==y.params.paginationType&&(i=n+i)):i=void 0!==y.snapIndex?y.snapIndex:y.activeIndex||0,"bullets"===y.params.paginationType&&y.bullets&&y.bullets.length>0&&(y.bullets.removeClass(y.params.bulletActiveClass),y.paginationContainer.length>1?y.bullets.each(function(){e(this).index()===i&&e(this).addClass(y.params.bulletActiveClass)}):y.bullets.eq(i).addClass(y.params.bulletActiveClass)),"fraction"===y.params.paginationType&&(y.paginationContainer.find("."+y.params.paginationCurrentClass).text(i+1),y.paginationContainer.find("."+y.params.paginationTotalClass).text(n)),"progress"===y.params.paginationType){var o=(i+1)/n,l=o,p=1;y.isHorizontal()||(p=o,l=1),y.paginationContainer.find("."+y.params.paginationProgressbarClass).transform("translate3d(0,0,0) scaleX("+l+") scaleY("+p+")").transition(y.params.speed)}"custom"===y.params.paginationType&&y.params.paginationCustomRender&&(y.paginationContainer.html(y.params.paginationCustomRender(y,i+1,n)),y.emit("onPaginationRendered",y,y.paginationContainer[0]))}y.params.loop||(y.params.prevButton&&y.prevButton&&y.prevButton.length>0&&(y.isBeginning?(y.prevButton.addClass(y.params.buttonDisabledClass),y.params.a11y&&y.a11y&&y.a11y.disable(y.prevButton)):(y.prevButton.removeClass(y.params.buttonDisabledClass),y.params.a11y&&y.a11y&&y.a11y.enable(y.prevButton))),y.params.nextButton&&y.nextButton&&y.nextButton.length>0&&(y.isEnd?(y.nextButton.addClass(y.params.buttonDisabledClass),y.params.a11y&&y.a11y&&y.a11y.disable(y.nextButton)):(y.nextButton.removeClass(y.params.buttonDisabledClass),y.params.a11y&&y.a11y&&y.a11y.enable(y.nextButton))))},y.updatePagination=function(){if(y.params.pagination&&y.paginationContainer&&y.paginationContainer.length>0){var e="";if("bullets"===y.params.paginationType){for(var a=y.params.loop?Math.ceil((y.slides.length-2*y.loopedSlides)/y.params.slidesPerGroup):y.snapGrid.length,t=0;t'+y.params.paginationElement+">";y.paginationContainer.html(e),y.bullets=y.paginationContainer.find("."+y.params.bulletClass),y.params.paginationClickable&&y.params.a11y&&y.a11y&&y.a11y.initPagination()}"fraction"===y.params.paginationType&&(e=y.params.paginationFractionRender?y.params.paginationFractionRender(y,y.params.paginationCurrentClass,y.params.paginationTotalClass):' / ',y.paginationContainer.html(e)),"progress"===y.params.paginationType&&(e=y.params.paginationProgressRender?y.params.paginationProgressRender(y,y.params.paginationProgressbarClass):'',y.paginationContainer.html(e)),"custom"!==y.params.paginationType&&y.emit("onPaginationRendered",y,y.paginationContainer[0])}},y.update=function(e){function a(){y.rtl,y.translate,t=Math.min(Math.max(y.translate,y.maxTranslate()),y.minTranslate()),y.setWrapperTranslate(t),y.updateActiveIndex(),y.updateClasses()}if(y){y.updateContainerSize(),y.updateSlidesSize(),y.updateProgress(),y.updatePagination(),y.updateClasses(),y.params.scrollbar&&y.scrollbar&&y.scrollbar.set();var t;e?(y.controller&&y.controller.spline&&(y.controller.spline=void 0),y.params.freeMode?(a(),y.params.autoHeight&&y.updateAutoHeight()):(("auto"===y.params.slidesPerView||y.params.slidesPerView>1)&&y.isEnd&&!y.params.centeredSlides?y.slideTo(y.slides.length-1,0,!1,!0):y.slideTo(y.activeIndex,0,!1,!0))||a()):y.params.autoHeight&&y.updateAutoHeight()}},y.onResize=function(e){y.params.onBeforeResize&&y.params.onBeforeResize(y),y.params.breakpoints&&y.setBreakpoint();var a=y.params.allowSwipeToPrev,t=y.params.allowSwipeToNext;y.params.allowSwipeToPrev=y.params.allowSwipeToNext=!0,y.updateContainerSize(),y.updateSlidesSize(),("auto"===y.params.slidesPerView||y.params.freeMode||e)&&y.updatePagination(),y.params.scrollbar&&y.scrollbar&&y.scrollbar.set(),y.controller&&y.controller.spline&&(y.controller.spline=void 0);var s=!1;if(y.params.freeMode){var r=Math.min(Math.max(y.translate,y.maxTranslate()),y.minTranslate());y.setWrapperTranslate(r),y.updateActiveIndex(),y.updateClasses(),y.params.autoHeight&&y.updateAutoHeight()}else y.updateClasses(),s=("auto"===y.params.slidesPerView||y.params.slidesPerView>1)&&y.isEnd&&!y.params.centeredSlides?y.slideTo(y.slides.length-1,0,!1,!0):y.slideTo(y.activeIndex,0,!1,!0);y.params.lazyLoading&&!s&&y.lazy&&y.lazy.load(),y.params.allowSwipeToPrev=a,y.params.allowSwipeToNext=t,y.params.onAfterResize&&y.params.onAfterResize(y)},y.touchEventsDesktop={start:"mousedown",move:"mousemove",end:"mouseup"},window.navigator.pointerEnabled?y.touchEventsDesktop={start:"pointerdown",move:"pointermove",end:"pointerup"}:window.navigator.msPointerEnabled&&(y.touchEventsDesktop={start:"MSPointerDown",move:"MSPointerMove",end:"MSPointerUp"}),y.touchEvents={start:y.support.touch||!y.params.simulateTouch?"touchstart":y.touchEventsDesktop.start,move:y.support.touch||!y.params.simulateTouch?"touchmove":y.touchEventsDesktop.move,end:y.support.touch||!y.params.simulateTouch?"touchend":y.touchEventsDesktop.end},(window.navigator.pointerEnabled||window.navigator.msPointerEnabled)&&("container"===y.params.touchEventsTarget?y.container:y.wrapper).addClass("swiper-wp8-"+y.params.direction),y.initEvents=function(e){var a=e?"off":"on",t=e?"removeEventListener":"addEventListener",r="container"===y.params.touchEventsTarget?y.container[0]:y.wrapper[0],i=y.support.touch?r:document,n=!!y.params.nested;if(y.browser.ie)r[t](y.touchEvents.start,y.onTouchStart,!1),i[t](y.touchEvents.move,y.onTouchMove,n),i[t](y.touchEvents.end,y.onTouchEnd,!1);else{if(y.support.touch){var o=!("touchstart"!==y.touchEvents.start||!y.support.passiveListener||!y.params.passiveListeners)&&{passive:!0,capture:!1};r[t](y.touchEvents.start,y.onTouchStart,o),r[t](y.touchEvents.move,y.onTouchMove,n),r[t](y.touchEvents.end,y.onTouchEnd,o)}(s.simulateTouch&&!y.device.ios&&!y.device.android||s.simulateTouch&&!y.support.touch&&y.device.ios)&&(r[t]("mousedown",y.onTouchStart,!1),document[t]("mousemove",y.onTouchMove,n),document[t]("mouseup",y.onTouchEnd,!1))}window[t]("resize",y.onResize),y.params.nextButton&&y.nextButton&&y.nextButton.length>0&&(y.nextButton[a]("click",y.onClickNext),y.params.a11y&&y.a11y&&y.nextButton[a]("keydown",y.a11y.onEnterKey)),y.params.prevButton&&y.prevButton&&y.prevButton.length>0&&(y.prevButton[a]("click",y.onClickPrev),y.params.a11y&&y.a11y&&y.prevButton[a]("keydown",y.a11y.onEnterKey)),y.params.pagination&&y.params.paginationClickable&&(y.paginationContainer[a]("click","."+y.params.bulletClass,y.onClickIndex),y.params.a11y&&y.a11y&&y.paginationContainer[a]("keydown","."+y.params.bulletClass,y.a11y.onEnterKey)),(y.params.preventClicks||y.params.preventClicksPropagation)&&r[t]("click",y.preventClicks,!0)},y.attachEvents=function(){y.initEvents()},y.detachEvents=function(){y.initEvents(!0)},y.allowClick=!0,y.preventClicks=function(e){y.allowClick||(y.params.preventClicks&&e.preventDefault(),y.params.preventClicksPropagation&&y.animating&&(e.stopPropagation(),e.stopImmediatePropagation()))},y.onClickNext=function(e){e.preventDefault(),y.isEnd&&!y.params.loop||y.slideNext()},y.onClickPrev=function(e){e.preventDefault(),y.isBeginning&&!y.params.loop||y.slidePrev()},y.onClickIndex=function(a){a.preventDefault();var t=e(this).index()*y.params.slidesPerGroup;y.params.loop&&(t+=y.loopedSlides),y.slideTo(t)},y.updateClickedSlide=function(a){var t=n(a,"."+y.params.slideClass),s=!1;if(t)for(var r=0;ry.slides.length-y.loopedSlides+l/2?(y.fixLoop(),o=y.wrapper.children("."+y.params.slideClass+'[data-swiper-slide-index="'+i+'"]:not(.'+y.params.slideDuplicateClass+")").eq(0).index(),setTimeout(function(){y.slideTo(o)},0)):y.slideTo(o):o>y.slides.length-l?(y.fixLoop(),o=y.wrapper.children("."+y.params.slideClass+'[data-swiper-slide-index="'+i+'"]:not(.'+y.params.slideDuplicateClass+")").eq(0).index(),setTimeout(function(){y.slideTo(o)},0)):y.slideTo(o)}else y.slideTo(o)}};var b,C,S,z,M,P,E,I,k,D,L="input, select, textarea, button, video",B=Date.now(),H=[];y.animating=!1,y.touches={startX:0,startY:0,currentX:0,currentY:0,diff:0};var G,X;y.onTouchStart=function(a){if(a.originalEvent&&(a=a.originalEvent),(G="touchstart"===a.type)||!("which"in a)||3!==a.which){if(y.params.noSwiping&&n(a,"."+y.params.noSwipingClass))return void(y.allowClick=!0);if(!y.params.swipeHandler||n(a,y.params.swipeHandler)){var t=y.touches.currentX="touchstart"===a.type?a.targetTouches[0].pageX:a.pageX,s=y.touches.currentY="touchstart"===a.type?a.targetTouches[0].pageY:a.pageY;if(!(y.device.ios&&y.params.iOSEdgeSwipeDetection&&t<=y.params.iOSEdgeSwipeThreshold)){if(b=!0,C=!1,S=!0,M=void 0,X=void 0,y.touches.startX=t,y.touches.startY=s,z=Date.now(),y.allowClick=!0,y.updateContainerSize(),y.swipeDirection=void 0,y.params.threshold>0&&(I=!1),"touchstart"!==a.type){var r=!0;e(a.target).is(L)&&(r=!1),document.activeElement&&e(document.activeElement).is(L)&&document.activeElement.blur(),r&&a.preventDefault()}y.emit("onTouchStart",y,a)}}}},y.onTouchMove=function(a){if(a.originalEvent&&(a=a.originalEvent),!G||"mousemove"!==a.type){if(a.preventedByNestedSwiper)return y.touches.startX="touchmove"===a.type?a.targetTouches[0].pageX:a.pageX,void(y.touches.startY="touchmove"===a.type?a.targetTouches[0].pageY:a.pageY);if(y.params.onlyExternal)return y.allowClick=!1,void(b&&(y.touches.startX=y.touches.currentX="touchmove"===a.type?a.targetTouches[0].pageX:a.pageX,y.touches.startY=y.touches.currentY="touchmove"===a.type?a.targetTouches[0].pageY:a.pageY,z=Date.now()));if(G&&y.params.touchReleaseOnEdges&&!y.params.loop)if(y.isHorizontal()){if(y.touches.currentXy.touches.startX&&y.translate>=y.minTranslate())return}else if(y.touches.currentYy.touches.startY&&y.translate>=y.minTranslate())return;if(G&&document.activeElement&&a.target===document.activeElement&&e(a.target).is(L))return C=!0,void(y.allowClick=!1);if(S&&y.emit("onTouchMove",y,a),!(a.targetTouches&&a.targetTouches.length>1)){if(y.touches.currentX="touchmove"===a.type?a.targetTouches[0].pageX:a.pageX,y.touches.currentY="touchmove"===a.type?a.targetTouches[0].pageY:a.pageY,void 0===M){var t;y.isHorizontal()&&y.touches.currentY===y.touches.startY||!y.isHorizontal()&&y.touches.currentX===y.touches.startX?M=!1:(t=180*Math.atan2(Math.abs(y.touches.currentY-y.touches.startY),Math.abs(y.touches.currentX-y.touches.startX))/Math.PI,M=y.isHorizontal()?t>y.params.touchAngle:90-t>y.params.touchAngle)}if(M&&y.emit("onTouchMoveOpposite",y,a),void 0===X&&(y.touches.currentX===y.touches.startX&&y.touches.currentY===y.touches.startY||(X=!0)),b){if(M)return void(b=!1);if(X){y.allowClick=!1,y.emit("onSliderMove",y,a),a.preventDefault(),y.params.touchMoveStopPropagation&&!y.params.nested&&a.stopPropagation(),C||(s.loop&&y.fixLoop(),E=y.getWrapperTranslate(),y.setWrapperTransition(0),y.animating&&y.wrapper.trigger("webkitTransitionEnd transitionend oTransitionEnd MSTransitionEnd msTransitionEnd"),y.params.autoplay&&y.autoplaying&&(y.params.autoplayDisableOnInteraction?y.stopAutoplay():y.pauseAutoplay()),D=!1,!y.params.grabCursor||!0!==y.params.allowSwipeToNext&&!0!==y.params.allowSwipeToPrev||y.setGrabCursor(!0)),C=!0;var r=y.touches.diff=y.isHorizontal()?y.touches.currentX-y.touches.startX:y.touches.currentY-y.touches.startY;r*=y.params.touchRatio,y.rtl&&(r=-r),y.swipeDirection=r>0?"prev":"next",P=r+E;var i=!0;if(r>0&&P>y.minTranslate()?(i=!1,y.params.resistance&&(P=y.minTranslate()-1+Math.pow(-y.minTranslate()+E+r,y.params.resistanceRatio))):r<0&&PE&&(P=E),y.params.threshold>0){if(!(Math.abs(r)>y.params.threshold||I))return void(P=E);if(!I)return I=!0,y.touches.startX=y.touches.currentX,y.touches.startY=y.touches.currentY,P=E,void(y.touches.diff=y.isHorizontal()?y.touches.currentX-y.touches.startX:y.touches.currentY-y.touches.startY)}y.params.followFinger&&((y.params.freeMode||y.params.watchSlidesProgress)&&y.updateActiveIndex(),y.params.freeMode&&(0===H.length&&H.push({position:y.touches[y.isHorizontal()?"startX":"startY"],time:z}),H.push({position:y.touches[y.isHorizontal()?"currentX":"currentY"],time:(new window.Date).getTime()})),y.updateProgress(P),y.setWrapperTranslate(P))}}}}},y.onTouchEnd=function(a){if(a.originalEvent&&(a=a.originalEvent),S&&y.emit("onTouchEnd",y,a),S=!1,b){y.params.grabCursor&&C&&b&&(!0===y.params.allowSwipeToNext||!0===y.params.allowSwipeToPrev)&&y.setGrabCursor(!1);var t=Date.now(),s=t-z;if(y.allowClick&&(y.updateClickedSlide(a),y.emit("onTap",y,a),s<300&&t-B>300&&(k&&clearTimeout(k),k=setTimeout(function(){y&&(y.params.paginationHide&&y.paginationContainer.length>0&&!e(a.target).hasClass(y.params.bulletClass)&&y.paginationContainer.toggleClass(y.params.paginationHiddenClass),y.emit("onClick",y,a))},300)),s<300&&t-B<300&&(k&&clearTimeout(k),y.emit("onDoubleTap",y,a))),B=Date.now(),setTimeout(function(){y&&(y.allowClick=!0)},0),!b||!C||!y.swipeDirection||0===y.touches.diff||P===E)return void(b=C=!1);b=C=!1;var r;if(r=y.params.followFinger?y.rtl?y.translate:-y.translate:-P,y.params.freeMode){if(r<-y.minTranslate())return void y.slideTo(y.activeIndex);if(r>-y.maxTranslate())return void(y.slides.length1){var i=H.pop(),n=H.pop(),o=i.position-n.position,l=i.time-n.time;y.velocity=o/l,y.velocity=y.velocity/2,Math.abs(y.velocity)150||(new window.Date).getTime()-i.time>300)&&(y.velocity=0)}else y.velocity=0;y.velocity=y.velocity*y.params.freeModeMomentumVelocityRatio,H.length=0;var p=1e3*y.params.freeModeMomentumRatio,d=y.velocity*p,m=y.translate+d;y.rtl&&(m=-m);var u,c=!1,g=20*Math.abs(y.velocity)*y.params.freeModeMomentumBounceRatio;if(my.minTranslate())y.params.freeModeMomentumBounce?(m-y.minTranslate()>g&&(m=y.minTranslate()+g),u=y.minTranslate(),c=!0,D=!0):m=y.minTranslate();else if(y.params.freeModeSticky){var h,v=0;for(v=0;v-m){h=v;break}m=Math.abs(y.snapGrid[h]-m)=y.params.longSwipesMs)&&(y.updateProgress(),y.updateActiveIndex()))}var f,w=0,x=y.slidesSizesGrid[0];for(f=0;f=y.slidesGrid[f]&&r=y.slidesGrid[f]&&(w=f,x=y.slidesGrid[y.slidesGrid.length-1]-y.slidesGrid[y.slidesGrid.length-2]);var T=(r-y.slidesGrid[w])/x;if(s>y.params.longSwipesMs){if(!y.params.longSwipes)return void y.slideTo(y.activeIndex);"next"===y.swipeDirection&&(T>=y.params.longSwipesRatio?y.slideTo(w+y.params.slidesPerGroup):y.slideTo(w)),"prev"===y.swipeDirection&&(T>1-y.params.longSwipesRatio?y.slideTo(w+y.params.slidesPerGroup):y.slideTo(w))}else{if(!y.params.shortSwipes)return void y.slideTo(y.activeIndex);"next"===y.swipeDirection&&y.slideTo(w+y.params.slidesPerGroup),"prev"===y.swipeDirection&&y.slideTo(w)}}},y._slideTo=function(e,a){return y.slideTo(e,a,!0,!0)},y.slideTo=function(e,a,t,s){void 0===t&&(t=!0),void 0===e&&(e=0),e<0&&(e=0),y.snapIndex=Math.floor(e/y.params.slidesPerGroup),y.snapIndex>=y.snapGrid.length&&(y.snapIndex=y.snapGrid.length-1);var r=-y.snapGrid[y.snapIndex];if(y.params.autoplay&&y.autoplaying&&(s||!y.params.autoplayDisableOnInteraction?y.pauseAutoplay(a):y.stopAutoplay()),y.updateProgress(r),y.params.normalizeSlideIndex)for(var i=0;i=Math.floor(100*y.slidesGrid[i])&&(e=i);return!(!y.params.allowSwipeToNext&&ry.translate&&r>y.maxTranslate()&&(y.activeIndex||0)!==e||(void 0===a&&(a=y.params.speed),y.previousIndex=y.activeIndex||0,y.activeIndex=e,y.updateRealIndex(),y.rtl&&-r===y.translate||!y.rtl&&r===y.translate?(y.params.autoHeight&&y.updateAutoHeight(),y.updateClasses(),"slide"!==y.params.effect&&y.setWrapperTranslate(r),1):(y.updateClasses(),y.onTransitionStart(t),0===a||y.browser.lteIE9?(y.setWrapperTranslate(r),y.setWrapperTransition(0),y.onTransitionEnd(t)):(y.setWrapperTranslate(r),y.setWrapperTransition(a),y.animating||(y.animating=!0,y.wrapper.transitionEnd(function(){y&&y.onTransitionEnd(t)}))),0)))},y.onTransitionStart=function(e){void 0===e&&(e=!0),y.params.autoHeight&&y.updateAutoHeight(),y.lazy&&y.lazy.onTransitionStart(),e&&(y.emit("onTransitionStart",y),y.activeIndex!==y.previousIndex&&(y.emit("onSlideChangeStart",y),y.activeIndex>y.previousIndex?y.emit("onSlideNextStart",y):y.emit("onSlidePrevStart",y)))},y.onTransitionEnd=function(e){y.animating=!1,y.setWrapperTransition(0),void 0===e&&(e=!0),y.lazy&&y.lazy.onTransitionEnd(),e&&(y.emit("onTransitionEnd",y),y.activeIndex!==y.previousIndex&&(y.emit("onSlideChangeEnd",y),y.activeIndex>y.previousIndex?y.emit("onSlideNextEnd",y):y.emit("onSlidePrevEnd",y))),y.params.history&&y.history&&y.history.setHistory(y.params.history,y.activeIndex),y.params.hashnav&&y.hashnav&&y.hashnav.setHash()},y.slideNext=function(e,a,t){return y.params.loop?!y.animating&&(y.fixLoop(),y.container[0].clientLeft,y.slideTo(y.activeIndex+y.params.slidesPerGroup,a,e,t)):y.slideTo(y.activeIndex+y.params.slidesPerGroup,a,e,t)},y._slideNext=function(e){return y.slideNext(!0,e,!0)},y.slidePrev=function(e,a,t){return y.params.loop?!y.animating&&(y.fixLoop(),y.container[0].clientLeft,y.slideTo(y.activeIndex-1,a,e,t)):y.slideTo(y.activeIndex-1,a,e,t)},y._slidePrev=function(e){return y.slidePrev(!0,e,!0)},y.slideReset=function(e,a,t){return y.slideTo(y.activeIndex,a,e)},y.disableTouchControl=function(){return y.params.onlyExternal=!0,!0},y.enableTouchControl=function(){return y.params.onlyExternal=!1,!0},y.setWrapperTransition=function(e,a){y.wrapper.transition(e),"slide"!==y.params.effect&&y.effects[y.params.effect]&&y.effects[y.params.effect].setTransition(e),y.params.parallax&&y.parallax&&y.parallax.setTransition(e),y.params.scrollbar&&y.scrollbar&&y.scrollbar.setTransition(e),y.params.control&&y.controller&&y.controller.setTransition(e,a),y.emit("onSetTransition",y,e)},y.setWrapperTranslate=function(e,a,t){var s=0,i=0;y.isHorizontal()?s=y.rtl?-e:e:i=e,y.params.roundLengths&&(s=r(s),i=r(i)),y.params.virtualTranslate||(y.support.transforms3d?y.wrapper.transform("translate3d("+s+"px, "+i+"px, 0px)"):y.wrapper.transform("translate("+s+"px, "+i+"px)")),y.translate=y.isHorizontal()?s:i;var n=y.maxTranslate()-y.minTranslate();(0===n?0:(e-y.minTranslate())/n)!==y.progress&&y.updateProgress(e),a&&y.updateActiveIndex(),"slide"!==y.params.effect&&y.effects[y.params.effect]&&y.effects[y.params.effect].setTranslate(y.translate),y.params.parallax&&y.parallax&&y.parallax.setTranslate(y.translate),y.params.scrollbar&&y.scrollbar&&y.scrollbar.setTranslate(y.translate),y.params.control&&y.controller&&y.controller.setTranslate(y.translate,t),y.emit("onSetTranslate",y,y.translate)},y.getTranslate=function(e,a){var t,s,r,i;return void 0===a&&(a="x"),y.params.virtualTranslate?y.rtl?-y.translate:y.translate:(r=window.getComputedStyle(e,null),window.WebKitCSSMatrix?((s=r.transform||r.webkitTransform).split(",").length>6&&(s=s.split(", ").map(function(e){return e.replace(",",".")}).join(", ")),i=new window.WebKitCSSMatrix("none"===s?"":s)):(i=r.MozTransform||r.OTransform||r.MsTransform||r.msTransform||r.transform||r.getPropertyValue("transform").replace("translate(","matrix(1, 0, 0, 1,"),t=i.toString().split(",")),"x"===a&&(s=window.WebKitCSSMatrix?i.m41:16===t.length?parseFloat(t[12]):parseFloat(t[4])),"y"===a&&(s=window.WebKitCSSMatrix?i.m42:16===t.length?parseFloat(t[13]):parseFloat(t[5])),y.rtl&&s&&(s=-s),s||0)},y.getWrapperTranslate=function(e){return void 0===e&&(e=y.isHorizontal()?"x":"y"),y.getTranslate(y.wrapper[0],e)},y.observers=[],y.initObservers=function(){if(y.params.observeParents)for(var e=y.container.parents(),a=0;aa.length&&(y.loopedSlides=a.length);var t,s=[],r=[];for(a.each(function(t,i){var n=e(this);t=a.length-y.loopedSlides&&s.push(i),n.attr("data-swiper-slide-index",t)}),t=0;t=0;t--)y.wrapper.prepend(e(s[t].cloneNode(!0)).addClass(y.params.slideDuplicateClass))},y.destroyLoop=function(){y.wrapper.children("."+y.params.slideClass+"."+y.params.slideDuplicateClass).remove(),y.slides.removeAttr("data-swiper-slide-index")},y.reLoop=function(e){var a=y.activeIndex-y.loopedSlides;y.destroyLoop(),y.createLoop(),y.updateSlidesSize(),e&&y.slideTo(a+y.loopedSlides,0,!1)},y.fixLoop=function(){var e;y.activeIndex=2*y.loopedSlides||y.activeIndex>y.slides.length-2*y.params.slidesPerView)&&(e=-y.slides.length+y.activeIndex+y.loopedSlides,e+=y.loopedSlides,y.slideTo(e,0,!1,!0))},y.appendSlide=function(e){if(y.params.loop&&y.destroyLoop(),"object"==typeof e&&e.length)for(var a=0;a '),t.append(l)),0===p.length&&(p=e('
'),t.append(p)),l.length&&(l[0].style.opacity=Math.max(-s,0)),p.length&&(p[0].style.opacity=Math.max(s,0))}t.transform("translate3d("+n+"px, "+o+"px, 0px) rotateX("+i+"deg) rotateY("+r+"deg)")}},setTransition:function(a){if(y.slides.transition(a).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(a),y.params.virtualTranslate&&0!==a){var t=!1;y.slides.eq(y.activeIndex).transitionEnd(function(){if(!t&&y&&e(this).hasClass(y.params.slideActiveClass)){t=!0,y.animating=!1;for(var a=["webkitTransitionEnd","transitionend","oTransitionEnd","MSTransitionEnd","msTransitionEnd"],s=0;s '),y.wrapper.append(a)),a.css({height:y.width+"px"})):0===(a=y.container.find(".swiper-cube-shadow")).length&&(a=e('
'),y.container.append(a)));for(var s=0;s-1&&(t=90*s+90*o,y.rtl&&(t=90*-s-90*o)),r.transform(m),y.params.cube.slideShadows){var u=y.isHorizontal()?r.find(".swiper-slide-shadow-left"):r.find(".swiper-slide-shadow-top"),c=y.isHorizontal()?r.find(".swiper-slide-shadow-right"):r.find(".swiper-slide-shadow-bottom");0===u.length&&(u=e('
'),r.append(u)),0===c.length&&(c=e('
'),r.append(c)),u.length&&(u[0].style.opacity=Math.max(-o,0)),c.length&&(c[0].style.opacity=Math.max(o,0))}}if(y.wrapper.css({"-webkit-transform-origin":"50% 50% -"+y.size/2+"px","-moz-transform-origin":"50% 50% -"+y.size/2+"px","-ms-transform-origin":"50% 50% -"+y.size/2+"px","transform-origin":"50% 50% -"+y.size/2+"px"}),y.params.cube.shadow)if(y.isHorizontal())a.transform("translate3d(0px, "+(y.width/2+y.params.cube.shadowOffset)+"px, "+-y.width/2+"px) rotateX(90deg) rotateZ(0deg) scale("+y.params.cube.shadowScale+")");else{var g=Math.abs(t)-90*Math.floor(Math.abs(t)/90),h=1.5-(Math.sin(2*g*Math.PI/360)/2+Math.cos(2*g*Math.PI/360)/2),v=y.params.cube.shadowScale,f=y.params.cube.shadowScale/h,w=y.params.cube.shadowOffset;a.transform("scale3d("+v+", 1, "+f+") translate3d(0px, "+(y.height/2+w)+"px, "+-y.height/2/f+"px) rotateX(-90deg)")}var x=y.isSafari||y.isUiWebView?-y.size/2:0;y.wrapper.transform("translate3d(0px,0,"+x+"px) rotateX("+(y.isHorizontal()?0:t)+"deg) rotateY("+(y.isHorizontal()?-t:0)+"deg)")},setTransition:function(e){y.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),y.params.cube.shadow&&!y.isHorizontal()&&y.container.find(".swiper-cube-shadow").transition(e)}},coverflow:{setTranslate:function(){for(var a=y.translate,t=y.isHorizontal()?-a+y.width/2:-a+y.height/2,s=y.isHorizontal()?y.params.coverflow.rotate:-y.params.coverflow.rotate,r=y.params.coverflow.depth,i=0,n=y.slides.length;i '),o.append(v)),0===f.length&&(f=e('
'),o.append(f)),v.length&&(v[0].style.opacity=p>0?p:0),f.length&&(f[0].style.opacity=-p>0?-p:0)}}y.browser.ie&&(y.wrapper[0].style.perspectiveOrigin=t+"px 50%")},setTransition:function(e){y.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e)}}},y.lazy={initialImageLoaded:!1,loadImageInSlide:function(a,t){if(void 0!==a&&(void 0===t&&(t=!0),0!==y.slides.length)){var s=y.slides.eq(a),r=s.find("."+y.params.lazyLoadingClass+":not(."+y.params.lazyStatusLoadedClass+"):not(."+y.params.lazyStatusLoadingClass+")");!s.hasClass(y.params.lazyLoadingClass)||s.hasClass(y.params.lazyStatusLoadedClass)||s.hasClass(y.params.lazyStatusLoadingClass)||(r=r.add(s[0])),0!==r.length&&r.each(function(){var a=e(this);a.addClass(y.params.lazyStatusLoadingClass);var r=a.attr("data-background"),i=a.attr("data-src"),n=a.attr("data-srcset"),o=a.attr("data-sizes");y.loadImage(a[0],i||r,n,o,!1,function(){if(void 0!==y&&null!==y&&y){if(r?(a.css("background-image",'url("'+r+'")'),a.removeAttr("data-background")):(n&&(a.attr("srcset",n),a.removeAttr("data-srcset")),o&&(a.attr("sizes",o),a.removeAttr("data-sizes")),i&&(a.attr("src",i),a.removeAttr("data-src"))),a.addClass(y.params.lazyStatusLoadedClass).removeClass(y.params.lazyStatusLoadingClass),s.find("."+y.params.lazyPreloaderClass+", ."+y.params.preloaderClass).remove(),y.params.loop&&t){var e=s.attr("data-swiper-slide-index");if(s.hasClass(y.params.slideDuplicateClass)){var l=y.wrapper.children('[data-swiper-slide-index="'+e+'"]:not(.'+y.params.slideDuplicateClass+")");y.lazy.loadImageInSlide(l.index(),!1)}else{var p=y.wrapper.children("."+y.params.slideDuplicateClass+'[data-swiper-slide-index="'+e+'"]');y.lazy.loadImageInSlide(p.index(),!1)}}y.emit("onLazyImageReady",y,s[0],a[0])}}),y.emit("onLazyImageLoad",y,s[0],a[0])})}},load:function(){var a,t=y.params.slidesPerView;if("auto"===t&&(t=0),y.lazy.initialImageLoaded||(y.lazy.initialImageLoaded=!0),y.params.watchSlidesVisibility)y.wrapper.children("."+y.params.slideVisibleClass).each(function(){y.lazy.loadImageInSlide(e(this).index())});else if(t>1)for(a=y.activeIndex;a1||y.params.lazyLoadingInPrevNextAmount&&y.params.lazyLoadingInPrevNextAmount>1){var s=y.params.lazyLoadingInPrevNextAmount,r=t,i=Math.min(y.activeIndex+r+Math.max(s,r),y.slides.length),n=Math.max(y.activeIndex-Math.max(r,s),0);for(a=y.activeIndex+t;a0&&y.lazy.loadImageInSlide(o.index());var l=y.wrapper.children("."+y.params.slidePrevClass);l.length>0&&y.lazy.loadImageInSlide(l.index())}},onTransitionStart:function(){y.params.lazyLoading&&(y.params.lazyLoadingOnTransitionStart||!y.params.lazyLoadingOnTransitionStart&&!y.lazy.initialImageLoaded)&&y.lazy.load()},onTransitionEnd:function(){y.params.lazyLoading&&!y.params.lazyLoadingOnTransitionStart&&y.lazy.load()}},y.scrollbar={isTouched:!1,setDragPosition:function(e){var a=y.scrollbar,t=(y.isHorizontal()?"touchstart"===e.type||"touchmove"===e.type?e.targetTouches[0].pageX:e.pageX||e.clientX:"touchstart"===e.type||"touchmove"===e.type?e.targetTouches[0].pageY:e.pageY||e.clientY)-a.track.offset()[y.isHorizontal()?"left":"top"]-a.dragSize/2,s=-y.minTranslate()*a.moveDivider,r=-y.maxTranslate()*a.moveDivider;tr&&(t=r),t=-t/a.moveDivider,y.updateProgress(t),y.setWrapperTranslate(t,!0)},dragStart:function(e){var a=y.scrollbar;a.isTouched=!0,e.preventDefault(),e.stopPropagation(),a.setDragPosition(e),clearTimeout(a.dragTimeout),a.track.transition(0),y.params.scrollbarHide&&a.track.css("opacity",1),y.wrapper.transition(100),a.drag.transition(100),y.emit("onScrollbarDragStart",y)},dragMove:function(e){var a=y.scrollbar;a.isTouched&&(e.preventDefault?e.preventDefault():e.returnValue=!1,a.setDragPosition(e),y.wrapper.transition(0),a.track.transition(0),a.drag.transition(0),y.emit("onScrollbarDragMove",y))},dragEnd:function(e){var a=y.scrollbar;a.isTouched&&(a.isTouched=!1,y.params.scrollbarHide&&(clearTimeout(a.dragTimeout),a.dragTimeout=setTimeout(function(){a.track.css("opacity",0),a.track.transition(400)},1e3)),y.emit("onScrollbarDragEnd",y),y.params.scrollbarSnapOnRelease&&y.slideReset())},draggableEvents:!1!==y.params.simulateTouch||y.support.touch?y.touchEvents:y.touchEventsDesktop,enableDraggable:function(){var a=y.scrollbar,t=y.support.touch?a.track:document;e(a.track).on(a.draggableEvents.start,a.dragStart),e(t).on(a.draggableEvents.move,a.dragMove),e(t).on(a.draggableEvents.end,a.dragEnd)},disableDraggable:function(){var a=y.scrollbar,t=y.support.touch?a.track:document;e(a.track).off(a.draggableEvents.start,a.dragStart),e(t).off(a.draggableEvents.move,a.dragMove),e(t).off(a.draggableEvents.end,a.dragEnd)},set:function(){if(y.params.scrollbar){var a=y.scrollbar;a.track=e(y.params.scrollbar),y.params.uniqueNavElements&&"string"==typeof y.params.scrollbar&&a.track.length>1&&1===y.container.find(y.params.scrollbar).length&&(a.track=y.container.find(y.params.scrollbar)),a.drag=a.track.find(".swiper-scrollbar-drag"),0===a.drag.length&&(a.drag=e('
'),a.track.append(a.drag)),a.drag[0].style.width="",a.drag[0].style.height="",a.trackSize=y.isHorizontal()?a.track[0].offsetWidth:a.track[0].offsetHeight,a.divider=y.size/y.virtualSize,a.moveDivider=a.divider*(a.trackSize/y.size),a.dragSize=a.trackSize*a.divider,y.isHorizontal()?a.drag[0].style.width=a.dragSize+"px":a.drag[0].style.height=a.dragSize+"px",a.divider>=1?a.track[0].style.display="none":a.track[0].style.display="",y.params.scrollbarHide&&(a.track[0].style.opacity=0)}},setTranslate:function(){if(y.params.scrollbar){var e,a=y.scrollbar,t=(y.translate,a.dragSize);e=(a.trackSize-a.dragSize)*y.progress,y.rtl&&y.isHorizontal()?(e=-e,e>0?(t=a.dragSize-e,e=0):-e+a.dragSize>a.trackSize&&(t=a.trackSize+e)):e<0?(t=a.dragSize+e,e=0):e+a.dragSize>a.trackSize&&(t=a.trackSize-e),y.isHorizontal()?(y.support.transforms3d?a.drag.transform("translate3d("+e+"px, 0, 0)"):a.drag.transform("translateX("+e+"px)"),a.drag[0].style.width=t+"px"):(y.support.transforms3d?a.drag.transform("translate3d(0px, "+e+"px, 0)"):a.drag.transform("translateY("+e+"px)"),a.drag[0].style.height=t+"px"),y.params.scrollbarHide&&(clearTimeout(a.timeout),a.track[0].style.opacity=1,a.timeout=setTimeout(function(){a.track[0].style.opacity=0,a.track.transition(400)},1e3))}},setTransition:function(e){y.params.scrollbar&&y.scrollbar.drag.transition(e)}},y.controller={LinearSpline:function(e,a){var t=function(){var e,a,t;return function(s,r){for(a=-1,e=s.length;e-a>1;)s[t=e+a>>1]<=r?a=t:e=t;return e}}();this.x=e,this.y=a,this.lastIndex=e.length-1;var s,r;this.x.length,this.interpolate=function(e){return e?(r=t(this.x,e),s=r-1,(e-this.x[s])*(this.y[r]-this.y[s])/(this.x[r]-this.x[s])+this.y[s]):0}},getInterpolateFunction:function(e){y.controller.spline||(y.controller.spline=y.params.loop?new y.controller.LinearSpline(y.slidesGrid,e.slidesGrid):new y.controller.LinearSpline(y.snapGrid,e.snapGrid))},setTranslate:function(e,t){function s(a){e=a.rtl&&"horizontal"===a.params.direction?-y.translate:y.translate,"slide"===y.params.controlBy&&(y.controller.getInterpolateFunction(a),i=-y.controller.spline.interpolate(-e)),i&&"container"!==y.params.controlBy||(r=(a.maxTranslate()-a.minTranslate())/(y.maxTranslate()-y.minTranslate()),i=(e-y.minTranslate())*r+a.minTranslate()),y.params.controlInverse&&(i=a.maxTranslate()-i),a.updateProgress(i),a.setWrapperTranslate(i,!1,y),a.updateActiveIndex()}var r,i,n=y.params.control;if(Array.isArray(n))for(var o=0;o-1?"DOMMouseScroll":function(){var e="onwheel"in document;if(!e){var a=document.createElement("div");a.setAttribute("onwheel","return;"),e="function"==typeof a.onwheel}return!e&&document.implementation&&document.implementation.hasFeature&&!0!==document.implementation.hasFeature("","")&&(e=document.implementation.hasFeature("Events.wheel","3.0")),e}()?"wheel":"mousewheel"),y.disableMousewheelControl=function(){if(!y.mousewheel.event)return!1;var a=y.container;return"container"!==y.params.mousewheelEventsTarged&&(a=e(y.params.mousewheelEventsTarged)),a.off(y.mousewheel.event,d),y.params.mousewheelControl=!1,!0},y.enableMousewheelControl=function(){if(!y.mousewheel.event)return!1;var a=y.container;return"container"!==y.params.mousewheelEventsTarged&&(a=e(y.params.mousewheelEventsTarged)),a.on(y.mousewheel.event,d),y.params.mousewheelControl=!0,!0},y.parallax={setTranslate:function(){y.container.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]").each(function(){m(this,y.progress)}),y.slides.each(function(){var a=e(this);a.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]").each(function(){m(this,Math.min(Math.max(a[0].progress,-1),1))})})},setTransition:function(a){void 0===a&&(a=y.params.speed),y.container.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]").each(function(){var t=e(this),s=parseInt(t.attr("data-swiper-parallax-duration"),10)||a;0===a&&(s=0),t.transition(s)})}},y.zoom={scale:1,currentScale:1,isScaling:!1,gesture:{slide:void 0,slideWidth:void 0,slideHeight:void 0,image:void 0,imageWrap:void 0,zoomMax:y.params.zoomMax},image:{isTouched:void 0,isMoved:void 0,currentX:void 0,currentY:void 0,minX:void 0,minY:void 0,maxX:void 0,maxY:void 0,width:void 0,height:void 0,startX:void 0,startY:void 0,touchesStart:{},touchesCurrent:{}},velocity:{x:void 0,y:void 0,prevPositionX:void 0,prevPositionY:void 0,prevTime:void 0},getDistanceBetweenTouches:function(e){if(e.targetTouches.length<2)return 1;var a=e.targetTouches[0].pageX,t=e.targetTouches[0].pageY,s=e.targetTouches[1].pageX,r=e.targetTouches[1].pageY;return Math.sqrt(Math.pow(s-a,2)+Math.pow(r-t,2))},onGestureStart:function(a){var t=y.zoom;if(!y.support.gestures){if("touchstart"!==a.type||"touchstart"===a.type&&a.targetTouches.length<2)return;t.gesture.scaleStart=t.getDistanceBetweenTouches(a)}t.gesture.slide&&t.gesture.slide.length||(t.gesture.slide=e(this),0===t.gesture.slide.length&&(t.gesture.slide=y.slides.eq(y.activeIndex)),t.gesture.image=t.gesture.slide.find("img, svg, canvas"),t.gesture.imageWrap=t.gesture.image.parent("."+y.params.zoomContainerClass),t.gesture.zoomMax=t.gesture.imageWrap.attr("data-swiper-zoom")||y.params.zoomMax,0!==t.gesture.imageWrap.length)?(t.gesture.image.transition(0),t.isScaling=!0):t.gesture.image=void 0},onGestureChange:function(e){var a=y.zoom;if(!y.support.gestures){if("touchmove"!==e.type||"touchmove"===e.type&&e.targetTouches.length<2)return;a.gesture.scaleMove=a.getDistanceBetweenTouches(e)}a.gesture.image&&0!==a.gesture.image.length&&(y.support.gestures?a.scale=e.scale*a.currentScale:a.scale=a.gesture.scaleMove/a.gesture.scaleStart*a.currentScale,a.scale>a.gesture.zoomMax&&(a.scale=a.gesture.zoomMax-1+Math.pow(a.scale-a.gesture.zoomMax+1,.5)),a.scalea.image.touchesStart.x)return void(a.image.isTouched=!1);if(!y.isHorizontal()&&Math.floor(a.image.minY)===Math.floor(a.image.startY)&&a.image.touchesCurrent.ya.image.touchesStart.y)return void(a.image.isTouched=!1)}e.preventDefault(),e.stopPropagation(),a.image.isMoved=!0,a.image.currentX=a.image.touchesCurrent.x-a.image.touchesStart.x+a.image.startX,a.image.currentY=a.image.touchesCurrent.y-a.image.touchesStart.y+a.image.startY,a.image.currentXa.image.maxX&&(a.image.currentX=a.image.maxX-1+Math.pow(a.image.currentX-a.image.maxX+1,.8)),a.image.currentYa.image.maxY&&(a.image.currentY=a.image.maxY-1+Math.pow(a.image.currentY-a.image.maxY+1,.8)),a.velocity.prevPositionX||(a.velocity.prevPositionX=a.image.touchesCurrent.x),a.velocity.prevPositionY||(a.velocity.prevPositionY=a.image.touchesCurrent.y),a.velocity.prevTime||(a.velocity.prevTime=Date.now()),a.velocity.x=(a.image.touchesCurrent.x-a.velocity.prevPositionX)/(Date.now()-a.velocity.prevTime)/2,a.velocity.y=(a.image.touchesCurrent.y-a.velocity.prevPositionY)/(Date.now()-a.velocity.prevTime)/2,Math.abs(a.image.touchesCurrent.x-a.velocity.prevPositionX)<2&&(a.velocity.x=0),Math.abs(a.image.touchesCurrent.y-a.velocity.prevPositionY)<2&&(a.velocity.y=0),a.velocity.prevPositionX=a.image.touchesCurrent.x,a.velocity.prevPositionY=a.image.touchesCurrent.y,a.velocity.prevTime=Date.now(),a.gesture.imageWrap.transform("translate3d("+a.image.currentX+"px, "+a.image.currentY+"px,0)")}}},onTouchEnd:function(e,a){var t=e.zoom;if(t.gesture.image&&0!==t.gesture.image.length){if(!t.image.isTouched||!t.image.isMoved)return t.image.isTouched=!1,void(t.image.isMoved=!1);t.image.isTouched=!1,t.image.isMoved=!1;var s=300,r=300,i=t.velocity.x*s,n=t.image.currentX+i,o=t.velocity.y*r,l=t.image.currentY+o;0!==t.velocity.x&&(s=Math.abs((n-t.image.currentX)/t.velocity.x)),0!==t.velocity.y&&(r=Math.abs((l-t.image.currentY)/t.velocity.y));var p=Math.max(s,r);t.image.currentX=n,t.image.currentY=l;var d=t.image.width*t.scale,m=t.image.height*t.scale;t.image.minX=Math.min(t.gesture.slideWidth/2-d/2,0),t.image.maxX=-t.image.minX,t.image.minY=Math.min(t.gesture.slideHeight/2-m/2,0),t.image.maxY=-t.image.minY,t.image.currentX=Math.max(Math.min(t.image.currentX,t.image.maxX),t.image.minX),t.image.currentY=Math.max(Math.min(t.image.currentY,t.image.maxY),t.image.minY),t.gesture.imageWrap.transition(p).transform("translate3d("+t.image.currentX+"px, "+t.image.currentY+"px,0)")}},onTransitionEnd:function(e){var a=e.zoom;a.gesture.slide&&e.previousIndex!==e.activeIndex&&(a.gesture.image.transform("translate3d(0,0,0) scale(1)"),a.gesture.imageWrap.transform("translate3d(0,0,0)"),a.gesture.slide=a.gesture.image=a.gesture.imageWrap=void 0,a.scale=a.currentScale=1)},toggleZoom:function(a,t){var s=a.zoom;if(s.gesture.slide||(s.gesture.slide=a.clickedSlide?e(a.clickedSlide):a.slides.eq(a.activeIndex),s.gesture.image=s.gesture.slide.find("img, svg, canvas"),s.gesture.imageWrap=s.gesture.image.parent("."+a.params.zoomContainerClass)),s.gesture.image&&0!==s.gesture.image.length){var r,i,n,o,l,p,d,m,u,c,g,h,v,f,w,x,y,T;void 0===s.image.touchesStart.x&&t?(r="touchend"===t.type?t.changedTouches[0].pageX:t.pageX,i="touchend"===t.type?t.changedTouches[0].pageY:t.pageY):(r=s.image.touchesStart.x,i=s.image.touchesStart.y),s.scale&&1!==s.scale?(s.scale=s.currentScale=1,s.gesture.imageWrap.transition(300).transform("translate3d(0,0,0)"),s.gesture.image.transition(300).transform("translate3d(0,0,0) scale(1)"),s.gesture.slide=void 0):(s.scale=s.currentScale=s.gesture.imageWrap.attr("data-swiper-zoom")||a.params.zoomMax,t?(y=s.gesture.slide[0].offsetWidth,T=s.gesture.slide[0].offsetHeight,n=s.gesture.slide.offset().left,o=s.gesture.slide.offset().top,l=n+y/2-r,p=o+T/2-i,u=s.gesture.image[0].offsetWidth,c=s.gesture.image[0].offsetHeight,g=u*s.scale,h=c*s.scale,v=Math.min(y/2-g/2,0),f=Math.min(T/2-h/2,0),w=-v,x=-f,d=l*s.scale,m=p*s.scale,dw&&(d=w),mx&&(m=x)):(d=0,m=0),s.gesture.imageWrap.transition(300).transform("translate3d("+d+"px, "+m+"px,0)"),s.gesture.image.transition(300).transform("translate3d(0,0,0) scale("+s.scale+")"))}},attachEvents:function(a){var t=a?"off":"on";if(y.params.zoom){var s=(y.slides,!("touchstart"!==y.touchEvents.start||!y.support.passiveListener||!y.params.passiveListeners)&&{passive:!0,capture:!1});y.support.gestures?(y.slides[t]("gesturestart",y.zoom.onGestureStart,s),y.slides[t]("gesturechange",y.zoom.onGestureChange,s),y.slides[t]("gestureend",y.zoom.onGestureEnd,s)):"touchstart"===y.touchEvents.start&&(y.slides[t](y.touchEvents.start,y.zoom.onGestureStart,s),y.slides[t](y.touchEvents.move,y.zoom.onGestureChange,s),y.slides[t](y.touchEvents.end,y.zoom.onGestureEnd,s)),y[t]("touchStart",y.zoom.onTouchStart),y.slides.each(function(a,s){e(s).find("."+y.params.zoomContainerClass).length>0&&e(s)[t](y.touchEvents.move,y.zoom.onTouchMove)}),y[t]("touchEnd",y.zoom.onTouchEnd),y[t]("transitionEnd",y.zoom.onTransitionEnd),y.params.zoomToggle&&y.on("doubleTap",y.zoom.toggleZoom)}},init:function(){y.zoom.attachEvents()},destroy:function(){y.zoom.attachEvents(!0)}},y._plugins=[];for(var Y in y.plugins){var A=y.plugins[Y](y,y.params[Y]);A&&y._plugins.push(A)}return y.callPlugins=function(e){for(var a=0;a'),notify:function(e){var a=y.a11y.liveRegion;0!==a.length&&(a.html(""),a.html(e))},init:function(){y.params.nextButton&&y.nextButton&&y.nextButton.length>0&&(y.a11y.makeFocusable(y.nextButton),y.a11y.addRole(y.nextButton,"button"),y.a11y.addLabel(y.nextButton,y.params.nextSlideMessage)),y.params.prevButton&&y.prevButton&&y.prevButton.length>0&&(y.a11y.makeFocusable(y.prevButton),y.a11y.addRole(y.prevButton,"button"),y.a11y.addLabel(y.prevButton,y.params.prevSlideMessage)),e(y.container).append(y.a11y.liveRegion)},initPagination:function(){y.params.pagination&&y.params.paginationClickable&&y.bullets&&y.bullets.length&&y.bullets.each(function(){var a=e(this);y.a11y.makeFocusable(a),y.a11y.addRole(a,"button"),y.a11y.addLabel(a,y.params.paginationBulletMessage.replace(/{{index}}/,a.index()+1))})},destroy:function(){y.a11y.liveRegion&&y.a11y.liveRegion.length>0&&y.a11y.liveRegion.remove()}},y.init=function(){y.params.loop&&y.createLoop(),y.updateContainerSize(),y.updateSlidesSize(),y.updatePagination(),y.params.scrollbar&&y.scrollbar&&(y.scrollbar.set(),y.params.scrollbarDraggable&&y.scrollbar.enableDraggable()),"slide"!==y.params.effect&&y.effects[y.params.effect]&&(y.params.loop||y.updateProgress(),y.effects[y.params.effect].setTranslate()),y.params.loop?y.slideTo(y.params.initialSlide+y.loopedSlides,0,y.params.runCallbacksOnInit):(y.slideTo(y.params.initialSlide,0,y.params.runCallbacksOnInit),0===y.params.initialSlide&&(y.parallax&&y.params.parallax&&y.parallax.setTranslate(),y.lazy&&y.params.lazyLoading&&(y.lazy.load(),y.lazy.initialImageLoaded=!0))),y.attachEvents(),y.params.observer&&y.support.observer&&y.initObservers(),y.params.preloadImages&&!y.params.lazyLoading&&y.preloadImages(),y.params.zoom&&y.zoom&&y.zoom.init(),y.params.autoplay&&y.startAutoplay(),y.params.keyboardControl&&y.enableKeyboardControl&&y.enableKeyboardControl(),y.params.mousewheelControl&&y.enableMousewheelControl&&y.enableMousewheelControl(),y.params.hashnavReplaceState&&(y.params.replaceState=y.params.hashnavReplaceState),y.params.history&&y.history&&y.history.init(),y.params.hashnav&&y.hashnav&&y.hashnav.init(),y.params.a11y&&y.a11y&&y.a11y.init(),y.emit("onInit",y)},y.cleanupStyles=function(){y.container.removeClass(y.classNames.join(" ")).removeAttr("style"),y.wrapper.removeAttr("style"),y.slides&&y.slides.length&&y.slides.removeClass([y.params.slideVisibleClass,y.params.slideActiveClass,y.params.slideNextClass,y.params.slidePrevClass].join(" ")).removeAttr("style").removeAttr("data-swiper-column").removeAttr("data-swiper-row"),y.paginationContainer&&y.paginationContainer.length&&y.paginationContainer.removeClass(y.params.paginationHiddenClass),y.bullets&&y.bullets.length&&y.bullets.removeClass(y.params.bulletActiveClass),y.params.prevButton&&e(y.params.prevButton).removeClass(y.params.buttonDisabledClass),y.params.nextButton&&e(y.params.nextButton).removeClass(y.params.buttonDisabledClass),y.params.scrollbar&&y.scrollbar&&(y.scrollbar.track&&y.scrollbar.track.length&&y.scrollbar.track.removeAttr("style"),y.scrollbar.drag&&y.scrollbar.drag.length&&y.scrollbar.drag.removeAttr("style"))},y.destroy=function(e,a){y.detachEvents(),y.stopAutoplay(),y.params.scrollbar&&y.scrollbar&&y.params.scrollbarDraggable&&y.scrollbar.disableDraggable(),y.params.loop&&y.destroyLoop(),a&&y.cleanupStyles(),y.disconnectObservers(),y.params.zoom&&y.zoom&&y.zoom.destroy(),y.params.keyboardControl&&y.disableKeyboardControl&&y.disableKeyboardControl(),y.params.mousewheelControl&&y.disableMousewheelControl&&y.disableMousewheelControl(),y.params.a11y&&y.a11y&&y.a11y.destroy(),y.params.history&&!y.params.replaceState&&window.removeEventListener("popstate",y.history.setHistoryPopState),y.params.hashnav&&y.hashnav&&y.hashnav.destroy(),y.emit("onDestroy"),!1!==e&&(y=null)},y.init(),y}};a.prototype={isSafari:function(){var e=window.navigator.userAgent.toLowerCase();return e.indexOf("safari")>=0&&e.indexOf("chrome")<0&&e.indexOf("android")<0}(),isUiWebView:/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent),isArray:function(e){return"[object Array]"===Object.prototype.toString.apply(e)},browser:{ie:window.navigator.pointerEnabled||window.navigator.msPointerEnabled,ieTouch:window.navigator.msPointerEnabled&&window.navigator.msMaxTouchPoints>1||window.navigator.pointerEnabled&&window.navigator.maxTouchPoints>1,lteIE9:function(){var e=document.createElement("div");return e.innerHTML="\x3c!--[if lte IE 9]> 0?e?this[0].offsetWidth+parseFloat(this.css("margin-right"))+parseFloat(this.css("margin-left")):this[0].offsetWidth:null})),window.Swiper=a}(),"undefined"!=typeof module?module.exports=window.Swiper:"function"==typeof define&&define.amd&&define([],function(){"use strict";return window.Swiper});
+
+
+/**
+ * @module WOW
+ * @author Matthieu Aussaguel
+ * @license MIT
+ * @version 1.1.3
+ */
+(function(){var a,b,c,d,e,f=function(a,b){return function(){return a.apply(b,arguments)}},g=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};b=function(){function a(){}return a.prototype.extend=function(a,b){var c,d;for(c in b)d=b[c],null==a[c]&&(a[c]=d);return a},a.prototype.isMobile=function(a){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(a)},a.prototype.createEvent=function(a,b,c,d){var e;return null==b&&(b=!1),null==c&&(c=!1),null==d&&(d=null),null!=document.createEvent?(e=document.createEvent("CustomEvent"),e.initCustomEvent(a,b,c,d)):null!=document.createEventObject?(e=document.createEventObject(),e.eventType=a):e.eventName=a,e},a.prototype.emitEvent=function(a,b){return null!=a.dispatchEvent?a.dispatchEvent(b):b in(null!=a)?a[b]():"on"+b in(null!=a)?a["on"+b]():void 0},a.prototype.addEvent=function(a,b,c){return null!=a.addEventListener?a.addEventListener(b,c,!1):null!=a.attachEvent?a.attachEvent("on"+b,c):a[b]=c},a.prototype.removeEvent=function(a,b,c){return null!=a.removeEventListener?a.removeEventListener(b,c,!1):null!=a.detachEvent?a.detachEvent("on"+b,c):delete a[b]},a.prototype.innerHeight=function(){return"innerHeight"in window?window.innerHeight:document.documentElement.clientHeight},a}(),c=this.WeakMap||this.MozWeakMap||(c=function(){function a(){this.keys=[],this.values=[]}return a.prototype.get=function(a){var b,c,d,e,f;for(f=this.keys,b=d=0,e=f.length;e>d;b=++d)if(c=f[b],c===a)return this.values[b]},a.prototype.set=function(a,b){var c,d,e,f,g;for(g=this.keys,c=e=0,f=g.length;f>e;c=++e)if(d=g[c],d===a)return void(this.values[c]=b);return this.keys.push(a),this.values.push(b)},a}()),a=this.MutationObserver||this.WebkitMutationObserver||this.MozMutationObserver||(a=function(){function a(){"undefined"!=typeof console&&null!==console&&console.warn("MutationObserver is not supported by your browser."),"undefined"!=typeof console&&null!==console&&console.warn("WOW.js cannot detect dom mutations, please call .sync() after loading new content.")}return a.notSupported=!0,a.prototype.observe=function(){},a}()),d=this.getComputedStyle||function(a,b){return this.getPropertyValue=function(b){var c;return"float"===b&&(b="styleFloat"),e.test(b)&&b.replace(e,function(a,b){return b.toUpperCase()}),(null!=(c=a.currentStyle)?c[b]:void 0)||null},this},e=/(\-([a-z]){1})/g,this.WOW=function(){function e(a){null==a&&(a={}),this.scrollCallback=f(this.scrollCallback,this),this.scrollHandler=f(this.scrollHandler,this),this.resetAnimation=f(this.resetAnimation,this),this.start=f(this.start,this),this.scrolled=!0,this.config=this.util().extend(a,this.defaults),null!=a.scrollContainer&&(this.config.scrollContainer=document.querySelector(a.scrollContainer)),this.animationNameCache=new c,this.wowEvent=this.util().createEvent(this.config.boxClass)}return e.prototype.defaults={boxClass:"wow",animateClass:"animated",offset:0,mobile:!0,live:!0,callback:null,scrollContainer:null},e.prototype.init=function(){var a;return this.element=window.document.documentElement,"interactive"===(a=document.readyState)||"complete"===a?this.start():this.util().addEvent(document,"DOMContentLoaded",this.start),this.finished=[]},e.prototype.start=function(){var b,c,d,e;if(this.stopped=!1,this.boxes=function(){var a,c,d,e;for(d=this.element.querySelectorAll("."+this.config.boxClass),e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(b);return e}.call(this),this.all=function(){var a,c,d,e;for(d=this.boxes,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(b);return e}.call(this),this.boxes.length)if(this.disabled())this.resetStyle();else for(e=this.boxes,c=0,d=e.length;d>c;c++)b=e[c],this.applyStyle(b,!0);return this.disabled()||(this.util().addEvent(this.config.scrollContainer||window,"scroll",this.scrollHandler),this.util().addEvent(window,"resize",this.scrollHandler),this.interval=setInterval(this.scrollCallback,50)),this.config.live?new a(function(a){return function(b){var c,d,e,f,g;for(g=[],c=0,d=b.length;d>c;c++)f=b[c],g.push(function(){var a,b,c,d;for(c=f.addedNodes||[],d=[],a=0,b=c.length;b>a;a++)e=c[a],d.push(this.doSync(e));return d}.call(a));return g}}(this)).observe(document.body,{childList:!0,subtree:!0}):void 0},e.prototype.stop=function(){return this.stopped=!0,this.util().removeEvent(this.config.scrollContainer||window,"scroll",this.scrollHandler),this.util().removeEvent(window,"resize",this.scrollHandler),null!=this.interval?clearInterval(this.interval):void 0},e.prototype.sync=function(b){return a.notSupported?this.doSync(this.element):void 0},e.prototype.doSync=function(a){var b,c,d,e,f;if(null==a&&(a=this.element),1===a.nodeType){for(a=a.parentNode||a,e=a.querySelectorAll("."+this.config.boxClass),f=[],c=0,d=e.length;d>c;c++)b=e[c],g.call(this.all,b)<0?(this.boxes.push(b),this.all.push(b),this.stopped||this.disabled()?this.resetStyle():this.applyStyle(b,!0),f.push(this.scrolled=!0)):f.push(void 0);return f}},e.prototype.show=function(a){return this.applyStyle(a),a.className=a.className+" "+this.config.animateClass,null!=this.config.callback&&this.config.callback(a),this.util().emitEvent(a,this.wowEvent),this.util().addEvent(a,"animationend",this.resetAnimation),this.util().addEvent(a,"oanimationend",this.resetAnimation),this.util().addEvent(a,"webkitAnimationEnd",this.resetAnimation),this.util().addEvent(a,"MSAnimationEnd",this.resetAnimation),a},e.prototype.applyStyle=function(a,b){var c,d,e;return d=a.getAttribute("data-wow-duration"),c=a.getAttribute("data-wow-delay"),e=a.getAttribute("data-wow-iteration"),this.animate(function(f){return function(){return f.customStyle(a,b,d,c,e)}}(this))},e.prototype.animate=function(){return"requestAnimationFrame"in window?function(a){return window.requestAnimationFrame(a)}:function(a){return a()}}(),e.prototype.resetStyle=function(){var a,b,c,d,e;for(d=this.boxes,e=[],b=0,c=d.length;c>b;b++)a=d[b],e.push(a.style.visibility="visible");return e},e.prototype.resetAnimation=function(a){var b;return a.type.toLowerCase().indexOf("animationend")>=0?(b=a.target||a.srcElement,b.className=b.className.replace(this.config.animateClass,"").trim()):void 0},e.prototype.customStyle=function(a,b,c,d,e){return b&&this.cacheAnimationName(a),a.style.visibility=b?"hidden":"visible",c&&this.vendorSet(a.style,{animationDuration:c}),d&&this.vendorSet(a.style,{animationDelay:d}),e&&this.vendorSet(a.style,{animationIterationCount:e}),this.vendorSet(a.style,{animationName:b?"none":this.cachedAnimationName(a)}),a},e.prototype.vendors=["moz","webkit"],e.prototype.vendorSet=function(a,b){var c,d,e,f;d=[];for(c in b)e=b[c],a[""+c]=e,d.push(function(){var b,d,g,h;for(g=this.vendors,h=[],b=0,d=g.length;d>b;b++)f=g[b],h.push(a[""+f+c.charAt(0).toUpperCase()+c.substr(1)]=e);return h}.call(this));return d},e.prototype.vendorCSS=function(a,b){var c,e,f,g,h,i;for(h=d(a),g=h.getPropertyCSSValue(b),f=this.vendors,c=0,e=f.length;e>c;c++)i=f[c],g=g||h.getPropertyCSSValue("-"+i+"-"+b);return g},e.prototype.animationName=function(a){var b;try{b=this.vendorCSS(a,"animation-name").cssText}catch(c){b=d(a).getPropertyValue("animation-name")}return"none"===b?"":b},e.prototype.cacheAnimationName=function(a){return this.animationNameCache.set(a,this.animationName(a))},e.prototype.cachedAnimationName=function(a){return this.animationNameCache.get(a)},e.prototype.scrollHandler=function(){return this.scrolled=!0},e.prototype.scrollCallback=function(){var a;return!this.scrolled||(this.scrolled=!1,this.boxes=function(){var b,c,d,e;for(d=this.boxes,e=[],b=0,c=d.length;c>b;b++)a=d[b],a&&(this.isVisible(a)?this.show(a):e.push(a));return e}.call(this),this.boxes.length||this.config.live)?void 0:this.stop()},e.prototype.offsetTop=function(a){for(var b;void 0===a.offsetTop;)a=a.parentNode;for(b=a.offsetTop;a=a.offsetParent;)b+=a.offsetTop;return b},e.prototype.isVisible=function(a){var b,c,d,e,f;return c=a.getAttribute("data-wow-offset")||this.config.offset,f=this.config.scrollContainer&&this.config.scrollContainer.scrollTop||window.pageYOffset,e=f+Math.min(this.element.clientHeight,this.util().innerHeight())-c,d=this.offsetTop(a),b=d+a.clientHeight,e>=d&&b>=f},e.prototype.util=function(){return null!=this._util?this._util:this._util=new b},e.prototype.disabled=function(){return!this.config.mobile&&this.util().isMobile(navigator.userAgent)},e}()}).call(this);
+
+
+/**
+ * @module Owl carousel
+ * @version 2.2.1
+ * @author Bartosz Wojciechowski
+ * @license MIT
+ */
+!function(a,b,c,d){function e(b,c){this.settings=null,this.options=a.extend({},e.Defaults,c),this.$element=a(b),this._handlers={},this._plugins={},this._supress={},this._current=null,this._speed=null,this._coordinates=[],this._breakpoint=null,this._width=null,this._items=[],this._clones=[],this._mergers=[],this._widths=[],this._invalidated={},this._pipe=[],this._drag={time:null,target:null,pointer:null,stage:{start:null,current:null},direction:null},this._states={current:{},tags:{initializing:["busy"],animating:["busy"],dragging:["interacting"]}},a.each(["onResize","onThrottledResize"],a.proxy(function(b,c){this._handlers[c]=a.proxy(this[c],this)},this)),a.each(e.Plugins,a.proxy(function(a,b){this._plugins[a.charAt(0).toLowerCase()+a.slice(1)]=new b(this)},this)),a.each(e.Workers,a.proxy(function(b,c){this._pipe.push({filter:c.filter,run:a.proxy(c.run,this)})},this)),this.setup(),this.initialize()}e.Defaults={items:3,loop:!1,center:!1,rewind:!1,mouseDrag:!0,touchDrag:!0,pullDrag:!0,freeDrag:!1,margin:0,stagePadding:0,merge:!1,mergeFit:!0,autoWidth:!1,startPosition:0,rtl:!1,smartSpeed:250,fluidSpeed:!1,dragEndSpeed:!1,responsive:{},responsiveRefreshRate:200,responsiveBaseElement:b,fallbackEasing:"swing",info:!1,nestedItemSelector:!1,itemElement:"div",stageElement:"div",refreshClass:"owl-refresh",loadedClass:"owl-loaded",loadingClass:"owl-loading",rtlClass:"owl-rtl",responsiveClass:"owl-responsive",dragClass:"owl-drag",itemClass:"owl-item",stageClass:"owl-stage",stageOuterClass:"owl-stage-outer",grabClass:"owl-grab"},e.Width={Default:"default",Inner:"inner",Outer:"outer"},e.Type={Event:"event",State:"state"},e.Plugins={},e.Workers=[{filter:["width","settings"],run:function(){this._width=this.$element.width()}},{filter:["width","items","settings"],run:function(a){a.current=this._items&&this._items[this.relative(this._current)]}},{filter:["items","settings"],run:function(){this.$stage.children(".cloned").remove()}},{filter:["width","items","settings"],run:function(a){var b=this.settings.margin||"",c=!this.settings.autoWidth,d=this.settings.rtl,e={width:"auto","margin-left":d?b:"","margin-right":d?"":b};!c&&this.$stage.children().css(e),a.css=e}},{filter:["width","items","settings"],run:function(a){var b=(this.width()/this.settings.items).toFixed(3)-this.settings.margin,c=null,d=this._items.length,e=!this.settings.autoWidth,f=[];for(a.items={merge:!1,width:b};d--;)c=this._mergers[d],c=this.settings.mergeFit&&Math.min(c,this.settings.items)||c,a.items.merge=c>1||a.items.merge,f[d]=e?b*c:this._items[d].width();this._widths=f}},{filter:["items","settings"],run:function(){var b=[],c=this._items,d=this.settings,e=Math.max(2*d.items,4),f=2*Math.ceil(c.length/2),g=d.loop&&c.length?d.rewind?e:Math.max(e,f):0,h="",i="";for(g/=2;g--;)b.push(this.normalize(b.length/2,!0)),h+=c[b[b.length-1]][0].outerHTML,b.push(this.normalize(c.length-1-(b.length-1)/2,!0)),i=c[b[b.length-1]][0].outerHTML+i;this._clones=b,a(h).addClass("cloned").appendTo(this.$stage),a(i).addClass("cloned").prependTo(this.$stage)}},{filter:["width","items","settings"],run:function(){for(var a=this.settings.rtl?1:-1,b=this._clones.length+this._items.length,c=-1,d=0,e=0,f=[];++c",h)||this.op(b,"<",g)&&this.op(b,">",h))&&i.push(c);this.$stage.children(".active").removeClass("active"),this.$stage.children(":eq("+i.join("), :eq(")+")").addClass("active"),this.settings.center&&(this.$stage.children(".center").removeClass("center"),this.$stage.children().eq(this.current()).addClass("center"))}}],e.prototype.initialize=function(){if(this.enter("initializing"),this.trigger("initialize"),this.$element.toggleClass(this.settings.rtlClass,this.settings.rtl),this.settings.autoWidth&&!this.is("pre-loading")){var b,c,e;b=this.$element.find("img"),c=this.settings.nestedItemSelector?"."+this.settings.nestedItemSelector:d,e=this.$element.children(c).width(),b.length&&e<=0&&this.preloadAutoWidthImages(b)}this.$element.addClass(this.options.loadingClass),this.$stage=a("<"+this.settings.stageElement+' class="'+this.settings.stageClass+'"/>').wrap('
'),this.$element.append(this.$stage.parent()),this.replace(this.$element.children().not(this.$stage.parent())),this.$element.is(":visible")?this.refresh():this.invalidate("width"),this.$element.removeClass(this.options.loadingClass).addClass(this.options.loadedClass),this.registerEventHandlers(),this.leave("initializing"),this.trigger("initialized")},e.prototype.setup=function(){var b=this.viewport(),c=this.options.responsive,d=-1,e=null;c?(a.each(c,function(a){a<=b&&a>d&&(d=Number(a))}),e=a.extend({},this.options,c[d]),"function"==typeof e.stagePadding&&(e.stagePadding=e.stagePadding()),delete e.responsive,e.responsiveClass&&this.$element.attr("class",this.$element.attr("class").replace(new RegExp("("+this.options.responsiveClass+"-)\\S+\\s","g"),"$1"+d))):e=a.extend({},this.options),this.trigger("change",{property:{name:"settings",value:e}}),this._breakpoint=d,this.settings=e,this.invalidate("settings"),this.trigger("changed",{property:{name:"settings",value:this.settings}})},e.prototype.optionsLogic=function(){this.settings.autoWidth&&(this.settings.stagePadding=!1,this.settings.merge=!1)},e.prototype.prepare=function(b){var c=this.trigger("prepare",{content:b});return c.data||(c.data=a("<"+this.settings.itemElement+"/>").addClass(this.options.itemClass).append(b)),this.trigger("prepared",{content:c.data}),c.data},e.prototype.update=function(){for(var b=0,c=this._pipe.length,d=a.proxy(function(a){return this[a]},this._invalidated),e={};b0)&&this._pipe[b].run(e),b++;this._invalidated={},!this.is("valid")&&this.enter("valid")},e.prototype.width=function(a){switch(a=a||e.Width.Default){case e.Width.Inner:case e.Width.Outer:return this._width;default:return this._width-2*this.settings.stagePadding+this.settings.margin}},e.prototype.refresh=function(){this.enter("refreshing"),this.trigger("refresh"),this.setup(),this.optionsLogic(),this.$element.addClass(this.options.refreshClass),this.update(),this.$element.removeClass(this.options.refreshClass),this.leave("refreshing"),this.trigger("refreshed")},e.prototype.onThrottledResize=function(){b.clearTimeout(this.resizeTimer),this.resizeTimer=b.setTimeout(this._handlers.onResize,this.settings.responsiveRefreshRate)},e.prototype.onResize=function(){return!!this._items.length&&(this._width!==this.$element.width()&&(!!this.$element.is(":visible")&&(this.enter("resizing"),this.trigger("resize").isDefaultPrevented()?(this.leave("resizing"),!1):(this.invalidate("width"),this.refresh(),this.leave("resizing"),void this.trigger("resized")))))},e.prototype.registerEventHandlers=function(){a.support.transition&&this.$stage.on(a.support.transition.end+".owl.core",a.proxy(this.onTransitionEnd,this)),this.settings.responsive!==!1&&this.on(b,"resize",this._handlers.onThrottledResize),this.settings.mouseDrag&&(this.$element.addClass(this.options.dragClass),this.$stage.on("mousedown.owl.core",a.proxy(this.onDragStart,this)),this.$stage.on("dragstart.owl.core selectstart.owl.core",function(){return!1})),this.settings.touchDrag&&(this.$stage.on("touchstart.owl.core",a.proxy(this.onDragStart,this)),this.$stage.on("touchcancel.owl.core",a.proxy(this.onDragEnd,this)))},e.prototype.onDragStart=function(b){var d=null;3!==b.which&&(a.support.transform?(d=this.$stage.css("transform").replace(/.*\(|\)| /g,"").split(","),d={x:d[16===d.length?12:4],y:d[16===d.length?13:5]}):(d=this.$stage.position(),d={x:this.settings.rtl?d.left+this.$stage.width()-this.width()+this.settings.margin:d.left,y:d.top}),this.is("animating")&&(a.support.transform?this.animate(d.x):this.$stage.stop(),this.invalidate("position")),this.$element.toggleClass(this.options.grabClass,"mousedown"===b.type),this.speed(0),this._drag.time=(new Date).getTime(),this._drag.target=a(b.target),this._drag.stage.start=d,this._drag.stage.current=d,this._drag.pointer=this.pointer(b),a(c).on("mouseup.owl.core touchend.owl.core",a.proxy(this.onDragEnd,this)),a(c).one("mousemove.owl.core touchmove.owl.core",a.proxy(function(b){var d=this.difference(this._drag.pointer,this.pointer(b));a(c).on("mousemove.owl.core touchmove.owl.core",a.proxy(this.onDragMove,this)),Math.abs(d.x)0^this.settings.rtl?"left":"right";a(c).off(".owl.core"),this.$element.removeClass(this.options.grabClass),(0!==d.x&&this.is("dragging")||!this.is("valid"))&&(this.speed(this.settings.dragEndSpeed||this.settings.smartSpeed),this.current(this.closest(e.x,0!==d.x?f:this._drag.direction)),this.invalidate("position"),this.update(),this._drag.direction=f,(Math.abs(d.x)>3||(new Date).getTime()-this._drag.time>300)&&this._drag.target.one("click.owl.core",function(){return!1})),this.is("dragging")&&(this.leave("dragging"),this.trigger("dragged"))},e.prototype.closest=function(b,c){var d=-1,e=30,f=this.width(),g=this.coordinates();return this.settings.freeDrag||a.each(g,a.proxy(function(a,h){return"left"===c&&b>h-e&&bh-f-e&&b",g[a+1]||h-f)&&(d="left"===c?a+1:a),d===-1},this)),this.settings.loop||(this.op(b,">",g[this.minimum()])?d=b=this.minimum():this.op(b,"<",g[this.maximum()])&&(d=b=this.maximum())),d},e.prototype.animate=function(b){var c=this.speed()>0;this.is("animating")&&this.onTransitionEnd(),c&&(this.enter("animating"),this.trigger("translate")),a.support.transform3d&&a.support.transition?this.$stage.css({transform:"translate3d("+b+"px,0px,0px)",transition:this.speed()/1e3+"s"}):c?this.$stage.animate({left:b+"px"},this.speed(),this.settings.fallbackEasing,a.proxy(this.onTransitionEnd,this)):this.$stage.css({left:b+"px"})},e.prototype.is=function(a){return this._states.current[a]&&this._states.current[a]>0},e.prototype.current=function(a){if(a===d)return this._current;if(0===this._items.length)return d;if(a=this.normalize(a),this._current!==a){var b=this.trigger("change",{property:{name:"position",value:a}});b.data!==d&&(a=this.normalize(b.data)),this._current=a,this.invalidate("position"),this.trigger("changed",{property:{name:"position",value:this._current}})}return this._current},e.prototype.invalidate=function(b){return"string"===a.type(b)&&(this._invalidated[b]=!0,this.is("valid")&&this.leave("valid")),a.map(this._invalidated,function(a,b){return b})},e.prototype.reset=function(a){a=this.normalize(a),a!==d&&(this._speed=0,this._current=a,this.suppress(["translate","translated"]),this.animate(this.coordinates(a)),this.release(["translate","translated"]))},e.prototype.normalize=function(a,b){var c=this._items.length,e=b?0:this._clones.length;return!this.isNumeric(a)||c<1?a=d:(a<0||a>=c+e)&&(a=((a-e/2)%c+c)%c+e/2),a},e.prototype.relative=function(a){return a-=this._clones.length/2,this.normalize(a,!0)},e.prototype.maximum=function(a){var b,c,d,e=this.settings,f=this._coordinates.length;if(e.loop)f=this._clones.length/2+this._items.length-1;else if(e.autoWidth||e.merge){for(b=this._items.length,c=this._items[--b].width(),d=this.$element.width();b--&&(c+=this._items[b].width()+this.settings.margin,!(c>d)););f=b+1}else f=e.center?this._items.length-1:this._items.length-e.items;return a&&(f-=this._clones.length/2),Math.max(f,0)},e.prototype.minimum=function(a){return a?0:this._clones.length/2},e.prototype.items=function(a){return a===d?this._items.slice():(a=this.normalize(a,!0),this._items[a])},e.prototype.mergers=function(a){return a===d?this._mergers.slice():(a=this.normalize(a,!0),this._mergers[a])},e.prototype.clones=function(b){var c=this._clones.length/2,e=c+this._items.length,f=function(a){return a%2===0?e+a/2:c-(a+1)/2};return b===d?a.map(this._clones,function(a,b){return f(b)}):a.map(this._clones,function(a,c){return a===b?f(c):null})},e.prototype.speed=function(a){return a!==d&&(this._speed=a),this._speed},e.prototype.coordinates=function(b){var c,e=1,f=b-1;return b===d?a.map(this._coordinates,a.proxy(function(a,b){return this.coordinates(b)},this)):(this.settings.center?(this.settings.rtl&&(e=-1,f=b+1),c=this._coordinates[b],c+=(this.width()-c+(this._coordinates[f]||0))/2*e):c=this._coordinates[f]||0,c=Math.ceil(c))},e.prototype.duration=function(a,b,c){return 0===c?0:Math.min(Math.max(Math.abs(b-a),1),6)*Math.abs(c||this.settings.smartSpeed)},e.prototype.to=function(a,b){var c=this.current(),d=null,e=a-this.relative(c),f=(e>0)-(e<0),g=this._items.length,h=this.minimum(),i=this.maximum();this.settings.loop?(!this.settings.rewind&&Math.abs(e)>g/2&&(e+=f*-1*g),a=c+e,d=((a-h)%g+g)%g+h,d!==a&&d-e<=i&&d-e>0&&(c=d-e,a=d,this.reset(c))):this.settings.rewind?(i+=1,a=(a%i+i)%i):a=Math.max(h,Math.min(i,a)),this.speed(this.duration(c,a,b)),this.current(a),this.$element.is(":visible")&&this.update()},e.prototype.next=function(a){a=a||!1,this.to(this.relative(this.current())+1,a)},e.prototype.prev=function(a){a=a||!1,this.to(this.relative(this.current())-1,a)},e.prototype.onTransitionEnd=function(a){if(a!==d&&(a.stopPropagation(),(a.target||a.srcElement||a.originalTarget)!==this.$stage.get(0)))return!1;this.leave("animating"),this.trigger("translated")},e.prototype.viewport=function(){var d;return this.options.responsiveBaseElement!==b?d=a(this.options.responsiveBaseElement).width():b.innerWidth?d=b.innerWidth:c.documentElement&&c.documentElement.clientWidth?d=c.documentElement.clientWidth:console.warn("Can not detect viewport width."),d},e.prototype.replace=function(b){this.$stage.empty(),this._items=[],b&&(b=b instanceof jQuery?b:a(b)),this.settings.nestedItemSelector&&(b=b.find("."+this.settings.nestedItemSelector)),b.filter(function(){return 1===this.nodeType}).each(a.proxy(function(a,b){b=this.prepare(b),this.$stage.append(b),this._items.push(b),this._mergers.push(1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)},this)),this.reset(this.isNumeric(this.settings.startPosition)?this.settings.startPosition:0),this.invalidate("items")},e.prototype.add=function(b,c){var e=this.relative(this._current);c=c===d?this._items.length:this.normalize(c,!0),b=b instanceof jQuery?b:a(b),this.trigger("add",{content:b,position:c}),b=this.prepare(b),0===this._items.length||c===this._items.length?(0===this._items.length&&this.$stage.append(b),0!==this._items.length&&this._items[c-1].after(b),this._items.push(b),this._mergers.push(1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)):(this._items[c].before(b),this._items.splice(c,0,b),this._mergers.splice(c,0,1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)),this._items[e]&&this.reset(this._items[e].index()),this.invalidate("items"),this.trigger("added",{content:b,position:c})},e.prototype.remove=function(a){a=this.normalize(a,!0),a!==d&&(this.trigger("remove",{content:this._items[a],position:a}),this._items[a].remove(),this._items.splice(a,1),this._mergers.splice(a,1),this.invalidate("items"),this.trigger("removed",{content:null,position:a}))},e.prototype.preloadAutoWidthImages=function(b){b.each(a.proxy(function(b,c){this.enter("pre-loading"),c=a(c),a(new Image).one("load",a.proxy(function(a){c.attr("src",a.target.src),c.css("opacity",1),this.leave("pre-loading"),!this.is("pre-loading")&&!this.is("initializing")&&this.refresh()},this)).attr("src",c.attr("src")||c.attr("data-src")||c.attr("data-src-retina"))},this))},e.prototype.destroy=function(){this.$element.off(".owl.core"),this.$stage.off(".owl.core"),a(c).off(".owl.core"),this.settings.responsive!==!1&&(b.clearTimeout(this.resizeTimer),this.off(b,"resize",this._handlers.onThrottledResize));for(var d in this._plugins)this._plugins[d].destroy();this.$stage.children(".cloned").remove(),this.$stage.unwrap(),this.$stage.children().contents().unwrap(),this.$stage.children().unwrap(),this.$element.removeClass(this.options.refreshClass).removeClass(this.options.loadingClass).removeClass(this.options.loadedClass).removeClass(this.options.rtlClass).removeClass(this.options.dragClass).removeClass(this.options.grabClass).attr("class",this.$element.attr("class").replace(new RegExp(this.options.responsiveClass+"-\\S+\\s","g"),"")).removeData("owl.carousel")},e.prototype.op=function(a,b,c){var d=this.settings.rtl;switch(b){case"<":return d?a>c:a":return d?ac;case">=":return d?a<=c:a>=c;case"<=":return d?a>=c:a<=c}},e.prototype.on=function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,d):a.attachEvent&&a.attachEvent("on"+b,c)},e.prototype.off=function(a,b,c,d){a.removeEventListener?a.removeEventListener(b,c,d):a.detachEvent&&a.detachEvent("on"+b,c)},e.prototype.trigger=function(b,c,d,f,g){var h={item:{count:this._items.length,index:this.current()}},i=a.camelCase(a.grep(["on",b,d],function(a){return a}).join("-").toLowerCase()),j=a.Event([b,"owl",d||"carousel"].join(".").toLowerCase(),a.extend({relatedTarget:this},h,c));return this._supress[b]||(a.each(this._plugins,function(a,b){b.onTrigger&&b.onTrigger(j)}),this.register({type:e.Type.Event,name:b}),this.$element.trigger(j),this.settings&&"function"==typeof this.settings[i]&&this.settings[i].call(this,j)),j},e.prototype.enter=function(b){a.each([b].concat(this._states.tags[b]||[]),a.proxy(function(a,b){this._states.current[b]===d&&(this._states.current[b]=0),this._states.current[b]++},this))},e.prototype.leave=function(b){a.each([b].concat(this._states.tags[b]||[]),a.proxy(function(a,b){this._states.current[b]--},this))},e.prototype.register=function(b){if(b.type===e.Type.Event){if(a.event.special[b.name]||(a.event.special[b.name]={}),!a.event.special[b.name].owl){var c=a.event.special[b.name]._default;a.event.special[b.name]._default=function(a){return!c||!c.apply||a.namespace&&a.namespace.indexOf("owl")!==-1?a.namespace&&a.namespace.indexOf("owl")>-1:c.apply(this,arguments)},a.event.special[b.name].owl=!0}}else b.type===e.Type.State&&(this._states.tags[b.name]?this._states.tags[b.name]=this._states.tags[b.name].concat(b.tags):this._states.tags[b.name]=b.tags,this._states.tags[b.name]=a.grep(this._states.tags[b.name],a.proxy(function(c,d){return a.inArray(c,this._states.tags[b.name])===d},this)))},e.prototype.suppress=function(b){a.each(b,a.proxy(function(a,b){this._supress[b]=!0},this))},e.prototype.release=function(b){a.each(b,a.proxy(function(a,b){delete this._supress[b]},this))},e.prototype.pointer=function(a){var c={x:null,y:null};return a=a.originalEvent||a||b.event,a=a.touches&&a.touches.length?a.touches[0]:a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:a,a.pageX?(c.x=a.pageX,c.y=a.pageY):(c.x=a.clientX,c.y=a.clientY),c},e.prototype.isNumeric=function(a){return!isNaN(parseFloat(a))},e.prototype.difference=function(a,b){return{x:a.x-b.x,y:a.y-b.y}},a.fn.owlCarousel=function(b){var c=Array.prototype.slice.call(arguments,1);return this.each(function(){var d=a(this),f=d.data("owl.carousel");f||(f=new e(this,"object"==typeof b&&b),d.data("owl.carousel",f),a.each(["next","prev","to","destroy","refresh","replace","add","remove"],function(b,c){f.register({type:e.Type.Event,name:c}),f.$element.on(c+".owl.carousel.core",a.proxy(function(a){a.namespace&&a.relatedTarget!==this&&(this.suppress([c]),f[c].apply(this,[].slice.call(arguments,1)),this.release([c]))},f))})),"string"==typeof b&&"_"!==b.charAt(0)&&f[b].apply(f,c)})},a.fn.owlCarousel.Constructor=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._interval=null,this._visible=null,this._handlers={"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoRefresh&&this.watch()},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)};e.Defaults={autoRefresh:!0,autoRefreshInterval:500},e.prototype.watch=function(){this._interval||(this._visible=this._core.$element.is(":visible"),this._interval=b.setInterval(a.proxy(this.refresh,this),this._core.settings.autoRefreshInterval))},e.prototype.refresh=function(){this._core.$element.is(":visible")!==this._visible&&(this._visible=!this._visible,this._core.$element.toggleClass("owl-hidden",!this._visible),this._visible&&this._core.invalidate("width")&&this._core.refresh())},e.prototype.destroy=function(){var a,c;b.clearInterval(this._interval);for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},a.fn.owlCarousel.Constructor.Plugins.AutoRefresh=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._loaded=[],this._handlers={"initialized.owl.carousel change.owl.carousel resized.owl.carousel":a.proxy(function(b){if(b.namespace&&this._core.settings&&this._core.settings.lazyLoad&&(b.property&&"position"==b.property.name||"initialized"==b.type))for(var c=this._core.settings,e=c.center&&Math.ceil(c.items/2)||c.items,f=c.center&&e*-1||0,g=(b.property&&b.property.value!==d?b.property.value:this._core.current())+f,h=this._core.clones().length,i=a.proxy(function(a,b){this.load(b)},this);f++-1||(e.each(a.proxy(function(c,d){var e,f=a(d),g=b.devicePixelRatio>1&&f.attr("data-src-retina")||f.attr("data-src");this._core.trigger("load",{element:f,url:g},"lazy"),f.is("img")?f.one("load.owl.lazy",a.proxy(function(){f.css("opacity",1),this._core.trigger("loaded",{element:f,url:g},"lazy")},this)).attr("src",g):(e=new Image,e.onload=a.proxy(function(){f.css({"background-image":'url("'+g+'")',opacity:"1"}),this._core.trigger("loaded",{element:f,url:g},"lazy")},this),e.src=g)},this)),this._loaded.push(d.get(0)))},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this._core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Lazy=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._handlers={"initialized.owl.carousel refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&this.update()},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&"position"==a.property.name&&this.update()},this),"loaded.owl.lazy":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&a.element.closest("."+this._core.settings.itemClass).index()===this._core.current()&&this.update()},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)};e.Defaults={autoHeight:!1,autoHeightClass:"owl-height"},e.prototype.update=function(){var b=this._core._current,c=b+this._core.settings.items,d=this._core.$stage.children().toArray().slice(b,c),e=[],f=0;a.each(d,function(b,c){e.push(a(c).height())}),f=Math.max.apply(null,e),this._core.$stage.parent().height(f).addClass(this._core.settings.autoHeightClass)},e.prototype.destroy=function(){var a,b;for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.AutoHeight=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._videos={},this._playing=null,this._handlers={"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.register({type:"state",name:"playing",tags:["interacting"]})},this),"resize.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.video&&this.isInFullScreen()&&a.preventDefault()},this),"refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.is("resizing")&&this._core.$stage.find(".cloned .owl-video-frame").remove()},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&"position"===a.property.name&&this._playing&&this.stop()},this),"prepared.owl.carousel":a.proxy(function(b){if(b.namespace){var c=a(b.content).find(".owl-video");c.length&&(c.css("display","none"),this.fetch(c,a(b.content)))}},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers),this._core.$element.on("click.owl.video",".owl-video-play-icon",a.proxy(function(a){this.play(a)},this))};e.Defaults={video:!1,videoHeight:!1,videoWidth:!1},e.prototype.fetch=function(a,b){var c=function(){return a.attr("data-vimeo-id")?"vimeo":a.attr("data-vzaar-id")?"vzaar":"youtube"}(),d=a.attr("data-vimeo-id")||a.attr("data-youtube-id")||a.attr("data-vzaar-id"),e=a.attr("data-width")||this._core.settings.videoWidth,f=a.attr("data-height")||this._core.settings.videoHeight,g=a.attr("href");if(!g)throw new Error("Missing video URL.");if(d=g.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/),d[3].indexOf("youtu")>-1)c="youtube";else if(d[3].indexOf("vimeo")>-1)c="vimeo";else{if(!(d[3].indexOf("vzaar")>-1))throw new Error("Video URL not supported.");c="vzaar"}d=d[6],this._videos[g]={type:c,id:d,width:e,height:f},b.attr("data-video",g),this.thumbnail(a,this._videos[g])},e.prototype.thumbnail=function(b,c){var d,e,f,g=c.width&&c.height?'style="width:'+c.width+"px;height:"+c.height+'px;"':"",h=b.find("img"),i="src",j="",k=this._core.settings,l=function(a){e='
',d=k.lazyLoad?'
':'
',b.after(d),b.after(e)};if(b.wrap('
"),this._core.settings.lazyLoad&&(i="data-src",j="owl-lazy"),h.length)return l(h.attr(i)),h.remove(),!1;"youtube"===c.type?(f="//img.youtube.com/vi/"+c.id+"/hqdefault.jpg",l(f)):"vimeo"===c.type?a.ajax({type:"GET",url:"//vimeo.com/api/v2/video/"+c.id+".json",jsonp:"callback",dataType:"jsonp",success:function(a){f=a[0].thumbnail_large,l(f)}}):"vzaar"===c.type&&a.ajax({type:"GET",url:"//vzaar.com/api/videos/"+c.id+".json",jsonp:"callback",dataType:"jsonp",success:function(a){f=a.framegrab_url,l(f)}})},e.prototype.stop=function(){this._core.trigger("stop",null,"video"),this._playing.find(".owl-video-frame").remove(),this._playing.removeClass("owl-video-playing"),this._playing=null,this._core.leave("playing"),this._core.trigger("stopped",null,"video")},e.prototype.play=function(b){var c,d=a(b.target),e=d.closest("."+this._core.settings.itemClass),f=this._videos[e.attr("data-video")],g=f.width||"100%",h=f.height||this._core.$stage.height();this._playing||(this._core.enter("playing"),this._core.trigger("play",null,"video"),e=this._core.items(this._core.relative(e.index())),this._core.reset(e.index()),"youtube"===f.type?c='':"vimeo"===f.type?c='':"vzaar"===f.type&&(c=''),a(''+c+"
").insertAfter(e.find(".owl-video")),this._playing=e.addClass("owl-video-playing"))},e.prototype.isInFullScreen=function(){var b=c.fullscreenElement||c.mozFullScreenElement||c.webkitFullscreenElement;return b&&a(b).parent().hasClass("owl-video-frame")},e.prototype.destroy=function(){var a,b;this._core.$element.off("click.owl.video");for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Video=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this.core=b,this.core.options=a.extend({},e.Defaults,this.core.options),this.swapping=!0,this.previous=d,this.next=d,this.handlers={"change.owl.carousel":a.proxy(function(a){a.namespace&&"position"==a.property.name&&(this.previous=this.core.current(),this.next=a.property.value)},this),"drag.owl.carousel dragged.owl.carousel translated.owl.carousel":a.proxy(function(a){a.namespace&&(this.swapping="translated"==a.type)},this),"translate.owl.carousel":a.proxy(function(a){a.namespace&&this.swapping&&(this.core.options.animateOut||this.core.options.animateIn)&&this.swap()},this)},this.core.$element.on(this.handlers)};e.Defaults={animateOut:!1,animateIn:!1},e.prototype.swap=function(){if(1===this.core.settings.items&&a.support.animation&&a.support.transition){this.core.speed(0);var b,c=a.proxy(this.clear,this),d=this.core.$stage.children().eq(this.previous),e=this.core.$stage.children().eq(this.next),f=this.core.settings.animateIn,g=this.core.settings.animateOut;this.core.current()!==this.previous&&(g&&(b=this.core.coordinates(this.previous)-this.core.coordinates(this.next),d.one(a.support.animation.end,c).css({left:b+"px"}).addClass("animated owl-animated-out").addClass(g)),f&&e.one(a.support.animation.end,c).addClass("animated owl-animated-in").addClass(f))}},e.prototype.clear=function(b){a(b.target).css({left:""}).removeClass("animated owl-animated-out owl-animated-in").removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut),this.core.onTransitionEnd()},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this.core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},
+ a.fn.owlCarousel.Constructor.Plugins.Animate=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._timeout=null,this._paused=!1,this._handlers={"changed.owl.carousel":a.proxy(function(a){a.namespace&&"settings"===a.property.name?this._core.settings.autoplay?this.play():this.stop():a.namespace&&"position"===a.property.name&&this._core.settings.autoplay&&this._setAutoPlayInterval()},this),"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoplay&&this.play()},this),"play.owl.autoplay":a.proxy(function(a,b,c){a.namespace&&this.play(b,c)},this),"stop.owl.autoplay":a.proxy(function(a){a.namespace&&this.stop()},this),"mouseover.owl.autoplay":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"mouseleave.owl.autoplay":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.play()},this),"touchstart.owl.core":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"touchend.owl.core":a.proxy(function(){this._core.settings.autoplayHoverPause&&this.play()},this)},this._core.$element.on(this._handlers),this._core.options=a.extend({},e.Defaults,this._core.options)};e.Defaults={autoplay:!1,autoplayTimeout:5e3,autoplayHoverPause:!1,autoplaySpeed:!1},e.prototype.play=function(a,b){this._paused=!1,this._core.is("rotating")||(this._core.enter("rotating"),this._setAutoPlayInterval())},e.prototype._getNextTimeout=function(d,e){return this._timeout&&b.clearTimeout(this._timeout),b.setTimeout(a.proxy(function(){this._paused||this._core.is("busy")||this._core.is("interacting")||c.hidden||this._core.next(e||this._core.settings.autoplaySpeed)},this),d||this._core.settings.autoplayTimeout)},e.prototype._setAutoPlayInterval=function(){this._timeout=this._getNextTimeout()},e.prototype.stop=function(){this._core.is("rotating")&&(b.clearTimeout(this._timeout),this._core.leave("rotating"))},e.prototype.pause=function(){this._core.is("rotating")&&(this._paused=!0)},e.prototype.destroy=function(){var a,b;this.stop();for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.autoplay=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){"use strict";var e=function(b){this._core=b,this._initialized=!1,this._pages=[],this._controls={},this._templates=[],this.$element=this._core.$element,this._overrides={next:this._core.next,prev:this._core.prev,to:this._core.to},this._handlers={"prepared.owl.carousel":a.proxy(function(b){b.namespace&&this._core.settings.dotsData&&this._templates.push(''+a(b.content).find("[data-dot]").addBack("[data-dot]").attr("data-dot")+"
")},this),"added.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.dotsData&&this._templates.splice(a.position,0,this._templates.pop())},this),"remove.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.dotsData&&this._templates.splice(a.position,1)},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&"position"==a.property.name&&this.draw()},this),"initialized.owl.carousel":a.proxy(function(a){a.namespace&&!this._initialized&&(this._core.trigger("initialize",null,"navigation"),this.initialize(),this.update(),this.draw(),this._initialized=!0,this._core.trigger("initialized",null,"navigation"))},this),"refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._initialized&&(this._core.trigger("refresh",null,"navigation"),this.update(),this.draw(),this._core.trigger("refreshed",null,"navigation"))},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers)};e.Defaults={nav:!1,navText:["prev","next"],navSpeed:!1,navElement:"div",navContainer:!1,navContainerClass:"owl-nav",navClass:["owl-prev","owl-next"],slideBy:1,dotClass:"owl-dot",dotsClass:"owl-dots",dots:!0,dotsEach:!1,dotsData:!1,dotsSpeed:!1,dotsContainer:!1},e.prototype.initialize=function(){var b,c=this._core.settings;this._controls.$relative=(c.navContainer?a(c.navContainer):a("").addClass(c.navContainerClass).appendTo(this.$element)).addClass("disabled"),this._controls.$previous=a("<"+c.navElement+">").addClass(c.navClass[0]).html(c.navText[0]).prependTo(this._controls.$relative).on("click",a.proxy(function(a){this.prev(c.navSpeed)},this)),this._controls.$next=a("<"+c.navElement+">").addClass(c.navClass[1]).html(c.navText[1]).appendTo(this._controls.$relative).on("click",a.proxy(function(a){this.next(c.navSpeed)},this)),c.dotsData||(this._templates=[a("
").addClass(c.dotClass).append(a("
")).prop("outerHTML")]),this._controls.$absolute=(c.dotsContainer?a(c.dotsContainer):a("").addClass(c.dotsClass).appendTo(this.$element)).addClass("disabled"),this._controls.$absolute.on("click","div",a.proxy(function(b){var d=a(b.target).parent().is(this._controls.$absolute)?a(b.target).index():a(b.target).parent().index();b.preventDefault(),this.to(d,c.dotsSpeed)},this));for(b in this._overrides)this._core[b]=a.proxy(this[b],this)},e.prototype.destroy=function(){var a,b,c,d;for(a in this._handlers)this.$element.off(a,this._handlers[a]);for(b in this._controls)this._controls[b].remove();for(d in this.overides)this._core[d]=this._overrides[d];for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},e.prototype.update=function(){var a,b,c,d=this._core.clones().length/2,e=d+this._core.items().length,f=this._core.maximum(!0),g=this._core.settings,h=g.center||g.autoWidth||g.dotsData?1:g.dotsEach||g.items;if("page"!==g.slideBy&&(g.slideBy=Math.min(g.slideBy,g.items)),g.dots||"page"==g.slideBy)for(this._pages=[],a=d,b=0,c=0;a
=h||0===b){if(this._pages.push({start:Math.min(f,a-d),end:a-d+h-1}),Math.min(f,a-d)===f)break;b=0,++c}b+=this._core.mergers(this._core.relative(a))}},e.prototype.draw=function(){var b,c=this._core.settings,d=this._core.items().length<=c.items,e=this._core.relative(this._core.current()),f=c.loop||c.rewind;this._controls.$relative.toggleClass("disabled",!c.nav||d),c.nav&&(this._controls.$previous.toggleClass("disabled",!f&&e<=this._core.minimum(!0)),this._controls.$next.toggleClass("disabled",!f&&e>=this._core.maximum(!0))),this._controls.$absolute.toggleClass("disabled",!c.dots||d),c.dots&&(b=this._pages.length-this._controls.$absolute.children().length,c.dotsData&&0!==b?this._controls.$absolute.html(this._templates.join("")):b>0?this._controls.$absolute.append(new Array(b+1).join(this._templates[0])):b<0&&this._controls.$absolute.children().slice(b).remove(),this._controls.$absolute.find(".active").removeClass("active"),this._controls.$absolute.children().eq(a.inArray(this.current(),this._pages)).addClass("active"))},e.prototype.onTrigger=function(b){var c=this._core.settings;b.page={index:a.inArray(this.current(),this._pages),count:this._pages.length,size:c&&(c.center||c.autoWidth||c.dotsData?1:c.dotsEach||c.items)}},e.prototype.current=function(){var b=this._core.relative(this._core.current());return a.grep(this._pages,a.proxy(function(a,c){return a.start<=b&&a.end>=b},this)).pop()},e.prototype.getPosition=function(b){var c,d,e=this._core.settings;return"page"==e.slideBy?(c=a.inArray(this.current(),this._pages),d=this._pages.length,b?++c:--c,c=this._pages[(c%d+d)%d].start):(c=this._core.relative(this._core.current()),d=this._core.items().length,b?c+=e.slideBy:c-=e.slideBy),c},e.prototype.next=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!0),b)},e.prototype.prev=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!1),b)},e.prototype.to=function(b,c,d){var e;!d&&this._pages.length?(e=this._pages.length,a.proxy(this._overrides.to,this._core)(this._pages[(b%e+e)%e].start,c)):a.proxy(this._overrides.to,this._core)(b,c)},a.fn.owlCarousel.Constructor.Plugins.Navigation=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){"use strict";var e=function(c){this._core=c,this._hashes={},this.$element=this._core.$element,this._handlers={"initialized.owl.carousel":a.proxy(function(c){c.namespace&&"URLHash"===this._core.settings.startPosition&&a(b).trigger("hashchange.owl.navigation")},this),"prepared.owl.carousel":a.proxy(function(b){if(b.namespace){var c=a(b.content).find("[data-hash]").addBack("[data-hash]").attr("data-hash");if(!c)return;this._hashes[c]=b.content}},this),"changed.owl.carousel":a.proxy(function(c){if(c.namespace&&"position"===c.property.name){var d=this._core.items(this._core.relative(this._core.current())),e=a.map(this._hashes,function(a,b){return a===d?b:null}).join();if(!e||b.location.hash.slice(1)===e)return;b.location.hash=e}},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers),a(b).on("hashchange.owl.navigation",a.proxy(function(a){var c=b.location.hash.substring(1),e=this._core.$stage.children(),f=this._hashes[c]&&e.index(this._hashes[c]);f!==d&&f!==this._core.current()&&this._core.to(this._core.relative(f),!1,!0)},this))};e.Defaults={URLhashListener:!1},e.prototype.destroy=function(){var c,d;a(b).off("hashchange.owl.navigation");for(c in this._handlers)this._core.$element.off(c,this._handlers[c]);for(d in Object.getOwnPropertyNames(this))"function"!=typeof this[d]&&(this[d]=null)},a.fn.owlCarousel.Constructor.Plugins.Hash=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){function e(b,c){var e=!1,f=b.charAt(0).toUpperCase()+b.slice(1);return a.each((b+" "+h.join(f+" ")+f).split(" "),function(a,b){if(g[b]!==d)return e=!c||b,!1}),e}function f(a){return e(a,!0)}var g=a("").get(0).style,h="Webkit Moz O ms".split(" "),i={transition:{end:{WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"}},animation:{end:{WebkitAnimation:"webkitAnimationEnd",MozAnimation:"animationend",OAnimation:"oAnimationEnd",animation:"animationend"}}},j={csstransforms:function(){return!!e("transform")},csstransforms3d:function(){return!!e("perspective")},csstransitions:function(){return!!e("transition")},cssanimations:function(){return!!e("animation")}};j.csstransitions()&&(a.support.transition=new String(f("transition")),a.support.transition.end=i.transition.end[a.support.transition]),j.cssanimations()&&(a.support.animation=new String(f("animation")),a.support.animation.end=i.animation.end[a.support.animation]),j.csstransforms()&&(a.support.transform=new String(f("transform")),a.support.transform3d=j.csstransforms3d())}(window.Zepto||window.jQuery,window,document);
+
+
+/**
+ * @module RD Navbar
+ * @author Evgeniy Gusarov
+ * @see https://ua.linkedin.com/pub/evgeniy-gusarov/8a/a40/54a
+ * @version 2.2.5
+ */
+/**
+ * @module RD Navbar
+ * @author Evgeniy Gusarov
+ * @version 2.2.5
+ */
+(function() {
+ var isTouch;
+
+ isTouch = "ontouchstart" in window;
+
+ (function($, document, window) {
+
+ /**
+ * Creates a RDNavbar.
+ * @class RDNavbar.
+ * @public
+ * @param {HTMLElement} element - The element to create the RDNavbar for.
+ * @param {Object} [options] - The options
+ */
+ var RDNavbar;
+ RDNavbar = (function() {
+
+ /**
+ * Default options for RDNavbar.
+ * @protected
+ */
+ RDNavbar.prototype.Defaults = {
+ layout: 'rd-navbar-static',
+ deviceLayout: 'rd-navbar-fixed',
+ focusOnHover: true,
+ focusOnHoverTimeout: 800,
+ linkedElements: ["html"],
+ domAppend: true,
+ stickUp: true,
+ stickUpClone: true,
+ stickUpOffset: '100%',
+ anchorNav: true,
+ anchorNavSpeed: 400,
+ anchorNavOffset: 0,
+ anchorNavEasing: 'swing',
+ autoHeight: true,
+ responsive: {
+ 0: {
+ layout: "rd-navbar-fixed",
+ deviceLayout: "rd-navbar-fixed",
+ focusOnHover: false,
+ stickUp: false
+ },
+ 992: {
+ layout: "rd-navbar-static",
+ deviceLayout: "rd-navbar-static",
+ focusOnHover: true,
+ stickUp: true
+ }
+ },
+ callbacks: {
+ onToggleSwitch: false,
+ onToggleClose: false,
+ onDomAppend: false,
+ onDropdownOver: false,
+ onDropdownOut: false,
+ onDropdownToggle: false,
+ onDropdownClose: false,
+ onStuck: false,
+ onUnstuck: false,
+ onAnchorChange: false
+ }
+ };
+
+ function RDNavbar(element, options) {
+
+ /**
+ * Current options set
+ * @public
+ */
+ this.options = $.extend(true, {}, this.Defaults, options);
+
+ /**
+ * Plugin element
+ * @public
+ */
+ this.$element = $(element);
+
+ /**
+ * Plugin element clone
+ * @public
+ */
+ this.$clone = null;
+
+ /**
+ * Additional references
+ * @public
+ */
+ this.$win = $(window);
+ this.$doc = $(document);
+ this.currentLayout = this.options.layout;
+ this.loaded = false;
+ this.focusOnHover = this.options.focusOnHover;
+ this.focusTimer = false;
+ this.cloneTimer = false;
+ this.isStuck = false;
+ this.initialize();
+ }
+
+
+ /**
+ * Initializes the RDNavbar.
+ * @protected
+ */
+
+ RDNavbar.prototype.initialize = function() {
+ var ctx;
+ ctx = this;
+ ctx.$element.addClass("rd-navbar").addClass(ctx.options.layout);
+ if (isTouch) {
+ ctx.$element.addClass("rd-navbar--is-touch");
+ }
+ if (ctx.options.domAppend) {
+ ctx.createNav(ctx);
+ }
+ if (ctx.options.stickUpClone) {
+ ctx.createClone(ctx);
+ }
+ ctx.$element.addClass('rd-navbar-original');
+ ctx.addAdditionalClassToToggles('.rd-navbar-original', 'toggle-original', 'toggle-original-elements');
+ ctx.applyHandlers(ctx);
+ ctx.offset = ctx.$element.offset().top;
+ ctx.height = ctx.$element.outerHeight();
+ ctx.loaded = true;
+ return ctx;
+ };
+
+
+ /**
+ * Changes {ctx.$element} layout basing on screen resolution
+ * @protected
+ */
+
+ RDNavbar.prototype.resize = function(ctx, e) {
+ var targetElement, targetLayout;
+ targetLayout = isTouch ? ctx.getOption('deviceLayout') : ctx.getOption('layout');
+ targetElement = ctx.$element.add(ctx.$clone);
+ if (targetLayout !== ctx.currentLayout || !ctx.loaded) {
+ ctx.switchClass(targetElement, ctx.currentLayout, targetLayout);
+ if (ctx.options.linkedElements != null) {
+ $.grep(ctx.options.linkedElements, function(link, index) {
+ return ctx.switchClass(link, ctx.currentLayout + '-linked', targetLayout + '-linked');
+ });
+ }
+ ctx.currentLayout = targetLayout;
+ }
+ ctx.focusOnHover = ctx.getOption('focusOnHover');
+ return ctx;
+ };
+
+
+ /**
+ * Toggles bar stickup on scroll
+ * @protected
+ */
+
+ RDNavbar.prototype.stickUp = function(ctx, e) {
+ var scrollTop, stickUp, stickUpOffset, targetElement, threshold;
+ stickUp = ctx.getOption("stickUp");
+ if ($('html').hasClass('ios') || ctx.$element.hasClass('rd-navbar-fixed')) {
+ stickUp = false;
+ }
+ scrollTop = ctx.$doc.scrollTop();
+ targetElement = ctx.$clone != null ? ctx.$clone : ctx.$element;
+ stickUpOffset = ctx.getOption('stickUpOffset');
+ threshold = (typeof stickUpOffset === 'string' ? (stickUpOffset.indexOf('%') > 0 ? parseFloat(stickUpOffset) * ctx.height / 100 : parseFloat(stickUpOffset)) : stickUpOffset);
+ if (stickUp) {
+ if ((scrollTop >= threshold && !ctx.isStuck) || (scrollTop < threshold && ctx.isStuck)) {
+ ctx.$element.add(ctx.$clone).find('[data-rd-navbar-toggle]').each(function() {
+ $.proxy(ctx.closeToggle, this)(ctx, false);
+ }).end().find('.rd-navbar-submenu').removeClass('opened').removeClass('focus');
+ if (scrollTop >= threshold && !ctx.isStuck && !ctx.$element.hasClass('rd-navbar-fixed')) {
+ if (ctx.options.callbacks.onStuck) {
+ ctx.options.callbacks.onStuck.call(ctx);
+ }
+
+
+ setTimeout(function(){
+ if (e.type === 'resize') {
+ ctx.switchClass(targetElement, '', 'rd-navbar--is-stuck');
+ } else {
+ targetElement.addClass('rd-navbar--is-stuck');
+ }
+ ctx.isStuck = true;
+ }, navigator.platform.match(/(Mac)/i) ? 10 : 0);
+
+ } else {
+ if (e.type === 'resize') {
+ ctx.switchClass(targetElement, 'rd-navbar--is-stuck', '');
+ } else {
+ targetElement.removeClass('rd-navbar--is-stuck').one('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd', $.proxy(ctx.resizeWrap, ctx, e));
+ }
+ ctx.isStuck = false;
+ if (ctx.options.callbacks.onUnstuck) {
+ ctx.options.callbacks.onUnstuck.call(ctx);
+ }
+ }
+ }
+ } else {
+ ctx.$element.find('.rd-navbar-submenu').removeClass('opened').removeClass('focus');
+ if (ctx.isStuck) {
+ ctx.switchClass(targetElement, 'rd-navbar--is-stuck', '');
+ ctx.isStuck = false;
+ ctx.resizeWrap(e);
+ }
+ }
+ return ctx;
+ };
+
+
+ /**
+ * Resizes an external wrap of navbar
+ * @protected
+ */
+
+ RDNavbar.prototype.resizeWrap = function(e) {
+ var $wrap, ctx;
+ ctx = this;
+ if ((ctx.$clone == null) && !ctx.isStuck) {
+ $wrap = ctx.$element.parent();
+ if (!ctx.getOption('autoHeight')) {
+ $wrap.css('height', 'auto');
+ return;
+ }
+ ctx.height = ctx.$element.outerHeight();
+ if (e.type === 'resize') {
+ $wrap.addClass('rd-navbar--no-transition').css('height', ctx.height);
+ $wrap[0].offsetHeight;
+ return $wrap.removeClass('rd-navbar--no-transition');
+ } else {
+ return $wrap.css('height', ctx.height);
+ }
+ }
+ };
+
+
+ /**
+ * Creates additional DOM for navigation functionality
+ * @protected
+ */
+
+ RDNavbar.prototype.createNav = function(ctx) {
+ ctx.$element.find('.rd-navbar-dropdown, .rd-navbar-megamenu').each(function() {
+ var $this, rect;
+ $this = $(this);
+ rect = this.getBoundingClientRect();
+ if ($this.hasClass('rd-navbar-megamenu')) {
+ return $this.parent().addClass('rd-navbar--has-megamenu');
+ } else {
+ return $this.parent().addClass('rd-navbar--has-dropdown');
+ }
+ }).parents("li").addClass("rd-navbar-submenu");
+ $('').insertAfter('.rd-navbar-nav li.rd-navbar-submenu > a');
+ if (ctx.options.callbacks.onDomAppend) {
+ ctx.options.callbacks.onDomAppend.call(this);
+ }
+ return ctx;
+ };
+
+
+ /**
+ * Creates navbar clone to stick up
+ * @protected
+ */
+
+ RDNavbar.prototype.createClone = function(ctx) {
+ ctx.$clone = ctx.$element.clone().insertAfter(ctx.$element).addClass('rd-navbar--is-clone');
+ ctx.addAdditionalClassToToggles('.rd-navbar--is-clone', 'toggle-cloned', 'toggle-cloned-elements');
+ return ctx;
+ };
+
+
+ /**
+ * Closes all toggles on outside click of each item
+ * @protected
+ */
+
+ RDNavbar.prototype.closeToggle = function(ctx, e) {
+ var $items, $target, additionalToggleElClass, additionalToogleClass, collapse, linkedElements, needClose;
+ $target = $(e.target);
+ collapse = false;
+ linkedElements = this.getAttribute('data-rd-navbar-toggle');
+ if (ctx.options.stickUpClone && ctx.isStuck) {
+ additionalToogleClass = '.toggle-cloned';
+ additionalToggleElClass = '.toggle-cloned-elements';
+ needClose = !$target.hasClass('toggle-cloned');
+ } else {
+ additionalToogleClass = '.toggle-original';
+ additionalToggleElClass = '.toggle-original-elements';
+ needClose = !$target.hasClass('toggle-original');
+ }
+ if (e.target !== this && !$target.parents(additionalToogleClass + '[data-rd-navbar-toggle]').length && !$target.parents(additionalToggleElClass).length && linkedElements && needClose) {
+ $items = $(this).parents('body').find(linkedElements).add($(this).parents('.rd-navbar')[0]);
+ $items.each(function() {
+ if (!collapse) {
+ return collapse = (e.target === this || $.contains(this, e.target)) === true;
+ }
+ });
+ if (!collapse) {
+ $items.add(this).removeClass('active');
+ if (ctx.options.callbacks.onToggleClose) {
+ ctx.options.callbacks.onToggleClose.call(this, ctx);
+ }
+ }
+ }
+ return this;
+ };
+
+
+ /**
+ * Switches toggle
+ * @protected
+ */
+
+ RDNavbar.prototype.switchToggle = function(ctx, e) {
+ var additionalToggleElClass, linkedElements, navbarClass;
+ e.preventDefault();
+ if ($(this).hasClass('toggle-cloned')) {
+ navbarClass = '.rd-navbar--is-clone';
+ additionalToggleElClass = '.toggle-cloned-elements';
+ } else {
+ navbarClass = '.rd-navbar-original';
+ additionalToggleElClass = '.toggle-original-elements';
+ }
+ if (linkedElements = this.getAttribute('data-rd-navbar-toggle')) {
+ $(navbarClass + ' [data-rd-navbar-toggle]').not(this).each(function() {
+ var deactivateElements;
+ if (deactivateElements = this.getAttribute('data-rd-navbar-toggle')) {
+ return $(this).parents('body').find(navbarClass + ' ' + deactivateElements + additionalToggleElClass).add(this).add($.inArray('.rd-navbar', deactivateElements.split(/\s*,\s*/i)) > -1 ? $(this).parents('body')[0] : false).removeClass('active');
+ }
+ });
+ $(this).parents('body').find(navbarClass + ' ' + linkedElements + additionalToggleElClass).add(this).add($.inArray('.rd-navbar', linkedElements.split(/\s*,\s*/i)) > -1 ? $(this).parents('.rd-navbar')[0] : false).toggleClass('active');
+ }
+ if (ctx.options.callbacks.onToggleSwitch) {
+ ctx.options.callbacks.onToggleSwitch.call(this, ctx);
+ }
+ return this;
+ };
+
+
+ /**
+ * Triggers submenu popup to be shown on mouseover
+ * @protected
+ */
+
+ RDNavbar.prototype.dropdownOver = function(ctx, timer) {
+ var $this;
+ if (ctx.focusOnHover) {
+ $this = $(this);
+ clearTimeout(timer);
+ if (ctx.options.callbacks.onDropdownOver) {
+ if (!ctx.options.callbacks.onDropdownOver.call(this, ctx)){
+ return this;
+ }
+ }
+
+ $this.addClass('focus').siblings().removeClass('opened').each(ctx.dropdownUnfocus);
+ }
+ return this;
+ };
+
+
+ /**
+ * Triggers submenu popup to be shown on mouseover
+ * @protected
+ */
+
+ RDNavbar.prototype.dropdownTouch = function(ctx, timer) {
+ var $this, hasFocus;
+ $this = $(this);
+ clearTimeout(timer);
+ if (ctx.focusOnHover) {
+ hasFocus = false;
+ if ($this.hasClass('focus')) {
+ hasFocus = true;
+ }
+ if (!hasFocus) {
+ $this.addClass('focus').siblings().removeClass('opened').each(ctx.dropdownUnfocus);
+ return false;
+ }
+ if (ctx.options.callbacks.onDropdownOver) {
+ ctx.options.callbacks.onDropdownOver.call(this, ctx);
+ }
+ }
+ return this;
+ };
+
+
+ /**
+ * Triggers submenu popop to be hidden on mouseout
+ * @protected
+ */
+
+ RDNavbar.prototype.dropdownOut = function(ctx, timer) {
+ var $this;
+ if (ctx.focusOnHover) {
+ $this = $(this);
+ $this.one('mouseenter.navbar', function() {
+ return clearTimeout(timer);
+ });
+
+ if (ctx.options.callbacks.onDropdownOut) {
+ ctx.options.callbacks.onDropdownOut.call(this, ctx);
+ }
+ clearTimeout(timer);
+
+ timer = setTimeout($.proxy(ctx.dropdownUnfocus, this, ctx), ctx.options.focusOnHoverTimeout);
+ }
+ return this;
+ };
+
+
+ /**
+ * Removes a focus from submenu
+ * @protected
+ */
+
+ RDNavbar.prototype.dropdownUnfocus = function(ctx) {
+ var $this;
+ $this = $(this);
+ $this.find('li.focus').add(this).removeClass('focus');
+ return this;
+ };
+
+
+ /**
+ * Closes submenu
+ * @protected
+ */
+
+ RDNavbar.prototype.dropdownClose = function(ctx, e) {
+ var $this;
+ if (e.target !== this && !$(e.target).parents('.rd-navbar-submenu').length) {
+ $this = $(this);
+ $this.find('li.focus').add(this).removeClass('focus').removeClass('opened');
+ if (ctx.options.callbacks.onDropdownClose) {
+ ctx.options.callbacks.onDropdownClose.call(this, ctx);
+ }
+ }
+ return this;
+ };
+
+
+ /**
+ * Toggles submenu popup to be shown on trigger click
+ * @protected
+ */
+
+ RDNavbar.prototype.dropdownToggle = function(ctx) {
+ $(this).toggleClass('opened').siblings().removeClass('opened');
+ if (ctx.options.callbacks.onDropdownToggle) {
+ ctx.options.callbacks.onDropdownToggle.call(this, ctx);
+ }
+ return this;
+ };
+
+
+ /**
+ * Scrolls the page to triggered anchor
+ * @protected
+ */
+
+ RDNavbar.prototype.goToAnchor = function(ctx, e) {
+ var $anchor, hash;
+ hash = this.hash;
+ $anchor = $(hash);
+
+ if (!ctx.getOption('anchorNav')){
+ return false;
+ }
+
+ if ($anchor.length) {
+ e.preventDefault();
+ $('html, body').stop().animate({
+ 'scrollTop': $anchor.offset().top + ctx.getOption('anchorNavOffset') + 1
+ }, ctx.getOption('anchorNavSpeed'), ctx.getOption('anchorNavEasing'), function() {
+ return ctx.changeAnchor(hash);
+ });
+ }
+ return this;
+ };
+
+
+ /**
+ * Highlight an active anchor
+ * @protected
+ */
+
+ RDNavbar.prototype.activateAnchor = function(e) {
+ var $anchor, $item, $link, ctx, docHeight, hash, i, link, links, navOffset, scrollTop, winHeight;
+ ctx = this;
+ scrollTop = ctx.$doc.scrollTop();
+ winHeight = ctx.$win.height();
+ docHeight = ctx.$doc.height();
+ navOffset = ctx.getOption('anchorNavOffset');
+
+ if (!ctx.options.anchorNav){
+ return false;
+ }
+
+ if (scrollTop + winHeight > docHeight - 50) {
+ $anchor = $('[data-type="anchor"]').last();
+ if ($anchor.length) {
+ if ($anchor.offset().top >= scrollTop) {
+ hash = '#' + $anchor.attr("id");
+ $item = $('.rd-navbar-nav a[href^="' + hash + '"]').parent();
+ if (!$item.hasClass('active')) {
+ $item.addClass('active').siblings().removeClass('active');
+ if (ctx.options.callbacks.onAnchorChange) {
+ ctx.options.callbacks.onAnchorChange.call($anchor[0], ctx);
+ }
+ }
+ }
+ }
+ return $anchor;
+ } else {
+ links = $('.rd-navbar-nav a[href^="#"]').get();
+ for (i in links) {
+ link = links[i];
+ $link = $(link);
+ hash = $link.attr('href');
+ // @CHANGE LDR
+ if (hash != '#') $anchor = $(hash);
+ else $anchor = '';
+ //$anchor = $(hash);
+ if ($anchor.length) {
+ if ($anchor.offset().top + navOffset <= scrollTop && $anchor.offset().top + $anchor.outerHeight() > scrollTop) {
+ $link.parent().addClass('active').siblings().removeClass('active');
+ if (ctx.options.callbacks.onAnchorChange) {
+ ctx.options.callbacks.onAnchorChange.call($anchor[0], ctx);
+ }
+ }
+ }
+ }
+ }
+ return null;
+ };
+
+
+ /**
+ * Returns current anchor
+ * @protected
+ */
+
+ RDNavbar.prototype.getAnchor = function() {
+ if (history) {
+ if (history.state) {
+ return history.state.id;
+ }
+ }
+ return null;
+ };
+
+
+ /**
+ * Changes current page anchor
+ * @protected
+ */
+
+ RDNavbar.prototype.changeAnchor = function(hash) {
+ if (history) {
+ if (history.state) {
+ if (history.state.id !== hash) {
+ history.replaceState({
+ 'anchorId': hash
+ }, null, hash);
+ } else {
+ history.pushState({
+ 'anchorId': hash
+ }, null, hash);
+ }
+ } else {
+ history.pushState({
+ 'anchorId': hash
+ }, null, hash);
+ }
+ }
+ return this;
+ };
+
+
+ /**
+ * Applies all JS event handlers
+ * @protected
+ */
+
+ RDNavbar.prototype.applyHandlers = function(ctx) {
+ if (ctx.options.responsive != null) {
+ ctx.$win.on('resize.navbar', $.proxy(ctx.resize, ctx.$win[0], ctx)).on('resize.navbar', $.proxy(ctx.resizeWrap, ctx)).on('resize.navbar', $.proxy(ctx.stickUp, (ctx.$clone != null ? ctx.$clone : ctx.$element), ctx)).on('orientationchange.navbar', $.proxy(ctx.resize, ctx.$win[0], ctx)).trigger('resize.navbar');
+ }
+ ctx.$doc.on('scroll.navbar', $.proxy(ctx.stickUp, (ctx.$clone != null ? ctx.$clone : ctx.$element), ctx)).on('scroll.navbar', $.proxy(ctx.activateAnchor, ctx));
+ ctx.$element.add(ctx.$clone).find('[data-rd-navbar-toggle]').each(function() {
+ var $this;
+ $this = $(this);
+ $this.on('click', $.proxy(ctx.switchToggle, this, ctx));
+ return $this.parents('body').on('click', $.proxy(ctx.closeToggle, this, ctx));
+ });
+ ctx.$element.add(ctx.$clone).find('.rd-navbar-submenu').each(function() {
+ var $this, timer;
+ $this = $(this);
+ timer = $this.parents(".rd-navbar--is-clone").length ? ctx.cloneTimer : ctx.focusTimer;
+ $this.on('mouseleave.navbar', $.proxy(ctx.dropdownOut, this, ctx, timer));
+ $this.find('> a').on('mouseenter.navbar', $.proxy(ctx.dropdownOver, this, ctx, timer));
+ $this.find('> a').on('touchstart.navbar', $.proxy(ctx.dropdownTouch, this, ctx, timer));
+ $this.find('> .rd-navbar-submenu-toggle').on('click', $.proxy(ctx.dropdownToggle, this, ctx));
+ return $this.parents('body').on('click', $.proxy(ctx.dropdownClose, this, ctx));
+ });
+ ctx.$element.add(ctx.$clone).find('.rd-navbar-nav a[href^="#"]').each(function() {
+ return $(this).on('click', $.proxy(ctx.goToAnchor, this, ctx));
+ });
+
+ ctx.$element.find('.rd-navbar-dropdown, .rd-navbar-megamenu').each(function() {
+ var $this, rect;
+ $this = $(this);
+ rect = this.getBoundingClientRect();
+ if ((rect.left + $this.outerWidth()) >= window.innerWidth - 10) {
+ this.className += ' rd-navbar-open-left';
+ } else if ((rect.left - $this.outerWidth()) <= 10) {
+ this.className += ' rd-navbar-open-right';
+ }
+ });
+
+ return ctx;
+ };
+
+
+ /**
+ * Switches classes of elements without transition
+ * @protected
+ */
+
+ RDNavbar.prototype.switchClass = function(element, before, after) {
+ var obj;
+ obj = element instanceof jQuery ? element : $(element);
+ obj.addClass('rd-navbar--no-transition').removeClass(before).addClass(after);
+ obj[0].offsetHeight;
+ return obj.removeClass('rd-navbar--no-transition');
+ };
+
+
+ /**
+ * Gets specific option of plugin
+ * @protected
+ */
+
+ RDNavbar.prototype.getOption = function(key) {
+ var point, targetPoint;
+ for (point in this.options.responsive) {
+ if (point <= window.innerWidth) {
+ targetPoint = point;
+ }
+ }
+ if ((this.options.responsive != null) && (this.options.responsive[targetPoint][key] != null)) {
+ return this.options.responsive[targetPoint][key];
+ } else {
+ return this.options[key];
+ }
+ };
+
+
+ /**
+ * Add additional class to navbar toggles to identify it when navbar is cloned
+ * @protected
+ */
+
+ RDNavbar.prototype.addAdditionalClassToToggles = function(navbarClass, toggleAdditionalClass, toggleElAdditionalClass) {
+ return $(navbarClass).find('[data-rd-navbar-toggle]').each(function() {
+ var toggleElement;
+ $(this).addClass(toggleAdditionalClass);
+ toggleElement = this.getAttribute('data-rd-navbar-toggle');
+ return $(this).parents('body').find(navbarClass).find(toggleElement).addClass(toggleElAdditionalClass);
+ });
+ };
+
+ return RDNavbar;
+
+ })();
+
+ /**
+ * The jQuery Plugin for the RD Navbar
+ * @public
+ */
+ $.fn.extend({
+ RDNavbar: function(options) {
+ var $this;
+ $this = $(this);
+ if (!$this.data('RDNavbar')) {
+ return $this.data('RDNavbar', new RDNavbar(this, options));
+ }
+ }
+
+ /**
+ * RD Navbar window export
+ * @public
+ */
+ });
+ return window.RDNavbar = RDNavbar;
+ })(window.jQuery, document, window);
+
+
+ /**
+ * The Plugin AMD export
+ * @public
+ */
+
+ if (typeof module !== "undefined" && module !== null) {
+ module.exports = window.RDNavbar;
+ } else if (typeof define === 'function' && define.amd) {
+ define(["jquery"], function() {
+ 'use strict';
+ return window.RDNavbar;
+ });
+ }
+
+}).call(this);
+
+
+/**
+ * @module Device.js
+ * @see https://github.com/matthewhudson/device.js
+ * @license MIT
+ */
+(function(){var n,e,o,t,i,r,d,a,c,l;e=window.device,n={},window.device=n,t=window.document.documentElement,l=window.navigator.userAgent.toLowerCase(),n.ios=function(){return n.iphone()||n.ipod()||n.ipad()},n.iphone=function(){return!n.windows()&&i("iphone")},n.ipod=function(){return i("ipod")},n.ipad=function(){return i("ipad")},n.android=function(){return!n.windows()&&i("android")},n.androidPhone=function(){return n.android()&&i("mobile")},n.androidTablet=function(){return n.android()&&!i("mobile")},n.blackberry=function(){return i("blackberry")||i("bb10")||i("rim")},n.blackberryPhone=function(){return n.blackberry()&&!i("tablet")},n.blackberryTablet=function(){return n.blackberry()&&i("tablet")},n.windows=function(){return i("windows")},n.windowsPhone=function(){return n.windows()&&i("phone")},n.windowsTablet=function(){return n.windows()&&i("touch")&&!n.windowsPhone()},n.fxos=function(){return(i("(mobile;")||i("(tablet;"))&&i("; rv:")},n.fxosPhone=function(){return n.fxos()&&i("mobile")},n.fxosTablet=function(){return n.fxos()&&i("tablet")},n.meego=function(){return i("meego")},n.cordova=function(){return window.cordova&&"file:"===location.protocol},n.nodeWebkit=function(){return"object"==typeof window.process},n.mobile=function(){return n.androidPhone()||n.iphone()||n.ipod()||n.windowsPhone()||n.blackberryPhone()||n.fxosPhone()||n.meego()},n.tablet=function(){return n.ipad()||n.androidTablet()||n.blackberryTablet()||n.windowsTablet()||n.fxosTablet()},n.desktop=function(){return!n.tablet()&&!n.mobile()},n.television=function(){var n,e=["googletv","viera","smarttv","internet.tv","netcast","nettv","appletv","boxee","kylo","roku","dlnadoc","roku","pov_tv","hbbtv","ce-html"];for(n=0;n1},n.landscape=function(){return window.innerHeight/window.innerWidth<1},n.noConflict=function(){return window.device=e,this},i=function(n){return-1!==l.indexOf(n)},d=function(n){var e;return e=new RegExp(n,"i"),t.className.match(e)},o=function(n){var e=null;d(n)||(e=t.className.replace(/^\s+|\s+$/g,""),t.className=e+" "+n)},c=function(n){d(n)&&(t.className=t.className.replace(" "+n,""))},n.ios()?n.ipad()?o("ios ipad tablet"):n.iphone()?o("ios iphone mobile"):n.ipod()&&o("ios ipod mobile"):n.android()?o(n.androidTablet()?"android tablet":"android mobile"):n.blackberry()?o(n.blackberryTablet()?"blackberry tablet":"blackberry mobile"):n.windows()?o(n.windowsTablet()?"windows tablet":n.windowsPhone()?"windows mobile":"desktop"):n.fxos()?o(n.fxosTablet()?"fxos tablet":"fxos mobile"):n.meego()?o("meego mobile"):n.nodeWebkit()?o("node-webkit"):n.television()?o("television"):n.desktop()&&o("desktop"),n.cordova()&&o("cordova"),r=function(){n.landscape()?(c("portrait"),o("landscape")):(c("landscape"),o("portrait"))},a=Object.prototype.hasOwnProperty.call(window,"onorientationchange")?"orientationchange":"resize",window.addEventListener?window.addEventListener(a,r,!1):window.attachEvent?window.attachEvent(a,r):window[a]=r,r(),"function"==typeof define&&"object"==typeof define.amd&&define.amd?define(function(){return n}):"undefined"!=typeof module&&module.exports?module.exports=n:window.device=n}).call(this);
+
+
+/**
+ * @module UIToTop
+ * @author Matt Varone
+ * @see http://www.mattvarone.com/web-design/uitotop-jquery-plugin/
+ * @license MIT
+ */
+!function(o){o.fn.UItoTop=function(n){var e={text:"",min:500,scrollSpeed:800,containerID:"ui-to-top",containerClass:"ui-to-top fa fa-angle-up",easingType:"easeIn"},t=o.extend(e,n),i="#"+t.containerID;o("body").append(''+t.text+" "),o(i).click(function(){return o("html, body").stop().animate({scrollTop:0},t.scrollSpeed,t.easingType),!1}),o(window).scroll(function(){var n=o(window).scrollTop();"undefined"==typeof document.body.style.maxHeight&&o(i).css({position:"absolute",top:o(window).scrollTop()+o(window).height()-50}),n>t.min?o(i).stop(!0,!0).addClass("active"):o(i).removeClass("active")})}}(jQuery);
+
+
+/**
+ * @module Abstract base class for collection plugins v1.0.1.
+ * @author Keith Wood
+ * @see http://keith-wood.name/countdown.html
+ * @license MIT
+ */
+(function(){var j=false;window.JQClass=function(){};JQClass.classes={};JQClass.extend=function extender(f){var g=this.prototype;j=true;var h=new this();j=false;for(var i in f){h[i]=typeof f[i]=='function'&&typeof g[i]=='function'?(function(d,e){return function(){var b=this._super;this._super=function(a){return g[d].apply(this,a||[])};var c=e.apply(this,arguments);this._super=b;return c}})(i,f[i]):f[i]}function JQClass(){if(!j&&this._init){this._init.apply(this,arguments)}}JQClass.prototype=h;JQClass.prototype.constructor=JQClass;JQClass.extend=extender;return JQClass}})();(function($){JQClass.classes.JQPlugin=JQClass.extend({name:'plugin',defaultOptions:{},regionalOptions:{},_getters:[],_getMarker:function(){return'is-'+this.name},_init:function(){$.extend(this.defaultOptions,(this.regionalOptions&&this.regionalOptions[''])||{});var c=camelCase(this.name);$[c]=this;$.fn[c]=function(a){var b=Array.prototype.slice.call(arguments,1);if($[c]._isNotChained(a,b)){return $[c][a].apply($[c],[this[0]].concat(b))}return this.each(function(){if(typeof a==='string'){if(a[0]==='_'||!$[c][a]){throw'Unknown method: '+a;}$[c][a].apply($[c],[this].concat(b))}else{$[c]._attach(this,a)}})}},setDefaults:function(a){$.extend(this.defaultOptions,a||{})},_isNotChained:function(a,b){if(a==='option'&&(b.length===0||(b.length===1&&typeof b[0]==='string'))){return true}return $.inArray(a,this._getters)>-1},_attach:function(a,b){a=$(a);if(a.hasClass(this._getMarker())){return}a.addClass(this._getMarker());b=$.extend({},this.defaultOptions,this._getMetadata(a),b||{});var c=$.extend({name:this.name,elem:a,options:b},this._instSettings(a,b));a.data(this.name,c);this._postAttach(a,c);this.option(a,b)},_instSettings:function(a,b){return{}},_postAttach:function(a,b){},_getMetadata:function(d){try{var f=d.data(this.name.toLowerCase())||'';f=f.replace(/'/g,'"');f=f.replace(/([a-zA-Z0-9]+):/g,function(a,b,i){var c=f.substring(0,i).match(/"/g);return(!c||c.length%2===0?'"'+b+'":':b+':')});f=$.parseJSON('{'+f+'}');for(var g in f){var h=f[g];if(typeof h==='string'&&h.match(/^new Date\((.*)\)$/)){f[g]=eval(h)}}return f}catch(e){return{}}},_getInst:function(a){return $(a).data(this.name)||{}},option:function(a,b,c){a=$(a);var d=a.data(this.name);if(!b||(typeof b==='string'&&c==null)){var e=(d||{}).options;return(e&&b?e[b]:e)}if(!a.hasClass(this._getMarker())){return}var e=b||{};if(typeof b==='string'){e={};e[b]=c}this._optionsChanged(a,d,e);$.extend(d.options,e)},_optionsChanged:function(a,b,c){},destroy:function(a){a=$(a);if(!a.hasClass(this._getMarker())){return}this._preDestroy(a,this._getInst(a));a.removeData(this.name).removeClass(this._getMarker())},_preDestroy:function(a,b){}});function camelCase(c){return c.replace(/-([a-z])/g,function(a,b){return b.toUpperCase()})}$.JQPlugin={createPlugin:function(a,b){if(typeof a==='object'){b=a;a='JQPlugin'}a=camelCase(a);var c=camelCase(b.name);JQClass.classes[c]=JQClass.classes[a].extend(b);new JQClass.classes[c]()}}})(jQuery);
+
+
+/**
+ * @module Moment JS
+ * @authors Tim Wood, Iskren Chernev, Moment.js contributors
+ * @see https://ua.linkedin.com/in/rafael-shayvolodyan-3a297b96
+ * @version 2.12.0
+ * @license MIT
+ */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.moment=e()}(this,function(){"use strict";function t(){return Xn.apply(null,arguments)}function e(t){Xn=t}function n(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function i(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function s(t,e){var n,i=[];for(n=0;n0)for(n in Kn)i=Kn[n],s=e[i],c(s)||(t[i]=s);return t}function m(e){f(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),ti===!1&&(ti=!0,t.updateOffset(this),ti=!1)}function _(t){return t instanceof m||null!=t&&null!=t._isAMomentObject}function y(t){return 0>t?Math.ceil(t):Math.floor(t)}function g(t){var e=+t,n=0;return 0!==e&&isFinite(e)&&(n=y(e)),n}function p(t,e,n){var i,s=Math.min(t.length,e.length),r=Math.abs(t.length-e.length),a=0;for(i=0;s>i;i++)(n&&t[i]!==e[i]||!n&&g(t[i])!==g(e[i]))&&a++;return a+r}function v(e){t.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+e)}function D(t,e){var n=!0;return a(function(){return n&&(v(t+"\nArguments: "+Array.prototype.slice.call(arguments).join(", ")+"\n"+(new Error).stack),n=!1),e.apply(this,arguments)},e)}function M(t,e){ei[t]||(v(e),ei[t]=!0)}function S(t){return t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}function Y(t){return"[object Object]"===Object.prototype.toString.call(t)}function w(t){var e,n;for(n in t)e=t[n],S(e)?this[n]=e:this["_"+n]=e;this._config=t,this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function k(t,e){var n,i=a({},t);for(n in e)r(e,n)&&(Y(t[n])&&Y(e[n])?(i[n]={},a(i[n],t[n]),a(i[n],e[n])):null!=e[n]?i[n]=e[n]:delete i[n]);return i}function T(t){null!=t&&this.set(t)}function b(t){return t?t.toLowerCase().replace("_","-"):t}function O(t){for(var e,n,i,s,r=0;r0;){if(i=W(s.slice(0,e).join("-")))return i;if(n&&n.length>=e&&p(s,n,!0)>=e-1)break;e--}r++}return null}function W(t){var e=null;if(!ii[t]&&"undefined"!=typeof module&&module&&module.exports)try{e=ni._abbr,require("./locale/"+t),x(e)}catch(n){}return ii[t]}function x(t,e){var n;return t&&(n=c(e)?P(t):U(t,e),n&&(ni=n)),ni._abbr}function U(t,e){return null!==e?(e.abbr=t,null!=ii[t]?(M("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale"),e=k(ii[t]._config,e)):null!=e.parentLocale&&(null!=ii[e.parentLocale]?e=k(ii[e.parentLocale]._config,e):M("parentLocaleUndefined","specified parentLocale is not defined yet")),ii[t]=new T(e),x(t),ii[t]):(delete ii[t],null)}function G(t,e){if(null!=e){var n;null!=ii[t]&&(e=k(ii[t]._config,e)),n=new T(e),n.parentLocale=ii[t],ii[t]=n,x(t)}else null!=ii[t]&&(null!=ii[t].parentLocale?ii[t]=ii[t].parentLocale:null!=ii[t]&&delete ii[t]);return ii[t]}function P(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return ni;if(!n(t)){if(e=W(t))return e;t=[t]}return O(t)}function C(){return Object.keys(ii)}function F(t,e){var n=t.toLowerCase();si[n]=si[n+"s"]=si[e]=t}function H(t){return"string"==typeof t?si[t]||si[t.toLowerCase()]:void 0}function L(t){var e,n,i={};for(n in t)r(t,n)&&(e=H(n),e&&(i[e]=t[n]));return i}function V(e,n){return function(i){return null!=i?(I(this,e,i),t.updateOffset(this,n),this):N(this,e)}}function N(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function I(t,e,n){t.isValid()&&t._d["set"+(t._isUTC?"UTC":"")+e](n)}function A(t,e){var n;if("object"==typeof t)for(n in t)this.set(n,t[n]);else if(t=H(t),S(this[t]))return this[t](e);return this}function R(t,e,n){var i=""+Math.abs(t),s=e-i.length,r=t>=0;return(r?n?"+":"":"-")+Math.pow(10,Math.max(0,s)).toString().substr(1)+i}function E(t,e,n,i){var s=i;"string"==typeof i&&(s=function(){return this[i]()}),t&&(ui[t]=s),e&&(ui[e[0]]=function(){return R(s.apply(this,arguments),e[1],e[2])}),n&&(ui[n]=function(){return this.localeData().ordinal(s.apply(this,arguments),t)})}function j(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function z(t){var e,n,i=t.match(ri);for(e=0,n=i.length;n>e;e++)ui[i[e]]?i[e]=ui[i[e]]:i[e]=j(i[e]);return function(s){var r="";for(e=0;n>e;e++)r+=i[e]instanceof Function?i[e].call(s,t):i[e];return r}}function Z(t,e){return t.isValid()?(e=$(e,t.localeData()),oi[e]=oi[e]||z(e),oi[e](t)):t.localeData().invalidDate()}function $(t,e){function n(t){return e.longDateFormat(t)||t}var i=5;for(ai.lastIndex=0;i>=0&&ai.test(t);)t=t.replace(ai,n),ai.lastIndex=0,i-=1;return t}function q(t,e,n){Ti[t]=S(e)?e:function(t,i){return t&&n?n:e}}function J(t,e){return r(Ti,t)?Ti[t](e._strict,e._locale):new RegExp(B(t))}function B(t){return Q(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,i,s){return e||n||i||s}))}function Q(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function X(t,e){var n,i=e;for("string"==typeof t&&(t=[t]),"number"==typeof e&&(i=function(t,n){n[e]=g(t)}),n=0;ni;i++){if(s=o([2e3,i]),n&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp("^"+this.months(s,"").replace(".","")+"$","i"),this._shortMonthsParse[i]=new RegExp("^"+this.monthsShort(s,"").replace(".","")+"$","i")),n||this._monthsParse[i]||(r="^"+this.months(s,"")+"|^"+this.monthsShort(s,""),this._monthsParse[i]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===e&&this._longMonthsParse[i].test(t))return i;if(n&&"MMM"===e&&this._shortMonthsParse[i].test(t))return i;if(!n&&this._monthsParse[i].test(t))return i}}function rt(t,e){var n;if(!t.isValid())return t;if("string"==typeof e)if(/^\d+$/.test(e))e=g(e);else if(e=t.localeData().monthsParse(e),"number"!=typeof e)return t;return n=Math.min(t.date(),et(t.year(),e)),t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,n),t}function at(e){return null!=e?(rt(this,e),t.updateOffset(this,!0),this):N(this,"Month")}function ot(){return et(this.year(),this.month())}function ut(t){return this._monthsParseExact?(r(this,"_monthsRegex")||lt.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex}function dt(t){return this._monthsParseExact?(r(this,"_monthsRegex")||lt.call(this),t?this._monthsStrictRegex:this._monthsRegex):this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex}function lt(){function t(t,e){return e.length-t.length}var e,n,i=[],s=[],r=[];for(e=0;12>e;e++)n=o([2e3,e]),i.push(this.monthsShort(n,"")),s.push(this.months(n,"")),r.push(this.months(n,"")),r.push(this.monthsShort(n,""));for(i.sort(t),s.sort(t),r.sort(t),e=0;12>e;e++)i[e]=Q(i[e]),s[e]=Q(s[e]),r[e]=Q(r[e]);this._monthsRegex=new RegExp("^("+r.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+s.join("|")+")$","i"),this._monthsShortStrictRegex=new RegExp("^("+i.join("|")+")$","i")}function ht(t){var e,n=t._a;return n&&-2===d(t).overflow&&(e=n[Wi]<0||n[Wi]>11?Wi:n[xi]<1||n[xi]>et(n[Oi],n[Wi])?xi:n[Ui]<0||n[Ui]>24||24===n[Ui]&&(0!==n[Gi]||0!==n[Pi]||0!==n[Ci])?Ui:n[Gi]<0||n[Gi]>59?Gi:n[Pi]<0||n[Pi]>59?Pi:n[Ci]<0||n[Ci]>999?Ci:-1,d(t)._overflowDayOfYear&&(Oi>e||e>xi)&&(e=xi),d(t)._overflowWeeks&&-1===e&&(e=Fi),d(t)._overflowWeekday&&-1===e&&(e=Hi),d(t).overflow=e),t}function ct(t){var e,n,i,s,r,a,o=t._i,u=Ri.exec(o)||Ei.exec(o);if(u){for(d(t).iso=!0,e=0,n=zi.length;n>e;e++)if(zi[e][1].exec(u[1])){s=zi[e][0],i=zi[e][2]!==!1;break}if(null==s)return void(t._isValid=!1);if(u[3]){for(e=0,n=Zi.length;n>e;e++)if(Zi[e][1].exec(u[3])){r=(u[2]||" ")+Zi[e][0];break}if(null==r)return void(t._isValid=!1)}if(!i&&null!=r)return void(t._isValid=!1);if(u[4]){if(!ji.exec(u[4]))return void(t._isValid=!1);a="Z"}t._f=s+(r||"")+(a||""),bt(t)}else t._isValid=!1}function ft(e){var n=$i.exec(e._i);return null!==n?void(e._d=new Date(+n[1])):(ct(e),void(e._isValid===!1&&(delete e._isValid,t.createFromInputFallback(e))))}function mt(t,e,n,i,s,r,a){var o=new Date(t,e,n,i,s,r,a);return 100>t&&t>=0&&isFinite(o.getFullYear())&&o.setFullYear(t),o}function _t(t){var e=new Date(Date.UTC.apply(null,arguments));return 100>t&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function yt(t){return gt(t)?366:365}function gt(t){return t%4===0&&t%100!==0||t%400===0}function pt(){return gt(this.year())}function vt(t,e,n){var i=7+e-n,s=(7+_t(t,0,i).getUTCDay()-e)%7;return-s+i-1}function Dt(t,e,n,i,s){var r,a,o=(7+n-i)%7,u=vt(t,i,s),d=1+7*(e-1)+o+u;return 0>=d?(r=t-1,a=yt(r)+d):d>yt(t)?(r=t+1,a=d-yt(t)):(r=t,a=d),{year:r,dayOfYear:a}}function Mt(t,e,n){var i,s,r=vt(t.year(),e,n),a=Math.floor((t.dayOfYear()-r-1)/7)+1;return 1>a?(s=t.year()-1,i=a+St(s,e,n)):a>St(t.year(),e,n)?(i=a-St(t.year(),e,n),s=t.year()+1):(s=t.year(),i=a),{week:i,year:s}}function St(t,e,n){var i=vt(t,e,n),s=vt(t+1,e,n);return(yt(t)-i+s)/7}function Yt(t,e,n){return null!=t?t:null!=e?e:n}function wt(e){var n=new Date(t.now());return e._useUTC?[n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate()]:[n.getFullYear(),n.getMonth(),n.getDate()]}function kt(t){var e,n,i,s,r=[];if(!t._d){for(i=wt(t),t._w&&null==t._a[xi]&&null==t._a[Wi]&&Tt(t),t._dayOfYear&&(s=Yt(t._a[Oi],i[Oi]),t._dayOfYear>yt(s)&&(d(t)._overflowDayOfYear=!0),n=_t(s,0,t._dayOfYear),t._a[Wi]=n.getUTCMonth(),t._a[xi]=n.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=r[e]=i[e];for(;7>e;e++)t._a[e]=r[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[Ui]&&0===t._a[Gi]&&0===t._a[Pi]&&0===t._a[Ci]&&(t._nextDay=!0,t._a[Ui]=0),t._d=(t._useUTC?_t:mt).apply(null,r),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[Ui]=24)}}function Tt(t){var e,n,i,s,r,a,o,u;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(r=1,a=4,n=Yt(e.GG,t._a[Oi],Mt(Ft(),1,4).year),i=Yt(e.W,1),s=Yt(e.E,1),(1>s||s>7)&&(u=!0)):(r=t._locale._week.dow,a=t._locale._week.doy,n=Yt(e.gg,t._a[Oi],Mt(Ft(),r,a).year),i=Yt(e.w,1),null!=e.d?(s=e.d,(0>s||s>6)&&(u=!0)):null!=e.e?(s=e.e+r,(e.e<0||e.e>6)&&(u=!0)):s=r),1>i||i>St(n,r,a)?d(t)._overflowWeeks=!0:null!=u?d(t)._overflowWeekday=!0:(o=Dt(n,i,s,r,a),t._a[Oi]=o.year,t._dayOfYear=o.dayOfYear)}function bt(e){if(e._f===t.ISO_8601)return void ct(e);e._a=[],d(e).empty=!0;var n,i,s,r,a,o=""+e._i,u=o.length,l=0;for(s=$(e._f,e._locale).match(ri)||[],n=0;n0&&d(e).unusedInput.push(a),o=o.slice(o.indexOf(i)+i.length),l+=i.length),ui[r]?(i?d(e).empty=!1:d(e).unusedTokens.push(r),tt(r,i,e)):e._strict&&!i&&d(e).unusedTokens.push(r);d(e).charsLeftOver=u-l,o.length>0&&d(e).unusedInput.push(o),d(e).bigHour===!0&&e._a[Ui]<=12&&e._a[Ui]>0&&(d(e).bigHour=void 0),e._a[Ui]=Ot(e._locale,e._a[Ui],e._meridiem),kt(e),ht(e)}function Ot(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?(i=t.isPM(n),i&&12>e&&(e+=12),i||12!==e||(e=0),e):e}function Wt(t){var e,n,i,s,r;if(0===t._f.length)return d(t).invalidFormat=!0,void(t._d=new Date(NaN));for(s=0;sr)&&(i=r,n=e));a(t,n||e)}function xt(t){if(!t._d){var e=L(t._i);t._a=s([e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],function(t){return t&&parseInt(t,10)}),kt(t)}}function Ut(t){var e=new m(ht(Gt(t)));return e._nextDay&&(e.add(1,"d"),e._nextDay=void 0),e}function Gt(t){var e=t._i,s=t._f;return t._locale=t._locale||P(t._l),null===e||void 0===s&&""===e?h({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),_(e)?new m(ht(e)):(n(s)?Wt(t):s?bt(t):i(e)?t._d=e:Pt(t),l(t)||(t._d=null),t))}function Pt(e){var r=e._i;void 0===r?e._d=new Date(t.now()):i(r)?e._d=new Date(+r):"string"==typeof r?ft(e):n(r)?(e._a=s(r.slice(0),function(t){return parseInt(t,10)}),kt(e)):"object"==typeof r?xt(e):"number"==typeof r?e._d=new Date(r):t.createFromInputFallback(e)}function Ct(t,e,n,i,s){var r={};return"boolean"==typeof n&&(i=n,n=void 0),r._isAMomentObject=!0,r._useUTC=r._isUTC=s,r._l=n,r._i=t,r._f=e,r._strict=i,Ut(r)}function Ft(t,e,n,i){return Ct(t,e,n,i,!1)}function Ht(t,e){var i,s;if(1===e.length&&n(e[0])&&(e=e[0]),!e.length)return Ft();for(i=e[0],s=1;st&&(t=-t,n="-"),n+R(~~(t/60),2)+e+R(~~t%60,2)})}function Rt(t,e){var n=(e||"").match(t)||[],i=n[n.length-1]||[],s=(i+"").match(Xi)||["-",0,0],r=+(60*s[1])+g(s[2]);return"+"===s[0]?r:-r}function Et(e,n){var s,r;return n._isUTC?(s=n.clone(),r=(_(e)||i(e)?+e:+Ft(e))-+s,s._d.setTime(+s._d+r),t.updateOffset(s,!1),s):Ft(e).local()}function jt(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}function zt(e,n){var i,s=this._offset||0;return this.isValid()?null!=e?("string"==typeof e?e=Rt(Yi,e):Math.abs(e)<16&&(e=60*e),!this._isUTC&&n&&(i=jt(this)),this._offset=e,this._isUTC=!0,null!=i&&this.add(i,"m"),s!==e&&(!n||this._changeInProgress?ue(this,ne(e-s,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,t.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?s:jt(this):null!=e?this:NaN}function Zt(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}function $t(t){return this.utcOffset(0,t)}function qt(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(jt(this),"m")),this}function Jt(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(Rt(Si,this._i)),this}function Bt(t){return this.isValid()?(t=t?Ft(t).utcOffset():0,(this.utcOffset()-t)%60===0):!1}function Qt(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Xt(){if(!c(this._isDSTShifted))return this._isDSTShifted;var t={};if(f(t,this),t=Gt(t),t._a){var e=t._isUTC?o(t._a):Ft(t._a);this._isDSTShifted=this.isValid()&&p(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function Kt(){return this.isValid()?!this._isUTC:!1}function te(){return this.isValid()?this._isUTC:!1}function ee(){return this.isValid()?this._isUTC&&0===this._offset:!1}function ne(t,e){var n,i,s,a=t,o=null;return It(t)?a={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(a={},e?a[e]=t:a.milliseconds=t):(o=Ki.exec(t))?(n="-"===o[1]?-1:1,a={y:0,d:g(o[xi])*n,h:g(o[Ui])*n,m:g(o[Gi])*n,s:g(o[Pi])*n,ms:g(o[Ci])*n}):(o=ts.exec(t))?(n="-"===o[1]?-1:1,a={y:ie(o[2],n),M:ie(o[3],n),w:ie(o[4],n),d:ie(o[5],n),h:ie(o[6],n),m:ie(o[7],n),s:ie(o[8],n)}):null==a?a={}:"object"==typeof a&&("from"in a||"to"in a)&&(s=re(Ft(a.from),Ft(a.to)),a={},a.ms=s.milliseconds,a.M=s.months),i=new Nt(a),It(t)&&r(t,"_locale")&&(i._locale=t._locale),i}function ie(t,e){var n=t&&parseFloat(t.replace(",","."));return(isNaN(n)?0:n)*e}function se(t,e){var n={milliseconds:0,months:0};return n.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(n.months,"M").isAfter(e)&&--n.months,n.milliseconds=+e-+t.clone().add(n.months,"M"),n}function re(t,e){var n;return t.isValid()&&e.isValid()?(e=Et(e,t),t.isBefore(e)?n=se(t,e):(n=se(e,t),n.milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function ae(t){return 0>t?-1*Math.round(-1*t):Math.round(t)}function oe(t,e){return function(n,i){var s,r;return null===i||isNaN(+i)||(M(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period)."),r=n,n=i,i=r),n="string"==typeof n?+n:n,s=ne(n,i),ue(this,s,t),this}}function ue(e,n,i,s){var r=n._milliseconds,a=ae(n._days),o=ae(n._months);e.isValid()&&(s=null==s?!0:s,r&&e._d.setTime(+e._d+r*i),a&&I(e,"Date",N(e,"Date")+a*i),o&&rt(e,N(e,"Month")+o*i),s&&t.updateOffset(e,a||o))}function de(t,e){var n=t||Ft(),i=Et(n,this).startOf("day"),s=this.diff(i,"days",!0),r=-6>s?"sameElse":-1>s?"lastWeek":0>s?"lastDay":1>s?"sameDay":2>s?"nextDay":7>s?"nextWeek":"sameElse",a=e&&(S(e[r])?e[r]():e[r]);return this.format(a||this.localeData().calendar(r,this,Ft(n)))}function le(){return new m(this)}function he(t,e){var n=_(t)?t:Ft(t);return this.isValid()&&n.isValid()?(e=H(c(e)?"millisecond":e),"millisecond"===e?+this>+n:+n<+this.clone().startOf(e)):!1}function ce(t,e){var n=_(t)?t:Ft(t);return this.isValid()&&n.isValid()?(e=H(c(e)?"millisecond":e),"millisecond"===e?+n>+this:+this.clone().endOf(e)<+n):!1}function fe(t,e,n){return this.isAfter(t,n)&&this.isBefore(e,n)}function me(t,e){var n,i=_(t)?t:Ft(t);return this.isValid()&&i.isValid()?(e=H(e||"millisecond"),"millisecond"===e?+this===+i:(n=+i,+this.clone().startOf(e)<=n&&n<=+this.clone().endOf(e))):!1}function _e(t,e){return this.isSame(t,e)||this.isAfter(t,e)}function ye(t,e){return this.isSame(t,e)||this.isBefore(t,e)}function ge(t,e,n){var i,s,r,a;return this.isValid()?(i=Et(t,this),i.isValid()?(s=6e4*(i.utcOffset()-this.utcOffset()),e=H(e),"year"===e||"month"===e||"quarter"===e?(a=pe(this,i),"quarter"===e?a/=3:"year"===e&&(a/=12)):(r=this-i,a="second"===e?r/1e3:"minute"===e?r/6e4:"hour"===e?r/36e5:"day"===e?(r-s)/864e5:"week"===e?(r-s)/6048e5:r),n?a:y(a)):NaN):NaN}function pe(t,e){var n,i,s=12*(e.year()-t.year())+(e.month()-t.month()),r=t.clone().add(s,"months");return 0>e-r?(n=t.clone().add(s-1,"months"),i=(e-r)/(r-n)):(n=t.clone().add(s+1,"months"),i=(e-r)/(n-r)),-(s+i)}function ve(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function De(){var t=this.clone().utc();return 0r&&(e=r),Ze.call(this,t,e,n,i,s))}function Ze(t,e,n,i,s){var r=Dt(t,e,n,i,s),a=_t(r.year,0,r.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}function $e(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function qe(t){return Mt(t,this._week.dow,this._week.doy).week}function Je(){return this._week.dow}function Be(){return this._week.doy}function Qe(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function Xe(t){var e=Mt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function Ke(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function tn(t,e){return n(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]}function en(t){return this._weekdaysShort[t.day()]}function nn(t){return this._weekdaysMin[t.day()]}function sn(t,e,n){var i,s,r;for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;7>i;i++){if(s=Ft([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(s,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(s,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(s,"").replace(".",".?")+"$","i")),this._weekdaysParse[i]||(r="^"+this.weekdays(s,"")+"|^"+this.weekdaysShort(s,"")+"|^"+this.weekdaysMin(s,""),this._weekdaysParse[i]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}}function rn(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=Ke(t,this.localeData()),this.add(t-e,"d")):e}function an(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function on(t){return this.isValid()?null==t?this.day()||7:this.day(this.day()%7?t:t-7):null!=t?this:NaN}function un(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function dn(){return this.hours()%12||12}function ln(t,e){E(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function hn(t,e){return e._meridiemParse}function cn(t){return"p"===(t+"").toLowerCase().charAt(0)}function fn(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"}function mn(t,e){e[Ci]=g(1e3*("0."+t))}function _n(){return this._isUTC?"UTC":""}function yn(){return this._isUTC?"Coordinated Universal Time":""}function gn(t){return Ft(1e3*t)}function pn(){return Ft.apply(null,arguments).parseZone()}function vn(t,e,n){var i=this._calendar[t];return S(i)?i.call(e,n):i}function Dn(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])}function Mn(){return this._invalidDate}function Sn(t){return this._ordinal.replace("%d",t)}function Yn(t){return t}function wn(t,e,n,i){var s=this._relativeTime[n];return S(s)?s(t,e,n,i):s.replace(/%d/i,t)}function kn(t,e){var n=this._relativeTime[t>0?"future":"past"];return S(n)?n(e):n.replace(/%s/i,e)}function Tn(t,e,n,i){var s=P(),r=o().set(i,e);return s[n](r,t)}function bn(t,e,n,i,s){if("number"==typeof t&&(e=t,t=void 0),t=t||"",null!=e)return Tn(t,e,n,s);var r,a=[];for(r=0;i>r;r++)a[r]=Tn(t,r,n,s);return a}function On(t,e){return bn(t,e,"months",12,"month")}function Wn(t,e){return bn(t,e,"monthsShort",12,"month")}function xn(t,e){return bn(t,e,"weekdays",7,"day")}function Un(t,e){return bn(t,e,"weekdaysShort",7,"day")}function Gn(t,e){return bn(t,e,"weekdaysMin",7,"day")}function Pn(){var t=this._data;return this._milliseconds=ws(this._milliseconds),this._days=ws(this._days),this._months=ws(this._months),t.milliseconds=ws(t.milliseconds),t.seconds=ws(t.seconds),t.minutes=ws(t.minutes),t.hours=ws(t.hours),t.months=ws(t.months),t.years=ws(t.years),this}function Cn(t,e,n,i){var s=ne(e,n);return t._milliseconds+=i*s._milliseconds,t._days+=i*s._days,t._months+=i*s._months,t._bubble()}function Fn(t,e){return Cn(this,t,e,1)}function Hn(t,e){return Cn(this,t,e,-1)}function Ln(t){return 0>t?Math.floor(t):Math.ceil(t)}function Vn(){var t,e,n,i,s,r=this._milliseconds,a=this._days,o=this._months,u=this._data;return r>=0&&a>=0&&o>=0||0>=r&&0>=a&&0>=o||(r+=864e5*Ln(In(o)+a),a=0,o=0),u.milliseconds=r%1e3,t=y(r/1e3),u.seconds=t%60,e=y(t/60),u.minutes=e%60,n=y(e/60),u.hours=n%24,a+=y(n/24),s=y(Nn(a)),o+=s,a-=Ln(In(s)),i=y(o/12),o%=12,u.days=a,u.months=o,u.years=i,this}function Nn(t){return 4800*t/146097}function In(t){return 146097*t/4800}function An(t){var e,n,i=this._milliseconds;if(t=H(t),"month"===t||"year"===t)return e=this._days+i/864e5,n=this._months+Nn(e),"month"===t?n:n/12;switch(e=this._days+Math.round(In(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}}function Rn(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*g(this._months/12)}function En(t){return function(){return this.as(t)}}function jn(t){return t=H(t),this[t+"s"]()}function zn(t){return function(){return this._data[t]}}function Zn(){return y(this.days()/7)}function $n(t,e,n,i,s){return s.relativeTime(e||1,!!n,t,i)}function qn(t,e,n){var i=ne(t).abs(),s=Is(i.as("s")),r=Is(i.as("m")),a=Is(i.as("h")),o=Is(i.as("d")),u=Is(i.as("M")),d=Is(i.as("y")),l=s=r&&["m"]||r=a&&["h"]||a=o&&["d"]||o=u&&["M"]||u=d&&["y"]||["yy",d];return l[2]=e,l[3]=+t>0,l[4]=n,$n.apply(null,l)}function Jn(t,e){return void 0===As[t]?!1:void 0===e?As[t]:(As[t]=e,!0)}function Bn(t){var e=this.localeData(),n=qn(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)}function Qn(){var t,e,n,i=Rs(this._milliseconds)/1e3,s=Rs(this._days),r=Rs(this._months);t=y(i/60),e=y(t/60),i%=60,t%=60,n=y(r/12),r%=12;var a=n,o=r,u=s,d=e,l=t,h=i,c=this.asSeconds();return c?(0>c?"-":"")+"P"+(a?a+"Y":"")+(o?o+"M":"")+(u?u+"D":"")+(d||l||h?"T":"")+(d?d+"H":"")+(l?l+"M":"")+(h?h+"S":""):"P0D"}var Xn,Kn=t.momentProperties=[],ti=!1,ei={};t.suppressDeprecationWarnings=!1;var ni,ii={},si={},ri=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,ai=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,oi={},ui={},di=/\d/,li=/\d\d/,hi=/\d{3}/,ci=/\d{4}/,fi=/[+-]?\d{6}/,mi=/\d\d?/,_i=/\d\d\d\d?/,yi=/\d\d\d\d\d\d?/,gi=/\d{1,3}/,pi=/\d{1,4}/,vi=/[+-]?\d{1,6}/,Di=/\d+/,Mi=/[+-]?\d+/,Si=/Z|[+-]\d\d:?\d\d/gi,Yi=/Z|[+-]\d\d(?::?\d\d)?/gi,wi=/[+-]?\d+(\.\d{1,3})?/,ki=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Ti={},bi={},Oi=0,Wi=1,xi=2,Ui=3,Gi=4,Pi=5,Ci=6,Fi=7,Hi=8;E("M",["MM",2],"Mo",function(){return this.month()+1}),E("MMM",0,0,function(t){return this.localeData().monthsShort(this,t)}),E("MMMM",0,0,function(t){return this.localeData().months(this,t)}),F("month","M"),q("M",mi),q("MM",mi,li),q("MMM",function(t,e){return e.monthsShortRegex(t)}),q("MMMM",function(t,e){return e.monthsRegex(t)}),X(["M","MM"],function(t,e){e[Wi]=g(t)-1}),X(["MMM","MMMM"],function(t,e,n,i){var s=n._locale.monthsParse(t,i,n._strict);null!=s?e[Wi]=s:d(n).invalidMonth=t});var Li=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/,Vi="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),Ni="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),Ii=ki,Ai=ki,Ri=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,Ei=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,ji=/Z|[+-]\d\d(?::?\d\d)?/,zi=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Zi=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],$i=/^\/?Date\((\-?\d+)/i;t.createFromInputFallback=D("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))}),E("Y",0,0,function(){var t=this.year();return 9999>=t?""+t:"+"+t}),E(0,["YY",2],0,function(){return this.year()%100}),E(0,["YYYY",4],0,"year"),E(0,["YYYYY",5],0,"year"),E(0,["YYYYYY",6,!0],0,"year"),F("year","y"),q("Y",Mi),q("YY",mi,li),q("YYYY",pi,ci),q("YYYYY",vi,fi),q("YYYYYY",vi,fi),X(["YYYYY","YYYYYY"],Oi),X("YYYY",function(e,n){n[Oi]=2===e.length?t.parseTwoDigitYear(e):g(e);}),X("YY",function(e,n){n[Oi]=t.parseTwoDigitYear(e)}),X("Y",function(t,e){e[Oi]=parseInt(t,10)}),t.parseTwoDigitYear=function(t){return g(t)+(g(t)>68?1900:2e3)};var qi=V("FullYear",!1);t.ISO_8601=function(){};var Ji=D("moment().min is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(){var t=Ft.apply(null,arguments);return this.isValid()&&t.isValid()?this>t?this:t:h()}),Bi=D("moment().max is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(){var t=Ft.apply(null,arguments);return this.isValid()&&t.isValid()?t>this?this:t:h()}),Qi=function(){return Date.now?Date.now():+new Date};At("Z",":"),At("ZZ",""),q("Z",Yi),q("ZZ",Yi),X(["Z","ZZ"],function(t,e,n){n._useUTC=!0,n._tzm=Rt(Yi,t)});var Xi=/([\+\-]|\d\d)/gi;t.updateOffset=function(){};var Ki=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?\d*)?$/,ts=/^(-)?P(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)W)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?$/;ne.fn=Nt.prototype;var es=oe(1,"add"),ns=oe(-1,"subtract");t.defaultFormat="YYYY-MM-DDTHH:mm:ssZ";var is=D("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});E(0,["gg",2],0,function(){return this.weekYear()%100}),E(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Ie("gggg","weekYear"),Ie("ggggg","weekYear"),Ie("GGGG","isoWeekYear"),Ie("GGGGG","isoWeekYear"),F("weekYear","gg"),F("isoWeekYear","GG"),q("G",Mi),q("g",Mi),q("GG",mi,li),q("gg",mi,li),q("GGGG",pi,ci),q("gggg",pi,ci),q("GGGGG",vi,fi),q("ggggg",vi,fi),K(["gggg","ggggg","GGGG","GGGGG"],function(t,e,n,i){e[i.substr(0,2)]=g(t)}),K(["gg","GG"],function(e,n,i,s){n[s]=t.parseTwoDigitYear(e)}),E("Q",0,"Qo","quarter"),F("quarter","Q"),q("Q",di),X("Q",function(t,e){e[Wi]=3*(g(t)-1)}),E("w",["ww",2],"wo","week"),E("W",["WW",2],"Wo","isoWeek"),F("week","w"),F("isoWeek","W"),q("w",mi),q("ww",mi,li),q("W",mi),q("WW",mi,li),K(["w","ww","W","WW"],function(t,e,n,i){e[i.substr(0,1)]=g(t)});var ss={dow:0,doy:6};E("D",["DD",2],"Do","date"),F("date","D"),q("D",mi),q("DD",mi,li),q("Do",function(t,e){return t?e._ordinalParse:e._ordinalParseLenient}),X(["D","DD"],xi),X("Do",function(t,e){e[xi]=g(t.match(mi)[0],10)});var rs=V("Date",!0);E("d",0,"do","day"),E("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),E("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),E("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),E("e",0,0,"weekday"),E("E",0,0,"isoWeekday"),F("day","d"),F("weekday","e"),F("isoWeekday","E"),q("d",mi),q("e",mi),q("E",mi),q("dd",ki),q("ddd",ki),q("dddd",ki),K(["dd","ddd","dddd"],function(t,e,n,i){var s=n._locale.weekdaysParse(t,i,n._strict);null!=s?e.d=s:d(n).invalidWeekday=t}),K(["d","e","E"],function(t,e,n,i){e[i]=g(t)});var as="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),os="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),us="Su_Mo_Tu_We_Th_Fr_Sa".split("_");E("DDD",["DDDD",3],"DDDo","dayOfYear"),F("dayOfYear","DDD"),q("DDD",gi),q("DDDD",hi),X(["DDD","DDDD"],function(t,e,n){n._dayOfYear=g(t)}),E("H",["HH",2],0,"hour"),E("h",["hh",2],0,dn),E("hmm",0,0,function(){return""+dn.apply(this)+R(this.minutes(),2)}),E("hmmss",0,0,function(){return""+dn.apply(this)+R(this.minutes(),2)+R(this.seconds(),2)}),E("Hmm",0,0,function(){return""+this.hours()+R(this.minutes(),2)}),E("Hmmss",0,0,function(){return""+this.hours()+R(this.minutes(),2)+R(this.seconds(),2)}),ln("a",!0),ln("A",!1),F("hour","h"),q("a",hn),q("A",hn),q("H",mi),q("h",mi),q("HH",mi,li),q("hh",mi,li),q("hmm",_i),q("hmmss",yi),q("Hmm",_i),q("Hmmss",yi),X(["H","HH"],Ui),X(["a","A"],function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t}),X(["h","hh"],function(t,e,n){e[Ui]=g(t),d(n).bigHour=!0}),X("hmm",function(t,e,n){var i=t.length-2;e[Ui]=g(t.substr(0,i)),e[Gi]=g(t.substr(i)),d(n).bigHour=!0}),X("hmmss",function(t,e,n){var i=t.length-4,s=t.length-2;e[Ui]=g(t.substr(0,i)),e[Gi]=g(t.substr(i,2)),e[Pi]=g(t.substr(s)),d(n).bigHour=!0}),X("Hmm",function(t,e,n){var i=t.length-2;e[Ui]=g(t.substr(0,i)),e[Gi]=g(t.substr(i))}),X("Hmmss",function(t,e,n){var i=t.length-4,s=t.length-2;e[Ui]=g(t.substr(0,i)),e[Gi]=g(t.substr(i,2)),e[Pi]=g(t.substr(s))});var ds=/[ap]\.?m?\.?/i,ls=V("Hours",!0);E("m",["mm",2],0,"minute"),F("minute","m"),q("m",mi),q("mm",mi,li),X(["m","mm"],Gi);var hs=V("Minutes",!1);E("s",["ss",2],0,"second"),F("second","s"),q("s",mi),q("ss",mi,li),X(["s","ss"],Pi);var cs=V("Seconds",!1);E("S",0,0,function(){return~~(this.millisecond()/100)}),E(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),E(0,["SSS",3],0,"millisecond"),E(0,["SSSS",4],0,function(){return 10*this.millisecond()}),E(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),E(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),E(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),E(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),E(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),F("millisecond","ms"),q("S",gi,di),q("SS",gi,li),q("SSS",gi,hi);var fs;for(fs="SSSS";fs.length<=9;fs+="S")q(fs,Di);for(fs="S";fs.length<=9;fs+="S")X(fs,mn);var ms=V("Milliseconds",!1);E("z",0,0,"zoneAbbr"),E("zz",0,0,"zoneName");var _s=m.prototype;_s.add=es,_s.calendar=de,_s.clone=le,_s.diff=ge,_s.endOf=We,_s.format=Me,_s.from=Se,_s.fromNow=Ye,_s.to=we,_s.toNow=ke,_s.get=A,_s.invalidAt=Ve,_s.isAfter=he,_s.isBefore=ce,_s.isBetween=fe,_s.isSame=me,_s.isSameOrAfter=_e,_s.isSameOrBefore=ye,_s.isValid=He,_s.lang=is,_s.locale=Te,_s.localeData=be,_s.max=Bi,_s.min=Ji,_s.parsingFlags=Le,_s.set=A,_s.startOf=Oe,_s.subtract=ns,_s.toArray=Pe,_s.toObject=Ce,_s.toDate=Ge,_s.toISOString=De,_s.toJSON=Fe,_s.toString=ve,_s.unix=Ue,_s.valueOf=xe,_s.creationData=Ne,_s.year=qi,_s.isLeapYear=pt,_s.weekYear=Ae,_s.isoWeekYear=Re,_s.quarter=_s.quarters=$e,_s.month=at,_s.daysInMonth=ot,_s.week=_s.weeks=Qe,_s.isoWeek=_s.isoWeeks=Xe,_s.weeksInYear=je,_s.isoWeeksInYear=Ee,_s.date=rs,_s.day=_s.days=rn,_s.weekday=an,_s.isoWeekday=on,_s.dayOfYear=un,_s.hour=_s.hours=ls,_s.minute=_s.minutes=hs,_s.second=_s.seconds=cs,_s.millisecond=_s.milliseconds=ms,_s.utcOffset=zt,_s.utc=$t,_s.local=qt,_s.parseZone=Jt,_s.hasAlignedHourOffset=Bt,_s.isDST=Qt,_s.isDSTShifted=Xt,_s.isLocal=Kt,_s.isUtcOffset=te,_s.isUtc=ee,_s.isUTC=ee,_s.zoneAbbr=_n,_s.zoneName=yn,_s.dates=D("dates accessor is deprecated. Use date instead.",rs),_s.months=D("months accessor is deprecated. Use month instead",at),_s.years=D("years accessor is deprecated. Use year instead",qi),_s.zone=D("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",Zt);var ys=_s,gs={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},ps={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},vs="Invalid date",Ds="%d",Ms=/\d{1,2}/,Ss={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Ys=T.prototype;Ys._calendar=gs,Ys.calendar=vn,Ys._longDateFormat=ps,Ys.longDateFormat=Dn,Ys._invalidDate=vs,Ys.invalidDate=Mn,Ys._ordinal=Ds,Ys.ordinal=Sn,Ys._ordinalParse=Ms,Ys.preparse=Yn,Ys.postformat=Yn,Ys._relativeTime=Ss,Ys.relativeTime=wn,Ys.pastFuture=kn,Ys.set=w,Ys.months=nt,Ys._months=Vi,Ys.monthsShort=it,Ys._monthsShort=Ni,Ys.monthsParse=st,Ys._monthsRegex=Ai,Ys.monthsRegex=dt,Ys._monthsShortRegex=Ii,Ys.monthsShortRegex=ut,Ys.week=qe,Ys._week=ss,Ys.firstDayOfYear=Be,Ys.firstDayOfWeek=Je,Ys.weekdays=tn,Ys._weekdays=as,Ys.weekdaysMin=nn,Ys._weekdaysMin=us,Ys.weekdaysShort=en,Ys._weekdaysShort=os,Ys.weekdaysParse=sn,Ys.isPM=cn,Ys._meridiemParse=ds,Ys.meridiem=fn,x("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,n=1===g(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n}}),t.lang=D("moment.lang is deprecated. Use moment.locale instead.",x),t.langData=D("moment.langData is deprecated. Use moment.localeData instead.",P);var ws=Math.abs,ks=En("ms"),Ts=En("s"),bs=En("m"),Os=En("h"),Ws=En("d"),xs=En("w"),Us=En("M"),Gs=En("y"),Ps=zn("milliseconds"),Cs=zn("seconds"),Fs=zn("minutes"),Hs=zn("hours"),Ls=zn("days"),Vs=zn("months"),Ns=zn("years"),Is=Math.round,As={s:45,m:45,h:22,d:26,M:11},Rs=Math.abs,Es=Nt.prototype;Es.abs=Pn,Es.add=Fn,Es.subtract=Hn,Es.as=An,Es.asMilliseconds=ks,Es.asSeconds=Ts,Es.asMinutes=bs,Es.asHours=Os,Es.asDays=Ws,Es.asWeeks=xs,Es.asMonths=Us,Es.asYears=Gs,Es.valueOf=Rn,Es._bubble=Vn,Es.get=jn,Es.milliseconds=Ps,Es.seconds=Cs,Es.minutes=Fs,Es.hours=Hs,Es.days=Ls,Es.weeks=Zn,Es.months=Vs,Es.years=Ns,Es.humanize=Bn,Es.toISOString=Qn,Es.toString=Qn,Es.toJSON=Qn,Es.locale=Te,Es.localeData=be,Es.toIsoString=D("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Qn),Es.lang=is,E("X",0,0,"unix"),E("x",0,0,"valueOf"),q("x",Mi),q("X",wi),X("X",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),X("x",function(t,e,n){n._d=new Date(g(t))}),t.version="2.12.0",e(Ft),t.fn=ys,t.min=Lt,t.max=Vt,t.now=Qi,t.utc=o,t.unix=gn,t.months=On,t.isDate=i,t.locale=x,t.invalid=h,t.duration=ne,t.isMoment=_,t.weekdays=xn,t.parseZone=pn,t.localeData=P,t.isDuration=It,t.monthsShort=Wn,t.weekdaysMin=Gn,t.defineLocale=U,t.updateLocale=G,t.locales=C,t.weekdaysShort=Un,t.normalizeUnits=H,t.relativeTimeThreshold=Jn,t.prototype=ys;var js=t;return js});
+
+
+/**
+ * @module Slick
+ * @author Ken Wheeler
+ * @see http://kenwheeler.github.io/slick
+ * @version 1.6.0
+ */
+!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):"undefined"!=typeof exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){"use strict";var b=window.Slick||{};b=function(){function c(c,d){var f,e=this;e.defaults={accessibility:!0,adaptiveHeight:!1,appendArrows:a(c),appendDots:a(c),arrows:!0,asNavFor:null,prevArrow:'Previous ',nextArrow:'Next ',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(b,c){return a(' ').text(c+1)},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,infinite:!0,initialSlide:0,lazyLoad:"ondemand",mobileFirst:!1,pauseOnHover:!0,pauseOnFocus:!0,pauseOnDotsHover:!1,respondTo:"window",responsive:null,rows:1,rtl:!1,slide:"",slidesPerRow:1,slidesToShow:1,slidesToScroll:1,speed:500,swipe:!0,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,verticalSwiping:!1,waitForAnimate:!0,zIndex:1e3},e.initials={animating:!1,dragging:!1,autoPlayTimer:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,$dots:null,listWidth:null,listHeight:null,loadIndex:0,$nextArrow:null,$prevArrow:null,slideCount:null,slideWidth:null,$slideTrack:null,$slides:null,sliding:!1,slideOffset:0,swipeLeft:null,$list:null,touchObject:{},transformsEnabled:!1,unslicked:!1},a.extend(e,e.initials),e.activeBreakpoint=null,e.animType=null,e.animProp=null,e.breakpoints=[],e.breakpointSettings=[],e.cssTransitions=!1,e.focussed=!1,e.interrupted=!1,e.hidden="hidden",e.paused=!0,e.positionProp=null,e.respondTo=null,e.rowCount=1,e.shouldClick=!0,e.$slider=a(c),e.$slidesCache=null,e.transformType=null,e.transitionType=null,e.visibilityChange="visibilitychange",e.windowWidth=0,e.windowTimer=null,f=a(c).data("slick")||{},e.options=a.extend({},e.defaults,d,f),e.currentSlide=e.options.initialSlide,e.originalSettings=e.options,"undefined"!=typeof document.mozHidden?(e.hidden="mozHidden",e.visibilityChange="mozvisibilitychange"):"undefined"!=typeof document.webkitHidden&&(e.hidden="webkitHidden",e.visibilityChange="webkitvisibilitychange"),e.autoPlay=a.proxy(e.autoPlay,e),e.autoPlayClear=a.proxy(e.autoPlayClear,e),e.autoPlayIterator=a.proxy(e.autoPlayIterator,e),e.changeSlide=a.proxy(e.changeSlide,e),e.clickHandler=a.proxy(e.clickHandler,e),e.selectHandler=a.proxy(e.selectHandler,e),e.setPosition=a.proxy(e.setPosition,e),e.swipeHandler=a.proxy(e.swipeHandler,e),e.dragHandler=a.proxy(e.dragHandler,e),e.keyHandler=a.proxy(e.keyHandler,e),e.instanceUid=b++,e.htmlExpr=/^(?:\s*(<[\w\W]+>)[^>]*)$/,e.registerBreakpoints(),e.init(!0)}var b=0;return c}(),b.prototype.activateADA=function(){var a=this;a.$slideTrack.find(".slick-active").attr({"aria-hidden":"false"}).find("a, input, button, select").attr({tabindex:"0"})},b.prototype.addSlide=b.prototype.slickAdd=function(b,c,d){var e=this;if("boolean"==typeof c)d=c,c=null;else if(0>c||c>=e.slideCount)return!1;e.unload(),"number"==typeof c?0===c&&0===e.$slides.length?a(b).appendTo(e.$slideTrack):d?a(b).insertBefore(e.$slides.eq(c)):a(b).insertAfter(e.$slides.eq(c)):d===!0?a(b).prependTo(e.$slideTrack):a(b).appendTo(e.$slideTrack),e.$slides=e.$slideTrack.children(this.options.slide),e.$slideTrack.children(this.options.slide).detach(),e.$slideTrack.append(e.$slides),e.$slides.each(function(b,c){a(c).attr("data-slick-index",b)}),e.$slidesCache=e.$slides,e.reinit()},b.prototype.animateHeight=function(){var a=this;if(1===a.options.slidesToShow&&a.options.adaptiveHeight===!0&&a.options.vertical===!1){var b=a.$slides.eq(a.currentSlide).outerHeight(!0);a.$list.animate({height:b},a.options.speed)}},b.prototype.animateSlide=function(b,c){var d={},e=this;e.animateHeight(),e.options.rtl===!0&&e.options.vertical===!1&&(b=-b),e.transformsEnabled===!1?e.options.vertical===!1?e.$slideTrack.animate({left:b},e.options.speed,e.options.easing,c):e.$slideTrack.animate({top:b},e.options.speed,e.options.easing,c):e.cssTransitions===!1?(e.options.rtl===!0&&(e.currentLeft=-e.currentLeft),a({animStart:e.currentLeft}).animate({animStart:b},{duration:e.options.speed,easing:e.options.easing,step:function(a){a=Math.ceil(a),e.options.vertical===!1?(d[e.animType]="translate("+a+"px, 0px)",e.$slideTrack.css(d)):(d[e.animType]="translate(0px,"+a+"px)",e.$slideTrack.css(d))},complete:function(){c&&c.call()}})):(e.applyTransition(),b=Math.ceil(b),e.options.vertical===!1?d[e.animType]="translate3d("+b+"px, 0px, 0px)":d[e.animType]="translate3d(0px,"+b+"px, 0px)",e.$slideTrack.css(d),c&&setTimeout(function(){e.disableTransition(),c.call()},e.options.speed))},b.prototype.getNavTarget=function(){var b=this,c=b.options.asNavFor;return c&&null!==c&&(c=a(c).not(b.$slider)),c},b.prototype.asNavFor=function(b){var c=this,d=c.getNavTarget();null!==d&&"object"==typeof d&&d.each(function(){var c=a(this).slick("getSlick");c.unslicked||c.slideHandler(b,!0)})},b.prototype.applyTransition=function(a){var b=this,c={};b.options.fade===!1?c[b.transitionType]=b.transformType+" "+b.options.speed+"ms "+b.options.cssEase:c[b.transitionType]="opacity "+b.options.speed+"ms "+b.options.cssEase,b.options.fade===!1?b.$slideTrack.css(c):b.$slides.eq(a).css(c)},b.prototype.autoPlay=function(){var a=this;a.autoPlayClear(),a.slideCount>a.options.slidesToShow&&(a.autoPlayTimer=setInterval(a.autoPlayIterator,a.options.autoplaySpeed))},b.prototype.autoPlayClear=function(){var a=this;a.autoPlayTimer&&clearInterval(a.autoPlayTimer)},b.prototype.autoPlayIterator=function(){var a=this,b=a.currentSlide+a.options.slidesToScroll;a.paused||a.interrupted||a.focussed||(a.options.infinite===!1&&(1===a.direction&&a.currentSlide+1===a.slideCount-1?a.direction=0:0===a.direction&&(b=a.currentSlide-a.options.slidesToScroll,a.currentSlide-1===0&&(a.direction=1))),a.slideHandler(b))},b.prototype.buildArrows=function(){var b=this;b.options.arrows===!0&&(b.$prevArrow=a(b.options.prevArrow).addClass("slick-arrow"),b.$nextArrow=a(b.options.nextArrow).addClass("slick-arrow"),b.slideCount>b.options.slidesToShow?(b.$prevArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),b.$nextArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),b.htmlExpr.test(b.options.prevArrow)&&b.$prevArrow.prependTo(b.options.appendArrows),b.htmlExpr.test(b.options.nextArrow)&&b.$nextArrow.appendTo(b.options.appendArrows),b.options.infinite!==!0&&b.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true")):b.$prevArrow.add(b.$nextArrow).addClass("slick-hidden").attr({"aria-disabled":"true",tabindex:"-1"}))},b.prototype.buildDots=function(){var c,d,b=this;if(b.options.dots===!0&&b.slideCount>b.options.slidesToShow){for(b.$slider.addClass("slick-dotted"),d=a("").addClass(b.options.dotsClass),c=0;c<=b.getDotCount();c+=1)d.append(a(" ").append(b.options.customPaging.call(this,b,c)));b.$dots=d.appendTo(b.options.appendDots),b.$dots.find("li").first().addClass("slick-active").attr("aria-hidden","false")}},b.prototype.buildOut=function(){var b=this;b.$slides=b.$slider.children(b.options.slide+":not(.slick-cloned)").addClass("slick-slide"),b.slideCount=b.$slides.length,b.$slides.each(function(b,c){a(c).attr("data-slick-index",b).data("originalStyling",a(c).attr("style")||"")}),b.$slider.addClass("slick-slider"),b.$slideTrack=0===b.slideCount?a('
').appendTo(b.$slider):b.$slides.wrapAll('
').parent(),b.$list=b.$slideTrack.wrap('
').parent(),b.$slideTrack.css("opacity",0),(b.options.centerMode===!0||b.options.swipeToSlide===!0)&&(b.options.slidesToScroll=1),a("img[data-lazy]",b.$slider).not("[src]").addClass("slick-loading"),b.setupInfinite(),b.buildArrows(),b.buildDots(),b.updateDots(),b.setSlideClasses("number"==typeof b.currentSlide?b.currentSlide:0),b.options.draggable===!0&&b.$list.addClass("draggable")},b.prototype.buildRows=function(){var b,c,d,e,f,g,h,a=this;if(e=document.createDocumentFragment(),g=a.$slider.children(),a.options.rows>1){for(h=a.options.slidesPerRow*a.options.rows,f=Math.ceil(g.length/h),b=0;f>b;b++){var i=document.createElement("div");for(c=0;cd.breakpoints[e]&&(f=d.breakpoints[e]));null!==f?null!==d.activeBreakpoint?(f!==d.activeBreakpoint||c)&&(d.activeBreakpoint=f,"unslick"===d.breakpointSettings[f]?d.unslick(f):(d.options=a.extend({},d.originalSettings,d.breakpointSettings[f]),b===!0&&(d.currentSlide=d.options.initialSlide),d.refresh(b)),h=f):(d.activeBreakpoint=f,"unslick"===d.breakpointSettings[f]?d.unslick(f):(d.options=a.extend({},d.originalSettings,d.breakpointSettings[f]),b===!0&&(d.currentSlide=d.options.initialSlide),d.refresh(b)),h=f):null!==d.activeBreakpoint&&(d.activeBreakpoint=null,d.options=d.originalSettings,b===!0&&(d.currentSlide=d.options.initialSlide),d.refresh(b),h=f),b||h===!1||d.$slider.trigger("breakpoint",[d,h])}},b.prototype.changeSlide=function(b,c){var f,g,h,d=this,e=a(b.currentTarget);switch(e.is("a")&&b.preventDefault(),e.is("li")||(e=e.closest("li")),h=d.slideCount%d.options.slidesToScroll!==0,f=h?0:(d.slideCount-d.currentSlide)%d.options.slidesToScroll,b.data.message){case"previous":g=0===f?d.options.slidesToScroll:d.options.slidesToShow-f,d.slideCount>d.options.slidesToShow&&d.slideHandler(d.currentSlide-g,!1,c);break;case"next":g=0===f?d.options.slidesToScroll:f,d.slideCount>d.options.slidesToShow&&d.slideHandler(d.currentSlide+g,!1,c);break;case"index":var i=0===b.data.index?0:b.data.index||e.index()*d.options.slidesToScroll;d.slideHandler(d.checkNavigable(i),!1,c),e.children().trigger("focus");break;default:return}},b.prototype.checkNavigable=function(a){var c,d,b=this;if(c=b.getNavigableIndexes(),d=0,a>c[c.length-1])a=c[c.length-1];else for(var e in c){if(ab.options.slidesToShow&&(b.$prevArrow&&b.$prevArrow.off("click.slick",b.changeSlide),b.$nextArrow&&b.$nextArrow.off("click.slick",b.changeSlide)),b.$list.off("touchstart.slick mousedown.slick",b.swipeHandler),b.$list.off("touchmove.slick mousemove.slick",b.swipeHandler),b.$list.off("touchend.slick mouseup.slick",b.swipeHandler),b.$list.off("touchcancel.slick mouseleave.slick",b.swipeHandler),b.$list.off("click.slick",b.clickHandler),a(document).off(b.visibilityChange,b.visibility),b.cleanUpSlideEvents(),b.options.accessibility===!0&&b.$list.off("keydown.slick",b.keyHandler),b.options.focusOnSelect===!0&&a(b.$slideTrack).children().off("click.slick",b.selectHandler),a(window).off("orientationchange.slick.slick-"+b.instanceUid,b.orientationChange),a(window).off("resize.slick.slick-"+b.instanceUid,b.resize),a("[draggable!=true]",b.$slideTrack).off("dragstart",b.preventDefault),a(window).off("load.slick.slick-"+b.instanceUid,b.setPosition),a(document).off("ready.slick.slick-"+b.instanceUid,b.setPosition)},b.prototype.cleanUpSlideEvents=function(){var b=this;b.$list.off("mouseenter.slick",a.proxy(b.interrupt,b,!0)),b.$list.off("mouseleave.slick",a.proxy(b.interrupt,b,!1))},b.prototype.cleanUpRows=function(){var b,a=this;a.options.rows>1&&(b=a.$slides.children().children(),b.removeAttr("style"),a.$slider.empty().append(b))},b.prototype.clickHandler=function(a){var b=this;b.shouldClick===!1&&(a.stopImmediatePropagation(),a.stopPropagation(),a.preventDefault())},b.prototype.destroy=function(b){var c=this;c.autoPlayClear(),c.touchObject={},c.cleanUpEvents(),a(".slick-cloned",c.$slider).detach(),c.$dots&&c.$dots.remove(),c.$prevArrow&&c.$prevArrow.length&&(c.$prevArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),c.htmlExpr.test(c.options.prevArrow)&&c.$prevArrow.remove()),c.$nextArrow&&c.$nextArrow.length&&(c.$nextArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),c.htmlExpr.test(c.options.nextArrow)&&c.$nextArrow.remove()),c.$slides&&(c.$slides.removeClass("slick-slide slick-active slick-center slick-visible slick-current").removeAttr("aria-hidden").removeAttr("data-slick-index").each(function(){a(this).attr("style",a(this).data("originalStyling"))}),c.$slideTrack.children(this.options.slide).detach(),c.$slideTrack.detach(),c.$list.detach(),c.$slider.append(c.$slides)),c.cleanUpRows(),c.$slider.removeClass("slick-slider"),c.$slider.removeClass("slick-initialized"),c.$slider.removeClass("slick-dotted"),c.unslicked=!0,b||c.$slider.trigger("destroy",[c])},b.prototype.disableTransition=function(a){var b=this,c={};c[b.transitionType]="",b.options.fade===!1?b.$slideTrack.css(c):b.$slides.eq(a).css(c)},b.prototype.fadeSlide=function(a,b){var c=this;c.cssTransitions===!1?(c.$slides.eq(a).css({zIndex:c.options.zIndex}),c.$slides.eq(a).animate({opacity:1},c.options.speed,c.options.easing,b)):(c.applyTransition(a),c.$slides.eq(a).css({opacity:1,zIndex:c.options.zIndex}),b&&setTimeout(function(){c.disableTransition(a),b.call()},c.options.speed))},b.prototype.fadeSlideOut=function(a){var b=this;b.cssTransitions===!1?b.$slides.eq(a).animate({opacity:0,zIndex:b.options.zIndex-2},b.options.speed,b.options.easing):(b.applyTransition(a),b.$slides.eq(a).css({opacity:0,zIndex:b.options.zIndex-2}))},b.prototype.filterSlides=b.prototype.slickFilter=function(a){var b=this;null!==a&&(b.$slidesCache=b.$slides,b.unload(),b.$slideTrack.children(this.options.slide).detach(),b.$slidesCache.filter(a).appendTo(b.$slideTrack),b.reinit())},b.prototype.focusHandler=function(){var b=this;b.$slider.off("focus.slick blur.slick").on("focus.slick blur.slick","*:not(.slick-arrow)",function(c){c.stopImmediatePropagation();var d=a(this);setTimeout(function(){b.options.pauseOnFocus&&(b.focussed=d.is(":focus"),b.autoPlay())},0)})},b.prototype.getCurrent=b.prototype.slickCurrentSlide=function(){var a=this;return a.currentSlide},b.prototype.getDotCount=function(){var a=this,b=0,c=0,d=0;if(a.options.infinite===!0)for(;bb.options.slidesToShow&&(b.slideOffset=b.slideWidth*b.options.slidesToShow*-1,e=d*b.options.slidesToShow*-1),b.slideCount%b.options.slidesToScroll!==0&&a+b.options.slidesToScroll>b.slideCount&&b.slideCount>b.options.slidesToShow&&(a>b.slideCount?(b.slideOffset=(b.options.slidesToShow-(a-b.slideCount))*b.slideWidth*-1,e=(b.options.slidesToShow-(a-b.slideCount))*d*-1):(b.slideOffset=b.slideCount%b.options.slidesToScroll*b.slideWidth*-1,e=b.slideCount%b.options.slidesToScroll*d*-1))):a+b.options.slidesToShow>b.slideCount&&(b.slideOffset=(a+b.options.slidesToShow-b.slideCount)*b.slideWidth,e=(a+b.options.slidesToShow-b.slideCount)*d),b.slideCount<=b.options.slidesToShow&&(b.slideOffset=0,e=0),b.options.centerMode===!0&&b.options.infinite===!0?b.slideOffset+=b.slideWidth*Math.floor(b.options.slidesToShow/2)-b.slideWidth:b.options.centerMode===!0&&(b.slideOffset=0,b.slideOffset+=b.slideWidth*Math.floor(b.options.slidesToShow/2)),c=b.options.vertical===!1?a*b.slideWidth*-1+b.slideOffset:a*d*-1+e,b.options.variableWidth===!0&&(f=b.slideCount<=b.options.slidesToShow||b.options.infinite===!1?b.$slideTrack.children(".slick-slide").eq(a):b.$slideTrack.children(".slick-slide").eq(a+b.options.slidesToShow),c=b.options.rtl===!0?f[0]?-1*(b.$slideTrack.width()-f[0].offsetLeft-f.width()):0:f[0]?-1*f[0].offsetLeft:0,b.options.centerMode===!0&&(f=b.slideCount<=b.options.slidesToShow||b.options.infinite===!1?b.$slideTrack.children(".slick-slide").eq(a):b.$slideTrack.children(".slick-slide").eq(a+b.options.slidesToShow+1),c=b.options.rtl===!0?f[0]?-1*(b.$slideTrack.width()-f[0].offsetLeft-f.width()):0:f[0]?-1*f[0].offsetLeft:0,c+=(b.$list.width()-f.outerWidth())/2)),c},b.prototype.getOption=b.prototype.slickGetOption=function(a){var b=this;return b.options[a]},b.prototype.getNavigableIndexes=function(){var e,a=this,b=0,c=0,d=[];for(a.options.infinite===!1?e=a.slideCount:(b=-1*a.options.slidesToScroll,c=-1*a.options.slidesToScroll,e=2*a.slideCount);e>b;)d.push(b),b=c+a.options.slidesToScroll,c+=a.options.slidesToScroll<=a.options.slidesToShow?a.options.slidesToScroll:a.options.slidesToShow;return d},b.prototype.getSlick=function(){return this},b.prototype.getSlideCount=function(){var c,d,e,b=this;return e=b.options.centerMode===!0?b.slideWidth*Math.floor(b.options.slidesToShow/2):0,b.options.swipeToSlide===!0?(b.$slideTrack.find(".slick-slide").each(function(c,f){return f.offsetLeft-e+a(f).outerWidth()/2>-1*b.swipeLeft?(d=f,!1):void 0}),c=Math.abs(a(d).attr("data-slick-index")-b.currentSlide)||1):b.options.slidesToScroll},b.prototype.goTo=b.prototype.slickGoTo=function(a,b){var c=this;c.changeSlide({data:{message:"index",index:parseInt(a)}},b)},b.prototype.init=function(b){var c=this;a(c.$slider).hasClass("slick-initialized")||(a(c.$slider).addClass("slick-initialized"),c.buildRows(),c.buildOut(),c.setProps(),c.startLoad(),c.loadSlider(),c.initializeEvents(),c.updateArrows(),c.updateDots(),c.checkResponsive(!0),c.focusHandler()),b&&c.$slider.trigger("init",[c]),c.options.accessibility===!0&&c.initADA(),c.options.autoplay&&(c.paused=!1,c.autoPlay())},b.prototype.initADA=function(){var b=this;b.$slides.add(b.$slideTrack.find(".slick-cloned")).attr({"aria-hidden":"true",tabindex:"-1"}).find("a, input, button, select").attr({tabindex:"-1"}),b.$slideTrack.attr("role","listbox"),b.$slides.not(b.$slideTrack.find(".slick-cloned")).each(function(c){a(this).attr({role:"option","aria-describedby":"slick-slide"+b.instanceUid+c})}),null!==b.$dots&&b.$dots.attr("role","tablist").find("li").each(function(c){a(this).attr({role:"presentation","aria-selected":"false","aria-controls":"navigation"+b.instanceUid+c,id:"slick-slide"+b.instanceUid+c})}).first().attr("aria-selected","true").end().find("button").attr("role","button").end().closest("div").attr("role","toolbar"),b.activateADA()},b.prototype.initArrowEvents=function(){var a=this;a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&(a.$prevArrow.off("click.slick").on("click.slick",{message:"previous"},a.changeSlide),a.$nextArrow.off("click.slick").on("click.slick",{message:"next"},a.changeSlide))},b.prototype.initDotEvents=function(){var b=this;b.options.dots===!0&&b.slideCount>b.options.slidesToShow&&a("li",b.$dots).on("click.slick",{message:"index"},b.changeSlide),b.options.dots===!0&&b.options.pauseOnDotsHover===!0&&a("li",b.$dots).on("mouseenter.slick",a.proxy(b.interrupt,b,!0)).on("mouseleave.slick",a.proxy(b.interrupt,b,!1))},b.prototype.initSlideEvents=function(){var b=this;b.options.pauseOnHover&&(b.$list.on("mouseenter.slick",a.proxy(b.interrupt,b,!0)),b.$list.on("mouseleave.slick",a.proxy(b.interrupt,b,!1)))},b.prototype.initializeEvents=function(){var b=this;b.initArrowEvents(),b.initDotEvents(),b.initSlideEvents(),b.$list.on("touchstart.slick mousedown.slick",{action:"start"},b.swipeHandler),b.$list.on("touchmove.slick mousemove.slick",{action:"move"},b.swipeHandler),b.$list.on("touchend.slick mouseup.slick",{action:"end"},b.swipeHandler),b.$list.on("touchcancel.slick mouseleave.slick",{action:"end"},b.swipeHandler),b.$list.on("click.slick",b.clickHandler),a(document).on(b.visibilityChange,a.proxy(b.visibility,b)),b.options.accessibility===!0&&b.$list.on("keydown.slick",b.keyHandler),b.options.focusOnSelect===!0&&a(b.$slideTrack).children().on("click.slick",b.selectHandler),a(window).on("orientationchange.slick.slick-"+b.instanceUid,a.proxy(b.orientationChange,b)),a(window).on("resize.slick.slick-"+b.instanceUid,a.proxy(b.resize,b)),a("[draggable!=true]",b.$slideTrack).on("dragstart",b.preventDefault),a(window).on("load.slick.slick-"+b.instanceUid,b.setPosition),a(document).on("ready.slick.slick-"+b.instanceUid,b.setPosition)},b.prototype.initUI=function(){var a=this;a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&(a.$prevArrow.show(),a.$nextArrow.show()),a.options.dots===!0&&a.slideCount>a.options.slidesToShow&&a.$dots.show()},b.prototype.keyHandler=function(a){var b=this;a.target.tagName.match("TEXTAREA|INPUT|SELECT")||(37===a.keyCode&&b.options.accessibility===!0?b.changeSlide({data:{message:b.options.rtl===!0?"next":"previous"}}):39===a.keyCode&&b.options.accessibility===!0&&b.changeSlide({data:{message:b.options.rtl===!0?"previous":"next"}}))},b.prototype.lazyLoad=function(){function g(c){a("img[data-lazy]",c).each(function(){var c=a(this),d=a(this).attr("data-lazy"),e=document.createElement("img");e.onload=function(){c.animate({opacity:0},100,function(){c.attr("src",d).animate({opacity:1},200,function(){c.removeAttr("data-lazy").removeClass("slick-loading")}),b.$slider.trigger("lazyLoaded",[b,c,d])})},e.onerror=function(){c.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),b.$slider.trigger("lazyLoadError",[b,c,d])},e.src=d})}var c,d,e,f,b=this;b.options.centerMode===!0?b.options.infinite===!0?(e=b.currentSlide+(b.options.slidesToShow/2+1),f=e+b.options.slidesToShow+2):(e=Math.max(0,b.currentSlide-(b.options.slidesToShow/2+1)),f=2+(b.options.slidesToShow/2+1)+b.currentSlide):(e=b.options.infinite?b.options.slidesToShow+b.currentSlide:b.currentSlide,f=Math.ceil(e+b.options.slidesToShow),b.options.fade===!0&&(e>0&&e--,f<=b.slideCount&&f++)),c=b.$slider.find(".slick-slide").slice(e,f),g(c),b.slideCount<=b.options.slidesToShow?(d=b.$slider.find(".slick-slide"),g(d)):b.currentSlide>=b.slideCount-b.options.slidesToShow?(d=b.$slider.find(".slick-cloned").slice(0,b.options.slidesToShow),g(d)):0===b.currentSlide&&(d=b.$slider.find(".slick-cloned").slice(-1*b.options.slidesToShow),g(d))},b.prototype.loadSlider=function(){var a=this;a.setPosition(),a.$slideTrack.css({opacity:1}),a.$slider.removeClass("slick-loading"),a.initUI(),"progressive"===a.options.lazyLoad&&a.progressiveLazyLoad()},b.prototype.next=b.prototype.slickNext=function(){var a=this;a.changeSlide({data:{message:"next"}})},b.prototype.orientationChange=function(){var a=this;a.checkResponsive(),a.setPosition()},b.prototype.pause=b.prototype.slickPause=function(){var a=this;a.autoPlayClear(),a.paused=!0},b.prototype.play=b.prototype.slickPlay=function(){var a=this;a.autoPlay(),a.options.autoplay=!0,a.paused=!1,a.focussed=!1,a.interrupted=!1},b.prototype.postSlide=function(a){var b=this;b.unslicked||(b.$slider.trigger("afterChange",[b,a]),b.animating=!1,b.setPosition(),b.swipeLeft=null,b.options.autoplay&&b.autoPlay(),b.options.accessibility===!0&&b.initADA())},b.prototype.prev=b.prototype.slickPrev=function(){var a=this;a.changeSlide({data:{message:"previous"}})},b.prototype.preventDefault=function(a){a.preventDefault()},b.prototype.progressiveLazyLoad=function(b){b=b||1;var e,f,g,c=this,d=a("img[data-lazy]",c.$slider);d.length?(e=d.first(),f=e.attr("data-lazy"),g=document.createElement("img"),g.onload=function(){e.attr("src",f).removeAttr("data-lazy").removeClass("slick-loading"),c.options.adaptiveHeight===!0&&c.setPosition(),c.$slider.trigger("lazyLoaded",[c,e,f]),c.progressiveLazyLoad()},g.onerror=function(){3>b?setTimeout(function(){c.progressiveLazyLoad(b+1)},500):(e.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),c.$slider.trigger("lazyLoadError",[c,e,f]),c.progressiveLazyLoad())},g.src=f):c.$slider.trigger("allImagesLoaded",[c])},b.prototype.refresh=function(b){var d,e,c=this;e=c.slideCount-c.options.slidesToShow,!c.options.infinite&&c.currentSlide>e&&(c.currentSlide=e),c.slideCount<=c.options.slidesToShow&&(c.currentSlide=0),d=c.currentSlide,c.destroy(!0),a.extend(c,c.initials,{currentSlide:d}),c.init(),b||c.changeSlide({data:{message:"index",index:d}},!1)},b.prototype.registerBreakpoints=function(){var c,d,e,b=this,f=b.options.responsive||null;if("array"===a.type(f)&&f.length){b.respondTo=b.options.respondTo||"window";for(c in f)if(e=b.breakpoints.length-1,d=f[c].breakpoint,f.hasOwnProperty(c)){for(;e>=0;)b.breakpoints[e]&&b.breakpoints[e]===d&&b.breakpoints.splice(e,1),e--;b.breakpoints.push(d),b.breakpointSettings[d]=f[c].settings}b.breakpoints.sort(function(a,c){return b.options.mobileFirst?a-c:c-a})}},b.prototype.reinit=function(){var b=this;b.$slides=b.$slideTrack.children(b.options.slide).addClass("slick-slide"),b.slideCount=b.$slides.length,b.currentSlide>=b.slideCount&&0!==b.currentSlide&&(b.currentSlide=b.currentSlide-b.options.slidesToScroll),b.slideCount<=b.options.slidesToShow&&(b.currentSlide=0),b.registerBreakpoints(),b.setProps(),b.setupInfinite(),b.buildArrows(),b.updateArrows(),b.initArrowEvents(),b.buildDots(),b.updateDots(),b.initDotEvents(),b.cleanUpSlideEvents(),b.initSlideEvents(),b.checkResponsive(!1,!0),b.options.focusOnSelect===!0&&a(b.$slideTrack).children().on("click.slick",b.selectHandler),b.setSlideClasses("number"==typeof b.currentSlide?b.currentSlide:0),b.setPosition(),b.focusHandler(),b.paused=!b.options.autoplay,b.autoPlay(),b.$slider.trigger("reInit",[b])},b.prototype.resize=function(){var b=this;a(window).width()!==b.windowWidth&&(clearTimeout(b.windowDelay),b.windowDelay=window.setTimeout(function(){b.windowWidth=a(window).width(),b.checkResponsive(),b.unslicked||b.setPosition()},50))},b.prototype.removeSlide=b.prototype.slickRemove=function(a,b,c){var d=this;return"boolean"==typeof a?(b=a,a=b===!0?0:d.slideCount-1):a=b===!0?--a:a,d.slideCount<1||0>a||a>d.slideCount-1?!1:(d.unload(),c===!0?d.$slideTrack.children().remove():d.$slideTrack.children(this.options.slide).eq(a).remove(),d.$slides=d.$slideTrack.children(this.options.slide),d.$slideTrack.children(this.options.slide).detach(),d.$slideTrack.append(d.$slides),d.$slidesCache=d.$slides,void d.reinit())},b.prototype.setCSS=function(a){var d,e,b=this,c={};b.options.rtl===!0&&(a=-a),d="left"==b.positionProp?Math.ceil(a)+"px":"0px",e="top"==b.positionProp?Math.ceil(a)+"px":"0px",c[b.positionProp]=a,b.transformsEnabled===!1?b.$slideTrack.css(c):(c={},b.cssTransitions===!1?(c[b.animType]="translate("+d+", "+e+")",b.$slideTrack.css(c)):(c[b.animType]="translate3d("+d+", "+e+", 0px)",b.$slideTrack.css(c)))},b.prototype.setDimensions=function(){var a=this;a.options.vertical===!1?a.options.centerMode===!0&&a.$list.css({padding:"0px "+a.options.centerPadding}):(a.$list.height(a.$slides.first().outerHeight(!0)*a.options.slidesToShow),a.options.centerMode===!0&&a.$list.css({padding:a.options.centerPadding+" 0px"})),a.listWidth=a.$list.width(),a.listHeight=a.$list.height(),a.options.vertical===!1&&a.options.variableWidth===!1?(a.slideWidth=Math.ceil(a.listWidth/a.options.slidesToShow),a.$slideTrack.width(Math.ceil(a.slideWidth*a.$slideTrack.children(".slick-slide").length))):a.options.variableWidth===!0?a.$slideTrack.width(5e3*a.slideCount):(a.slideWidth=Math.ceil(a.listWidth),a.$slideTrack.height(Math.ceil(a.$slides.first().outerHeight(!0)*a.$slideTrack.children(".slick-slide").length)));var b=a.$slides.first().outerWidth(!0)-a.$slides.first().width();a.options.variableWidth===!1&&a.$slideTrack.children(".slick-slide").width(a.slideWidth-b)},b.prototype.setFade=function(){var c,b=this;b.$slides.each(function(d,e){c=b.slideWidth*d*-1,b.options.rtl===!0?a(e).css({position:"relative",right:c,top:0,zIndex:b.options.zIndex-2,opacity:0}):a(e).css({position:"relative",left:c,top:0,zIndex:b.options.zIndex-2,opacity:0})}),b.$slides.eq(b.currentSlide).css({zIndex:b.options.zIndex-1,opacity:1})},b.prototype.setHeight=function(){var a=this;if(1===a.options.slidesToShow&&a.options.adaptiveHeight===!0&&a.options.vertical===!1){var b=a.$slides.eq(a.currentSlide).outerHeight(!0);a.$list.css("height",b)}},b.prototype.setOption=b.prototype.slickSetOption=function(){var c,d,e,f,h,b=this,g=!1;if("object"===a.type(arguments[0])?(e=arguments[0],g=arguments[1],h="multiple"):"string"===a.type(arguments[0])&&(e=arguments[0],f=arguments[1],g=arguments[2],"responsive"===arguments[0]&&"array"===a.type(arguments[1])?h="responsive":"undefined"!=typeof arguments[1]&&(h="single")),"single"===h)b.options[e]=f;else if("multiple"===h)a.each(e,function(a,c){b.options[a]=c});else if("responsive"===h)for(d in f)if("array"!==a.type(b.options.responsive))b.options.responsive=[f[d]];else{for(c=b.options.responsive.length-1;c>=0;)b.options.responsive[c].breakpoint===f[d].breakpoint&&b.options.responsive.splice(c,1),c--;b.options.responsive.push(f[d])}g&&(b.unload(),b.reinit())},b.prototype.setPosition=function(){var a=this;a.setDimensions(),a.setHeight(),a.options.fade===!1?a.setCSS(a.getLeft(a.currentSlide)):a.setFade(),a.$slider.trigger("setPosition",[a])},b.prototype.setProps=function(){var a=this,b=document.body.style;a.positionProp=a.options.vertical===!0?"top":"left","top"===a.positionProp?a.$slider.addClass("slick-vertical"):a.$slider.removeClass("slick-vertical"),(void 0!==b.WebkitTransition||void 0!==b.MozTransition||void 0!==b.msTransition)&&a.options.useCSS===!0&&(a.cssTransitions=!0),a.options.fade&&("number"==typeof a.options.zIndex?a.options.zIndex<3&&(a.options.zIndex=3):a.options.zIndex=a.defaults.zIndex),void 0!==b.OTransform&&(a.animType="OTransform",a.transformType="-o-transform",a.transitionType="OTransition",void 0===b.perspectiveProperty&&void 0===b.webkitPerspective&&(a.animType=!1)),void 0!==b.MozTransform&&(a.animType="MozTransform",a.transformType="-moz-transform",a.transitionType="MozTransition",void 0===b.perspectiveProperty&&void 0===b.MozPerspective&&(a.animType=!1)),void 0!==b.webkitTransform&&(a.animType="webkitTransform",a.transformType="-webkit-transform",a.transitionType="webkitTransition",void 0===b.perspectiveProperty&&void 0===b.webkitPerspective&&(a.animType=!1)),void 0!==b.msTransform&&(a.animType="msTransform",a.transformType="-ms-transform",a.transitionType="msTransition",void 0===b.msTransform&&(a.animType=!1)),void 0!==b.transform&&a.animType!==!1&&(a.animType="transform",a.transformType="transform",a.transitionType="transition"),a.transformsEnabled=a.options.useTransform&&null!==a.animType&&a.animType!==!1},b.prototype.setSlideClasses=function(a){var c,d,e,f,b=this;d=b.$slider.find(".slick-slide").removeClass("slick-active slick-center slick-current").attr("aria-hidden","true"),b.$slides.eq(a).addClass("slick-current"),b.options.centerMode===!0?(c=Math.floor(b.options.slidesToShow/2),b.options.infinite===!0&&(a>=c&&a<=b.slideCount-1-c?b.$slides.slice(a-c,a+c+1).addClass("slick-active").attr("aria-hidden","false"):(e=b.options.slidesToShow+a,
+ d.slice(e-c+1,e+c+2).addClass("slick-active").attr("aria-hidden","false")),0===a?d.eq(d.length-1-b.options.slidesToShow).addClass("slick-center"):a===b.slideCount-1&&d.eq(b.options.slidesToShow).addClass("slick-center")),b.$slides.eq(a).addClass("slick-center")):a>=0&&a<=b.slideCount-b.options.slidesToShow?b.$slides.slice(a,a+b.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"):d.length<=b.options.slidesToShow?d.addClass("slick-active").attr("aria-hidden","false"):(f=b.slideCount%b.options.slidesToShow,e=b.options.infinite===!0?b.options.slidesToShow+a:a,b.options.slidesToShow==b.options.slidesToScroll&&b.slideCount-ab.options.slidesToShow)){for(e=b.options.centerMode===!0?b.options.slidesToShow+1:b.options.slidesToShow,c=b.slideCount;c>b.slideCount-e;c-=1)d=c-1,a(b.$slides[d]).clone(!0).attr("id","").attr("data-slick-index",d-b.slideCount).prependTo(b.$slideTrack).addClass("slick-cloned");for(c=0;e>c;c+=1)d=c,a(b.$slides[d]).clone(!0).attr("id","").attr("data-slick-index",d+b.slideCount).appendTo(b.$slideTrack).addClass("slick-cloned");b.$slideTrack.find(".slick-cloned").find("[id]").each(function(){a(this).attr("id","")})}},b.prototype.interrupt=function(a){var b=this;a||b.autoPlay(),b.interrupted=a},b.prototype.selectHandler=function(b){var c=this,d=a(b.target).is(".slick-slide")?a(b.target):a(b.target).parents(".slick-slide"),e=parseInt(d.attr("data-slick-index"));return e||(e=0),c.slideCount<=c.options.slidesToShow?(c.setSlideClasses(e),void c.asNavFor(e)):void c.slideHandler(e)},b.prototype.slideHandler=function(a,b,c){var d,e,f,g,j,h=null,i=this;return b=b||!1,i.animating===!0&&i.options.waitForAnimate===!0||i.options.fade===!0&&i.currentSlide===a||i.slideCount<=i.options.slidesToShow?void 0:(b===!1&&i.asNavFor(a),d=a,h=i.getLeft(d),g=i.getLeft(i.currentSlide),i.currentLeft=null===i.swipeLeft?g:i.swipeLeft,i.options.infinite===!1&&i.options.centerMode===!1&&(0>a||a>i.getDotCount()*i.options.slidesToScroll)?void(i.options.fade===!1&&(d=i.currentSlide,c!==!0?i.animateSlide(g,function(){i.postSlide(d)}):i.postSlide(d))):i.options.infinite===!1&&i.options.centerMode===!0&&(0>a||a>i.slideCount-i.options.slidesToScroll)?void(i.options.fade===!1&&(d=i.currentSlide,c!==!0?i.animateSlide(g,function(){i.postSlide(d)}):i.postSlide(d))):(i.options.autoplay&&clearInterval(i.autoPlayTimer),e=0>d?i.slideCount%i.options.slidesToScroll!==0?i.slideCount-i.slideCount%i.options.slidesToScroll:i.slideCount+d:d>=i.slideCount?i.slideCount%i.options.slidesToScroll!==0?0:d-i.slideCount:d,i.animating=!0,i.$slider.trigger("beforeChange",[i,i.currentSlide,e]),f=i.currentSlide,i.currentSlide=e,i.setSlideClasses(i.currentSlide),i.options.asNavFor&&(j=i.getNavTarget(),j=j.slick("getSlick"),j.slideCount<=j.options.slidesToShow&&j.setSlideClasses(i.currentSlide)),i.updateDots(),i.updateArrows(),i.options.fade===!0?(c!==!0?(i.fadeSlideOut(f),i.fadeSlide(e,function(){i.postSlide(e)})):i.postSlide(e),void i.animateHeight()):void(c!==!0?i.animateSlide(h,function(){i.postSlide(e)}):i.postSlide(e))))},b.prototype.startLoad=function(){var a=this;a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&(a.$prevArrow.hide(),a.$nextArrow.hide()),a.options.dots===!0&&a.slideCount>a.options.slidesToShow&&a.$dots.hide(),a.$slider.addClass("slick-loading")},b.prototype.swipeDirection=function(){var a,b,c,d,e=this;return a=e.touchObject.startX-e.touchObject.curX,b=e.touchObject.startY-e.touchObject.curY,c=Math.atan2(b,a),d=Math.round(180*c/Math.PI),0>d&&(d=360-Math.abs(d)),45>=d&&d>=0?e.options.rtl===!1?"left":"right":360>=d&&d>=315?e.options.rtl===!1?"left":"right":d>=135&&225>=d?e.options.rtl===!1?"right":"left":e.options.verticalSwiping===!0?d>=35&&135>=d?"down":"up":"vertical"},b.prototype.swipeEnd=function(a){var c,d,b=this;if(b.dragging=!1,b.interrupted=!1,b.shouldClick=b.touchObject.swipeLength>10?!1:!0,void 0===b.touchObject.curX)return!1;if(b.touchObject.edgeHit===!0&&b.$slider.trigger("edge",[b,b.swipeDirection()]),b.touchObject.swipeLength>=b.touchObject.minSwipe){switch(d=b.swipeDirection()){case"left":case"down":c=b.options.swipeToSlide?b.checkNavigable(b.currentSlide+b.getSlideCount()):b.currentSlide+b.getSlideCount(),b.currentDirection=0;break;case"right":case"up":c=b.options.swipeToSlide?b.checkNavigable(b.currentSlide-b.getSlideCount()):b.currentSlide-b.getSlideCount(),b.currentDirection=1}"vertical"!=d&&(b.slideHandler(c),b.touchObject={},b.$slider.trigger("swipe",[b,d]))}else b.touchObject.startX!==b.touchObject.curX&&(b.slideHandler(b.currentSlide),b.touchObject={})},b.prototype.swipeHandler=function(a){var b=this;if(!(b.options.swipe===!1||"ontouchend"in document&&b.options.swipe===!1||b.options.draggable===!1&&-1!==a.type.indexOf("mouse")))switch(b.touchObject.fingerCount=a.originalEvent&&void 0!==a.originalEvent.touches?a.originalEvent.touches.length:1,b.touchObject.minSwipe=b.listWidth/b.options.touchThreshold,b.options.verticalSwiping===!0&&(b.touchObject.minSwipe=b.listHeight/b.options.touchThreshold),a.data.action){case"start":b.swipeStart(a);break;case"move":b.swipeMove(a);break;case"end":b.swipeEnd(a)}},b.prototype.swipeMove=function(a){var d,e,f,g,h,b=this;return h=void 0!==a.originalEvent?a.originalEvent.touches:null,!b.dragging||h&&1!==h.length?!1:(d=b.getLeft(b.currentSlide),b.touchObject.curX=void 0!==h?h[0].pageX:a.clientX,b.touchObject.curY=void 0!==h?h[0].pageY:a.clientY,b.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(b.touchObject.curX-b.touchObject.startX,2))),b.options.verticalSwiping===!0&&(b.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(b.touchObject.curY-b.touchObject.startY,2)))),e=b.swipeDirection(),"vertical"!==e?(void 0!==a.originalEvent&&b.touchObject.swipeLength>4&&a.preventDefault(),g=(b.options.rtl===!1?1:-1)*(b.touchObject.curX>b.touchObject.startX?1:-1),b.options.verticalSwiping===!0&&(g=b.touchObject.curY>b.touchObject.startY?1:-1),f=b.touchObject.swipeLength,b.touchObject.edgeHit=!1,b.options.infinite===!1&&(0===b.currentSlide&&"right"===e||b.currentSlide>=b.getDotCount()&&"left"===e)&&(f=b.touchObject.swipeLength*b.options.edgeFriction,b.touchObject.edgeHit=!0),b.options.vertical===!1?b.swipeLeft=d+f*g:b.swipeLeft=d+f*(b.$list.height()/b.listWidth)*g,b.options.verticalSwiping===!0&&(b.swipeLeft=d+f*g),b.options.fade===!0||b.options.touchMove===!1?!1:b.animating===!0?(b.swipeLeft=null,!1):void b.setCSS(b.swipeLeft)):void 0)},b.prototype.swipeStart=function(a){var c,b=this;return b.interrupted=!0,1!==b.touchObject.fingerCount||b.slideCount<=b.options.slidesToShow?(b.touchObject={},!1):(void 0!==a.originalEvent&&void 0!==a.originalEvent.touches&&(c=a.originalEvent.touches[0]),b.touchObject.startX=b.touchObject.curX=void 0!==c?c.pageX:a.clientX,b.touchObject.startY=b.touchObject.curY=void 0!==c?c.pageY:a.clientY,void(b.dragging=!0))},b.prototype.unfilterSlides=b.prototype.slickUnfilter=function(){var a=this;null!==a.$slidesCache&&(a.unload(),a.$slideTrack.children(this.options.slide).detach(),a.$slidesCache.appendTo(a.$slideTrack),a.reinit())},b.prototype.unload=function(){var b=this;a(".slick-cloned",b.$slider).remove(),b.$dots&&b.$dots.remove(),b.$prevArrow&&b.htmlExpr.test(b.options.prevArrow)&&b.$prevArrow.remove(),b.$nextArrow&&b.htmlExpr.test(b.options.nextArrow)&&b.$nextArrow.remove(),b.$slides.removeClass("slick-slide slick-active slick-visible slick-current").attr("aria-hidden","true").css("width","")},b.prototype.unslick=function(a){var b=this;b.$slider.trigger("unslick",[b,a]),b.destroy()},b.prototype.updateArrows=function(){var b,a=this;b=Math.floor(a.options.slidesToShow/2),a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&!a.options.infinite&&(a.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false"),a.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false"),0===a.currentSlide?(a.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true"),a.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false")):a.currentSlide>=a.slideCount-a.options.slidesToShow&&a.options.centerMode===!1?(a.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),a.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")):a.currentSlide>=a.slideCount-1&&a.options.centerMode===!0&&(a.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),a.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")))},b.prototype.updateDots=function(){var a=this;null!==a.$dots&&(a.$dots.find("li").removeClass("slick-active").attr("aria-hidden","true"),a.$dots.find("li").eq(Math.floor(a.currentSlide/a.options.slidesToScroll)).addClass("slick-active").attr("aria-hidden","false"))},b.prototype.visibility=function(){var a=this;a.options.autoplay&&(document[a.hidden]?a.interrupted=!0:a.interrupted=!1)},a.fn.slick=function(){var f,g,a=this,c=arguments[0],d=Array.prototype.slice.call(arguments,1),e=a.length;for(f=0;e>f;f++)if("object"==typeof c||"undefined"==typeof c?a[f].slick=new b(a[f],c):g=a[f].slick[c].apply(a[f].slick,d),"undefined"!=typeof g)return g;return a}});
+
+
+/**
+ * @module ProgressBar.js
+ * @see https://kimmobrunfeldt.github.io/progressbar.js
+ * @license: MIT
+ * @version 1.0.1
+ */
+!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).ProgressBar=t()}}(function(){return function t(e,n,i){function r(s,a){if(!n[s]){if(!e[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(o)return o(s,!0);var h=new Error("Cannot find module '"+s+"'");throw h.code="MODULE_NOT_FOUND",h}var c=n[s]={exports:{}};e[s][0].call(c.exports,function(t){var n=e[s][1][t];return r(n||t)},c,c.exports,t,e,n,i)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;st?0:(t-o)/r;for(a in e)e.hasOwnProperty(a)&&(h=s[a],c="function"==typeof h?h:f[h],e[a]=u(n[a],i[a],c,p));return e}function u(t,e,n,i){return t+(e-t)*n(i)}function h(t,e){var n=l.prototype.filter,i=t._filterArgs;r(n,function(r){void 0!==n[r][e]&&n[r][e].apply(t,i)})}function c(t,e,n,i,r,o,s,u,c,p,l){m=e+n+i,v=Math.min(l||y(),m),S=v>=m,x=i-(m-v),t.isPlaying()&&(S?(c(s,t._attachment,x),t.stop(!0)):(t._scheduleId=p(t._timeoutHandler,g),h(t,"beforeTween"),e+n>v?a(1,r,o,s,1,1,u):a(v,r,o,s,i,e+n,u),h(t,"afterTween"),c(r,t._attachment,x)))}function p(t,e){var n={},i=typeof e;return"string"===i||"function"===i?r(t,function(t){n[t]=e}):r(t,function(t){n[t]||(n[t]=e[t]||d)}),n}function l(t,e){this._currentState=t||{},this._configured=!1,this._scheduleFunction=_,void 0!==e&&this.setConfig(e)}var f,_,d="linear",g=1e3/60,w=Date.now?Date.now:function(){return+new Date},y="undefined"!=typeof SHIFTY_DEBUG_NOW?SHIFTY_DEBUG_NOW:w;_="undefined"!=typeof window?window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||window.mozCancelRequestAnimationFrame&&window.mozRequestAnimationFrame||setTimeout:setTimeout;var m,v,S,x;return l.prototype.tween=function(t){return this._isTweening?this:(void 0===t&&this._configured||this.setConfig(t),this._timestamp=y(),this._start(this.get(),this._attachment),this.resume())},l.prototype.setConfig=function(t){t=t||{},this._configured=!0,this._attachment=t.attachment,this._pausedAtTime=null,this._scheduleId=null,this._delay=t.delay||0,this._start=t.start||i,this._step=t.step||i,this._finish=t.finish||i,this._duration=t.duration||500,this._currentState=o({},t.from)||this.get(),this._originalState=this.get(),this._targetState=o({},t.to)||this.get();var e=this;this._timeoutHandler=function(){c(e,e._timestamp,e._delay,e._duration,e._currentState,e._originalState,e._targetState,e._easing,e._step,e._scheduleFunction)};var n=this._currentState,r=this._targetState;return s(r,n),this._easing=p(n,t.easing||d),this._filterArgs=[n,this._originalState,r,this._easing],h(this,"tweenCreated"),this},l.prototype.get=function(){return o({},this._currentState)},l.prototype.set=function(t){this._currentState=t},l.prototype.pause=function(){return this._pausedAtTime=y(),this._isPaused=!0,this},l.prototype.resume=function(){return this._isPaused&&(this._timestamp+=y()-this._pausedAtTime),this._isPaused=!1,this._isTweening=!0,this._timeoutHandler(),this},l.prototype.seek=function(t){t=Math.max(t,0);var e=y();return this._timestamp+t===0?this:(this._timestamp=e-t,this.isPlaying()||(this._isTweening=!0,this._isPaused=!1,c(this,this._timestamp,this._delay,this._duration,this._currentState,this._originalState,this._targetState,this._easing,this._step,this._scheduleFunction,e),this.pause()),this)},l.prototype.stop=function(e){return this._isTweening=!1,this._isPaused=!1,this._timeoutHandler=i,(t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.oCancelAnimationFrame||t.msCancelAnimationFrame||t.mozCancelRequestAnimationFrame||t.clearTimeout)(this._scheduleId),e&&(h(this,"beforeTween"),a(1,this._currentState,this._originalState,this._targetState,1,0,this._easing),h(this,"afterTween"),h(this,"afterTweenEnd"),this._finish.call(this,this._currentState,this._attachment)),this},l.prototype.isPlaying=function(){return this._isTweening&&!this._isPaused},l.prototype.setScheduleFunction=function(t){this._scheduleFunction=t},l.prototype.dispose=function(){var t;for(t in this)this.hasOwnProperty(t)&&delete this[t]},l.prototype.filter={},l.prototype.formula={linear:function(t){return t}},f=l.prototype.formula,o(l,{now:y,each:r,tweenProps:a,tweenProp:u,applyFilter:h,shallowCopy:o,defaults:s,composeEasingObject:p}),"function"==typeof SHIFTY_DEBUG_NOW&&(t.timeoutHandler=c),"object"==typeof n?e.exports=l:void 0===t.Tweenable&&(t.Tweenable=l),l}();i.shallowCopy(i.prototype.formula,{easeInQuad:function(t){return Math.pow(t,2)},easeOutQuad:function(t){return-(Math.pow(t-1,2)-1)},easeInOutQuad:function(t){return(t/=.5)<1?.5*Math.pow(t,2):-.5*((t-=2)*t-2)},easeInCubic:function(t){return Math.pow(t,3)},easeOutCubic:function(t){return Math.pow(t-1,3)+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*Math.pow(t,3):.5*(Math.pow(t-2,3)+2)},easeInQuart:function(t){return Math.pow(t,4)},easeOutQuart:function(t){return-(Math.pow(t-1,4)-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*Math.pow(t,4):-.5*((t-=2)*Math.pow(t,3)-2)},easeInQuint:function(t){return Math.pow(t,5)},easeOutQuint:function(t){return Math.pow(t-1,5)+1},easeInOutQuint:function(t){return(t/=.5)<1?.5*Math.pow(t,5):.5*(Math.pow(t-2,5)+2)},easeInSine:function(t){return 1-Math.cos(t*(Math.PI/2))},easeOutSine:function(t){return Math.sin(t*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-Math.pow(t-1,2))},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeOutBounce:function(t){return 1/2.75>t?7.5625*t*t:2/2.75>t?7.5625*(t-=1.5/2.75)*t+.75:2.5/2.75>t?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},elastic:function(t){return-1*Math.pow(4,-8*t)*Math.sin((6*t-1)*(2*Math.PI)/2)+1},swingFromTo:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},swingFrom:function(t){var e=1.70158;return t*t*((e+1)*t-e)},swingTo:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},bounce:function(t){return 1/2.75>t?7.5625*t*t:2/2.75>t?7.5625*(t-=1.5/2.75)*t+.75:2.5/2.75>t?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bouncePast:function(t){return 1/2.75>t?7.5625*t*t:2/2.75>t?2-(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?2-(7.5625*(t-=2.25/2.75)*t+.9375):2-(7.5625*(t-=2.625/2.75)*t+.984375)},easeFromTo:function(t){return(t/=.5)<1?.5*Math.pow(t,4):-.5*((t-=2)*Math.pow(t,3)-2)},easeFrom:function(t){return Math.pow(t,4)},easeTo:function(t){return Math.pow(t,.25)}}),function(){function t(t,e,n,i,r,o){function s(t){return((p*t+l)*t+f)*t}function a(t){return((_*t+d)*t+g)*t}function u(t){return(3*p*t+2*l)*t+f}function h(t){return t>=0?t:0-t}function c(t,e){var n,i,r,o,a,c;for(r=t,c=0;8>c;c++){if(o=s(r)-t,h(o)r)return n;if(r>i)return i;for(;i>n;){if(o=s(r),h(o-t)o?n=r:i=r,r=.5*(i-n)+n}return r}var p=0,l=0,f=0,_=0,d=0,g=0;return f=3*e,l=3*(i-e)-f,p=1-f-l,g=3*n,d=3*(r-n)-g,_=1-g-d,a(c(t,1/(200*o)))}function e(e,n,i,r){return function(o){return t(o,e,n,i,r,1)}}i.setBezierFunction=function(t,n,r,o,s){var a=e(n,r,o,s);return a.displayName=t,a.x1=n,a.y1=r,a.x2=o,a.y2=s,i.prototype.formula[t]=a},i.unsetBezierFunction=function(t){delete i.prototype.formula[t]}}(),function(){function t(t,e,n,r,o,s){return i.tweenProps(r,e,t,n,1,s,o)}var e=new i;e._filterArgs=[],i.interpolate=function(n,r,o,s,a){var u=i.shallowCopy({},n),h=a||0,c=i.composeEasingObject(n,s||"linear");e.set({});var p=e._filterArgs;p.length=0,p[0]=u,p[1]=n,p[2]=r,p[3]=c,i.applyFilter(e,"tweenCreated"),i.applyFilter(e,"beforeTween");var l=t(n,u,r,o,c,h);return i.applyFilter(e,"afterTween"),l}}(),function(t){function e(t,e){var n,i=[],r=t.length;for(n=0;r>n;n++)i.push("_"+e+"_"+n);return i}function n(t){var e=t.match(S);return e?(1===e.length||t[0].match(v))&&e.unshift(""):e=["",""],e.join(O)}function i(e){t.each(e,function(t){var n=e[t];"string"==typeof n&&n.match(T)&&(e[t]=r(n))})}function r(t){return u(T,t,o)}function o(t){var e=s(t);return"rgb("+e[0]+","+e[1]+","+e[2]+")"}function s(t){return 3===(t=t.replace(/#/,"")).length&&(t=t.split(""),t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),P[0]=a(t.substr(0,2)),P[1]=a(t.substr(2,2)),P[2]=a(t.substr(4,2)),P}function a(t){return parseInt(t,16)}function u(t,e,n){var i=e.match(t),r=e.replace(t,O);if(i)for(var o,s=i.length,a=0;s>a;a++)o=i.shift(),r=r.replace(O,n(o));return r}function h(t){return u(b,t,c)}function c(t){for(var e=t.match(x),n=e.length,i=t.match(C)[0],r=0;n>r;r++)i+=parseInt(e[r],10)+",";return i=i.slice(0,-1)+")"}function p(i){var r={};return t.each(i,function(t){var o=i[t];if("string"==typeof o){var s=w(o);r[t]={formatString:n(o),chunkNames:e(s,t)}}}),r}function l(e,n){t.each(n,function(t){for(var i=w(e[t]),r=i.length,o=0;r>o;o++)e[n[t].chunkNames[o]]=+i[o];delete e[t]})}function f(e,n){t.each(n,function(t){var i=e[t],r=d(_(e,n[t].chunkNames),n[t].chunkNames);i=g(n[t].formatString,r),e[t]=h(i)})}function _(t,e){for(var n,i={},r=e.length,o=0;r>o;o++)n=e[o],i[n]=t[n],delete t[n];return i}function d(t,e){M.length=0;for(var n=e.length,i=0;n>i;i++)M.push(t[e[i]]);return M}function g(t,e){for(var n=t,i=e.length,r=0;i>r;r++)n=n.replace(O,+e[r].toFixed(4));return n}function w(t){return t.match(x)}function y(e,n){t.each(n,function(t){var i,r=n[t].chunkNames,o=r.length,s=e[t];if("string"==typeof s){var a=s.split(" "),u=a[a.length-1];for(i=0;o>i;i++)e[r[i]]=a[i]||u}else for(i=0;o>i;i++)e[r[i]]=s;delete e[t]})}function m(e,n){t.each(n,function(t){var i=n[t].chunkNames,r=i.length,o=e[i[0]];if("string"===typeof o){for(var s="",a=0;r>a;a++)s+=" "+e[i[a]],delete e[i[a]];e[t]=s.substr(1)}else e[t]=o})}var v=/(\d|\-|\.)/,S=/([^\-0-9\.]+)/g,x=/[0-9.\-]+/g,b=new RegExp("rgb\\("+x.source+/,\s*/.source+x.source+/,\s*/.source+x.source+"\\)","g"),C=/^.*\(/,T=/#([0-9]|[a-f]){3,6}/gi,O="VAL",P=[],M=[];t.prototype.filter.token={tweenCreated:function(t,e,n,r){i(t),i(e),i(n),this._tokenData=p(t)},beforeTween:function(t,e,n,i){y(i,this._tokenData),l(t,this._tokenData),l(e,this._tokenData),l(n,this._tokenData)},afterTween:function(t,e,n,i){f(t,this._tokenData),f(e,this._tokenData),f(n,this._tokenData),m(i,this._tokenData)}}}(i)}).call(null)},{}],2:[function(t,e,n){var i=t("./shape"),r=t("./utils"),o=function(t,e){this._pathTemplate="M 50,50 m 0,-{radius} a {radius},{radius} 0 1 1 0,{2radius} a {radius},{radius} 0 1 1 0,-{2radius}",this.containerAspectRatio=1,i.apply(this,arguments)};(o.prototype=new i).constructor=o,o.prototype._pathString=function(t){var e=t.strokeWidth;t.trailWidth&&t.trailWidth>t.strokeWidth&&(e=t.trailWidth);var n=50-e/2;return r.render(this._pathTemplate,{radius:n,"2radius":2*n})},o.prototype._trailString=function(t){return this._pathString(t)},e.exports=o},{"./shape":7,"./utils":8}],3:[function(t,e,n){var i=t("./shape"),r=t("./utils"),o=function(t,e){this._pathTemplate="M 0,{center} L 100,{center}",i.apply(this,arguments)};(o.prototype=new i).constructor=o,o.prototype._initializeSvg=function(t,e){t.setAttribute("viewBox","0 0 100 "+e.strokeWidth),t.setAttribute("preserveAspectRatio","none")},o.prototype._pathString=function(t){return r.render(this._pathTemplate,{center:t.strokeWidth/2})},o.prototype._trailString=function(t){return this._pathString(t)},e.exports=o},{"./shape":7,"./utils":8}],4:[function(t,e,n){e.exports={Line:t("./line"),Circle:t("./circle"),SemiCircle:t("./semicircle"),Path:t("./path"),Shape:t("./shape"),utils:t("./utils")}},{"./circle":2,"./line":3,"./path":5,"./semicircle":6,"./shape":7,"./utils":8}],5:[function(t,e,n){var i=t("shifty"),r=t("./utils"),o={easeIn:"easeInCubic",easeOut:"easeOutCubic",easeInOut:"easeInOutCubic"},s=function t(e,n){if(!(this instanceof t))throw new Error("Constructor was called without new keyword");n=r.extend({duration:800,easing:"linear",from:{},to:{},step:function(){}},n);var i;i=r.isString(e)?document.querySelector(e):e,this.path=i,this._opts=n,this._tweenable=null;var o=this.path.getTotalLength();this.path.style.strokeDasharray=o+" "+o,this.set(0)};s.prototype.value=function(){var t=1-this._getComputedDashOffset()/this.path.getTotalLength();return parseFloat(t.toFixed(6),10)},s.prototype.set=function(t){this.stop(),this.path.style.strokeDashoffset=this._progressToOffset(t);var e=this._opts.step;if(r.isFunction(e)){var n=this._easing(this._opts.easing);e(this._calculateTo(t,n),this._opts.shape||this,this._opts.attachment)}},s.prototype.stop=function(){this._stopTween(),this.path.style.strokeDashoffset=this._getComputedDashOffset()},s.prototype.animate=function(t,e,n){e=e||{},r.isFunction(e)&&(n=e,e={});var o=r.extend({},e),s=r.extend({},this._opts);e=r.extend(s,e);var a=this._easing(e.easing),u=this._resolveFromAndTo(t,a,o);this.stop(),this.path.getBoundingClientRect();var h=this._getComputedDashOffset(),c=this._progressToOffset(t),p=this;this._tweenable=new i,this._tweenable.tween({from:r.extend({offset:h},u.from),to:r.extend({offset:c},u.to),duration:e.duration,easing:a,step:function(t){p.path.style.strokeDashoffset=t.offset;var n=e.shape||p;e.step(t,n,e.attachment)},finish:function(t){r.isFunction(n)&&n()}})},s.prototype._getComputedDashOffset=function(){var t=window.getComputedStyle(this.path,null);return parseFloat(t.getPropertyValue("stroke-dashoffset"),10)},s.prototype._progressToOffset=function(t){var e=this.path.getTotalLength();return e-t*e},s.prototype._resolveFromAndTo=function(t,e,n){return n.from&&n.to?{from:n.from,to:n.to}:{from:this._calculateFrom(e),to:this._calculateTo(t,e)}},s.prototype._calculateFrom=function(t){return i.interpolate(this._opts.from,this._opts.to,this.value(),t)},s.prototype._calculateTo=function(t,e){return i.interpolate(this._opts.from,this._opts.to,t,e)},s.prototype._stopTween=function(){null!==this._tweenable&&(this._tweenable.stop(),this._tweenable=null)},s.prototype._easing=function(t){return o.hasOwnProperty(t)?o[t]:t},e.exports=s},{"./utils":8,shifty:1}],6:[function(t,e,n){var i=t("./shape"),r=t("./circle"),o=t("./utils"),s=function(t,e){this._pathTemplate="M 50,50 m -{radius},0 a {radius},{radius} 0 1 1 {2radius},0",this.containerAspectRatio=2,i.apply(this,arguments)};(s.prototype=new i).constructor=s,s.prototype._initializeSvg=function(t,e){t.setAttribute("viewBox","0 0 100 50")},s.prototype._initializeTextContainer=function(t,e,n){t.text.style&&(n.style.top="auto",n.style.bottom="0",t.text.alignToBottom?o.setStyle(n,"transform","translate(-50%, 0)"):o.setStyle(n,"transform","translate(-50%, 50%)"))},s.prototype._pathString=r.prototype._pathString,s.prototype._trailString=r.prototype._trailString,e.exports=s},{"./circle":2,"./shape":7,"./utils":8}],7:[function(t,e,n){var i=t("./path"),r=t("./utils"),o="Object is destroyed",s=function t(e,n){if(!(this instanceof t))throw new Error("Constructor was called without new keyword");if(0!==arguments.length){this._opts=r.extend({color:"#555",strokeWidth:1,trailColor:null,trailWidth:null,fill:null,text:{style:{color:null,position:"absolute",left:"50%",top:"50%",padding:0,margin:0,transform:{prefix:!0,value:"translate(-50%, -50%)"}},autoStyleContainer:!0,alignToBottom:!0,value:null,className:"progressbar-text"},svgStyle:{display:"block",width:"100%"},warnings:!1},n,!0),r.isObject(n)&&void 0!==n.svgStyle&&(this._opts.svgStyle=n.svgStyle),r.isObject(n)&&r.isObject(n.text)&&void 0!==n.text.style&&(this._opts.text.style=n.text.style);var o,s=this._createSvgView(this._opts);if(!(o=r.isString(e)?document.querySelector(e):e))throw new Error("Container does not exist: "+e);this._container=o,this._container.appendChild(s.svg),this._opts.warnings&&this._warnContainerAspectRatio(this._container),this._opts.svgStyle&&r.setStyles(s.svg,this._opts.svgStyle),this.svg=s.svg,this.path=s.path,this.trail=s.trail,this.text=null;var a=r.extend({attachment:void 0,shape:this},this._opts);this._progressPath=new i(s.path,a),r.isObject(this._opts.text)&&null!==this._opts.text.value&&this.setText(this._opts.text.value)}};s.prototype.animate=function(t,e,n){if(null===this._progressPath)throw new Error(o);this._progressPath.animate(t,e,n)},s.prototype.stop=function(){if(null===this._progressPath)throw new Error(o);void 0!==this._progressPath&&this._progressPath.stop()},s.prototype.destroy=function(){if(null===this._progressPath)throw new Error(o);this.stop(),this.svg.parentNode.removeChild(this.svg),this.svg=null,this.path=null,this.trail=null,this._progressPath=null,null!==this.text&&(this.text.parentNode.removeChild(this.text),this.text=null)},s.prototype.set=function(t){if(null===this._progressPath)throw new Error(o);this._progressPath.set(t)},s.prototype.value=function(){if(null===this._progressPath)throw new Error(o);return void 0===this._progressPath?0:this._progressPath.value()},s.prototype.setText=function(t){if(null===this._progressPath)throw new Error(o);null===this.text&&(this.text=this._createTextContainer(this._opts,this._container),this._container.appendChild(this.text)),r.isObject(t)?(r.removeChildren(this.text),this.text.appendChild(t)):this.text.innerHTML=t},s.prototype._createSvgView=function(t){var e=document.createElementNS("http://www.w3.org/2000/svg","svg");this._initializeSvg(e,t);var n=null;(t.trailColor||t.trailWidth)&&(n=this._createTrail(t),e.appendChild(n));var i=this._createPath(t);return e.appendChild(i),{svg:e,path:i,trail:n}},s.prototype._initializeSvg=function(t,e){t.setAttribute("viewBox","0 0 100 100")},s.prototype._createPath=function(t){var e=this._pathString(t);return this._createPathElement(e,t)},s.prototype._createTrail=function(t){var e=this._trailString(t),n=r.extend({},t);return n.trailColor||(n.trailColor="#eee"),n.trailWidth||(n.trailWidth=n.strokeWidth),n.color=n.trailColor,n.strokeWidth=n.trailWidth,n.fill=null,this._createPathElement(e,n)},s.prototype._createPathElement=function(t,e){var n=document.createElementNS("http://www.w3.org/2000/svg","path");return n.setAttribute("d",t),n.setAttribute("stroke",e.color),n.setAttribute("stroke-width",e.strokeWidth),e.fill?n.setAttribute("fill",e.fill):n.setAttribute("fill-opacity","0"),n},s.prototype._createTextContainer=function(t,e){var n=document.createElement("div");n.className=t.text.className;var i=t.text.style;return i&&(t.text.autoStyleContainer&&(e.style.position="relative"),r.setStyles(n,i),i.color||(n.style.color=t.color)),this._initializeTextContainer(t,e,n),n},s.prototype._initializeTextContainer=function(t,e,n){},s.prototype._pathString=function(t){throw new Error("Override this function for each progress bar")},s.prototype._trailString=function(t){throw new Error("Override this function for each progress bar")},s.prototype._warnContainerAspectRatio=function(t){if(this.containerAspectRatio){var e=window.getComputedStyle(t,null),n=parseFloat(e.getPropertyValue("width"),10),i=parseFloat(e.getPropertyValue("height"),10);r.floatEquals(this.containerAspectRatio,n/i)||(console.warn("Incorrect aspect ratio of container","#"+t.id,"detected:",e.getPropertyValue("width")+"(width)","/",e.getPropertyValue("height")+"(height)","=",n/i),console.warn("Aspect ratio of should be",this.containerAspectRatio))}},e.exports=s},{"./path":5,"./utils":8}],8:[function(t,e,n){function i(t,e,n){t=t||{},e=e||{},n=n||!1;for(var r in e)if(e.hasOwnProperty(r)){var o=t[r],s=e[r];n&&a(o)&&a(s)?t[r]=i(o,s,n):t[r]=s}return t}function r(t,e,n){for(var i=t.style,r=0;r= $window.scrollTop() && elem.offset().top <= $window.scrollTop() + $window.height();
+ }
+ else {
+ return true;
+ }
+ }
+
+ /**
+ * UI To Top
+ * @description Enables ToTop Button
+ */
+ if (isDesktop && !isEditMode) {
+ $().UItoTop({
+ easingType: 'easeOutQuart',
+ containerClass: 'ui-to-top fa fa-angle-up'
+ });
+ }
+
+ /**
+ * RD Navbar
+ * @description Enables RD Navbar plugin
+ */
+ if (plugins.rdNavbar.length) {
+ var aliaces, i, j, len, value, values, responsiveNavbar;
+
+ aliaces = ["-", "-sm-", "-md-", "-lg-", "-xl-", "-xxl-"];
+ values = [0, 576, 768, 992, 1200, 1600];
+ responsiveNavbar = {};
+
+ for (i = j = 0, len = values.length; j < len; i = ++j) {
+ value = values[i];
+ if (!responsiveNavbar[values[i]]) {
+ responsiveNavbar[values[i]] = {};
+ }
+ if (plugins.rdNavbar.attr('data' + aliaces[i] + 'layout')) {
+ responsiveNavbar[values[i]].layout = plugins.rdNavbar.attr('data' + aliaces[i] + 'layout');
+ }
+ if (plugins.rdNavbar.attr('data' + aliaces[i] + 'device-layout')) {
+ responsiveNavbar[values[i]]['deviceLayout'] = plugins.rdNavbar.attr('data' + aliaces[i] + 'device-layout');
+ }
+ if (plugins.rdNavbar.attr('data' + aliaces[i] + 'hover-on')) {
+ responsiveNavbar[values[i]]['focusOnHover'] = plugins.rdNavbar.attr('data' + aliaces[i] + 'hover-on') === 'true';
+ }
+ if (plugins.rdNavbar.attr('data' + aliaces[i] + 'auto-height')) {
+ responsiveNavbar[values[i]]['autoHeight'] = plugins.rdNavbar.attr('data' + aliaces[i] + 'auto-height') === 'true';
+ }
+
+ if (isEditMode) {
+ responsiveNavbar[values[i]]['stickUp'] = false;
+ } else if (plugins.rdNavbar.attr('data' + aliaces[i] + 'stick-up')) {
+ responsiveNavbar[values[i]]['stickUp'] = plugins.rdNavbar.attr('data' + aliaces[i] + 'stick-up') === 'true';
+ }
+
+ if (plugins.rdNavbar.attr('data' + aliaces[i] + 'stick-up-offset')) {
+ responsiveNavbar[values[i]]['stickUpOffset'] = plugins.rdNavbar.attr('data' + aliaces[i] + 'stick-up-offset');
+ }
+ }
+
+ plugins.rdNavbar.RDNavbar({
+ anchorNav: !isEditMode,
+ stickUpClone: (plugins.rdNavbar.attr("data-stick-up-clone") && !isEditMode) ? plugins.rdNavbar.attr("data-stick-up-clone") === 'true' : false,
+ responsive: responsiveNavbar,
+ callbacks: {
+ onStuck: function () {
+ var navbarSearch = this.$element.find('.rd-search input');
+
+ if (navbarSearch) {
+ navbarSearch.val('').trigger('propertychange');
+ }
+ },
+ onDropdownOver: function () {
+ return !isEditMode;
+ },
+ onUnstuck: function () {
+ if (this.$clone === null)
+ return;
+
+ var navbarSearch = this.$clone.find('.rd-search input');
+
+ if (navbarSearch) {
+ navbarSearch.val('').trigger('propertychange');
+ navbarSearch.trigger('blur');
+ }
+
+ }
+ }
+ });
+
+
+ if (plugins.rdNavbar.attr("data-body-class")) {
+ document.body.className += ' ' + plugins.rdNavbar.attr("data-body-class");
+ }
+ }
+
+
+ /**
+ * Swiper
+ * @description Enable Swiper Slider
+ */
+ if (plugins.swiper.length) {
+ for (var i = 0; i < plugins.swiper.length; i++) {
+ var s = $(plugins.swiper[i]);
+ var pag = s.find(".swiper-pagination"),
+ next = s.find(".swiper-button-next"),
+ prev = s.find(".swiper-button-prev"),
+ bar = s.find(".swiper-scrollbar"),
+ swiperSlide = s.find(".swiper-slide"),
+ autoplay = false;
+
+ for (var j = 0; j < swiperSlide.length; j++) {
+ var $this = $(swiperSlide[j]),
+ url;
+
+ if (url = $this.attr("data-slide-bg")) {
+ $this.css({
+ "background-image": "url(" + url + ")",
+ "background-size": "cover"
+ })
+ }
+ }
+
+ swiperSlide.end()
+ .find("[data-caption-animate]")
+ .addClass("not-animated")
+ .end();
+
+ s.swiper({
+ autoplay: s.attr('data-autoplay') ? s.attr('data-autoplay') === "false" ? undefined : s.attr('data-autoplay') : 5000,
+ direction: s.attr('data-direction') ? s.attr('data-direction') : "horizontal",
+ effect: s.attr('data-slide-effect') ? s.attr('data-slide-effect') : "slide",
+ speed: s.attr('data-slide-speed') ? s.attr('data-slide-speed') : 600,
+ keyboardControl: s.attr('data-keyboard') === "true",
+ mousewheelControl: s.attr('data-mousewheel') === "true",
+ mousewheelReleaseOnEdges: s.attr('data-mousewheel-release') === "true",
+ nextButton: next.length ? next.get(0) : null,
+ prevButton: prev.length ? prev.get(0) : null,
+ pagination: pag.length ? pag.get(0) : null,
+ paginationClickable: pag.length ? pag.attr("data-clickable") !== "false" : false,
+ paginationBulletRender: pag.length ? pag.attr("data-index-bullet") === "true" ? function (swiper, index, className) {
+ return '' + (index + 1) + ' ';
+ } : null : null,
+ scrollbar: bar.length ? bar.get(0) : null,
+ scrollbarDraggable: bar.length ? bar.attr("data-draggable") !== "false" : true,
+ scrollbarHide: bar.length ? bar.attr("data-draggable") === "false" : false,
+ loop: isEditMode ? false : s.attr('data-loop') !== "false",
+ simulateTouch: s.attr('data-simulate-touch') && !isEditMode ? s.attr('data-simulate-touch') === "true" : false,
+ onTransitionStart: function (swiper) {
+ toggleSwiperInnerVideos(swiper);
+ },
+ onTransitionEnd: function (swiper) {
+ toggleSwiperCaptionAnimation(swiper);
+ },
+ onInit: function (swiper) {
+ toggleSwiperInnerVideos(swiper);
+ toggleSwiperCaptionAnimation(swiper);
+
+ if (!isRtl) {
+ $window.on('resize', function () {
+ swiper.update(true);
+ });
+ }
+ }
+ });
+
+ $window.on("resize", (function (s) {
+ return function () {
+ var mh = getSwiperHeight(s, "min-height"),
+ h = getSwiperHeight(s, "height");
+ if (h) {
+ s.css("height", mh ? mh > h ? mh : h : h);
+ }
+ }
+ })(s)).trigger("resize");
+ }
+ }
+
+
+ /**
+ * Slick carousel
+ * @description Enable Slick carousel plugin
+ */
+ /**
+ * Slick carousel
+ * @description Enable Slick carousel plugin
+ */
+ if (plugins.slick.length) {
+ for (var i = 0; i < plugins.slick.length; i++) {
+ var $slickItem = $(plugins.slick[i]);
+
+ $slickItem.slick({
+ slidesToScroll: parseInt($slickItem.attr('data-slide-to-scroll'), 10) || 1,
+ asNavFor: $slickItem.attr('data-for') || false,
+ dots: $slickItem.attr("data-dots") === "true",
+ infinite: isEditMode ? false : $slickItem.attr("data-loop") === "true",
+ focusOnSelect: true,
+ arrows: $slickItem.attr("data-arrows") === "true",
+ swipe: $slickItem.attr("data-swipe") === "true",
+ autoplay: $slickItem.attr("data-autoplay") === "true",
+ vertical: $slickItem.attr("data-vertical") === "true",
+ centerMode: $slickItem.attr("data-center-mode") === "true",
+ centerPadding: $slickItem.attr("data-center-padding") ? $slickItem.attr("data-center-padding") : '0.50',
+ mobileFirst: true,
+ rtl: isRtl,
+ responsive: [
+ {
+ breakpoint: 0,
+ settings: {
+ slidesToShow: parseInt($slickItem.attr('data-items'), 10) || 1
+ }
+ },
+ {
+ breakpoint: 576,
+ settings: {
+ slidesToShow: parseInt($slickItem.attr('data-sm-items'), 10) || 1
+ }
+ },
+ {
+ breakpoint: 992,
+ settings: {
+ slidesToShow: parseInt($slickItem.attr('data-md-items'), 10) || 1
+ }
+ },
+ {
+ breakpoint: 1200,
+ settings: {
+ slidesToShow: parseInt($slickItem.attr('data-lg-items'), 10) || 1
+ }
+ },
+ {
+ breakpoint: 1600,
+ settings: {
+ slidesToShow: parseInt($slickItem.attr('data-xl-items'), 10) || 1
+ }
+ }
+ ]
+ })
+ .on('afterChange', function (event, slick, currentSlide, nextSlide) {
+ var $this = $(this),
+ childCarousel = $this.attr('data-child');
+
+ if (childCarousel) {
+ $(childCarousel + ' .slick-slide').removeClass('slick-current');
+ $(childCarousel + ' .slick-slide').eq(currentSlide).addClass('slick-current');
+ }
+ });
+
+ }
+ }
+
+ /**
+ * Owl carousel
+ * @description Enables Owl carousel plugin
+ */
+ if (plugins.owl.length) {
+ for (var i = 0; i < plugins.owl.length; i++) {
+ var c = $(plugins.owl[i]);
+ plugins.owl[i] = c;
+
+ initOwlCarousel(c);
+ }
+ }
+
+ /**
+ * initOwlCarousel
+ * @description Init owl carousel plugin
+ */
+ function initOwlCarousel(c) {
+ var aliaces = ["-", "-sm-", "-md-", "-lg-", "-xl-", "-xxl-"],
+ values = [0, 576, 768, 992, 1200, 1600],
+ responsive = {};
+
+ for (var j = 0; j < values.length; j++) {
+ responsive[values[j]] = {};
+ for (var k = j; k >= -1; k--) {
+ if (!responsive[values[j]]["items"] && c.attr("data" + aliaces[k] + "items")) {
+ responsive[values[j]]["items"] = k < 0 ? 1 : parseInt(c.attr("data" + aliaces[k] + "items"), 10);
+ }
+ if (!responsive[values[j]]["stagePadding"] && responsive[values[j]]["stagePadding"] !== 0 && c.attr("data" + aliaces[k] + "stage-padding")) {
+ responsive[values[j]]["stagePadding"] = k < 0 ? 0 : parseInt(c.attr("data" + aliaces[k] + "stage-padding"), 10);
+ }
+ if (!responsive[values[j]]["margin"] && responsive[values[j]]["margin"] !== 0 && c.attr("data" + aliaces[k] + "margin")) {
+ responsive[values[j]]["margin"] = k < 0 ? 30 : parseInt(c.attr("data" + aliaces[k] + "margin"), 10);
+ }
+ }
+ }
+
+ // Create custom Pagination
+ if (c.attr('data-dots-custom')) {
+ c.on("initialized.owl.carousel", function (event) {
+ var carousel = $(event.currentTarget),
+ customPag = $(carousel.attr("data-dots-custom")),
+ active = 0;
+
+ if (carousel.attr('data-active')) {
+ active = parseInt(carousel.attr('data-active'));
+ }
+
+ carousel.trigger('to.owl.carousel', [active, 300, true]);
+ customPag.find("[data-owl-item='" + active + "']").addClass("active");
+
+ customPag.find("[data-owl-item]").on('click', function (e) {
+ e.preventDefault();
+ carousel.trigger('to.owl.carousel', [parseInt(this.getAttribute("data-owl-item")), 300, true]);
+ });
+
+ carousel.on("translate.owl.carousel", function (event) {
+ customPag.find(".active").removeClass("active");
+ customPag.find("[data-owl-item='" + event.item.index + "']").addClass("active")
+ });
+ });
+ }
+
+ // Create custom Numbering
+ if (typeof(c.attr("data-numbering")) !== 'undefined') {
+ var numberingObject = $(c.attr("data-numbering"));
+
+ c.on('initialized.owl.carousel changed.owl.carousel', function (numberingObject) {
+ return function (e) {
+ if (!e.namespace) return;
+ numberingObject.find('.numbering-current').text(e.item.index + 1);
+ numberingObject.find('.numbering-count').text(e.item.count);
+ };
+ }(numberingObject));
+ }
+
+ c.owlCarousel({
+ autoplay: isEditMode ? false : c.attr("data-autoplay") === "true",
+ loop: isEditMode ? false : c.attr("data-loop") !== "false",
+ items: 1,
+ rtl: isRtl,
+ center: c.attr("data-center") === "true",
+ dotsContainer: c.attr("data-pagination-class") || false,
+ navContainer: c.attr("data-navigation-class") || false,
+ mouseDrag: isEditMode ? false : c.attr("data-mouse-drag") !== "false",
+ nav: c.attr("data-nav") === "true",
+ dots: c.attr("data-dots") === "true",
+ dotsEach: c.attr("data-dots-each") ? parseInt(c.attr("data-dots-each"), 10) : false,
+ animateIn: c.attr('data-animation-in') ? c.attr('data-animation-in') : false,
+ animateOut: c.attr('data-animation-out') ? c.attr('data-animation-out') : false,
+ responsive: responsive,
+ navText: function () {
+ try {
+ return JSON.parse(c.attr("data-nav-text"));
+ } catch (e) {
+ return [];
+ }
+ }(),
+ navClass: function () {
+ try {
+ return JSON.parse(c.attr("data-nav-class"));
+ } catch (e) {
+ return ['owl-prev', 'owl-next'];
+ }
+ }()
+ });
+ }
+
+
+ /**
+ * jQuery Count To
+ * @description Enables Count To plugin
+ */
+ if (plugins.counter.length) {
+ var i;
+
+ for (i = 0; i < plugins.counter.length; i++) {
+ var $counterNotAnimated = $(plugins.counter[i]).not('.animated');
+ $document
+ .on("scroll", $.proxy(function () {
+ var $this = this;
+
+ if ((!$this.hasClass("animated")) && (isScrolledIntoView($this))) {
+ $this.countTo({
+ refreshInterval: 40,
+ from: 0,
+ to: parseInt($this.text(), 10),
+ speed: $this.attr("data-speed") || 1000,
+ formatter: function (value, options) {
+ value = value.toFixed(options.decimals);
+ if (value < 10) {
+ return '0' + value;
+ }
+ return value;
+ }
+ });
+ $this.addClass('animated');
+ }
+ }, $counterNotAnimated))
+ .trigger("scroll");
+ }
+ }
+
+ /**
+ * Custom Toggles
+ */
+ if (plugins.customToggle.length) {
+ for (var i = 0; i < plugins.customToggle.length; i++) {
+ var $this = $(plugins.customToggle[i]);
+
+ $this.on('click', $.proxy(function (event) {
+ event.preventDefault();
+
+ var $ctx = $(this);
+ $($ctx.attr('data-custom-toggle')).add(this).toggleClass('active');
+ }, $this));
+
+ if ($this.attr("data-custom-toggle-hide-on-blur") === "true") {
+ $body.on("click", $this, function (e) {
+ if (e.target !== e.data[0]
+ && $(e.data.attr('data-custom-toggle')).find($(e.target)).length
+ && e.data.find($(e.target)).length === 0) {
+ $(e.data.attr('data-custom-toggle')).add(e.data[0]).removeClass('active');
+ }
+ })
+ }
+
+ if ($this.attr("data-custom-toggle-disable-on-blur") === "true") {
+ $body.on("click", $this, function (e) {
+ if (e.target !== e.data[0] && $(e.data.attr('data-custom-toggle')).find($(e.target)).length === 0 && e.data.find($(e.target)).length === 0) {
+ $(e.data.attr('data-custom-toggle')).add(e.data[0]).removeClass('active');
+ }
+ })
+ }
+ }
+ }
+
+ });
+
+})();
\ No newline at end of file
diff --git a/htdocs/install/doctemplates/websites/website_template-corporate/website_pages.sql b/htdocs/install/doctemplates/websites/website_template-corporate/website_pages.sql
new file mode 100644
index 00000000000..c1dd181d8d9
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-corporate/website_pages.sql
@@ -0,0 +1,60 @@
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 179 -> 1__+MAX_llx_website_page__ - Aliases blog --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(1__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'blog', '', 'Blog', 'Blog', 'en', '', 'blog', '1', '2020-10-07 13:13:26', '2022-07-12 11:17:55', null, '', 'page', '', '__N____N__ __N____N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
The latest news...__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__ __N____N____N__
__N__ __N__ __N__ load(\"main\");__N__ $fuser = new User($db);__N__ $arrayofblogs = $websitepage->fetchAll($website->id, \'DESC\', \'date_creation\', 5, 0, array(\'type_container\'=>\'blogpost\', \'status\'=>1, \'lang\'=>\'null,\'.$websitepage->lang));__N__ foreach($arrayofblogs as $blog)__N__ {__N__ print \'
\';__N__ print \'
\';__N__ print \'
\';__N__ }__N__ ?>__N__
__N__ __N____N__
__N____N__ __N____N__
__N__', '', 0);
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 180 -> 2__+MAX_llx_website_page__ - Aliases blog-our-company-is-now-on-dolibarr --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(2__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'blog-our-company-is-now-on-dolibarr', '', 'Our company is now on Dolibarr ERP CRM', 'Our company has moved on Dolibarr ERP CRM. This is an important step in improving all of our services.', 'en', 'image/template-corporate/background_dolibarr.jpg', '', '1', '2020-10-07 13:13:26', '2022-07-12 11:17:55', null, '', 'blogpost', '', '__N____N__ __N__ __N__ __N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
title; ?>__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__ __N____N__
__N__
__N__ Like several thousands of companies, our company (name ?>) has moved all its information system to
Dolibarr ERP CRM . More than 20 applications have been replaced by only one, easier to use and fully integrated.__N__ This is an important step in improving all of our services.__N__ __N__
__N__ __N__
__N__ __N__ __N__ Screenshot of our new Open Source solution __N__ __N__ __N__ __N__ __N__
__N__
__N____N____N____N____N____N__', '', 0);
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 181 -> 3__+MAX_llx_website_page__ - Aliases blog-our-new-web-site-has-been-launched --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(3__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'blog-our-new-web-site-has-been-launched', '', 'Our new web site has been launched', 'Our new website, based on Dolibarr CMS, has been launched. Modern and directly integrated with the internal management tools of the company, many new online services for our customers will be able to see the day...', 'en', 'image/template-corporate/background_rough-horn.jpg', '', '1', '2020-10-07 13:13:26', '2022-07-12 11:17:55', null, '', 'blogpost', '', '__N____N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
title; ?>__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__ __N____N__
__N__
__N____N____N__ Our new website, based on Dolibarr CMS, has been launched.
__N__ Now it is modern and directly integrated with the internal management tools of the company. Many new online services will be available for our customers...__N____N__ __N__
__N__ __N__
__N__ __N__ __N__ Theme of our new web site __N__ __N__ __N____N__
__N__
__N____N____N____N____N____N____N__', '', 0);
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 182 -> 4__+MAX_llx_website_page__ - Aliases careers --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(4__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'careers', '', 'Careers', 'Our job opportunities', 'en', '', 'career', '1', '2020-10-07 13:13:26', '2022-07-12 11:17:55', null, '', 'page', '', '
__N____N__ __N____N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
Job opportunities__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__ __N____N____N__ __N____N____N__
__N____N__ __N____N__
__N__ __N____N__', '', 0);
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 183 -> 5__+MAX_llx_website_page__ - Aliases carriere --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(5__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'carriere', '', 'Carrière', 'Nos opportunités professionnelles', 'fr', '', 'career', '1', '2020-10-07 13:13:26', '2022-07-12 11:17:55', null, '', 'page', '', '__N____N__ __N____N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
Offres d\'emploi__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__ __N____N____N__ __N____N____N__
__N____N__ __N____N__
__N__ __N____N__', '', 0);
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 184 -> 6__+MAX_llx_website_page__ - Aliases clients-testimonials --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(6__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'clients-testimonials', '', 'Clients Testimonials', 'Client Testimonials', 'en', '', 'testimonials, use cases, success story', '1', '2020-10-07 13:13:26', '2022-07-12 11:17:55', null, '', 'page', '', '__N____N__ __N____N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
Testimonials__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__ __N____N____N__
__N__
__N__
What they say about us __N__
__N__ Send us your testimonial (by email to
email; ?>\">email; ?> )__N__
__N__
__N__
__N____N__
__N____N__ __N____N__
__N__ __N__', '', 0);
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 185 -> 7__+MAX_llx_website_page__ - Aliases contact --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(7__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'contact', '', 'Contact', 'Privacy Policies', 'en', '', 'Contact', '1', '2020-10-07 13:13:26', '2022-07-12 11:17:55', null, '', 'page', '', '__N____N__ __N____N__
__N__ __N__
__N__ __N____N____N__ __N____N____N__ __N__
__N____N__
__N____N__ __N____N__
__N__ __N__', '', 0);
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 186 -> 8__+MAX_llx_website_page__ - Aliases faq --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(8__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'faq', '', 'FAQ', 'Frequently Asked Questions', 'en', '', 'faq', '1', '2020-10-07 13:13:26', '2022-07-12 11:17:55', null, '', 'page', '', '__N____N__ __N____N__
__N__ __N__
__N__ __N____N____N__ __N____N____N__
__N____N__ __N____N__
__N__ __N____N__', '', 0);
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 187 -> 9__+MAX_llx_website_page__ - Aliases footer --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(9__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'footer', '', 'Footer', 'Footer', 'en', '', '', '1', '2020-10-07 13:13:26', '2022-07-06 23:50:25', null, '', 'other', '', '__N__ __N____N__ __N__ __N__ __N____N__
__N____N____N____N__', '', 0);
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 188 -> 10__+MAX_llx_website_page__ - Aliases header --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(10__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'header', '', 'Header and Top Menu', 'Header with menu', 'en', '', '', '1', '2020-10-07 13:13:26', '2022-07-06 23:50:25', null, '', 'other', '', '__N____N____N____N____N__
__N__ __N__
__N__ __N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__ \" />__N__ __N__ __N__ __N__
__N__ __N__ __N__
__N__ __N__ __N__
__N__ __N__
__N__
__N__
__N__
__N__ __N__
__N__ __N__
__N__', '', 0);
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 189 -> 11__+MAX_llx_website_page__ - Aliases home --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(11__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'home', '', 'Home', 'Welcome', 'en', '', '', '1', '2020-10-07 13:13:26', '2022-07-12 11:17:55', null, '', 'page', '', '__N__ __N__ __N__ __N____N__ __N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
Boost your business __N__
__N__
__N__
We provide powerful solutions for all businesses
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
Best prices on the market __N__
__N__
__N__
Our optimized processes allows us to provide you very competitive prices
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__ __N____N____N____N__ __N__
__N__ __N__
__N__
__N__
__N__
__N__
Our sales representative are also technicians.
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
Take a look at our offers...
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
Our customer-supplier relationship is very appreciated by our customers
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
We continue to follow and assist you after the sale. Contact us at any time.
__N__
__N__
__N__
__N__
__N__ __N____N____N__ __N__
__N__ __N__
Looking for __N__
a high quality service?__N__
With a lot of experience, hiring us is a security for your business!
__N__
__N__
__N__
11
__N__
Years of Experience
__N__
__N__
__N__
__N__ query($sql); $obj = $db->fetch_object($resql); print $obj->nb; ?>__N__
__N__
Experts
__N__
__N__
__N__
__N__ query($sql); $obj = $db->fetch_object($resql); print $obj->nb; ?>__N__
__N__
Trusted Clients
__N__
__N__
__N__
__N__
__N__ __N____N__ __N__ __N__ __N__
__N__ __N__
__N__ __N__
__N__ __N__
__N__ __N__
__N__
our plans __N____N__ __N__
__N__ __N__
__N__
__N__ __N__
FREE
__N__
The best choice for personal use
__N__
The service 1 for free
__N__
__N__ 0€ / month __N__
__N__
__N__
Available features are : __N__
__N__ __N__ __N__ Service 1 __N__ __N__ __N__
__N__
__N__
__N__
__N__ __N__ __N__ __N__
__N__
__N__ __N__
STARTER
__N__
For small companiess
__N__
The service 1 and product 1 at low price
__N__
__N__ 29€ / month __N__
__N__
__N__
Available features are : __N__
__N__ __N__ __N__ Service 1__N__ __N__ __N__ __N__ Product 1__N__ __N__ __N__
__N__
__N__
__N__
__N__ __N__ __N__ __N__
__N__
__N__ __N__
PREMIUM
__N__
For large companies
__N__
The full option package for a one shot price__N__
__N__
__N__ 2499€ __N__
__N__
__N__
Available features are : __N__
__N__ __N__ __N__ Service 1 __N__ __N__ __N__ Service 2 __N__ __N__ __N__ Product 1 __N__ __N__
__N__
__N__
__N__
__N__ __N__
__N__ __N__
__N__ __N__
__N__ __N__
__N__ __N__ __N__
__N__
__N__ __N__ __N__ __N__ __N__
__N__ __N__
our team __N__
__N__
__N__
__N__
__N__
__N__
__N__
Albert Einstein __N__
CEO
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
Pierre Curie __N__
CTO
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
Marie Curie __N__
Bookkeeper
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
John Doe __N__
Project leader
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__ __N____N____N__ __N__
__N__ __N__ __N__ __N__
__N__ __N__
__N__
__N__
__N__
successful cases __N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__ __N__
__N__
__N__ Albert Einstein __N__
__N__
Scientist, www.emc2.org
__N__
__N__
__N__
__N__
__N__
-20%
__N__
Expenses
__N__
__N__
__N__
__N__
__N__
__N__ __N__ __N__ They did everything, with almost no time or effort for me. The best part was that I could trust their team to represent our company professionally with our clients. __N__ __N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__ __N__
__N__
__N__ Pierre Curie __N__
__N__
CEO “Cyclonic”
__N__
__N__
__N__
__N__
__N__
-30%
__N__
Expenses
__N__
__N__
__N__
__N__
__N__
__N__ __N__ __N__ Their course gave me the confidence to implement new techniques in my work. I learn “how” to write – “what” and “why” also became much clearer. __N__ __N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__ __N__
__N__
__N__ Marie Curie __N__
__N__
CTO \"Cyclonic\"
__N__
__N__
__N__
__N__
__N__
+22%
__N__
Turnover
__N__
__N__
__N__
__N__
__N__
__N__ __N__ __N__ We were skeptical to work with a consultant to optimize our sales emails, but they were highly recommended by many other startups we knew. They helped us to reach our objective of 20% turnover increase, in 4 monthes. __N__ __N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__ __N__
__N__
__N__ John Doe __N__
__N__
Sale representative
__N__
__N__
__N__
__N__
__N__
+40%
__N__
Quotes
__N__
__N__
__N__
__N__
__N__
__N__ __N__ __N__ Their work on our website and Internet marketing has made a significant different to our business. We’ve seen a +40% increase in quote requests from our website. __N__ __N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__ __N__ __N____N__ __N__
__N__ __N__
Latest News __N__
__N__ fetchAll($website->id, \'DESC\', \'date_creation\', $MAXNEWS, 0, array(\'type_container\'=>\'blogpost\', \'status\'=>1, \'lang\'=>\'null,\'.$websitepage->lang));__N__ foreach($arrayofblogs as $blog)__N__ {__N__ ?>__N__
__N__ __N__ __N__
__N__
__N__ __N____N____N__ __N____N____N__
__N__', '', 0);
+UPDATE llx_website SET fk_default_home = 11__+MAX_llx_website_page__ WHERE rowid = __WEBSITE_ID__;
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 190 -> 12__+MAX_llx_website_page__ - Aliases our-team --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(12__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'our-team', '', 'Our team', 'Our team', 'en', '', 'team', '1', '2020-10-07 13:13:26', '2022-07-12 11:17:55', null, '', 'page', '', '__N____N__ __N____N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
Our team__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__ __N____N____N__
__N__ __N__
The crew... __N__ query($sql);__N__ if (! $resql) dol_print_error($db);__N__ while ($obj = $db->fetch_object($resql))__N__ {__N__ $arrayofusers[]=$obj->rowid;__N__ }__N__ __N__ print \'
\';__N__ foreach($arrayofusers as $id)__N__ {__N__ $fuser->fetch($id);__N____N__ print \'
\';__N__ print \'
\';__N__ print \'
\';__N__ if ($fuser->photo) print Form::showphoto(\'userphoto\', $fuser, 100, 0, 0, \'photowithmargin\', \'\', 0);__N__ //print \'
photo.\'\" width=\"129\" height=\"129\" alt=\"\">\';__N__ else print \'
\';__N__ print \'
\';__N__ print \'
\';__N__ print \'
\'.$fuser->firstname.\'
\';__N__ print \'
\';__N__ //print \'September 24, 2018 \';__N__ if ($fuser->job) print \'\'.$fuser->job.\' \';__N__ else print \' \';__N__ print \' \';__N__ print \'
\';__N__ print \'
\';__N__ print \'
\';__N__ }__N__ print \'
\';__N____N__ ?>__N__
__N__ __N____N__
__N____N__ __N____N__
__N__ __N__', '', 0);
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 191 -> 13__+MAX_llx_website_page__ - Aliases partners --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(13__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'partners', '', 'Partners', 'Partners', 'en', '', 'partners', '1', '2020-10-07 13:13:26', '2022-07-12 11:17:55', null, '', 'page', '', '__N____N__ __N____N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
Partners__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__ __N____N____N__ __N____N____N__
__N____N__ __N____N__
__N__ __N____N__', '', 0);
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 192 -> 14__+MAX_llx_website_page__ - Aliases pricing --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(14__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'pricing', '', 'Pricing', 'All the prices of our offers', 'en', '', 'pricing', '1', '2020-10-07 13:13:26', '2022-07-12 11:17:55', null, '', 'page', '', '__N____N__ __N____N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
Our plans__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__ __N____N____N____N____N__ __N__
__N__ __N__
__N__ __N__
__N__ __N__
__N__ __N__
__N____N__ __N__
__N__ __N__
__N__
__N__ __N__
FREE
__N__
The best choice for personal use
__N__
The service 1 for free
__N__
__N__ 0€ / month __N__
__N__
__N__
Available features are : __N__
__N__ __N__ __N__ Service 1 __N__ __N__ __N__
__N__
__N__
__N__
__N__ __N__ __N__ __N__
__N__
__N__ __N__
STARTER
__N__
For small companiess
__N__
The service 1 and product 1 at low price
__N__
__N__ 29€ / month __N__
__N__
__N__
Available features are : __N__
__N__ __N__ __N__ Service 1__N__ __N__ __N__ __N__ Product 1__N__ __N__ __N__
__N__
__N__
__N__
__N__ __N__ __N__ __N__
__N__
__N__ __N__
PREMIUM
__N__
For large companies
__N__
The full option package for a one shot price__N__
__N__
__N__ 2499€ __N__
__N__
__N__
Available features are : __N__
__N__ __N__ __N__ Service 1 __N__ __N__ __N__ Service 2 __N__ __N__ __N__ Product 1 __N__ __N__
__N__
__N__
__N__
__N__ __N__
__N__ __N__
__N__ __N__
__N__ __N__
__N__ __N__ __N__
__N__
__N__ __N__ __N__ __N__ __N__
__N____N__ __N____N__
__N__ __N__', '', 0);
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 193 -> 15__+MAX_llx_website_page__ - Aliases privacy-policies --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(15__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'privacy-policies', '', 'Privacy Policies', 'Privacy Policies', 'en', '', 'Privacy policies, GDPR', '1', '2020-10-07 13:13:26', '2022-07-12 11:17:55', null, '', 'page', '', '__N__ __N__ __N__ __N____N____N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
Privacy Policy__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__ __N____N__
__N____N__ __N____N____N__ __N__ __N__ __N__
__N__ __N__', '', 0);
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 194 -> 16__+MAX_llx_website_page__ - Aliases product-p --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(16__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'product-p', '', 'Product P', 'Product P', 'en', '', '', '1', '2020-10-07 13:13:26', '2022-07-12 11:17:55', null, '', 'page', '', '__N____N__ __N____N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
Product P__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__ __N____N____N__ __N____N____N__
__N____N__ __N____N__
__N__ __N____N__', '', 0);
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 195 -> 17__+MAX_llx_website_page__ - Aliases search --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(17__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'search', '', 'Search Page', 'Search Page', 'en', '', '', '1', '2020-10-07 13:13:26', '2022-07-12 11:17:55', null, '', 'page', '', '__N____N__ __N____N__
__N__ __N__
__N__ __N____N__
__N____N__
__N__ __N__ __N__ __N__ __N__ load(\"main\");__N__ __N__ if (function_exists(\'getPagesFromSearchCriterias\'))__N__ {__N__ if (GETPOSTISSET(\'s\'))__N__ {__N__ $listofpages = getPagesFromSearchCriterias(\'page\', \'meta\', GETPOST(\'s\', \'alphanohtml\'));__N__ if ($listofpages[\'code\'] == \'OK\')__N__ {__N__ foreach($listofpages[\'list\'] as $websitepagefound)__N__ {__N__ print \'\';__N__ }__N__ }__N__ else__N__ {__N__ // If error, show message__N__ print $listofpages[\'message\'];__N__ }__N__ }__N__ }__N__ else__N__ {__N__ print $weblangs->trans(\"FeatureNotYetAvailable\");__N__ }__N__ ?>__N__ __N__ __N__ __N____N__ __N____N__
__N__', '', 0);
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-08 18:23:16 UTC --;
+-- Page ID 196 -> 18__+MAX_llx_website_page__ - Aliases service-s --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(18__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'service-s', '', 'Service S', 'Service S', 'en', '', '', '1', '2020-10-07 13:13:26', '2022-07-12 11:17:55', null, '', 'page', '', '__N____N__ __N____N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
Service S__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__ __N____N____N__ __N____N____N__
__N____N__ __N____N__
__N__', '', 0);
+
+-- For Dolibarr v14+ --;
+UPDATE llx_website SET lang = 'en' WHERE rowid = __WEBSITE_ID__;
+UPDATE llx_website SET otherlang = '' WHERE rowid = __WEBSITE_ID__;
+
diff --git a/htdocs/install/doctemplates/websites/website_template-style03.jpg b/htdocs/install/doctemplates/websites/website_template-homesubmenu.jpg
similarity index 100%
rename from htdocs/install/doctemplates/websites/website_template-style03.jpg
rename to htdocs/install/doctemplates/websites/website_template-homesubmenu.jpg
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/LICENSE b/htdocs/install/doctemplates/websites/website_template-homesubmenu/LICENSE
new file mode 100644
index 00000000000..871ef743662
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-homesubmenu/LICENSE
@@ -0,0 +1,4 @@
+LICENSE
+-------
+
+CC-BY-SA - https://creativecommons.org/licenses/by/4.0/
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/README.md b/htdocs/install/doctemplates/websites/website_template-homesubmenu/README.md
new file mode 100644
index 00000000000..3a656b8ddaf
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-homesubmenu/README.md
@@ -0,0 +1 @@
+Website generated by Dolibarr ERP CRM
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/.dolibarr b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/.dolibarr
new file mode 100644
index 00000000000..0ef9997b4ab
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/.dolibarr
@@ -0,0 +1,2 @@
+# Some properties for Dolibarr web site CMS
+param=value
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/.htaccess b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/.htaccess
new file mode 100644
index 00000000000..ed27b33461f
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/.htaccess
@@ -0,0 +1,2 @@
+# Order allow,deny
+# Deny from all
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/LICENSE b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/LICENSE
new file mode 100644
index 00000000000..6ee68185103
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/LICENSE
@@ -0,0 +1 @@
+CC-BY-SA - https://creativecommons.org/licenses/by/4.0/
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/README.md b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/README.md
new file mode 100644
index 00000000000..3a656b8ddaf
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/README.md
@@ -0,0 +1 @@
+Website generated by Dolibarr ERP CRM
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/htmlheader.html b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/htmlheader.html
new file mode 100644
index 00000000000..0de0b36283f
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/htmlheader.html
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/index.php b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/index.php
new file mode 100644
index 00000000000..967c5deb878
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/index.php
@@ -0,0 +1,5 @@
+ref.'/page202.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/javascript.js.php b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/javascript.js.php
new file mode 100644
index 00000000000..f58102cf00b
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/javascript.js.php
@@ -0,0 +1,13 @@
+
+/* JS content (all pages) */
+
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/manifest.json.php b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/manifest.json.php
new file mode 100644
index 00000000000..8f844114e48
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/manifest.json.php
@@ -0,0 +1,13 @@
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/master.inc.php b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/master.inc.php
new file mode 100644
index 00000000000..bd25ba5895d
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/master.inc.php
@@ -0,0 +1,7 @@
+
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/page202.tpl.php b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/page202.tpl.php
new file mode 100644
index 00000000000..f0c564c2d61
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/page202.tpl.php
@@ -0,0 +1,315 @@
+
+
+
+Home page
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+email;
+ $message = GETPOST('message', 'alpha');
+ $cmail = new CMailFile('Contact from website', $to, $from, $message);
+ if ($cmail->sendfile()) {
+ ?>
+
+ trans("ErrorFailedToSendMail", $from, $to).'. '.$cmail->error;
+ }
+}
+?>
+
+
+ Company
+
+
+
+
+
+
+
+
+
+
+
Get Productive
+
+ Lorem ipsum dolor, sit amet consectetur adipisicing
+ elit. Ab fuga nobis omnis alias, aliquid iste cumque
+ tempora nam reprehenderit quia itaque debitis,
+ nostrum labore rerum reiciendis laboriosam unde,
+ tempore corporis.
+
+
+
+
+ Learn More
+
+
+
+
+
+
+
+
+
+ LOREM IPSUM DOLOR SIT AMET EZAJB
+
+
+
+
+
Our Company
+
+ Lorem ipsum dolor, sit amet consectetur adipisicing
+ elit. Ab fuga nobis omnis alias, aliquid iste cumque
+ tempora nam reprehenderit quia itaque debitis,
+ nostrum labore rerum reiciendis laboriosam unde,
+ tempore corporis.
+
+
+
+
+
+
+
+
+
+
Founders
+
+
+ Author One
+
+
+ Author Two
+
+
+ Author Three
+
+
+ Author Four
+
+
+
+
+
About
+
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Veritatis accusantium earum sed odit velit laudantium ex libero quisquam consectetur,
+ dolorem vero ipsam perferendis quibusdam itaque omnis a consequatur error repellat.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/robots.txt b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/robots.txt
new file mode 100644
index 00000000000..2b844f479d6
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/robots.txt
@@ -0,0 +1,4 @@
+# Robot file. Generated with Dolibarr
+User-agent: *
+Allow: /public/
+Disallow: /administrator/
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/styles.css.php b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/styles.css.php
new file mode 100644
index 00000000000..d194541d6ea
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/styles.css.php
@@ -0,0 +1,12508 @@
+
+@charset "UTF-8";
+
+.bodywebsite :root {
+ --bs-blue: #0d6efd;
+ --bs-indigo: #6610f2;
+ --bs-purple: #6f42c1;
+ --bs-pink: #d63384;
+ --bs-red: #dc3545;
+ --bs-orange: #fd7e14;
+ --bs-yellow: #ffc107;
+ --bs-green: #198754;
+ --bs-teal: #20c997;
+ --bs-cyan: #0dcaf0;
+ --bs-black: #000;
+ --bs-white: #fff;
+ --bs-gray: #6c757d;
+ --bs-gray-dark: #343a40;
+ --bs-gray-100: #f8f9fa;
+ --bs-gray-200: #e9ecef;
+ --bs-gray-300: #dee2e6;
+ --bs-gray-400: #ced4da;
+ --bs-gray-500: #adb5bd;
+ --bs-gray-600: #6c757d;
+ --bs-gray-700: #495057;
+ --bs-gray-800: #343a40;
+ --bs-gray-900: #212529;
+ --bs-primary: #0d6efd;
+ --bs-secondary: #6c757d;
+ --bs-success: #198754;
+ --bs-info: #0dcaf0;
+ --bs-warning: #ffc107;
+ --bs-danger: #dc3545;
+ --bs-light: #f8f9fa;
+ --bs-dark: #212529;
+ --bs-primary-rgb: 13, 110, 253;
+ --bs-secondary-rgb: 108, 117, 125;
+ --bs-success-rgb: 25, 135, 84;
+ --bs-info-rgb: 13, 202, 240;
+ --bs-warning-rgb: 255, 193, 7;
+ --bs-danger-rgb: 220, 53, 69;
+ --bs-light-rgb: 248, 249, 250;
+ --bs-dark-rgb: 33, 37, 41;
+ --bs-white-rgb: 255, 255, 255;
+ --bs-black-rgb: 0, 0, 0;
+ --bs-body-color-rgb: 33, 37, 41;
+ --bs-body-bg-rgb: 255, 255, 255;
+ --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
+ --bs-body-font-family: var(--bs-font-sans-serif);
+ --bs-body-font-size: 1rem;
+ --bs-body-font-weight: 400;
+ --bs-body-line-height: 1.5;
+ --bs-body-color: #212529;
+ --bs-body-bg: #fff;
+ --bs-border-width: 1px;
+ --bs-border-style: solid;
+ --bs-border-color: #dee2e6;
+ --bs-border-color-translucent: rgba(0, 0, 0, 0.175);
+ --bs-border-radius: 0.375rem;
+ --bs-border-radius-sm: 0.25rem;
+ --bs-border-radius-lg: 0.5rem;
+ --bs-border-radius-xl: 1rem;
+ --bs-border-radius-2xl: 2rem;
+ --bs-border-radius-pill: 50rem;
+ --bs-link-color: #0d6efd;
+ --bs-link-hover-color: #0a58ca;
+ --bs-code-color: #d63384;
+ --bs-highlight-bg: #fff3cd;
+}
+
+.bodywebsite *,
+ .bodywebsite *::before,
+ .bodywebsite *::after {
+ box-sizing: border-box;
+}
+
+.bodywebsite .text-white{
+ color: white;
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ .bodywebsite :root {
+ scroll-behavior: smooth;
+ }
+}
+
+.bodywebsite body {
+ margin: 0;
+ font-family: var(--bs-body-font-family);
+ font-size: var(--bs-body-font-size);
+ font-weight: var(--bs-body-font-weight);
+ line-height: var(--bs-body-line-height);
+ color: var(--bs-body-color);
+ text-align: var(--bs-body-text-align);
+ background-color: var(--bs-body-bg);
+ -webkit-text-size-adjust: 100%;
+ -webkit-tap-highlight-color: transparent;
+}
+
+.bodywebsite hr {
+ margin: 1rem 0;
+ color: inherit;
+ border: 0;
+ border-top: 1px solid;
+ opacity: 0.25;
+}
+
+.bodywebsite h6, .bodywebsite .h6, .bodywebsite h5, .bodywebsite .h5, .bodywebsite h4, .bodywebsite .h4, .bodywebsite h3, .bodywebsite .h3, .bodywebsite h2, .bodywebsite .h2, .bodywebsite h1, .bodywebsite .h1 {
+ margin-top: 0;
+ margin-bottom: 0.5rem;
+ font-weight: 500;
+ line-height: 1.2;
+}
+
+.bodywebsite h1, .bodywebsite .h1 {
+ font-size: calc(1.375rem + 1.5vw);
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite h1, .bodywebsite .h1 {
+ font-size: 2.5rem;
+ }
+}
+
+.bodywebsite h2, .bodywebsite .h2 {
+ font-size: calc(1.325rem + 0.9vw);
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite h2, .bodywebsite .h2 {
+ font-size: 2rem;
+ }
+}
+
+.bodywebsite h3, .bodywebsite .h3 {
+ font-size: calc(1.3rem + 0.6vw);
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite h3, .bodywebsite .h3 {
+ font-size: 1.75rem;
+ }
+}
+
+.bodywebsite h4, .bodywebsite .h4 {
+ font-size: calc(1.275rem + 0.3vw);
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite h4, .bodywebsite .h4 {
+ font-size: 1.5rem;
+ }
+}
+
+.bodywebsite h5, .bodywebsite .h5 {
+ font-size: 1.25rem;
+}
+
+.bodywebsite h6, .bodywebsite .h6 {
+ font-size: 1rem;
+}
+
+.bodywebsite p {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+.bodywebsite abbr[title] {
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+ cursor: help;
+ -webkit-text-decoration-skip-ink: none;
+ text-decoration-skip-ink: none;
+}
+
+.bodywebsite address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit;
+}
+
+.bodywebsite ol,
+ .bodywebsite ul {
+ padding-left: 2rem;
+}
+
+.bodywebsite ol,
+ .bodywebsite ul,
+ .bodywebsite dl {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+.bodywebsite ol ol,
+ .bodywebsite ul ul,
+ .bodywebsite ol ul,
+ .bodywebsite ul ol {
+ margin-bottom: 0;
+}
+
+.bodywebsite dt {
+ font-weight: 700;
+}
+
+.bodywebsite dd {
+ margin-bottom: 0.5rem;
+ margin-left: 0;
+}
+
+.bodywebsite blockquote {
+ margin: 0 0 1rem;
+}
+
+.bodywebsite b,
+ .bodywebsite strong {
+ font-weight: bolder;
+}
+
+.bodywebsite small, .bodywebsite .small {
+ font-size: 0.875em;
+}
+
+.bodywebsite mark, .bodywebsite .mark {
+ padding: 0.1875em;
+ background-color: var(--bs-highlight-bg);
+}
+
+.bodywebsite sub,
+ .bodywebsite sup {
+ position: relative;
+ font-size: 0.75em;
+ line-height: 0;
+ vertical-align: baseline;
+}
+
+.bodywebsite sub {
+ bottom: -0.25em;
+}
+
+.bodywebsite sup {
+ top: -0.5em;
+}
+
+.bodywebsite a {
+ color: var(--bs-link-color);
+ text-decoration: underline;
+}
+
+.bodywebsite a:hover {
+ color: var(--bs-link-hover-color);
+}
+
+.bodywebsite a:not([href]):not([class]), .bodywebsite a:not([href]):not([class]):hover {
+ color: inherit;
+ text-decoration: none;
+}
+
+.bodywebsite pre,
+ .bodywebsite code,
+ .bodywebsite kbd,
+ .bodywebsite samp {
+ font-family: var(--bs-font-monospace);
+ font-size: 1em;
+}
+
+.bodywebsite pre {
+ display: block;
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
+ font-size: 0.875em;
+}
+
+.bodywebsite pre code {
+ font-size: inherit;
+ color: inherit;
+ word-break: normal;
+}
+
+.bodywebsite code {
+ font-size: 0.875em;
+ color: var(--bs-code-color);
+ word-wrap: break-word;
+}
+
+.bodywebsite a > code {
+ color: inherit;
+}
+
+.bodywebsite kbd {
+ padding: 0.1875rem 0.375rem;
+ font-size: 0.875em;
+ color: var(--bs-body-bg);
+ background-color: var(--bs-body-color);
+ border-radius: 0.25rem;
+}
+
+.bodywebsite kbd kbd {
+ padding: 0;
+ font-size: 1em;
+}
+
+.bodywebsite figure {
+ margin: 0 0 1rem;
+}
+
+.bodywebsite img,
+ .bodywebsite svg {
+ vertical-align: middle;
+}
+
+.bodywebsite table {
+ caption-side: bottom;
+ border-collapse: collapse;
+}
+
+.bodywebsite caption {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ color: #6c757d;
+ text-align: left;
+}
+
+.bodywebsite th {
+ text-align: inherit;
+ text-align: -webkit-match-parent;
+}
+
+.bodywebsite thead,
+ .bodywebsite tbody,
+ .bodywebsite tfoot,
+ .bodywebsite tr,
+ .bodywebsite td,
+ .bodywebsite th {
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+}
+
+.bodywebsite label {
+ display: inline-block;
+}
+
+.bodywebsite button {
+ border-radius: 0;
+}
+
+.bodywebsite button:focus:not(:focus-visible) {
+ outline: 0;
+}
+
+.bodywebsite input,
+ .bodywebsite button,
+ .bodywebsite select,
+ .bodywebsite optgroup,
+ .bodywebsite textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+.bodywebsite button,
+ .bodywebsite select {
+ text-transform: none;
+}
+
+.bodywebsite [role=button] {
+ cursor: pointer;
+}
+
+.bodywebsite select {
+ word-wrap: normal;
+}
+
+.bodywebsite select:disabled {
+ opacity: 1;
+}
+
+.bodywebsite [list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
+ display: none !important;
+}
+
+.bodywebsite button,
+ .bodywebsite [type=button],
+ .bodywebsite [type=reset],
+ .bodywebsite [type=submit] {
+ -webkit-appearance: button;
+}
+
+.bodywebsite button:not(:disabled),
+ .bodywebsite [type=button]:not(:disabled),
+ .bodywebsite [type=reset]:not(:disabled),
+ .bodywebsite [type=submit]:not(:disabled) {
+ cursor: pointer;
+}
+
+.bodywebsite ::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
+}
+
+.bodywebsite textarea {
+ resize: vertical;
+}
+
+.bodywebsite fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+.bodywebsite legend {
+ float: left;
+ width: 100%;
+ padding: 0;
+ margin-bottom: 0.5rem;
+ font-size: calc(1.275rem + 0.3vw);
+ line-height: inherit;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite legend {
+ font-size: 1.5rem;
+ }
+}
+
+.bodywebsite legend + * {
+ clear: left;
+}
+
+.bodywebsite ::-webkit-datetime-edit-fields-wrapper,
+ .bodywebsite ::-webkit-datetime-edit-text,
+ .bodywebsite ::-webkit-datetime-edit-minute,
+ .bodywebsite ::-webkit-datetime-edit-hour-field,
+ .bodywebsite ::-webkit-datetime-edit-day-field,
+ .bodywebsite ::-webkit-datetime-edit-month-field,
+ .bodywebsite ::-webkit-datetime-edit-year-field {
+ padding: 0;
+}
+
+.bodywebsite ::-webkit-inner-spin-button {
+ height: auto;
+}
+
+.bodywebsite [type=search] {
+ outline-offset: -2px;
+ -webkit-appearance: textfield;
+}
+
+.bodywebsite ::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+.bodywebsite ::-webkit-color-swatch-wrapper {
+ padding: 0;
+}
+
+.bodywebsite ::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+
+.bodywebsite ::file-selector-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+
+.bodywebsite output {
+ display: inline-block;
+}
+
+.bodywebsite iframe {
+ border: 0;
+}
+
+.bodywebsite summary {
+ display: list-item;
+ cursor: pointer;
+}
+
+.bodywebsite progress {
+ vertical-align: baseline;
+}
+
+.bodywebsite [hidden] {
+ display: none !important;
+}
+
+.bodywebsite .lead {
+ font-size: 1.25rem;
+ font-weight: 300;
+}
+
+.bodywebsite .display-1 {
+ font-size: calc(1.625rem + 4.5vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-1 {
+ font-size: 5rem;
+ }
+}
+
+.bodywebsite .display-2 {
+ font-size: calc(1.575rem + 3.9vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-2 {
+ font-size: 4.5rem;
+ }
+}
+
+.bodywebsite .display-3 {
+ font-size: calc(1.525rem + 3.3vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-3 {
+ font-size: 4rem;
+ }
+}
+
+.bodywebsite .display-4 {
+ font-size: calc(1.475rem + 2.7vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-4 {
+ font-size: 3.5rem;
+ }
+}
+
+.bodywebsite .display-5 {
+ font-size: calc(1.425rem + 2.1vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-5 {
+ font-size: 3rem;
+ }
+}
+
+.bodywebsite .display-6 {
+ font-size: calc(1.375rem + 1.5vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-6 {
+ font-size: 2.5rem;
+ }
+}
+
+.bodywebsite .list-unstyled {
+ padding-left: 0;
+ list-style: none;
+}
+
+.bodywebsite .list-inline {
+ padding-left: 0;
+ list-style: none;
+}
+
+.bodywebsite .list-inline-item {
+ display: inline-block;
+}
+
+.bodywebsite .list-inline-item:not(:last-child) {
+ margin-right: 0.5rem;
+}
+
+.bodywebsite .initialism {
+ font-size: 0.875em;
+ text-transform: uppercase;
+}
+
+.bodywebsite .blockquote {
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+}
+
+.bodywebsite .blockquote > :last-child {
+ margin-bottom: 0;
+}
+
+.bodywebsite .blockquote-footer {
+ margin-top: -1rem;
+ margin-bottom: 1rem;
+ font-size: 0.875em;
+ color: #6c757d;
+}
+
+.bodywebsite .blockquote-footer::before {
+ content: "— ";
+}
+
+.bodywebsite .img-fluid {
+ max-width: 100%;
+ height: auto;
+}
+
+.bodywebsite .img-thumbnail {
+ padding: 0.25rem;
+ background-color: #fff;
+ border: 1px solid var(--bs-border-color);
+ border-radius: 0.375rem;
+ max-width: 100%;
+ height: auto;
+}
+
+.bodywebsite .figure {
+ display: inline-block;
+}
+
+.bodywebsite .figure-img {
+ margin-bottom: 0.5rem;
+ line-height: 1;
+}
+
+.bodywebsite .figure-caption {
+ font-size: 0.875em;
+ color: #6c757d;
+}
+
+.bodywebsite .container,
+ .bodywebsite .container-fluid,
+ .bodywebsite .container-xxl,
+ .bodywebsite .container-xl,
+ .bodywebsite .container-lg,
+ .bodywebsite .container-md,
+ .bodywebsite .container-sm {
+ --bs-gutter-x: 1.5rem;
+ --bs-gutter-y: 0;
+ width: 100%;
+ padding-right: calc(var(--bs-gutter-x) * 0.5);
+ padding-left: calc(var(--bs-gutter-x) * 0.5);
+ margin-right: auto;
+ margin-left: auto;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 540px;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .container-md, .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 720px;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .container-lg, .bodywebsite .container-md, .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 960px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .container-xl, .bodywebsite .container-lg, .bodywebsite .container-md, .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 1140px;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .container-xxl, .bodywebsite .container-xl, .bodywebsite .container-lg, .bodywebsite .container-md, .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 1320px;
+ }
+}
+
+.bodywebsite .row {
+ --bs-gutter-x: 1.5rem;
+ --bs-gutter-y: 0;
+ display: flex;
+ flex-wrap: wrap;
+ margin-top: calc(-1 * var(--bs-gutter-y));
+ margin-right: calc(-0.5 * var(--bs-gutter-x));
+ margin-left: calc(-0.5 * var(--bs-gutter-x));
+}
+
+.bodywebsite .row > * {
+ flex-shrink: 0;
+ width: 100%;
+ max-width: 100%;
+ padding-right: calc(var(--bs-gutter-x) * 0.5);
+ padding-left: calc(var(--bs-gutter-x) * 0.5);
+ margin-top: var(--bs-gutter-y);
+}
+
+.bodywebsite .col {
+ flex: 1 0 0%;
+}
+
+.bodywebsite .row-cols-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+}
+
+.bodywebsite .row-cols-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+}
+
+.bodywebsite .row-cols-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+}
+
+.bodywebsite .row-cols-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+}
+
+.bodywebsite .row-cols-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+}
+
+.bodywebsite .row-cols-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+}
+
+.bodywebsite .row-cols-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+}
+
+.bodywebsite .col-auto {
+ flex: 0 0 auto;
+ width: auto;
+}
+
+.bodywebsite .col-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+}
+
+.bodywebsite .col-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+}
+
+.bodywebsite .col-3 {
+ flex: 0 0 auto;
+ width: 25%;
+}
+
+.bodywebsite .col-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+}
+
+.bodywebsite .col-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+}
+
+.bodywebsite .col-6 {
+ flex: 0 0 auto;
+ width: 50%;
+}
+
+.bodywebsite .col-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+}
+
+.bodywebsite .col-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+}
+
+.bodywebsite .col-9 {
+ flex: 0 0 auto;
+ width: 75%;
+}
+
+.bodywebsite .col-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+}
+
+.bodywebsite .col-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+}
+
+.bodywebsite .col-12 {
+ flex: 0 0 auto;
+ width: 100%;
+}
+
+.bodywebsite .offset-1 {
+ margin-left: 8.33333333%;
+}
+
+.bodywebsite .offset-2 {
+ margin-left: 16.66666667%;
+}
+
+.bodywebsite .offset-3 {
+ margin-left: 25%;
+}
+
+.bodywebsite .offset-4 {
+ margin-left: 33.33333333%;
+}
+
+.bodywebsite .offset-5 {
+ margin-left: 41.66666667%;
+}
+
+.bodywebsite .offset-6 {
+ margin-left: 50%;
+}
+
+.bodywebsite .offset-7 {
+ margin-left: 58.33333333%;
+}
+
+.bodywebsite .offset-8 {
+ margin-left: 66.66666667%;
+}
+
+.bodywebsite .offset-9 {
+ margin-left: 75%;
+}
+
+.bodywebsite .offset-10 {
+ margin-left: 83.33333333%;
+}
+
+.bodywebsite .offset-11 {
+ margin-left: 91.66666667%;
+}
+
+.bodywebsite .g-0,
+ .bodywebsite .gx-0 {
+ --bs-gutter-x: 0;
+}
+
+.bodywebsite .g-0,
+ .bodywebsite .gy-0 {
+ --bs-gutter-y: 0;
+}
+
+.bodywebsite .g-1,
+ .bodywebsite .gx-1 {
+ --bs-gutter-x: 0.25rem;
+}
+
+.bodywebsite .g-1,
+ .bodywebsite .gy-1 {
+ --bs-gutter-y: 0.25rem;
+}
+
+.bodywebsite .g-2,
+ .bodywebsite .gx-2 {
+ --bs-gutter-x: 0.5rem;
+}
+
+.bodywebsite .g-2,
+ .bodywebsite .gy-2 {
+ --bs-gutter-y: 0.5rem;
+}
+
+.bodywebsite .g-3,
+ .bodywebsite .gx-3 {
+ --bs-gutter-x: 1rem;
+}
+
+.bodywebsite .g-3,
+ .bodywebsite .gy-3 {
+ --bs-gutter-y: 1rem;
+}
+
+.bodywebsite .g-4,
+ .bodywebsite .gx-4 {
+ --bs-gutter-x: 1.5rem;
+}
+
+.bodywebsite .g-4,
+ .bodywebsite .gy-4 {
+ --bs-gutter-y: 1.5rem;
+}
+
+.bodywebsite .g-5,
+ .bodywebsite .gx-5 {
+ --bs-gutter-x: 3rem;
+}
+
+.bodywebsite .g-5,
+ .bodywebsite .gy-5 {
+ --bs-gutter-y: 3rem;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .col-sm {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-sm-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-sm-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-sm-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-sm-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-sm-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-sm-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-sm-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-sm-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-sm-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-sm-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-sm-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-sm-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-sm-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-sm-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-sm-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-sm-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-sm-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-sm-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-sm-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-sm-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-sm-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-sm-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-sm-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-sm-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-sm-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-sm-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-sm-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-sm-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-sm-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-sm-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-sm-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-sm-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-sm-0,
+ .bodywebsite .gx-sm-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-sm-0,
+ .bodywebsite .gy-sm-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-sm-1,
+ .bodywebsite .gx-sm-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-sm-1,
+ .bodywebsite .gy-sm-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-sm-2,
+ .bodywebsite .gx-sm-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-sm-2,
+ .bodywebsite .gy-sm-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-sm-3,
+ .bodywebsite .gx-sm-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-sm-3,
+ .bodywebsite .gy-sm-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-sm-4,
+ .bodywebsite .gx-sm-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-sm-4,
+ .bodywebsite .gy-sm-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-sm-5,
+ .bodywebsite .gx-sm-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-sm-5,
+ .bodywebsite .gy-sm-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .col-md {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-md-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-md-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-md-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-md-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-md-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-md-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-md-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-md-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-md-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-md-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-md-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-md-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-md-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-md-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-md-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-md-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-md-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-md-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-md-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-md-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-md-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-md-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-md-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-md-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-md-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-md-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-md-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-md-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-md-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-md-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-md-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-md-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-md-0,
+ .bodywebsite .gx-md-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-md-0,
+ .bodywebsite .gy-md-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-md-1,
+ .bodywebsite .gx-md-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-md-1,
+ .bodywebsite .gy-md-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-md-2,
+ .bodywebsite .gx-md-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-md-2,
+ .bodywebsite .gy-md-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-md-3,
+ .bodywebsite .gx-md-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-md-3,
+ .bodywebsite .gy-md-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-md-4,
+ .bodywebsite .gx-md-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-md-4,
+ .bodywebsite .gy-md-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-md-5,
+ .bodywebsite .gx-md-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-md-5,
+ .bodywebsite .gy-md-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .col-lg {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-lg-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-lg-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-lg-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-lg-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-lg-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-lg-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-lg-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-lg-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-lg-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-lg-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-lg-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-lg-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-lg-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-lg-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-lg-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-lg-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-lg-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-lg-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-lg-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-lg-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-lg-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-lg-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-lg-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-lg-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-lg-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-lg-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-lg-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-lg-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-lg-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-lg-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-lg-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-lg-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-lg-0,
+ .bodywebsite .gx-lg-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-lg-0,
+ .bodywebsite .gy-lg-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-lg-1,
+ .bodywebsite .gx-lg-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-lg-1,
+ .bodywebsite .gy-lg-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-lg-2,
+ .bodywebsite .gx-lg-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-lg-2,
+ .bodywebsite .gy-lg-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-lg-3,
+ .bodywebsite .gx-lg-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-lg-3,
+ .bodywebsite .gy-lg-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-lg-4,
+ .bodywebsite .gx-lg-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-lg-4,
+ .bodywebsite .gy-lg-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-lg-5,
+ .bodywebsite .gx-lg-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-lg-5,
+ .bodywebsite .gy-lg-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .col-xl {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-xl-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-xl-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-xl-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-xl-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-xl-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-xl-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-xl-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-xl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-xl-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-xl-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-xl-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-xl-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-xl-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-xl-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-xl-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-xl-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-xl-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-xl-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-xl-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-xl-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-xl-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-xl-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-xl-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-xl-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-xl-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-xl-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-xl-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-xl-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-xl-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-xl-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-xl-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-xl-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-xl-0,
+ .bodywebsite .gx-xl-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-xl-0,
+ .bodywebsite .gy-xl-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-xl-1,
+ .bodywebsite .gx-xl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-xl-1,
+ .bodywebsite .gy-xl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-xl-2,
+ .bodywebsite .gx-xl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-xl-2,
+ .bodywebsite .gy-xl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-xl-3,
+ .bodywebsite .gx-xl-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-xl-3,
+ .bodywebsite .gy-xl-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-xl-4,
+ .bodywebsite .gx-xl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-xl-4,
+ .bodywebsite .gy-xl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-xl-5,
+ .bodywebsite .gx-xl-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-xl-5,
+ .bodywebsite .gy-xl-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .col-xxl {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-xxl-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-xxl-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-xxl-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-xxl-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-xxl-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-xxl-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-xxl-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-xxl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-xxl-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-xxl-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-xxl-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-xxl-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-xxl-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-xxl-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-xxl-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-xxl-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-xxl-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-xxl-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-xxl-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-xxl-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-xxl-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-xxl-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-xxl-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-xxl-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-xxl-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-xxl-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-xxl-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-xxl-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-xxl-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-xxl-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-xxl-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-xxl-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-xxl-0,
+ .bodywebsite .gx-xxl-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-xxl-0,
+ .bodywebsite .gy-xxl-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-xxl-1,
+ .bodywebsite .gx-xxl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-xxl-1,
+ .bodywebsite .gy-xxl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-xxl-2,
+ .bodywebsite .gx-xxl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-xxl-2,
+ .bodywebsite .gy-xxl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-xxl-3,
+ .bodywebsite .gx-xxl-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-xxl-3,
+ .bodywebsite .gy-xxl-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-xxl-4,
+ .bodywebsite .gx-xxl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-xxl-4,
+ .bodywebsite .gy-xxl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-xxl-5,
+ .bodywebsite .gx-xxl-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-xxl-5,
+ .bodywebsite .gy-xxl-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+.bodywebsite .table {
+ --bs-table-color: var(--bs-body-color);
+ --bs-table-bg: transparent;
+ --bs-table-border-color: var(--bs-border-color);
+ --bs-table-accent-bg: transparent;
+ --bs-table-striped-color: var(--bs-body-color);
+ --bs-table-striped-bg: rgba(0, 0, 0, 0.05);
+ --bs-table-active-color: var(--bs-body-color);
+ --bs-table-active-bg: rgba(0, 0, 0, 0.1);
+ --bs-table-hover-color: var(--bs-body-color);
+ --bs-table-hover-bg: rgba(0, 0, 0, 0.075);
+ width: 100%;
+ margin-bottom: 1rem;
+ color: var(--bs-table-color);
+ vertical-align: top;
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table > :not(caption) > * > * {
+ padding: 0.5rem 0.5rem;
+ background-color: var(--bs-table-bg);
+ border-bottom-width: 1px;
+ box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg);
+}
+
+.bodywebsite .table > tbody {
+ vertical-align: inherit;
+}
+
+.bodywebsite .table > thead {
+ vertical-align: bottom;
+}
+
+.bodywebsite .table-group-divider {
+ border-top: 2px solid currentcolor;
+}
+
+.bodywebsite .caption-top {
+ caption-side: top;
+}
+
+.bodywebsite .table-sm > :not(caption) > * > * {
+ padding: 0.25rem 0.25rem;
+}
+
+.bodywebsite .table-bordered > :not(caption) > * {
+ border-width: 1px 0;
+}
+
+.bodywebsite .table-bordered > :not(caption) > * > * {
+ border-width: 0 1px;
+}
+
+.bodywebsite .table-borderless > :not(caption) > * > * {
+ border-bottom-width: 0;
+}
+
+.bodywebsite .table-borderless > :not(:first-child) {
+ border-top-width: 0;
+}
+
+.bodywebsite .table-striped > tbody > tr:nth-of-type(odd) > * {
+ --bs-table-accent-bg: var(--bs-table-striped-bg);
+ color: var(--bs-table-striped-color);
+}
+
+.bodywebsite .table-striped-columns > :not(caption) > tr > :nth-child(even) {
+ --bs-table-accent-bg: var(--bs-table-striped-bg);
+ color: var(--bs-table-striped-color);
+}
+
+.bodywebsite .table-active {
+ --bs-table-accent-bg: var(--bs-table-active-bg);
+ color: var(--bs-table-active-color);
+}
+
+.bodywebsite .table-hover > tbody > tr:hover > * {
+ --bs-table-accent-bg: var(--bs-table-hover-bg);
+ color: var(--bs-table-hover-color);
+}
+
+.bodywebsite .table-primary {
+ --bs-table-color: #000;
+ --bs-table-bg: #cfe2ff;
+ --bs-table-border-color: #bacbe6;
+ --bs-table-striped-bg: #c5d7f2;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #bacbe6;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #bfd1ec;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-secondary {
+ --bs-table-color: #000;
+ --bs-table-bg: #e2e3e5;
+ --bs-table-border-color: #cbccce;
+ --bs-table-striped-bg: #d7d8da;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #cbccce;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #d1d2d4;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-success {
+ --bs-table-color: #000;
+ --bs-table-bg: #d1e7dd;
+ --bs-table-border-color: #bcd0c7;
+ --bs-table-striped-bg: #c7dbd2;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #bcd0c7;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #c1d6cc;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-info {
+ --bs-table-color: #000;
+ --bs-table-bg: #cff4fc;
+ --bs-table-border-color: #badce3;
+ --bs-table-striped-bg: #c5e8ef;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #badce3;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #bfe2e9;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-warning {
+ --bs-table-color: #000;
+ --bs-table-bg: #fff3cd;
+ --bs-table-border-color: #e6dbb9;
+ --bs-table-striped-bg: #f2e7c3;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #e6dbb9;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #ece1be;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-danger {
+ --bs-table-color: #000;
+ --bs-table-bg: #f8d7da;
+ --bs-table-border-color: #dfc2c4;
+ --bs-table-striped-bg: #eccccf;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #dfc2c4;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #e5c7ca;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-light {
+ --bs-table-color: #000;
+ --bs-table-bg: #f8f9fa;
+ --bs-table-border-color: #dfe0e1;
+ --bs-table-striped-bg: #ecedee;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #dfe0e1;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #e5e6e7;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-dark {
+ --bs-table-color: #fff;
+ --bs-table-bg: #212529;
+ --bs-table-border-color: #373b3e;
+ --bs-table-striped-bg: #2c3034;
+ --bs-table-striped-color: #fff;
+ --bs-table-active-bg: #373b3e;
+ --bs-table-active-color: #fff;
+ --bs-table-hover-bg: #323539;
+ --bs-table-hover-color: #fff;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-responsive {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .table-responsive-sm {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .table-responsive-md {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .table-responsive-lg {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .table-responsive-xl {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .table-responsive-xxl {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+.bodywebsite .form-label {
+ margin-bottom: 0.5rem;
+}
+
+.bodywebsite .col-form-label {
+ padding-top: calc(0.375rem + 1px);
+ padding-bottom: calc(0.375rem + 1px);
+ margin-bottom: 0;
+ font-size: inherit;
+ line-height: 1.5;
+}
+
+.bodywebsite .col-form-label-lg {
+ padding-top: calc(0.5rem + 1px);
+ padding-bottom: calc(0.5rem + 1px);
+ font-size: 1.25rem;
+}
+
+.bodywebsite .col-form-label-sm {
+ padding-top: calc(0.25rem + 1px);
+ padding-bottom: calc(0.25rem + 1px);
+ font-size: 0.875rem;
+}
+
+.bodywebsite .form-text {
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: #6c757d;
+}
+
+.bodywebsite .form-control {
+ display: block;
+ width: 100%;
+ padding: 0.375rem 0.75rem;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #212529;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid #ced4da;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ border-radius: 0.375rem;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-control {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-control[type=file] {
+ overflow: hidden;
+}
+
+.bodywebsite .form-control[type=file]:not(:disabled):not([readonly]) {
+ cursor: pointer;
+}
+
+.bodywebsite .form-control:focus {
+ color: #212529;
+ background-color: #fff;
+ border-color: #86b7fe;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-control::-webkit-date-and-time-value {
+ height: 1.5em;
+}
+
+.bodywebsite .form-control::-moz-placeholder {
+ color: #6c757d;
+ opacity: 1;
+}
+
+.bodywebsite .form-control::placeholder {
+ color: #6c757d;
+ opacity: 1;
+}
+
+.bodywebsite .form-control:disabled {
+ background-color: #e9ecef;
+ opacity: 1;
+}
+
+.bodywebsite .form-control::-webkit-file-upload-button {
+ padding: 0.375rem 0.75rem;
+ margin: -0.375rem -0.75rem;
+ -webkit-margin-end: 0.75rem;
+ margin-inline-end: 0.75rem;
+ color: #212529;
+ background-color: #e9ecef;
+ pointer-events: none;
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+ border-inline-end-width: 1px;
+ border-radius: 0;
+ -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+.bodywebsite .form-control::file-selector-button {
+ padding: 0.375rem 0.75rem;
+ margin: -0.375rem -0.75rem;
+ -webkit-margin-end: 0.75rem;
+ margin-inline-end: 0.75rem;
+ color: #212529;
+ background-color: #e9ecef;
+ pointer-events: none;
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+ border-inline-end-width: 1px;
+ border-radius: 0;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-control::-webkit-file-upload-button {
+ -webkit-transition: none;
+ transition: none;
+ }
+
+ .bodywebsite .form-control::file-selector-button {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {
+ background-color: #dde0e3;
+}
+
+.bodywebsite .form-control:hover:not(:disabled):not([readonly])::file-selector-button {
+ background-color: #dde0e3;
+}
+
+.bodywebsite .form-control-plaintext {
+ display: block;
+ width: 100%;
+ padding: 0.375rem 0;
+ margin-bottom: 0;
+ line-height: 1.5;
+ color: #212529;
+ background-color: transparent;
+ border: solid transparent;
+ border-width: 1px 0;
+}
+
+.bodywebsite .form-control-plaintext:focus {
+ outline: 0;
+}
+
+.bodywebsite .form-control-plaintext.form-control-sm, .bodywebsite .form-control-plaintext.form-control-lg {
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.bodywebsite .form-control-sm {
+ min-height: calc(1.5em + 0.5rem + 2px);
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.25rem;
+}
+
+.bodywebsite .form-control-sm::-webkit-file-upload-button {
+ padding: 0.25rem 0.5rem;
+ margin: -0.25rem -0.5rem;
+ -webkit-margin-end: 0.5rem;
+ margin-inline-end: 0.5rem;
+}
+
+.bodywebsite .form-control-sm::file-selector-button {
+ padding: 0.25rem 0.5rem;
+ margin: -0.25rem -0.5rem;
+ -webkit-margin-end: 0.5rem;
+ margin-inline-end: 0.5rem;
+}
+
+.bodywebsite .form-control-lg {
+ min-height: calc(1.5em + 1rem + 2px);
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ border-radius: 0.5rem;
+}
+
+.bodywebsite .form-control-lg::-webkit-file-upload-button {
+ padding: 0.5rem 1rem;
+ margin: -0.5rem -1rem;
+ -webkit-margin-end: 1rem;
+ margin-inline-end: 1rem;
+}
+
+.bodywebsite .form-control-lg::file-selector-button {
+ padding: 0.5rem 1rem;
+ margin: -0.5rem -1rem;
+ -webkit-margin-end: 1rem;
+ margin-inline-end: 1rem;
+}
+
+.bodywebsite textarea.form-control {
+ min-height: calc(1.5em + 0.75rem + 2px);
+}
+
+.bodywebsite textarea.form-control-sm {
+ min-height: calc(1.5em + 0.5rem + 2px);
+}
+
+.bodywebsite textarea.form-control-lg {
+ min-height: calc(1.5em + 1rem + 2px);
+}
+
+.bodywebsite .form-control-color {
+ width: 3rem;
+ height: calc(1.5em + 0.75rem + 2px);
+ padding: 0.375rem;
+}
+
+.bodywebsite .form-control-color:not(:disabled):not([readonly]) {
+ cursor: pointer;
+}
+
+.bodywebsite .form-control-color::-moz-color-swatch {
+ border: 0 !important;
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .form-control-color::-webkit-color-swatch {
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .form-control-color.form-control-sm {
+ height: calc(1.5em + 0.5rem + 2px);
+}
+
+.bodywebsite .form-control-color.form-control-lg {
+ height: calc(1.5em + 1rem + 2px);
+}
+
+.bodywebsite .form-select {
+ display: block;
+ width: 100%;
+ padding: 0.375rem 2.25rem 0.375rem 0.75rem;
+ -moz-padding-start: calc(0.75rem - 3px);
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #212529;
+ background-color: #fff;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: right 0.75rem center;
+ background-size: 16px 12px;
+ border: 1px solid #ced4da;
+ border-radius: 0.375rem;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-select {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-select:focus {
+ border-color: #86b7fe;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-select[multiple], .bodywebsite .form-select[size]:not([size="1"]) {
+ padding-right: 0.75rem;
+ background-image: none;
+}
+
+.bodywebsite .form-select:disabled {
+ background-color: #e9ecef;
+}
+
+.bodywebsite .form-select:-moz-focusring {
+ color: transparent;
+ text-shadow: 0 0 0 #212529;
+}
+
+.bodywebsite .form-select-sm {
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+ padding-left: 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.25rem;
+}
+
+.bodywebsite .form-select-lg {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ padding-left: 1rem;
+ font-size: 1.25rem;
+ border-radius: 0.5rem;
+}
+
+.bodywebsite .form-check {
+ display: block;
+ min-height: 1.5rem;
+ padding-left: 1.5em;
+ margin-bottom: 0.125rem;
+}
+
+.bodywebsite .form-check .form-check-input {
+ float: left;
+ margin-left: -1.5em;
+}
+
+.bodywebsite .form-check-reverse {
+ padding-right: 1.5em;
+ padding-left: 0;
+ text-align: right;
+}
+
+.bodywebsite .form-check-reverse .form-check-input {
+ float: right;
+ margin-right: -1.5em;
+ margin-left: 0;
+}
+
+.bodywebsite .form-check-input {
+ width: 1em;
+ height: 1em;
+ margin-top: 0.25em;
+ vertical-align: top;
+ background-color: #fff;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: contain;
+ border: 1px solid rgba(0, 0, 0, 0.25);
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ -webkit-print-color-adjust: exact;
+ color-adjust: exact;
+ print-color-adjust: exact;
+}
+
+.bodywebsite .form-check-input[type=checkbox] {
+ border-radius: 0.25em;
+}
+
+.bodywebsite .form-check-input[type=radio] {
+ border-radius: 50%;
+}
+
+.bodywebsite .form-check-input:active {
+ filter: brightness(90%);
+}
+
+.bodywebsite .form-check-input:focus {
+ border-color: #86b7fe;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-check-input:checked {
+ background-color: #0d6efd;
+ border-color: #0d6efd;
+}
+
+.bodywebsite .form-check-input:checked[type=checkbox] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-check-input:checked[type=radio] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-check-input[type=checkbox]:indeterminate {
+ background-color: #0d6efd;
+ border-color: #0d6efd;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-check-input:disabled {
+ pointer-events: none;
+ filter: none;
+ opacity: 0.5;
+}
+
+.bodywebsite .form-check-input[disabled] ~ .form-check-label, .bodywebsite .form-check-input:disabled ~ .form-check-label {
+ cursor: default;
+ opacity: 0.5;
+}
+
+.bodywebsite .form-switch {
+ padding-left: 2.5em;
+}
+
+.bodywebsite .form-switch .form-check-input {
+ width: 2em;
+ margin-left: -2.5em;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");
+ background-position: left center;
+ border-radius: 2em;
+ transition: background-position 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-switch .form-check-input {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-switch .form-check-input:focus {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-switch .form-check-input:checked {
+ background-position: right center;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-switch.form-check-reverse {
+ padding-right: 2.5em;
+ padding-left: 0;
+}
+
+.bodywebsite .form-switch.form-check-reverse .form-check-input {
+ margin-right: -2.5em;
+ margin-left: 0;
+}
+
+.bodywebsite .form-check-inline {
+ display: inline-block;
+ margin-right: 1rem;
+}
+
+.bodywebsite .btn-check {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none;
+}
+
+.bodywebsite .btn-check[disabled] + .btn, .bodywebsite .btn-check:disabled + .btn {
+ pointer-events: none;
+ filter: none;
+ opacity: 0.65;
+}
+
+.bodywebsite .form-range {
+ width: 100%;
+ height: 1.5rem;
+ padding: 0;
+ background-color: transparent;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+.bodywebsite .form-range:focus {
+ outline: 0;
+}
+
+.bodywebsite .form-range:focus::-webkit-slider-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-range:focus::-moz-range-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-range::-moz-focus-outer {
+ border: 0;
+}
+
+.bodywebsite .form-range::-webkit-slider-thumb {
+ width: 1rem;
+ height: 1rem;
+ margin-top: -0.25rem;
+ background-color: #0d6efd;
+ border: 0;
+ border-radius: 1rem;
+ -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -webkit-appearance: none;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-range::-webkit-slider-thumb {
+ -webkit-transition: none;
+ transition: none;
+ }
+}
+
+.bodywebsite .form-range::-webkit-slider-thumb:active {
+ background-color: #b6d4fe;
+}
+
+.bodywebsite .form-range::-webkit-slider-runnable-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #dee2e6;
+ border-color: transparent;
+ border-radius: 1rem;
+}
+
+.bodywebsite .form-range::-moz-range-thumb {
+ width: 1rem;
+ height: 1rem;
+ background-color: #0d6efd;
+ border: 0;
+ border-radius: 1rem;
+ -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-range::-moz-range-thumb {
+ -moz-transition: none;
+ transition: none;
+ }
+}
+
+.bodywebsite .form-range::-moz-range-thumb:active {
+ background-color: #b6d4fe;
+}
+
+.bodywebsite .form-range::-moz-range-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #dee2e6;
+ border-color: transparent;
+ border-radius: 1rem;
+}
+
+.bodywebsite .form-range:disabled {
+ pointer-events: none;
+}
+
+.bodywebsite .form-range:disabled::-webkit-slider-thumb {
+ background-color: #adb5bd;
+}
+
+.bodywebsite .form-range:disabled::-moz-range-thumb {
+ background-color: #adb5bd;
+}
+
+.bodywebsite .form-floating {
+ position: relative;
+}
+
+.bodywebsite .form-floating > .form-control,
+ .bodywebsite .form-floating > .form-control-plaintext,
+ .bodywebsite .form-floating > .form-select {
+ height: calc(3.5rem + 2px);
+ line-height: 1.25;
+}
+
+.bodywebsite .form-floating > label {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ padding: 1rem 0.75rem;
+ overflow: hidden;
+ text-align: start;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ pointer-events: none;
+ border: 1px solid transparent;
+ transform-origin: 0 0;
+ transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-floating > label {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-floating > .form-control,
+ .bodywebsite .form-floating > .form-control-plaintext {
+ padding: 1rem 0.75rem;
+}
+
+.bodywebsite .form-floating > .form-control::-moz-placeholder, .bodywebsite .form-floating > .form-control-plaintext::-moz-placeholder {
+ color: transparent;
+}
+
+.bodywebsite .form-floating > .form-control::placeholder,
+ .bodywebsite .form-floating > .form-control-plaintext::placeholder {
+ color: transparent;
+}
+
+.bodywebsite .form-floating > .form-control:not(:-moz-placeholder-shown), .bodywebsite .form-floating > .form-control-plaintext:not(:-moz-placeholder-shown) {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.bodywebsite .form-floating > .form-control:focus, .bodywebsite .form-floating > .form-control:not(:placeholder-shown),
+ .bodywebsite .form-floating > .form-control-plaintext:focus,
+ .bodywebsite .form-floating > .form-control-plaintext:not(:placeholder-shown) {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.bodywebsite .form-floating > .form-control:-webkit-autofill,
+ .bodywebsite .form-floating > .form-control-plaintext:-webkit-autofill {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.bodywebsite .form-floating > .form-select {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.bodywebsite .form-floating > .form-control:not(:-moz-placeholder-shown) ~ label {
+ opacity: 0.65;
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
+}
+
+.bodywebsite .form-floating > .form-control:focus ~ label,
+ .bodywebsite .form-floating > .form-control:not(:placeholder-shown) ~ label,
+ .bodywebsite .form-floating > .form-control-plaintext ~ label,
+ .bodywebsite .form-floating > .form-select ~ label {
+ opacity: 0.65;
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
+}
+
+.bodywebsite .form-floating > .form-control:-webkit-autofill ~ label {
+ opacity: 0.65;
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
+}
+
+.bodywebsite .form-floating > .form-control-plaintext ~ label {
+ border-width: 1px 0;
+}
+
+.bodywebsite .input-group {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: stretch;
+ width: 100%;
+}
+
+.bodywebsite .input-group > .form-control,
+ .bodywebsite .input-group > .form-select,
+ .bodywebsite .input-group > .form-floating {
+ position: relative;
+ flex: 1 1 auto;
+ width: 1%;
+ min-width: 0;
+}
+
+.bodywebsite .input-group > .form-control:focus,
+ .bodywebsite .input-group > .form-select:focus,
+ .bodywebsite .input-group > .form-floating:focus-within {
+ z-index: 5;
+}
+
+.bodywebsite .input-group .btn {
+ position: relative;
+ z-index: 2;
+}
+
+.bodywebsite .input-group .btn:focus {
+ z-index: 5;
+}
+
+.bodywebsite .input-group-text {
+ display: flex;
+ align-items: center;
+ padding: 0.375rem 0.75rem;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #212529;
+ text-align: center;
+ white-space: nowrap;
+ background-color: #e9ecef;
+ border: 1px solid #ced4da;
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .input-group-lg > .form-control,
+ .bodywebsite .input-group-lg > .form-select,
+ .bodywebsite .input-group-lg > .input-group-text,
+ .bodywebsite .input-group-lg > .btn {
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ border-radius: 0.5rem;
+}
+
+.bodywebsite .input-group-sm > .form-control,
+ .bodywebsite .input-group-sm > .form-select,
+ .bodywebsite .input-group-sm > .input-group-text,
+ .bodywebsite .input-group-sm > .btn {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.25rem;
+}
+
+.bodywebsite .input-group-lg > .form-select,
+ .bodywebsite .input-group-sm > .form-select {
+ padding-right: 3rem;
+}
+
+.bodywebsite .input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),
+ .bodywebsite .input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3),
+ .bodywebsite .input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control,
+ .bodywebsite .input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.bodywebsite .input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),
+ .bodywebsite .input-group.has-validation > .dropdown-toggle:nth-last-child(n+4),
+ .bodywebsite .input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control,
+ .bodywebsite .input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.bodywebsite .input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {
+ margin-left: -1px;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .input-group > .form-floating:not(:first-child) > .form-control,
+ .bodywebsite .input-group > .form-floating:not(:first-child) > .form-select {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .valid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: #198754;
+}
+
+.bodywebsite .valid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 0.25rem 0.5rem;
+ margin-top: 0.1rem;
+ font-size: 0.875rem;
+ color: #fff;
+ background-color: rgba(25, 135, 84, 0.9);
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .was-validated :valid ~ .valid-feedback,
+ .bodywebsite .was-validated :valid ~ .valid-tooltip,
+ .bodywebsite .is-valid ~ .valid-feedback,
+ .bodywebsite .is-valid ~ .valid-tooltip {
+ display: block;
+}
+
+.bodywebsite .was-validated .form-control:valid, .bodywebsite .form-control.is-valid {
+ border-color: #198754;
+ padding-right: calc(1.5em + 0.75rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: right calc(0.375em + 0.1875rem) center;
+ background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.bodywebsite .was-validated .form-control:valid:focus, .bodywebsite .form-control.is-valid:focus {
+ border-color: #198754;
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
+}
+
+.bodywebsite .was-validated textarea.form-control:valid, .bodywebsite textarea.form-control.is-valid {
+ padding-right: calc(1.5em + 0.75rem);
+ background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
+}
+
+.bodywebsite .was-validated .form-select:valid, .bodywebsite .form-select.is-valid {
+ border-color: #198754;
+}
+
+.bodywebsite .was-validated .form-select:valid:not([multiple]):not([size]), .bodywebsite .was-validated .form-select:valid:not([multiple])[size="1"], .bodywebsite .form-select.is-valid:not([multiple]):not([size]), .bodywebsite .form-select.is-valid:not([multiple])[size="1"] {
+ padding-right: 4.125rem;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
+ background-position: right 0.75rem center, center right 2.25rem;
+ background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.bodywebsite .was-validated .form-select:valid:focus, .bodywebsite .form-select.is-valid:focus {
+ border-color: #198754;
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
+}
+
+.bodywebsite .was-validated .form-control-color:valid, .bodywebsite .form-control-color.is-valid {
+ width: calc(3rem + calc(1.5em + 0.75rem));
+}
+
+.bodywebsite .was-validated .form-check-input:valid, .bodywebsite .form-check-input.is-valid {
+ border-color: #198754;
+}
+
+.bodywebsite .was-validated .form-check-input:valid:checked, .bodywebsite .form-check-input.is-valid:checked {
+ background-color: #198754;
+}
+
+.bodywebsite .was-validated .form-check-input:valid:focus, .bodywebsite .form-check-input.is-valid:focus {
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
+}
+
+.bodywebsite .was-validated .form-check-input:valid ~ .form-check-label, .bodywebsite .form-check-input.is-valid ~ .form-check-label {
+ color: #198754;
+}
+
+.bodywebsite .form-check-inline .form-check-input ~ .valid-feedback {
+ margin-left: 0.5em;
+}
+
+.bodywebsite .was-validated .input-group > .form-control:not(:focus):valid, .bodywebsite .input-group > .form-control:not(:focus).is-valid,
+ .bodywebsite .was-validated .input-group > .form-select:not(:focus):valid,
+ .bodywebsite .input-group > .form-select:not(:focus).is-valid,
+ .bodywebsite .was-validated .input-group > .form-floating:not(:focus-within):valid,
+ .bodywebsite .input-group > .form-floating:not(:focus-within).is-valid {
+ z-index: 3;
+}
+
+.bodywebsite .invalid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: #dc3545;
+}
+
+.bodywebsite .invalid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 0.25rem 0.5rem;
+ margin-top: 0.1rem;
+ font-size: 0.875rem;
+ color: #fff;
+ background-color: rgba(220, 53, 69, 0.9);
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .was-validated :invalid ~ .invalid-feedback,
+ .bodywebsite .was-validated :invalid ~ .invalid-tooltip,
+ .bodywebsite .is-invalid ~ .invalid-feedback,
+ .bodywebsite .is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.bodywebsite .was-validated .form-control:invalid, .bodywebsite .form-control.is-invalid {
+ border-color: #dc3545;
+ padding-right: calc(1.5em + 0.75rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: right calc(0.375em + 0.1875rem) center;
+ background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.bodywebsite .was-validated .form-control:invalid:focus, .bodywebsite .form-control.is-invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
+}
+
+.bodywebsite .was-validated textarea.form-control:invalid, .bodywebsite textarea.form-control.is-invalid {
+ padding-right: calc(1.5em + 0.75rem);
+ background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
+}
+
+.bodywebsite .was-validated .form-select:invalid, .bodywebsite .form-select.is-invalid {
+ border-color: #dc3545;
+}
+
+.bodywebsite .was-validated .form-select:invalid:not([multiple]):not([size]), .bodywebsite .was-validated .form-select:invalid:not([multiple])[size="1"], .bodywebsite .form-select.is-invalid:not([multiple]):not([size]), .bodywebsite .form-select.is-invalid:not([multiple])[size="1"] {
+ padding-right: 4.125rem;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
+ background-position: right 0.75rem center, center right 2.25rem;
+ background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.bodywebsite .was-validated .form-select:invalid:focus, .bodywebsite .form-select.is-invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
+}
+
+.bodywebsite .was-validated .form-control-color:invalid, .bodywebsite .form-control-color.is-invalid {
+ width: calc(3rem + calc(1.5em + 0.75rem));
+}
+
+.bodywebsite .was-validated .form-check-input:invalid, .bodywebsite .form-check-input.is-invalid {
+ border-color: #dc3545;
+}
+
+.bodywebsite .was-validated .form-check-input:invalid:checked, .bodywebsite .form-check-input.is-invalid:checked {
+ background-color: #dc3545;
+}
+
+.bodywebsite .was-validated .form-check-input:invalid:focus, .bodywebsite .form-check-input.is-invalid:focus {
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
+}
+
+.bodywebsite .was-validated .form-check-input:invalid ~ .form-check-label, .bodywebsite .form-check-input.is-invalid ~ .form-check-label {
+ color: #dc3545;
+}
+
+.bodywebsite .form-check-inline .form-check-input ~ .invalid-feedback {
+ margin-left: 0.5em;
+}
+
+.bodywebsite .was-validated .input-group > .form-control:not(:focus):invalid, .bodywebsite .input-group > .form-control:not(:focus).is-invalid,
+ .bodywebsite .was-validated .input-group > .form-select:not(:focus):invalid,
+ .bodywebsite .input-group > .form-select:not(:focus).is-invalid,
+ .bodywebsite .was-validated .input-group > .form-floating:not(:focus-within):invalid,
+ .bodywebsite .input-group > .form-floating:not(:focus-within).is-invalid {
+ z-index: 4;
+}
+
+.bodywebsite .btn {
+ --bs-btn-padding-x: 0.75rem;
+ --bs-btn-padding-y: 0.375rem;
+ --bs-btn-font-size: 1rem;
+ --bs-btn-font-weight: 400;
+ --bs-btn-line-height: 1.5;
+ --bs-btn-color: #212529;
+ --bs-btn-bg: transparent;
+ --bs-btn-border-width: 1px;
+ --bs-btn-border-color: transparent;
+ --bs-btn-border-radius: 0.375rem;
+ --bs-btn-hover-border-color: transparent;
+ --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+ --bs-btn-disabled-opacity: 0.65;
+ display: inline-block;
+ padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x);
+ font-family: var(--bs-btn-font-family);
+ font-size: var(--bs-btn-font-size);
+ font-weight: var(--bs-btn-font-weight);
+ line-height: var(--bs-btn-line-height);
+ color: var(--bs-btn-color);
+ text-align: center;
+ text-decoration: none;
+ vertical-align: middle;
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);
+ border-radius: var(--bs-btn-border-radius);
+ background-color: var(--bs-btn-bg);
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .btn {
+ transition: none;
+ }
+}
+
+.bodywebsite :not(.btn-check) + .btn:hover, .bodywebsite .btn:first-child:hover {
+ color: var(--bs-btn-hover-color);
+ background-color: var(--bs-btn-hover-bg);
+ border-color: var(--bs-btn-hover-border-color);
+}
+
+.bodywebsite .btn:focus-visible {
+ color: var(--bs-btn-hover-color);
+ background-color: var(--bs-btn-hover-bg);
+ border-color: var(--bs-btn-hover-border-color);
+ outline: 0;
+ box-shadow: var(--bs-btn-focus-box-shadow);
+}
+
+.bodywebsite .btn-check:focus-visible + .btn {
+ border-color: var(--bs-btn-hover-border-color);
+ outline: 0;
+ box-shadow: var(--bs-btn-focus-box-shadow);
+}
+
+.bodywebsite .btn-check:checked + .btn, .bodywebsite :not(.btn-check) + .btn:active, .bodywebsite .btn:first-child:active, .bodywebsite .btn.active, .bodywebsite .btn.show {
+ color: var(--bs-btn-active-color);
+ background-color: var(--bs-btn-active-bg);
+ border-color: var(--bs-btn-active-border-color);
+}
+
+.bodywebsite .btn-check:checked + .btn:focus-visible, .bodywebsite :not(.btn-check) + .btn:active:focus-visible, .bodywebsite .btn:first-child:active:focus-visible, .bodywebsite .btn.active:focus-visible, .bodywebsite .btn.show:focus-visible {
+ box-shadow: var(--bs-btn-focus-box-shadow);
+}
+
+.bodywebsite .btn:disabled, .bodywebsite .btn.disabled, .bodywebsite fieldset:disabled .btn {
+ color: var(--bs-btn-disabled-color);
+ pointer-events: none;
+ background-color: var(--bs-btn-disabled-bg);
+ border-color: var(--bs-btn-disabled-border-color);
+ opacity: var(--bs-btn-disabled-opacity);
+}
+
+.bodywebsite .btn-primary {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #0d6efd;
+ --bs-btn-border-color: #0d6efd;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #0b5ed7;
+ --bs-btn-hover-border-color: #0a58ca;
+ --bs-btn-focus-shadow-rgb: 49, 132, 253;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #0a58ca;
+ --bs-btn-active-border-color: #0a53be;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #0d6efd;
+ --bs-btn-disabled-border-color: #0d6efd;
+}
+
+.bodywebsite .btn-secondary {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #6c757d;
+ --bs-btn-border-color: #6c757d;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #5c636a;
+ --bs-btn-hover-border-color: #565e64;
+ --bs-btn-focus-shadow-rgb: 130, 138, 145;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #565e64;
+ --bs-btn-active-border-color: #51585e;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #6c757d;
+ --bs-btn-disabled-border-color: #6c757d;
+}
+
+.bodywebsite .btn-success {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #198754;
+ --bs-btn-border-color: #198754;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #157347;
+ --bs-btn-hover-border-color: #146c43;
+ --bs-btn-focus-shadow-rgb: 60, 153, 110;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #146c43;
+ --bs-btn-active-border-color: #13653f;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #198754;
+ --bs-btn-disabled-border-color: #198754;
+}
+
+.bodywebsite .btn-info {
+ --bs-btn-color: #000;
+ --bs-btn-bg: #0dcaf0;
+ --bs-btn-border-color: #0dcaf0;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #31d2f2;
+ --bs-btn-hover-border-color: #25cff2;
+ --bs-btn-focus-shadow-rgb: 11, 172, 204;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #3dd5f3;
+ --bs-btn-active-border-color: #25cff2;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #000;
+ --bs-btn-disabled-bg: #0dcaf0;
+ --bs-btn-disabled-border-color: #0dcaf0;
+}
+
+.bodywebsite .btn-warning {
+ --bs-btn-color: #000;
+ --bs-btn-bg: #ffc107;
+ --bs-btn-border-color: #ffc107;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #ffca2c;
+ --bs-btn-hover-border-color: #ffc720;
+ --bs-btn-focus-shadow-rgb: 217, 164, 6;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #ffcd39;
+ --bs-btn-active-border-color: #ffc720;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #000;
+ --bs-btn-disabled-bg: #ffc107;
+ --bs-btn-disabled-border-color: #ffc107;
+}
+
+.bodywebsite .btn-danger {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #dc3545;
+ --bs-btn-border-color: #dc3545;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #bb2d3b;
+ --bs-btn-hover-border-color: #b02a37;
+ --bs-btn-focus-shadow-rgb: 225, 83, 97;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #b02a37;
+ --bs-btn-active-border-color: #a52834;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #dc3545;
+ --bs-btn-disabled-border-color: #dc3545;
+}
+
+.bodywebsite .btn-light {
+ --bs-btn-color: #000;
+ --bs-btn-bg: #f8f9fa;
+ --bs-btn-border-color: #f8f9fa;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #d3d4d5;
+ --bs-btn-hover-border-color: #c6c7c8;
+ --bs-btn-focus-shadow-rgb: 211, 212, 213;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #c6c7c8;
+ --bs-btn-active-border-color: #babbbc;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #000;
+ --bs-btn-disabled-bg: #f8f9fa;
+ --bs-btn-disabled-border-color: #f8f9fa;
+}
+
+.bodywebsite .btn-dark {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #212529;
+ --bs-btn-border-color: #212529;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #424649;
+ --bs-btn-hover-border-color: #373b3e;
+ --bs-btn-focus-shadow-rgb: 66, 70, 73;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #4d5154;
+ --bs-btn-active-border-color: #373b3e;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #212529;
+ --bs-btn-disabled-border-color: #212529;
+}
+
+.bodywebsite .btn-outline-primary {
+ --bs-btn-color: #0d6efd;
+ --bs-btn-border-color: #0d6efd;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #0d6efd;
+ --bs-btn-hover-border-color: #0d6efd;
+ --bs-btn-focus-shadow-rgb: 13, 110, 253;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #0d6efd;
+ --bs-btn-active-border-color: #0d6efd;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #0d6efd;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #0d6efd;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-secondary {
+ --bs-btn-color: #6c757d;
+ --bs-btn-border-color: #6c757d;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #6c757d;
+ --bs-btn-hover-border-color: #6c757d;
+ --bs-btn-focus-shadow-rgb: 108, 117, 125;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #6c757d;
+ --bs-btn-active-border-color: #6c757d;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #6c757d;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #6c757d;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-success {
+ --bs-btn-color: #198754;
+ --bs-btn-border-color: #198754;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #198754;
+ --bs-btn-hover-border-color: #198754;
+ --bs-btn-focus-shadow-rgb: 25, 135, 84;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #198754;
+ --bs-btn-active-border-color: #198754;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #198754;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #198754;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-info {
+ --bs-btn-color: #0dcaf0;
+ --bs-btn-border-color: #0dcaf0;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #0dcaf0;
+ --bs-btn-hover-border-color: #0dcaf0;
+ --bs-btn-focus-shadow-rgb: 13, 202, 240;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #0dcaf0;
+ --bs-btn-active-border-color: #0dcaf0;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #0dcaf0;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #0dcaf0;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-warning {
+ --bs-btn-color: #ffc107;
+ --bs-btn-border-color: #ffc107;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #ffc107;
+ --bs-btn-hover-border-color: #ffc107;
+ --bs-btn-focus-shadow-rgb: 255, 193, 7;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #ffc107;
+ --bs-btn-active-border-color: #ffc107;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #ffc107;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #ffc107;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-danger {
+ --bs-btn-color: #dc3545;
+ --bs-btn-border-color: #dc3545;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #dc3545;
+ --bs-btn-hover-border-color: #dc3545;
+ --bs-btn-focus-shadow-rgb: 220, 53, 69;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #dc3545;
+ --bs-btn-active-border-color: #dc3545;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #dc3545;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #dc3545;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-light {
+ --bs-btn-color: #f8f9fa;
+ --bs-btn-border-color: #f8f9fa;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #f8f9fa;
+ --bs-btn-hover-border-color: #f8f9fa;
+ --bs-btn-focus-shadow-rgb: 248, 249, 250;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #f8f9fa;
+ --bs-btn-active-border-color: #f8f9fa;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #f8f9fa;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #f8f9fa;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-dark {
+ --bs-btn-color: #212529;
+ --bs-btn-border-color: #212529;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #212529;
+ --bs-btn-hover-border-color: #212529;
+ --bs-btn-focus-shadow-rgb: 33, 37, 41;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #212529;
+ --bs-btn-active-border-color: #212529;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #212529;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #212529;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-link {
+ --bs-btn-font-weight: 400;
+ --bs-btn-color: var(--bs-link-color);
+ --bs-btn-bg: transparent;
+ --bs-btn-border-color: transparent;
+ --bs-btn-hover-color: var(--bs-link-hover-color);
+ --bs-btn-hover-border-color: transparent;
+ --bs-btn-active-color: var(--bs-link-hover-color);
+ --bs-btn-active-border-color: transparent;
+ --bs-btn-disabled-color: #6c757d;
+ --bs-btn-disabled-border-color: transparent;
+ --bs-btn-box-shadow: none;
+ --bs-btn-focus-shadow-rgb: 49, 132, 253;
+ text-decoration: underline;
+}
+
+.bodywebsite .btn-link:focus-visible {
+ color: var(--bs-btn-color);
+}
+
+.bodywebsite .btn-link:hover {
+ color: var(--bs-btn-hover-color);
+}
+
+.bodywebsite .btn-lg, .bodywebsite .btn-group-lg > .btn {
+ --bs-btn-padding-y: 0.5rem;
+ --bs-btn-padding-x: 1rem;
+ --bs-btn-font-size: 1.25rem;
+ --bs-btn-border-radius: 0.5rem;
+}
+
+.bodywebsite .btn-sm, .bodywebsite .btn-group-sm > .btn {
+ --bs-btn-padding-y: 0.25rem;
+ --bs-btn-padding-x: 0.5rem;
+ --bs-btn-font-size: 0.875rem;
+ --bs-btn-border-radius: 0.25rem;
+}
+
+.bodywebsite .fade {
+ transition: opacity 0.15s linear;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .fade {
+ transition: none;
+ }
+}
+
+.bodywebsite .fade:not(.show) {
+ opacity: 0;
+}
+
+.bodywebsite .collapse:not(.show) {
+ display: none;
+}
+
+.bodywebsite .collapsing {
+ height: 0;
+ overflow: hidden;
+ transition: height 0.35s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .collapsing {
+ transition: none;
+ }
+}
+
+.bodywebsite .collapsing.collapse-horizontal {
+ width: 0;
+ height: auto;
+ transition: width 0.35s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .collapsing.collapse-horizontal {
+ transition: none;
+ }
+}
+
+.bodywebsite .dropup,
+ .bodywebsite .dropend,
+ .bodywebsite .dropdown,
+ .bodywebsite .dropstart,
+ .bodywebsite .dropup-center,
+ .bodywebsite .dropdown-center {
+ position: relative;
+}
+
+.bodywebsite .dropdown-toggle {
+ white-space: nowrap;
+}
+
+.bodywebsite .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0;
+ border-left: 0.3em solid transparent;
+}
+
+.bodywebsite .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropdown-menu {
+ --bs-dropdown-zindex: 1000;
+ --bs-dropdown-min-width: 10rem;
+ --bs-dropdown-padding-x: 0;
+ --bs-dropdown-padding-y: 0.5rem;
+ --bs-dropdown-spacer: 0.125rem;
+ --bs-dropdown-font-size: 1rem;
+ --bs-dropdown-color: #212529;
+ --bs-dropdown-bg: #fff;
+ --bs-dropdown-border-color: var(--bs-border-color-translucent);
+ --bs-dropdown-border-radius: 0.375rem;
+ --bs-dropdown-border-width: 1px;
+ --bs-dropdown-inner-border-radius: calc(0.375rem - 1px);
+ --bs-dropdown-divider-bg: var(--bs-border-color-translucent);
+ --bs-dropdown-divider-margin-y: 0.5rem;
+ --bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ --bs-dropdown-link-color: #212529;
+ --bs-dropdown-link-hover-color: #1e2125;
+ --bs-dropdown-link-hover-bg: #e9ecef;
+ --bs-dropdown-link-active-color: #fff;
+ --bs-dropdown-link-active-bg: #0d6efd;
+ --bs-dropdown-link-disabled-color: #adb5bd;
+ --bs-dropdown-item-padding-x: 1rem;
+ --bs-dropdown-item-padding-y: 0.25rem;
+ --bs-dropdown-header-color: #6c757d;
+ --bs-dropdown-header-padding-x: 1rem;
+ --bs-dropdown-header-padding-y: 0.5rem;
+ position: absolute;
+ z-index: var(--bs-dropdown-zindex);
+ display: none;
+ min-width: var(--bs-dropdown-min-width);
+ padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);
+ margin: 0;
+ font-size: var(--bs-dropdown-font-size);
+ color: var(--bs-dropdown-color);
+ text-align: left;
+ list-style: none;
+ background-color: var(--bs-dropdown-bg);
+ background-clip: padding-box;
+ border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);
+ border-radius: var(--bs-dropdown-border-radius);
+}
+
+.bodywebsite .dropdown-menu[data-bs-popper] {
+ top: 100%;
+ left: 0;
+ margin-top: var(--bs-dropdown-spacer);
+}
+
+.bodywebsite .dropdown-menu-start {
+ --bs-position: start;
+}
+
+.bodywebsite .dropdown-menu-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+}
+
+.bodywebsite .dropdown-menu-end {
+ --bs-position: end;
+}
+
+.bodywebsite .dropdown-menu-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .dropdown-menu-sm-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-sm-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-sm-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-sm-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .dropdown-menu-md-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-md-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-md-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-md-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .dropdown-menu-lg-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-lg-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-lg-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-lg-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .dropdown-menu-xl-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-xl-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-xl-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-xl-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .dropdown-menu-xxl-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-xxl-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-xxl-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-xxl-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+.bodywebsite .dropup .dropdown-menu[data-bs-popper] {
+ top: auto;
+ bottom: 100%;
+ margin-top: 0;
+ margin-bottom: var(--bs-dropdown-spacer);
+}
+
+.bodywebsite .dropup .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0.3em solid;
+ border-left: 0.3em solid transparent;
+}
+
+.bodywebsite .dropup .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropend .dropdown-menu[data-bs-popper] {
+ top: 0;
+ right: auto;
+ left: 100%;
+ margin-top: 0;
+ margin-left: var(--bs-dropdown-spacer);
+}
+
+.bodywebsite .dropend .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid transparent;
+ border-right: 0;
+ border-bottom: 0.3em solid transparent;
+ border-left: 0.3em solid;
+}
+
+.bodywebsite .dropend .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropend .dropdown-toggle::after {
+ vertical-align: 0;
+}
+
+.bodywebsite .dropstart .dropdown-menu[data-bs-popper] {
+ top: 0;
+ right: 100%;
+ left: auto;
+ margin-top: 0;
+ margin-right: var(--bs-dropdown-spacer);
+}
+
+.bodywebsite .dropstart .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+}
+
+.bodywebsite .dropstart .dropdown-toggle::after {
+ display: none;
+}
+
+.bodywebsite .dropstart .dropdown-toggle::before {
+ display: inline-block;
+ margin-right: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid transparent;
+ border-right: 0.3em solid;
+ border-bottom: 0.3em solid transparent;
+}
+
+.bodywebsite .dropstart .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropstart .dropdown-toggle::before {
+ vertical-align: 0;
+}
+
+.bodywebsite .dropdown-divider {
+ height: 0;
+ margin: var(--bs-dropdown-divider-margin-y) 0;
+ overflow: hidden;
+ border-top: 1px solid var(--bs-dropdown-divider-bg);
+ opacity: 1;
+}
+
+.bodywebsite .dropdown-item {
+ display: block;
+ width: 100%;
+ padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);
+ clear: both;
+ font-weight: 400;
+ color: var(--bs-dropdown-link-color);
+ text-align: inherit;
+ text-decoration: none;
+ white-space: nowrap;
+ background-color: transparent;
+ border: 0;
+}
+
+.bodywebsite .dropdown-item:hover, .bodywebsite .dropdown-item:focus {
+ color: var(--bs-dropdown-link-hover-color);
+ background-color: var(--bs-dropdown-link-hover-bg);
+}
+
+.bodywebsite .dropdown-item.active, .bodywebsite .dropdown-item:active {
+ color: var(--bs-dropdown-link-active-color);
+ text-decoration: none;
+ background-color: var(--bs-dropdown-link-active-bg);
+}
+
+.bodywebsite .dropdown-item.disabled, .bodywebsite .dropdown-item:disabled {
+ color: var(--bs-dropdown-link-disabled-color);
+ pointer-events: none;
+ background-color: transparent;
+}
+
+.bodywebsite .dropdown-menu.show {
+ display: block;
+}
+
+.bodywebsite .dropdown-header {
+ display: block;
+ padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);
+ margin-bottom: 0;
+ font-size: 0.875rem;
+ color: var(--bs-dropdown-header-color);
+ white-space: nowrap;
+}
+
+.bodywebsite .dropdown-item-text {
+ display: block;
+ padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);
+ color: var(--bs-dropdown-link-color);
+}
+
+.bodywebsite .dropdown-menu-dark {
+ --bs-dropdown-color: #dee2e6;
+ --bs-dropdown-bg: #343a40;
+ --bs-dropdown-border-color: var(--bs-border-color-translucent);
+ --bs-dropdown-link-color: #dee2e6;
+ --bs-dropdown-link-hover-color: #fff;
+ --bs-dropdown-divider-bg: var(--bs-border-color-translucent);
+ --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);
+ --bs-dropdown-link-active-color: #fff;
+ --bs-dropdown-link-active-bg: #0d6efd;
+ --bs-dropdown-link-disabled-color: #adb5bd;
+ --bs-dropdown-header-color: #adb5bd;
+}
+
+.bodywebsite .btn-group,
+ .bodywebsite .btn-group-vertical {
+ position: relative;
+ display: inline-flex;
+ vertical-align: middle;
+}
+
+.bodywebsite .btn-group > .btn,
+ .bodywebsite .btn-group-vertical > .btn {
+ position: relative;
+ flex: 1 1 auto;
+}
+
+.bodywebsite .btn-group > .btn-check:checked + .btn,
+ .bodywebsite .btn-group > .btn-check:focus + .btn,
+ .bodywebsite .btn-group > .btn:hover,
+ .bodywebsite .btn-group > .btn:focus,
+ .bodywebsite .btn-group > .btn:active,
+ .bodywebsite .btn-group > .btn.active,
+ .bodywebsite .btn-group-vertical > .btn-check:checked + .btn,
+ .bodywebsite .btn-group-vertical > .btn-check:focus + .btn,
+ .bodywebsite .btn-group-vertical > .btn:hover,
+ .bodywebsite .btn-group-vertical > .btn:focus,
+ .bodywebsite .btn-group-vertical > .btn:active,
+ .bodywebsite .btn-group-vertical > .btn.active {
+ z-index: 1;
+}
+
+.bodywebsite .btn-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+}
+
+.bodywebsite .btn-toolbar .input-group {
+ width: auto;
+}
+
+.bodywebsite .btn-group {
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .btn-group > :not(.btn-check:first-child) + .btn,
+ .bodywebsite .btn-group > .btn-group:not(:first-child) {
+ margin-left: -1px;
+}
+
+.bodywebsite .btn-group > .btn:not(:last-child):not(.dropdown-toggle),
+ .bodywebsite .btn-group > .btn.dropdown-toggle-split:first-child,
+ .bodywebsite .btn-group > .btn-group:not(:last-child) > .btn {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.bodywebsite .btn-group > .btn:nth-child(n+3),
+ .bodywebsite .btn-group > :not(.btn-check) + .btn,
+ .bodywebsite .btn-group > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .dropdown-toggle-split {
+ padding-right: 0.5625rem;
+ padding-left: 0.5625rem;
+}
+
+.bodywebsite .dropdown-toggle-split::after, .bodywebsite .dropup .dropdown-toggle-split::after, .bodywebsite .dropend .dropdown-toggle-split::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropstart .dropdown-toggle-split::before {
+ margin-right: 0;
+}
+
+.bodywebsite .btn-sm + .dropdown-toggle-split, .bodywebsite .btn-group-sm > .btn + .dropdown-toggle-split {
+ padding-right: 0.375rem;
+ padding-left: 0.375rem;
+}
+
+.bodywebsite .btn-lg + .dropdown-toggle-split, .bodywebsite .btn-group-lg > .btn + .dropdown-toggle-split {
+ padding-right: 0.75rem;
+ padding-left: 0.75rem;
+}
+
+.bodywebsite .btn-group-vertical {
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+}
+
+.bodywebsite .btn-group-vertical > .btn,
+ .bodywebsite .btn-group-vertical > .btn-group {
+ width: 100%;
+}
+
+.bodywebsite .btn-group-vertical > .btn:not(:first-child),
+ .bodywebsite .btn-group-vertical > .btn-group:not(:first-child) {
+ margin-top: -1px;
+}
+
+.bodywebsite .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),
+ .bodywebsite .btn-group-vertical > .btn-group:not(:last-child) > .btn {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .btn-group-vertical > .btn ~ .btn,
+ .bodywebsite .btn-group-vertical > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.bodywebsite .nav {
+ --bs-nav-link-padding-x: 1rem;
+ --bs-nav-link-padding-y: 0.5rem;
+ --bs-nav-link-color: var(--bs-link-color);
+ --bs-nav-link-hover-color: var(--bs-link-hover-color);
+ --bs-nav-link-disabled-color: #6c757d;
+ display: flex;
+ flex-wrap: wrap;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+
+.bodywebsite .nav-link {
+ display: block;
+ padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);
+ font-size: var(--bs-nav-link-font-size);
+ font-weight: var(--bs-nav-link-font-weight);
+ color: var(--bs-nav-link-color);
+ text-decoration: none;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .nav-link {
+ transition: none;
+ }
+}
+
+.bodywebsite .nav-link:hover, .bodywebsite .nav-link:focus {
+ color: var(--bs-nav-link-hover-color);
+}
+
+.bodywebsite .nav-link.disabled {
+ color: var(--bs-nav-link-disabled-color);
+ pointer-events: none;
+ cursor: default;
+}
+
+.bodywebsite .nav-tabs {
+ --bs-nav-tabs-border-width: 1px;
+ --bs-nav-tabs-border-color: #dee2e6;
+ --bs-nav-tabs-border-radius: 0.375rem;
+ --bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef #dee2e6;
+ --bs-nav-tabs-link-active-color: #495057;
+ --bs-nav-tabs-link-active-bg: #fff;
+ --bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff;
+ border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color);
+}
+
+.bodywebsite .nav-tabs .nav-link {
+ margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width));
+ background: none;
+ border: var(--bs-nav-tabs-border-width) solid transparent;
+ border-top-left-radius: var(--bs-nav-tabs-border-radius);
+ border-top-right-radius: var(--bs-nav-tabs-border-radius);
+}
+
+.bodywebsite .nav-tabs .nav-link:hover, .bodywebsite .nav-tabs .nav-link:focus {
+ isolation: isolate;
+ border-color: var(--bs-nav-tabs-link-hover-border-color);
+}
+
+.bodywebsite .nav-tabs .nav-link.disabled, .bodywebsite .nav-tabs .nav-link:disabled {
+ color: var(--bs-nav-link-disabled-color);
+ background-color: transparent;
+ border-color: transparent;
+}
+
+.bodywebsite .nav-tabs .nav-link.active,
+ .bodywebsite .nav-tabs .nav-item.show .nav-link {
+ color: var(--bs-nav-tabs-link-active-color);
+ background-color: var(--bs-nav-tabs-link-active-bg);
+ border-color: var(--bs-nav-tabs-link-active-border-color);
+}
+
+.bodywebsite .nav-tabs .dropdown-menu {
+ margin-top: calc(-1 * var(--bs-nav-tabs-border-width));
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.bodywebsite .nav-pills {
+ --bs-nav-pills-border-radius: 0.375rem;
+ --bs-nav-pills-link-active-color: #fff;
+ --bs-nav-pills-link-active-bg: #0d6efd;
+}
+
+.bodywebsite .nav-pills .nav-link {
+ background: none;
+ border: 0;
+ border-radius: var(--bs-nav-pills-border-radius);
+}
+
+.bodywebsite .nav-pills .nav-link:disabled {
+ color: var(--bs-nav-link-disabled-color);
+ background-color: transparent;
+ border-color: transparent;
+}
+
+.bodywebsite .nav-pills .nav-link.active,
+ .bodywebsite .nav-pills .show > .nav-link {
+ color: var(--bs-nav-pills-link-active-color);
+ background-color: var(--bs-nav-pills-link-active-bg);
+}
+
+.bodywebsite .nav-fill > .nav-link,
+ .bodywebsite .nav-fill .nav-item {
+ flex: 1 1 auto;
+ text-align: center;
+}
+
+.bodywebsite .nav-justified > .nav-link,
+ .bodywebsite .nav-justified .nav-item {
+ flex-basis: 0;
+ flex-grow: 1;
+ text-align: center;
+}
+
+.bodywebsite .nav-fill .nav-item .nav-link,
+ .bodywebsite .nav-justified .nav-item .nav-link {
+ width: 100%;
+}
+
+.bodywebsite .tab-content > .tab-pane {
+ display: none;
+}
+
+.bodywebsite .tab-content > .active {
+ display: block;
+}
+
+.bodywebsite .navbar {
+ --bs-navbar-padding-x: 0;
+ --bs-navbar-padding-y: 0.5rem;
+ --bs-navbar-color: rgba(0, 0, 0, 0.55);
+ --bs-navbar-hover-color: rgba(0, 0, 0, 0.7);
+ --bs-navbar-disabled-color: rgba(0, 0, 0, 0.3);
+ --bs-navbar-active-color: rgba(0, 0, 0, 0.9);
+ --bs-navbar-brand-padding-y: 0.3125rem;
+ --bs-navbar-brand-margin-end: 1rem;
+ --bs-navbar-brand-font-size: 1.25rem;
+ --bs-navbar-brand-color: rgba(0, 0, 0, 0.9);
+ --bs-navbar-brand-hover-color: rgba(0, 0, 0, 0.9);
+ --bs-navbar-nav-link-padding-x: 0.5rem;
+ --bs-navbar-toggler-padding-y: 0.25rem;
+ --bs-navbar-toggler-padding-x: 0.75rem;
+ --bs-navbar-toggler-font-size: 1.25rem;
+ --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+ --bs-navbar-toggler-border-color: rgba(0, 0, 0, 0.1);
+ --bs-navbar-toggler-border-radius: 0.375rem;
+ --bs-navbar-toggler-focus-width: 0.25rem;
+ --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: space-between;
+ padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);
+}
+
+.bodywebsite .navbar > .container,
+ .bodywebsite .navbar > .container-fluid,
+ .bodywebsite .navbar > .container-sm,
+ .bodywebsite .navbar > .container-md,
+ .bodywebsite .navbar > .container-lg,
+ .bodywebsite .navbar > .container-xl,
+ .bodywebsite .navbar > .container-xxl {
+ display: flex;
+ flex-wrap: inherit;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.bodywebsite .navbar-brand {
+ padding-top: var(--bs-navbar-brand-padding-y);
+ padding-bottom: var(--bs-navbar-brand-padding-y);
+ margin-right: var(--bs-navbar-brand-margin-end);
+ font-size: var(--bs-navbar-brand-font-size);
+ color: var(--bs-navbar-brand-color);
+ text-decoration: none;
+ white-space: nowrap;
+}
+
+.bodywebsite .navbar-brand:hover, .bodywebsite .navbar-brand:focus {
+ color: var(--bs-navbar-brand-hover-color);
+}
+
+.bodywebsite .navbar-nav {
+ --bs-nav-link-padding-x: 0;
+ --bs-nav-link-padding-y: 0.5rem;
+ --bs-nav-link-color: var(--bs-navbar-color);
+ --bs-nav-link-hover-color: var(--bs-navbar-hover-color);
+ --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+
+.bodywebsite .navbar-nav .show > .nav-link,
+ .bodywebsite .navbar-nav .nav-link.active {
+ color: var(--bs-navbar-active-color);
+}
+
+.bodywebsite .navbar-nav .dropdown-menu {
+ position: static;
+}
+
+.bodywebsite .navbar-text {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ color: var(--bs-navbar-color);
+}
+
+.bodywebsite .navbar-text a,
+ .bodywebsite .navbar-text a:hover,
+ .bodywebsite .navbar-text a:focus {
+ color: var(--bs-navbar-active-color);
+}
+
+.bodywebsite .navbar-collapse {
+ flex-basis: 100%;
+ flex-grow: 1;
+ align-items: center;
+}
+
+.bodywebsite .navbar-toggler {
+ padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);
+ font-size: var(--bs-navbar-toggler-font-size);
+ line-height: 1;
+ color: var(--bs-navbar-color);
+ background-color: transparent;
+ border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);
+ border-radius: var(--bs-navbar-toggler-border-radius);
+ transition: var(--bs-navbar-toggler-transition);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .navbar-toggler {
+ transition: none;
+ }
+}
+
+.bodywebsite .navbar-toggler:hover {
+ text-decoration: none;
+}
+
+.bodywebsite .navbar-toggler:focus {
+ text-decoration: none;
+ outline: 0;
+ box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width);
+}
+
+.bodywebsite .navbar-toggler-icon {
+ display: inline-block;
+ width: 1.5em;
+ height: 1.5em;
+ vertical-align: middle;
+ background-image: var(--bs-navbar-toggler-icon-bg);
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: 100%;
+}
+
+.bodywebsite .navbar-nav-scroll {
+ max-height: var(--bs-scroll-height, 75vh);
+ overflow-y: auto;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .navbar-expand-sm {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-sm .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-sm .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-sm .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .navbar-expand-md {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-md .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-md .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-md .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .navbar-expand-lg {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-lg .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-lg .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-lg .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .navbar-expand-xl {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-xl .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-xl .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-xl .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .navbar-expand-xxl {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-xxl .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-xxl .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-xxl .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+.bodywebsite .navbar-expand {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+}
+
+.bodywebsite .navbar-expand .navbar-nav {
+ flex-direction: row;
+}
+
+.bodywebsite .navbar-expand .navbar-nav .dropdown-menu {
+ position: absolute;
+}
+
+.bodywebsite .navbar-expand .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+}
+
+.bodywebsite .navbar-expand .navbar-nav-scroll {
+ overflow: visible;
+}
+
+.bodywebsite .navbar-expand .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+}
+
+.bodywebsite .navbar-expand .navbar-toggler {
+ display: none;
+}
+
+.bodywebsite .navbar-expand .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+}
+
+.bodywebsite .navbar-expand .offcanvas .offcanvas-header {
+ display: none;
+}
+
+.bodywebsite .navbar-expand .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+}
+
+.bodywebsite .navbar-dark {
+ --bs-navbar-color: rgba(255, 255, 255, 0.55);
+ --bs-navbar-hover-color: rgba(255, 255, 255, 0.75);
+ --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25);
+ --bs-navbar-active-color: #fff;
+ --bs-navbar-brand-color: #fff;
+ --bs-navbar-brand-hover-color: #fff;
+ --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);
+ --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .card {
+ --bs-card-spacer-y: 1rem;
+ --bs-card-spacer-x: 1rem;
+ --bs-card-title-spacer-y: 0.5rem;
+ --bs-card-border-width: 1px;
+ --bs-card-border-color: var(--bs-border-color-translucent);
+ --bs-card-border-radius: 0.375rem;
+ --bs-card-inner-border-radius: calc(0.375rem - 1px);
+ --bs-card-cap-padding-y: 0.5rem;
+ --bs-card-cap-padding-x: 1rem;
+ --bs-card-cap-bg: rgba(0, 0, 0, 0.03);
+ --bs-card-bg: #fff;
+ --bs-card-img-overlay-padding: 1rem;
+ --bs-card-group-margin: 0.75rem;
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ min-width: 0;
+ height: var(--bs-card-height);
+ word-wrap: break-word;
+ background-color: var(--bs-card-bg);
+ background-clip: border-box;
+ border: var(--bs-card-border-width) solid var(--bs-card-border-color);
+ border-radius: var(--bs-card-border-radius);
+}
+
+.bodywebsite .card > hr {
+ margin-right: 0;
+ margin-left: 0;
+}
+
+.bodywebsite .card > .list-group {
+ border-top: inherit;
+ border-bottom: inherit;
+}
+
+.bodywebsite .card > .list-group:first-child {
+ border-top-width: 0;
+ border-top-left-radius: var(--bs-card-inner-border-radius);
+ border-top-right-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card > .list-group:last-child {
+ border-bottom-width: 0;
+ border-bottom-right-radius: var(--bs-card-inner-border-radius);
+ border-bottom-left-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card > .card-header + .list-group,
+ .bodywebsite .card > .list-group + .card-footer {
+ border-top: 0;
+}
+
+.bodywebsite .card-body {
+ flex: 1 1 auto;
+ padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x);
+ color: var(--bs-card-color);
+}
+
+.bodywebsite .card-title {
+ margin-bottom: var(--bs-card-title-spacer-y);
+}
+
+.bodywebsite .card-subtitle {
+ margin-top: calc(-0.5 * var(--bs-card-title-spacer-y));
+ margin-bottom: 0;
+}
+
+.bodywebsite .card-text:last-child {
+ margin-bottom: 0;
+}
+
+.bodywebsite .card-link + .card-link {
+ margin-left: var(--bs-card-spacer-x);
+}
+
+.bodywebsite .card-header {
+ padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);
+ margin-bottom: 0;
+ color: var(--bs-card-cap-color);
+ background-color: var(--bs-card-cap-bg);
+ border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color);
+}
+
+.bodywebsite .card-header:first-child {
+ border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0;
+}
+
+.bodywebsite .card-footer {
+ padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);
+ color: var(--bs-card-cap-color);
+ background-color: var(--bs-card-cap-bg);
+ border-top: var(--bs-card-border-width) solid var(--bs-card-border-color);
+}
+
+.bodywebsite .card-footer:last-child {
+ border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card-header-tabs {
+ margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));
+ margin-bottom: calc(-1 * var(--bs-card-cap-padding-y));
+ margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));
+ border-bottom: 0;
+}
+
+.bodywebsite .card-header-tabs .nav-link.active {
+ background-color: var(--bs-card-bg);
+ border-bottom-color: var(--bs-card-bg);
+}
+
+.bodywebsite .card-header-pills {
+ margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));
+ margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));
+}
+
+.bodywebsite .card-img-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: var(--bs-card-img-overlay-padding);
+ border-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card-img,
+ .bodywebsite .card-img-top,
+ .bodywebsite .card-img-bottom {
+ width: 100%;
+}
+
+.bodywebsite .card-img,
+ .bodywebsite .card-img-top {
+ border-top-left-radius: var(--bs-card-inner-border-radius);
+ border-top-right-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card-img,
+ .bodywebsite .card-img-bottom {
+ border-bottom-right-radius: var(--bs-card-inner-border-radius);
+ border-bottom-left-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card-group > .card {
+ margin-bottom: var(--bs-card-group-margin);
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .card-group {
+ display: flex;
+ flex-flow: row wrap;
+ }
+
+ .bodywebsite .card-group > .card {
+ flex: 1 0 0%;
+ margin-bottom: 0;
+ }
+
+ .bodywebsite .card-group > .card + .card {
+ margin-left: 0;
+ border-left: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:last-child) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:last-child) .card-img-top,
+ .bodywebsite .card-group > .card:not(:last-child) .card-header {
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:last-child) .card-img-bottom,
+ .bodywebsite .card-group > .card:not(:last-child) .card-footer {
+ border-bottom-right-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:first-child) .card-img-top,
+ .bodywebsite .card-group > .card:not(:first-child) .card-header {
+ border-top-left-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:first-child) .card-img-bottom,
+ .bodywebsite .card-group > .card:not(:first-child) .card-footer {
+ border-bottom-left-radius: 0;
+ }
+}
+
+.bodywebsite .accordion {
+ --bs-accordion-color: var(--bs-body-color);
+ --bs-accordion-bg: #fff;
+ --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;
+ --bs-accordion-border-color: var(--bs-border-color);
+ --bs-accordion-border-width: 1px;
+ --bs-accordion-border-radius: 0.375rem;
+ --bs-accordion-inner-border-radius: calc(0.375rem - 1px);
+ --bs-accordion-btn-padding-x: 1.25rem;
+ --bs-accordion-btn-padding-y: 1rem;
+ --bs-accordion-btn-color: var(--bs-body-color);
+ --bs-accordion-btn-bg: var(--bs-accordion-bg);
+ --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='var%28--bs-body-color%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
+ --bs-accordion-btn-icon-width: 1.25rem;
+ --bs-accordion-btn-icon-transform: rotate(-180deg);
+ --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;
+ --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
+ --bs-accordion-btn-focus-border-color: #86b7fe;
+ --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+ --bs-accordion-body-padding-x: 1.25rem;
+ --bs-accordion-body-padding-y: 1rem;
+ --bs-accordion-active-color: #0c63e4;
+ --bs-accordion-active-bg: #e7f1ff;
+}
+
+.bodywebsite .accordion-button {
+ position: relative;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);
+ font-size: 1rem;
+ color: var(--bs-accordion-btn-color);
+ text-align: left;
+ background-color: var(--bs-accordion-btn-bg);
+ border: 0;
+ border-radius: 0;
+ overflow-anchor: none;
+ transition: var(--bs-accordion-transition);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .accordion-button {
+ transition: none;
+ }
+}
+
+.bodywebsite .accordion-button:not(.collapsed) {
+ color: var(--bs-accordion-active-color);
+ background-color: var(--bs-accordion-active-bg);
+ box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color);
+}
+
+.bodywebsite .accordion-button:not(.collapsed)::after {
+ background-image: var(--bs-accordion-btn-active-icon);
+ transform: var(--bs-accordion-btn-icon-transform);
+}
+
+.bodywebsite .accordion-button::after {
+ flex-shrink: 0;
+ width: var(--bs-accordion-btn-icon-width);
+ height: var(--bs-accordion-btn-icon-width);
+ margin-left: auto;
+ content: "";
+ background-image: var(--bs-accordion-btn-icon);
+ background-repeat: no-repeat;
+ background-size: var(--bs-accordion-btn-icon-width);
+ transition: var(--bs-accordion-btn-icon-transition);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .accordion-button::after {
+ transition: none;
+ }
+}
+
+.bodywebsite .accordion-button:hover {
+ z-index: 2;
+}
+
+.bodywebsite .accordion-button:focus {
+ z-index: 3;
+ border-color: var(--bs-accordion-btn-focus-border-color);
+ outline: 0;
+ box-shadow: var(--bs-accordion-btn-focus-box-shadow);
+}
+
+.bodywebsite .accordion-header {
+ margin-bottom: 0;
+}
+
+.bodywebsite .accordion-item {
+ color: var(--bs-accordion-color);
+ background-color: var(--bs-accordion-bg);
+ border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color);
+}
+
+.bodywebsite .accordion-item:first-of-type {
+ border-top-left-radius: var(--bs-accordion-border-radius);
+ border-top-right-radius: var(--bs-accordion-border-radius);
+}
+
+.bodywebsite .accordion-item:first-of-type .accordion-button {
+ border-top-left-radius: var(--bs-accordion-inner-border-radius);
+ border-top-right-radius: var(--bs-accordion-inner-border-radius);
+}
+
+.bodywebsite .accordion-item:not(:first-of-type) {
+ border-top: 0;
+}
+
+.bodywebsite .accordion-item:last-of-type {
+ border-bottom-right-radius: var(--bs-accordion-border-radius);
+ border-bottom-left-radius: var(--bs-accordion-border-radius);
+}
+
+.bodywebsite .accordion-item:last-of-type .accordion-button.collapsed {
+ border-bottom-right-radius: var(--bs-accordion-inner-border-radius);
+ border-bottom-left-radius: var(--bs-accordion-inner-border-radius);
+}
+
+.bodywebsite .accordion-item:last-of-type .accordion-collapse {
+ border-bottom-right-radius: var(--bs-accordion-border-radius);
+ border-bottom-left-radius: var(--bs-accordion-border-radius);
+}
+
+.bodywebsite .accordion-body {
+ padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x);
+}
+
+.bodywebsite .accordion-flush .accordion-collapse {
+ border-width: 0;
+}
+
+.bodywebsite .accordion-flush .accordion-item {
+ border-right: 0;
+ border-left: 0;
+ border-radius: 0;
+}
+
+.bodywebsite .accordion-flush .accordion-item:first-child {
+ border-top: 0;
+}
+
+.bodywebsite .accordion-flush .accordion-item:last-child {
+ border-bottom: 0;
+}
+
+.bodywebsite .accordion-flush .accordion-item .accordion-button, .bodywebsite .accordion-flush .accordion-item .accordion-button.collapsed {
+ border-radius: 0;
+}
+
+.bodywebsite .breadcrumb {
+ --bs-breadcrumb-padding-x: 0;
+ --bs-breadcrumb-padding-y: 0;
+ --bs-breadcrumb-margin-bottom: 1rem;
+ --bs-breadcrumb-divider-color: #6c757d;
+ --bs-breadcrumb-item-padding-x: 0.5rem;
+ --bs-breadcrumb-item-active-color: #6c757d;
+ display: flex;
+ flex-wrap: wrap;
+ padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);
+ margin-bottom: var(--bs-breadcrumb-margin-bottom);
+ font-size: var(--bs-breadcrumb-font-size);
+ list-style: none;
+ background-color: var(--bs-breadcrumb-bg);
+ border-radius: var(--bs-breadcrumb-border-radius);
+}
+
+.bodywebsite .breadcrumb-item + .breadcrumb-item {
+ padding-left: var(--bs-breadcrumb-item-padding-x);
+}
+
+.bodywebsite .breadcrumb-item + .breadcrumb-item::before {
+ float: left;
+ padding-right: var(--bs-breadcrumb-item-padding-x);
+ color: var(--bs-breadcrumb-divider-color);
+ content: var(--bs-breadcrumb-divider, "/");
+}
+
+.bodywebsite .breadcrumb-item.active {
+ color: var(--bs-breadcrumb-item-active-color);
+}
+
+.bodywebsite .pagination {
+ --bs-pagination-padding-x: 0.75rem;
+ --bs-pagination-padding-y: 0.375rem;
+ --bs-pagination-font-size: 1rem;
+ --bs-pagination-color: var(--bs-link-color);
+ --bs-pagination-bg: #fff;
+ --bs-pagination-border-width: 1px;
+ --bs-pagination-border-color: #dee2e6;
+ --bs-pagination-border-radius: 0.375rem;
+ --bs-pagination-hover-color: var(--bs-link-hover-color);
+ --bs-pagination-hover-bg: #e9ecef;
+ --bs-pagination-hover-border-color: #dee2e6;
+ --bs-pagination-focus-color: var(--bs-link-hover-color);
+ --bs-pagination-focus-bg: #e9ecef;
+ --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+ --bs-pagination-active-color: #fff;
+ --bs-pagination-active-bg: #0d6efd;
+ --bs-pagination-active-border-color: #0d6efd;
+ --bs-pagination-disabled-color: #6c757d;
+ --bs-pagination-disabled-bg: #fff;
+ --bs-pagination-disabled-border-color: #dee2e6;
+ display: flex;
+ padding-left: 0;
+ list-style: none;
+}
+
+.bodywebsite .page-link {
+ position: relative;
+ display: block;
+ padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);
+ font-size: var(--bs-pagination-font-size);
+ color: var(--bs-pagination-color);
+ text-decoration: none;
+ background-color: var(--bs-pagination-bg);
+ border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .page-link {
+ transition: none;
+ }
+}
+
+.bodywebsite .page-link:hover {
+ z-index: 2;
+ color: var(--bs-pagination-hover-color);
+ background-color: var(--bs-pagination-hover-bg);
+ border-color: var(--bs-pagination-hover-border-color);
+}
+
+.bodywebsite .page-link:focus {
+ z-index: 3;
+ color: var(--bs-pagination-focus-color);
+ background-color: var(--bs-pagination-focus-bg);
+ outline: 0;
+ box-shadow: var(--bs-pagination-focus-box-shadow);
+}
+
+.bodywebsite .page-link.active, .bodywebsite .active > .page-link {
+ z-index: 3;
+ color: var(--bs-pagination-active-color);
+ background-color: var(--bs-pagination-active-bg);
+ border-color: var(--bs-pagination-active-border-color);
+}
+
+.bodywebsite .page-link.disabled, .bodywebsite .disabled > .page-link {
+ color: var(--bs-pagination-disabled-color);
+ pointer-events: none;
+ background-color: var(--bs-pagination-disabled-bg);
+ border-color: var(--bs-pagination-disabled-border-color);
+}
+
+.bodywebsite .page-item:not(:first-child) .page-link {
+ margin-left: -1px;
+}
+
+.bodywebsite .page-item:first-child .page-link {
+ border-top-left-radius: var(--bs-pagination-border-radius);
+ border-bottom-left-radius: var(--bs-pagination-border-radius);
+}
+
+.bodywebsite .page-item:last-child .page-link {
+ border-top-right-radius: var(--bs-pagination-border-radius);
+ border-bottom-right-radius: var(--bs-pagination-border-radius);
+}
+
+.bodywebsite .pagination-lg {
+ --bs-pagination-padding-x: 1.5rem;
+ --bs-pagination-padding-y: 0.75rem;
+ --bs-pagination-font-size: 1.25rem;
+ --bs-pagination-border-radius: 0.5rem;
+}
+
+.bodywebsite .pagination-sm {
+ --bs-pagination-padding-x: 0.5rem;
+ --bs-pagination-padding-y: 0.25rem;
+ --bs-pagination-font-size: 0.875rem;
+ --bs-pagination-border-radius: 0.25rem;
+}
+
+.bodywebsite .badge {
+ --bs-badge-padding-x: 0.65em;
+ --bs-badge-padding-y: 0.35em;
+ --bs-badge-font-size: 0.75em;
+ --bs-badge-font-weight: 700;
+ --bs-badge-color: #fff;
+ --bs-badge-border-radius: 0.375rem;
+ display: inline-block;
+ padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x);
+ font-size: var(--bs-badge-font-size);
+ font-weight: var(--bs-badge-font-weight);
+ line-height: 1;
+ color: var(--bs-badge-color);
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: var(--bs-badge-border-radius);
+}
+
+.bodywebsite .badge:empty {
+ display: none;
+}
+
+.bodywebsite .btn .badge {
+ position: relative;
+ top: -1px;
+}
+
+.bodywebsite .alert {
+ --bs-alert-bg: transparent;
+ --bs-alert-padding-x: 1rem;
+ --bs-alert-padding-y: 1rem;
+ --bs-alert-margin-bottom: 1rem;
+ --bs-alert-color: inherit;
+ --bs-alert-border-color: transparent;
+ --bs-alert-border: 1px solid var(--bs-alert-border-color);
+ --bs-alert-border-radius: 0.375rem;
+ position: relative;
+ padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x);
+ margin-bottom: var(--bs-alert-margin-bottom);
+ color: var(--bs-alert-color);
+ background-color: var(--bs-alert-bg);
+ border: var(--bs-alert-border);
+ border-radius: var(--bs-alert-border-radius);
+}
+
+.bodywebsite .alert-heading {
+ color: inherit;
+}
+
+.bodywebsite .alert-link {
+ font-weight: 700;
+}
+
+.bodywebsite .alert-dismissible {
+ padding-right: 3rem;
+}
+
+.bodywebsite .alert-dismissible .btn-close {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 2;
+ padding: 1.25rem 1rem;
+}
+
+.bodywebsite .alert-primary {
+ --bs-alert-color: #084298;
+ --bs-alert-bg: #cfe2ff;
+ --bs-alert-border-color: #b6d4fe;
+}
+
+.bodywebsite .alert-primary .alert-link {
+ color: #06357a;
+}
+
+.bodywebsite .alert-secondary {
+ --bs-alert-color: #41464b;
+ --bs-alert-bg: #e2e3e5;
+ --bs-alert-border-color: #d3d6d8;
+}
+
+.bodywebsite .alert-secondary .alert-link {
+ color: #34383c;
+}
+
+.bodywebsite .alert-success {
+ --bs-alert-color: #0f5132;
+ --bs-alert-bg: #d1e7dd;
+ --bs-alert-border-color: #badbcc;
+}
+
+.bodywebsite .alert-success .alert-link {
+ color: #0c4128;
+}
+
+.bodywebsite .alert-info {
+ --bs-alert-color: #055160;
+ --bs-alert-bg: #cff4fc;
+ --bs-alert-border-color: #b6effb;
+}
+
+.bodywebsite .alert-info .alert-link {
+ color: #04414d;
+}
+
+.bodywebsite .alert-warning {
+ --bs-alert-color: #664d03;
+ --bs-alert-bg: #fff3cd;
+ --bs-alert-border-color: #ffecb5;
+}
+
+.bodywebsite .alert-warning .alert-link {
+ color: #523e02;
+}
+
+.bodywebsite .alert-danger {
+ --bs-alert-color: #842029;
+ --bs-alert-bg: #f8d7da;
+ --bs-alert-border-color: #f5c2c7;
+}
+
+.bodywebsite .alert-danger .alert-link {
+ color: #6a1a21;
+}
+
+.bodywebsite .alert-light {
+ --bs-alert-color: #636464;
+ --bs-alert-bg: #fefefe;
+ --bs-alert-border-color: #fdfdfe;
+}
+
+.bodywebsite .alert-light .alert-link {
+ color: #4f5050;
+}
+
+.bodywebsite .alert-dark {
+ --bs-alert-color: #141619;
+ --bs-alert-bg: #d3d3d4;
+ --bs-alert-border-color: #bcbebf;
+}
+
+.bodywebsite .alert-dark .alert-link {
+ color: #101214;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+ 0% {
+ background-position-x: 1rem;
+ }
+}
+
+@keyframes progress-bar-stripes {
+ 0% {
+ background-position-x: 1rem;
+ }
+}
+
+.bodywebsite .progress {
+ --bs-progress-height: 1rem;
+ --bs-progress-font-size: 0.75rem;
+ --bs-progress-bg: #e9ecef;
+ --bs-progress-border-radius: 0.375rem;
+ --bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);
+ --bs-progress-bar-color: #fff;
+ --bs-progress-bar-bg: #0d6efd;
+ --bs-progress-bar-transition: width 0.6s ease;
+ display: flex;
+ height: var(--bs-progress-height);
+ overflow: hidden;
+ font-size: var(--bs-progress-font-size);
+ background-color: var(--bs-progress-bg);
+ border-radius: var(--bs-progress-border-radius);
+}
+
+.bodywebsite .progress-bar {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ overflow: hidden;
+ color: var(--bs-progress-bar-color);
+ text-align: center;
+ white-space: nowrap;
+ background-color: var(--bs-progress-bar-bg);
+ transition: var(--bs-progress-bar-transition);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .progress-bar {
+ transition: none;
+ }
+}
+
+.bodywebsite .progress-bar-striped {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-size: var(--bs-progress-height) var(--bs-progress-height);
+}
+
+.bodywebsite .progress-bar-animated {
+ -webkit-animation: 1s linear infinite progress-bar-stripes;
+ animation: 1s linear infinite progress-bar-stripes;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .progress-bar-animated {
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+
+.bodywebsite .list-group {
+ --bs-list-group-color: #212529;
+ --bs-list-group-bg: #fff;
+ --bs-list-group-border-color: rgba(0, 0, 0, 0.125);
+ --bs-list-group-border-width: 1px;
+ --bs-list-group-border-radius: 0.375rem;
+ --bs-list-group-item-padding-x: 1rem;
+ --bs-list-group-item-padding-y: 0.5rem;
+ --bs-list-group-action-color: #495057;
+ --bs-list-group-action-hover-color: #495057;
+ --bs-list-group-action-hover-bg: #f8f9fa;
+ --bs-list-group-action-active-color: #212529;
+ --bs-list-group-action-active-bg: #e9ecef;
+ --bs-list-group-disabled-color: #6c757d;
+ --bs-list-group-disabled-bg: #fff;
+ --bs-list-group-active-color: #fff;
+ --bs-list-group-active-bg: #0d6efd;
+ --bs-list-group-active-border-color: #0d6efd;
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ border-radius: var(--bs-list-group-border-radius);
+}
+
+.bodywebsite .list-group-numbered {
+ list-style-type: none;
+ counter-reset: section;
+}
+
+.bodywebsite .list-group-numbered > .list-group-item::before {
+ content: counters(section, ".") ". ";
+ counter-increment: section;
+}
+
+.bodywebsite .list-group-item-action {
+ width: 100%;
+ color: var(--bs-list-group-action-color);
+ text-align: inherit;
+}
+
+.bodywebsite .list-group-item-action:hover, .bodywebsite .list-group-item-action:focus {
+ z-index: 1;
+ color: var(--bs-list-group-action-hover-color);
+ text-decoration: none;
+ background-color: var(--bs-list-group-action-hover-bg);
+}
+
+.bodywebsite .list-group-item-action:active {
+ color: var(--bs-list-group-action-active-color);
+ background-color: var(--bs-list-group-action-active-bg);
+}
+
+.bodywebsite .list-group-item {
+ position: relative;
+ display: block;
+ padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);
+ color: var(--bs-list-group-color);
+ text-decoration: none;
+ background-color: var(--bs-list-group-bg);
+ border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color);
+}
+
+.bodywebsite .list-group-item:first-child {
+ border-top-left-radius: inherit;
+ border-top-right-radius: inherit;
+}
+
+.bodywebsite .list-group-item:last-child {
+ border-bottom-right-radius: inherit;
+ border-bottom-left-radius: inherit;
+}
+
+.bodywebsite .list-group-item.disabled, .bodywebsite .list-group-item:disabled {
+ color: var(--bs-list-group-disabled-color);
+ pointer-events: none;
+ background-color: var(--bs-list-group-disabled-bg);
+}
+
+.bodywebsite .list-group-item.active {
+ z-index: 2;
+ color: var(--bs-list-group-active-color);
+ background-color: var(--bs-list-group-active-bg);
+ border-color: var(--bs-list-group-active-border-color);
+}
+
+.bodywebsite .list-group-item + .list-group-item {
+ border-top-width: 0;
+}
+
+.bodywebsite .list-group-item + .list-group-item.active {
+ margin-top: calc(-1 * var(--bs-list-group-border-width));
+ border-top-width: var(--bs-list-group-border-width);
+}
+
+.bodywebsite .list-group-horizontal {
+ flex-direction: row;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item.active {
+ margin-top: 0;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .list-group-horizontal-sm {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .list-group-horizontal-md {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .list-group-horizontal-lg {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .list-group-horizontal-xl {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .list-group-horizontal-xxl {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+.bodywebsite .list-group-flush {
+ border-radius: 0;
+}
+
+.bodywebsite .list-group-flush > .list-group-item {
+ border-width: 0 0 var(--bs-list-group-border-width);
+}
+
+.bodywebsite .list-group-flush > .list-group-item:last-child {
+ border-bottom-width: 0;
+}
+
+.bodywebsite .list-group-item-primary {
+ color: #084298;
+ background-color: #cfe2ff;
+}
+
+.bodywebsite .list-group-item-primary.list-group-item-action:hover, .bodywebsite .list-group-item-primary.list-group-item-action:focus {
+ color: #084298;
+ background-color: #bacbe6;
+}
+
+.bodywebsite .list-group-item-primary.list-group-item-action.active {
+ color: #fff;
+ background-color: #084298;
+ border-color: #084298;
+}
+
+.bodywebsite .list-group-item-secondary {
+ color: #41464b;
+ background-color: #e2e3e5;
+}
+
+.bodywebsite .list-group-item-secondary.list-group-item-action:hover, .bodywebsite .list-group-item-secondary.list-group-item-action:focus {
+ color: #41464b;
+ background-color: #cbccce;
+}
+
+.bodywebsite .list-group-item-secondary.list-group-item-action.active {
+ color: #fff;
+ background-color: #41464b;
+ border-color: #41464b;
+}
+
+.bodywebsite .list-group-item-success {
+ color: #0f5132;
+ background-color: #d1e7dd;
+}
+
+.bodywebsite .list-group-item-success.list-group-item-action:hover, .bodywebsite .list-group-item-success.list-group-item-action:focus {
+ color: #0f5132;
+ background-color: #bcd0c7;
+}
+
+.bodywebsite .list-group-item-success.list-group-item-action.active {
+ color: #fff;
+ background-color: #0f5132;
+ border-color: #0f5132;
+}
+
+.bodywebsite .list-group-item-info {
+ color: #055160;
+ background-color: #cff4fc;
+}
+
+.bodywebsite .list-group-item-info.list-group-item-action:hover, .bodywebsite .list-group-item-info.list-group-item-action:focus {
+ color: #055160;
+ background-color: #badce3;
+}
+
+.bodywebsite .list-group-item-info.list-group-item-action.active {
+ color: #fff;
+ background-color: #055160;
+ border-color: #055160;
+}
+
+.bodywebsite .list-group-item-warning {
+ color: #664d03;
+ background-color: #fff3cd;
+}
+
+.bodywebsite .list-group-item-warning.list-group-item-action:hover, .bodywebsite .list-group-item-warning.list-group-item-action:focus {
+ color: #664d03;
+ background-color: #e6dbb9;
+}
+
+.bodywebsite .list-group-item-warning.list-group-item-action.active {
+ color: #fff;
+ background-color: #664d03;
+ border-color: #664d03;
+}
+
+.bodywebsite .list-group-item-danger {
+ color: #842029;
+ background-color: #f8d7da;
+}
+
+.bodywebsite .list-group-item-danger.list-group-item-action:hover, .bodywebsite .list-group-item-danger.list-group-item-action:focus {
+ color: #842029;
+ background-color: #dfc2c4;
+}
+
+.bodywebsite .list-group-item-danger.list-group-item-action.active {
+ color: #fff;
+ background-color: #842029;
+ border-color: #842029;
+}
+
+.bodywebsite .list-group-item-light {
+ color: #636464;
+ background-color: #fefefe;
+}
+
+.bodywebsite .list-group-item-light.list-group-item-action:hover, .bodywebsite .list-group-item-light.list-group-item-action:focus {
+ color: #636464;
+ background-color: #e5e5e5;
+}
+
+.bodywebsite .list-group-item-light.list-group-item-action.active {
+ color: #fff;
+ background-color: #636464;
+ border-color: #636464;
+}
+
+.bodywebsite .list-group-item-dark {
+ color: #141619;
+ background-color: #d3d3d4;
+}
+
+.bodywebsite .list-group-item-dark.list-group-item-action:hover, .bodywebsite .list-group-item-dark.list-group-item-action:focus {
+ color: #141619;
+ background-color: #bebebf;
+}
+
+.bodywebsite .list-group-item-dark.list-group-item-action.active {
+ color: #fff;
+ background-color: #141619;
+ border-color: #141619;
+}
+
+.bodywebsite .btn-close {
+ box-sizing: content-box;
+ width: 1em;
+ height: 1em;
+ padding: 0.25em 0.25em;
+ color: #000;
+ background: transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;
+ border: 0;
+ border-radius: 0.375rem;
+ opacity: 0.5;
+}
+
+.bodywebsite .btn-close:hover {
+ color: #000;
+ text-decoration: none;
+ opacity: 0.75;
+}
+
+.bodywebsite .btn-close:focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+ opacity: 1;
+}
+
+.bodywebsite .btn-close:disabled, .bodywebsite .btn-close.disabled {
+ pointer-events: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ opacity: 0.25;
+}
+
+.bodywebsite .btn-close-white {
+ filter: invert(1) grayscale(100%) brightness(200%);
+}
+
+.bodywebsite .toast {
+ --bs-toast-zindex: 1090;
+ --bs-toast-padding-x: 0.75rem;
+ --bs-toast-padding-y: 0.5rem;
+ --bs-toast-spacing: 1.5rem;
+ --bs-toast-max-width: 350px;
+ --bs-toast-font-size: 0.875rem;
+ --bs-toast-bg: rgba(255, 255, 255, 0.85);
+ --bs-toast-border-width: 1px;
+ --bs-toast-border-color: var(--bs-border-color-translucent);
+ --bs-toast-border-radius: 0.375rem;
+ --bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ --bs-toast-header-color: #6c757d;
+ --bs-toast-header-bg: rgba(255, 255, 255, 0.85);
+ --bs-toast-header-border-color: rgba(0, 0, 0, 0.05);
+ width: var(--bs-toast-max-width);
+ max-width: 100%;
+ font-size: var(--bs-toast-font-size);
+ color: var(--bs-toast-color);
+ pointer-events: auto;
+ background-color: var(--bs-toast-bg);
+ background-clip: padding-box;
+ border: var(--bs-toast-border-width) solid var(--bs-toast-border-color);
+ box-shadow: var(--bs-toast-box-shadow);
+ border-radius: var(--bs-toast-border-radius);
+}
+
+.bodywebsite .toast.showing {
+ opacity: 0;
+}
+
+.bodywebsite .toast:not(.show) {
+ display: none;
+}
+
+.bodywebsite .toast-container {
+ position: absolute;
+ z-index: var(--bs-toast-zindex);
+ width: -webkit-max-content;
+ width: -moz-max-content;
+ width: max-content;
+ max-width: 100%;
+ pointer-events: none;
+}
+
+.bodywebsite .toast-container > :not(:last-child) {
+ margin-bottom: var(--bs-toast-spacing);
+}
+
+.bodywebsite .toast-header {
+ display: flex;
+ align-items: center;
+ padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x);
+ color: var(--bs-toast-header-color);
+ background-color: var(--bs-toast-header-bg);
+ background-clip: padding-box;
+ border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);
+ border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));
+ border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));
+}
+
+.bodywebsite .toast-header .btn-close {
+ margin-right: calc(-0.5 * var(--bs-toast-padding-x));
+ margin-left: var(--bs-toast-padding-x);
+}
+
+.bodywebsite .toast-body {
+ padding: var(--bs-toast-padding-x);
+ word-wrap: break-word;
+}
+
+.bodywebsite .modal {
+ --bs-modal-zindex: 1055;
+ --bs-modal-width: 500px;
+ --bs-modal-padding: 1rem;
+ --bs-modal-margin: 0.5rem;
+ --bs-modal-bg: #fff;
+ --bs-modal-border-color: var(--bs-border-color-translucent);
+ --bs-modal-border-width: 1px;
+ --bs-modal-border-radius: 0.5rem;
+ --bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
+ --bs-modal-inner-border-radius: calc(0.5rem - 1px);
+ --bs-modal-header-padding-x: 1rem;
+ --bs-modal-header-padding-y: 1rem;
+ --bs-modal-header-padding: 1rem 1rem;
+ --bs-modal-header-border-color: var(--bs-border-color);
+ --bs-modal-header-border-width: 1px;
+ --bs-modal-title-line-height: 1.5;
+ --bs-modal-footer-gap: 0.5rem;
+ --bs-modal-footer-border-color: var(--bs-border-color);
+ --bs-modal-footer-border-width: 1px;
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: var(--bs-modal-zindex);
+ display: none;
+ width: 100%;
+ height: 100%;
+ overflow-x: hidden;
+ overflow-y: auto;
+ outline: 0;
+}
+
+.bodywebsite .modal-dialog {
+ position: relative;
+ width: auto;
+ margin: var(--bs-modal-margin);
+ pointer-events: none;
+}
+
+.bodywebsite .modal.fade .modal-dialog {
+ transition: transform 0.3s ease-out;
+ transform: translate(0, -50px);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .modal.fade .modal-dialog {
+ transition: none;
+ }
+}
+
+.bodywebsite .modal.show .modal-dialog {
+ transform: none;
+}
+
+.bodywebsite .modal.modal-static .modal-dialog {
+ transform: scale(1.02);
+}
+
+.bodywebsite .modal-dialog-scrollable {
+ height: calc(100% - var(--bs-modal-margin) * 2);
+}
+
+.bodywebsite .modal-dialog-scrollable .modal-content {
+ max-height: 100%;
+ overflow: hidden;
+}
+
+.bodywebsite .modal-dialog-scrollable .modal-body {
+ overflow-y: auto;
+}
+
+.bodywebsite .modal-dialog-centered {
+ display: flex;
+ align-items: center;
+ min-height: calc(100% - var(--bs-modal-margin) * 2);
+}
+
+.bodywebsite .modal-content {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ color: var(--bs-modal-color);
+ pointer-events: auto;
+ background-color: var(--bs-modal-bg);
+ background-clip: padding-box;
+ border: var(--bs-modal-border-width) solid var(--bs-modal-border-color);
+ border-radius: var(--bs-modal-border-radius);
+ outline: 0;
+}
+
+.bodywebsite .modal-backdrop {
+ --bs-backdrop-zindex: 1050;
+ --bs-backdrop-bg: #000;
+ --bs-backdrop-opacity: 0.5;
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: var(--bs-backdrop-zindex);
+ width: 100vw;
+ height: 100vh;
+ background-color: var(--bs-backdrop-bg);
+}
+
+.bodywebsite .modal-backdrop.fade {
+ opacity: 0;
+}
+
+.bodywebsite .modal-backdrop.show {
+ opacity: var(--bs-backdrop-opacity);
+}
+
+.bodywebsite .modal-header {
+ display: flex;
+ flex-shrink: 0;
+ align-items: center;
+ justify-content: space-between;
+ padding: var(--bs-modal-header-padding);
+ border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);
+ border-top-left-radius: var(--bs-modal-inner-border-radius);
+ border-top-right-radius: var(--bs-modal-inner-border-radius);
+}
+
+.bodywebsite .modal-header .btn-close {
+ padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5);
+ margin: calc(-0.5 * var(--bs-modal-header-padding-y)) calc(-0.5 * var(--bs-modal-header-padding-x)) calc(-0.5 * var(--bs-modal-header-padding-y)) auto;
+}
+
+.bodywebsite .modal-title {
+ margin-bottom: 0;
+ line-height: var(--bs-modal-title-line-height);
+}
+
+.bodywebsite .modal-body {
+ position: relative;
+ flex: 1 1 auto;
+ padding: var(--bs-modal-padding);
+}
+
+.bodywebsite .modal-footer {
+ display: flex;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: flex-end;
+ padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5);
+ background-color: var(--bs-modal-footer-bg);
+ border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);
+ border-bottom-right-radius: var(--bs-modal-inner-border-radius);
+ border-bottom-left-radius: var(--bs-modal-inner-border-radius);
+}
+
+.bodywebsite .modal-footer > * {
+ margin: calc(var(--bs-modal-footer-gap) * 0.5);
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .modal {
+ --bs-modal-margin: 1.75rem;
+ --bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ }
+
+ .bodywebsite .modal-dialog {
+ max-width: var(--bs-modal-width);
+ margin-right: auto;
+ margin-left: auto;
+ }
+
+ .bodywebsite .modal-sm {
+ --bs-modal-width: 300px;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .modal-lg,
+ .bodywebsite .modal-xl {
+ --bs-modal-width: 800px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .modal-xl {
+ --bs-modal-width: 1140px;
+ }
+}
+
+.bodywebsite .modal-fullscreen {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+}
+
+.bodywebsite .modal-fullscreen .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+}
+
+.bodywebsite .modal-fullscreen .modal-header,
+ .bodywebsite .modal-fullscreen .modal-footer {
+ border-radius: 0;
+}
+
+.bodywebsite .modal-fullscreen .modal-body {
+ overflow-y: auto;
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .modal-fullscreen-sm-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-sm-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-sm-down .modal-header,
+ .bodywebsite .modal-fullscreen-sm-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-sm-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .modal-fullscreen-md-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-md-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-md-down .modal-header,
+ .bodywebsite .modal-fullscreen-md-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-md-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .modal-fullscreen-lg-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-lg-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-lg-down .modal-header,
+ .bodywebsite .modal-fullscreen-lg-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-lg-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .modal-fullscreen-xl-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xl-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xl-down .modal-header,
+ .bodywebsite .modal-fullscreen-xl-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xl-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .modal-fullscreen-xxl-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xxl-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xxl-down .modal-header,
+ .bodywebsite .modal-fullscreen-xxl-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xxl-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+.bodywebsite .tooltip {
+ --bs-tooltip-zindex: 1080;
+ --bs-tooltip-max-width: 200px;
+ --bs-tooltip-padding-x: 0.5rem;
+ --bs-tooltip-padding-y: 0.25rem;
+ --bs-tooltip-font-size: 0.875rem;
+ --bs-tooltip-color: #fff;
+ --bs-tooltip-bg: #000;
+ --bs-tooltip-border-radius: 0.375rem;
+ --bs-tooltip-opacity: 0.9;
+ --bs-tooltip-arrow-width: 0.8rem;
+ --bs-tooltip-arrow-height: 0.4rem;
+ z-index: var(--bs-tooltip-zindex);
+ display: block;
+ padding: var(--bs-tooltip-arrow-height);
+ margin: var(--bs-tooltip-margin);
+ font-family: var(--bs-font-sans-serif);
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.5;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ white-space: normal;
+ word-spacing: normal;
+ line-break: auto;
+ font-size: var(--bs-tooltip-font-size);
+ word-wrap: break-word;
+ opacity: 0;
+}
+
+.bodywebsite .tooltip.show {
+ opacity: var(--bs-tooltip-opacity);
+}
+
+.bodywebsite .tooltip .tooltip-arrow {
+ display: block;
+ width: var(--bs-tooltip-arrow-width);
+ height: var(--bs-tooltip-arrow-height);
+}
+
+.bodywebsite .tooltip .tooltip-arrow::before {
+ position: absolute;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+}
+
+.bodywebsite .bs-tooltip-top .tooltip-arrow, .bodywebsite .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {
+ bottom: 0;
+}
+
+.bodywebsite .bs-tooltip-top .tooltip-arrow::before, .bodywebsite .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {
+ top: -1px;
+ border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;
+ border-top-color: var(--bs-tooltip-bg);
+}
+
+.bodywebsite .bs-tooltip-end .tooltip-arrow, .bodywebsite .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {
+ left: 0;
+ width: var(--bs-tooltip-arrow-height);
+ height: var(--bs-tooltip-arrow-width);
+}
+
+.bodywebsite .bs-tooltip-end .tooltip-arrow::before, .bodywebsite .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {
+ right: -1px;
+ border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;
+ border-right-color: var(--bs-tooltip-bg);
+}
+
+.bodywebsite .bs-tooltip-bottom .tooltip-arrow, .bodywebsite .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {
+ top: 0;
+}
+
+.bodywebsite .bs-tooltip-bottom .tooltip-arrow::before, .bodywebsite .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {
+ bottom: -1px;
+ border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);
+ border-bottom-color: var(--bs-tooltip-bg);
+}
+
+.bodywebsite .bs-tooltip-start .tooltip-arrow, .bodywebsite .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {
+ right: 0;
+ width: var(--bs-tooltip-arrow-height);
+ height: var(--bs-tooltip-arrow-width);
+}
+
+.bodywebsite .bs-tooltip-start .tooltip-arrow::before, .bodywebsite .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {
+ left: -1px;
+ border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);
+ border-left-color: var(--bs-tooltip-bg);
+}
+
+.bodywebsite .tooltip-inner {
+ max-width: var(--bs-tooltip-max-width);
+ padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);
+ color: var(--bs-tooltip-color);
+ text-align: center;
+ background-color: var(--bs-tooltip-bg);
+ border-radius: var(--bs-tooltip-border-radius);
+}
+
+.bodywebsite .popover {
+ --bs-popover-zindex: 1070;
+ --bs-popover-max-width: 276px;
+ --bs-popover-font-size: 0.875rem;
+ --bs-popover-bg: #fff;
+ --bs-popover-border-width: 1px;
+ --bs-popover-border-color: var(--bs-border-color-translucent);
+ --bs-popover-border-radius: 0.5rem;
+ --bs-popover-inner-border-radius: calc(0.5rem - 1px);
+ --bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ --bs-popover-header-padding-x: 1rem;
+ --bs-popover-header-padding-y: 0.5rem;
+ --bs-popover-header-font-size: 1rem;
+ --bs-popover-header-bg: #f0f0f0;
+ --bs-popover-body-padding-x: 1rem;
+ --bs-popover-body-padding-y: 1rem;
+ --bs-popover-body-color: #212529;
+ --bs-popover-arrow-width: 1rem;
+ --bs-popover-arrow-height: 0.5rem;
+ --bs-popover-arrow-border: var(--bs-popover-border-color);
+ z-index: var(--bs-popover-zindex);
+ display: block;
+ max-width: var(--bs-popover-max-width);
+ font-family: var(--bs-font-sans-serif);
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.5;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ white-space: normal;
+ word-spacing: normal;
+ line-break: auto;
+ font-size: var(--bs-popover-font-size);
+ word-wrap: break-word;
+ background-color: var(--bs-popover-bg);
+ background-clip: padding-box;
+ border: var(--bs-popover-border-width) solid var(--bs-popover-border-color);
+ border-radius: var(--bs-popover-border-radius);
+}
+
+.bodywebsite .popover .popover-arrow {
+ display: block;
+ width: var(--bs-popover-arrow-width);
+ height: var(--bs-popover-arrow-height);
+}
+
+.bodywebsite .popover .popover-arrow::before, .bodywebsite .popover .popover-arrow::after {
+ position: absolute;
+ display: block;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+ border-width: 0;
+}
+
+.bodywebsite .bs-popover-top > .popover-arrow, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {
+ bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+}
+
+.bodywebsite .bs-popover-top > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bodywebsite .bs-popover-top > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {
+ border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;
+}
+
+.bodywebsite .bs-popover-top > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {
+ bottom: 0;
+ border-top-color: var(--bs-popover-arrow-border);
+}
+
+.bodywebsite .bs-popover-top > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {
+ bottom: var(--bs-popover-border-width);
+ border-top-color: var(--bs-popover-bg);
+}
+
+.bodywebsite .bs-popover-end > .popover-arrow, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {
+ left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+ width: var(--bs-popover-arrow-height);
+ height: var(--bs-popover-arrow-width);
+}
+
+.bodywebsite .bs-popover-end > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bodywebsite .bs-popover-end > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {
+ border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;
+}
+
+.bodywebsite .bs-popover-end > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {
+ left: 0;
+ border-right-color: var(--bs-popover-arrow-border);
+}
+
+.bodywebsite .bs-popover-end > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {
+ left: var(--bs-popover-border-width);
+ border-right-color: var(--bs-popover-bg);
+}
+
+.bodywebsite .bs-popover-bottom > .popover-arrow, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {
+ top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+}
+
+.bodywebsite .bs-popover-bottom > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bodywebsite .bs-popover-bottom > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {
+ border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);
+}
+
+.bodywebsite .bs-popover-bottom > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {
+ top: 0;
+ border-bottom-color: var(--bs-popover-arrow-border);
+}
+
+.bodywebsite .bs-popover-bottom > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {
+ top: var(--bs-popover-border-width);
+ border-bottom-color: var(--bs-popover-bg);
+}
+
+.bodywebsite .bs-popover-bottom .popover-header::before, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ display: block;
+ width: var(--bs-popover-arrow-width);
+ margin-left: calc(-0.5 * var(--bs-popover-arrow-width));
+ content: "";
+ border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg);
+}
+
+.bodywebsite .bs-popover-start > .popover-arrow, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {
+ right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+ width: var(--bs-popover-arrow-height);
+ height: var(--bs-popover-arrow-width);
+}
+
+.bodywebsite .bs-popover-start > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bodywebsite .bs-popover-start > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {
+ border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);
+}
+
+.bodywebsite .bs-popover-start > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {
+ right: 0;
+ border-left-color: var(--bs-popover-arrow-border);
+}
+
+.bodywebsite .bs-popover-start > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {
+ right: var(--bs-popover-border-width);
+ border-left-color: var(--bs-popover-bg);
+}
+
+.bodywebsite .popover-header {
+ padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);
+ margin-bottom: 0;
+ font-size: var(--bs-popover-header-font-size);
+ color: var(--bs-popover-header-color);
+ background-color: var(--bs-popover-header-bg);
+ border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color);
+ border-top-left-radius: var(--bs-popover-inner-border-radius);
+ border-top-right-radius: var(--bs-popover-inner-border-radius);
+}
+
+.bodywebsite .popover-header:empty {
+ display: none;
+}
+
+.bodywebsite .popover-body {
+ padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);
+ color: var(--bs-popover-body-color);
+}
+
+.bodywebsite .carousel {
+ position: relative;
+}
+
+.bodywebsite .carousel.pointer-event {
+ touch-action: pan-y;
+}
+
+.bodywebsite .carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden;
+}
+
+.bodywebsite .carousel-inner::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+
+.bodywebsite .carousel-item {
+ position: relative;
+ display: none;
+ float: left;
+ width: 100%;
+ margin-right: -100%;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ transition: transform 0.6s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .carousel-item {
+ transition: none;
+ }
+}
+
+.bodywebsite .carousel-item.active,
+ .bodywebsite .carousel-item-next,
+ .bodywebsite .carousel-item-prev {
+ display: block;
+}
+
+.bodywebsite .carousel-item-next:not(.carousel-item-start),
+ .bodywebsite .active.carousel-item-end {
+ transform: translateX(100%);
+}
+
+.bodywebsite .carousel-item-prev:not(.carousel-item-end),
+ .bodywebsite .active.carousel-item-start {
+ transform: translateX(-100%);
+}
+
+.bodywebsite .carousel-fade .carousel-item {
+ opacity: 0;
+ transition-property: opacity;
+ transform: none;
+}
+
+.bodywebsite .carousel-fade .carousel-item.active,
+ .bodywebsite .carousel-fade .carousel-item-next.carousel-item-start,
+ .bodywebsite .carousel-fade .carousel-item-prev.carousel-item-end {
+ z-index: 1;
+ opacity: 1;
+}
+
+.bodywebsite .carousel-fade .active.carousel-item-start,
+ .bodywebsite .carousel-fade .active.carousel-item-end {
+ z-index: 0;
+ opacity: 0;
+ transition: opacity 0s 0.6s;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .carousel-fade .active.carousel-item-start,
+ .bodywebsite .carousel-fade .active.carousel-item-end {
+ transition: none;
+ }
+}
+
+.bodywebsite .carousel-control-prev,
+ .bodywebsite .carousel-control-next {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 15%;
+ padding: 0;
+ color: #fff;
+ text-align: center;
+ background: none;
+ border: 0;
+ opacity: 0.5;
+ transition: opacity 0.15s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .carousel-control-prev,
+ .bodywebsite .carousel-control-next {
+ transition: none;
+ }
+}
+
+.bodywebsite .carousel-control-prev:hover, .bodywebsite .carousel-control-prev:focus,
+ .bodywebsite .carousel-control-next:hover,
+ .bodywebsite .carousel-control-next:focus {
+ color: #fff;
+ text-decoration: none;
+ outline: 0;
+ opacity: 0.9;
+}
+
+.bodywebsite .carousel-control-prev {
+ left: 0;
+}
+
+.bodywebsite .carousel-control-next {
+ right: 0;
+}
+
+.bodywebsite .carousel-control-prev-icon,
+ .bodywebsite .carousel-control-next-icon {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ background-repeat: no-repeat;
+ background-position: 50%;
+ background-size: 100% 100%;
+}
+
+.bodywebsite .carousel-control-prev-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .carousel-control-next-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .carousel-indicators {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 2;
+ display: flex;
+ justify-content: center;
+ padding: 0;
+ margin-right: 15%;
+ margin-bottom: 1rem;
+ margin-left: 15%;
+ list-style: none;
+}
+
+.bodywebsite .carousel-indicators [data-bs-target] {
+ box-sizing: content-box;
+ flex: 0 1 auto;
+ width: 30px;
+ height: 3px;
+ padding: 0;
+ margin-right: 3px;
+ margin-left: 3px;
+ text-indent: -999px;
+ cursor: pointer;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 0;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ opacity: 0.5;
+ transition: opacity 0.6s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .carousel-indicators [data-bs-target] {
+ transition: none;
+ }
+}
+
+.bodywebsite .carousel-indicators .active {
+ opacity: 1;
+}
+
+.bodywebsite .carousel-caption {
+ position: absolute;
+ right: 15%;
+ bottom: 1.25rem;
+ left: 15%;
+ padding-top: 1.25rem;
+ padding-bottom: 1.25rem;
+ color: #fff;
+ text-align: center;
+}
+
+.bodywebsite .carousel-dark .carousel-control-prev-icon,
+ .bodywebsite .carousel-dark .carousel-control-next-icon {
+ filter: invert(1) grayscale(100);
+}
+
+.bodywebsite .carousel-dark .carousel-indicators [data-bs-target] {
+ background-color: #000;
+}
+
+.bodywebsite .carousel-dark .carousel-caption {
+ color: #000;
+}
+
+.bodywebsite .spinner-grow,
+ .bodywebsite .spinner-border {
+ display: inline-block;
+ width: var(--bs-spinner-width);
+ height: var(--bs-spinner-height);
+ vertical-align: var(--bs-spinner-vertical-align);
+ border-radius: 50%;
+ -webkit-animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);
+ animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);
+}
+
+@-webkit-keyframes spinner-border {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes spinner-border {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+.bodywebsite .spinner-border {
+ --bs-spinner-width: 2rem;
+ --bs-spinner-height: 2rem;
+ --bs-spinner-vertical-align: -0.125em;
+ --bs-spinner-border-width: 0.25em;
+ --bs-spinner-animation-speed: 0.75s;
+ --bs-spinner-animation-name: spinner-border;
+ border: var(--bs-spinner-border-width) solid currentcolor;
+ border-right-color: transparent;
+}
+
+.bodywebsite .spinner-border-sm {
+ --bs-spinner-width: 1rem;
+ --bs-spinner-height: 1rem;
+ --bs-spinner-border-width: 0.2em;
+}
+
+@-webkit-keyframes spinner-grow {
+ 0% {
+ transform: scale(0);
+ }
+
+ 50% {
+ opacity: 1;
+ transform: none;
+ }
+}
+
+@keyframes spinner-grow {
+ 0% {
+ transform: scale(0);
+ }
+
+ 50% {
+ opacity: 1;
+ transform: none;
+ }
+}
+
+.bodywebsite .spinner-grow {
+ --bs-spinner-width: 2rem;
+ --bs-spinner-height: 2rem;
+ --bs-spinner-vertical-align: -0.125em;
+ --bs-spinner-animation-speed: 0.75s;
+ --bs-spinner-animation-name: spinner-grow;
+ background-color: currentcolor;
+ opacity: 0;
+}
+
+.bodywebsite .spinner-grow-sm {
+ --bs-spinner-width: 1rem;
+ --bs-spinner-height: 1rem;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .spinner-border,
+ .bodywebsite .spinner-grow {
+ --bs-spinner-animation-speed: 1.5s;
+ }
+}
+
+.bodywebsite .offcanvas, .bodywebsite .offcanvas-xxl, .bodywebsite .offcanvas-xl, .bodywebsite .offcanvas-lg, .bodywebsite .offcanvas-md, .bodywebsite .offcanvas-sm {
+ --bs-offcanvas-zindex: 1045;
+ --bs-offcanvas-width: 400px;
+ --bs-offcanvas-height: 30vh;
+ --bs-offcanvas-padding-x: 1rem;
+ --bs-offcanvas-padding-y: 1rem;
+ --bs-offcanvas-bg: #fff;
+ --bs-offcanvas-border-width: 1px;
+ --bs-offcanvas-border-color: var(--bs-border-color-translucent);
+ --bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-sm {
+ transition: none;
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.showing, .bodywebsite .offcanvas-sm.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.showing, .bodywebsite .offcanvas-sm.hiding, .bodywebsite .offcanvas-sm.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .offcanvas-sm {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-sm .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-sm .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-md {
+ transition: none;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.showing, .bodywebsite .offcanvas-md.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.showing, .bodywebsite .offcanvas-md.hiding, .bodywebsite .offcanvas-md.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .offcanvas-md {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-md .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-md .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-lg {
+ transition: none;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.showing, .bodywebsite .offcanvas-lg.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.showing, .bodywebsite .offcanvas-lg.hiding, .bodywebsite .offcanvas-lg.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .offcanvas-lg {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-lg .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-lg .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-xl {
+ transition: none;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.showing, .bodywebsite .offcanvas-xl.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.showing, .bodywebsite .offcanvas-xl.hiding, .bodywebsite .offcanvas-xl.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .offcanvas-xl {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-xl .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-xl .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-xxl {
+ transition: none;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.showing, .bodywebsite .offcanvas-xxl.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.showing, .bodywebsite .offcanvas-xxl.hiding, .bodywebsite .offcanvas-xxl.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .offcanvas-xxl {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-xxl .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-xxl .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+.bodywebsite .offcanvas {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas {
+ transition: none;
+ }
+}
+
+.bodywebsite .offcanvas.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+}
+
+.bodywebsite .offcanvas.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+}
+
+.bodywebsite .offcanvas.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+}
+
+.bodywebsite .offcanvas.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+}
+
+.bodywebsite .offcanvas.showing, .bodywebsite .offcanvas.show:not(.hiding) {
+ transform: none;
+}
+
+.bodywebsite .offcanvas.showing, .bodywebsite .offcanvas.hiding, .bodywebsite .offcanvas.show {
+ visibility: visible;
+}
+
+.bodywebsite .offcanvas-backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1040;
+ width: 100vw;
+ height: 100vh;
+ background-color: #000;
+}
+
+.bodywebsite .offcanvas-backdrop.fade {
+ opacity: 0;
+}
+
+.bodywebsite .offcanvas-backdrop.show {
+ opacity: 0.5;
+}
+
+.bodywebsite .offcanvas-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);
+}
+
+.bodywebsite .offcanvas-header .btn-close {
+ padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5);
+ margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y));
+ margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x));
+ margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y));
+}
+
+.bodywebsite .offcanvas-title {
+ margin-bottom: 0;
+ line-height: 1.5;
+}
+
+.bodywebsite .offcanvas-body {
+ flex-grow: 1;
+ padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);
+ overflow-y: auto;
+}
+
+.bodywebsite .placeholder {
+ display: inline-block;
+ min-height: 1em;
+ vertical-align: middle;
+ cursor: wait;
+ background-color: currentcolor;
+ opacity: 0.5;
+}
+
+.bodywebsite .placeholder.btn::before {
+ display: inline-block;
+ content: "";
+}
+
+.bodywebsite .placeholder-xs {
+ min-height: 0.6em;
+}
+
+.bodywebsite .placeholder-sm {
+ min-height: 0.8em;
+}
+
+.bodywebsite .placeholder-lg {
+ min-height: 1.2em;
+}
+
+.bodywebsite .placeholder-glow .placeholder {
+ -webkit-animation: placeholder-glow 2s ease-in-out infinite;
+ animation: placeholder-glow 2s ease-in-out infinite;
+}
+
+@-webkit-keyframes placeholder-glow {
+ 50% {
+ opacity: 0.2;
+ }
+}
+
+@keyframes placeholder-glow {
+ 50% {
+ opacity: 0.2;
+ }
+}
+
+.bodywebsite .placeholder-wave {
+ -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);
+ mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);
+ -webkit-mask-size: 200% 100%;
+ mask-size: 200% 100%;
+ -webkit-animation: placeholder-wave 2s linear infinite;
+ animation: placeholder-wave 2s linear infinite;
+}
+
+@-webkit-keyframes placeholder-wave {
+ 100% {
+ -webkit-mask-position: -200% 0%;
+ mask-position: -200% 0%;
+ }
+}
+
+@keyframes placeholder-wave {
+ 100% {
+ -webkit-mask-position: -200% 0%;
+ mask-position: -200% 0%;
+ }
+}
+
+.bodywebsite .clearfix::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+
+.bodywebsite .text-bg-primary {
+ color: #fff !important;
+ background-color: RGBA(13, 110, 253, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-secondary {
+ color: #fff !important;
+ background-color: RGBA(108, 117, 125, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-success {
+ color: #fff !important;
+ background-color: RGBA(25, 135, 84, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-info {
+ color: #000 !important;
+ background-color: RGBA(13, 202, 240, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-warning {
+ color: #000 !important;
+ background-color: RGBA(255, 193, 7, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-danger {
+ color: #fff !important;
+ background-color: RGBA(220, 53, 69, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-light {
+ color: #000 !important;
+ background-color: RGBA(248, 249, 250, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-dark {
+ color: #fff !important;
+ background-color: RGBA(33, 37, 41, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .link-primary {
+ color: #0d6efd !important;
+}
+
+.bodywebsite .link-primary:hover, .bodywebsite .link-primary:focus {
+ color: #0a58ca !important;
+}
+
+.bodywebsite .link-secondary {
+ color: #6c757d !important;
+}
+
+.bodywebsite .link-secondary:hover, .bodywebsite .link-secondary:focus {
+ color: #565e64 !important;
+}
+
+.bodywebsite .link-success {
+ color: #198754 !important;
+}
+
+.bodywebsite .link-success:hover, .bodywebsite .link-success:focus {
+ color: #146c43 !important;
+}
+
+.bodywebsite .link-info {
+ color: #0dcaf0 !important;
+}
+
+.bodywebsite .link-info:hover, .bodywebsite .link-info:focus {
+ color: #3dd5f3 !important;
+}
+
+.bodywebsite .link-warning {
+ color: #ffc107 !important;
+}
+
+.bodywebsite .link-warning:hover, .bodywebsite .link-warning:focus {
+ color: #ffcd39 !important;
+}
+
+.bodywebsite .link-danger {
+ color: #dc3545 !important;
+}
+
+.bodywebsite .link-danger:hover, .bodywebsite .link-danger:focus {
+ color: #b02a37 !important;
+}
+
+.bodywebsite .link-light {
+ color: #f8f9fa !important;
+}
+
+.bodywebsite .link-light:hover, .bodywebsite .link-light:focus {
+ color: #f9fafb !important;
+}
+
+.bodywebsite .link-dark {
+ color: #212529 !important;
+}
+
+.bodywebsite .link-dark:hover, .bodywebsite .link-dark:focus {
+ color: #1a1e21 !important;
+}
+
+.bodywebsite .ratio {
+ position: relative;
+ width: 100%;
+}
+
+.bodywebsite .ratio::before {
+ display: block;
+ padding-top: var(--bs-aspect-ratio);
+ content: "";
+}
+
+.bodywebsite .ratio > * {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+
+.bodywebsite .ratio-1x1 {
+ --bs-aspect-ratio: 100%;
+}
+
+.bodywebsite .ratio-4x3 {
+ --bs-aspect-ratio: 75%;
+}
+
+.bodywebsite .ratio-16x9 {
+ --bs-aspect-ratio: 56.25%;
+}
+
+.bodywebsite .ratio-21x9 {
+ --bs-aspect-ratio: 42.8571428571%;
+}
+
+.bodywebsite .fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1030;
+}
+
+.bodywebsite .fixed-bottom {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1030;
+}
+
+.bodywebsite .sticky-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+}
+
+.bodywebsite .sticky-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .sticky-sm-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-sm-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .sticky-md-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-md-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .sticky-lg-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-lg-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .sticky-xl-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-xl-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .sticky-xxl-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-xxl-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+.bodywebsite .hstack {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ align-self: stretch;
+}
+
+.bodywebsite .vstack {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ align-self: stretch;
+}
+
+.bodywebsite .visually-hidden,
+ .bodywebsite .visually-hidden-focusable:not(:focus):not(:focus-within) {
+ position: absolute !important;
+ width: 1px !important;
+ height: 1px !important;
+ padding: 0 !important;
+ margin: -1px !important;
+ overflow: hidden !important;
+ clip: rect(0, 0, 0, 0) !important;
+ white-space: nowrap !important;
+ border: 0 !important;
+}
+
+.bodywebsite .stretched-link::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1;
+ content: "";
+}
+
+.bodywebsite .text-truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.bodywebsite .vr {
+ display: inline-block;
+ align-self: stretch;
+ width: 1px;
+ min-height: 1em;
+ background-color: currentcolor;
+ opacity: 0.25;
+}
+
+.bodywebsite .align-baseline {
+ vertical-align: baseline !important;
+}
+
+.bodywebsite .align-top {
+ vertical-align: top !important;
+}
+
+.bodywebsite .align-middle {
+ vertical-align: middle !important;
+}
+
+.bodywebsite .align-bottom {
+ vertical-align: bottom !important;
+}
+
+.bodywebsite .align-text-bottom {
+ vertical-align: text-bottom !important;
+}
+
+.bodywebsite .align-text-top {
+ vertical-align: text-top !important;
+}
+
+.bodywebsite .float-start {
+ float: left !important;
+}
+
+.bodywebsite .float-end {
+ float: right !important;
+}
+
+.bodywebsite .float-none {
+ float: none !important;
+}
+
+.bodywebsite .opacity-0 {
+ opacity: 0 !important;
+}
+
+.bodywebsite .opacity-25 {
+ opacity: 0.25 !important;
+}
+
+.bodywebsite .opacity-50 {
+ opacity: 0.5 !important;
+}
+
+.bodywebsite .opacity-75 {
+ opacity: 0.75 !important;
+}
+
+.bodywebsite .opacity-100 {
+ opacity: 1 !important;
+}
+
+.bodywebsite .overflow-auto {
+ overflow: auto !important;
+}
+
+.bodywebsite .overflow-hidden {
+ overflow: hidden !important;
+}
+
+.bodywebsite .overflow-visible {
+ overflow: visible !important;
+}
+
+.bodywebsite .overflow-scroll {
+ overflow: scroll !important;
+}
+
+.bodywebsite .d-inline {
+ display: inline !important;
+}
+
+.bodywebsite .d-inline-block {
+ display: inline-block !important;
+}
+
+.bodywebsite .d-block {
+ display: block !important;
+}
+
+.bodywebsite .d-grid {
+ display: grid !important;
+}
+
+.bodywebsite .d-table {
+ display: table !important;
+}
+
+.bodywebsite .d-table-row {
+ display: table-row !important;
+}
+
+.bodywebsite .d-table-cell {
+ display: table-cell !important;
+}
+
+.bodywebsite .d-flex {
+ display: flex !important;
+}
+
+.bodywebsite .d-inline-flex {
+ display: inline-flex !important;
+}
+
+.bodywebsite .d-none {
+ display: none !important;
+}
+
+.bodywebsite .shadow {
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
+}
+
+.bodywebsite .shadow-sm {
+ box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
+}
+
+.bodywebsite .shadow-lg {
+ box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;
+}
+
+.bodywebsite .shadow-none {
+ box-shadow: none !important;
+}
+
+.bodywebsite .position-static {
+ position: static !important;
+}
+
+.bodywebsite .position-relative {
+ position: relative !important;
+}
+
+.bodywebsite .position-absolute {
+ position: absolute !important;
+}
+
+.bodywebsite .position-fixed {
+ position: fixed !important;
+}
+
+.bodywebsite .position-sticky {
+ position: -webkit-sticky !important;
+ position: sticky !important;
+}
+
+.bodywebsite .top-0 {
+ top: 0 !important;
+}
+
+.bodywebsite .top-50 {
+ top: 50% !important;
+}
+
+.bodywebsite .top-100 {
+ top: 100% !important;
+}
+
+.bodywebsite .bottom-0 {
+ bottom: 0 !important;
+}
+
+.bodywebsite .bottom-50 {
+ bottom: 50% !important;
+}
+
+.bodywebsite .bottom-100 {
+ bottom: 100% !important;
+}
+
+.bodywebsite .start-0 {
+ left: 0 !important;
+}
+
+.bodywebsite .start-50 {
+ left: 50% !important;
+}
+
+.bodywebsite .start-100 {
+ left: 100% !important;
+}
+
+.bodywebsite .end-0 {
+ right: 0 !important;
+}
+
+.bodywebsite .end-50 {
+ right: 50% !important;
+}
+
+.bodywebsite .end-100 {
+ right: 100% !important;
+}
+
+.bodywebsite .translate-middle {
+ transform: translate(-50%, -50%) !important;
+}
+
+.bodywebsite .translate-middle-x {
+ transform: translateX(-50%) !important;
+}
+
+.bodywebsite .translate-middle-y {
+ transform: translateY(-50%) !important;
+}
+
+.bodywebsite .border {
+ border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-0 {
+ border: 0 !important;
+}
+
+.bodywebsite .border-top {
+ border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-top-0 {
+ border-top: 0 !important;
+}
+
+.bodywebsite .border-end {
+ border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-end-0 {
+ border-right: 0 !important;
+}
+
+.bodywebsite .border-bottom {
+ border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-bottom-0 {
+ border-bottom: 0 !important;
+}
+
+.bodywebsite .border-start {
+ border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-start-0 {
+ border-left: 0 !important;
+}
+
+.bodywebsite .border-primary {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-secondary {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-success {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-info {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-warning {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-danger {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-light {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-dark {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-white {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-1 {
+ --bs-border-width: 1px;
+}
+
+.bodywebsite .border-2 {
+ --bs-border-width: 2px;
+}
+
+.bodywebsite .border-3 {
+ --bs-border-width: 3px;
+}
+
+.bodywebsite .border-4 {
+ --bs-border-width: 4px;
+}
+
+.bodywebsite .border-5 {
+ --bs-border-width: 5px;
+}
+
+.bodywebsite .border-opacity-10 {
+ --bs-border-opacity: 0.1;
+}
+
+.bodywebsite .border-opacity-25 {
+ --bs-border-opacity: 0.25;
+}
+
+.bodywebsite .border-opacity-50 {
+ --bs-border-opacity: 0.5;
+}
+
+.bodywebsite .border-opacity-75 {
+ --bs-border-opacity: 0.75;
+}
+
+.bodywebsite .border-opacity-100 {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .w-25 {
+ width: 25% !important;
+}
+
+.bodywebsite .w-50 {
+ width: 50% !important;
+}
+
+.bodywebsite .w-75 {
+ width: 75% !important;
+}
+
+.bodywebsite .w-100 {
+ width: 100% !important;
+}
+
+.bodywebsite .w-auto {
+ width: auto !important;
+}
+
+.bodywebsite .mw-100 {
+ max-width: 100% !important;
+}
+
+.bodywebsite .vw-100 {
+ width: 100vw !important;
+}
+
+.bodywebsite .min-vw-100 {
+ min-width: 100vw !important;
+}
+
+.bodywebsite .h-25 {
+ height: 25% !important;
+}
+
+.bodywebsite .h-50 {
+ height: 50% !important;
+}
+
+.bodywebsite .h-75 {
+ height: 75% !important;
+}
+
+.bodywebsite .h-100 {
+ height: 100% !important;
+}
+
+.bodywebsite .h-auto {
+ height: auto !important;
+}
+
+.bodywebsite .mh-100 {
+ max-height: 100% !important;
+}
+
+.bodywebsite .vh-100 {
+ height: 100vh !important;
+}
+
+.bodywebsite .min-vh-100 {
+ min-height: 100vh !important;
+}
+
+.bodywebsite .flex-fill {
+ flex: 1 1 auto !important;
+}
+
+.bodywebsite .flex-row {
+ flex-direction: row !important;
+}
+
+.bodywebsite .flex-column {
+ flex-direction: column !important;
+}
+
+.bodywebsite .flex-row-reverse {
+ flex-direction: row-reverse !important;
+}
+
+.bodywebsite .flex-column-reverse {
+ flex-direction: column-reverse !important;
+}
+
+.bodywebsite .flex-grow-0 {
+ flex-grow: 0 !important;
+}
+
+.bodywebsite .flex-grow-1 {
+ flex-grow: 1 !important;
+}
+
+.bodywebsite .flex-shrink-0 {
+ flex-shrink: 0 !important;
+}
+
+.bodywebsite .flex-shrink-1 {
+ flex-shrink: 1 !important;
+}
+
+.bodywebsite .flex-wrap {
+ flex-wrap: wrap !important;
+}
+
+.bodywebsite .flex-nowrap {
+ flex-wrap: nowrap !important;
+}
+
+.bodywebsite .flex-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+}
+
+.bodywebsite .justify-content-start {
+ justify-content: flex-start !important;
+}
+
+.bodywebsite .justify-content-end {
+ justify-content: flex-end !important;
+}
+
+.bodywebsite .justify-content-center {
+ justify-content: center !important;
+}
+
+.bodywebsite .justify-content-between {
+ justify-content: space-between !important;
+}
+
+.bodywebsite .justify-content-around {
+ justify-content: space-around !important;
+}
+
+.bodywebsite .justify-content-evenly {
+ justify-content: space-evenly !important;
+}
+
+.bodywebsite .align-items-start {
+ align-items: flex-start !important;
+}
+
+.bodywebsite .align-items-end {
+ align-items: flex-end !important;
+}
+
+.bodywebsite .align-items-center {
+ align-items: center !important;
+}
+
+.bodywebsite .align-items-baseline {
+ align-items: baseline !important;
+}
+
+.bodywebsite .align-items-stretch {
+ align-items: stretch !important;
+}
+
+.bodywebsite .align-content-start {
+ align-content: flex-start !important;
+}
+
+.bodywebsite .align-content-end {
+ align-content: flex-end !important;
+}
+
+.bodywebsite .align-content-center {
+ align-content: center !important;
+}
+
+.bodywebsite .align-content-between {
+ align-content: space-between !important;
+}
+
+.bodywebsite .align-content-around {
+ align-content: space-around !important;
+}
+
+.bodywebsite .align-content-stretch {
+ align-content: stretch !important;
+}
+
+.bodywebsite .align-self-auto {
+ align-self: auto !important;
+}
+
+.bodywebsite .align-self-start {
+ align-self: flex-start !important;
+}
+
+.bodywebsite .align-self-end {
+ align-self: flex-end !important;
+}
+
+.bodywebsite .align-self-center {
+ align-self: center !important;
+}
+
+.bodywebsite .align-self-baseline {
+ align-self: baseline !important;
+}
+
+.bodywebsite .align-self-stretch {
+ align-self: stretch !important;
+}
+
+.bodywebsite .order-first {
+ order: -1 !important;
+}
+
+.bodywebsite .order-0 {
+ order: 0 !important;
+}
+
+.bodywebsite .order-1 {
+ order: 1 !important;
+}
+
+.bodywebsite .order-2 {
+ order: 2 !important;
+}
+
+.bodywebsite .order-3 {
+ order: 3 !important;
+}
+
+.bodywebsite .order-4 {
+ order: 4 !important;
+}
+
+.bodywebsite .order-5 {
+ order: 5 !important;
+}
+
+.bodywebsite .order-last {
+ order: 6 !important;
+}
+
+.bodywebsite .m-0 {
+ margin: 0 !important;
+}
+
+.bodywebsite .m-1 {
+ margin: 0.25rem !important;
+}
+
+.bodywebsite .m-2 {
+ margin: 0.5rem !important;
+}
+
+.bodywebsite .m-3 {
+ margin: 1rem !important;
+}
+
+.bodywebsite .m-4 {
+ margin: 1.5rem !important;
+}
+
+.bodywebsite .m-5 {
+ margin: 3rem !important;
+}
+
+.bodywebsite .m-auto {
+ margin: auto !important;
+}
+
+.bodywebsite .mx-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+}
+
+.bodywebsite .mx-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+}
+
+.bodywebsite .mx-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+}
+
+.bodywebsite .mx-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+}
+
+.bodywebsite .mx-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+}
+
+.bodywebsite .mx-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+}
+
+.bodywebsite .mx-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+}
+
+.bodywebsite .my-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+.bodywebsite .my-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+}
+
+.bodywebsite .my-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+}
+
+.bodywebsite .my-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+}
+
+.bodywebsite .my-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+}
+
+.bodywebsite .my-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+}
+
+.bodywebsite .my-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+}
+
+.bodywebsite .mt-0 {
+ margin-top: 0 !important;
+}
+
+.bodywebsite .mt-1 {
+ margin-top: 0.25rem !important;
+}
+
+.bodywebsite .mt-2 {
+ margin-top: 0.5rem !important;
+}
+
+.bodywebsite .mt-3 {
+ margin-top: 1rem !important;
+}
+
+.bodywebsite .mt-4 {
+ margin-top: 1.5rem !important;
+}
+
+.bodywebsite .mt-5 {
+ margin-top: 3rem !important;
+}
+
+.bodywebsite .mt-auto {
+ margin-top: auto !important;
+}
+
+.bodywebsite .me-0 {
+ margin-right: 0 !important;
+}
+
+.bodywebsite .me-1 {
+ margin-right: 0.25rem !important;
+}
+
+.bodywebsite .me-2 {
+ margin-right: 0.5rem !important;
+}
+
+.bodywebsite .me-3 {
+ margin-right: 1rem !important;
+}
+
+.bodywebsite .me-4 {
+ margin-right: 1.5rem !important;
+}
+
+.bodywebsite .me-5 {
+ margin-right: 3rem !important;
+}
+
+.bodywebsite .me-auto {
+ margin-right: auto !important;
+}
+
+.bodywebsite .mb-0 {
+ margin-bottom: 0 !important;
+}
+
+.bodywebsite .mb-1 {
+ margin-bottom: 0.25rem !important;
+}
+
+.bodywebsite .mb-2 {
+ margin-bottom: 0.5rem !important;
+}
+
+.bodywebsite .mb-3 {
+ margin-bottom: 1rem !important;
+}
+
+.bodywebsite .mb-4 {
+ margin-bottom: 1.5rem !important;
+}
+
+.bodywebsite .mb-5 {
+ margin-bottom: 3rem !important;
+}
+
+.bodywebsite .mb-auto {
+ margin-bottom: auto !important;
+}
+
+.bodywebsite .ms-0 {
+ margin-left: 0 !important;
+}
+
+.bodywebsite .ms-1 {
+ margin-left: 0.25rem !important;
+}
+
+.bodywebsite .ms-2 {
+ margin-left: 0.5rem !important;
+}
+
+.bodywebsite .ms-3 {
+ margin-left: 1rem !important;
+}
+
+.bodywebsite .ms-4 {
+ margin-left: 1.5rem !important;
+}
+
+.bodywebsite .ms-5 {
+ margin-left: 3rem !important;
+}
+
+.bodywebsite .ms-auto {
+ margin-left: auto !important;
+}
+
+.bodywebsite .p-0 {
+ padding: 0 !important;
+}
+
+.bodywebsite .p-1 {
+ padding: 0.25rem !important;
+}
+
+.bodywebsite .p-2 {
+ padding: 0.5rem !important;
+}
+
+.bodywebsite .p-3 {
+ padding: 1rem !important;
+}
+
+.bodywebsite .p-4 {
+ padding: 1.5rem !important;
+}
+
+.bodywebsite .p-5 {
+ padding: 3rem !important;
+}
+
+.bodywebsite .px-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+}
+
+.bodywebsite .px-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+}
+
+.bodywebsite .px-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+}
+
+.bodywebsite .px-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+}
+
+.bodywebsite .px-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+}
+
+.bodywebsite .px-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+}
+
+.bodywebsite .py-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+}
+
+.bodywebsite .py-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+}
+
+.bodywebsite .py-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+}
+
+.bodywebsite .py-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+}
+
+.bodywebsite .py-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+}
+
+.bodywebsite .py-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+}
+
+.bodywebsite .pt-0 {
+ padding-top: 0 !important;
+}
+
+.bodywebsite .pt-1 {
+ padding-top: 0.25rem !important;
+}
+
+.bodywebsite .pt-2 {
+ padding-top: 0.5rem !important;
+}
+
+.bodywebsite .pt-3 {
+ padding-top: 1rem !important;
+}
+
+.bodywebsite .pt-4 {
+ padding-top: 1.5rem !important;
+}
+
+.bodywebsite .pt-5 {
+ padding-top: 3rem !important;
+}
+
+.bodywebsite .pe-0 {
+ padding-right: 0 !important;
+}
+
+.bodywebsite .pe-1 {
+ padding-right: 0.25rem !important;
+}
+
+.bodywebsite .pe-2 {
+ padding-right: 0.5rem !important;
+}
+
+.bodywebsite .pe-3 {
+ padding-right: 1rem !important;
+}
+
+.bodywebsite .pe-4 {
+ padding-right: 1.5rem !important;
+}
+
+.bodywebsite .pe-5 {
+ padding-right: 3rem !important;
+}
+
+.bodywebsite .pb-0 {
+ padding-bottom: 0 !important;
+}
+
+.bodywebsite .pb-1 {
+ padding-bottom: 0.25rem !important;
+}
+
+.bodywebsite .pb-2 {
+ padding-bottom: 0.5rem !important;
+}
+
+.bodywebsite .pb-3 {
+ padding-bottom: 1rem !important;
+}
+
+.bodywebsite .pb-4 {
+ padding-bottom: 1.5rem !important;
+}
+
+.bodywebsite .pb-5 {
+ padding-bottom: 3rem !important;
+}
+
+.bodywebsite .ps-0 {
+ padding-left: 0 !important;
+}
+
+.bodywebsite .ps-1 {
+ padding-left: 0.25rem !important;
+}
+
+.bodywebsite .ps-2 {
+ padding-left: 0.5rem !important;
+}
+
+.bodywebsite .ps-3 {
+ padding-left: 1rem !important;
+}
+
+.bodywebsite .ps-4 {
+ padding-left: 1.5rem !important;
+}
+
+.bodywebsite .ps-5 {
+ padding-left: 3rem !important;
+}
+
+.bodywebsite .gap-0 {
+ gap: 0 !important;
+}
+
+.bodywebsite .gap-1 {
+ gap: 0.25rem !important;
+}
+
+.bodywebsite .gap-2 {
+ gap: 0.5rem !important;
+}
+
+.bodywebsite .gap-3 {
+ gap: 1rem !important;
+}
+
+.bodywebsite .gap-4 {
+ gap: 1.5rem !important;
+}
+
+.bodywebsite .gap-5 {
+ gap: 3rem !important;
+}
+
+.bodywebsite .font-monospace {
+ font-family: var(--bs-font-monospace) !important;
+}
+
+.bodywebsite .fs-1 {
+ font-size: calc(1.375rem + 1.5vw) !important;
+}
+
+.bodywebsite .fs-2 {
+ font-size: calc(1.325rem + 0.9vw) !important;
+}
+
+.bodywebsite .fs-3 {
+ font-size: calc(1.3rem + 0.6vw) !important;
+}
+
+.bodywebsite .fs-4 {
+ font-size: calc(1.275rem + 0.3vw) !important;
+}
+
+.bodywebsite .fs-5 {
+ font-size: 1.25rem !important;
+}
+
+.bodywebsite .fs-6 {
+ font-size: 1rem !important;
+}
+
+.bodywebsite .fst-italic {
+ font-style: italic !important;
+}
+
+.bodywebsite .fst-normal {
+ font-style: normal !important;
+}
+
+.bodywebsite .fw-light {
+ font-weight: 300 !important;
+}
+
+.bodywebsite .fw-lighter {
+ font-weight: lighter !important;
+}
+
+.bodywebsite .fw-normal {
+ font-weight: 400 !important;
+}
+
+.bodywebsite .fw-bold {
+ font-weight: 700 !important;
+}
+
+.bodywebsite .fw-semibold {
+ font-weight: 600 !important;
+}
+
+.bodywebsite .fw-bolder {
+ font-weight: bolder !important;
+}
+
+.bodywebsite .lh-1 {
+ line-height: 1 !important;
+}
+
+.bodywebsite .lh-sm {
+ line-height: 1.25 !important;
+}
+
+.bodywebsite .lh-base {
+ line-height: 1.5 !important;
+}
+
+.bodywebsite .lh-lg {
+ line-height: 2 !important;
+}
+
+.bodywebsite .text-start {
+ text-align: left !important;
+}
+
+.bodywebsite .text-end {
+ text-align: right !important;
+}
+
+.bodywebsite .text-center {
+ text-align: center !important;
+}
+
+.bodywebsite .text-decoration-none {
+ text-decoration: none !important;
+}
+
+.bodywebsite .text-decoration-underline {
+ text-decoration: underline !important;
+}
+
+.bodywebsite .text-decoration-line-through {
+ text-decoration: line-through !important;
+}
+
+.bodywebsite .text-lowercase {
+ text-transform: lowercase !important;
+}
+
+.bodywebsite .text-uppercase {
+ text-transform: uppercase !important;
+}
+
+.bodywebsite .text-capitalize {
+ text-transform: capitalize !important;
+}
+
+.bodywebsite .text-wrap {
+ white-space: normal !important;
+}
+
+.bodywebsite .text-nowrap {
+ white-space: nowrap !important;
+}
+
+.bodywebsite .text-break {
+ word-wrap: break-word !important;
+ word-break: break-word !important;
+}
+
+.bodywebsite .text-primary {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-secondary {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-success {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-info {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-warning {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-danger {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-light {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-dark {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-black {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-white {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-body {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-muted {
+ --bs-text-opacity: 1;
+ color: #6c757d !important;
+}
+
+.bodywebsite .text-black-50 {
+ --bs-text-opacity: 1;
+ color: rgba(0, 0, 0, 0.5) !important;
+}
+
+.bodywebsite .text-white-50 {
+ --bs-text-opacity: 1;
+ color: rgba(255, 255, 255, 0.5) !important;
+}
+
+.bodywebsite .text-reset {
+ --bs-text-opacity: 1;
+ color: inherit !important;
+}
+
+.bodywebsite .text-opacity-25 {
+ --bs-text-opacity: 0.25;
+}
+
+.bodywebsite .text-opacity-50 {
+ --bs-text-opacity: 0.5;
+}
+
+.bodywebsite .text-opacity-75 {
+ --bs-text-opacity: 0.75;
+}
+
+.bodywebsite .text-opacity-100 {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .bg-primary {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-secondary {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-success {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-info {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-warning {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-danger {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-light {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-dark {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-black {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-white {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-body {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-transparent {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-opacity-10 {
+ --bs-bg-opacity: 0.1;
+}
+
+.bodywebsite .bg-opacity-25 {
+ --bs-bg-opacity: 0.25;
+}
+
+.bodywebsite .bg-opacity-50 {
+ --bs-bg-opacity: 0.5;
+}
+
+.bodywebsite .bg-opacity-75 {
+ --bs-bg-opacity: 0.75;
+}
+
+.bodywebsite .bg-opacity-100 {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-gradient {
+ background-image: var(--bs-gradient) !important;
+}
+
+.bodywebsite .user-select-all {
+ -webkit-user-select: all !important;
+ -moz-user-select: all !important;
+ user-select: all !important;
+}
+
+.bodywebsite .user-select-auto {
+ -webkit-user-select: auto !important;
+ -moz-user-select: auto !important;
+ user-select: auto !important;
+}
+
+.bodywebsite .user-select-none {
+ -webkit-user-select: none !important;
+ -moz-user-select: none !important;
+ user-select: none !important;
+}
+
+.bodywebsite .pe-none {
+ pointer-events: none !important;
+}
+
+.bodywebsite .pe-auto {
+ pointer-events: auto !important;
+}
+
+.bodywebsite .rounded {
+ border-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-0 {
+ border-radius: 0 !important;
+}
+
+.bodywebsite .rounded-1 {
+ border-radius: var(--bs-border-radius-sm) !important;
+}
+
+.bodywebsite .rounded-2 {
+ border-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-3 {
+ border-radius: var(--bs-border-radius-lg) !important;
+}
+
+.bodywebsite .rounded-4 {
+ border-radius: var(--bs-border-radius-xl) !important;
+}
+
+.bodywebsite .rounded-5 {
+ border-radius: var(--bs-border-radius-2xl) !important;
+}
+
+.bodywebsite .rounded-circle {
+ border-radius: 50% !important;
+}
+
+.bodywebsite .rounded-pill {
+ border-radius: var(--bs-border-radius-pill) !important;
+}
+
+.bodywebsite .rounded-top {
+ border-top-left-radius: var(--bs-border-radius) !important;
+ border-top-right-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-end {
+ border-top-right-radius: var(--bs-border-radius) !important;
+ border-bottom-right-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-bottom {
+ border-bottom-right-radius: var(--bs-border-radius) !important;
+ border-bottom-left-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-start {
+ border-bottom-left-radius: var(--bs-border-radius) !important;
+ border-top-left-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .visible {
+ visibility: visible !important;
+}
+
+.bodywebsite .invisible {
+ visibility: hidden !important;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .float-sm-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-sm-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-sm-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-sm-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-sm-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-sm-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-sm-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-sm-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-sm-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-sm-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-sm-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-sm-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-sm-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-sm-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-sm-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-sm-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-sm-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-sm-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-sm-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-sm-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-sm-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-sm-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-sm-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-sm-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-sm-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-sm-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-sm-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-sm-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-sm-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-sm-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-sm-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-sm-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-sm-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-sm-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-sm-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-sm-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-sm-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-sm-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-sm-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-sm-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-sm-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-sm-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-sm-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-sm-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-sm-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-sm-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-sm-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-sm-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-sm-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-sm-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-sm-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-sm-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-sm-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-sm-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-sm-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-sm-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-sm-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-sm-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-sm-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-sm-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-sm-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-sm-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-sm-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-sm-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-sm-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-sm-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-sm-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-sm-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-sm-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-sm-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-sm-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-sm-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-sm-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-sm-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-sm-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-sm-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-sm-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-sm-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-sm-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-sm-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-sm-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-sm-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-sm-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-sm-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-sm-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-sm-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-sm-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-sm-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-sm-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-sm-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-sm-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-sm-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-sm-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-sm-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-sm-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-sm-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-sm-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-sm-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-sm-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-sm-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-sm-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-sm-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-sm-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-sm-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-sm-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-sm-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-sm-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-sm-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-sm-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-sm-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-sm-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-sm-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-sm-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-sm-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-sm-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-sm-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-sm-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-sm-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-sm-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-sm-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-sm-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-sm-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-sm-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-sm-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-sm-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-sm-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-sm-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-sm-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-sm-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-sm-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-sm-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-sm-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-sm-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-sm-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-sm-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-sm-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-sm-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-sm-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-sm-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-sm-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-sm-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-sm-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-sm-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-sm-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-sm-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-sm-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-sm-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-sm-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-sm-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-sm-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-sm-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-sm-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-sm-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-sm-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-sm-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-sm-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .float-md-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-md-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-md-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-md-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-md-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-md-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-md-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-md-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-md-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-md-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-md-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-md-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-md-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-md-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-md-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-md-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-md-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-md-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-md-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-md-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-md-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-md-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-md-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-md-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-md-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-md-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-md-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-md-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-md-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-md-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-md-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-md-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-md-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-md-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-md-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-md-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-md-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-md-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-md-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-md-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-md-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-md-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-md-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-md-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-md-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-md-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-md-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-md-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-md-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-md-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-md-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-md-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-md-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-md-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-md-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-md-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-md-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-md-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-md-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-md-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-md-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-md-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-md-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-md-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-md-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-md-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-md-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-md-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-md-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-md-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-md-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-md-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-md-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-md-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-md-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-md-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-md-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-md-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-md-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-md-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-md-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-md-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-md-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-md-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-md-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-md-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-md-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-md-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-md-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-md-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-md-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-md-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-md-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-md-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-md-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-md-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-md-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-md-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-md-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-md-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-md-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-md-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-md-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-md-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-md-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-md-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-md-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-md-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-md-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-md-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-md-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-md-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-md-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-md-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-md-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-md-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-md-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-md-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-md-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-md-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-md-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-md-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-md-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-md-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-md-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-md-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-md-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-md-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-md-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-md-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-md-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-md-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-md-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-md-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-md-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-md-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-md-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-md-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-md-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-md-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-md-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-md-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-md-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-md-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-md-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-md-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-md-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-md-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-md-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-md-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-md-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-md-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-md-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-md-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-md-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-md-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .float-lg-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-lg-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-lg-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-lg-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-lg-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-lg-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-lg-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-lg-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-lg-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-lg-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-lg-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-lg-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-lg-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-lg-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-lg-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-lg-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-lg-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-lg-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-lg-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-lg-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-lg-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-lg-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-lg-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-lg-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-lg-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-lg-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-lg-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-lg-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-lg-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-lg-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-lg-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-lg-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-lg-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-lg-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-lg-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-lg-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-lg-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-lg-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-lg-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-lg-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-lg-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-lg-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-lg-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-lg-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-lg-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-lg-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-lg-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-lg-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-lg-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-lg-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-lg-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-lg-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-lg-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-lg-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-lg-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-lg-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-lg-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-lg-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-lg-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-lg-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-lg-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-lg-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-lg-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-lg-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-lg-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-lg-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-lg-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-lg-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-lg-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-lg-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-lg-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-lg-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-lg-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-lg-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-lg-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-lg-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-lg-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-lg-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-lg-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-lg-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-lg-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-lg-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-lg-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-lg-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-lg-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-lg-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-lg-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-lg-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-lg-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-lg-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-lg-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-lg-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-lg-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-lg-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-lg-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-lg-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-lg-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-lg-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-lg-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-lg-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-lg-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-lg-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-lg-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-lg-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-lg-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-lg-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-lg-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-lg-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-lg-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-lg-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-lg-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-lg-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-lg-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-lg-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-lg-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-lg-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-lg-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-lg-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-lg-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-lg-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-lg-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-lg-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-lg-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-lg-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-lg-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-lg-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-lg-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-lg-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-lg-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-lg-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-lg-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-lg-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-lg-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-lg-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-lg-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-lg-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-lg-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-lg-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-lg-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-lg-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-lg-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-lg-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-lg-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-lg-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-lg-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-lg-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-lg-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-lg-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-lg-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-lg-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-lg-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-lg-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-lg-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-lg-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-lg-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-lg-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .float-xl-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-xl-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-xl-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-xl-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-xl-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-xl-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-xl-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-xl-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-xl-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-xl-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-xl-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-xl-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-xl-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-xl-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-xl-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-xl-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-xl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-xl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-xl-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-xl-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-xl-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-xl-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-xl-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-xl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-xl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-xl-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-xl-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-xl-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-xl-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-xl-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-xl-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-xl-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-xl-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-xl-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-xl-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-xl-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-xl-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-xl-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-xl-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-xl-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-xl-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-xl-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-xl-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-xl-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-xl-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-xl-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-xl-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-xl-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-xl-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-xl-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-xl-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-xl-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-xl-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-xl-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-xl-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-xl-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-xl-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-xl-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-xl-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-xl-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-xl-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-xl-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-xl-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-xl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-xl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-xl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-xl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-xl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-xl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-xl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-xl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-xl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-xl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-xl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-xl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-xl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-xl-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-xl-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-xl-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-xl-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-xl-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-xl-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-xl-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-xl-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-xl-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-xl-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-xl-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-xl-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-xl-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-xl-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-xl-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-xl-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-xl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-xl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-xl-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-xl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-xl-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-xl-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-xl-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-xl-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-xl-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-xl-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-xl-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-xl-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-xl-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-xl-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-xl-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-xl-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-xl-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-xl-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-xl-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-xl-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-xl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-xl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-xl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-xl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-xl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-xl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-xl-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-xl-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-xl-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-xl-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-xl-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-xl-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-xl-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-xl-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-xl-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-xl-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-xl-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-xl-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-xl-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-xl-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-xl-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-xl-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-xl-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-xl-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-xl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-xl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-xl-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-xl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-xl-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-xl-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-xl-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-xl-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-xl-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-xl-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-xl-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-xl-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-xl-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-xl-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-xl-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-xl-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-xl-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-xl-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-xl-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-xl-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .float-xxl-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-xxl-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-xxl-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-xxl-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-xxl-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-xxl-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-xxl-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-xxl-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-xxl-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-xxl-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-xxl-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-xxl-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-xxl-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-xxl-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-xxl-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-xxl-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-xxl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-xxl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-xxl-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-xxl-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-xxl-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-xxl-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-xxl-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-xxl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-xxl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-xxl-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-xxl-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-xxl-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-xxl-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-xxl-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-xxl-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-xxl-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-xxl-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-xxl-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-xxl-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-xxl-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-xxl-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-xxl-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-xxl-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-xxl-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-xxl-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-xxl-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-xxl-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-xxl-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-xxl-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-xxl-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-xxl-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-xxl-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-xxl-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-xxl-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-xxl-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-xxl-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-xxl-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-xxl-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-xxl-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-xxl-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-xxl-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-xxl-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-xxl-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-xxl-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-xxl-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-xxl-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-xxl-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-xxl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-xxl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-xxl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-xxl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-xxl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-xxl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-xxl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-xxl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-xxl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-xxl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-xxl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-xxl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-xxl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-xxl-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-xxl-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-xxl-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-xxl-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-xxl-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-xxl-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-xxl-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-xxl-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-xxl-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-xxl-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-xxl-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-xxl-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-xxl-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-xxl-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-xxl-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-xxl-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-xxl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-xxl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-xxl-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-xxl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-xxl-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-xxl-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-xxl-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-xxl-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-xxl-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-xxl-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-xxl-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-xxl-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-xxl-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-xxl-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-xxl-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-xxl-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-xxl-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-xxl-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-xxl-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-xxl-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-xxl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-xxl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-xxl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-xxl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-xxl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-xxl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-xxl-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-xxl-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-xxl-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-xxl-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-xxl-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-xxl-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-xxl-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-xxl-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-xxl-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-xxl-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-xxl-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-xxl-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-xxl-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-xxl-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-xxl-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-xxl-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-xxl-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-xxl-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-xxl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-xxl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-xxl-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-xxl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-xxl-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-xxl-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-xxl-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-xxl-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-xxl-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-xxl-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-xxl-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-xxl-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-xxl-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-xxl-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-xxl-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-xxl-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-xxl-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-xxl-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-xxl-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-xxl-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .fs-1 {
+ font-size: 2.5rem !important;
+ }
+
+ .bodywebsite .fs-2 {
+ font-size: 2rem !important;
+ }
+
+ .bodywebsite .fs-3 {
+ font-size: 1.75rem !important;
+ }
+
+ .bodywebsite .fs-4 {
+ font-size: 1.5rem !important;
+ }
+}
+
+@media print {
+ .bodywebsite .d-print-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-print-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-print-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-print-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-print-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-print-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-print-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-print-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-print-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-print-none {
+ display: none !important;
+ }
+}
+/*# sourceMappingURL=bootstrap.css.map */
+
+.bodywebsite #mysection1 {
+ font-size: 1.2rem;
+ font-weight: bold;
+}
+
+.bodywebsite .flex {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+}
+
+.bodywebsite h1 h2 h3 h4 {
+ font-family: Anton;
+ font-weight: 900;
+}
+
+.bodywebsite .btn-perso {
+ background-color: #50759e;
+ padding-left: 20px;
+ padding-right: 20px;
+ text-align: center;
+ color: #fff;
+ font-weight: bold;
+}
+
+.bodywebsite .btn-perso:hover {
+ background-color: #fff;
+ color: #bb393c;
+}
+
+.bodywebsite #landing {
+ background-color: #C84F37;
+ color: #fff;
+ min-height: 100vh;
+}
+
+.bodywebsite #desc {
+ background-color: #292727;
+}
+
+.bodywebsite nav {
+ padding-left: 30px;
+ padding-right: 30px;
+ background-color: rgba(12, 12, 12, 0.5) !important;
+ width: 100%;
+}
+
+.bodywebsite #title {
+ font-size: 80px;
+ z-index: 11;
+}
+
+.bodywebsite .img-landing {
+ position: relative;
+ top: 0%;
+ z-index: 10;
+}
+
+.bodywebsite .pointed {
+ cursor: pointer;
+ background-color: #292727;
+ color: #fff;
+}
+
+.bodywebsite #contact {
+ background-color: #C84F37;
+ color: white;
+}
+
+.bodywebsite .container {
+ padding-top: 5%;
+ padding-bottom: 5%;
+}
+
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/wrapper.php b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/wrapper.php
new file mode 100644
index 00000000000..26adb3ef220
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-homesubmenu/containers/wrapper.php
@@ -0,0 +1,278 @@
+entity;
+$original_file = GETPOST("file", "alpha");
+$l = GETPOST('l', 'aZ09');
+$limit = GETPOST('limit', 'int');
+
+// Parameters for RSS
+$rss = GETPOST('rss', 'aZ09');
+if ($rss) {
+ $original_file = 'blog.rss';
+}
+
+// If we have a hash public (hashp), we guess the original_file.
+if (!empty($hashp)) {
+ include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
+ $ecmfile = new EcmFiles($db);
+ $result = $ecmfile->fetch(0, '', '', '', $hashp);
+ if ($result > 0) {
+ $tmp = explode('/', $ecmfile->filepath, 2); // $ecmfile->filepath is relative to document directory
+ // filepath can be 'users/X' or 'X/propale/PR11111'
+ if (is_numeric($tmp[0])) { // If first tmp is numeric, it is subdir of company for multicompany, we take next part.
+ $tmp = explode('/', $tmp[1], 2);
+ }
+ $moduleparttocheck = $tmp[0]; // moduleparttocheck is first part of path
+
+ if ($modulepart) { // Not required, so often not defined, for link using public hashp parameter.
+ if ($moduleparttocheck == $modulepart) {
+ // We remove first level of directory
+ $original_file = (($tmp[1] ? $tmp[1].'/' : '').$ecmfile->filename); // this is relative to module dir
+ //var_dump($original_file); exit;
+ } else {
+ print 'Bad link. File is from another module part.';
+ }
+ } else {
+ $modulepart = $moduleparttocheck;
+ $original_file = (($tmp[1] ? $tmp[1].'/' : '').$ecmfile->filename); // this is relative to module dir
+ }
+ } else {
+ print "ErrorFileNotFoundWithSharedLink";
+ exit;
+ }
+}
+
+// Define attachment (attachment=true to force choice popup 'open'/'save as')
+$attachment = true;
+if (preg_match('/\.(html|htm)$/i', $original_file)) {
+ $attachment = false;
+}
+if (isset($_GET["attachment"])) {
+ $attachment = (GETPOST("attachment", 'alphanohtml') ? true : false);
+}
+if (!empty($conf->global->MAIN_DISABLE_FORCE_SAVEAS_WEBSITE)) {
+ $attachment = false;
+}
+
+// Define mime type
+$type = 'application/octet-stream';
+if (GETPOSTISSET('type')) {
+ $type = GETPOST('type', 'alpha');
+} else {
+ $type = dol_mimetype($original_file);
+}
+
+// Security: Delete string ../ into $original_file
+$original_file = str_replace("../", "/", $original_file);
+
+// Cache or not
+if (GETPOST("cache", 'aZ09') || image_format_supported($original_file) >= 0) {
+ // Important: Following code is to avoid page request by browser and PHP CPU at
+ // each Dolibarr page access.
+ header('Cache-Control: max-age=3600, public, must-revalidate');
+ header('Pragma: cache'); // This is to avoid having Pragma: no-cache
+}
+
+$refname = basename(dirname($original_file)."/");
+
+// Get RSS news
+if ($rss) {
+ $format = 'rss';
+ $type = '';
+ $cachedelay = 0;
+ $filename = $original_file;
+ $dir_temp = $conf->website->dir_temp;
+
+ include_once DOL_DOCUMENT_ROOT.'/website/class/website.class.php';
+ include_once DOL_DOCUMENT_ROOT.'/website/class/websitepage.class.php';
+ $website = new Website($db);
+ $websitepage = new WebsitePage($db);
+
+ $website->fetch('', $websitekey);
+
+ $filters = array('type_container'=>'blogpost', 'status'=>1);
+ if ($l) {
+ $filters['lang'] = $l;
+ }
+
+ $MAXNEWS = ($limit ? $limit : 20);
+ $arrayofblogs = $websitepage->fetchAll($website->id, 'DESC', 'date_creation', $MAXNEWS, 0, $filters);
+ $eventarray = array();
+ if (is_array($arrayofblogs)) {
+ foreach ($arrayofblogs as $blog) {
+ $blog->fullpageurl = $website->virtualhost.'/'.$blog->pageurl.'.php';
+ $eventarray[] = $blog;
+ }
+ }
+
+ require_once DOL_DOCUMENT_ROOT."/core/lib/xcal.lib.php";
+ require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php";
+ require_once DOL_DOCUMENT_ROOT."/core/lib/files.lib.php";
+
+ dol_syslog("build_exportfile Build export file format=".$format.", type=".$type.", cachedelay=".$cachedelay.", filename=".$filename.", filters size=".count($filters), LOG_DEBUG);
+
+ // Clean parameters
+ if (!$filename) {
+ $extension = 'rss';
+ $filename = $format.'.'.$extension;
+ }
+
+ // Create dir and define output file (definitive and temporary)
+ $result = dol_mkdir($dir_temp);
+ $outputfile = $dir_temp.'/'.$filename;
+
+ $result = 0;
+
+ $buildfile = true;
+
+ if ($cachedelay) {
+ $nowgmt = dol_now();
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ if (dol_filemtime($outputfile) > ($nowgmt - $cachedelay)) {
+ dol_syslog("build_exportfile file ".$outputfile." is not older than now - cachedelay (".$nowgmt." - ".$cachedelay."). Build is canceled");
+ $buildfile = false;
+ }
+ }
+
+ if ($buildfile) {
+ $outputlangs = new Translate('', $conf);
+ $outputlangs->setDefaultLang($l);
+ $outputlangs->loadLangs(array("main", "other"));
+ $title = $desc = $outputlangs->transnoentities('LatestBlogPosts');
+
+ // Create temp file
+ $outputfiletmp = tempnam($dir_temp, 'tmp'); // Temporary file (allow call of function by different threads
+ @chmod($outputfiletmp, octdec($conf->global->MAIN_UMASK));
+
+ // Write file
+ $result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l);
+
+ if ($result >= 0) {
+ if (dol_move($outputfiletmp, $outputfile, 0, 1)) {
+ $result = 1;
+ } else {
+ $error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile;
+ dol_syslog("build_exportfile ".$error, LOG_ERR);
+ dol_delete_file($outputfiletmp, 0, 1);
+ print $error;
+ exit(-1);
+ }
+ } else {
+ dol_syslog("build_exportfile build_xxxfile function fails to for format=".$format." outputfiletmp=".$outputfile, LOG_ERR);
+ dol_delete_file($outputfiletmp, 0, 1);
+ $langs->load("errors");
+ print $langs->trans("ErrorFailToCreateFile", $outputfile);
+ exit(-1);
+ }
+ }
+
+ if ($result >= 0) {
+ $attachment = false;
+ if (isset($_GET["attachment"])) {
+ $attachment = $_GET["attachment"];
+ }
+ //$attachment = false;
+ $contenttype = 'application/rss+xml';
+ if (isset($_GET["contenttype"])) {
+ $contenttype = $_GET["contenttype"];
+ }
+ //$contenttype='text/plain';
+ $outputencoding = 'UTF-8';
+
+ if ($contenttype) {
+ header('Content-Type: '.$contenttype.($outputencoding ? '; charset='.$outputencoding : ''));
+ }
+ if ($attachment) {
+ header('Content-Disposition: attachment; filename="'.$filename.'"');
+ }
+
+ // Ajout directives pour resoudre bug IE
+ //header('Cache-Control: Public, must-revalidate');
+ //header('Pragma: public');
+ if ($cachedelay) {
+ header('Cache-Control: max-age='.$cachedelay.', private, must-revalidate');
+ } else {
+ header('Cache-Control: private, must-revalidate');
+ }
+
+ // Clean parameters
+ $outputfile = $dir_temp.'/'.$filename;
+ $result = readfile($outputfile);
+ if (!$result) {
+ print 'File '.$outputfile.' was empty.';
+ }
+
+ // header("Location: ".DOL_URL_ROOT.'/document.php?modulepart=agenda&file='.urlencode($filename));
+ exit;
+ }
+} elseif ($modulepart == "mycompany" && preg_match('/^\/?logos\//', $original_file)) {
+ // Get logos
+ readfile(dol_osencode($conf->mycompany->dir_output."/".$original_file));
+} else {
+ // Find the subdirectory name as the reference
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ $check_access = dol_check_secure_access_document($modulepart, $original_file, $entity, $refname);
+ $accessallowed = empty($check_access['accessallowed']) ? '' : $check_access['accessallowed'];
+ $sqlprotectagainstexternals = empty($check_access['sqlprotectagainstexternals']) ? '' : $check_access['sqlprotectagainstexternals'];
+ $fullpath_original_file = empty($check_access['original_file']) ? '' : $check_access['original_file']; // $fullpath_original_file is now a full path name
+ if ($hashp) {
+ $accessallowed = 1; // When using hashp, link is public so we force $accessallowed
+ $sqlprotectagainstexternals = '';
+ }
+
+ // Security:
+ // Limit access if permissions are wrong
+ if (!$accessallowed) {
+ print 'Access forbidden';
+ exit;
+ }
+
+ clearstatcache();
+
+ $filename = basename($fullpath_original_file);
+
+ // Output file on browser
+ dol_syslog("wrapper.php download $fullpath_original_file filename=$filename content-type=$type");
+ $fullpath_original_file_osencoded = dol_osencode($fullpath_original_file); // New file name encoded in OS encoding charset
+
+ // This test if file exists should be useless. We keep it to find bug more easily
+ if (!file_exists($fullpath_original_file_osencoded)) {
+ print "ErrorFileDoesNotExists: ".$original_file;
+ exit;
+ }
+
+ // Permissions are ok and file found, so we return it
+ //top_httphead($type);
+ header('Content-Type: '.$type);
+ header('Content-Description: File Transfer');
+ if ($encoding) {
+ header('Content-Encoding: '.$encoding);
+ }
+ // Add MIME Content-Disposition from RFC 2183 (inline=automatically displayed, attachment=need user action to open)
+ if ($attachment) {
+ header('Content-Disposition: attachment; filename="'.$filename.'"');
+ } else {
+ header('Content-Disposition: inline; filename="'.$filename.'"');
+ }
+ header('Content-Length: '.dol_filesize($fullpath_original_file));
+
+ readfile($fullpath_original_file_osencoded);
+}
+if (is_object($db)) {
+ $db->close();
+}
+// END PHP
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/medias/image/websitekey/article.png b/htdocs/install/doctemplates/websites/website_template-homesubmenu/medias/image/websitekey/article.png
new file mode 100644
index 00000000000..4901fb27d6b
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-homesubmenu/medias/image/websitekey/article.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/medias/image/websitekey/bg.png b/htdocs/install/doctemplates/websites/website_template-homesubmenu/medias/image/websitekey/bg.png
new file mode 100644
index 00000000000..33393041017
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-homesubmenu/medias/image/websitekey/bg.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/medias/image/websitekey/happy-man.png b/htdocs/install/doctemplates/websites/website_template-homesubmenu/medias/image/websitekey/happy-man.png
new file mode 100644
index 00000000000..af36357a957
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-homesubmenu/medias/image/websitekey/happy-man.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-homesubmenu/website_pages.sql b/htdocs/install/doctemplates/websites/website_template-homesubmenu/website_pages.sql
new file mode 100644
index 00000000000..bbcf00e3849
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-homesubmenu/website_pages.sql
@@ -0,0 +1,9 @@
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-10-09 10:36:48 UTC --;
+-- Page ID 202 -> 1__+MAX_llx_website_page__ - Aliases index --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(1__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'index', '', 'Home page', '', '', '', '', '1', '2022-07-27 00:42:00', '2022-10-09 12:36:07', null, '', 'page', '
', '__N__email;__N__ $message = GETPOST(\'message\', \'alpha\');__N__ $cmail = new CMailFile(\'Contact from website\', $to, $from, $message);__N__ if ($cmail->sendfile()) {__N__ ?>__N__ __N__ trans(\"ErrorFailedToSendMail\", $from, $to).\'. \'.$cmail->error;__N__ }__N__}__N__?>__N____N__ __N__ Company __N__ __N__ __N__ __N__ __N__ __N__ __N__ Description __N__ __N__ __N__ Team__N__ __N__ __N__ Contact __N__ __N__ __N__ __N__ Useful links__N__ __N__ __N__ __N__ __N__ __N__ __N__ __N__ __N__ __N__ __N__ __N__ __N__ __N__
__N__
Get Productive __N__
__N__ Lorem ipsum dolor, sit amet consectetur adipisicing__N__ elit. Ab fuga nobis omnis alias, aliquid iste cumque__N__ tempora nam reprehenderit quia itaque debitis,__N__ nostrum labore rerum reiciendis laboriosam unde,__N__ tempore corporis.__N__
__N__
__N__
__N__
__N__ Learn More __N__ __N__
__N__ __N__ __N__ __N__ __N__
__N__
__N__
__N__ LOREM IPSUM DOLOR SIT AMET EZAJB__N__ __N__
__N__
__N__
__N__
Our Company __N__
__N__ Lorem ipsum dolor, sit amet consectetur adipisicing__N__ elit. Ab fuga nobis omnis alias, aliquid iste cumque__N__ tempora nam reprehenderit quia itaque debitis,__N__ nostrum labore rerum reiciendis laboriosam unde,__N__ tempore corporis.__N__
__N__
__N__
__N__
__N__ __N__ __N__ __N__
__N__
__N__
Founders __N__
__N__ __N__ Author One __N__ __N__ __N__ Author Two __N__ __N__ __N__ Author Three __N__ __N__ __N__ Author Four __N__ __N__ __N__
__N__
__N__
About __N__
__N__ Lorem ipsum dolor sit amet consectetur adipisicing elit. Veritatis accusantium earum sed odit velit laudantium ex libero quisquam consectetur, __N__ dolorem vero ipsam perferendis quibusdam itaque omnis a consequatur error repellat.__N__
__N__
__N__
__N__ __N__
__N__ __N____N__', '', 0);
+UPDATE llx_website SET fk_default_home = 1__+MAX_llx_website_page__ WHERE rowid = __WEBSITE_ID__;
+
+-- For Dolibarr v14+ --;
+UPDATE llx_website SET lang = 'en' WHERE rowid = __WEBSITE_ID__;
+UPDATE llx_website SET otherlang = '' WHERE rowid = __WEBSITE_ID__;
+
diff --git a/htdocs/install/doctemplates/websites/website_template-style01.jpg b/htdocs/install/doctemplates/websites/website_template-noimg.jpg
similarity index 100%
rename from htdocs/install/doctemplates/websites/website_template-style01.jpg
rename to htdocs/install/doctemplates/websites/website_template-noimg.jpg
diff --git a/htdocs/install/doctemplates/websites/website_template-noimg/LICENSE b/htdocs/install/doctemplates/websites/website_template-noimg/LICENSE
new file mode 100644
index 00000000000..871ef743662
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-noimg/LICENSE
@@ -0,0 +1,4 @@
+LICENSE
+-------
+
+CC-BY-SA - https://creativecommons.org/licenses/by/4.0/
diff --git a/htdocs/install/doctemplates/websites/website_template-noimg/README.md b/htdocs/install/doctemplates/websites/website_template-noimg/README.md
new file mode 100644
index 00000000000..3a656b8ddaf
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-noimg/README.md
@@ -0,0 +1 @@
+Website generated by Dolibarr ERP CRM
diff --git a/htdocs/install/doctemplates/websites/website_template-noimg/containers/.dolibarr b/htdocs/install/doctemplates/websites/website_template-noimg/containers/.dolibarr
new file mode 100644
index 00000000000..0ef9997b4ab
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-noimg/containers/.dolibarr
@@ -0,0 +1,2 @@
+# Some properties for Dolibarr web site CMS
+param=value
diff --git a/htdocs/install/doctemplates/websites/website_template-noimg/containers/.htaccess b/htdocs/install/doctemplates/websites/website_template-noimg/containers/.htaccess
new file mode 100644
index 00000000000..ed27b33461f
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-noimg/containers/.htaccess
@@ -0,0 +1,2 @@
+# Order allow,deny
+# Deny from all
diff --git a/htdocs/install/doctemplates/websites/website_template-noimg/containers/README.md b/htdocs/install/doctemplates/websites/website_template-noimg/containers/README.md
new file mode 100644
index 00000000000..3a656b8ddaf
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-noimg/containers/README.md
@@ -0,0 +1 @@
+Website generated by Dolibarr ERP CRM
diff --git a/htdocs/install/doctemplates/websites/website_template-noimg/containers/htmlheader.html b/htdocs/install/doctemplates/websites/website_template-noimg/containers/htmlheader.html
new file mode 100644
index 00000000000..a58ea695524
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-noimg/containers/htmlheader.html
@@ -0,0 +1,6 @@
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-noimg/containers/index.php b/htdocs/install/doctemplates/websites/website_template-noimg/containers/index.php
new file mode 100644
index 00000000000..64331a0ec08
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-noimg/containers/index.php
@@ -0,0 +1,4 @@
+ref.'/page80.tpl.php';
diff --git a/htdocs/install/doctemplates/websites/website_template-noimg/containers/javascript.js.php b/htdocs/install/doctemplates/websites/website_template-noimg/containers/javascript.js.php
new file mode 100644
index 00000000000..f58102cf00b
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-noimg/containers/javascript.js.php
@@ -0,0 +1,13 @@
+
+/* JS content (all pages) */
+
diff --git a/htdocs/install/doctemplates/websites/website_template-noimg/containers/manifest.json.php b/htdocs/install/doctemplates/websites/website_template-noimg/containers/manifest.json.php
new file mode 100644
index 00000000000..b61531d6c11
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-noimg/containers/manifest.json.php
@@ -0,0 +1,13 @@
+
+
+
+
+
+
index
+
+
+
+
+
+
+
+
+
+use_manifest) { print '
'."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Template
+
+
+
+
+
+email;
+ $message = GETPOST('message', 'alpha');
+ $cmail = new CMailFile('Contact from website', $to, $from, $message);
+ if ($cmail->sendfile()) {
+ ?>
+
+ trans("ErrorFailedToSendMail", $from, $to).'. '.$cmail->error;
+ }
+}
+?>
+
+
+
+
+
+
+
+
+ Brand
+ Name
+
+
+ Hello fellows, here is a description of the
+ brand
+
+
+
+ Learn More
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Product 1
+
+ Some quick example text to build on the
+ card title and make up the bulk of the
+ card's content.
+
+
+
+ Learn More
+
+
+
+
+
+
+
+
+
+
Product 2
+
+ Some quick example text to build on the
+ card title and make up the bulk of the
+ card's content.
+
+
+
+ Learn More
+
+
+
+
+
+
+
+
+
+
Product 3
+
+ Some quick example text to build on the
+ card title and make up the bulk of the
+ card's content.
+
+
+
+ Learn More
+
+
+
+
+
+
+
+
+
+
Product 4
+
+ Some quick example text to build on the
+ card title and make up the bulk of the
+ card's content.
+
+
+
+ Learn More
+
+
+
+
+
+
+
+
+
+
Product 5
+
+ Some quick example text to build on the
+ card title and make up the bulk of the
+ card's content.
+
+
+
+ Learn More
+
+
+
+
+
+
+
+
+
+
Product 6
+
+ Some quick example text to build on the
+ card title and make up the bulk of the
+ card's content.
+
+
+
+ Learn More
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-noimg/containers/robots.txt b/htdocs/install/doctemplates/websites/website_template-noimg/containers/robots.txt
new file mode 100644
index 00000000000..2b844f479d6
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-noimg/containers/robots.txt
@@ -0,0 +1,4 @@
+# Robot file. Generated with Dolibarr
+User-agent: *
+Allow: /public/
+Disallow: /administrator/
diff --git a/htdocs/install/doctemplates/websites/website_template-noimg/containers/styles.css.php b/htdocs/install/doctemplates/websites/website_template-noimg/containers/styles.css.php
new file mode 100644
index 00000000000..92936be1175
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-noimg/containers/styles.css.php
@@ -0,0 +1,12528 @@
+
+@charset "UTF-8";
+
+.bodywebsite {
+ /*!
+ * Bootstrap v5.2.1 (https://getbootstrap.com/)
+ * Copyright 2011-2022 The Bootstrap Authors
+ * Copyright 2011-2022 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */
+ /* rtl:raw:
+[type="tel"],
+[type="url"],
+[type="email"],
+[type="number"] {
+ direction: ltr;
+}
+*/
+ /* rtl:begin:ignore */
+ /* rtl:end:ignore */
+ /* rtl:begin:ignore */
+ /* rtl:end:ignore */
+ /* rtl:begin:ignore */
+ /* rtl:end:ignore */
+ /* rtl:begin:ignore */
+ /* rtl:end:ignore */
+ /* rtl:begin:ignore */
+ /* rtl:end:ignore */
+ /* rtl:options: {
+ "autoRename": true,
+ "stringMap":[ {
+ "name" : "prev-next",
+ "search" : "prev",
+ "replace" : "next"
+ } ]
+} */
+ /* rtl:begin:remove */
+ /* rtl:end:remove */
+ /*# sourceMappingURL=bootstrap.css.map */;
+}
+
+.bodywebsite :root {
+ --bs-blue: #0d6efd;
+ --bs-indigo: #6610f2;
+ --bs-purple: #6f42c1;
+ --bs-pink: #d63384;
+ --bs-red: #dc3545;
+ --bs-orange: #fd7e14;
+ --bs-yellow: #ffc107;
+ --bs-green: #198754;
+ --bs-teal: #20c997;
+ --bs-cyan: #0dcaf0;
+ --bs-black: #000;
+ --bs-white: #fff;
+ --bs-gray: #6c757d;
+ --bs-gray-dark: #343a40;
+ --bs-gray-100: #f8f9fa;
+ --bs-gray-200: #e9ecef;
+ --bs-gray-300: #dee2e6;
+ --bs-gray-400: #ced4da;
+ --bs-gray-500: #adb5bd;
+ --bs-gray-600: #6c757d;
+ --bs-gray-700: #495057;
+ --bs-gray-800: #343a40;
+ --bs-gray-900: #212529;
+ --bs-primary: #0d6efd;
+ --bs-secondary: #6c757d;
+ --bs-success: #198754;
+ --bs-info: #0dcaf0;
+ --bs-warning: #ffc107;
+ --bs-danger: #dc3545;
+ --bs-light: #f8f9fa;
+ --bs-dark: #212529;
+ --bs-primary-rgb: 13, 110, 253;
+ --bs-secondary-rgb: 108, 117, 125;
+ --bs-success-rgb: 25, 135, 84;
+ --bs-info-rgb: 13, 202, 240;
+ --bs-warning-rgb: 255, 193, 7;
+ --bs-danger-rgb: 220, 53, 69;
+ --bs-light-rgb: 248, 249, 250;
+ --bs-dark-rgb: 33, 37, 41;
+ --bs-white-rgb: 255, 255, 255;
+ --bs-black-rgb: 0, 0, 0;
+ --bs-body-color-rgb: 33, 37, 41;
+ --bs-body-bg-rgb: 255, 255, 255;
+ --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
+ --bs-body-font-family: var(--bs-font-sans-serif);
+ --bs-body-font-size: 1rem;
+ --bs-body-font-weight: 400;
+ --bs-body-line-height: 1.5;
+ --bs-body-color: #212529;
+ --bs-body-bg: #fff;
+ --bs-border-width: 1px;
+ --bs-border-style: solid;
+ --bs-border-color: #dee2e6;
+ --bs-border-color-translucent: rgba(0, 0, 0, 0.175);
+ --bs-border-radius: 0.375rem;
+ --bs-border-radius-sm: 0.25rem;
+ --bs-border-radius-lg: 0.5rem;
+ --bs-border-radius-xl: 1rem;
+ --bs-border-radius-2xl: 2rem;
+ --bs-border-radius-pill: 50rem;
+ --bs-link-color: #0d6efd;
+ --bs-link-hover-color: #0a58ca;
+ --bs-code-color: #d63384;
+ --bs-highlight-bg: #fff3cd;
+}
+
+.bodywebsite *,
+ .bodywebsite *::before,
+ .bodywebsite *::after {
+ box-sizing: border-box;
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ .bodywebsite :root {
+ scroll-behavior: smooth;
+ }
+}
+
+.bodywebsite body {
+ margin: 0;
+ font-family: var(--bs-body-font-family);
+ font-size: var(--bs-body-font-size);
+ font-weight: var(--bs-body-font-weight);
+ line-height: var(--bs-body-line-height);
+ color: var(--bs-body-color);
+ text-align: var(--bs-body-text-align);
+ background-color: var(--bs-body-bg);
+ -webkit-text-size-adjust: 100%;
+ -webkit-tap-highlight-color: transparent;
+}
+
+.bodywebsite hr {
+ margin: 1rem 0;
+ color: inherit;
+ border: 0;
+ border-top: 1px solid;
+ opacity: 0.25;
+}
+
+.bodywebsite h6, .bodywebsite .h6, .bodywebsite h5, .bodywebsite .h5, .bodywebsite h4, .bodywebsite .h4, .bodywebsite h3, .bodywebsite .h3, .bodywebsite h2, .bodywebsite .h2, .bodywebsite h1, .bodywebsite .h1 {
+ margin-top: 0;
+ margin-bottom: 0.5rem;
+ font-weight: 500;
+ line-height: 1.2;
+}
+
+.bodywebsite .text-dark{
+ color: black;
+}
+
+.bodywebsite h1, .bodywebsite .h1 {
+ font-size: calc(1.375rem + 1.5vw);
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite h1, .bodywebsite .h1 {
+ font-size: 2.5rem;
+ }
+}
+
+.bodywebsite h2, .bodywebsite .h2 {
+ font-size: calc(1.325rem + 0.9vw);
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite h2, .bodywebsite .h2 {
+ font-size: 2rem;
+ }
+}
+
+.bodywebsite h3, .bodywebsite .h3 {
+ font-size: calc(1.3rem + 0.6vw);
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite h3, .bodywebsite .h3 {
+ font-size: 1.75rem;
+ }
+}
+
+.bodywebsite h4, .bodywebsite .h4 {
+ font-size: calc(1.275rem + 0.3vw);
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite h4, .bodywebsite .h4 {
+ font-size: 1.5rem;
+ }
+}
+
+.bodywebsite h5, .bodywebsite .h5 {
+ font-size: 1.25rem;
+}
+
+.bodywebsite h6, .bodywebsite .h6 {
+ font-size: 1rem;
+}
+
+.bodywebsite p {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+.bodywebsite abbr[title] {
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+ cursor: help;
+ -webkit-text-decoration-skip-ink: none;
+ text-decoration-skip-ink: none;
+}
+
+.bodywebsite address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit;
+}
+
+.bodywebsite ol,
+ .bodywebsite ul {
+ padding-left: 2rem;
+}
+
+.bodywebsite ol,
+ .bodywebsite ul,
+ .bodywebsite dl {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+.bodywebsite ol ol,
+ .bodywebsite ul ul,
+ .bodywebsite ol ul,
+ .bodywebsite ul ol {
+ margin-bottom: 0;
+}
+
+.bodywebsite dt {
+ font-weight: 700;
+}
+
+.bodywebsite dd {
+ margin-bottom: 0.5rem;
+ margin-left: 0;
+}
+
+.bodywebsite blockquote {
+ margin: 0 0 1rem;
+}
+
+.bodywebsite b,
+ .bodywebsite strong {
+ font-weight: bolder;
+}
+
+.bodywebsite small, .bodywebsite .small {
+ font-size: 0.875em;
+}
+
+.bodywebsite mark, .bodywebsite .mark {
+ padding: 0.1875em;
+ background-color: var(--bs-highlight-bg);
+}
+
+.bodywebsite sub,
+ .bodywebsite sup {
+ position: relative;
+ font-size: 0.75em;
+ line-height: 0;
+ vertical-align: baseline;
+}
+
+.bodywebsite sub {
+ bottom: -0.25em;
+}
+
+.bodywebsite sup {
+ top: -0.5em;
+}
+
+.bodywebsite a {
+ color: var(--bs-link-color);
+ text-decoration: underline;
+}
+
+.bodywebsite a:hover {
+ color: var(--bs-link-hover-color);
+}
+
+.bodywebsite a:not([href]):not([class]), .bodywebsite a:not([href]):not([class]):hover {
+ color: inherit;
+ text-decoration: none;
+}
+
+.bodywebsite pre,
+ .bodywebsite code,
+ .bodywebsite kbd,
+ .bodywebsite samp {
+ font-family: var(--bs-font-monospace);
+ font-size: 1em;
+}
+
+.bodywebsite pre {
+ display: block;
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
+ font-size: 0.875em;
+}
+
+.bodywebsite pre code {
+ font-size: inherit;
+ color: inherit;
+ word-break: normal;
+}
+
+.bodywebsite code {
+ font-size: 0.875em;
+ color: var(--bs-code-color);
+ word-wrap: break-word;
+}
+
+.bodywebsite a > code {
+ color: inherit;
+}
+
+.bodywebsite kbd {
+ padding: 0.1875rem 0.375rem;
+ font-size: 0.875em;
+ color: var(--bs-body-bg);
+ background-color: var(--bs-body-color);
+ border-radius: 0.25rem;
+}
+
+.bodywebsite kbd kbd {
+ padding: 0;
+ font-size: 1em;
+}
+
+.bodywebsite figure {
+ margin: 0 0 1rem;
+}
+
+.bodywebsite img,
+ .bodywebsite svg {
+ vertical-align: middle;
+}
+
+.bodywebsite table {
+ caption-side: bottom;
+ border-collapse: collapse;
+}
+
+.bodywebsite caption {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ color: #6c757d;
+ text-align: left;
+}
+
+.bodywebsite th {
+ text-align: inherit;
+ text-align: -webkit-match-parent;
+}
+
+.bodywebsite thead,
+ .bodywebsite tbody,
+ .bodywebsite tfoot,
+ .bodywebsite tr,
+ .bodywebsite td,
+ .bodywebsite th {
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+}
+
+.bodywebsite label {
+ display: inline-block;
+}
+
+.bodywebsite button {
+ border-radius: 0;
+}
+
+.bodywebsite button:focus:not(:focus-visible) {
+ outline: 0;
+}
+
+.bodywebsite input,
+ .bodywebsite button,
+ .bodywebsite select,
+ .bodywebsite optgroup,
+ .bodywebsite textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+.bodywebsite button,
+ .bodywebsite select {
+ text-transform: none;
+}
+
+.bodywebsite [role=button] {
+ cursor: pointer;
+}
+
+.bodywebsite select {
+ word-wrap: normal;
+}
+
+.bodywebsite select:disabled {
+ opacity: 1;
+}
+
+.bodywebsite [list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
+ display: none !important;
+}
+
+.bodywebsite button,
+ .bodywebsite [type=button],
+ .bodywebsite [type=reset],
+ .bodywebsite [type=submit] {
+ -webkit-appearance: button;
+}
+
+.bodywebsite button:not(:disabled),
+ .bodywebsite [type=button]:not(:disabled),
+ .bodywebsite [type=reset]:not(:disabled),
+ .bodywebsite [type=submit]:not(:disabled) {
+ cursor: pointer;
+}
+
+.bodywebsite ::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
+}
+
+.bodywebsite textarea {
+ resize: vertical;
+}
+
+.bodywebsite fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+.bodywebsite legend {
+ float: left;
+ width: 100%;
+ padding: 0;
+ margin-bottom: 0.5rem;
+ font-size: calc(1.275rem + 0.3vw);
+ line-height: inherit;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite legend {
+ font-size: 1.5rem;
+ }
+}
+
+.bodywebsite legend + * {
+ clear: left;
+}
+
+.bodywebsite ::-webkit-datetime-edit-fields-wrapper,
+ .bodywebsite ::-webkit-datetime-edit-text,
+ .bodywebsite ::-webkit-datetime-edit-minute,
+ .bodywebsite ::-webkit-datetime-edit-hour-field,
+ .bodywebsite ::-webkit-datetime-edit-day-field,
+ .bodywebsite ::-webkit-datetime-edit-month-field,
+ .bodywebsite ::-webkit-datetime-edit-year-field {
+ padding: 0;
+}
+
+.bodywebsite ::-webkit-inner-spin-button {
+ height: auto;
+}
+
+.bodywebsite [type=search] {
+ outline-offset: -2px;
+ -webkit-appearance: textfield;
+}
+
+.bodywebsite ::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+.bodywebsite ::-webkit-color-swatch-wrapper {
+ padding: 0;
+}
+
+.bodywebsite ::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+
+.bodywebsite ::file-selector-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+
+.bodywebsite output {
+ display: inline-block;
+}
+
+.bodywebsite iframe {
+ border: 0;
+}
+
+.bodywebsite summary {
+ display: list-item;
+ cursor: pointer;
+}
+
+.bodywebsite progress {
+ vertical-align: baseline;
+}
+
+.bodywebsite [hidden] {
+ display: none !important;
+}
+
+.bodywebsite .lead {
+ font-size: 1.25rem;
+ font-weight: 300;
+}
+
+.bodywebsite .display-1 {
+ font-size: calc(1.625rem + 4.5vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-1 {
+ font-size: 5rem;
+ }
+}
+
+.bodywebsite .display-2 {
+ font-size: calc(1.575rem + 3.9vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-2 {
+ font-size: 4.5rem;
+ }
+}
+
+.bodywebsite .display-3 {
+ font-size: calc(1.525rem + 3.3vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-3 {
+ font-size: 4rem;
+ }
+}
+
+.bodywebsite .display-4 {
+ font-size: calc(1.475rem + 2.7vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-4 {
+ font-size: 3.5rem;
+ }
+}
+
+.bodywebsite .display-5 {
+ font-size: calc(1.425rem + 2.1vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-5 {
+ font-size: 3rem;
+ }
+}
+
+.bodywebsite .display-6 {
+ font-size: calc(1.375rem + 1.5vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-6 {
+ font-size: 2.5rem;
+ }
+}
+
+.bodywebsite .list-unstyled {
+ padding-left: 0;
+ list-style: none;
+}
+
+.bodywebsite .list-inline {
+ padding-left: 0;
+ list-style: none;
+}
+
+.bodywebsite .list-inline-item {
+ display: inline-block;
+}
+
+.bodywebsite .list-inline-item:not(:last-child) {
+ margin-right: 0.5rem;
+}
+
+.bodywebsite .initialism {
+ font-size: 0.875em;
+ text-transform: uppercase;
+}
+
+.bodywebsite .blockquote {
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+}
+
+.bodywebsite .blockquote > :last-child {
+ margin-bottom: 0;
+}
+
+.bodywebsite .blockquote-footer {
+ margin-top: -1rem;
+ margin-bottom: 1rem;
+ font-size: 0.875em;
+ color: #6c757d;
+}
+
+.bodywebsite .blockquote-footer::before {
+ content: "— ";
+}
+
+.bodywebsite .img-fluid {
+ max-width: 100%;
+ height: auto;
+}
+
+.bodywebsite .img-thumbnail {
+ padding: 0.25rem;
+ background-color: #fff;
+ border: 1px solid var(--bs-border-color);
+ border-radius: 0.375rem;
+ max-width: 100%;
+ height: auto;
+}
+
+.bodywebsite .figure {
+ display: inline-block;
+}
+
+.bodywebsite .figure-img {
+ margin-bottom: 0.5rem;
+ line-height: 1;
+}
+
+.bodywebsite .figure-caption {
+ font-size: 0.875em;
+ color: #6c757d;
+}
+
+.bodywebsite .container,
+ .bodywebsite .container-fluid,
+ .bodywebsite .container-xxl,
+ .bodywebsite .container-xl,
+ .bodywebsite .container-lg,
+ .bodywebsite .container-md,
+ .bodywebsite .container-sm {
+ --bs-gutter-x: 1.5rem;
+ --bs-gutter-y: 0;
+ width: 100%;
+ padding-right: calc(var(--bs-gutter-x) * 0.5);
+ padding-left: calc(var(--bs-gutter-x) * 0.5);
+ margin-right: auto;
+ margin-left: auto;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 540px;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .container-md, .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 720px;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .container-lg, .bodywebsite .container-md, .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 960px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .container-xl, .bodywebsite .container-lg, .bodywebsite .container-md, .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 1140px;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .container-xxl, .bodywebsite .container-xl, .bodywebsite .container-lg, .bodywebsite .container-md, .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 1320px;
+ }
+}
+
+.bodywebsite .row {
+ --bs-gutter-x: 1.5rem;
+ --bs-gutter-y: 0;
+ display: flex;
+ flex-wrap: wrap;
+ margin-top: calc(-1 * var(--bs-gutter-y));
+ margin-right: calc(-0.5 * var(--bs-gutter-x));
+ margin-left: calc(-0.5 * var(--bs-gutter-x));
+}
+
+.bodywebsite .row > * {
+ flex-shrink: 0;
+ width: 100%;
+ max-width: 100%;
+ padding-right: calc(var(--bs-gutter-x) * 0.5);
+ padding-left: calc(var(--bs-gutter-x) * 0.5);
+ margin-top: var(--bs-gutter-y);
+}
+
+.bodywebsite .col {
+ flex: 1 0 0%;
+}
+
+.bodywebsite .row-cols-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+}
+
+.bodywebsite .row-cols-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+}
+
+.bodywebsite .row-cols-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+}
+
+.bodywebsite .row-cols-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+}
+
+.bodywebsite .row-cols-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+}
+
+.bodywebsite .row-cols-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+}
+
+.bodywebsite .row-cols-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+}
+
+.bodywebsite .col-auto {
+ flex: 0 0 auto;
+ width: auto;
+}
+
+.bodywebsite .col-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+}
+
+.bodywebsite .col-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+}
+
+.bodywebsite .col-3 {
+ flex: 0 0 auto;
+ width: 25%;
+}
+
+.bodywebsite .col-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+}
+
+.bodywebsite .col-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+}
+
+.bodywebsite .col-6 {
+ flex: 0 0 auto;
+ width: 50%;
+}
+
+.bodywebsite .col-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+}
+
+.bodywebsite .col-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+}
+
+.bodywebsite .col-9 {
+ flex: 0 0 auto;
+ width: 75%;
+}
+
+.bodywebsite .col-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+}
+
+.bodywebsite .col-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+}
+
+.bodywebsite .col-12 {
+ flex: 0 0 auto;
+ width: 100%;
+}
+
+.bodywebsite .offset-1 {
+ margin-left: 8.33333333%;
+}
+
+.bodywebsite .offset-2 {
+ margin-left: 16.66666667%;
+}
+
+.bodywebsite .offset-3 {
+ margin-left: 25%;
+}
+
+.bodywebsite .offset-4 {
+ margin-left: 33.33333333%;
+}
+
+.bodywebsite .offset-5 {
+ margin-left: 41.66666667%;
+}
+
+.bodywebsite .offset-6 {
+ margin-left: 50%;
+}
+
+.bodywebsite .offset-7 {
+ margin-left: 58.33333333%;
+}
+
+.bodywebsite .offset-8 {
+ margin-left: 66.66666667%;
+}
+
+.bodywebsite .offset-9 {
+ margin-left: 75%;
+}
+
+.bodywebsite .offset-10 {
+ margin-left: 83.33333333%;
+}
+
+.bodywebsite .offset-11 {
+ margin-left: 91.66666667%;
+}
+
+.bodywebsite .g-0,
+ .bodywebsite .gx-0 {
+ --bs-gutter-x: 0;
+}
+
+.bodywebsite .g-0,
+ .bodywebsite .gy-0 {
+ --bs-gutter-y: 0;
+}
+
+.bodywebsite .g-1,
+ .bodywebsite .gx-1 {
+ --bs-gutter-x: 0.25rem;
+}
+
+.bodywebsite .g-1,
+ .bodywebsite .gy-1 {
+ --bs-gutter-y: 0.25rem;
+}
+
+.bodywebsite .g-2,
+ .bodywebsite .gx-2 {
+ --bs-gutter-x: 0.5rem;
+}
+
+.bodywebsite .g-2,
+ .bodywebsite .gy-2 {
+ --bs-gutter-y: 0.5rem;
+}
+
+.bodywebsite .g-3,
+ .bodywebsite .gx-3 {
+ --bs-gutter-x: 1rem;
+}
+
+.bodywebsite .g-3,
+ .bodywebsite .gy-3 {
+ --bs-gutter-y: 1rem;
+}
+
+.bodywebsite .g-4,
+ .bodywebsite .gx-4 {
+ --bs-gutter-x: 1.5rem;
+}
+
+.bodywebsite .g-4,
+ .bodywebsite .gy-4 {
+ --bs-gutter-y: 1.5rem;
+}
+
+.bodywebsite .g-5,
+ .bodywebsite .gx-5 {
+ --bs-gutter-x: 3rem;
+}
+
+.bodywebsite .g-5,
+ .bodywebsite .gy-5 {
+ --bs-gutter-y: 3rem;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .col-sm {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-sm-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-sm-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-sm-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-sm-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-sm-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-sm-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-sm-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-sm-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-sm-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-sm-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-sm-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-sm-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-sm-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-sm-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-sm-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-sm-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-sm-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-sm-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-sm-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-sm-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-sm-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-sm-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-sm-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-sm-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-sm-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-sm-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-sm-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-sm-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-sm-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-sm-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-sm-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-sm-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-sm-0,
+ .bodywebsite .gx-sm-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-sm-0,
+ .bodywebsite .gy-sm-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-sm-1,
+ .bodywebsite .gx-sm-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-sm-1,
+ .bodywebsite .gy-sm-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-sm-2,
+ .bodywebsite .gx-sm-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-sm-2,
+ .bodywebsite .gy-sm-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-sm-3,
+ .bodywebsite .gx-sm-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-sm-3,
+ .bodywebsite .gy-sm-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-sm-4,
+ .bodywebsite .gx-sm-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-sm-4,
+ .bodywebsite .gy-sm-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-sm-5,
+ .bodywebsite .gx-sm-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-sm-5,
+ .bodywebsite .gy-sm-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .col-md {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-md-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-md-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-md-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-md-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-md-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-md-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-md-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-md-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-md-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-md-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-md-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-md-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-md-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-md-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-md-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-md-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-md-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-md-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-md-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-md-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-md-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-md-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-md-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-md-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-md-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-md-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-md-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-md-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-md-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-md-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-md-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-md-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-md-0,
+ .bodywebsite .gx-md-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-md-0,
+ .bodywebsite .gy-md-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-md-1,
+ .bodywebsite .gx-md-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-md-1,
+ .bodywebsite .gy-md-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-md-2,
+ .bodywebsite .gx-md-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-md-2,
+ .bodywebsite .gy-md-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-md-3,
+ .bodywebsite .gx-md-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-md-3,
+ .bodywebsite .gy-md-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-md-4,
+ .bodywebsite .gx-md-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-md-4,
+ .bodywebsite .gy-md-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-md-5,
+ .bodywebsite .gx-md-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-md-5,
+ .bodywebsite .gy-md-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .col-lg {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-lg-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-lg-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-lg-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-lg-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-lg-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-lg-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-lg-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-lg-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-lg-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-lg-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-lg-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-lg-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-lg-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-lg-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-lg-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-lg-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-lg-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-lg-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-lg-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-lg-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-lg-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-lg-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-lg-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-lg-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-lg-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-lg-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-lg-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-lg-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-lg-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-lg-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-lg-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-lg-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-lg-0,
+ .bodywebsite .gx-lg-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-lg-0,
+ .bodywebsite .gy-lg-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-lg-1,
+ .bodywebsite .gx-lg-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-lg-1,
+ .bodywebsite .gy-lg-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-lg-2,
+ .bodywebsite .gx-lg-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-lg-2,
+ .bodywebsite .gy-lg-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-lg-3,
+ .bodywebsite .gx-lg-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-lg-3,
+ .bodywebsite .gy-lg-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-lg-4,
+ .bodywebsite .gx-lg-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-lg-4,
+ .bodywebsite .gy-lg-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-lg-5,
+ .bodywebsite .gx-lg-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-lg-5,
+ .bodywebsite .gy-lg-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .col-xl {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-xl-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-xl-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-xl-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-xl-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-xl-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-xl-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-xl-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-xl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-xl-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-xl-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-xl-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-xl-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-xl-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-xl-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-xl-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-xl-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-xl-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-xl-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-xl-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-xl-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-xl-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-xl-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-xl-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-xl-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-xl-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-xl-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-xl-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-xl-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-xl-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-xl-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-xl-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-xl-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-xl-0,
+ .bodywebsite .gx-xl-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-xl-0,
+ .bodywebsite .gy-xl-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-xl-1,
+ .bodywebsite .gx-xl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-xl-1,
+ .bodywebsite .gy-xl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-xl-2,
+ .bodywebsite .gx-xl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-xl-2,
+ .bodywebsite .gy-xl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-xl-3,
+ .bodywebsite .gx-xl-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-xl-3,
+ .bodywebsite .gy-xl-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-xl-4,
+ .bodywebsite .gx-xl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-xl-4,
+ .bodywebsite .gy-xl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-xl-5,
+ .bodywebsite .gx-xl-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-xl-5,
+ .bodywebsite .gy-xl-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .col-xxl {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-xxl-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-xxl-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-xxl-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-xxl-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-xxl-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-xxl-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-xxl-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-xxl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-xxl-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-xxl-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-xxl-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-xxl-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-xxl-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-xxl-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-xxl-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-xxl-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-xxl-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-xxl-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-xxl-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-xxl-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-xxl-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-xxl-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-xxl-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-xxl-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-xxl-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-xxl-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-xxl-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-xxl-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-xxl-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-xxl-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-xxl-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-xxl-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-xxl-0,
+ .bodywebsite .gx-xxl-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-xxl-0,
+ .bodywebsite .gy-xxl-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-xxl-1,
+ .bodywebsite .gx-xxl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-xxl-1,
+ .bodywebsite .gy-xxl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-xxl-2,
+ .bodywebsite .gx-xxl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-xxl-2,
+ .bodywebsite .gy-xxl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-xxl-3,
+ .bodywebsite .gx-xxl-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-xxl-3,
+ .bodywebsite .gy-xxl-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-xxl-4,
+ .bodywebsite .gx-xxl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-xxl-4,
+ .bodywebsite .gy-xxl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-xxl-5,
+ .bodywebsite .gx-xxl-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-xxl-5,
+ .bodywebsite .gy-xxl-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+.bodywebsite .table {
+ --bs-table-color: var(--bs-body-color);
+ --bs-table-bg: transparent;
+ --bs-table-border-color: var(--bs-border-color);
+ --bs-table-accent-bg: transparent;
+ --bs-table-striped-color: var(--bs-body-color);
+ --bs-table-striped-bg: rgba(0, 0, 0, 0.05);
+ --bs-table-active-color: var(--bs-body-color);
+ --bs-table-active-bg: rgba(0, 0, 0, 0.1);
+ --bs-table-hover-color: var(--bs-body-color);
+ --bs-table-hover-bg: rgba(0, 0, 0, 0.075);
+ width: 100%;
+ margin-bottom: 1rem;
+ color: var(--bs-table-color);
+ vertical-align: top;
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table > :not(caption) > * > * {
+ padding: 0.5rem 0.5rem;
+ background-color: var(--bs-table-bg);
+ border-bottom-width: 1px;
+ box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg);
+}
+
+.bodywebsite .table > tbody {
+ vertical-align: inherit;
+}
+
+.bodywebsite .table > thead {
+ vertical-align: bottom;
+}
+
+.bodywebsite .table-group-divider {
+ border-top: 2px solid currentcolor;
+}
+
+.bodywebsite .caption-top {
+ caption-side: top;
+}
+
+.bodywebsite .table-sm > :not(caption) > * > * {
+ padding: 0.25rem 0.25rem;
+}
+
+.bodywebsite .table-bordered > :not(caption) > * {
+ border-width: 1px 0;
+}
+
+.bodywebsite .table-bordered > :not(caption) > * > * {
+ border-width: 0 1px;
+}
+
+.bodywebsite .table-borderless > :not(caption) > * > * {
+ border-bottom-width: 0;
+}
+
+.bodywebsite .table-borderless > :not(:first-child) {
+ border-top-width: 0;
+}
+
+.bodywebsite .table-striped > tbody > tr:nth-of-type(odd) > * {
+ --bs-table-accent-bg: var(--bs-table-striped-bg);
+ color: var(--bs-table-striped-color);
+}
+
+.bodywebsite .table-striped-columns > :not(caption) > tr > :nth-child(even) {
+ --bs-table-accent-bg: var(--bs-table-striped-bg);
+ color: var(--bs-table-striped-color);
+}
+
+.bodywebsite .table-active {
+ --bs-table-accent-bg: var(--bs-table-active-bg);
+ color: var(--bs-table-active-color);
+}
+
+.bodywebsite .table-hover > tbody > tr:hover > * {
+ --bs-table-accent-bg: var(--bs-table-hover-bg);
+ color: var(--bs-table-hover-color);
+}
+
+.bodywebsite .table-primary {
+ --bs-table-color: #000;
+ --bs-table-bg: #cfe2ff;
+ --bs-table-border-color: #bacbe6;
+ --bs-table-striped-bg: #c5d7f2;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #bacbe6;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #bfd1ec;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-secondary {
+ --bs-table-color: #000;
+ --bs-table-bg: #e2e3e5;
+ --bs-table-border-color: #cbccce;
+ --bs-table-striped-bg: #d7d8da;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #cbccce;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #d1d2d4;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-success {
+ --bs-table-color: #000;
+ --bs-table-bg: #d1e7dd;
+ --bs-table-border-color: #bcd0c7;
+ --bs-table-striped-bg: #c7dbd2;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #bcd0c7;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #c1d6cc;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-info {
+ --bs-table-color: #000;
+ --bs-table-bg: #cff4fc;
+ --bs-table-border-color: #badce3;
+ --bs-table-striped-bg: #c5e8ef;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #badce3;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #bfe2e9;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-warning {
+ --bs-table-color: #000;
+ --bs-table-bg: #fff3cd;
+ --bs-table-border-color: #e6dbb9;
+ --bs-table-striped-bg: #f2e7c3;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #e6dbb9;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #ece1be;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-danger {
+ --bs-table-color: #000;
+ --bs-table-bg: #f8d7da;
+ --bs-table-border-color: #dfc2c4;
+ --bs-table-striped-bg: #eccccf;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #dfc2c4;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #e5c7ca;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-light {
+ --bs-table-color: #000;
+ --bs-table-bg: #f8f9fa;
+ --bs-table-border-color: #dfe0e1;
+ --bs-table-striped-bg: #ecedee;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #dfe0e1;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #e5e6e7;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-dark {
+ --bs-table-color: #fff;
+ --bs-table-bg: #212529;
+ --bs-table-border-color: #373b3e;
+ --bs-table-striped-bg: #2c3034;
+ --bs-table-striped-color: #fff;
+ --bs-table-active-bg: #373b3e;
+ --bs-table-active-color: #fff;
+ --bs-table-hover-bg: #323539;
+ --bs-table-hover-color: #fff;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-responsive {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .table-responsive-sm {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .table-responsive-md {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .table-responsive-lg {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .table-responsive-xl {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .table-responsive-xxl {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+.bodywebsite .form-label {
+ margin-bottom: 0.5rem;
+}
+
+.bodywebsite .col-form-label {
+ padding-top: calc(0.375rem + 1px);
+ padding-bottom: calc(0.375rem + 1px);
+ margin-bottom: 0;
+ font-size: inherit;
+ line-height: 1.5;
+}
+
+.bodywebsite .col-form-label-lg {
+ padding-top: calc(0.5rem + 1px);
+ padding-bottom: calc(0.5rem + 1px);
+ font-size: 1.25rem;
+}
+
+.bodywebsite .col-form-label-sm {
+ padding-top: calc(0.25rem + 1px);
+ padding-bottom: calc(0.25rem + 1px);
+ font-size: 0.875rem;
+}
+
+.bodywebsite .form-text {
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: #6c757d;
+}
+
+.bodywebsite .form-control {
+ display: block;
+ width: 100%;
+ padding: 0.375rem 0.75rem;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #212529;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid #ced4da;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ border-radius: 0.375rem;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-control {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-control[type=file] {
+ overflow: hidden;
+}
+
+.bodywebsite .form-control[type=file]:not(:disabled):not([readonly]) {
+ cursor: pointer;
+}
+
+.bodywebsite .form-control:focus {
+ color: #212529;
+ background-color: #fff;
+ border-color: #86b7fe;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-control::-webkit-date-and-time-value {
+ height: 1.5em;
+}
+
+.bodywebsite .form-control::-moz-placeholder {
+ color: #6c757d;
+ opacity: 1;
+}
+
+.bodywebsite .form-control::placeholder {
+ color: #6c757d;
+ opacity: 1;
+}
+
+.bodywebsite .form-control:disabled {
+ background-color: #e9ecef;
+ opacity: 1;
+}
+
+.bodywebsite .form-control::-webkit-file-upload-button {
+ padding: 0.375rem 0.75rem;
+ margin: -0.375rem -0.75rem;
+ -webkit-margin-end: 0.75rem;
+ margin-inline-end: 0.75rem;
+ color: #212529;
+ background-color: #e9ecef;
+ pointer-events: none;
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+ border-inline-end-width: 1px;
+ border-radius: 0;
+ -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+.bodywebsite .form-control::file-selector-button {
+ padding: 0.375rem 0.75rem;
+ margin: -0.375rem -0.75rem;
+ -webkit-margin-end: 0.75rem;
+ margin-inline-end: 0.75rem;
+ color: #212529;
+ background-color: #e9ecef;
+ pointer-events: none;
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+ border-inline-end-width: 1px;
+ border-radius: 0;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-control::-webkit-file-upload-button {
+ -webkit-transition: none;
+ transition: none;
+ }
+
+ .bodywebsite .form-control::file-selector-button {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {
+ background-color: #dde0e3;
+}
+
+.bodywebsite .form-control:hover:not(:disabled):not([readonly])::file-selector-button {
+ background-color: #dde0e3;
+}
+
+.bodywebsite .form-control-plaintext {
+ display: block;
+ width: 100%;
+ padding: 0.375rem 0;
+ margin-bottom: 0;
+ line-height: 1.5;
+ color: #212529;
+ background-color: transparent;
+ border: solid transparent;
+ border-width: 1px 0;
+}
+
+.bodywebsite .form-control-plaintext:focus {
+ outline: 0;
+}
+
+.bodywebsite .form-control-plaintext.form-control-sm, .bodywebsite .form-control-plaintext.form-control-lg {
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.bodywebsite .form-control-sm {
+ min-height: calc(1.5em + 0.5rem + 2px);
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.25rem;
+}
+
+.bodywebsite .form-control-sm::-webkit-file-upload-button {
+ padding: 0.25rem 0.5rem;
+ margin: -0.25rem -0.5rem;
+ -webkit-margin-end: 0.5rem;
+ margin-inline-end: 0.5rem;
+}
+
+.bodywebsite .form-control-sm::file-selector-button {
+ padding: 0.25rem 0.5rem;
+ margin: -0.25rem -0.5rem;
+ -webkit-margin-end: 0.5rem;
+ margin-inline-end: 0.5rem;
+}
+
+.bodywebsite .form-control-lg {
+ min-height: calc(1.5em + 1rem + 2px);
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ border-radius: 0.5rem;
+}
+
+.bodywebsite .form-control-lg::-webkit-file-upload-button {
+ padding: 0.5rem 1rem;
+ margin: -0.5rem -1rem;
+ -webkit-margin-end: 1rem;
+ margin-inline-end: 1rem;
+}
+
+.bodywebsite .form-control-lg::file-selector-button {
+ padding: 0.5rem 1rem;
+ margin: -0.5rem -1rem;
+ -webkit-margin-end: 1rem;
+ margin-inline-end: 1rem;
+}
+
+.bodywebsite textarea.form-control {
+ min-height: calc(1.5em + 0.75rem + 2px);
+}
+
+.bodywebsite textarea.form-control-sm {
+ min-height: calc(1.5em + 0.5rem + 2px);
+}
+
+.bodywebsite textarea.form-control-lg {
+ min-height: calc(1.5em + 1rem + 2px);
+}
+
+.bodywebsite .form-control-color {
+ width: 3rem;
+ height: calc(1.5em + 0.75rem + 2px);
+ padding: 0.375rem;
+}
+
+.bodywebsite .form-control-color:not(:disabled):not([readonly]) {
+ cursor: pointer;
+}
+
+.bodywebsite .form-control-color::-moz-color-swatch {
+ border: 0 !important;
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .form-control-color::-webkit-color-swatch {
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .form-control-color.form-control-sm {
+ height: calc(1.5em + 0.5rem + 2px);
+}
+
+.bodywebsite .form-control-color.form-control-lg {
+ height: calc(1.5em + 1rem + 2px);
+}
+
+.bodywebsite .form-select {
+ display: block;
+ width: 100%;
+ padding: 0.375rem 2.25rem 0.375rem 0.75rem;
+ -moz-padding-start: calc(0.75rem - 3px);
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #212529;
+ background-color: #fff;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: right 0.75rem center;
+ background-size: 16px 12px;
+ border: 1px solid #ced4da;
+ border-radius: 0.375rem;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-select {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-select:focus {
+ border-color: #86b7fe;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-select[multiple], .bodywebsite .form-select[size]:not([size="1"]) {
+ padding-right: 0.75rem;
+ background-image: none;
+}
+
+.bodywebsite .form-select:disabled {
+ background-color: #e9ecef;
+}
+
+.bodywebsite .form-select:-moz-focusring {
+ color: transparent;
+ text-shadow: 0 0 0 #212529;
+}
+
+.bodywebsite .form-select-sm {
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+ padding-left: 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.25rem;
+}
+
+.bodywebsite .form-select-lg {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ padding-left: 1rem;
+ font-size: 1.25rem;
+ border-radius: 0.5rem;
+}
+
+.bodywebsite .form-check {
+ display: block;
+ min-height: 1.5rem;
+ padding-left: 1.5em;
+ margin-bottom: 0.125rem;
+}
+
+.bodywebsite .form-check .form-check-input {
+ float: left;
+ margin-left: -1.5em;
+}
+
+.bodywebsite .form-check-reverse {
+ padding-right: 1.5em;
+ padding-left: 0;
+ text-align: right;
+}
+
+.bodywebsite .form-check-reverse .form-check-input {
+ float: right;
+ margin-right: -1.5em;
+ margin-left: 0;
+}
+
+.bodywebsite .form-check-input {
+ width: 1em;
+ height: 1em;
+ margin-top: 0.25em;
+ vertical-align: top;
+ background-color: #fff;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: contain;
+ border: 1px solid rgba(0, 0, 0, 0.25);
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ -webkit-print-color-adjust: exact;
+ color-adjust: exact;
+ print-color-adjust: exact;
+}
+
+.bodywebsite .form-check-input[type=checkbox] {
+ border-radius: 0.25em;
+}
+
+.bodywebsite .form-check-input[type=radio] {
+ border-radius: 50%;
+}
+
+.bodywebsite .form-check-input:active {
+ filter: brightness(90%);
+}
+
+.bodywebsite .form-check-input:focus {
+ border-color: #86b7fe;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-check-input:checked {
+ background-color: #0d6efd;
+ border-color: #0d6efd;
+}
+
+.bodywebsite .form-check-input:checked[type=checkbox] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-check-input:checked[type=radio] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-check-input[type=checkbox]:indeterminate {
+ background-color: #0d6efd;
+ border-color: #0d6efd;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-check-input:disabled {
+ pointer-events: none;
+ filter: none;
+ opacity: 0.5;
+}
+
+.bodywebsite .form-check-input[disabled] ~ .form-check-label, .bodywebsite .form-check-input:disabled ~ .form-check-label {
+ cursor: default;
+ opacity: 0.5;
+}
+
+.bodywebsite .form-switch {
+ padding-left: 2.5em;
+}
+
+.bodywebsite .form-switch .form-check-input {
+ width: 2em;
+ margin-left: -2.5em;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");
+ background-position: left center;
+ border-radius: 2em;
+ transition: background-position 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-switch .form-check-input {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-switch .form-check-input:focus {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-switch .form-check-input:checked {
+ background-position: right center;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-switch.form-check-reverse {
+ padding-right: 2.5em;
+ padding-left: 0;
+}
+
+.bodywebsite .form-switch.form-check-reverse .form-check-input {
+ margin-right: -2.5em;
+ margin-left: 0;
+}
+
+.bodywebsite .form-check-inline {
+ display: inline-block;
+ margin-right: 1rem;
+}
+
+.bodywebsite .btn-check {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none;
+}
+
+.bodywebsite .btn-check[disabled] + .btn, .bodywebsite .btn-check:disabled + .btn {
+ pointer-events: none;
+ filter: none;
+ opacity: 0.65;
+}
+
+.bodywebsite .form-range {
+ width: 100%;
+ height: 1.5rem;
+ padding: 0;
+ background-color: transparent;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+.bodywebsite .form-range:focus {
+ outline: 0;
+}
+
+.bodywebsite .form-range:focus::-webkit-slider-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-range:focus::-moz-range-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-range::-moz-focus-outer {
+ border: 0;
+}
+
+.bodywebsite .form-range::-webkit-slider-thumb {
+ width: 1rem;
+ height: 1rem;
+ margin-top: -0.25rem;
+ background-color: #0d6efd;
+ border: 0;
+ border-radius: 1rem;
+ -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -webkit-appearance: none;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-range::-webkit-slider-thumb {
+ -webkit-transition: none;
+ transition: none;
+ }
+}
+
+.bodywebsite .form-range::-webkit-slider-thumb:active {
+ background-color: #b6d4fe;
+}
+
+.bodywebsite .form-range::-webkit-slider-runnable-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #dee2e6;
+ border-color: transparent;
+ border-radius: 1rem;
+}
+
+.bodywebsite .form-range::-moz-range-thumb {
+ width: 1rem;
+ height: 1rem;
+ background-color: #0d6efd;
+ border: 0;
+ border-radius: 1rem;
+ -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-range::-moz-range-thumb {
+ -moz-transition: none;
+ transition: none;
+ }
+}
+
+.bodywebsite .form-range::-moz-range-thumb:active {
+ background-color: #b6d4fe;
+}
+
+.bodywebsite .form-range::-moz-range-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #dee2e6;
+ border-color: transparent;
+ border-radius: 1rem;
+}
+
+.bodywebsite .form-range:disabled {
+ pointer-events: none;
+}
+
+.bodywebsite .form-range:disabled::-webkit-slider-thumb {
+ background-color: #adb5bd;
+}
+
+.bodywebsite .form-range:disabled::-moz-range-thumb {
+ background-color: #adb5bd;
+}
+
+.bodywebsite .form-floating {
+ position: relative;
+}
+
+.bodywebsite .form-floating > .form-control,
+ .bodywebsite .form-floating > .form-control-plaintext,
+ .bodywebsite .form-floating > .form-select {
+ height: calc(3.5rem + 2px);
+ line-height: 1.25;
+}
+
+.bodywebsite .form-floating > label {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ padding: 1rem 0.75rem;
+ overflow: hidden;
+ text-align: start;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ pointer-events: none;
+ border: 1px solid transparent;
+ transform-origin: 0 0;
+ transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-floating > label {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-floating > .form-control,
+ .bodywebsite .form-floating > .form-control-plaintext {
+ padding: 1rem 0.75rem;
+}
+
+.bodywebsite .form-floating > .form-control::-moz-placeholder, .bodywebsite .form-floating > .form-control-plaintext::-moz-placeholder {
+ color: transparent;
+}
+
+.bodywebsite .form-floating > .form-control::placeholder,
+ .bodywebsite .form-floating > .form-control-plaintext::placeholder {
+ color: transparent;
+}
+
+.bodywebsite .form-floating > .form-control:not(:-moz-placeholder-shown), .bodywebsite .form-floating > .form-control-plaintext:not(:-moz-placeholder-shown) {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.bodywebsite .form-floating > .form-control:focus, .bodywebsite .form-floating > .form-control:not(:placeholder-shown),
+ .bodywebsite .form-floating > .form-control-plaintext:focus,
+ .bodywebsite .form-floating > .form-control-plaintext:not(:placeholder-shown) {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.bodywebsite .form-floating > .form-control:-webkit-autofill,
+ .bodywebsite .form-floating > .form-control-plaintext:-webkit-autofill {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.bodywebsite .form-floating > .form-select {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.bodywebsite .form-floating > .form-control:not(:-moz-placeholder-shown) ~ label {
+ opacity: 0.65;
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
+}
+
+.bodywebsite .form-floating > .form-control:focus ~ label,
+ .bodywebsite .form-floating > .form-control:not(:placeholder-shown) ~ label,
+ .bodywebsite .form-floating > .form-control-plaintext ~ label,
+ .bodywebsite .form-floating > .form-select ~ label {
+ opacity: 0.65;
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
+}
+
+.bodywebsite .form-floating > .form-control:-webkit-autofill ~ label {
+ opacity: 0.65;
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
+}
+
+.bodywebsite .form-floating > .form-control-plaintext ~ label {
+ border-width: 1px 0;
+}
+
+.bodywebsite .input-group {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: stretch;
+ width: 100%;
+}
+
+.bodywebsite .input-group > .form-control,
+ .bodywebsite .input-group > .form-select,
+ .bodywebsite .input-group > .form-floating {
+ position: relative;
+ flex: 1 1 auto;
+ width: 1%;
+ min-width: 0;
+}
+
+.bodywebsite .input-group > .form-control:focus,
+ .bodywebsite .input-group > .form-select:focus,
+ .bodywebsite .input-group > .form-floating:focus-within {
+ z-index: 5;
+}
+
+.bodywebsite .input-group .btn {
+ position: relative;
+ z-index: 2;
+}
+
+.bodywebsite .input-group .btn:focus {
+ z-index: 5;
+}
+
+.bodywebsite .input-group-text {
+ display: flex;
+ align-items: center;
+ padding: 0.375rem 0.75rem;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #212529;
+ text-align: center;
+ white-space: nowrap;
+ background-color: #e9ecef;
+ border: 1px solid #ced4da;
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .input-group-lg > .form-control,
+ .bodywebsite .input-group-lg > .form-select,
+ .bodywebsite .input-group-lg > .input-group-text,
+ .bodywebsite .input-group-lg > .btn {
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ border-radius: 0.5rem;
+}
+
+.bodywebsite .input-group-sm > .form-control,
+ .bodywebsite .input-group-sm > .form-select,
+ .bodywebsite .input-group-sm > .input-group-text,
+ .bodywebsite .input-group-sm > .btn {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.25rem;
+}
+
+.bodywebsite .input-group-lg > .form-select,
+ .bodywebsite .input-group-sm > .form-select {
+ padding-right: 3rem;
+}
+
+.bodywebsite .input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),
+ .bodywebsite .input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3),
+ .bodywebsite .input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control,
+ .bodywebsite .input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.bodywebsite .input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),
+ .bodywebsite .input-group.has-validation > .dropdown-toggle:nth-last-child(n+4),
+ .bodywebsite .input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control,
+ .bodywebsite .input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.bodywebsite .input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {
+ margin-left: -1px;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .input-group > .form-floating:not(:first-child) > .form-control,
+ .bodywebsite .input-group > .form-floating:not(:first-child) > .form-select {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .valid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: #198754;
+}
+
+.bodywebsite .valid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 0.25rem 0.5rem;
+ margin-top: 0.1rem;
+ font-size: 0.875rem;
+ color: #fff;
+ background-color: rgba(25, 135, 84, 0.9);
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .was-validated :valid ~ .valid-feedback,
+ .bodywebsite .was-validated :valid ~ .valid-tooltip,
+ .bodywebsite .is-valid ~ .valid-feedback,
+ .bodywebsite .is-valid ~ .valid-tooltip {
+ display: block;
+}
+
+.bodywebsite .was-validated .form-control:valid, .bodywebsite .form-control.is-valid {
+ border-color: #198754;
+ padding-right: calc(1.5em + 0.75rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: right calc(0.375em + 0.1875rem) center;
+ background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.bodywebsite .was-validated .form-control:valid:focus, .bodywebsite .form-control.is-valid:focus {
+ border-color: #198754;
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
+}
+
+.bodywebsite .was-validated textarea.form-control:valid, .bodywebsite textarea.form-control.is-valid {
+ padding-right: calc(1.5em + 0.75rem);
+ background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
+}
+
+.bodywebsite .was-validated .form-select:valid, .bodywebsite .form-select.is-valid {
+ border-color: #198754;
+}
+
+.bodywebsite .was-validated .form-select:valid:not([multiple]):not([size]), .bodywebsite .was-validated .form-select:valid:not([multiple])[size="1"], .bodywebsite .form-select.is-valid:not([multiple]):not([size]), .bodywebsite .form-select.is-valid:not([multiple])[size="1"] {
+ padding-right: 4.125rem;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
+ background-position: right 0.75rem center, center right 2.25rem;
+ background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.bodywebsite .was-validated .form-select:valid:focus, .bodywebsite .form-select.is-valid:focus {
+ border-color: #198754;
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
+}
+
+.bodywebsite .was-validated .form-control-color:valid, .bodywebsite .form-control-color.is-valid {
+ width: calc(3rem + calc(1.5em + 0.75rem));
+}
+
+.bodywebsite .was-validated .form-check-input:valid, .bodywebsite .form-check-input.is-valid {
+ border-color: #198754;
+}
+
+.bodywebsite .was-validated .form-check-input:valid:checked, .bodywebsite .form-check-input.is-valid:checked {
+ background-color: #198754;
+}
+
+.bodywebsite .was-validated .form-check-input:valid:focus, .bodywebsite .form-check-input.is-valid:focus {
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
+}
+
+.bodywebsite .was-validated .form-check-input:valid ~ .form-check-label, .bodywebsite .form-check-input.is-valid ~ .form-check-label {
+ color: #198754;
+}
+
+.bodywebsite .form-check-inline .form-check-input ~ .valid-feedback {
+ margin-left: 0.5em;
+}
+
+.bodywebsite .was-validated .input-group > .form-control:not(:focus):valid, .bodywebsite .input-group > .form-control:not(:focus).is-valid,
+ .bodywebsite .was-validated .input-group > .form-select:not(:focus):valid,
+ .bodywebsite .input-group > .form-select:not(:focus).is-valid,
+ .bodywebsite .was-validated .input-group > .form-floating:not(:focus-within):valid,
+ .bodywebsite .input-group > .form-floating:not(:focus-within).is-valid {
+ z-index: 3;
+}
+
+.bodywebsite .invalid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: #dc3545;
+}
+
+.bodywebsite .invalid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 0.25rem 0.5rem;
+ margin-top: 0.1rem;
+ font-size: 0.875rem;
+ color: #fff;
+ background-color: rgba(220, 53, 69, 0.9);
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .was-validated :invalid ~ .invalid-feedback,
+ .bodywebsite .was-validated :invalid ~ .invalid-tooltip,
+ .bodywebsite .is-invalid ~ .invalid-feedback,
+ .bodywebsite .is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.bodywebsite .was-validated .form-control:invalid, .bodywebsite .form-control.is-invalid {
+ border-color: #dc3545;
+ padding-right: calc(1.5em + 0.75rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: right calc(0.375em + 0.1875rem) center;
+ background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.bodywebsite .was-validated .form-control:invalid:focus, .bodywebsite .form-control.is-invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
+}
+
+.bodywebsite .was-validated textarea.form-control:invalid, .bodywebsite textarea.form-control.is-invalid {
+ padding-right: calc(1.5em + 0.75rem);
+ background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
+}
+
+.bodywebsite .was-validated .form-select:invalid, .bodywebsite .form-select.is-invalid {
+ border-color: #dc3545;
+}
+
+.bodywebsite .was-validated .form-select:invalid:not([multiple]):not([size]), .bodywebsite .was-validated .form-select:invalid:not([multiple])[size="1"], .bodywebsite .form-select.is-invalid:not([multiple]):not([size]), .bodywebsite .form-select.is-invalid:not([multiple])[size="1"] {
+ padding-right: 4.125rem;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
+ background-position: right 0.75rem center, center right 2.25rem;
+ background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.bodywebsite .was-validated .form-select:invalid:focus, .bodywebsite .form-select.is-invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
+}
+
+.bodywebsite .was-validated .form-control-color:invalid, .bodywebsite .form-control-color.is-invalid {
+ width: calc(3rem + calc(1.5em + 0.75rem));
+}
+
+.bodywebsite .was-validated .form-check-input:invalid, .bodywebsite .form-check-input.is-invalid {
+ border-color: #dc3545;
+}
+
+.bodywebsite .was-validated .form-check-input:invalid:checked, .bodywebsite .form-check-input.is-invalid:checked {
+ background-color: #dc3545;
+}
+
+.bodywebsite .was-validated .form-check-input:invalid:focus, .bodywebsite .form-check-input.is-invalid:focus {
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
+}
+
+.bodywebsite .was-validated .form-check-input:invalid ~ .form-check-label, .bodywebsite .form-check-input.is-invalid ~ .form-check-label {
+ color: #dc3545;
+}
+
+.bodywebsite .form-check-inline .form-check-input ~ .invalid-feedback {
+ margin-left: 0.5em;
+}
+
+.bodywebsite .was-validated .input-group > .form-control:not(:focus):invalid, .bodywebsite .input-group > .form-control:not(:focus).is-invalid,
+ .bodywebsite .was-validated .input-group > .form-select:not(:focus):invalid,
+ .bodywebsite .input-group > .form-select:not(:focus).is-invalid,
+ .bodywebsite .was-validated .input-group > .form-floating:not(:focus-within):invalid,
+ .bodywebsite .input-group > .form-floating:not(:focus-within).is-invalid {
+ z-index: 4;
+}
+
+.bodywebsite .btn {
+ --bs-btn-padding-x: 0.75rem;
+ --bs-btn-padding-y: 0.375rem;
+ --bs-btn-font-size: 1rem;
+ --bs-btn-font-weight: 400;
+ --bs-btn-line-height: 1.5;
+ --bs-btn-color: #212529;
+ --bs-btn-bg: transparent;
+ --bs-btn-border-width: 1px;
+ --bs-btn-border-color: transparent;
+ --bs-btn-border-radius: 0.375rem;
+ --bs-btn-hover-border-color: transparent;
+ --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+ --bs-btn-disabled-opacity: 0.65;
+ display: inline-block;
+ padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x);
+ font-family: var(--bs-btn-font-family);
+ font-size: var(--bs-btn-font-size);
+ font-weight: var(--bs-btn-font-weight);
+ line-height: var(--bs-btn-line-height);
+ color: var(--bs-btn-color);
+ text-align: center;
+ text-decoration: none;
+ vertical-align: middle;
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);
+ border-radius: var(--bs-btn-border-radius);
+ background-color: var(--bs-btn-bg);
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .btn {
+ transition: none;
+ }
+}
+
+.bodywebsite :not(.btn-check) + .btn:hover, .bodywebsite .btn:first-child:hover {
+ color: var(--bs-btn-hover-color);
+ background-color: var(--bs-btn-hover-bg);
+ border-color: var(--bs-btn-hover-border-color);
+}
+
+.bodywebsite .btn:focus-visible {
+ color: var(--bs-btn-hover-color);
+ background-color: var(--bs-btn-hover-bg);
+ border-color: var(--bs-btn-hover-border-color);
+ outline: 0;
+ box-shadow: var(--bs-btn-focus-box-shadow);
+}
+
+.bodywebsite .btn-check:focus-visible + .btn {
+ border-color: var(--bs-btn-hover-border-color);
+ outline: 0;
+ box-shadow: var(--bs-btn-focus-box-shadow);
+}
+
+.bodywebsite .btn-check:checked + .btn, .bodywebsite :not(.btn-check) + .btn:active, .bodywebsite .btn:first-child:active, .bodywebsite .btn.active, .bodywebsite .btn.show {
+ color: var(--bs-btn-active-color);
+ background-color: var(--bs-btn-active-bg);
+ border-color: var(--bs-btn-active-border-color);
+}
+
+.bodywebsite .btn-check:checked + .btn:focus-visible, .bodywebsite :not(.btn-check) + .btn:active:focus-visible, .bodywebsite .btn:first-child:active:focus-visible, .bodywebsite .btn.active:focus-visible, .bodywebsite .btn.show:focus-visible {
+ box-shadow: var(--bs-btn-focus-box-shadow);
+}
+
+.bodywebsite .btn:disabled, .bodywebsite .btn.disabled, .bodywebsite fieldset:disabled .btn {
+ color: var(--bs-btn-disabled-color);
+ pointer-events: none;
+ background-color: var(--bs-btn-disabled-bg);
+ border-color: var(--bs-btn-disabled-border-color);
+ opacity: var(--bs-btn-disabled-opacity);
+}
+
+.bodywebsite .btn-primary {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #0d6efd;
+ --bs-btn-border-color: #0d6efd;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #0b5ed7;
+ --bs-btn-hover-border-color: #0a58ca;
+ --bs-btn-focus-shadow-rgb: 49, 132, 253;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #0a58ca;
+ --bs-btn-active-border-color: #0a53be;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #0d6efd;
+ --bs-btn-disabled-border-color: #0d6efd;
+}
+
+.bodywebsite .btn-secondary {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #6c757d;
+ --bs-btn-border-color: #6c757d;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #5c636a;
+ --bs-btn-hover-border-color: #565e64;
+ --bs-btn-focus-shadow-rgb: 130, 138, 145;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #565e64;
+ --bs-btn-active-border-color: #51585e;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #6c757d;
+ --bs-btn-disabled-border-color: #6c757d;
+}
+
+.bodywebsite .btn-success {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #198754;
+ --bs-btn-border-color: #198754;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #157347;
+ --bs-btn-hover-border-color: #146c43;
+ --bs-btn-focus-shadow-rgb: 60, 153, 110;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #146c43;
+ --bs-btn-active-border-color: #13653f;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #198754;
+ --bs-btn-disabled-border-color: #198754;
+}
+
+.bodywebsite .btn-info {
+ --bs-btn-color: #000;
+ --bs-btn-bg: #0dcaf0;
+ --bs-btn-border-color: #0dcaf0;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #31d2f2;
+ --bs-btn-hover-border-color: #25cff2;
+ --bs-btn-focus-shadow-rgb: 11, 172, 204;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #3dd5f3;
+ --bs-btn-active-border-color: #25cff2;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #000;
+ --bs-btn-disabled-bg: #0dcaf0;
+ --bs-btn-disabled-border-color: #0dcaf0;
+}
+
+.bodywebsite .btn-warning {
+ --bs-btn-color: #000;
+ --bs-btn-bg: #ffc107;
+ --bs-btn-border-color: #ffc107;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #ffca2c;
+ --bs-btn-hover-border-color: #ffc720;
+ --bs-btn-focus-shadow-rgb: 217, 164, 6;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #ffcd39;
+ --bs-btn-active-border-color: #ffc720;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #000;
+ --bs-btn-disabled-bg: #ffc107;
+ --bs-btn-disabled-border-color: #ffc107;
+}
+
+.bodywebsite .btn-danger {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #dc3545;
+ --bs-btn-border-color: #dc3545;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #bb2d3b;
+ --bs-btn-hover-border-color: #b02a37;
+ --bs-btn-focus-shadow-rgb: 225, 83, 97;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #b02a37;
+ --bs-btn-active-border-color: #a52834;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #dc3545;
+ --bs-btn-disabled-border-color: #dc3545;
+}
+
+.bodywebsite .btn-light {
+ --bs-btn-color: #000;
+ --bs-btn-bg: #f8f9fa;
+ --bs-btn-border-color: #f8f9fa;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #d3d4d5;
+ --bs-btn-hover-border-color: #c6c7c8;
+ --bs-btn-focus-shadow-rgb: 211, 212, 213;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #c6c7c8;
+ --bs-btn-active-border-color: #babbbc;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #000;
+ --bs-btn-disabled-bg: #f8f9fa;
+ --bs-btn-disabled-border-color: #f8f9fa;
+}
+
+.bodywebsite .btn-dark {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #212529;
+ --bs-btn-border-color: #212529;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #424649;
+ --bs-btn-hover-border-color: #373b3e;
+ --bs-btn-focus-shadow-rgb: 66, 70, 73;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #4d5154;
+ --bs-btn-active-border-color: #373b3e;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #212529;
+ --bs-btn-disabled-border-color: #212529;
+}
+
+.bodywebsite .btn-outline-primary {
+ --bs-btn-color: #0d6efd;
+ --bs-btn-border-color: #0d6efd;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #0d6efd;
+ --bs-btn-hover-border-color: #0d6efd;
+ --bs-btn-focus-shadow-rgb: 13, 110, 253;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #0d6efd;
+ --bs-btn-active-border-color: #0d6efd;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #0d6efd;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #0d6efd;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-secondary {
+ --bs-btn-color: #6c757d;
+ --bs-btn-border-color: #6c757d;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #6c757d;
+ --bs-btn-hover-border-color: #6c757d;
+ --bs-btn-focus-shadow-rgb: 108, 117, 125;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #6c757d;
+ --bs-btn-active-border-color: #6c757d;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #6c757d;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #6c757d;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-success {
+ --bs-btn-color: #198754;
+ --bs-btn-border-color: #198754;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #198754;
+ --bs-btn-hover-border-color: #198754;
+ --bs-btn-focus-shadow-rgb: 25, 135, 84;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #198754;
+ --bs-btn-active-border-color: #198754;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #198754;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #198754;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-info {
+ --bs-btn-color: #0dcaf0;
+ --bs-btn-border-color: #0dcaf0;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #0dcaf0;
+ --bs-btn-hover-border-color: #0dcaf0;
+ --bs-btn-focus-shadow-rgb: 13, 202, 240;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #0dcaf0;
+ --bs-btn-active-border-color: #0dcaf0;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #0dcaf0;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #0dcaf0;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-warning {
+ --bs-btn-color: #ffc107;
+ --bs-btn-border-color: #ffc107;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #ffc107;
+ --bs-btn-hover-border-color: #ffc107;
+ --bs-btn-focus-shadow-rgb: 255, 193, 7;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #ffc107;
+ --bs-btn-active-border-color: #ffc107;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #ffc107;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #ffc107;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-danger {
+ --bs-btn-color: #dc3545;
+ --bs-btn-border-color: #dc3545;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #dc3545;
+ --bs-btn-hover-border-color: #dc3545;
+ --bs-btn-focus-shadow-rgb: 220, 53, 69;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #dc3545;
+ --bs-btn-active-border-color: #dc3545;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #dc3545;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #dc3545;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-light {
+ --bs-btn-color: #f8f9fa;
+ --bs-btn-border-color: #f8f9fa;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #f8f9fa;
+ --bs-btn-hover-border-color: #f8f9fa;
+ --bs-btn-focus-shadow-rgb: 248, 249, 250;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #f8f9fa;
+ --bs-btn-active-border-color: #f8f9fa;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #f8f9fa;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #f8f9fa;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-dark {
+ --bs-btn-color: #212529;
+ --bs-btn-border-color: #212529;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #212529;
+ --bs-btn-hover-border-color: #212529;
+ --bs-btn-focus-shadow-rgb: 33, 37, 41;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #212529;
+ --bs-btn-active-border-color: #212529;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #212529;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #212529;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-link {
+ --bs-btn-font-weight: 400;
+ --bs-btn-color: var(--bs-link-color);
+ --bs-btn-bg: transparent;
+ --bs-btn-border-color: transparent;
+ --bs-btn-hover-color: var(--bs-link-hover-color);
+ --bs-btn-hover-border-color: transparent;
+ --bs-btn-active-color: var(--bs-link-hover-color);
+ --bs-btn-active-border-color: transparent;
+ --bs-btn-disabled-color: #6c757d;
+ --bs-btn-disabled-border-color: transparent;
+ --bs-btn-box-shadow: none;
+ --bs-btn-focus-shadow-rgb: 49, 132, 253;
+ text-decoration: underline;
+}
+
+.bodywebsite .btn-link:focus-visible {
+ color: var(--bs-btn-color);
+}
+
+.bodywebsite .btn-link:hover {
+ color: var(--bs-btn-hover-color);
+}
+
+.bodywebsite .btn-lg, .bodywebsite .btn-group-lg > .btn {
+ --bs-btn-padding-y: 0.5rem;
+ --bs-btn-padding-x: 1rem;
+ --bs-btn-font-size: 1.25rem;
+ --bs-btn-border-radius: 0.5rem;
+}
+
+.bodywebsite .btn-sm, .bodywebsite .btn-group-sm > .btn {
+ --bs-btn-padding-y: 0.25rem;
+ --bs-btn-padding-x: 0.5rem;
+ --bs-btn-font-size: 0.875rem;
+ --bs-btn-border-radius: 0.25rem;
+}
+
+.bodywebsite .fade {
+ transition: opacity 0.15s linear;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .fade {
+ transition: none;
+ }
+}
+
+.bodywebsite .fade:not(.show) {
+ opacity: 0;
+}
+
+.bodywebsite .collapse:not(.show) {
+ display: none;
+}
+
+.bodywebsite .collapsing {
+ height: 0;
+ overflow: hidden;
+ transition: height 0.35s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .collapsing {
+ transition: none;
+ }
+}
+
+.bodywebsite .collapsing.collapse-horizontal {
+ width: 0;
+ height: auto;
+ transition: width 0.35s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .collapsing.collapse-horizontal {
+ transition: none;
+ }
+}
+
+.bodywebsite .dropup,
+ .bodywebsite .dropend,
+ .bodywebsite .dropdown,
+ .bodywebsite .dropstart,
+ .bodywebsite .dropup-center,
+ .bodywebsite .dropdown-center {
+ position: relative;
+}
+
+.bodywebsite .dropdown-toggle {
+ white-space: nowrap;
+}
+
+.bodywebsite .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0;
+ border-left: 0.3em solid transparent;
+}
+
+.bodywebsite .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropdown-menu {
+ --bs-dropdown-zindex: 1000;
+ --bs-dropdown-min-width: 10rem;
+ --bs-dropdown-padding-x: 0;
+ --bs-dropdown-padding-y: 0.5rem;
+ --bs-dropdown-spacer: 0.125rem;
+ --bs-dropdown-font-size: 1rem;
+ --bs-dropdown-color: #212529;
+ --bs-dropdown-bg: #fff;
+ --bs-dropdown-border-color: var(--bs-border-color-translucent);
+ --bs-dropdown-border-radius: 0.375rem;
+ --bs-dropdown-border-width: 1px;
+ --bs-dropdown-inner-border-radius: calc(0.375rem - 1px);
+ --bs-dropdown-divider-bg: var(--bs-border-color-translucent);
+ --bs-dropdown-divider-margin-y: 0.5rem;
+ --bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ --bs-dropdown-link-color: #212529;
+ --bs-dropdown-link-hover-color: #1e2125;
+ --bs-dropdown-link-hover-bg: #e9ecef;
+ --bs-dropdown-link-active-color: #fff;
+ --bs-dropdown-link-active-bg: #0d6efd;
+ --bs-dropdown-link-disabled-color: #adb5bd;
+ --bs-dropdown-item-padding-x: 1rem;
+ --bs-dropdown-item-padding-y: 0.25rem;
+ --bs-dropdown-header-color: #6c757d;
+ --bs-dropdown-header-padding-x: 1rem;
+ --bs-dropdown-header-padding-y: 0.5rem;
+ position: absolute;
+ z-index: var(--bs-dropdown-zindex);
+ display: none;
+ min-width: var(--bs-dropdown-min-width);
+ padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);
+ margin: 0;
+ font-size: var(--bs-dropdown-font-size);
+ color: var(--bs-dropdown-color);
+ text-align: left;
+ list-style: none;
+ background-color: var(--bs-dropdown-bg);
+ background-clip: padding-box;
+ border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);
+ border-radius: var(--bs-dropdown-border-radius);
+}
+
+.bodywebsite .dropdown-menu[data-bs-popper] {
+ top: 100%;
+ left: 0;
+ margin-top: var(--bs-dropdown-spacer);
+}
+
+.bodywebsite .dropdown-menu-start {
+ --bs-position: start;
+}
+
+.bodywebsite .dropdown-menu-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+}
+
+.bodywebsite .dropdown-menu-end {
+ --bs-position: end;
+}
+
+.bodywebsite .dropdown-menu-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .dropdown-menu-sm-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-sm-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-sm-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-sm-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .dropdown-menu-md-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-md-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-md-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-md-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .dropdown-menu-lg-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-lg-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-lg-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-lg-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .dropdown-menu-xl-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-xl-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-xl-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-xl-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .dropdown-menu-xxl-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-xxl-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-xxl-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-xxl-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+.bodywebsite .dropup .dropdown-menu[data-bs-popper] {
+ top: auto;
+ bottom: 100%;
+ margin-top: 0;
+ margin-bottom: var(--bs-dropdown-spacer);
+}
+
+.bodywebsite .dropup .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0.3em solid;
+ border-left: 0.3em solid transparent;
+}
+
+.bodywebsite .dropup .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropend .dropdown-menu[data-bs-popper] {
+ top: 0;
+ right: auto;
+ left: 100%;
+ margin-top: 0;
+ margin-left: var(--bs-dropdown-spacer);
+}
+
+.bodywebsite .dropend .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid transparent;
+ border-right: 0;
+ border-bottom: 0.3em solid transparent;
+ border-left: 0.3em solid;
+}
+
+.bodywebsite .dropend .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropend .dropdown-toggle::after {
+ vertical-align: 0;
+}
+
+.bodywebsite .dropstart .dropdown-menu[data-bs-popper] {
+ top: 0;
+ right: 100%;
+ left: auto;
+ margin-top: 0;
+ margin-right: var(--bs-dropdown-spacer);
+}
+
+.bodywebsite .dropstart .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+}
+
+.bodywebsite .dropstart .dropdown-toggle::after {
+ display: none;
+}
+
+.bodywebsite .dropstart .dropdown-toggle::before {
+ display: inline-block;
+ margin-right: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid transparent;
+ border-right: 0.3em solid;
+ border-bottom: 0.3em solid transparent;
+}
+
+.bodywebsite .dropstart .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropstart .dropdown-toggle::before {
+ vertical-align: 0;
+}
+
+.bodywebsite .dropdown-divider {
+ height: 0;
+ margin: var(--bs-dropdown-divider-margin-y) 0;
+ overflow: hidden;
+ border-top: 1px solid var(--bs-dropdown-divider-bg);
+ opacity: 1;
+}
+
+.bodywebsite .dropdown-item {
+ display: block;
+ width: 100%;
+ padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);
+ clear: both;
+ font-weight: 400;
+ color: var(--bs-dropdown-link-color);
+ text-align: inherit;
+ text-decoration: none;
+ white-space: nowrap;
+ background-color: transparent;
+ border: 0;
+}
+
+.bodywebsite .dropdown-item:hover, .bodywebsite .dropdown-item:focus {
+ color: var(--bs-dropdown-link-hover-color);
+ background-color: var(--bs-dropdown-link-hover-bg);
+}
+
+.bodywebsite .dropdown-item.active, .bodywebsite .dropdown-item:active {
+ color: var(--bs-dropdown-link-active-color);
+ text-decoration: none;
+ background-color: var(--bs-dropdown-link-active-bg);
+}
+
+.bodywebsite .dropdown-item.disabled, .bodywebsite .dropdown-item:disabled {
+ color: var(--bs-dropdown-link-disabled-color);
+ pointer-events: none;
+ background-color: transparent;
+}
+
+.bodywebsite .dropdown-menu.show {
+ display: block;
+}
+
+.bodywebsite .dropdown-header {
+ display: block;
+ padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);
+ margin-bottom: 0;
+ font-size: 0.875rem;
+ color: var(--bs-dropdown-header-color);
+ white-space: nowrap;
+}
+
+.bodywebsite .dropdown-item-text {
+ display: block;
+ padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);
+ color: var(--bs-dropdown-link-color);
+}
+
+.bodywebsite .dropdown-menu-dark {
+ --bs-dropdown-color: #dee2e6;
+ --bs-dropdown-bg: #343a40;
+ --bs-dropdown-border-color: var(--bs-border-color-translucent);
+ --bs-dropdown-link-color: #dee2e6;
+ --bs-dropdown-link-hover-color: #fff;
+ --bs-dropdown-divider-bg: var(--bs-border-color-translucent);
+ --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);
+ --bs-dropdown-link-active-color: #fff;
+ --bs-dropdown-link-active-bg: #0d6efd;
+ --bs-dropdown-link-disabled-color: #adb5bd;
+ --bs-dropdown-header-color: #adb5bd;
+}
+
+.bodywebsite .btn-group,
+ .bodywebsite .btn-group-vertical {
+ position: relative;
+ display: inline-flex;
+ vertical-align: middle;
+}
+
+.bodywebsite .btn-group > .btn,
+ .bodywebsite .btn-group-vertical > .btn {
+ position: relative;
+ flex: 1 1 auto;
+}
+
+.bodywebsite .btn-group > .btn-check:checked + .btn,
+ .bodywebsite .btn-group > .btn-check:focus + .btn,
+ .bodywebsite .btn-group > .btn:hover,
+ .bodywebsite .btn-group > .btn:focus,
+ .bodywebsite .btn-group > .btn:active,
+ .bodywebsite .btn-group > .btn.active,
+ .bodywebsite .btn-group-vertical > .btn-check:checked + .btn,
+ .bodywebsite .btn-group-vertical > .btn-check:focus + .btn,
+ .bodywebsite .btn-group-vertical > .btn:hover,
+ .bodywebsite .btn-group-vertical > .btn:focus,
+ .bodywebsite .btn-group-vertical > .btn:active,
+ .bodywebsite .btn-group-vertical > .btn.active {
+ z-index: 1;
+}
+
+.bodywebsite .btn-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+}
+
+.bodywebsite .btn-toolbar .input-group {
+ width: auto;
+}
+
+.bodywebsite .btn-group {
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .btn-group > :not(.btn-check:first-child) + .btn,
+ .bodywebsite .btn-group > .btn-group:not(:first-child) {
+ margin-left: -1px;
+}
+
+.bodywebsite .btn-group > .btn:not(:last-child):not(.dropdown-toggle),
+ .bodywebsite .btn-group > .btn.dropdown-toggle-split:first-child,
+ .bodywebsite .btn-group > .btn-group:not(:last-child) > .btn {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.bodywebsite .btn-group > .btn:nth-child(n+3),
+ .bodywebsite .btn-group > :not(.btn-check) + .btn,
+ .bodywebsite .btn-group > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .dropdown-toggle-split {
+ padding-right: 0.5625rem;
+ padding-left: 0.5625rem;
+}
+
+.bodywebsite .dropdown-toggle-split::after, .bodywebsite .dropup .dropdown-toggle-split::after, .bodywebsite .dropend .dropdown-toggle-split::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropstart .dropdown-toggle-split::before {
+ margin-right: 0;
+}
+
+.bodywebsite .btn-sm + .dropdown-toggle-split, .bodywebsite .btn-group-sm > .btn + .dropdown-toggle-split {
+ padding-right: 0.375rem;
+ padding-left: 0.375rem;
+}
+
+.bodywebsite .btn-lg + .dropdown-toggle-split, .bodywebsite .btn-group-lg > .btn + .dropdown-toggle-split {
+ padding-right: 0.75rem;
+ padding-left: 0.75rem;
+}
+
+.bodywebsite .btn-group-vertical {
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+}
+
+.bodywebsite .btn-group-vertical > .btn,
+ .bodywebsite .btn-group-vertical > .btn-group {
+ width: 100%;
+}
+
+.bodywebsite .btn-group-vertical > .btn:not(:first-child),
+ .bodywebsite .btn-group-vertical > .btn-group:not(:first-child) {
+ margin-top: -1px;
+}
+
+.bodywebsite .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),
+ .bodywebsite .btn-group-vertical > .btn-group:not(:last-child) > .btn {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .btn-group-vertical > .btn ~ .btn,
+ .bodywebsite .btn-group-vertical > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.bodywebsite .nav {
+ --bs-nav-link-padding-x: 1rem;
+ --bs-nav-link-padding-y: 0.5rem;
+ --bs-nav-link-color: var(--bs-link-color);
+ --bs-nav-link-hover-color: var(--bs-link-hover-color);
+ --bs-nav-link-disabled-color: #6c757d;
+ display: flex;
+ flex-wrap: wrap;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+
+.bodywebsite .nav-link {
+ display: block;
+ padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);
+ font-size: var(--bs-nav-link-font-size);
+ font-weight: var(--bs-nav-link-font-weight);
+ color: var(--bs-nav-link-color);
+ text-decoration: none;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .nav-link {
+ transition: none;
+ }
+}
+
+.bodywebsite .nav-link:hover, .bodywebsite .nav-link:focus {
+ color: var(--bs-nav-link-hover-color);
+}
+
+.bodywebsite .nav-link.disabled {
+ color: var(--bs-nav-link-disabled-color);
+ pointer-events: none;
+ cursor: default;
+}
+
+.bodywebsite .nav-tabs {
+ --bs-nav-tabs-border-width: 1px;
+ --bs-nav-tabs-border-color: #dee2e6;
+ --bs-nav-tabs-border-radius: 0.375rem;
+ --bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef #dee2e6;
+ --bs-nav-tabs-link-active-color: #495057;
+ --bs-nav-tabs-link-active-bg: #fff;
+ --bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff;
+ border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color);
+}
+
+.bodywebsite .nav-tabs .nav-link {
+ margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width));
+ background: none;
+ border: var(--bs-nav-tabs-border-width) solid transparent;
+ border-top-left-radius: var(--bs-nav-tabs-border-radius);
+ border-top-right-radius: var(--bs-nav-tabs-border-radius);
+}
+
+.bodywebsite .nav-tabs .nav-link:hover, .bodywebsite .nav-tabs .nav-link:focus {
+ isolation: isolate;
+ border-color: var(--bs-nav-tabs-link-hover-border-color);
+}
+
+.bodywebsite .nav-tabs .nav-link.disabled, .bodywebsite .nav-tabs .nav-link:disabled {
+ color: var(--bs-nav-link-disabled-color);
+ background-color: transparent;
+ border-color: transparent;
+}
+
+.bodywebsite .nav-tabs .nav-link.active,
+ .bodywebsite .nav-tabs .nav-item.show .nav-link {
+ color: var(--bs-nav-tabs-link-active-color);
+ background-color: var(--bs-nav-tabs-link-active-bg);
+ border-color: var(--bs-nav-tabs-link-active-border-color);
+}
+
+.bodywebsite .nav-tabs .dropdown-menu {
+ margin-top: calc(-1 * var(--bs-nav-tabs-border-width));
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.bodywebsite .nav-pills {
+ --bs-nav-pills-border-radius: 0.375rem;
+ --bs-nav-pills-link-active-color: #fff;
+ --bs-nav-pills-link-active-bg: #0d6efd;
+}
+
+.bodywebsite .nav-pills .nav-link {
+ background: none;
+ border: 0;
+ border-radius: var(--bs-nav-pills-border-radius);
+}
+
+.bodywebsite .nav-pills .nav-link:disabled {
+ color: var(--bs-nav-link-disabled-color);
+ background-color: transparent;
+ border-color: transparent;
+}
+
+.bodywebsite .nav-pills .nav-link.active,
+ .bodywebsite .nav-pills .show > .nav-link {
+ color: var(--bs-nav-pills-link-active-color);
+ background-color: var(--bs-nav-pills-link-active-bg);
+}
+
+.bodywebsite .nav-fill > .nav-link,
+ .bodywebsite .nav-fill .nav-item {
+ flex: 1 1 auto;
+ text-align: center;
+}
+
+.bodywebsite .nav-justified > .nav-link,
+ .bodywebsite .nav-justified .nav-item {
+ flex-basis: 0;
+ flex-grow: 1;
+ text-align: center;
+}
+
+.bodywebsite .nav-fill .nav-item .nav-link,
+ .bodywebsite .nav-justified .nav-item .nav-link {
+ width: 100%;
+}
+
+.bodywebsite .tab-content > .tab-pane {
+ display: none;
+}
+
+.bodywebsite .tab-content > .active {
+ display: block;
+}
+
+.bodywebsite .navbar {
+ --bs-navbar-padding-x: 0;
+ --bs-navbar-padding-y: 0.5rem;
+ --bs-navbar-color: rgba(0, 0, 0, 0.55);
+ --bs-navbar-hover-color: rgba(0, 0, 0, 0.7);
+ --bs-navbar-disabled-color: rgba(0, 0, 0, 0.3);
+ --bs-navbar-active-color: rgba(0, 0, 0, 0.9);
+ --bs-navbar-brand-padding-y: 0.3125rem;
+ --bs-navbar-brand-margin-end: 1rem;
+ --bs-navbar-brand-font-size: 1.25rem;
+ --bs-navbar-brand-color: rgba(0, 0, 0, 0.9);
+ --bs-navbar-brand-hover-color: rgba(0, 0, 0, 0.9);
+ --bs-navbar-nav-link-padding-x: 0.5rem;
+ --bs-navbar-toggler-padding-y: 0.25rem;
+ --bs-navbar-toggler-padding-x: 0.75rem;
+ --bs-navbar-toggler-font-size: 1.25rem;
+ --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+ --bs-navbar-toggler-border-color: rgba(0, 0, 0, 0.1);
+ --bs-navbar-toggler-border-radius: 0.375rem;
+ --bs-navbar-toggler-focus-width: 0.25rem;
+ --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: space-between;
+ padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);
+}
+
+.bodywebsite .navbar > .container,
+ .bodywebsite .navbar > .container-fluid,
+ .bodywebsite .navbar > .container-sm,
+ .bodywebsite .navbar > .container-md,
+ .bodywebsite .navbar > .container-lg,
+ .bodywebsite .navbar > .container-xl,
+ .bodywebsite .navbar > .container-xxl {
+ display: flex;
+ flex-wrap: inherit;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.bodywebsite .navbar-brand {
+ padding-top: var(--bs-navbar-brand-padding-y);
+ padding-bottom: var(--bs-navbar-brand-padding-y);
+ margin-right: var(--bs-navbar-brand-margin-end);
+ font-size: var(--bs-navbar-brand-font-size);
+ color: var(--bs-navbar-brand-color);
+ text-decoration: none;
+ white-space: nowrap;
+}
+
+.bodywebsite .navbar-brand:hover, .bodywebsite .navbar-brand:focus {
+ color: var(--bs-navbar-brand-hover-color);
+}
+
+.bodywebsite .navbar-nav {
+ --bs-nav-link-padding-x: 0;
+ --bs-nav-link-padding-y: 0.5rem;
+ --bs-nav-link-color: var(--bs-navbar-color);
+ --bs-nav-link-hover-color: var(--bs-navbar-hover-color);
+ --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+
+.bodywebsite .navbar-nav .show > .nav-link,
+ .bodywebsite .navbar-nav .nav-link.active {
+ color: var(--bs-navbar-active-color);
+}
+
+.bodywebsite .navbar-nav .dropdown-menu {
+ position: static;
+}
+
+.bodywebsite .navbar-text {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ color: var(--bs-navbar-color);
+}
+
+.bodywebsite .navbar-text a,
+ .bodywebsite .navbar-text a:hover,
+ .bodywebsite .navbar-text a:focus {
+ color: var(--bs-navbar-active-color);
+}
+
+.bodywebsite .navbar-collapse {
+ flex-basis: 100%;
+ flex-grow: 1;
+ align-items: center;
+}
+
+.bodywebsite .navbar-toggler {
+ padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);
+ font-size: var(--bs-navbar-toggler-font-size);
+ line-height: 1;
+ color: var(--bs-navbar-color);
+ background-color: transparent;
+ border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);
+ border-radius: var(--bs-navbar-toggler-border-radius);
+ transition: var(--bs-navbar-toggler-transition);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .navbar-toggler {
+ transition: none;
+ }
+}
+
+.bodywebsite .navbar-toggler:hover {
+ text-decoration: none;
+}
+
+.bodywebsite .navbar-toggler:focus {
+ text-decoration: none;
+ outline: 0;
+ box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width);
+}
+
+.bodywebsite .navbar-toggler-icon {
+ display: inline-block;
+ width: 1.5em;
+ height: 1.5em;
+ vertical-align: middle;
+ background-image: var(--bs-navbar-toggler-icon-bg);
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: 100%;
+}
+
+.bodywebsite .navbar-nav-scroll {
+ max-height: var(--bs-scroll-height, 75vh);
+ overflow-y: auto;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .navbar-expand-sm {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-sm .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-sm .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-sm .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .navbar-expand-md {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-md .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-md .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-md .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .navbar-expand-lg {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-lg .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-lg .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-lg .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .navbar-expand-xl {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-xl .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-xl .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-xl .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .navbar-expand-xxl {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-xxl .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-xxl .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-xxl .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+.bodywebsite .navbar-expand {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+}
+
+.bodywebsite .navbar-expand .navbar-nav {
+ flex-direction: row;
+}
+
+.bodywebsite .navbar-expand .navbar-nav .dropdown-menu {
+ position: absolute;
+}
+
+.bodywebsite .navbar-expand .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+}
+
+.bodywebsite .navbar-expand .navbar-nav-scroll {
+ overflow: visible;
+}
+
+.bodywebsite .navbar-expand .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+}
+
+.bodywebsite .navbar-expand .navbar-toggler {
+ display: none;
+}
+
+.bodywebsite .navbar-expand .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+}
+
+.bodywebsite .navbar-expand .offcanvas .offcanvas-header {
+ display: none;
+}
+
+.bodywebsite .navbar-expand .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+}
+
+.bodywebsite .navbar-dark {
+ --bs-navbar-color: rgba(255, 255, 255, 0.55);
+ --bs-navbar-hover-color: rgba(255, 255, 255, 0.75);
+ --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25);
+ --bs-navbar-active-color: #fff;
+ --bs-navbar-brand-color: #fff;
+ --bs-navbar-brand-hover-color: #fff;
+ --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);
+ --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .card {
+ --bs-card-spacer-y: 1rem;
+ --bs-card-spacer-x: 1rem;
+ --bs-card-title-spacer-y: 0.5rem;
+ --bs-card-border-width: 1px;
+ --bs-card-border-color: var(--bs-border-color-translucent);
+ --bs-card-border-radius: 0.375rem;
+ --bs-card-inner-border-radius: calc(0.375rem - 1px);
+ --bs-card-cap-padding-y: 0.5rem;
+ --bs-card-cap-padding-x: 1rem;
+ --bs-card-cap-bg: rgba(0, 0, 0, 0.03);
+ --bs-card-bg: #fff;
+ --bs-card-img-overlay-padding: 1rem;
+ --bs-card-group-margin: 0.75rem;
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ min-width: 0;
+ height: var(--bs-card-height);
+ word-wrap: break-word;
+ background-color: var(--bs-card-bg);
+ background-clip: border-box;
+ border: var(--bs-card-border-width) solid var(--bs-card-border-color);
+ border-radius: var(--bs-card-border-radius);
+}
+
+.bodywebsite .card > hr {
+ margin-right: 0;
+ margin-left: 0;
+}
+
+.bodywebsite .card > .list-group {
+ border-top: inherit;
+ border-bottom: inherit;
+}
+
+.bodywebsite .card > .list-group:first-child {
+ border-top-width: 0;
+ border-top-left-radius: var(--bs-card-inner-border-radius);
+ border-top-right-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card > .list-group:last-child {
+ border-bottom-width: 0;
+ border-bottom-right-radius: var(--bs-card-inner-border-radius);
+ border-bottom-left-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card > .card-header + .list-group,
+ .bodywebsite .card > .list-group + .card-footer {
+ border-top: 0;
+}
+
+.bodywebsite .card-body {
+ flex: 1 1 auto;
+ padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x);
+ color: var(--bs-card-color);
+}
+
+.bodywebsite .card-title {
+ margin-bottom: var(--bs-card-title-spacer-y);
+}
+
+.bodywebsite .card-subtitle {
+ margin-top: calc(-0.5 * var(--bs-card-title-spacer-y));
+ margin-bottom: 0;
+}
+
+.bodywebsite .card-text:last-child {
+ margin-bottom: 0;
+}
+
+.bodywebsite .card-link + .card-link {
+ margin-left: var(--bs-card-spacer-x);
+}
+
+.bodywebsite .card-header {
+ padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);
+ margin-bottom: 0;
+ color: var(--bs-card-cap-color);
+ background-color: var(--bs-card-cap-bg);
+ border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color);
+}
+
+.bodywebsite .card-header:first-child {
+ border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0;
+}
+
+.bodywebsite .card-footer {
+ padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);
+ color: var(--bs-card-cap-color);
+ background-color: var(--bs-card-cap-bg);
+ border-top: var(--bs-card-border-width) solid var(--bs-card-border-color);
+}
+
+.bodywebsite .card-footer:last-child {
+ border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card-header-tabs {
+ margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));
+ margin-bottom: calc(-1 * var(--bs-card-cap-padding-y));
+ margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));
+ border-bottom: 0;
+}
+
+.bodywebsite .card-header-tabs .nav-link.active {
+ background-color: var(--bs-card-bg);
+ border-bottom-color: var(--bs-card-bg);
+}
+
+.bodywebsite .card-header-pills {
+ margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));
+ margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));
+}
+
+.bodywebsite .card-img-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: var(--bs-card-img-overlay-padding);
+ border-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card-img,
+ .bodywebsite .card-img-top,
+ .bodywebsite .card-img-bottom {
+ width: 100%;
+}
+
+.bodywebsite .card-img,
+ .bodywebsite .card-img-top {
+ border-top-left-radius: var(--bs-card-inner-border-radius);
+ border-top-right-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card-img,
+ .bodywebsite .card-img-bottom {
+ border-bottom-right-radius: var(--bs-card-inner-border-radius);
+ border-bottom-left-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card-group > .card {
+ margin-bottom: var(--bs-card-group-margin);
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .card-group {
+ display: flex;
+ flex-flow: row wrap;
+ }
+
+ .bodywebsite .card-group > .card {
+ flex: 1 0 0%;
+ margin-bottom: 0;
+ }
+
+ .bodywebsite .card-group > .card + .card {
+ margin-left: 0;
+ border-left: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:last-child) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:last-child) .card-img-top,
+ .bodywebsite .card-group > .card:not(:last-child) .card-header {
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:last-child) .card-img-bottom,
+ .bodywebsite .card-group > .card:not(:last-child) .card-footer {
+ border-bottom-right-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:first-child) .card-img-top,
+ .bodywebsite .card-group > .card:not(:first-child) .card-header {
+ border-top-left-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:first-child) .card-img-bottom,
+ .bodywebsite .card-group > .card:not(:first-child) .card-footer {
+ border-bottom-left-radius: 0;
+ }
+}
+
+.bodywebsite .accordion {
+ --bs-accordion-color: var(--bs-body-color);
+ --bs-accordion-bg: #fff;
+ --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;
+ --bs-accordion-border-color: var(--bs-border-color);
+ --bs-accordion-border-width: 1px;
+ --bs-accordion-border-radius: 0.375rem;
+ --bs-accordion-inner-border-radius: calc(0.375rem - 1px);
+ --bs-accordion-btn-padding-x: 1.25rem;
+ --bs-accordion-btn-padding-y: 1rem;
+ --bs-accordion-btn-color: var(--bs-body-color);
+ --bs-accordion-btn-bg: var(--bs-accordion-bg);
+ --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='var%28--bs-body-color%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
+ --bs-accordion-btn-icon-width: 1.25rem;
+ --bs-accordion-btn-icon-transform: rotate(-180deg);
+ --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;
+ --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
+ --bs-accordion-btn-focus-border-color: #86b7fe;
+ --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+ --bs-accordion-body-padding-x: 1.25rem;
+ --bs-accordion-body-padding-y: 1rem;
+ --bs-accordion-active-color: #0c63e4;
+ --bs-accordion-active-bg: #e7f1ff;
+}
+
+.bodywebsite .accordion-button {
+ position: relative;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);
+ font-size: 1rem;
+ color: var(--bs-accordion-btn-color);
+ text-align: left;
+ background-color: var(--bs-accordion-btn-bg);
+ border: 0;
+ border-radius: 0;
+ overflow-anchor: none;
+ transition: var(--bs-accordion-transition);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .accordion-button {
+ transition: none;
+ }
+}
+
+.bodywebsite .accordion-button:not(.collapsed) {
+ color: var(--bs-accordion-active-color);
+ background-color: var(--bs-accordion-active-bg);
+ box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color);
+}
+
+.bodywebsite .accordion-button:not(.collapsed)::after {
+ background-image: var(--bs-accordion-btn-active-icon);
+ transform: var(--bs-accordion-btn-icon-transform);
+}
+
+.bodywebsite .accordion-button::after {
+ flex-shrink: 0;
+ width: var(--bs-accordion-btn-icon-width);
+ height: var(--bs-accordion-btn-icon-width);
+ margin-left: auto;
+ content: "";
+ background-image: var(--bs-accordion-btn-icon);
+ background-repeat: no-repeat;
+ background-size: var(--bs-accordion-btn-icon-width);
+ transition: var(--bs-accordion-btn-icon-transition);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .accordion-button::after {
+ transition: none;
+ }
+}
+
+.bodywebsite .accordion-button:hover {
+ z-index: 2;
+}
+
+.bodywebsite .accordion-button:focus {
+ z-index: 3;
+ border-color: var(--bs-accordion-btn-focus-border-color);
+ outline: 0;
+ box-shadow: var(--bs-accordion-btn-focus-box-shadow);
+}
+
+.bodywebsite .accordion-header {
+ margin-bottom: 0;
+}
+
+.bodywebsite .accordion-item {
+ color: var(--bs-accordion-color);
+ background-color: var(--bs-accordion-bg);
+ border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color);
+}
+
+.bodywebsite .accordion-item:first-of-type {
+ border-top-left-radius: var(--bs-accordion-border-radius);
+ border-top-right-radius: var(--bs-accordion-border-radius);
+}
+
+.bodywebsite .accordion-item:first-of-type .accordion-button {
+ border-top-left-radius: var(--bs-accordion-inner-border-radius);
+ border-top-right-radius: var(--bs-accordion-inner-border-radius);
+}
+
+.bodywebsite .accordion-item:not(:first-of-type) {
+ border-top: 0;
+}
+
+.bodywebsite .accordion-item:last-of-type {
+ border-bottom-right-radius: var(--bs-accordion-border-radius);
+ border-bottom-left-radius: var(--bs-accordion-border-radius);
+}
+
+.bodywebsite .accordion-item:last-of-type .accordion-button.collapsed {
+ border-bottom-right-radius: var(--bs-accordion-inner-border-radius);
+ border-bottom-left-radius: var(--bs-accordion-inner-border-radius);
+}
+
+.bodywebsite .accordion-item:last-of-type .accordion-collapse {
+ border-bottom-right-radius: var(--bs-accordion-border-radius);
+ border-bottom-left-radius: var(--bs-accordion-border-radius);
+}
+
+.bodywebsite .accordion-body {
+ padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x);
+}
+
+.bodywebsite .accordion-flush .accordion-collapse {
+ border-width: 0;
+}
+
+.bodywebsite .accordion-flush .accordion-item {
+ border-right: 0;
+ border-left: 0;
+ border-radius: 0;
+}
+
+.bodywebsite .accordion-flush .accordion-item:first-child {
+ border-top: 0;
+}
+
+.bodywebsite .accordion-flush .accordion-item:last-child {
+ border-bottom: 0;
+}
+
+.bodywebsite .accordion-flush .accordion-item .accordion-button, .bodywebsite .accordion-flush .accordion-item .accordion-button.collapsed {
+ border-radius: 0;
+}
+
+.bodywebsite .breadcrumb {
+ --bs-breadcrumb-padding-x: 0;
+ --bs-breadcrumb-padding-y: 0;
+ --bs-breadcrumb-margin-bottom: 1rem;
+ --bs-breadcrumb-divider-color: #6c757d;
+ --bs-breadcrumb-item-padding-x: 0.5rem;
+ --bs-breadcrumb-item-active-color: #6c757d;
+ display: flex;
+ flex-wrap: wrap;
+ padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);
+ margin-bottom: var(--bs-breadcrumb-margin-bottom);
+ font-size: var(--bs-breadcrumb-font-size);
+ list-style: none;
+ background-color: var(--bs-breadcrumb-bg);
+ border-radius: var(--bs-breadcrumb-border-radius);
+}
+
+.bodywebsite .breadcrumb-item + .breadcrumb-item {
+ padding-left: var(--bs-breadcrumb-item-padding-x);
+}
+
+.bodywebsite .breadcrumb-item + .breadcrumb-item::before {
+ float: left;
+ padding-right: var(--bs-breadcrumb-item-padding-x);
+ color: var(--bs-breadcrumb-divider-color);
+ content: var(--bs-breadcrumb-divider, "/");
+}
+
+.bodywebsite .breadcrumb-item.active {
+ color: var(--bs-breadcrumb-item-active-color);
+}
+
+.bodywebsite .pagination {
+ --bs-pagination-padding-x: 0.75rem;
+ --bs-pagination-padding-y: 0.375rem;
+ --bs-pagination-font-size: 1rem;
+ --bs-pagination-color: var(--bs-link-color);
+ --bs-pagination-bg: #fff;
+ --bs-pagination-border-width: 1px;
+ --bs-pagination-border-color: #dee2e6;
+ --bs-pagination-border-radius: 0.375rem;
+ --bs-pagination-hover-color: var(--bs-link-hover-color);
+ --bs-pagination-hover-bg: #e9ecef;
+ --bs-pagination-hover-border-color: #dee2e6;
+ --bs-pagination-focus-color: var(--bs-link-hover-color);
+ --bs-pagination-focus-bg: #e9ecef;
+ --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+ --bs-pagination-active-color: #fff;
+ --bs-pagination-active-bg: #0d6efd;
+ --bs-pagination-active-border-color: #0d6efd;
+ --bs-pagination-disabled-color: #6c757d;
+ --bs-pagination-disabled-bg: #fff;
+ --bs-pagination-disabled-border-color: #dee2e6;
+ display: flex;
+ padding-left: 0;
+ list-style: none;
+}
+
+.bodywebsite .page-link {
+ position: relative;
+ display: block;
+ padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);
+ font-size: var(--bs-pagination-font-size);
+ color: var(--bs-pagination-color);
+ text-decoration: none;
+ background-color: var(--bs-pagination-bg);
+ border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .page-link {
+ transition: none;
+ }
+}
+
+.bodywebsite .page-link:hover {
+ z-index: 2;
+ color: var(--bs-pagination-hover-color);
+ background-color: var(--bs-pagination-hover-bg);
+ border-color: var(--bs-pagination-hover-border-color);
+}
+
+.bodywebsite .page-link:focus {
+ z-index: 3;
+ color: var(--bs-pagination-focus-color);
+ background-color: var(--bs-pagination-focus-bg);
+ outline: 0;
+ box-shadow: var(--bs-pagination-focus-box-shadow);
+}
+
+.bodywebsite .page-link.active, .bodywebsite .active > .page-link {
+ z-index: 3;
+ color: var(--bs-pagination-active-color);
+ background-color: var(--bs-pagination-active-bg);
+ border-color: var(--bs-pagination-active-border-color);
+}
+
+.bodywebsite .page-link.disabled, .bodywebsite .disabled > .page-link {
+ color: var(--bs-pagination-disabled-color);
+ pointer-events: none;
+ background-color: var(--bs-pagination-disabled-bg);
+ border-color: var(--bs-pagination-disabled-border-color);
+}
+
+.bodywebsite .page-item:not(:first-child) .page-link {
+ margin-left: -1px;
+}
+
+.bodywebsite .page-item:first-child .page-link {
+ border-top-left-radius: var(--bs-pagination-border-radius);
+ border-bottom-left-radius: var(--bs-pagination-border-radius);
+}
+
+.bodywebsite .page-item:last-child .page-link {
+ border-top-right-radius: var(--bs-pagination-border-radius);
+ border-bottom-right-radius: var(--bs-pagination-border-radius);
+}
+
+.bodywebsite .pagination-lg {
+ --bs-pagination-padding-x: 1.5rem;
+ --bs-pagination-padding-y: 0.75rem;
+ --bs-pagination-font-size: 1.25rem;
+ --bs-pagination-border-radius: 0.5rem;
+}
+
+.bodywebsite .pagination-sm {
+ --bs-pagination-padding-x: 0.5rem;
+ --bs-pagination-padding-y: 0.25rem;
+ --bs-pagination-font-size: 0.875rem;
+ --bs-pagination-border-radius: 0.25rem;
+}
+
+.bodywebsite .badge {
+ --bs-badge-padding-x: 0.65em;
+ --bs-badge-padding-y: 0.35em;
+ --bs-badge-font-size: 0.75em;
+ --bs-badge-font-weight: 700;
+ --bs-badge-color: #fff;
+ --bs-badge-border-radius: 0.375rem;
+ display: inline-block;
+ padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x);
+ font-size: var(--bs-badge-font-size);
+ font-weight: var(--bs-badge-font-weight);
+ line-height: 1;
+ color: var(--bs-badge-color);
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: var(--bs-badge-border-radius);
+}
+
+.bodywebsite .badge:empty {
+ display: none;
+}
+
+.bodywebsite .btn .badge {
+ position: relative;
+ top: -1px;
+}
+
+.bodywebsite .alert {
+ --bs-alert-bg: transparent;
+ --bs-alert-padding-x: 1rem;
+ --bs-alert-padding-y: 1rem;
+ --bs-alert-margin-bottom: 1rem;
+ --bs-alert-color: inherit;
+ --bs-alert-border-color: transparent;
+ --bs-alert-border: 1px solid var(--bs-alert-border-color);
+ --bs-alert-border-radius: 0.375rem;
+ position: relative;
+ padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x);
+ margin-bottom: var(--bs-alert-margin-bottom);
+ color: var(--bs-alert-color);
+ background-color: var(--bs-alert-bg);
+ border: var(--bs-alert-border);
+ border-radius: var(--bs-alert-border-radius);
+}
+
+.bodywebsite .alert-heading {
+ color: inherit;
+}
+
+.bodywebsite .alert-link {
+ font-weight: 700;
+}
+
+.bodywebsite .alert-dismissible {
+ padding-right: 3rem;
+}
+
+.bodywebsite .alert-dismissible .btn-close {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 2;
+ padding: 1.25rem 1rem;
+}
+
+.bodywebsite .alert-primary {
+ --bs-alert-color: #084298;
+ --bs-alert-bg: #cfe2ff;
+ --bs-alert-border-color: #b6d4fe;
+}
+
+.bodywebsite .alert-primary .alert-link {
+ color: #06357a;
+}
+
+.bodywebsite .alert-secondary {
+ --bs-alert-color: #41464b;
+ --bs-alert-bg: #e2e3e5;
+ --bs-alert-border-color: #d3d6d8;
+}
+
+.bodywebsite .alert-secondary .alert-link {
+ color: #34383c;
+}
+
+.bodywebsite .alert-success {
+ --bs-alert-color: #0f5132;
+ --bs-alert-bg: #d1e7dd;
+ --bs-alert-border-color: #badbcc;
+}
+
+.bodywebsite .alert-success .alert-link {
+ color: #0c4128;
+}
+
+.bodywebsite .alert-info {
+ --bs-alert-color: #055160;
+ --bs-alert-bg: #cff4fc;
+ --bs-alert-border-color: #b6effb;
+}
+
+.bodywebsite .alert-info .alert-link {
+ color: #04414d;
+}
+
+.bodywebsite .alert-warning {
+ --bs-alert-color: #664d03;
+ --bs-alert-bg: #fff3cd;
+ --bs-alert-border-color: #ffecb5;
+}
+
+.bodywebsite .alert-warning .alert-link {
+ color: #523e02;
+}
+
+.bodywebsite .alert-danger {
+ --bs-alert-color: #842029;
+ --bs-alert-bg: #f8d7da;
+ --bs-alert-border-color: #f5c2c7;
+}
+
+.bodywebsite .alert-danger .alert-link {
+ color: #6a1a21;
+}
+
+.bodywebsite .alert-light {
+ --bs-alert-color: #636464;
+ --bs-alert-bg: #fefefe;
+ --bs-alert-border-color: #fdfdfe;
+}
+
+.bodywebsite .alert-light .alert-link {
+ color: #4f5050;
+}
+
+.bodywebsite .alert-dark {
+ --bs-alert-color: #141619;
+ --bs-alert-bg: #d3d3d4;
+ --bs-alert-border-color: #bcbebf;
+}
+
+.bodywebsite .alert-dark .alert-link {
+ color: #101214;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+ 0% {
+ background-position-x: 1rem;
+ }
+}
+
+@keyframes progress-bar-stripes {
+ 0% {
+ background-position-x: 1rem;
+ }
+}
+
+.bodywebsite .progress {
+ --bs-progress-height: 1rem;
+ --bs-progress-font-size: 0.75rem;
+ --bs-progress-bg: #e9ecef;
+ --bs-progress-border-radius: 0.375rem;
+ --bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);
+ --bs-progress-bar-color: #fff;
+ --bs-progress-bar-bg: #0d6efd;
+ --bs-progress-bar-transition: width 0.6s ease;
+ display: flex;
+ height: var(--bs-progress-height);
+ overflow: hidden;
+ font-size: var(--bs-progress-font-size);
+ background-color: var(--bs-progress-bg);
+ border-radius: var(--bs-progress-border-radius);
+}
+
+.bodywebsite .progress-bar {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ overflow: hidden;
+ color: var(--bs-progress-bar-color);
+ text-align: center;
+ white-space: nowrap;
+ background-color: var(--bs-progress-bar-bg);
+ transition: var(--bs-progress-bar-transition);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .progress-bar {
+ transition: none;
+ }
+}
+
+.bodywebsite .progress-bar-striped {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-size: var(--bs-progress-height) var(--bs-progress-height);
+}
+
+.bodywebsite .progress-bar-animated {
+ -webkit-animation: 1s linear infinite progress-bar-stripes;
+ animation: 1s linear infinite progress-bar-stripes;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .progress-bar-animated {
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+
+.bodywebsite .list-group {
+ --bs-list-group-color: #212529;
+ --bs-list-group-bg: #fff;
+ --bs-list-group-border-color: rgba(0, 0, 0, 0.125);
+ --bs-list-group-border-width: 1px;
+ --bs-list-group-border-radius: 0.375rem;
+ --bs-list-group-item-padding-x: 1rem;
+ --bs-list-group-item-padding-y: 0.5rem;
+ --bs-list-group-action-color: #495057;
+ --bs-list-group-action-hover-color: #495057;
+ --bs-list-group-action-hover-bg: #f8f9fa;
+ --bs-list-group-action-active-color: #212529;
+ --bs-list-group-action-active-bg: #e9ecef;
+ --bs-list-group-disabled-color: #6c757d;
+ --bs-list-group-disabled-bg: #fff;
+ --bs-list-group-active-color: #fff;
+ --bs-list-group-active-bg: #0d6efd;
+ --bs-list-group-active-border-color: #0d6efd;
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ border-radius: var(--bs-list-group-border-radius);
+}
+
+.bodywebsite .list-group-numbered {
+ list-style-type: none;
+ counter-reset: section;
+}
+
+.bodywebsite .list-group-numbered > .list-group-item::before {
+ content: counters(section, ".") ". ";
+ counter-increment: section;
+}
+
+.bodywebsite .list-group-item-action {
+ width: 100%;
+ color: var(--bs-list-group-action-color);
+ text-align: inherit;
+}
+
+.bodywebsite .list-group-item-action:hover, .bodywebsite .list-group-item-action:focus {
+ z-index: 1;
+ color: var(--bs-list-group-action-hover-color);
+ text-decoration: none;
+ background-color: var(--bs-list-group-action-hover-bg);
+}
+
+.bodywebsite .list-group-item-action:active {
+ color: var(--bs-list-group-action-active-color);
+ background-color: var(--bs-list-group-action-active-bg);
+}
+
+.bodywebsite .list-group-item {
+ position: relative;
+ display: block;
+ padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);
+ color: var(--bs-list-group-color);
+ text-decoration: none;
+ background-color: var(--bs-list-group-bg);
+ border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color);
+}
+
+.bodywebsite .list-group-item:first-child {
+ border-top-left-radius: inherit;
+ border-top-right-radius: inherit;
+}
+
+.bodywebsite .list-group-item:last-child {
+ border-bottom-right-radius: inherit;
+ border-bottom-left-radius: inherit;
+}
+
+.bodywebsite .list-group-item.disabled, .bodywebsite .list-group-item:disabled {
+ color: var(--bs-list-group-disabled-color);
+ pointer-events: none;
+ background-color: var(--bs-list-group-disabled-bg);
+}
+
+.bodywebsite .list-group-item.active {
+ z-index: 2;
+ color: var(--bs-list-group-active-color);
+ background-color: var(--bs-list-group-active-bg);
+ border-color: var(--bs-list-group-active-border-color);
+}
+
+.bodywebsite .list-group-item + .list-group-item {
+ border-top-width: 0;
+}
+
+.bodywebsite .list-group-item + .list-group-item.active {
+ margin-top: calc(-1 * var(--bs-list-group-border-width));
+ border-top-width: var(--bs-list-group-border-width);
+}
+
+.bodywebsite .list-group-horizontal {
+ flex-direction: row;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item.active {
+ margin-top: 0;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .list-group-horizontal-sm {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .list-group-horizontal-md {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .list-group-horizontal-lg {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .list-group-horizontal-xl {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .list-group-horizontal-xxl {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+.bodywebsite .list-group-flush {
+ border-radius: 0;
+}
+
+.bodywebsite .list-group-flush > .list-group-item {
+ border-width: 0 0 var(--bs-list-group-border-width);
+}
+
+.bodywebsite .list-group-flush > .list-group-item:last-child {
+ border-bottom-width: 0;
+}
+
+.bodywebsite .list-group-item-primary {
+ color: #084298;
+ background-color: #cfe2ff;
+}
+
+.bodywebsite .list-group-item-primary.list-group-item-action:hover, .bodywebsite .list-group-item-primary.list-group-item-action:focus {
+ color: #084298;
+ background-color: #bacbe6;
+}
+
+.bodywebsite .list-group-item-primary.list-group-item-action.active {
+ color: #fff;
+ background-color: #084298;
+ border-color: #084298;
+}
+
+.bodywebsite .list-group-item-secondary {
+ color: #41464b;
+ background-color: #e2e3e5;
+}
+
+.bodywebsite .list-group-item-secondary.list-group-item-action:hover, .bodywebsite .list-group-item-secondary.list-group-item-action:focus {
+ color: #41464b;
+ background-color: #cbccce;
+}
+
+.bodywebsite .list-group-item-secondary.list-group-item-action.active {
+ color: #fff;
+ background-color: #41464b;
+ border-color: #41464b;
+}
+
+.bodywebsite .list-group-item-success {
+ color: #0f5132;
+ background-color: #d1e7dd;
+}
+
+.bodywebsite .list-group-item-success.list-group-item-action:hover, .bodywebsite .list-group-item-success.list-group-item-action:focus {
+ color: #0f5132;
+ background-color: #bcd0c7;
+}
+
+.bodywebsite .list-group-item-success.list-group-item-action.active {
+ color: #fff;
+ background-color: #0f5132;
+ border-color: #0f5132;
+}
+
+.bodywebsite .list-group-item-info {
+ color: #055160;
+ background-color: #cff4fc;
+}
+
+.bodywebsite .list-group-item-info.list-group-item-action:hover, .bodywebsite .list-group-item-info.list-group-item-action:focus {
+ color: #055160;
+ background-color: #badce3;
+}
+
+.bodywebsite .list-group-item-info.list-group-item-action.active {
+ color: #fff;
+ background-color: #055160;
+ border-color: #055160;
+}
+
+.bodywebsite .list-group-item-warning {
+ color: #664d03;
+ background-color: #fff3cd;
+}
+
+.bodywebsite .list-group-item-warning.list-group-item-action:hover, .bodywebsite .list-group-item-warning.list-group-item-action:focus {
+ color: #664d03;
+ background-color: #e6dbb9;
+}
+
+.bodywebsite .list-group-item-warning.list-group-item-action.active {
+ color: #fff;
+ background-color: #664d03;
+ border-color: #664d03;
+}
+
+.bodywebsite .list-group-item-danger {
+ color: #842029;
+ background-color: #f8d7da;
+}
+
+.bodywebsite .list-group-item-danger.list-group-item-action:hover, .bodywebsite .list-group-item-danger.list-group-item-action:focus {
+ color: #842029;
+ background-color: #dfc2c4;
+}
+
+.bodywebsite .list-group-item-danger.list-group-item-action.active {
+ color: #fff;
+ background-color: #842029;
+ border-color: #842029;
+}
+
+.bodywebsite .list-group-item-light {
+ color: #636464;
+ background-color: #fefefe;
+}
+
+.bodywebsite .list-group-item-light.list-group-item-action:hover, .bodywebsite .list-group-item-light.list-group-item-action:focus {
+ color: #636464;
+ background-color: #e5e5e5;
+}
+
+.bodywebsite .list-group-item-light.list-group-item-action.active {
+ color: #fff;
+ background-color: #636464;
+ border-color: #636464;
+}
+
+.bodywebsite .list-group-item-dark {
+ color: #141619;
+ background-color: #d3d3d4;
+}
+
+.bodywebsite .list-group-item-dark.list-group-item-action:hover, .bodywebsite .list-group-item-dark.list-group-item-action:focus {
+ color: #141619;
+ background-color: #bebebf;
+}
+
+.bodywebsite .list-group-item-dark.list-group-item-action.active {
+ color: #fff;
+ background-color: #141619;
+ border-color: #141619;
+}
+
+.bodywebsite .btn-close {
+ box-sizing: content-box;
+ width: 1em;
+ height: 1em;
+ padding: 0.25em 0.25em;
+ color: #000;
+ background: transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;
+ border: 0;
+ border-radius: 0.375rem;
+ opacity: 0.5;
+}
+
+.bodywebsite .btn-close:hover {
+ color: #000;
+ text-decoration: none;
+ opacity: 0.75;
+}
+
+.bodywebsite .btn-close:focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+ opacity: 1;
+}
+
+.bodywebsite .btn-close:disabled, .bodywebsite .btn-close.disabled {
+ pointer-events: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ opacity: 0.25;
+}
+
+.bodywebsite .btn-close-white {
+ filter: invert(1) grayscale(100%) brightness(200%);
+}
+
+.bodywebsite .toast {
+ --bs-toast-zindex: 1090;
+ --bs-toast-padding-x: 0.75rem;
+ --bs-toast-padding-y: 0.5rem;
+ --bs-toast-spacing: 1.5rem;
+ --bs-toast-max-width: 350px;
+ --bs-toast-font-size: 0.875rem;
+ --bs-toast-bg: rgba(255, 255, 255, 0.85);
+ --bs-toast-border-width: 1px;
+ --bs-toast-border-color: var(--bs-border-color-translucent);
+ --bs-toast-border-radius: 0.375rem;
+ --bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ --bs-toast-header-color: #6c757d;
+ --bs-toast-header-bg: rgba(255, 255, 255, 0.85);
+ --bs-toast-header-border-color: rgba(0, 0, 0, 0.05);
+ width: var(--bs-toast-max-width);
+ max-width: 100%;
+ font-size: var(--bs-toast-font-size);
+ color: var(--bs-toast-color);
+ pointer-events: auto;
+ background-color: var(--bs-toast-bg);
+ background-clip: padding-box;
+ border: var(--bs-toast-border-width) solid var(--bs-toast-border-color);
+ box-shadow: var(--bs-toast-box-shadow);
+ border-radius: var(--bs-toast-border-radius);
+}
+
+.bodywebsite .toast.showing {
+ opacity: 0;
+}
+
+.bodywebsite .toast:not(.show) {
+ display: none;
+}
+
+.bodywebsite .toast-container {
+ position: absolute;
+ z-index: var(--bs-toast-zindex);
+ width: -webkit-max-content;
+ width: -moz-max-content;
+ width: max-content;
+ max-width: 100%;
+ pointer-events: none;
+}
+
+.bodywebsite .toast-container > :not(:last-child) {
+ margin-bottom: var(--bs-toast-spacing);
+}
+
+.bodywebsite .toast-header {
+ display: flex;
+ align-items: center;
+ padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x);
+ color: var(--bs-toast-header-color);
+ background-color: var(--bs-toast-header-bg);
+ background-clip: padding-box;
+ border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);
+ border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));
+ border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));
+}
+
+.bodywebsite .toast-header .btn-close {
+ margin-right: calc(-0.5 * var(--bs-toast-padding-x));
+ margin-left: var(--bs-toast-padding-x);
+}
+
+.bodywebsite .toast-body {
+ padding: var(--bs-toast-padding-x);
+ word-wrap: break-word;
+}
+
+.bodywebsite .modal {
+ --bs-modal-zindex: 1055;
+ --bs-modal-width: 500px;
+ --bs-modal-padding: 1rem;
+ --bs-modal-margin: 0.5rem;
+ --bs-modal-bg: #fff;
+ --bs-modal-border-color: var(--bs-border-color-translucent);
+ --bs-modal-border-width: 1px;
+ --bs-modal-border-radius: 0.5rem;
+ --bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
+ --bs-modal-inner-border-radius: calc(0.5rem - 1px);
+ --bs-modal-header-padding-x: 1rem;
+ --bs-modal-header-padding-y: 1rem;
+ --bs-modal-header-padding: 1rem 1rem;
+ --bs-modal-header-border-color: var(--bs-border-color);
+ --bs-modal-header-border-width: 1px;
+ --bs-modal-title-line-height: 1.5;
+ --bs-modal-footer-gap: 0.5rem;
+ --bs-modal-footer-border-color: var(--bs-border-color);
+ --bs-modal-footer-border-width: 1px;
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: var(--bs-modal-zindex);
+ display: none;
+ width: 100%;
+ height: 100%;
+ overflow-x: hidden;
+ overflow-y: auto;
+ outline: 0;
+}
+
+.bodywebsite .modal-dialog {
+ position: relative;
+ width: auto;
+ margin: var(--bs-modal-margin);
+ pointer-events: none;
+}
+
+.bodywebsite .modal.fade .modal-dialog {
+ transition: transform 0.3s ease-out;
+ transform: translate(0, -50px);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .modal.fade .modal-dialog {
+ transition: none;
+ }
+}
+
+.bodywebsite .modal.show .modal-dialog {
+ transform: none;
+}
+
+.bodywebsite .modal.modal-static .modal-dialog {
+ transform: scale(1.02);
+}
+
+.bodywebsite .modal-dialog-scrollable {
+ height: calc(100% - var(--bs-modal-margin) * 2);
+}
+
+.bodywebsite .modal-dialog-scrollable .modal-content {
+ max-height: 100%;
+ overflow: hidden;
+}
+
+.bodywebsite .modal-dialog-scrollable .modal-body {
+ overflow-y: auto;
+}
+
+.bodywebsite .modal-dialog-centered {
+ display: flex;
+ align-items: center;
+ min-height: calc(100% - var(--bs-modal-margin) * 2);
+}
+
+.bodywebsite .modal-content {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ color: var(--bs-modal-color);
+ pointer-events: auto;
+ background-color: var(--bs-modal-bg);
+ background-clip: padding-box;
+ border: var(--bs-modal-border-width) solid var(--bs-modal-border-color);
+ border-radius: var(--bs-modal-border-radius);
+ outline: 0;
+}
+
+.bodywebsite .modal-backdrop {
+ --bs-backdrop-zindex: 1050;
+ --bs-backdrop-bg: #000;
+ --bs-backdrop-opacity: 0.5;
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: var(--bs-backdrop-zindex);
+ width: 100vw;
+ height: 100vh;
+ background-color: var(--bs-backdrop-bg);
+}
+
+.bodywebsite .modal-backdrop.fade {
+ opacity: 0;
+}
+
+.bodywebsite .modal-backdrop.show {
+ opacity: var(--bs-backdrop-opacity);
+}
+
+.bodywebsite .modal-header {
+ display: flex;
+ flex-shrink: 0;
+ align-items: center;
+ justify-content: space-between;
+ padding: var(--bs-modal-header-padding);
+ border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);
+ border-top-left-radius: var(--bs-modal-inner-border-radius);
+ border-top-right-radius: var(--bs-modal-inner-border-radius);
+}
+
+.bodywebsite .modal-header .btn-close {
+ padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5);
+ margin: calc(-0.5 * var(--bs-modal-header-padding-y)) calc(-0.5 * var(--bs-modal-header-padding-x)) calc(-0.5 * var(--bs-modal-header-padding-y)) auto;
+}
+
+.bodywebsite .modal-title {
+ margin-bottom: 0;
+ line-height: var(--bs-modal-title-line-height);
+}
+
+.bodywebsite .modal-body {
+ position: relative;
+ flex: 1 1 auto;
+ padding: var(--bs-modal-padding);
+}
+
+.bodywebsite .modal-footer {
+ display: flex;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: flex-end;
+ padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5);
+ background-color: var(--bs-modal-footer-bg);
+ border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);
+ border-bottom-right-radius: var(--bs-modal-inner-border-radius);
+ border-bottom-left-radius: var(--bs-modal-inner-border-radius);
+}
+
+.bodywebsite .modal-footer > * {
+ margin: calc(var(--bs-modal-footer-gap) * 0.5);
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .modal {
+ --bs-modal-margin: 1.75rem;
+ --bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ }
+
+ .bodywebsite .modal-dialog {
+ max-width: var(--bs-modal-width);
+ margin-right: auto;
+ margin-left: auto;
+ }
+
+ .bodywebsite .modal-sm {
+ --bs-modal-width: 300px;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .modal-lg,
+ .bodywebsite .modal-xl {
+ --bs-modal-width: 800px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .modal-xl {
+ --bs-modal-width: 1140px;
+ }
+}
+
+.bodywebsite .modal-fullscreen {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+}
+
+.bodywebsite .modal-fullscreen .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+}
+
+.bodywebsite .modal-fullscreen .modal-header,
+ .bodywebsite .modal-fullscreen .modal-footer {
+ border-radius: 0;
+}
+
+.bodywebsite .modal-fullscreen .modal-body {
+ overflow-y: auto;
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .modal-fullscreen-sm-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-sm-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-sm-down .modal-header,
+ .bodywebsite .modal-fullscreen-sm-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-sm-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .modal-fullscreen-md-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-md-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-md-down .modal-header,
+ .bodywebsite .modal-fullscreen-md-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-md-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .modal-fullscreen-lg-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-lg-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-lg-down .modal-header,
+ .bodywebsite .modal-fullscreen-lg-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-lg-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .modal-fullscreen-xl-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xl-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xl-down .modal-header,
+ .bodywebsite .modal-fullscreen-xl-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xl-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .modal-fullscreen-xxl-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xxl-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xxl-down .modal-header,
+ .bodywebsite .modal-fullscreen-xxl-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xxl-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+.bodywebsite .tooltip {
+ --bs-tooltip-zindex: 1080;
+ --bs-tooltip-max-width: 200px;
+ --bs-tooltip-padding-x: 0.5rem;
+ --bs-tooltip-padding-y: 0.25rem;
+ --bs-tooltip-font-size: 0.875rem;
+ --bs-tooltip-color: #fff;
+ --bs-tooltip-bg: #000;
+ --bs-tooltip-border-radius: 0.375rem;
+ --bs-tooltip-opacity: 0.9;
+ --bs-tooltip-arrow-width: 0.8rem;
+ --bs-tooltip-arrow-height: 0.4rem;
+ z-index: var(--bs-tooltip-zindex);
+ display: block;
+ padding: var(--bs-tooltip-arrow-height);
+ margin: var(--bs-tooltip-margin);
+ font-family: var(--bs-font-sans-serif);
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.5;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ white-space: normal;
+ word-spacing: normal;
+ line-break: auto;
+ font-size: var(--bs-tooltip-font-size);
+ word-wrap: break-word;
+ opacity: 0;
+}
+
+.bodywebsite .tooltip.show {
+ opacity: var(--bs-tooltip-opacity);
+}
+
+.bodywebsite .tooltip .tooltip-arrow {
+ display: block;
+ width: var(--bs-tooltip-arrow-width);
+ height: var(--bs-tooltip-arrow-height);
+}
+
+.bodywebsite .tooltip .tooltip-arrow::before {
+ position: absolute;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+}
+
+.bodywebsite .bs-tooltip-top .tooltip-arrow, .bodywebsite .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {
+ bottom: 0;
+}
+
+.bodywebsite .bs-tooltip-top .tooltip-arrow::before, .bodywebsite .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {
+ top: -1px;
+ border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;
+ border-top-color: var(--bs-tooltip-bg);
+}
+
+.bodywebsite .bs-tooltip-end .tooltip-arrow, .bodywebsite .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {
+ left: 0;
+ width: var(--bs-tooltip-arrow-height);
+ height: var(--bs-tooltip-arrow-width);
+}
+
+.bodywebsite .bs-tooltip-end .tooltip-arrow::before, .bodywebsite .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {
+ right: -1px;
+ border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;
+ border-right-color: var(--bs-tooltip-bg);
+}
+
+.bodywebsite .bs-tooltip-bottom .tooltip-arrow, .bodywebsite .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {
+ top: 0;
+}
+
+.bodywebsite .bs-tooltip-bottom .tooltip-arrow::before, .bodywebsite .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {
+ bottom: -1px;
+ border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);
+ border-bottom-color: var(--bs-tooltip-bg);
+}
+
+.bodywebsite .bs-tooltip-start .tooltip-arrow, .bodywebsite .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {
+ right: 0;
+ width: var(--bs-tooltip-arrow-height);
+ height: var(--bs-tooltip-arrow-width);
+}
+
+.bodywebsite .bs-tooltip-start .tooltip-arrow::before, .bodywebsite .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {
+ left: -1px;
+ border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);
+ border-left-color: var(--bs-tooltip-bg);
+}
+
+.bodywebsite .tooltip-inner {
+ max-width: var(--bs-tooltip-max-width);
+ padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);
+ color: var(--bs-tooltip-color);
+ text-align: center;
+ background-color: var(--bs-tooltip-bg);
+ border-radius: var(--bs-tooltip-border-radius);
+}
+
+.bodywebsite .popover {
+ --bs-popover-zindex: 1070;
+ --bs-popover-max-width: 276px;
+ --bs-popover-font-size: 0.875rem;
+ --bs-popover-bg: #fff;
+ --bs-popover-border-width: 1px;
+ --bs-popover-border-color: var(--bs-border-color-translucent);
+ --bs-popover-border-radius: 0.5rem;
+ --bs-popover-inner-border-radius: calc(0.5rem - 1px);
+ --bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ --bs-popover-header-padding-x: 1rem;
+ --bs-popover-header-padding-y: 0.5rem;
+ --bs-popover-header-font-size: 1rem;
+ --bs-popover-header-bg: #f0f0f0;
+ --bs-popover-body-padding-x: 1rem;
+ --bs-popover-body-padding-y: 1rem;
+ --bs-popover-body-color: #212529;
+ --bs-popover-arrow-width: 1rem;
+ --bs-popover-arrow-height: 0.5rem;
+ --bs-popover-arrow-border: var(--bs-popover-border-color);
+ z-index: var(--bs-popover-zindex);
+ display: block;
+ max-width: var(--bs-popover-max-width);
+ font-family: var(--bs-font-sans-serif);
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.5;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ white-space: normal;
+ word-spacing: normal;
+ line-break: auto;
+ font-size: var(--bs-popover-font-size);
+ word-wrap: break-word;
+ background-color: var(--bs-popover-bg);
+ background-clip: padding-box;
+ border: var(--bs-popover-border-width) solid var(--bs-popover-border-color);
+ border-radius: var(--bs-popover-border-radius);
+}
+
+.bodywebsite .popover .popover-arrow {
+ display: block;
+ width: var(--bs-popover-arrow-width);
+ height: var(--bs-popover-arrow-height);
+}
+
+.bodywebsite .popover .popover-arrow::before, .bodywebsite .popover .popover-arrow::after {
+ position: absolute;
+ display: block;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+ border-width: 0;
+}
+
+.bodywebsite .bs-popover-top > .popover-arrow, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {
+ bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+}
+
+.bodywebsite .bs-popover-top > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bodywebsite .bs-popover-top > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {
+ border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;
+}
+
+.bodywebsite .bs-popover-top > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {
+ bottom: 0;
+ border-top-color: var(--bs-popover-arrow-border);
+}
+
+.bodywebsite .bs-popover-top > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {
+ bottom: var(--bs-popover-border-width);
+ border-top-color: var(--bs-popover-bg);
+}
+
+.bodywebsite .bs-popover-end > .popover-arrow, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {
+ left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+ width: var(--bs-popover-arrow-height);
+ height: var(--bs-popover-arrow-width);
+}
+
+.bodywebsite .bs-popover-end > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bodywebsite .bs-popover-end > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {
+ border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;
+}
+
+.bodywebsite .bs-popover-end > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {
+ left: 0;
+ border-right-color: var(--bs-popover-arrow-border);
+}
+
+.bodywebsite .bs-popover-end > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {
+ left: var(--bs-popover-border-width);
+ border-right-color: var(--bs-popover-bg);
+}
+
+.bodywebsite .bs-popover-bottom > .popover-arrow, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {
+ top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+}
+
+.bodywebsite .bs-popover-bottom > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bodywebsite .bs-popover-bottom > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {
+ border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);
+}
+
+.bodywebsite .bs-popover-bottom > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {
+ top: 0;
+ border-bottom-color: var(--bs-popover-arrow-border);
+}
+
+.bodywebsite .bs-popover-bottom > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {
+ top: var(--bs-popover-border-width);
+ border-bottom-color: var(--bs-popover-bg);
+}
+
+.bodywebsite .bs-popover-bottom .popover-header::before, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ display: block;
+ width: var(--bs-popover-arrow-width);
+ margin-left: calc(-0.5 * var(--bs-popover-arrow-width));
+ content: "";
+ border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg);
+}
+
+.bodywebsite .bs-popover-start > .popover-arrow, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {
+ right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+ width: var(--bs-popover-arrow-height);
+ height: var(--bs-popover-arrow-width);
+}
+
+.bodywebsite .bs-popover-start > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bodywebsite .bs-popover-start > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {
+ border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);
+}
+
+.bodywebsite .bs-popover-start > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {
+ right: 0;
+ border-left-color: var(--bs-popover-arrow-border);
+}
+
+.bodywebsite .bs-popover-start > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {
+ right: var(--bs-popover-border-width);
+ border-left-color: var(--bs-popover-bg);
+}
+
+.bodywebsite .popover-header {
+ padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);
+ margin-bottom: 0;
+ font-size: var(--bs-popover-header-font-size);
+ color: var(--bs-popover-header-color);
+ background-color: var(--bs-popover-header-bg);
+ border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color);
+ border-top-left-radius: var(--bs-popover-inner-border-radius);
+ border-top-right-radius: var(--bs-popover-inner-border-radius);
+}
+
+.bodywebsite .popover-header:empty {
+ display: none;
+}
+
+.bodywebsite .popover-body {
+ padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);
+ color: var(--bs-popover-body-color);
+}
+
+.bodywebsite .carousel {
+ position: relative;
+}
+
+.bodywebsite .carousel.pointer-event {
+ touch-action: pan-y;
+}
+
+.bodywebsite .carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden;
+}
+
+.bodywebsite .carousel-inner::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+
+.bodywebsite .carousel-item {
+ position: relative;
+ display: none;
+ float: left;
+ width: 100%;
+ margin-right: -100%;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ transition: transform 0.6s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .carousel-item {
+ transition: none;
+ }
+}
+
+.bodywebsite .carousel-item.active,
+ .bodywebsite .carousel-item-next,
+ .bodywebsite .carousel-item-prev {
+ display: block;
+}
+
+.bodywebsite .carousel-item-next:not(.carousel-item-start),
+ .bodywebsite .active.carousel-item-end {
+ transform: translateX(100%);
+}
+
+.bodywebsite .carousel-item-prev:not(.carousel-item-end),
+ .bodywebsite .active.carousel-item-start {
+ transform: translateX(-100%);
+}
+
+.bodywebsite .carousel-fade .carousel-item {
+ opacity: 0;
+ transition-property: opacity;
+ transform: none;
+}
+
+.bodywebsite .carousel-fade .carousel-item.active,
+ .bodywebsite .carousel-fade .carousel-item-next.carousel-item-start,
+ .bodywebsite .carousel-fade .carousel-item-prev.carousel-item-end {
+ z-index: 1;
+ opacity: 1;
+}
+
+.bodywebsite .carousel-fade .active.carousel-item-start,
+ .bodywebsite .carousel-fade .active.carousel-item-end {
+ z-index: 0;
+ opacity: 0;
+ transition: opacity 0s 0.6s;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .carousel-fade .active.carousel-item-start,
+ .bodywebsite .carousel-fade .active.carousel-item-end {
+ transition: none;
+ }
+}
+
+.bodywebsite .carousel-control-prev,
+ .bodywebsite .carousel-control-next {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 15%;
+ padding: 0;
+ color: #fff;
+ text-align: center;
+ background: none;
+ border: 0;
+ opacity: 0.5;
+ transition: opacity 0.15s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .carousel-control-prev,
+ .bodywebsite .carousel-control-next {
+ transition: none;
+ }
+}
+
+.bodywebsite .carousel-control-prev:hover, .bodywebsite .carousel-control-prev:focus,
+ .bodywebsite .carousel-control-next:hover,
+ .bodywebsite .carousel-control-next:focus {
+ color: #fff;
+ text-decoration: none;
+ outline: 0;
+ opacity: 0.9;
+}
+
+.bodywebsite .carousel-control-prev {
+ left: 0;
+}
+
+.bodywebsite .carousel-control-next {
+ right: 0;
+}
+
+.bodywebsite .carousel-control-prev-icon,
+ .bodywebsite .carousel-control-next-icon {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ background-repeat: no-repeat;
+ background-position: 50%;
+ background-size: 100% 100%;
+}
+
+.bodywebsite .carousel-control-prev-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .carousel-control-next-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .carousel-indicators {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 2;
+ display: flex;
+ justify-content: center;
+ padding: 0;
+ margin-right: 15%;
+ margin-bottom: 1rem;
+ margin-left: 15%;
+ list-style: none;
+}
+
+.bodywebsite .carousel-indicators [data-bs-target] {
+ box-sizing: content-box;
+ flex: 0 1 auto;
+ width: 30px;
+ height: 3px;
+ padding: 0;
+ margin-right: 3px;
+ margin-left: 3px;
+ text-indent: -999px;
+ cursor: pointer;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 0;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ opacity: 0.5;
+ transition: opacity 0.6s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .carousel-indicators [data-bs-target] {
+ transition: none;
+ }
+}
+
+.bodywebsite .carousel-indicators .active {
+ opacity: 1;
+}
+
+.bodywebsite .carousel-caption {
+ position: absolute;
+ right: 15%;
+ bottom: 1.25rem;
+ left: 15%;
+ padding-top: 1.25rem;
+ padding-bottom: 1.25rem;
+ color: #fff;
+ text-align: center;
+}
+
+.bodywebsite .carousel-dark .carousel-control-prev-icon,
+ .bodywebsite .carousel-dark .carousel-control-next-icon {
+ filter: invert(1) grayscale(100);
+}
+
+.bodywebsite .carousel-dark .carousel-indicators [data-bs-target] {
+ background-color: #000;
+}
+
+.bodywebsite .carousel-dark .carousel-caption {
+ color: #000;
+}
+
+.bodywebsite .spinner-grow,
+ .bodywebsite .spinner-border {
+ display: inline-block;
+ width: var(--bs-spinner-width);
+ height: var(--bs-spinner-height);
+ vertical-align: var(--bs-spinner-vertical-align);
+ border-radius: 50%;
+ -webkit-animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);
+ animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);
+}
+
+@-webkit-keyframes spinner-border {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes spinner-border {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+.bodywebsite .spinner-border {
+ --bs-spinner-width: 2rem;
+ --bs-spinner-height: 2rem;
+ --bs-spinner-vertical-align: -0.125em;
+ --bs-spinner-border-width: 0.25em;
+ --bs-spinner-animation-speed: 0.75s;
+ --bs-spinner-animation-name: spinner-border;
+ border: var(--bs-spinner-border-width) solid currentcolor;
+ border-right-color: transparent;
+}
+
+.bodywebsite .spinner-border-sm {
+ --bs-spinner-width: 1rem;
+ --bs-spinner-height: 1rem;
+ --bs-spinner-border-width: 0.2em;
+}
+
+@-webkit-keyframes spinner-grow {
+ 0% {
+ transform: scale(0);
+ }
+
+ 50% {
+ opacity: 1;
+ transform: none;
+ }
+}
+
+@keyframes spinner-grow {
+ 0% {
+ transform: scale(0);
+ }
+
+ 50% {
+ opacity: 1;
+ transform: none;
+ }
+}
+
+.bodywebsite .spinner-grow {
+ --bs-spinner-width: 2rem;
+ --bs-spinner-height: 2rem;
+ --bs-spinner-vertical-align: -0.125em;
+ --bs-spinner-animation-speed: 0.75s;
+ --bs-spinner-animation-name: spinner-grow;
+ background-color: currentcolor;
+ opacity: 0;
+}
+
+.bodywebsite .spinner-grow-sm {
+ --bs-spinner-width: 1rem;
+ --bs-spinner-height: 1rem;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .spinner-border,
+ .bodywebsite .spinner-grow {
+ --bs-spinner-animation-speed: 1.5s;
+ }
+}
+
+.bodywebsite .offcanvas, .bodywebsite .offcanvas-xxl, .bodywebsite .offcanvas-xl, .bodywebsite .offcanvas-lg, .bodywebsite .offcanvas-md, .bodywebsite .offcanvas-sm {
+ --bs-offcanvas-zindex: 1045;
+ --bs-offcanvas-width: 400px;
+ --bs-offcanvas-height: 30vh;
+ --bs-offcanvas-padding-x: 1rem;
+ --bs-offcanvas-padding-y: 1rem;
+ --bs-offcanvas-bg: #fff;
+ --bs-offcanvas-border-width: 1px;
+ --bs-offcanvas-border-color: var(--bs-border-color-translucent);
+ --bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-sm {
+ transition: none;
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.showing, .bodywebsite .offcanvas-sm.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.showing, .bodywebsite .offcanvas-sm.hiding, .bodywebsite .offcanvas-sm.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .offcanvas-sm {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-sm .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-sm .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-md {
+ transition: none;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.showing, .bodywebsite .offcanvas-md.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.showing, .bodywebsite .offcanvas-md.hiding, .bodywebsite .offcanvas-md.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .offcanvas-md {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-md .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-md .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-lg {
+ transition: none;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.showing, .bodywebsite .offcanvas-lg.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.showing, .bodywebsite .offcanvas-lg.hiding, .bodywebsite .offcanvas-lg.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .offcanvas-lg {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-lg .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-lg .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-xl {
+ transition: none;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.showing, .bodywebsite .offcanvas-xl.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.showing, .bodywebsite .offcanvas-xl.hiding, .bodywebsite .offcanvas-xl.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .offcanvas-xl {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-xl .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-xl .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-xxl {
+ transition: none;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.showing, .bodywebsite .offcanvas-xxl.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.showing, .bodywebsite .offcanvas-xxl.hiding, .bodywebsite .offcanvas-xxl.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .offcanvas-xxl {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-xxl .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-xxl .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+.bodywebsite .offcanvas {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas {
+ transition: none;
+ }
+}
+
+.bodywebsite .offcanvas.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+}
+
+.bodywebsite .offcanvas.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+}
+
+.bodywebsite .offcanvas.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+}
+
+.bodywebsite .offcanvas.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+}
+
+.bodywebsite .offcanvas.showing, .bodywebsite .offcanvas.show:not(.hiding) {
+ transform: none;
+}
+
+.bodywebsite .offcanvas.showing, .bodywebsite .offcanvas.hiding, .bodywebsite .offcanvas.show {
+ visibility: visible;
+}
+
+.bodywebsite .offcanvas-backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1040;
+ width: 100vw;
+ height: 100vh;
+ background-color: #000;
+}
+
+.bodywebsite .offcanvas-backdrop.fade {
+ opacity: 0;
+}
+
+.bodywebsite .offcanvas-backdrop.show {
+ opacity: 0.5;
+}
+
+.bodywebsite .offcanvas-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);
+}
+
+.bodywebsite .offcanvas-header .btn-close {
+ padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5);
+ margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y));
+ margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x));
+ margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y));
+}
+
+.bodywebsite .offcanvas-title {
+ margin-bottom: 0;
+ line-height: 1.5;
+}
+
+.bodywebsite .offcanvas-body {
+ flex-grow: 1;
+ padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);
+ overflow-y: auto;
+}
+
+.bodywebsite .placeholder {
+ display: inline-block;
+ min-height: 1em;
+ vertical-align: middle;
+ cursor: wait;
+ background-color: currentcolor;
+ opacity: 0.5;
+}
+
+.bodywebsite .placeholder.btn::before {
+ display: inline-block;
+ content: "";
+}
+
+.bodywebsite .placeholder-xs {
+ min-height: 0.6em;
+}
+
+.bodywebsite .placeholder-sm {
+ min-height: 0.8em;
+}
+
+.bodywebsite .placeholder-lg {
+ min-height: 1.2em;
+}
+
+.bodywebsite .placeholder-glow .placeholder {
+ -webkit-animation: placeholder-glow 2s ease-in-out infinite;
+ animation: placeholder-glow 2s ease-in-out infinite;
+}
+
+@-webkit-keyframes placeholder-glow {
+ 50% {
+ opacity: 0.2;
+ }
+}
+
+@keyframes placeholder-glow {
+ 50% {
+ opacity: 0.2;
+ }
+}
+
+.bodywebsite .placeholder-wave {
+ -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);
+ mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);
+ -webkit-mask-size: 200% 100%;
+ mask-size: 200% 100%;
+ -webkit-animation: placeholder-wave 2s linear infinite;
+ animation: placeholder-wave 2s linear infinite;
+}
+
+@-webkit-keyframes placeholder-wave {
+ 100% {
+ -webkit-mask-position: -200% 0%;
+ mask-position: -200% 0%;
+ }
+}
+
+@keyframes placeholder-wave {
+ 100% {
+ -webkit-mask-position: -200% 0%;
+ mask-position: -200% 0%;
+ }
+}
+
+.bodywebsite .clearfix::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+
+.bodywebsite .text-bg-primary {
+ color: #fff !important;
+ background-color: RGBA(13, 110, 253, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-secondary {
+ color: #fff !important;
+ background-color: RGBA(108, 117, 125, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-success {
+ color: #fff !important;
+ background-color: RGBA(25, 135, 84, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-info {
+ color: #000 !important;
+ background-color: RGBA(13, 202, 240, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-warning {
+ color: #000 !important;
+ background-color: RGBA(255, 193, 7, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-danger {
+ color: #fff !important;
+ background-color: RGBA(220, 53, 69, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-light {
+ color: #000 !important;
+ background-color: RGBA(248, 249, 250, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-dark {
+ color: #fff !important;
+ background-color: RGBA(33, 37, 41, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .link-primary {
+ color: #0d6efd !important;
+}
+
+.bodywebsite .link-primary:hover, .bodywebsite .link-primary:focus {
+ color: #0a58ca !important;
+}
+
+.bodywebsite .link-secondary {
+ color: #6c757d !important;
+}
+
+.bodywebsite .link-secondary:hover, .bodywebsite .link-secondary:focus {
+ color: #565e64 !important;
+}
+
+.bodywebsite .link-success {
+ color: #198754 !important;
+}
+
+.bodywebsite .link-success:hover, .bodywebsite .link-success:focus {
+ color: #146c43 !important;
+}
+
+.bodywebsite .link-info {
+ color: #0dcaf0 !important;
+}
+
+.bodywebsite .link-info:hover, .bodywebsite .link-info:focus {
+ color: #3dd5f3 !important;
+}
+
+.bodywebsite .link-warning {
+ color: #ffc107 !important;
+}
+
+.bodywebsite .link-warning:hover, .bodywebsite .link-warning:focus {
+ color: #ffcd39 !important;
+}
+
+.bodywebsite .link-danger {
+ color: #dc3545 !important;
+}
+
+.bodywebsite .link-danger:hover, .bodywebsite .link-danger:focus {
+ color: #b02a37 !important;
+}
+
+.bodywebsite .link-light {
+ color: #f8f9fa !important;
+}
+
+.bodywebsite .link-light:hover, .bodywebsite .link-light:focus {
+ color: #f9fafb !important;
+}
+
+.bodywebsite .link-dark {
+ color: #212529 !important;
+}
+
+.bodywebsite .link-dark:hover, .bodywebsite .link-dark:focus {
+ color: #1a1e21 !important;
+}
+
+.bodywebsite .ratio {
+ position: relative;
+ width: 100%;
+}
+
+.bodywebsite .ratio::before {
+ display: block;
+ padding-top: var(--bs-aspect-ratio);
+ content: "";
+}
+
+.bodywebsite .ratio > * {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+
+.bodywebsite .ratio-1x1 {
+ --bs-aspect-ratio: 100%;
+}
+
+.bodywebsite .ratio-4x3 {
+ --bs-aspect-ratio: 75%;
+}
+
+.bodywebsite .ratio-16x9 {
+ --bs-aspect-ratio: 56.25%;
+}
+
+.bodywebsite .ratio-21x9 {
+ --bs-aspect-ratio: 42.8571428571%;
+}
+
+.bodywebsite .fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1030;
+}
+
+.bodywebsite .fixed-bottom {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1030;
+}
+
+.bodywebsite .sticky-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+}
+
+.bodywebsite .sticky-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .sticky-sm-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-sm-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .sticky-md-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-md-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .sticky-lg-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-lg-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .sticky-xl-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-xl-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .sticky-xxl-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-xxl-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+.bodywebsite .hstack {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ align-self: stretch;
+}
+
+.bodywebsite .vstack {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ align-self: stretch;
+}
+
+.bodywebsite .visually-hidden,
+ .bodywebsite .visually-hidden-focusable:not(:focus):not(:focus-within) {
+ position: absolute !important;
+ width: 1px !important;
+ height: 1px !important;
+ padding: 0 !important;
+ margin: -1px !important;
+ overflow: hidden !important;
+ clip: rect(0, 0, 0, 0) !important;
+ white-space: nowrap !important;
+ border: 0 !important;
+}
+
+.bodywebsite .stretched-link::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1;
+ content: "";
+}
+
+.bodywebsite .text-truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.bodywebsite .vr {
+ display: inline-block;
+ align-self: stretch;
+ width: 1px;
+ min-height: 1em;
+ background-color: currentcolor;
+ opacity: 0.25;
+}
+
+.bodywebsite .align-baseline {
+ vertical-align: baseline !important;
+}
+
+.bodywebsite .align-top {
+ vertical-align: top !important;
+}
+
+.bodywebsite .align-middle {
+ vertical-align: middle !important;
+}
+
+.bodywebsite .align-bottom {
+ vertical-align: bottom !important;
+}
+
+.bodywebsite .align-text-bottom {
+ vertical-align: text-bottom !important;
+}
+
+.bodywebsite .align-text-top {
+ vertical-align: text-top !important;
+}
+
+.bodywebsite .float-start {
+ float: left !important;
+}
+
+.bodywebsite .float-end {
+ float: right !important;
+}
+
+.bodywebsite .float-none {
+ float: none !important;
+}
+
+.bodywebsite .opacity-0 {
+ opacity: 0 !important;
+}
+
+.bodywebsite .opacity-25 {
+ opacity: 0.25 !important;
+}
+
+.bodywebsite .opacity-50 {
+ opacity: 0.5 !important;
+}
+
+.bodywebsite .opacity-75 {
+ opacity: 0.75 !important;
+}
+
+.bodywebsite .opacity-100 {
+ opacity: 1 !important;
+}
+
+.bodywebsite .overflow-auto {
+ overflow: auto !important;
+}
+
+.bodywebsite .overflow-hidden {
+ overflow: hidden !important;
+}
+
+.bodywebsite .overflow-visible {
+ overflow: visible !important;
+}
+
+.bodywebsite .overflow-scroll {
+ overflow: scroll !important;
+}
+
+.bodywebsite .d-inline {
+ display: inline !important;
+}
+
+.bodywebsite .d-inline-block {
+ display: inline-block !important;
+}
+
+.bodywebsite .d-block {
+ display: block !important;
+}
+
+.bodywebsite .d-grid {
+ display: grid !important;
+}
+
+.bodywebsite .d-table {
+ display: table !important;
+}
+
+.bodywebsite .d-table-row {
+ display: table-row !important;
+}
+
+.bodywebsite .d-table-cell {
+ display: table-cell !important;
+}
+
+.bodywebsite .d-flex {
+ display: flex !important;
+}
+
+.bodywebsite .d-inline-flex {
+ display: inline-flex !important;
+}
+
+.bodywebsite .d-none {
+ display: none !important;
+}
+
+.bodywebsite .shadow {
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
+}
+
+.bodywebsite .shadow-sm {
+ box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
+}
+
+.bodywebsite .shadow-lg {
+ box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;
+}
+
+.bodywebsite .shadow-none {
+ box-shadow: none !important;
+}
+
+.bodywebsite .position-static {
+ position: static !important;
+}
+
+.bodywebsite .position-relative {
+ position: relative !important;
+}
+
+.bodywebsite .position-absolute {
+ position: absolute !important;
+}
+
+.bodywebsite .position-fixed {
+ position: fixed !important;
+}
+
+.bodywebsite .position-sticky {
+ position: -webkit-sticky !important;
+ position: sticky !important;
+}
+
+.bodywebsite .top-0 {
+ top: 0 !important;
+}
+
+.bodywebsite .top-50 {
+ top: 50% !important;
+}
+
+.bodywebsite .top-100 {
+ top: 100% !important;
+}
+
+.bodywebsite .bottom-0 {
+ bottom: 0 !important;
+}
+
+.bodywebsite .bottom-50 {
+ bottom: 50% !important;
+}
+
+.bodywebsite .bottom-100 {
+ bottom: 100% !important;
+}
+
+.bodywebsite .start-0 {
+ left: 0 !important;
+}
+
+.bodywebsite .start-50 {
+ left: 50% !important;
+}
+
+.bodywebsite .start-100 {
+ left: 100% !important;
+}
+
+.bodywebsite .end-0 {
+ right: 0 !important;
+}
+
+.bodywebsite .end-50 {
+ right: 50% !important;
+}
+
+.bodywebsite .end-100 {
+ right: 100% !important;
+}
+
+.bodywebsite .translate-middle {
+ transform: translate(-50%, -50%) !important;
+}
+
+.bodywebsite .translate-middle-x {
+ transform: translateX(-50%) !important;
+}
+
+.bodywebsite .translate-middle-y {
+ transform: translateY(-50%) !important;
+}
+
+.bodywebsite .border {
+ border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-0 {
+ border: 0 !important;
+}
+
+.bodywebsite .border-top {
+ border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-top-0 {
+ border-top: 0 !important;
+}
+
+.bodywebsite .border-end {
+ border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-end-0 {
+ border-right: 0 !important;
+}
+
+.bodywebsite .border-bottom {
+ border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-bottom-0 {
+ border-bottom: 0 !important;
+}
+
+.bodywebsite .border-start {
+ border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-start-0 {
+ border-left: 0 !important;
+}
+
+.bodywebsite .border-primary {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-secondary {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-success {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-info {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-warning {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-danger {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-light {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-dark {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-white {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-1 {
+ --bs-border-width: 1px;
+}
+
+.bodywebsite .border-2 {
+ --bs-border-width: 2px;
+}
+
+.bodywebsite .border-3 {
+ --bs-border-width: 3px;
+}
+
+.bodywebsite .border-4 {
+ --bs-border-width: 4px;
+}
+
+.bodywebsite .border-5 {
+ --bs-border-width: 5px;
+}
+
+.bodywebsite .border-opacity-10 {
+ --bs-border-opacity: 0.1;
+}
+
+.bodywebsite .border-opacity-25 {
+ --bs-border-opacity: 0.25;
+}
+
+.bodywebsite .border-opacity-50 {
+ --bs-border-opacity: 0.5;
+}
+
+.bodywebsite .border-opacity-75 {
+ --bs-border-opacity: 0.75;
+}
+
+.bodywebsite .border-opacity-100 {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .w-25 {
+ width: 25% !important;
+}
+
+.bodywebsite .w-50 {
+ width: 50% !important;
+}
+
+.bodywebsite .w-75 {
+ width: 75% !important;
+}
+
+.bodywebsite .w-100 {
+ width: 100% !important;
+}
+
+.bodywebsite .w-auto {
+ width: auto !important;
+}
+
+.bodywebsite .mw-100 {
+ max-width: 100% !important;
+}
+
+.bodywebsite .vw-100 {
+ width: 100vw !important;
+}
+
+.bodywebsite .min-vw-100 {
+ min-width: 100vw !important;
+}
+
+.bodywebsite .h-25 {
+ height: 25% !important;
+}
+
+.bodywebsite .h-50 {
+ height: 50% !important;
+}
+
+.bodywebsite .h-75 {
+ height: 75% !important;
+}
+
+.bodywebsite .h-100 {
+ height: 100% !important;
+}
+
+.bodywebsite .h-auto {
+ height: auto !important;
+}
+
+.bodywebsite .mh-100 {
+ max-height: 100% !important;
+}
+
+.bodywebsite .vh-100 {
+ height: 100vh !important;
+}
+
+.bodywebsite .min-vh-100 {
+ min-height: 100vh !important;
+}
+
+.bodywebsite .flex-fill {
+ flex: 1 1 auto !important;
+}
+
+.bodywebsite .flex-row {
+ flex-direction: row !important;
+}
+
+.bodywebsite .flex-column {
+ flex-direction: column !important;
+}
+
+.bodywebsite .flex-row-reverse {
+ flex-direction: row-reverse !important;
+}
+
+.bodywebsite .flex-column-reverse {
+ flex-direction: column-reverse !important;
+}
+
+.bodywebsite .flex-grow-0 {
+ flex-grow: 0 !important;
+}
+
+.bodywebsite .flex-grow-1 {
+ flex-grow: 1 !important;
+}
+
+.bodywebsite .flex-shrink-0 {
+ flex-shrink: 0 !important;
+}
+
+.bodywebsite .flex-shrink-1 {
+ flex-shrink: 1 !important;
+}
+
+.bodywebsite .flex-wrap {
+ flex-wrap: wrap !important;
+}
+
+.bodywebsite .flex-nowrap {
+ flex-wrap: nowrap !important;
+}
+
+.bodywebsite .flex-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+}
+
+.bodywebsite .justify-content-start {
+ justify-content: flex-start !important;
+}
+
+.bodywebsite .justify-content-end {
+ justify-content: flex-end !important;
+}
+
+.bodywebsite .justify-content-center {
+ justify-content: center !important;
+}
+
+.bodywebsite .justify-content-between {
+ justify-content: space-between !important;
+}
+
+.bodywebsite .justify-content-around {
+ justify-content: space-around !important;
+}
+
+.bodywebsite .justify-content-evenly {
+ justify-content: space-evenly !important;
+}
+
+.bodywebsite .align-items-start {
+ align-items: flex-start !important;
+}
+
+.bodywebsite .align-items-end {
+ align-items: flex-end !important;
+}
+
+.bodywebsite .align-items-center {
+ align-items: center !important;
+}
+
+.bodywebsite .align-items-baseline {
+ align-items: baseline !important;
+}
+
+.bodywebsite .align-items-stretch {
+ align-items: stretch !important;
+}
+
+.bodywebsite .align-content-start {
+ align-content: flex-start !important;
+}
+
+.bodywebsite .align-content-end {
+ align-content: flex-end !important;
+}
+
+.bodywebsite .align-content-center {
+ align-content: center !important;
+}
+
+.bodywebsite .align-content-between {
+ align-content: space-between !important;
+}
+
+.bodywebsite .align-content-around {
+ align-content: space-around !important;
+}
+
+.bodywebsite .align-content-stretch {
+ align-content: stretch !important;
+}
+
+.bodywebsite .align-self-auto {
+ align-self: auto !important;
+}
+
+.bodywebsite .align-self-start {
+ align-self: flex-start !important;
+}
+
+.bodywebsite .align-self-end {
+ align-self: flex-end !important;
+}
+
+.bodywebsite .align-self-center {
+ align-self: center !important;
+}
+
+.bodywebsite .align-self-baseline {
+ align-self: baseline !important;
+}
+
+.bodywebsite .align-self-stretch {
+ align-self: stretch !important;
+}
+
+.bodywebsite .order-first {
+ order: -1 !important;
+}
+
+.bodywebsite .order-0 {
+ order: 0 !important;
+}
+
+.bodywebsite .order-1 {
+ order: 1 !important;
+}
+
+.bodywebsite .order-2 {
+ order: 2 !important;
+}
+
+.bodywebsite .order-3 {
+ order: 3 !important;
+}
+
+.bodywebsite .order-4 {
+ order: 4 !important;
+}
+
+.bodywebsite .order-5 {
+ order: 5 !important;
+}
+
+.bodywebsite .order-last {
+ order: 6 !important;
+}
+
+.bodywebsite .m-0 {
+ margin: 0 !important;
+}
+
+.bodywebsite .m-1 {
+ margin: 0.25rem !important;
+}
+
+.bodywebsite .m-2 {
+ margin: 0.5rem !important;
+}
+
+.bodywebsite .m-3 {
+ margin: 1rem !important;
+}
+
+.bodywebsite .m-4 {
+ margin: 1.5rem !important;
+}
+
+.bodywebsite .m-5 {
+ margin: 3rem !important;
+}
+
+.bodywebsite .m-auto {
+ margin: auto !important;
+}
+
+.bodywebsite .mx-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+}
+
+.bodywebsite .mx-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+}
+
+.bodywebsite .mx-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+}
+
+.bodywebsite .mx-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+}
+
+.bodywebsite .mx-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+}
+
+.bodywebsite .mx-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+}
+
+.bodywebsite .mx-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+}
+
+.bodywebsite .my-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+.bodywebsite .my-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+}
+
+.bodywebsite .my-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+}
+
+.bodywebsite .my-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+}
+
+.bodywebsite .my-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+}
+
+.bodywebsite .my-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+}
+
+.bodywebsite .my-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+}
+
+.bodywebsite .mt-0 {
+ margin-top: 0 !important;
+}
+
+.bodywebsite .mt-1 {
+ margin-top: 0.25rem !important;
+}
+
+.bodywebsite .mt-2 {
+ margin-top: 0.5rem !important;
+}
+
+.bodywebsite .mt-3 {
+ margin-top: 1rem !important;
+}
+
+.bodywebsite .mt-4 {
+ margin-top: 1.5rem !important;
+}
+
+.bodywebsite .mt-5 {
+ margin-top: 3rem !important;
+}
+
+.bodywebsite .mt-auto {
+ margin-top: auto !important;
+}
+
+.bodywebsite .me-0 {
+ margin-right: 0 !important;
+}
+
+.bodywebsite .me-1 {
+ margin-right: 0.25rem !important;
+}
+
+.bodywebsite .me-2 {
+ margin-right: 0.5rem !important;
+}
+
+.bodywebsite .me-3 {
+ margin-right: 1rem !important;
+}
+
+.bodywebsite .me-4 {
+ margin-right: 1.5rem !important;
+}
+
+.bodywebsite .me-5 {
+ margin-right: 3rem !important;
+}
+
+.bodywebsite .me-auto {
+ margin-right: auto !important;
+}
+
+.bodywebsite .mb-0 {
+ margin-bottom: 0 !important;
+}
+
+.bodywebsite .mb-1 {
+ margin-bottom: 0.25rem !important;
+}
+
+.bodywebsite .mb-2 {
+ margin-bottom: 0.5rem !important;
+}
+
+.bodywebsite .mb-3 {
+ margin-bottom: 1rem !important;
+}
+
+.bodywebsite .mb-4 {
+ margin-bottom: 1.5rem !important;
+}
+
+.bodywebsite .mb-5 {
+ margin-bottom: 3rem !important;
+}
+
+.bodywebsite .mb-auto {
+ margin-bottom: auto !important;
+}
+
+.bodywebsite .ms-0 {
+ margin-left: 0 !important;
+}
+
+.bodywebsite .ms-1 {
+ margin-left: 0.25rem !important;
+}
+
+.bodywebsite .ms-2 {
+ margin-left: 0.5rem !important;
+}
+
+.bodywebsite .ms-3 {
+ margin-left: 1rem !important;
+}
+
+.bodywebsite .ms-4 {
+ margin-left: 1.5rem !important;
+}
+
+.bodywebsite .ms-5 {
+ margin-left: 3rem !important;
+}
+
+.bodywebsite .ms-auto {
+ margin-left: auto !important;
+}
+
+.bodywebsite .p-0 {
+ padding: 0 !important;
+}
+
+.bodywebsite .p-1 {
+ padding: 0.25rem !important;
+}
+
+.bodywebsite .p-2 {
+ padding: 0.5rem !important;
+}
+
+.bodywebsite .p-3 {
+ padding: 1rem !important;
+}
+
+.bodywebsite .p-4 {
+ padding: 1.5rem !important;
+}
+
+.bodywebsite .p-5 {
+ padding: 3rem !important;
+}
+
+.bodywebsite .px-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+}
+
+.bodywebsite .px-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+}
+
+.bodywebsite .px-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+}
+
+.bodywebsite .px-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+}
+
+.bodywebsite .px-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+}
+
+.bodywebsite .px-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+}
+
+.bodywebsite .py-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+}
+
+.bodywebsite .py-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+}
+
+.bodywebsite .py-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+}
+
+.bodywebsite .py-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+}
+
+.bodywebsite .py-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+}
+
+.bodywebsite .py-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+}
+
+.bodywebsite .pt-0 {
+ padding-top: 0 !important;
+}
+
+.bodywebsite .pt-1 {
+ padding-top: 0.25rem !important;
+}
+
+.bodywebsite .pt-2 {
+ padding-top: 0.5rem !important;
+}
+
+.bodywebsite .pt-3 {
+ padding-top: 1rem !important;
+}
+
+.bodywebsite .pt-4 {
+ padding-top: 1.5rem !important;
+}
+
+.bodywebsite .pt-5 {
+ padding-top: 3rem !important;
+}
+
+.bodywebsite .pe-0 {
+ padding-right: 0 !important;
+}
+
+.bodywebsite .pe-1 {
+ padding-right: 0.25rem !important;
+}
+
+.bodywebsite .pe-2 {
+ padding-right: 0.5rem !important;
+}
+
+.bodywebsite .pe-3 {
+ padding-right: 1rem !important;
+}
+
+.bodywebsite .pe-4 {
+ padding-right: 1.5rem !important;
+}
+
+.bodywebsite .pe-5 {
+ padding-right: 3rem !important;
+}
+
+.bodywebsite .pb-0 {
+ padding-bottom: 0 !important;
+}
+
+.bodywebsite .pb-1 {
+ padding-bottom: 0.25rem !important;
+}
+
+.bodywebsite .pb-2 {
+ padding-bottom: 0.5rem !important;
+}
+
+.bodywebsite .pb-3 {
+ padding-bottom: 1rem !important;
+}
+
+.bodywebsite .pb-4 {
+ padding-bottom: 1.5rem !important;
+}
+
+.bodywebsite .pb-5 {
+ padding-bottom: 3rem !important;
+}
+
+.bodywebsite .ps-0 {
+ padding-left: 0 !important;
+}
+
+.bodywebsite .ps-1 {
+ padding-left: 0.25rem !important;
+}
+
+.bodywebsite .ps-2 {
+ padding-left: 0.5rem !important;
+}
+
+.bodywebsite .ps-3 {
+ padding-left: 1rem !important;
+}
+
+.bodywebsite .ps-4 {
+ padding-left: 1.5rem !important;
+}
+
+.bodywebsite .ps-5 {
+ padding-left: 3rem !important;
+}
+
+.bodywebsite .gap-0 {
+ gap: 0 !important;
+}
+
+.bodywebsite .gap-1 {
+ gap: 0.25rem !important;
+}
+
+.bodywebsite .gap-2 {
+ gap: 0.5rem !important;
+}
+
+.bodywebsite .gap-3 {
+ gap: 1rem !important;
+}
+
+.bodywebsite .gap-4 {
+ gap: 1.5rem !important;
+}
+
+.bodywebsite .gap-5 {
+ gap: 3rem !important;
+}
+
+.bodywebsite .font-monospace {
+ font-family: var(--bs-font-monospace) !important;
+}
+
+.bodywebsite .fs-1 {
+ font-size: calc(1.375rem + 1.5vw) !important;
+}
+
+.bodywebsite .fs-2 {
+ font-size: calc(1.325rem + 0.9vw) !important;
+}
+
+.bodywebsite .fs-3 {
+ font-size: calc(1.3rem + 0.6vw) !important;
+}
+
+.bodywebsite .fs-4 {
+ font-size: calc(1.275rem + 0.3vw) !important;
+}
+
+.bodywebsite .fs-5 {
+ font-size: 1.25rem !important;
+}
+
+.bodywebsite .fs-6 {
+ font-size: 1rem !important;
+}
+
+.bodywebsite .fst-italic {
+ font-style: italic !important;
+}
+
+.bodywebsite .fst-normal {
+ font-style: normal !important;
+}
+
+.bodywebsite .fw-light {
+ font-weight: 300 !important;
+}
+
+.bodywebsite .fw-lighter {
+ font-weight: lighter !important;
+}
+
+.bodywebsite .fw-normal {
+ font-weight: 400 !important;
+}
+
+.bodywebsite .fw-bold {
+ font-weight: 700 !important;
+}
+
+.bodywebsite .fw-semibold {
+ font-weight: 600 !important;
+}
+
+.bodywebsite .fw-bolder {
+ font-weight: bolder !important;
+}
+
+.bodywebsite .lh-1 {
+ line-height: 1 !important;
+}
+
+.bodywebsite .lh-sm {
+ line-height: 1.25 !important;
+}
+
+.bodywebsite .lh-base {
+ line-height: 1.5 !important;
+}
+
+.bodywebsite .lh-lg {
+ line-height: 2 !important;
+}
+
+.bodywebsite .text-start {
+ text-align: left !important;
+}
+
+.bodywebsite .text-end {
+ text-align: right !important;
+}
+
+.bodywebsite .text-center {
+ text-align: center !important;
+}
+
+.bodywebsite .text-decoration-none {
+ text-decoration: none !important;
+}
+
+.bodywebsite .text-decoration-underline {
+ text-decoration: underline !important;
+}
+
+.bodywebsite .text-decoration-line-through {
+ text-decoration: line-through !important;
+}
+
+.bodywebsite .text-lowercase {
+ text-transform: lowercase !important;
+}
+
+.bodywebsite .text-uppercase {
+ text-transform: uppercase !important;
+}
+
+.bodywebsite .text-capitalize {
+ text-transform: capitalize !important;
+}
+
+.bodywebsite .text-wrap {
+ white-space: normal !important;
+}
+
+.bodywebsite .text-nowrap {
+ white-space: nowrap !important;
+}
+
+.bodywebsite .text-break {
+ word-wrap: break-word !important;
+ word-break: break-word !important;
+}
+
+.bodywebsite .text-primary {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-secondary {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-success {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-info {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-warning {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-danger {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-light {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-dark {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-black {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-white {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-body {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-muted {
+ --bs-text-opacity: 1;
+ color: #6c757d !important;
+}
+
+.bodywebsite .text-black-50 {
+ --bs-text-opacity: 1;
+ color: rgba(0, 0, 0, 0.5) !important;
+}
+
+.bodywebsite .text-white-50 {
+ --bs-text-opacity: 1;
+ color: rgba(255, 255, 255, 0.5) !important;
+}
+
+.bodywebsite .text-reset {
+ --bs-text-opacity: 1;
+ color: inherit !important;
+}
+
+.bodywebsite .text-opacity-25 {
+ --bs-text-opacity: 0.25;
+}
+
+.bodywebsite .text-opacity-50 {
+ --bs-text-opacity: 0.5;
+}
+
+.bodywebsite .text-opacity-75 {
+ --bs-text-opacity: 0.75;
+}
+
+.bodywebsite .text-opacity-100 {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .bg-primary {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-secondary {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-success {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-info {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-warning {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-danger {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-light {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-dark {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-black {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-white {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-body {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-transparent {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-opacity-10 {
+ --bs-bg-opacity: 0.1;
+}
+
+.bodywebsite .bg-opacity-25 {
+ --bs-bg-opacity: 0.25;
+}
+
+.bodywebsite .bg-opacity-50 {
+ --bs-bg-opacity: 0.5;
+}
+
+.bodywebsite .bg-opacity-75 {
+ --bs-bg-opacity: 0.75;
+}
+
+.bodywebsite .bg-opacity-100 {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-gradient {
+ background-image: var(--bs-gradient) !important;
+}
+
+.bodywebsite .user-select-all {
+ -webkit-user-select: all !important;
+ -moz-user-select: all !important;
+ user-select: all !important;
+}
+
+.bodywebsite .user-select-auto {
+ -webkit-user-select: auto !important;
+ -moz-user-select: auto !important;
+ user-select: auto !important;
+}
+
+.bodywebsite .user-select-none {
+ -webkit-user-select: none !important;
+ -moz-user-select: none !important;
+ user-select: none !important;
+}
+
+.bodywebsite .pe-none {
+ pointer-events: none !important;
+}
+
+.bodywebsite .pe-auto {
+ pointer-events: auto !important;
+}
+
+.bodywebsite .rounded {
+ border-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-0 {
+ border-radius: 0 !important;
+}
+
+.bodywebsite .rounded-1 {
+ border-radius: var(--bs-border-radius-sm) !important;
+}
+
+.bodywebsite .rounded-2 {
+ border-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-3 {
+ border-radius: var(--bs-border-radius-lg) !important;
+}
+
+.bodywebsite .rounded-4 {
+ border-radius: var(--bs-border-radius-xl) !important;
+}
+
+.bodywebsite .rounded-5 {
+ border-radius: var(--bs-border-radius-2xl) !important;
+}
+
+.bodywebsite .rounded-circle {
+ border-radius: 50% !important;
+}
+
+.bodywebsite .rounded-pill {
+ border-radius: var(--bs-border-radius-pill) !important;
+}
+
+.bodywebsite .rounded-top {
+ border-top-left-radius: var(--bs-border-radius) !important;
+ border-top-right-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-end {
+ border-top-right-radius: var(--bs-border-radius) !important;
+ border-bottom-right-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-bottom {
+ border-bottom-right-radius: var(--bs-border-radius) !important;
+ border-bottom-left-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-start {
+ border-bottom-left-radius: var(--bs-border-radius) !important;
+ border-top-left-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .visible {
+ visibility: visible !important;
+}
+
+.bodywebsite .invisible {
+ visibility: hidden !important;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .float-sm-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-sm-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-sm-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-sm-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-sm-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-sm-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-sm-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-sm-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-sm-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-sm-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-sm-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-sm-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-sm-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-sm-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-sm-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-sm-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-sm-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-sm-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-sm-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-sm-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-sm-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-sm-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-sm-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-sm-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-sm-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-sm-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-sm-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-sm-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-sm-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-sm-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-sm-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-sm-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-sm-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-sm-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-sm-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-sm-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-sm-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-sm-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-sm-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-sm-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-sm-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-sm-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-sm-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-sm-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-sm-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-sm-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-sm-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-sm-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-sm-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-sm-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-sm-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-sm-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-sm-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-sm-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-sm-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-sm-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-sm-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-sm-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-sm-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-sm-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-sm-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-sm-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-sm-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-sm-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-sm-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-sm-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-sm-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-sm-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-sm-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-sm-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-sm-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-sm-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-sm-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-sm-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-sm-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-sm-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-sm-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-sm-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-sm-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-sm-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-sm-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-sm-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-sm-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-sm-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-sm-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-sm-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-sm-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-sm-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-sm-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-sm-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-sm-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-sm-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-sm-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-sm-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-sm-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-sm-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-sm-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-sm-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-sm-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-sm-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-sm-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-sm-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-sm-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-sm-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-sm-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-sm-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-sm-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-sm-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-sm-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-sm-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-sm-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-sm-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-sm-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-sm-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-sm-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-sm-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-sm-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-sm-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-sm-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-sm-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-sm-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-sm-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-sm-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-sm-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-sm-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-sm-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-sm-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-sm-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-sm-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-sm-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-sm-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-sm-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-sm-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-sm-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-sm-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-sm-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-sm-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-sm-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-sm-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-sm-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-sm-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-sm-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-sm-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-sm-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-sm-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-sm-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-sm-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-sm-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-sm-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-sm-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-sm-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-sm-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-sm-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-sm-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-sm-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-sm-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .float-md-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-md-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-md-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-md-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-md-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-md-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-md-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-md-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-md-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-md-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-md-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-md-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-md-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-md-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-md-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-md-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-md-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-md-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-md-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-md-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-md-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-md-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-md-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-md-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-md-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-md-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-md-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-md-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-md-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-md-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-md-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-md-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-md-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-md-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-md-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-md-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-md-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-md-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-md-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-md-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-md-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-md-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-md-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-md-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-md-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-md-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-md-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-md-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-md-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-md-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-md-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-md-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-md-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-md-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-md-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-md-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-md-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-md-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-md-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-md-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-md-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-md-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-md-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-md-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-md-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-md-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-md-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-md-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-md-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-md-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-md-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-md-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-md-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-md-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-md-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-md-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-md-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-md-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-md-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-md-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-md-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-md-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-md-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-md-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-md-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-md-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-md-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-md-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-md-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-md-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-md-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-md-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-md-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-md-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-md-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-md-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-md-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-md-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-md-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-md-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-md-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-md-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-md-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-md-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-md-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-md-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-md-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-md-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-md-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-md-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-md-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-md-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-md-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-md-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-md-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-md-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-md-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-md-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-md-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-md-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-md-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-md-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-md-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-md-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-md-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-md-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-md-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-md-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-md-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-md-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-md-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-md-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-md-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-md-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-md-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-md-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-md-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-md-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-md-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-md-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-md-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-md-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-md-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-md-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-md-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-md-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-md-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-md-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-md-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-md-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-md-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-md-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-md-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-md-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-md-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-md-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .float-lg-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-lg-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-lg-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-lg-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-lg-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-lg-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-lg-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-lg-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-lg-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-lg-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-lg-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-lg-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-lg-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-lg-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-lg-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-lg-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-lg-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-lg-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-lg-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-lg-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-lg-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-lg-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-lg-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-lg-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-lg-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-lg-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-lg-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-lg-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-lg-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-lg-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-lg-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-lg-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-lg-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-lg-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-lg-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-lg-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-lg-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-lg-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-lg-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-lg-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-lg-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-lg-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-lg-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-lg-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-lg-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-lg-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-lg-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-lg-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-lg-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-lg-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-lg-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-lg-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-lg-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-lg-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-lg-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-lg-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-lg-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-lg-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-lg-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-lg-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-lg-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-lg-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-lg-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-lg-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-lg-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-lg-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-lg-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-lg-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-lg-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-lg-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-lg-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-lg-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-lg-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-lg-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-lg-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-lg-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-lg-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-lg-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-lg-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-lg-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-lg-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-lg-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-lg-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-lg-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-lg-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-lg-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-lg-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-lg-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-lg-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-lg-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-lg-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-lg-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-lg-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-lg-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-lg-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-lg-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-lg-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-lg-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-lg-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-lg-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-lg-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-lg-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-lg-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-lg-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-lg-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-lg-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-lg-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-lg-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-lg-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-lg-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-lg-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-lg-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-lg-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-lg-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-lg-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-lg-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-lg-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-lg-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-lg-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-lg-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-lg-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-lg-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-lg-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-lg-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-lg-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-lg-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-lg-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-lg-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-lg-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-lg-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-lg-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-lg-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-lg-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-lg-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-lg-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-lg-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-lg-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-lg-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-lg-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-lg-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-lg-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-lg-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-lg-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-lg-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-lg-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-lg-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-lg-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-lg-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-lg-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-lg-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-lg-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-lg-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-lg-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-lg-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-lg-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-lg-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .float-xl-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-xl-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-xl-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-xl-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-xl-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-xl-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-xl-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-xl-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-xl-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-xl-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-xl-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-xl-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-xl-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-xl-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-xl-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-xl-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-xl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-xl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-xl-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-xl-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-xl-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-xl-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-xl-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-xl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-xl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-xl-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-xl-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-xl-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-xl-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-xl-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-xl-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-xl-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-xl-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-xl-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-xl-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-xl-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-xl-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-xl-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-xl-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-xl-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-xl-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-xl-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-xl-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-xl-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-xl-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-xl-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-xl-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-xl-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-xl-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-xl-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-xl-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-xl-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-xl-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-xl-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-xl-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-xl-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-xl-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-xl-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-xl-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-xl-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-xl-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-xl-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-xl-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-xl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-xl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-xl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-xl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-xl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-xl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-xl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-xl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-xl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-xl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-xl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-xl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-xl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-xl-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-xl-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-xl-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-xl-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-xl-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-xl-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-xl-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-xl-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-xl-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-xl-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-xl-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-xl-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-xl-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-xl-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-xl-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-xl-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-xl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-xl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-xl-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-xl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-xl-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-xl-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-xl-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-xl-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-xl-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-xl-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-xl-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-xl-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-xl-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-xl-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-xl-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-xl-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-xl-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-xl-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-xl-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-xl-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-xl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-xl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-xl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-xl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-xl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-xl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-xl-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-xl-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-xl-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-xl-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-xl-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-xl-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-xl-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-xl-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-xl-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-xl-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-xl-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-xl-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-xl-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-xl-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-xl-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-xl-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-xl-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-xl-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-xl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-xl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-xl-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-xl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-xl-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-xl-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-xl-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-xl-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-xl-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-xl-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-xl-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-xl-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-xl-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-xl-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-xl-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-xl-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-xl-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-xl-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-xl-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-xl-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .float-xxl-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-xxl-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-xxl-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-xxl-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-xxl-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-xxl-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-xxl-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-xxl-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-xxl-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-xxl-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-xxl-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-xxl-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-xxl-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-xxl-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-xxl-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-xxl-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-xxl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-xxl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-xxl-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-xxl-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-xxl-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-xxl-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-xxl-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-xxl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-xxl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-xxl-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-xxl-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-xxl-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-xxl-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-xxl-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-xxl-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-xxl-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-xxl-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-xxl-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-xxl-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-xxl-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-xxl-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-xxl-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-xxl-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-xxl-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-xxl-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-xxl-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-xxl-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-xxl-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-xxl-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-xxl-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-xxl-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-xxl-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-xxl-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-xxl-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-xxl-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-xxl-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-xxl-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-xxl-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-xxl-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-xxl-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-xxl-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-xxl-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-xxl-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-xxl-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-xxl-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-xxl-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-xxl-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-xxl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-xxl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-xxl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-xxl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-xxl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-xxl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-xxl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-xxl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-xxl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-xxl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-xxl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-xxl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-xxl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-xxl-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-xxl-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-xxl-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-xxl-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-xxl-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-xxl-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-xxl-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-xxl-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-xxl-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-xxl-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-xxl-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-xxl-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-xxl-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-xxl-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-xxl-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-xxl-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-xxl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-xxl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-xxl-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-xxl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-xxl-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-xxl-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-xxl-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-xxl-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-xxl-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-xxl-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-xxl-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-xxl-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-xxl-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-xxl-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-xxl-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-xxl-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-xxl-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-xxl-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-xxl-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-xxl-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-xxl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-xxl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-xxl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-xxl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-xxl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-xxl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-xxl-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-xxl-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-xxl-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-xxl-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-xxl-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-xxl-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-xxl-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-xxl-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-xxl-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-xxl-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-xxl-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-xxl-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-xxl-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-xxl-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-xxl-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-xxl-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-xxl-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-xxl-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-xxl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-xxl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-xxl-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-xxl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-xxl-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-xxl-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-xxl-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-xxl-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-xxl-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-xxl-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-xxl-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-xxl-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-xxl-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-xxl-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-xxl-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-xxl-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-xxl-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-xxl-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-xxl-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-xxl-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .fs-1 {
+ font-size: 2.5rem !important;
+ }
+
+ .bodywebsite .fs-2 {
+ font-size: 2rem !important;
+ }
+
+ .bodywebsite .fs-3 {
+ font-size: 1.75rem !important;
+ }
+
+ .bodywebsite .fs-4 {
+ font-size: 1.5rem !important;
+ }
+}
+
+@media print {
+ .bodywebsite .d-print-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-print-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-print-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-print-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-print-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-print-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-print-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-print-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-print-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-print-none {
+ display: none !important;
+ }
+}
+
+/* CSS content (all pages) */
+.bodywebsite h1,
+.bodywebsite h2,
+.bodywebsite h3,
+.bodywebsite h4,
+.bodywebsite h5,
+.bodywebsite h6 {
+ font-family: 'Hurricane', cursive;
+}
+
+.bodywebsite #title {
+ font-size: 100px;
+}
+.bodywebsite #mysection1{
+ font-family: 'Inconsolata', monospace;
+ color: white;
+ height: 80%;
+}
+
+.bodywebsite .full-height {
+ height: 100vh;
+}
+.bodywebsite .color {
+ color: #aefeff;
+}
+
+.bodywebsite .btn-color {
+ font-weight: bold;
+ color: #35858b;
+ border-color: #35858b;
+}
+
+.bodywebsite .btn-color:hover {
+ background-color: #35858b;
+ color: #fff;
+}
+
+.bodywebsite .btn-color-filled {
+ background-color: #35858b;
+ color: #072227;
+}
+.bodywebsite #products {
+ background-color: whitesmoke;
+}
+
+.bodywebsite #home, .bodywebsite #contact{
+ background-color: #072227;
+}
+
+.bodywebsite footer {
+ position: fixed;
+ bottom: 0;
+ left: 50%;
+ transform: translateX(-50%);
+}
+
+/*# sourceMappingURL=bootstrap.css.map */
+
diff --git a/htdocs/install/doctemplates/websites/website_template-noimg/containers/wrapper.php b/htdocs/install/doctemplates/websites/website_template-noimg/containers/wrapper.php
new file mode 100644
index 00000000000..26adb3ef220
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-noimg/containers/wrapper.php
@@ -0,0 +1,278 @@
+entity;
+$original_file = GETPOST("file", "alpha");
+$l = GETPOST('l', 'aZ09');
+$limit = GETPOST('limit', 'int');
+
+// Parameters for RSS
+$rss = GETPOST('rss', 'aZ09');
+if ($rss) {
+ $original_file = 'blog.rss';
+}
+
+// If we have a hash public (hashp), we guess the original_file.
+if (!empty($hashp)) {
+ include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
+ $ecmfile = new EcmFiles($db);
+ $result = $ecmfile->fetch(0, '', '', '', $hashp);
+ if ($result > 0) {
+ $tmp = explode('/', $ecmfile->filepath, 2); // $ecmfile->filepath is relative to document directory
+ // filepath can be 'users/X' or 'X/propale/PR11111'
+ if (is_numeric($tmp[0])) { // If first tmp is numeric, it is subdir of company for multicompany, we take next part.
+ $tmp = explode('/', $tmp[1], 2);
+ }
+ $moduleparttocheck = $tmp[0]; // moduleparttocheck is first part of path
+
+ if ($modulepart) { // Not required, so often not defined, for link using public hashp parameter.
+ if ($moduleparttocheck == $modulepart) {
+ // We remove first level of directory
+ $original_file = (($tmp[1] ? $tmp[1].'/' : '').$ecmfile->filename); // this is relative to module dir
+ //var_dump($original_file); exit;
+ } else {
+ print 'Bad link. File is from another module part.';
+ }
+ } else {
+ $modulepart = $moduleparttocheck;
+ $original_file = (($tmp[1] ? $tmp[1].'/' : '').$ecmfile->filename); // this is relative to module dir
+ }
+ } else {
+ print "ErrorFileNotFoundWithSharedLink";
+ exit;
+ }
+}
+
+// Define attachment (attachment=true to force choice popup 'open'/'save as')
+$attachment = true;
+if (preg_match('/\.(html|htm)$/i', $original_file)) {
+ $attachment = false;
+}
+if (isset($_GET["attachment"])) {
+ $attachment = (GETPOST("attachment", 'alphanohtml') ? true : false);
+}
+if (!empty($conf->global->MAIN_DISABLE_FORCE_SAVEAS_WEBSITE)) {
+ $attachment = false;
+}
+
+// Define mime type
+$type = 'application/octet-stream';
+if (GETPOSTISSET('type')) {
+ $type = GETPOST('type', 'alpha');
+} else {
+ $type = dol_mimetype($original_file);
+}
+
+// Security: Delete string ../ into $original_file
+$original_file = str_replace("../", "/", $original_file);
+
+// Cache or not
+if (GETPOST("cache", 'aZ09') || image_format_supported($original_file) >= 0) {
+ // Important: Following code is to avoid page request by browser and PHP CPU at
+ // each Dolibarr page access.
+ header('Cache-Control: max-age=3600, public, must-revalidate');
+ header('Pragma: cache'); // This is to avoid having Pragma: no-cache
+}
+
+$refname = basename(dirname($original_file)."/");
+
+// Get RSS news
+if ($rss) {
+ $format = 'rss';
+ $type = '';
+ $cachedelay = 0;
+ $filename = $original_file;
+ $dir_temp = $conf->website->dir_temp;
+
+ include_once DOL_DOCUMENT_ROOT.'/website/class/website.class.php';
+ include_once DOL_DOCUMENT_ROOT.'/website/class/websitepage.class.php';
+ $website = new Website($db);
+ $websitepage = new WebsitePage($db);
+
+ $website->fetch('', $websitekey);
+
+ $filters = array('type_container'=>'blogpost', 'status'=>1);
+ if ($l) {
+ $filters['lang'] = $l;
+ }
+
+ $MAXNEWS = ($limit ? $limit : 20);
+ $arrayofblogs = $websitepage->fetchAll($website->id, 'DESC', 'date_creation', $MAXNEWS, 0, $filters);
+ $eventarray = array();
+ if (is_array($arrayofblogs)) {
+ foreach ($arrayofblogs as $blog) {
+ $blog->fullpageurl = $website->virtualhost.'/'.$blog->pageurl.'.php';
+ $eventarray[] = $blog;
+ }
+ }
+
+ require_once DOL_DOCUMENT_ROOT."/core/lib/xcal.lib.php";
+ require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php";
+ require_once DOL_DOCUMENT_ROOT."/core/lib/files.lib.php";
+
+ dol_syslog("build_exportfile Build export file format=".$format.", type=".$type.", cachedelay=".$cachedelay.", filename=".$filename.", filters size=".count($filters), LOG_DEBUG);
+
+ // Clean parameters
+ if (!$filename) {
+ $extension = 'rss';
+ $filename = $format.'.'.$extension;
+ }
+
+ // Create dir and define output file (definitive and temporary)
+ $result = dol_mkdir($dir_temp);
+ $outputfile = $dir_temp.'/'.$filename;
+
+ $result = 0;
+
+ $buildfile = true;
+
+ if ($cachedelay) {
+ $nowgmt = dol_now();
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ if (dol_filemtime($outputfile) > ($nowgmt - $cachedelay)) {
+ dol_syslog("build_exportfile file ".$outputfile." is not older than now - cachedelay (".$nowgmt." - ".$cachedelay."). Build is canceled");
+ $buildfile = false;
+ }
+ }
+
+ if ($buildfile) {
+ $outputlangs = new Translate('', $conf);
+ $outputlangs->setDefaultLang($l);
+ $outputlangs->loadLangs(array("main", "other"));
+ $title = $desc = $outputlangs->transnoentities('LatestBlogPosts');
+
+ // Create temp file
+ $outputfiletmp = tempnam($dir_temp, 'tmp'); // Temporary file (allow call of function by different threads
+ @chmod($outputfiletmp, octdec($conf->global->MAIN_UMASK));
+
+ // Write file
+ $result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l);
+
+ if ($result >= 0) {
+ if (dol_move($outputfiletmp, $outputfile, 0, 1)) {
+ $result = 1;
+ } else {
+ $error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile;
+ dol_syslog("build_exportfile ".$error, LOG_ERR);
+ dol_delete_file($outputfiletmp, 0, 1);
+ print $error;
+ exit(-1);
+ }
+ } else {
+ dol_syslog("build_exportfile build_xxxfile function fails to for format=".$format." outputfiletmp=".$outputfile, LOG_ERR);
+ dol_delete_file($outputfiletmp, 0, 1);
+ $langs->load("errors");
+ print $langs->trans("ErrorFailToCreateFile", $outputfile);
+ exit(-1);
+ }
+ }
+
+ if ($result >= 0) {
+ $attachment = false;
+ if (isset($_GET["attachment"])) {
+ $attachment = $_GET["attachment"];
+ }
+ //$attachment = false;
+ $contenttype = 'application/rss+xml';
+ if (isset($_GET["contenttype"])) {
+ $contenttype = $_GET["contenttype"];
+ }
+ //$contenttype='text/plain';
+ $outputencoding = 'UTF-8';
+
+ if ($contenttype) {
+ header('Content-Type: '.$contenttype.($outputencoding ? '; charset='.$outputencoding : ''));
+ }
+ if ($attachment) {
+ header('Content-Disposition: attachment; filename="'.$filename.'"');
+ }
+
+ // Ajout directives pour resoudre bug IE
+ //header('Cache-Control: Public, must-revalidate');
+ //header('Pragma: public');
+ if ($cachedelay) {
+ header('Cache-Control: max-age='.$cachedelay.', private, must-revalidate');
+ } else {
+ header('Cache-Control: private, must-revalidate');
+ }
+
+ // Clean parameters
+ $outputfile = $dir_temp.'/'.$filename;
+ $result = readfile($outputfile);
+ if (!$result) {
+ print 'File '.$outputfile.' was empty.';
+ }
+
+ // header("Location: ".DOL_URL_ROOT.'/document.php?modulepart=agenda&file='.urlencode($filename));
+ exit;
+ }
+} elseif ($modulepart == "mycompany" && preg_match('/^\/?logos\//', $original_file)) {
+ // Get logos
+ readfile(dol_osencode($conf->mycompany->dir_output."/".$original_file));
+} else {
+ // Find the subdirectory name as the reference
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ $check_access = dol_check_secure_access_document($modulepart, $original_file, $entity, $refname);
+ $accessallowed = empty($check_access['accessallowed']) ? '' : $check_access['accessallowed'];
+ $sqlprotectagainstexternals = empty($check_access['sqlprotectagainstexternals']) ? '' : $check_access['sqlprotectagainstexternals'];
+ $fullpath_original_file = empty($check_access['original_file']) ? '' : $check_access['original_file']; // $fullpath_original_file is now a full path name
+ if ($hashp) {
+ $accessallowed = 1; // When using hashp, link is public so we force $accessallowed
+ $sqlprotectagainstexternals = '';
+ }
+
+ // Security:
+ // Limit access if permissions are wrong
+ if (!$accessallowed) {
+ print 'Access forbidden';
+ exit;
+ }
+
+ clearstatcache();
+
+ $filename = basename($fullpath_original_file);
+
+ // Output file on browser
+ dol_syslog("wrapper.php download $fullpath_original_file filename=$filename content-type=$type");
+ $fullpath_original_file_osencoded = dol_osencode($fullpath_original_file); // New file name encoded in OS encoding charset
+
+ // This test if file exists should be useless. We keep it to find bug more easily
+ if (!file_exists($fullpath_original_file_osencoded)) {
+ print "ErrorFileDoesNotExists: ".$original_file;
+ exit;
+ }
+
+ // Permissions are ok and file found, so we return it
+ //top_httphead($type);
+ header('Content-Type: '.$type);
+ header('Content-Description: File Transfer');
+ if ($encoding) {
+ header('Content-Encoding: '.$encoding);
+ }
+ // Add MIME Content-Disposition from RFC 2183 (inline=automatically displayed, attachment=need user action to open)
+ if ($attachment) {
+ header('Content-Disposition: attachment; filename="'.$filename.'"');
+ } else {
+ header('Content-Disposition: inline; filename="'.$filename.'"');
+ }
+ header('Content-Length: '.dol_filesize($fullpath_original_file));
+
+ readfile($fullpath_original_file_osencoded);
+}
+if (is_object($db)) {
+ $db->close();
+}
+// END PHP
diff --git a/htdocs/install/doctemplates/websites/website_template-noimg/website_pages.sql b/htdocs/install/doctemplates/websites/website_template-noimg/website_pages.sql
new file mode 100644
index 00000000000..70d81b97f75
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-noimg/website_pages.sql
@@ -0,0 +1,9 @@
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-09-26 12:49:03 UTC --;
+-- Page ID 80 -> 1__+MAX_llx_website_page__ - Aliases index --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(1__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'index', '', 'index', '', '', '', '', '1', '2022-07-04 15:13:49', '2022-09-26 14:48:51', null, '', 'page', '__N__
__N__
__N__
__N____N__ __N__
__N__
__N__
__N____N____N__ Template __N__ ', '__N__email;__N__ $message = GETPOST(\'message\', \'alpha\');__N__ $cmail = new CMailFile(\'Contact from website\', $to, $from, $message);__N__ if ($cmail->sendfile()) {__N__ ?>__N__ __N__ trans(\"ErrorFailedToSendMail\", $from, $to).\'. \'.$cmail->error;__N__ }__N__}__N__?>__N__ __N__ __N__ __N__ __N__ __N__
__N__
__N__
Products __N__ __N__
__N__
__N__
__N__
__N__ __N__
__N__
Product 1 __N__
__N__ Some quick example text to build on the__N__ card title and make up the bulk of the__N__ card\'s content.__N__
__N__
__N__ __N__ Learn More__N__ __N__ __N__
__N__
__N__
__N__
__N__
__N__ __N__
__N__
Product 2 __N__
__N__ Some quick example text to build on the__N__ card title and make up the bulk of the__N__ card\'s content.__N__
__N__
__N__ __N__ Learn More__N__ __N__ __N__
__N__
__N__
__N__
__N__
__N__ __N__
__N__
Product 3 __N__
__N__ Some quick example text to build on the__N__ card title and make up the bulk of the__N__ card\'s content.__N__
__N__
__N__ __N__ Learn More__N__ __N__ __N__
__N__
__N__
__N__
__N__
__N__ __N__
__N__
Product 4 __N__
__N__ Some quick example text to build on the__N__ card title and make up the bulk of the__N__ card\'s content.__N__
__N__
__N__ __N__ Learn More__N__ __N__ __N__
__N__
__N__
__N__
__N__
__N__ __N__
__N__
Product 5 __N__
__N__ Some quick example text to build on the__N__ card title and make up the bulk of the__N__ card\'s content.__N__
__N__
__N__ __N__ Learn More__N__ __N__ __N__
__N__
__N__
__N__
__N__
__N__ __N__
__N__
Product 6 __N__
__N__ Some quick example text to build on the__N__ card title and make up the bulk of the__N__ card\'s content.__N__
__N__
__N__ __N__ Learn More__N__ __N__ __N__
__N__
__N__
__N__
__N__
__N__ __N____N__ __N____N__ __N__', '', 0);
+UPDATE llx_website SET fk_default_home = 1__+MAX_llx_website_page__ WHERE rowid = __WEBSITE_ID__;
+
+-- For Dolibarr v14+ --;
+UPDATE llx_website SET lang = 'en' WHERE rowid = __WEBSITE_ID__;
+UPDATE llx_website SET otherlang = '' WHERE rowid = __WEBSITE_ID__;
+
diff --git a/htdocs/install/doctemplates/websites/website_template-style02.jpg b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple.jpg
similarity index 100%
rename from htdocs/install/doctemplates/websites/website_template-style02.jpg
rename to htdocs/install/doctemplates/websites/website_template-onepageblackpurple.jpg
diff --git a/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/LICENSE b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/LICENSE
new file mode 100644
index 00000000000..871ef743662
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/LICENSE
@@ -0,0 +1,4 @@
+LICENSE
+-------
+
+CC-BY-SA - https://creativecommons.org/licenses/by/4.0/
diff --git a/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/README.md b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/README.md
new file mode 100644
index 00000000000..3a656b8ddaf
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/README.md
@@ -0,0 +1 @@
+Website generated by Dolibarr ERP CRM
diff --git a/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/.dolibarr b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/.dolibarr
new file mode 100644
index 00000000000..0ef9997b4ab
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/.dolibarr
@@ -0,0 +1,2 @@
+# Some properties for Dolibarr web site CMS
+param=value
diff --git a/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/.htaccess b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/.htaccess
new file mode 100644
index 00000000000..ed27b33461f
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/.htaccess
@@ -0,0 +1,2 @@
+# Order allow,deny
+# Deny from all
diff --git a/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/README.md b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/README.md
new file mode 100644
index 00000000000..3a656b8ddaf
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/README.md
@@ -0,0 +1 @@
+Website generated by Dolibarr ERP CRM
diff --git a/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/htmlheader.html b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/htmlheader.html
new file mode 100644
index 00000000000..a58ea695524
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/htmlheader.html
@@ -0,0 +1,6 @@
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/index.php b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/index.php
new file mode 100644
index 00000000000..b4e33361f1b
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/index.php
@@ -0,0 +1,4 @@
+ref.'/page148.tpl.php';
diff --git a/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/javascript.js.php b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/javascript.js.php
new file mode 100644
index 00000000000..f58102cf00b
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/javascript.js.php
@@ -0,0 +1,13 @@
+
+/* JS content (all pages) */
+
diff --git a/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/manifest.json.php b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/manifest.json.php
new file mode 100644
index 00000000000..b61531d6c11
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/manifest.json.php
@@ -0,0 +1,13 @@
+
+
+
+
+
+index
+
+
+
+
+
+
+
+
+
+use_manifest) { print ' '."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Template
+
+
+
+
+
+
+
+
+
+
+
+
Our company
+
+ Lorem ipsum dolor, sit amet consectetur adipisicing elit. Nostrum excepturi ipsa consequatur accusamus eveniet dignissimos necessitatibus provident dolore cupiditate.
+
+
+
+ It uses utility classes for typography and spacing to space content out within the
+ larger container.
+
+
+
+
+ PRE ORDER NOW
+
+
+
+
+ CONTACT US
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
LoremIpsum
+
+ Some quick example text to build on the
+ card title and make up the bulk of the
+ card's content.
+
+
+
+
+
+
+
+
+
+
+
+
LoremIpsum
+
+ Some quick example text to build on the
+ card title and make up the bulk of the
+ card's content.
+
+
+
+
+
+
+
+
+
+
+
+
LoremIpsum
+
+ Some quick example text to build on the
+ card title and make up the bulk of the
+ card's content.
+
+
+
+
+
+
+
+
+
+
+
+
LoremIpsum
+
+ Some quick example text to build on the
+ card title and make up the bulk of the
+ card's content.
+
+
+
+
+
+
+
+
+
+
+
+
LoremIpsum
+
+ Some quick example text to build on the
+ card title and make up the bulk of the
+ card's content.
+
+
+
+
+
+
+
+
+
+
+
+
LoremIpsum
+
+ Some quick example text to build on the
+ card title and make up the bulk of the
+ card's content.
+
+
+
+
+
+
+
+
+
+
+
+
+
UNLIMITED FOR ALL
+
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Minus molestias voluptatibus voluptatem Lorem ipsum dolor, sit amet consectetur adipisicing elit. Veritatis officia voluptatem incidunt tempore esse porro sequi eveniet eum corrupti quo.
+
+
+
+
WHAT YOU WILL GET
+
Lorem ipsum dolor sit, amet consectetur
+
Lorem ipsum dolor sit, amet consectetur
+
Lorem ipsum dolor sit, amet consectetur
+
+
+ PRE ORDER NOW
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ socialnetworks as $key => $value) {
+ print ' ';
+ } ?>
+
+
+
+
+
+
+
+
+ © 2022 Dolibarr:
+
Dolicloud.com
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/robots.txt b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/robots.txt
new file mode 100644
index 00000000000..2b844f479d6
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/robots.txt
@@ -0,0 +1,4 @@
+# Robot file. Generated with Dolibarr
+User-agent: *
+Allow: /public/
+Disallow: /administrator/
diff --git a/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/styles.css.php b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/styles.css.php
new file mode 100644
index 00000000000..acc30d70bfe
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/styles.css.php
@@ -0,0 +1,12536 @@
+
+/* CSS content (all pages)
+body.bodywebsite { margin: 0; font-family: 'Open Sans', sans-serif; }
+.bodywebsite h1 { margin-top: 0; margin-bottom: 0; padding: 10px;}
+*/
+
+@charset "UTF-8";
+
+.bodywebsite {
+ /*!
+ * Bootstrap v5.2.1 (https://getbootstrap.com/)
+ * Copyright 2011-2022 The Bootstrap Authors
+ * Copyright 2011-2022 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */
+ /* rtl:raw:
+[type="tel"],
+[type="url"],
+[type="email"],
+[type="number"] {
+ direction: ltr;
+}
+*/
+ /* rtl:begin:ignore */
+ /* rtl:end:ignore */
+ /* rtl:begin:ignore */
+ /* rtl:end:ignore */
+ /* rtl:begin:ignore */
+ /* rtl:end:ignore */
+ /* rtl:begin:ignore */
+ /* rtl:end:ignore */
+ /* rtl:begin:ignore */
+ /* rtl:end:ignore */
+ /* rtl:options: {
+ "autoRename": true,
+ "stringMap":[ {
+ "name" : "prev-next",
+ "search" : "prev",
+ "replace" : "next"
+ } ]
+} */
+ /* rtl:begin:remove */
+ /* rtl:end:remove */
+ /*# sourceMappingURL=bootstrap.css.map */;
+}
+
+.bodywebsite :root {
+ --bs-blue: #0d6efd;
+ --bs-indigo: #6610f2;
+ --bs-purple: #6f42c1;
+ --bs-pink: #d63384;
+ --bs-red: #dc3545;
+ --bs-orange: #fd7e14;
+ --bs-yellow: #ffc107;
+ --bs-green: #198754;
+ --bs-teal: #20c997;
+ --bs-cyan: #0dcaf0;
+ --bs-black: #000;
+ --bs-white: #fff;
+ --bs-gray: #6c757d;
+ --bs-gray-dark: #343a40;
+ --bs-gray-100: #f8f9fa;
+ --bs-gray-200: #e9ecef;
+ --bs-gray-300: #dee2e6;
+ --bs-gray-400: #ced4da;
+ --bs-gray-500: #adb5bd;
+ --bs-gray-600: #6c757d;
+ --bs-gray-700: #495057;
+ --bs-gray-800: #343a40;
+ --bs-gray-900: #212529;
+ --bs-primary: #0d6efd;
+ --bs-secondary: #6c757d;
+ --bs-success: #198754;
+ --bs-info: #0dcaf0;
+ --bs-warning: #ffc107;
+ --bs-danger: #dc3545;
+ --bs-light: #f8f9fa;
+ --bs-dark: #212529;
+ --bs-primary-rgb: 13, 110, 253;
+ --bs-secondary-rgb: 108, 117, 125;
+ --bs-success-rgb: 25, 135, 84;
+ --bs-info-rgb: 13, 202, 240;
+ --bs-warning-rgb: 255, 193, 7;
+ --bs-danger-rgb: 220, 53, 69;
+ --bs-light-rgb: 248, 249, 250;
+ --bs-dark-rgb: 33, 37, 41;
+ --bs-white-rgb: 255, 255, 255;
+ --bs-black-rgb: 0, 0, 0;
+ --bs-body-color-rgb: 33, 37, 41;
+ --bs-body-bg-rgb: 255, 255, 255;
+ --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
+ --bs-body-font-family: var(--bs-font-sans-serif);
+ --bs-body-font-size: 1rem;
+ --bs-body-font-weight: 400;
+ --bs-body-line-height: 1.5;
+ --bs-body-color: #212529;
+ --bs-body-bg: #fff;
+ --bs-border-width: 1px;
+ --bs-border-style: solid;
+ --bs-border-color: #dee2e6;
+ --bs-border-color-translucent: rgba(0, 0, 0, 0.175);
+ --bs-border-radius: 0.375rem;
+ --bs-border-radius-sm: 0.25rem;
+ --bs-border-radius-lg: 0.5rem;
+ --bs-border-radius-xl: 1rem;
+ --bs-border-radius-2xl: 2rem;
+ --bs-border-radius-pill: 50rem;
+ --bs-link-color: #0d6efd;
+ --bs-link-hover-color: #0a58ca;
+ --bs-code-color: #d63384;
+ --bs-highlight-bg: #fff3cd;
+}
+
+.bodywebsite *,
+ .bodywebsite *::before,
+ .bodywebsite *::after {
+ box-sizing: border-box;
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ .bodywebsite :root {
+ scroll-behavior: smooth;
+ }
+}
+
+.bodywebsite .text-dark{
+ color: black;
+}
+
+.bodywebsite body {
+ margin: 0;
+ font-family: var(--bs-body-font-family);
+ font-size: var(--bs-body-font-size);
+ font-weight: var(--bs-body-font-weight);
+ line-height: var(--bs-body-line-height);
+ color: var(--bs-body-color);
+ text-align: var(--bs-body-text-align);
+ background-color: var(--bs-body-bg);
+ -webkit-text-size-adjust: 100%;
+ -webkit-tap-highlight-color: transparent;
+}
+
+.bodywebsite hr {
+ margin: 1rem 0;
+ color: inherit;
+ border: 0;
+ border-top: 1px solid;
+ opacity: 0.25;
+}
+
+.bodywebsite h6, .bodywebsite .h6, .bodywebsite h5, .bodywebsite .h5, .bodywebsite h4, .bodywebsite .h4, .bodywebsite h3, .bodywebsite .h3, .bodywebsite h2, .bodywebsite .h2, .bodywebsite h1, .bodywebsite .h1 {
+ margin-top: 0;
+ margin-bottom: 0.5rem;
+ font-weight: 500;
+ line-height: 1.2;
+}
+
+.bodywebsite h1, .bodywebsite .h1 {
+ font-size: calc(1.375rem + 1.5vw);
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite h1, .bodywebsite .h1 {
+ font-size: 2.5rem;
+ }
+}
+
+.bodywebsite h2, .bodywebsite .h2 {
+ font-size: calc(1.325rem + 0.9vw);
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite h2, .bodywebsite .h2 {
+ font-size: 2rem;
+ }
+}
+
+.bodywebsite h3, .bodywebsite .h3 {
+ font-size: calc(1.3rem + 0.6vw);
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite h3, .bodywebsite .h3 {
+ font-size: 1.75rem;
+ }
+}
+
+.bodywebsite h4, .bodywebsite .h4 {
+ font-size: calc(1.275rem + 0.3vw);
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite h4, .bodywebsite .h4 {
+ font-size: 1.5rem;
+ }
+}
+
+.bodywebsite h5, .bodywebsite .h5 {
+ font-size: 1.25rem;
+}
+
+.bodywebsite h6, .bodywebsite .h6 {
+ font-size: 1rem;
+}
+
+.bodywebsite p {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+.bodywebsite abbr[title] {
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+ cursor: help;
+ -webkit-text-decoration-skip-ink: none;
+ text-decoration-skip-ink: none;
+}
+
+.bodywebsite address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit;
+}
+
+.bodywebsite ol,
+ .bodywebsite ul {
+ padding-left: 2rem;
+}
+
+.bodywebsite ol,
+ .bodywebsite ul,
+ .bodywebsite dl {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+.bodywebsite ol ol,
+ .bodywebsite ul ul,
+ .bodywebsite ol ul,
+ .bodywebsite ul ol {
+ margin-bottom: 0;
+}
+
+.bodywebsite dt {
+ font-weight: 700;
+}
+
+.bodywebsite dd {
+ margin-bottom: 0.5rem;
+ margin-left: 0;
+}
+
+.bodywebsite blockquote {
+ margin: 0 0 1rem;
+}
+
+.bodywebsite b,
+ .bodywebsite strong {
+ font-weight: bolder;
+}
+
+.bodywebsite small, .bodywebsite .small {
+ font-size: 0.875em;
+}
+
+.bodywebsite mark, .bodywebsite .mark {
+ padding: 0.1875em;
+ background-color: var(--bs-highlight-bg);
+}
+
+.bodywebsite sub,
+ .bodywebsite sup {
+ position: relative;
+ font-size: 0.75em;
+ line-height: 0;
+ vertical-align: baseline;
+}
+
+.bodywebsite sub {
+ bottom: -0.25em;
+}
+
+.bodywebsite sup {
+ top: -0.5em;
+}
+
+.bodywebsite a {
+ color: var(--bs-link-color);
+ text-decoration: underline;
+}
+
+.bodywebsite a:hover {
+ color: var(--bs-link-hover-color);
+}
+
+.bodywebsite a:not([href]):not([class]), .bodywebsite a:not([href]):not([class]):hover {
+ color: inherit;
+ text-decoration: none;
+}
+
+.bodywebsite pre,
+ .bodywebsite code,
+ .bodywebsite kbd,
+ .bodywebsite samp {
+ font-family: var(--bs-font-monospace);
+ font-size: 1em;
+}
+
+.bodywebsite pre {
+ display: block;
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
+ font-size: 0.875em;
+}
+
+.bodywebsite pre code {
+ font-size: inherit;
+ color: inherit;
+ word-break: normal;
+}
+
+.bodywebsite code {
+ font-size: 0.875em;
+ color: var(--bs-code-color);
+ word-wrap: break-word;
+}
+
+.bodywebsite a > code {
+ color: inherit;
+}
+
+.bodywebsite kbd {
+ padding: 0.1875rem 0.375rem;
+ font-size: 0.875em;
+ color: var(--bs-body-bg);
+ background-color: var(--bs-body-color);
+ border-radius: 0.25rem;
+}
+
+.bodywebsite kbd kbd {
+ padding: 0;
+ font-size: 1em;
+}
+
+.bodywebsite figure {
+ margin: 0 0 1rem;
+}
+
+.bodywebsite img,
+ .bodywebsite svg {
+ vertical-align: middle;
+}
+
+.bodywebsite table {
+ caption-side: bottom;
+ border-collapse: collapse;
+}
+
+.bodywebsite caption {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ color: #6c757d;
+ text-align: left;
+}
+
+.bodywebsite th {
+ text-align: inherit;
+ text-align: -webkit-match-parent;
+}
+
+.bodywebsite thead,
+ .bodywebsite tbody,
+ .bodywebsite tfoot,
+ .bodywebsite tr,
+ .bodywebsite td,
+ .bodywebsite th {
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+}
+
+.bodywebsite label {
+ display: inline-block;
+}
+
+.bodywebsite button {
+ border-radius: 0;
+}
+
+.bodywebsite button:focus:not(:focus-visible) {
+ outline: 0;
+}
+
+.bodywebsite input,
+ .bodywebsite button,
+ .bodywebsite select,
+ .bodywebsite optgroup,
+ .bodywebsite textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+.bodywebsite button,
+ .bodywebsite select {
+ text-transform: none;
+}
+
+.bodywebsite [role=button] {
+ cursor: pointer;
+}
+
+.bodywebsite select {
+ word-wrap: normal;
+}
+
+.bodywebsite select:disabled {
+ opacity: 1;
+}
+
+.bodywebsite [list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
+ display: none !important;
+}
+
+.bodywebsite button,
+ .bodywebsite [type=button],
+ .bodywebsite [type=reset],
+ .bodywebsite [type=submit] {
+ -webkit-appearance: button;
+}
+
+.bodywebsite button:not(:disabled),
+ .bodywebsite [type=button]:not(:disabled),
+ .bodywebsite [type=reset]:not(:disabled),
+ .bodywebsite [type=submit]:not(:disabled) {
+ cursor: pointer;
+}
+
+.bodywebsite ::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
+}
+
+.bodywebsite textarea {
+ resize: vertical;
+}
+
+.bodywebsite fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+.bodywebsite legend {
+ float: left;
+ width: 100%;
+ padding: 0;
+ margin-bottom: 0.5rem;
+ font-size: calc(1.275rem + 0.3vw);
+ line-height: inherit;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite legend {
+ font-size: 1.5rem;
+ }
+}
+
+.bodywebsite legend + * {
+ clear: left;
+}
+
+.bodywebsite ::-webkit-datetime-edit-fields-wrapper,
+ .bodywebsite ::-webkit-datetime-edit-text,
+ .bodywebsite ::-webkit-datetime-edit-minute,
+ .bodywebsite ::-webkit-datetime-edit-hour-field,
+ .bodywebsite ::-webkit-datetime-edit-day-field,
+ .bodywebsite ::-webkit-datetime-edit-month-field,
+ .bodywebsite ::-webkit-datetime-edit-year-field {
+ padding: 0;
+}
+
+.bodywebsite ::-webkit-inner-spin-button {
+ height: auto;
+}
+
+.bodywebsite [type=search] {
+ outline-offset: -2px;
+ -webkit-appearance: textfield;
+}
+
+.bodywebsite ::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+.bodywebsite ::-webkit-color-swatch-wrapper {
+ padding: 0;
+}
+
+.bodywebsite ::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+
+.bodywebsite ::file-selector-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+
+.bodywebsite output {
+ display: inline-block;
+}
+
+.bodywebsite iframe {
+ border: 0;
+}
+
+.bodywebsite summary {
+ display: list-item;
+ cursor: pointer;
+}
+
+.bodywebsite progress {
+ vertical-align: baseline;
+}
+
+.bodywebsite [hidden] {
+ display: none !important;
+}
+
+.bodywebsite .lead {
+ font-size: 1.25rem;
+ font-weight: 300;
+}
+
+.bodywebsite .display-1 {
+ font-size: calc(1.625rem + 4.5vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-1 {
+ font-size: 5rem;
+ }
+}
+
+.bodywebsite .display-2 {
+ font-size: calc(1.575rem + 3.9vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-2 {
+ font-size: 4.5rem;
+ }
+}
+
+.bodywebsite .display-3 {
+ font-size: calc(1.525rem + 3.3vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-3 {
+ font-size: 4rem;
+ }
+}
+
+.bodywebsite .display-4 {
+ font-size: calc(1.475rem + 2.7vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-4 {
+ font-size: 3.5rem;
+ }
+}
+
+.bodywebsite .display-5 {
+ font-size: calc(1.425rem + 2.1vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-5 {
+ font-size: 3rem;
+ }
+}
+
+.bodywebsite .display-6 {
+ font-size: calc(1.375rem + 1.5vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-6 {
+ font-size: 2.5rem;
+ }
+}
+
+.bodywebsite .list-unstyled {
+ padding-left: 0;
+ list-style: none;
+}
+
+.bodywebsite .list-inline {
+ padding-left: 0;
+ list-style: none;
+}
+
+.bodywebsite .list-inline-item {
+ display: inline-block;
+}
+
+.bodywebsite .list-inline-item:not(:last-child) {
+ margin-right: 0.5rem;
+}
+
+.bodywebsite .initialism {
+ font-size: 0.875em;
+ text-transform: uppercase;
+}
+
+.bodywebsite .blockquote {
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+}
+
+.bodywebsite .blockquote > :last-child {
+ margin-bottom: 0;
+}
+
+.bodywebsite .blockquote-footer {
+ margin-top: -1rem;
+ margin-bottom: 1rem;
+ font-size: 0.875em;
+ color: #6c757d;
+}
+
+.bodywebsite .blockquote-footer::before {
+ content: "— ";
+}
+
+.bodywebsite .img-fluid {
+ max-width: 100%;
+ height: auto;
+}
+
+.bodywebsite .img-thumbnail {
+ padding: 0.25rem;
+ background-color: #fff;
+ border: 1px solid var(--bs-border-color);
+ border-radius: 0.375rem;
+ max-width: 100%;
+ height: auto;
+}
+
+.bodywebsite .figure {
+ display: inline-block;
+}
+
+.bodywebsite .figure-img {
+ margin-bottom: 0.5rem;
+ line-height: 1;
+}
+
+.bodywebsite .figure-caption {
+ font-size: 0.875em;
+ color: #6c757d;
+}
+
+.bodywebsite .container,
+ .bodywebsite .container-fluid,
+ .bodywebsite .container-xxl,
+ .bodywebsite .container-xl,
+ .bodywebsite .container-lg,
+ .bodywebsite .container-md,
+ .bodywebsite .container-sm {
+ --bs-gutter-x: 1.5rem;
+ --bs-gutter-y: 0;
+ width: 100%;
+ padding-right: calc(var(--bs-gutter-x) * 0.5);
+ padding-left: calc(var(--bs-gutter-x) * 0.5);
+ margin-right: auto;
+ margin-left: auto;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 540px;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .container-md, .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 720px;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .container-lg, .bodywebsite .container-md, .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 960px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .container-xl, .bodywebsite .container-lg, .bodywebsite .container-md, .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 1140px;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .container-xxl, .bodywebsite .container-xl, .bodywebsite .container-lg, .bodywebsite .container-md, .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 1320px;
+ }
+}
+
+.bodywebsite .row {
+ --bs-gutter-x: 1.5rem;
+ --bs-gutter-y: 0;
+ display: flex;
+ flex-wrap: wrap;
+ margin-top: calc(-1 * var(--bs-gutter-y));
+ margin-right: calc(-0.5 * var(--bs-gutter-x));
+ margin-left: calc(-0.5 * var(--bs-gutter-x));
+}
+
+.bodywebsite .row > * {
+ flex-shrink: 0;
+ width: 100%;
+ max-width: 100%;
+ padding-right: calc(var(--bs-gutter-x) * 0.5);
+ padding-left: calc(var(--bs-gutter-x) * 0.5);
+ margin-top: var(--bs-gutter-y);
+}
+
+.bodywebsite .col {
+ flex: 1 0 0%;
+}
+
+.bodywebsite .row-cols-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+}
+
+.bodywebsite .row-cols-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+}
+
+.bodywebsite .row-cols-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+}
+
+.bodywebsite .row-cols-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+}
+
+.bodywebsite .row-cols-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+}
+
+.bodywebsite .row-cols-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+}
+
+.bodywebsite .row-cols-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+}
+
+.bodywebsite .col-auto {
+ flex: 0 0 auto;
+ width: auto;
+}
+
+.bodywebsite .col-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+}
+
+.bodywebsite .col-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+}
+
+.bodywebsite .col-3 {
+ flex: 0 0 auto;
+ width: 25%;
+}
+
+.bodywebsite .col-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+}
+
+.bodywebsite .col-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+}
+
+.bodywebsite .col-6 {
+ flex: 0 0 auto;
+ width: 50%;
+}
+
+.bodywebsite .col-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+}
+
+.bodywebsite .col-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+}
+
+.bodywebsite .col-9 {
+ flex: 0 0 auto;
+ width: 75%;
+}
+
+.bodywebsite .col-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+}
+
+.bodywebsite .col-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+}
+
+.bodywebsite .col-12 {
+ flex: 0 0 auto;
+ width: 100%;
+}
+
+.bodywebsite .offset-1 {
+ margin-left: 8.33333333%;
+}
+
+.bodywebsite .offset-2 {
+ margin-left: 16.66666667%;
+}
+
+.bodywebsite .offset-3 {
+ margin-left: 25%;
+}
+
+.bodywebsite .offset-4 {
+ margin-left: 33.33333333%;
+}
+
+.bodywebsite .offset-5 {
+ margin-left: 41.66666667%;
+}
+
+.bodywebsite .offset-6 {
+ margin-left: 50%;
+}
+
+.bodywebsite .offset-7 {
+ margin-left: 58.33333333%;
+}
+
+.bodywebsite .offset-8 {
+ margin-left: 66.66666667%;
+}
+
+.bodywebsite .offset-9 {
+ margin-left: 75%;
+}
+
+.bodywebsite .offset-10 {
+ margin-left: 83.33333333%;
+}
+
+.bodywebsite .offset-11 {
+ margin-left: 91.66666667%;
+}
+
+.bodywebsite .g-0,
+ .bodywebsite .gx-0 {
+ --bs-gutter-x: 0;
+}
+
+.bodywebsite .g-0,
+ .bodywebsite .gy-0 {
+ --bs-gutter-y: 0;
+}
+
+.bodywebsite .g-1,
+ .bodywebsite .gx-1 {
+ --bs-gutter-x: 0.25rem;
+}
+
+.bodywebsite .g-1,
+ .bodywebsite .gy-1 {
+ --bs-gutter-y: 0.25rem;
+}
+
+.bodywebsite .g-2,
+ .bodywebsite .gx-2 {
+ --bs-gutter-x: 0.5rem;
+}
+
+.bodywebsite .g-2,
+ .bodywebsite .gy-2 {
+ --bs-gutter-y: 0.5rem;
+}
+
+.bodywebsite .g-3,
+ .bodywebsite .gx-3 {
+ --bs-gutter-x: 1rem;
+}
+
+.bodywebsite .g-3,
+ .bodywebsite .gy-3 {
+ --bs-gutter-y: 1rem;
+}
+
+.bodywebsite .g-4,
+ .bodywebsite .gx-4 {
+ --bs-gutter-x: 1.5rem;
+}
+
+.bodywebsite .g-4,
+ .bodywebsite .gy-4 {
+ --bs-gutter-y: 1.5rem;
+}
+
+.bodywebsite .g-5,
+ .bodywebsite .gx-5 {
+ --bs-gutter-x: 3rem;
+}
+
+.bodywebsite .g-5,
+ .bodywebsite .gy-5 {
+ --bs-gutter-y: 3rem;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .col-sm {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-sm-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-sm-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-sm-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-sm-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-sm-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-sm-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-sm-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-sm-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-sm-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-sm-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-sm-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-sm-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-sm-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-sm-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-sm-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-sm-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-sm-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-sm-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-sm-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-sm-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-sm-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-sm-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-sm-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-sm-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-sm-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-sm-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-sm-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-sm-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-sm-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-sm-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-sm-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-sm-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-sm-0,
+ .bodywebsite .gx-sm-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-sm-0,
+ .bodywebsite .gy-sm-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-sm-1,
+ .bodywebsite .gx-sm-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-sm-1,
+ .bodywebsite .gy-sm-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-sm-2,
+ .bodywebsite .gx-sm-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-sm-2,
+ .bodywebsite .gy-sm-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-sm-3,
+ .bodywebsite .gx-sm-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-sm-3,
+ .bodywebsite .gy-sm-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-sm-4,
+ .bodywebsite .gx-sm-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-sm-4,
+ .bodywebsite .gy-sm-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-sm-5,
+ .bodywebsite .gx-sm-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-sm-5,
+ .bodywebsite .gy-sm-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .col-md {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-md-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-md-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-md-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-md-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-md-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-md-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-md-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-md-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-md-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-md-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-md-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-md-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-md-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-md-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-md-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-md-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-md-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-md-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-md-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-md-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-md-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-md-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-md-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-md-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-md-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-md-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-md-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-md-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-md-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-md-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-md-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-md-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-md-0,
+ .bodywebsite .gx-md-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-md-0,
+ .bodywebsite .gy-md-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-md-1,
+ .bodywebsite .gx-md-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-md-1,
+ .bodywebsite .gy-md-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-md-2,
+ .bodywebsite .gx-md-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-md-2,
+ .bodywebsite .gy-md-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-md-3,
+ .bodywebsite .gx-md-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-md-3,
+ .bodywebsite .gy-md-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-md-4,
+ .bodywebsite .gx-md-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-md-4,
+ .bodywebsite .gy-md-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-md-5,
+ .bodywebsite .gx-md-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-md-5,
+ .bodywebsite .gy-md-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .col-lg {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-lg-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-lg-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-lg-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-lg-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-lg-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-lg-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-lg-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-lg-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-lg-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-lg-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-lg-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-lg-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-lg-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-lg-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-lg-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-lg-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-lg-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-lg-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-lg-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-lg-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-lg-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-lg-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-lg-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-lg-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-lg-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-lg-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-lg-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-lg-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-lg-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-lg-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-lg-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-lg-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-lg-0,
+ .bodywebsite .gx-lg-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-lg-0,
+ .bodywebsite .gy-lg-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-lg-1,
+ .bodywebsite .gx-lg-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-lg-1,
+ .bodywebsite .gy-lg-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-lg-2,
+ .bodywebsite .gx-lg-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-lg-2,
+ .bodywebsite .gy-lg-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-lg-3,
+ .bodywebsite .gx-lg-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-lg-3,
+ .bodywebsite .gy-lg-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-lg-4,
+ .bodywebsite .gx-lg-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-lg-4,
+ .bodywebsite .gy-lg-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-lg-5,
+ .bodywebsite .gx-lg-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-lg-5,
+ .bodywebsite .gy-lg-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .col-xl {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-xl-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-xl-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-xl-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-xl-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-xl-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-xl-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-xl-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-xl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-xl-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-xl-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-xl-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-xl-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-xl-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-xl-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-xl-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-xl-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-xl-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-xl-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-xl-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-xl-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-xl-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-xl-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-xl-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-xl-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-xl-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-xl-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-xl-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-xl-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-xl-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-xl-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-xl-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-xl-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-xl-0,
+ .bodywebsite .gx-xl-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-xl-0,
+ .bodywebsite .gy-xl-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-xl-1,
+ .bodywebsite .gx-xl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-xl-1,
+ .bodywebsite .gy-xl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-xl-2,
+ .bodywebsite .gx-xl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-xl-2,
+ .bodywebsite .gy-xl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-xl-3,
+ .bodywebsite .gx-xl-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-xl-3,
+ .bodywebsite .gy-xl-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-xl-4,
+ .bodywebsite .gx-xl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-xl-4,
+ .bodywebsite .gy-xl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-xl-5,
+ .bodywebsite .gx-xl-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-xl-5,
+ .bodywebsite .gy-xl-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .col-xxl {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-xxl-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-xxl-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-xxl-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-xxl-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-xxl-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-xxl-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-xxl-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-xxl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-xxl-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-xxl-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-xxl-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-xxl-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-xxl-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-xxl-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-xxl-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-xxl-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-xxl-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-xxl-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-xxl-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-xxl-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-xxl-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-xxl-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-xxl-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-xxl-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-xxl-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-xxl-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-xxl-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-xxl-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-xxl-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-xxl-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-xxl-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-xxl-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-xxl-0,
+ .bodywebsite .gx-xxl-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-xxl-0,
+ .bodywebsite .gy-xxl-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-xxl-1,
+ .bodywebsite .gx-xxl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-xxl-1,
+ .bodywebsite .gy-xxl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-xxl-2,
+ .bodywebsite .gx-xxl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-xxl-2,
+ .bodywebsite .gy-xxl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-xxl-3,
+ .bodywebsite .gx-xxl-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-xxl-3,
+ .bodywebsite .gy-xxl-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-xxl-4,
+ .bodywebsite .gx-xxl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-xxl-4,
+ .bodywebsite .gy-xxl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-xxl-5,
+ .bodywebsite .gx-xxl-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-xxl-5,
+ .bodywebsite .gy-xxl-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+.bodywebsite .table {
+ --bs-table-color: var(--bs-body-color);
+ --bs-table-bg: transparent;
+ --bs-table-border-color: var(--bs-border-color);
+ --bs-table-accent-bg: transparent;
+ --bs-table-striped-color: var(--bs-body-color);
+ --bs-table-striped-bg: rgba(0, 0, 0, 0.05);
+ --bs-table-active-color: var(--bs-body-color);
+ --bs-table-active-bg: rgba(0, 0, 0, 0.1);
+ --bs-table-hover-color: var(--bs-body-color);
+ --bs-table-hover-bg: rgba(0, 0, 0, 0.075);
+ width: 100%;
+ margin-bottom: 1rem;
+ color: var(--bs-table-color);
+ vertical-align: top;
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table > :not(caption) > * > * {
+ padding: 0.5rem 0.5rem;
+ background-color: var(--bs-table-bg);
+ border-bottom-width: 1px;
+ box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg);
+}
+
+.bodywebsite .table > tbody {
+ vertical-align: inherit;
+}
+
+.bodywebsite .table > thead {
+ vertical-align: bottom;
+}
+
+.bodywebsite .table-group-divider {
+ border-top: 2px solid currentcolor;
+}
+
+.bodywebsite .caption-top {
+ caption-side: top;
+}
+
+.bodywebsite .table-sm > :not(caption) > * > * {
+ padding: 0.25rem 0.25rem;
+}
+
+.bodywebsite .table-bordered > :not(caption) > * {
+ border-width: 1px 0;
+}
+
+.bodywebsite .table-bordered > :not(caption) > * > * {
+ border-width: 0 1px;
+}
+
+.bodywebsite .table-borderless > :not(caption) > * > * {
+ border-bottom-width: 0;
+}
+
+.bodywebsite .table-borderless > :not(:first-child) {
+ border-top-width: 0;
+}
+
+.bodywebsite .table-striped > tbody > tr:nth-of-type(odd) > * {
+ --bs-table-accent-bg: var(--bs-table-striped-bg);
+ color: var(--bs-table-striped-color);
+}
+
+.bodywebsite .table-striped-columns > :not(caption) > tr > :nth-child(even) {
+ --bs-table-accent-bg: var(--bs-table-striped-bg);
+ color: var(--bs-table-striped-color);
+}
+
+.bodywebsite .table-active {
+ --bs-table-accent-bg: var(--bs-table-active-bg);
+ color: var(--bs-table-active-color);
+}
+
+.bodywebsite .table-hover > tbody > tr:hover > * {
+ --bs-table-accent-bg: var(--bs-table-hover-bg);
+ color: var(--bs-table-hover-color);
+}
+
+.bodywebsite .table-primary {
+ --bs-table-color: #000;
+ --bs-table-bg: #cfe2ff;
+ --bs-table-border-color: #bacbe6;
+ --bs-table-striped-bg: #c5d7f2;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #bacbe6;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #bfd1ec;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-secondary {
+ --bs-table-color: #000;
+ --bs-table-bg: #e2e3e5;
+ --bs-table-border-color: #cbccce;
+ --bs-table-striped-bg: #d7d8da;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #cbccce;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #d1d2d4;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-success {
+ --bs-table-color: #000;
+ --bs-table-bg: #d1e7dd;
+ --bs-table-border-color: #bcd0c7;
+ --bs-table-striped-bg: #c7dbd2;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #bcd0c7;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #c1d6cc;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-info {
+ --bs-table-color: #000;
+ --bs-table-bg: #cff4fc;
+ --bs-table-border-color: #badce3;
+ --bs-table-striped-bg: #c5e8ef;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #badce3;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #bfe2e9;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-warning {
+ --bs-table-color: #000;
+ --bs-table-bg: #fff3cd;
+ --bs-table-border-color: #e6dbb9;
+ --bs-table-striped-bg: #f2e7c3;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #e6dbb9;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #ece1be;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-danger {
+ --bs-table-color: #000;
+ --bs-table-bg: #f8d7da;
+ --bs-table-border-color: #dfc2c4;
+ --bs-table-striped-bg: #eccccf;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #dfc2c4;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #e5c7ca;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-light {
+ --bs-table-color: #000;
+ --bs-table-bg: #f8f9fa;
+ --bs-table-border-color: #dfe0e1;
+ --bs-table-striped-bg: #ecedee;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #dfe0e1;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #e5e6e7;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-dark {
+ --bs-table-color: #fff;
+ --bs-table-bg: #212529;
+ --bs-table-border-color: #373b3e;
+ --bs-table-striped-bg: #2c3034;
+ --bs-table-striped-color: #fff;
+ --bs-table-active-bg: #373b3e;
+ --bs-table-active-color: #fff;
+ --bs-table-hover-bg: #323539;
+ --bs-table-hover-color: #fff;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-responsive {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .table-responsive-sm {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .table-responsive-md {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .table-responsive-lg {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .table-responsive-xl {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .table-responsive-xxl {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+.bodywebsite .form-label {
+ margin-bottom: 0.5rem;
+}
+
+.bodywebsite .col-form-label {
+ padding-top: calc(0.375rem + 1px);
+ padding-bottom: calc(0.375rem + 1px);
+ margin-bottom: 0;
+ font-size: inherit;
+ line-height: 1.5;
+}
+
+.bodywebsite .col-form-label-lg {
+ padding-top: calc(0.5rem + 1px);
+ padding-bottom: calc(0.5rem + 1px);
+ font-size: 1.25rem;
+}
+
+.bodywebsite .col-form-label-sm {
+ padding-top: calc(0.25rem + 1px);
+ padding-bottom: calc(0.25rem + 1px);
+ font-size: 0.875rem;
+}
+
+.bodywebsite .form-text {
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: #6c757d;
+}
+
+.bodywebsite .form-control {
+ display: block;
+ width: 100%;
+ padding: 0.375rem 0.75rem;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #212529;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid #ced4da;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ border-radius: 0.375rem;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-control {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-control[type=file] {
+ overflow: hidden;
+}
+
+.bodywebsite .form-control[type=file]:not(:disabled):not([readonly]) {
+ cursor: pointer;
+}
+
+.bodywebsite .form-control:focus {
+ color: #212529;
+ background-color: #fff;
+ border-color: #86b7fe;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-control::-webkit-date-and-time-value {
+ height: 1.5em;
+}
+
+.bodywebsite .form-control::-moz-placeholder {
+ color: #6c757d;
+ opacity: 1;
+}
+
+.bodywebsite .form-control::placeholder {
+ color: #6c757d;
+ opacity: 1;
+}
+
+.bodywebsite .form-control:disabled {
+ background-color: #e9ecef;
+ opacity: 1;
+}
+
+.bodywebsite .form-control::-webkit-file-upload-button {
+ padding: 0.375rem 0.75rem;
+ margin: -0.375rem -0.75rem;
+ -webkit-margin-end: 0.75rem;
+ margin-inline-end: 0.75rem;
+ color: #212529;
+ background-color: #e9ecef;
+ pointer-events: none;
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+ border-inline-end-width: 1px;
+ border-radius: 0;
+ -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+.bodywebsite .form-control::file-selector-button {
+ padding: 0.375rem 0.75rem;
+ margin: -0.375rem -0.75rem;
+ -webkit-margin-end: 0.75rem;
+ margin-inline-end: 0.75rem;
+ color: #212529;
+ background-color: #e9ecef;
+ pointer-events: none;
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+ border-inline-end-width: 1px;
+ border-radius: 0;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-control::-webkit-file-upload-button {
+ -webkit-transition: none;
+ transition: none;
+ }
+
+ .bodywebsite .form-control::file-selector-button {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {
+ background-color: #dde0e3;
+}
+
+.bodywebsite .form-control:hover:not(:disabled):not([readonly])::file-selector-button {
+ background-color: #dde0e3;
+}
+
+.bodywebsite .form-control-plaintext {
+ display: block;
+ width: 100%;
+ padding: 0.375rem 0;
+ margin-bottom: 0;
+ line-height: 1.5;
+ color: #212529;
+ background-color: transparent;
+ border: solid transparent;
+ border-width: 1px 0;
+}
+
+.bodywebsite .form-control-plaintext:focus {
+ outline: 0;
+}
+
+.bodywebsite .form-control-plaintext.form-control-sm, .bodywebsite .form-control-plaintext.form-control-lg {
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.bodywebsite .form-control-sm {
+ min-height: calc(1.5em + 0.5rem + 2px);
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.25rem;
+}
+
+.bodywebsite .form-control-sm::-webkit-file-upload-button {
+ padding: 0.25rem 0.5rem;
+ margin: -0.25rem -0.5rem;
+ -webkit-margin-end: 0.5rem;
+ margin-inline-end: 0.5rem;
+}
+
+.bodywebsite .form-control-sm::file-selector-button {
+ padding: 0.25rem 0.5rem;
+ margin: -0.25rem -0.5rem;
+ -webkit-margin-end: 0.5rem;
+ margin-inline-end: 0.5rem;
+}
+
+.bodywebsite .form-control-lg {
+ min-height: calc(1.5em + 1rem + 2px);
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ border-radius: 0.5rem;
+}
+
+.bodywebsite .form-control-lg::-webkit-file-upload-button {
+ padding: 0.5rem 1rem;
+ margin: -0.5rem -1rem;
+ -webkit-margin-end: 1rem;
+ margin-inline-end: 1rem;
+}
+
+.bodywebsite .form-control-lg::file-selector-button {
+ padding: 0.5rem 1rem;
+ margin: -0.5rem -1rem;
+ -webkit-margin-end: 1rem;
+ margin-inline-end: 1rem;
+}
+
+.bodywebsite textarea.form-control {
+ min-height: calc(1.5em + 0.75rem + 2px);
+}
+
+.bodywebsite textarea.form-control-sm {
+ min-height: calc(1.5em + 0.5rem + 2px);
+}
+
+.bodywebsite textarea.form-control-lg {
+ min-height: calc(1.5em + 1rem + 2px);
+}
+
+.bodywebsite .form-control-color {
+ width: 3rem;
+ height: calc(1.5em + 0.75rem + 2px);
+ padding: 0.375rem;
+}
+
+.bodywebsite .form-control-color:not(:disabled):not([readonly]) {
+ cursor: pointer;
+}
+
+.bodywebsite .form-control-color::-moz-color-swatch {
+ border: 0 !important;
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .form-control-color::-webkit-color-swatch {
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .form-control-color.form-control-sm {
+ height: calc(1.5em + 0.5rem + 2px);
+}
+
+.bodywebsite .form-control-color.form-control-lg {
+ height: calc(1.5em + 1rem + 2px);
+}
+
+.bodywebsite .form-select {
+ display: block;
+ width: 100%;
+ padding: 0.375rem 2.25rem 0.375rem 0.75rem;
+ -moz-padding-start: calc(0.75rem - 3px);
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #212529;
+ background-color: #fff;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: right 0.75rem center;
+ background-size: 16px 12px;
+ border: 1px solid #ced4da;
+ border-radius: 0.375rem;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-select {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-select:focus {
+ border-color: #86b7fe;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-select[multiple], .bodywebsite .form-select[size]:not([size="1"]) {
+ padding-right: 0.75rem;
+ background-image: none;
+}
+
+.bodywebsite .form-select:disabled {
+ background-color: #e9ecef;
+}
+
+.bodywebsite .form-select:-moz-focusring {
+ color: transparent;
+ text-shadow: 0 0 0 #212529;
+}
+
+.bodywebsite .form-select-sm {
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+ padding-left: 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.25rem;
+}
+
+.bodywebsite .form-select-lg {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ padding-left: 1rem;
+ font-size: 1.25rem;
+ border-radius: 0.5rem;
+}
+
+.bodywebsite .form-check {
+ display: block;
+ min-height: 1.5rem;
+ padding-left: 1.5em;
+ margin-bottom: 0.125rem;
+}
+
+.bodywebsite .form-check .form-check-input {
+ float: left;
+ margin-left: -1.5em;
+}
+
+.bodywebsite .form-check-reverse {
+ padding-right: 1.5em;
+ padding-left: 0;
+ text-align: right;
+}
+
+.bodywebsite .form-check-reverse .form-check-input {
+ float: right;
+ margin-right: -1.5em;
+ margin-left: 0;
+}
+
+.bodywebsite .form-check-input {
+ width: 1em;
+ height: 1em;
+ margin-top: 0.25em;
+ vertical-align: top;
+ background-color: #fff;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: contain;
+ border: 1px solid rgba(0, 0, 0, 0.25);
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ -webkit-print-color-adjust: exact;
+ color-adjust: exact;
+ print-color-adjust: exact;
+}
+
+.bodywebsite .form-check-input[type=checkbox] {
+ border-radius: 0.25em;
+}
+
+.bodywebsite .form-check-input[type=radio] {
+ border-radius: 50%;
+}
+
+.bodywebsite .form-check-input:active {
+ filter: brightness(90%);
+}
+
+.bodywebsite .form-check-input:focus {
+ border-color: #86b7fe;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-check-input:checked {
+ background-color: #0d6efd;
+ border-color: #0d6efd;
+}
+
+.bodywebsite .form-check-input:checked[type=checkbox] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-check-input:checked[type=radio] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-check-input[type=checkbox]:indeterminate {
+ background-color: #0d6efd;
+ border-color: #0d6efd;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-check-input:disabled {
+ pointer-events: none;
+ filter: none;
+ opacity: 0.5;
+}
+
+.bodywebsite .form-check-input[disabled] ~ .form-check-label, .bodywebsite .form-check-input:disabled ~ .form-check-label {
+ cursor: default;
+ opacity: 0.5;
+}
+
+.bodywebsite .form-switch {
+ padding-left: 2.5em;
+}
+
+.bodywebsite .form-switch .form-check-input {
+ width: 2em;
+ margin-left: -2.5em;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");
+ background-position: left center;
+ border-radius: 2em;
+ transition: background-position 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-switch .form-check-input {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-switch .form-check-input:focus {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-switch .form-check-input:checked {
+ background-position: right center;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-switch.form-check-reverse {
+ padding-right: 2.5em;
+ padding-left: 0;
+}
+
+.bodywebsite .form-switch.form-check-reverse .form-check-input {
+ margin-right: -2.5em;
+ margin-left: 0;
+}
+
+.bodywebsite .form-check-inline {
+ display: inline-block;
+ margin-right: 1rem;
+}
+
+.bodywebsite .btn-check {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none;
+}
+
+.bodywebsite .btn-check[disabled] + .btn, .bodywebsite .btn-check:disabled + .btn {
+ pointer-events: none;
+ filter: none;
+ opacity: 0.65;
+}
+
+.bodywebsite .form-range {
+ width: 100%;
+ height: 1.5rem;
+ padding: 0;
+ background-color: transparent;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+.bodywebsite .form-range:focus {
+ outline: 0;
+}
+
+.bodywebsite .form-range:focus::-webkit-slider-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-range:focus::-moz-range-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-range::-moz-focus-outer {
+ border: 0;
+}
+
+.bodywebsite .form-range::-webkit-slider-thumb {
+ width: 1rem;
+ height: 1rem;
+ margin-top: -0.25rem;
+ background-color: #0d6efd;
+ border: 0;
+ border-radius: 1rem;
+ -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -webkit-appearance: none;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-range::-webkit-slider-thumb {
+ -webkit-transition: none;
+ transition: none;
+ }
+}
+
+.bodywebsite .form-range::-webkit-slider-thumb:active {
+ background-color: #b6d4fe;
+}
+
+.bodywebsite .form-range::-webkit-slider-runnable-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #dee2e6;
+ border-color: transparent;
+ border-radius: 1rem;
+}
+
+.bodywebsite .form-range::-moz-range-thumb {
+ width: 1rem;
+ height: 1rem;
+ background-color: #0d6efd;
+ border: 0;
+ border-radius: 1rem;
+ -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-range::-moz-range-thumb {
+ -moz-transition: none;
+ transition: none;
+ }
+}
+
+.bodywebsite .form-range::-moz-range-thumb:active {
+ background-color: #b6d4fe;
+}
+
+.bodywebsite .form-range::-moz-range-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #dee2e6;
+ border-color: transparent;
+ border-radius: 1rem;
+}
+
+.bodywebsite .form-range:disabled {
+ pointer-events: none;
+}
+
+.bodywebsite .form-range:disabled::-webkit-slider-thumb {
+ background-color: #adb5bd;
+}
+
+.bodywebsite .form-range:disabled::-moz-range-thumb {
+ background-color: #adb5bd;
+}
+
+.bodywebsite .form-floating {
+ position: relative;
+}
+
+.bodywebsite .form-floating > .form-control,
+ .bodywebsite .form-floating > .form-control-plaintext,
+ .bodywebsite .form-floating > .form-select {
+ height: calc(3.5rem + 2px);
+ line-height: 1.25;
+}
+
+.bodywebsite .form-floating > label {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ padding: 1rem 0.75rem;
+ overflow: hidden;
+ text-align: start;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ pointer-events: none;
+ border: 1px solid transparent;
+ transform-origin: 0 0;
+ transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-floating > label {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-floating > .form-control,
+ .bodywebsite .form-floating > .form-control-plaintext {
+ padding: 1rem 0.75rem;
+}
+
+.bodywebsite .form-floating > .form-control::-moz-placeholder, .bodywebsite .form-floating > .form-control-plaintext::-moz-placeholder {
+ color: transparent;
+}
+
+.bodywebsite .form-floating > .form-control::placeholder,
+ .bodywebsite .form-floating > .form-control-plaintext::placeholder {
+ color: transparent;
+}
+
+.bodywebsite .form-floating > .form-control:not(:-moz-placeholder-shown), .bodywebsite .form-floating > .form-control-plaintext:not(:-moz-placeholder-shown) {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.bodywebsite .form-floating > .form-control:focus, .bodywebsite .form-floating > .form-control:not(:placeholder-shown),
+ .bodywebsite .form-floating > .form-control-plaintext:focus,
+ .bodywebsite .form-floating > .form-control-plaintext:not(:placeholder-shown) {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.bodywebsite .form-floating > .form-control:-webkit-autofill,
+ .bodywebsite .form-floating > .form-control-plaintext:-webkit-autofill {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.bodywebsite .form-floating > .form-select {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.bodywebsite .form-floating > .form-control:not(:-moz-placeholder-shown) ~ label {
+ opacity: 0.65;
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
+}
+
+.bodywebsite .form-floating > .form-control:focus ~ label,
+ .bodywebsite .form-floating > .form-control:not(:placeholder-shown) ~ label,
+ .bodywebsite .form-floating > .form-control-plaintext ~ label,
+ .bodywebsite .form-floating > .form-select ~ label {
+ opacity: 0.65;
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
+}
+
+.bodywebsite .form-floating > .form-control:-webkit-autofill ~ label {
+ opacity: 0.65;
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
+}
+
+.bodywebsite .form-floating > .form-control-plaintext ~ label {
+ border-width: 1px 0;
+}
+
+.bodywebsite .input-group {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: stretch;
+ width: 100%;
+}
+
+.bodywebsite .input-group > .form-control,
+ .bodywebsite .input-group > .form-select,
+ .bodywebsite .input-group > .form-floating {
+ position: relative;
+ flex: 1 1 auto;
+ width: 1%;
+ min-width: 0;
+}
+
+.bodywebsite .input-group > .form-control:focus,
+ .bodywebsite .input-group > .form-select:focus,
+ .bodywebsite .input-group > .form-floating:focus-within {
+ z-index: 5;
+}
+
+.bodywebsite .input-group .btn {
+ position: relative;
+ z-index: 2;
+}
+
+.bodywebsite .input-group .btn:focus {
+ z-index: 5;
+}
+
+.bodywebsite .input-group-text {
+ display: flex;
+ align-items: center;
+ padding: 0.375rem 0.75rem;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #212529;
+ text-align: center;
+ white-space: nowrap;
+ background-color: #e9ecef;
+ border: 1px solid #ced4da;
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .input-group-lg > .form-control,
+ .bodywebsite .input-group-lg > .form-select,
+ .bodywebsite .input-group-lg > .input-group-text,
+ .bodywebsite .input-group-lg > .btn {
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ border-radius: 0.5rem;
+}
+
+.bodywebsite .input-group-sm > .form-control,
+ .bodywebsite .input-group-sm > .form-select,
+ .bodywebsite .input-group-sm > .input-group-text,
+ .bodywebsite .input-group-sm > .btn {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.25rem;
+}
+
+.bodywebsite .input-group-lg > .form-select,
+ .bodywebsite .input-group-sm > .form-select {
+ padding-right: 3rem;
+}
+
+.bodywebsite .input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),
+ .bodywebsite .input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3),
+ .bodywebsite .input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control,
+ .bodywebsite .input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.bodywebsite .input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),
+ .bodywebsite .input-group.has-validation > .dropdown-toggle:nth-last-child(n+4),
+ .bodywebsite .input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control,
+ .bodywebsite .input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.bodywebsite .input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {
+ margin-left: -1px;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .input-group > .form-floating:not(:first-child) > .form-control,
+ .bodywebsite .input-group > .form-floating:not(:first-child) > .form-select {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .valid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: #198754;
+}
+
+.bodywebsite .valid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 0.25rem 0.5rem;
+ margin-top: 0.1rem;
+ font-size: 0.875rem;
+ color: #fff;
+ background-color: rgba(25, 135, 84, 0.9);
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .was-validated :valid ~ .valid-feedback,
+ .bodywebsite .was-validated :valid ~ .valid-tooltip,
+ .bodywebsite .is-valid ~ .valid-feedback,
+ .bodywebsite .is-valid ~ .valid-tooltip {
+ display: block;
+}
+
+.bodywebsite .was-validated .form-control:valid, .bodywebsite .form-control.is-valid {
+ border-color: #198754;
+ padding-right: calc(1.5em + 0.75rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: right calc(0.375em + 0.1875rem) center;
+ background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.bodywebsite .was-validated .form-control:valid:focus, .bodywebsite .form-control.is-valid:focus {
+ border-color: #198754;
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
+}
+
+.bodywebsite .was-validated textarea.form-control:valid, .bodywebsite textarea.form-control.is-valid {
+ padding-right: calc(1.5em + 0.75rem);
+ background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
+}
+
+.bodywebsite .was-validated .form-select:valid, .bodywebsite .form-select.is-valid {
+ border-color: #198754;
+}
+
+.bodywebsite .was-validated .form-select:valid:not([multiple]):not([size]), .bodywebsite .was-validated .form-select:valid:not([multiple])[size="1"], .bodywebsite .form-select.is-valid:not([multiple]):not([size]), .bodywebsite .form-select.is-valid:not([multiple])[size="1"] {
+ padding-right: 4.125rem;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
+ background-position: right 0.75rem center, center right 2.25rem;
+ background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.bodywebsite .was-validated .form-select:valid:focus, .bodywebsite .form-select.is-valid:focus {
+ border-color: #198754;
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
+}
+
+.bodywebsite .was-validated .form-control-color:valid, .bodywebsite .form-control-color.is-valid {
+ width: calc(3rem + calc(1.5em + 0.75rem));
+}
+
+.bodywebsite .was-validated .form-check-input:valid, .bodywebsite .form-check-input.is-valid {
+ border-color: #198754;
+}
+
+.bodywebsite .was-validated .form-check-input:valid:checked, .bodywebsite .form-check-input.is-valid:checked {
+ background-color: #198754;
+}
+
+.bodywebsite .was-validated .form-check-input:valid:focus, .bodywebsite .form-check-input.is-valid:focus {
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
+}
+
+.bodywebsite .was-validated .form-check-input:valid ~ .form-check-label, .bodywebsite .form-check-input.is-valid ~ .form-check-label {
+ color: #198754;
+}
+
+.bodywebsite .form-check-inline .form-check-input ~ .valid-feedback {
+ margin-left: 0.5em;
+}
+
+.bodywebsite .was-validated .input-group > .form-control:not(:focus):valid, .bodywebsite .input-group > .form-control:not(:focus).is-valid,
+ .bodywebsite .was-validated .input-group > .form-select:not(:focus):valid,
+ .bodywebsite .input-group > .form-select:not(:focus).is-valid,
+ .bodywebsite .was-validated .input-group > .form-floating:not(:focus-within):valid,
+ .bodywebsite .input-group > .form-floating:not(:focus-within).is-valid {
+ z-index: 3;
+}
+
+.bodywebsite .invalid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: #dc3545;
+}
+
+.bodywebsite .invalid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 0.25rem 0.5rem;
+ margin-top: 0.1rem;
+ font-size: 0.875rem;
+ color: #fff;
+ background-color: rgba(220, 53, 69, 0.9);
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .was-validated :invalid ~ .invalid-feedback,
+ .bodywebsite .was-validated :invalid ~ .invalid-tooltip,
+ .bodywebsite .is-invalid ~ .invalid-feedback,
+ .bodywebsite .is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.bodywebsite .was-validated .form-control:invalid, .bodywebsite .form-control.is-invalid {
+ border-color: #dc3545;
+ padding-right: calc(1.5em + 0.75rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: right calc(0.375em + 0.1875rem) center;
+ background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.bodywebsite .was-validated .form-control:invalid:focus, .bodywebsite .form-control.is-invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
+}
+
+.bodywebsite .was-validated textarea.form-control:invalid, .bodywebsite textarea.form-control.is-invalid {
+ padding-right: calc(1.5em + 0.75rem);
+ background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
+}
+
+.bodywebsite .was-validated .form-select:invalid, .bodywebsite .form-select.is-invalid {
+ border-color: #dc3545;
+}
+
+.bodywebsite .was-validated .form-select:invalid:not([multiple]):not([size]), .bodywebsite .was-validated .form-select:invalid:not([multiple])[size="1"], .bodywebsite .form-select.is-invalid:not([multiple]):not([size]), .bodywebsite .form-select.is-invalid:not([multiple])[size="1"] {
+ padding-right: 4.125rem;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
+ background-position: right 0.75rem center, center right 2.25rem;
+ background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.bodywebsite .was-validated .form-select:invalid:focus, .bodywebsite .form-select.is-invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
+}
+
+.bodywebsite .was-validated .form-control-color:invalid, .bodywebsite .form-control-color.is-invalid {
+ width: calc(3rem + calc(1.5em + 0.75rem));
+}
+
+.bodywebsite .was-validated .form-check-input:invalid, .bodywebsite .form-check-input.is-invalid {
+ border-color: #dc3545;
+}
+
+.bodywebsite .was-validated .form-check-input:invalid:checked, .bodywebsite .form-check-input.is-invalid:checked {
+ background-color: #dc3545;
+}
+
+.bodywebsite .was-validated .form-check-input:invalid:focus, .bodywebsite .form-check-input.is-invalid:focus {
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
+}
+
+.bodywebsite .was-validated .form-check-input:invalid ~ .form-check-label, .bodywebsite .form-check-input.is-invalid ~ .form-check-label {
+ color: #dc3545;
+}
+
+.bodywebsite .form-check-inline .form-check-input ~ .invalid-feedback {
+ margin-left: 0.5em;
+}
+
+.bodywebsite .was-validated .input-group > .form-control:not(:focus):invalid, .bodywebsite .input-group > .form-control:not(:focus).is-invalid,
+ .bodywebsite .was-validated .input-group > .form-select:not(:focus):invalid,
+ .bodywebsite .input-group > .form-select:not(:focus).is-invalid,
+ .bodywebsite .was-validated .input-group > .form-floating:not(:focus-within):invalid,
+ .bodywebsite .input-group > .form-floating:not(:focus-within).is-invalid {
+ z-index: 4;
+}
+
+.bodywebsite .btn {
+ --bs-btn-padding-x: 0.75rem;
+ --bs-btn-padding-y: 0.375rem;
+ --bs-btn-font-size: 1rem;
+ --bs-btn-font-weight: 400;
+ --bs-btn-line-height: 1.5;
+ --bs-btn-color: #212529;
+ --bs-btn-bg: transparent;
+ --bs-btn-border-width: 1px;
+ --bs-btn-border-color: transparent;
+ --bs-btn-border-radius: 0.375rem;
+ --bs-btn-hover-border-color: transparent;
+ --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+ --bs-btn-disabled-opacity: 0.65;
+ display: inline-block;
+ padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x);
+ font-family: var(--bs-btn-font-family);
+ font-size: var(--bs-btn-font-size);
+ font-weight: var(--bs-btn-font-weight);
+ line-height: var(--bs-btn-line-height);
+ color: var(--bs-btn-color);
+ text-align: center;
+ text-decoration: none;
+ vertical-align: middle;
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);
+ border-radius: var(--bs-btn-border-radius);
+ background-color: var(--bs-btn-bg);
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .btn {
+ transition: none;
+ }
+}
+
+.bodywebsite :not(.btn-check) + .btn:hover, .bodywebsite .btn:first-child:hover {
+ color: var(--bs-btn-hover-color);
+ background-color: var(--bs-btn-hover-bg);
+ border-color: var(--bs-btn-hover-border-color);
+}
+
+.bodywebsite .btn:focus-visible {
+ color: var(--bs-btn-hover-color);
+ background-color: var(--bs-btn-hover-bg);
+ border-color: var(--bs-btn-hover-border-color);
+ outline: 0;
+ box-shadow: var(--bs-btn-focus-box-shadow);
+}
+
+.bodywebsite .btn-check:focus-visible + .btn {
+ border-color: var(--bs-btn-hover-border-color);
+ outline: 0;
+ box-shadow: var(--bs-btn-focus-box-shadow);
+}
+
+.bodywebsite .btn-check:checked + .btn, .bodywebsite :not(.btn-check) + .btn:active, .bodywebsite .btn:first-child:active, .bodywebsite .btn.active, .bodywebsite .btn.show {
+ color: var(--bs-btn-active-color);
+ background-color: var(--bs-btn-active-bg);
+ border-color: var(--bs-btn-active-border-color);
+}
+
+.bodywebsite .btn-check:checked + .btn:focus-visible, .bodywebsite :not(.btn-check) + .btn:active:focus-visible, .bodywebsite .btn:first-child:active:focus-visible, .bodywebsite .btn.active:focus-visible, .bodywebsite .btn.show:focus-visible {
+ box-shadow: var(--bs-btn-focus-box-shadow);
+}
+
+.bodywebsite .btn:disabled, .bodywebsite .btn.disabled, .bodywebsite fieldset:disabled .btn {
+ color: var(--bs-btn-disabled-color);
+ pointer-events: none;
+ background-color: var(--bs-btn-disabled-bg);
+ border-color: var(--bs-btn-disabled-border-color);
+ opacity: var(--bs-btn-disabled-opacity);
+}
+
+.bodywebsite .btn-primary {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #0d6efd;
+ --bs-btn-border-color: #0d6efd;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #0b5ed7;
+ --bs-btn-hover-border-color: #0a58ca;
+ --bs-btn-focus-shadow-rgb: 49, 132, 253;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #0a58ca;
+ --bs-btn-active-border-color: #0a53be;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #0d6efd;
+ --bs-btn-disabled-border-color: #0d6efd;
+}
+
+.bodywebsite .btn-secondary {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #6c757d;
+ --bs-btn-border-color: #6c757d;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #5c636a;
+ --bs-btn-hover-border-color: #565e64;
+ --bs-btn-focus-shadow-rgb: 130, 138, 145;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #565e64;
+ --bs-btn-active-border-color: #51585e;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #6c757d;
+ --bs-btn-disabled-border-color: #6c757d;
+}
+
+.bodywebsite .btn-success {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #198754;
+ --bs-btn-border-color: #198754;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #157347;
+ --bs-btn-hover-border-color: #146c43;
+ --bs-btn-focus-shadow-rgb: 60, 153, 110;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #146c43;
+ --bs-btn-active-border-color: #13653f;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #198754;
+ --bs-btn-disabled-border-color: #198754;
+}
+
+.bodywebsite .btn-info {
+ --bs-btn-color: #000;
+ --bs-btn-bg: #0dcaf0;
+ --bs-btn-border-color: #0dcaf0;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #31d2f2;
+ --bs-btn-hover-border-color: #25cff2;
+ --bs-btn-focus-shadow-rgb: 11, 172, 204;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #3dd5f3;
+ --bs-btn-active-border-color: #25cff2;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #000;
+ --bs-btn-disabled-bg: #0dcaf0;
+ --bs-btn-disabled-border-color: #0dcaf0;
+}
+
+.bodywebsite .btn-warning {
+ --bs-btn-color: #000;
+ --bs-btn-bg: #ffc107;
+ --bs-btn-border-color: #ffc107;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #ffca2c;
+ --bs-btn-hover-border-color: #ffc720;
+ --bs-btn-focus-shadow-rgb: 217, 164, 6;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #ffcd39;
+ --bs-btn-active-border-color: #ffc720;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #000;
+ --bs-btn-disabled-bg: #ffc107;
+ --bs-btn-disabled-border-color: #ffc107;
+}
+
+.bodywebsite .btn-danger {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #dc3545;
+ --bs-btn-border-color: #dc3545;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #bb2d3b;
+ --bs-btn-hover-border-color: #b02a37;
+ --bs-btn-focus-shadow-rgb: 225, 83, 97;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #b02a37;
+ --bs-btn-active-border-color: #a52834;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #dc3545;
+ --bs-btn-disabled-border-color: #dc3545;
+}
+
+.bodywebsite .btn-light {
+ --bs-btn-color: #000;
+ --bs-btn-bg: #f8f9fa;
+ --bs-btn-border-color: #f8f9fa;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #d3d4d5;
+ --bs-btn-hover-border-color: #c6c7c8;
+ --bs-btn-focus-shadow-rgb: 211, 212, 213;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #c6c7c8;
+ --bs-btn-active-border-color: #babbbc;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #000;
+ --bs-btn-disabled-bg: #f8f9fa;
+ --bs-btn-disabled-border-color: #f8f9fa;
+}
+
+.bodywebsite .btn-dark {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #212529;
+ --bs-btn-border-color: #212529;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #424649;
+ --bs-btn-hover-border-color: #373b3e;
+ --bs-btn-focus-shadow-rgb: 66, 70, 73;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #4d5154;
+ --bs-btn-active-border-color: #373b3e;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #212529;
+ --bs-btn-disabled-border-color: #212529;
+}
+
+.bodywebsite .btn-outline-primary {
+ --bs-btn-color: #0d6efd;
+ --bs-btn-border-color: #0d6efd;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #0d6efd;
+ --bs-btn-hover-border-color: #0d6efd;
+ --bs-btn-focus-shadow-rgb: 13, 110, 253;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #0d6efd;
+ --bs-btn-active-border-color: #0d6efd;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #0d6efd;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #0d6efd;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-secondary {
+ --bs-btn-color: #6c757d;
+ --bs-btn-border-color: #6c757d;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #6c757d;
+ --bs-btn-hover-border-color: #6c757d;
+ --bs-btn-focus-shadow-rgb: 108, 117, 125;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #6c757d;
+ --bs-btn-active-border-color: #6c757d;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #6c757d;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #6c757d;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-success {
+ --bs-btn-color: #198754;
+ --bs-btn-border-color: #198754;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #198754;
+ --bs-btn-hover-border-color: #198754;
+ --bs-btn-focus-shadow-rgb: 25, 135, 84;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #198754;
+ --bs-btn-active-border-color: #198754;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #198754;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #198754;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-info {
+ --bs-btn-color: #0dcaf0;
+ --bs-btn-border-color: #0dcaf0;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #0dcaf0;
+ --bs-btn-hover-border-color: #0dcaf0;
+ --bs-btn-focus-shadow-rgb: 13, 202, 240;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #0dcaf0;
+ --bs-btn-active-border-color: #0dcaf0;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #0dcaf0;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #0dcaf0;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-warning {
+ --bs-btn-color: #ffc107;
+ --bs-btn-border-color: #ffc107;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #ffc107;
+ --bs-btn-hover-border-color: #ffc107;
+ --bs-btn-focus-shadow-rgb: 255, 193, 7;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #ffc107;
+ --bs-btn-active-border-color: #ffc107;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #ffc107;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #ffc107;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-danger {
+ --bs-btn-color: #dc3545;
+ --bs-btn-border-color: #dc3545;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #dc3545;
+ --bs-btn-hover-border-color: #dc3545;
+ --bs-btn-focus-shadow-rgb: 220, 53, 69;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #dc3545;
+ --bs-btn-active-border-color: #dc3545;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #dc3545;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #dc3545;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-light {
+ --bs-btn-color: #f8f9fa;
+ --bs-btn-border-color: #f8f9fa;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #f8f9fa;
+ --bs-btn-hover-border-color: #f8f9fa;
+ --bs-btn-focus-shadow-rgb: 248, 249, 250;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #f8f9fa;
+ --bs-btn-active-border-color: #f8f9fa;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #f8f9fa;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #f8f9fa;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-dark {
+ --bs-btn-color: #212529;
+ --bs-btn-border-color: #212529;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #212529;
+ --bs-btn-hover-border-color: #212529;
+ --bs-btn-focus-shadow-rgb: 33, 37, 41;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #212529;
+ --bs-btn-active-border-color: #212529;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #212529;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #212529;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-link {
+ --bs-btn-font-weight: 400;
+ --bs-btn-color: var(--bs-link-color);
+ --bs-btn-bg: transparent;
+ --bs-btn-border-color: transparent;
+ --bs-btn-hover-color: var(--bs-link-hover-color);
+ --bs-btn-hover-border-color: transparent;
+ --bs-btn-active-color: var(--bs-link-hover-color);
+ --bs-btn-active-border-color: transparent;
+ --bs-btn-disabled-color: #6c757d;
+ --bs-btn-disabled-border-color: transparent;
+ --bs-btn-box-shadow: none;
+ --bs-btn-focus-shadow-rgb: 49, 132, 253;
+ text-decoration: underline;
+}
+
+.bodywebsite .btn-link:focus-visible {
+ color: var(--bs-btn-color);
+}
+
+.bodywebsite .btn-link:hover {
+ color: var(--bs-btn-hover-color);
+}
+
+.bodywebsite .btn-lg, .bodywebsite .btn-group-lg > .btn {
+ --bs-btn-padding-y: 0.5rem;
+ --bs-btn-padding-x: 1rem;
+ --bs-btn-font-size: 1.25rem;
+ --bs-btn-border-radius: 0.5rem;
+}
+
+.bodywebsite .btn-sm, .bodywebsite .btn-group-sm > .btn {
+ --bs-btn-padding-y: 0.25rem;
+ --bs-btn-padding-x: 0.5rem;
+ --bs-btn-font-size: 0.875rem;
+ --bs-btn-border-radius: 0.25rem;
+}
+
+.bodywebsite .fade {
+ transition: opacity 0.15s linear;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .fade {
+ transition: none;
+ }
+}
+
+.bodywebsite .fade:not(.show) {
+ opacity: 0;
+}
+
+.bodywebsite .collapse:not(.show) {
+ display: none;
+}
+
+.bodywebsite .collapsing {
+ height: 0;
+ overflow: hidden;
+ transition: height 0.35s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .collapsing {
+ transition: none;
+ }
+}
+
+.bodywebsite .collapsing.collapse-horizontal {
+ width: 0;
+ height: auto;
+ transition: width 0.35s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .collapsing.collapse-horizontal {
+ transition: none;
+ }
+}
+
+.bodywebsite .dropup,
+ .bodywebsite .dropend,
+ .bodywebsite .dropdown,
+ .bodywebsite .dropstart,
+ .bodywebsite .dropup-center,
+ .bodywebsite .dropdown-center {
+ position: relative;
+}
+
+.bodywebsite .dropdown-toggle {
+ white-space: nowrap;
+}
+
+.bodywebsite .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0;
+ border-left: 0.3em solid transparent;
+}
+
+.bodywebsite .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropdown-menu {
+ --bs-dropdown-zindex: 1000;
+ --bs-dropdown-min-width: 10rem;
+ --bs-dropdown-padding-x: 0;
+ --bs-dropdown-padding-y: 0.5rem;
+ --bs-dropdown-spacer: 0.125rem;
+ --bs-dropdown-font-size: 1rem;
+ --bs-dropdown-color: #212529;
+ --bs-dropdown-bg: #fff;
+ --bs-dropdown-border-color: var(--bs-border-color-translucent);
+ --bs-dropdown-border-radius: 0.375rem;
+ --bs-dropdown-border-width: 1px;
+ --bs-dropdown-inner-border-radius: calc(0.375rem - 1px);
+ --bs-dropdown-divider-bg: var(--bs-border-color-translucent);
+ --bs-dropdown-divider-margin-y: 0.5rem;
+ --bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ --bs-dropdown-link-color: #212529;
+ --bs-dropdown-link-hover-color: #1e2125;
+ --bs-dropdown-link-hover-bg: #e9ecef;
+ --bs-dropdown-link-active-color: #fff;
+ --bs-dropdown-link-active-bg: #0d6efd;
+ --bs-dropdown-link-disabled-color: #adb5bd;
+ --bs-dropdown-item-padding-x: 1rem;
+ --bs-dropdown-item-padding-y: 0.25rem;
+ --bs-dropdown-header-color: #6c757d;
+ --bs-dropdown-header-padding-x: 1rem;
+ --bs-dropdown-header-padding-y: 0.5rem;
+ position: absolute;
+ z-index: var(--bs-dropdown-zindex);
+ display: none;
+ min-width: var(--bs-dropdown-min-width);
+ padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);
+ margin: 0;
+ font-size: var(--bs-dropdown-font-size);
+ color: var(--bs-dropdown-color);
+ text-align: left;
+ list-style: none;
+ background-color: var(--bs-dropdown-bg);
+ background-clip: padding-box;
+ border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);
+ border-radius: var(--bs-dropdown-border-radius);
+}
+
+.bodywebsite .dropdown-menu[data-bs-popper] {
+ top: 100%;
+ left: 0;
+ margin-top: var(--bs-dropdown-spacer);
+}
+
+.bodywebsite .dropdown-menu-start {
+ --bs-position: start;
+}
+
+.bodywebsite .dropdown-menu-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+}
+
+.bodywebsite .dropdown-menu-end {
+ --bs-position: end;
+}
+
+.bodywebsite .dropdown-menu-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .dropdown-menu-sm-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-sm-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-sm-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-sm-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .dropdown-menu-md-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-md-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-md-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-md-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .dropdown-menu-lg-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-lg-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-lg-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-lg-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .dropdown-menu-xl-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-xl-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-xl-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-xl-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .dropdown-menu-xxl-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-xxl-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-xxl-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-xxl-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+.bodywebsite .dropup .dropdown-menu[data-bs-popper] {
+ top: auto;
+ bottom: 100%;
+ margin-top: 0;
+ margin-bottom: var(--bs-dropdown-spacer);
+}
+
+.bodywebsite .dropup .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0.3em solid;
+ border-left: 0.3em solid transparent;
+}
+
+.bodywebsite .dropup .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropend .dropdown-menu[data-bs-popper] {
+ top: 0;
+ right: auto;
+ left: 100%;
+ margin-top: 0;
+ margin-left: var(--bs-dropdown-spacer);
+}
+
+.bodywebsite .dropend .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid transparent;
+ border-right: 0;
+ border-bottom: 0.3em solid transparent;
+ border-left: 0.3em solid;
+}
+
+.bodywebsite .dropend .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropend .dropdown-toggle::after {
+ vertical-align: 0;
+}
+
+.bodywebsite .dropstart .dropdown-menu[data-bs-popper] {
+ top: 0;
+ right: 100%;
+ left: auto;
+ margin-top: 0;
+ margin-right: var(--bs-dropdown-spacer);
+}
+
+.bodywebsite .dropstart .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+}
+
+.bodywebsite .dropstart .dropdown-toggle::after {
+ display: none;
+}
+
+.bodywebsite .dropstart .dropdown-toggle::before {
+ display: inline-block;
+ margin-right: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid transparent;
+ border-right: 0.3em solid;
+ border-bottom: 0.3em solid transparent;
+}
+
+.bodywebsite .dropstart .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropstart .dropdown-toggle::before {
+ vertical-align: 0;
+}
+
+.bodywebsite .dropdown-divider {
+ height: 0;
+ margin: var(--bs-dropdown-divider-margin-y) 0;
+ overflow: hidden;
+ border-top: 1px solid var(--bs-dropdown-divider-bg);
+ opacity: 1;
+}
+
+.bodywebsite .dropdown-item {
+ display: block;
+ width: 100%;
+ padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);
+ clear: both;
+ font-weight: 400;
+ color: var(--bs-dropdown-link-color);
+ text-align: inherit;
+ text-decoration: none;
+ white-space: nowrap;
+ background-color: transparent;
+ border: 0;
+}
+
+.bodywebsite .dropdown-item:hover, .bodywebsite .dropdown-item:focus {
+ color: var(--bs-dropdown-link-hover-color);
+ background-color: var(--bs-dropdown-link-hover-bg);
+}
+
+.bodywebsite .dropdown-item.active, .bodywebsite .dropdown-item:active {
+ color: var(--bs-dropdown-link-active-color);
+ text-decoration: none;
+ background-color: var(--bs-dropdown-link-active-bg);
+}
+
+.bodywebsite .dropdown-item.disabled, .bodywebsite .dropdown-item:disabled {
+ color: var(--bs-dropdown-link-disabled-color);
+ pointer-events: none;
+ background-color: transparent;
+}
+
+.bodywebsite .dropdown-menu.show {
+ display: block;
+}
+
+.bodywebsite .dropdown-header {
+ display: block;
+ padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);
+ margin-bottom: 0;
+ font-size: 0.875rem;
+ color: var(--bs-dropdown-header-color);
+ white-space: nowrap;
+}
+
+.bodywebsite .dropdown-item-text {
+ display: block;
+ padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);
+ color: var(--bs-dropdown-link-color);
+}
+
+.bodywebsite .dropdown-menu-dark {
+ --bs-dropdown-color: #dee2e6;
+ --bs-dropdown-bg: #343a40;
+ --bs-dropdown-border-color: var(--bs-border-color-translucent);
+ --bs-dropdown-link-color: #dee2e6;
+ --bs-dropdown-link-hover-color: #fff;
+ --bs-dropdown-divider-bg: var(--bs-border-color-translucent);
+ --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);
+ --bs-dropdown-link-active-color: #fff;
+ --bs-dropdown-link-active-bg: #0d6efd;
+ --bs-dropdown-link-disabled-color: #adb5bd;
+ --bs-dropdown-header-color: #adb5bd;
+}
+
+.bodywebsite .btn-group,
+ .bodywebsite .btn-group-vertical {
+ position: relative;
+ display: inline-flex;
+ vertical-align: middle;
+}
+
+.bodywebsite .btn-group > .btn,
+ .bodywebsite .btn-group-vertical > .btn {
+ position: relative;
+ flex: 1 1 auto;
+}
+
+.bodywebsite .btn-group > .btn-check:checked + .btn,
+ .bodywebsite .btn-group > .btn-check:focus + .btn,
+ .bodywebsite .btn-group > .btn:hover,
+ .bodywebsite .btn-group > .btn:focus,
+ .bodywebsite .btn-group > .btn:active,
+ .bodywebsite .btn-group > .btn.active,
+ .bodywebsite .btn-group-vertical > .btn-check:checked + .btn,
+ .bodywebsite .btn-group-vertical > .btn-check:focus + .btn,
+ .bodywebsite .btn-group-vertical > .btn:hover,
+ .bodywebsite .btn-group-vertical > .btn:focus,
+ .bodywebsite .btn-group-vertical > .btn:active,
+ .bodywebsite .btn-group-vertical > .btn.active {
+ z-index: 1;
+}
+
+.bodywebsite .btn-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+}
+
+.bodywebsite .btn-toolbar .input-group {
+ width: auto;
+}
+
+.bodywebsite .btn-group {
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .btn-group > :not(.btn-check:first-child) + .btn,
+ .bodywebsite .btn-group > .btn-group:not(:first-child) {
+ margin-left: -1px;
+}
+
+.bodywebsite .btn-group > .btn:not(:last-child):not(.dropdown-toggle),
+ .bodywebsite .btn-group > .btn.dropdown-toggle-split:first-child,
+ .bodywebsite .btn-group > .btn-group:not(:last-child) > .btn {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.bodywebsite .btn-group > .btn:nth-child(n+3),
+ .bodywebsite .btn-group > :not(.btn-check) + .btn,
+ .bodywebsite .btn-group > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .dropdown-toggle-split {
+ padding-right: 0.5625rem;
+ padding-left: 0.5625rem;
+}
+
+.bodywebsite .dropdown-toggle-split::after, .bodywebsite .dropup .dropdown-toggle-split::after, .bodywebsite .dropend .dropdown-toggle-split::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropstart .dropdown-toggle-split::before {
+ margin-right: 0;
+}
+
+.bodywebsite .btn-sm + .dropdown-toggle-split, .bodywebsite .btn-group-sm > .btn + .dropdown-toggle-split {
+ padding-right: 0.375rem;
+ padding-left: 0.375rem;
+}
+
+.bodywebsite .btn-lg + .dropdown-toggle-split, .bodywebsite .btn-group-lg > .btn + .dropdown-toggle-split {
+ padding-right: 0.75rem;
+ padding-left: 0.75rem;
+}
+
+.bodywebsite .btn-group-vertical {
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+}
+
+.bodywebsite .btn-group-vertical > .btn,
+ .bodywebsite .btn-group-vertical > .btn-group {
+ width: 100%;
+}
+
+.bodywebsite .btn-group-vertical > .btn:not(:first-child),
+ .bodywebsite .btn-group-vertical > .btn-group:not(:first-child) {
+ margin-top: -1px;
+}
+
+.bodywebsite .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),
+ .bodywebsite .btn-group-vertical > .btn-group:not(:last-child) > .btn {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .btn-group-vertical > .btn ~ .btn,
+ .bodywebsite .btn-group-vertical > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.bodywebsite .nav {
+ --bs-nav-link-padding-x: 1rem;
+ --bs-nav-link-padding-y: 0.5rem;
+ --bs-nav-link-color: var(--bs-link-color);
+ --bs-nav-link-hover-color: var(--bs-link-hover-color);
+ --bs-nav-link-disabled-color: #6c757d;
+ display: flex;
+ flex-wrap: wrap;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+
+.bodywebsite .nav-link {
+ display: block;
+ padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);
+ font-size: var(--bs-nav-link-font-size);
+ font-weight: var(--bs-nav-link-font-weight);
+ color: var(--bs-nav-link-color);
+ text-decoration: none;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .nav-link {
+ transition: none;
+ }
+}
+
+.bodywebsite .nav-link:hover, .bodywebsite .nav-link:focus {
+ color: var(--bs-nav-link-hover-color);
+}
+
+.bodywebsite .nav-link.disabled {
+ color: var(--bs-nav-link-disabled-color);
+ pointer-events: none;
+ cursor: default;
+}
+
+.bodywebsite .nav-tabs {
+ --bs-nav-tabs-border-width: 1px;
+ --bs-nav-tabs-border-color: #dee2e6;
+ --bs-nav-tabs-border-radius: 0.375rem;
+ --bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef #dee2e6;
+ --bs-nav-tabs-link-active-color: #495057;
+ --bs-nav-tabs-link-active-bg: #fff;
+ --bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff;
+ border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color);
+}
+
+.bodywebsite .nav-tabs .nav-link {
+ margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width));
+ background: none;
+ border: var(--bs-nav-tabs-border-width) solid transparent;
+ border-top-left-radius: var(--bs-nav-tabs-border-radius);
+ border-top-right-radius: var(--bs-nav-tabs-border-radius);
+}
+
+.bodywebsite .nav-tabs .nav-link:hover, .bodywebsite .nav-tabs .nav-link:focus {
+ isolation: isolate;
+ border-color: var(--bs-nav-tabs-link-hover-border-color);
+}
+
+.bodywebsite .nav-tabs .nav-link.disabled, .bodywebsite .nav-tabs .nav-link:disabled {
+ color: var(--bs-nav-link-disabled-color);
+ background-color: transparent;
+ border-color: transparent;
+}
+
+.bodywebsite .nav-tabs .nav-link.active,
+ .bodywebsite .nav-tabs .nav-item.show .nav-link {
+ color: var(--bs-nav-tabs-link-active-color);
+ background-color: var(--bs-nav-tabs-link-active-bg);
+ border-color: var(--bs-nav-tabs-link-active-border-color);
+}
+
+.bodywebsite .nav-tabs .dropdown-menu {
+ margin-top: calc(-1 * var(--bs-nav-tabs-border-width));
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.bodywebsite .nav-pills {
+ --bs-nav-pills-border-radius: 0.375rem;
+ --bs-nav-pills-link-active-color: #fff;
+ --bs-nav-pills-link-active-bg: #0d6efd;
+}
+
+.bodywebsite .nav-pills .nav-link {
+ background: none;
+ border: 0;
+ border-radius: var(--bs-nav-pills-border-radius);
+}
+
+.bodywebsite .nav-pills .nav-link:disabled {
+ color: var(--bs-nav-link-disabled-color);
+ background-color: transparent;
+ border-color: transparent;
+}
+
+.bodywebsite .nav-pills .nav-link.active,
+ .bodywebsite .nav-pills .show > .nav-link {
+ color: var(--bs-nav-pills-link-active-color);
+ background-color: var(--bs-nav-pills-link-active-bg);
+}
+
+.bodywebsite .nav-fill > .nav-link,
+ .bodywebsite .nav-fill .nav-item {
+ flex: 1 1 auto;
+ text-align: center;
+}
+
+.bodywebsite .nav-justified > .nav-link,
+ .bodywebsite .nav-justified .nav-item {
+ flex-basis: 0;
+ flex-grow: 1;
+ text-align: center;
+}
+
+.bodywebsite .nav-fill .nav-item .nav-link,
+ .bodywebsite .nav-justified .nav-item .nav-link {
+ width: 100%;
+}
+
+.bodywebsite .tab-content > .tab-pane {
+ display: none;
+}
+
+.bodywebsite .tab-content > .active {
+ display: block;
+}
+
+.bodywebsite .navbar {
+ --bs-navbar-padding-x: 0;
+ --bs-navbar-padding-y: 0.5rem;
+ --bs-navbar-color: rgba(0, 0, 0, 0.55);
+ --bs-navbar-hover-color: rgba(0, 0, 0, 0.7);
+ --bs-navbar-disabled-color: rgba(0, 0, 0, 0.3);
+ --bs-navbar-active-color: rgba(0, 0, 0, 0.9);
+ --bs-navbar-brand-padding-y: 0.3125rem;
+ --bs-navbar-brand-margin-end: 1rem;
+ --bs-navbar-brand-font-size: 1.25rem;
+ --bs-navbar-brand-color: rgba(0, 0, 0, 0.9);
+ --bs-navbar-brand-hover-color: rgba(0, 0, 0, 0.9);
+ --bs-navbar-nav-link-padding-x: 0.5rem;
+ --bs-navbar-toggler-padding-y: 0.25rem;
+ --bs-navbar-toggler-padding-x: 0.75rem;
+ --bs-navbar-toggler-font-size: 1.25rem;
+ --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+ --bs-navbar-toggler-border-color: rgba(0, 0, 0, 0.1);
+ --bs-navbar-toggler-border-radius: 0.375rem;
+ --bs-navbar-toggler-focus-width: 0.25rem;
+ --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: space-between;
+ padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);
+}
+
+.bodywebsite .navbar > .container,
+ .bodywebsite .navbar > .container-fluid,
+ .bodywebsite .navbar > .container-sm,
+ .bodywebsite .navbar > .container-md,
+ .bodywebsite .navbar > .container-lg,
+ .bodywebsite .navbar > .container-xl,
+ .bodywebsite .navbar > .container-xxl {
+ display: flex;
+ flex-wrap: inherit;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.bodywebsite .navbar-brand {
+ padding-top: var(--bs-navbar-brand-padding-y);
+ padding-bottom: var(--bs-navbar-brand-padding-y);
+ margin-right: var(--bs-navbar-brand-margin-end);
+ font-size: var(--bs-navbar-brand-font-size);
+ color: var(--bs-navbar-brand-color);
+ text-decoration: none;
+ white-space: nowrap;
+}
+
+.bodywebsite .navbar-brand:hover, .bodywebsite .navbar-brand:focus {
+ color: var(--bs-navbar-brand-hover-color);
+}
+
+.bodywebsite .navbar-nav {
+ --bs-nav-link-padding-x: 0;
+ --bs-nav-link-padding-y: 0.5rem;
+ --bs-nav-link-color: var(--bs-navbar-color);
+ --bs-nav-link-hover-color: var(--bs-navbar-hover-color);
+ --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+
+.bodywebsite .navbar-nav .show > .nav-link,
+ .bodywebsite .navbar-nav .nav-link.active {
+ color: var(--bs-navbar-active-color);
+}
+
+.bodywebsite .navbar-nav .dropdown-menu {
+ position: static;
+}
+
+.bodywebsite .navbar-text {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ color: var(--bs-navbar-color);
+}
+
+.bodywebsite .navbar-text a,
+ .bodywebsite .navbar-text a:hover,
+ .bodywebsite .navbar-text a:focus {
+ color: var(--bs-navbar-active-color);
+}
+
+.bodywebsite .navbar-collapse {
+ flex-basis: 100%;
+ flex-grow: 1;
+ align-items: center;
+}
+
+.bodywebsite .navbar-toggler {
+ padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);
+ font-size: var(--bs-navbar-toggler-font-size);
+ line-height: 1;
+ color: var(--bs-navbar-color);
+ background-color: transparent;
+ border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);
+ border-radius: var(--bs-navbar-toggler-border-radius);
+ transition: var(--bs-navbar-toggler-transition);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .navbar-toggler {
+ transition: none;
+ }
+}
+
+.bodywebsite .navbar-toggler:hover {
+ text-decoration: none;
+}
+
+.bodywebsite .navbar-toggler:focus {
+ text-decoration: none;
+ outline: 0;
+ box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width);
+}
+
+.bodywebsite .navbar-toggler-icon {
+ display: inline-block;
+ width: 1.5em;
+ height: 1.5em;
+ vertical-align: middle;
+ background-image: var(--bs-navbar-toggler-icon-bg);
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: 100%;
+}
+
+.bodywebsite .navbar-nav-scroll {
+ max-height: var(--bs-scroll-height, 75vh);
+ overflow-y: auto;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .navbar-expand-sm {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-sm .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-sm .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-sm .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .navbar-expand-md {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-md .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-md .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-md .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .navbar-expand-lg {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-lg .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-lg .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-lg .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .navbar-expand-xl {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-xl .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-xl .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-xl .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .navbar-expand-xxl {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-xxl .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-xxl .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-xxl .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+.bodywebsite .navbar-expand {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+}
+
+.bodywebsite .navbar-expand .navbar-nav {
+ flex-direction: row;
+}
+
+.bodywebsite .navbar-expand .navbar-nav .dropdown-menu {
+ position: absolute;
+}
+
+.bodywebsite .navbar-expand .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+}
+
+.bodywebsite .navbar-expand .navbar-nav-scroll {
+ overflow: visible;
+}
+
+.bodywebsite .navbar-expand .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+}
+
+.bodywebsite .navbar-expand .navbar-toggler {
+ display: none;
+}
+
+.bodywebsite .navbar-expand .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+}
+
+.bodywebsite .navbar-expand .offcanvas .offcanvas-header {
+ display: none;
+}
+
+.bodywebsite .navbar-expand .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+}
+
+.bodywebsite .navbar-dark {
+ --bs-navbar-color: rgba(255, 255, 255, 0.55);
+ --bs-navbar-hover-color: rgba(255, 255, 255, 0.75);
+ --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25);
+ --bs-navbar-active-color: #fff;
+ --bs-navbar-brand-color: #fff;
+ --bs-navbar-brand-hover-color: #fff;
+ --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);
+ --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .card {
+ --bs-card-spacer-y: 1rem;
+ --bs-card-spacer-x: 1rem;
+ --bs-card-title-spacer-y: 0.5rem;
+ --bs-card-border-width: 1px;
+ --bs-card-border-color: var(--bs-border-color-translucent);
+ --bs-card-border-radius: 0.375rem;
+ --bs-card-inner-border-radius: calc(0.375rem - 1px);
+ --bs-card-cap-padding-y: 0.5rem;
+ --bs-card-cap-padding-x: 1rem;
+ --bs-card-cap-bg: rgba(0, 0, 0, 0.03);
+ --bs-card-bg: #fff;
+ --bs-card-img-overlay-padding: 1rem;
+ --bs-card-group-margin: 0.75rem;
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ min-width: 0;
+ height: var(--bs-card-height);
+ word-wrap: break-word;
+ background-color: var(--bs-card-bg);
+ background-clip: border-box;
+ border: var(--bs-card-border-width) solid var(--bs-card-border-color);
+ border-radius: var(--bs-card-border-radius);
+}
+
+.bodywebsite .card > hr {
+ margin-right: 0;
+ margin-left: 0;
+}
+
+.bodywebsite .card > .list-group {
+ border-top: inherit;
+ border-bottom: inherit;
+}
+
+.bodywebsite .card > .list-group:first-child {
+ border-top-width: 0;
+ border-top-left-radius: var(--bs-card-inner-border-radius);
+ border-top-right-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card > .list-group:last-child {
+ border-bottom-width: 0;
+ border-bottom-right-radius: var(--bs-card-inner-border-radius);
+ border-bottom-left-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card > .card-header + .list-group,
+ .bodywebsite .card > .list-group + .card-footer {
+ border-top: 0;
+}
+
+.bodywebsite .card-body {
+ flex: 1 1 auto;
+ padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x);
+ color: var(--bs-card-color);
+}
+
+.bodywebsite .card-title {
+ margin-bottom: var(--bs-card-title-spacer-y);
+}
+
+.bodywebsite .card-subtitle {
+ margin-top: calc(-0.5 * var(--bs-card-title-spacer-y));
+ margin-bottom: 0;
+}
+
+.bodywebsite .card-text:last-child {
+ margin-bottom: 0;
+}
+
+.bodywebsite .card-link + .card-link {
+ margin-left: var(--bs-card-spacer-x);
+}
+
+.bodywebsite .card-header {
+ padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);
+ margin-bottom: 0;
+ color: var(--bs-card-cap-color);
+ background-color: var(--bs-card-cap-bg);
+ border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color);
+}
+
+.bodywebsite .card-header:first-child {
+ border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0;
+}
+
+.bodywebsite .card-footer {
+ padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);
+ color: var(--bs-card-cap-color);
+ background-color: var(--bs-card-cap-bg);
+ border-top: var(--bs-card-border-width) solid var(--bs-card-border-color);
+}
+
+.bodywebsite .card-footer:last-child {
+ border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card-header-tabs {
+ margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));
+ margin-bottom: calc(-1 * var(--bs-card-cap-padding-y));
+ margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));
+ border-bottom: 0;
+}
+
+.bodywebsite .card-header-tabs .nav-link.active {
+ background-color: var(--bs-card-bg);
+ border-bottom-color: var(--bs-card-bg);
+}
+
+.bodywebsite .card-header-pills {
+ margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));
+ margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));
+}
+
+.bodywebsite .card-img-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: var(--bs-card-img-overlay-padding);
+ border-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card-img,
+ .bodywebsite .card-img-top,
+ .bodywebsite .card-img-bottom {
+ width: 100%;
+}
+
+.bodywebsite .card-img,
+ .bodywebsite .card-img-top {
+ border-top-left-radius: var(--bs-card-inner-border-radius);
+ border-top-right-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card-img,
+ .bodywebsite .card-img-bottom {
+ border-bottom-right-radius: var(--bs-card-inner-border-radius);
+ border-bottom-left-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card-group > .card {
+ margin-bottom: var(--bs-card-group-margin);
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .card-group {
+ display: flex;
+ flex-flow: row wrap;
+ }
+
+ .bodywebsite .card-group > .card {
+ flex: 1 0 0%;
+ margin-bottom: 0;
+ }
+
+ .bodywebsite .card-group > .card + .card {
+ margin-left: 0;
+ border-left: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:last-child) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:last-child) .card-img-top,
+ .bodywebsite .card-group > .card:not(:last-child) .card-header {
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:last-child) .card-img-bottom,
+ .bodywebsite .card-group > .card:not(:last-child) .card-footer {
+ border-bottom-right-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:first-child) .card-img-top,
+ .bodywebsite .card-group > .card:not(:first-child) .card-header {
+ border-top-left-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:first-child) .card-img-bottom,
+ .bodywebsite .card-group > .card:not(:first-child) .card-footer {
+ border-bottom-left-radius: 0;
+ }
+}
+
+.bodywebsite .accordion {
+ --bs-accordion-color: var(--bs-body-color);
+ --bs-accordion-bg: #fff;
+ --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;
+ --bs-accordion-border-color: var(--bs-border-color);
+ --bs-accordion-border-width: 1px;
+ --bs-accordion-border-radius: 0.375rem;
+ --bs-accordion-inner-border-radius: calc(0.375rem - 1px);
+ --bs-accordion-btn-padding-x: 1.25rem;
+ --bs-accordion-btn-padding-y: 1rem;
+ --bs-accordion-btn-color: var(--bs-body-color);
+ --bs-accordion-btn-bg: var(--bs-accordion-bg);
+ --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='var%28--bs-body-color%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
+ --bs-accordion-btn-icon-width: 1.25rem;
+ --bs-accordion-btn-icon-transform: rotate(-180deg);
+ --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;
+ --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
+ --bs-accordion-btn-focus-border-color: #86b7fe;
+ --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+ --bs-accordion-body-padding-x: 1.25rem;
+ --bs-accordion-body-padding-y: 1rem;
+ --bs-accordion-active-color: #0c63e4;
+ --bs-accordion-active-bg: #e7f1ff;
+}
+
+.bodywebsite .accordion-button {
+ position: relative;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);
+ font-size: 1rem;
+ color: var(--bs-accordion-btn-color);
+ text-align: left;
+ background-color: var(--bs-accordion-btn-bg);
+ border: 0;
+ border-radius: 0;
+ overflow-anchor: none;
+ transition: var(--bs-accordion-transition);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .accordion-button {
+ transition: none;
+ }
+}
+
+.bodywebsite .accordion-button:not(.collapsed) {
+ color: var(--bs-accordion-active-color);
+ background-color: var(--bs-accordion-active-bg);
+ box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color);
+}
+
+.bodywebsite .accordion-button:not(.collapsed)::after {
+ background-image: var(--bs-accordion-btn-active-icon);
+ transform: var(--bs-accordion-btn-icon-transform);
+}
+
+.bodywebsite .accordion-button::after {
+ flex-shrink: 0;
+ width: var(--bs-accordion-btn-icon-width);
+ height: var(--bs-accordion-btn-icon-width);
+ margin-left: auto;
+ content: "";
+ background-image: var(--bs-accordion-btn-icon);
+ background-repeat: no-repeat;
+ background-size: var(--bs-accordion-btn-icon-width);
+ transition: var(--bs-accordion-btn-icon-transition);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .accordion-button::after {
+ transition: none;
+ }
+}
+
+.bodywebsite .accordion-button:hover {
+ z-index: 2;
+}
+
+.bodywebsite .accordion-button:focus {
+ z-index: 3;
+ border-color: var(--bs-accordion-btn-focus-border-color);
+ outline: 0;
+ box-shadow: var(--bs-accordion-btn-focus-box-shadow);
+}
+
+.bodywebsite .accordion-header {
+ margin-bottom: 0;
+}
+
+.bodywebsite .accordion-item {
+ color: var(--bs-accordion-color);
+ background-color: var(--bs-accordion-bg);
+ border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color);
+}
+
+.bodywebsite .accordion-item:first-of-type {
+ border-top-left-radius: var(--bs-accordion-border-radius);
+ border-top-right-radius: var(--bs-accordion-border-radius);
+}
+
+.bodywebsite .accordion-item:first-of-type .accordion-button {
+ border-top-left-radius: var(--bs-accordion-inner-border-radius);
+ border-top-right-radius: var(--bs-accordion-inner-border-radius);
+}
+
+.bodywebsite .accordion-item:not(:first-of-type) {
+ border-top: 0;
+}
+
+.bodywebsite .accordion-item:last-of-type {
+ border-bottom-right-radius: var(--bs-accordion-border-radius);
+ border-bottom-left-radius: var(--bs-accordion-border-radius);
+}
+
+.bodywebsite .accordion-item:last-of-type .accordion-button.collapsed {
+ border-bottom-right-radius: var(--bs-accordion-inner-border-radius);
+ border-bottom-left-radius: var(--bs-accordion-inner-border-radius);
+}
+
+.bodywebsite .accordion-item:last-of-type .accordion-collapse {
+ border-bottom-right-radius: var(--bs-accordion-border-radius);
+ border-bottom-left-radius: var(--bs-accordion-border-radius);
+}
+
+.bodywebsite .accordion-body {
+ padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x);
+}
+
+.bodywebsite .accordion-flush .accordion-collapse {
+ border-width: 0;
+}
+
+.bodywebsite .accordion-flush .accordion-item {
+ border-right: 0;
+ border-left: 0;
+ border-radius: 0;
+}
+
+.bodywebsite .accordion-flush .accordion-item:first-child {
+ border-top: 0;
+}
+
+.bodywebsite .accordion-flush .accordion-item:last-child {
+ border-bottom: 0;
+}
+
+.bodywebsite .accordion-flush .accordion-item .accordion-button, .bodywebsite .accordion-flush .accordion-item .accordion-button.collapsed {
+ border-radius: 0;
+}
+
+.bodywebsite .breadcrumb {
+ --bs-breadcrumb-padding-x: 0;
+ --bs-breadcrumb-padding-y: 0;
+ --bs-breadcrumb-margin-bottom: 1rem;
+ --bs-breadcrumb-divider-color: #6c757d;
+ --bs-breadcrumb-item-padding-x: 0.5rem;
+ --bs-breadcrumb-item-active-color: #6c757d;
+ display: flex;
+ flex-wrap: wrap;
+ padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);
+ margin-bottom: var(--bs-breadcrumb-margin-bottom);
+ font-size: var(--bs-breadcrumb-font-size);
+ list-style: none;
+ background-color: var(--bs-breadcrumb-bg);
+ border-radius: var(--bs-breadcrumb-border-radius);
+}
+
+.bodywebsite .breadcrumb-item + .breadcrumb-item {
+ padding-left: var(--bs-breadcrumb-item-padding-x);
+}
+
+.bodywebsite .breadcrumb-item + .breadcrumb-item::before {
+ float: left;
+ padding-right: var(--bs-breadcrumb-item-padding-x);
+ color: var(--bs-breadcrumb-divider-color);
+ content: var(--bs-breadcrumb-divider, "/");
+}
+
+.bodywebsite .breadcrumb-item.active {
+ color: var(--bs-breadcrumb-item-active-color);
+}
+
+.bodywebsite .pagination {
+ --bs-pagination-padding-x: 0.75rem;
+ --bs-pagination-padding-y: 0.375rem;
+ --bs-pagination-font-size: 1rem;
+ --bs-pagination-color: var(--bs-link-color);
+ --bs-pagination-bg: #fff;
+ --bs-pagination-border-width: 1px;
+ --bs-pagination-border-color: #dee2e6;
+ --bs-pagination-border-radius: 0.375rem;
+ --bs-pagination-hover-color: var(--bs-link-hover-color);
+ --bs-pagination-hover-bg: #e9ecef;
+ --bs-pagination-hover-border-color: #dee2e6;
+ --bs-pagination-focus-color: var(--bs-link-hover-color);
+ --bs-pagination-focus-bg: #e9ecef;
+ --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+ --bs-pagination-active-color: #fff;
+ --bs-pagination-active-bg: #0d6efd;
+ --bs-pagination-active-border-color: #0d6efd;
+ --bs-pagination-disabled-color: #6c757d;
+ --bs-pagination-disabled-bg: #fff;
+ --bs-pagination-disabled-border-color: #dee2e6;
+ display: flex;
+ padding-left: 0;
+ list-style: none;
+}
+
+.bodywebsite .page-link {
+ position: relative;
+ display: block;
+ padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);
+ font-size: var(--bs-pagination-font-size);
+ color: var(--bs-pagination-color);
+ text-decoration: none;
+ background-color: var(--bs-pagination-bg);
+ border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .page-link {
+ transition: none;
+ }
+}
+
+.bodywebsite .page-link:hover {
+ z-index: 2;
+ color: var(--bs-pagination-hover-color);
+ background-color: var(--bs-pagination-hover-bg);
+ border-color: var(--bs-pagination-hover-border-color);
+}
+
+.bodywebsite .page-link:focus {
+ z-index: 3;
+ color: var(--bs-pagination-focus-color);
+ background-color: var(--bs-pagination-focus-bg);
+ outline: 0;
+ box-shadow: var(--bs-pagination-focus-box-shadow);
+}
+
+.bodywebsite .page-link.active, .bodywebsite .active > .page-link {
+ z-index: 3;
+ color: var(--bs-pagination-active-color);
+ background-color: var(--bs-pagination-active-bg);
+ border-color: var(--bs-pagination-active-border-color);
+}
+
+.bodywebsite .page-link.disabled, .bodywebsite .disabled > .page-link {
+ color: var(--bs-pagination-disabled-color);
+ pointer-events: none;
+ background-color: var(--bs-pagination-disabled-bg);
+ border-color: var(--bs-pagination-disabled-border-color);
+}
+
+.bodywebsite .page-item:not(:first-child) .page-link {
+ margin-left: -1px;
+}
+
+.bodywebsite .page-item:first-child .page-link {
+ border-top-left-radius: var(--bs-pagination-border-radius);
+ border-bottom-left-radius: var(--bs-pagination-border-radius);
+}
+
+.bodywebsite .page-item:last-child .page-link {
+ border-top-right-radius: var(--bs-pagination-border-radius);
+ border-bottom-right-radius: var(--bs-pagination-border-radius);
+}
+
+.bodywebsite .pagination-lg {
+ --bs-pagination-padding-x: 1.5rem;
+ --bs-pagination-padding-y: 0.75rem;
+ --bs-pagination-font-size: 1.25rem;
+ --bs-pagination-border-radius: 0.5rem;
+}
+
+.bodywebsite .pagination-sm {
+ --bs-pagination-padding-x: 0.5rem;
+ --bs-pagination-padding-y: 0.25rem;
+ --bs-pagination-font-size: 0.875rem;
+ --bs-pagination-border-radius: 0.25rem;
+}
+
+.bodywebsite .badge {
+ --bs-badge-padding-x: 0.65em;
+ --bs-badge-padding-y: 0.35em;
+ --bs-badge-font-size: 0.75em;
+ --bs-badge-font-weight: 700;
+ --bs-badge-color: #fff;
+ --bs-badge-border-radius: 0.375rem;
+ display: inline-block;
+ padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x);
+ font-size: var(--bs-badge-font-size);
+ font-weight: var(--bs-badge-font-weight);
+ line-height: 1;
+ color: var(--bs-badge-color);
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: var(--bs-badge-border-radius);
+}
+
+.bodywebsite .badge:empty {
+ display: none;
+}
+
+.bodywebsite .btn .badge {
+ position: relative;
+ top: -1px;
+}
+
+.bodywebsite .alert {
+ --bs-alert-bg: transparent;
+ --bs-alert-padding-x: 1rem;
+ --bs-alert-padding-y: 1rem;
+ --bs-alert-margin-bottom: 1rem;
+ --bs-alert-color: inherit;
+ --bs-alert-border-color: transparent;
+ --bs-alert-border: 1px solid var(--bs-alert-border-color);
+ --bs-alert-border-radius: 0.375rem;
+ position: relative;
+ padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x);
+ margin-bottom: var(--bs-alert-margin-bottom);
+ color: var(--bs-alert-color);
+ background-color: var(--bs-alert-bg);
+ border: var(--bs-alert-border);
+ border-radius: var(--bs-alert-border-radius);
+}
+
+.bodywebsite .alert-heading {
+ color: inherit;
+}
+
+.bodywebsite .alert-link {
+ font-weight: 700;
+}
+
+.bodywebsite .alert-dismissible {
+ padding-right: 3rem;
+}
+
+.bodywebsite .alert-dismissible .btn-close {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 2;
+ padding: 1.25rem 1rem;
+}
+
+.bodywebsite .alert-primary {
+ --bs-alert-color: #084298;
+ --bs-alert-bg: #cfe2ff;
+ --bs-alert-border-color: #b6d4fe;
+}
+
+.bodywebsite .alert-primary .alert-link {
+ color: #06357a;
+}
+
+.bodywebsite .alert-secondary {
+ --bs-alert-color: #41464b;
+ --bs-alert-bg: #e2e3e5;
+ --bs-alert-border-color: #d3d6d8;
+}
+
+.bodywebsite .alert-secondary .alert-link {
+ color: #34383c;
+}
+
+.bodywebsite .alert-success {
+ --bs-alert-color: #0f5132;
+ --bs-alert-bg: #d1e7dd;
+ --bs-alert-border-color: #badbcc;
+}
+
+.bodywebsite .alert-success .alert-link {
+ color: #0c4128;
+}
+
+.bodywebsite .alert-info {
+ --bs-alert-color: #055160;
+ --bs-alert-bg: #cff4fc;
+ --bs-alert-border-color: #b6effb;
+}
+
+.bodywebsite .alert-info .alert-link {
+ color: #04414d;
+}
+
+.bodywebsite .alert-warning {
+ --bs-alert-color: #664d03;
+ --bs-alert-bg: #fff3cd;
+ --bs-alert-border-color: #ffecb5;
+}
+
+.bodywebsite .alert-warning .alert-link {
+ color: #523e02;
+}
+
+.bodywebsite .alert-danger {
+ --bs-alert-color: #842029;
+ --bs-alert-bg: #f8d7da;
+ --bs-alert-border-color: #f5c2c7;
+}
+
+.bodywebsite .alert-danger .alert-link {
+ color: #6a1a21;
+}
+
+.bodywebsite .alert-light {
+ --bs-alert-color: #636464;
+ --bs-alert-bg: #fefefe;
+ --bs-alert-border-color: #fdfdfe;
+}
+
+.bodywebsite .alert-light .alert-link {
+ color: #4f5050;
+}
+
+.bodywebsite .alert-dark {
+ --bs-alert-color: #141619;
+ --bs-alert-bg: #d3d3d4;
+ --bs-alert-border-color: #bcbebf;
+}
+
+.bodywebsite .alert-dark .alert-link {
+ color: #101214;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+ 0% {
+ background-position-x: 1rem;
+ }
+}
+
+@keyframes progress-bar-stripes {
+ 0% {
+ background-position-x: 1rem;
+ }
+}
+
+.bodywebsite .progress {
+ --bs-progress-height: 1rem;
+ --bs-progress-font-size: 0.75rem;
+ --bs-progress-bg: #e9ecef;
+ --bs-progress-border-radius: 0.375rem;
+ --bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);
+ --bs-progress-bar-color: #fff;
+ --bs-progress-bar-bg: #0d6efd;
+ --bs-progress-bar-transition: width 0.6s ease;
+ display: flex;
+ height: var(--bs-progress-height);
+ overflow: hidden;
+ font-size: var(--bs-progress-font-size);
+ background-color: var(--bs-progress-bg);
+ border-radius: var(--bs-progress-border-radius);
+}
+
+.bodywebsite .progress-bar {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ overflow: hidden;
+ color: var(--bs-progress-bar-color);
+ text-align: center;
+ white-space: nowrap;
+ background-color: var(--bs-progress-bar-bg);
+ transition: var(--bs-progress-bar-transition);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .progress-bar {
+ transition: none;
+ }
+}
+
+.bodywebsite .progress-bar-striped {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-size: var(--bs-progress-height) var(--bs-progress-height);
+}
+
+.bodywebsite .progress-bar-animated {
+ -webkit-animation: 1s linear infinite progress-bar-stripes;
+ animation: 1s linear infinite progress-bar-stripes;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .progress-bar-animated {
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+
+.bodywebsite .list-group {
+ --bs-list-group-color: #212529;
+ --bs-list-group-bg: #fff;
+ --bs-list-group-border-color: rgba(0, 0, 0, 0.125);
+ --bs-list-group-border-width: 1px;
+ --bs-list-group-border-radius: 0.375rem;
+ --bs-list-group-item-padding-x: 1rem;
+ --bs-list-group-item-padding-y: 0.5rem;
+ --bs-list-group-action-color: #495057;
+ --bs-list-group-action-hover-color: #495057;
+ --bs-list-group-action-hover-bg: #f8f9fa;
+ --bs-list-group-action-active-color: #212529;
+ --bs-list-group-action-active-bg: #e9ecef;
+ --bs-list-group-disabled-color: #6c757d;
+ --bs-list-group-disabled-bg: #fff;
+ --bs-list-group-active-color: #fff;
+ --bs-list-group-active-bg: #0d6efd;
+ --bs-list-group-active-border-color: #0d6efd;
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ border-radius: var(--bs-list-group-border-radius);
+}
+
+.bodywebsite .list-group-numbered {
+ list-style-type: none;
+ counter-reset: section;
+}
+
+.bodywebsite .list-group-numbered > .list-group-item::before {
+ content: counters(section, ".") ". ";
+ counter-increment: section;
+}
+
+.bodywebsite .list-group-item-action {
+ width: 100%;
+ color: var(--bs-list-group-action-color);
+ text-align: inherit;
+}
+
+.bodywebsite .list-group-item-action:hover, .bodywebsite .list-group-item-action:focus {
+ z-index: 1;
+ color: var(--bs-list-group-action-hover-color);
+ text-decoration: none;
+ background-color: var(--bs-list-group-action-hover-bg);
+}
+
+.bodywebsite .list-group-item-action:active {
+ color: var(--bs-list-group-action-active-color);
+ background-color: var(--bs-list-group-action-active-bg);
+}
+
+.bodywebsite .list-group-item {
+ position: relative;
+ display: block;
+ padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);
+ color: var(--bs-list-group-color);
+ text-decoration: none;
+ background-color: var(--bs-list-group-bg);
+ border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color);
+}
+
+.bodywebsite .list-group-item:first-child {
+ border-top-left-radius: inherit;
+ border-top-right-radius: inherit;
+}
+
+.bodywebsite .list-group-item:last-child {
+ border-bottom-right-radius: inherit;
+ border-bottom-left-radius: inherit;
+}
+
+.bodywebsite .list-group-item.disabled, .bodywebsite .list-group-item:disabled {
+ color: var(--bs-list-group-disabled-color);
+ pointer-events: none;
+ background-color: var(--bs-list-group-disabled-bg);
+}
+
+.bodywebsite .list-group-item.active {
+ z-index: 2;
+ color: var(--bs-list-group-active-color);
+ background-color: var(--bs-list-group-active-bg);
+ border-color: var(--bs-list-group-active-border-color);
+}
+
+.bodywebsite .list-group-item + .list-group-item {
+ border-top-width: 0;
+}
+
+.bodywebsite .list-group-item + .list-group-item.active {
+ margin-top: calc(-1 * var(--bs-list-group-border-width));
+ border-top-width: var(--bs-list-group-border-width);
+}
+
+.bodywebsite .list-group-horizontal {
+ flex-direction: row;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item.active {
+ margin-top: 0;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .list-group-horizontal-sm {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .list-group-horizontal-md {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .list-group-horizontal-lg {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .list-group-horizontal-xl {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .list-group-horizontal-xxl {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+.bodywebsite .list-group-flush {
+ border-radius: 0;
+}
+
+.bodywebsite .list-group-flush > .list-group-item {
+ border-width: 0 0 var(--bs-list-group-border-width);
+}
+
+.bodywebsite .list-group-flush > .list-group-item:last-child {
+ border-bottom-width: 0;
+}
+
+.bodywebsite .list-group-item-primary {
+ color: #084298;
+ background-color: #cfe2ff;
+}
+
+.bodywebsite .list-group-item-primary.list-group-item-action:hover, .bodywebsite .list-group-item-primary.list-group-item-action:focus {
+ color: #084298;
+ background-color: #bacbe6;
+}
+
+.bodywebsite .list-group-item-primary.list-group-item-action.active {
+ color: #fff;
+ background-color: #084298;
+ border-color: #084298;
+}
+
+.bodywebsite .list-group-item-secondary {
+ color: #41464b;
+ background-color: #e2e3e5;
+}
+
+.bodywebsite .list-group-item-secondary.list-group-item-action:hover, .bodywebsite .list-group-item-secondary.list-group-item-action:focus {
+ color: #41464b;
+ background-color: #cbccce;
+}
+
+.bodywebsite .list-group-item-secondary.list-group-item-action.active {
+ color: #fff;
+ background-color: #41464b;
+ border-color: #41464b;
+}
+
+.bodywebsite .list-group-item-success {
+ color: #0f5132;
+ background-color: #d1e7dd;
+}
+
+.bodywebsite .list-group-item-success.list-group-item-action:hover, .bodywebsite .list-group-item-success.list-group-item-action:focus {
+ color: #0f5132;
+ background-color: #bcd0c7;
+}
+
+.bodywebsite .list-group-item-success.list-group-item-action.active {
+ color: #fff;
+ background-color: #0f5132;
+ border-color: #0f5132;
+}
+
+.bodywebsite .list-group-item-info {
+ color: #055160;
+ background-color: #cff4fc;
+}
+
+.bodywebsite .list-group-item-info.list-group-item-action:hover, .bodywebsite .list-group-item-info.list-group-item-action:focus {
+ color: #055160;
+ background-color: #badce3;
+}
+
+.bodywebsite .list-group-item-info.list-group-item-action.active {
+ color: #fff;
+ background-color: #055160;
+ border-color: #055160;
+}
+
+.bodywebsite .list-group-item-warning {
+ color: #664d03;
+ background-color: #fff3cd;
+}
+
+.bodywebsite .list-group-item-warning.list-group-item-action:hover, .bodywebsite .list-group-item-warning.list-group-item-action:focus {
+ color: #664d03;
+ background-color: #e6dbb9;
+}
+
+.bodywebsite .list-group-item-warning.list-group-item-action.active {
+ color: #fff;
+ background-color: #664d03;
+ border-color: #664d03;
+}
+
+.bodywebsite .list-group-item-danger {
+ color: #842029;
+ background-color: #f8d7da;
+}
+
+.bodywebsite .list-group-item-danger.list-group-item-action:hover, .bodywebsite .list-group-item-danger.list-group-item-action:focus {
+ color: #842029;
+ background-color: #dfc2c4;
+}
+
+.bodywebsite .list-group-item-danger.list-group-item-action.active {
+ color: #fff;
+ background-color: #842029;
+ border-color: #842029;
+}
+
+.bodywebsite .list-group-item-light {
+ color: #636464;
+ background-color: #fefefe;
+}
+
+.bodywebsite .list-group-item-light.list-group-item-action:hover, .bodywebsite .list-group-item-light.list-group-item-action:focus {
+ color: #636464;
+ background-color: #e5e5e5;
+}
+
+.bodywebsite .list-group-item-light.list-group-item-action.active {
+ color: #fff;
+ background-color: #636464;
+ border-color: #636464;
+}
+
+.bodywebsite .list-group-item-dark {
+ color: #141619;
+ background-color: #d3d3d4;
+}
+
+.bodywebsite .list-group-item-dark.list-group-item-action:hover, .bodywebsite .list-group-item-dark.list-group-item-action:focus {
+ color: #141619;
+ background-color: #bebebf;
+}
+
+.bodywebsite .list-group-item-dark.list-group-item-action.active {
+ color: #fff;
+ background-color: #141619;
+ border-color: #141619;
+}
+
+.bodywebsite .btn-close {
+ box-sizing: content-box;
+ width: 1em;
+ height: 1em;
+ padding: 0.25em 0.25em;
+ color: #000;
+ background: transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;
+ border: 0;
+ border-radius: 0.375rem;
+ opacity: 0.5;
+}
+
+.bodywebsite .btn-close:hover {
+ color: #000;
+ text-decoration: none;
+ opacity: 0.75;
+}
+
+.bodywebsite .btn-close:focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+ opacity: 1;
+}
+
+.bodywebsite .btn-close:disabled, .bodywebsite .btn-close.disabled {
+ pointer-events: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ opacity: 0.25;
+}
+
+.bodywebsite .btn-close-white {
+ filter: invert(1) grayscale(100%) brightness(200%);
+}
+
+.bodywebsite .toast {
+ --bs-toast-zindex: 1090;
+ --bs-toast-padding-x: 0.75rem;
+ --bs-toast-padding-y: 0.5rem;
+ --bs-toast-spacing: 1.5rem;
+ --bs-toast-max-width: 350px;
+ --bs-toast-font-size: 0.875rem;
+ --bs-toast-bg: rgba(255, 255, 255, 0.85);
+ --bs-toast-border-width: 1px;
+ --bs-toast-border-color: var(--bs-border-color-translucent);
+ --bs-toast-border-radius: 0.375rem;
+ --bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ --bs-toast-header-color: #6c757d;
+ --bs-toast-header-bg: rgba(255, 255, 255, 0.85);
+ --bs-toast-header-border-color: rgba(0, 0, 0, 0.05);
+ width: var(--bs-toast-max-width);
+ max-width: 100%;
+ font-size: var(--bs-toast-font-size);
+ color: var(--bs-toast-color);
+ pointer-events: auto;
+ background-color: var(--bs-toast-bg);
+ background-clip: padding-box;
+ border: var(--bs-toast-border-width) solid var(--bs-toast-border-color);
+ box-shadow: var(--bs-toast-box-shadow);
+ border-radius: var(--bs-toast-border-radius);
+}
+
+.bodywebsite .toast.showing {
+ opacity: 0;
+}
+
+.bodywebsite .toast:not(.show) {
+ display: none;
+}
+
+.bodywebsite .toast-container {
+ position: absolute;
+ z-index: var(--bs-toast-zindex);
+ width: -webkit-max-content;
+ width: -moz-max-content;
+ width: max-content;
+ max-width: 100%;
+ pointer-events: none;
+}
+
+.bodywebsite .toast-container > :not(:last-child) {
+ margin-bottom: var(--bs-toast-spacing);
+}
+
+.bodywebsite .toast-header {
+ display: flex;
+ align-items: center;
+ padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x);
+ color: var(--bs-toast-header-color);
+ background-color: var(--bs-toast-header-bg);
+ background-clip: padding-box;
+ border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);
+ border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));
+ border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));
+}
+
+.bodywebsite .toast-header .btn-close {
+ margin-right: calc(-0.5 * var(--bs-toast-padding-x));
+ margin-left: var(--bs-toast-padding-x);
+}
+
+.bodywebsite .toast-body {
+ padding: var(--bs-toast-padding-x);
+ word-wrap: break-word;
+}
+
+.bodywebsite .modal {
+ --bs-modal-zindex: 1055;
+ --bs-modal-width: 500px;
+ --bs-modal-padding: 1rem;
+ --bs-modal-margin: 0.5rem;
+ --bs-modal-bg: #fff;
+ --bs-modal-border-color: var(--bs-border-color-translucent);
+ --bs-modal-border-width: 1px;
+ --bs-modal-border-radius: 0.5rem;
+ --bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
+ --bs-modal-inner-border-radius: calc(0.5rem - 1px);
+ --bs-modal-header-padding-x: 1rem;
+ --bs-modal-header-padding-y: 1rem;
+ --bs-modal-header-padding: 1rem 1rem;
+ --bs-modal-header-border-color: var(--bs-border-color);
+ --bs-modal-header-border-width: 1px;
+ --bs-modal-title-line-height: 1.5;
+ --bs-modal-footer-gap: 0.5rem;
+ --bs-modal-footer-border-color: var(--bs-border-color);
+ --bs-modal-footer-border-width: 1px;
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: var(--bs-modal-zindex);
+ display: none;
+ width: 100%;
+ height: 100%;
+ overflow-x: hidden;
+ overflow-y: auto;
+ outline: 0;
+}
+
+.bodywebsite .modal-dialog {
+ position: relative;
+ width: auto;
+ margin: var(--bs-modal-margin);
+ pointer-events: none;
+}
+
+.bodywebsite .modal.fade .modal-dialog {
+ transition: transform 0.3s ease-out;
+ transform: translate(0, -50px);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .modal.fade .modal-dialog {
+ transition: none;
+ }
+}
+
+.bodywebsite .modal.show .modal-dialog {
+ transform: none;
+}
+
+.bodywebsite .modal.modal-static .modal-dialog {
+ transform: scale(1.02);
+}
+
+.bodywebsite .modal-dialog-scrollable {
+ height: calc(100% - var(--bs-modal-margin) * 2);
+}
+
+.bodywebsite .modal-dialog-scrollable .modal-content {
+ max-height: 100%;
+ overflow: hidden;
+}
+
+.bodywebsite .modal-dialog-scrollable .modal-body {
+ overflow-y: auto;
+}
+
+.bodywebsite .modal-dialog-centered {
+ display: flex;
+ align-items: center;
+ min-height: calc(100% - var(--bs-modal-margin) * 2);
+}
+
+.bodywebsite .modal-content {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ color: var(--bs-modal-color);
+ pointer-events: auto;
+ background-color: var(--bs-modal-bg);
+ background-clip: padding-box;
+ border: var(--bs-modal-border-width) solid var(--bs-modal-border-color);
+ border-radius: var(--bs-modal-border-radius);
+ outline: 0;
+}
+
+.bodywebsite .modal-backdrop {
+ --bs-backdrop-zindex: 1050;
+ --bs-backdrop-bg: #000;
+ --bs-backdrop-opacity: 0.5;
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: var(--bs-backdrop-zindex);
+ width: 100vw;
+ height: 100vh;
+ background-color: var(--bs-backdrop-bg);
+}
+
+.bodywebsite .modal-backdrop.fade {
+ opacity: 0;
+}
+
+.bodywebsite .modal-backdrop.show {
+ opacity: var(--bs-backdrop-opacity);
+}
+
+.bodywebsite .modal-header {
+ display: flex;
+ flex-shrink: 0;
+ align-items: center;
+ justify-content: space-between;
+ padding: var(--bs-modal-header-padding);
+ border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);
+ border-top-left-radius: var(--bs-modal-inner-border-radius);
+ border-top-right-radius: var(--bs-modal-inner-border-radius);
+}
+
+.bodywebsite .modal-header .btn-close {
+ padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5);
+ margin: calc(-0.5 * var(--bs-modal-header-padding-y)) calc(-0.5 * var(--bs-modal-header-padding-x)) calc(-0.5 * var(--bs-modal-header-padding-y)) auto;
+}
+
+.bodywebsite .modal-title {
+ margin-bottom: 0;
+ line-height: var(--bs-modal-title-line-height);
+}
+
+.bodywebsite .modal-body {
+ position: relative;
+ flex: 1 1 auto;
+ padding: var(--bs-modal-padding);
+}
+
+.bodywebsite .modal-footer {
+ display: flex;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: flex-end;
+ padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5);
+ background-color: var(--bs-modal-footer-bg);
+ border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);
+ border-bottom-right-radius: var(--bs-modal-inner-border-radius);
+ border-bottom-left-radius: var(--bs-modal-inner-border-radius);
+}
+
+.bodywebsite .modal-footer > * {
+ margin: calc(var(--bs-modal-footer-gap) * 0.5);
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .modal {
+ --bs-modal-margin: 1.75rem;
+ --bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ }
+
+ .bodywebsite .modal-dialog {
+ max-width: var(--bs-modal-width);
+ margin-right: auto;
+ margin-left: auto;
+ }
+
+ .bodywebsite .modal-sm {
+ --bs-modal-width: 300px;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .modal-lg,
+ .bodywebsite .modal-xl {
+ --bs-modal-width: 800px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .modal-xl {
+ --bs-modal-width: 1140px;
+ }
+}
+
+.bodywebsite .modal-fullscreen {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+}
+
+.bodywebsite .modal-fullscreen .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+}
+
+.bodywebsite .modal-fullscreen .modal-header,
+ .bodywebsite .modal-fullscreen .modal-footer {
+ border-radius: 0;
+}
+
+.bodywebsite .modal-fullscreen .modal-body {
+ overflow-y: auto;
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .modal-fullscreen-sm-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-sm-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-sm-down .modal-header,
+ .bodywebsite .modal-fullscreen-sm-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-sm-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .modal-fullscreen-md-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-md-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-md-down .modal-header,
+ .bodywebsite .modal-fullscreen-md-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-md-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .modal-fullscreen-lg-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-lg-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-lg-down .modal-header,
+ .bodywebsite .modal-fullscreen-lg-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-lg-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .modal-fullscreen-xl-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xl-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xl-down .modal-header,
+ .bodywebsite .modal-fullscreen-xl-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xl-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .modal-fullscreen-xxl-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xxl-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xxl-down .modal-header,
+ .bodywebsite .modal-fullscreen-xxl-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xxl-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+.bodywebsite .tooltip {
+ --bs-tooltip-zindex: 1080;
+ --bs-tooltip-max-width: 200px;
+ --bs-tooltip-padding-x: 0.5rem;
+ --bs-tooltip-padding-y: 0.25rem;
+ --bs-tooltip-font-size: 0.875rem;
+ --bs-tooltip-color: #fff;
+ --bs-tooltip-bg: #000;
+ --bs-tooltip-border-radius: 0.375rem;
+ --bs-tooltip-opacity: 0.9;
+ --bs-tooltip-arrow-width: 0.8rem;
+ --bs-tooltip-arrow-height: 0.4rem;
+ z-index: var(--bs-tooltip-zindex);
+ display: block;
+ padding: var(--bs-tooltip-arrow-height);
+ margin: var(--bs-tooltip-margin);
+ font-family: var(--bs-font-sans-serif);
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.5;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ white-space: normal;
+ word-spacing: normal;
+ line-break: auto;
+ font-size: var(--bs-tooltip-font-size);
+ word-wrap: break-word;
+ opacity: 0;
+}
+
+.bodywebsite .tooltip.show {
+ opacity: var(--bs-tooltip-opacity);
+}
+
+.bodywebsite .tooltip .tooltip-arrow {
+ display: block;
+ width: var(--bs-tooltip-arrow-width);
+ height: var(--bs-tooltip-arrow-height);
+}
+
+.bodywebsite .tooltip .tooltip-arrow::before {
+ position: absolute;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+}
+
+.bodywebsite .bs-tooltip-top .tooltip-arrow, .bodywebsite .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {
+ bottom: 0;
+}
+
+.bodywebsite .bs-tooltip-top .tooltip-arrow::before, .bodywebsite .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {
+ top: -1px;
+ border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;
+ border-top-color: var(--bs-tooltip-bg);
+}
+
+.bodywebsite .bs-tooltip-end .tooltip-arrow, .bodywebsite .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {
+ left: 0;
+ width: var(--bs-tooltip-arrow-height);
+ height: var(--bs-tooltip-arrow-width);
+}
+
+.bodywebsite .bs-tooltip-end .tooltip-arrow::before, .bodywebsite .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {
+ right: -1px;
+ border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;
+ border-right-color: var(--bs-tooltip-bg);
+}
+
+.bodywebsite .bs-tooltip-bottom .tooltip-arrow, .bodywebsite .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {
+ top: 0;
+}
+
+.bodywebsite .bs-tooltip-bottom .tooltip-arrow::before, .bodywebsite .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {
+ bottom: -1px;
+ border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);
+ border-bottom-color: var(--bs-tooltip-bg);
+}
+
+.bodywebsite .bs-tooltip-start .tooltip-arrow, .bodywebsite .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {
+ right: 0;
+ width: var(--bs-tooltip-arrow-height);
+ height: var(--bs-tooltip-arrow-width);
+}
+
+.bodywebsite .bs-tooltip-start .tooltip-arrow::before, .bodywebsite .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {
+ left: -1px;
+ border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);
+ border-left-color: var(--bs-tooltip-bg);
+}
+
+.bodywebsite .tooltip-inner {
+ max-width: var(--bs-tooltip-max-width);
+ padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);
+ color: var(--bs-tooltip-color);
+ text-align: center;
+ background-color: var(--bs-tooltip-bg);
+ border-radius: var(--bs-tooltip-border-radius);
+}
+
+.bodywebsite .popover {
+ --bs-popover-zindex: 1070;
+ --bs-popover-max-width: 276px;
+ --bs-popover-font-size: 0.875rem;
+ --bs-popover-bg: #fff;
+ --bs-popover-border-width: 1px;
+ --bs-popover-border-color: var(--bs-border-color-translucent);
+ --bs-popover-border-radius: 0.5rem;
+ --bs-popover-inner-border-radius: calc(0.5rem - 1px);
+ --bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ --bs-popover-header-padding-x: 1rem;
+ --bs-popover-header-padding-y: 0.5rem;
+ --bs-popover-header-font-size: 1rem;
+ --bs-popover-header-bg: #f0f0f0;
+ --bs-popover-body-padding-x: 1rem;
+ --bs-popover-body-padding-y: 1rem;
+ --bs-popover-body-color: #212529;
+ --bs-popover-arrow-width: 1rem;
+ --bs-popover-arrow-height: 0.5rem;
+ --bs-popover-arrow-border: var(--bs-popover-border-color);
+ z-index: var(--bs-popover-zindex);
+ display: block;
+ max-width: var(--bs-popover-max-width);
+ font-family: var(--bs-font-sans-serif);
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.5;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ white-space: normal;
+ word-spacing: normal;
+ line-break: auto;
+ font-size: var(--bs-popover-font-size);
+ word-wrap: break-word;
+ background-color: var(--bs-popover-bg);
+ background-clip: padding-box;
+ border: var(--bs-popover-border-width) solid var(--bs-popover-border-color);
+ border-radius: var(--bs-popover-border-radius);
+}
+
+.bodywebsite .popover .popover-arrow {
+ display: block;
+ width: var(--bs-popover-arrow-width);
+ height: var(--bs-popover-arrow-height);
+}
+
+.bodywebsite .popover .popover-arrow::before, .bodywebsite .popover .popover-arrow::after {
+ position: absolute;
+ display: block;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+ border-width: 0;
+}
+
+.bodywebsite .bs-popover-top > .popover-arrow, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {
+ bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+}
+
+.bodywebsite .bs-popover-top > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bodywebsite .bs-popover-top > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {
+ border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;
+}
+
+.bodywebsite .bs-popover-top > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {
+ bottom: 0;
+ border-top-color: var(--bs-popover-arrow-border);
+}
+
+.bodywebsite .bs-popover-top > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {
+ bottom: var(--bs-popover-border-width);
+ border-top-color: var(--bs-popover-bg);
+}
+
+.bodywebsite .bs-popover-end > .popover-arrow, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {
+ left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+ width: var(--bs-popover-arrow-height);
+ height: var(--bs-popover-arrow-width);
+}
+
+.bodywebsite .bs-popover-end > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bodywebsite .bs-popover-end > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {
+ border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;
+}
+
+.bodywebsite .bs-popover-end > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {
+ left: 0;
+ border-right-color: var(--bs-popover-arrow-border);
+}
+
+.bodywebsite .bs-popover-end > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {
+ left: var(--bs-popover-border-width);
+ border-right-color: var(--bs-popover-bg);
+}
+
+.bodywebsite .bs-popover-bottom > .popover-arrow, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {
+ top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+}
+
+.bodywebsite .bs-popover-bottom > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bodywebsite .bs-popover-bottom > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {
+ border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);
+}
+
+.bodywebsite .bs-popover-bottom > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {
+ top: 0;
+ border-bottom-color: var(--bs-popover-arrow-border);
+}
+
+.bodywebsite .bs-popover-bottom > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {
+ top: var(--bs-popover-border-width);
+ border-bottom-color: var(--bs-popover-bg);
+}
+
+.bodywebsite .bs-popover-bottom .popover-header::before, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ display: block;
+ width: var(--bs-popover-arrow-width);
+ margin-left: calc(-0.5 * var(--bs-popover-arrow-width));
+ content: "";
+ border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg);
+}
+
+.bodywebsite .bs-popover-start > .popover-arrow, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {
+ right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+ width: var(--bs-popover-arrow-height);
+ height: var(--bs-popover-arrow-width);
+}
+
+.bodywebsite .bs-popover-start > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bodywebsite .bs-popover-start > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {
+ border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);
+}
+
+.bodywebsite .bs-popover-start > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {
+ right: 0;
+ border-left-color: var(--bs-popover-arrow-border);
+}
+
+.bodywebsite .bs-popover-start > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {
+ right: var(--bs-popover-border-width);
+ border-left-color: var(--bs-popover-bg);
+}
+
+.bodywebsite .popover-header {
+ padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);
+ margin-bottom: 0;
+ font-size: var(--bs-popover-header-font-size);
+ color: var(--bs-popover-header-color);
+ background-color: var(--bs-popover-header-bg);
+ border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color);
+ border-top-left-radius: var(--bs-popover-inner-border-radius);
+ border-top-right-radius: var(--bs-popover-inner-border-radius);
+}
+
+.bodywebsite .popover-header:empty {
+ display: none;
+}
+
+.bodywebsite .popover-body {
+ padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);
+ color: var(--bs-popover-body-color);
+}
+
+.bodywebsite .carousel {
+ position: relative;
+}
+
+.bodywebsite .carousel.pointer-event {
+ touch-action: pan-y;
+}
+
+.bodywebsite .carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden;
+}
+
+.bodywebsite .carousel-inner::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+
+.bodywebsite .carousel-item {
+ position: relative;
+ display: none;
+ float: left;
+ width: 100%;
+ margin-right: -100%;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ transition: transform 0.6s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .carousel-item {
+ transition: none;
+ }
+}
+
+.bodywebsite .carousel-item.active,
+ .bodywebsite .carousel-item-next,
+ .bodywebsite .carousel-item-prev {
+ display: block;
+}
+
+.bodywebsite .carousel-item-next:not(.carousel-item-start),
+ .bodywebsite .active.carousel-item-end {
+ transform: translateX(100%);
+}
+
+.bodywebsite .carousel-item-prev:not(.carousel-item-end),
+ .bodywebsite .active.carousel-item-start {
+ transform: translateX(-100%);
+}
+
+.bodywebsite .carousel-fade .carousel-item {
+ opacity: 0;
+ transition-property: opacity;
+ transform: none;
+}
+
+.bodywebsite .carousel-fade .carousel-item.active,
+ .bodywebsite .carousel-fade .carousel-item-next.carousel-item-start,
+ .bodywebsite .carousel-fade .carousel-item-prev.carousel-item-end {
+ z-index: 1;
+ opacity: 1;
+}
+
+.bodywebsite .carousel-fade .active.carousel-item-start,
+ .bodywebsite .carousel-fade .active.carousel-item-end {
+ z-index: 0;
+ opacity: 0;
+ transition: opacity 0s 0.6s;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .carousel-fade .active.carousel-item-start,
+ .bodywebsite .carousel-fade .active.carousel-item-end {
+ transition: none;
+ }
+}
+
+.bodywebsite .carousel-control-prev,
+ .bodywebsite .carousel-control-next {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 15%;
+ padding: 0;
+ color: #fff;
+ text-align: center;
+ background: none;
+ border: 0;
+ opacity: 0.5;
+ transition: opacity 0.15s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .carousel-control-prev,
+ .bodywebsite .carousel-control-next {
+ transition: none;
+ }
+}
+
+.bodywebsite .carousel-control-prev:hover, .bodywebsite .carousel-control-prev:focus,
+ .bodywebsite .carousel-control-next:hover,
+ .bodywebsite .carousel-control-next:focus {
+ color: #fff;
+ text-decoration: none;
+ outline: 0;
+ opacity: 0.9;
+}
+
+.bodywebsite .carousel-control-prev {
+ left: 0;
+}
+
+.bodywebsite .carousel-control-next {
+ right: 0;
+}
+
+.bodywebsite .carousel-control-prev-icon,
+ .bodywebsite .carousel-control-next-icon {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ background-repeat: no-repeat;
+ background-position: 50%;
+ background-size: 100% 100%;
+}
+
+.bodywebsite .carousel-control-prev-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .carousel-control-next-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .carousel-indicators {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 2;
+ display: flex;
+ justify-content: center;
+ padding: 0;
+ margin-right: 15%;
+ margin-bottom: 1rem;
+ margin-left: 15%;
+ list-style: none;
+}
+
+.bodywebsite .carousel-indicators [data-bs-target] {
+ box-sizing: content-box;
+ flex: 0 1 auto;
+ width: 30px;
+ height: 3px;
+ padding: 0;
+ margin-right: 3px;
+ margin-left: 3px;
+ text-indent: -999px;
+ cursor: pointer;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 0;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ opacity: 0.5;
+ transition: opacity 0.6s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .carousel-indicators [data-bs-target] {
+ transition: none;
+ }
+}
+
+.bodywebsite .carousel-indicators .active {
+ opacity: 1;
+}
+
+.bodywebsite .carousel-caption {
+ position: absolute;
+ right: 15%;
+ bottom: 1.25rem;
+ left: 15%;
+ padding-top: 1.25rem;
+ padding-bottom: 1.25rem;
+ color: #fff;
+ text-align: center;
+}
+
+.bodywebsite .carousel-dark .carousel-control-prev-icon,
+ .bodywebsite .carousel-dark .carousel-control-next-icon {
+ filter: invert(1) grayscale(100);
+}
+
+.bodywebsite .carousel-dark .carousel-indicators [data-bs-target] {
+ background-color: #000;
+}
+
+.bodywebsite .carousel-dark .carousel-caption {
+ color: #000;
+}
+
+.bodywebsite .spinner-grow,
+ .bodywebsite .spinner-border {
+ display: inline-block;
+ width: var(--bs-spinner-width);
+ height: var(--bs-spinner-height);
+ vertical-align: var(--bs-spinner-vertical-align);
+ border-radius: 50%;
+ -webkit-animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);
+ animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);
+}
+
+@-webkit-keyframes spinner-border {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes spinner-border {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+.bodywebsite .spinner-border {
+ --bs-spinner-width: 2rem;
+ --bs-spinner-height: 2rem;
+ --bs-spinner-vertical-align: -0.125em;
+ --bs-spinner-border-width: 0.25em;
+ --bs-spinner-animation-speed: 0.75s;
+ --bs-spinner-animation-name: spinner-border;
+ border: var(--bs-spinner-border-width) solid currentcolor;
+ border-right-color: transparent;
+}
+
+.bodywebsite .spinner-border-sm {
+ --bs-spinner-width: 1rem;
+ --bs-spinner-height: 1rem;
+ --bs-spinner-border-width: 0.2em;
+}
+
+@-webkit-keyframes spinner-grow {
+ 0% {
+ transform: scale(0);
+ }
+
+ 50% {
+ opacity: 1;
+ transform: none;
+ }
+}
+
+@keyframes spinner-grow {
+ 0% {
+ transform: scale(0);
+ }
+
+ 50% {
+ opacity: 1;
+ transform: none;
+ }
+}
+
+.bodywebsite .spinner-grow {
+ --bs-spinner-width: 2rem;
+ --bs-spinner-height: 2rem;
+ --bs-spinner-vertical-align: -0.125em;
+ --bs-spinner-animation-speed: 0.75s;
+ --bs-spinner-animation-name: spinner-grow;
+ background-color: currentcolor;
+ opacity: 0;
+}
+
+.bodywebsite .spinner-grow-sm {
+ --bs-spinner-width: 1rem;
+ --bs-spinner-height: 1rem;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .spinner-border,
+ .bodywebsite .spinner-grow {
+ --bs-spinner-animation-speed: 1.5s;
+ }
+}
+
+.bodywebsite .offcanvas, .bodywebsite .offcanvas-xxl, .bodywebsite .offcanvas-xl, .bodywebsite .offcanvas-lg, .bodywebsite .offcanvas-md, .bodywebsite .offcanvas-sm {
+ --bs-offcanvas-zindex: 1045;
+ --bs-offcanvas-width: 400px;
+ --bs-offcanvas-height: 30vh;
+ --bs-offcanvas-padding-x: 1rem;
+ --bs-offcanvas-padding-y: 1rem;
+ --bs-offcanvas-bg: #fff;
+ --bs-offcanvas-border-width: 1px;
+ --bs-offcanvas-border-color: var(--bs-border-color-translucent);
+ --bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-sm {
+ transition: none;
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.showing, .bodywebsite .offcanvas-sm.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.showing, .bodywebsite .offcanvas-sm.hiding, .bodywebsite .offcanvas-sm.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .offcanvas-sm {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-sm .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-sm .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-md {
+ transition: none;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.showing, .bodywebsite .offcanvas-md.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.showing, .bodywebsite .offcanvas-md.hiding, .bodywebsite .offcanvas-md.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .offcanvas-md {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-md .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-md .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-lg {
+ transition: none;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.showing, .bodywebsite .offcanvas-lg.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.showing, .bodywebsite .offcanvas-lg.hiding, .bodywebsite .offcanvas-lg.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .offcanvas-lg {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-lg .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-lg .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-xl {
+ transition: none;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.showing, .bodywebsite .offcanvas-xl.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.showing, .bodywebsite .offcanvas-xl.hiding, .bodywebsite .offcanvas-xl.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .offcanvas-xl {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-xl .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-xl .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-xxl {
+ transition: none;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.showing, .bodywebsite .offcanvas-xxl.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.showing, .bodywebsite .offcanvas-xxl.hiding, .bodywebsite .offcanvas-xxl.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .offcanvas-xxl {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-xxl .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-xxl .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+.bodywebsite .offcanvas {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas {
+ transition: none;
+ }
+}
+
+.bodywebsite .offcanvas.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+}
+
+.bodywebsite .offcanvas.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+}
+
+.bodywebsite .offcanvas.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+}
+
+.bodywebsite .offcanvas.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+}
+
+.bodywebsite .offcanvas.showing, .bodywebsite .offcanvas.show:not(.hiding) {
+ transform: none;
+}
+
+.bodywebsite .offcanvas.showing, .bodywebsite .offcanvas.hiding, .bodywebsite .offcanvas.show {
+ visibility: visible;
+}
+
+.bodywebsite .offcanvas-backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1040;
+ width: 100vw;
+ height: 100vh;
+ background-color: #000;
+}
+
+.bodywebsite .offcanvas-backdrop.fade {
+ opacity: 0;
+}
+
+.bodywebsite .offcanvas-backdrop.show {
+ opacity: 0.5;
+}
+
+.bodywebsite .offcanvas-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);
+}
+
+.bodywebsite .offcanvas-header .btn-close {
+ padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5);
+ margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y));
+ margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x));
+ margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y));
+}
+
+.bodywebsite .offcanvas-title {
+ margin-bottom: 0;
+ line-height: 1.5;
+}
+
+.bodywebsite .offcanvas-body {
+ flex-grow: 1;
+ padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);
+ overflow-y: auto;
+}
+
+.bodywebsite .placeholder {
+ display: inline-block;
+ min-height: 1em;
+ vertical-align: middle;
+ cursor: wait;
+ background-color: currentcolor;
+ opacity: 0.5;
+}
+
+.bodywebsite .placeholder.btn::before {
+ display: inline-block;
+ content: "";
+}
+
+.bodywebsite .placeholder-xs {
+ min-height: 0.6em;
+}
+
+.bodywebsite .placeholder-sm {
+ min-height: 0.8em;
+}
+
+.bodywebsite .placeholder-lg {
+ min-height: 1.2em;
+}
+
+.bodywebsite .placeholder-glow .placeholder {
+ -webkit-animation: placeholder-glow 2s ease-in-out infinite;
+ animation: placeholder-glow 2s ease-in-out infinite;
+}
+
+@-webkit-keyframes placeholder-glow {
+ 50% {
+ opacity: 0.2;
+ }
+}
+
+@keyframes placeholder-glow {
+ 50% {
+ opacity: 0.2;
+ }
+}
+
+.bodywebsite .placeholder-wave {
+ -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);
+ mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);
+ -webkit-mask-size: 200% 100%;
+ mask-size: 200% 100%;
+ -webkit-animation: placeholder-wave 2s linear infinite;
+ animation: placeholder-wave 2s linear infinite;
+}
+
+@-webkit-keyframes placeholder-wave {
+ 100% {
+ -webkit-mask-position: -200% 0%;
+ mask-position: -200% 0%;
+ }
+}
+
+@keyframes placeholder-wave {
+ 100% {
+ -webkit-mask-position: -200% 0%;
+ mask-position: -200% 0%;
+ }
+}
+
+.bodywebsite .clearfix::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+
+.bodywebsite .text-bg-primary {
+ color: #fff !important;
+ background-color: RGBA(13, 110, 253, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-secondary {
+ color: #fff !important;
+ background-color: RGBA(108, 117, 125, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-success {
+ color: #fff !important;
+ background-color: RGBA(25, 135, 84, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-info {
+ color: #000 !important;
+ background-color: RGBA(13, 202, 240, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-warning {
+ color: #000 !important;
+ background-color: RGBA(255, 193, 7, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-danger {
+ color: #fff !important;
+ background-color: RGBA(220, 53, 69, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-light {
+ color: #000 !important;
+ background-color: RGBA(248, 249, 250, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-dark {
+ color: #fff !important;
+ background-color: RGBA(33, 37, 41, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .link-primary {
+ color: #0d6efd !important;
+}
+
+.bodywebsite .link-primary:hover, .bodywebsite .link-primary:focus {
+ color: #0a58ca !important;
+}
+
+.bodywebsite .link-secondary {
+ color: #6c757d !important;
+}
+
+.bodywebsite .link-secondary:hover, .bodywebsite .link-secondary:focus {
+ color: #565e64 !important;
+}
+
+.bodywebsite .link-success {
+ color: #198754 !important;
+}
+
+.bodywebsite .link-success:hover, .bodywebsite .link-success:focus {
+ color: #146c43 !important;
+}
+
+.bodywebsite .link-info {
+ color: #0dcaf0 !important;
+}
+
+.bodywebsite .link-info:hover, .bodywebsite .link-info:focus {
+ color: #3dd5f3 !important;
+}
+
+.bodywebsite .link-warning {
+ color: #ffc107 !important;
+}
+
+.bodywebsite .link-warning:hover, .bodywebsite .link-warning:focus {
+ color: #ffcd39 !important;
+}
+
+.bodywebsite .link-danger {
+ color: #dc3545 !important;
+}
+
+.bodywebsite .link-danger:hover, .bodywebsite .link-danger:focus {
+ color: #b02a37 !important;
+}
+
+.bodywebsite .link-light {
+ color: #f8f9fa !important;
+}
+
+.bodywebsite .link-light:hover, .bodywebsite .link-light:focus {
+ color: #f9fafb !important;
+}
+
+.bodywebsite .link-dark {
+ color: #212529 !important;
+}
+
+.bodywebsite .link-dark:hover, .bodywebsite .link-dark:focus {
+ color: #1a1e21 !important;
+}
+
+.bodywebsite .ratio {
+ position: relative;
+ width: 100%;
+}
+
+.bodywebsite .ratio::before {
+ display: block;
+ padding-top: var(--bs-aspect-ratio);
+ content: "";
+}
+
+.bodywebsite .ratio > * {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+
+.bodywebsite .ratio-1x1 {
+ --bs-aspect-ratio: 100%;
+}
+
+.bodywebsite .ratio-4x3 {
+ --bs-aspect-ratio: 75%;
+}
+
+.bodywebsite .ratio-16x9 {
+ --bs-aspect-ratio: 56.25%;
+}
+
+.bodywebsite .ratio-21x9 {
+ --bs-aspect-ratio: 42.8571428571%;
+}
+
+.bodywebsite .fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1030;
+}
+
+.bodywebsite .fixed-bottom {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1030;
+}
+
+.bodywebsite .sticky-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+}
+
+.bodywebsite .sticky-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .sticky-sm-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-sm-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .sticky-md-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-md-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .sticky-lg-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-lg-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .sticky-xl-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-xl-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .sticky-xxl-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-xxl-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+.bodywebsite .hstack {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ align-self: stretch;
+}
+
+.bodywebsite .vstack {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ align-self: stretch;
+}
+
+.bodywebsite .visually-hidden,
+ .bodywebsite .visually-hidden-focusable:not(:focus):not(:focus-within) {
+ position: absolute !important;
+ width: 1px !important;
+ height: 1px !important;
+ padding: 0 !important;
+ margin: -1px !important;
+ overflow: hidden !important;
+ clip: rect(0, 0, 0, 0) !important;
+ white-space: nowrap !important;
+ border: 0 !important;
+}
+
+.bodywebsite .stretched-link::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1;
+ content: "";
+}
+
+.bodywebsite .text-truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.bodywebsite .vr {
+ display: inline-block;
+ align-self: stretch;
+ width: 1px;
+ min-height: 1em;
+ background-color: currentcolor;
+ opacity: 0.25;
+}
+
+.bodywebsite .align-baseline {
+ vertical-align: baseline !important;
+}
+
+.bodywebsite .align-top {
+ vertical-align: top !important;
+}
+
+.bodywebsite .align-middle {
+ vertical-align: middle !important;
+}
+
+.bodywebsite .align-bottom {
+ vertical-align: bottom !important;
+}
+
+.bodywebsite .align-text-bottom {
+ vertical-align: text-bottom !important;
+}
+
+.bodywebsite .align-text-top {
+ vertical-align: text-top !important;
+}
+
+.bodywebsite .float-start {
+ float: left !important;
+}
+
+.bodywebsite .float-end {
+ float: right !important;
+}
+
+.bodywebsite .float-none {
+ float: none !important;
+}
+
+.bodywebsite .opacity-0 {
+ opacity: 0 !important;
+}
+
+.bodywebsite .opacity-25 {
+ opacity: 0.25 !important;
+}
+
+.bodywebsite .opacity-50 {
+ opacity: 0.5 !important;
+}
+
+.bodywebsite .opacity-75 {
+ opacity: 0.75 !important;
+}
+
+.bodywebsite .opacity-100 {
+ opacity: 1 !important;
+}
+
+.bodywebsite .overflow-auto {
+ overflow: auto !important;
+}
+
+.bodywebsite .overflow-hidden {
+ overflow: hidden !important;
+}
+
+.bodywebsite .overflow-visible {
+ overflow: visible !important;
+}
+
+.bodywebsite .overflow-scroll {
+ overflow: scroll !important;
+}
+
+.bodywebsite .d-inline {
+ display: inline !important;
+}
+
+.bodywebsite .d-inline-block {
+ display: inline-block !important;
+}
+
+.bodywebsite .d-block {
+ display: block !important;
+}
+
+.bodywebsite .d-grid {
+ display: grid !important;
+}
+
+.bodywebsite .d-table {
+ display: table !important;
+}
+
+.bodywebsite .d-table-row {
+ display: table-row !important;
+}
+
+.bodywebsite .d-table-cell {
+ display: table-cell !important;
+}
+
+.bodywebsite .d-flex {
+ display: flex !important;
+}
+
+.bodywebsite .d-inline-flex {
+ display: inline-flex !important;
+}
+
+.bodywebsite .d-none {
+ display: none !important;
+}
+
+.bodywebsite .shadow {
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
+}
+
+.bodywebsite .shadow-sm {
+ box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
+}
+
+.bodywebsite .shadow-lg {
+ box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;
+}
+
+.bodywebsite .shadow-none {
+ box-shadow: none !important;
+}
+
+.bodywebsite .position-static {
+ position: static !important;
+}
+
+.bodywebsite .position-relative {
+ position: relative !important;
+}
+
+.bodywebsite .position-absolute {
+ position: absolute !important;
+}
+
+.bodywebsite .position-fixed {
+ position: fixed !important;
+}
+
+.bodywebsite .position-sticky {
+ position: -webkit-sticky !important;
+ position: sticky !important;
+}
+
+.bodywebsite .top-0 {
+ top: 0 !important;
+}
+
+.bodywebsite .top-50 {
+ top: 50% !important;
+}
+
+.bodywebsite .top-100 {
+ top: 100% !important;
+}
+
+.bodywebsite .bottom-0 {
+ bottom: 0 !important;
+}
+
+.bodywebsite .bottom-50 {
+ bottom: 50% !important;
+}
+
+.bodywebsite .bottom-100 {
+ bottom: 100% !important;
+}
+
+.bodywebsite .start-0 {
+ left: 0 !important;
+}
+
+.bodywebsite .start-50 {
+ left: 50% !important;
+}
+
+.bodywebsite .start-100 {
+ left: 100% !important;
+}
+
+.bodywebsite .end-0 {
+ right: 0 !important;
+}
+
+.bodywebsite .end-50 {
+ right: 50% !important;
+}
+
+.bodywebsite .end-100 {
+ right: 100% !important;
+}
+
+.bodywebsite .translate-middle {
+ transform: translate(-50%, -50%) !important;
+}
+
+.bodywebsite .translate-middle-x {
+ transform: translateX(-50%) !important;
+}
+
+.bodywebsite .translate-middle-y {
+ transform: translateY(-50%) !important;
+}
+
+.bodywebsite .border {
+ border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-0 {
+ border: 0 !important;
+}
+
+.bodywebsite .border-top {
+ border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-top-0 {
+ border-top: 0 !important;
+}
+
+.bodywebsite .border-end {
+ border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-end-0 {
+ border-right: 0 !important;
+}
+
+.bodywebsite .border-bottom {
+ border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-bottom-0 {
+ border-bottom: 0 !important;
+}
+
+.bodywebsite .border-start {
+ border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-start-0 {
+ border-left: 0 !important;
+}
+
+.bodywebsite .border-primary {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-secondary {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-success {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-info {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-warning {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-danger {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-light {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-dark {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-white {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-1 {
+ --bs-border-width: 1px;
+}
+
+.bodywebsite .border-2 {
+ --bs-border-width: 2px;
+}
+
+.bodywebsite .border-3 {
+ --bs-border-width: 3px;
+}
+
+.bodywebsite .border-4 {
+ --bs-border-width: 4px;
+}
+
+.bodywebsite .border-5 {
+ --bs-border-width: 5px;
+}
+
+.bodywebsite .border-opacity-10 {
+ --bs-border-opacity: 0.1;
+}
+
+.bodywebsite .border-opacity-25 {
+ --bs-border-opacity: 0.25;
+}
+
+.bodywebsite .border-opacity-50 {
+ --bs-border-opacity: 0.5;
+}
+
+.bodywebsite .border-opacity-75 {
+ --bs-border-opacity: 0.75;
+}
+
+.bodywebsite .border-opacity-100 {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .w-25 {
+ width: 25% !important;
+}
+
+.bodywebsite .w-50 {
+ width: 50% !important;
+}
+
+.bodywebsite .w-75 {
+ width: 75% !important;
+}
+
+.bodywebsite .w-100 {
+ width: 100% !important;
+}
+
+.bodywebsite .w-auto {
+ width: auto !important;
+}
+
+.bodywebsite .mw-100 {
+ max-width: 100% !important;
+}
+
+.bodywebsite .vw-100 {
+ width: 100vw !important;
+}
+
+.bodywebsite .min-vw-100 {
+ min-width: 100vw !important;
+}
+
+.bodywebsite .h-25 {
+ height: 25% !important;
+}
+
+.bodywebsite .h-50 {
+ height: 50% !important;
+}
+
+.bodywebsite .h-75 {
+ height: 75% !important;
+}
+
+.bodywebsite .h-100 {
+ height: 100% !important;
+}
+
+.bodywebsite .h-auto {
+ height: auto !important;
+}
+
+.bodywebsite .mh-100 {
+ max-height: 100% !important;
+}
+
+.bodywebsite .vh-100 {
+ height: 100vh !important;
+}
+
+.bodywebsite .min-vh-100 {
+ min-height: 100vh !important;
+}
+
+.bodywebsite .flex-fill {
+ flex: 1 1 auto !important;
+}
+
+.bodywebsite .flex-row {
+ flex-direction: row !important;
+}
+
+.bodywebsite .flex-column {
+ flex-direction: column !important;
+}
+
+.bodywebsite .flex-row-reverse {
+ flex-direction: row-reverse !important;
+}
+
+.bodywebsite .flex-column-reverse {
+ flex-direction: column-reverse !important;
+}
+
+.bodywebsite .flex-grow-0 {
+ flex-grow: 0 !important;
+}
+
+.bodywebsite .flex-grow-1 {
+ flex-grow: 1 !important;
+}
+
+.bodywebsite .flex-shrink-0 {
+ flex-shrink: 0 !important;
+}
+
+.bodywebsite .flex-shrink-1 {
+ flex-shrink: 1 !important;
+}
+
+.bodywebsite .flex-wrap {
+ flex-wrap: wrap !important;
+}
+
+.bodywebsite .flex-nowrap {
+ flex-wrap: nowrap !important;
+}
+
+.bodywebsite .flex-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+}
+
+.bodywebsite .justify-content-start {
+ justify-content: flex-start !important;
+}
+
+.bodywebsite .justify-content-end {
+ justify-content: flex-end !important;
+}
+
+.bodywebsite .justify-content-center {
+ justify-content: center !important;
+}
+
+.bodywebsite .justify-content-between {
+ justify-content: space-between !important;
+}
+
+.bodywebsite .justify-content-around {
+ justify-content: space-around !important;
+}
+
+.bodywebsite .justify-content-evenly {
+ justify-content: space-evenly !important;
+}
+
+.bodywebsite .align-items-start {
+ align-items: flex-start !important;
+}
+
+.bodywebsite .align-items-end {
+ align-items: flex-end !important;
+}
+
+.bodywebsite .align-items-center {
+ align-items: center !important;
+}
+
+.bodywebsite .align-items-baseline {
+ align-items: baseline !important;
+}
+
+.bodywebsite .align-items-stretch {
+ align-items: stretch !important;
+}
+
+.bodywebsite .align-content-start {
+ align-content: flex-start !important;
+}
+
+.bodywebsite .align-content-end {
+ align-content: flex-end !important;
+}
+
+.bodywebsite .align-content-center {
+ align-content: center !important;
+}
+
+.bodywebsite .align-content-between {
+ align-content: space-between !important;
+}
+
+.bodywebsite .align-content-around {
+ align-content: space-around !important;
+}
+
+.bodywebsite .align-content-stretch {
+ align-content: stretch !important;
+}
+
+.bodywebsite .align-self-auto {
+ align-self: auto !important;
+}
+
+.bodywebsite .align-self-start {
+ align-self: flex-start !important;
+}
+
+.bodywebsite .align-self-end {
+ align-self: flex-end !important;
+}
+
+.bodywebsite .align-self-center {
+ align-self: center !important;
+}
+
+.bodywebsite .align-self-baseline {
+ align-self: baseline !important;
+}
+
+.bodywebsite .align-self-stretch {
+ align-self: stretch !important;
+}
+
+.bodywebsite .order-first {
+ order: -1 !important;
+}
+
+.bodywebsite .order-0 {
+ order: 0 !important;
+}
+
+.bodywebsite .order-1 {
+ order: 1 !important;
+}
+
+.bodywebsite .order-2 {
+ order: 2 !important;
+}
+
+.bodywebsite .order-3 {
+ order: 3 !important;
+}
+
+.bodywebsite .order-4 {
+ order: 4 !important;
+}
+
+.bodywebsite .order-5 {
+ order: 5 !important;
+}
+
+.bodywebsite .order-last {
+ order: 6 !important;
+}
+
+.bodywebsite .m-0 {
+ margin: 0 !important;
+}
+
+.bodywebsite .m-1 {
+ margin: 0.25rem !important;
+}
+
+.bodywebsite .m-2 {
+ margin: 0.5rem !important;
+}
+
+.bodywebsite .m-3 {
+ margin: 1rem !important;
+}
+
+.bodywebsite .m-4 {
+ margin: 1.5rem !important;
+}
+
+.bodywebsite .m-5 {
+ margin: 3rem !important;
+}
+
+.bodywebsite .m-auto {
+ margin: auto !important;
+}
+
+.bodywebsite .mx-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+}
+
+.bodywebsite .mx-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+}
+
+.bodywebsite .mx-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+}
+
+.bodywebsite .mx-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+}
+
+.bodywebsite .mx-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+}
+
+.bodywebsite .mx-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+}
+
+.bodywebsite .mx-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+}
+
+.bodywebsite .my-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+.bodywebsite .my-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+}
+
+.bodywebsite .my-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+}
+
+.bodywebsite .my-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+}
+
+.bodywebsite .my-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+}
+
+.bodywebsite .my-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+}
+
+.bodywebsite .my-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+}
+
+.bodywebsite .mt-0 {
+ margin-top: 0 !important;
+}
+
+.bodywebsite .mt-1 {
+ margin-top: 0.25rem !important;
+}
+
+.bodywebsite .mt-2 {
+ margin-top: 0.5rem !important;
+}
+
+.bodywebsite .mt-3 {
+ margin-top: 1rem !important;
+}
+
+.bodywebsite .mt-4 {
+ margin-top: 1.5rem !important;
+}
+
+.bodywebsite .mt-5 {
+ margin-top: 3rem !important;
+}
+
+.bodywebsite .mt-auto {
+ margin-top: auto !important;
+}
+
+.bodywebsite .me-0 {
+ margin-right: 0 !important;
+}
+
+.bodywebsite .me-1 {
+ margin-right: 0.25rem !important;
+}
+
+.bodywebsite .me-2 {
+ margin-right: 0.5rem !important;
+}
+
+.bodywebsite .me-3 {
+ margin-right: 1rem !important;
+}
+
+.bodywebsite .me-4 {
+ margin-right: 1.5rem !important;
+}
+
+.bodywebsite .me-5 {
+ margin-right: 3rem !important;
+}
+
+.bodywebsite .me-auto {
+ margin-right: auto !important;
+}
+
+.bodywebsite .mb-0 {
+ margin-bottom: 0 !important;
+}
+
+.bodywebsite .mb-1 {
+ margin-bottom: 0.25rem !important;
+}
+
+.bodywebsite .mb-2 {
+ margin-bottom: 0.5rem !important;
+}
+
+.bodywebsite .mb-3 {
+ margin-bottom: 1rem !important;
+}
+
+.bodywebsite .mb-4 {
+ margin-bottom: 1.5rem !important;
+}
+
+.bodywebsite .mb-5 {
+ margin-bottom: 3rem !important;
+}
+
+.bodywebsite .mb-auto {
+ margin-bottom: auto !important;
+}
+
+.bodywebsite .ms-0 {
+ margin-left: 0 !important;
+}
+
+.bodywebsite .ms-1 {
+ margin-left: 0.25rem !important;
+}
+
+.bodywebsite .ms-2 {
+ margin-left: 0.5rem !important;
+}
+
+.bodywebsite .ms-3 {
+ margin-left: 1rem !important;
+}
+
+.bodywebsite .ms-4 {
+ margin-left: 1.5rem !important;
+}
+
+.bodywebsite .ms-5 {
+ margin-left: 3rem !important;
+}
+
+.bodywebsite .ms-auto {
+ margin-left: auto !important;
+}
+
+.bodywebsite .p-0 {
+ padding: 0 !important;
+}
+
+.bodywebsite .p-1 {
+ padding: 0.25rem !important;
+}
+
+.bodywebsite .p-2 {
+ padding: 0.5rem !important;
+}
+
+.bodywebsite .p-3 {
+ padding: 1rem !important;
+}
+
+.bodywebsite .p-4 {
+ padding: 1.5rem !important;
+}
+
+.bodywebsite .p-5 {
+ padding: 3rem !important;
+}
+
+.bodywebsite .px-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+}
+
+.bodywebsite .px-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+}
+
+.bodywebsite .px-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+}
+
+.bodywebsite .px-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+}
+
+.bodywebsite .px-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+}
+
+.bodywebsite .px-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+}
+
+.bodywebsite .py-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+}
+
+.bodywebsite .py-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+}
+
+.bodywebsite .py-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+}
+
+.bodywebsite .py-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+}
+
+.bodywebsite .py-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+}
+
+.bodywebsite .py-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+}
+
+.bodywebsite .pt-0 {
+ padding-top: 0 !important;
+}
+
+.bodywebsite .pt-1 {
+ padding-top: 0.25rem !important;
+}
+
+.bodywebsite .pt-2 {
+ padding-top: 0.5rem !important;
+}
+
+.bodywebsite .pt-3 {
+ padding-top: 1rem !important;
+}
+
+.bodywebsite .pt-4 {
+ padding-top: 1.5rem !important;
+}
+
+.bodywebsite .pt-5 {
+ padding-top: 3rem !important;
+}
+
+.bodywebsite .pe-0 {
+ padding-right: 0 !important;
+}
+
+.bodywebsite .pe-1 {
+ padding-right: 0.25rem !important;
+}
+
+.bodywebsite .pe-2 {
+ padding-right: 0.5rem !important;
+}
+
+.bodywebsite .pe-3 {
+ padding-right: 1rem !important;
+}
+
+.bodywebsite .pe-4 {
+ padding-right: 1.5rem !important;
+}
+
+.bodywebsite .pe-5 {
+ padding-right: 3rem !important;
+}
+
+.bodywebsite .pb-0 {
+ padding-bottom: 0 !important;
+}
+
+.bodywebsite .pb-1 {
+ padding-bottom: 0.25rem !important;
+}
+
+.bodywebsite .pb-2 {
+ padding-bottom: 0.5rem !important;
+}
+
+.bodywebsite .pb-3 {
+ padding-bottom: 1rem !important;
+}
+
+.bodywebsite .pb-4 {
+ padding-bottom: 1.5rem !important;
+}
+
+.bodywebsite .pb-5 {
+ padding-bottom: 3rem !important;
+}
+
+.bodywebsite .ps-0 {
+ padding-left: 0 !important;
+}
+
+.bodywebsite .ps-1 {
+ padding-left: 0.25rem !important;
+}
+
+.bodywebsite .ps-2 {
+ padding-left: 0.5rem !important;
+}
+
+.bodywebsite .ps-3 {
+ padding-left: 1rem !important;
+}
+
+.bodywebsite .ps-4 {
+ padding-left: 1.5rem !important;
+}
+
+.bodywebsite .ps-5 {
+ padding-left: 3rem !important;
+}
+
+.bodywebsite .gap-0 {
+ gap: 0 !important;
+}
+
+.bodywebsite .gap-1 {
+ gap: 0.25rem !important;
+}
+
+.bodywebsite .gap-2 {
+ gap: 0.5rem !important;
+}
+
+.bodywebsite .gap-3 {
+ gap: 1rem !important;
+}
+
+.bodywebsite .gap-4 {
+ gap: 1.5rem !important;
+}
+
+.bodywebsite .gap-5 {
+ gap: 3rem !important;
+}
+
+.bodywebsite .font-monospace {
+ font-family: var(--bs-font-monospace) !important;
+}
+
+.bodywebsite .fs-1 {
+ font-size: calc(1.375rem + 1.5vw) !important;
+}
+
+.bodywebsite .fs-2 {
+ font-size: calc(1.325rem + 0.9vw) !important;
+}
+
+.bodywebsite .fs-3 {
+ font-size: calc(1.3rem + 0.6vw) !important;
+}
+
+.bodywebsite .fs-4 {
+ font-size: calc(1.275rem + 0.3vw) !important;
+}
+
+.bodywebsite .fs-5 {
+ font-size: 1.25rem !important;
+}
+
+.bodywebsite .fs-6 {
+ font-size: 1rem !important;
+}
+
+.bodywebsite .fst-italic {
+ font-style: italic !important;
+}
+
+.bodywebsite .fst-normal {
+ font-style: normal !important;
+}
+
+.bodywebsite .fw-light {
+ font-weight: 300 !important;
+}
+
+.bodywebsite .fw-lighter {
+ font-weight: lighter !important;
+}
+
+.bodywebsite .fw-normal {
+ font-weight: 400 !important;
+}
+
+.bodywebsite .fw-bold {
+ font-weight: 700 !important;
+}
+
+.bodywebsite .fw-semibold {
+ font-weight: 600 !important;
+}
+
+.bodywebsite .fw-bolder {
+ font-weight: bolder !important;
+}
+
+.bodywebsite .lh-1 {
+ line-height: 1 !important;
+}
+
+.bodywebsite .lh-sm {
+ line-height: 1.25 !important;
+}
+
+.bodywebsite .lh-base {
+ line-height: 1.5 !important;
+}
+
+.bodywebsite .lh-lg {
+ line-height: 2 !important;
+}
+
+.bodywebsite .text-start {
+ text-align: left !important;
+}
+
+.bodywebsite .text-end {
+ text-align: right !important;
+}
+
+.bodywebsite .text-center {
+ text-align: center !important;
+}
+
+.bodywebsite .text-decoration-none {
+ text-decoration: none !important;
+}
+
+.bodywebsite .text-decoration-underline {
+ text-decoration: underline !important;
+}
+
+.bodywebsite .text-decoration-line-through {
+ text-decoration: line-through !important;
+}
+
+.bodywebsite .text-lowercase {
+ text-transform: lowercase !important;
+}
+
+.bodywebsite .text-uppercase {
+ text-transform: uppercase !important;
+}
+
+.bodywebsite .text-capitalize {
+ text-transform: capitalize !important;
+}
+
+.bodywebsite .text-wrap {
+ white-space: normal !important;
+}
+
+.bodywebsite .text-nowrap {
+ white-space: nowrap !important;
+}
+
+.bodywebsite .text-break {
+ word-wrap: break-word !important;
+ word-break: break-word !important;
+}
+
+.bodywebsite .text-primary {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-secondary {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-success {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-info {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-warning {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-danger {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-light {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-dark {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-black {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-white {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-body {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-muted {
+ --bs-text-opacity: 1;
+ color: #6c757d !important;
+}
+
+.bodywebsite .text-black-50 {
+ --bs-text-opacity: 1;
+ color: rgba(0, 0, 0, 0.5) !important;
+}
+
+.bodywebsite .text-white-50 {
+ --bs-text-opacity: 1;
+ color: rgba(255, 255, 255, 0.5) !important;
+}
+
+.bodywebsite .text-reset {
+ --bs-text-opacity: 1;
+ color: inherit !important;
+}
+
+.bodywebsite .text-opacity-25 {
+ --bs-text-opacity: 0.25;
+}
+
+.bodywebsite .text-opacity-50 {
+ --bs-text-opacity: 0.5;
+}
+
+.bodywebsite .text-opacity-75 {
+ --bs-text-opacity: 0.75;
+}
+
+.bodywebsite .text-opacity-100 {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .bg-primary {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-secondary {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-success {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-info {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-warning {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-danger {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-light {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-dark {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-black {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-white {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-body {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-transparent {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-opacity-10 {
+ --bs-bg-opacity: 0.1;
+}
+
+.bodywebsite .bg-opacity-25 {
+ --bs-bg-opacity: 0.25;
+}
+
+.bodywebsite .bg-opacity-50 {
+ --bs-bg-opacity: 0.5;
+}
+
+.bodywebsite .bg-opacity-75 {
+ --bs-bg-opacity: 0.75;
+}
+
+.bodywebsite .bg-opacity-100 {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-gradient {
+ background-image: var(--bs-gradient) !important;
+}
+
+.bodywebsite .user-select-all {
+ -webkit-user-select: all !important;
+ -moz-user-select: all !important;
+ user-select: all !important;
+}
+
+.bodywebsite .user-select-auto {
+ -webkit-user-select: auto !important;
+ -moz-user-select: auto !important;
+ user-select: auto !important;
+}
+
+.bodywebsite .user-select-none {
+ -webkit-user-select: none !important;
+ -moz-user-select: none !important;
+ user-select: none !important;
+}
+
+.bodywebsite .pe-none {
+ pointer-events: none !important;
+}
+
+.bodywebsite .pe-auto {
+ pointer-events: auto !important;
+}
+
+.bodywebsite .rounded {
+ border-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-0 {
+ border-radius: 0 !important;
+}
+
+.bodywebsite .rounded-1 {
+ border-radius: var(--bs-border-radius-sm) !important;
+}
+
+.bodywebsite .rounded-2 {
+ border-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-3 {
+ border-radius: var(--bs-border-radius-lg) !important;
+}
+
+.bodywebsite .rounded-4 {
+ border-radius: var(--bs-border-radius-xl) !important;
+}
+
+.bodywebsite .rounded-5 {
+ border-radius: var(--bs-border-radius-2xl) !important;
+}
+
+.bodywebsite .rounded-circle {
+ border-radius: 50% !important;
+}
+
+.bodywebsite .rounded-pill {
+ border-radius: var(--bs-border-radius-pill) !important;
+}
+
+.bodywebsite .rounded-top {
+ border-top-left-radius: var(--bs-border-radius) !important;
+ border-top-right-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-end {
+ border-top-right-radius: var(--bs-border-radius) !important;
+ border-bottom-right-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-bottom {
+ border-bottom-right-radius: var(--bs-border-radius) !important;
+ border-bottom-left-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-start {
+ border-bottom-left-radius: var(--bs-border-radius) !important;
+ border-top-left-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .visible {
+ visibility: visible !important;
+}
+
+.bodywebsite .invisible {
+ visibility: hidden !important;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .float-sm-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-sm-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-sm-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-sm-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-sm-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-sm-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-sm-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-sm-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-sm-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-sm-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-sm-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-sm-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-sm-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-sm-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-sm-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-sm-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-sm-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-sm-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-sm-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-sm-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-sm-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-sm-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-sm-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-sm-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-sm-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-sm-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-sm-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-sm-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-sm-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-sm-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-sm-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-sm-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-sm-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-sm-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-sm-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-sm-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-sm-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-sm-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-sm-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-sm-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-sm-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-sm-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-sm-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-sm-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-sm-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-sm-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-sm-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-sm-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-sm-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-sm-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-sm-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-sm-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-sm-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-sm-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-sm-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-sm-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-sm-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-sm-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-sm-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-sm-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-sm-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-sm-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-sm-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-sm-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-sm-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-sm-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-sm-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-sm-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-sm-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-sm-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-sm-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-sm-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-sm-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-sm-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-sm-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-sm-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-sm-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-sm-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-sm-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-sm-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-sm-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-sm-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-sm-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-sm-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-sm-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-sm-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-sm-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-sm-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-sm-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-sm-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-sm-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-sm-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-sm-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-sm-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-sm-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-sm-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-sm-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-sm-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-sm-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-sm-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-sm-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-sm-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-sm-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-sm-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-sm-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-sm-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-sm-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-sm-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-sm-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-sm-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-sm-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-sm-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-sm-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-sm-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-sm-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-sm-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-sm-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-sm-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-sm-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-sm-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-sm-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-sm-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-sm-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-sm-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-sm-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-sm-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-sm-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-sm-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-sm-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-sm-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-sm-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-sm-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-sm-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-sm-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-sm-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-sm-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-sm-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-sm-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-sm-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-sm-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-sm-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-sm-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-sm-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-sm-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-sm-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-sm-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-sm-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-sm-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-sm-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-sm-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-sm-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-sm-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-sm-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-sm-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-sm-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-sm-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .float-md-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-md-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-md-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-md-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-md-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-md-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-md-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-md-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-md-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-md-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-md-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-md-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-md-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-md-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-md-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-md-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-md-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-md-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-md-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-md-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-md-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-md-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-md-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-md-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-md-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-md-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-md-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-md-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-md-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-md-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-md-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-md-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-md-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-md-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-md-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-md-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-md-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-md-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-md-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-md-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-md-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-md-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-md-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-md-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-md-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-md-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-md-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-md-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-md-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-md-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-md-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-md-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-md-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-md-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-md-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-md-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-md-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-md-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-md-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-md-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-md-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-md-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-md-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-md-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-md-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-md-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-md-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-md-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-md-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-md-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-md-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-md-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-md-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-md-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-md-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-md-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-md-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-md-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-md-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-md-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-md-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-md-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-md-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-md-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-md-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-md-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-md-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-md-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-md-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-md-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-md-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-md-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-md-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-md-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-md-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-md-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-md-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-md-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-md-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-md-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-md-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-md-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-md-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-md-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-md-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-md-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-md-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-md-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-md-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-md-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-md-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-md-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-md-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-md-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-md-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-md-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-md-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-md-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-md-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-md-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-md-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-md-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-md-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-md-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-md-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-md-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-md-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-md-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-md-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-md-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-md-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-md-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-md-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-md-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-md-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-md-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-md-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-md-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-md-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-md-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-md-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-md-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-md-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-md-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-md-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-md-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-md-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-md-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-md-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-md-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-md-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-md-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-md-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-md-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-md-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-md-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .float-lg-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-lg-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-lg-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-lg-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-lg-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-lg-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-lg-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-lg-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-lg-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-lg-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-lg-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-lg-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-lg-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-lg-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-lg-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-lg-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-lg-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-lg-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-lg-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-lg-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-lg-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-lg-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-lg-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-lg-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-lg-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-lg-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-lg-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-lg-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-lg-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-lg-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-lg-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-lg-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-lg-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-lg-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-lg-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-lg-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-lg-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-lg-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-lg-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-lg-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-lg-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-lg-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-lg-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-lg-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-lg-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-lg-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-lg-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-lg-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-lg-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-lg-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-lg-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-lg-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-lg-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-lg-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-lg-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-lg-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-lg-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-lg-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-lg-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-lg-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-lg-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-lg-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-lg-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-lg-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-lg-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-lg-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-lg-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-lg-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-lg-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-lg-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-lg-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-lg-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-lg-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-lg-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-lg-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-lg-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-lg-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-lg-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-lg-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-lg-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-lg-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-lg-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-lg-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-lg-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-lg-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-lg-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-lg-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-lg-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-lg-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-lg-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-lg-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-lg-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-lg-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-lg-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-lg-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-lg-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-lg-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-lg-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-lg-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-lg-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-lg-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-lg-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-lg-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-lg-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-lg-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-lg-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-lg-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-lg-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-lg-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-lg-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-lg-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-lg-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-lg-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-lg-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-lg-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-lg-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-lg-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-lg-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-lg-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-lg-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-lg-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-lg-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-lg-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-lg-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-lg-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-lg-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-lg-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-lg-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-lg-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-lg-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-lg-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-lg-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-lg-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-lg-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-lg-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-lg-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-lg-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-lg-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-lg-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-lg-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-lg-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-lg-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-lg-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-lg-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-lg-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-lg-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-lg-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-lg-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-lg-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-lg-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-lg-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-lg-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-lg-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-lg-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-lg-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-lg-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .float-xl-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-xl-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-xl-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-xl-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-xl-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-xl-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-xl-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-xl-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-xl-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-xl-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-xl-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-xl-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-xl-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-xl-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-xl-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-xl-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-xl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-xl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-xl-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-xl-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-xl-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-xl-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-xl-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-xl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-xl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-xl-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-xl-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-xl-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-xl-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-xl-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-xl-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-xl-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-xl-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-xl-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-xl-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-xl-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-xl-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-xl-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-xl-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-xl-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-xl-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-xl-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-xl-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-xl-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-xl-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-xl-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-xl-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-xl-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-xl-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-xl-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-xl-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-xl-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-xl-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-xl-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-xl-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-xl-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-xl-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-xl-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-xl-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-xl-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-xl-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-xl-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-xl-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-xl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-xl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-xl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-xl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-xl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-xl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-xl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-xl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-xl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-xl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-xl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-xl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-xl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-xl-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-xl-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-xl-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-xl-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-xl-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-xl-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-xl-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-xl-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-xl-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-xl-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-xl-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-xl-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-xl-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-xl-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-xl-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-xl-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-xl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-xl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-xl-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-xl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-xl-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-xl-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-xl-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-xl-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-xl-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-xl-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-xl-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-xl-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-xl-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-xl-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-xl-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-xl-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-xl-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-xl-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-xl-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-xl-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-xl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-xl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-xl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-xl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-xl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-xl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-xl-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-xl-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-xl-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-xl-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-xl-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-xl-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-xl-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-xl-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-xl-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-xl-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-xl-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-xl-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-xl-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-xl-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-xl-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-xl-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-xl-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-xl-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-xl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-xl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-xl-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-xl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-xl-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-xl-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-xl-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-xl-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-xl-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-xl-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-xl-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-xl-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-xl-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-xl-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-xl-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-xl-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-xl-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-xl-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-xl-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-xl-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .float-xxl-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-xxl-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-xxl-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-xxl-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-xxl-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-xxl-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-xxl-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-xxl-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-xxl-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-xxl-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-xxl-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-xxl-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-xxl-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-xxl-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-xxl-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-xxl-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-xxl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-xxl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-xxl-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-xxl-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-xxl-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-xxl-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-xxl-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-xxl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-xxl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-xxl-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-xxl-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-xxl-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-xxl-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-xxl-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-xxl-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-xxl-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-xxl-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-xxl-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-xxl-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-xxl-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-xxl-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-xxl-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-xxl-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-xxl-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-xxl-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-xxl-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-xxl-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-xxl-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-xxl-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-xxl-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-xxl-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-xxl-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-xxl-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-xxl-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-xxl-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-xxl-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-xxl-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-xxl-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-xxl-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-xxl-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-xxl-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-xxl-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-xxl-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-xxl-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-xxl-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-xxl-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-xxl-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-xxl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-xxl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-xxl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-xxl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-xxl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-xxl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-xxl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-xxl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-xxl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-xxl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-xxl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-xxl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-xxl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-xxl-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-xxl-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-xxl-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-xxl-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-xxl-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-xxl-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-xxl-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-xxl-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-xxl-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-xxl-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-xxl-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-xxl-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-xxl-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-xxl-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-xxl-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-xxl-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-xxl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-xxl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-xxl-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-xxl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-xxl-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-xxl-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-xxl-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-xxl-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-xxl-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-xxl-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-xxl-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-xxl-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-xxl-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-xxl-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-xxl-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-xxl-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-xxl-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-xxl-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-xxl-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-xxl-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-xxl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-xxl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-xxl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-xxl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-xxl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-xxl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-xxl-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-xxl-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-xxl-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-xxl-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-xxl-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-xxl-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-xxl-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-xxl-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-xxl-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-xxl-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-xxl-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-xxl-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-xxl-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-xxl-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-xxl-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-xxl-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-xxl-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-xxl-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-xxl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-xxl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-xxl-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-xxl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-xxl-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-xxl-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-xxl-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-xxl-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-xxl-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-xxl-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-xxl-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-xxl-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-xxl-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-xxl-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-xxl-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-xxl-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-xxl-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-xxl-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-xxl-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-xxl-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .fs-1 {
+ font-size: 2.5rem !important;
+ }
+
+ .bodywebsite .fs-2 {
+ font-size: 2rem !important;
+ }
+
+ .bodywebsite .fs-3 {
+ font-size: 1.75rem !important;
+ }
+
+ .bodywebsite .fs-4 {
+ font-size: 1.5rem !important;
+ }
+}
+
+@media print {
+ .bodywebsite .d-print-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-print-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-print-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-print-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-print-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-print-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-print-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-print-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-print-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-print-none {
+ display: none !important;
+ }
+}
+
+.bodywebsite h1,
+.bodywebsite h2,
+.bodywebsite h3,
+.bodywebsite h4,
+.bodywebsite h5,
+.bodywebsite h6 {
+ font-family: Hurricane;
+}
+
+.bodywebsite hr {
+ margin: 100px;
+}
+
+.bodywebsite header {
+ align-items: center;
+ justify-content: center;
+}
+.bodywebsite .bg {
+ background-color: #010134;
+}
+
+.bodywebsite #mysection1 {
+ color: white;
+ background-color: #010134;
+ font-family: Arial, Helvetica, sans-serif;
+ font-weight: bold;
+}
+
+.bodywebsite #main {
+ padding-top: 15%;
+}
+
+.bodywebsite .btn-perso {
+ margin: 20px 15px;
+ font-weight: bold;
+ background-color: #a600a9;
+}
+.bodywebsite .btn-perso:hover {
+ background-color: #79027b;
+ color: white;
+}
+
+.bodywebsite .btn-perso2 {
+ font-weight: bold;
+ background-color: #7700ba;
+}
+.bodywebsite .btn-perso2:hover {
+ background-color: #3d0160;
+ color: white;
+}
+
+.bodywebsite .product {
+ margin-bottom: 20px;
+}
+
+.bodywebsite .flex {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
diff --git a/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/wrapper.php b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/wrapper.php
new file mode 100644
index 00000000000..26adb3ef220
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/containers/wrapper.php
@@ -0,0 +1,278 @@
+entity;
+$original_file = GETPOST("file", "alpha");
+$l = GETPOST('l', 'aZ09');
+$limit = GETPOST('limit', 'int');
+
+// Parameters for RSS
+$rss = GETPOST('rss', 'aZ09');
+if ($rss) {
+ $original_file = 'blog.rss';
+}
+
+// If we have a hash public (hashp), we guess the original_file.
+if (!empty($hashp)) {
+ include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
+ $ecmfile = new EcmFiles($db);
+ $result = $ecmfile->fetch(0, '', '', '', $hashp);
+ if ($result > 0) {
+ $tmp = explode('/', $ecmfile->filepath, 2); // $ecmfile->filepath is relative to document directory
+ // filepath can be 'users/X' or 'X/propale/PR11111'
+ if (is_numeric($tmp[0])) { // If first tmp is numeric, it is subdir of company for multicompany, we take next part.
+ $tmp = explode('/', $tmp[1], 2);
+ }
+ $moduleparttocheck = $tmp[0]; // moduleparttocheck is first part of path
+
+ if ($modulepart) { // Not required, so often not defined, for link using public hashp parameter.
+ if ($moduleparttocheck == $modulepart) {
+ // We remove first level of directory
+ $original_file = (($tmp[1] ? $tmp[1].'/' : '').$ecmfile->filename); // this is relative to module dir
+ //var_dump($original_file); exit;
+ } else {
+ print 'Bad link. File is from another module part.';
+ }
+ } else {
+ $modulepart = $moduleparttocheck;
+ $original_file = (($tmp[1] ? $tmp[1].'/' : '').$ecmfile->filename); // this is relative to module dir
+ }
+ } else {
+ print "ErrorFileNotFoundWithSharedLink";
+ exit;
+ }
+}
+
+// Define attachment (attachment=true to force choice popup 'open'/'save as')
+$attachment = true;
+if (preg_match('/\.(html|htm)$/i', $original_file)) {
+ $attachment = false;
+}
+if (isset($_GET["attachment"])) {
+ $attachment = (GETPOST("attachment", 'alphanohtml') ? true : false);
+}
+if (!empty($conf->global->MAIN_DISABLE_FORCE_SAVEAS_WEBSITE)) {
+ $attachment = false;
+}
+
+// Define mime type
+$type = 'application/octet-stream';
+if (GETPOSTISSET('type')) {
+ $type = GETPOST('type', 'alpha');
+} else {
+ $type = dol_mimetype($original_file);
+}
+
+// Security: Delete string ../ into $original_file
+$original_file = str_replace("../", "/", $original_file);
+
+// Cache or not
+if (GETPOST("cache", 'aZ09') || image_format_supported($original_file) >= 0) {
+ // Important: Following code is to avoid page request by browser and PHP CPU at
+ // each Dolibarr page access.
+ header('Cache-Control: max-age=3600, public, must-revalidate');
+ header('Pragma: cache'); // This is to avoid having Pragma: no-cache
+}
+
+$refname = basename(dirname($original_file)."/");
+
+// Get RSS news
+if ($rss) {
+ $format = 'rss';
+ $type = '';
+ $cachedelay = 0;
+ $filename = $original_file;
+ $dir_temp = $conf->website->dir_temp;
+
+ include_once DOL_DOCUMENT_ROOT.'/website/class/website.class.php';
+ include_once DOL_DOCUMENT_ROOT.'/website/class/websitepage.class.php';
+ $website = new Website($db);
+ $websitepage = new WebsitePage($db);
+
+ $website->fetch('', $websitekey);
+
+ $filters = array('type_container'=>'blogpost', 'status'=>1);
+ if ($l) {
+ $filters['lang'] = $l;
+ }
+
+ $MAXNEWS = ($limit ? $limit : 20);
+ $arrayofblogs = $websitepage->fetchAll($website->id, 'DESC', 'date_creation', $MAXNEWS, 0, $filters);
+ $eventarray = array();
+ if (is_array($arrayofblogs)) {
+ foreach ($arrayofblogs as $blog) {
+ $blog->fullpageurl = $website->virtualhost.'/'.$blog->pageurl.'.php';
+ $eventarray[] = $blog;
+ }
+ }
+
+ require_once DOL_DOCUMENT_ROOT."/core/lib/xcal.lib.php";
+ require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php";
+ require_once DOL_DOCUMENT_ROOT."/core/lib/files.lib.php";
+
+ dol_syslog("build_exportfile Build export file format=".$format.", type=".$type.", cachedelay=".$cachedelay.", filename=".$filename.", filters size=".count($filters), LOG_DEBUG);
+
+ // Clean parameters
+ if (!$filename) {
+ $extension = 'rss';
+ $filename = $format.'.'.$extension;
+ }
+
+ // Create dir and define output file (definitive and temporary)
+ $result = dol_mkdir($dir_temp);
+ $outputfile = $dir_temp.'/'.$filename;
+
+ $result = 0;
+
+ $buildfile = true;
+
+ if ($cachedelay) {
+ $nowgmt = dol_now();
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ if (dol_filemtime($outputfile) > ($nowgmt - $cachedelay)) {
+ dol_syslog("build_exportfile file ".$outputfile." is not older than now - cachedelay (".$nowgmt." - ".$cachedelay."). Build is canceled");
+ $buildfile = false;
+ }
+ }
+
+ if ($buildfile) {
+ $outputlangs = new Translate('', $conf);
+ $outputlangs->setDefaultLang($l);
+ $outputlangs->loadLangs(array("main", "other"));
+ $title = $desc = $outputlangs->transnoentities('LatestBlogPosts');
+
+ // Create temp file
+ $outputfiletmp = tempnam($dir_temp, 'tmp'); // Temporary file (allow call of function by different threads
+ @chmod($outputfiletmp, octdec($conf->global->MAIN_UMASK));
+
+ // Write file
+ $result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l);
+
+ if ($result >= 0) {
+ if (dol_move($outputfiletmp, $outputfile, 0, 1)) {
+ $result = 1;
+ } else {
+ $error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile;
+ dol_syslog("build_exportfile ".$error, LOG_ERR);
+ dol_delete_file($outputfiletmp, 0, 1);
+ print $error;
+ exit(-1);
+ }
+ } else {
+ dol_syslog("build_exportfile build_xxxfile function fails to for format=".$format." outputfiletmp=".$outputfile, LOG_ERR);
+ dol_delete_file($outputfiletmp, 0, 1);
+ $langs->load("errors");
+ print $langs->trans("ErrorFailToCreateFile", $outputfile);
+ exit(-1);
+ }
+ }
+
+ if ($result >= 0) {
+ $attachment = false;
+ if (isset($_GET["attachment"])) {
+ $attachment = $_GET["attachment"];
+ }
+ //$attachment = false;
+ $contenttype = 'application/rss+xml';
+ if (isset($_GET["contenttype"])) {
+ $contenttype = $_GET["contenttype"];
+ }
+ //$contenttype='text/plain';
+ $outputencoding = 'UTF-8';
+
+ if ($contenttype) {
+ header('Content-Type: '.$contenttype.($outputencoding ? '; charset='.$outputencoding : ''));
+ }
+ if ($attachment) {
+ header('Content-Disposition: attachment; filename="'.$filename.'"');
+ }
+
+ // Ajout directives pour resoudre bug IE
+ //header('Cache-Control: Public, must-revalidate');
+ //header('Pragma: public');
+ if ($cachedelay) {
+ header('Cache-Control: max-age='.$cachedelay.', private, must-revalidate');
+ } else {
+ header('Cache-Control: private, must-revalidate');
+ }
+
+ // Clean parameters
+ $outputfile = $dir_temp.'/'.$filename;
+ $result = readfile($outputfile);
+ if (!$result) {
+ print 'File '.$outputfile.' was empty.';
+ }
+
+ // header("Location: ".DOL_URL_ROOT.'/document.php?modulepart=agenda&file='.urlencode($filename));
+ exit;
+ }
+} elseif ($modulepart == "mycompany" && preg_match('/^\/?logos\//', $original_file)) {
+ // Get logos
+ readfile(dol_osencode($conf->mycompany->dir_output."/".$original_file));
+} else {
+ // Find the subdirectory name as the reference
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ $check_access = dol_check_secure_access_document($modulepart, $original_file, $entity, $refname);
+ $accessallowed = empty($check_access['accessallowed']) ? '' : $check_access['accessallowed'];
+ $sqlprotectagainstexternals = empty($check_access['sqlprotectagainstexternals']) ? '' : $check_access['sqlprotectagainstexternals'];
+ $fullpath_original_file = empty($check_access['original_file']) ? '' : $check_access['original_file']; // $fullpath_original_file is now a full path name
+ if ($hashp) {
+ $accessallowed = 1; // When using hashp, link is public so we force $accessallowed
+ $sqlprotectagainstexternals = '';
+ }
+
+ // Security:
+ // Limit access if permissions are wrong
+ if (!$accessallowed) {
+ print 'Access forbidden';
+ exit;
+ }
+
+ clearstatcache();
+
+ $filename = basename($fullpath_original_file);
+
+ // Output file on browser
+ dol_syslog("wrapper.php download $fullpath_original_file filename=$filename content-type=$type");
+ $fullpath_original_file_osencoded = dol_osencode($fullpath_original_file); // New file name encoded in OS encoding charset
+
+ // This test if file exists should be useless. We keep it to find bug more easily
+ if (!file_exists($fullpath_original_file_osencoded)) {
+ print "ErrorFileDoesNotExists: ".$original_file;
+ exit;
+ }
+
+ // Permissions are ok and file found, so we return it
+ //top_httphead($type);
+ header('Content-Type: '.$type);
+ header('Content-Description: File Transfer');
+ if ($encoding) {
+ header('Content-Encoding: '.$encoding);
+ }
+ // Add MIME Content-Disposition from RFC 2183 (inline=automatically displayed, attachment=need user action to open)
+ if ($attachment) {
+ header('Content-Disposition: attachment; filename="'.$filename.'"');
+ } else {
+ header('Content-Disposition: inline; filename="'.$filename.'"');
+ }
+ header('Content-Length: '.dol_filesize($fullpath_original_file));
+
+ readfile($fullpath_original_file_osencoded);
+}
+if (is_object($db)) {
+ $db->close();
+}
+// END PHP
diff --git a/htdocs/install/doctemplates/websites/website_template-style02.zip b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/medias/image/websitekey/bg.webp
similarity index 56%
rename from htdocs/install/doctemplates/websites/website_template-style02.zip
rename to htdocs/install/doctemplates/websites/website_template-onepageblackpurple/medias/image/websitekey/bg.webp
index 4a5a0a7eacb..bb1d49b7fb1 100644
Binary files a/htdocs/install/doctemplates/websites/website_template-style02.zip and b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/medias/image/websitekey/bg.webp differ
diff --git a/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/medias/image/websitekey/icon.webp b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/medias/image/websitekey/icon.webp
new file mode 100644
index 00000000000..76d28977fa3
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/medias/image/websitekey/icon.webp differ
diff --git a/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/website_pages.sql b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/website_pages.sql
new file mode 100644
index 00000000000..78e198a2223
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-onepageblackpurple/website_pages.sql
@@ -0,0 +1,9 @@
+-- File generated by Dolibarr 17.0.0-alpha -- 2022-09-26 11:58:28 UTC --;
+-- Page ID 148 -> 1__+MAX_llx_website_page__ - Aliases index --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(1__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'index', '', 'index', '', '', '', '', '1', '2022-07-21 14:41:41', '2022-09-26 13:57:58', null, '', 'page', '__N__
__N__
__N__
__N__ __N__
__N__
__N__
__N__
__N____N__ __N__ Template __N__ ', '__N____N__ __N__ __N__
__N__
__N__
__N__
Our company __N__
__N__ Lorem ipsum dolor, sit amet consectetur adipisicing elit. Nostrum excepturi ipsa consequatur accusamus eveniet dignissimos necessitatibus provident dolore cupiditate.__N__
__N__
__N__
__N__ It uses utility classes for typography and spacing to space content out within the__N__ larger container.__N__
__N__
__N__ __N__ __N__ PRE ORDER NOW__N__ __N__ __N__ __N__ __N__ CONTACT US__N__ __N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__ __N__ __N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
LoremIpsum __N__
__N__ Some quick example text to build on the__N__ card title and make up the bulk of the__N__ card\'s content.__N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
LoremIpsum __N__
__N__ Some quick example text to build on the__N__ card title and make up the bulk of the__N__ card\'s content.__N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
LoremIpsum __N__
__N__ Some quick example text to build on the__N__ card title and make up the bulk of the__N__ card\'s content.__N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
LoremIpsum __N__
__N__ Some quick example text to build on the__N__ card title and make up the bulk of the__N__ card\'s content.__N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
LoremIpsum __N__
__N__ Some quick example text to build on the__N__ card title and make up the bulk of the__N__ card\'s content.__N__
__N__ __N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
__N__
LoremIpsum __N__
__N__ Some quick example text to build on the__N__ card title and make up the bulk of the__N__ card\'s content.__N__
__N__ __N__
__N__
__N__
__N__
__N__ __N__
__N__
__N__ __N__
__N__
__N__
UNLIMITED FOR ALL __N__
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Minus molestias voluptatibus voluptatem Lorem ipsum dolor, sit amet consectetur adipisicing elit. Veritatis officia voluptatem incidunt tempore esse porro sequi eveniet eum corrupti quo.
__N__
__N__ __N__
__N__
WHAT YOU WILL GET
__N__
Lorem ipsum dolor sit, amet consectetur
__N__
Lorem ipsum dolor sit, amet consectetur
__N__
Lorem ipsum dolor sit, amet consectetur
__N__
__N__ __N__ PRE ORDER NOW__N__ __N__ __N__
__N__
__N__
__N__
__N__
__N__ __N__
__N__
__N__
__N__
__N____N__', '', 0);
+UPDATE llx_website SET fk_default_home = 1__+MAX_llx_website_page__ WHERE rowid = __WEBSITE_ID__;
+
+-- For Dolibarr v14+ --;
+UPDATE llx_website SET lang = 'en' WHERE rowid = __WEBSITE_ID__;
+UPDATE llx_website SET otherlang = '' WHERE rowid = __WEBSITE_ID__;
+
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant.jpg
new file mode 100644
index 00000000000..226737e4434
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/LICENSE b/htdocs/install/doctemplates/websites/website_template-restaurant/LICENSE
new file mode 100644
index 00000000000..1143fd7823a
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/LICENSE
@@ -0,0 +1,8 @@
+LICENSE
+-------
+
+Images are provided under the license:
+Unsplash+ License
+
+Rest of templates (HTML and PHP code) content are under license
+CC-BY-SA - https://creativecommons.org/licenses/by/4.0/
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/README.md b/htdocs/install/doctemplates/websites/website_template-restaurant/README.md
new file mode 100644
index 00000000000..a5b5c5abba9
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/README.md
@@ -0,0 +1,2 @@
+Website generated by Dolibarr ERP CRM
+This website template is an example of website for a restaurant
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/.dolibarr b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/.dolibarr
new file mode 100644
index 00000000000..0ef9997b4ab
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/.dolibarr
@@ -0,0 +1,2 @@
+# Some properties for Dolibarr web site CMS
+param=value
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/.htaccess b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/.htaccess
new file mode 100644
index 00000000000..ed27b33461f
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/.htaccess
@@ -0,0 +1,2 @@
+# Order allow,deny
+# Deny from all
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/LICENSE b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/LICENSE
new file mode 100644
index 00000000000..1143fd7823a
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/LICENSE
@@ -0,0 +1,8 @@
+LICENSE
+-------
+
+Images are provided under the license:
+Unsplash+ License
+
+Rest of templates (HTML and PHP code) content are under license
+CC-BY-SA - https://creativecommons.org/licenses/by/4.0/
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/README.md b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/README.md
new file mode 100644
index 00000000000..a5b5c5abba9
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/README.md
@@ -0,0 +1,2 @@
+Website generated by Dolibarr ERP CRM
+This website template is an example of website for a restaurant
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/about.php b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/about.php
new file mode 100644
index 00000000000..560719a4fda
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/about.php
@@ -0,0 +1,5 @@
+ref.'/page248.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/contact.php b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/contact.php
new file mode 100644
index 00000000000..e3a18e3b92d
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/contact.php
@@ -0,0 +1,5 @@
+ref.'/page249.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/footer.php b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/footer.php
new file mode 100644
index 00000000000..4052f2ff8e9
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/footer.php
@@ -0,0 +1,5 @@
+ref.'/page252.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/header.php b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/header.php
new file mode 100644
index 00000000000..530e4397e93
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/header.php
@@ -0,0 +1,5 @@
+ref.'/page253.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/htmlheader.html b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/htmlheader.html
new file mode 100644
index 00000000000..41e782b5934
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/htmlheader.html
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/index.php b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/index.php
new file mode 100644
index 00000000000..08ce45517af
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/index.php
@@ -0,0 +1,5 @@
+ref.'/page250.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/javascript.js.php b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/javascript.js.php
new file mode 100644
index 00000000000..fe1f15266af
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/javascript.js.php
@@ -0,0 +1,14 @@
+
+/* JS content (all pages) */
+// test
+
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/manifest.json.php b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/manifest.json.php
new file mode 100644
index 00000000000..8f844114e48
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/manifest.json.php
@@ -0,0 +1,13 @@
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/master.inc.php b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/master.inc.php
new file mode 100644
index 00000000000..bd25ba5895d
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/master.inc.php
@@ -0,0 +1,7 @@
+
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/menu.php b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/menu.php
new file mode 100644
index 00000000000..57315e4da18
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/menu.php
@@ -0,0 +1,5 @@
+ref.'/page251.tpl.php';
+?>
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page248.tpl.php b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page248.tpl.php
new file mode 100644
index 00000000000..9acf79aaec9
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page248.tpl.php
@@ -0,0 +1,113 @@
+
+
+
+
About us
+
+
+
+
+
+
+
+
+
+use_manifest) { print '
'."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Team Members
+
+
+
+
+
+
+
+
Sophia
+
+
CEO & Founder
+
+
+
+
+
+
+
+
+
Benjamin W.
+
+
Restaurant Manager
+
+
+
+
+
+
+
+
Muchen Jack
+
+
Senior Chef
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page249.tpl.php b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page249.tpl.php
new file mode 100644
index 00000000000..8742e231c27
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page249.tpl.php
@@ -0,0 +1,368 @@
+
+
+
+
Contact us
+
+
+
+
+
+
+
+
+
+use_manifest) { print '
'."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+email;
+ $message = GETPOST('message', 'alpha');
+ $cmail = new CMailFile('Contact from website', $to, $from, $message);
+ if ($cmail->sendfile()) {
+ ?>
+
+ trans("ErrorFailedToSendMail", $from, $to).'. '.$cmail->error;
+ }
+}
+?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page250.tpl.php b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page250.tpl.php
new file mode 100644
index 00000000000..ed509115c54
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page250.tpl.php
@@ -0,0 +1,475 @@
+
+
+
+
index
+
+
+
+
+
+
+
+
+
+use_manifest) { print '
'."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Delicious Steaks
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fine Dining Restaurant
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sausage Pasta
+
+
+ 18.25€
+
+
+
+
+
+
+
+ Previous
+
+
+
+
+ Next
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page251.tpl.php b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page251.tpl.php
new file mode 100644
index 00000000000..50fb446dd2e
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page251.tpl.php
@@ -0,0 +1,273 @@
+
+
+
+
Our menus
+
+
+
+
+
+
+
+
+
+use_manifest) { print '
'."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page252.tpl.php b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page252.tpl.php
new file mode 100644
index 00000000000..568a538488b
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page252.tpl.php
@@ -0,0 +1,93 @@
+
+
+
+
Footer
+
+
+
+
+
+
+
+
+
+use_manifest) { print '
'."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page253.tpl.php b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page253.tpl.php
new file mode 100644
index 00000000000..10896678ceb
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/page253.tpl.php
@@ -0,0 +1,98 @@
+
+
+
+
Header
+
+
+
+
+
+
+
+
+
+use_manifest) { print '
'."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/robots.txt b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/robots.txt
new file mode 100644
index 00000000000..2b844f479d6
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/robots.txt
@@ -0,0 +1,4 @@
+# Robot file. Generated with Dolibarr
+User-agent: *
+Allow: /public/
+Disallow: /administrator/
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/styles.css.php b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/styles.css.php
new file mode 100644
index 00000000000..0c669a21a69
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/styles.css.php
@@ -0,0 +1,13159 @@
+
+@charset "UTF-8";
+
+.bodywebsite :root {
+ --bs-blue: #0d6efd;
+ --bs-indigo: #6610f2;
+ --bs-purple: #6f42c1;
+ --bs-pink: #d63384;
+ --bs-red: #dc3545;
+ --bs-orange: #fd7e14;
+ --bs-yellow: #ffc107;
+ --bs-green: #198754;
+ --bs-teal: #20c997;
+ --bs-cyan: #0dcaf0;
+ --bs-black: #000;
+ --bs-white: #fff;
+ --bs-gray: #6c757d;
+ --bs-gray-dark: #343a40;
+ --bs-gray-100: #f8f9fa;
+ --bs-gray-200: #e9ecef;
+ --bs-gray-300: #dee2e6;
+ --bs-gray-400: #ced4da;
+ --bs-gray-500: #adb5bd;
+ --bs-gray-600: #6c757d;
+ --bs-gray-700: #495057;
+ --bs-gray-800: #343a40;
+ --bs-gray-900: #212529;
+ --bs-primary: #0d6efd;
+ --bs-secondary: #6c757d;
+ --bs-success: #198754;
+ --bs-info: #0dcaf0;
+ --bs-warning: #ffc107;
+ --bs-danger: #dc3545;
+ --bs-light: #f8f9fa;
+ --bs-dark: #212529;
+ --bs-primary-rgb: 13, 110, 253;
+ --bs-secondary-rgb: 108, 117, 125;
+ --bs-success-rgb: 25, 135, 84;
+ --bs-info-rgb: 13, 202, 240;
+ --bs-warning-rgb: 255, 193, 7;
+ --bs-danger-rgb: 220, 53, 69;
+ --bs-light-rgb: 248, 249, 250;
+ --bs-dark-rgb: 33, 37, 41;
+ --bs-white-rgb: 255, 255, 255;
+ --bs-black-rgb: 0, 0, 0;
+ --bs-body-color-rgb: 33, 37, 41;
+ --bs-body-bg-rgb: 255, 255, 255;
+ --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
+ --bs-body-font-family: var(--bs-font-sans-serif);
+ --bs-body-font-size: 1rem;
+ --bs-body-font-weight: 400;
+ --bs-body-line-height: 1.5;
+ --bs-body-color: #212529;
+ --bs-body-bg: #fff;
+ --bs-border-width: 1px;
+ --bs-border-style: solid;
+ --bs-border-color: #dee2e6;
+ --bs-border-color-translucent: rgba(0, 0, 0, 0.175);
+ --bs-border-radius: 0.375rem;
+ --bs-border-radius-sm: 0.25rem;
+ --bs-border-radius-lg: 0.5rem;
+ --bs-border-radius-xl: 1rem;
+ --bs-border-radius-2xl: 2rem;
+ --bs-border-radius-pill: 50rem;
+ --bs-link-color: #0d6efd;
+ --bs-link-hover-color: #0a58ca;
+ --bs-code-color: #d63384;
+ --bs-highlight-bg: #fff3cd;
+}
+
+.bodywebsite *,
+ .bodywebsite *::before,
+ .bodywebsite *::after {
+ box-sizing: border-box;
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ .bodywebsite :root {
+ scroll-behavior: smooth;
+ }
+}
+
+.bodywebsite body {
+ margin: 0;
+ font-family: var(--bs-body-font-family);
+ font-size: var(--bs-body-font-size);
+ font-weight: var(--bs-body-font-weight);
+ line-height: var(--bs-body-line-height);
+ color: var(--bs-body-color);
+ text-align: var(--bs-body-text-align);
+ background-color: var(--bs-body-bg);
+ -webkit-text-size-adjust: 100%;
+ -webkit-tap-highlight-color: transparent;
+}
+
+.bodywebsite .center {
+ text-align: center;
+}
+
+.bodywebsite hr {
+ margin: 1rem 0;
+ color: inherit;
+ border: 0;
+ border-top: 1px solid;
+ opacity: 0.25;
+}
+
+.bodywebsite h6, .bodywebsite .h6, .bodywebsite h5, .bodywebsite .h5, .bodywebsite h4, .bodywebsite .h4, .bodywebsite h3, .bodywebsite .h3, .bodywebsite h2, .bodywebsite .h2, .bodywebsite h1, .bodywebsite .h1 {
+ margin-top: 0;
+ margin-bottom: 0.5rem;
+ font-weight: 500;
+ line-height: 1.2;
+}
+
+.bodywebsite h1, .bodywebsite .h1 {
+ font-size: calc(1.375rem + 1.5vw);
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite h1, .bodywebsite .h1 {
+ font-size: 2.5rem;
+ }
+}
+
+.bodywebsite h2, .bodywebsite .h2 {
+ font-size: calc(1.325rem + 0.9vw);
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite h2, .bodywebsite .h2 {
+ font-size: 2rem;
+ }
+}
+
+.bodywebsite h3, .bodywebsite .h3 {
+ font-size: calc(1.3rem + 0.6vw);
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite h3, .bodywebsite .h3 {
+ font-size: 1.75rem;
+ }
+}
+
+.bodywebsite h4, .bodywebsite .h4 {
+ font-size: calc(1.275rem + 0.3vw);
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite h4, .bodywebsite .h4 {
+ font-size: 1.5rem;
+ }
+}
+
+.bodywebsite h5, .bodywebsite .h5 {
+ font-size: 1.25rem;
+}
+
+.bodywebsite h6, .bodywebsite .h6 {
+ font-size: 1rem;
+}
+
+.bodywebsite p {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+.bodywebsite abbr[title] {
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+ cursor: help;
+ -webkit-text-decoration-skip-ink: none;
+ text-decoration-skip-ink: none;
+}
+
+.bodywebsite address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit;
+}
+
+.bodywebsite ol,
+ .bodywebsite ul {
+ padding-left: 2rem;
+}
+
+.bodywebsite ol,
+ .bodywebsite ul,
+ .bodywebsite dl {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+.bodywebsite ol ol,
+ .bodywebsite ul ul,
+ .bodywebsite ol ul,
+ .bodywebsite ul ol {
+ margin-bottom: 0;
+}
+
+.bodywebsite dt {
+ font-weight: 700;
+}
+
+.bodywebsite dd {
+ margin-bottom: 0.5rem;
+ margin-left: 0;
+}
+
+.bodywebsite blockquote {
+ margin: 0 0 1rem;
+}
+
+.bodywebsite b,
+ .bodywebsite strong {
+ font-weight: bolder;
+}
+
+.bodywebsite small, .bodywebsite .small {
+ font-size: 0.875em;
+}
+
+.bodywebsite mark, .bodywebsite .mark {
+ padding: 0.1875em;
+ background-color: var(--bs-highlight-bg);
+}
+
+.bodywebsite sub,
+ .bodywebsite sup {
+ position: relative;
+ font-size: 0.75em;
+ line-height: 0;
+ vertical-align: baseline;
+}
+
+.bodywebsite sub {
+ bottom: -0.25em;
+}
+
+.bodywebsite sup {
+ top: -0.5em;
+}
+
+.bodywebsite a {
+ color: var(--bs-link-color);
+ text-decoration: underline;
+}
+
+.bodywebsite a:hover {
+ color: var(--bs-link-hover-color);
+}
+
+.bodywebsite a:not([href]):not([class]), .bodywebsite a:not([href]):not([class]):hover {
+ color: inherit;
+ text-decoration: none;
+}
+
+.bodywebsite pre,
+ .bodywebsite code,
+ .bodywebsite kbd,
+ .bodywebsite samp {
+ font-family: var(--bs-font-monospace);
+ font-size: 1em;
+}
+
+.bodywebsite pre {
+ display: block;
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
+ font-size: 0.875em;
+}
+
+.bodywebsite pre code {
+ font-size: inherit;
+ color: inherit;
+ word-break: normal;
+}
+
+.bodywebsite code {
+ font-size: 0.875em;
+ color: var(--bs-code-color);
+ word-wrap: break-word;
+}
+
+.bodywebsite a > code {
+ color: inherit;
+}
+
+.bodywebsite kbd {
+ padding: 0.1875rem 0.375rem;
+ font-size: 0.875em;
+ color: var(--bs-body-bg);
+ background-color: var(--bs-body-color);
+ border-radius: 0.25rem;
+}
+
+.bodywebsite kbd kbd {
+ padding: 0;
+ font-size: 1em;
+}
+
+.bodywebsite figure {
+ margin: 0 0 1rem;
+}
+
+.bodywebsite img,
+ .bodywebsite svg {
+ vertical-align: middle;
+}
+
+.bodywebsite table {
+ caption-side: bottom;
+ border-collapse: collapse;
+}
+
+.bodywebsite caption {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ color: #6c757d;
+ text-align: left;
+}
+
+.bodywebsite th {
+ text-align: inherit;
+ text-align: -webkit-match-parent;
+}
+
+.bodywebsite thead,
+ .bodywebsite tbody,
+ .bodywebsite tfoot,
+ .bodywebsite tr,
+ .bodywebsite td,
+ .bodywebsite th {
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+}
+
+.bodywebsite label {
+ display: inline-block;
+}
+
+.bodywebsite button {
+ border-radius: 0;
+}
+
+.bodywebsite button:focus:not(:focus-visible) {
+ outline: 0;
+}
+
+.bodywebsite input,
+ .bodywebsite button,
+ .bodywebsite select,
+ .bodywebsite optgroup,
+ .bodywebsite textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+.bodywebsite button,
+ .bodywebsite select {
+ text-transform: none;
+}
+
+.bodywebsite [role=button] {
+ cursor: pointer;
+}
+
+.bodywebsite select {
+ word-wrap: normal;
+}
+
+.bodywebsite select:disabled {
+ opacity: 1;
+}
+
+.bodywebsite [list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
+ display: none !important;
+}
+
+.bodywebsite button,
+ .bodywebsite [type=button],
+ .bodywebsite [type=reset],
+ .bodywebsite [type=submit] {
+ -webkit-appearance: button;
+}
+
+.bodywebsite button:not(:disabled),
+ .bodywebsite [type=button]:not(:disabled),
+ .bodywebsite [type=reset]:not(:disabled),
+ .bodywebsite [type=submit]:not(:disabled) {
+ cursor: pointer;
+}
+
+.bodywebsite ::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
+}
+
+.bodywebsite textarea {
+ resize: vertical;
+}
+
+.bodywebsite fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+.bodywebsite legend {
+ float: left;
+ width: 100%;
+ padding: 0;
+ margin-bottom: 0.5rem;
+ font-size: calc(1.275rem + 0.3vw);
+ line-height: inherit;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite legend {
+ font-size: 1.5rem;
+ }
+}
+
+.bodywebsite legend + * {
+ clear: left;
+}
+
+.bodywebsite ::-webkit-datetime-edit-fields-wrapper,
+ .bodywebsite ::-webkit-datetime-edit-text,
+ .bodywebsite ::-webkit-datetime-edit-minute,
+ .bodywebsite ::-webkit-datetime-edit-hour-field,
+ .bodywebsite ::-webkit-datetime-edit-day-field,
+ .bodywebsite ::-webkit-datetime-edit-month-field,
+ .bodywebsite ::-webkit-datetime-edit-year-field {
+ padding: 0;
+}
+
+.bodywebsite ::-webkit-inner-spin-button {
+ height: auto;
+}
+
+.bodywebsite [type=search] {
+ outline-offset: -2px;
+ -webkit-appearance: textfield;
+}
+
+.bodywebsite ::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+.bodywebsite ::-webkit-color-swatch-wrapper {
+ padding: 0;
+}
+
+.bodywebsite ::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+
+.bodywebsite ::file-selector-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+
+.bodywebsite output {
+ display: inline-block;
+}
+
+.bodywebsite iframe {
+ border: 0;
+}
+
+.bodywebsite summary {
+ display: list-item;
+ cursor: pointer;
+}
+
+.bodywebsite progress {
+ vertical-align: baseline;
+}
+
+.bodywebsite [hidden] {
+ display: none !important;
+}
+
+.bodywebsite .lead {
+ font-size: 1.25rem;
+ font-weight: 300;
+}
+
+.bodywebsite .display-1 {
+ font-size: calc(1.625rem + 4.5vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-1 {
+ font-size: 5rem;
+ }
+}
+
+.bodywebsite .display-2 {
+ font-size: calc(1.575rem + 3.9vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-2 {
+ font-size: 4.5rem;
+ }
+}
+
+.bodywebsite .display-3 {
+ font-size: calc(1.525rem + 3.3vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-3 {
+ font-size: 4rem;
+ }
+}
+
+.bodywebsite .display-4 {
+ font-size: calc(1.475rem + 2.7vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-4 {
+ font-size: 3.5rem;
+ }
+}
+
+.bodywebsite .display-5 {
+ font-size: calc(1.425rem + 2.1vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-5 {
+ font-size: 3rem;
+ }
+}
+
+.bodywebsite .display-6 {
+ font-size: calc(1.375rem + 1.5vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .display-6 {
+ font-size: 2.5rem;
+ }
+}
+
+.bodywebsite .list-unstyled {
+ padding-left: 0;
+ list-style: none;
+}
+
+.bodywebsite .list-inline {
+ padding-left: 0;
+ list-style: none;
+}
+
+.bodywebsite .list-inline-item {
+ display: inline-block;
+}
+
+.bodywebsite .list-inline-item:not(:last-child) {
+ margin-right: 0.5rem;
+}
+
+.bodywebsite .initialism {
+ font-size: 0.875em;
+ text-transform: uppercase;
+}
+
+.bodywebsite .blockquote {
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+}
+
+.bodywebsite .blockquote > :last-child {
+ margin-bottom: 0;
+}
+
+.bodywebsite .blockquote-footer {
+ margin-top: -1rem;
+ margin-bottom: 1rem;
+ font-size: 0.875em;
+ color: #6c757d;
+}
+
+.bodywebsite .blockquote-footer::before {
+ content: "— ";
+}
+
+.bodywebsite .img-fluid {
+ max-width: 100%;
+ height: auto;
+}
+
+.bodywebsite .img-thumbnail {
+ padding: 0.25rem;
+ background-color: #fff;
+ border: 1px solid var(--bs-border-color);
+ border-radius: 0.375rem;
+ max-width: 100%;
+ height: auto;
+}
+
+.bodywebsite .figure {
+ display: inline-block;
+}
+
+.bodywebsite .figure-img {
+ margin-bottom: 0.5rem;
+ line-height: 1;
+}
+
+.bodywebsite .figure-caption {
+ font-size: 0.875em;
+ color: #6c757d;
+}
+
+.bodywebsite .container,
+ .bodywebsite .container-fluid,
+ .bodywebsite .container-xxl,
+ .bodywebsite .container-xl,
+ .bodywebsite .container-lg,
+ .bodywebsite .container-md,
+ .bodywebsite .container-sm {
+ --bs-gutter-x: 1.5rem;
+ --bs-gutter-y: 0;
+ width: 100%;
+ padding-right: calc(var(--bs-gutter-x) * 0.5);
+ padding-left: calc(var(--bs-gutter-x) * 0.5);
+ margin-right: auto;
+ margin-left: auto;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 540px;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .container-md, .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 720px;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .container-lg, .bodywebsite .container-md, .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 960px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .container-xl, .bodywebsite .container-lg, .bodywebsite .container-md, .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 1140px;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .container-xxl, .bodywebsite .container-xl, .bodywebsite .container-lg, .bodywebsite .container-md, .bodywebsite .container-sm, .bodywebsite .container {
+ max-width: 1320px;
+ }
+}
+
+.bodywebsite .row {
+ --bs-gutter-x: 1.5rem;
+ --bs-gutter-y: 0;
+ display: flex;
+ flex-wrap: wrap;
+ margin-top: calc(-1 * var(--bs-gutter-y));
+ margin-right: calc(-0.5 * var(--bs-gutter-x));
+ margin-left: calc(-0.5 * var(--bs-gutter-x));
+}
+
+.bodywebsite .row > * {
+ flex-shrink: 0;
+ width: 100%;
+ max-width: 100%;
+ padding-right: calc(var(--bs-gutter-x) * 0.5);
+ padding-left: calc(var(--bs-gutter-x) * 0.5);
+ margin-top: var(--bs-gutter-y);
+}
+
+.bodywebsite .col {
+ flex: 1 0 0%;
+}
+
+.bodywebsite .row-cols-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+}
+
+.bodywebsite .row-cols-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+}
+
+.bodywebsite .row-cols-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+}
+
+.bodywebsite .row-cols-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+}
+
+.bodywebsite .row-cols-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+}
+
+.bodywebsite .row-cols-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+}
+
+.bodywebsite .row-cols-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+}
+
+.bodywebsite .col-auto {
+ flex: 0 0 auto;
+ width: auto;
+}
+
+.bodywebsite .col-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+}
+
+.bodywebsite .col-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+}
+
+.bodywebsite .col-3 {
+ flex: 0 0 auto;
+ width: 25%;
+}
+
+.bodywebsite .col-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+}
+
+.bodywebsite .col-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+}
+
+.bodywebsite .col-6 {
+ flex: 0 0 auto;
+ width: 50%;
+}
+
+.bodywebsite .col-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+}
+
+.bodywebsite .col-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+}
+
+.bodywebsite .col-9 {
+ flex: 0 0 auto;
+ width: 75%;
+}
+
+.bodywebsite .col-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+}
+
+.bodywebsite .col-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+}
+
+.bodywebsite .col-12 {
+ flex: 0 0 auto;
+ width: 100%;
+}
+
+.bodywebsite .offset-1 {
+ margin-left: 8.33333333%;
+}
+
+.bodywebsite .offset-2 {
+ margin-left: 16.66666667%;
+}
+
+.bodywebsite .offset-3 {
+ margin-left: 25%;
+}
+
+.bodywebsite .offset-4 {
+ margin-left: 33.33333333%;
+}
+
+.bodywebsite .offset-5 {
+ margin-left: 41.66666667%;
+}
+
+.bodywebsite .offset-6 {
+ margin-left: 50%;
+}
+
+.bodywebsite .offset-7 {
+ margin-left: 58.33333333%;
+}
+
+.bodywebsite .offset-8 {
+ margin-left: 66.66666667%;
+}
+
+.bodywebsite .offset-9 {
+ margin-left: 75%;
+}
+
+.bodywebsite .offset-10 {
+ margin-left: 83.33333333%;
+}
+
+.bodywebsite .offset-11 {
+ margin-left: 91.66666667%;
+}
+
+.bodywebsite .g-0,
+ .bodywebsite .gx-0 {
+ --bs-gutter-x: 0;
+}
+
+.bodywebsite .g-0,
+ .bodywebsite .gy-0 {
+ --bs-gutter-y: 0;
+}
+
+.bodywebsite .g-1,
+ .bodywebsite .gx-1 {
+ --bs-gutter-x: 0.25rem;
+}
+
+.bodywebsite .g-1,
+ .bodywebsite .gy-1 {
+ --bs-gutter-y: 0.25rem;
+}
+
+.bodywebsite .g-2,
+ .bodywebsite .gx-2 {
+ --bs-gutter-x: 0.5rem;
+}
+
+.bodywebsite .g-2,
+ .bodywebsite .gy-2 {
+ --bs-gutter-y: 0.5rem;
+}
+
+.bodywebsite .g-3,
+ .bodywebsite .gx-3 {
+ --bs-gutter-x: 1rem;
+}
+
+.bodywebsite .g-3,
+ .bodywebsite .gy-3 {
+ --bs-gutter-y: 1rem;
+}
+
+.bodywebsite .g-4,
+ .bodywebsite .gx-4 {
+ --bs-gutter-x: 1.5rem;
+}
+
+.bodywebsite .g-4,
+ .bodywebsite .gy-4 {
+ --bs-gutter-y: 1.5rem;
+}
+
+.bodywebsite .g-5,
+ .bodywebsite .gx-5 {
+ --bs-gutter-x: 3rem;
+}
+
+.bodywebsite .g-5,
+ .bodywebsite .gy-5 {
+ --bs-gutter-y: 3rem;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .col-sm {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-sm-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-sm-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-sm-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-sm-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-sm-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-sm-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-sm-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-sm-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-sm-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-sm-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-sm-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-sm-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-sm-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-sm-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-sm-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-sm-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-sm-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-sm-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-sm-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-sm-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-sm-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-sm-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-sm-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-sm-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-sm-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-sm-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-sm-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-sm-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-sm-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-sm-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-sm-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-sm-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-sm-0,
+ .bodywebsite .gx-sm-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-sm-0,
+ .bodywebsite .gy-sm-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-sm-1,
+ .bodywebsite .gx-sm-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-sm-1,
+ .bodywebsite .gy-sm-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-sm-2,
+ .bodywebsite .gx-sm-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-sm-2,
+ .bodywebsite .gy-sm-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-sm-3,
+ .bodywebsite .gx-sm-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-sm-3,
+ .bodywebsite .gy-sm-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-sm-4,
+ .bodywebsite .gx-sm-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-sm-4,
+ .bodywebsite .gy-sm-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-sm-5,
+ .bodywebsite .gx-sm-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-sm-5,
+ .bodywebsite .gy-sm-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .col-md {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-md-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-md-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-md-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-md-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-md-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-md-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-md-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-md-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-md-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-md-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-md-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-md-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-md-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-md-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-md-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-md-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-md-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-md-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-md-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-md-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-md-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-md-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-md-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-md-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-md-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-md-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-md-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-md-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-md-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-md-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-md-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-md-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-md-0,
+ .bodywebsite .gx-md-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-md-0,
+ .bodywebsite .gy-md-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-md-1,
+ .bodywebsite .gx-md-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-md-1,
+ .bodywebsite .gy-md-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-md-2,
+ .bodywebsite .gx-md-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-md-2,
+ .bodywebsite .gy-md-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-md-3,
+ .bodywebsite .gx-md-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-md-3,
+ .bodywebsite .gy-md-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-md-4,
+ .bodywebsite .gx-md-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-md-4,
+ .bodywebsite .gy-md-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-md-5,
+ .bodywebsite .gx-md-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-md-5,
+ .bodywebsite .gy-md-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .col-lg {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-lg-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-lg-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-lg-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-lg-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-lg-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-lg-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-lg-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-lg-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-lg-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-lg-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-lg-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-lg-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-lg-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-lg-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-lg-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-lg-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-lg-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-lg-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-lg-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-lg-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-lg-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-lg-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-lg-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-lg-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-lg-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-lg-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-lg-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-lg-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-lg-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-lg-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-lg-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-lg-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-lg-0,
+ .bodywebsite .gx-lg-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-lg-0,
+ .bodywebsite .gy-lg-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-lg-1,
+ .bodywebsite .gx-lg-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-lg-1,
+ .bodywebsite .gy-lg-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-lg-2,
+ .bodywebsite .gx-lg-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-lg-2,
+ .bodywebsite .gy-lg-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-lg-3,
+ .bodywebsite .gx-lg-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-lg-3,
+ .bodywebsite .gy-lg-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-lg-4,
+ .bodywebsite .gx-lg-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-lg-4,
+ .bodywebsite .gy-lg-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-lg-5,
+ .bodywebsite .gx-lg-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-lg-5,
+ .bodywebsite .gy-lg-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .col-xl {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-xl-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-xl-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-xl-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-xl-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-xl-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-xl-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-xl-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-xl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-xl-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-xl-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-xl-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-xl-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-xl-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-xl-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-xl-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-xl-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-xl-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-xl-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-xl-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-xl-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-xl-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-xl-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-xl-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-xl-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-xl-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-xl-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-xl-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-xl-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-xl-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-xl-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-xl-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-xl-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-xl-0,
+ .bodywebsite .gx-xl-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-xl-0,
+ .bodywebsite .gy-xl-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-xl-1,
+ .bodywebsite .gx-xl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-xl-1,
+ .bodywebsite .gy-xl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-xl-2,
+ .bodywebsite .gx-xl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-xl-2,
+ .bodywebsite .gy-xl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-xl-3,
+ .bodywebsite .gx-xl-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-xl-3,
+ .bodywebsite .gy-xl-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-xl-4,
+ .bodywebsite .gx-xl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-xl-4,
+ .bodywebsite .gy-xl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-xl-5,
+ .bodywebsite .gx-xl-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-xl-5,
+ .bodywebsite .gy-xl-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .col-xxl {
+ flex: 1 0 0%;
+ }
+
+ .bodywebsite .row-cols-xxl-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .row-cols-xxl-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .row-cols-xxl-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .row-cols-xxl-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .bodywebsite .row-cols-xxl-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .row-cols-xxl-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+
+ .bodywebsite .row-cols-xxl-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .bodywebsite .col-xxl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ .bodywebsite .col-xxl-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .bodywebsite .col-xxl-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .bodywebsite .col-xxl-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+
+ .bodywebsite .col-xxl-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .bodywebsite .col-xxl-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .bodywebsite .col-xxl-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+
+ .bodywebsite .col-xxl-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .bodywebsite .col-xxl-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .bodywebsite .col-xxl-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+
+ .bodywebsite .col-xxl-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .bodywebsite .col-xxl-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .bodywebsite .col-xxl-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+
+ .bodywebsite .offset-xxl-0 {
+ margin-left: 0;
+ }
+
+ .bodywebsite .offset-xxl-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .bodywebsite .offset-xxl-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .bodywebsite .offset-xxl-3 {
+ margin-left: 25%;
+ }
+
+ .bodywebsite .offset-xxl-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .bodywebsite .offset-xxl-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .bodywebsite .offset-xxl-6 {
+ margin-left: 50%;
+ }
+
+ .bodywebsite .offset-xxl-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .bodywebsite .offset-xxl-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .bodywebsite .offset-xxl-9 {
+ margin-left: 75%;
+ }
+
+ .bodywebsite .offset-xxl-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .bodywebsite .offset-xxl-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .bodywebsite .g-xxl-0,
+ .bodywebsite .gx-xxl-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .bodywebsite .g-xxl-0,
+ .bodywebsite .gy-xxl-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .bodywebsite .g-xxl-1,
+ .bodywebsite .gx-xxl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .bodywebsite .g-xxl-1,
+ .bodywebsite .gy-xxl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .bodywebsite .g-xxl-2,
+ .bodywebsite .gx-xxl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .bodywebsite .g-xxl-2,
+ .bodywebsite .gy-xxl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .bodywebsite .g-xxl-3,
+ .bodywebsite .gx-xxl-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .bodywebsite .g-xxl-3,
+ .bodywebsite .gy-xxl-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .bodywebsite .g-xxl-4,
+ .bodywebsite .gx-xxl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .bodywebsite .g-xxl-4,
+ .bodywebsite .gy-xxl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .bodywebsite .g-xxl-5,
+ .bodywebsite .gx-xxl-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .bodywebsite .g-xxl-5,
+ .bodywebsite .gy-xxl-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+.bodywebsite .table {
+ --bs-table-color: var(--bs-body-color);
+ --bs-table-bg: transparent;
+ --bs-table-border-color: var(--bs-border-color);
+ --bs-table-accent-bg: transparent;
+ --bs-table-striped-color: var(--bs-body-color);
+ --bs-table-striped-bg: rgba(0, 0, 0, 0.05);
+ --bs-table-active-color: var(--bs-body-color);
+ --bs-table-active-bg: rgba(0, 0, 0, 0.1);
+ --bs-table-hover-color: var(--bs-body-color);
+ --bs-table-hover-bg: rgba(0, 0, 0, 0.075);
+ width: 100%;
+ margin-bottom: 1rem;
+ color: var(--bs-table-color);
+ vertical-align: top;
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table > :not(caption) > * > * {
+ padding: 0.5rem 0.5rem;
+ background-color: var(--bs-table-bg);
+ border-bottom-width: 1px;
+ box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg);
+}
+
+.bodywebsite .table > tbody {
+ vertical-align: inherit;
+}
+
+.bodywebsite .table > thead {
+ vertical-align: bottom;
+}
+
+.bodywebsite .table-group-divider {
+ border-top: 2px solid currentcolor;
+}
+
+.bodywebsite .caption-top {
+ caption-side: top;
+}
+
+.bodywebsite .table-sm > :not(caption) > * > * {
+ padding: 0.25rem 0.25rem;
+}
+
+.bodywebsite .table-bordered > :not(caption) > * {
+ border-width: 1px 0;
+}
+
+.bodywebsite .table-bordered > :not(caption) > * > * {
+ border-width: 0 1px;
+}
+
+.bodywebsite .table-borderless > :not(caption) > * > * {
+ border-bottom-width: 0;
+}
+
+.bodywebsite .table-borderless > :not(:first-child) {
+ border-top-width: 0;
+}
+
+.bodywebsite .table-striped > tbody > tr:nth-of-type(odd) > * {
+ --bs-table-accent-bg: var(--bs-table-striped-bg);
+ color: var(--bs-table-striped-color);
+}
+
+.bodywebsite .table-striped-columns > :not(caption) > tr > :nth-child(even) {
+ --bs-table-accent-bg: var(--bs-table-striped-bg);
+ color: var(--bs-table-striped-color);
+}
+
+.bodywebsite .table-active {
+ --bs-table-accent-bg: var(--bs-table-active-bg);
+ color: var(--bs-table-active-color);
+}
+
+.bodywebsite .table-hover > tbody > tr:hover > * {
+ --bs-table-accent-bg: var(--bs-table-hover-bg);
+ color: var(--bs-table-hover-color);
+}
+
+.bodywebsite .table-primary {
+ --bs-table-color: #000;
+ --bs-table-bg: #cfe2ff;
+ --bs-table-border-color: #bacbe6;
+ --bs-table-striped-bg: #c5d7f2;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #bacbe6;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #bfd1ec;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-secondary {
+ --bs-table-color: #000;
+ --bs-table-bg: #e2e3e5;
+ --bs-table-border-color: #cbccce;
+ --bs-table-striped-bg: #d7d8da;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #cbccce;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #d1d2d4;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-success {
+ --bs-table-color: #000;
+ --bs-table-bg: #d1e7dd;
+ --bs-table-border-color: #bcd0c7;
+ --bs-table-striped-bg: #c7dbd2;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #bcd0c7;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #c1d6cc;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-info {
+ --bs-table-color: #000;
+ --bs-table-bg: #cff4fc;
+ --bs-table-border-color: #badce3;
+ --bs-table-striped-bg: #c5e8ef;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #badce3;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #bfe2e9;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-warning {
+ --bs-table-color: #000;
+ --bs-table-bg: #fff3cd;
+ --bs-table-border-color: #e6dbb9;
+ --bs-table-striped-bg: #f2e7c3;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #e6dbb9;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #ece1be;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-danger {
+ --bs-table-color: #000;
+ --bs-table-bg: #f8d7da;
+ --bs-table-border-color: #dfc2c4;
+ --bs-table-striped-bg: #eccccf;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #dfc2c4;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #e5c7ca;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-light {
+ --bs-table-color: #000;
+ --bs-table-bg: #f8f9fa;
+ --bs-table-border-color: #dfe0e1;
+ --bs-table-striped-bg: #ecedee;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #dfe0e1;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #e5e6e7;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-dark {
+ --bs-table-color: #fff;
+ --bs-table-bg: #212529;
+ --bs-table-border-color: #373b3e;
+ --bs-table-striped-bg: #2c3034;
+ --bs-table-striped-color: #fff;
+ --bs-table-active-bg: #373b3e;
+ --bs-table-active-color: #fff;
+ --bs-table-hover-bg: #323539;
+ --bs-table-hover-color: #fff;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.bodywebsite .table-responsive {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .table-responsive-sm {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .table-responsive-md {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .table-responsive-lg {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .table-responsive-xl {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .table-responsive-xxl {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+.bodywebsite .form-label {
+ margin-bottom: 0.5rem;
+}
+
+.bodywebsite .col-form-label {
+ padding-top: calc(0.375rem + 1px);
+ padding-bottom: calc(0.375rem + 1px);
+ margin-bottom: 0;
+ font-size: inherit;
+ line-height: 1.5;
+}
+
+.bodywebsite .col-form-label-lg {
+ padding-top: calc(0.5rem + 1px);
+ padding-bottom: calc(0.5rem + 1px);
+ font-size: 1.25rem;
+}
+
+.bodywebsite .col-form-label-sm {
+ padding-top: calc(0.25rem + 1px);
+ padding-bottom: calc(0.25rem + 1px);
+ font-size: 0.875rem;
+}
+
+.bodywebsite .form-text {
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: #6c757d;
+}
+
+.bodywebsite .form-control {
+ display: block;
+ width: 100%;
+ padding: 0.375rem 0.75rem;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #212529;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid #ced4da;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ border-radius: 0.375rem;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-control {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-control[type=file] {
+ overflow: hidden;
+}
+
+.bodywebsite .form-control[type=file]:not(:disabled):not([readonly]) {
+ cursor: pointer;
+}
+
+.bodywebsite .form-control:focus {
+ color: #212529;
+ background-color: #fff;
+ border-color: #86b7fe;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-control::-webkit-date-and-time-value {
+ height: 1.5em;
+}
+
+.bodywebsite .form-control::-moz-placeholder {
+ color: #6c757d;
+ opacity: 1;
+}
+
+.bodywebsite .form-control::placeholder {
+ color: #6c757d;
+ opacity: 1;
+}
+
+.bodywebsite .form-control:disabled {
+ background-color: #e9ecef;
+ opacity: 1;
+}
+
+.bodywebsite .form-control::-webkit-file-upload-button {
+ padding: 0.375rem 0.75rem;
+ margin: -0.375rem -0.75rem;
+ -webkit-margin-end: 0.75rem;
+ margin-inline-end: 0.75rem;
+ color: #212529;
+ background-color: #e9ecef;
+ pointer-events: none;
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+ border-inline-end-width: 1px;
+ border-radius: 0;
+ -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+.bodywebsite .form-control::file-selector-button {
+ padding: 0.375rem 0.75rem;
+ margin: -0.375rem -0.75rem;
+ -webkit-margin-end: 0.75rem;
+ margin-inline-end: 0.75rem;
+ color: #212529;
+ background-color: #e9ecef;
+ pointer-events: none;
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+ border-inline-end-width: 1px;
+ border-radius: 0;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-control::-webkit-file-upload-button {
+ -webkit-transition: none;
+ transition: none;
+ }
+
+ .bodywebsite .form-control::file-selector-button {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {
+ background-color: #dde0e3;
+}
+
+.bodywebsite .form-control:hover:not(:disabled):not([readonly])::file-selector-button {
+ background-color: #dde0e3;
+}
+
+.bodywebsite .form-control-plaintext {
+ display: block;
+ width: 100%;
+ padding: 0.375rem 0;
+ margin-bottom: 0;
+ line-height: 1.5;
+ color: #212529;
+ background-color: transparent;
+ border: solid transparent;
+ border-width: 1px 0;
+}
+
+.bodywebsite .form-control-plaintext:focus {
+ outline: 0;
+}
+
+.bodywebsite .form-control-plaintext.form-control-sm, .bodywebsite .form-control-plaintext.form-control-lg {
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.bodywebsite .form-control-sm {
+ min-height: calc(1.5em + 0.5rem + 2px);
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.25rem;
+}
+
+.bodywebsite .form-control-sm::-webkit-file-upload-button {
+ padding: 0.25rem 0.5rem;
+ margin: -0.25rem -0.5rem;
+ -webkit-margin-end: 0.5rem;
+ margin-inline-end: 0.5rem;
+}
+
+.bodywebsite .form-control-sm::file-selector-button {
+ padding: 0.25rem 0.5rem;
+ margin: -0.25rem -0.5rem;
+ -webkit-margin-end: 0.5rem;
+ margin-inline-end: 0.5rem;
+}
+
+.bodywebsite .form-control-lg {
+ min-height: calc(1.5em + 1rem + 2px);
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ border-radius: 0.5rem;
+}
+
+.bodywebsite .form-control-lg::-webkit-file-upload-button {
+ padding: 0.5rem 1rem;
+ margin: -0.5rem -1rem;
+ -webkit-margin-end: 1rem;
+ margin-inline-end: 1rem;
+}
+
+.bodywebsite .form-control-lg::file-selector-button {
+ padding: 0.5rem 1rem;
+ margin: -0.5rem -1rem;
+ -webkit-margin-end: 1rem;
+ margin-inline-end: 1rem;
+}
+
+.bodywebsite textarea.form-control {
+ min-height: calc(1.5em + 0.75rem + 2px);
+}
+
+.bodywebsite textarea.form-control-sm {
+ min-height: calc(1.5em + 0.5rem + 2px);
+}
+
+.bodywebsite textarea.form-control-lg {
+ min-height: calc(1.5em + 1rem + 2px);
+}
+
+.bodywebsite .form-control-color {
+ width: 3rem;
+ height: calc(1.5em + 0.75rem + 2px);
+ padding: 0.375rem;
+}
+
+.bodywebsite .form-control-color:not(:disabled):not([readonly]) {
+ cursor: pointer;
+}
+
+.bodywebsite .form-control-color::-moz-color-swatch {
+ border: 0 !important;
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .form-control-color::-webkit-color-swatch {
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .form-control-color.form-control-sm {
+ height: calc(1.5em + 0.5rem + 2px);
+}
+
+.bodywebsite .form-control-color.form-control-lg {
+ height: calc(1.5em + 1rem + 2px);
+}
+
+.bodywebsite .form-select {
+ display: block;
+ width: 100%;
+ padding: 0.375rem 2.25rem 0.375rem 0.75rem;
+ -moz-padding-start: calc(0.75rem - 3px);
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #212529;
+ background-color: #fff;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: right 0.75rem center;
+ background-size: 16px 12px;
+ border: 1px solid #ced4da;
+ border-radius: 0.375rem;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-select {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-select:focus {
+ border-color: #86b7fe;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-select[multiple], .bodywebsite .form-select[size]:not([size="1"]) {
+ padding-right: 0.75rem;
+ background-image: none;
+}
+
+.bodywebsite .form-select:disabled {
+ background-color: #e9ecef;
+}
+
+.bodywebsite .form-select:-moz-focusring {
+ color: transparent;
+ text-shadow: 0 0 0 #212529;
+}
+
+.bodywebsite .form-select-sm {
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+ padding-left: 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.25rem;
+}
+
+.bodywebsite .form-select-lg {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ padding-left: 1rem;
+ font-size: 1.25rem;
+ border-radius: 0.5rem;
+}
+
+.bodywebsite .form-check {
+ display: block;
+ min-height: 1.5rem;
+ padding-left: 1.5em;
+ margin-bottom: 0.125rem;
+}
+
+.bodywebsite .form-check .form-check-input {
+ float: left;
+ margin-left: -1.5em;
+}
+
+.bodywebsite .form-check-reverse {
+ padding-right: 1.5em;
+ padding-left: 0;
+ text-align: right;
+}
+
+.bodywebsite .form-check-reverse .form-check-input {
+ float: right;
+ margin-right: -1.5em;
+ margin-left: 0;
+}
+
+.bodywebsite .form-check-input {
+ width: 1em;
+ height: 1em;
+ margin-top: 0.25em;
+ vertical-align: top;
+ background-color: #fff;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: contain;
+ border: 1px solid rgba(0, 0, 0, 0.25);
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ -webkit-print-color-adjust: exact;
+ color-adjust: exact;
+ print-color-adjust: exact;
+}
+
+.bodywebsite .form-check-input[type=checkbox] {
+ border-radius: 0.25em;
+}
+
+.bodywebsite .form-check-input[type=radio] {
+ border-radius: 50%;
+}
+
+.bodywebsite .form-check-input:active {
+ filter: brightness(90%);
+}
+
+.bodywebsite .form-check-input:focus {
+ border-color: #86b7fe;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-check-input:checked {
+ background-color: #0d6efd;
+ border-color: #0d6efd;
+}
+
+.bodywebsite .form-check-input:checked[type=checkbox] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-check-input:checked[type=radio] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-check-input[type=checkbox]:indeterminate {
+ background-color: #0d6efd;
+ border-color: #0d6efd;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-check-input:disabled {
+ pointer-events: none;
+ filter: none;
+ opacity: 0.5;
+}
+
+.bodywebsite .form-check-input[disabled] ~ .form-check-label, .bodywebsite .form-check-input:disabled ~ .form-check-label {
+ cursor: default;
+ opacity: 0.5;
+}
+
+.bodywebsite .form-switch {
+ padding-left: 2.5em;
+}
+
+.bodywebsite .form-switch .form-check-input {
+ width: 2em;
+ margin-left: -2.5em;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");
+ background-position: left center;
+ border-radius: 2em;
+ transition: background-position 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-switch .form-check-input {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-switch .form-check-input:focus {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-switch .form-check-input:checked {
+ background-position: right center;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .form-switch.form-check-reverse {
+ padding-right: 2.5em;
+ padding-left: 0;
+}
+
+.bodywebsite .form-switch.form-check-reverse .form-check-input {
+ margin-right: -2.5em;
+ margin-left: 0;
+}
+
+.bodywebsite .form-check-inline {
+ display: inline-block;
+ margin-right: 1rem;
+}
+
+.bodywebsite .btn-check {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none;
+}
+
+.bodywebsite .btn-check[disabled] + .btn, .bodywebsite .btn-check:disabled + .btn {
+ pointer-events: none;
+ filter: none;
+ opacity: 0.65;
+}
+
+.bodywebsite .form-range {
+ width: 100%;
+ height: 1.5rem;
+ padding: 0;
+ background-color: transparent;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+.bodywebsite .form-range:focus {
+ outline: 0;
+}
+
+.bodywebsite .form-range:focus::-webkit-slider-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-range:focus::-moz-range-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.bodywebsite .form-range::-moz-focus-outer {
+ border: 0;
+}
+
+.bodywebsite .form-range::-webkit-slider-thumb {
+ width: 1rem;
+ height: 1rem;
+ margin-top: -0.25rem;
+ background-color: #0d6efd;
+ border: 0;
+ border-radius: 1rem;
+ -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -webkit-appearance: none;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-range::-webkit-slider-thumb {
+ -webkit-transition: none;
+ transition: none;
+ }
+}
+
+.bodywebsite .form-range::-webkit-slider-thumb:active {
+ background-color: #b6d4fe;
+}
+
+.bodywebsite .form-range::-webkit-slider-runnable-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #dee2e6;
+ border-color: transparent;
+ border-radius: 1rem;
+}
+
+.bodywebsite .form-range::-moz-range-thumb {
+ width: 1rem;
+ height: 1rem;
+ background-color: #0d6efd;
+ border: 0;
+ border-radius: 1rem;
+ -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-range::-moz-range-thumb {
+ -moz-transition: none;
+ transition: none;
+ }
+}
+
+.bodywebsite .form-range::-moz-range-thumb:active {
+ background-color: #b6d4fe;
+}
+
+.bodywebsite .form-range::-moz-range-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #dee2e6;
+ border-color: transparent;
+ border-radius: 1rem;
+}
+
+.bodywebsite .form-range:disabled {
+ pointer-events: none;
+}
+
+.bodywebsite .form-range:disabled::-webkit-slider-thumb {
+ background-color: #adb5bd;
+}
+
+.bodywebsite .form-range:disabled::-moz-range-thumb {
+ background-color: #adb5bd;
+}
+
+.bodywebsite .form-floating {
+ position: relative;
+}
+
+.bodywebsite .form-floating > .form-control,
+ .bodywebsite .form-floating > .form-control-plaintext,
+ .bodywebsite .form-floating > .form-select {
+ height: calc(3.5rem + 2px);
+ line-height: 1.25;
+}
+
+.bodywebsite .form-floating > label {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ padding: 1rem 0.75rem;
+ overflow: hidden;
+ text-align: start;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ pointer-events: none;
+ border: 1px solid transparent;
+ transform-origin: 0 0;
+ transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .form-floating > label {
+ transition: none;
+ }
+}
+
+.bodywebsite .form-floating > .form-control,
+ .bodywebsite .form-floating > .form-control-plaintext {
+ padding: 1rem 0.75rem;
+}
+
+.bodywebsite .form-floating > .form-control::-moz-placeholder, .bodywebsite .form-floating > .form-control-plaintext::-moz-placeholder {
+ color: transparent;
+}
+
+.bodywebsite .form-floating > .form-control::placeholder,
+ .bodywebsite .form-floating > .form-control-plaintext::placeholder {
+ color: transparent;
+}
+
+.bodywebsite .form-floating > .form-control:not(:-moz-placeholder-shown), .bodywebsite .form-floating > .form-control-plaintext:not(:-moz-placeholder-shown) {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.bodywebsite .form-floating > .form-control:focus, .bodywebsite .form-floating > .form-control:not(:placeholder-shown),
+ .bodywebsite .form-floating > .form-control-plaintext:focus,
+ .bodywebsite .form-floating > .form-control-plaintext:not(:placeholder-shown) {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.bodywebsite .form-floating > .form-control:-webkit-autofill,
+ .bodywebsite .form-floating > .form-control-plaintext:-webkit-autofill {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.bodywebsite .form-floating > .form-select {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.bodywebsite .form-floating > .form-control:not(:-moz-placeholder-shown) ~ label {
+ opacity: 0.65;
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
+}
+
+.bodywebsite .form-floating > .form-control:focus ~ label,
+ .bodywebsite .form-floating > .form-control:not(:placeholder-shown) ~ label,
+ .bodywebsite .form-floating > .form-control-plaintext ~ label,
+ .bodywebsite .form-floating > .form-select ~ label {
+ opacity: 0.65;
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
+}
+
+.bodywebsite .form-floating > .form-control:-webkit-autofill ~ label {
+ opacity: 0.65;
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
+}
+
+.bodywebsite .form-floating > .form-control-plaintext ~ label {
+ border-width: 1px 0;
+}
+
+.bodywebsite .input-group {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: stretch;
+ width: 100%;
+}
+
+.bodywebsite .input-group > .form-control,
+ .bodywebsite .input-group > .form-select,
+ .bodywebsite .input-group > .form-floating {
+ position: relative;
+ flex: 1 1 auto;
+ width: 1%;
+ min-width: 0;
+}
+
+.bodywebsite .input-group > .form-control:focus,
+ .bodywebsite .input-group > .form-select:focus,
+ .bodywebsite .input-group > .form-floating:focus-within {
+ z-index: 5;
+}
+
+.bodywebsite .input-group .btn {
+ position: relative;
+ z-index: 2;
+}
+
+.bodywebsite .input-group .btn:focus {
+ z-index: 5;
+}
+
+.bodywebsite .input-group-text {
+ display: flex;
+ align-items: center;
+ padding: 0.375rem 0.75rem;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #212529;
+ text-align: center;
+ white-space: nowrap;
+ background-color: #e9ecef;
+ border: 1px solid #ced4da;
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .input-group-lg > .form-control,
+ .bodywebsite .input-group-lg > .form-select,
+ .bodywebsite .input-group-lg > .input-group-text,
+ .bodywebsite .input-group-lg > .btn {
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ border-radius: 0.5rem;
+}
+
+.bodywebsite .input-group-sm > .form-control,
+ .bodywebsite .input-group-sm > .form-select,
+ .bodywebsite .input-group-sm > .input-group-text,
+ .bodywebsite .input-group-sm > .btn {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.25rem;
+}
+
+.bodywebsite .input-group-lg > .form-select,
+ .bodywebsite .input-group-sm > .form-select {
+ padding-right: 3rem;
+}
+
+.bodywebsite .input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),
+ .bodywebsite .input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3),
+ .bodywebsite .input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control,
+ .bodywebsite .input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.bodywebsite .input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),
+ .bodywebsite .input-group.has-validation > .dropdown-toggle:nth-last-child(n+4),
+ .bodywebsite .input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control,
+ .bodywebsite .input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.bodywebsite .input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {
+ margin-left: -1px;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .input-group > .form-floating:not(:first-child) > .form-control,
+ .bodywebsite .input-group > .form-floating:not(:first-child) > .form-select {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .valid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: #198754;
+}
+
+.bodywebsite .valid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 0.25rem 0.5rem;
+ margin-top: 0.1rem;
+ font-size: 0.875rem;
+ color: #fff;
+ background-color: rgba(25, 135, 84, 0.9);
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .was-validated :valid ~ .valid-feedback,
+ .bodywebsite .was-validated :valid ~ .valid-tooltip,
+ .bodywebsite .is-valid ~ .valid-feedback,
+ .bodywebsite .is-valid ~ .valid-tooltip {
+ display: block;
+}
+
+.bodywebsite .was-validated .form-control:valid, .bodywebsite .form-control.is-valid {
+ border-color: #198754;
+ padding-right: calc(1.5em + 0.75rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: right calc(0.375em + 0.1875rem) center;
+ background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.bodywebsite .was-validated .form-control:valid:focus, .bodywebsite .form-control.is-valid:focus {
+ border-color: #198754;
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
+}
+
+.bodywebsite .was-validated textarea.form-control:valid, .bodywebsite textarea.form-control.is-valid {
+ padding-right: calc(1.5em + 0.75rem);
+ background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
+}
+
+.bodywebsite .was-validated .form-select:valid, .bodywebsite .form-select.is-valid {
+ border-color: #198754;
+}
+
+.bodywebsite .was-validated .form-select:valid:not([multiple]):not([size]), .bodywebsite .was-validated .form-select:valid:not([multiple])[size="1"], .bodywebsite .form-select.is-valid:not([multiple]):not([size]), .bodywebsite .form-select.is-valid:not([multiple])[size="1"] {
+ padding-right: 4.125rem;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
+ background-position: right 0.75rem center, center right 2.25rem;
+ background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.bodywebsite .was-validated .form-select:valid:focus, .bodywebsite .form-select.is-valid:focus {
+ border-color: #198754;
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
+}
+
+.bodywebsite .was-validated .form-control-color:valid, .bodywebsite .form-control-color.is-valid {
+ width: calc(3rem + calc(1.5em + 0.75rem));
+}
+
+.bodywebsite .was-validated .form-check-input:valid, .bodywebsite .form-check-input.is-valid {
+ border-color: #198754;
+}
+
+.bodywebsite .was-validated .form-check-input:valid:checked, .bodywebsite .form-check-input.is-valid:checked {
+ background-color: #198754;
+}
+
+.bodywebsite .was-validated .form-check-input:valid:focus, .bodywebsite .form-check-input.is-valid:focus {
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
+}
+
+.bodywebsite .was-validated .form-check-input:valid ~ .form-check-label, .bodywebsite .form-check-input.is-valid ~ .form-check-label {
+ color: #198754;
+}
+
+.bodywebsite .form-check-inline .form-check-input ~ .valid-feedback {
+ margin-left: 0.5em;
+}
+
+.bodywebsite .was-validated .input-group > .form-control:not(:focus):valid, .bodywebsite .input-group > .form-control:not(:focus).is-valid,
+ .bodywebsite .was-validated .input-group > .form-select:not(:focus):valid,
+ .bodywebsite .input-group > .form-select:not(:focus).is-valid,
+ .bodywebsite .was-validated .input-group > .form-floating:not(:focus-within):valid,
+ .bodywebsite .input-group > .form-floating:not(:focus-within).is-valid {
+ z-index: 3;
+}
+
+.bodywebsite .invalid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: #dc3545;
+}
+
+.bodywebsite .invalid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 0.25rem 0.5rem;
+ margin-top: 0.1rem;
+ font-size: 0.875rem;
+ color: #fff;
+ background-color: rgba(220, 53, 69, 0.9);
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .was-validated :invalid ~ .invalid-feedback,
+ .bodywebsite .was-validated :invalid ~ .invalid-tooltip,
+ .bodywebsite .is-invalid ~ .invalid-feedback,
+ .bodywebsite .is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.bodywebsite .was-validated .form-control:invalid, .bodywebsite .form-control.is-invalid {
+ border-color: #dc3545;
+ padding-right: calc(1.5em + 0.75rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: right calc(0.375em + 0.1875rem) center;
+ background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.bodywebsite .was-validated .form-control:invalid:focus, .bodywebsite .form-control.is-invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
+}
+
+.bodywebsite .was-validated textarea.form-control:invalid, .bodywebsite textarea.form-control.is-invalid {
+ padding-right: calc(1.5em + 0.75rem);
+ background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
+}
+
+.bodywebsite .was-validated .form-select:invalid, .bodywebsite .form-select.is-invalid {
+ border-color: #dc3545;
+}
+
+.bodywebsite .was-validated .form-select:invalid:not([multiple]):not([size]), .bodywebsite .was-validated .form-select:invalid:not([multiple])[size="1"], .bodywebsite .form-select.is-invalid:not([multiple]):not([size]), .bodywebsite .form-select.is-invalid:not([multiple])[size="1"] {
+ padding-right: 4.125rem;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
+ background-position: right 0.75rem center, center right 2.25rem;
+ background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.bodywebsite .was-validated .form-select:invalid:focus, .bodywebsite .form-select.is-invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
+}
+
+.bodywebsite .was-validated .form-control-color:invalid, .bodywebsite .form-control-color.is-invalid {
+ width: calc(3rem + calc(1.5em + 0.75rem));
+}
+
+.bodywebsite .was-validated .form-check-input:invalid, .bodywebsite .form-check-input.is-invalid {
+ border-color: #dc3545;
+}
+
+.bodywebsite .was-validated .form-check-input:invalid:checked, .bodywebsite .form-check-input.is-invalid:checked {
+ background-color: #dc3545;
+}
+
+.bodywebsite .was-validated .form-check-input:invalid:focus, .bodywebsite .form-check-input.is-invalid:focus {
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
+}
+
+.bodywebsite .was-validated .form-check-input:invalid ~ .form-check-label, .bodywebsite .form-check-input.is-invalid ~ .form-check-label {
+ color: #dc3545;
+}
+
+.bodywebsite .form-check-inline .form-check-input ~ .invalid-feedback {
+ margin-left: 0.5em;
+}
+
+.bodywebsite .was-validated .input-group > .form-control:not(:focus):invalid, .bodywebsite .input-group > .form-control:not(:focus).is-invalid,
+ .bodywebsite .was-validated .input-group > .form-select:not(:focus):invalid,
+ .bodywebsite .input-group > .form-select:not(:focus).is-invalid,
+ .bodywebsite .was-validated .input-group > .form-floating:not(:focus-within):invalid,
+ .bodywebsite .input-group > .form-floating:not(:focus-within).is-invalid {
+ z-index: 4;
+}
+
+.bodywebsite .btn {
+ --bs-btn-padding-x: 0.75rem;
+ --bs-btn-padding-y: 0.375rem;
+ --bs-btn-font-size: 1rem;
+ --bs-btn-font-weight: 400;
+ --bs-btn-line-height: 1.5;
+ --bs-btn-color: #212529;
+ --bs-btn-bg: transparent;
+ --bs-btn-border-width: 1px;
+ --bs-btn-border-color: transparent;
+ --bs-btn-border-radius: 0.375rem;
+ --bs-btn-hover-border-color: transparent;
+ --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+ --bs-btn-disabled-opacity: 0.65;
+ display: inline-block;
+ padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x);
+ font-family: var(--bs-btn-font-family);
+ font-size: var(--bs-btn-font-size);
+ font-weight: var(--bs-btn-font-weight);
+ line-height: var(--bs-btn-line-height);
+ color: var(--bs-btn-color);
+ text-align: center;
+ text-decoration: none;
+ vertical-align: middle;
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);
+ border-radius: var(--bs-btn-border-radius);
+ background-color: var(--bs-btn-bg);
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .btn {
+ transition: none;
+ }
+}
+
+.bodywebsite :not(.btn-check) + .btn:hover, .bodywebsite .btn:first-child:hover {
+ color: var(--bs-btn-hover-color);
+ background-color: var(--bs-btn-hover-bg);
+ border-color: var(--bs-btn-hover-border-color);
+}
+
+.bodywebsite .btn:focus-visible {
+ color: var(--bs-btn-hover-color);
+ background-color: var(--bs-btn-hover-bg);
+ border-color: var(--bs-btn-hover-border-color);
+ outline: 0;
+ box-shadow: var(--bs-btn-focus-box-shadow);
+}
+
+.bodywebsite .btn-check:focus-visible + .btn {
+ border-color: var(--bs-btn-hover-border-color);
+ outline: 0;
+ box-shadow: var(--bs-btn-focus-box-shadow);
+}
+
+.bodywebsite .btn-check:checked + .btn, .bodywebsite :not(.btn-check) + .btn:active, .bodywebsite .btn:first-child:active, .bodywebsite .btn.active, .bodywebsite .btn.show {
+ color: var(--bs-btn-active-color);
+ background-color: var(--bs-btn-active-bg);
+ border-color: var(--bs-btn-active-border-color);
+}
+
+.bodywebsite .btn-check:checked + .btn:focus-visible, .bodywebsite :not(.btn-check) + .btn:active:focus-visible, .bodywebsite .btn:first-child:active:focus-visible, .bodywebsite .btn.active:focus-visible, .bodywebsite .btn.show:focus-visible {
+ box-shadow: var(--bs-btn-focus-box-shadow);
+}
+
+.bodywebsite .btn:disabled, .bodywebsite .btn.disabled, .bodywebsite fieldset:disabled .btn {
+ color: var(--bs-btn-disabled-color);
+ pointer-events: none;
+ background-color: var(--bs-btn-disabled-bg);
+ border-color: var(--bs-btn-disabled-border-color);
+ opacity: var(--bs-btn-disabled-opacity);
+}
+
+.bodywebsite .btn-primary {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #0d6efd;
+ --bs-btn-border-color: #0d6efd;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #0b5ed7;
+ --bs-btn-hover-border-color: #0a58ca;
+ --bs-btn-focus-shadow-rgb: 49, 132, 253;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #0a58ca;
+ --bs-btn-active-border-color: #0a53be;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #0d6efd;
+ --bs-btn-disabled-border-color: #0d6efd;
+}
+
+.bodywebsite .btn-secondary {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #6c757d;
+ --bs-btn-border-color: #6c757d;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #5c636a;
+ --bs-btn-hover-border-color: #565e64;
+ --bs-btn-focus-shadow-rgb: 130, 138, 145;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #565e64;
+ --bs-btn-active-border-color: #51585e;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #6c757d;
+ --bs-btn-disabled-border-color: #6c757d;
+}
+
+.bodywebsite .btn-success {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #198754;
+ --bs-btn-border-color: #198754;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #157347;
+ --bs-btn-hover-border-color: #146c43;
+ --bs-btn-focus-shadow-rgb: 60, 153, 110;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #146c43;
+ --bs-btn-active-border-color: #13653f;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #198754;
+ --bs-btn-disabled-border-color: #198754;
+}
+
+.bodywebsite .btn-info {
+ --bs-btn-color: #000;
+ --bs-btn-bg: #0dcaf0;
+ --bs-btn-border-color: #0dcaf0;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #31d2f2;
+ --bs-btn-hover-border-color: #25cff2;
+ --bs-btn-focus-shadow-rgb: 11, 172, 204;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #3dd5f3;
+ --bs-btn-active-border-color: #25cff2;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #000;
+ --bs-btn-disabled-bg: #0dcaf0;
+ --bs-btn-disabled-border-color: #0dcaf0;
+}
+
+.bodywebsite .btn-warning {
+ --bs-btn-color: #000;
+ --bs-btn-bg: #ffc107;
+ --bs-btn-border-color: #ffc107;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #ffca2c;
+ --bs-btn-hover-border-color: #ffc720;
+ --bs-btn-focus-shadow-rgb: 217, 164, 6;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #ffcd39;
+ --bs-btn-active-border-color: #ffc720;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #000;
+ --bs-btn-disabled-bg: #ffc107;
+ --bs-btn-disabled-border-color: #ffc107;
+}
+
+.bodywebsite .btn-danger {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #dc3545;
+ --bs-btn-border-color: #dc3545;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #bb2d3b;
+ --bs-btn-hover-border-color: #b02a37;
+ --bs-btn-focus-shadow-rgb: 225, 83, 97;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #b02a37;
+ --bs-btn-active-border-color: #a52834;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #dc3545;
+ --bs-btn-disabled-border-color: #dc3545;
+}
+
+.bodywebsite .btn-light {
+ --bs-btn-color: #000;
+ --bs-btn-bg: #f8f9fa;
+ --bs-btn-border-color: #f8f9fa;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #d3d4d5;
+ --bs-btn-hover-border-color: #c6c7c8;
+ --bs-btn-focus-shadow-rgb: 211, 212, 213;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #c6c7c8;
+ --bs-btn-active-border-color: #babbbc;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #000;
+ --bs-btn-disabled-bg: #f8f9fa;
+ --bs-btn-disabled-border-color: #f8f9fa;
+}
+
+.bodywebsite .btn-dark {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #212529;
+ --bs-btn-border-color: #212529;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #424649;
+ --bs-btn-hover-border-color: #373b3e;
+ --bs-btn-focus-shadow-rgb: 66, 70, 73;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #4d5154;
+ --bs-btn-active-border-color: #373b3e;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #212529;
+ --bs-btn-disabled-border-color: #212529;
+}
+
+.bodywebsite .btn-outline-primary {
+ --bs-btn-color: #0d6efd;
+ --bs-btn-border-color: #0d6efd;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #0d6efd;
+ --bs-btn-hover-border-color: #0d6efd;
+ --bs-btn-focus-shadow-rgb: 13, 110, 253;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #0d6efd;
+ --bs-btn-active-border-color: #0d6efd;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #0d6efd;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #0d6efd;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-secondary {
+ --bs-btn-color: #6c757d;
+ --bs-btn-border-color: #6c757d;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #6c757d;
+ --bs-btn-hover-border-color: #6c757d;
+ --bs-btn-focus-shadow-rgb: 108, 117, 125;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #6c757d;
+ --bs-btn-active-border-color: #6c757d;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #6c757d;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #6c757d;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-success {
+ --bs-btn-color: #198754;
+ --bs-btn-border-color: #198754;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #198754;
+ --bs-btn-hover-border-color: #198754;
+ --bs-btn-focus-shadow-rgb: 25, 135, 84;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #198754;
+ --bs-btn-active-border-color: #198754;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #198754;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #198754;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-info {
+ --bs-btn-color: #0dcaf0;
+ --bs-btn-border-color: #0dcaf0;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #0dcaf0;
+ --bs-btn-hover-border-color: #0dcaf0;
+ --bs-btn-focus-shadow-rgb: 13, 202, 240;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #0dcaf0;
+ --bs-btn-active-border-color: #0dcaf0;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #0dcaf0;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #0dcaf0;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-warning {
+ --bs-btn-color: #ffc107;
+ --bs-btn-border-color: #ffc107;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #ffc107;
+ --bs-btn-hover-border-color: #ffc107;
+ --bs-btn-focus-shadow-rgb: 255, 193, 7;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #ffc107;
+ --bs-btn-active-border-color: #ffc107;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #ffc107;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #ffc107;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-danger {
+ --bs-btn-color: #dc3545;
+ --bs-btn-border-color: #dc3545;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #dc3545;
+ --bs-btn-hover-border-color: #dc3545;
+ --bs-btn-focus-shadow-rgb: 220, 53, 69;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #dc3545;
+ --bs-btn-active-border-color: #dc3545;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #dc3545;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #dc3545;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-light {
+ --bs-btn-color: #f8f9fa;
+ --bs-btn-border-color: #f8f9fa;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #f8f9fa;
+ --bs-btn-hover-border-color: #f8f9fa;
+ --bs-btn-focus-shadow-rgb: 248, 249, 250;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #f8f9fa;
+ --bs-btn-active-border-color: #f8f9fa;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #f8f9fa;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #f8f9fa;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-outline-dark {
+ --bs-btn-color: #212529;
+ --bs-btn-border-color: #212529;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #212529;
+ --bs-btn-hover-border-color: #212529;
+ --bs-btn-focus-shadow-rgb: 33, 37, 41;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #212529;
+ --bs-btn-active-border-color: #212529;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #212529;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #212529;
+ --bs-gradient: none;
+}
+
+.bodywebsite .btn-link {
+ --bs-btn-font-weight: 400;
+ --bs-btn-color: var(--bs-link-color);
+ --bs-btn-bg: transparent;
+ --bs-btn-border-color: transparent;
+ --bs-btn-hover-color: var(--bs-link-hover-color);
+ --bs-btn-hover-border-color: transparent;
+ --bs-btn-active-color: var(--bs-link-hover-color);
+ --bs-btn-active-border-color: transparent;
+ --bs-btn-disabled-color: #6c757d;
+ --bs-btn-disabled-border-color: transparent;
+ --bs-btn-box-shadow: none;
+ --bs-btn-focus-shadow-rgb: 49, 132, 253;
+ text-decoration: underline;
+}
+
+.bodywebsite .btn-link:focus-visible {
+ color: var(--bs-btn-color);
+}
+
+.bodywebsite .btn-link:hover {
+ color: var(--bs-btn-hover-color);
+}
+
+.bodywebsite .btn-lg, .bodywebsite .btn-group-lg > .btn {
+ --bs-btn-padding-y: 0.5rem;
+ --bs-btn-padding-x: 1rem;
+ --bs-btn-font-size: 1.25rem;
+ --bs-btn-border-radius: 0.5rem;
+}
+
+.bodywebsite .btn-sm, .bodywebsite .btn-group-sm > .btn {
+ --bs-btn-padding-y: 0.25rem;
+ --bs-btn-padding-x: 0.5rem;
+ --bs-btn-font-size: 0.875rem;
+ --bs-btn-border-radius: 0.25rem;
+}
+
+.bodywebsite .fade {
+ transition: opacity 0.15s linear;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .fade {
+ transition: none;
+ }
+}
+
+.bodywebsite .fade:not(.show) {
+ opacity: 0;
+}
+
+.bodywebsite .collapse:not(.show) {
+ display: none;
+}
+
+.bodywebsite .collapsing {
+ height: 0;
+ overflow: hidden;
+ transition: height 0.35s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .collapsing {
+ transition: none;
+ }
+}
+
+.bodywebsite .collapsing.collapse-horizontal {
+ width: 0;
+ height: auto;
+ transition: width 0.35s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .collapsing.collapse-horizontal {
+ transition: none;
+ }
+}
+
+.bodywebsite .dropup,
+ .bodywebsite .dropend,
+ .bodywebsite .dropdown,
+ .bodywebsite .dropstart,
+ .bodywebsite .dropup-center,
+ .bodywebsite .dropdown-center {
+ position: relative;
+}
+
+.bodywebsite .dropdown-toggle {
+ white-space: nowrap;
+}
+
+.bodywebsite .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0;
+ border-left: 0.3em solid transparent;
+}
+
+.bodywebsite .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropdown-menu {
+ --bs-dropdown-zindex: 1000;
+ --bs-dropdown-min-width: 10rem;
+ --bs-dropdown-padding-x: 0;
+ --bs-dropdown-padding-y: 0.5rem;
+ --bs-dropdown-spacer: 0.125rem;
+ --bs-dropdown-font-size: 1rem;
+ --bs-dropdown-color: #212529;
+ --bs-dropdown-bg: #fff;
+ --bs-dropdown-border-color: var(--bs-border-color-translucent);
+ --bs-dropdown-border-radius: 0.375rem;
+ --bs-dropdown-border-width: 1px;
+ --bs-dropdown-inner-border-radius: calc(0.375rem - 1px);
+ --bs-dropdown-divider-bg: var(--bs-border-color-translucent);
+ --bs-dropdown-divider-margin-y: 0.5rem;
+ --bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ --bs-dropdown-link-color: #212529;
+ --bs-dropdown-link-hover-color: #1e2125;
+ --bs-dropdown-link-hover-bg: #e9ecef;
+ --bs-dropdown-link-active-color: #fff;
+ --bs-dropdown-link-active-bg: #0d6efd;
+ --bs-dropdown-link-disabled-color: #adb5bd;
+ --bs-dropdown-item-padding-x: 1rem;
+ --bs-dropdown-item-padding-y: 0.25rem;
+ --bs-dropdown-header-color: #6c757d;
+ --bs-dropdown-header-padding-x: 1rem;
+ --bs-dropdown-header-padding-y: 0.5rem;
+ position: absolute;
+ z-index: var(--bs-dropdown-zindex);
+ display: none;
+ min-width: var(--bs-dropdown-min-width);
+ padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);
+ margin: 0;
+ font-size: var(--bs-dropdown-font-size);
+ color: var(--bs-dropdown-color);
+ text-align: left;
+ list-style: none;
+ background-color: var(--bs-dropdown-bg);
+ background-clip: padding-box;
+ border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);
+ border-radius: var(--bs-dropdown-border-radius);
+}
+
+.bodywebsite .dropdown-menu[data-bs-popper] {
+ top: 100%;
+ left: 0;
+ margin-top: var(--bs-dropdown-spacer);
+}
+
+.bodywebsite .dropdown-menu-start {
+ --bs-position: start;
+}
+
+.bodywebsite .dropdown-menu-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+}
+
+.bodywebsite .dropdown-menu-end {
+ --bs-position: end;
+}
+
+.bodywebsite .dropdown-menu-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .dropdown-menu-sm-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-sm-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-sm-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-sm-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .dropdown-menu-md-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-md-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-md-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-md-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .dropdown-menu-lg-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-lg-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-lg-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-lg-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .dropdown-menu-xl-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-xl-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-xl-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-xl-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .dropdown-menu-xxl-start {
+ --bs-position: start;
+ }
+
+ .bodywebsite .dropdown-menu-xxl-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .bodywebsite .dropdown-menu-xxl-end {
+ --bs-position: end;
+ }
+
+ .bodywebsite .dropdown-menu-xxl-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+
+.bodywebsite .dropup .dropdown-menu[data-bs-popper] {
+ top: auto;
+ bottom: 100%;
+ margin-top: 0;
+ margin-bottom: var(--bs-dropdown-spacer);
+}
+
+.bodywebsite .dropup .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0.3em solid;
+ border-left: 0.3em solid transparent;
+}
+
+.bodywebsite .dropup .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropend .dropdown-menu[data-bs-popper] {
+ top: 0;
+ right: auto;
+ left: 100%;
+ margin-top: 0;
+ margin-left: var(--bs-dropdown-spacer);
+}
+
+.bodywebsite .dropend .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid transparent;
+ border-right: 0;
+ border-bottom: 0.3em solid transparent;
+ border-left: 0.3em solid;
+}
+
+.bodywebsite .dropend .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropend .dropdown-toggle::after {
+ vertical-align: 0;
+}
+
+.bodywebsite .dropstart .dropdown-menu[data-bs-popper] {
+ top: 0;
+ right: 100%;
+ left: auto;
+ margin-top: 0;
+ margin-right: var(--bs-dropdown-spacer);
+}
+
+.bodywebsite .dropstart .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+}
+
+.bodywebsite .dropstart .dropdown-toggle::after {
+ display: none;
+}
+
+.bodywebsite .dropstart .dropdown-toggle::before {
+ display: inline-block;
+ margin-right: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid transparent;
+ border-right: 0.3em solid;
+ border-bottom: 0.3em solid transparent;
+}
+
+.bodywebsite .dropstart .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropstart .dropdown-toggle::before {
+ vertical-align: 0;
+}
+
+.bodywebsite .dropdown-divider {
+ height: 0;
+ margin: var(--bs-dropdown-divider-margin-y) 0;
+ overflow: hidden;
+ border-top: 1px solid var(--bs-dropdown-divider-bg);
+ opacity: 1;
+}
+
+.bodywebsite .dropdown-item {
+ display: block;
+ width: 100%;
+ padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);
+ clear: both;
+ font-weight: 400;
+ color: var(--bs-dropdown-link-color);
+ text-align: inherit;
+ text-decoration: none;
+ white-space: nowrap;
+ background-color: transparent;
+ border: 0;
+}
+
+.bodywebsite .dropdown-item:hover, .bodywebsite .dropdown-item:focus {
+ color: var(--bs-dropdown-link-hover-color);
+ background-color: var(--bs-dropdown-link-hover-bg);
+}
+
+.bodywebsite .dropdown-item.active, .bodywebsite .dropdown-item:active {
+ color: var(--bs-dropdown-link-active-color);
+ text-decoration: none;
+ background-color: var(--bs-dropdown-link-active-bg);
+}
+
+.bodywebsite .dropdown-item.disabled, .bodywebsite .dropdown-item:disabled {
+ color: var(--bs-dropdown-link-disabled-color);
+ pointer-events: none;
+ background-color: transparent;
+}
+
+.bodywebsite .dropdown-menu.show {
+ display: block;
+}
+
+.bodywebsite .dropdown-header {
+ display: block;
+ padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);
+ margin-bottom: 0;
+ font-size: 0.875rem;
+ color: var(--bs-dropdown-header-color);
+ white-space: nowrap;
+}
+
+.bodywebsite .dropdown-item-text {
+ display: block;
+ padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);
+ color: var(--bs-dropdown-link-color);
+}
+
+.bodywebsite .dropdown-menu-dark {
+ --bs-dropdown-color: #dee2e6;
+ --bs-dropdown-bg: #343a40;
+ --bs-dropdown-border-color: var(--bs-border-color-translucent);
+ --bs-dropdown-link-color: #dee2e6;
+ --bs-dropdown-link-hover-color: #fff;
+ --bs-dropdown-divider-bg: var(--bs-border-color-translucent);
+ --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);
+ --bs-dropdown-link-active-color: #fff;
+ --bs-dropdown-link-active-bg: #0d6efd;
+ --bs-dropdown-link-disabled-color: #adb5bd;
+ --bs-dropdown-header-color: #adb5bd;
+}
+
+.bodywebsite .btn-group,
+ .bodywebsite .btn-group-vertical {
+ position: relative;
+ display: inline-flex;
+ vertical-align: middle;
+}
+
+.bodywebsite .btn-group > .btn,
+ .bodywebsite .btn-group-vertical > .btn {
+ position: relative;
+ flex: 1 1 auto;
+}
+
+.bodywebsite .btn-group > .btn-check:checked + .btn,
+ .bodywebsite .btn-group > .btn-check:focus + .btn,
+ .bodywebsite .btn-group > .btn:hover,
+ .bodywebsite .btn-group > .btn:focus,
+ .bodywebsite .btn-group > .btn:active,
+ .bodywebsite .btn-group > .btn.active,
+ .bodywebsite .btn-group-vertical > .btn-check:checked + .btn,
+ .bodywebsite .btn-group-vertical > .btn-check:focus + .btn,
+ .bodywebsite .btn-group-vertical > .btn:hover,
+ .bodywebsite .btn-group-vertical > .btn:focus,
+ .bodywebsite .btn-group-vertical > .btn:active,
+ .bodywebsite .btn-group-vertical > .btn.active {
+ z-index: 1;
+}
+
+.bodywebsite .btn-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+}
+
+.bodywebsite .btn-toolbar .input-group {
+ width: auto;
+}
+
+.bodywebsite .btn-group {
+ border-radius: 0.375rem;
+}
+
+.bodywebsite .btn-group > :not(.btn-check:first-child) + .btn,
+ .bodywebsite .btn-group > .btn-group:not(:first-child) {
+ margin-left: -1px;
+}
+
+.bodywebsite .btn-group > .btn:not(:last-child):not(.dropdown-toggle),
+ .bodywebsite .btn-group > .btn.dropdown-toggle-split:first-child,
+ .bodywebsite .btn-group > .btn-group:not(:last-child) > .btn {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.bodywebsite .btn-group > .btn:nth-child(n+3),
+ .bodywebsite .btn-group > :not(.btn-check) + .btn,
+ .bodywebsite .btn-group > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .dropdown-toggle-split {
+ padding-right: 0.5625rem;
+ padding-left: 0.5625rem;
+}
+
+.bodywebsite .dropdown-toggle-split::after, .bodywebsite .dropup .dropdown-toggle-split::after, .bodywebsite .dropend .dropdown-toggle-split::after {
+ margin-left: 0;
+}
+
+.bodywebsite .dropstart .dropdown-toggle-split::before {
+ margin-right: 0;
+}
+
+.bodywebsite .btn-sm + .dropdown-toggle-split, .bodywebsite .btn-group-sm > .btn + .dropdown-toggle-split {
+ padding-right: 0.375rem;
+ padding-left: 0.375rem;
+}
+
+.bodywebsite .btn-lg + .dropdown-toggle-split, .bodywebsite .btn-group-lg > .btn + .dropdown-toggle-split {
+ padding-right: 0.75rem;
+ padding-left: 0.75rem;
+}
+
+.bodywebsite .btn-group-vertical {
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+}
+
+.bodywebsite .btn-group-vertical > .btn,
+ .bodywebsite .btn-group-vertical > .btn-group {
+ width: 100%;
+}
+
+.bodywebsite .btn-group-vertical > .btn:not(:first-child),
+ .bodywebsite .btn-group-vertical > .btn-group:not(:first-child) {
+ margin-top: -1px;
+}
+
+.bodywebsite .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),
+ .bodywebsite .btn-group-vertical > .btn-group:not(:last-child) > .btn {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .btn-group-vertical > .btn ~ .btn,
+ .bodywebsite .btn-group-vertical > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.bodywebsite .nav {
+ --bs-nav-link-padding-x: 1rem;
+ --bs-nav-link-padding-y: 0.5rem;
+ --bs-nav-link-color: var(--bs-link-color);
+ --bs-nav-link-hover-color: var(--bs-link-hover-color);
+ --bs-nav-link-disabled-color: #6c757d;
+ display: flex;
+ flex-wrap: wrap;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+
+.bodywebsite .nav-link {
+ display: block;
+ padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);
+ font-size: var(--bs-nav-link-font-size);
+ font-weight: var(--bs-nav-link-font-weight);
+ color: var(--bs-nav-link-color);
+ text-decoration: none;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .nav-link {
+ transition: none;
+ }
+}
+
+.bodywebsite .nav-link:hover, .bodywebsite .nav-link:focus {
+ color: var(--bs-nav-link-hover-color);
+}
+
+.bodywebsite .nav-link.disabled {
+ color: var(--bs-nav-link-disabled-color);
+ pointer-events: none;
+ cursor: default;
+}
+
+.bodywebsite .nav-tabs {
+ --bs-nav-tabs-border-width: 1px;
+ --bs-nav-tabs-border-color: #dee2e6;
+ --bs-nav-tabs-border-radius: 0.375rem;
+ --bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef #dee2e6;
+ --bs-nav-tabs-link-active-color: #495057;
+ --bs-nav-tabs-link-active-bg: #fff;
+ --bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff;
+ border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color);
+}
+
+.bodywebsite .nav-tabs .nav-link {
+ margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width));
+ background: none;
+ border: var(--bs-nav-tabs-border-width) solid transparent;
+ border-top-left-radius: var(--bs-nav-tabs-border-radius);
+ border-top-right-radius: var(--bs-nav-tabs-border-radius);
+}
+
+.bodywebsite .nav-tabs .nav-link:hover, .bodywebsite .nav-tabs .nav-link:focus {
+ isolation: isolate;
+ border-color: var(--bs-nav-tabs-link-hover-border-color);
+}
+
+.bodywebsite .nav-tabs .nav-link.disabled, .bodywebsite .nav-tabs .nav-link:disabled {
+ color: var(--bs-nav-link-disabled-color);
+ background-color: transparent;
+ border-color: transparent;
+}
+
+.bodywebsite .nav-tabs .nav-link.active,
+ .bodywebsite .nav-tabs .nav-item.show .nav-link {
+ color: var(--bs-nav-tabs-link-active-color);
+ background-color: var(--bs-nav-tabs-link-active-bg);
+ border-color: var(--bs-nav-tabs-link-active-border-color);
+}
+
+.bodywebsite .nav-tabs .dropdown-menu {
+ margin-top: calc(-1 * var(--bs-nav-tabs-border-width));
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.bodywebsite .nav-pills {
+ --bs-nav-pills-border-radius: 0.375rem;
+ --bs-nav-pills-link-active-color: #fff;
+ --bs-nav-pills-link-active-bg: #0d6efd;
+}
+
+.bodywebsite .nav-pills .nav-link {
+ background: none;
+ border: 0;
+ border-radius: var(--bs-nav-pills-border-radius);
+}
+
+.bodywebsite .nav-pills .nav-link:disabled {
+ color: var(--bs-nav-link-disabled-color);
+ background-color: transparent;
+ border-color: transparent;
+}
+
+.bodywebsite .nav-pills .nav-link.active,
+ .bodywebsite .nav-pills .show > .nav-link {
+ color: var(--bs-nav-pills-link-active-color);
+ background-color: var(--bs-nav-pills-link-active-bg);
+}
+
+.bodywebsite .nav-fill > .nav-link,
+ .bodywebsite .nav-fill .nav-item {
+ flex: 1 1 auto;
+ text-align: center;
+}
+
+.bodywebsite .nav-justified > .nav-link,
+ .bodywebsite .nav-justified .nav-item {
+ flex-basis: 0;
+ flex-grow: 1;
+ text-align: center;
+}
+
+.bodywebsite .nav-fill .nav-item .nav-link,
+ .bodywebsite .nav-justified .nav-item .nav-link {
+ width: 100%;
+}
+
+.bodywebsite .tab-content > .tab-pane {
+ display: none;
+}
+
+.bodywebsite .tab-content > .active {
+ display: block;
+}
+
+.bodywebsite .navbar {
+ --bs-navbar-padding-x: 0;
+ --bs-navbar-padding-y: 0.5rem;
+ --bs-navbar-color: rgba(0, 0, 0, 0.55);
+ --bs-navbar-hover-color: rgba(0, 0, 0, 0.7);
+ --bs-navbar-disabled-color: rgba(0, 0, 0, 0.3);
+ --bs-navbar-active-color: rgba(0, 0, 0, 0.9);
+ --bs-navbar-brand-padding-y: 0.3125rem;
+ --bs-navbar-brand-margin-end: 1rem;
+ --bs-navbar-brand-font-size: 1.25rem;
+ --bs-navbar-brand-color: rgba(0, 0, 0, 0.9);
+ --bs-navbar-brand-hover-color: rgba(0, 0, 0, 0.9);
+ --bs-navbar-nav-link-padding-x: 0.5rem;
+ --bs-navbar-toggler-padding-y: 0.25rem;
+ --bs-navbar-toggler-padding-x: 0.75rem;
+ --bs-navbar-toggler-font-size: 1.25rem;
+ --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+ --bs-navbar-toggler-border-color: rgba(0, 0, 0, 0.1);
+ --bs-navbar-toggler-border-radius: 0.375rem;
+ --bs-navbar-toggler-focus-width: 0.25rem;
+ --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: space-between;
+ padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);
+}
+
+.bodywebsite .navbar > .container,
+ .bodywebsite .navbar > .container-fluid,
+ .bodywebsite .navbar > .container-sm,
+ .bodywebsite .navbar > .container-md,
+ .bodywebsite .navbar > .container-lg,
+ .bodywebsite .navbar > .container-xl,
+ .bodywebsite .navbar > .container-xxl {
+ display: flex;
+ flex-wrap: inherit;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.bodywebsite .navbar-brand {
+ padding-top: var(--bs-navbar-brand-padding-y);
+ padding-bottom: var(--bs-navbar-brand-padding-y);
+ margin-right: var(--bs-navbar-brand-margin-end);
+ font-size: var(--bs-navbar-brand-font-size);
+ color: var(--bs-navbar-brand-color);
+ text-decoration: none;
+ white-space: nowrap;
+}
+
+.bodywebsite .navbar-brand:hover, .bodywebsite .navbar-brand:focus {
+ color: var(--bs-navbar-brand-hover-color);
+}
+
+.bodywebsite .navbar-nav {
+ --bs-nav-link-padding-x: 0;
+ --bs-nav-link-padding-y: 0.5rem;
+ --bs-nav-link-color: var(--bs-navbar-color);
+ --bs-nav-link-hover-color: var(--bs-navbar-hover-color);
+ --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+
+.bodywebsite .navbar-nav .show > .nav-link,
+ .bodywebsite .navbar-nav .nav-link.active {
+ color: var(--bs-navbar-active-color);
+}
+
+.bodywebsite .navbar-nav .dropdown-menu {
+ position: static;
+}
+
+.bodywebsite .navbar-text {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ color: var(--bs-navbar-color);
+}
+
+.bodywebsite .navbar-text a,
+ .bodywebsite .navbar-text a:hover,
+ .bodywebsite .navbar-text a:focus {
+ color: var(--bs-navbar-active-color);
+}
+
+.bodywebsite .navbar-collapse {
+ flex-basis: 100%;
+ flex-grow: 1;
+ align-items: center;
+}
+
+.bodywebsite .navbar-toggler {
+ padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);
+ font-size: var(--bs-navbar-toggler-font-size);
+ line-height: 1;
+ color: var(--bs-navbar-color);
+ background-color: transparent;
+ border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);
+ border-radius: var(--bs-navbar-toggler-border-radius);
+ transition: var(--bs-navbar-toggler-transition);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .navbar-toggler {
+ transition: none;
+ }
+}
+
+.bodywebsite .navbar-toggler:hover {
+ text-decoration: none;
+}
+
+.bodywebsite .navbar-toggler:focus {
+ text-decoration: none;
+ outline: 0;
+ box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width);
+}
+
+.bodywebsite .navbar-toggler-icon {
+ display: inline-block;
+ width: 1.5em;
+ height: 1.5em;
+ vertical-align: middle;
+ background-image: var(--bs-navbar-toggler-icon-bg);
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: 100%;
+}
+
+.bodywebsite .navbar-nav-scroll {
+ max-height: var(--bs-scroll-height, 75vh);
+ overflow-y: auto;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .navbar-expand-sm {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-sm .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-sm .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-sm .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-sm .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .navbar-expand-md {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-md .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-md .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-md .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-md .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .navbar-expand-lg {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-lg .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-lg .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-lg .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-lg .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .navbar-expand-xl {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-xl .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-xl .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-xl .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-xl .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .navbar-expand-xxl {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-nav {
+ flex-direction: row;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-nav-scroll {
+ overflow: visible;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+
+ .bodywebsite .navbar-expand-xxl .navbar-toggler {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-xxl .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+
+ .bodywebsite .navbar-expand-xxl .offcanvas .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .navbar-expand-xxl .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+
+.bodywebsite .navbar-expand {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+}
+
+.bodywebsite .navbar-expand .navbar-nav {
+ flex-direction: row;
+}
+
+.bodywebsite .navbar-expand .navbar-nav .dropdown-menu {
+ position: absolute;
+}
+
+.bodywebsite .navbar-expand .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+}
+
+.bodywebsite .navbar-expand .navbar-nav-scroll {
+ overflow: visible;
+}
+
+.bodywebsite .navbar-expand .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+}
+
+.bodywebsite .navbar-expand .navbar-toggler {
+ display: none;
+}
+
+.bodywebsite .navbar-expand .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+}
+
+.bodywebsite .navbar-expand .offcanvas .offcanvas-header {
+ display: none;
+}
+
+.bodywebsite .navbar-expand .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+}
+
+.bodywebsite .navbar-dark {
+ --bs-navbar-color: rgba(255, 255, 255, 0.55);
+ --bs-navbar-hover-color: rgba(255, 255, 255, 0.75);
+ --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25);
+ --bs-navbar-active-color: #fff;
+ --bs-navbar-brand-color: #fff;
+ --bs-navbar-brand-hover-color: #fff;
+ --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);
+ --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .card {
+ --bs-card-spacer-y: 1rem;
+ --bs-card-spacer-x: 1rem;
+ --bs-card-title-spacer-y: 0.5rem;
+ --bs-card-border-width: 1px;
+ --bs-card-border-color: var(--bs-border-color-translucent);
+ --bs-card-border-radius: 0.375rem;
+ --bs-card-inner-border-radius: calc(0.375rem - 1px);
+ --bs-card-cap-padding-y: 0.5rem;
+ --bs-card-cap-padding-x: 1rem;
+ --bs-card-cap-bg: rgba(0, 0, 0, 0.03);
+ --bs-card-bg: #fff;
+ --bs-card-img-overlay-padding: 1rem;
+ --bs-card-group-margin: 0.75rem;
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ min-width: 0;
+ height: var(--bs-card-height);
+ word-wrap: break-word;
+ background-color: var(--bs-card-bg);
+ background-clip: border-box;
+ border: var(--bs-card-border-width) solid var(--bs-card-border-color);
+ border-radius: var(--bs-card-border-radius);
+}
+
+.bodywebsite .card > hr {
+ margin-right: 0;
+ margin-left: 0;
+}
+
+.bodywebsite .card > .list-group {
+ border-top: inherit;
+ border-bottom: inherit;
+}
+
+.bodywebsite .card > .list-group:first-child {
+ border-top-width: 0;
+ border-top-left-radius: var(--bs-card-inner-border-radius);
+ border-top-right-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card > .list-group:last-child {
+ border-bottom-width: 0;
+ border-bottom-right-radius: var(--bs-card-inner-border-radius);
+ border-bottom-left-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card > .card-header + .list-group,
+ .bodywebsite .card > .list-group + .card-footer {
+ border-top: 0;
+}
+
+.bodywebsite .card-body {
+ flex: 1 1 auto;
+ padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x);
+ color: var(--bs-card-color);
+}
+
+.bodywebsite .card-title {
+ margin-bottom: var(--bs-card-title-spacer-y);
+}
+
+.bodywebsite .card-subtitle {
+ margin-top: calc(-0.5 * var(--bs-card-title-spacer-y));
+ margin-bottom: 0;
+}
+
+.bodywebsite .card-text:last-child {
+ margin-bottom: 0;
+}
+
+.bodywebsite .card-link + .card-link {
+ margin-left: var(--bs-card-spacer-x);
+}
+
+.bodywebsite .card-header {
+ padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);
+ margin-bottom: 0;
+ color: var(--bs-card-cap-color);
+ background-color: var(--bs-card-cap-bg);
+ border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color);
+}
+
+.bodywebsite .card-header:first-child {
+ border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0;
+}
+
+.bodywebsite .card-footer {
+ padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);
+ color: var(--bs-card-cap-color);
+ background-color: var(--bs-card-cap-bg);
+ border-top: var(--bs-card-border-width) solid var(--bs-card-border-color);
+}
+
+.bodywebsite .card-footer:last-child {
+ border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card-header-tabs {
+ margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));
+ margin-bottom: calc(-1 * var(--bs-card-cap-padding-y));
+ margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));
+ border-bottom: 0;
+}
+
+.bodywebsite .card-header-tabs .nav-link.active {
+ background-color: var(--bs-card-bg);
+ border-bottom-color: var(--bs-card-bg);
+}
+
+.bodywebsite .card-header-pills {
+ margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));
+ margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));
+}
+
+.bodywebsite .card-img-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: var(--bs-card-img-overlay-padding);
+ border-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card-img,
+ .bodywebsite .card-img-top,
+ .bodywebsite .card-img-bottom {
+ width: 100%;
+}
+
+.bodywebsite .card-img,
+ .bodywebsite .card-img-top {
+ border-top-left-radius: var(--bs-card-inner-border-radius);
+ border-top-right-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card-img,
+ .bodywebsite .card-img-bottom {
+ border-bottom-right-radius: var(--bs-card-inner-border-radius);
+ border-bottom-left-radius: var(--bs-card-inner-border-radius);
+}
+
+.bodywebsite .card-group > .card {
+ margin-bottom: var(--bs-card-group-margin);
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .card-group {
+ display: flex;
+ flex-flow: row wrap;
+ }
+
+ .bodywebsite .card-group > .card {
+ flex: 1 0 0%;
+ margin-bottom: 0;
+ }
+
+ .bodywebsite .card-group > .card + .card {
+ margin-left: 0;
+ border-left: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:last-child) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:last-child) .card-img-top,
+ .bodywebsite .card-group > .card:not(:last-child) .card-header {
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:last-child) .card-img-bottom,
+ .bodywebsite .card-group > .card:not(:last-child) .card-footer {
+ border-bottom-right-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:first-child) .card-img-top,
+ .bodywebsite .card-group > .card:not(:first-child) .card-header {
+ border-top-left-radius: 0;
+ }
+
+ .bodywebsite .card-group > .card:not(:first-child) .card-img-bottom,
+ .bodywebsite .card-group > .card:not(:first-child) .card-footer {
+ border-bottom-left-radius: 0;
+ }
+}
+
+.bodywebsite .accordion {
+ --bs-accordion-color: var(--bs-body-color);
+ --bs-accordion-bg: #fff;
+ --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;
+ --bs-accordion-border-color: var(--bs-border-color);
+ --bs-accordion-border-width: 1px;
+ --bs-accordion-border-radius: 0.375rem;
+ --bs-accordion-inner-border-radius: calc(0.375rem - 1px);
+ --bs-accordion-btn-padding-x: 1.25rem;
+ --bs-accordion-btn-padding-y: 1rem;
+ --bs-accordion-btn-color: var(--bs-body-color);
+ --bs-accordion-btn-bg: var(--bs-accordion-bg);
+ --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='var%28--bs-body-color%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
+ --bs-accordion-btn-icon-width: 1.25rem;
+ --bs-accordion-btn-icon-transform: rotate(-180deg);
+ --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;
+ --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
+ --bs-accordion-btn-focus-border-color: #86b7fe;
+ --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+ --bs-accordion-body-padding-x: 1.25rem;
+ --bs-accordion-body-padding-y: 1rem;
+ --bs-accordion-active-color: #0c63e4;
+ --bs-accordion-active-bg: #e7f1ff;
+}
+
+.bodywebsite .accordion-button {
+ position: relative;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);
+ font-size: 1rem;
+ color: var(--bs-accordion-btn-color);
+ text-align: left;
+ background-color: var(--bs-accordion-btn-bg);
+ border: 0;
+ border-radius: 0;
+ overflow-anchor: none;
+ transition: var(--bs-accordion-transition);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .accordion-button {
+ transition: none;
+ }
+}
+
+.bodywebsite .accordion-button:not(.collapsed) {
+ color: var(--bs-accordion-active-color);
+ background-color: var(--bs-accordion-active-bg);
+ box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color);
+}
+
+.bodywebsite .accordion-button:not(.collapsed)::after {
+ background-image: var(--bs-accordion-btn-active-icon);
+ transform: var(--bs-accordion-btn-icon-transform);
+}
+
+.bodywebsite .accordion-button::after {
+ flex-shrink: 0;
+ width: var(--bs-accordion-btn-icon-width);
+ height: var(--bs-accordion-btn-icon-width);
+ margin-left: auto;
+ content: "";
+ background-image: var(--bs-accordion-btn-icon);
+ background-repeat: no-repeat;
+ background-size: var(--bs-accordion-btn-icon-width);
+ transition: var(--bs-accordion-btn-icon-transition);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .accordion-button::after {
+ transition: none;
+ }
+}
+
+.bodywebsite .accordion-button:hover {
+ z-index: 2;
+}
+
+.bodywebsite .accordion-button:focus {
+ z-index: 3;
+ border-color: var(--bs-accordion-btn-focus-border-color);
+ outline: 0;
+ box-shadow: var(--bs-accordion-btn-focus-box-shadow);
+}
+
+.bodywebsite .accordion-header {
+ margin-bottom: 0;
+}
+
+.bodywebsite .accordion-item {
+ color: var(--bs-accordion-color);
+ background-color: var(--bs-accordion-bg);
+ border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color);
+}
+
+.bodywebsite .accordion-item:first-of-type {
+ border-top-left-radius: var(--bs-accordion-border-radius);
+ border-top-right-radius: var(--bs-accordion-border-radius);
+}
+
+.bodywebsite .accordion-item:first-of-type .accordion-button {
+ border-top-left-radius: var(--bs-accordion-inner-border-radius);
+ border-top-right-radius: var(--bs-accordion-inner-border-radius);
+}
+
+.bodywebsite .accordion-item:not(:first-of-type) {
+ border-top: 0;
+}
+
+.bodywebsite .accordion-item:last-of-type {
+ border-bottom-right-radius: var(--bs-accordion-border-radius);
+ border-bottom-left-radius: var(--bs-accordion-border-radius);
+}
+
+.bodywebsite .accordion-item:last-of-type .accordion-button.collapsed {
+ border-bottom-right-radius: var(--bs-accordion-inner-border-radius);
+ border-bottom-left-radius: var(--bs-accordion-inner-border-radius);
+}
+
+.bodywebsite .accordion-item:last-of-type .accordion-collapse {
+ border-bottom-right-radius: var(--bs-accordion-border-radius);
+ border-bottom-left-radius: var(--bs-accordion-border-radius);
+}
+
+.bodywebsite .accordion-body {
+ padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x);
+}
+
+.bodywebsite .accordion-flush .accordion-collapse {
+ border-width: 0;
+}
+
+.bodywebsite .accordion-flush .accordion-item {
+ border-right: 0;
+ border-left: 0;
+ border-radius: 0;
+}
+
+.bodywebsite .accordion-flush .accordion-item:first-child {
+ border-top: 0;
+}
+
+.bodywebsite .accordion-flush .accordion-item:last-child {
+ border-bottom: 0;
+}
+
+.bodywebsite .accordion-flush .accordion-item .accordion-button, .bodywebsite .accordion-flush .accordion-item .accordion-button.collapsed {
+ border-radius: 0;
+}
+
+.bodywebsite .breadcrumb {
+ --bs-breadcrumb-padding-x: 0;
+ --bs-breadcrumb-padding-y: 0;
+ --bs-breadcrumb-margin-bottom: 1rem;
+ --bs-breadcrumb-divider-color: #6c757d;
+ --bs-breadcrumb-item-padding-x: 0.5rem;
+ --bs-breadcrumb-item-active-color: #6c757d;
+ display: flex;
+ flex-wrap: wrap;
+ padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);
+ margin-bottom: var(--bs-breadcrumb-margin-bottom);
+ font-size: var(--bs-breadcrumb-font-size);
+ list-style: none;
+ background-color: var(--bs-breadcrumb-bg);
+ border-radius: var(--bs-breadcrumb-border-radius);
+}
+
+.bodywebsite .breadcrumb-item + .breadcrumb-item {
+ padding-left: var(--bs-breadcrumb-item-padding-x);
+}
+
+.bodywebsite .breadcrumb-item + .breadcrumb-item::before {
+ float: left;
+ padding-right: var(--bs-breadcrumb-item-padding-x);
+ color: var(--bs-breadcrumb-divider-color);
+ content: var(--bs-breadcrumb-divider, "/");
+}
+
+.bodywebsite .breadcrumb-item.active {
+ color: var(--bs-breadcrumb-item-active-color);
+}
+
+.bodywebsite .pagination {
+ --bs-pagination-padding-x: 0.75rem;
+ --bs-pagination-padding-y: 0.375rem;
+ --bs-pagination-font-size: 1rem;
+ --bs-pagination-color: var(--bs-link-color);
+ --bs-pagination-bg: #fff;
+ --bs-pagination-border-width: 1px;
+ --bs-pagination-border-color: #dee2e6;
+ --bs-pagination-border-radius: 0.375rem;
+ --bs-pagination-hover-color: var(--bs-link-hover-color);
+ --bs-pagination-hover-bg: #e9ecef;
+ --bs-pagination-hover-border-color: #dee2e6;
+ --bs-pagination-focus-color: var(--bs-link-hover-color);
+ --bs-pagination-focus-bg: #e9ecef;
+ --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+ --bs-pagination-active-color: #fff;
+ --bs-pagination-active-bg: #0d6efd;
+ --bs-pagination-active-border-color: #0d6efd;
+ --bs-pagination-disabled-color: #6c757d;
+ --bs-pagination-disabled-bg: #fff;
+ --bs-pagination-disabled-border-color: #dee2e6;
+ display: flex;
+ padding-left: 0;
+ list-style: none;
+}
+
+.bodywebsite .page-link {
+ position: relative;
+ display: block;
+ padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);
+ font-size: var(--bs-pagination-font-size);
+ color: var(--bs-pagination-color);
+ text-decoration: none;
+ background-color: var(--bs-pagination-bg);
+ border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .page-link {
+ transition: none;
+ }
+}
+
+.bodywebsite .page-link:hover {
+ z-index: 2;
+ color: var(--bs-pagination-hover-color);
+ background-color: var(--bs-pagination-hover-bg);
+ border-color: var(--bs-pagination-hover-border-color);
+}
+
+.bodywebsite .page-link:focus {
+ z-index: 3;
+ color: var(--bs-pagination-focus-color);
+ background-color: var(--bs-pagination-focus-bg);
+ outline: 0;
+ box-shadow: var(--bs-pagination-focus-box-shadow);
+}
+
+.bodywebsite .page-link.active, .bodywebsite .active > .page-link {
+ z-index: 3;
+ color: var(--bs-pagination-active-color);
+ background-color: var(--bs-pagination-active-bg);
+ border-color: var(--bs-pagination-active-border-color);
+}
+
+.bodywebsite .page-link.disabled, .bodywebsite .disabled > .page-link {
+ color: var(--bs-pagination-disabled-color);
+ pointer-events: none;
+ background-color: var(--bs-pagination-disabled-bg);
+ border-color: var(--bs-pagination-disabled-border-color);
+}
+
+.bodywebsite .page-item:not(:first-child) .page-link {
+ margin-left: -1px;
+}
+
+.bodywebsite .page-item:first-child .page-link {
+ border-top-left-radius: var(--bs-pagination-border-radius);
+ border-bottom-left-radius: var(--bs-pagination-border-radius);
+}
+
+.bodywebsite .page-item:last-child .page-link {
+ border-top-right-radius: var(--bs-pagination-border-radius);
+ border-bottom-right-radius: var(--bs-pagination-border-radius);
+}
+
+.bodywebsite .pagination-lg {
+ --bs-pagination-padding-x: 1.5rem;
+ --bs-pagination-padding-y: 0.75rem;
+ --bs-pagination-font-size: 1.25rem;
+ --bs-pagination-border-radius: 0.5rem;
+}
+
+.bodywebsite .pagination-sm {
+ --bs-pagination-padding-x: 0.5rem;
+ --bs-pagination-padding-y: 0.25rem;
+ --bs-pagination-font-size: 0.875rem;
+ --bs-pagination-border-radius: 0.25rem;
+}
+
+.bodywebsite .badge {
+ --bs-badge-padding-x: 0.65em;
+ --bs-badge-padding-y: 0.35em;
+ --bs-badge-font-size: 0.75em;
+ --bs-badge-font-weight: 700;
+ --bs-badge-color: #fff;
+ --bs-badge-border-radius: 0.375rem;
+ display: inline-block;
+ padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x);
+ font-size: var(--bs-badge-font-size);
+ font-weight: var(--bs-badge-font-weight);
+ line-height: 1;
+ color: var(--bs-badge-color);
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: var(--bs-badge-border-radius);
+}
+
+.bodywebsite .badge:empty {
+ display: none;
+}
+
+.bodywebsite .btn .badge {
+ position: relative;
+ top: -1px;
+}
+
+.bodywebsite .alert {
+ --bs-alert-bg: transparent;
+ --bs-alert-padding-x: 1rem;
+ --bs-alert-padding-y: 1rem;
+ --bs-alert-margin-bottom: 1rem;
+ --bs-alert-color: inherit;
+ --bs-alert-border-color: transparent;
+ --bs-alert-border: 1px solid var(--bs-alert-border-color);
+ --bs-alert-border-radius: 0.375rem;
+ position: relative;
+ padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x);
+ margin-bottom: var(--bs-alert-margin-bottom);
+ color: var(--bs-alert-color);
+ background-color: var(--bs-alert-bg);
+ border: var(--bs-alert-border);
+ border-radius: var(--bs-alert-border-radius);
+}
+
+.bodywebsite .alert-heading {
+ color: inherit;
+}
+
+.bodywebsite .alert-link {
+ font-weight: 700;
+}
+
+.bodywebsite .alert-dismissible {
+ padding-right: 3rem;
+}
+
+.bodywebsite .alert-dismissible .btn-close {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 2;
+ padding: 1.25rem 1rem;
+}
+
+.bodywebsite .alert-primary {
+ --bs-alert-color: #084298;
+ --bs-alert-bg: #cfe2ff;
+ --bs-alert-border-color: #b6d4fe;
+}
+
+.bodywebsite .alert-primary .alert-link {
+ color: #06357a;
+}
+
+.bodywebsite .alert-secondary {
+ --bs-alert-color: #41464b;
+ --bs-alert-bg: #e2e3e5;
+ --bs-alert-border-color: #d3d6d8;
+}
+
+.bodywebsite .alert-secondary .alert-link {
+ color: #34383c;
+}
+
+.bodywebsite .alert-success {
+ --bs-alert-color: #0f5132;
+ --bs-alert-bg: #d1e7dd;
+ --bs-alert-border-color: #badbcc;
+}
+
+.bodywebsite .alert-success .alert-link {
+ color: #0c4128;
+}
+
+.bodywebsite .alert-info {
+ --bs-alert-color: #055160;
+ --bs-alert-bg: #cff4fc;
+ --bs-alert-border-color: #b6effb;
+}
+
+.bodywebsite .alert-info .alert-link {
+ color: #04414d;
+}
+
+.bodywebsite .alert-warning {
+ --bs-alert-color: #664d03;
+ --bs-alert-bg: #fff3cd;
+ --bs-alert-border-color: #ffecb5;
+}
+
+.bodywebsite .alert-warning .alert-link {
+ color: #523e02;
+}
+
+.bodywebsite .alert-danger {
+ --bs-alert-color: #842029;
+ --bs-alert-bg: #f8d7da;
+ --bs-alert-border-color: #f5c2c7;
+}
+
+.bodywebsite .alert-danger .alert-link {
+ color: #6a1a21;
+}
+
+.bodywebsite .alert-light {
+ --bs-alert-color: #636464;
+ --bs-alert-bg: #fefefe;
+ --bs-alert-border-color: #fdfdfe;
+}
+
+.bodywebsite .alert-light .alert-link {
+ color: #4f5050;
+}
+
+.bodywebsite .alert-dark {
+ --bs-alert-color: #141619;
+ --bs-alert-bg: #d3d3d4;
+ --bs-alert-border-color: #bcbebf;
+}
+
+.bodywebsite .alert-dark .alert-link {
+ color: #101214;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+ 0% {
+ background-position-x: 1rem;
+ }
+}
+
+@keyframes progress-bar-stripes {
+ 0% {
+ background-position-x: 1rem;
+ }
+}
+
+.bodywebsite .progress {
+ --bs-progress-height: 1rem;
+ --bs-progress-font-size: 0.75rem;
+ --bs-progress-bg: #e9ecef;
+ --bs-progress-border-radius: 0.375rem;
+ --bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);
+ --bs-progress-bar-color: #fff;
+ --bs-progress-bar-bg: #0d6efd;
+ --bs-progress-bar-transition: width 0.6s ease;
+ display: flex;
+ height: var(--bs-progress-height);
+ overflow: hidden;
+ font-size: var(--bs-progress-font-size);
+ background-color: var(--bs-progress-bg);
+ border-radius: var(--bs-progress-border-radius);
+}
+
+.bodywebsite .progress-bar {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ overflow: hidden;
+ color: var(--bs-progress-bar-color);
+ text-align: center;
+ white-space: nowrap;
+ background-color: var(--bs-progress-bar-bg);
+ transition: var(--bs-progress-bar-transition);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .progress-bar {
+ transition: none;
+ }
+}
+
+.bodywebsite .progress-bar-striped {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-size: var(--bs-progress-height) var(--bs-progress-height);
+}
+
+.bodywebsite .progress-bar-animated {
+ -webkit-animation: 1s linear infinite progress-bar-stripes;
+ animation: 1s linear infinite progress-bar-stripes;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .progress-bar-animated {
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+
+.bodywebsite .list-group {
+ --bs-list-group-color: #212529;
+ --bs-list-group-bg: #fff;
+ --bs-list-group-border-color: rgba(0, 0, 0, 0.125);
+ --bs-list-group-border-width: 1px;
+ --bs-list-group-border-radius: 0.375rem;
+ --bs-list-group-item-padding-x: 1rem;
+ --bs-list-group-item-padding-y: 0.5rem;
+ --bs-list-group-action-color: #495057;
+ --bs-list-group-action-hover-color: #495057;
+ --bs-list-group-action-hover-bg: #f8f9fa;
+ --bs-list-group-action-active-color: #212529;
+ --bs-list-group-action-active-bg: #e9ecef;
+ --bs-list-group-disabled-color: #6c757d;
+ --bs-list-group-disabled-bg: #fff;
+ --bs-list-group-active-color: #fff;
+ --bs-list-group-active-bg: #0d6efd;
+ --bs-list-group-active-border-color: #0d6efd;
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ border-radius: var(--bs-list-group-border-radius);
+}
+
+.bodywebsite .list-group-numbered {
+ list-style-type: none;
+ counter-reset: section;
+}
+
+.bodywebsite .list-group-numbered > .list-group-item::before {
+ content: counters(section, ".") ". ";
+ counter-increment: section;
+}
+
+.bodywebsite .list-group-item-action {
+ width: 100%;
+ color: var(--bs-list-group-action-color);
+ text-align: inherit;
+}
+
+.bodywebsite .list-group-item-action:hover, .bodywebsite .list-group-item-action:focus {
+ z-index: 1;
+ color: var(--bs-list-group-action-hover-color);
+ text-decoration: none;
+ background-color: var(--bs-list-group-action-hover-bg);
+}
+
+.bodywebsite .list-group-item-action:active {
+ color: var(--bs-list-group-action-active-color);
+ background-color: var(--bs-list-group-action-active-bg);
+}
+
+.bodywebsite .list-group-item {
+ position: relative;
+ display: block;
+ padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);
+ color: var(--bs-list-group-color);
+ text-decoration: none;
+ background-color: var(--bs-list-group-bg);
+ border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color);
+}
+
+.bodywebsite .list-group-item:first-child {
+ border-top-left-radius: inherit;
+ border-top-right-radius: inherit;
+}
+
+.bodywebsite .list-group-item:last-child {
+ border-bottom-right-radius: inherit;
+ border-bottom-left-radius: inherit;
+}
+
+.bodywebsite .list-group-item.disabled, .bodywebsite .list-group-item:disabled {
+ color: var(--bs-list-group-disabled-color);
+ pointer-events: none;
+ background-color: var(--bs-list-group-disabled-bg);
+}
+
+.bodywebsite .list-group-item.active {
+ z-index: 2;
+ color: var(--bs-list-group-active-color);
+ background-color: var(--bs-list-group-active-bg);
+ border-color: var(--bs-list-group-active-border-color);
+}
+
+.bodywebsite .list-group-item + .list-group-item {
+ border-top-width: 0;
+}
+
+.bodywebsite .list-group-item + .list-group-item.active {
+ margin-top: calc(-1 * var(--bs-list-group-border-width));
+ border-top-width: var(--bs-list-group-border-width);
+}
+
+.bodywebsite .list-group-horizontal {
+ flex-direction: row;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item.active {
+ margin-top: 0;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+}
+
+.bodywebsite .list-group-horizontal > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .list-group-horizontal-sm {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-sm > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .list-group-horizontal-md {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-md > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .list-group-horizontal-lg {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-lg > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .list-group-horizontal-xl {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xl > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .list-group-horizontal-xxl {
+ flex-direction: row;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item.active {
+ margin-top: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+
+ .bodywebsite .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+
+.bodywebsite .list-group-flush {
+ border-radius: 0;
+}
+
+.bodywebsite .list-group-flush > .list-group-item {
+ border-width: 0 0 var(--bs-list-group-border-width);
+}
+
+.bodywebsite .list-group-flush > .list-group-item:last-child {
+ border-bottom-width: 0;
+}
+
+.bodywebsite .list-group-item-primary {
+ color: #084298;
+ background-color: #cfe2ff;
+}
+
+.bodywebsite .list-group-item-primary.list-group-item-action:hover, .bodywebsite .list-group-item-primary.list-group-item-action:focus {
+ color: #084298;
+ background-color: #bacbe6;
+}
+
+.bodywebsite .list-group-item-primary.list-group-item-action.active {
+ color: #fff;
+ background-color: #084298;
+ border-color: #084298;
+}
+
+.bodywebsite .list-group-item-secondary {
+ color: #41464b;
+ background-color: #e2e3e5;
+}
+
+.bodywebsite .list-group-item-secondary.list-group-item-action:hover, .bodywebsite .list-group-item-secondary.list-group-item-action:focus {
+ color: #41464b;
+ background-color: #cbccce;
+}
+
+.bodywebsite .list-group-item-secondary.list-group-item-action.active {
+ color: #fff;
+ background-color: #41464b;
+ border-color: #41464b;
+}
+
+.bodywebsite .list-group-item-success {
+ color: #0f5132;
+ background-color: #d1e7dd;
+}
+
+.bodywebsite .list-group-item-success.list-group-item-action:hover, .bodywebsite .list-group-item-success.list-group-item-action:focus {
+ color: #0f5132;
+ background-color: #bcd0c7;
+}
+
+.bodywebsite .list-group-item-success.list-group-item-action.active {
+ color: #fff;
+ background-color: #0f5132;
+ border-color: #0f5132;
+}
+
+.bodywebsite .list-group-item-info {
+ color: #055160;
+ background-color: #cff4fc;
+}
+
+.bodywebsite .list-group-item-info.list-group-item-action:hover, .bodywebsite .list-group-item-info.list-group-item-action:focus {
+ color: #055160;
+ background-color: #badce3;
+}
+
+.bodywebsite .list-group-item-info.list-group-item-action.active {
+ color: #fff;
+ background-color: #055160;
+ border-color: #055160;
+}
+
+.bodywebsite .list-group-item-warning {
+ color: #664d03;
+ background-color: #fff3cd;
+}
+
+.bodywebsite .list-group-item-warning.list-group-item-action:hover, .bodywebsite .list-group-item-warning.list-group-item-action:focus {
+ color: #664d03;
+ background-color: #e6dbb9;
+}
+
+.bodywebsite .list-group-item-warning.list-group-item-action.active {
+ color: #fff;
+ background-color: #664d03;
+ border-color: #664d03;
+}
+
+.bodywebsite .list-group-item-danger {
+ color: #842029;
+ background-color: #f8d7da;
+}
+
+.bodywebsite .list-group-item-danger.list-group-item-action:hover, .bodywebsite .list-group-item-danger.list-group-item-action:focus {
+ color: #842029;
+ background-color: #dfc2c4;
+}
+
+.bodywebsite .list-group-item-danger.list-group-item-action.active {
+ color: #fff;
+ background-color: #842029;
+ border-color: #842029;
+}
+
+.bodywebsite .list-group-item-light {
+ color: #636464;
+ background-color: #fefefe;
+}
+
+.bodywebsite .list-group-item-light.list-group-item-action:hover, .bodywebsite .list-group-item-light.list-group-item-action:focus {
+ color: #636464;
+ background-color: #e5e5e5;
+}
+
+.bodywebsite .list-group-item-light.list-group-item-action.active {
+ color: #fff;
+ background-color: #636464;
+ border-color: #636464;
+}
+
+.bodywebsite .list-group-item-dark {
+ color: #141619;
+ background-color: #d3d3d4;
+}
+
+.bodywebsite .list-group-item-dark.list-group-item-action:hover, .bodywebsite .list-group-item-dark.list-group-item-action:focus {
+ color: #141619;
+ background-color: #bebebf;
+}
+
+.bodywebsite .list-group-item-dark.list-group-item-action.active {
+ color: #fff;
+ background-color: #141619;
+ border-color: #141619;
+}
+
+.bodywebsite .btn-close {
+ box-sizing: content-box;
+ width: 1em;
+ height: 1em;
+ padding: 0.25em 0.25em;
+ color: #000;
+ background: transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;
+ border: 0;
+ border-radius: 0.375rem;
+ opacity: 0.5;
+}
+
+.bodywebsite .btn-close:hover {
+ color: #000;
+ text-decoration: none;
+ opacity: 0.75;
+}
+
+.bodywebsite .btn-close:focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+ opacity: 1;
+}
+
+.bodywebsite .btn-close:disabled, .bodywebsite .btn-close.disabled {
+ pointer-events: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ opacity: 0.25;
+}
+
+.bodywebsite .btn-close-white {
+ filter: invert(1) grayscale(100%) brightness(200%);
+}
+
+.bodywebsite .toast {
+ --bs-toast-zindex: 1090;
+ --bs-toast-padding-x: 0.75rem;
+ --bs-toast-padding-y: 0.5rem;
+ --bs-toast-spacing: 1.5rem;
+ --bs-toast-max-width: 350px;
+ --bs-toast-font-size: 0.875rem;
+ --bs-toast-bg: rgba(255, 255, 255, 0.85);
+ --bs-toast-border-width: 1px;
+ --bs-toast-border-color: var(--bs-border-color-translucent);
+ --bs-toast-border-radius: 0.375rem;
+ --bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ --bs-toast-header-color: #6c757d;
+ --bs-toast-header-bg: rgba(255, 255, 255, 0.85);
+ --bs-toast-header-border-color: rgba(0, 0, 0, 0.05);
+ width: var(--bs-toast-max-width);
+ max-width: 100%;
+ font-size: var(--bs-toast-font-size);
+ color: var(--bs-toast-color);
+ pointer-events: auto;
+ background-color: var(--bs-toast-bg);
+ background-clip: padding-box;
+ border: var(--bs-toast-border-width) solid var(--bs-toast-border-color);
+ box-shadow: var(--bs-toast-box-shadow);
+ border-radius: var(--bs-toast-border-radius);
+}
+
+.bodywebsite .toast.showing {
+ opacity: 0;
+}
+
+.bodywebsite .toast:not(.show) {
+ display: none;
+}
+
+.bodywebsite .toast-container {
+ position: absolute;
+ z-index: var(--bs-toast-zindex);
+ width: -webkit-max-content;
+ width: -moz-max-content;
+ width: max-content;
+ max-width: 100%;
+ pointer-events: none;
+}
+
+.bodywebsite .toast-container > :not(:last-child) {
+ margin-bottom: var(--bs-toast-spacing);
+}
+
+.bodywebsite .toast-header {
+ display: flex;
+ align-items: center;
+ padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x);
+ color: var(--bs-toast-header-color);
+ background-color: var(--bs-toast-header-bg);
+ background-clip: padding-box;
+ border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);
+ border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));
+ border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));
+}
+
+.bodywebsite .toast-header .btn-close {
+ margin-right: calc(-0.5 * var(--bs-toast-padding-x));
+ margin-left: var(--bs-toast-padding-x);
+}
+
+.bodywebsite .toast-body {
+ padding: var(--bs-toast-padding-x);
+ word-wrap: break-word;
+}
+
+.bodywebsite .modal {
+ --bs-modal-zindex: 1055;
+ --bs-modal-width: 500px;
+ --bs-modal-padding: 1rem;
+ --bs-modal-margin: 0.5rem;
+ --bs-modal-bg: #fff;
+ --bs-modal-border-color: var(--bs-border-color-translucent);
+ --bs-modal-border-width: 1px;
+ --bs-modal-border-radius: 0.5rem;
+ --bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
+ --bs-modal-inner-border-radius: calc(0.5rem - 1px);
+ --bs-modal-header-padding-x: 1rem;
+ --bs-modal-header-padding-y: 1rem;
+ --bs-modal-header-padding: 1rem 1rem;
+ --bs-modal-header-border-color: var(--bs-border-color);
+ --bs-modal-header-border-width: 1px;
+ --bs-modal-title-line-height: 1.5;
+ --bs-modal-footer-gap: 0.5rem;
+ --bs-modal-footer-border-color: var(--bs-border-color);
+ --bs-modal-footer-border-width: 1px;
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: var(--bs-modal-zindex);
+ display: none;
+ width: 100%;
+ height: 100%;
+ overflow-x: hidden;
+ overflow-y: auto;
+ outline: 0;
+}
+
+.bodywebsite .modal-dialog {
+ position: relative;
+ width: auto;
+ margin: var(--bs-modal-margin);
+ pointer-events: none;
+}
+
+.bodywebsite .modal.fade .modal-dialog {
+ transition: transform 0.3s ease-out;
+ transform: translate(0, -50px);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .modal.fade .modal-dialog {
+ transition: none;
+ }
+}
+
+.bodywebsite .modal.show .modal-dialog {
+ transform: none;
+}
+
+.bodywebsite .modal.modal-static .modal-dialog {
+ transform: scale(1.02);
+}
+
+.bodywebsite .modal-dialog-scrollable {
+ height: calc(100% - var(--bs-modal-margin) * 2);
+}
+
+.bodywebsite .modal-dialog-scrollable .modal-content {
+ max-height: 100%;
+ overflow: hidden;
+}
+
+.bodywebsite .modal-dialog-scrollable .modal-body {
+ overflow-y: auto;
+}
+
+.bodywebsite .modal-dialog-centered {
+ display: flex;
+ align-items: center;
+ min-height: calc(100% - var(--bs-modal-margin) * 2);
+}
+
+.bodywebsite .modal-content {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ color: var(--bs-modal-color);
+ pointer-events: auto;
+ background-color: var(--bs-modal-bg);
+ background-clip: padding-box;
+ border: var(--bs-modal-border-width) solid var(--bs-modal-border-color);
+ border-radius: var(--bs-modal-border-radius);
+ outline: 0;
+}
+
+.bodywebsite .modal-backdrop {
+ --bs-backdrop-zindex: 1050;
+ --bs-backdrop-bg: #000;
+ --bs-backdrop-opacity: 0.5;
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: var(--bs-backdrop-zindex);
+ width: 100vw;
+ height: 100vh;
+ background-color: var(--bs-backdrop-bg);
+}
+
+.bodywebsite .modal-backdrop.fade {
+ opacity: 0;
+}
+
+.bodywebsite .modal-backdrop.show {
+ opacity: var(--bs-backdrop-opacity);
+}
+
+.bodywebsite .modal-header {
+ display: flex;
+ flex-shrink: 0;
+ align-items: center;
+ justify-content: space-between;
+ padding: var(--bs-modal-header-padding);
+ border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);
+ border-top-left-radius: var(--bs-modal-inner-border-radius);
+ border-top-right-radius: var(--bs-modal-inner-border-radius);
+}
+
+.bodywebsite .modal-header .btn-close {
+ padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5);
+ margin: calc(-0.5 * var(--bs-modal-header-padding-y)) calc(-0.5 * var(--bs-modal-header-padding-x)) calc(-0.5 * var(--bs-modal-header-padding-y)) auto;
+}
+
+.bodywebsite .modal-title {
+ margin-bottom: 0;
+ line-height: var(--bs-modal-title-line-height);
+}
+
+.bodywebsite .modal-body {
+ position: relative;
+ flex: 1 1 auto;
+ padding: var(--bs-modal-padding);
+}
+
+.bodywebsite .modal-footer {
+ display: flex;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: flex-end;
+ padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5);
+ background-color: var(--bs-modal-footer-bg);
+ border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);
+ border-bottom-right-radius: var(--bs-modal-inner-border-radius);
+ border-bottom-left-radius: var(--bs-modal-inner-border-radius);
+}
+
+.bodywebsite .modal-footer > * {
+ margin: calc(var(--bs-modal-footer-gap) * 0.5);
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .modal {
+ --bs-modal-margin: 1.75rem;
+ --bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ }
+
+ .bodywebsite .modal-dialog {
+ max-width: var(--bs-modal-width);
+ margin-right: auto;
+ margin-left: auto;
+ }
+
+ .bodywebsite .modal-sm {
+ --bs-modal-width: 300px;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .modal-lg,
+ .bodywebsite .modal-xl {
+ --bs-modal-width: 800px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .modal-xl {
+ --bs-modal-width: 1140px;
+ }
+}
+
+.bodywebsite .modal-fullscreen {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+}
+
+.bodywebsite .modal-fullscreen .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+}
+
+.bodywebsite .modal-fullscreen .modal-header,
+ .bodywebsite .modal-fullscreen .modal-footer {
+ border-radius: 0;
+}
+
+.bodywebsite .modal-fullscreen .modal-body {
+ overflow-y: auto;
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .modal-fullscreen-sm-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-sm-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-sm-down .modal-header,
+ .bodywebsite .modal-fullscreen-sm-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-sm-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .modal-fullscreen-md-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-md-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-md-down .modal-header,
+ .bodywebsite .modal-fullscreen-md-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-md-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .modal-fullscreen-lg-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-lg-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-lg-down .modal-header,
+ .bodywebsite .modal-fullscreen-lg-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-lg-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .modal-fullscreen-xl-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xl-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xl-down .modal-header,
+ .bodywebsite .modal-fullscreen-xl-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xl-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .modal-fullscreen-xxl-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xxl-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xxl-down .modal-header,
+ .bodywebsite .modal-fullscreen-xxl-down .modal-footer {
+ border-radius: 0;
+ }
+
+ .bodywebsite .modal-fullscreen-xxl-down .modal-body {
+ overflow-y: auto;
+ }
+}
+
+.bodywebsite .tooltip {
+ --bs-tooltip-zindex: 1080;
+ --bs-tooltip-max-width: 200px;
+ --bs-tooltip-padding-x: 0.5rem;
+ --bs-tooltip-padding-y: 0.25rem;
+ --bs-tooltip-font-size: 0.875rem;
+ --bs-tooltip-color: #fff;
+ --bs-tooltip-bg: #000;
+ --bs-tooltip-border-radius: 0.375rem;
+ --bs-tooltip-opacity: 0.9;
+ --bs-tooltip-arrow-width: 0.8rem;
+ --bs-tooltip-arrow-height: 0.4rem;
+ z-index: var(--bs-tooltip-zindex);
+ display: block;
+ padding: var(--bs-tooltip-arrow-height);
+ margin: var(--bs-tooltip-margin);
+ font-family: var(--bs-font-sans-serif);
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.5;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ white-space: normal;
+ word-spacing: normal;
+ line-break: auto;
+ font-size: var(--bs-tooltip-font-size);
+ word-wrap: break-word;
+ opacity: 0;
+}
+
+.bodywebsite .tooltip.show {
+ opacity: var(--bs-tooltip-opacity);
+}
+
+.bodywebsite .tooltip .tooltip-arrow {
+ display: block;
+ width: var(--bs-tooltip-arrow-width);
+ height: var(--bs-tooltip-arrow-height);
+}
+
+.bodywebsite .tooltip .tooltip-arrow::before {
+ position: absolute;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+}
+
+.bodywebsite .bs-tooltip-top .tooltip-arrow, .bodywebsite .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {
+ bottom: 0;
+}
+
+.bodywebsite .bs-tooltip-top .tooltip-arrow::before, .bodywebsite .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {
+ top: -1px;
+ border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;
+ border-top-color: var(--bs-tooltip-bg);
+}
+
+.bodywebsite .bs-tooltip-end .tooltip-arrow, .bodywebsite .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {
+ left: 0;
+ width: var(--bs-tooltip-arrow-height);
+ height: var(--bs-tooltip-arrow-width);
+}
+
+.bodywebsite .bs-tooltip-end .tooltip-arrow::before, .bodywebsite .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {
+ right: -1px;
+ border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;
+ border-right-color: var(--bs-tooltip-bg);
+}
+
+.bodywebsite .bs-tooltip-bottom .tooltip-arrow, .bodywebsite .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {
+ top: 0;
+}
+
+.bodywebsite .bs-tooltip-bottom .tooltip-arrow::before, .bodywebsite .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {
+ bottom: -1px;
+ border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);
+ border-bottom-color: var(--bs-tooltip-bg);
+}
+
+.bodywebsite .bs-tooltip-start .tooltip-arrow, .bodywebsite .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {
+ right: 0;
+ width: var(--bs-tooltip-arrow-height);
+ height: var(--bs-tooltip-arrow-width);
+}
+
+.bodywebsite .bs-tooltip-start .tooltip-arrow::before, .bodywebsite .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {
+ left: -1px;
+ border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);
+ border-left-color: var(--bs-tooltip-bg);
+}
+
+.bodywebsite .tooltip-inner {
+ max-width: var(--bs-tooltip-max-width);
+ padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);
+ color: var(--bs-tooltip-color);
+ text-align: center;
+ background-color: var(--bs-tooltip-bg);
+ border-radius: var(--bs-tooltip-border-radius);
+}
+
+.bodywebsite .popover {
+ --bs-popover-zindex: 1070;
+ --bs-popover-max-width: 276px;
+ --bs-popover-font-size: 0.875rem;
+ --bs-popover-bg: #fff;
+ --bs-popover-border-width: 1px;
+ --bs-popover-border-color: var(--bs-border-color-translucent);
+ --bs-popover-border-radius: 0.5rem;
+ --bs-popover-inner-border-radius: calc(0.5rem - 1px);
+ --bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ --bs-popover-header-padding-x: 1rem;
+ --bs-popover-header-padding-y: 0.5rem;
+ --bs-popover-header-font-size: 1rem;
+ --bs-popover-header-bg: #f0f0f0;
+ --bs-popover-body-padding-x: 1rem;
+ --bs-popover-body-padding-y: 1rem;
+ --bs-popover-body-color: #212529;
+ --bs-popover-arrow-width: 1rem;
+ --bs-popover-arrow-height: 0.5rem;
+ --bs-popover-arrow-border: var(--bs-popover-border-color);
+ z-index: var(--bs-popover-zindex);
+ display: block;
+ max-width: var(--bs-popover-max-width);
+ font-family: var(--bs-font-sans-serif);
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.5;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ white-space: normal;
+ word-spacing: normal;
+ line-break: auto;
+ font-size: var(--bs-popover-font-size);
+ word-wrap: break-word;
+ background-color: var(--bs-popover-bg);
+ background-clip: padding-box;
+ border: var(--bs-popover-border-width) solid var(--bs-popover-border-color);
+ border-radius: var(--bs-popover-border-radius);
+}
+
+.bodywebsite .popover .popover-arrow {
+ display: block;
+ width: var(--bs-popover-arrow-width);
+ height: var(--bs-popover-arrow-height);
+}
+
+.bodywebsite .popover .popover-arrow::before, .bodywebsite .popover .popover-arrow::after {
+ position: absolute;
+ display: block;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+ border-width: 0;
+}
+
+.bodywebsite .bs-popover-top > .popover-arrow, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {
+ bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+}
+
+.bodywebsite .bs-popover-top > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bodywebsite .bs-popover-top > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {
+ border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;
+}
+
+.bodywebsite .bs-popover-top > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {
+ bottom: 0;
+ border-top-color: var(--bs-popover-arrow-border);
+}
+
+.bodywebsite .bs-popover-top > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {
+ bottom: var(--bs-popover-border-width);
+ border-top-color: var(--bs-popover-bg);
+}
+
+.bodywebsite .bs-popover-end > .popover-arrow, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {
+ left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+ width: var(--bs-popover-arrow-height);
+ height: var(--bs-popover-arrow-width);
+}
+
+.bodywebsite .bs-popover-end > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bodywebsite .bs-popover-end > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {
+ border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;
+}
+
+.bodywebsite .bs-popover-end > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {
+ left: 0;
+ border-right-color: var(--bs-popover-arrow-border);
+}
+
+.bodywebsite .bs-popover-end > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {
+ left: var(--bs-popover-border-width);
+ border-right-color: var(--bs-popover-bg);
+}
+
+.bodywebsite .bs-popover-bottom > .popover-arrow, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {
+ top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+}
+
+.bodywebsite .bs-popover-bottom > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bodywebsite .bs-popover-bottom > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {
+ border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);
+}
+
+.bodywebsite .bs-popover-bottom > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {
+ top: 0;
+ border-bottom-color: var(--bs-popover-arrow-border);
+}
+
+.bodywebsite .bs-popover-bottom > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {
+ top: var(--bs-popover-border-width);
+ border-bottom-color: var(--bs-popover-bg);
+}
+
+.bodywebsite .bs-popover-bottom .popover-header::before, .bodywebsite .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ display: block;
+ width: var(--bs-popover-arrow-width);
+ margin-left: calc(-0.5 * var(--bs-popover-arrow-width));
+ content: "";
+ border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg);
+}
+
+.bodywebsite .bs-popover-start > .popover-arrow, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {
+ right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+ width: var(--bs-popover-arrow-height);
+ height: var(--bs-popover-arrow-width);
+}
+
+.bodywebsite .bs-popover-start > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bodywebsite .bs-popover-start > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {
+ border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);
+}
+
+.bodywebsite .bs-popover-start > .popover-arrow::before, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {
+ right: 0;
+ border-left-color: var(--bs-popover-arrow-border);
+}
+
+.bodywebsite .bs-popover-start > .popover-arrow::after, .bodywebsite .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {
+ right: var(--bs-popover-border-width);
+ border-left-color: var(--bs-popover-bg);
+}
+
+.bodywebsite .popover-header {
+ padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);
+ margin-bottom: 0;
+ font-size: var(--bs-popover-header-font-size);
+ color: var(--bs-popover-header-color);
+ background-color: var(--bs-popover-header-bg);
+ border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color);
+ border-top-left-radius: var(--bs-popover-inner-border-radius);
+ border-top-right-radius: var(--bs-popover-inner-border-radius);
+}
+
+.bodywebsite .popover-header:empty {
+ display: none;
+}
+
+.bodywebsite .popover-body {
+ padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);
+ color: var(--bs-popover-body-color);
+}
+
+.bodywebsite .carousel {
+ position: relative;
+}
+
+.bodywebsite .carousel.pointer-event {
+ touch-action: pan-y;
+}
+
+.bodywebsite .carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden;
+}
+
+.bodywebsite .carousel-inner::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+
+.bodywebsite .carousel-item {
+ position: relative;
+ display: none;
+ float: left;
+ width: 100%;
+ margin-right: -100%;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ transition: transform 0.6s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .carousel-item {
+ transition: none;
+ }
+}
+
+.bodywebsite .carousel-item.active,
+ .bodywebsite .carousel-item-next,
+ .bodywebsite .carousel-item-prev {
+ display: block;
+}
+
+.bodywebsite .carousel-item-next:not(.carousel-item-start),
+ .bodywebsite .active.carousel-item-end {
+ transform: translateX(100%);
+}
+
+.bodywebsite .carousel-item-prev:not(.carousel-item-end),
+ .bodywebsite .active.carousel-item-start {
+ transform: translateX(-100%);
+}
+
+.bodywebsite .carousel-fade .carousel-item {
+ opacity: 0;
+ transition-property: opacity;
+ transform: none;
+}
+
+.bodywebsite .carousel-fade .carousel-item.active,
+ .bodywebsite .carousel-fade .carousel-item-next.carousel-item-start,
+ .bodywebsite .carousel-fade .carousel-item-prev.carousel-item-end {
+ z-index: 1;
+ opacity: 1;
+}
+
+.bodywebsite .carousel-fade .active.carousel-item-start,
+ .bodywebsite .carousel-fade .active.carousel-item-end {
+ z-index: 0;
+ opacity: 0;
+ transition: opacity 0s 0.6s;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .carousel-fade .active.carousel-item-start,
+ .bodywebsite .carousel-fade .active.carousel-item-end {
+ transition: none;
+ }
+}
+
+.bodywebsite .carousel-control-prev,
+ .bodywebsite .carousel-control-next {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 15%;
+ padding: 0;
+ color: #fff;
+ text-align: center;
+ background: none;
+ border: 0;
+ opacity: 0.5;
+ transition: opacity 0.15s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .carousel-control-prev,
+ .bodywebsite .carousel-control-next {
+ transition: none;
+ }
+}
+
+.bodywebsite .carousel-control-prev:hover, .bodywebsite .carousel-control-prev:focus,
+ .bodywebsite .carousel-control-next:hover,
+ .bodywebsite .carousel-control-next:focus {
+ color: #fff;
+ text-decoration: none;
+ outline: 0;
+ opacity: 0.9;
+}
+
+.bodywebsite .carousel-control-prev {
+ left: 0;
+}
+
+.bodywebsite .carousel-control-next {
+ right: 0;
+}
+
+.bodywebsite .carousel-control-prev-icon,
+ .bodywebsite .carousel-control-next-icon {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ background-repeat: no-repeat;
+ background-position: 50%;
+ background-size: 100% 100%;
+}
+
+.bodywebsite .carousel-control-prev-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .carousel-control-next-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
+}
+
+.bodywebsite .carousel-indicators {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 2;
+ display: flex;
+ justify-content: center;
+ padding: 0;
+ margin-right: 15%;
+ margin-bottom: 1rem;
+ margin-left: 15%;
+ list-style: none;
+}
+
+.bodywebsite .carousel-indicators [data-bs-target] {
+ box-sizing: content-box;
+ flex: 0 1 auto;
+ width: 30px;
+ height: 3px;
+ padding: 0;
+ margin-right: 3px;
+ margin-left: 3px;
+ text-indent: -999px;
+ cursor: pointer;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 0;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ opacity: 0.5;
+ transition: opacity 0.6s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .carousel-indicators [data-bs-target] {
+ transition: none;
+ }
+}
+
+.bodywebsite .carousel-indicators .active {
+ opacity: 1;
+}
+
+.bodywebsite .carousel-caption {
+ position: absolute;
+ right: 15%;
+ bottom: 1.25rem;
+ left: 15%;
+ padding-top: 1.25rem;
+ padding-bottom: 1.25rem;
+ color: #fff;
+ text-align: center;
+}
+
+.bodywebsite .carousel-dark .carousel-control-prev-icon,
+ .bodywebsite .carousel-dark .carousel-control-next-icon {
+ filter: invert(1) grayscale(100);
+}
+
+.bodywebsite .carousel-dark .carousel-indicators [data-bs-target] {
+ background-color: #000;
+}
+
+.bodywebsite .carousel-dark .carousel-caption {
+ color: #000;
+}
+
+.bodywebsite .spinner-grow,
+ .bodywebsite .spinner-border {
+ display: inline-block;
+ width: var(--bs-spinner-width);
+ height: var(--bs-spinner-height);
+ vertical-align: var(--bs-spinner-vertical-align);
+ border-radius: 50%;
+ -webkit-animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);
+ animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);
+}
+
+@-webkit-keyframes spinner-border {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes spinner-border {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+.bodywebsite .spinner-border {
+ --bs-spinner-width: 2rem;
+ --bs-spinner-height: 2rem;
+ --bs-spinner-vertical-align: -0.125em;
+ --bs-spinner-border-width: 0.25em;
+ --bs-spinner-animation-speed: 0.75s;
+ --bs-spinner-animation-name: spinner-border;
+ border: var(--bs-spinner-border-width) solid currentcolor;
+ border-right-color: transparent;
+}
+
+.bodywebsite .spinner-border-sm {
+ --bs-spinner-width: 1rem;
+ --bs-spinner-height: 1rem;
+ --bs-spinner-border-width: 0.2em;
+}
+
+@-webkit-keyframes spinner-grow {
+ 0% {
+ transform: scale(0);
+ }
+
+ 50% {
+ opacity: 1;
+ transform: none;
+ }
+}
+
+@keyframes spinner-grow {
+ 0% {
+ transform: scale(0);
+ }
+
+ 50% {
+ opacity: 1;
+ transform: none;
+ }
+}
+
+.bodywebsite .spinner-grow {
+ --bs-spinner-width: 2rem;
+ --bs-spinner-height: 2rem;
+ --bs-spinner-vertical-align: -0.125em;
+ --bs-spinner-animation-speed: 0.75s;
+ --bs-spinner-animation-name: spinner-grow;
+ background-color: currentcolor;
+ opacity: 0;
+}
+
+.bodywebsite .spinner-grow-sm {
+ --bs-spinner-width: 1rem;
+ --bs-spinner-height: 1rem;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .spinner-border,
+ .bodywebsite .spinner-grow {
+ --bs-spinner-animation-speed: 1.5s;
+ }
+}
+
+.bodywebsite .offcanvas, .bodywebsite .offcanvas-xxl, .bodywebsite .offcanvas-xl, .bodywebsite .offcanvas-lg, .bodywebsite .offcanvas-md, .bodywebsite .offcanvas-sm {
+ --bs-offcanvas-zindex: 1045;
+ --bs-offcanvas-width: 400px;
+ --bs-offcanvas-height: 30vh;
+ --bs-offcanvas-padding-x: 1rem;
+ --bs-offcanvas-padding-y: 1rem;
+ --bs-offcanvas-bg: #fff;
+ --bs-offcanvas-border-width: 1px;
+ --bs-offcanvas-border-color: var(--bs-border-color-translucent);
+ --bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-sm {
+ transition: none;
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.showing, .bodywebsite .offcanvas-sm.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 575.98px) {
+ .bodywebsite .offcanvas-sm.showing, .bodywebsite .offcanvas-sm.hiding, .bodywebsite .offcanvas-sm.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .offcanvas-sm {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-sm .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-sm .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-md {
+ transition: none;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.showing, .bodywebsite .offcanvas-md.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bodywebsite .offcanvas-md.showing, .bodywebsite .offcanvas-md.hiding, .bodywebsite .offcanvas-md.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .offcanvas-md {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-md .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-md .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-lg {
+ transition: none;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.showing, .bodywebsite .offcanvas-lg.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bodywebsite .offcanvas-lg.showing, .bodywebsite .offcanvas-lg.hiding, .bodywebsite .offcanvas-lg.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .offcanvas-lg {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-lg .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-lg .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-xl {
+ transition: none;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.showing, .bodywebsite .offcanvas-xl.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .bodywebsite .offcanvas-xl.showing, .bodywebsite .offcanvas-xl.hiding, .bodywebsite .offcanvas-xl.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .offcanvas-xl {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-xl .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-xl .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+ }
+}
+
+@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas-xxl {
+ transition: none;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.showing, .bodywebsite .offcanvas-xxl.show:not(.hiding) {
+ transform: none;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .bodywebsite .offcanvas-xxl.showing, .bodywebsite .offcanvas-xxl.hiding, .bodywebsite .offcanvas-xxl.show {
+ visibility: visible;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .offcanvas-xxl {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+
+ .bodywebsite .offcanvas-xxl .offcanvas-header {
+ display: none;
+ }
+
+ .bodywebsite .offcanvas-xxl .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+.bodywebsite .offcanvas {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bodywebsite .offcanvas {
+ transition: none;
+ }
+}
+
+.bodywebsite .offcanvas.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+}
+
+.bodywebsite .offcanvas.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+}
+
+.bodywebsite .offcanvas.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+}
+
+.bodywebsite .offcanvas.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+}
+
+.bodywebsite .offcanvas.showing, .bodywebsite .offcanvas.show:not(.hiding) {
+ transform: none;
+}
+
+.bodywebsite .offcanvas.showing, .bodywebsite .offcanvas.hiding, .bodywebsite .offcanvas.show {
+ visibility: visible;
+}
+
+.bodywebsite .offcanvas-backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1040;
+ width: 100vw;
+ height: 100vh;
+ background-color: #000;
+}
+
+.bodywebsite .offcanvas-backdrop.fade {
+ opacity: 0;
+}
+
+.bodywebsite .offcanvas-backdrop.show {
+ opacity: 0.5;
+}
+
+.bodywebsite .offcanvas-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);
+}
+
+.bodywebsite .offcanvas-header .btn-close {
+ padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5);
+ margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y));
+ margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x));
+ margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y));
+}
+
+.bodywebsite .offcanvas-title {
+ margin-bottom: 0;
+ line-height: 1.5;
+}
+
+.bodywebsite .offcanvas-body {
+ flex-grow: 1;
+ padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);
+ overflow-y: auto;
+}
+
+.bodywebsite .placeholder {
+ display: inline-block;
+ min-height: 1em;
+ vertical-align: middle;
+ cursor: wait;
+ background-color: currentcolor;
+ opacity: 0.5;
+}
+
+.bodywebsite .placeholder.btn::before {
+ display: inline-block;
+ content: "";
+}
+
+.bodywebsite .placeholder-xs {
+ min-height: 0.6em;
+}
+
+.bodywebsite .placeholder-sm {
+ min-height: 0.8em;
+}
+
+.bodywebsite .placeholder-lg {
+ min-height: 1.2em;
+}
+
+.bodywebsite .placeholder-glow .placeholder {
+ -webkit-animation: placeholder-glow 2s ease-in-out infinite;
+ animation: placeholder-glow 2s ease-in-out infinite;
+}
+
+@-webkit-keyframes placeholder-glow {
+ 50% {
+ opacity: 0.2;
+ }
+}
+
+@keyframes placeholder-glow {
+ 50% {
+ opacity: 0.2;
+ }
+}
+
+.bodywebsite .placeholder-wave {
+ -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);
+ mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);
+ -webkit-mask-size: 200% 100%;
+ mask-size: 200% 100%;
+ -webkit-animation: placeholder-wave 2s linear infinite;
+ animation: placeholder-wave 2s linear infinite;
+}
+
+@-webkit-keyframes placeholder-wave {
+ 100% {
+ -webkit-mask-position: -200% 0%;
+ mask-position: -200% 0%;
+ }
+}
+
+@keyframes placeholder-wave {
+ 100% {
+ -webkit-mask-position: -200% 0%;
+ mask-position: -200% 0%;
+ }
+}
+
+.bodywebsite .clearfix::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+
+.bodywebsite .text-bg-primary {
+ color: #fff !important;
+ background-color: RGBA(13, 110, 253, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-secondary {
+ color: #fff !important;
+ background-color: RGBA(108, 117, 125, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-success {
+ color: #fff !important;
+ background-color: RGBA(25, 135, 84, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-info {
+ color: #000 !important;
+ background-color: RGBA(13, 202, 240, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-warning {
+ color: #000 !important;
+ background-color: RGBA(255, 193, 7, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-danger {
+ color: #fff !important;
+ background-color: RGBA(220, 53, 69, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-light {
+ color: #000 !important;
+ background-color: RGBA(248, 249, 250, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .text-bg-dark {
+ color: #fff !important;
+ background-color: RGBA(33, 37, 41, var(--bs-bg-opacity, 1)) !important;
+}
+
+.bodywebsite .link-primary {
+ color: #0d6efd !important;
+}
+
+.bodywebsite .link-primary:hover, .bodywebsite .link-primary:focus {
+ color: #0a58ca !important;
+}
+
+.bodywebsite .link-secondary {
+ color: #6c757d !important;
+}
+
+.bodywebsite .link-secondary:hover, .bodywebsite .link-secondary:focus {
+ color: #565e64 !important;
+}
+
+.bodywebsite .link-success {
+ color: #198754 !important;
+}
+
+.bodywebsite .link-success:hover, .bodywebsite .link-success:focus {
+ color: #146c43 !important;
+}
+
+.bodywebsite .link-info {
+ color: #0dcaf0 !important;
+}
+
+.bodywebsite .link-info:hover, .bodywebsite .link-info:focus {
+ color: #3dd5f3 !important;
+}
+
+.bodywebsite .link-warning {
+ color: #ffc107 !important;
+}
+
+.bodywebsite .link-warning:hover, .bodywebsite .link-warning:focus {
+ color: #ffcd39 !important;
+}
+
+.bodywebsite .link-danger {
+ color: #dc3545 !important;
+}
+
+.bodywebsite .link-danger:hover, .bodywebsite .link-danger:focus {
+ color: #b02a37 !important;
+}
+
+.bodywebsite .link-light {
+ color: #f8f9fa !important;
+}
+
+.bodywebsite .link-light:hover, .bodywebsite .link-light:focus {
+ color: #f9fafb !important;
+}
+
+.bodywebsite .link-dark {
+ color: #212529 !important;
+}
+
+.bodywebsite .link-dark:hover, .bodywebsite .link-dark:focus {
+ color: #1a1e21 !important;
+}
+
+.bodywebsite .ratio {
+ position: relative;
+ width: 100%;
+}
+
+.bodywebsite .ratio::before {
+ display: block;
+ padding-top: var(--bs-aspect-ratio);
+ content: "";
+}
+
+.bodywebsite .ratio > * {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+
+.bodywebsite .ratio-1x1 {
+ --bs-aspect-ratio: 100%;
+}
+
+.bodywebsite .ratio-4x3 {
+ --bs-aspect-ratio: 75%;
+}
+
+.bodywebsite .ratio-16x9 {
+ --bs-aspect-ratio: 56.25%;
+}
+
+.bodywebsite .ratio-21x9 {
+ --bs-aspect-ratio: 42.8571428571%;
+}
+
+.bodywebsite .fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1030;
+}
+
+.bodywebsite .fixed-bottom {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1030;
+}
+
+.bodywebsite .sticky-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+}
+
+.bodywebsite .sticky-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .sticky-sm-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-sm-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .sticky-md-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-md-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .sticky-lg-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-lg-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .sticky-xl-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-xl-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .sticky-xxl-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+
+ .bodywebsite .sticky-xxl-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+
+.bodywebsite .hstack {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ align-self: stretch;
+}
+
+.bodywebsite .vstack {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ align-self: stretch;
+}
+
+.bodywebsite .visually-hidden,
+ .bodywebsite .visually-hidden-focusable:not(:focus):not(:focus-within) {
+ position: absolute !important;
+ width: 1px !important;
+ height: 1px !important;
+ padding: 0 !important;
+ margin: -1px !important;
+ overflow: hidden !important;
+ clip: rect(0, 0, 0, 0) !important;
+ white-space: nowrap !important;
+ border: 0 !important;
+}
+
+.bodywebsite .stretched-link::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1;
+ content: "";
+}
+
+.bodywebsite .text-truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.bodywebsite .vr {
+ display: inline-block;
+ align-self: stretch;
+ width: 1px;
+ min-height: 1em;
+ background-color: currentcolor;
+ opacity: 0.25;
+}
+
+.bodywebsite .align-baseline {
+ vertical-align: baseline !important;
+}
+
+.bodywebsite .align-top {
+ vertical-align: top !important;
+}
+
+.bodywebsite .align-middle {
+ vertical-align: middle !important;
+}
+
+.bodywebsite .align-bottom {
+ vertical-align: bottom !important;
+}
+
+.bodywebsite .align-text-bottom {
+ vertical-align: text-bottom !important;
+}
+
+.bodywebsite .align-text-top {
+ vertical-align: text-top !important;
+}
+
+.bodywebsite .float-start {
+ float: left !important;
+}
+
+.bodywebsite .float-end {
+ float: right !important;
+}
+
+.bodywebsite .float-none {
+ float: none !important;
+}
+
+.bodywebsite .opacity-0 {
+ opacity: 0 !important;
+}
+
+.bodywebsite .opacity-25 {
+ opacity: 0.25 !important;
+}
+
+.bodywebsite .opacity-50 {
+ opacity: 0.5 !important;
+}
+
+.bodywebsite .opacity-75 {
+ opacity: 0.75 !important;
+}
+
+.bodywebsite .opacity-100 {
+ opacity: 1 !important;
+}
+
+.bodywebsite .overflow-auto {
+ overflow: auto !important;
+}
+
+.bodywebsite .overflow-hidden {
+ overflow: hidden !important;
+}
+
+.bodywebsite .overflow-visible {
+ overflow: visible !important;
+}
+
+.bodywebsite .overflow-scroll {
+ overflow: scroll !important;
+}
+
+.bodywebsite .d-inline {
+ display: inline !important;
+}
+
+.bodywebsite .d-inline-block {
+ display: inline-block !important;
+}
+
+.bodywebsite .d-block {
+ display: block !important;
+}
+
+.bodywebsite .d-grid {
+ display: grid !important;
+}
+
+.bodywebsite .d-table {
+ display: table !important;
+}
+
+.bodywebsite .d-table-row {
+ display: table-row !important;
+}
+
+.bodywebsite .d-table-cell {
+ display: table-cell !important;
+}
+
+.bodywebsite .d-flex {
+ display: flex !important;
+}
+
+.bodywebsite .d-inline-flex {
+ display: inline-flex !important;
+}
+
+.bodywebsite .d-none {
+ display: none !important;
+}
+
+.bodywebsite .shadow {
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
+}
+
+.bodywebsite .shadow-sm {
+ box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
+}
+
+.bodywebsite .shadow-lg {
+ box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;
+}
+
+.bodywebsite .shadow-none {
+ box-shadow: none !important;
+}
+
+.bodywebsite .position-static {
+ position: static !important;
+}
+
+.bodywebsite .position-relative {
+ position: relative !important;
+}
+
+.bodywebsite .position-absolute {
+ position: absolute !important;
+}
+
+.bodywebsite .position-fixed {
+ position: fixed !important;
+}
+
+.bodywebsite .position-sticky {
+ position: -webkit-sticky !important;
+ position: sticky !important;
+}
+
+.bodywebsite .top-0 {
+ top: 0 !important;
+}
+
+.bodywebsite .top-50 {
+ top: 50% !important;
+}
+
+.bodywebsite .top-100 {
+ top: 100% !important;
+}
+
+.bodywebsite .bottom-0 {
+ bottom: 0 !important;
+}
+
+.bodywebsite .bottom-50 {
+ bottom: 50% !important;
+}
+
+.bodywebsite .bottom-100 {
+ bottom: 100% !important;
+}
+
+.bodywebsite .start-0 {
+ left: 0 !important;
+}
+
+.bodywebsite .start-50 {
+ left: 50% !important;
+}
+
+.bodywebsite .start-100 {
+ left: 100% !important;
+}
+
+.bodywebsite .end-0 {
+ right: 0 !important;
+}
+
+.bodywebsite .end-50 {
+ right: 50% !important;
+}
+
+.bodywebsite .end-100 {
+ right: 100% !important;
+}
+
+.bodywebsite .translate-middle {
+ transform: translate(-50%, -50%) !important;
+}
+
+.bodywebsite .translate-middle-x {
+ transform: translateX(-50%) !important;
+}
+
+.bodywebsite .translate-middle-y {
+ transform: translateY(-50%) !important;
+}
+
+.bodywebsite .border {
+ border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-0 {
+ border: 0 !important;
+}
+
+.bodywebsite .border-top {
+ border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-top-0 {
+ border-top: 0 !important;
+}
+
+.bodywebsite .border-end {
+ border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-end-0 {
+ border-right: 0 !important;
+}
+
+.bodywebsite .border-bottom {
+ border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-bottom-0 {
+ border-bottom: 0 !important;
+}
+
+.bodywebsite .border-start {
+ border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.bodywebsite .border-start-0 {
+ border-left: 0 !important;
+}
+
+.bodywebsite .border-primary {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-secondary {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-success {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-info {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-warning {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-danger {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-light {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-dark {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-white {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .border-1 {
+ --bs-border-width: 1px;
+}
+
+.bodywebsite .border-2 {
+ --bs-border-width: 2px;
+}
+
+.bodywebsite .border-3 {
+ --bs-border-width: 3px;
+}
+
+.bodywebsite .border-4 {
+ --bs-border-width: 4px;
+}
+
+.bodywebsite .border-5 {
+ --bs-border-width: 5px;
+}
+
+.bodywebsite .border-opacity-10 {
+ --bs-border-opacity: 0.1;
+}
+
+.bodywebsite .border-opacity-25 {
+ --bs-border-opacity: 0.25;
+}
+
+.bodywebsite .border-opacity-50 {
+ --bs-border-opacity: 0.5;
+}
+
+.bodywebsite .border-opacity-75 {
+ --bs-border-opacity: 0.75;
+}
+
+.bodywebsite .border-opacity-100 {
+ --bs-border-opacity: 1;
+}
+
+.bodywebsite .w-25 {
+ width: 25% !important;
+}
+
+.bodywebsite .w-50 {
+ width: 50% !important;
+}
+
+.bodywebsite .w-75 {
+ width: 75% !important;
+}
+
+.bodywebsite .w-100 {
+ width: 100% !important;
+}
+
+.bodywebsite .w-auto {
+ width: auto !important;
+}
+
+.bodywebsite .mw-100 {
+ max-width: 100% !important;
+}
+
+.bodywebsite .vw-100 {
+ width: 100vw !important;
+}
+
+.bodywebsite .min-vw-100 {
+ min-width: 100vw !important;
+}
+
+.bodywebsite .h-25 {
+ height: 25% !important;
+}
+
+.bodywebsite .h-50 {
+ height: 50% !important;
+}
+
+.bodywebsite .h-75 {
+ height: 75% !important;
+}
+
+.bodywebsite .h-100 {
+ height: 100% !important;
+}
+
+.bodywebsite .h-auto {
+ height: auto !important;
+}
+
+.bodywebsite .mh-100 {
+ max-height: 100% !important;
+}
+
+.bodywebsite .vh-100 {
+ height: 100vh !important;
+}
+
+.bodywebsite .min-vh-100 {
+ min-height: 100vh !important;
+}
+
+.bodywebsite .flex-fill {
+ flex: 1 1 auto !important;
+}
+
+.bodywebsite .flex-row {
+ flex-direction: row !important;
+}
+
+.bodywebsite .flex-column {
+ flex-direction: column !important;
+}
+
+.bodywebsite .flex-row-reverse {
+ flex-direction: row-reverse !important;
+}
+
+.bodywebsite .flex-column-reverse {
+ flex-direction: column-reverse !important;
+}
+
+.bodywebsite .flex-grow-0 {
+ flex-grow: 0 !important;
+}
+
+.bodywebsite .flex-grow-1 {
+ flex-grow: 1 !important;
+}
+
+.bodywebsite .flex-shrink-0 {
+ flex-shrink: 0 !important;
+}
+
+.bodywebsite .flex-shrink-1 {
+ flex-shrink: 1 !important;
+}
+
+.bodywebsite .flex-wrap {
+ flex-wrap: wrap !important;
+}
+
+.bodywebsite .flex-nowrap {
+ flex-wrap: nowrap !important;
+}
+
+.bodywebsite .flex-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+}
+
+.bodywebsite .justify-content-start {
+ justify-content: flex-start !important;
+}
+
+.bodywebsite .justify-content-end {
+ justify-content: flex-end !important;
+}
+
+.bodywebsite .justify-content-center {
+ justify-content: center !important;
+}
+
+.bodywebsite .justify-content-between {
+ justify-content: space-between !important;
+}
+
+.bodywebsite .justify-content-around {
+ justify-content: space-around !important;
+}
+
+.bodywebsite .justify-content-evenly {
+ justify-content: space-evenly !important;
+}
+
+.bodywebsite .align-items-start {
+ align-items: flex-start !important;
+}
+
+.bodywebsite .align-items-end {
+ align-items: flex-end !important;
+}
+
+.bodywebsite .align-items-center {
+ align-items: center !important;
+}
+
+.bodywebsite .align-items-baseline {
+ align-items: baseline !important;
+}
+
+.bodywebsite .align-items-stretch {
+ align-items: stretch !important;
+}
+
+.bodywebsite .align-content-start {
+ align-content: flex-start !important;
+}
+
+.bodywebsite .align-content-end {
+ align-content: flex-end !important;
+}
+
+.bodywebsite .align-content-center {
+ align-content: center !important;
+}
+
+.bodywebsite .align-content-between {
+ align-content: space-between !important;
+}
+
+.bodywebsite .align-content-around {
+ align-content: space-around !important;
+}
+
+.bodywebsite .align-content-stretch {
+ align-content: stretch !important;
+}
+
+.bodywebsite .align-self-auto {
+ align-self: auto !important;
+}
+
+.bodywebsite .align-self-start {
+ align-self: flex-start !important;
+}
+
+.bodywebsite .align-self-end {
+ align-self: flex-end !important;
+}
+
+.bodywebsite .align-self-center {
+ align-self: center !important;
+}
+
+.bodywebsite .align-self-baseline {
+ align-self: baseline !important;
+}
+
+.bodywebsite .align-self-stretch {
+ align-self: stretch !important;
+}
+
+.bodywebsite .order-first {
+ order: -1 !important;
+}
+
+.bodywebsite .order-0 {
+ order: 0 !important;
+}
+
+.bodywebsite .order-1 {
+ order: 1 !important;
+}
+
+.bodywebsite .order-2 {
+ order: 2 !important;
+}
+
+.bodywebsite .order-3 {
+ order: 3 !important;
+}
+
+.bodywebsite .order-4 {
+ order: 4 !important;
+}
+
+.bodywebsite .order-5 {
+ order: 5 !important;
+}
+
+.bodywebsite .order-last {
+ order: 6 !important;
+}
+
+.bodywebsite .m-0 {
+ margin: 0 !important;
+}
+
+.bodywebsite .m-1 {
+ margin: 0.25rem !important;
+ padding-left: 0px !important;
+}
+
+.bodywebsite .m-2 {
+ margin: 0.5rem !important;
+}
+
+.bodywebsite .m-3 {
+ margin: 1rem !important;
+}
+
+.bodywebsite .m-4 {
+ margin: 1.5rem !important;
+}
+
+.bodywebsite .m-5 {
+ margin: 3rem !important;
+}
+
+.bodywebsite .m-auto {
+ margin: auto !important;
+}
+
+.bodywebsite .mx-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+}
+
+.bodywebsite .mx-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+}
+
+.bodywebsite .mx-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+}
+
+.bodywebsite .mx-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+}
+
+.bodywebsite .mx-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+}
+
+.bodywebsite .mx-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+}
+
+.bodywebsite .mx-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+}
+
+.bodywebsite .my-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+.bodywebsite .my-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+}
+
+.bodywebsite .my-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+}
+
+.bodywebsite .my-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+}
+
+.bodywebsite .my-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+}
+
+.bodywebsite .my-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+}
+
+.bodywebsite .my-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+}
+
+.bodywebsite .mt-0 {
+ margin-top: 0 !important;
+}
+
+.bodywebsite .mt-1 {
+ margin-top: 0.25rem !important;
+}
+
+.bodywebsite .mt-2 {
+ margin-top: 0.5rem !important;
+}
+
+.bodywebsite .mt-3 {
+ margin-top: 1rem !important;
+}
+
+.bodywebsite .mt-4 {
+ margin-top: 1.5rem !important;
+}
+
+.bodywebsite .mt-5 {
+ margin-top: 3rem !important;
+}
+
+.bodywebsite .mt-auto {
+ margin-top: auto !important;
+}
+
+.bodywebsite .me-0 {
+ margin-right: 0 !important;
+}
+
+.bodywebsite .me-1 {
+ margin-right: 0.25rem !important;
+}
+
+.bodywebsite .me-2 {
+ margin-right: 0.5rem !important;
+}
+
+.bodywebsite .me-3 {
+ margin-right: 1rem !important;
+}
+
+.bodywebsite .me-4 {
+ margin-right: 1.5rem !important;
+}
+
+.bodywebsite .me-5 {
+ margin-right: 3rem !important;
+}
+
+.bodywebsite .me-auto {
+ margin-right: auto !important;
+}
+
+.bodywebsite .mb-0 {
+ margin-bottom: 0 !important;
+}
+
+.bodywebsite .mb-1 {
+ margin-bottom: 0.25rem !important;
+}
+
+.bodywebsite .mb-2 {
+ margin-bottom: 0.5rem !important;
+}
+
+.bodywebsite .mb-3 {
+ margin-bottom: 1rem !important;
+}
+
+.bodywebsite .mb-4 {
+ margin-bottom: 1.5rem !important;
+}
+
+.bodywebsite .mb-5 {
+ margin-bottom: 3rem !important;
+}
+
+.bodywebsite .mb-auto {
+ margin-bottom: auto !important;
+}
+
+.bodywebsite .ms-0 {
+ margin-left: 0 !important;
+}
+
+.bodywebsite .ms-1 {
+ margin-left: 0.25rem !important;
+}
+
+.bodywebsite .ms-2 {
+ margin-left: 0.5rem !important;
+}
+
+.bodywebsite .ms-3 {
+ margin-left: 1rem !important;
+}
+
+.bodywebsite .ms-4 {
+ margin-left: 1.5rem !important;
+}
+
+.bodywebsite .ms-5 {
+ margin-left: 3rem !important;
+}
+
+.bodywebsite .ms-auto {
+ margin-left: auto !important;
+}
+
+.bodywebsite .p-0 {
+ padding: 0 !important;
+}
+
+.bodywebsite .p-1 {
+ padding: 0.25rem !important;
+}
+
+.bodywebsite .p-2 {
+ padding: 0.5rem !important;
+}
+
+.bodywebsite .p-3 {
+ padding: 1rem !important;
+}
+
+.bodywebsite .p-4 {
+ padding: 1.5rem !important;
+}
+
+.bodywebsite .p-5 {
+ padding: 3rem !important;
+}
+
+.bodywebsite .px-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+}
+
+.bodywebsite .px-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+}
+
+.bodywebsite .px-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+}
+
+.bodywebsite .px-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+}
+
+.bodywebsite .px-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+}
+
+.bodywebsite .px-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+}
+
+.bodywebsite .py-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+}
+
+.bodywebsite .py-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+}
+
+.bodywebsite .py-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+}
+
+.bodywebsite .py-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+}
+
+.bodywebsite .py-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+}
+
+.bodywebsite .py-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+}
+
+.bodywebsite .pt-0 {
+ padding-top: 0 !important;
+}
+
+.bodywebsite .pt-1 {
+ padding-top: 0.25rem !important;
+}
+
+.bodywebsite .pt-2 {
+ padding-top: 0.5rem !important;
+}
+
+.bodywebsite .pt-3 {
+ padding-top: 1rem !important;
+}
+
+.bodywebsite .pt-4 {
+ padding-top: 1.5rem !important;
+}
+
+.bodywebsite .pt-5 {
+ padding-top: 3rem !important;
+}
+
+.bodywebsite .pe-0 {
+ padding-right: 0 !important;
+}
+
+.bodywebsite .pe-1 {
+ padding-right: 0.25rem !important;
+}
+
+.bodywebsite .pe-2 {
+ padding-right: 0.5rem !important;
+}
+
+.bodywebsite .pe-3 {
+ padding-right: 1rem !important;
+}
+
+.bodywebsite .pe-4 {
+ padding-right: 1.5rem !important;
+}
+
+.bodywebsite .pe-5 {
+ padding-right: 3rem !important;
+}
+
+.bodywebsite .pb-0 {
+ padding-bottom: 0 !important;
+}
+
+.bodywebsite .pb-1 {
+ padding-bottom: 0.25rem !important;
+}
+
+.bodywebsite .pb-2 {
+ padding-bottom: 0.5rem !important;
+}
+
+.bodywebsite .pb-3 {
+ padding-bottom: 1rem !important;
+}
+
+.bodywebsite .pb-4 {
+ padding-bottom: 1.5rem !important;
+}
+
+.bodywebsite .pb-5 {
+ padding-bottom: 3rem !important;
+}
+
+.bodywebsite .ps-0 {
+ padding-left: 0 !important;
+}
+
+.bodywebsite .ps-1 {
+ padding-left: 0.25rem !important;
+}
+
+.bodywebsite .ps-2 {
+ padding-left: 0.5rem !important;
+}
+
+.bodywebsite .ps-3 {
+ padding-left: 1rem !important;
+}
+
+.bodywebsite .ps-4 {
+ padding-left: 1.5rem !important;
+}
+
+.bodywebsite .ps-5 {
+ padding-left: 3rem !important;
+}
+
+.bodywebsite .gap-0 {
+ gap: 0 !important;
+}
+
+.bodywebsite .gap-1 {
+ gap: 0.25rem !important;
+}
+
+.bodywebsite .gap-2 {
+ gap: 0.5rem !important;
+}
+
+.bodywebsite .gap-3 {
+ gap: 1rem !important;
+}
+
+.bodywebsite .gap-4 {
+ gap: 1.5rem !important;
+}
+
+.bodywebsite .gap-5 {
+ gap: 3rem !important;
+}
+
+.bodywebsite .font-monospace {
+ font-family: var(--bs-font-monospace) !important;
+}
+
+.bodywebsite .fs-1 {
+ font-size: calc(1.375rem + 1.5vw) !important;
+}
+
+.bodywebsite .fs-2 {
+ font-size: calc(1.325rem + 0.9vw) !important;
+}
+
+.bodywebsite .fs-3 {
+ font-size: calc(1.3rem + 0.6vw) !important;
+}
+
+.bodywebsite .fs-4 {
+ font-size: calc(1.275rem + 0.3vw) !important;
+}
+
+.bodywebsite .fs-5 {
+ font-size: 1.25rem !important;
+}
+
+.bodywebsite .fs-6 {
+ font-size: 1rem !important;
+}
+
+.bodywebsite .fst-italic {
+ font-style: italic !important;
+}
+
+.bodywebsite .fst-normal {
+ font-style: normal !important;
+}
+
+.bodywebsite .fw-light {
+ font-weight: 300 !important;
+}
+
+.bodywebsite .fw-lighter {
+ font-weight: lighter !important;
+}
+
+.bodywebsite .fw-normal {
+ font-weight: 400 !important;
+}
+
+.bodywebsite .fw-bold {
+ font-weight: 700 !important;
+}
+
+.bodywebsite .fw-semibold {
+ font-weight: 600 !important;
+}
+
+.bodywebsite .fw-bolder {
+ font-weight: bolder !important;
+}
+
+.bodywebsite .lh-1 {
+ line-height: 1 !important;
+}
+
+.bodywebsite .lh-sm {
+ line-height: 1.25 !important;
+}
+
+.bodywebsite .lh-base {
+ line-height: 1.5 !important;
+}
+
+.bodywebsite .lh-lg {
+ line-height: 2 !important;
+}
+
+.bodywebsite .text-start {
+ text-align: left !important;
+}
+
+.bodywebsite .text-end {
+ text-align: right !important;
+}
+
+.bodywebsite .text-center {
+ text-align: center !important;
+}
+
+.bodywebsite .text-decoration-none {
+ text-decoration: none !important;
+}
+
+.bodywebsite .text-decoration-underline {
+ text-decoration: underline !important;
+}
+
+.bodywebsite .text-decoration-line-through {
+ text-decoration: line-through !important;
+}
+
+.bodywebsite .text-lowercase {
+ text-transform: lowercase !important;
+}
+
+.bodywebsite .text-uppercase {
+ text-transform: uppercase !important;
+}
+
+.bodywebsite .text-capitalize {
+ text-transform: capitalize !important;
+}
+
+.bodywebsite .text-wrap {
+ white-space: normal !important;
+}
+
+.bodywebsite .text-nowrap {
+ white-space: nowrap !important;
+}
+
+.bodywebsite .text-break {
+ word-wrap: break-word !important;
+ word-break: break-word !important;
+}
+
+.bodywebsite .text-primary {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-secondary {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-success {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-info {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-warning {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-danger {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-light {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-dark {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-black {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-white {
+ --bs-text-opacity: 1;
+ color: var(--text-white);
+}
+
+.bodywebsite .text-body {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .text-muted {
+ --bs-text-opacity: 1;
+ color: #6c757d !important;
+}
+
+.bodywebsite .text-black-50 {
+ --bs-text-opacity: 1;
+ color: rgba(0, 0, 0, 0.5) !important;
+}
+
+.bodywebsite .text-white-50 {
+ --bs-text-opacity: 1;
+ color: rgba(255, 255, 255, 0.5) !important;
+}
+
+.bodywebsite .text-reset {
+ --bs-text-opacity: 1;
+ color: inherit !important;
+}
+
+.bodywebsite .text-opacity-25 {
+ --bs-text-opacity: 0.25;
+}
+
+.bodywebsite .text-opacity-50 {
+ --bs-text-opacity: 0.5;
+}
+
+.bodywebsite .text-opacity-75 {
+ --bs-text-opacity: 0.75;
+}
+
+.bodywebsite .text-opacity-100 {
+ --bs-text-opacity: 1;
+}
+
+.bodywebsite .bg-primary {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-secondary {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-success {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-info {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-warning {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-danger {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-light {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-dark {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-black {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-white {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-body {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-transparent {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-opacity-10 {
+ --bs-bg-opacity: 0.1;
+}
+
+.bodywebsite .bg-opacity-25 {
+ --bs-bg-opacity: 0.25;
+}
+
+.bodywebsite .bg-opacity-50 {
+ --bs-bg-opacity: 0.5;
+}
+
+.bodywebsite .bg-opacity-75 {
+ --bs-bg-opacity: 0.75;
+}
+
+.bodywebsite .bg-opacity-100 {
+ --bs-bg-opacity: 1;
+}
+
+.bodywebsite .bg-gradient {
+ background-image: var(--bs-gradient) !important;
+}
+
+.bodywebsite .user-select-all {
+ -webkit-user-select: all !important;
+ -moz-user-select: all !important;
+ user-select: all !important;
+}
+
+.bodywebsite .user-select-auto {
+ -webkit-user-select: auto !important;
+ -moz-user-select: auto !important;
+ user-select: auto !important;
+}
+
+.bodywebsite .user-select-none {
+ -webkit-user-select: none !important;
+ -moz-user-select: none !important;
+ user-select: none !important;
+}
+
+.bodywebsite .pe-none {
+ pointer-events: none !important;
+}
+
+.bodywebsite .pe-auto {
+ pointer-events: auto !important;
+}
+
+.bodywebsite .rounded {
+ border-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-0 {
+ border-radius: 0 !important;
+}
+
+.bodywebsite .rounded-1 {
+ border-radius: var(--bs-border-radius-sm) !important;
+}
+
+.bodywebsite .rounded-2 {
+ border-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-3 {
+ border-radius: var(--bs-border-radius-lg) !important;
+}
+
+.bodywebsite .rounded-4 {
+ border-radius: var(--bs-border-radius-xl) !important;
+}
+
+.bodywebsite .rounded-5 {
+ border-radius: var(--bs-border-radius-2xl) !important;
+}
+
+.bodywebsite .rounded-circle {
+ border-radius: 50% !important;
+}
+
+.bodywebsite .rounded-pill {
+ border-radius: var(--bs-border-radius-pill) !important;
+}
+
+.bodywebsite .rounded-top {
+ border-top-left-radius: var(--bs-border-radius) !important;
+ border-top-right-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-end {
+ border-top-right-radius: var(--bs-border-radius) !important;
+ border-bottom-right-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-bottom {
+ border-bottom-right-radius: var(--bs-border-radius) !important;
+ border-bottom-left-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .rounded-start {
+ border-bottom-left-radius: var(--bs-border-radius) !important;
+ border-top-left-radius: var(--bs-border-radius) !important;
+}
+
+.bodywebsite .visible {
+ visibility: visible !important;
+}
+
+.bodywebsite .invisible {
+ visibility: hidden !important;
+}
+
+@media (min-width: 576px) {
+ .bodywebsite .float-sm-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-sm-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-sm-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-sm-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-sm-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-sm-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-sm-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-sm-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-sm-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-sm-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-sm-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-sm-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-sm-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-sm-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-sm-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-sm-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-sm-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-sm-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-sm-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-sm-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-sm-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-sm-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-sm-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-sm-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-sm-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-sm-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-sm-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-sm-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-sm-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-sm-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-sm-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-sm-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-sm-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-sm-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-sm-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-sm-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-sm-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-sm-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-sm-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-sm-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-sm-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-sm-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-sm-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-sm-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-sm-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-sm-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-sm-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-sm-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-sm-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-sm-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-sm-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-sm-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-sm-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-sm-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-sm-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-sm-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-sm-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-sm-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-sm-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-sm-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-sm-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-sm-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-sm-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-sm-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-sm-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-sm-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-sm-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-sm-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-sm-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-sm-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-sm-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-sm-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-sm-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-sm-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-sm-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-sm-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-sm-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-sm-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-sm-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-sm-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-sm-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-sm-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-sm-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-sm-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-sm-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-sm-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-sm-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-sm-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-sm-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-sm-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-sm-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-sm-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-sm-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-sm-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-sm-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-sm-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-sm-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-sm-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-sm-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-sm-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-sm-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-sm-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-sm-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-sm-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-sm-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-sm-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-sm-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-sm-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-sm-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-sm-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-sm-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-sm-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-sm-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-sm-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-sm-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-sm-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-sm-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-sm-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-sm-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-sm-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-sm-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-sm-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-sm-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-sm-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-sm-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-sm-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-sm-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-sm-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-sm-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-sm-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-sm-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-sm-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-sm-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-sm-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-sm-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-sm-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-sm-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-sm-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-sm-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-sm-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-sm-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-sm-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-sm-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-sm-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-sm-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-sm-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-sm-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-sm-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-sm-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-sm-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-sm-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-sm-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-sm-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-sm-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-sm-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-sm-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .bodywebsite .float-md-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-md-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-md-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-md-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-md-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-md-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-md-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-md-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-md-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-md-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-md-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-md-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-md-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-md-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-md-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-md-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-md-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-md-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-md-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-md-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-md-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-md-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-md-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-md-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-md-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-md-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-md-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-md-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-md-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-md-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-md-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-md-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-md-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-md-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-md-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-md-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-md-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-md-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-md-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-md-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-md-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-md-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-md-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-md-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-md-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-md-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-md-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-md-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-md-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-md-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-md-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-md-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-md-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-md-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-md-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-md-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-md-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-md-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-md-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-md-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-md-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-md-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-md-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-md-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-md-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-md-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-md-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-md-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-md-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-md-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-md-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-md-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-md-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-md-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-md-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-md-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-md-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-md-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-md-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-md-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-md-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-md-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-md-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-md-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-md-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-md-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-md-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-md-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-md-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-md-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-md-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-md-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-md-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-md-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-md-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-md-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-md-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-md-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-md-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-md-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-md-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-md-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-md-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-md-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-md-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-md-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-md-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-md-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-md-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-md-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-md-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-md-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-md-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-md-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-md-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-md-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-md-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-md-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-md-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-md-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-md-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-md-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-md-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-md-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-md-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-md-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-md-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-md-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-md-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-md-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-md-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-md-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-md-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-md-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-md-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-md-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-md-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-md-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-md-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-md-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-md-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-md-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-md-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-md-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-md-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-md-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-md-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-md-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-md-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-md-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-md-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-md-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-md-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-md-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-md-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-md-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .bodywebsite .float-lg-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-lg-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-lg-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-lg-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-lg-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-lg-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-lg-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-lg-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-lg-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-lg-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-lg-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-lg-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-lg-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-lg-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-lg-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-lg-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-lg-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-lg-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-lg-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-lg-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-lg-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-lg-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-lg-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-lg-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-lg-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-lg-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-lg-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-lg-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-lg-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-lg-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-lg-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-lg-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-lg-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-lg-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-lg-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-lg-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-lg-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-lg-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-lg-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-lg-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-lg-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-lg-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-lg-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-lg-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-lg-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-lg-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-lg-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-lg-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-lg-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-lg-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-lg-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-lg-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-lg-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-lg-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-lg-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-lg-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-lg-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-lg-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-lg-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-lg-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-lg-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-lg-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-lg-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-lg-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-lg-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-lg-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-lg-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-lg-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-lg-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-lg-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-lg-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-lg-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-lg-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-lg-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-lg-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-lg-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-lg-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-lg-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-lg-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-lg-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-lg-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-lg-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-lg-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-lg-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-lg-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-lg-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-lg-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-lg-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-lg-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-lg-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-lg-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-lg-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-lg-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-lg-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-lg-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-lg-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-lg-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-lg-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-lg-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-lg-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-lg-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-lg-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-lg-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-lg-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-lg-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-lg-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-lg-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-lg-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-lg-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-lg-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-lg-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-lg-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-lg-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-lg-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-lg-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-lg-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-lg-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-lg-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-lg-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-lg-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-lg-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-lg-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-lg-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-lg-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-lg-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-lg-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-lg-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-lg-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-lg-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-lg-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-lg-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-lg-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-lg-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-lg-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-lg-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-lg-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-lg-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-lg-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-lg-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-lg-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-lg-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-lg-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-lg-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-lg-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-lg-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-lg-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-lg-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-lg-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-lg-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-lg-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-lg-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-lg-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-lg-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-lg-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-lg-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-lg-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .float-xl-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-xl-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-xl-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-xl-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-xl-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-xl-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-xl-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-xl-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-xl-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-xl-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-xl-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-xl-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-xl-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-xl-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-xl-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-xl-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-xl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-xl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-xl-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-xl-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-xl-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-xl-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-xl-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-xl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-xl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-xl-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-xl-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-xl-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-xl-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-xl-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-xl-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-xl-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-xl-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-xl-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-xl-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-xl-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-xl-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-xl-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-xl-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-xl-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-xl-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-xl-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-xl-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-xl-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-xl-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-xl-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-xl-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-xl-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-xl-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-xl-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-xl-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-xl-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-xl-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-xl-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-xl-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-xl-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-xl-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-xl-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-xl-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-xl-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-xl-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-xl-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-xl-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-xl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-xl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-xl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-xl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-xl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-xl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-xl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-xl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-xl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-xl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-xl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-xl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-xl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-xl-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-xl-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-xl-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-xl-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-xl-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-xl-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-xl-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-xl-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-xl-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-xl-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-xl-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-xl-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-xl-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-xl-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-xl-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-xl-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-xl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-xl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-xl-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-xl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-xl-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-xl-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-xl-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-xl-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-xl-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-xl-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-xl-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-xl-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-xl-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-xl-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-xl-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-xl-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-xl-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-xl-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-xl-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-xl-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-xl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-xl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-xl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-xl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-xl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-xl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-xl-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-xl-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-xl-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-xl-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-xl-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-xl-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-xl-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-xl-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-xl-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-xl-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-xl-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-xl-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-xl-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-xl-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-xl-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-xl-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-xl-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-xl-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-xl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-xl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-xl-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-xl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-xl-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-xl-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-xl-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-xl-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-xl-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-xl-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-xl-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-xl-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-xl-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-xl-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-xl-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-xl-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-xl-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-xl-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-xl-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-xl-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1400px) {
+ .bodywebsite .float-xxl-start {
+ float: left !important;
+ }
+
+ .bodywebsite .float-xxl-end {
+ float: right !important;
+ }
+
+ .bodywebsite .float-xxl-none {
+ float: none !important;
+ }
+
+ .bodywebsite .d-xxl-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-xxl-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-xxl-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-xxl-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-xxl-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-xxl-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-xxl-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-xxl-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-xxl-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-xxl-none {
+ display: none !important;
+ }
+
+ .bodywebsite .flex-xxl-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .bodywebsite .flex-xxl-row {
+ flex-direction: row !important;
+ }
+
+ .bodywebsite .flex-xxl-column {
+ flex-direction: column !important;
+ }
+
+ .bodywebsite .flex-xxl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .bodywebsite .flex-xxl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .bodywebsite .flex-xxl-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .bodywebsite .flex-xxl-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .bodywebsite .flex-xxl-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .bodywebsite .flex-xxl-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .bodywebsite .flex-xxl-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .bodywebsite .flex-xxl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .bodywebsite .flex-xxl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .bodywebsite .justify-content-xxl-start {
+ justify-content: flex-start !important;
+ }
+
+ .bodywebsite .justify-content-xxl-end {
+ justify-content: flex-end !important;
+ }
+
+ .bodywebsite .justify-content-xxl-center {
+ justify-content: center !important;
+ }
+
+ .bodywebsite .justify-content-xxl-between {
+ justify-content: space-between !important;
+ }
+
+ .bodywebsite .justify-content-xxl-around {
+ justify-content: space-around !important;
+ }
+
+ .bodywebsite .justify-content-xxl-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .bodywebsite .align-items-xxl-start {
+ align-items: flex-start !important;
+ }
+
+ .bodywebsite .align-items-xxl-end {
+ align-items: flex-end !important;
+ }
+
+ .bodywebsite .align-items-xxl-center {
+ align-items: center !important;
+ }
+
+ .bodywebsite .align-items-xxl-baseline {
+ align-items: baseline !important;
+ }
+
+ .bodywebsite .align-items-xxl-stretch {
+ align-items: stretch !important;
+ }
+
+ .bodywebsite .align-content-xxl-start {
+ align-content: flex-start !important;
+ }
+
+ .bodywebsite .align-content-xxl-end {
+ align-content: flex-end !important;
+ }
+
+ .bodywebsite .align-content-xxl-center {
+ align-content: center !important;
+ }
+
+ .bodywebsite .align-content-xxl-between {
+ align-content: space-between !important;
+ }
+
+ .bodywebsite .align-content-xxl-around {
+ align-content: space-around !important;
+ }
+
+ .bodywebsite .align-content-xxl-stretch {
+ align-content: stretch !important;
+ }
+
+ .bodywebsite .align-self-xxl-auto {
+ align-self: auto !important;
+ }
+
+ .bodywebsite .align-self-xxl-start {
+ align-self: flex-start !important;
+ }
+
+ .bodywebsite .align-self-xxl-end {
+ align-self: flex-end !important;
+ }
+
+ .bodywebsite .align-self-xxl-center {
+ align-self: center !important;
+ }
+
+ .bodywebsite .align-self-xxl-baseline {
+ align-self: baseline !important;
+ }
+
+ .bodywebsite .align-self-xxl-stretch {
+ align-self: stretch !important;
+ }
+
+ .bodywebsite .order-xxl-first {
+ order: -1 !important;
+ }
+
+ .bodywebsite .order-xxl-0 {
+ order: 0 !important;
+ }
+
+ .bodywebsite .order-xxl-1 {
+ order: 1 !important;
+ }
+
+ .bodywebsite .order-xxl-2 {
+ order: 2 !important;
+ }
+
+ .bodywebsite .order-xxl-3 {
+ order: 3 !important;
+ }
+
+ .bodywebsite .order-xxl-4 {
+ order: 4 !important;
+ }
+
+ .bodywebsite .order-xxl-5 {
+ order: 5 !important;
+ }
+
+ .bodywebsite .order-xxl-last {
+ order: 6 !important;
+ }
+
+ .bodywebsite .m-xxl-0 {
+ margin: 0 !important;
+ }
+
+ .bodywebsite .m-xxl-1 {
+ margin: 0.25rem !important;
+ }
+
+ .bodywebsite .m-xxl-2 {
+ margin: 0.5rem !important;
+ }
+
+ .bodywebsite .m-xxl-3 {
+ margin: 1rem !important;
+ }
+
+ .bodywebsite .m-xxl-4 {
+ margin: 1.5rem !important;
+ }
+
+ .bodywebsite .m-xxl-5 {
+ margin: 3rem !important;
+ }
+
+ .bodywebsite .m-xxl-auto {
+ margin: auto !important;
+ }
+
+ .bodywebsite .mx-xxl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .mx-xxl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .mx-xxl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .mx-xxl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .mx-xxl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .mx-xxl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .mx-xxl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .my-xxl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .my-xxl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .my-xxl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .my-xxl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .my-xxl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .my-xxl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .my-xxl-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .mt-xxl-0 {
+ margin-top: 0 !important;
+ }
+
+ .bodywebsite .mt-xxl-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .bodywebsite .mt-xxl-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .bodywebsite .mt-xxl-3 {
+ margin-top: 1rem !important;
+ }
+
+ .bodywebsite .mt-xxl-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .bodywebsite .mt-xxl-5 {
+ margin-top: 3rem !important;
+ }
+
+ .bodywebsite .mt-xxl-auto {
+ margin-top: auto !important;
+ }
+
+ .bodywebsite .me-xxl-0 {
+ margin-right: 0 !important;
+ }
+
+ .bodywebsite .me-xxl-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .bodywebsite .me-xxl-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .bodywebsite .me-xxl-3 {
+ margin-right: 1rem !important;
+ }
+
+ .bodywebsite .me-xxl-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .bodywebsite .me-xxl-5 {
+ margin-right: 3rem !important;
+ }
+
+ .bodywebsite .me-xxl-auto {
+ margin-right: auto !important;
+ }
+
+ .bodywebsite .mb-xxl-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .bodywebsite .mb-xxl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .mb-xxl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .mb-xxl-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .bodywebsite .mb-xxl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .mb-xxl-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .bodywebsite .mb-xxl-auto {
+ margin-bottom: auto !important;
+ }
+
+ .bodywebsite .ms-xxl-0 {
+ margin-left: 0 !important;
+ }
+
+ .bodywebsite .ms-xxl-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ms-xxl-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ms-xxl-3 {
+ margin-left: 1rem !important;
+ }
+
+ .bodywebsite .ms-xxl-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ms-xxl-5 {
+ margin-left: 3rem !important;
+ }
+
+ .bodywebsite .ms-xxl-auto {
+ margin-left: auto !important;
+ }
+
+ .bodywebsite .p-xxl-0 {
+ padding: 0 !important;
+ }
+
+ .bodywebsite .p-xxl-1 {
+ padding: 0.25rem !important;
+ }
+
+ .bodywebsite .p-xxl-2 {
+ padding: 0.5rem !important;
+ }
+
+ .bodywebsite .p-xxl-3 {
+ padding: 1rem !important;
+ }
+
+ .bodywebsite .p-xxl-4 {
+ padding: 1.5rem !important;
+ }
+
+ .bodywebsite .p-xxl-5 {
+ padding: 3rem !important;
+ }
+
+ .bodywebsite .px-xxl-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .px-xxl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .px-xxl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .px-xxl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .px-xxl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .px-xxl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .py-xxl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .py-xxl-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .py-xxl-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .py-xxl-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .py-xxl-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .py-xxl-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .pt-xxl-0 {
+ padding-top: 0 !important;
+ }
+
+ .bodywebsite .pt-xxl-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .bodywebsite .pt-xxl-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .bodywebsite .pt-xxl-3 {
+ padding-top: 1rem !important;
+ }
+
+ .bodywebsite .pt-xxl-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .bodywebsite .pt-xxl-5 {
+ padding-top: 3rem !important;
+ }
+
+ .bodywebsite .pe-xxl-0 {
+ padding-right: 0 !important;
+ }
+
+ .bodywebsite .pe-xxl-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .bodywebsite .pe-xxl-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .bodywebsite .pe-xxl-3 {
+ padding-right: 1rem !important;
+ }
+
+ .bodywebsite .pe-xxl-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .bodywebsite .pe-xxl-5 {
+ padding-right: 3rem !important;
+ }
+
+ .bodywebsite .pb-xxl-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .bodywebsite .pb-xxl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .bodywebsite .pb-xxl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .bodywebsite .pb-xxl-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .bodywebsite .pb-xxl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .bodywebsite .pb-xxl-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .bodywebsite .ps-xxl-0 {
+ padding-left: 0 !important;
+ }
+
+ .bodywebsite .ps-xxl-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .bodywebsite .ps-xxl-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .bodywebsite .ps-xxl-3 {
+ padding-left: 1rem !important;
+ }
+
+ .bodywebsite .ps-xxl-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .bodywebsite .ps-xxl-5 {
+ padding-left: 3rem !important;
+ }
+
+ .bodywebsite .gap-xxl-0 {
+ gap: 0 !important;
+ }
+
+ .bodywebsite .gap-xxl-1 {
+ gap: 0.25rem !important;
+ }
+
+ .bodywebsite .gap-xxl-2 {
+ gap: 0.5rem !important;
+ }
+
+ .bodywebsite .gap-xxl-3 {
+ gap: 1rem !important;
+ }
+
+ .bodywebsite .gap-xxl-4 {
+ gap: 1.5rem !important;
+ }
+
+ .bodywebsite .gap-xxl-5 {
+ gap: 3rem !important;
+ }
+
+ .bodywebsite .text-xxl-start {
+ text-align: left !important;
+ }
+
+ .bodywebsite .text-xxl-end {
+ text-align: right !important;
+ }
+
+ .bodywebsite .text-xxl-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bodywebsite .fs-1 {
+ font-size: 2.5rem !important;
+ }
+
+ .bodywebsite .fs-2 {
+ font-size: 2rem !important;
+ }
+
+ .bodywebsite .fs-3 {
+ font-size: 1.75rem !important;
+ }
+
+ .bodywebsite .fs-4 {
+ font-size: 1.5rem !important;
+ }
+}
+
+@media print {
+ .bodywebsite .d-print-inline {
+ display: inline !important;
+ }
+
+ .bodywebsite .d-print-inline-block {
+ display: inline-block !important;
+ }
+
+ .bodywebsite .d-print-block {
+ display: block !important;
+ }
+
+ .bodywebsite .d-print-grid {
+ display: grid !important;
+ }
+
+ .bodywebsite .d-print-table {
+ display: table !important;
+ }
+
+ .bodywebsite .d-print-table-row {
+ display: table-row !important;
+ }
+
+ .bodywebsite .d-print-table-cell {
+ display: table-cell !important;
+ }
+
+ .bodywebsite .d-print-flex {
+ display: flex !important;
+ }
+
+ .bodywebsite .d-print-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .bodywebsite .d-print-none {
+ display: none !important;
+ }
+}
+
+
+body.bodywebsite { margin: 0; font-family: 'Open Sans', sans-serif; }
+.bodywebsite h1 { margin-top: 0; margin-bottom: 0; padding: 10px;}
+
+
+:root {
+ --text-white: #f0f0f0;
+ --white-color: #ffffff;
+ --primary-color: #d9534f;
+ --secondary-color: #f3af24;
+ --section-bg-color: #f9f9f9;
+ --dark-color: #000000;
+ --title-color: #565758;
+ --news-title-color: #292828;
+ --p-color: #717275;
+ --border-color: #eaeaea;
+ --border-radius-default: 0.25rem;
+
+ --body-font-family: "Montserrat", sans-serif;
+
+ --h1-font-size: 76px;
+ --h2-font-size: 56px;
+ --h3-font-size: 42px;
+ --h4-font-size: 28px;
+ --h5-font-size: 26px;
+ --h6-font-size: 22px;
+
+ --p-font-size: 18px;
+ --menu-font-size: 18px;
+ --category-font-size: 14px;
+
+ --font-weight-light: 300;
+ --font-weight-normal: 400;
+ --font-weight-semibold: 600;
+ --font-weight-bold: 700;
+}
+
+.bodywebsite body {
+ background: var(--white-color);
+ font-family: var(--body-font-family);
+ position: relative;
+}
+
+/*---------------------------------------
+ TYPOGRAPHY
+-----------------------------------------*/
+
+.bodywebsite h2,
+.bodywebsite h3,
+.bodywebsite h4,
+.bodywebsite h5,
+.bodywebsite h6 {
+ color: var(--dark-color);
+ line-height: inherit;
+}
+
+.bodywebsite h1,
+.bodywebsite h2,
+.bodywebsite h3,
+.bodywebsite h4,
+.bodywebsite h5,
+.bodywebsite h6 {
+ font-weight: var(--font-weight-semibold);
+}
+
+.bodywebsite h1,
+.bodywebsite h2 {
+ font-weight: var(--font-weight-bold);
+}
+
+.bodywebsite h1 {
+ font-size: var(--h1-font-size);
+ line-height: normal;
+}
+
+.bodywebsite h2 {
+ font-size: var(--h2-font-size);
+}
+
+.bodywebsite h3 {
+ font-size: var(--h3-font-size);
+}
+
+.bodywebsite h4 {
+ font-size: var(--h4-font-size);
+}
+
+.bodywebsite h5 {
+ font-size: var(--h5-font-size);
+}
+
+.bodywebsite h6 {
+ font-size: var(--h6-font-size);
+}
+
+.bodywebsite p,
+.bodywebsite .list .list-item {
+ color: var(--p-color);
+ font-size: var(--p-font-size);
+ font-weight: var(--font-weight-light);
+}
+
+.bodywebsite a,
+.bodywebsite button {
+ touch-action: manipulation;
+ transition: all 0.3s;
+}
+
+.bodywebsite .form-label {
+ color: var(--p-color);
+ font-weight: var(--font-weight-semibold);
+}
+
+.bodywebsite a {
+ color: var(--secondary-color);
+ text-decoration: none;
+}
+
+.bodywebsite a:hover {
+ color: var(--primary-color);
+}
+
+.bodywebsite ::selection {
+ background: var(--primary-color);
+ color: var(--white-color);
+}
+
+.bodywebsite ::-moz-selection {
+ background: var(--primary-color);
+ color: var(--white-color);
+}
+
+.bodywebsite .section-padding {
+ padding-top: 6rem;
+ padding-bottom: 6rem;
+}
+
+.bodywebsite b,
+.bodywebsite strong {
+ font-weight: var(--font-weight-bold);
+}
+
+/*---------------------------------------
+ CUSTOM BUTTON
+-----------------------------------------*/
+.bodywebsite .custom-btn {
+ border: 0;
+ color: var(--white-color);
+ font-size: var(--menu-font-size);
+ padding: 10px 35px;
+}
+
+/*---------------------------------------
+ NAVIGATION
+-----------------------------------------*/
+.bodywebsite .navbar {
+ background: var(--white-color);
+ padding-top: 20px;
+ padding-bottom: 20px;
+}
+
+.bodywebsite .navbar-brand {
+ color: var(--dark-color);
+ font-size: var(--h5-font-size);
+ font-weight: var(--font-weight-bold);
+ margin-right: 0;
+}
+
+.bodywebsite .navbar-expand-lg .navbar-nav .nav-link {
+ padding-right: 1.5rem;
+ padding-left: 1.5rem;
+}
+
+.bodywebsite .navbar-expand-lg .nav-link {
+ color: var(--p-color);
+ font-weight: var(--font-weight-normal);
+ font-size: var(--menu-font-size);
+ padding-top: 15px;
+ padding-bottom: 15px;
+}
+
+.bodywebsite .navbar-nav .nav-link.active,
+.bodywebsite .nav-link:focus,
+.bodywebsite .nav-link:hover {
+ color: var(--primary-color);
+}
+
+.bodywebsite .nav-link:focus {
+ color: var(--p-color);
+}
+
+.bodywebsite .navbar-toggler {
+ border: 0;
+ padding: 0;
+ cursor: pointer;
+ margin: 0;
+ width: 30px;
+ height: 35px;
+ outline: none;
+}
+
+.bodywebsite .navbar-toggler:focus {
+ outline: none;
+ box-shadow: none;
+}
+
+.bodywebsite .navbar-toggler[aria-expanded="true"] .navbar-toggler-icon {
+ background: transparent;
+}
+
+.bodywebsite .navbar-toggler[aria-expanded="true"] .navbar-toggler-icon:before,
+.bodywebsite .navbar-toggler[aria-expanded="true"] .navbar-toggler-icon:after {
+ transition: top 300ms 50ms ease, -webkit-transform 300ms 350ms ease;
+ transition: top 300ms 50ms ease, transform 300ms 350ms ease;
+ transition: top 300ms 50ms ease, transform 300ms 350ms ease,
+ -webkit-transform 300ms 350ms ease;
+ top: 0;
+}
+
+.bodywebsite .navbar-toggler[aria-expanded="true"] .navbar-toggler-icon:before {
+ transform: rotate(45deg);
+}
+
+.bodywebsite .navbar-toggler[aria-expanded="true"] .navbar-toggler-icon:after {
+ transform: rotate(-45deg);
+}
+
+.bodywebsite .navbar-toggler .navbar-toggler-icon {
+ background: var(--dark-color);
+ transition: background 10ms 300ms ease;
+ display: block;
+ width: 30px;
+ height: 2px;
+ position: relative;
+}
+
+.bodywebsite .navbar-toggler .navbar-toggler-icon:before,
+.bodywebsite .navbar-toggler .navbar-toggler-icon:after {
+ transition: top 300ms 350ms ease, -webkit-transform 300ms 50ms ease;
+ transition: top 300ms 350ms ease, transform 300ms 50ms ease;
+ transition: top 300ms 350ms ease, transform 300ms 50ms ease,
+ -webkit-transform 300ms 50ms ease;
+ position: absolute;
+ right: 0;
+ left: 0;
+ background: var(--dark-color);
+ width: 30px;
+ height: 2px;
+ content: "";
+}
+
+.bodywebsite .navbar-toggler .navbar-toggler-icon:before {
+ top: -8px;
+}
+
+.bodywebsite .navbar-toggler .navbar-toggler-icon:after {
+ top: 8px;
+}
+
+/*---------------------------------------
+ SITE HEADER
+-----------------------------------------*/
+.bodywebsite .site-header {
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: cover;
+ padding-top: 10rem;
+ padding-bottom: 10rem;
+ text-align: center;
+ position: relative;
+}
+
+.bodywebsite .site-header .container {
+ position: relative;
+ z-index: 2;
+}
+
+.bodywebsite .site-news-detail-header {
+ background: transparent;
+ text-align: left;
+ padding-top: 6rem;
+ padding-bottom: 6rem;
+}
+
+.bodywebsite .site-about-header {
+ background-image: url("/viewimage.php?modulepart=medias&file=image/__WEBSITE_KEY__/header/briana-tozour-V_Nkf1E-vYA-unsplash.jpg");
+}
+
+.bodywebsite .site-menu-header {
+ background-image: url("/viewimage.php?modulepart=medias&file=image/__WEBSITE_KEY__/header/luisa-brimble-aFzg83dvnAI-unsplash.jpg");
+}
+
+.bodywebsite .site-news-header {
+ background-image: url("/viewimage.php?modulepart=medias&file=image/__WEBSITE_KEY__/header/priscilla-du-preez-W3SEyZODn8U-unsplash.jpg");
+}
+
+.bodywebsite .site-contact-header {
+ background-image: url("/viewimage.php?modulepart=medias&file=image/__WEBSITE_KEY__/header/rod-long-I79Pgmhmy5M-unsplash.jpg");
+}
+
+.bodywebsite .overlay {
+ background: linear-gradient(to top, var(--dark-color), transparent 100%);
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+}
+
+/*---------------------------------------
+ HERO
+-----------------------------------------*/
+.bodywebsite .hero {
+ position: relative;
+ overflow: hidden;
+ padding-top: 20.542rem;
+ padding-bottom: 20.542rem;
+}
+
+.bodywebsite .hero .container {
+ position: absolute;
+ z-index: 9;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ width: 100%;
+}
+
+.bodywebsite .video-wrap {
+ z-index: -100;
+}
+
+.bodywebsite .custom-video {
+ position: absolute;
+ top: 0;
+ left: 0;
+ object-fit: cover;
+ width: 100%;
+ height: 100%;
+}
+
+/*---------------------------------------
+ HERO SLIDE
+-----------------------------------------*/
+.bodywebsite .carousel-image {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+
+.bodywebsite .carousel-thumb {
+ position: relative;
+}
+
+.bodywebsite .carousel-caption {
+ background: linear-gradient(to top, var(--dark-color), transparent 90%);
+ text-align: left;
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: 60px 40px;
+}
+
+.bodywebsite .hero-carousel .reviews-text,
+.bodywebsite .hero-text {
+ color: var(--white-color);
+}
+
+.bodywebsite .price-tag {
+ background: var(--white-color);
+ border-radius: 100px;
+ color: var(--secondary-color);
+ font-size: var(--menu-font-size);
+ font-weight: var(--font-weight-semibold);
+ display: inline-block;
+ width: 84px;
+ height: 64px;
+ line-height: 64px;
+ text-align: center;
+}
+
+.bodywebsite .hero-carousel .carousel-control-prev,
+.bodywebsite .hero-carousel .carousel-control-next {
+ position: absolute;
+ top: auto;
+ bottom: 0;
+ opacity: 1;
+}
+
+.bodywebsite .hero-carousel .carousel-control-prev,
+.bodywebsite .hero-carousel .carousel-control-next {
+ background: var(--secondary-color);
+ width: 60px;
+ height: 60px;
+ text-align: center;
+}
+
+.bodywebsite .hero-carousel .carousel-control-prev {
+ left: auto;
+ right: 60px;
+}
+
+.bodywebsite .hero-carousel .carousel-control-next {
+ background: var(--primary-color);
+ right: 0;
+}
+
+.bodywebsite .hero-carousel .carousel-control-prev:hover,
+.bodywebsite .hero-carousel .carousel-control-next:hover {
+ background: var(--dark-color);
+}
+
+.bodywebsite .hero-carousel .carousel-control-prev-icon,
+.bodywebsite .hero-carousel .carousel-control-next-icon {
+ background-image: none;
+ width: inherit;
+ height: inherit;
+ line-height: 60px;
+}
+
+.bodywebsite .hero-carousel .carousel-control-prev-icon::before,
+.bodywebsite .hero-carousel .carousel-control-next-icon::before {
+ font-family: bootstrap-icons;
+ display: block;
+ margin: auto;
+ font-size: var(--h5-font-size);
+ color: var(--white-color);
+}
+
+.bodywebsite .hero-carousel .carousel-control-prev-icon::before {
+ content: "\f13f";
+}
+
+.bodywebsite .hero-carousel .carousel-control-next-icon::before {
+ content: "\f144";
+}
+
+.bodywebsite .reviews-icon {
+ color: var(--secondary-color);
+}
+
+/*---------------------------------------
+ MENU
+-----------------------------------------*/
+.bodywebsite .menu,
+.bodywebsite .about,
+.bodywebsite .related-news,
+.bodywebsite .newsletter,
+.bodywebsite .comments {
+ background: var(--section-bg-color);
+}
+
+.bodywebsite .menu-thumb {
+ position: relative;
+ overflow: hidden;
+}
+
+.bodywebsite .menu-info {
+ padding: 20px 20px 30px 20px;
+}
+
+.bodywebsite .menu-image {
+ display: block;
+}
+
+.bodywebsite .menu-image-wrap {
+ position: relative;
+}
+
+.bodywebsite .menu-tag {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin: 20px;
+}
+
+.bodywebsite .newsletter-image {
+ border-radius: 100%;
+ object-fit: cover;
+ display: block;
+ margin: 0 auto;
+ max-width: 450px;
+ max-height: 450px;
+}
+
+.bodywebsite .category-tag,
+.bodywebsite .menu-tag {
+ background: var(--dark-color);
+ border-radius: var(--border-radius-default);
+ color: var(--white-color);
+ font-size: var(--category-font-size);
+ display: inline-block;
+ padding: 4px 12px;
+}
+
+.bodywebsite .category-tag {
+ margin-bottom: 5px;
+}
+
+/*---------------------------------------
+ CUSTOM FORM
+-----------------------------------------*/
+.bodywebsite .custom-form .form-control {
+ margin-bottom: 20px;
+ padding: 14px 10px;
+ transition: all 0.3s;
+}
+
+.bodywebsite .custom-form button[type="submit"] {
+ background: var(--dark-color);
+ border: 0;
+ color: var(--white-color);
+ text-transform: uppercase;
+}
+
+.bodywebsite .custom-form button[type="submit"]:hover {
+ background: var(--primary-color);
+}
+
+/*---------------------------------------
+ SUBSCRIBE FORM
+-----------------------------------------*/
+.bodywebsite .subscribe-form .form-control {
+ margin-top: 20px;
+ margin-bottom: 10px;
+}
+
+.bodywebsite .booking-form .form-control {
+ font-weight: var(--font-weight-normal);
+ padding-top: 12px;
+ padding-bottom: 12px;
+ margin-bottom: 25px;
+ transition: all 0.3s;
+}
+
+.bodywebsite .booking-form button[type="submit"] {
+ background: var(--dark-color);
+ border: 0;
+ font-weight: var(--font-weight-semibold);
+ color: var(--white-color);
+ text-transform: uppercase;
+ margin-bottom: 0;
+}
+
+.bodywebsite .booking-form button[type="submit"]:hover {
+ background: var(--primary-color);
+}
+/*---------------------------------------
+ FOOTER
+-----------------------------------------*/
+.bodywebsite .site-footer {
+ background-image: url("../images/daan-evers-tKN1WXrzQ3s-unsplash.jpg");
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: cover;
+ padding-top: 3rem;
+ padding-bottom: 3rem;
+ position: relative;
+}
+
+.bodywebsite .site-footer::before {
+ content: "";
+ background: linear-gradient(to top, var(--dark-color), transparent 200%);
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+}
+
+.bodywebsite .site-footer .container {
+ position: relative;
+}
+
+.bodywebsite .tooplate-mt30 {
+ margin-top: 30px;
+}
+.bodywebsite .tooplate-mt60 {
+ margin-top: 60px;
+}
+
+.bodywebsite .copyright-text {
+ font-size: var(--menu-font-size);
+}
+
+.bodywebsite .tel-link {
+ color: var(--p-color);
+}
+
+.bodywebsite .site-footer a:hover {
+ color: var(--white-color);
+}
+
+.bodywebsite .site-footer a {
+ color: #aaa;
+}
+
+.bodywebsite .site-footer p {
+ color: #aaa;
+}
+
+/*---------------------------------------
+ SOCIAL ICON
+-----------------------------------------*/
+.bodywebsite .social-icon {
+ margin: 0;
+ padding: 0;
+}
+
+.bodywebsite .social-icon li {
+ list-style: none;
+ display: inline-block;
+ vertical-align: top;
+ transition: all 0.3s;
+}
+
+.bodywebsite .social-icon:hover li:not(:hover) {
+ opacity: 0.65;
+}
+
+.bodywebsite .social-icon-link {
+ color: var(--p-color);
+ font-size: var(--p-font-size);
+ display: inline-block;
+ vertical-align: top;
+ margin-top: 4px;
+ margin-bottom: 4px;
+ margin-right: 15px;
+}
+
+.bodywebsite .social-icon-link:hover {
+ color: var(--primary-color);
+}
+
+/*---------------------------------------
+ RESPONSIVE STYLES
+-----------------------------------------*/
+@media screen and (max-width: 1180px) {
+ h1 {
+ font-size: 62px;
+ }
+}
+
+@media screen and (max-width: 1170px) {
+ h1 {
+ font-size: 56px;
+ }
+}
+
+@media screen and (max-width: 991px) {
+ .bodywebsite h1 {
+ font-size: 38px;
+ }
+
+ .bodywebsite h2 {
+ font-size: 32px;
+ }
+
+ .bodywebsite h3 {
+ font-size: 26px;
+ }
+
+ .bodywebsite h4 {
+ font-size: 24px;
+ }
+
+ .bodywebsite h5 {
+ font-size: 20px;
+ }
+
+ .bodywebsite h6 {
+ font-size: 18px;
+ }
+
+ .bodywebsite .site-header,
+ .bodywebsite .section-padding {
+ padding-top: 5rem;
+ padding-bottom: 5rem;
+ }
+
+ .bodywebsite .navbar {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ }
+
+ .bodywebsite .navbar-nav .nav-link {
+ padding-top: 5px;
+ padding-bottom: 10px;
+ }
+
+ .bodywebsite #BookingModal .modal-content {
+ padding-bottom: 200px;
+ }
+
+ .bodywebsite #BookingModal .modal-content::before {
+ background-image: url("../images/sincerely-media-HoEYgBL_Gcs-unsplash-mobile.jpg");
+ background-position: bottom;
+ top: auto;
+ left: 0;
+ bottom: 0;
+ width: 100%;
+ height: 200px;
+ transform: rotate(180deg);
+ }
+
+ .bodywebsite #BookingModal .modal-body {
+ padding-top: 18px;
+ padding-right: 32px;
+ }
+}
+
+@media screen and (max-width: 480px) {
+ .bodywebsite .newsletter-image {
+ max-width: 310px;
+ max-height: 310px;
+ }
+
+ .bodywebsite .hero-carousel .carousel-control-prev,
+ .bodywebsite .hero-carousel .carousel-control-next {
+ width: 50px;
+ height: 50px;
+ }
+}
+
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/containers/wrapper.php b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/wrapper.php
new file mode 100644
index 00000000000..26adb3ef220
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/containers/wrapper.php
@@ -0,0 +1,278 @@
+entity;
+$original_file = GETPOST("file", "alpha");
+$l = GETPOST('l', 'aZ09');
+$limit = GETPOST('limit', 'int');
+
+// Parameters for RSS
+$rss = GETPOST('rss', 'aZ09');
+if ($rss) {
+ $original_file = 'blog.rss';
+}
+
+// If we have a hash public (hashp), we guess the original_file.
+if (!empty($hashp)) {
+ include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
+ $ecmfile = new EcmFiles($db);
+ $result = $ecmfile->fetch(0, '', '', '', $hashp);
+ if ($result > 0) {
+ $tmp = explode('/', $ecmfile->filepath, 2); // $ecmfile->filepath is relative to document directory
+ // filepath can be 'users/X' or 'X/propale/PR11111'
+ if (is_numeric($tmp[0])) { // If first tmp is numeric, it is subdir of company for multicompany, we take next part.
+ $tmp = explode('/', $tmp[1], 2);
+ }
+ $moduleparttocheck = $tmp[0]; // moduleparttocheck is first part of path
+
+ if ($modulepart) { // Not required, so often not defined, for link using public hashp parameter.
+ if ($moduleparttocheck == $modulepart) {
+ // We remove first level of directory
+ $original_file = (($tmp[1] ? $tmp[1].'/' : '').$ecmfile->filename); // this is relative to module dir
+ //var_dump($original_file); exit;
+ } else {
+ print 'Bad link. File is from another module part.';
+ }
+ } else {
+ $modulepart = $moduleparttocheck;
+ $original_file = (($tmp[1] ? $tmp[1].'/' : '').$ecmfile->filename); // this is relative to module dir
+ }
+ } else {
+ print "ErrorFileNotFoundWithSharedLink";
+ exit;
+ }
+}
+
+// Define attachment (attachment=true to force choice popup 'open'/'save as')
+$attachment = true;
+if (preg_match('/\.(html|htm)$/i', $original_file)) {
+ $attachment = false;
+}
+if (isset($_GET["attachment"])) {
+ $attachment = (GETPOST("attachment", 'alphanohtml') ? true : false);
+}
+if (!empty($conf->global->MAIN_DISABLE_FORCE_SAVEAS_WEBSITE)) {
+ $attachment = false;
+}
+
+// Define mime type
+$type = 'application/octet-stream';
+if (GETPOSTISSET('type')) {
+ $type = GETPOST('type', 'alpha');
+} else {
+ $type = dol_mimetype($original_file);
+}
+
+// Security: Delete string ../ into $original_file
+$original_file = str_replace("../", "/", $original_file);
+
+// Cache or not
+if (GETPOST("cache", 'aZ09') || image_format_supported($original_file) >= 0) {
+ // Important: Following code is to avoid page request by browser and PHP CPU at
+ // each Dolibarr page access.
+ header('Cache-Control: max-age=3600, public, must-revalidate');
+ header('Pragma: cache'); // This is to avoid having Pragma: no-cache
+}
+
+$refname = basename(dirname($original_file)."/");
+
+// Get RSS news
+if ($rss) {
+ $format = 'rss';
+ $type = '';
+ $cachedelay = 0;
+ $filename = $original_file;
+ $dir_temp = $conf->website->dir_temp;
+
+ include_once DOL_DOCUMENT_ROOT.'/website/class/website.class.php';
+ include_once DOL_DOCUMENT_ROOT.'/website/class/websitepage.class.php';
+ $website = new Website($db);
+ $websitepage = new WebsitePage($db);
+
+ $website->fetch('', $websitekey);
+
+ $filters = array('type_container'=>'blogpost', 'status'=>1);
+ if ($l) {
+ $filters['lang'] = $l;
+ }
+
+ $MAXNEWS = ($limit ? $limit : 20);
+ $arrayofblogs = $websitepage->fetchAll($website->id, 'DESC', 'date_creation', $MAXNEWS, 0, $filters);
+ $eventarray = array();
+ if (is_array($arrayofblogs)) {
+ foreach ($arrayofblogs as $blog) {
+ $blog->fullpageurl = $website->virtualhost.'/'.$blog->pageurl.'.php';
+ $eventarray[] = $blog;
+ }
+ }
+
+ require_once DOL_DOCUMENT_ROOT."/core/lib/xcal.lib.php";
+ require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php";
+ require_once DOL_DOCUMENT_ROOT."/core/lib/files.lib.php";
+
+ dol_syslog("build_exportfile Build export file format=".$format.", type=".$type.", cachedelay=".$cachedelay.", filename=".$filename.", filters size=".count($filters), LOG_DEBUG);
+
+ // Clean parameters
+ if (!$filename) {
+ $extension = 'rss';
+ $filename = $format.'.'.$extension;
+ }
+
+ // Create dir and define output file (definitive and temporary)
+ $result = dol_mkdir($dir_temp);
+ $outputfile = $dir_temp.'/'.$filename;
+
+ $result = 0;
+
+ $buildfile = true;
+
+ if ($cachedelay) {
+ $nowgmt = dol_now();
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ if (dol_filemtime($outputfile) > ($nowgmt - $cachedelay)) {
+ dol_syslog("build_exportfile file ".$outputfile." is not older than now - cachedelay (".$nowgmt." - ".$cachedelay."). Build is canceled");
+ $buildfile = false;
+ }
+ }
+
+ if ($buildfile) {
+ $outputlangs = new Translate('', $conf);
+ $outputlangs->setDefaultLang($l);
+ $outputlangs->loadLangs(array("main", "other"));
+ $title = $desc = $outputlangs->transnoentities('LatestBlogPosts');
+
+ // Create temp file
+ $outputfiletmp = tempnam($dir_temp, 'tmp'); // Temporary file (allow call of function by different threads
+ @chmod($outputfiletmp, octdec($conf->global->MAIN_UMASK));
+
+ // Write file
+ $result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l);
+
+ if ($result >= 0) {
+ if (dol_move($outputfiletmp, $outputfile, 0, 1)) {
+ $result = 1;
+ } else {
+ $error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile;
+ dol_syslog("build_exportfile ".$error, LOG_ERR);
+ dol_delete_file($outputfiletmp, 0, 1);
+ print $error;
+ exit(-1);
+ }
+ } else {
+ dol_syslog("build_exportfile build_xxxfile function fails to for format=".$format." outputfiletmp=".$outputfile, LOG_ERR);
+ dol_delete_file($outputfiletmp, 0, 1);
+ $langs->load("errors");
+ print $langs->trans("ErrorFailToCreateFile", $outputfile);
+ exit(-1);
+ }
+ }
+
+ if ($result >= 0) {
+ $attachment = false;
+ if (isset($_GET["attachment"])) {
+ $attachment = $_GET["attachment"];
+ }
+ //$attachment = false;
+ $contenttype = 'application/rss+xml';
+ if (isset($_GET["contenttype"])) {
+ $contenttype = $_GET["contenttype"];
+ }
+ //$contenttype='text/plain';
+ $outputencoding = 'UTF-8';
+
+ if ($contenttype) {
+ header('Content-Type: '.$contenttype.($outputencoding ? '; charset='.$outputencoding : ''));
+ }
+ if ($attachment) {
+ header('Content-Disposition: attachment; filename="'.$filename.'"');
+ }
+
+ // Ajout directives pour resoudre bug IE
+ //header('Cache-Control: Public, must-revalidate');
+ //header('Pragma: public');
+ if ($cachedelay) {
+ header('Cache-Control: max-age='.$cachedelay.', private, must-revalidate');
+ } else {
+ header('Cache-Control: private, must-revalidate');
+ }
+
+ // Clean parameters
+ $outputfile = $dir_temp.'/'.$filename;
+ $result = readfile($outputfile);
+ if (!$result) {
+ print 'File '.$outputfile.' was empty.';
+ }
+
+ // header("Location: ".DOL_URL_ROOT.'/document.php?modulepart=agenda&file='.urlencode($filename));
+ exit;
+ }
+} elseif ($modulepart == "mycompany" && preg_match('/^\/?logos\//', $original_file)) {
+ // Get logos
+ readfile(dol_osencode($conf->mycompany->dir_output."/".$original_file));
+} else {
+ // Find the subdirectory name as the reference
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ $check_access = dol_check_secure_access_document($modulepart, $original_file, $entity, $refname);
+ $accessallowed = empty($check_access['accessallowed']) ? '' : $check_access['accessallowed'];
+ $sqlprotectagainstexternals = empty($check_access['sqlprotectagainstexternals']) ? '' : $check_access['sqlprotectagainstexternals'];
+ $fullpath_original_file = empty($check_access['original_file']) ? '' : $check_access['original_file']; // $fullpath_original_file is now a full path name
+ if ($hashp) {
+ $accessallowed = 1; // When using hashp, link is public so we force $accessallowed
+ $sqlprotectagainstexternals = '';
+ }
+
+ // Security:
+ // Limit access if permissions are wrong
+ if (!$accessallowed) {
+ print 'Access forbidden';
+ exit;
+ }
+
+ clearstatcache();
+
+ $filename = basename($fullpath_original_file);
+
+ // Output file on browser
+ dol_syslog("wrapper.php download $fullpath_original_file filename=$filename content-type=$type");
+ $fullpath_original_file_osencoded = dol_osencode($fullpath_original_file); // New file name encoded in OS encoding charset
+
+ // This test if file exists should be useless. We keep it to find bug more easily
+ if (!file_exists($fullpath_original_file_osencoded)) {
+ print "ErrorFileDoesNotExists: ".$original_file;
+ exit;
+ }
+
+ // Permissions are ok and file found, so we return it
+ //top_httphead($type);
+ header('Content-Type: '.$type);
+ header('Content-Description: File Transfer');
+ if ($encoding) {
+ header('Content-Encoding: '.$encoding);
+ }
+ // Add MIME Content-Disposition from RFC 2183 (inline=automatically displayed, attachment=need user action to open)
+ if ($attachment) {
+ header('Content-Disposition: attachment; filename="'.$filename.'"');
+ } else {
+ header('Content-Disposition: inline; filename="'.$filename.'"');
+ }
+ header('Content-Length: '.dol_filesize($fullpath_original_file));
+
+ readfile($fullpath_original_file_osencoded);
+}
+if (is_object($db)) {
+ $db->close();
+}
+// END PHP
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/alex-haney-CAhjZmVk5H4-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/alex-haney-CAhjZmVk5H4-unsplash.jpg
new file mode 100644
index 00000000000..b560348e307
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/alex-haney-CAhjZmVk5H4-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/brett-jordan-8xt8-HIFqc8-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/brett-jordan-8xt8-HIFqc8-unsplash.jpg
new file mode 100644
index 00000000000..ad6b019c9db
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/brett-jordan-8xt8-HIFqc8-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/louis-hansel-dphM2U1xq0U-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/louis-hansel-dphM2U1xq0U-unsplash.jpg
new file mode 100644
index 00000000000..86554c885ff
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/louis-hansel-dphM2U1xq0U-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/lucas-swennen-1W_MyJSRLuQ-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/lucas-swennen-1W_MyJSRLuQ-unsplash.jpg
new file mode 100644
index 00000000000..c666b35e4ff
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/lucas-swennen-1W_MyJSRLuQ-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/luisa-brimble-aFzg83dvnAI-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/luisa-brimble-aFzg83dvnAI-unsplash.jpg
new file mode 100644
index 00000000000..4935dc39ab8
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/luisa-brimble-aFzg83dvnAI-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/priscilla-du-preez-W3SEyZODn8U-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/priscilla-du-preez-W3SEyZODn8U-unsplash.jpg
new file mode 100644
index 00000000000..2bfea3596c4
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/priscilla-du-preez-W3SEyZODn8U-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/rod-long-I79Pgmhmy5M-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/rod-long-I79Pgmhmy5M-unsplash.jpg
new file mode 100644
index 00000000000..8cd3d3d1e4a
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/breakfast/rod-long-I79Pgmhmy5M-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/charles-deluvio-FdDkfYFHqe4-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/charles-deluvio-FdDkfYFHqe4-unsplash.jpg
new file mode 100644
index 00000000000..f226187380f
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/charles-deluvio-FdDkfYFHqe4-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/daan-evers-tKN1WXrzQ3s-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/daan-evers-tKN1WXrzQ3s-unsplash.jpg
new file mode 100644
index 00000000000..8c2def33f78
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/daan-evers-tKN1WXrzQ3s-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/dinner/farhad-ibrahimzade-ZipYER3NLhY-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/dinner/farhad-ibrahimzade-ZipYER3NLhY-unsplash.jpg
new file mode 100644
index 00000000000..acd46fc663f
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/dinner/farhad-ibrahimzade-ZipYER3NLhY-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/dinner/farhad-ibrahimzade-isHUj3N0194-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/dinner/farhad-ibrahimzade-isHUj3N0194-unsplash.jpg
new file mode 100644
index 00000000000..04a4f0fff90
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/dinner/farhad-ibrahimzade-isHUj3N0194-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/dinner/keriliwi-c3mFafsFz2w-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/dinner/keriliwi-c3mFafsFz2w-unsplash.jpg
new file mode 100644
index 00000000000..e011d4d1e5b
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/dinner/keriliwi-c3mFafsFz2w-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/header/briana-tozour-V_Nkf1E-vYA-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/header/briana-tozour-V_Nkf1E-vYA-unsplash.jpg
new file mode 100644
index 00000000000..f1d8eddf578
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/header/briana-tozour-V_Nkf1E-vYA-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/header/luisa-brimble-aFzg83dvnAI-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/header/luisa-brimble-aFzg83dvnAI-unsplash.jpg
new file mode 100644
index 00000000000..5d151a7d3fa
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/header/luisa-brimble-aFzg83dvnAI-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/header/priscilla-du-preez-W3SEyZODn8U-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/header/priscilla-du-preez-W3SEyZODn8U-unsplash.jpg
new file mode 100644
index 00000000000..0433e1e8cea
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/header/priscilla-du-preez-W3SEyZODn8U-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/header/rod-long-I79Pgmhmy5M-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/header/rod-long-I79Pgmhmy5M-unsplash.jpg
new file mode 100644
index 00000000000..5c980d4764c
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/header/rod-long-I79Pgmhmy5M-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/lunch/farhad-ibrahimzade-D5c9ZciQy_I-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/lunch/farhad-ibrahimzade-D5c9ZciQy_I-unsplash.jpg
new file mode 100644
index 00000000000..93f2861f4ed
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/lunch/farhad-ibrahimzade-D5c9ZciQy_I-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/lunch/farhad-ibrahimzade-MGKqxm6u2bc-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/lunch/farhad-ibrahimzade-MGKqxm6u2bc-unsplash.jpg
new file mode 100644
index 00000000000..0995f0b2110
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/lunch/farhad-ibrahimzade-MGKqxm6u2bc-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/lunch/louis-hansel-cH5IPjaAYyo-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/lunch/louis-hansel-cH5IPjaAYyo-unsplash.jpg
new file mode 100644
index 00000000000..6dcd9a26bf4
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/lunch/louis-hansel-cH5IPjaAYyo-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/lunch/louis-hansel-rheOvfxOlOA-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/lunch/louis-hansel-rheOvfxOlOA-unsplash.jpg
new file mode 100644
index 00000000000..df1868563d3
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/lunch/louis-hansel-rheOvfxOlOA-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/slide/ivan-torres-MQUqbmszGGM-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/slide/ivan-torres-MQUqbmszGGM-unsplash.jpg
new file mode 100644
index 00000000000..bbf0fed93ea
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/slide/ivan-torres-MQUqbmszGGM-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/slide/jason-leung-O67LZfeyYBk-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/slide/jason-leung-O67LZfeyYBk-unsplash.jpg
new file mode 100644
index 00000000000..ea1ae5a96ab
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/slide/jason-leung-O67LZfeyYBk-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/slide/jay-wennington-N_Y88TWmGwA-unsplash.jpg b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/slide/jay-wennington-N_Y88TWmGwA-unsplash.jpg
new file mode 100644
index 00000000000..1b81640a322
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-restaurant/medias/image/websitekey/slide/jay-wennington-N_Y88TWmGwA-unsplash.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-restaurant/website_pages.sql b/htdocs/install/doctemplates/websites/website_template-restaurant/website_pages.sql
new file mode 100644
index 00000000000..f088e50d33e
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-restaurant/website_pages.sql
@@ -0,0 +1,24 @@
+-- File generated by Dolibarr 17.0.0-beta -- 2022-11-20 14:10:56 UTC --;
+-- Page ID 248 -> 1__+MAX_llx_website_page__ - Aliases about --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(1__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'about', '', 'About us', '', '', '', '', '1', '2022-08-09 16:40:13', '2022-11-20 14:15:19', null, '', 'page', '', '__N____N____N__
__N__ __N____N__ __N____N__ __N__ __N__
__N____N__
__N__
Team Members __N__ __N____N__
__N__
__N__
__N__ __N__
__N__
Sophia __N____N__
CEO & Founder
__N__
__N__
__N__
__N____N__
__N__
__N__
__N____N__
Benjamin W. __N____N__
Restaurant Manager
__N__
__N__
__N____N__
__N__
__N__
__N__ __N__
Muchen Jack __N____N__
Senior Chef
__N__
__N__
__N____N__
__N__
__N__ __N__ __N__ __N____N__ __N____N____N____N____N__', '', 0);
+-- File generated by Dolibarr 17.0.0-beta -- 2022-11-20 14:10:56 UTC --;
+-- Page ID 249 -> 2__+MAX_llx_website_page__ - Aliases contact --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(2__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'contact', '', 'Contact us', '', '', '', '', '1', '2022-08-16 14:40:51', '2022-11-20 14:50:10', null, '', 'page', '', '__N__email;__N__ $message = GETPOST(\'message\', \'alpha\');__N__ $cmail = new CMailFile(\'Contact from website\', $to, $from, $message);__N__ if ($cmail->sendfile()) {__N__ ?>__N__ __N__ trans(\"ErrorFailedToSendMail\", $from, $to).\'. \'.$cmail->error;__N__ }__N__}__N__?>__N____N____N____N____N__
__N__ __N__ __N____N__ __N__ __N__ __N__ __N____N____N__ __N__ __N__ __N__ __N__
__N__ __N____N__
__N__ __N__
__N__ \" />__N__ __N__ __N__ Full Name__N____N__ __N__
__N____N__ __N__ Email Address__N____N__ __N__
__N____N__ __N__ Phone Number__N____N__ __N__
__N____N__ __N__ Number of persons__N____N__ __N__
__N____N__ __N__ Date__N____N__ __N__
__N____N__ __N__ Time__N____N__ __N__ __N__ 5:00 PM__N__ __N__ 6:00 PM __N__ 7:00 PM __N__ 8:00 PM __N__ 9:00 PM __N__ __N__
__N____N__ __N__ Special Request__N____N__ __N__
__N____N__ __N__ __N__ Submit Request__N__ __N__
__N__ __N__ __N__ __N____N__ __N__
__N__ __N__ __N____N__ __N____N____N____N____N__', '', 0);
+-- File generated by Dolibarr 17.0.0-beta -- 2022-11-20 14:10:56 UTC --;
+-- Page ID 252 -> 3__+MAX_llx_website_page__ - Aliases footer --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(3__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'footer', '', 'Footer', '', '', '', '', '1', '2022-11-20 12:51:50', '2022-11-20 14:07:39', null, '', 'other', '', '__N____N__', '', 0);
+-- File generated by Dolibarr 17.0.0-beta -- 2022-11-20 14:10:56 UTC --;
+-- Page ID 253 -> 4__+MAX_llx_website_page__ - Aliases header --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(4__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'header', '', 'Header', '', '', '', '', '1', '2022-11-20 13:12:33', '2022-11-20 14:21:25', null, '', 'menu', '', '__N____N__', '', 0);
+-- File generated by Dolibarr 17.0.0-beta -- 2022-11-20 14:10:56 UTC --;
+-- Page ID 250 -> 5__+MAX_llx_website_page__ - Aliases index --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(5__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'index', '', 'index', '', '', '', '', '1', '2022-08-09 16:34:54', '2022-11-20 15:10:45', null, '', 'page', '', '__N____N____N____N____N____N__ __N__ __N__ __N__
__N__
__N__
__N__
__N__ Delicious Steaks__N__ __N____N__
__N__
__N__ __N__ __N__ __N__ __N__ __N__ __N__
__N__ __N__
__N__
__N__
__N____N__
__N__
__N__ __N__
__N__
__N____N__
__N__
__N__ Fine Dining Restaurant__N__ __N__ __N__
__N____N__
__N__
__N____N__
__N__
__N__ Steak __N____N__ 26.50€ __N__ __N__
__N__
__N____N__ __N__
__N____N__
__N__
__N__ __N__ Sausage Pasta__N__ __N____N__ 18.25€ __N__ __N__
__N__ __N__
__N____N__ __N__ __N__ Previous __N__ __N____N__ __N__ __N__ Next __N__ __N__ __N__ __N__ __N__ __N____N__
__N__ __N____N__
__N__ __N____N__ __N__ __N__
__N__ __N__ __N____N__ __N__ __N__
__N__ __N__ __N____N__ __N__ __N__
__N__ __N__ __N____N__ __N__ __N__
__N__ __N__ __N__
__N__ __N__ __N__ __N____N__ __N____N____N____N__', '', 0);
+UPDATE llx_website SET fk_default_home = 5__+MAX_llx_website_page__ WHERE rowid = __WEBSITE_ID__;
+-- File generated by Dolibarr 17.0.0-beta -- 2022-11-20 14:10:56 UTC --;
+-- Page ID 251 -> 6__+MAX_llx_website_page__ - Aliases menu --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(6__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'menu', '', 'Our menus', '', '', '', '', '1', '2022-08-16 14:37:03', '2022-11-20 14:30:03', null, '', 'page', '', '__N____N____N____N____N__
__N__ __N__ __N__ __N____N__
__N__ __N__ __N____N__
__N__ __N__ __N__ __N__ __N____N____N____N____N____N__', '', 0);
+
+-- For Dolibarr v14+ --;
+UPDATE llx_website SET lang = 'en' WHERE rowid = __WEBSITE_ID__;
+UPDATE llx_website SET otherlang = '' WHERE rowid = __WEBSITE_ID__;
+
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar.zip b/htdocs/install/doctemplates/websites/website_template-stellar.zip
deleted file mode 100644
index 3c9643c8960..00000000000
Binary files a/htdocs/install/doctemplates/websites/website_template-stellar.zip and /dev/null differ
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/LICENSE b/htdocs/install/doctemplates/websites/website_template-stellar/LICENSE
new file mode 100644
index 00000000000..871ef743662
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/LICENSE
@@ -0,0 +1,4 @@
+LICENSE
+-------
+
+CC-BY-SA - https://creativecommons.org/licenses/by/4.0/
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/README.md b/htdocs/install/doctemplates/websites/website_template-stellar/README.md
new file mode 100644
index 00000000000..3a656b8ddaf
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/README.md
@@ -0,0 +1 @@
+Website generated by Dolibarr ERP CRM
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/.dolibarr b/htdocs/install/doctemplates/websites/website_template-stellar/containers/.dolibarr
new file mode 100644
index 00000000000..0ef9997b4ab
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/.dolibarr
@@ -0,0 +1,2 @@
+# Some properties for Dolibarr web site CMS
+param=value
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/.htaccess b/htdocs/install/doctemplates/websites/website_template-stellar/containers/.htaccess
new file mode 100644
index 00000000000..ed27b33461f
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/.htaccess
@@ -0,0 +1,2 @@
+# Order allow,deny
+# Deny from all
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/README.md b/htdocs/install/doctemplates/websites/website_template-stellar/containers/README.md
new file mode 100644
index 00000000000..06b47fbfb9d
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/README.md
@@ -0,0 +1 @@
+Design provided by HTML5up unde CC license. See https://html5up.net/license.
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/credits.php b/htdocs/install/doctemplates/websites/website_template-stellar/containers/credits.php
new file mode 100644
index 00000000000..9413220a642
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/credits.php
@@ -0,0 +1,4 @@
+ref.'/page20.tpl.php';
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/footer.php b/htdocs/install/doctemplates/websites/website_template-stellar/containers/footer.php
new file mode 100644
index 00000000000..f49ea9820eb
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/footer.php
@@ -0,0 +1,4 @@
+ref.'/page21.tpl.php';
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/generic.php b/htdocs/install/doctemplates/websites/website_template-stellar/containers/generic.php
new file mode 100644
index 00000000000..125a586cbbf
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/generic.php
@@ -0,0 +1,4 @@
+ref.'/page22.tpl.php';
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/home.php b/htdocs/install/doctemplates/websites/website_template-stellar/containers/home.php
new file mode 100644
index 00000000000..17b2d2fcb5e
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/home.php
@@ -0,0 +1,4 @@
+ref.'/page23.tpl.php';
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/htmlheader.html b/htdocs/install/doctemplates/websites/website_template-stellar/containers/htmlheader.html
new file mode 100644
index 00000000000..7d92b6f479e
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/htmlheader.html
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/index.php b/htdocs/install/doctemplates/websites/website_template-stellar/containers/index.php
new file mode 100644
index 00000000000..3f2d97e57ac
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/index.php
@@ -0,0 +1,11 @@
+
+/* JS content (all pages) */
+
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/manifest.json.php b/htdocs/install/doctemplates/websites/website_template-stellar/containers/manifest.json.php
new file mode 100644
index 00000000000..b61531d6c11
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/manifest.json.php
@@ -0,0 +1,13 @@
+
+
+ref.'/page24.tpl.php';
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/page20.tpl.php b/htdocs/install/doctemplates/websites/website_template-stellar/containers/page20.tpl.php
new file mode 100644
index 00000000000..ace3135f312
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/page20.tpl.php
@@ -0,0 +1,75 @@
+
+
+
+
Credits
+
+
+
+
+
+
+
+
+
+use_manifest) { print '
'."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+This site is edited by name; ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/page21.tpl.php b/htdocs/install/doctemplates/websites/website_template-stellar/containers/page21.tpl.php
new file mode 100644
index 00000000000..9cbab5789c9
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/page21.tpl.php
@@ -0,0 +1,91 @@
+
+
+
+
Footer
+
+
+
+
+
+
+
+
+
+use_manifest) { print '
'."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Top
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/page22.tpl.php b/htdocs/install/doctemplates/websites/website_template-stellar/containers/page22.tpl.php
new file mode 100644
index 00000000000..87bf7faf346
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/page22.tpl.php
@@ -0,0 +1,119 @@
+
+
+
+
Generic page
+
+
+
+
+
+
+
+
+
+use_manifest) { print '
'."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Magna feugiat lorem
+ Donec eget ex magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque venenatis dolor imperdiet dolor mattis sagittis. Praesent rutrum sem diam, vitae egestas enim auctor sit amet. Pellentesque leo mauris, consectetur id ipsum sit amet, fergiat. Pellentesque in mi eu massa lacinia malesuada et a elit. Donec urna ex, lacinia in purus ac, pretium pulvinar mauris. Curabitur sapien risus, commodo eget turpis at, elementum convallis fames ac ante ipsum primis in faucibus.
+ Pellentesque venenatis dolor imperdiet dolor mattis sagittis. Praesent rutrum sem diam, vitae egestas enim auctor sit amet.
+ Tempus veroeros
+ Cep risus aliquam gravida cep ut lacus amet. Adipiscing faucibus nunc placerat. Tempus adipiscing turpis non blandit accumsan eget lacinia nunc integer interdum amet aliquam ut orci non col ut ut praesent.
+
+
+
+
+ Latest Blog posts
+
+ loadLangs(array("main","website"));
+ $fuser = new User($db);
+ $arrayofblogs = $websitepage->fetchAll($website->id, 'DESC', 'date_creation', 5, 0, array('type_container'=>'blogpost', 'status'=>1, 'lang'=>'null,'.$websitepage->lang)); // , 'keywords'=>$keyword
+ if (is_numeric($arrayofblogs) && $arrayofblogs < 0) {
+ print '
'.$weblangs->trans($websitepage->error).'
';
+ } elseif (is_array($arrayofblogs) && ! empty($arrayofblogs)) {
+ foreach ($arrayofblogs as $blog) {
+ print '
';
+ }
+ } else {
+ print '
';
+ print '
';
+ //print $weblangs->trans("NoArticlesFoundForTheKeyword", $keyword);
+ print $weblangs->trans("NoArticlesFound");
+ print '
';
+ print '
';
+ }
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/page23.tpl.php b/htdocs/install/doctemplates/websites/website_template-stellar/containers/page23.tpl.php
new file mode 100644
index 00000000000..43664b7984b
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/page23.tpl.php
@@ -0,0 +1,163 @@
+
+
+
+
My personal blog
+
+
+
+
+
+
+
+
+
+use_manifest) { print '
'."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Sed lorem ipsum dolor sit amet nullam consequat feugiat consequat magna
+ adipiscing magna etiam amet veroeros. Lorem ipsum dolor tempus sit cursus.
+ Tempus nisl et nullam lorem ipsum dolor sit amet aliquam.
+
+
+
+
+
+
+
+
+
+
+
+
+ Ipsum consequat
+ Sed lorem amet ipsum dolor et amet nullam consequat a feugiat consequat tempus veroeros sed consequat.
+
+
+
+ Amed sed feugiat
+ Sed lorem amet ipsum dolor et amet nullam consequat a feugiat consequat tempus veroeros sed consequat.
+
+
+
+ Dolor nullam
+ Sed lorem amet ipsum dolor et amet nullam consequat a feugiat consequat tempus veroeros sed consequat.
+
+
+
+
+
+
+
+
+
+
+
+ 5,120 Etiam
+
+
+
+ 8,192 Magna
+
+
+
+ 2,048 Tempus
+
+
+
+ 4,096 Aliquam
+
+
+
+ 1,024 Nullam
+
+
+ Nam elementum nisl et mi a commodo porttitor. Morbi sit amet nisl eu arcu faucibus hendrerit vel a risus. Nam a orci mi, elementum ac arcu sit amet, fermentum pellentesque et purus. Integer maximus varius lorem, sed convallis diam accumsan sed. Etiam porttitor placerat sapien, sed eleifend a enim pulvinar faucibus semper quis ut arcu. Ut non nisl a mollis est efficitur vestibulum. Integer eget purus nec nulla mattis et accumsan ut magna libero. Morbi auctor iaculis porttitor. Sed ut magna ac risus et hendrerit scelerisque. Praesent eleifend lacus in lectus aliquam porta. Cras eu ornare dui curabitur lacinia.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/page24.tpl.php b/htdocs/install/doctemplates/websites/website_template-stellar/containers/page24.tpl.php
new file mode 100644
index 00000000000..3ea7a55dbd5
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/page24.tpl.php
@@ -0,0 +1,48 @@
+
+
+
+
Menu
+
+
+
+
+
+
+
+
+
+use_manifest) { print '
'."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/page25.tpl.php b/htdocs/install/doctemplates/websites/website_template-stellar/containers/page25.tpl.php
new file mode 100644
index 00000000000..ec9e02f4914
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/page25.tpl.php
@@ -0,0 +1,44 @@
+
+
+
+
This is a Blog post
+
+
+
+
+
+
+
+
+
+use_manifest) { print '
'."\n"; } ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This is a blog post article...
+
+
+
+
+
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/robots.txt b/htdocs/install/doctemplates/websites/website_template-stellar/containers/robots.txt
new file mode 100644
index 00000000000..2b844f479d6
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/robots.txt
@@ -0,0 +1,4 @@
+# Robot file. Generated with Dolibarr
+User-agent: *
+Allow: /public/
+Disallow: /administrator/
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/styles.css.php b/htdocs/install/doctemplates/websites/website_template-stellar/containers/styles.css.php
new file mode 100644
index 00000000000..80326972fd5
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/styles.css.php
@@ -0,0 +1,2696 @@
+
+/* CSS content (all pages) */
+div.bodywebsite { margin: 0; font-family: 'Open Sans', sans-serif; }
+.bodywebsite h1 { margin-top: 0; margin-bottom: 0; padding: 10px;}
+
+html {
+ scroll-behavior: smooth
+}
+
+.bodywebsite .centpercent {
+ width: 100%;
+}
+.bodywebsite .center {
+ text-align: center;
+}
+
+.bodywebsite span.icon.alt {
+ font-size: 0.5em;
+}
+.bodywebsite .fab.alt:before {
+ font-family: "Font Awesome 5 Brands" !important;
+}
+
+.bodywebsite .logowebsite {
+ width: 128px;
+ height: 128px;
+ border-radius: 50%;
+ background-size: contain;
+ background-size: contain;
+}
+
+.bodywebsite .blog-box {
+ box-shadow: -1px -1px 12px 5px rgba(85, 85, 85, 0.1) !important;
+}
+
+html.bodywebsite,
+.bodywebsite,
+.bodywebsite div,
+.bodywebsite span,
+.bodywebsite applet,
+.bodywebsite object,
+.bodywebsite iframe,
+.bodywebsite h1,
+.bodywebsite h2,
+.bodywebsite h3,
+.bodywebsite h4,
+.bodywebsite h5,
+.bodywebsite h6,
+.bodywebsite p,
+.bodywebsite blockquote,
+.bodywebsite pre,
+.bodywebsite a,
+.bodywebsite abbr,
+.bodywebsite acronym,
+.bodywebsite address,
+.bodywebsite big,
+.bodywebsite cite,
+.bodywebsite code,
+.bodywebsite del,
+.bodywebsite dfn,
+.bodywebsite em,
+.bodywebsite img,
+.bodywebsite ins,
+.bodywebsite kbd,
+.bodywebsite q,
+.bodywebsite s,
+.bodywebsite samp,
+.bodywebsite small,
+.bodywebsite strike,
+.bodywebsite strong,
+.bodywebsite sub,
+.bodywebsite sup,
+.bodywebsite tt,
+.bodywebsite var,
+.bodywebsite b,
+.bodywebsite u,
+.bodywebsite i,
+.bodywebsite center,
+.bodywebsite dl,
+.bodywebsite dt,
+.bodywebsite dd,
+.bodywebsite ol,
+.bodywebsite ul,
+.bodywebsite li,
+.bodywebsite fieldset,
+.bodywebsite form,
+.bodywebsite label,
+.bodywebsite legend,
+.bodywebsite table,
+.bodywebsite caption,
+.bodywebsite tbody,
+.bodywebsite tfoot,
+.bodywebsite thead,
+.bodywebsite tr,
+.bodywebsite th,
+.bodywebsite td,
+.bodywebsite article,
+.bodywebsite aside,
+.bodywebsite canvas,
+.bodywebsite details,
+.bodywebsite embed,
+.bodywebsite figure,
+.bodywebsite figcaption,
+.bodywebsite footer,
+.bodywebsite header,
+.bodywebsite hgroup,
+.bodywebsite menu,
+.bodywebsite nav,
+.bodywebsite output,
+.bodywebsite ruby,
+.bodywebsite section,
+.bodywebsite summary,
+.bodywebsite time,
+.bodywebsite mark,
+.bodywebsite audio,
+.bodywebsite video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+}
+.bodywebsite article,
+.bodywebsite aside,
+.bodywebsite details,
+.bodywebsite figcaption,
+.bodywebsite figure,
+.bodywebsite footer,
+.bodywebsite header,
+.bodywebsite hgroup,
+.bodywebsite menu,
+.bodywebsite nav,
+.bodywebsite section {
+ display: block;
+}
+.bodywebsite {
+ line-height: 1;
+ background-image: -moz-linear-gradient(45deg, #4376e2 15%, #5f4d93 85%);
+ background-image: -webkit-linear-gradient(45deg, #4376e2 15%, #5f4d93 85%);
+ background-image: -ms-linear-gradient(45deg, #4376e2 15%, #5f4d93 85%);
+ background-image: linear-gradient(45deg, #4376e2 15%, #5f4d93 85%);
+}
+.bodywebsite ol,
+.bodywebsite ul {
+ list-style: none;
+}
+.bodywebsite blockquote,
+.bodywebsite q {
+ quotes: none;
+}
+.bodywebsite blockquote:before,
+.bodywebsite blockquote:after,
+.bodywebsite q:before,
+.bodywebsite q:after {
+ content: '';
+ content: none;
+}
+.bodywebsite table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+.bodywebsite {
+ -webkit-text-size-adjust: none;
+}
+.bodywebsite mark {
+ background-color: transparent;
+ color: inherit;
+}
+.bodywebsite input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+.bodywebsite input,
+.bodywebsite select,
+.bodywebsite textarea {
+ -moz-appearance: none;
+ -webkit-appearance: none;
+ -ms-appearance: none;
+ appearance: none;
+}
+@-ms-viewport {
+ width: device-width;
+}
+.bodywebsite {
+ -ms-overflow-style: scrollbar;
+}
+@media screen and (max-width: 480px) {
+ .bodywebsite html,
+ .bodywebsite {
+ min-width: 320px;
+ }
+}
+.bodywebsite html {
+ box-sizing: border-box;
+}
+.bodywebsite *,
+.bodywebsite *:before,
+.bodywebsite *:after {
+ box-sizing: inherit;
+}
+.bodywebsite {
+ background-color: #935d8c;
+}
+.bodywebsite.is-preload *,
+.bodywebsite.is-preload *:before,
+.bodywebsite.is-preload *:after {
+ -moz-animation: none !important;
+ -webkit-animation: none !important;
+ -ms-animation: none !important;
+ animation: none !important;
+ -moz-transition: none !important;
+ -webkit-transition: none !important;
+ -ms-transition: none !important;
+ transition: none !important;
+}
+.bodywebsite {
+ background-color: #935d8c;
+ color: rgba(255, 255, 255, 0.65);
+}
+.bodywebsite {
+ font-family: "Source Sans", Helvetica, sans-serif;
+ font-weight: 300;
+ line-height: 1.65;
+}
+@media screen and (max-width: 1680px) {
+ .bodywebsite body,
+ .bodywebsite input,
+ .bodywebsite select,
+ .bodywebsite textarea {
+ font-size: 14pt;
+ }
+}
+@media screen and (max-width: 1280px) {
+ .bodywebsite body,
+ .bodywebsite input,
+ .bodywebsite select,
+ .bodywebsite textarea {
+ font-size: 12pt;
+ }
+}
+@media screen and (max-width: 360px) {
+ .bodywebsite body,
+ .bodywebsite input,
+ .bodywebsite select,
+ .bodywebsite textarea {
+ font-size: 11pt;
+ }
+}
+.bodywebsite a {
+ -moz-transition: color 0.2s ease, border-bottom 0.2s ease;
+ -webkit-transition: color 0.2s ease, border-bottom 0.2s ease;
+ -ms-transition: color 0.2s ease, border-bottom 0.2s ease;
+ transition: color 0.2s ease, border-bottom 0.2s ease;
+ text-decoration: none;
+ border-bottom: dotted 1px;
+ color: inherit;
+}
+.bodywebsite a:hover {
+ border-bottom-color: transparent;
+}
+.bodywebsite strong,
+.bodywebsite b {
+ font-weight: 400;
+}
+.bodywebsite em,
+.bodywebsite i {
+ font-style: italic;
+}
+.bodywebsite p {
+ margin: 0 0 2em 0;
+}
+.bodywebsite p.content {
+ -moz-columns: 20em 2;
+ -webkit-columns: 20em 2;
+ -ms-columns: 20em 2;
+ columns: 20em 2;
+ -moz-column-gap: 2em;
+ -webkit-column-gap: 2em;
+ -ms-column-gap: 2em;
+ column-gap: 2em;
+ text-align: justify;
+}
+.bodywebsite h1,
+.bodywebsite h2,
+.bodywebsite h3,
+.bodywebsite h4,
+.bodywebsite h5,
+.bodywebsite h6 {
+ font-weight: 300;
+ line-height: 1.5;
+ margin: 0 0 0.7em 0;
+ letter-spacing: -0.025em;
+}
+.bodywebsite h1 a,
+.bodywebsite h2 a,
+.bodywebsite h3 a,
+.bodywebsite h4 a,
+.bodywebsite h5 a,
+.bodywebsite h6 a {
+ color: inherit;
+ text-decoration: none;
+}
+.bodywebsite h1 {
+ font-size: 2.5em;
+ line-height: 1.2;
+}
+.bodywebsite h2 {
+ font-size: 1.5em;
+}
+.bodywebsite h3 {
+ font-size: 1.25em;
+}
+.bodywebsite h4 {
+ font-size: 1.1em;
+}
+.bodywebsite h5 {
+ font-size: 0.9em;
+}
+.bodywebsite h6 {
+ font-size: 0.7em;
+}
+@media screen and (max-width: 736px) {
+ .bodywebsite h1 {
+ font-size: 2em;
+ }
+}
+.bodywebsite sub {
+ font-size: 0.8em;
+ position: relative;
+ top: 0.5em;
+}
+.bodywebsite sup {
+ font-size: 0.8em;
+ position: relative;
+ top: -0.5em;
+}
+.bodywebsite blockquote {
+ border-left: solid 4px;
+ font-style: italic;
+ margin: 0 0 2em 0;
+ padding: 0.5em 0 0.5em 2em;
+}
+.bodywebsite code {
+ border-radius: 8px;
+ border: solid 1px;
+ font-family: "Courier New", monospace;
+ font-size: 0.9em;
+ margin: 0 0.25em;
+ padding: 0.25em 0.65em;
+}
+.bodywebsite pre {
+ -webkit-overflow-scrolling: touch;
+ font-family: "Courier New", monospace;
+ font-size: 0.9em;
+ margin: 0 0 2em 0;
+}
+.bodywebsite pre code {
+ display: block;
+ line-height: 1.75;
+ padding: 1em 1.5em;
+ overflow-x: auto;
+}
+.bodywebsite hr {
+ border: 0;
+ border-bottom: solid 1px;
+ margin: 2em 0;
+}
+.bodywebsite hr.major {
+ margin: 3em 0;
+}
+.bodywebsite .align-left {
+ text-align: left;
+}
+.bodywebsite .align-center {
+ text-align: center;
+}
+.bodywebsite .align-right {
+ text-align: right;
+}
+.bodywebsite input,
+.bodywebsite select,
+.bodywebsite textarea {
+ color: #ffffff;
+}
+.bodywebsite a:hover {
+ color: #ffffff;
+}
+.bodywebsite strong,
+.bodywebsite b {
+ color: #ffffff;
+}
+.bodywebsite h1,
+.bodywebsite h2,
+.bodywebsite h3,
+.bodywebsite h4,
+.bodywebsite h5,
+.bodywebsite h6 {
+ color: #ffffff;
+}
+.bodywebsite blockquote {
+ border-left-color: rgba(255, 255, 255, 0.35);
+}
+.bodywebsite code {
+ background: rgba(255, 255, 255, 0.075);
+ border-color: rgba(255, 255, 255, 0.35);
+}
+.bodywebsite hr {
+ border-bottom-color: rgba(255, 255, 255, 0.35);
+}
+.bodywebsite .row {
+ display: flex;
+ flex-wrap: wrap;
+ box-sizing: border-box;
+ align-items: stretch;
+}
+.bodywebsite .row > * {
+ box-sizing: border-box;
+}
+.bodywebsite .row.aln-left {
+ justify-content: flex-start;
+}
+.bodywebsite .row.aln-center {
+ justify-content: center;
+}
+.bodywebsite .row.aln-right {
+ justify-content: flex-end;
+}
+.bodywebsite .row.aln-top {
+ align-items: flex-start;
+}
+.bodywebsite .row.aln-middle {
+ align-items: center;
+}
+.bodywebsite .row.aln-bottom {
+ align-items: flex-end;
+}
+.bodywebsite .row > .imp {
+ order: -1;
+}
+.bodywebsite .row > .col-1 {
+ width: 8.33333%;
+}
+.bodywebsite .row > .off-1 {
+ margin-left: 8.33333%;
+}
+.bodywebsite .row > .col-2 {
+ width: 16.66667%;
+}
+.bodywebsite .row > .off-2 {
+ margin-left: 16.66667%;
+}
+.bodywebsite .row > .col-3 {
+ width: 25%;
+}
+.bodywebsite .row > .off-3 {
+ margin-left: 25%;
+}
+.bodywebsite .row > .col-4 {
+ width: 33.33333%;
+}
+.bodywebsite .row > .off-4 {
+ margin-left: 33.33333%;
+}
+.bodywebsite .row > .col-5 {
+ width: 41.66667%;
+}
+.bodywebsite .row > .off-5 {
+ margin-left: 41.66667%;
+}
+.bodywebsite .row > .col-6 {
+ width: 50%;
+}
+.bodywebsite .row > .off-6 {
+ margin-left: 50%;
+}
+.bodywebsite .row > .col-7 {
+ width: 58.33333%;
+}
+.bodywebsite .row > .off-7 {
+ margin-left: 58.33333%;
+}
+.bodywebsite .row > .col-8 {
+ width: 66.66667%;
+}
+.bodywebsite .row > .off-8 {
+ margin-left: 66.66667%;
+}
+.bodywebsite .row > .col-9 {
+ width: 75%;
+}
+.bodywebsite .row > .off-9 {
+ margin-left: 75%;
+}
+.bodywebsite .row > .col-10 {
+ width: 83.33333%;
+}
+.bodywebsite .row > .off-10 {
+ margin-left: 83.33333%;
+}
+.bodywebsite .row > .col-11 {
+ width: 91.66667%;
+}
+.bodywebsite .row > .off-11 {
+ margin-left: 91.66667%;
+}
+.bodywebsite .row > .col-12 {
+ width: 100%;
+}
+.bodywebsite .row > .off-12 {
+ margin-left: 100%;
+}
+.bodywebsite .row {
+ margin-top: 0;
+}
+.bodywebsite .row > * {
+ padding: 0 0 0 0;
+}
+@media screen and (max-width: 1680px) {
+ .bodywebsite .row {
+ display: flex;
+ flex-wrap: wrap;
+ box-sizing: border-box;
+ align-items: stretch;
+ }
+ .bodywebsite .row > * {
+ box-sizing: border-box;
+ }
+ .bodywebsite .row.aln-left {
+ justify-content: flex-start;
+ }
+ .bodywebsite .row.aln-center {
+ justify-content: center;
+ }
+ .bodywebsite .row.aln-right {
+ justify-content: flex-end;
+ }
+ .bodywebsite .row.aln-top {
+ align-items: flex-start;
+ }
+ .bodywebsite .row.aln-middle {
+ align-items: center;
+ }
+ .bodywebsite .row.aln-bottom {
+ align-items: flex-end;
+ }
+ .bodywebsite .row > .imp-xlarge {
+ order: -1;
+ }
+ .bodywebsite .row > .col-1-xlarge {
+ width: 8.33333%;
+ }
+ .bodywebsite .row > .off-1-xlarge {
+ margin-left: 8.33333%;
+ }
+ .bodywebsite .row > .col-2-xlarge {
+ width: 16.66667%;
+ }
+ .bodywebsite .row > .off-2-xlarge {
+ margin-left: 16.66667%;
+ }
+ .bodywebsite .row > .col-3-xlarge {
+ width: 25%;
+ }
+ .bodywebsite .row > .off-3-xlarge {
+ margin-left: 25%;
+ }
+ .bodywebsite .row > .col-4-xlarge {
+ width: 33.33333%;
+ }
+ .bodywebsite .row > .off-4-xlarge {
+ margin-left: 33.33333%;
+ }
+ .bodywebsite .row > .col-5-xlarge {
+ width: 41.66667%;
+ }
+ .bodywebsite .row > .off-5-xlarge {
+ margin-left: 41.66667%;
+ }
+ .bodywebsite .row > .col-6-xlarge {
+ width: 50%;
+ }
+ .bodywebsite .row > .off-6-xlarge {
+ margin-left: 50%;
+ }
+ .bodywebsite .row > .col-7-xlarge {
+ width: 58.33333%;
+ }
+ .bodywebsite .row > .off-7-xlarge {
+ margin-left: 58.33333%;
+ }
+ .bodywebsite .row > .col-8-xlarge {
+ width: 66.66667%;
+ }
+ .bodywebsite .row > .off-8-xlarge {
+ margin-left: 66.66667%;
+ }
+ .bodywebsite .row > .col-9-xlarge {
+ width: 75%;
+ }
+ .bodywebsite .row > .off-9-xlarge {
+ margin-left: 75%;
+ }
+ .bodywebsite .row > .col-10-xlarge {
+ width: 83.33333%;
+ }
+ .bodywebsite .row > .off-10-xlarge {
+ margin-left: 83.33333%;
+ }
+ .bodywebsite .row > .col-11-xlarge {
+ width: 91.66667%;
+ }
+ .bodywebsite .row > .off-11-xlarge {
+ margin-left: 91.66667%;
+ }
+ .bodywebsite .row > .col-12-xlarge {
+ width: 100%;
+ }
+ .bodywebsite .row > .off-12-xlarge {
+ margin-left: 100%;
+ }
+ .bodywebsite .row {
+ margin-top: 0;
+ margin-left: 0;
+ }
+ .bodywebsite .row > * {
+ padding: 0 0 0 0;
+ }
+}
+@media screen and (max-width: 1280px) {
+ .bodywebsite .row {
+ display: flex;
+ flex-wrap: wrap;
+ box-sizing: border-box;
+ align-items: stretch;
+ }
+ .bodywebsite .row > * {
+ box-sizing: border-box;
+ }
+ .bodywebsite .row.aln-left {
+ justify-content: flex-start;
+ }
+ .bodywebsite .row.aln-center {
+ justify-content: center;
+ }
+ .bodywebsite .row.aln-right {
+ justify-content: flex-end;
+ }
+ .bodywebsite .row.aln-top {
+ align-items: flex-start;
+ }
+ .bodywebsite .row.aln-middle {
+ align-items: center;
+ }
+ .bodywebsite .row.aln-bottom {
+ align-items: flex-end;
+ }
+ .bodywebsite .row > .imp-large {
+ order: -1;
+ }
+ .bodywebsite .row > .col-1-large {
+ width: 8.33333%;
+ }
+ .bodywebsite .row > .off-1-large {
+ margin-left: 8.33333%;
+ }
+ .bodywebsite .row > .col-2-large {
+ width: 16.66667%;
+ }
+ .bodywebsite .row > .off-2-large {
+ margin-left: 16.66667%;
+ }
+ .bodywebsite .row > .col-3-large {
+ width: 25%;
+ }
+ .bodywebsite .row > .off-3-large {
+ margin-left: 25%;
+ }
+ .bodywebsite .row > .col-4-large {
+ width: 33.33333%;
+ }
+ .bodywebsite .row > .off-4-large {
+ margin-left: 33.33333%;
+ }
+ .bodywebsite .row > .col-5-large {
+ width: 41.66667%;
+ }
+ .bodywebsite .row > .off-5-large {
+ margin-left: 41.66667%;
+ }
+ .bodywebsite .row > .col-6-large {
+ width: 50%;
+ }
+ .bodywebsite .row > .off-6-large {
+ margin-left: 50%;
+ }
+ .bodywebsite .row > .col-7-large {
+ width: 58.33333%;
+ }
+ .bodywebsite .row > .off-7-large {
+ margin-left: 58.33333%;
+ }
+ .bodywebsite .row > .col-8-large {
+ width: 66.66667%;
+ }
+ .bodywebsite .row > .off-8-large {
+ margin-left: 66.66667%;
+ }
+ .bodywebsite .row > .col-9-large {
+ width: 75%;
+ }
+ .bodywebsite .row > .off-9-large {
+ margin-left: 75%;
+ }
+ .bodywebsite .row > .col-10-large {
+ width: 83.33333%;
+ }
+ .bodywebsite .row > .off-10-large {
+ margin-left: 83.33333%;
+ }
+ .bodywebsite .row > .col-11-large {
+ width: 91.66667%;
+ }
+ .bodywebsite .row > .off-11-large {
+ margin-left: 91.66667%;
+ }
+ .bodywebsite .row > .col-12-large {
+ width: 100%;
+ }
+ .bodywebsite .row > .off-12-large {
+ margin-left: 100%;
+ }
+ .bodywebsite .row {
+ margin-top: 0;
+ }
+ .bodywebsite .row > * {
+ padding: 0 0 0 1.5em;
+ }
+}
+@media screen and (max-width: 980px) {
+ .bodywebsite .row {
+ display: flex;
+ flex-wrap: wrap;
+ box-sizing: border-box;
+ align-items: stretch;
+ }
+ .bodywebsite .row > * {
+ box-sizing: border-box;
+ }
+ .bodywebsite .row.aln-left {
+ justify-content: flex-start;
+ }
+ .bodywebsite .row.aln-center {
+ justify-content: center;
+ }
+ .bodywebsite .row.aln-right {
+ justify-content: flex-end;
+ }
+ .bodywebsite .row.aln-top {
+ align-items: flex-start;
+ }
+ .bodywebsite .row.aln-middle {
+ align-items: center;
+ }
+ .bodywebsite .row.aln-bottom {
+ align-items: flex-end;
+ }
+ .bodywebsite .row > .imp-medium {
+ order: -1;
+ }
+ .bodywebsite .row > .col-1-medium {
+ width: 8.33333%;
+ }
+ .bodywebsite .row > .off-1-medium {
+ margin-left: 8.33333%;
+ }
+ .bodywebsite .row > .col-2-medium {
+ width: 16.66667%;
+ }
+ .bodywebsite .row > .off-2-medium {
+ margin-left: 16.66667%;
+ }
+ .bodywebsite .row > .col-3-medium {
+ width: 25%;
+ }
+ .bodywebsite .row > .off-3-medium {
+ margin-left: 25%;
+ }
+ .bodywebsite .row > .col-4-medium {
+ width: 33.33333%;
+ }
+ .bodywebsite .row > .off-4-medium {
+ margin-left: 33.33333%;
+ }
+ .bodywebsite .row > .col-5-medium {
+ width: 41.66667%;
+ }
+ .bodywebsite .row > .off-5-medium {
+ margin-left: 41.66667%;
+ }
+ .bodywebsite .row > .col-6-medium {
+ width: 50%;
+ }
+ .bodywebsite .row > .off-6-medium {
+ margin-left: 50%;
+ }
+ .bodywebsite .row > .col-7-medium {
+ width: 58.33333%;
+ }
+ .bodywebsite .row > .off-7-medium {
+ margin-left: 58.33333%;
+ }
+ .bodywebsite .row > .col-8-medium {
+ width: 66.66667%;
+ }
+ .bodywebsite .row > .off-8-medium {
+ margin-left: 66.66667%;
+ }
+ .bodywebsite .row > .col-9-medium {
+ width: 75%;
+ }
+ .bodywebsite .row > .off-9-medium {
+ margin-left: 75%;
+ }
+ .bodywebsite .row > .col-10-medium {
+ width: 83.33333%;
+ }
+ .bodywebsite .row > .off-10-medium {
+ margin-left: 83.33333%;
+ }
+ .bodywebsite .row > .col-11-medium {
+ width: 91.66667%;
+ }
+ .bodywebsite .row > .off-11-medium {
+ margin-left: 91.66667%;
+ }
+ .bodywebsite .row > .col-12-medium {
+ width: 100%;
+ }
+ .bodywebsite .row > .off-12-medium {
+ margin-left: 100%;
+ }
+ .bodywebsite .row {
+ margin-top: 0;
+ }
+ .bodywebsite .row > * {
+ padding: 0 0 0 1.5em;
+ }
+}
+@media screen and (max-width: 736px) {
+ .bodywebsite .row {
+ display: flex;
+ flex-wrap: wrap;
+ box-sizing: border-box;
+ align-items: stretch;
+ }
+ .bodywebsite .row > * {
+ box-sizing: border-box;
+ }
+ .bodywebsite .row.aln-left {
+ justify-content: flex-start;
+ }
+ .bodywebsite .row.aln-center {
+ justify-content: center;
+ }
+ .bodywebsite .row.aln-right {
+ justify-content: flex-end;
+ }
+ .bodywebsite .row.aln-top {
+ align-items: flex-start;
+ }
+ .bodywebsite .row.aln-middle {
+ align-items: center;
+ }
+ .bodywebsite .row.aln-bottom {
+ align-items: flex-end;
+ }
+ .bodywebsite .row > .imp-small {
+ order: -1;
+ }
+ .bodywebsite .row > .col-1-small {
+ width: 8.33333%;
+ }
+ .bodywebsite .row > .off-1-small {
+ margin-left: 8.33333%;
+ }
+ .bodywebsite .row > .col-2-small {
+ width: 16.66667%;
+ }
+ .bodywebsite .row > .off-2-small {
+ margin-left: 16.66667%;
+ }
+ .bodywebsite .row > .col-3-small {
+ width: 25%;
+ }
+ .bodywebsite .row > .off-3-small {
+ margin-left: 25%;
+ }
+ .bodywebsite .row > .col-4-small {
+ width: 33.33333%;
+ }
+ .bodywebsite .row > .off-4-small {
+ margin-left: 33.33333%;
+ }
+ .bodywebsite .row > .col-5-small {
+ width: 41.66667%;
+ }
+ .bodywebsite .row > .off-5-small {
+ margin-left: 41.66667%;
+ }
+ .bodywebsite .row > .col-6-small {
+ width: 50%;
+ }
+ .bodywebsite .row > .off-6-small {
+ margin-left: 50%;
+ }
+ .bodywebsite .row > .col-7-small {
+ width: 58.33333%;
+ }
+ .bodywebsite .row > .off-7-small {
+ margin-left: 58.33333%;
+ }
+ .bodywebsite .row > .col-8-small {
+ width: 66.66667%;
+ }
+ .bodywebsite .row > .off-8-small {
+ margin-left: 66.66667%;
+ }
+ .bodywebsite .row > .col-9-small {
+ width: 75%;
+ }
+ .bodywebsite .row > .off-9-small {
+ margin-left: 75%;
+ }
+ .bodywebsite .row > .col-10-small {
+ width: 83.33333%;
+ }
+ .bodywebsite .row > .off-10-small {
+ margin-left: 83.33333%;
+ }
+ .bodywebsite .row > .col-11-small {
+ width: 91.66667%;
+ }
+ .bodywebsite .row > .off-11-small {
+ margin-left: 91.66667%;
+ }
+ .bodywebsite .row > .col-12-small {
+ width: 100%;
+ }
+ .bodywebsite .row > .off-12-small {
+ margin-left: 100%;
+ }
+ .bodywebsite .row {
+ margin-top: 0;
+ }
+ .bodywebsite .row > * {
+ padding: 0 0 0 1em;
+ }
+}
+@media screen and (max-width: 480px) {
+ .bodywebsite .row {
+ display: flex;
+ flex-wrap: wrap;
+ box-sizing: border-box;
+ align-items: stretch;
+ }
+ .bodywebsite .row > * {
+ box-sizing: border-box;
+ }
+ .bodywebsite .row.aln-left {
+ justify-content: flex-start;
+ }
+ .bodywebsite .row.aln-center {
+ justify-content: center;
+ }
+ .bodywebsite .row.aln-right {
+ justify-content: flex-end;
+ }
+ .bodywebsite .row.aln-top {
+ align-items: flex-start;
+ }
+ .bodywebsite .row.aln-middle {
+ align-items: center;
+ }
+ .bodywebsite .row.aln-bottom {
+ align-items: flex-end;
+ }
+ .bodywebsite .row > .imp-xsmall {
+ order: -1;
+ }
+ .bodywebsite .row > .col-1-xsmall {
+ width: 8.33333%;
+ }
+ .bodywebsite .row > .off-1-xsmall {
+ margin-left: 8.33333%;
+ }
+ .bodywebsite .row > .col-2-xsmall {
+ width: 16.66667%;
+ }
+ .bodywebsite .row > .off-2-xsmall {
+ margin-left: 16.66667%;
+ }
+ .bodywebsite .row > .col-3-xsmall {
+ width: 25%;
+ }
+ .bodywebsite .row > .off-3-xsmall {
+ margin-left: 25%;
+ }
+ .bodywebsite .row > .col-4-xsmall {
+ width: 33.33333%;
+ }
+ .bodywebsite .row > .off-4-xsmall {
+ margin-left: 33.33333%;
+ }
+ .bodywebsite .row > .col-5-xsmall {
+ width: 41.66667%;
+ }
+ .bodywebsite .row > .off-5-xsmall {
+ margin-left: 41.66667%;
+ }
+ .bodywebsite .row > .col-6-xsmall {
+ width: 50%;
+ }
+ .bodywebsite .row > .off-6-xsmall {
+ margin-left: 50%;
+ }
+ .bodywebsite .row > .col-7-xsmall {
+ width: 58.33333%;
+ }
+ .bodywebsite .row > .off-7-xsmall {
+ margin-left: 58.33333%;
+ }
+ .bodywebsite .row > .col-8-xsmall {
+ width: 66.66667%;
+ }
+ .bodywebsite .row > .off-8-xsmall {
+ margin-left: 66.66667%;
+ }
+ .bodywebsite .row > .col-9-xsmall {
+ width: 75%;
+ }
+ .bodywebsite .row > .off-9-xsmall {
+ margin-left: 75%;
+ }
+ .bodywebsite .row > .col-10-xsmall {
+ width: 83.33333%;
+ }
+ .bodywebsite .row > .off-10-xsmall {
+ margin-left: 83.33333%;
+ }
+ .bodywebsite .row > .col-11-xsmall {
+ width: 91.66667%;
+ }
+ .bodywebsite .row > .off-11-xsmall {
+ margin-left: 91.66667%;
+ }
+ .bodywebsite .row > .col-12-xsmall {
+ width: 100%;
+ }
+ .bodywebsite .row > .off-12-xsmall {
+ margin-left: 100%;
+ }
+ .bodywebsite .row {
+ margin-top: 0;
+ }
+ .bodywebsite .row > * {
+ padding: 0 0 0 1.25em;
+ }
+}
+.bodywebsite .box {
+ border-radius: 8px;
+ border: solid;
+ margin-bottom: 2em;
+ padding: 1.5em;
+}
+.bodywebsite .box > :last-child,
+.bodywebsite .box > :last-child > :last-child,
+.bodywebsite .box > :last-child > :last-child > :last-child {
+ margin-bottom: 0;
+}
+.bodywebsite .box.alt {
+ border: 0;
+ border-radius: 0;
+ padding: 0;
+}
+.bodywebsite .box {
+ border-color: rgba(255, 255, 255, 0.35);
+}
+.bodywebsite input[type="submit"],
+.bodywebsite input[type="reset"],
+.bodywebsite input[type="button"],
+.bodywebsite button,
+.bodywebsite .buttonwebsite {
+ -moz-appearance: none;
+ -webkit-appearance: none;
+ -ms-appearance: none;
+ appearance: none;
+ -moz-transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out;
+ -webkit-transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out;
+ -ms-transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out;
+ transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out;
+ border-radius: 8px;
+ border: 0;
+ cursor: pointer;
+ display: inline-block;
+ font-weight: 300;
+ height: 2.75em;
+ line-height: 2.75em;
+ min-width: 9.25em;
+ padding: 0 1.5em;
+ text-align: center;
+ text-decoration: none;
+ white-space: nowrap;
+}
+.bodywebsite input[type="submit"].icon,
+.bodywebsite input[type="reset"].icon,
+.bodywebsite input[type="button"].icon,
+.bodywebsite button.icon,
+.bodywebsite .buttonwebsite.icon {
+ padding-left: 1.35em;
+}
+.bodywebsite input[type="submit"].icon:before,
+.bodywebsite input[type="reset"].icon:before,
+.bodywebsite input[type="button"].icon:before,
+.bodywebsite button.icon:before,
+.bodywebsite .buttonwebsite.icon:before {
+ margin-right: 0.5em;
+}
+.bodywebsite input[type="submit"].fit,
+.bodywebsite input[type="reset"].fit,
+.bodywebsite input[type="button"].fit,
+.bodywebsite button.fit,
+.bodywebsite .buttonwebsite.fit {
+ width: 100%;
+}
+.bodywebsite input[type="submit"].small,
+.bodywebsite input[type="reset"].small,
+.bodywebsite input[type="button"].small,
+.bodywebsite button.small,
+.bodywebsite .buttonwebsite.small {
+ font-size: 0.8em;
+}
+.bodywebsite input[type="submit"].large,
+.bodywebsite input[type="reset"].large,
+.bodywebsite input[type="button"].large,
+.bodywebsite button.large,
+.bodywebsite .buttonwebsite.large {
+ font-size: 1.35em;
+}
+.bodywebsite input[type="submit"].disabled,
+.bodywebsite input[type="submit"]:disabled,
+.bodywebsite input[type="reset"].disabled,
+.bodywebsite input[type="reset"]:disabled,
+.bodywebsite input[type="button"].disabled,
+.bodywebsite input[type="button"]:disabled,
+.bodywebsite button.disabled,
+.bodywebsite button:disabled,
+.bodywebsite .buttonwebsite.disabled,
+.bodywebsite .buttonwebsite:disabled {
+ pointer-events: none;
+ opacity: 0.25;
+}
+@media screen and (max-width: 736px) {
+ .bodywebsite input[type="submit"],
+ .bodywebsite input[type="reset"],
+ .bodywebsite input[type="button"],
+ .bodywebsite button,
+ .bodywebsite .buttonwebsite {
+ min-width: 0;
+ }
+}
+.bodywebsite input[type="submit"],
+.bodywebsite input[type="reset"],
+.bodywebsite input[type="button"],
+.bodywebsite button,
+.bodywebsite .buttonwebsite {
+ background-color: transparent;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.35);
+ color: #ffffff !important;
+}
+.bodywebsite input[type="submit"]:hover,
+.bodywebsite input[type="reset"]:hover,
+.bodywebsite input[type="button"]:hover,
+.bodywebsite button:hover,
+.bodywebsite .buttonwebsite:hover {
+ background-color: rgba(255, 255, 255, 0.075);
+}
+.bodywebsite input[type="submit"]:active,
+.bodywebsite input[type="reset"]:active,
+.bodywebsite input[type="button"]:active,
+.bodywebsite button:active,
+.bodywebsite .buttonwebsite:active {
+ background-color: rgba(255, 255, 255, 0.2);
+}
+.bodywebsite input[type="submit"].icon:before,
+.bodywebsite input[type="reset"].icon:before,
+.bodywebsite input[type="button"].icon:before,
+.bodywebsite button.icon:before,
+.bodywebsite .buttonwebsite.icon:before {
+ color: rgba(255, 255, 255, 0.5);
+}
+.bodywebsite input[type="submit"].primary,
+.bodywebsite input[type="reset"].primary,
+.bodywebsite input[type="button"].primary,
+.bodywebsite button.primary,
+.bodywebsite .buttonwebsite.primary {
+ background-color: #8cc9f0;
+ color: #ffffff !important;
+ box-shadow: none;
+}
+.bodywebsite input[type="submit"].primary:hover,
+.bodywebsite input[type="reset"].primary:hover,
+.bodywebsite input[type="button"].primary:hover,
+.bodywebsite button.primary:hover,
+.bodywebsite .buttonwebsite.primary:hover {
+ background-color: #9acff2;
+}
+.bodywebsite input[type="submit"].primary:active,
+.bodywebsite input[type="reset"].primary:active,
+.bodywebsite input[type="button"].primary:active,
+.bodywebsite button.primary:active,
+.bodywebsite .buttonwebsite.primary:active {
+ background-color: #7ec3ee;
+}
+.bodywebsite input[type="submit"].primary.icon:before,
+.bodywebsite input[type="reset"].primary.icon:before,
+.bodywebsite input[type="button"].primary.icon:before,
+.bodywebsite button.primary.icon:before,
+.bodywebsite .buttonwebsite.primary.icon:before {
+ color: #ffffff !important;
+}
+.bodywebsite form {
+ margin: 0 0 2em 0;
+}
+.bodywebsite label {
+ display: block;
+ font-size: 0.9em;
+ font-weight: 400;
+ margin: 0 0 1em 0;
+}
+.bodywebsite input[type="text"],
+.bodywebsite input[type="password"],
+.bodywebsite input[type="email"],
+.bodywebsite select,
+.bodywebsite textarea {
+ -moz-appearance: none;
+ -webkit-appearance: none;
+ -ms-appearance: none;
+ appearance: none;
+ border-radius: 8px;
+ border: solid 1px;
+ color: inherit;
+ display: block;
+ outline: 0;
+ padding: 0 1em;
+ text-decoration: none;
+ width: 100%;
+}
+.bodywebsite input[type="text"]:invalid,
+.bodywebsite input[type="password"]:invalid,
+.bodywebsite input[type="email"]:invalid,
+.bodywebsite select:invalid,
+.bodywebsite textarea:invalid {
+ box-shadow: none;
+}
+.bodywebsite select {
+ background-size: 1.25rem;
+ background-repeat: no-repeat;
+ background-position: calc(100% - 1rem) center;
+ height: 2.75em;
+ padding-right: 2.75em;
+ text-overflow: ellipsis;
+}
+.bodywebsite select:focus::-ms-value {
+ background-color: transparent;
+}
+.bodywebsite select::-ms-expand {
+ display: none;
+}
+.bodywebsite input[type="text"],
+.bodywebsite input[type="password"],
+.bodywebsite input[type="email"],
+.bodywebsite select {
+ height: 2.75em;
+}
+.bodywebsite textarea {
+ padding: 0.75em 1em;
+}
+.bodywebsite input[type="checkbox"],
+.bodywebsite input[type="radio"] {
+ -moz-appearance: none;
+ -webkit-appearance: none;
+ -ms-appearance: none;
+ appearance: none;
+ display: block;
+ float: left;
+ margin-right: -2em;
+ opacity: 0;
+ width: 1em;
+ z-index: -1;
+}
+.bodywebsite input[type="checkbox"] + label,
+.bodywebsite input[type="radio"] + label {
+ text-decoration: none;
+ cursor: pointer;
+ display: inline-block;
+ font-size: 1em;
+ font-weight: 300;
+ padding-left: 2.4em;
+ padding-right: 0.75em;
+ position: relative;
+}
+.bodywebsite input[type="checkbox"] + label:before,
+.bodywebsite input[type="radio"] + label:before {
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-smoothing: antialiased;
+ display: inline-block;
+ font-style: normal;
+ font-variant: normal;
+ text-rendering: auto;
+ line-height: 1;
+ text-transform: none !important;
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 900;
+}
+.bodywebsite input[type="checkbox"] + label:before,
+.bodywebsite input[type="radio"] + label:before {
+ border-radius: 8px;
+ border: solid 1px;
+ content: '';
+ display: inline-block;
+ font-size: 0.8em;
+ height: 2.0625em;
+ left: 0;
+ line-height: 2.0625em;
+ position: absolute;
+ text-align: center;
+ top: 0;
+ width: 2.0625em;
+}
+.bodywebsite input[type="checkbox"]:checked + label:before,
+.bodywebsite input[type="radio"]:checked + label:before {
+ content: '\f00c';
+}
+.bodywebsite input[type="checkbox"] + label:before {
+ border-radius: 8px;
+}
+.bodywebsite input[type="radio"] + label:before {
+ border-radius: 100%;
+}
+.bodywebsite ::-webkit-input-placeholder {
+ opacity: 1;
+}
+.bodywebsite :-moz-placeholder {
+ opacity: 1;
+}
+.bodywebsite ::-moz-placeholder {
+ opacity: 1;
+}
+.bodywebsite :-ms-input-placeholder {
+ opacity: 1;
+}
+.bodywebsite label {
+ color: #ffffff;
+}
+.bodywebsite input[type="text"],
+.bodywebsite input[type="password"],
+.bodywebsite input[type="email"],
+.bodywebsite select,
+.bodywebsite textarea {
+ background-color: rgba(255, 255, 255, 0.075);
+ border-color: rgba(255, 255, 255, 0.35);
+}
+.bodywebsite input[type="text"]:focus,
+.bodywebsite input[type="password"]:focus,
+.bodywebsite input[type="email"]:focus,
+.bodywebsite select:focus,
+.bodywebsite textarea:focus {
+ border-color: #8cc9f0;
+ box-shadow: 0 0 0 1px #8cc9f0;
+}
+.bodywebsite select {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='40' height='40' preserveAspectRatio='none' viewBox='0 0 40 40'%3E%3Cpath d='M9.4,12.3l10.4,10.4l10.4-10.4c0.2-0.2,0.5-0.4,0.9-0.4c0.3,0,0.6,0.1,0.9,0.4l3.3,3.3c0.2,0.2,0.4,0.5,0.4,0.9 c0,0.4-0.1,0.6-0.4,0.9L20.7,31.9c-0.2,0.2-0.5,0.4-0.9,0.4c-0.3,0-0.6-0.1-0.9-0.4L4.3,17.3c-0.2-0.2-0.4-0.5-0.4-0.9 c0-0.4,0.1-0.6,0.4-0.9l3.3-3.3c0.2-0.2,0.5-0.4,0.9-0.4S9.1,12.1,9.4,12.3z' fill='rgba(255, 255, 255, 0.35)' /%3E%3C/svg%3E");
+}
+.bodywebsite select option {
+ color: #ffffff;
+ background: #935d8c;
+}
+.bodywebsite input[type="checkbox"] + label,
+.bodywebsite input[type="radio"] + label {
+ color: rgba(255, 255, 255, 0.65);
+}
+.bodywebsite input[type="checkbox"] + label:before,
+.bodywebsite input[type="radio"] + label:before {
+ background: rgba(255, 255, 255, 0.075);
+ border-color: rgba(255, 255, 255, 0.35);
+}
+.bodywebsite input[type="checkbox"]:checked + label:before,
+.bodywebsite input[type="radio"]:checked + label:before {
+ background-color: #ffffff;
+ border-color: #ffffff;
+ color: #935d8c;
+}
+.bodywebsite input[type="checkbox"]:focus + label:before,
+.bodywebsite input[type="radio"]:focus + label:before {
+ border-color: #8cc9f0;
+ box-shadow: 0 0 0 1px #8cc9f0;
+}
+.bodywebsite ::-webkit-input-placeholder {
+ color: rgba(255, 255, 255, 0.5) !important;
+}
+.bodywebsite :-moz-placeholder {
+ color: rgba(255, 255, 255, 0.5) !important;
+}
+.bodywebsite ::-moz-placeholder {
+ color: rgba(255, 255, 255, 0.5) !important;
+}
+.bodywebsite :-ms-input-placeholder {
+ color: rgba(255, 255, 255, 0.5) !important;
+}
+.bodywebsite .formerize-placeholder {
+ color: rgba(255, 255, 255, 0.5) !important;
+}
+.bodywebsite .icon {
+ text-decoration: none;
+ -moz-transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out;
+ -webkit-transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out;
+ -ms-transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out;
+ transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out;
+ border-bottom: none;
+ position: relative;
+}
+.bodywebsite .icon:before {
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-smoothing: antialiased;
+ display: inline-block;
+ font-style: normal;
+ font-variant: normal;
+ text-rendering: auto;
+ line-height: 1;
+ text-transform: none !important;
+ font-family: "Font Awesome 5 Free";
+}
+.bodywebsite .icon > .label {
+ display: none;
+}
+.bodywebsite .icon:before {
+ line-height: solid;
+}
+.bodywebsite .icon.solid:before {
+ font-weight: 900;
+}
+.bodywebsite .icon.brands:before {
+ font-family: 'Font Awesome 5 Brands';
+}
+.bodywebsite .icon.major {
+ border: solid 1px;
+ display: inline-block;
+ border-radius: 100%;
+ padding: 0.65em;
+ margin: 0 0 2em 0;
+ cursor: default;
+}
+.bodywebsite .icon.major:before {
+ display: inline-block;
+ font-size: 6.25rem;
+ font-weight: 600;
+ font-family: "Font Awesome 5 Free";
+ width: 2.25em;
+ height: 2.25em;
+ line-height: 2.2em;
+ border-radius: 100%;
+ border: solid 1px;
+ text-align: center;
+}
+.bodywebsite .icon.alt {
+ display: inline-block;
+ border: solid 1px;
+ border-radius: 100%;
+}
+.bodywebsite .icon.alt:before {
+ display: block;
+ font-size: 1.25em;
+ font-family: "Font Awesome 5 Free";
+ width: 2em;
+ height: 2em;
+ text-align: center;
+ line-height: 2em;
+}
+.bodywebsite .icon.style1 {
+ color: #efa8b0;
+}
+.bodywebsite .icon.style2 {
+ color: #c79cc8;
+}
+.bodywebsite .icon.style3 {
+ color: #a89cc8;
+}
+.bodywebsite .icon.style4 {
+ color: #9bb2e1;
+}
+.bodywebsite .icon.style5 {
+ color: #8cc9f0;
+}
+@media screen and (max-width: 1680px) {
+ .bodywebsite .icon.major:before {
+ font-size: 5.5rem;
+ }
+}
+@media screen and (max-width: 1280px) {
+ .bodywebsite .icon.major:before {
+ font-size: 4.75rem;
+ }
+}
+@media screen and (max-width: 736px) {
+ .bodywebsite .icon.major {
+ margin: 0 0 1.5em 0;
+ padding: 0.35em;
+ }
+ .bodywebsite .icon.major:before {
+ font-size: 3.5rem;
+ }
+}
+.bodywebsite .icon.major {
+ border-color: rgba(255, 255, 255, 0.35);
+}
+.bodywebsite .icon.major:before {
+ border-color: rgba(255, 255, 255, 0.35);
+}
+.bodywebsite .icon.alt {
+ border-color: rgba(255, 255, 255, 0.35);
+ color: #ffffff;
+}
+.bodywebsite .icon.alt:hover {
+ background-color: rgba(255, 255, 255, 0.075);
+}
+.bodywebsite .icon.alt:active {
+ background-color: rgba(255, 255, 255, 0.2);
+}
+.bodywebsite .image {
+ border-radius: 8px;
+ border: 0;
+ display: inline-block;
+ position: relative;
+}
+.bodywebsite .image img {
+ border-radius: 8px;
+ display: block;
+}
+.bodywebsite .image.left,
+.bodywebsite .image.right {
+ max-width: 40%;
+}
+.bodywebsite .image.left img,
+.bodywebsite .image.right img {
+ width: 100%;
+}
+.bodywebsite .image.left {
+ float: left;
+ margin: 0 1.5em 1em 0;
+ top: 0.25em;
+}
+.bodywebsite .image.right {
+ float: right;
+ margin: 0 0 1em 1.5em;
+ top: 0.25em;
+}
+.bodywebsite .image.fit {
+ display: block;
+ margin: 0 0 2em 0;
+ width: 100%;
+}
+.bodywebsite .image.fit img {
+ width: 100%;
+}
+.bodywebsite .image.main {
+ display: block;
+ margin: 0 0 3em 0;
+ width: 100%;
+}
+.bodywebsite .image.main img {
+ width: 100%;
+}
+.bodywebsite ol {
+ list-style: decimal;
+ margin: 0 0 2em 0;
+ padding-left: 1.25em;
+}
+.bodywebsite ol li {
+ padding-left: 0.25em;
+}
+.bodywebsite ul {
+ list-style: disc;
+ margin: 0 0 2em 0;
+ padding-left: 1em;
+}
+.bodywebsite ul li {
+ padding-left: 0.5em;
+}
+.bodywebsite ul.alt {
+ list-style: none;
+ padding-left: 0;
+}
+.bodywebsite ul.alt li {
+ border-top: solid 1px;
+ padding: 0.5em 0;
+}
+.bodywebsite ul.alt li:first-child {
+ border-top: 0;
+ padding-top: 0;
+}
+.bodywebsite dl {
+ margin: 0 0 2em 0;
+}
+.bodywebsite dl dt {
+ display: block;
+ font-weight: 400;
+ margin: 0 0 1em 0;
+}
+.bodywebsite dl dd {
+ margin-left: 2em;
+}
+.bodywebsite dl.alt dt {
+ display: block;
+ width: 3em;
+ margin: 0;
+ clear: left;
+ float: left;
+}
+.bodywebsite dl.alt dd {
+ margin: 0 0 0.85em 5.5em;
+}
+.bodywebsite dl.alt:after {
+ content: '';
+ display: block;
+ clear: both;
+}
+.bodywebsite ul.alt li {
+ border-top-color: rgba(255, 255, 255, 0.35);
+}
+.bodywebsite dl dt {
+ color: #ffffff;
+}
+.bodywebsite ul.actions {
+ display: -moz-flex;
+ display: -webkit-flex;
+ display: -ms-flex;
+ display: flex;
+ cursor: default;
+ list-style: none;
+ margin-left: -1em;
+ padding-left: 0;
+}
+.bodywebsite ul.actions li {
+ padding: 0 0 0 1em;
+ vertical-align: middle;
+}
+.bodywebsite ul.actions.special {
+ -moz-justify-content: center;
+ -webkit-justify-content: center;
+ -ms-justify-content: center;
+ justify-content: center;
+ width: 100%;
+ margin-left: 0;
+}
+.bodywebsite ul.actions.special li:first-child {
+ padding-left: 0;
+}
+.bodywebsite ul.actions.stacked {
+ -moz-flex-direction: column;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ margin-left: 0;
+}
+.bodywebsite ul.actions.stacked li {
+ padding: 1.3em 0 0 0;
+}
+.bodywebsite ul.actions.stacked li:first-child {
+ padding-top: 0;
+}
+.bodywebsite ul.actions.fit {
+ width: calc(100% + 1em);
+}
+.bodywebsite ul.actions.fit li {
+ -moz-flex-grow: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-grow: 1;
+ flex-grow: 1;
+ -moz-flex-shrink: 1;
+ -webkit-flex-shrink: 1;
+ -ms-flex-shrink: 1;
+ flex-shrink: 1;
+ width: 100%;
+}
+.bodywebsite ul.actions.fit li > * {
+ width: 100%;
+}
+.bodywebsite ul.actions.fit.stacked {
+ width: 100%;
+}
+.bodywebsite .list-inline {
+ list-style: none;
+}
+
+@media screen and (max-width: 480px) {
+ .bodywebsite ul.actions:not(.fixed) {
+ -moz-flex-direction: column;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ margin-left: 0;
+ }
+ .bodywebsite ul.actions:not(.fixed) li {
+ -moz-flex-grow: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-grow: 1;
+ flex-grow: 1;
+ -moz-flex-shrink: 1;
+ -webkit-flex-shrink: 1;
+ -ms-flex-shrink: 1;
+ flex-shrink: 1;
+ padding: 1em 0 0 0;
+ text-align: center;
+ }
+ .bodywebsite ul.actions:not(.fixed) li > * {
+ }
+ .bodywebsite ul.actions:not(.fixed) li:first-child {
+ padding-top: 0;
+ }
+ .bodywebsite ul.actions:not(.fixed) li input[type="submit"].icon:before,
+ .bodywebsite ul.actions:not(.fixed) li input[type="reset"].icon:before,
+ .bodywebsite ul.actions:not(.fixed) li input[type="button"].icon:before,
+ .bodywebsite ul.actions:not(.fixed) li button.icon:before,
+ .bodywebsite ul.actions:not(.fixed) li .buttonwebsite.icon:before {
+ margin-left: -0.5rem;
+ }
+}
+.bodywebsite ul.icons {
+ cursor: default;
+ list-style: none;
+ padding-left: 0;
+}
+.bodywebsite ul.icons li {
+ display: inline-block;
+ padding: 0 0.65em 0 0;
+}
+.bodywebsite ul.icons li:last-child {
+ padding-right: 0 !important;
+}
+.bodywebsite section.special,
+.bodywebsite article.special {
+ text-align: center;
+}
+.bodywebsite header.major {
+ margin-bottom: 3em;
+}
+.bodywebsite header.major h2 {
+ font-size: 2em;
+}
+.bodywebsite header.major h2:after {
+ display: block;
+ content: '';
+ width: 3.25em;
+ height: 2px;
+ margin: 0.7em 0 1em 0;
+ border-radius: 2px;
+}
+.bodywebsite section.special header.major h2:after,
+.bodywebsite article.special header.major h2:after {
+ margin-left: auto;
+ margin-right: auto;
+}
+.bodywebsite header.major p {
+ font-size: 1.25em;
+ letter-spacing: -0.025em;
+}
+.bodywebsite header.major.special {
+ text-align: center;
+}
+.bodywebsite header.major.special h2:after {
+ margin-left: auto;
+ margin-right: auto;
+}
+.bodywebsite footer.major {
+ margin-top: 3em;
+}
+@media screen and (max-width: 736px) {
+ .bodywebsite header.major {
+ margin-bottom: 0;
+ }
+ .bodywebsite header.major h2 {
+ font-size: 1.5em;
+ }
+ .bodywebsite header.major p {
+ font-size: 1em;
+ letter-spacing: 0;
+ }
+ .bodywebsite header.major p br {
+ display: none;
+ }
+ .bodywebsite footer.major {
+ margin-top: 0;
+ }
+}
+.bodywebsite header.major h2:after {
+ background-color: rgba(255, 255, 255, 0.35);
+}
+.bodywebsite .table-wrapper {
+ -webkit-overflow-scrolling: touch;
+ overflow-x: auto;
+}
+.bodywebsite table {
+ margin: 0 0 2em 0;
+ width: 100%;
+}
+.bodywebsite table tbody tr {
+ border: solid 1px;
+ border-left: 0;
+ border-right: 0;
+}
+.bodywebsite table td {
+ padding: 0.75em 0.75em;
+}
+.bodywebsite table th {
+ font-size: 0.9em;
+ font-weight: 400;
+ padding: 0 0.75em 0.75em 0.75em;
+ text-align: left;
+}
+.bodywebsite table thead {
+ border-bottom: solid 2px;
+}
+.bodywebsite table tfoot {
+ border-top: solid 2px;
+}
+.bodywebsite table.alt {
+ border-collapse: separate;
+}
+.bodywebsite table.alt tbody tr td {
+ border: solid 1px;
+ border-left-width: 0;
+ border-top-width: 0;
+}
+.bodywebsite table.alt tbody tr td:first-child {
+ border-left-width: 1px;
+}
+.bodywebsite table.alt tbody tr:first-child td {
+ border-top-width: 1px;
+}
+.bodywebsite table.alt thead {
+ border-bottom: 0;
+}
+.bodywebsite table.alt tfoot {
+ border-top: 0;
+}
+.bodywebsite table tbody tr {
+ border-color: rgba(255, 255, 255, 0.35);
+}
+.bodywebsite table tbody tr:nth-child(2n + 1) {
+ background-color: rgba(255, 255, 255, 0.075);
+}
+.bodywebsite table th {
+ color: #ffffff;
+}
+.bodywebsite table thead {
+ border-bottom-color: rgba(255, 255, 255, 0.35);
+}
+.bodywebsite table tfoot {
+ border-top-color: rgba(255, 255, 255, 0.35);
+}
+.bodywebsite table.alt tbody tr td {
+ border-color: rgba(255, 255, 255, 0.35);
+}
+.bodywebsite .features {
+ display: -moz-flex;
+ display: -webkit-flex;
+ display: -ms-flex;
+ display: flex;
+ -moz-flex-wrap: wrap;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -moz-justify-content: center;
+ -webkit-justify-content: center;
+ -ms-justify-content: center;
+ justify-content: center;
+ width: calc(100% + 2em);
+ margin: 0 0 3em -2em;
+ padding: 0;
+ list-style: none;
+}
+.bodywebsite .features li {
+ width: calc(33.33333% - 2em);
+ margin-left: 2em;
+ margin-top: 3em;
+ padding: 0;
+}
+.bodywebsite .features li:nth-child(1),
+.bodywebsite .features li:nth-child(2),
+.bodywebsite .features li:nth-child(3) {
+ margin-top: 0;
+}
+.bodywebsite .features li > :last-child {
+ margin-bottom: 0;
+}
+@media screen and (max-width: 980px) {
+ .bodywebsite .features li {
+ width: calc(50% - 2em);
+ }
+ .bodywebsite .features li:nth-child(3) {
+ margin-top: 3em;
+ }
+}
+@media screen and (max-width: 736px) {
+ .bodywebsite .features {
+ width: 100%;
+ margin: 0 0 2em 0;
+ }
+ .bodywebsite .features li {
+ width: 100%;
+ margin-left: 0;
+ margin-top: 2em;
+ }
+ .bodywebsite .features li:nth-child(2),
+ .bodywebsite .features li:nth-child(3) {
+ margin-top: 2em;
+ }
+}
+.bodywebsite .statistics {
+ display: -moz-flex;
+ display: -webkit-flex;
+ display: -ms-flex;
+ display: flex;
+ width: 100%;
+ margin: 0 0 3em 0;
+ padding: 0;
+ list-style: none;
+ cursor: default;
+}
+.bodywebsite .statistics li {
+ -moz-flex: 1;
+ -webkit-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ padding: 1.5em;
+ color: #ffffff;
+ text-align: center;
+}
+.bodywebsite .statistics li.style1 {
+ background-color: #efa8b0;
+}
+.bodywebsite .statistics li.style2 {
+ background-color: #c79cc8;
+}
+.bodywebsite .statistics li.style3 {
+ background-color: #a89cc8;
+}
+.bodywebsite .statistics li.style4 {
+ background-color: #9bb2e1;
+}
+.bodywebsite .statistics li.style5 {
+ background-color: #8cc9f0;
+}
+.bodywebsite .statistics li strong,
+.bodywebsite .statistics li b {
+ display: block;
+ font-size: 2em;
+ line-height: 1.1;
+ color: inherit !important;
+ font-weight: 300;
+ letter-spacing: -0.025em;
+}
+.bodywebsite .statistics li:first-child {
+ border-top-left-radius: 8px;
+ border-bottom-left-radius: 8px;
+}
+.bodywebsite .statistics li:last-child {
+ border-top-right-radius: 8px;
+ border-bottom-right-radius: 8px;
+}
+.bodywebsite .statistics li .icon {
+ display: inline-block;
+}
+.bodywebsite .statistics li .icon:before {
+ font-size: 2.75rem;
+ line-height: 1.3;
+}
+@media screen and (max-width: 980px) {
+ .bodywebsite .statistics li strong,
+ .bodywebsite .statistics li b {
+ font-size: 1.5em;
+ }
+}
+@media screen and (max-width: 736px) {
+ .bodywebsite .statistics {
+ display: block;
+ width: 20em;
+ max-width: 100%;
+ margin: 0 auto 2em auto;
+ }
+ .bodywebsite .statistics li:first-child {
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 8px;
+ }
+ .bodywebsite .statistics li:last-child {
+ border-top-right-radius: 0;
+ border-bottom-left-radius: 8px;
+ }
+ .bodywebsite .statistics li .icon:before {
+ font-size: 3.75rem;
+ }
+ .bodywebsite .statistics li strong,
+ .bodywebsite .statistics li b {
+ font-size: 2.5em;
+ }
+}
+.bodywebsite .spotlight {
+ display: -moz-flex;
+ display: -webkit-flex;
+ display: -ms-flex;
+ display: flex;
+ -moz-align-items: center;
+ -webkit-align-items: center;
+ -ms-align-items: center;
+ align-items: center;
+ margin: 0 0 2em 0;
+}
+.bodywebsite .spotlight .content {
+ -moz-flex: 1;
+ -webkit-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+}
+.bodywebsite .spotlight .content > :last-child {
+ margin-bottom: 0;
+}
+.bodywebsite .spotlight .content header.major {
+ margin: 0 0 2em 0;
+}
+.bodywebsite .spotlight .image {
+ display: inline-block;
+ margin-left: 4em;
+ padding: 0.65em;
+ border-radius: 100%;
+ border: solid 1px;
+}
+.bodywebsite .spotlight .image img {
+ display: block;
+ border-radius: 100%;
+ width: 14em;
+ height: 14em;
+}
+@media screen and (max-width: 980px) {
+ .bodywebsite .spotlight {
+ -moz-flex-direction: column-reverse;
+ -webkit-flex-direction: column-reverse;
+ -ms-flex-direction: column-reverse;
+ flex-direction: column-reverse;
+ text-align: center;
+ }
+ .bodywebsite .spotlight .content {
+ -moz-flex: 0 1 auto;
+ -webkit-flex: 0 1 auto;
+ -ms-flex: 0 1 auto;
+ flex: 0 1 auto;
+ width: 100%;
+ }
+ .bodywebsite .spotlight .content header.major h2:after {
+ margin-left: auto;
+ margin-right: auto;
+ }
+ .bodywebsite .spotlight .content .actions {
+ -moz-justify-content: center;
+ -webkit-justify-content: center;
+ -ms-justify-content: center;
+ justify-content: center;
+ width: calc(100% + 1em);
+ }
+ .bodywebsite .spotlight .image {
+ -moz-flex: 0 1 auto;
+ -webkit-flex: 0 1 auto;
+ -ms-flex: 0 1 auto;
+ flex: 0 1 auto;
+ margin-left: 0;
+ margin-bottom: 2em;
+ }
+}
+@media screen and (max-width: 736px) {
+ .bodywebsite .spotlight .image {
+ padding: 0.35em;
+ }
+ .bodywebsite .spotlight .image img {
+ width: 12em;
+ }
+}
+.bodywebsite .spotlight .image {
+ border-color: rgba(255, 255, 255, 0.35);
+}
+.bodywebsite #header {
+ padding: 5em 5em 1em 5em ;
+ text-align: center;
+}
+.bodywebsite #header h1 {
+ margin: 0 0 0.25em 0;
+}
+.bodywebsite #header p {
+ font-size: 1.25em;
+ letter-spacing: -0.025em;
+}
+.bodywebsite #header.alt {
+ padding: 7em 5em 4em 5em ;
+}
+.bodywebsite #header.alt h1 {
+ font-size: 3.25em;
+}
+.bodywebsite #header.alt > * {
+ -moz-transition: opacity 3s ease;
+ -webkit-transition: opacity 3s ease;
+ -ms-transition: opacity 3s ease;
+ transition: opacity 3s ease;
+ -moz-transition-delay: 0.5s;
+ -webkit-transition-delay: 0.5s;
+ -ms-transition-delay: 0.5s;
+ transition-delay: 0.5s;
+ opacity: 1;
+}
+.bodywebsite #header.alt .logo {
+ -moz-transition: opacity 1.25s ease, -moz-transform 0.5s ease;
+ -webkit-transition: opacity 1.25s ease, -webkit-transform 0.5s ease;
+ -ms-transition: opacity 1.25s ease, -ms-transform 0.5s ease;
+ transition: opacity 1.25s ease, transform 0.5s ease;
+ -moz-transition-delay: 0s;
+ -webkit-transition-delay: 0s;
+ -ms-transition-delay: 0s;
+ transition-delay: 0s;
+ display: block;
+ margin: 0 0 1.5em 0;
+}
+.bodywebsite #header.alt .logo img {
+ display: block;
+ margin: 0 auto;
+ max-width: 75%;
+}
+@media screen and (max-width: 1280px) {
+ .bodywebsite #header {
+ padding: 4em 4em 0.1em 4em;
+ }
+ .bodywebsite #header.alt {
+ padding: 6em 4em 3em 4em ;
+ }
+}
+@media screen and (max-width: 980px) {
+ .bodywebsite #header {
+ padding: 4em 3em 0.1em 3em;
+ }
+ .bodywebsite #header.alt {
+ padding: 5em 3em 2em 3em ;
+ }
+}
+@media screen and (max-width: 736px) {
+ .bodywebsite #header {
+ padding: 3em 2em 0.1em 2em;
+ }
+ .bodywebsite #header p {
+ font-size: 1em;
+ letter-spacing: 0;
+ }
+ .bodywebsite #header p br {
+ display: none;
+ }
+ .bodywebsite #header.alt {
+ padding: 4em 2em 1em 2em ;
+ }
+ .bodywebsite #header.alt h1 {
+ font-size: 2.5em;
+ }
+}
+@media screen and (max-width: 480px) {
+ .bodywebsite #header {
+ padding: 3em 1.5em 0.1em 1.5em;
+ }
+ .bodywebsite #header.alt {
+ padding: 4em 1.5em 1em 1.5em;
+ }
+}
+@media screen and (max-width: 360px) {
+ .bodywebsite #header {
+ padding: 2.5em 1em 0.1em 1em;
+ }
+ .bodywebsite #header.alt {
+ padding: 3.5em 1em 0.5em 1em;
+ }
+}
+div.bodywebsite .is-preload #header.alt > * {
+ opacity: 0;
+}
+div.bodywebsite .is-preload #header.alt .logo {
+ -moz-transform: scale(0.8) rotate(-30deg);
+ -webkit-transform: scale(0.8) rotate(-30deg);
+ -ms-transform: scale(0.8) rotate(-30deg);
+ transform: scale(0.8) rotate(-30deg);
+}
+.bodywebsite #nav {
+ -moz-transition: background-color 0.2s ease, border-top-left-radius 0.2s ease, border-top-right-radius 0.2s ease, padding 0.2s ease;
+ -webkit-transition: background-color 0.2s ease, border-top-left-radius 0.2s ease, border-top-right-radius 0.2s ease, padding 0.2s ease;
+ -ms-transition: background-color 0.2s ease, border-top-left-radius 0.2s ease, border-top-right-radius 0.2s ease, padding 0.2s ease;
+ transition: background-color 0.2s ease, border-top-left-radius 0.2s ease, border-top-right-radius 0.2s ease, padding 0.2s ease;
+ background-color: #ffffff;
+ color: #636363;
+ position: absolute;
+ width: 64em;
+ max-width: calc(100% - 4em);
+ padding-top: 1em;
+ padding-bottom: 1em;
+ background-color: #f7f7f7;
+ border-top-left-radius: 0.25em;
+ border-top-right-radius: 0.25em;
+ cursor: default;
+ text-align: center;
+}
+.bodywebsite #nav input,
+.bodywebsite #nav select,
+.bodywebsite #nav textarea {
+ color: #636363;
+}
+.bodywebsite #nav a:hover {
+ color: #636363;
+}
+.bodywebsite #nav strong,
+.bodywebsite #nav b {
+ color: #636363;
+}
+.bodywebsite #nav h1,
+.bodywebsite #nav h2,
+.bodywebsite #nav h3,
+.bodywebsite #nav h4,
+.bodywebsite #nav h5,
+.bodywebsite #nav h6 {
+ color: #636363;
+}
+.bodywebsite #nav blockquote {
+ border-left-color: #dddddd;
+}
+.bodywebsite #nav code {
+ background: rgba(222, 222, 222, 0.25);
+ border-color: #dddddd;
+}
+.bodywebsite #nav hr {
+ border-bottom-color: #dddddd;
+}
+.bodywebsite #nav + #main {
+ padding-top: 4.25em;
+}
+.bodywebsite #nav ul {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+.bodywebsite #nav ul li {
+ -moz-transition: margin 0.2s ease;
+ -webkit-transition: margin 0.2s ease;
+ -ms-transition: margin 0.2s ease;
+ transition: margin 0.2s ease;
+ display: inline-block;
+ margin: 0 0.35em;
+ padding: 0;
+ vertical-align: middle;
+}
+.bodywebsite #nav ul li a {
+ -moz-transition: font-size 0.2s ease;
+ -webkit-transition: font-size 0.2s ease;
+ -ms-transition: font-size 0.2s ease;
+ transition: font-size 0.2s ease;
+ display: inline-block;
+ height: 2.25em;
+ line-height: 2.25em;
+ padding: 0 1.25em;
+ border: 0;
+ border-radius: 8px;
+ box-shadow: inset 0 0 0 1px transparent;
+}
+.bodywebsite #nav ul li a:hover {
+ background-color: rgba(222, 222, 222, 0.25);
+}
+.bodywebsite #nav ul li a.active {
+ background-color: #ffffff;
+ box-shadow: none;
+}
+.bodywebsite #nav.alt {
+ position: fixed;
+ top: 0;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ background-color: rgba(247, 247, 247, 0.95);
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+ z-index: 10000;
+}
+.bodywebsite #nav.alt ul li {
+ margin: 0 0.175em;
+}
+.bodywebsite #nav.alt ul li a {
+ font-size: 0.9em;
+}
+@media screen and (max-width: 736px) {
+ .bodywebsite #nav {
+ display: none;
+ }
+ .bodywebsite #nav + #main {
+ padding-top: 0;
+ }
+}
+.bodywebsite #main {
+ background-color: #ffffff;
+ color: #636363;
+ border-radius: 0.25em;
+}
+.bodywebsite #main input,
+.bodywebsite #main select,
+.bodywebsite #main textarea {
+ color: #636363;
+}
+.bodywebsite #main a:hover {
+ color: #636363;
+}
+.bodywebsite #main strong,
+.bodywebsite #main b {
+ color: #636363;
+}
+.bodywebsite #main h1,
+.bodywebsite #main h2,
+.bodywebsite #main h3,
+.bodywebsite #main h4,
+.bodywebsite #main h5,
+.bodywebsite #main h6 {
+ color: #636363;
+}
+.bodywebsite #main blockquote {
+ border-left-color: #dddddd;
+}
+.bodywebsite #main code {
+ background: rgba(222, 222, 222, 0.25);
+ border-color: #dddddd;
+}
+.bodywebsite #main hr {
+ border-bottom-color: #dddddd;
+}
+.bodywebsite #main .box {
+ border-color: #dddddd;
+}
+.bodywebsite #main input[type="submit"],
+.bodywebsite #main input[type="reset"],
+.bodywebsite #main input[type="button"],
+.bodywebsite #main button,
+.bodywebsite #main .buttonwebsite {
+ background-color: transparent;
+ box-shadow: inset 0 0 0 1px #dddddd;
+ color: #636363 !important;
+}
+.bodywebsite #main input[type="submit"]:hover,
+.bodywebsite #main input[type="reset"]:hover,
+.bodywebsite #main input[type="button"]:hover,
+.bodywebsite #main button:hover,
+.bodywebsite #main .buttonwebsite:hover {
+ background-color: rgba(222, 222, 222, 0.25);
+}
+.bodywebsite #main input[type="submit"]:active,
+.bodywebsite #main input[type="reset"]:active,
+.bodywebsite #main input[type="button"]:active,
+.bodywebsite #main button:active,
+.bodywebsite #main .buttonwebsite:active {
+ background-color: rgba(222, 222, 222, 0.5);
+}
+.bodywebsite #main input[type="submit"].icon:before,
+.bodywebsite #main input[type="reset"].icon:before,
+.bodywebsite #main input[type="button"].icon:before,
+.bodywebsite #main button.icon:before,
+.bodywebsite #main .buttonwebsite.icon:before {
+ color: rgba(99, 99, 99, 0.25);
+}
+.bodywebsite #main input[type="submit"].primary,
+.bodywebsite #main input[type="reset"].primary,
+.bodywebsite #main input[type="button"].primary,
+.bodywebsite #main button.primary,
+.bodywebsite #main .buttonwebsite.primary {
+ background-color: #8cc9f0;
+ color: #ffffff !important;
+ box-shadow: none;
+}
+.bodywebsite #main input[type="submit"].primary:hover,
+.bodywebsite #main input[type="reset"].primary:hover,
+.bodywebsite #main input[type="button"].primary:hover,
+.bodywebsite #main button.primary:hover,
+.bodywebsite #main .buttonwebsite.primary:hover {
+ background-color: #9acff2;
+}
+.bodywebsite #main input[type="submit"].primary:active,
+.bodywebsite #main input[type="reset"].primary:active,
+.bodywebsite #main input[type="button"].primary:active,
+.bodywebsite #main button.primary:active,
+.bodywebsite #main .buttonwebsite.primary:active {
+ background-color: #7ec3ee;
+}
+.bodywebsite #main input[type="submit"].primary.icon:before,
+.bodywebsite #main input[type="reset"].primary.icon:before,
+.bodywebsite #main input[type="button"].primary.icon:before,
+.bodywebsite #main button.primary.icon:before,
+.bodywebsite #main .buttonwebsite.primary.icon:before {
+ color: #ffffff !important;
+}
+.bodywebsite #main label {
+ color: #636363;
+}
+.bodywebsite #main input[type="text"],
+.bodywebsite #main input[type="password"],
+.bodywebsite #main input[type="email"],
+.bodywebsite #main select,
+.bodywebsite #main textarea {
+ background-color: rgba(222, 222, 222, 0.25);
+ border-color: #dddddd;
+}
+.bodywebsite #main input[type="text"]:focus,
+.bodywebsite #main input[type="password"]:focus,
+.bodywebsite #main input[type="email"]:focus,
+.bodywebsite #main select:focus,
+.bodywebsite #main textarea:focus {
+ border-color: #8cc9f0;
+ box-shadow: 0 0 0 1px #8cc9f0;
+}
+.bodywebsite #main select {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='40' height='40' preserveAspectRatio='none' viewBox='0 0 40 40'%3E%3Cpath d='M9.4,12.3l10.4,10.4l10.4-10.4c0.2-0.2,0.5-0.4,0.9-0.4c0.3,0,0.6,0.1,0.9,0.4l3.3,3.3c0.2,0.2,0.4,0.5,0.4,0.9 c0,0.4-0.1,0.6-0.4,0.9L20.7,31.9c-0.2,0.2-0.5,0.4-0.9,0.4c-0.3,0-0.6-0.1-0.9-0.4L4.3,17.3c-0.2-0.2-0.4-0.5-0.4-0.9 c0-0.4,0.1-0.6,0.4-0.9l3.3-3.3c0.2-0.2,0.5-0.4,0.9-0.4S9.1,12.1,9.4,12.3z' fill='%23dddddd' /%3E%3C/svg%3E");
+}
+.bodywebsite #main select option {
+ color: #636363;
+ background: #ffffff;
+}
+.bodywebsite #main input[type="checkbox"] + label,
+.bodywebsite #main input[type="radio"] + label {
+ color: #636363;
+}
+.bodywebsite #main input[type="checkbox"] + label:before,
+.bodywebsite #main input[type="radio"] + label:before {
+ background: rgba(222, 222, 222, 0.25);
+ border-color: #dddddd;
+}
+.bodywebsite #main input[type="checkbox"]:checked + label:before,
+.bodywebsite #main input[type="radio"]:checked + label:before {
+ background-color: #636363;
+ border-color: #636363;
+ color: #ffffff;
+}
+.bodywebsite #main input[type="checkbox"]:focus + label:before,
+.bodywebsite #main input[type="radio"]:focus + label:before {
+ border-color: #8cc9f0;
+ box-shadow: 0 0 0 1px #8cc9f0;
+}
+.bodywebsite #main ::-webkit-input-placeholder {
+ color: rgba(99, 99, 99, 0.25) !important;
+}
+.bodywebsite #main :-moz-placeholder {
+ color: rgba(99, 99, 99, 0.25) !important;
+}
+.bodywebsite #main ::-moz-placeholder {
+ color: rgba(99, 99, 99, 0.25) !important;
+}
+.bodywebsite #main :-ms-input-placeholder {
+ color: rgba(99, 99, 99, 0.25) !important;
+}
+.bodywebsite #main .formerize-placeholder {
+ color: rgba(99, 99, 99, 0.25) !important;
+}
+.bodywebsite #main .icon.major {
+ border-color: #dddddd;
+}
+.bodywebsite #main .icon.major:before {
+ border-color: #dddddd;
+}
+.bodywebsite #main .icon.alt {
+ border-color: #dddddd;
+ color: #636363;
+}
+.bodywebsite #main .icon.alt:hover {
+ background-color: rgba(222, 222, 222, 0.25);
+}
+.bodywebsite #main .icon.alt:active {
+ background-color: rgba(222, 222, 222, 0.5);
+}
+.bodywebsite #main ul.alt li {
+ border-top-color: #dddddd;
+}
+.bodywebsite #main dl dt {
+ color: #636363;
+}
+.bodywebsite #main header.major h2:after {
+ background-color: #dddddd;
+ background-image: -moz-linear-gradient(90deg, #efa8b0, #a89cc8, #8cc9f0);
+ background-image: -webkit-linear-gradient(90deg, #efa8b0, #a89cc8, #8cc9f0);
+ background-image: -ms-linear-gradient(90deg, #efa8b0, #a89cc8, #8cc9f0);
+ background-image: linear-gradient(90deg, #efa8b0, #a89cc8, #8cc9f0);
+}
+.bodywebsite #main table tbody tr {
+ border-color: #dddddd;
+}
+.bodywebsite #main table tbody tr:nth-child(2n + 1) {
+ background-color: rgba(222, 222, 222, 0.25);
+}
+.bodywebsite #main table th {
+ color: #636363;
+}
+.bodywebsite #main table thead {
+ border-bottom-color: #dddddd;
+}
+.bodywebsite #main table tfoot {
+ border-top-color: #dddddd;
+}
+.bodywebsite #main table.alt tbody tr td {
+ border-color: #dddddd;
+}
+.bodywebsite #main .spotlight .image {
+ border-color: #dddddd;
+}
+.bodywebsite #main > .main {
+ padding: 5em 5em 3em 5em ;
+ border-top: solid 1px #dddddd;
+}
+.bodywebsite #main > .main:first-child {
+ border-top: 0;
+}
+.bodywebsite #main > .main .image.main:first-child {
+ margin: -5em 0 5em -5em;
+ width: calc(100% + 10em);
+ border-top-right-radius: 0.25em;
+ border-top-left-radius: 0.25em;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.bodywebsite #main > .main .image.main:first-child img {
+ border-top-right-radius: 0.25em;
+ border-top-left-radius: 0.25em;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+@media screen and (max-width: 1280px) {
+ .bodywebsite #main > .main {
+ padding: 4em 4em 2em 4em ;
+ }
+ .bodywebsite #main > .main .image.main:first-child {
+ margin: -4em 0 4em -4em;
+ width: calc(100% + 8em);
+ }
+}
+@media screen and (max-width: 980px) {
+ .bodywebsite #main > .main {
+ padding: 4em 3em 2em 3em ;
+ }
+ .bodywebsite #main > .main .image.main:first-child {
+ margin: -4em 0 4em -3em;
+ width: calc(100% + 6em);
+ }
+}
+@media screen and (max-width: 736px) {
+ .bodywebsite #main > .main {
+ padding: 3em 2em 1em 2em ;
+ }
+ .bodywebsite #main > .main .image.main:first-child {
+ margin: -3em 0 2em -2em;
+ width: calc(100% + 4em);
+ }
+}
+@media screen and (max-width: 480px) {
+ .bodywebsite #main > .main {
+ padding: 3em 1.5em 1em 1.5em;
+ }
+ .bodywebsite #main > .main .image.main:first-child {
+ margin: -3em 0 1.5em -1.5em;
+ width: calc(100% + 3em);
+ }
+}
+@media screen and (max-width: 360px) {
+ .bodywebsite #main {
+ border-radius: 0;
+ }
+ .bodywebsite #main > .main {
+ padding: 2.5em 1em 0.5em 1em;
+ }
+ .bodywebsite #main > .main .image.main:first-child {
+ margin: -2.5em 0 1.5em -1em;
+ width: calc(100% + 2em);
+ border-radius: 0;
+ }
+ .bodywebsite #main > .main .image.main:first-child img {
+ border-radius: 0;
+ }
+}
+.bodywebsite #footer section {
+ width: calc(50% - 22px);
+ padding: 10px;
+}
+.bodywebsite #footer {
+ display: -moz-flex;
+ display: -webkit-flex;
+ display: -ms-flex;
+ display: flex;
+ -moz-flex-wrap: wrap;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ padding: 5em 5em 3em 5em ;
+}
+.bodywebsite #footer .copyright {
+ font-size: 0.8em;
+ text-align: center;
+}
+@media screen and (max-width: 1280px) {
+ .bodywebsite #footer {
+ padding: 4em 4em 2em 4em ;
+ }
+}
+@media screen and (max-width: 980px) {
+ .bodywebsite #footer {
+ padding: 4em 3em 2em 3em ;
+ display: block;
+ }
+ .bodywebsite #footer .copyright {
+ text-align: left;
+ }
+}
+@media screen and (max-width: 736px) {
+ .bodywebsite #footer {
+ padding: 3em 2em 1em 2em ;
+ }
+}
+@media screen and (max-width: 480px) {
+ .bodywebsite #footer {
+ padding: 3em 1.5em 1em 1.5em;
+ }
+}
+@media screen and (max-width: 480px) {
+ .bodywebsite #footer {
+ padding: 2.5em 1em 0.5em 1em;
+ }
+}
+.bodywebsite #wrapper {
+ width: 64em;
+ max-width: calc(100% - 4em);
+ margin: 0 auto;
+}
+@media screen and (max-width: 480px) {
+ .bodywebsite #wrapper {
+ max-width: calc(100% - 2em);
+ }
+}
+@media screen and (max-width: 360px) {
+ .bodywebsite #wrapper {
+ max-width: 100%;
+ }
+}
+
+/* CSS for ToTop button */
+
+#myBtnToTop {
+ display: none; /* Hidden by default */
+ position: fixed; /* Fixed/sticky position */
+ bottom: 20px; /* Place the button at the bottom of the page */
+ right: 30px; /* Place the button 30px from the right */
+ z-index: 99; /* Make sure it does not overlap */
+ border: none; /* Remove borders */
+ outline: none; /* Remove outline */
+ background-color: #868; /* Set a background color */
+ color: white; /* Text color */
+ cursor: pointer; /* Add a mouse pointer on hover */
+ padding: 15px; /* Some padding */
+ border-radius: 10px; /* Rounded corners */
+ font-size: 18px; /* Increase font size */
+ min-width: unset;
+ height: unset;
+ line-height: unset;
+}
+
+#myBtnToTop:hover {
+ background-color: #555; /* Add a dark-grey background on hover */
+}
+
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/this-is-a-blog-post.php b/htdocs/install/doctemplates/websites/website_template-stellar/containers/this-is-a-blog-post.php
new file mode 100644
index 00000000000..0b70a249b2c
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/this-is-a-blog-post.php
@@ -0,0 +1,4 @@
+ref.'/page25.tpl.php';
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/containers/wrapper.php b/htdocs/install/doctemplates/websites/website_template-stellar/containers/wrapper.php
new file mode 100644
index 00000000000..4f1c281ee93
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/containers/wrapper.php
@@ -0,0 +1,239 @@
+entity;
+$original_file = GETPOST("file", "alpha");
+$l = GETPOST('l', 'aZ09');
+$limit = GETPOST('limit', 'int');
+
+// Parameters for RSS
+$rss = GETPOST('rss', 'aZ09');
+if ($rss) $original_file = 'blog.rss';
+
+// If we have a hash public (hashp), we guess the original_file.
+if (!empty($hashp)) {
+ include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
+ $ecmfile = new EcmFiles($db);
+ $result = $ecmfile->fetch(0, '', '', '', $hashp);
+ if ($result > 0) {
+ $tmp = explode('/', $ecmfile->filepath, 2); // $ecmfile->filepath is relative to document directory
+ // filepath can be 'users/X' or 'X/propale/PR11111'
+ if (is_numeric($tmp[0])) { // If first tmp is numeric, it is subdir of company for multicompany, we take next part.
+ $tmp = explode('/', $tmp[1], 2);
+ }
+ $moduleparttocheck = $tmp[0]; // moduleparttocheck is first part of path
+
+ if ($modulepart) { // Not required, so often not defined, for link using public hashp parameter.
+ if ($moduleparttocheck == $modulepart) {
+ // We remove first level of directory
+ $original_file = (($tmp[1] ? $tmp[1].'/' : '').$ecmfile->filename); // this is relative to module dir
+ //var_dump($original_file); exit;
+ } else {
+ print 'Bad link. File is from another module part.';
+ }
+ } else {
+ $modulepart = $moduleparttocheck;
+ $original_file = (($tmp[1] ? $tmp[1].'/' : '').$ecmfile->filename); // this is relative to module dir
+ }
+ } else {
+ print "ErrorFileNotFoundWithSharedLink";
+ exit;
+ }
+}
+
+// Define attachment (attachment=true to force choice popup 'open'/'save as')
+$attachment = true;
+if (preg_match('/\.(html|htm)$/i', $original_file)) $attachment = false;
+if (isset($_GET["attachment"])) $attachment = (GETPOST("attachment", 'alphanohtml') ? true : false);
+if (!empty($conf->global->MAIN_DISABLE_FORCE_SAVEAS_WEBSITE)) $attachment = false;
+
+// Define mime type
+$type = 'application/octet-stream';
+if (GETPOSTISSET('type')) $type = GETPOST('type', 'alpha');
+else $type = dol_mimetype($original_file);
+
+// Security: Delete string ../ into $original_file
+$original_file = str_replace("../", "/", $original_file);
+
+// Cache or not
+if (GETPOST("cache", 'aZ09') || image_format_supported($original_file) >= 0) {
+ // Important: Following code is to avoid page request by browser and PHP CPU at
+ // each Dolibarr page access.
+ header('Cache-Control: max-age=3600, public, must-revalidate');
+ header('Pragma: cache'); // This is to avoid having Pragma: no-cache
+}
+
+$refname = basename(dirname($original_file)."/");
+
+// Get RSS news
+if ($rss) {
+ $format = 'rss';
+ $type = '';
+ $cachedelay = 0;
+ $filename = $original_file;
+ $dir_temp = $conf->website->dir_temp;
+
+ include_once DOL_DOCUMENT_ROOT.'/website/class/website.class.php';
+ include_once DOL_DOCUMENT_ROOT.'/website/class/websitepage.class.php';
+ $website = new Website($db);
+ $websitepage = new WebsitePage($db);
+
+ $website->fetch('', $websitekey);
+
+ $filters = array('type_container'=>'blogpost');
+ if ($l) $filters['lang'] = $l;
+
+ $MAXNEWS = ($limit ? $limit : 20);
+ $arrayofblogs = $websitepage->fetchAll($website->id, 'DESC', 'date_creation', $MAXNEWS, 0, $filters);
+ $eventarray = array();
+ if (is_array($arrayofblogs)) {
+ foreach ($arrayofblogs as $blog) {
+ $blog->fullpageurl = $website->virtualhost.'/'.$blog->pageurl.'.php';
+ $eventarray[] = $blog;
+ }
+ }
+
+ require_once DOL_DOCUMENT_ROOT."/core/lib/xcal.lib.php";
+ require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php";
+ require_once DOL_DOCUMENT_ROOT."/core/lib/files.lib.php";
+
+ dol_syslog("build_exportfile Build export file format=".$format.", type=".$type.", cachedelay=".$cachedelay.", filename=".$filename.", filters size=".count($filters), LOG_DEBUG);
+
+ // Clean parameters
+ if (!$filename) {
+ $extension = 'rss';
+ $filename = $format.'.'.$extension;
+ }
+
+ // Create dir and define output file (definitive and temporary)
+ $result = dol_mkdir($dir_temp);
+ $outputfile = $dir_temp.'/'.$filename;
+
+ $result = 0;
+
+ $buildfile = true;
+
+ if ($cachedelay) {
+ $nowgmt = dol_now();
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ if (dol_filemtime($outputfile) > ($nowgmt - $cachedelay)) {
+ dol_syslog("build_exportfile file ".$outputfile." is not older than now - cachedelay (".$nowgmt." - ".$cachedelay."). Build is canceled");
+ $buildfile = false;
+ }
+ }
+
+ if ($buildfile) {
+ $langs->load("other");
+ $title = $desc = $langs->transnoentities('LatestBlogPosts');
+
+ // Create temp file
+ $outputfiletmp = tempnam($dir_temp, 'tmp'); // Temporary file (allow call of function by different threads
+ @chmod($outputfiletmp, octdec($conf->global->MAIN_UMASK));
+
+ // Write file
+ $result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l);
+
+ if ($result >= 0) {
+ if (dol_move($outputfiletmp, $outputfile, 0, 1)) $result = 1;
+ else {
+ $error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile;
+ dol_syslog("build_exportfile ".$error, LOG_ERR);
+ dol_delete_file($outputfiletmp, 0, 1);
+ print $error;
+ exit(-1);
+ }
+ } else {
+ dol_syslog("build_exportfile build_xxxfile function fails to for format=".$format." outputfiletmp=".$outputfile, LOG_ERR);
+ dol_delete_file($outputfiletmp, 0, 1);
+ $langs->load("errors");
+ print $langs->trans("ErrorFailToCreateFile", $outputfile);
+ exit(-1);
+ }
+ }
+
+ if ($result >= 0) {
+ $attachment = false;
+ if (isset($_GET["attachment"])) $attachment = $_GET["attachment"];
+ //$attachment = false;
+ $contenttype = 'application/rss+xml';
+ if (isset($_GET["contenttype"])) $contenttype = $_GET["contenttype"];
+ //$contenttype='text/plain';
+ $outputencoding = 'UTF-8';
+
+ if ($contenttype) header('Content-Type: '.$contenttype.($outputencoding ? '; charset='.$outputencoding : ''));
+ if ($attachment) header('Content-Disposition: attachment; filename="'.$filename.'"');
+
+ // Ajout directives pour resoudre bug IE
+ //header('Cache-Control: Public, must-revalidate');
+ //header('Pragma: public');
+ if ($cachedelay) header('Cache-Control: max-age='.$cachedelay.', private, must-revalidate');
+ else header('Cache-Control: private, must-revalidate');
+
+ // Clean parameters
+ $outputfile = $dir_temp.'/'.$filename;
+ $result = readfile($outputfile);
+ if (!$result) print 'File '.$outputfile.' was empty.';
+
+ // header("Location: ".DOL_URL_ROOT.'/document.php?modulepart=agenda&file='.urlencode($filename));
+ exit;
+ }
+}
+// Get logos
+elseif ($modulepart == "mycompany" && preg_match('/^\/?logos\//', $original_file)) {
+ readfile(dol_osencode($conf->mycompany->dir_output."/".$original_file));
+} else {
+ // Find the subdirectory name as the reference
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ $check_access = dol_check_secure_access_document($modulepart, $original_file, $entity, $refname);
+ $accessallowed = $check_access['accessallowed'];
+ $sqlprotectagainstexternals = $check_access['sqlprotectagainstexternals'];
+ $fullpath_original_file = $check_access['original_file']; // $fullpath_original_file is now a full path name
+ if ($hashp) {
+ $accessallowed = 1; // When using hashp, link is public so we force $accessallowed
+ $sqlprotectagainstexternals = '';
+ }
+
+ // Security:
+ // Limit access if permissions are wrong
+ if (!$accessallowed) {
+ print 'Access forbidden';
+ exit;
+ }
+
+ clearstatcache();
+
+ $filename = basename($fullpath_original_file);
+
+ // Output file on browser
+ dol_syslog("wrapper.php download $fullpath_original_file filename=$filename content-type=$type");
+ $fullpath_original_file_osencoded = dol_osencode($fullpath_original_file); // New file name encoded in OS encoding charset
+
+ // This test if file exists should be useless. We keep it to find bug more easily
+ if (!file_exists($fullpath_original_file_osencoded)) {
+ print "ErrorFileDoesNotExists: ".$original_file;
+ exit;
+ }
+
+ // Permissions are ok and file found, so we return it
+ //top_httphead($type);
+ header('Content-Type: '.$type);
+ header('Content-Description: File Transfer');
+ if ($encoding) header('Content-Encoding: '.$encoding);
+ // Add MIME Content-Disposition from RFC 2183 (inline=automatically displayed, attachment=need user action to open)
+ if ($attachment) header('Content-Disposition: attachment; filename="'.$filename.'"');
+ else header('Content-Disposition: inline; filename="'.$filename.'"');
+ header('Content-Length: '.dol_filesize($fullpath_original_file));
+
+ readfile($fullpath_original_file_osencoded);
+}
+if (is_object($db)) $db->close();
+// END PHP
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/medias/image/websitekey/daviddoe.png b/htdocs/install/doctemplates/websites/website_template-stellar/medias/image/websitekey/daviddoe.png
new file mode 100644
index 00000000000..ec1fe6eacb9
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-stellar/medias/image/websitekey/daviddoe.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/medias/image/websitekey/overlay.png b/htdocs/install/doctemplates/websites/website_template-stellar/medias/image/websitekey/overlay.png
new file mode 100644
index 00000000000..a5619432c61
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-stellar/medias/image/websitekey/overlay.png differ
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/medias/image/websitekey/pic01.jpg b/htdocs/install/doctemplates/websites/website_template-stellar/medias/image/websitekey/pic01.jpg
new file mode 100644
index 00000000000..b484c83143b
Binary files /dev/null and b/htdocs/install/doctemplates/websites/website_template-stellar/medias/image/websitekey/pic01.jpg differ
diff --git a/htdocs/install/doctemplates/websites/website_template-stellar/website_pages.sql b/htdocs/install/doctemplates/websites/website_template-stellar/website_pages.sql
new file mode 100644
index 00000000000..59ad32e4bf0
--- /dev/null
+++ b/htdocs/install/doctemplates/websites/website_template-stellar/website_pages.sql
@@ -0,0 +1,18 @@
+-- Page ID 20 -> 1__+MAX_llx_website_page__ - Aliases credits --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(1__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'credits', '', 'Credits', 'Credits and legal notices', 'en', '', '', '1', '2019-08-15 16:39:56', '2020-02-21 10:27:17', null, '', 'page', '', ' __N__ __N__
__N____N__ __N__ __N____N__ __N__ __N____N__ __N__
__N____N__ __N__
__N____N__ __N__ __N__This site is edited by name; ?>__N____N__ __N__
__N____N__ __N____N__
__N____N__ __N__ __N____N__
__N____N__', '', '0');
+-- Page ID 21 -> 2__+MAX_llx_website_page__ - Aliases footer --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(2__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'footer', '', 'Footer', '', 'fr', '', '', '1', '2019-08-15 16:42:44', '2020-06-19 10:18:14', null, '', 'page', '', ' __N__ __N____N____N____N____N__
Top __N__', '', '0');
+-- Page ID 22 -> 3__+MAX_llx_website_page__ - Aliases generic --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(3__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'generic', '', 'Generic page', 'Generic page or my personal Blog', 'en', '', 'My generic page', '1', '2019-08-15 00:03:43', '2020-05-14 18:48:34', null, '', 'page', '', ' __N____N__
__N____N__ __N__ __N____N__ __N__ __N____N__ __N__
__N____N__ __N__
__N__ __N__ Magna feugiat lorem __N__ Donec eget ex magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque venenatis dolor imperdiet dolor mattis sagittis. Praesent rutrum sem diam, vitae egestas enim auctor sit amet. Pellentesque leo mauris, consectetur id ipsum sit amet, fergiat. Pellentesque in mi eu massa lacinia malesuada et a elit. Donec urna ex, lacinia in purus ac, pretium pulvinar mauris. Curabitur sapien risus, commodo eget turpis at, elementum convallis fames ac ante ipsum primis in faucibus.
__N__ Pellentesque venenatis dolor imperdiet dolor mattis sagittis. Praesent rutrum sem diam, vitae egestas enim auctor sit amet.
__N__ Tempus veroeros __N__ Cep risus aliquam gravida cep ut lacus amet. Adipiscing faucibus nunc placerat. Tempus adipiscing turpis non blandit accumsan eget lacinia nunc integer interdum amet aliquam ut orci non col ut ut praesent.
__N__ __N____N__ __N__
__N__ Latest Blog posts __N__ __N__ loadLangs(array(\"main\",\"website\"));__N__ $fuser = new User($db);__N__ $arrayofblogs = $websitepage->fetchAll($website->id, \'DESC\', \'date_creation\', 5, 0, array(\'type_container\'=>\'blogpost\', \'status\'=>1, \'lang\'=>\'null,\'.$websitepage->lang)); // , \'keywords\'=>$keyword__N__ if (is_numeric($arrayofblogs) && $arrayofblogs < 0)__N__ {__N__ print \'
\'.$weblangs->trans($websitepage->error).\'
\';__N__ }__N__ elseif (is_array($arrayofblogs) && ! empty($arrayofblogs))__N__ {__N__ foreach($arrayofblogs as $blog)__N__ {__N__ print \'
\';__N__ print \'
\';__N__ print \'
\';__N__ }__N__ }__N__ else__N__ {__N__ print \'
\';__N__ print \'
\';__N__ //print $weblangs->trans(\"NoArticlesFoundForTheKeyword\", $keyword);__N__ print $weblangs->trans(\"NoArticlesFound\");__N__ print \'
\';__N__ print \'
\';__N__ __N__ }__N__ ?>__N__
__N__ __N____N__
__N____N____N____N__ __N__ __N__ __N__ __N__
__N____N__', '', '0');
+-- Page ID 23 -> 4__+MAX_llx_website_page__ - Aliases home --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(4__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'home', '', 'My personal blog', 'Home page or my personal Blog', 'en', '', 'My personal blog', '1', '2019-08-15 00:03:43', '2022-07-06 23:50:25', null, '', 'page', '', '__N__
__N____N__ __N__ __N____N__ __N__ __N____N__ __N__
__N____N__ __N__
__N__ __N__
__N__
__N__ Ipsum sed adipiscing __N__ __N__
Sed lorem ipsum dolor sit amet nullam consequat feugiat consequat magna__N__ adipiscing magna etiam amet veroeros. Lorem ipsum dolor tempus sit cursus.__N__ Tempus nisl et nullam lorem ipsum dolor sit amet aliquam.
__N__
__N__
__N__
__N__
__N__ __N____N__ __N__
__N__ __N__ Magna veroeros __N__ __N__ __N__ __N__ __N__ Ipsum consequat __N__ Sed lorem amet ipsum dolor et amet nullam consequat a feugiat consequat tempus veroeros sed consequat.
__N__ __N__ __N__ __N__ Amed sed feugiat __N__ Sed lorem amet ipsum dolor et amet nullam consequat a feugiat consequat tempus veroeros sed consequat.
__N__ __N__ __N__ __N__ Dolor nullam __N__ Sed lorem amet ipsum dolor et amet nullam consequat a feugiat consequat tempus veroeros sed consequat.
__N__ __N__ __N__ __N__ __N____N__ __N__
__N__ __N__ __N__ __N__ __N__ 5,120 Etiam__N__ __N__ __N__ __N__ 8,192 Magna__N__ __N__ __N__ __N__ 2,048 Tempus__N__ __N__ __N__ __N__ 4,096 Aliquam__N__ __N__ __N__ __N__ 1,024 Nullam__N__ __N__ __N__ Nam elementum nisl et mi a commodo porttitor. Morbi sit amet nisl eu arcu faucibus hendrerit vel a risus. Nam a orci mi, elementum ac arcu sit amet, fermentum pellentesque et purus. Integer maximus varius lorem, sed convallis diam accumsan sed. Etiam porttitor placerat sapien, sed eleifend a enim pulvinar faucibus semper quis ut arcu. Ut non nisl a mollis est efficitur vestibulum. Integer eget purus nec nulla mattis et accumsan ut magna libero. Morbi auctor iaculis porttitor. Sed ut magna ac risus et hendrerit scelerisque. Praesent eleifend lacus in lectus aliquam porta. Cras eu ornare dui curabitur lacinia.
__N__ __N__ __N____N__ __N__
__N____N__
__N____N__ __N____N__
__N____N__', '', '0');
+UPDATE llx_website SET fk_default_home = 4__+MAX_llx_website_page__ WHERE rowid = __WEBSITE_ID__;
+-- Page ID 24 -> 5__+MAX_llx_website_page__ - Aliases menu --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(5__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'menu', '', 'Menu', 'Menu common to all pages', 'fr', '', '', '1', '2019-08-15 00:03:43', '2020-02-21 10:27:17', null, '', 'menu', '', '
__N__ __N__ __N__', '', '0');
+-- Page ID 25 -> 6__+MAX_llx_website_page__ - Aliases this-is-a-blog-post --;
+INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias, allowed_in_frames) VALUES(6__+MAX_llx_website_page__, null, __WEBSITE_ID__, 'this-is-a-blog-post', '', 'This is a Blog post', 'This is a full meta description of the article', '', '', 'blog', '1', '2019-08-17 17:18:45', '2022-07-06 23:50:25', null, '', 'blogpost', '', '__N__
__N__ This is a blog post article...__N__ __N__', 'webmaster', '0');
+
+-- For Dolibarr v14+ --;
+UPDATE llx_website SET lang = 'en' WHERE rowid = __WEBSITE_ID__;
+UPDATE llx_website SET otherlang = '' WHERE rowid = __WEBSITE_ID__;
+
diff --git a/htdocs/install/doctemplates/websites/website_template-style01.zip b/htdocs/install/doctemplates/websites/website_template-style01.zip
deleted file mode 100644
index 7bca0dd1e21..00000000000
Binary files a/htdocs/install/doctemplates/websites/website_template-style01.zip and /dev/null differ
diff --git a/htdocs/install/doctemplates/websites/website_template-style03.zip b/htdocs/install/doctemplates/websites/website_template-style03.zip
deleted file mode 100644
index 18266bd18d9..00000000000
Binary files a/htdocs/install/doctemplates/websites/website_template-style03.zip and /dev/null differ
diff --git a/htdocs/install/doctemplates/websites/website_template-style04.png b/htdocs/install/doctemplates/websites/website_template-style04.png
deleted file mode 100644
index 26325e7e795..00000000000
Binary files a/htdocs/install/doctemplates/websites/website_template-style04.png and /dev/null differ
diff --git a/htdocs/install/doctemplates/websites/website_template-style04.zip b/htdocs/install/doctemplates/websites/website_template-style04.zip
deleted file mode 100644
index 996d98697c3..00000000000
Binary files a/htdocs/install/doctemplates/websites/website_template-style04.zip and /dev/null differ
diff --git a/htdocs/install/inc.php b/htdocs/install/inc.php
index c717d55850e..e68f0d70a96 100644
--- a/htdocs/install/inc.php
+++ b/htdocs/install/inc.php
@@ -35,24 +35,16 @@ require_once '../filefunc.inc.php';
-// Define DOL_DOCUMENT_ROOT and ADODB_PATH used for install/upgrade process
+// Define DOL_DOCUMENT_ROOT used for install/upgrade process
if (!defined('DOL_DOCUMENT_ROOT')) {
define('DOL_DOCUMENT_ROOT', '..');
}
-if (!defined('ADODB_PATH')) {
- $foundpath = DOL_DOCUMENT_ROOT.'/includes/adodbtime/';
- if (!is_dir($foundpath)) {
- $foundpath = '/usr/share/php/adodb/';
- }
- define('ADODB_PATH', $foundpath);
-}
require_once DOL_DOCUMENT_ROOT.'/core/class/translate.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/conf.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/functions.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
-require_once ADODB_PATH.'adodb-time.inc.php';
$conf = new Conf();
diff --git a/htdocs/install/mysql/data/llx_10_c_regions.sql b/htdocs/install/mysql/data/llx_10_c_regions.sql
index ffd02aa9cf9..52a1a3bbbb6 100644
--- a/htdocs/install/mysql/data/llx_10_c_regions.sql
+++ b/htdocs/install/mysql/data/llx_10_c_regions.sql
@@ -4,12 +4,12 @@
-- Copyright (C) 2004 Benoit Mortier
-- Copyright (C) 2004 Guillaume Delecourt
-- Copyright (C) 2005-2009 Regis Houssin
--- Copyright (C) 2007 Patrick Raguin
+-- Copyright (C) 2007 Patrick Raguin
-- Copyright (C) 2010-2016 Juanjo Menent
-- Copyright (C) 2012 Sebastian Neuwert
--- Copyright (C) 2012 Ricardo Schluter
--- Copyright (C) 2015 Ferran Marcet
--- Copyright (C) 2019~ Lao Tian <281388879@qq.com>
+-- Copyright (C) 2012 Ricardo Schluter
+-- Copyright (C) 2015 Ferran Marcet
+-- Copyright (C) 2019~ Lao Tian <281388879@qq.com>
-- Copyright (C) 2020-2021 Udo Tamm
-- Copyright (C) 2022 Miro Sertić
--
@@ -52,11 +52,12 @@
-- Belgium
-- Bolivia
-- Brazil -> for Departmements
+-- Burundi
-- Canada -> for Departmements
-- Chile
-- China
-- Colombie -> for Departmements
--- Croatia -> for Departmements
+-- Croatia
-- Denmark
-- France
-- Germany -> for Departmements
@@ -66,6 +67,7 @@
-- India -> for Departmements
-- Indonesia -> for Departmements
-- Italy
+-- Japan -> only for Departmements
-- Luxembourg
-- Mauritius
-- Mexique -> for Departmements
@@ -332,6 +334,10 @@ insert into llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 3
insert into llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 3, 320, NULL, 1, 'Veneto');
+-- Japan Region (id country=123)
+INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 123, 12301, '', 0,'日本');
+
+
-- Luxembourg Regions (districts) (id country=140)
INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 140, 14001, '', 0, 'Diekirch');
INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 140, 14002, '', 0, 'Grevenmacher');
@@ -533,5 +539,3 @@ INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 2
INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 232, 23208, '', 0, 'Nor-Oriental');
INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 232, 23209, '', 0, 'Zuliana');
--- Japan Region (id country=123)
-INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 123, 12301, '', 0,'日本');
diff --git a/htdocs/install/mysql/data/llx_accounting_abc.sql b/htdocs/install/mysql/data/llx_accounting_abc.sql
index 8874fad0784..0d2dd657639 100644
--- a/htdocs/install/mysql/data/llx_accounting_abc.sql
+++ b/htdocs/install/mysql/data/llx_accounting_abc.sql
@@ -55,7 +55,6 @@ INSERT INTO llx_accounting_journal (code, label, nature, active, entity) VALUES
INSERT INTO llx_accounting_journal (code, label, nature, active, entity) VALUES ('INV', 'InventoryJournal', 8, 1, 1);
-
-- Accounting Charts / Plans (Templates) for Countries
-- Description of chart of account FR PCG99-ABREGE
diff --git a/htdocs/install/mysql/data/llx_accounting_account_fr.sql b/htdocs/install/mysql/data/llx_accounting_account_fr.sql
index d49e509a5be..4520969f82b 100644
--- a/htdocs/install/mysql/data/llx_accounting_account_fr.sql
+++ b/htdocs/install/mysql/data/llx_accounting_account_fr.sql
@@ -136,7 +136,7 @@ INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, acc
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 93,'PCG99-ABREGE','INCOME', '75', '1407', 'Autres produits de gestion courante', 1);
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 94,'PCG99-ABREGE','INCOME', '753', '93', 'Jetons de présence et rémunérations d''administrateurs, gérants,...', 1);
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 95,'PCG99-ABREGE','INCOME', '754', '93', 'Ristournes perçues des coopératives', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 96,'PCG99-ABREGE','INCOME', '755', '93', 'Quotes-parts de résultat sur opérations faites en commun', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 96,'PCG99-ABREGE','INCOME', '755', '93', 'Quotes-parts de résultat sur opérations faites en commun', 1);
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 97,'PCG99-ABREGE','INCOME', '76', '1407', 'Produits financiers', 1);
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 98,'PCG99-ABREGE','INCOME', '77', '1407', 'Produits exceptionnels', 1);
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 99,'PCG99-ABREGE','INCOME', '781', '1407', 'Reprises sur amortissements et provisions', 1);
diff --git a/htdocs/install/mysql/data/llx_accounting_account_gb.sql b/htdocs/install/mysql/data/llx_accounting_account_gb.sql
index 35c245efa95..fc2acf12395 100644
--- a/htdocs/install/mysql/data/llx_accounting_account_gb.sql
+++ b/htdocs/install/mysql/data/llx_accounting_account_gb.sql
@@ -26,10 +26,10 @@
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 71501, 'ENG-BASE', 'CAPIT', '1', '0', 'Equity, provisions for liabilities and charges and liabilities at more than one year', 1);
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 71502, 'ENG-BASE', 'IMMO', '2', '0', 'Administration fees.Fixed assets and receivables over one year', 1);
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 71503, 'ENG-BASE', 'STOCK', '3', '0', 'Stock and orders running', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 71504, 'ENG-BASE', 'TIERS', '4', '0', 'Amounts receivable and payable within one year', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 71504, 'ENG-BASE', 'THIRDPARTY', '4', '0', 'Amounts receivable and payable within one year', 1);
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 71505, 'ENG-BASE', 'FINAN', '5', '0', 'Placing of cash and cash equivalents', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 71506, 'ENG-BASE', 'CHARGE','6', '0', 'Charges', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 71507, 'ENG-BASE', 'PROD', '7', '0', 'Products', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 71506, 'ENG-BASE', 'EXPENSE','6', '0', 'Charges', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 71507, 'ENG-BASE', 'INCOME', '7', '0', 'Products', 1);
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70103, 'ENG-BASE', 'CAPIT', '10', '71501', 'Capital and reserves', 1);
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70104, 'ENG-BASE', 'CAPIT', '101', '70103', 'Capital', 1);
@@ -158,70 +158,70 @@ INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, acc
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70227, 'ENG-BASE', 'STOCK', '394', '70223', 'Provisions for depreciation of work in process', 1);
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70228, 'ENG-BASE', 'STOCK', '395', '70223', 'Provisions for depreciation of inventories of products', 1);
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70229, 'ENG-BASE', 'STOCK', '397', '70223', 'Provisions for depreciation of inventories of goods', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70230, 'ENG-BASE', 'TIERS', '40', '71504', 'Accounts payable', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70231, 'ENG-BASE', 'TIERS', '400', '70230', 'Accounts payable', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70232, 'ENG-BASE', 'TIERS', '401', '70230', 'Suppliers', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70233, 'ENG-BASE', 'TIERS', '403', '70230', 'Suppliers - Payables', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70234, 'ENG-BASE', 'TIERS', '404', '70230', 'Suppliers of fixed assets', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70235, 'ENG-BASE', 'TIERS', '405', '70230', 'Capital Suppliers - Payables', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70236, 'ENG-BASE', 'TIERS', '408', '70230', 'Supplier invoices not yet received', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70237, 'ENG-BASE', 'TIERS', '409', '70230', 'Debtors suppliers', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70238, 'ENG-BASE', 'TIERS', '41', '71504', 'Accounts receivable', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70239, 'ENG-BASE', 'TIERS', '410', '70238', 'Customers and Related Accounts', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70240, 'ENG-BASE', 'TIERS', '411', '70238', 'Customers', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70241, 'ENG-BASE', 'TIERS', '413', '70238', 'Accounts Receivable', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70242, 'ENG-BASE', 'TIERS', '416', '70238', 'Doubtful or contentious customers', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70243, 'ENG-BASE', 'TIERS', '418', '70238', 'Customers - Products not yet billed', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70244, 'ENG-BASE', 'TIERS', '419', '70238', 'Accounts payable', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70245, 'ENG-BASE', 'TIERS', '42', '71504', 'Personnel and related accounts', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70246, 'ENG-BASE', 'TIERS', '421', '70245', 'Staff - Remuneration due', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70247, 'ENG-BASE', 'TIERS', '422', '70245', 'Works councils, establishment, ...', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70248, 'ENG-BASE', 'TIERS', '424', '70245', 'Employee participation in results', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70249, 'ENG-BASE', 'TIERS', '425', '70245', 'Staff - Advances and Advances', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70250, 'ENG-BASE', 'TIERS', '426', '70245', 'Staff - Deposits', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70251, 'ENG-BASE', 'TIERS', '427', '70245', 'Staff - Oppositions', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70252, 'ENG-BASE', 'TIERS', '428', '70245', 'Personnel - Accrued expenses and accrued income', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70253, 'ENG-BASE', 'TIERS', '43', '71504', 'Social security and other social organizations', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70254, 'ENG-BASE', 'TIERS', '431', '70253', 'Social Security', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70255, 'ENG-BASE', 'TIERS', '437', '70253', 'Other social organizations', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70256, 'ENG-BASE', 'TIERS', '438', '70253', 'Social organizations - Accrued expenses and accrued income', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70257, 'ENG-BASE', 'TIERS', '44', '71504', 'State and other public authorities', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70258, 'ENG-BASE', 'TIERS', '441', '70257', 'Status - Grants Receivable', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70259, 'ENG-BASE', 'TIERS', '442', '70257', 'Statement - Taxes and taxes recoverable on third parties', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70260, 'ENG-BASE', 'TIERS', '443', '70257', 'Special operations with the State, public authorities, international organizations', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70261, 'ENG-BASE', 'TIERS', '444', '70257', 'State - Income taxes', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70262, 'ENG-BASE', 'TIERS', '445', '70257', 'State - Taxes on turnover', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70263, 'ENG-BASE', 'TIERS', '446', '70257', 'Bonded Bonds', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70264, 'ENG-BASE', 'TIERS', '447', '70257', 'Other taxes, duties and similar payments', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70265, 'ENG-BASE', 'TIERS', '448', '70257', 'Statement of Accounts Payable and Accrued Income', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70266, 'ENG-BASE', 'TIERS', '449', '70257', 'Emission quotas to be returned to the State', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70267, 'ENG-BASE', 'TIERS', '45', '71504', 'Group and Associates', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70268, 'ENG-BASE', 'TIERS', '451', '70267', 'Group', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70269, 'ENG-BASE', 'TIERS', '455', '70267', 'Associates - Current Accounts', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70270, 'ENG-BASE', 'TIERS', '456', '70267', 'Associates - Capital transactions', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70271, 'ENG-BASE', 'TIERS', '457', '70267', 'Associates - Dividends payable', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70272, 'ENG-BASE', 'TIERS', '458', '70267', 'Associates- Joint and EIG Operations', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70273, 'ENG-BASE', 'TIERS', '46', '71504', 'Miscellaneous receivables and creditors', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70274, 'ENG-BASE', 'TIERS', '462', '70273', 'Receivables on disposals of fixed assets', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70275, 'ENG-BASE', 'TIERS', '464', '70273', 'Debts on acquisitions of marketable securities', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70276, 'ENG-BASE', 'TIERS', '465', '70273', 'Receivables on disposals of marketable securities', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70277, 'ENG-BASE', 'TIERS', '467', '70273', 'Other accounts receivable or payable', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70278, 'ENG-BASE', 'TIERS', '468', '70273', 'Miscellaneous - Accrued expenses and accrued income', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70279, 'ENG-BASE', 'TIERS', '47', '71504', 'Transition or suspense accounts', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70280, 'ENG-BASE', 'TIERS', '471', '70279', 'Waiting Accounts', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70281, 'ENG-BASE', 'TIERS', '476', '70279', 'Conversion Difference - Assets', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70282, 'ENG-BASE', 'TIERS', '477', '70279', 'Translation differences - Liabilities', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70283, 'ENG-BASE', 'TIERS', '478', '70279', 'Other transitional accounts', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70284, 'ENG-BASE', 'TIERS', '48', '71504', 'regularisation account', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70285, 'ENG-BASE', 'TIERS', '481', '70284', 'Expenses to be spread over several financial years', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70286, 'ENG-BASE', 'TIERS', '486', '70284', 'Prepaid expenses', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70287, 'ENG-BASE', 'TIERS', '487', '70284', 'Deferred income', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70288, 'ENG-BASE', 'TIERS', '488', '70284', 'Accounts for the periodic distribution of expenses and revenues', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70289, 'ENG-BASE', 'TIERS', '489', '70284', 'Emission allowances allocated by the State', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70290, 'ENG-BASE', 'TIERS', '49', '71504', 'Provisions for depreciation of third party accounts', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70291, 'ENG-BASE', 'TIERS', '491', '70290', 'Provisions for depreciation of customer accounts', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70292, 'ENG-BASE', 'TIERS', '495', '70290', 'Provisions for impairment of group and associate accounts', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70293, 'ENG-BASE', 'TIERS', '496', '70290', 'Provisions for depreciation of accounts receivable', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70230, 'ENG-BASE', 'THIRDPARTY', '40', '71504', 'Accounts payable', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70231, 'ENG-BASE', 'THIRDPARTY', '400', '70230', 'Accounts payable', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70232, 'ENG-BASE', 'THIRDPARTY', '401', '70230', 'Suppliers', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70233, 'ENG-BASE', 'THIRDPARTY', '403', '70230', 'Suppliers - Payables', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70234, 'ENG-BASE', 'THIRDPARTY', '404', '70230', 'Suppliers of fixed assets', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70235, 'ENG-BASE', 'THIRDPARTY', '405', '70230', 'Capital Suppliers - Payables', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70236, 'ENG-BASE', 'THIRDPARTY', '408', '70230', 'Supplier invoices not yet received', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70237, 'ENG-BASE', 'THIRDPARTY', '409', '70230', 'Debtors suppliers', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70238, 'ENG-BASE', 'THIRDPARTY', '41', '71504', 'Accounts receivable', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70239, 'ENG-BASE', 'THIRDPARTY', '410', '70238', 'Customers and Related Accounts', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70240, 'ENG-BASE', 'THIRDPARTY', '411', '70238', 'Customers', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70241, 'ENG-BASE', 'THIRDPARTY', '413', '70238', 'Accounts Receivable', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70242, 'ENG-BASE', 'THIRDPARTY', '416', '70238', 'Doubtful or contentious customers', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70243, 'ENG-BASE', 'THIRDPARTY', '418', '70238', 'Customers - Products not yet billed', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70244, 'ENG-BASE', 'THIRDPARTY', '419', '70238', 'Accounts payable', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70245, 'ENG-BASE', 'THIRDPARTY', '42', '71504', 'Personnel and related accounts', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70246, 'ENG-BASE', 'THIRDPARTY', '421', '70245', 'Staff - Remuneration due', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70247, 'ENG-BASE', 'THIRDPARTY', '422', '70245', 'Works councils, establishment, ...', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70248, 'ENG-BASE', 'THIRDPARTY', '424', '70245', 'Employee participation in results', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70249, 'ENG-BASE', 'THIRDPARTY', '425', '70245', 'Staff - Advances and Advances', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70250, 'ENG-BASE', 'THIRDPARTY', '426', '70245', 'Staff - Deposits', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70251, 'ENG-BASE', 'THIRDPARTY', '427', '70245', 'Staff - Oppositions', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70252, 'ENG-BASE', 'THIRDPARTY', '428', '70245', 'Personnel - Accrued expenses and accrued income', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70253, 'ENG-BASE', 'THIRDPARTY', '43', '71504', 'Social security and other social organizations', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70254, 'ENG-BASE', 'THIRDPARTY', '431', '70253', 'Social Security', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70255, 'ENG-BASE', 'THIRDPARTY', '437', '70253', 'Other social organizations', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70256, 'ENG-BASE', 'THIRDPARTY', '438', '70253', 'Social organizations - Accrued expenses and accrued income', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70257, 'ENG-BASE', 'THIRDPARTY', '44', '71504', 'State and other public authorities', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70258, 'ENG-BASE', 'THIRDPARTY', '441', '70257', 'Status - Grants Receivable', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70259, 'ENG-BASE', 'THIRDPARTY', '442', '70257', 'Statement - Taxes and taxes recoverable on third parties', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70260, 'ENG-BASE', 'THIRDPARTY', '443', '70257', 'Special operations with the State, public authorities, international organizations', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70261, 'ENG-BASE', 'THIRDPARTY', '444', '70257', 'State - Income taxes', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70262, 'ENG-BASE', 'THIRDPARTY', '445', '70257', 'State - Taxes on turnover', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70263, 'ENG-BASE', 'THIRDPARTY', '446', '70257', 'Bonded Bonds', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70264, 'ENG-BASE', 'THIRDPARTY', '447', '70257', 'Other taxes, duties and similar payments', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70265, 'ENG-BASE', 'THIRDPARTY', '448', '70257', 'Statement of Accounts Payable and Accrued Income', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70266, 'ENG-BASE', 'THIRDPARTY', '449', '70257', 'Emission quotas to be returned to the State', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70267, 'ENG-BASE', 'THIRDPARTY', '45', '71504', 'Group and Associates', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70268, 'ENG-BASE', 'THIRDPARTY', '451', '70267', 'Group', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70269, 'ENG-BASE', 'THIRDPARTY', '455', '70267', 'Associates - Current Accounts', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70270, 'ENG-BASE', 'THIRDPARTY', '456', '70267', 'Associates - Capital transactions', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70271, 'ENG-BASE', 'THIRDPARTY', '457', '70267', 'Associates - Dividends payable', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70272, 'ENG-BASE', 'THIRDPARTY', '458', '70267', 'Associates- Joint and EIG Operations', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70273, 'ENG-BASE', 'THIRDPARTY', '46', '71504', 'Miscellaneous receivables and creditors', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70274, 'ENG-BASE', 'THIRDPARTY', '462', '70273', 'Receivables on disposals of fixed assets', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70275, 'ENG-BASE', 'THIRDPARTY', '464', '70273', 'Debts on acquisitions of marketable securities', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70276, 'ENG-BASE', 'THIRDPARTY', '465', '70273', 'Receivables on disposals of marketable securities', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70277, 'ENG-BASE', 'THIRDPARTY', '467', '70273', 'Other accounts receivable or payable', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70278, 'ENG-BASE', 'THIRDPARTY', '468', '70273', 'Miscellaneous - Accrued expenses and accrued income', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70279, 'ENG-BASE', 'THIRDPARTY', '47', '71504', 'Transition or suspense accounts', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70280, 'ENG-BASE', 'THIRDPARTY', '471', '70279', 'Waiting Accounts', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70281, 'ENG-BASE', 'THIRDPARTY', '476', '70279', 'Conversion Difference - Assets', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70282, 'ENG-BASE', 'THIRDPARTY', '477', '70279', 'Translation differences - Liabilities', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70283, 'ENG-BASE', 'THIRDPARTY', '478', '70279', 'Other transitional accounts', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70284, 'ENG-BASE', 'THIRDPARTY', '48', '71504', 'regularisation account', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70285, 'ENG-BASE', 'THIRDPARTY', '481', '70284', 'Expenses to be spread over several financial years', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70286, 'ENG-BASE', 'THIRDPARTY', '486', '70284', 'Prepaid expenses', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70287, 'ENG-BASE', 'THIRDPARTY', '487', '70284', 'Deferred income', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70288, 'ENG-BASE', 'THIRDPARTY', '488', '70284', 'Accounts for the periodic distribution of expenses and revenues', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70289, 'ENG-BASE', 'THIRDPARTY', '489', '70284', 'Emission allowances allocated by the State', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70290, 'ENG-BASE', 'THIRDPARTY', '49', '71504', 'Provisions for depreciation of third party accounts', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70291, 'ENG-BASE', 'THIRDPARTY', '491', '70290', 'Provisions for depreciation of customer accounts', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70292, 'ENG-BASE', 'THIRDPARTY', '495', '70290', 'Provisions for impairment of group and associate accounts', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70293, 'ENG-BASE', 'THIRDPARTY', '496', '70290', 'Provisions for depreciation of accounts receivable', 1);
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70294, 'ENG-BASE', 'FINAN', '50', '71505', 'Marketable securities', 1);
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70295, 'ENG-BASE', 'FINAN', '501', '70294', 'Shares in related companies', 1);
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70296, 'ENG-BASE', 'FINAN', '502', '70294', 'Treasury shares', 1);
@@ -250,120 +250,120 @@ INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, acc
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70319, 'ENG-BASE', 'FINAN', '58', '71505', 'Internal transfers', 1);
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70320, 'ENG-BASE', 'FINAN', '59', '71505', 'Provisions for impairment of financial accounts', 1);
INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70321, 'ENG-BASE', 'FINAN', '590', '70320', 'Provisions for depreciation of marketable securities', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70322, 'ENG-BASE', 'CHARGE', '60', '71506', 'Shopping', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70323, 'ENG-BASE', 'CHARGE', '601', '70322', 'Stored Procurement - Raw Materials (and Supplies)', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70324, 'ENG-BASE', 'CHARGE', '602', '70322', 'Stored Procurement - Other Supplies', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70325, 'ENG-BASE', 'CHARGE', '603', '70322', 'Inventory Changes (Supplies and Commodities)', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70326, 'ENG-BASE', 'CHARGE', '604', '70322', 'Stored Procurement - Raw Materials (and Supplies)', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70327, 'ENG-BASE', 'CHARGE', '605', '70322', 'Purchase of equipment, works and equipment', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70328, 'ENG-BASE', 'CHARGE', '606', '70322', 'Non-stock purchases of materials and supplies', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70329, 'ENG-BASE', 'CHARGE', '607', '70322', 'Purchases of goods', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70330, 'ENG-BASE', 'CHARGE', '608', '70322', 'Reserved account, where applicable, to the recapitulation of incidental expenses included in purchases', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70331, 'ENG-BASE', 'CHARGE', '609', '70322', 'Discounts, rebates and rebates obtained on purchases', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70332, 'ENG-BASE', 'CHARGE', '61', '71506', 'Outside services', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70333, 'ENG-BASE', 'CHARGE', '611', '70332', 'General subcontracting', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70334, 'ENG-BASE', 'CHARGE', '612', '70332', 'Lease payments', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70335, 'ENG-BASE', 'CHARGE', '613', '70332', 'Rentals', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70336, 'ENG-BASE', 'CHARGE', '614', '70332', 'Rental and condominium expenses', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70337, 'ENG-BASE', 'CHARGE', '615', '70332', 'Maintenance and repairs', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70338, 'ENG-BASE', 'CHARGE', '616', '70332', 'Insurance premiums', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70339, 'ENG-BASE', 'CHARGE', '617', '70332', 'Studies and research', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70340, 'ENG-BASE', 'CHARGE', '618', '70332', 'Various', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70341, 'ENG-BASE', 'CHARGE', '619', '70332', 'Discounts, rebates and rebates obtained on external services', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70342, 'ENG-BASE', 'CHARGE', '62', '71506', 'Other services', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70343, 'ENG-BASE', 'CHARGE', '621', '70342', 'Staff outside the company', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70344, 'ENG-BASE', 'CHARGE', '622', '70342', 'Remuneration of intermediaries and fees', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70345, 'ENG-BASE', 'CHARGE', '623', '70342', 'Advertising, publications, public relations', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70346, 'ENG-BASE', 'CHARGE', '624', '70342', 'Transport of goods and public transport of personnel', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70347, 'ENG-BASE', 'CHARGE', '625', '70342', 'Travel, missions and receptions', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70348, 'ENG-BASE', 'CHARGE', '626', '70342', 'Postal and telecommunications costs', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70349, 'ENG-BASE', 'CHARGE', '627', '70342', 'Banking and related services', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70350, 'ENG-BASE', 'CHARGE', '628', '70342', 'Various', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70351, 'ENG-BASE', 'CHARGE', '629', '70342', 'Discounts, rebates and rebates obtained on other external services', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70352, 'ENG-BASE', 'CHARGE', '63', '71506', 'Taxes other and payments', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70353, 'ENG-BASE', 'CHARGE', '631', '70352', 'Taxes and similar payments on remuneration (tax administrations)', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70354, 'ENG-BASE', 'CHARGE', '633', '70352', 'Taxes and similar payments on remuneration (other bodies)', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70355, 'ENG-BASE', 'CHARGE', '635', '70352', 'Other taxes, duties and similar payments (tax administrations)', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70356, 'ENG-BASE', 'CHARGE', '637', '70352', 'Other taxes, duties and similar payments (other bodies)', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70357, 'ENG-BASE', 'CHARGE', '64', '71506', 'Staff costs', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70358, 'ENG-BASE', 'CHARGE', '641', '70357', 'Remuneration of staff', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70359, 'ENG-BASE', 'CHARGE', '644', '70357', 'Remuneration of the operator''s work', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70360, 'ENG-BASE', 'CHARGE', '645', '70357', 'Social Security and Welfare Expenses', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70361, 'ENG-BASE', 'CHARGE', '646', '70357', 'Personal social contributions of the operator', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70362, 'ENG-BASE', 'CHARGE', '647', '70357', 'Other payroll taxes', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70363, 'ENG-BASE', 'CHARGE', '648', '70357', 'Other staff costs', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70364, 'ENG-BASE', 'CHARGE', '65', '71506', 'Other current operating expenses', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70365, 'ENG-BASE', 'CHARGE', '651', '70364', 'Royalties for concessions, patents, licenses, trademarks, processes, software, rights and similar values', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70366, 'ENG-BASE', 'CHARGE', '653', '70364', 'Attendance fees', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70367, 'ENG-BASE', 'CHARGE', '654', '70364', 'Loss on bad debts', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70368, 'ENG-BASE', 'CHARGE', '655', '70364', 'Share of profit or loss on transactions made jointly', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70369, 'ENG-BASE', 'CHARGE', '658', '70364', 'Miscellaneous operating expenses', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70370, 'ENG-BASE', 'CHARGE', '66', '71506', 'Financial expenses', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70371, 'ENG-BASE', 'CHARGE', '661', '70370', 'Interest charges', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70372, 'ENG-BASE', 'CHARGE', '664', '70370', 'Loss on receivables related to investments', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70373, 'ENG-BASE', 'CHARGE', '665', '70370', 'Discounts granted', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70374, 'ENG-BASE', 'CHARGE', '666', '70370', 'Exchange losses', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70375, 'ENG-BASE', 'CHARGE', '667', '70370', 'Net expense on disposals of marketable securities', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70376, 'ENG-BASE', 'CHARGE', '668', '70370', 'Other financial expenses', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70377, 'ENG-BASE', 'CHARGE', '67', '71506', 'Extraordinary charges', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70378, 'ENG-BASE', 'CHARGE', '671', '70377', 'Exceptional charges on management operations', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70379, 'ENG-BASE', 'CHARGE', '672', '70377', 'Account available to entities to record, in the course of the financial year, expenses over previous financial years', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70380, 'ENG-BASE', 'CHARGE', '675', '70377', 'Book value of assets sold', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70381, 'ENG-BASE', 'CHARGE', '678', '70377', 'Other extraordinary expenses', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70382, 'ENG-BASE', 'CHARGE', '68', '71506', 'Depreciation, amortization and provisions', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70383, 'ENG-BASE', 'CHARGE', '681', '70382', 'Depreciation, amortization and provisions - Operating expenses', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70384, 'ENG-BASE', 'CHARGE', '686', '70382', 'Depreciation, amortization and provisions - Financial expense', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70385, 'ENG-BASE', 'CHARGE', '687', '70382', 'Depreciation, amortization and provisions - Extraordinary expenses', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70386, 'ENG-BASE', 'CHARGE', '69', '71506', 'Employee participation - income tax and assimilated', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70387, 'ENG-BASE', 'CHARGE', '691', '70386', 'Employee participation in results', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70388, 'ENG-BASE', 'CHARGE', '695', '70386', 'Income taxes', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70389, 'ENG-BASE', 'CHARGE', '696', '70386', 'Corporate income tax related to distributions', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70390, 'ENG-BASE', 'CHARGE', '697', '70386', 'Annual corporation tax', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70391, 'ENG-BASE', 'CHARGE', '698', '70386', 'Tax integration', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70392, 'ENG-BASE', 'CHARGE', '699', '70386', 'Products - Reports back deficits', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70393, 'ENG-BASE', 'PROD', '70', '71507', 'Sales of manufactured goods, services, goods', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70394, 'ENG-BASE', 'PROD', '701', '70393', 'Sales of finished products', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70395, 'ENG-BASE', 'PROD', '702', '70393', 'Sales of intermediate products', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70396, 'ENG-BASE', 'PROD', '703', '70393', 'Sales of residual products', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70397, 'ENG-BASE', 'PROD', '704', '70393', 'Works', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70398, 'ENG-BASE', 'PROD', '705', '70393', 'Studies', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70399, 'ENG-BASE', 'PROD', '706', '70393', 'Services', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70400, 'ENG-BASE', 'PROD', '707', '70393', 'Sale of goods', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70401, 'ENG-BASE', 'PROD', '708', '70393', 'Income from ancillary activities', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70402, 'ENG-BASE', 'PROD', '709', '70393', 'Discounts, rebates and rebates granted by the company', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70403, 'ENG-BASE', 'PROD', '71', '71507', 'Stored production (or destocking)', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70404, 'ENG-BASE', 'PROD', '713', '70403', 'Change in stocks (in-process production, products)', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70405, 'ENG-BASE', 'PROD', '72', '71507', 'Immobilised production', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70406, 'ENG-BASE', 'PROD', '721', '70405', 'Intangible assets', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70407, 'ENG-BASE', 'PROD', '722', '70405', 'Property, plant and equipment', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70408, 'ENG-BASE', 'PROD', '74', '71507', 'Operating grants', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70409, 'ENG-BASE', 'PROD', '75', '71507', 'Other management products', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70410, 'ENG-BASE', 'PROD', '751', '70409', 'Royalties for concessions, patents, licenses, trademarks, processes, software, rights and similar values', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70411, 'ENG-BASE', 'PROD', '752', '70409', 'Income from buildings not used for professional purposes', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70412, 'ENG-BASE', 'PROD', '753', '70409', 'Directors'' fees and remuneration of directors, managers, ...', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70413, 'ENG-BASE', 'PROD', '754', '70409', 'Perceived refunds of cooperatives (from surplus)', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70414, 'ENG-BASE', 'PROD', '755', '70409', 'Share of profits on transactions made jointly', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70415, 'ENG-BASE', 'PROD', '758', '70409', 'Miscellaneous current management products', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70416, 'ENG-BASE', 'PROD', '76', '71507', 'Financial products', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70417, 'ENG-BASE', 'PROD', '761', '70416', 'Income from participations', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70418, 'ENG-BASE', 'PROD', '762', '70416', 'Income from other financial assets', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70419, 'ENG-BASE', 'PROD', '763', '70416', 'Revenue from other receivables', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70420, 'ENG-BASE', 'PROD', '764', '70416', 'Income from marketable securities', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70421, 'ENG-BASE', 'PROD', '765', '70416', 'Discounts obtained', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70422, 'ENG-BASE', 'PROD', '766', '70416', 'Exchange gains', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70423, 'ENG-BASE', 'PROD', '767', '70416', 'Net proceeds on disposals of marketable securities', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70424, 'ENG-BASE', 'PROD', '768', '70416', 'Other financial income', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70425, 'ENG-BASE', 'PROD', '77', '71507', 'Exceptional products', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70426, 'ENG-BASE', 'PROD', '771', '70425', 'Extraordinary income from management operations', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70427, 'ENG-BASE', 'PROD', '772', '70425', 'Account available to entities to record, during the financial year, the revenues over previous financial years', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70428, 'ENG-BASE', 'PROD', '775', '70425', 'Proceeds from disposals of assets', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70429, 'ENG-BASE', 'PROD', '777', '70425', 'Share of investment grants transferred to profit or loss for the year', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70430, 'ENG-BASE', 'PROD', '778', '70425', 'Other extraordinary income', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70431, 'ENG-BASE', 'PROD', '78', '71507', 'Reversals of depreciation and provisions', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70432, 'ENG-BASE', 'PROD', '781', '70431', 'Reversals of depreciation and provisions (to be included in revenue)', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70433, 'ENG-BASE', 'PROD', '786', '70431', 'Reversals of provisions for risks (to be recorded in financial income)', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70434, 'ENG-BASE', 'PROD', '787', '70431', 'Reversals of provisions (to be recorded in exceptional income)', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70435, 'ENG-BASE', 'PROD', '79', '71507', 'Transfers of charges', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70436, 'ENG-BASE', 'PROD', '791', '70435', 'Transfers of operating expenses', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70437, 'ENG-BASE', 'PROD', '796', '70435', 'Transfers of financial expenses', 1);
-INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70438, 'ENG-BASE', 'PROD', '797', '70435', 'Transfers of Exceptional Charges', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70322, 'ENG-BASE', 'EXPENSE', '60', '71506', 'Shopping', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70323, 'ENG-BASE', 'EXPENSE', '601', '70322', 'Stored Procurement - Raw Materials (and Supplies)', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70324, 'ENG-BASE', 'EXPENSE', '602', '70322', 'Stored Procurement - Other Supplies', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70325, 'ENG-BASE', 'EXPENSE', '603', '70322', 'Inventory Changes (Supplies and Commodities)', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70326, 'ENG-BASE', 'EXPENSE', '604', '70322', 'Stored Procurement - Raw Materials (and Supplies)', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70327, 'ENG-BASE', 'EXPENSE', '605', '70322', 'Purchase of equipment, works and equipment', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70328, 'ENG-BASE', 'EXPENSE', '606', '70322', 'Non-stock purchases of materials and supplies', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70329, 'ENG-BASE', 'EXPENSE', '607', '70322', 'Purchases of goods', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70330, 'ENG-BASE', 'EXPENSE', '608', '70322', 'Reserved account, where applicable, to the recapitulation of incidental expenses included in purchases', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70331, 'ENG-BASE', 'EXPENSE', '609', '70322', 'Discounts, rebates and rebates obtained on purchases', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70332, 'ENG-BASE', 'EXPENSE', '61', '71506', 'Outside services', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70333, 'ENG-BASE', 'EXPENSE', '611', '70332', 'General subcontracting', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70334, 'ENG-BASE', 'EXPENSE', '612', '70332', 'Lease payments', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70335, 'ENG-BASE', 'EXPENSE', '613', '70332', 'Rentals', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70336, 'ENG-BASE', 'EXPENSE', '614', '70332', 'Rental and condominium expenses', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70337, 'ENG-BASE', 'EXPENSE', '615', '70332', 'Maintenance and repairs', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70338, 'ENG-BASE', 'EXPENSE', '616', '70332', 'Insurance premiums', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70339, 'ENG-BASE', 'EXPENSE', '617', '70332', 'Studies and research', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70340, 'ENG-BASE', 'EXPENSE', '618', '70332', 'Various', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70341, 'ENG-BASE', 'EXPENSE', '619', '70332', 'Discounts, rebates and rebates obtained on external services', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70342, 'ENG-BASE', 'EXPENSE', '62', '71506', 'Other services', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70343, 'ENG-BASE', 'EXPENSE', '621', '70342', 'Staff outside the company', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70344, 'ENG-BASE', 'EXPENSE', '622', '70342', 'Remuneration of intermediaries and fees', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70345, 'ENG-BASE', 'EXPENSE', '623', '70342', 'Advertising, publications, public relations', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70346, 'ENG-BASE', 'EXPENSE', '624', '70342', 'Transport of goods and public transport of personnel', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70347, 'ENG-BASE', 'EXPENSE', '625', '70342', 'Travel, missions and receptions', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70348, 'ENG-BASE', 'EXPENSE', '626', '70342', 'Postal and telecommunications costs', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70349, 'ENG-BASE', 'EXPENSE', '627', '70342', 'Banking and related services', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70350, 'ENG-BASE', 'EXPENSE', '628', '70342', 'Various', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70351, 'ENG-BASE', 'EXPENSE', '629', '70342', 'Discounts, rebates and rebates obtained on other external services', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70352, 'ENG-BASE', 'EXPENSE', '63', '71506', 'Taxes other and payments', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70353, 'ENG-BASE', 'EXPENSE', '631', '70352', 'Taxes and similar payments on remuneration (tax administrations)', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70354, 'ENG-BASE', 'EXPENSE', '633', '70352', 'Taxes and similar payments on remuneration (other bodies)', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70355, 'ENG-BASE', 'EXPENSE', '635', '70352', 'Other taxes, duties and similar payments (tax administrations)', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70356, 'ENG-BASE', 'EXPENSE', '637', '70352', 'Other taxes, duties and similar payments (other bodies)', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70357, 'ENG-BASE', 'EXPENSE', '64', '71506', 'Staff costs', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70358, 'ENG-BASE', 'EXPENSE', '641', '70357', 'Remuneration of staff', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70359, 'ENG-BASE', 'EXPENSE', '644', '70357', 'Remuneration of the operator''s work', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70360, 'ENG-BASE', 'EXPENSE', '645', '70357', 'Social Security and Welfare Expenses', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70361, 'ENG-BASE', 'EXPENSE', '646', '70357', 'Personal social contributions of the operator', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70362, 'ENG-BASE', 'EXPENSE', '647', '70357', 'Other payroll taxes', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70363, 'ENG-BASE', 'EXPENSE', '648', '70357', 'Other staff costs', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70364, 'ENG-BASE', 'EXPENSE', '65', '71506', 'Other current operating expenses', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70365, 'ENG-BASE', 'EXPENSE', '651', '70364', 'Royalties for concessions, patents, licenses, trademarks, processes, software, rights and similar values', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70366, 'ENG-BASE', 'EXPENSE', '653', '70364', 'Attendance fees', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70367, 'ENG-BASE', 'EXPENSE', '654', '70364', 'Loss on bad debts', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70368, 'ENG-BASE', 'EXPENSE', '655', '70364', 'Share of profit or loss on transactions made jointly', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70369, 'ENG-BASE', 'EXPENSE', '658', '70364', 'Miscellaneous operating expenses', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70370, 'ENG-BASE', 'EXPENSE', '66', '71506', 'Financial expenses', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70371, 'ENG-BASE', 'EXPENSE', '661', '70370', 'Interest charges', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70372, 'ENG-BASE', 'EXPENSE', '664', '70370', 'Loss on receivables related to investments', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70373, 'ENG-BASE', 'EXPENSE', '665', '70370', 'Discounts granted', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70374, 'ENG-BASE', 'EXPENSE', '666', '70370', 'Exchange losses', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70375, 'ENG-BASE', 'EXPENSE', '667', '70370', 'Net expense on disposals of marketable securities', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70376, 'ENG-BASE', 'EXPENSE', '668', '70370', 'Other financial expenses', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70377, 'ENG-BASE', 'EXPENSE', '67', '71506', 'Extraordinary charges', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70378, 'ENG-BASE', 'EXPENSE', '671', '70377', 'Exceptional charges on management operations', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70379, 'ENG-BASE', 'EXPENSE', '672', '70377', 'Account available to entities to record, in the course of the financial year, expenses over previous financial years', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70380, 'ENG-BASE', 'EXPENSE', '675', '70377', 'Book value of assets sold', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70381, 'ENG-BASE', 'EXPENSE', '678', '70377', 'Other extraordinary expenses', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70382, 'ENG-BASE', 'EXPENSE', '68', '71506', 'Depreciation, amortization and provisions', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70383, 'ENG-BASE', 'EXPENSE', '681', '70382', 'Depreciation, amortization and provisions - Operating expenses', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70384, 'ENG-BASE', 'EXPENSE', '686', '70382', 'Depreciation, amortization and provisions - Financial expense', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70385, 'ENG-BASE', 'EXPENSE', '687', '70382', 'Depreciation, amortization and provisions - Extraordinary expenses', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70386, 'ENG-BASE', 'EXPENSE', '69', '71506', 'Employee participation - income tax and assimilated', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70387, 'ENG-BASE', 'EXPENSE', '691', '70386', 'Employee participation in results', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70388, 'ENG-BASE', 'EXPENSE', '695', '70386', 'Income taxes', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70389, 'ENG-BASE', 'EXPENSE', '696', '70386', 'Corporate income tax related to distributions', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70390, 'ENG-BASE', 'EXPENSE', '697', '70386', 'Annual corporation tax', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70391, 'ENG-BASE', 'EXPENSE', '698', '70386', 'Tax integration', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70392, 'ENG-BASE', 'EXPENSE', '699', '70386', 'Products - Reports back deficits', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70393, 'ENG-BASE', 'INCOME', '70', '71507', 'Sales of manufactured goods, services, goods', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70394, 'ENG-BASE', 'INCOME', '701', '70393', 'Sales of finished products', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70395, 'ENG-BASE', 'INCOME', '702', '70393', 'Sales of intermediate products', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70396, 'ENG-BASE', 'INCOME', '703', '70393', 'Sales of residual products', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70397, 'ENG-BASE', 'INCOME', '704', '70393', 'Works', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70398, 'ENG-BASE', 'INCOME', '705', '70393', 'Studies', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70399, 'ENG-BASE', 'INCOME', '706', '70393', 'Services', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70400, 'ENG-BASE', 'INCOME', '707', '70393', 'Sale of goods', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70401, 'ENG-BASE', 'INCOME', '708', '70393', 'Income from ancillary activities', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70402, 'ENG-BASE', 'INCOME', '709', '70393', 'Discounts, rebates and rebates granted by the company', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70403, 'ENG-BASE', 'INCOME', '71', '71507', 'Stored production (or destocking)', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70404, 'ENG-BASE', 'INCOME', '713', '70403', 'Change in stocks (in-process production, products)', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70405, 'ENG-BASE', 'INCOME', '72', '71507', 'Immobilised production', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70406, 'ENG-BASE', 'INCOME', '721', '70405', 'Intangible assets', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70407, 'ENG-BASE', 'INCOME', '722', '70405', 'Property, plant and equipment', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70408, 'ENG-BASE', 'INCOME', '74', '71507', 'Operating grants', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70409, 'ENG-BASE', 'INCOME', '75', '71507', 'Other management products', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70410, 'ENG-BASE', 'INCOME', '751', '70409', 'Royalties for concessions, patents, licenses, trademarks, processes, software, rights and similar values', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70411, 'ENG-BASE', 'INCOME', '752', '70409', 'Income from buildings not used for professional purposes', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70412, 'ENG-BASE', 'INCOME', '753', '70409', 'Directors'' fees and remuneration of directors, managers, ...', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70413, 'ENG-BASE', 'INCOME', '754', '70409', 'Perceived refunds of cooperatives (from surplus)', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70414, 'ENG-BASE', 'INCOME', '755', '70409', 'Share of profits on transactions made jointly', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70415, 'ENG-BASE', 'INCOME', '758', '70409', 'Miscellaneous current management products', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70416, 'ENG-BASE', 'INCOME', '76', '71507', 'Financial products', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70417, 'ENG-BASE', 'INCOME', '761', '70416', 'Income from participations', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70418, 'ENG-BASE', 'INCOME', '762', '70416', 'Income from other financial assets', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70419, 'ENG-BASE', 'INCOME', '763', '70416', 'Revenue from other receivables', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70420, 'ENG-BASE', 'INCOME', '764', '70416', 'Income from marketable securities', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70421, 'ENG-BASE', 'INCOME', '765', '70416', 'Discounts obtained', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70422, 'ENG-BASE', 'INCOME', '766', '70416', 'Exchange gains', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70423, 'ENG-BASE', 'INCOME', '767', '70416', 'Net proceeds on disposals of marketable securities', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70424, 'ENG-BASE', 'INCOME', '768', '70416', 'Other financial income', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70425, 'ENG-BASE', 'INCOME', '77', '71507', 'Exceptional products', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70426, 'ENG-BASE', 'INCOME', '771', '70425', 'Extraordinary income from management operations', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70427, 'ENG-BASE', 'INCOME', '772', '70425', 'Account available to entities to record, during the financial year, the revenues over previous financial years', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70428, 'ENG-BASE', 'INCOME', '775', '70425', 'Proceeds from disposals of assets', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70429, 'ENG-BASE', 'INCOME', '777', '70425', 'Share of investment grants transferred to profit or loss for the year', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70430, 'ENG-BASE', 'INCOME', '778', '70425', 'Other extraordinary income', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70431, 'ENG-BASE', 'INCOME', '78', '71507', 'Reversals of depreciation and provisions', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70432, 'ENG-BASE', 'INCOME', '781', '70431', 'Reversals of depreciation and provisions (to be included in revenue)', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70433, 'ENG-BASE', 'INCOME', '786', '70431', 'Reversals of provisions for risks (to be recorded in financial income)', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70434, 'ENG-BASE', 'INCOME', '787', '70431', 'Reversals of provisions (to be recorded in exceptional income)', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70435, 'ENG-BASE', 'INCOME', '79', '71507', 'Transfers of charges', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70436, 'ENG-BASE', 'INCOME', '791', '70435', 'Transfers of operating expenses', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70437, 'ENG-BASE', 'INCOME', '796', '70435', 'Transfers of financial expenses', 1);
+INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 70438, 'ENG-BASE', 'INCOME', '797', '70435', 'Transfers of Exceptional Charges', 1);
diff --git a/htdocs/install/mysql/data/llx_c_action_trigger.sql b/htdocs/install/mysql/data/llx_c_action_trigger.sql
index 83d4bb6e775..9aa28c116c8 100644
--- a/htdocs/install/mysql/data/llx_c_action_trigger.sql
+++ b/htdocs/install/mysql/data/llx_c_action_trigger.sql
@@ -119,9 +119,6 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('EXPENSE_REPORT_APPROVE','Expense report approved','Executed when an expense report is approved','expensereport',203);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('EXPENSE_REPORT_PAID','Expense report billed','Executed when an expense report is set as billed','expensereport',204);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('EXPENSE_REPORT_DELETE','Expense report deleted','Executed when an expense report is deleted','expensereport',205);
-insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_VALIDATE','Expense report validated','Executed when an expense report is validated','expensereport',211);
-insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_MODIFY','Expense report modified','Executed when an expense report is modified','expensereport',212);
-insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_APPROVE','Expense report approved','Executed when an expense report is approved','expensereport',212);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_CREATE','Project creation','Executed when a project is created','project',140);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_VALIDATE','Project validation','Executed when a project is validated','project',141);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_MODIFY','Project modified','Executed when a project is modified','project',142);
@@ -172,7 +169,7 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_CREATE','Holiday created','Executed when a holiday is created','holiday',800);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_MODIFY','Holiday modified','Executed when a holiday is modified','holiday',801);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_VALIDATE','Holiday validated','Executed when a holiday is validated','holiday',802);
-insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_APPROVE','Holiday aprouved','Executed when a holiday is aprouved','holiday',803);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_APPROVE','Holiday approved','Executed when a holiday is aprouved','holiday',803);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_CANCEL','Holiday canceled','Executed when a holiday is canceled','holiday',802);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_DELETE','Holiday deleted','Executed when a holiday is deleted','holiday',804);
diff --git a/htdocs/install/mysql/data/llx_c_email_templates.sql b/htdocs/install/mysql/data/llx_c_email_templates.sql
index bce46a70e49..d2886631942 100644
--- a/htdocs/install/mysql/data/llx_c_email_templates.sql
+++ b/htdocs/install/mysql/data/llx_c_email_templates.sql
@@ -21,25 +21,26 @@
--
-- Bank Thirdparty
-INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'banque','thirdparty','',0,null,null,'(YourSEPAMandate)',1,'$conf->societe->enabled && $conf->banque->enabled && $conf->prelevement->enabled',0,'__(YourSEPAMandate)__','__(Hello)__, \n\n__(FindYourSEPAMandate)__ : \n__MYCOMPANY_NAME__ \n__MYCOMPANY_FULLADDRESS__ \n__(Sincerely)__ \n__USER_SIGNATURE__',null, 0);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'banque','thirdparty','',0,null,null,'(YourSEPAMandate)',1,'isModEnabled("societe") && isModEnabled("banque") && isModEnabled("prelevement")',0,'__(YourSEPAMandate)__','__(Hello)__, \n\n__(FindYourSEPAMandate)__ : \n__MYCOMPANY_NAME__ \n__MYCOMPANY_FULLADDRESS__ \n__(Sincerely)__ \n__USER_SIGNATURE__',null, 0);
-- Members
-INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingEmailOnAutoSubscription)' ,10,'$conf->adherent->enabled',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(YourMembershipRequestWasReceived)__','__(Hello)__ __MEMBER_FULLNAME__, \n\n__(ThisIsContentOfYourMembershipRequestWasReceived)__ \n __ONLINE_PAYMENT_TEXT_AND_URL__ \n \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
-INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingEmailOnMemberValidation)' ,20,'$conf->adherent->enabled',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(YourMembershipWasValidated)__', '__(Hello)__ __MEMBER_FULLNAME__, \n\n__(ThisIsContentOfYourMembershipWasValidated)__ __(FirstName)__ : __MEMBER_FIRSTNAME__ __(LastName)__ : __MEMBER_LASTNAME__ __(ID)__ : __MEMBER_ID__ \n __ONLINE_PAYMENT_TEXT_AND_URL__ \n \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
-INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingEmailOnNewSubscription)' ,30,'$conf->adherent->enabled',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(YourSubscriptionWasRecorded)__', '__(Hello)__ __MEMBER_FULLNAME__, \n\n__(ThisIsContentOfYourSubscriptionWasRecorded)__ \n\n \n__(Sincerely)__ __USER_SIGNATURE__',null, 1);
-INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingReminderForExpiredSubscription)',40,'$conf->adherent->enabled',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(SubscriptionReminderEmail)__', '__(Hello)__ __MEMBER_FULLNAME__, \n\n__(ThisIsContentOfSubscriptionReminderEmail)__ \n __ONLINE_PAYMENT_TEXT_AND_URL__ \n \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
-INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingEmailOnCancelation)' ,50,'$conf->adherent->enabled',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(YourMembershipWasCanceled)__', '__(Hello)__ __MEMBER_FULLNAME__, \n\n__(YourMembershipWasCanceled)__ \n \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
-INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingAnEMailToMember)' ,60,'$conf->adherent->enabled',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(CardContent)__', '__(Hello)__, \n\n__(ThisIsContentOfYourCard)__ \n__(ID)__ : __ID__ \n__(Civility)__ : __MEMBER_CIVILITY__ \n__(Firstname)__ : __MEMBER_FIRSTNAME__ \n__(Lastname)__ : __MEMBER_LASTNAME__ \n__(Fullname)__ : __MEMBER_FULLNAME__ \n__(Company)__ : __MEMBER_COMPANY__ \n__(Address)__ : __MEMBER_ADDRESS__ \n__(Zip)__ : __MEMBER_ZIP__ \n__(Town)__ : __MEMBER_TOWN__ \n__(Country)__ : __MEMBER_COUNTRY__ \n__(Email)__ : __MEMBER_EMAIL__ \n__(Birthday)__ : __MEMBER_BIRTH__ \n__(Photo)__ : __MEMBER_PHOTO__ \n__(Login)__ : __MEMBER_LOGIN__ \n__(Phone)__ : __MEMBER_PHONE__ \n__(PhonePerso)__ : __MEMBER_PHONEPRO__ \n__(PhoneMobile)__ : __MEMBER_PHONEMOBILE__ \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingEmailOnAutoSubscription)' ,10, 'isModEnabled("adherent")',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(YourMembershipRequestWasReceived)__','__(Hello)__ __MEMBER_FULLNAME__, \n\n__(ThisIsContentOfYourMembershipRequestWasReceived)__ \n __ONLINE_PAYMENT_TEXT_AND_URL__ \n \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingEmailOnMemberValidation)' ,20, 'isModEnabled("adherent")',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(YourMembershipWasValidated)__', '__(Hello)__ __MEMBER_FULLNAME__, \n\n__(ThisIsContentOfYourMembershipWasValidated)__ __(FirstName)__ : __MEMBER_FIRSTNAME__ __(LastName)__ : __MEMBER_LASTNAME__ __(ID)__ : __MEMBER_ID__ \n __ONLINE_PAYMENT_TEXT_AND_URL__ \n \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingEmailOnNewSubscription)' ,30, 'isModEnabled("adherent")',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(YourSubscriptionWasRecorded)__', '__(Hello)__ __MEMBER_FULLNAME__, \n\n__(ThisIsContentOfYourSubscriptionWasRecorded)__ \n\n \n__(Sincerely)__ __USER_SIGNATURE__',null, 1);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingReminderForExpiredSubscription)',40, 'isModEnabled("adherent")',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(SubscriptionReminderEmail)__', '__(Hello)__ __MEMBER_FULLNAME__, \n\n__(ThisIsContentOfSubscriptionReminderEmail)__ \n __ONLINE_PAYMENT_TEXT_AND_URL__ \n \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingEmailOnCancelation)' ,50, 'isModEnabled("adherent")',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(YourMembershipWasCanceled)__', '__(Hello)__ __MEMBER_FULLNAME__, \n\n__(YourMembershipWasCanceled)__ \n \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingAnEMailToMember)' ,60, 'isModEnabled("adherent")',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(CardContent)__', '__(Hello)__, \n\n__(ThisIsContentOfYourCard)__ \n__(ID)__ : __ID__ \n__(Civility)__ : __MEMBER_CIVILITY__ \n__(Firstname)__ : __MEMBER_FIRSTNAME__ \n__(Lastname)__ : __MEMBER_LASTNAME__ \n__(Fullname)__ : __MEMBER_FULLNAME__ \n__(Company)__ : __MEMBER_COMPANY__ \n__(Address)__ : __MEMBER_ADDRESS__ \n__(Zip)__ : __MEMBER_ZIP__ \n__(Town)__ : __MEMBER_TOWN__ \n__(Country)__ : __MEMBER_COUNTRY__ \n__(Email)__ : __MEMBER_EMAIL__ \n__(Birthday)__ : __MEMBER_BIRTH__ \n__(Photo)__ : __MEMBER_PHOTO__ \n__(Login)__ : __MEMBER_LOGIN__ \n__(Phone)__ : __MEMBER_PHONE__ \n__(PhonePerso)__ : __MEMBER_PHONEPRO__ \n__(PhoneMobile)__ : __MEMBER_PHONEMOBILE__ \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
-- Recruiting
-INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'recruitment','recruitmentcandidature_send','',0,null,null,'(AnswerCandidature)' ,100,'$conf->recruitment->enabled',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(YourCandidature)__', '__(Hello)__ __CANDIDATE_FULLNAME__, \n\n__(YourCandidatureAnswerMessage)__ __ONLINE_INTERVIEW_SCHEDULER_TEXT_AND_URL__\n \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'recruitment','recruitmentcandidature_send','',0,null,null,'(AnswerCandidature)' ,100,'isModEnabled("recruitment")',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(YourCandidature)__', '__(Hello)__ __CANDIDATE_FULLNAME__, \n\n__(YourCandidatureAnswerMessage)__ __ONLINE_INTERVIEW_SCHEDULER_TEXT_AND_URL__\n \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
-- Event organization
INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationEmailAskConf)', 10, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailAskConf)__', '__(Hello)__, __(OrganizationEventConfRequestWasReceived)__ __(Sincerely)__ __USER_SIGNATURE__', null, '1', null);
INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationEmailAskBooth)', 20, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailAskBooth)__', '__(Hello)__, __(OrganizationEventBoothRequestWasReceived)__ __(Sincerely)__ __USER_SIGNATURE__', null, '1', null);
-- TODO Add message for registration only to event __ONLINE_PAYMENT_TEXT_AND_URL__
-INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationEmailSubsBooth)', 30, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailBoothPayment)__', '__(Hello)__, __(OrganizationEventPaymentOfBoothWasReceived)__ __(Sincerely)__ __USER_SIGNATURE__', null, '1', null);
-INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationEmailSubsEvent)', 40, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailRegistrationPayment)__', '__(Hello)__, __(OrganizationEventPaymentOfRegistrationWasReceived)__ __(Sincerely)__ __USER_SIGNATURE__', null, '1', null);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationEmailBoothPayment)', 30, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailBoothPayment)__', '__(Hello)__, __(OrganizationEventPaymentOfBoothWasReceived)__ __(Sincerely)__ __USER_SIGNATURE__', null, '1', null);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationEmailRegistrationPayment)', 40, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailRegistrationPayment)__', '__(Hello)__, __(OrganizationEventPaymentOfRegistrationWasReceived)__ __(Sincerely)__ __USER_SIGNATURE__', null, '1', null);
+--
INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationMassEmailAttendees)', 50, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationMassEmailAttendees)__', '__(Hello)__, __(OrganizationEventBulkMailToAttendees)__ __(Sincerely)__ __USER_SIGNATURE__', null, '1', null);
INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationMassEmailSpeakers)', 60, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationMassEmailSpeakers)__', '__(Hello)__, __(OrganizationEventBulkMailToSpeakers)__ __(Sincerely)__ __USER_SIGNATURE__', null, '1', null);
diff --git a/htdocs/install/mysql/data/llx_c_paiement.sql b/htdocs/install/mysql/data/llx_c_paiement.sql
index a266070da2b..2e0bd71f389 100644
--- a/htdocs/install/mysql/data/llx_c_paiement.sql
+++ b/htdocs/install/mysql/data/llx_c_paiement.sql
@@ -45,7 +45,7 @@ insert into llx_c_paiement (id,code,libelle,type,active) values (53, 'FAC', 'Fac
-- Payment services
INSERT INTO llx_c_paiement (id,code,libelle,type,active) values (100, 'KLA', 'Klarna', 1, 0);
INSERT INTO llx_c_paiement (id,code,libelle,type,active) values (101, 'SOF', 'Sofort', 1, 0);
-INSERT INTO llx_c_paiement (id,code,libelle,type,active) values (102, 'BAN', 'Bancontact', 1, 0);
+INSERT INTO llx_c_paiement (id,code,libelle,type,active) values (102, 'BANCON', 'Bancontact', 1, 0);
INSERT INTO llx_c_paiement (id,code,libelle,type,active) values (103, 'IDE', 'iDeal', 1, 0);
INSERT INTO llx_c_paiement (id,code,libelle,type,active) values (104, 'GIR', 'Giropay', 1, 0);
INSERT INTO llx_c_paiement (id,code,libelle,type,active) values (105, 'PPL', 'PayPal', 1, 0);
diff --git a/htdocs/install/mysql/data/llx_c_tva.sql b/htdocs/install/mysql/data/llx_c_tva.sql
index d78fea4ad4d..6c96cb46605 100644
--- a/htdocs/install/mysql/data/llx_c_tva.sql
+++ b/htdocs/install/mysql/data/llx_c_tva.sql
@@ -137,7 +137,6 @@ insert into llx_c_tva(rowid,fk_pays,taux,code,recuperableonly,localtax1,localtax
-- GERMANY (id country=5)
insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values ( 51, 5, '0','0','No VAT', 1);
insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values ( 52, 5, '7.0','0','ermäßigte USt.', 1);
-insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values ( 53, 5, '0.0','0','keine USt.', 1);
insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values ( 54, 5, '5.5','0','USt. Forst', 0);
insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values ( 55, 5, '10.7','0','USt. Landwirtschaft', 0);
insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values ( 56, 5, '19.0','0','allgemeine Ust.',1);
diff --git a/htdocs/install/mysql/data/llx_const.sql b/htdocs/install/mysql/data/llx_const.sql
index 61c7336f48b..06463207069 100644
--- a/htdocs/install/mysql/data/llx_const.sql
+++ b/htdocs/install/mysql/data/llx_const.sql
@@ -35,7 +35,7 @@
insert into llx_const (name, value, type, note, visible, entity) values ('MAIN_NOT_INSTALLED','1','chaine','Setup is running',1,0);
insert into llx_const (name, value, type, note, visible, entity) values ('MAIN_FEATURES_LEVEL','0','chaine','Level of features to show: -1=stable+deprecated, 0=stable only (default), 1=stable+experimental, 2=stable+experimental+development',1,0);
insert into llx_const (name, value, type, note, visible, entity) values ('MAILING_LIMIT_SENDBYWEB','25','chaine','Number of targets to defined packet size when sending mass email',1,0);
-insert into llx_const (name, value, type, note, visible, entity) values ('MAIN_ENABLE_LOG_TO_HTML','0','chaine','If this option is set to 1, it is possible to see log output at end of HTML sources by adding paramater logtohtml=1 on URL. Module log must also be enabled.',1,0);
+--insert into llx_const (name, value, type, note, visible, entity) values ('MAIN_ENABLE_LOG_TO_HTML','0','chaine','If this option is set to 1, it is possible to see log output at end of HTML sources by adding paramater logtohtml=1 on URL. Module log must also be enabled.',1,0);
-- Hidden and common to all entities
insert into llx_const (name, value, type, note, visible, entity) values ('SYSLOG_HANDLERS','["mod_syslog_file"]','chaine','Which logger to use',0,0);
diff --git a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql
index f7e7a7a1ba5..d5deec862d0 100644
--- a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql
+++ b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql
@@ -365,7 +365,52 @@ ALTER TABLE llx_bank_account ADD COLUMN pti_in_ctti smallint DEFAULT 0 AFTER dom
-- Set default ticket type to OTHER if no default exists
UPDATE llx_c_ticket_type SET use_default=1 WHERE code='OTHER' AND NOT EXISTS(SELECT * FROM (SELECT * FROM llx_c_ticket_type) AS t WHERE use_default=1);
+
-- Assets - New module
+
+CREATE TABLE llx_asset(
+ rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
+ ref varchar(128) NOT NULL,
+ entity integer DEFAULT 1 NOT NULL,
+ label varchar(255),
+
+ fk_asset_model integer,
+
+ reversal_amount_ht double(24,8),
+ acquisition_value_ht double(24,8) DEFAULT NULL,
+ recovered_vat double(24,8),
+
+ reversal_date date,
+
+ date_acquisition date NOT NULL,
+ date_start date NOT NULL,
+
+ qty real DEFAULT 1 NOT NULL,
+
+ acquisition_type smallint DEFAULT 0 NOT NULL,
+ asset_type smallint DEFAULT 0 NOT NULL,
+
+ not_depreciated integer DEFAULT 0,
+
+ disposal_date date,
+ disposal_amount_ht double(24,8),
+ fk_disposal_type integer,
+ disposal_depreciated integer DEFAULT 0,
+ disposal_subject_to_vat integer DEFAULT 0,
+
+ note_public text,
+ note_private text,
+
+ date_creation datetime NOT NULL,
+ tms timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ fk_user_creat integer NOT NULL,
+ fk_user_modif integer,
+ last_main_doc varchar(255),
+ import_key varchar(14),
+ model_pdf varchar(255),
+ status integer NOT NULL
+) ENGINE=innodb;
+
ALTER TABLE llx_asset DROP FOREIGN KEY fk_asset_asset_type;
ALTER TABLE llx_asset DROP INDEX idx_asset_fk_asset_type;
@@ -653,6 +698,9 @@ ALTER TABLE llx_eventorganization_conferenceorboothattendee ADD COLUMN firstnam
ALTER TABLE llx_eventorganization_conferenceorboothattendee ADD COLUMN lastname varchar(100);
ALTER TABLE llx_eventorganization_conferenceorboothattendee ADD COLUMN email_company varchar(128) after email;
+-- VMYSQL4.3 ALTER TABLE llx_eventorganization_conferenceorboothattendee MODIFY COLUMN fk_user_creat integer NULL;
+-- VPGSQL8.2 ALTER TABLE llx_eventorganization_conferenceorboothattendee ALTER COLUMN fk_user_creat DROP NOT NULL;
+
ALTER TABLE llx_c_email_templates ADD COLUMN joinfiles text;
ALTER TABLE llx_c_email_templates ADD COLUMN email_from varchar(255);
@@ -692,3 +740,34 @@ ALTER TABLE llx_loan_schedule ADD UNIQUE INDEX uk_loan_schedule_ref (fk_loan, da
-- We need when upgrade 15 to 16 with Dolibarr v17+ for upgrade2 function migrate_user_photospath2()
ALTER TABLE llx_user CHANGE COLUMN note note_private text;
+
+
+-- Bank Thirdparty
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'banque','thirdparty','',0,null,null,'(YourSEPAMandate)',1,'isModEnabled("societe") && isModEnabled("banque") && isModEnabled("prelevement")',0,'__(YourSEPAMandate)__','__(Hello)__, \n\n__(FindYourSEPAMandate)__ : \n__MYCOMPANY_NAME__ \n__MYCOMPANY_FULLADDRESS__ \n__(Sincerely)__ \n__USER_SIGNATURE__',null, 0);
+
+-- Members
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingEmailOnAutoSubscription)' ,10, 'isModEnabled("adherent")',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(YourMembershipRequestWasReceived)__','__(Hello)__ __MEMBER_FULLNAME__, \n\n__(ThisIsContentOfYourMembershipRequestWasReceived)__ \n __ONLINE_PAYMENT_TEXT_AND_URL__ \n \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingEmailOnMemberValidation)' ,20, 'isModEnabled("adherent")',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(YourMembershipWasValidated)__', '__(Hello)__ __MEMBER_FULLNAME__, \n\n__(ThisIsContentOfYourMembershipWasValidated)__ __(FirstName)__ : __MEMBER_FIRSTNAME__ __(LastName)__ : __MEMBER_LASTNAME__ __(ID)__ : __MEMBER_ID__ \n __ONLINE_PAYMENT_TEXT_AND_URL__ \n \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingEmailOnNewSubscription)' ,30, 'isModEnabled("adherent")',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(YourSubscriptionWasRecorded)__', '__(Hello)__ __MEMBER_FULLNAME__, \n\n__(ThisIsContentOfYourSubscriptionWasRecorded)__ \n\n \n__(Sincerely)__ __USER_SIGNATURE__',null, 1);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingReminderForExpiredSubscription)',40, 'isModEnabled("adherent")',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(SubscriptionReminderEmail)__', '__(Hello)__ __MEMBER_FULLNAME__, \n\n__(ThisIsContentOfSubscriptionReminderEmail)__ \n __ONLINE_PAYMENT_TEXT_AND_URL__ \n \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingEmailOnCancelation)' ,50, 'isModEnabled("adherent")',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(YourMembershipWasCanceled)__', '__(Hello)__ __MEMBER_FULLNAME__, \n\n__(YourMembershipWasCanceled)__ \n \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'adherent','member','',0,null,null,'(SendingAnEMailToMember)' ,60, 'isModEnabled("adherent")',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(CardContent)__', '__(Hello)__, \n\n__(ThisIsContentOfYourCard)__ \n__(ID)__ : __ID__ \n__(Civility)__ : __MEMBER_CIVILITY__ \n__(Firstname)__ : __MEMBER_FIRSTNAME__ \n__(Lastname)__ : __MEMBER_LASTNAME__ \n__(Fullname)__ : __MEMBER_FULLNAME__ \n__(Company)__ : __MEMBER_COMPANY__ \n__(Address)__ : __MEMBER_ADDRESS__ \n__(Zip)__ : __MEMBER_ZIP__ \n__(Town)__ : __MEMBER_TOWN__ \n__(Country)__ : __MEMBER_COUNTRY__ \n__(Email)__ : __MEMBER_EMAIL__ \n__(Birthday)__ : __MEMBER_BIRTH__ \n__(Photo)__ : __MEMBER_PHOTO__ \n__(Login)__ : __MEMBER_LOGIN__ \n__(Phone)__ : __MEMBER_PHONE__ \n__(PhonePerso)__ : __MEMBER_PHONEPRO__ \n__(PhoneMobile)__ : __MEMBER_PHONEMOBILE__ \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
+
+-- Recruiting
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0, 'recruitment','recruitmentcandidature_send','',0,null,null,'(AnswerCandidature)' ,100,'isModEnabled("recruitment")',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(YourCandidature)__', '__(Hello)__ __CANDIDATE_FULLNAME__, \n\n__(YourCandidatureAnswerMessage)__ __ONLINE_INTERVIEW_SCHEDULER_TEXT_AND_URL__\n \n__(Sincerely)__ __USER_SIGNATURE__',null, 0);
+
+-- Event organization
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationEmailAskConf)', 10, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailAskConf)__', '__(Hello)__, __(OrganizationEventConfRequestWasReceived)__ __(Sincerely)__ __USER_SIGNATURE__', null, '1', null);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationEmailAskBooth)', 20, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailAskBooth)__', '__(Hello)__, __(OrganizationEventBoothRequestWasReceived)__ __(Sincerely)__ __USER_SIGNATURE__', null, '1', null);
+-- TODO Add message for registration only to event __ONLINE_PAYMENT_TEXT_AND_URL__
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationEmailBoothPayment)', 30, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailBoothPayment)__', '__(Hello)__, __(OrganizationEventPaymentOfBoothWasReceived)__ __(Sincerely)__ __USER_SIGNATURE__', null, '1', null);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationEmailRegistrationPayment)', 40, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailRegistrationPayment)__', '__(Hello)__, __(OrganizationEventPaymentOfRegistrationWasReceived)__ __(Sincerely)__ __USER_SIGNATURE__', null, '1', null);
+--
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationMassEmailAttendees)', 50, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationMassEmailAttendees)__', '__(Hello)__, __(OrganizationEventBulkMailToAttendees)__ __(Sincerely)__ __USER_SIGNATURE__', null, '1', null);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationMassEmailSpeakers)', 60, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationMassEmailSpeakers)__', '__(Hello)__, __(OrganizationEventBulkMailToSpeakers)__ __(Sincerely)__ __USER_SIGNATURE__', null, '1', null);
+
+-- Partnership
+INSERT INTO llx_c_email_templates (entity, module, type_template, label, lang, position, topic, joinfiles, content) VALUES (0, 'partnership', 'partnership_send', '(SendingEmailOnPartnershipWillSoonBeCanceled)', '', 100, '[__[MAIN_INFO_SOCIETE_NOM]__] - __(YourPartnershipWillSoonBeCanceledTopic)__', 0, '\n __(Hello)__, \n__(YourPartnershipWillSoonBeCanceledContent)__
\n \n\n \n\n __(Sincerely)__ \n __[MAIN_INFO_SOCIETE_NOM]__ \n \n');
+INSERT INTO llx_c_email_templates (entity, module, type_template, label, lang, position, topic, joinfiles, content) VALUES (0, 'partnership', 'partnership_send', '(SendingEmailOnPartnershipCanceled)', '', 100, '[__[MAIN_INFO_SOCIETE_NOM]__] - __(YourPartnershipCanceledTopic)__', 0, '\n __(Hello)__, \n__(YourPartnershipCanceledContent)__
\n \n\n \n\n __(Sincerely)__ \n __[MAIN_INFO_SOCIETE_NOM]__ \n \n');
+INSERT INTO llx_c_email_templates (entity, module, type_template, label, lang, position, topic, joinfiles, content) VALUES (0, 'partnership', 'partnership_send', '(SendingEmailOnPartnershipRefused)', '', 100, '[__[MAIN_INFO_SOCIETE_NOM]__] - __(YourPartnershipRefusedTopic)__', 0, '\n __(Hello)__, \n__(YourPartnershipRefusedContent)__
\n \n\n \n\n __(Sincerely)__ \n __[MAIN_INFO_SOCIETE_NOM]__ \n \n');
+INSERT INTO llx_c_email_templates (entity, module, type_template, label, lang, position, topic, joinfiles, content) VALUES (0, 'partnership', 'partnership_send', '(SendingEmailOnPartnershipAccepted)', '', 100, '[__[MAIN_INFO_SOCIETE_NOM]__] - __(YourPartnershipAcceptedTopic)__', 0, '\n __(Hello)__, \n__(YourPartnershipAcceptedContent)__
\n \n\n \n\n __(Sincerely)__ \n __[MAIN_INFO_SOCIETE_NOM]__ \n \n');
diff --git a/htdocs/install/mysql/migration/16.0.0-17.0.0.sql b/htdocs/install/mysql/migration/16.0.0-17.0.0.sql
index 9f76a4229bc..8432bf252c3 100644
--- a/htdocs/install/mysql/migration/16.0.0-17.0.0.sql
+++ b/htdocs/install/mysql/migration/16.0.0-17.0.0.sql
@@ -55,6 +55,12 @@ ALTER TABLE llx_user DROP COLUMN idpers3;
-- v17
+ALTER TABLE llx_mailing_cibles MODIFY COLUMN source_type varchar(32);
+
+ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_percent (percent);
+
+UPDATE llx_c_paiement SET code = 'BANCON' WHERE code = 'BAN' AND libelle = 'Bancontact';
+
-- VMYSQL4.3 ALTER TABLE llx_partnership MODIFY COLUMN fk_user_creat integer NULL;
-- VPGSQL8.2 ALTER TABLE llx_partnership ALTER COLUMN fk_user_creat DROP NOT NULL;
@@ -143,6 +149,9 @@ CREATE TABLE llx_bank_extrafields
ALTER TABLE llx_bank_extrafields ADD INDEX idx_bank_extrafields (fk_object);
+ALTER TABLE llx_product_lot ADD COLUMN note_public text DEFAULT NULL after batch;
+ALTER TABLE llx_product_lot ADD COLUMN note_private text DEFAULT NULL after note_public;
+
ALTER TABLE llx_user CHANGE COLUMN note note_private text;
UPDATE llx_c_effectif SET code='EF101-500', libelle='101 - 500' WHERE code='EF100-500';
@@ -184,3 +193,188 @@ ALTER TABLE llx_socpeople ADD INDEX idx_socpeople_lastname (lastname);
ALTER TABLE llx_societe ADD INDEX idx_societe_nom(nom);
ALTER TABLE llx_extrafields MODIFY COLUMN fielddefault text;
+
+ALTER TABLE llx_bank_url ADD INDEX idx_bank_url_url_id (url_id);
+
+ALTER TABLE llx_societe_remise_except ADD COLUMN multicurrency_code varchar(3) NULL;
+ALTER TABLE llx_societe_remise_except ADD COLUMN multicurrency_tx double(24,8) NULL;
+
+-- VMYSQL4.3 ALTER TABLE llx_hrm_evaluationdet CHANGE COLUMN `rank` rankorder integer;
+-- VPGSQL8.2 ALTER TABLE llx_hrm_evaluationdet CHANGE COLUMN rank rankorder integer;
+
+
+-- Rename const to hide public and private notes (fix allow notes const was used to hide)
+UPDATE llx_const SET name = 'MAIN_LIST_HIDE_PUBLIC_NOTES' WHERE name = 'MAIN_LIST_ALLOW_PUBLIC_NOTES';
+UPDATE llx_const SET name = 'MAIN_LIST_HIDE_PRIVATE_NOTES' WHERE name = 'MAIN_LIST_ALLOW_PRIVATE_NOTES';
+
+
+ALTER TABLE llx_projet ADD COLUMN date_start_event datetime;
+ALTER TABLE llx_projet ADD COLUMN date_end_event datetime;
+ALTER TABLE llx_projet ADD COLUMN location varchar(255);
+
+
+ALTER TABLE llx_c_action_trigger MODIFY COLUMN code varchar(128);
+
+ALTER TABLE llx_overwrite_trans DROP INDEX uk_overwrite_trans;
+ALTER TABLE llx_overwrite_trans ADD UNIQUE INDEX uk_overwrite_trans(entity, lang, transkey);
+
+--
+-- List of all managed triggered events (used for trigger agenda automatic events and for notification)
+--
+
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('COMPANY_CREATE','Third party created','Executed when a third party is created','societe',1);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('COMPANY_MODIFY','Third party update','Executed when you update third party','societe',1);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('COMPANY_SENTBYMAIL','Mails sent from third party card','Executed when you send email from third party card','societe',1);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('COMPANY_DELETE','Third party deleted','Executed when you delete third party','societe',1);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_VALIDATE','Customer proposal validated','Executed when a commercial proposal is validated','propal',2);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_MODIFY','Customer proposal modified','Executed when a customer proposal is modified','propal',2);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_SENTBYMAIL','Commercial proposal sent by mail','Executed when a commercial proposal is sent by mail','propal',3);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLOSE_SIGNED','Customer proposal closed signed','Executed when a customer proposal is closed signed','propal',2);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLOSE_REFUSED','Customer proposal closed refused','Executed when a customer proposal is closed refused','propal',2);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLASSIFY_BILLED','Customer proposal set billed','Executed when a customer proposal is set to billed','propal',2);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_DELETE','Customer proposal deleted','Executed when a customer proposal is deleted','propal',2);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_VALIDATE','Customer order validate','Executed when a customer order is validated','commande',4);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_CLOSE','Customer order classify delivered','Executed when a customer order is set delivered','commande',5);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_MODIFY','Customer order modified','Executed when a customer order is set modified','commande',5);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_CLASSIFY_BILLED','Customer order classify billed','Executed when a customer order is set to billed','commande',5);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_CANCEL','Customer order canceled','Executed when a customer order is canceled','commande',5);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SENTBYMAIL','Customer order sent by mail','Executed when a customer order is sent by mail ','commande',5);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_DELETE','Customer order deleted','Executed when a customer order is deleted','commande',5);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_VALIDATE','Customer invoice validated','Executed when a customer invoice is approved','facture',6);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_MODIFY','Customer invoice modified','Executed when a customer invoice is modified','facture',7);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_PAYED','Customer invoice payed','Executed when a customer invoice is payed','facture',7);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_CANCEL','Customer invoice canceled','Executed when a customer invoice is conceled','facture',8);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_SENTBYMAIL','Customer invoice sent by mail','Executed when a customer invoice is sent by mail','facture',9);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_UNVALIDATE','Customer invoice unvalidated','Executed when a customer invoice status set back to draft','facture',9);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_DELETE','Customer invoice deleted','Executed when a customer invoice is deleted','facture',9);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPOSAL_SUPPLIER_VALIDATE','Price request validated','Executed when a commercial proposal is validated','proposal_supplier',10);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPOSAL_SUPPLIER_MODIFY','Price request modified','Executed when a commercial proposal is modified','proposal_supplier',10);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPOSAL_SUPPLIER_SENTBYMAIL','Price request sent by mail','Executed when a commercial proposal is sent by mail','proposal_supplier',10);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPOSAL_SUPPLIER_CLOSE_SIGNED','Price request closed signed','Executed when a customer proposal is closed signed','proposal_supplier',10);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPOSAL_SUPPLIER_CLOSE_REFUSED','Price request closed refused','Executed when a customer proposal is closed refused','proposal_supplier',10);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPOSAL_SUPPLIER_DELETE','Price request deleted','Executed when a customer proposal delete','proposal_supplier',10);
+--insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_CREATE','Supplier order created','Executed when a supplier order is created','order_supplier',11);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_VALIDATE','Supplier order validated','Executed when a supplier order is validated','order_supplier',12);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_APPROVE','Supplier order request approved','Executed when a supplier order is approved','order_supplier',13);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_MODIFY','Supplier order request modified','Executed when a supplier order is modified','order_supplier',13);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_SUBMIT','Supplier order request submited','Executed when a supplier order is approved','order_supplier',13);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_RECEIVE','Supplier order request received','Executed when a supplier order is received','order_supplier',13);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_REFUSE','Supplier order request refused','Executed when a supplier order is refused','order_supplier',13);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_CANCEL','Supplier order request canceled','Executed when a supplier order is canceled','order_supplier',13);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_SENTBYMAIL','Supplier order sent by mail','Executed when a supplier order is sent by mail','order_supplier',14);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_CLASSIFY_BILLED','Supplier order set billed','Executed when a supplier order is set as billed','order_supplier',14);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_DELETE','Supplier order deleted','Executed when a supplier order is deleted','order_supplier',14);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_SUPPLIER_VALIDATE','Supplier invoice validated','Executed when a supplier invoice is validated','invoice_supplier',15);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_SUPPLIER_MODIFY','Supplier invoice modified','Executed when a supplier invoice is modified','invoice_supplier',15);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_SUPPLIER_UNVALIDATE','Supplier invoice unvalidated','Executed when a supplier invoice status is set back to draft','invoice_supplier',15);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_SUPPLIER_PAYED','Supplier invoice payed','Executed when a supplier invoice is payed','invoice_supplier',16);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_SUPPLIER_SENTBYMAIL','Supplier invoice sent by mail','Executed when a supplier invoice is sent by mail','invoice_supplier',17);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_SUPPLIER_CANCELED','Supplier invoice cancelled','Executed when a supplier invoice is cancelled','invoice_supplier',17);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_SUPPLIER_DELETE','Supplier invoice deleted','Executed when a supplier invoice is deleted','invoice_supplier',17);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('CONTRACT_VALIDATE','Contract validated','Executed when a contract is validated','contrat',18);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('CONTRACT_MODIFY','Contract modified','Executed when a contract is modified','contrat',18);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('CONTRACT_SENTBYMAIL','Contract sent by mail','Executed when a contract is sent by mail','contrat',18);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('CONTRACT_DELETE','Contract deleted','Executed when a contract is deleted','contrat',18);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('SHIPPING_VALIDATE','Shipping validated','Executed when a shipping is validated','shipping',20);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('SHIPPING_MODIFY','Shipping modified','Executed when a shipping is modified','shipping',20);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('SHIPPING_SENTBYMAIL','Shipping sent by mail','Executed when a shipping is sent by mail','shipping',21);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('SHIPPING_DELETE','Shipping sent is deleted','Executed when a shipping is deleted','shipping',21);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECEPTION_VALIDATE','Reception validated','Executed when a reception is validated','reception',22);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECEPTION_SENTBYMAIL','Reception sent by mail','Executed when a reception is sent by mail','reception',22);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MEMBER_VALIDATE','Member validated','Executed when a member is validated','member',22);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MEMBER_MODIFY','Member modified','Executed when a member is modified','member',23);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MEMBER_SENTBYMAIL','Mails sent from member card','Executed when you send email from member card','member',23);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MEMBER_SUBSCRIPTION_CREATE','Member subscribtion recorded','Executed when a member subscribtion is deleted','member',24);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MEMBER_SUBSCRIPTION_MODIFY','Member subscribtion modified','Executed when a member subscribtion is modified','member',24);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MEMBER_SUBSCRIPTION_DELETE','Member subscribtion deleted','Executed when a member subscribtion is deleted','member',24);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MEMBER_RESILIATE','Member resiliated','Executed when a member is resiliated','member',25);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MEMBER_DELETE','Member deleted','Executed when a member is deleted','member',26);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MEMBER_EXCLUDE','Member excluded','Executed when a member is excluded','member',27);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_VALIDATE','Intervention validated','Executed when a intervention is validated','ficheinter',30);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_MODIFY','Intervention modify','Executed when a intervention is modify','ficheinter',30);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_CLASSIFY_BILLED','Intervention set billed','Executed when a intervention is set to billed (when option FICHINTER_CLASSIFY_BILLED is set)','ficheinter',32);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_CLASSIFY_UNBILLED','Intervention set unbilled','Executed when a intervention is set to unbilled (when option FICHINTER_CLASSIFY_BILLED is set)','ficheinter',33);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_REOPEN','Intervention opened','Executed when a intervention is re-opened','ficheinter',34);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_SENTBYMAIL','Intervention sent by mail','Executed when a intervention is sent by mail','ficheinter',35);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_DELETE','Intervention is deleted','Executed when a intervention is deleted','ficheinter',35);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PRODUCT_CREATE','Product or service created','Executed when a product or sevice is created','product',40);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PRODUCT_MODIFY','Product or service modified','Executed when a product or sevice is modified','product',41);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PRODUCT_DELETE','Product or service deleted','Executed when a product or sevice is deleted','product',42);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('EXPENSE_REPORT_CREATE','Expense report created','Executed when an expense report is created','expensereport',201);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('EXPENSE_REPORT_VALIDATE','Expense report validated','Executed when an expense report is validated','expensereport',202);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('EXPENSE_REPORT_MODIFY','Expense report modified','Executed when an expense report is modified','expensereport',202);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('EXPENSE_REPORT_APPROVE','Expense report approved','Executed when an expense report is approved','expensereport',203);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('EXPENSE_REPORT_PAID','Expense report billed','Executed when an expense report is set as billed','expensereport',204);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('EXPENSE_REPORT_DELETE','Expense report deleted','Executed when an expense report is deleted','expensereport',205);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_VALIDATE','Expense report validated','Executed when an expense report is validated','expensereport',211);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_MODIFY','Expense report modified','Executed when an expense report is modified','expensereport',212);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_APPROVE','Expense report approved','Executed when an expense report is approved','expensereport',212);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_CREATE','Project creation','Executed when a project is created','project',140);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_VALIDATE','Project validation','Executed when a project is validated','project',141);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_MODIFY','Project modified','Executed when a project is modified','project',142);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_DELETE','Project deleted','Executed when a project is deleted','project',143);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_SENTBYMAIL','Project sent by mail','Executed when a project is sent by email','project',144);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_CREATE','Ticket created','Executed when a ticket is created','ticket',161);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_MODIFY','Ticket modified','Executed when a ticket is modified','ticket',163);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_ASSIGNED','Ticket assigned','Executed when a ticket is modified','ticket',164);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_CLOSE','Ticket closed','Executed when a ticket is closed','ticket',165);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_SENTBYMAIL','Ticket message sent by email','Executed when a message is sent from the ticket record','ticket',166);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_DELETE','Ticket deleted','Executed when a ticket is deleted','ticket',167);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('USER_SENTBYMAIL','Email sent','Executed when an email is sent from user card','user',300);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('USER_CREATE','User created','Executed when a user is created','user',301);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('USER_MODIFY','User update','Executed when a user is updated','user',302);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('USER_DELETE','User update','Executed when a user is deleted','user',303);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('USER_NEW_PASSWORD','User update','Executed when a user is change password','user',304);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('USER_ENABLEDISABLE','User update','Executed when a user is enable or disable','user',305);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_MODIFY','Intervention modified','Executed when a intervention is modified','ficheinter',19);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BOM_VALIDATE','BOM validated','Executed when a BOM is validated','bom',650);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BOM_UNVALIDATE','BOM unvalidated','Executed when a BOM is unvalidated','bom',651);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BOM_CLOSE','BOM disabled','Executed when a BOM is disabled','bom',652);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BOM_REOPEN','BOM reopen','Executed when a BOM is re-open','bom',653);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BOM_DELETE','BOM deleted','Executed when a BOM deleted','bom',654);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MRP_MO_VALIDATE','MO validated','Executed when a MO is validated','mrp',660);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MRP_MO_PRODUCED','MO produced','Executed when a MO is produced','mrp',661);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MRP_MO_DELETE','MO deleted','Executed when a MO is deleted','mrp',662);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MRP_MO_CANCEL','MO canceled','Executed when a MO is canceled','mrp',663);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('CONTACT_CREATE','Contact address created','Executed when a contact is created','contact',50);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('CONTACT_MODIFY','Contact address update','Executed when a contact is updated','contact',51);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('CONTACT_SENTBYMAIL','Mails sent from third party card','Executed when you send email from contact address record','contact',52);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('CONTACT_DELETE','Contact address deleted','Executed when a contact is deleted','contact',53);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECRUITMENTJOBPOSITION_CREATE','Job created','Executed when a job is created','recruitment',7500);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECRUITMENTJOBPOSITION_MODIFY','Job modified','Executed when a job is modified','recruitment',7502);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECRUITMENTJOBPOSITION_SENTBYMAIL','Mails sent from job record','Executed when you send email from job record','recruitment',7504);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECRUITMENTJOBPOSITION_DELETE','Job deleted','Executed when a job is deleted','recruitment',7506);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECRUITMENTCANDIDATURE_CREATE','Candidature created','Executed when a candidature is created','recruitment',7510);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECRUITMENTCANDIDATURE_MODIFY','Candidature modified','Executed when a candidature is modified','recruitment',7512);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECRUITMENTCANDIDATURE_SENTBYMAIL','Mails sent from candidature record','Executed when you send email from candidature record','recruitment',7514);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECRUITMENTCANDIDATURE_DELETE','Candidature deleted','Executed when a candidature is deleted','recruitment',7516);
+
+-- actions not enabled by default : they are excluded when we enable the module Agenda (except TASK_...)
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TASK_CREATE','Task created','Executed when a project task is created','project',150);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TASK_MODIFY','Task modified','Executed when a project task is modified','project',151);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TASK_DELETE','Task deleted','Executed when a project task is deleted','project',152);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ACTION_CREATE','Action added','Executed when an action is added to the agenda','agenda',700);
+
+-- holiday
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_CREATE','Holiday created','Executed when a holiday is created','holiday',800);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_MODIFY','Holiday modified','Executed when a holiday is modified','holiday',801);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_VALIDATE','Holiday validated','Executed when a holiday is validated','holiday',802);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_APPROVE','Holiday aprouved','Executed when a holiday is aprouved','holiday',803);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_CANCEL','Holiday canceled','Executed when a holiday is canceled','holiday',802);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_DELETE','Holiday deleted','Executed when a holiday is deleted','holiday',804);
+
+-- facture rec
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILLREC_CREATE','Template invoices created','Executed when a Template invoices is created','facturerec',900);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILLREC_MODIFY','Template invoices update','Executed when a Template invoices is updated','facturerec',901);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILLREC_DELETE','Template invoices deleted','Executed when a Template invoices is deleted','facturerec',902);
+insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILLREC_AUTOCREATEBILL','Template invoices use to create invoices with auto batch','Executed when a Template invoices is use to create invoice with auto batch','facturerec',903);
+
+
+ALTER TABLE llx_prelevement_facture RENAME TO llx_prelevement;
+ALTER TABLE llx_prelevement_facture_demande RENAME TO llx_prelevement_demande;
+
+ALTER TABLE llx_prelevement ADD COLUMN fk_salary INTEGER NULL AFTER fk_facture_fourn;
+ALTER TABLE llx_prelevement_demande ADD COLUMN fk_salary INTEGER NULL AFTER fk_facture_fourn;
+
+
+ALTER TABLE llx_user ADD COLUMN birth_place varchar(64);
diff --git a/htdocs/install/mysql/tables/llx_actioncomm.key.sql b/htdocs/install/mysql/tables/llx_actioncomm.key.sql
index ee16386c7c4..944471620ae 100644
--- a/htdocs/install/mysql/tables/llx_actioncomm.key.sql
+++ b/htdocs/install/mysql/tables/llx_actioncomm.key.sql
@@ -27,5 +27,6 @@ ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_datep (datep);
ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_datep2 (datep2);
ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_recurid (recurid);
ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_ref_ext (ref_ext);
+ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_percent (percent);
ALTER TABLE llx_actioncomm ADD UNIQUE INDEX uk_actioncomm_ref (ref, entity);
diff --git a/htdocs/install/mysql/tables/llx_bank_url.key.sql b/htdocs/install/mysql/tables/llx_bank_url.key.sql
index ff8fc50b768..97e6cd2997f 100644
--- a/htdocs/install/mysql/tables/llx_bank_url.key.sql
+++ b/htdocs/install/mysql/tables/llx_bank_url.key.sql
@@ -18,3 +18,6 @@
ALTER TABLE llx_bank_url ADD UNIQUE INDEX uk_bank_url (fk_bank, url_id, type);
+
+ALTER TABLE llx_bank_url ADD INDEX idx_bank_url_url_id (url_id);
+
diff --git a/htdocs/install/mysql/tables/llx_bookcal_availabilities-bookcal.key.sql b/htdocs/install/mysql/tables/llx_bookcal_availabilities-bookcal.key.sql
new file mode 100644
index 00000000000..3850933f5df
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_bookcal_availabilities-bookcal.key.sql
@@ -0,0 +1,28 @@
+-- Copyright (C) 2022 Alice Adminson
+--
+-- 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 https://www.gnu.org/licenses/.
+
+
+-- BEGIN MODULEBUILDER INDEXES
+ALTER TABLE llx_bookcal_availabilities ADD INDEX idx_bookcal_availabilities_rowid (rowid);
+ALTER TABLE llx_bookcal_availabilities ADD INDEX idx_bookcal_availabilities_ref (ref);
+ALTER TABLE llx_bookcal_availabilities ADD CONSTRAINT llx_bookcal_availabilities_fk_user_creat FOREIGN KEY (fk_user_creat) REFERENCES llx_user(rowid);
+ALTER TABLE llx_bookcal_availabilities ADD INDEX idx_bookcal_availabilities_status (status);
+ALTER TABLE llx_bookcal_availabilities ADD INDEX idx_bookcal_availabilities_type (type);
+-- END MODULEBUILDER INDEXES
+
+--ALTER TABLE llx_bookcal_availabilities ADD UNIQUE INDEX uk_bookcal_availabilities_fieldxy(fieldx, fieldy);
+
+--ALTER TABLE llx_bookcal_availabilities ADD CONSTRAINT llx_bookcal_availabilities_fk_field FOREIGN KEY (fk_field) REFERENCES llx_bookcal_myotherobject(rowid);
+
diff --git a/htdocs/install/mysql/tables/llx_bookcal_availabilities-bookcal.sql b/htdocs/install/mysql/tables/llx_bookcal_availabilities-bookcal.sql
new file mode 100644
index 00000000000..8c8625e10cb
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_bookcal_availabilities-bookcal.sql
@@ -0,0 +1,44 @@
+-- Copyright (C) 2022 Alice Adminson
+--
+-- 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 https://www.gnu.org/licenses/.
+
+
+CREATE TABLE llx_bookcal_availabilities(
+ -- BEGIN MODULEBUILDER FIELDS
+ rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
+ ref varchar(128) NOT NULL,
+ label varchar(255),
+ description text,
+ note_public text,
+ note_private text,
+ date_creation datetime NOT NULL,
+ tms timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ fk_user_creat integer NOT NULL,
+ fk_user_modif integer,
+ last_main_doc varchar(255),
+ import_key varchar(14),
+ model_pdf varchar(255),
+ status integer NOT NULL,
+ start date NOT NULL,
+ end date NOT NULL,
+ type integer NOT NULL,
+ duration integer DEFAULT 30 NOT NULL,
+ startHour integer NOT NULL,
+ endHour integer NOT NULL
+ -- END MODULEBUILDER FIELDS
+) ENGINE=innodb;
+
+
+SELECT * FROM llx_bookcal_availabilities
+WHERE rowid = 1;
diff --git a/htdocs/install/mysql/tables/llx_bookcal_booking-bookcal.key.sql b/htdocs/install/mysql/tables/llx_bookcal_booking-bookcal.key.sql
new file mode 100644
index 00000000000..548307e4356
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_bookcal_booking-bookcal.key.sql
@@ -0,0 +1,29 @@
+-- Copyright (C) 2022 Alice Adminson
+--
+-- 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 https://www.gnu.org/licenses/.
+
+
+-- BEGIN MODULEBUILDER INDEXES
+ALTER TABLE llx_bookcal_booking ADD INDEX idx_bookcal_booking_rowid (rowid);
+ALTER TABLE llx_bookcal_booking ADD INDEX idx_bookcal_booking_ref (ref);
+ALTER TABLE llx_bookcal_booking ADD INDEX idx_bookcal_booking_fk_soc (fk_soc);
+ALTER TABLE llx_bookcal_booking ADD INDEX idx_bookcal_booking_fk_project (fk_project);
+ALTER TABLE llx_bookcal_booking ADD CONSTRAINT llx_bookcal_booking_fk_user_creat FOREIGN KEY (fk_user_creat) REFERENCES llx_user(rowid);
+ALTER TABLE llx_bookcal_booking ADD INDEX idx_bookcal_booking_status (status);
+-- END MODULEBUILDER INDEXES
+
+--ALTER TABLE llx_bookcal_booking ADD UNIQUE INDEX uk_bookcal_booking_fieldxy(fieldx, fieldy);
+
+--ALTER TABLE llx_bookcal_booking ADD CONSTRAINT llx_bookcal_booking_fk_field FOREIGN KEY (fk_field) REFERENCES llx_bookcal_myotherobject(rowid);
+
diff --git a/htdocs/install/mysql/tables/llx_bookcal_booking-bookcal.sql b/htdocs/install/mysql/tables/llx_bookcal_booking-bookcal.sql
new file mode 100644
index 00000000000..df3f6384d23
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_bookcal_booking-bookcal.sql
@@ -0,0 +1,40 @@
+-- Copyright (C) 2022 Alice Adminson
+--
+-- 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 https://www.gnu.org/licenses/.
+
+
+CREATE TABLE llx_bookcal_booking(
+ -- BEGIN MODULEBUILDER FIELDS
+ rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
+ ref varchar(128) NOT NULL,
+ fk_soc integer,
+ fk_project integer,
+ description text,
+ note_public text,
+ note_private text,
+ date_creation datetime NOT NULL,
+ tms timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ fk_user_creat integer NOT NULL,
+ fk_user_modif integer,
+ last_main_doc varchar(255),
+ import_key varchar(14),
+ model_pdf varchar(255),
+ status integer NOT NULL,
+ firstname varchar(128) NOT NULL,
+ lastname varchar(128) NOT NULL,
+ email varchar(128) NOT NULL,
+ start datetime NOT NULL,
+ duration integer NOT NULL
+ -- END MODULEBUILDER FIELDS
+) ENGINE=innodb;
diff --git a/htdocs/install/mysql/tables/llx_c_action_trigger.sql b/htdocs/install/mysql/tables/llx_c_action_trigger.sql
index 8f7450d0fe9..be1c8580541 100644
--- a/htdocs/install/mysql/tables/llx_c_action_trigger.sql
+++ b/htdocs/install/mysql/tables/llx_c_action_trigger.sql
@@ -23,7 +23,7 @@ create table llx_c_action_trigger
(
rowid integer AUTO_INCREMENT PRIMARY KEY,
elementtype varchar(64) NOT NULL,
- code varchar(64) NOT NULL,
+ code varchar(128) NOT NULL,
label varchar(128) NOT NULL,
description varchar(255),
rang integer DEFAULT 0
diff --git a/htdocs/install/mysql/tables/llx_emailcollector_emailcollector.sql b/htdocs/install/mysql/tables/llx_emailcollector_emailcollector.sql
index f13fff71a6f..4119e7aac08 100644
--- a/htdocs/install/mysql/tables/llx_emailcollector_emailcollector.sql
+++ b/htdocs/install/mysql/tables/llx_emailcollector_emailcollector.sql
@@ -28,7 +28,7 @@ CREATE TABLE llx_emailcollector_emailcollector(
acces_type integer DEFAULT 0,
oauth_service varchar(128),
password varchar(128),
- source_directory varchar(255) NOT NULL,
+ source_directory varchar(255) DEFAULT 'Inbox' NOT NULL,
target_directory varchar(255),
maxemailpercollect integer DEFAULT 100,
datelastresult datetime,
diff --git a/htdocs/install/mysql/tables/llx_establishment.sql b/htdocs/install/mysql/tables/llx_establishment.sql
index 1b0d2668cb0..a3542f6d9d6 100644
--- a/htdocs/install/mysql/tables/llx_establishment.sql
+++ b/htdocs/install/mysql/tables/llx_establishment.sql
@@ -22,8 +22,8 @@
CREATE TABLE llx_establishment (
rowid integer NOT NULL auto_increment PRIMARY KEY,
entity integer NOT NULL DEFAULT 1,
- label varchar(255) NOT NULL,
ref varchar(30),
+ label varchar(255) NOT NULL,
name varchar(128),
address varchar(255),
zip varchar(25),
diff --git a/htdocs/install/mysql/tables/llx_mailing_cibles-mailing.sql b/htdocs/install/mysql/tables/llx_mailing_cibles-mailing.sql
index da0b6c1683a..3c38eedaaaf 100644
--- a/htdocs/install/mysql/tables/llx_mailing_cibles-mailing.sql
+++ b/htdocs/install/mysql/tables/llx_mailing_cibles-mailing.sql
@@ -32,7 +32,7 @@ create table llx_mailing_cibles
statut smallint NOT NULL DEFAULT 0, -- -1 = error, 0 = not sent, ...
source_url varchar(255),
source_id integer,
- source_type varchar(16),
+ source_type varchar(32),
date_envoi datetime,
tms timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
error_text varchar(255) -- text with error if statut is -1
diff --git a/htdocs/install/mysql/tables/llx_overwrite_trans.key.sql b/htdocs/install/mysql/tables/llx_overwrite_trans.key.sql
index 617036e66ee..7dd3156d2e5 100644
--- a/htdocs/install/mysql/tables/llx_overwrite_trans.key.sql
+++ b/htdocs/install/mysql/tables/llx_overwrite_trans.key.sql
@@ -17,5 +17,4 @@
-- ===========================================================================
-ALTER TABLE llx_overwrite_trans ADD UNIQUE INDEX uk_overwrite_trans(lang, transkey);
-
+ALTER TABLE llx_overwrite_trans ADD UNIQUE INDEX uk_overwrite_trans(entity, lang, transkey);
diff --git a/htdocs/install/mysql/tables/llx_partnership-partnership.sql b/htdocs/install/mysql/tables/llx_partnership-partnership.sql
index d023e67920e..8c616f8f62b 100644
--- a/htdocs/install/mysql/tables/llx_partnership-partnership.sql
+++ b/htdocs/install/mysql/tables/llx_partnership-partnership.sql
@@ -19,7 +19,7 @@
CREATE TABLE llx_partnership(
rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
ref varchar(128) DEFAULT '(PROV)' NOT NULL,
- status smallint NOT NULL DEFAULT '0',
+ status smallint DEFAULT 0 NOT NULL,
fk_type integer DEFAULT 0 NOT NULL,
fk_soc integer,
fk_member integer,
diff --git a/htdocs/install/mysql/tables/llx_prelevement_facture.key.sql b/htdocs/install/mysql/tables/llx_prelevement.key.sql
similarity index 76%
rename from htdocs/install/mysql/tables/llx_prelevement_facture.key.sql
rename to htdocs/install/mysql/tables/llx_prelevement.key.sql
index bc8b1bd8386..c3234b7756a 100644
--- a/htdocs/install/mysql/tables/llx_prelevement_facture.key.sql
+++ b/htdocs/install/mysql/tables/llx_prelevement.key.sql
@@ -18,8 +18,8 @@
-- ============================================================================
-ALTER TABLE llx_prelevement_facture ADD INDEX idx_prelevement_facture_fk_prelevement_lignes (fk_prelevement_lignes);
+ALTER TABLE llx_prelevement ADD INDEX idx_prelevement_fk_prelevement_lignes (fk_prelevement_lignes);
-ALTER TABLE llx_prelevement_facture ADD CONSTRAINT fk_prelevement_facture_fk_prelevement_lignes FOREIGN KEY (fk_prelevement_lignes) REFERENCES llx_prelevement_lignes (rowid);
+ALTER TABLE llx_prelevement ADD CONSTRAINT fk_prelevement_facture_fk_prelevement_lignes FOREIGN KEY (fk_prelevement_lignes) REFERENCES llx_prelevement_lignes (rowid);
diff --git a/htdocs/install/mysql/tables/llx_prelevement_facture.sql b/htdocs/install/mysql/tables/llx_prelevement.sql
similarity index 90%
rename from htdocs/install/mysql/tables/llx_prelevement_facture.sql
rename to htdocs/install/mysql/tables/llx_prelevement.sql
index 53a329f4376..597cdb4a79f 100644
--- a/htdocs/install/mysql/tables/llx_prelevement_facture.sql
+++ b/htdocs/install/mysql/tables/llx_prelevement.sql
@@ -16,11 +16,11 @@
--
-- ===================================================================
-create table llx_prelevement_facture
+create table llx_prelevement
(
rowid integer AUTO_INCREMENT PRIMARY KEY,
fk_facture integer NULL,
- fk_facture_fourn integer NULL,
+ fk_facture_fourn integer NULL,
+ fk_salary integer NULL,
fk_prelevement_lignes integer NOT NULL
-
)ENGINE=innodb;
diff --git a/htdocs/install/mysql/tables/llx_prelevement_facture_demande.key.sql b/htdocs/install/mysql/tables/llx_prelevement_demande.key.sql
similarity index 78%
rename from htdocs/install/mysql/tables/llx_prelevement_facture_demande.key.sql
rename to htdocs/install/mysql/tables/llx_prelevement_demande.key.sql
index 4f9aedb9cdf..cd4ed476635 100644
--- a/htdocs/install/mysql/tables/llx_prelevement_facture_demande.key.sql
+++ b/htdocs/install/mysql/tables/llx_prelevement_demande.key.sql
@@ -17,6 +17,6 @@
-- ===================================================================
-ALTER TABLE llx_prelevement_facture_demande ADD INDEX idx_prelevement_facture_demande_fk_facture (fk_facture);
-ALTER TABLE llx_prelevement_facture_demande ADD INDEX idx_prelevement_facture_demande_fk_facture_fourn (fk_facture_fourn);
+ALTER TABLE llx_prelevement_demande ADD INDEX idx_prelevement_facture_demande_fk_facture (fk_facture);
+ALTER TABLE llx_prelevement_demande ADD INDEX idx_prelevement_facture_demande_fk_facture_fourn (fk_facture_fourn);
diff --git a/htdocs/install/mysql/tables/llx_prelevement_facture_demande.sql b/htdocs/install/mysql/tables/llx_prelevement_demande.sql
similarity index 95%
rename from htdocs/install/mysql/tables/llx_prelevement_facture_demande.sql
rename to htdocs/install/mysql/tables/llx_prelevement_demande.sql
index 9837f709777..b0b1b87f77f 100644
--- a/htdocs/install/mysql/tables/llx_prelevement_facture_demande.sql
+++ b/htdocs/install/mysql/tables/llx_prelevement_demande.sql
@@ -17,12 +17,13 @@
-- ===================================================================
-create table llx_prelevement_facture_demande
+create table llx_prelevement_demande
(
rowid integer AUTO_INCREMENT PRIMARY KEY,
entity integer DEFAULT 1 NOT NULL,
fk_facture integer NULL,
fk_facture_fourn integer NULL,
+ fk_salary integer NULL,
sourcetype varchar(32),
amount double(24,8) NOT NULL,
date_demande datetime NOT NULL,
diff --git a/htdocs/install/mysql/tables/llx_product.sql b/htdocs/install/mysql/tables/llx_product.sql
index 0c2fdce5152..2267113e987 100644
--- a/htdocs/install/mysql/tables/llx_product.sql
+++ b/htdocs/install/mysql/tables/llx_product.sql
@@ -57,7 +57,7 @@ create table llx_product
fk_user_modif integer, -- user making last change
tosell tinyint DEFAULT 1, -- Product you sell
tobuy tinyint DEFAULT 1, -- Product you buy
- onportal tinyint DEFAULT 0, -- If it is a product you sell and you want to sell it on portal (module website must be on)
+ onportal tinyint DEFAULT 0, -- If it is a product you sell and you want to sell it from internal portal (module 'portal')
tobatch tinyint DEFAULT 0 NOT NULL, -- Is it a product that need a batch management (eat-by or lot management)
sell_or_eat_by_mandatory tinyint DEFAULT 0 NOT NULL, -- Make sell-by or eat-by date mandatory
batch_mask varchar(32) DEFAULT NULL, -- If the product has batch feature, you may want to use a batch mask per product
diff --git a/htdocs/install/mysql/tables/llx_product_lot.sql b/htdocs/install/mysql/tables/llx_product_lot.sql
index 162f1c6c122..4e6914884ac 100644
--- a/htdocs/install/mysql/tables/llx_product_lot.sql
+++ b/htdocs/install/mysql/tables/llx_product_lot.sql
@@ -22,6 +22,8 @@ CREATE TABLE llx_product_lot (
entity integer DEFAULT 1,
fk_product integer NOT NULL, -- Id of product
batch varchar(128) DEFAULT NULL, -- Lot or serial number
+ note_public text DEFAULT NULL,
+ note_private text DEFAULT NULL,
eatby date DEFAULT NULL, -- Eatby date
sellby date DEFAULT NULL, -- Sellby date
eol_date datetime NULL,
diff --git a/htdocs/install/mysql/tables/llx_projet.key.sql b/htdocs/install/mysql/tables/llx_projet.key.sql
index 4b9dd008943..26869454c41 100644
--- a/htdocs/install/mysql/tables/llx_projet.key.sql
+++ b/htdocs/install/mysql/tables/llx_projet.key.sql
@@ -22,4 +22,8 @@
ALTER TABLE llx_projet ADD UNIQUE INDEX uk_projet_ref (ref, entity);
ALTER TABLE llx_projet ADD INDEX idx_projet_fk_soc (fk_soc);
+ALTER TABLE llx_projet ADD INDEX idx_projet_ref (ref);
+ALTER TABLE llx_projet ADD INDEX idx_projet_fk_statut (fk_statut);
+ALTER TABLE llx_projet ADD INDEX idx_projet_fk_opp_status (fk_opp_status);
+
ALTER TABLE llx_projet ADD CONSTRAINT fk_projet_fk_soc FOREIGN KEY (fk_soc) REFERENCES llx_societe (rowid);
diff --git a/htdocs/install/mysql/tables/llx_projet.sql b/htdocs/install/mysql/tables/llx_projet.sql
index 197a92ac2be..5b3df54ba14 100644
--- a/htdocs/install/mysql/tables/llx_projet.sql
+++ b/htdocs/install/mysql/tables/llx_projet.sql
@@ -47,7 +47,10 @@ create table llx_projet
usage_opportunity integer DEFAULT 0, -- Set to 1 if project is used to follow an opportunity
usage_task integer DEFAULT 1, -- Set to 1 if project is used to manage tasks and/or record timesheet
usage_bill_time integer DEFAULT 0, -- Set to 1 if time spent must be converted into invoices
- usage_organize_event integer DEFAULT 0, -- Set to 1 if you want to use project to organize an event or receive attendees registration
+ usage_organize_event integer DEFAULT 0, -- Set to 1 if you want to use project to organize an event or receive attendees registration
+ date_start_event datetime, -- date start event
+ date_end_event datetime, -- date end event
+ location varchar(255), -- location
accept_conference_suggestions integer DEFAULT 0, -- Set to 1 if you want to allow unknown people to suggest conferences
accept_booth_suggestions integer DEFAULT 0, -- Set to 1 if you want to Allow unknown people to suggest booth
max_attendees integer DEFAULT 0,
diff --git a/htdocs/install/mysql/tables/llx_societe.sql b/htdocs/install/mysql/tables/llx_societe.sql
index 7f198db6042..47671f4e7c3 100644
--- a/htdocs/install/mysql/tables/llx_societe.sql
+++ b/htdocs/install/mysql/tables/llx_societe.sql
@@ -44,7 +44,7 @@ create table llx_societe
town varchar(50), -- town
fk_departement integer DEFAULT 0, --
fk_pays integer DEFAULT 0, --
- fk_account integer DEFAULT 0, --
+ fk_account integer DEFAULT 0, -- default bank account
phone varchar(20), -- phone number
fax varchar(20), -- fax number
url varchar(255), --
diff --git a/htdocs/install/mysql/tables/llx_societe_remise_except.sql b/htdocs/install/mysql/tables/llx_societe_remise_except.sql
index 8fed65fe5f0..8ae8b69e83c 100644
--- a/htdocs/install/mysql/tables/llx_societe_remise_except.sql
+++ b/htdocs/install/mysql/tables/llx_societe_remise_except.sql
@@ -39,6 +39,8 @@ create table llx_societe_remise_except
fk_invoice_supplier integer,
fk_invoice_supplier_source integer,
description text NOT NULL,
+ multicurrency_code varchar(3) NULL,
+ multicurrency_tx double(24,8) NULL,
multicurrency_amount_ht double(24,8) DEFAULT 0 NOT NULL,
multicurrency_amount_tva double(24,8) DEFAULT 0 NOT NULL,
multicurrency_amount_ttc double(24,8) DEFAULT 0 NOT NULL
diff --git a/htdocs/install/mysql/tables/llx_user.sql b/htdocs/install/mysql/tables/llx_user.sql
index e70716d90c4..ca0c7bc818d 100644
--- a/htdocs/install/mysql/tables/llx_user.sql
+++ b/htdocs/install/mysql/tables/llx_user.sql
@@ -50,6 +50,7 @@ create table llx_user
fk_state integer DEFAULT 0,
fk_country integer DEFAULT 0,
birth date, -- birthday
+ birth_place varchar(64), -- birth place (town)
job varchar(128),
office_phone varchar(20),
office_fax varchar(20),
diff --git a/htdocs/install/step1.php b/htdocs/install/step1.php
index 24b5dba4d01..7958012b0a1 100644
--- a/htdocs/install/step1.php
+++ b/htdocs/install/step1.php
@@ -825,7 +825,7 @@ function write_conf_file($conffile)
global $dolibarr_main_distrib;
global $db_host, $db_port, $db_name, $db_user, $db_pass, $db_type, $db_character_set, $db_collation;
global $conffile, $conffiletoshow, $conffiletoshowshort;
- global $force_dolibarr_lib_ADODB_PATH, $force_dolibarr_lib_NUSOAP_PATH;
+ global $force_dolibarr_lib_NUSOAP_PATH;
global $force_dolibarr_lib_TCPDF_PATH, $force_dolibarr_lib_FPDI_PATH;
global $force_dolibarr_lib_GEOIP_PATH;
global $force_dolibarr_lib_ODTPHP_PATH, $force_dolibarr_lib_ODTPHP_PATHTOPCLZIP;
@@ -944,11 +944,6 @@ function write_conf_file($conffile)
}
fputs($fp, '$dolibarr_lib_TCPDI_PATH=\''.$force_dolibarr_lib_TCPDI_PATH.'\';');
fputs($fp, "\n");
- if (empty($force_dolibarr_lib_ADODB_PATH)) {
- fputs($fp, '//'); $force_dolibarr_lib_ADODB_PATH = '';
- }
- fputs($fp, '$dolibarr_lib_ADODB_PATH=\''.$force_dolibarr_lib_ADODB_PATH.'\';');
- fputs($fp, "\n");
if (empty($force_dolibarr_lib_GEOIP_PATH)) {
fputs($fp, '//'); $force_dolibarr_lib_GEOIP_PATH = '';
}
diff --git a/htdocs/install/step5.php b/htdocs/install/step5.php
index b91d48bad36..4fc30772f78 100644
--- a/htdocs/install/step5.php
+++ b/htdocs/install/step5.php
@@ -222,9 +222,9 @@ if ($action == "set" || empty($action) || preg_match('/upgrade/i', $action)) {
print $langs->trans("AdminLoginCreatedSuccessfuly", $login)." ";
$success = 1;
} else {
- if ($newuser->error == 'ErrorLoginAlreadyExists') {
+ if ($result == -6) { //login or email already exists
dolibarr_install_syslog('step5: AdminLoginAlreadyExists', LOG_WARNING);
- print ''.$langs->trans("AdminLoginAlreadyExists", $login)."
";
+ print ''.$newuser->error."
";
$success = 1;
} else {
dolibarr_install_syslog('step5: FailedToCreateAdminLogin '.$newuser->error, LOG_ERR);
@@ -297,7 +297,7 @@ if ($action == "set" || empty($action) || preg_match('/upgrade/i', $action)) {
}
dolibarr_install_syslog('step5: remove MAIN_NOT_INSTALLED const');
- $resql = $db->query("DELETE FROM ".MAIN_DB_PREFIX."const WHERE ".$db->decrypt('name')."='MAIN_NOT_INSTALLED'");
+ $resql = $db->query("DELETE FROM ".MAIN_DB_PREFIX."const WHERE ".$db->decrypt('name')." = 'MAIN_NOT_INSTALLED'");
if (!$resql) {
dol_print_error($db, 'Error in setup program');
}
@@ -450,7 +450,7 @@ if ($action == "set") {
$morehtml .= ' ';
}
} else {
- dol_print_error('', 'step5.php: unknown choice of action');
+ dol_print_error('', 'step5.php: unknown choice of action='.$action.' in create lock file seaction');
}
// Clear cache files
diff --git a/htdocs/install/upgrade2.php b/htdocs/install/upgrade2.php
index c6cbab64965..bbb12e8693e 100644
--- a/htdocs/install/upgrade2.php
+++ b/htdocs/install/upgrade2.php
@@ -483,6 +483,13 @@ if (!GETPOST('action', 'aZ09') || preg_match('/upgrade/i', GETPOST('action', 'aZ
migrate_user_photospath();
migrate_user_photospath2();
}
+
+ // Scripts for 17.0
+ $afterversionarray = explode('.', '16.0.9');
+ $beforeversionarray = explode('.', '17.0.9');
+ if (versioncompare($versiontoarray, $afterversionarray) >= 0 && versioncompare($versiontoarray, $beforeversionarray) <= 0) {
+ migrate_contractdet_rank();
+ }
}
@@ -5137,3 +5144,61 @@ function migrate_export_import_profiles($mode = 'export')
print ''.$langs->trans("NothingToDo")." \n";
}
}
+
+/**
+ * Migrate Rank into contract line
+ *
+ * @return void
+ */
+function migrate_contractdet_rank()
+{
+
+ global $db, $langs;
+
+ $error = 0;
+ $resultstring = '';
+
+ $db->begin();
+ print '';
+ print ''.$langs->trans('MigrationContractLineRank')." \n";
+
+ $sql = "SELECT c.rowid as cid ,cd.rowid as cdid,cd.rang FROM ".$db->prefix()."contratdet as cd INNER JOIN ".$db->prefix()."contrat as c ON c.rowid=cd.fk_contrat AND cd.rang=0";
+ $sql .=" ORDER BY c.rowid,cd.rowid";
+
+ $resql = $db->query($sql);
+ if ($resql) {
+ $currentRank=0;
+ $current_contract=0;
+ while ($obj = $db->fetch_object($resql)) {
+ if (empty($current_contract) || $current_contract==$obj->cid) {
+ $currentRank++;
+ } else {
+ $currentRank=1;
+ }
+
+ $sqlUpd = "UPDATE ".$db->prefix()."contratdet SET rang=".(int) $currentRank." WHERE rowid=".(int) $obj->cdid;
+ $resultstring = '.';
+ print $resultstring;
+ $resqlUpd = $db->query($sqlUpd);
+ if (!$resqlUpd) {
+ dol_print_error($db);
+ $error++;
+ }
+
+ $current_contract = $obj->cid;
+ }
+ } else {
+ $error++;
+ }
+ if (!$error) {
+ $db->commit();
+ } else {
+ $db->rollback();
+ }
+
+ print ' ';
+
+ if (!$resultstring) {
+ print ''.$langs->trans("NothingToDo")." \n";
+ }
+}
diff --git a/htdocs/knowledgemanagement/class/knowledgerecord.class.php b/htdocs/knowledgemanagement/class/knowledgerecord.class.php
index c20fa91c621..fee18df2478 100644
--- a/htdocs/knowledgemanagement/class/knowledgerecord.class.php
+++ b/htdocs/knowledgemanagement/class/knowledgerecord.class.php
@@ -105,7 +105,6 @@ class KnowledgeRecord extends CommonObject
'entity' =>array('type'=>'integer', 'label'=>'Entity', 'default'=>1, 'enabled'=>1, 'visible'=>0, 'notnull'=>1, 'position'=>20, 'index'=>1),
'question' => array('type'=>'text', 'label'=>'Question', 'enabled'=>'1', 'position'=>30, 'notnull'=>1, 'visible'=>1, 'csslist'=>'tdoverflowmax300', 'copytoclipboard'=>1, 'tdcss'=>'titlefieldcreate nowraponall'),
'lang' => array('type'=>'varchar(6)', 'label'=>'Language', 'enabled'=>'1', 'position'=>40, 'notnull'=>0, 'visible'=>1, 'tdcss'=>'titlefieldcreate nowraponall', "csslist"=>"tdoverflowmax100"),
- 'answer' => array('type'=>'html', 'label'=>'Solution', 'enabled'=>'1', 'position'=>50, 'notnull'=>0, 'visible'=>3, 'csslist'=>'tdoverflowmax300', 'copytoclipboard'=>1, 'tdcss'=>'titlefieldcreate nowraponall'),
'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>'1', 'position'=>500, 'notnull'=>1, 'visible'=>-2,),
'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>'1', 'position'=>501, 'notnull'=>0, 'visible'=>2,),
'last_main_doc' => array('type'=>'varchar(255)', 'label'=>'LastMainDoc', 'enabled'=>'1', 'position'=>600, 'notnull'=>0, 'visible'=>0,),
@@ -115,7 +114,8 @@ class KnowledgeRecord extends CommonObject
'import_key' => array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>'1', 'position'=>1000, 'notnull'=>-1, 'visible'=>-2,),
'model_pdf' => array('type'=>'varchar(255)', 'label'=>'Model pdf', 'enabled'=>'1', 'position'=>1010, 'notnull'=>-1, 'visible'=>0,),
//'url' => array('type'=>'varchar(255)', 'label'=>'URL', 'enabled'=>'1', 'position'=>55, 'notnull'=>0, 'visible'=>-1, 'csslist'=>'tdoverflow200', 'help'=>'UrlForInfoPage'),
- 'fk_c_ticket_category' => array('type'=>'integer:CTicketCategory:ticket/class/cticketcategory.class.php:0:(t.active:=:1):pos', 'label'=>'SuggestedForTicketsInGroup', 'enabled'=>'$conf->ticket->enabled', 'position'=>512, 'notnull'=>0, 'visible'=>-1, 'help'=>'YouCanLinkArticleToATicketCategory', 'csslist'=>'minwidth200 tdoverflowmax250'),
+ 'fk_c_ticket_category' => array('type'=>'integer:CTicketCategory:ticket/class/cticketcategory.class.php:0:(t.active:=:1):pos', 'label'=>'SuggestedForTicketsInGroup', 'enabled'=>'isModEnabled("ticket")', 'position'=>520, 'notnull'=>0, 'visible'=>-1, 'help'=>'YouCanLinkArticleToATicketCategory', 'csslist'=>'minwidth200 tdoverflowmax250'),
+ 'answer' => array('type'=>'html', 'label'=>'Solution', 'enabled'=>'1', 'position'=>600, 'notnull'=>0, 'visible'=>3, 'csslist'=>'tdoverflowmax300', 'copytoclipboard'=>1, 'tdcss'=>'titlefieldcreate nowraponall'),
'status' => array('type'=>'integer', 'label'=>'Status', 'enabled'=>'1', 'position'=>1000, 'notnull'=>1, 'visible'=>5, 'default'=>0, 'index'=>1, 'arrayofkeyval'=>array('0'=>'Draft', '1'=>'Validated', '9'=>'Obsolete'),),
);
public $rowid;
diff --git a/htdocs/knowledgemanagement/core/modules/knowledgemanagement/mod_knowledgerecord_standard.php b/htdocs/knowledgemanagement/core/modules/knowledgemanagement/mod_knowledgerecord_standard.php
index ba5a3c3b391..1e5f69aaa93 100644
--- a/htdocs/knowledgemanagement/core/modules/knowledgemanagement/mod_knowledgerecord_standard.php
+++ b/htdocs/knowledgemanagement/core/modules/knowledgemanagement/mod_knowledgerecord_standard.php
@@ -26,7 +26,7 @@ dol_include_once('/knowledgemanagement/core/modules/knowledgemanagement/modules_
/**
- * Class to manage customer order numbering rules standard
+ * Class to manage the knowledgerecord numbering rules standard
*/
class mod_knowledgerecord_standard extends ModeleNumRefKnowledgeRecord
{
diff --git a/htdocs/knowledgemanagement/knowledgerecord_card.php b/htdocs/knowledgemanagement/knowledgerecord_card.php
index 18f36c192c2..c28bc9e1c9c 100644
--- a/htdocs/knowledgemanagement/knowledgerecord_card.php
+++ b/htdocs/knowledgemanagement/knowledgerecord_card.php
@@ -118,7 +118,7 @@ if (empty($reshook)) {
$triggermodname = 'KNOWLEDGEMANAGEMENT_KNOWLEDGERECORD_MODIFY'; // Name of trigger action code to execute when we modify record
- // Upadate / add for lang
+ // Update / add for lang
if (($action == 'update' || $action == 'add') && !empty($permissiontoadd)) {
$object->lang = (GETPOSTISSET('langkm') ? GETPOST('langkm', 'aZ09') : $object->lang);
}
@@ -182,12 +182,14 @@ if ($action == 'create') {
print ' ';
}
- print dol_get_fiche_head(array(), '');
+ print dol_get_fiche_head(array(), '', '', -3);
print ''."\n";
// Common attributes
+ $object->fields['answer']['enabled'] = 0;
include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_add.tpl.php';
+ $object->fields['answer']['enabled'] = 1;
if (isModEnabled('categorie')) {
$cate_arbo = $form->select_all_categories(Categorie::TYPE_KNOWLEDGEMANAGEMENT, '', 'parent', 64, 0, 1);
@@ -205,6 +207,14 @@ if ($action == 'create') {
print '
'."\n";
+ // Add field answer
+ print ' ';
+ print $langs->trans($object->fields['answer']['label']).' ';
+ require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
+ $doleditor = new DolEditor('answer', $object->answer, '', 200, 'dolibarr_notes', 'In', true, 0, true, ROWS_9, '100%');
+ $out = $doleditor->Create(1);
+ print $out;
+
print dol_get_fiche_end();
print $form->buttonsSaveCancel('Create');
@@ -229,12 +239,14 @@ if (($id || $ref) && $action == 'edit') {
print ' ';
}
- print dol_get_fiche_head();
+ print dol_get_fiche_head(array(), '', '', -3);
print ''."\n";
// Common attributes
+ $object->fields['answer']['enabled'] = 0;
include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_edit.tpl.php';
+ $object->fields['answer']['enabled'] = 1;
if (isModEnabled('categorie')) {
$cate_arbo = $form->select_all_categories(Categorie::TYPE_KNOWLEDGEMANAGEMENT, '', 'parent', 64, 0, 1);
@@ -260,6 +272,14 @@ if (($id || $ref) && $action == 'edit') {
print '
';
+ // Add field answer
+ print ' ';
+ print $langs->trans($object->fields['answer']['label']).' ';
+ require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
+ $doleditor = new DolEditor('answer', $object->answer, '', 200, 'dolibarr_notes', 'In', true, 0, true, ROWS_9, '100%');
+ $out = $doleditor->Create(1);
+ print $out;
+
print dol_get_fiche_end();
print $form->buttonsSaveCancel();
@@ -408,11 +428,13 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
$keyforbreak='fk_c_ticket_category'; // We change column just before this field
//unset($object->fields['fk_project']); // Hide field already shown in banner
//unset($object->fields['fk_soc']); // Hide field already shown in banner
+ $object->fields['answer']['enabled'] = 0;
include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php';
+ $object->fields['answer']['enabled'] = 1;
// Categories
if (isModEnabled('categorie')) {
- print ''.$langs->trans("Categories").' ';
+ print ' '.$langs->trans("Categories").' ';
print $form->showCategories($object->id, Categorie::TYPE_KNOWLEDGEMANAGEMENT, 1);
print " ";
}
@@ -421,11 +443,20 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
print '
';
+
print '';
print '';
print '
';
+ // Add field answer
+ print ' ';
+ print $langs->trans($object->fields['answer']['label']).' ';
+ require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
+ $doleditor = new DolEditor('answer', $object->answer, '', 200, 'dolibarr_notes', 'In', true, 0, true, ROWS_9, '100%', 1);
+ $out = $doleditor->Create(1);
+ print $out;
+
print dol_get_fiche_end();
diff --git a/htdocs/knowledgemanagement/knowledgerecord_list.php b/htdocs/knowledgemanagement/knowledgerecord_list.php
index d9fc25fa1fe..c8df2018ae7 100644
--- a/htdocs/knowledgemanagement/knowledgerecord_list.php
+++ b/htdocs/knowledgemanagement/knowledgerecord_list.php
@@ -293,7 +293,11 @@ if (!empty($searchCategoryKnowledgemanagementList)) {
if (intval($searchCategoryKnowledgemanagement) == -2) {
$searchCategoryKnowledgemanagementSqlList[] = "NOT EXISTS (SELECT ck.fk_knowledgemanagement FROM ".MAIN_DB_PREFIX."categorie_knowledgemanagement as ck WHERE t.rowid = ck.fk_knowledgemanagement)";
} elseif (intval($searchCategoryKnowledgemanagement) > 0) {
- $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryKnowledgemanagement);
+ if ($searchCategoryKnowledgemanagementOperator == 0) {
+ $searchCategoryKnowledgemanagementSqlList[] = " EXISTS (SELECT ck.fk_knowledgemanagement FROM ".MAIN_DB_PREFIX."categorie_knowledgemanagement as ck WHERE t.rowid = ck.fk_knowledgemanagement AND ck.fk_categorie = ".((int) $searchCategoryKnowledgemanagement).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryKnowledgemanagement);
+ }
}
}
if ($listofcategoryid) {
@@ -472,7 +476,7 @@ $moreforfilter.= '';*/
// Filter on categories
$moreforfilter = '';
-if (isModEnabled('categorie') && $user->rights->categorie->lire) {
+if (isModEnabled('categorie') && $user->hasRight('categorie', 'lire')) {
$moreforfilter .= '';
$moreforfilter .= img_picto($langs->trans('Categories'), 'category', 'class="pictofixedwidth"');
$categoriesKnowledgeArr = $form->select_all_categories(Categorie::TYPE_KNOWLEDGEMANAGEMENT, '', '', 64, 0, 1);
diff --git a/htdocs/langs/ar_IQ/projects.lang b/htdocs/langs/ar_IQ/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/ar_IQ/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/de_AT/admin.lang b/htdocs/langs/de_AT/admin.lang
index 54771c2245a..eb37ef1ee98 100644
--- a/htdocs/langs/de_AT/admin.lang
+++ b/htdocs/langs/de_AT/admin.lang
@@ -21,8 +21,6 @@ SessionSaveHandler=Sessionmanager
YourSession=Ihre Anmeldung
Sessions=Benutzeranmeldungen
DolibarrSetup=Dolibarr installieren oder aktualisieren
-InternalUser=interner Nutzer
-ExternalUser=externer Nutzer
InternalUsers=interne Nutzer
ExternalUsers=externe Nutzer
UploadNewTemplate=Neue Vorlage(n) hochladen
diff --git a/htdocs/langs/de_AT/ecm.lang b/htdocs/langs/de_AT/ecm.lang
index bfb47abf032..29ad990c4ca 100644
--- a/htdocs/langs/de_AT/ecm.lang
+++ b/htdocs/langs/de_AT/ecm.lang
@@ -2,4 +2,3 @@
ECMSectionsManual=Manuelle Verzeichnisse
ECMSectionsAuto=Automatische Verzeichnisse
ECMNbOfFilesInSubDir=Anzahl der Dateien im Unterverzeichnis
-ECMAreaDesc2=* Automatische Verzeichnisse werden automatisch befüllt, wenn Sie Dokumente von der Karte eines Elements erstellen.
* Manuelle Verzeichnisse können Sie dazu nutzen, nicht mit anderen Elementen verbundene Dokumente zu speichern.
diff --git a/htdocs/langs/de_CH/accountancy.lang b/htdocs/langs/de_CH/accountancy.lang
index 6a826327010..a65ad255398 100644
--- a/htdocs/langs/de_CH/accountancy.lang
+++ b/htdocs/langs/de_CH/accountancy.lang
@@ -39,7 +39,6 @@ CountriesNotInEEC=Nicht EWR - Staaten
CountriesInEECExceptMe=Länder im EWR ausser %s
CountriesExceptMe=Alle Staaten, ausser %s
AccountantFiles=Geschäftsvorgänge exportieren
-ExportAccountingSourceDocHelp=With this tool, you can search and export the source events that are used to generate your accountancy.
The exported ZIP file will contain the lists of requested items in CSV, as well as their attached files in their original format (PDF, ODT, DOCX...).
ExportAccountingSourceDocHelp2=Die Journale exportierst du im Menu %s - %s.
VueByAccountAccounting=Anzeigen nach Buchhaltungskonto
VueBySubAccountAccounting=Anzeigen nach Nebenbuchkonto
@@ -232,7 +231,6 @@ AccountingAccountForSalesTaxAreDefinedInto=Obacht: Das Buchhaltungskonto für d
NumberOfAccountancyEntries=Anzahl Einträge
NumberOfAccountancyMovements=Anzahl Bewegungen
ACCOUNTING_DISABLE_BINDING_ON_SALES=Bindung & Übertragung in der Verkaufsbuchhaltung deaktivieren (Kundenrechnungen werden in der Buchhaltung nicht berücksichtigt)
-NotifiedValidationDate=Validate and Lock the exported entries
(same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible)
ConfirmExportFile=Bestätigen der Generierung der Buchhaltungsexportdatei ?
ExportDraftJournal=Exportiere Entwurfsjournal
Modelcsv=Exportformat
diff --git a/htdocs/langs/de_CH/admin.lang b/htdocs/langs/de_CH/admin.lang
index 3529a5b6b40..b8e31734903 100644
--- a/htdocs/langs/de_CH/admin.lang
+++ b/htdocs/langs/de_CH/admin.lang
@@ -256,7 +256,6 @@ SetAsDefault=Als Standard definieren
InstalledInto=Installiert im Verzeichnis %s
BarcodeInitForThirdparties=Barcode Init. für alle Partner
BarcodeInitForProductsOrServices=Alle Strichcodes für Produkte oder Services initialisieren oder zurücksetzen
-InitEmptyBarCode=Init value for the %s empty barcodes
EraseAllCurrentBarCode=Alle aktuellen Barcode-Werte löschen
ConfirmEraseAllCurrentBarCode=Wirklich alle aktuellen Barcode-Werte löschen?
AllBarcodeReset=Alle Barcode-Werte wurden entfernt
@@ -396,7 +395,6 @@ Permission215=Lieferanten einrichten
Permission255=Andere Passwörter ändern
Permission272=Rechnungen anzeigen
Permission273=Ausgabe Rechnungen
-Permission300=Barcodes auslesen
Permission301=Barcodes erzeugen und ändern.
Permission331=Lesezeichen einsehen
Permission430=PHP Debug Bar verwenden
diff --git a/htdocs/langs/de_CH/commercial.lang b/htdocs/langs/de_CH/commercial.lang
index edf30db19b1..a3ab0012f82 100644
--- a/htdocs/langs/de_CH/commercial.lang
+++ b/htdocs/langs/de_CH/commercial.lang
@@ -35,8 +35,5 @@ Stats=Verkaufsstatistik
StatusProsp=Interessenten Status
NoLimit=Kein Limit
ToOfferALinkForOnlineSignature=Link zur Digitalen Unterschrift
-WelcomeOnOnlineSignaturePage=Willkommen auf der Seite zum Offerten von %s zu aktzeptieren.
-ThisScreenAllowsYouToSignDocFrom=Hier kannst du die Offerte akzeptieren, unterzeichen oder zurückweisen.
-ThisIsInformationOnDocumentToSign=Hier die Informationen zum Dokument, das zu akzeptieren oder zurückzuweisen ist.
SignatureProposalRef=Unterschrift zur Offerte %s
FeatureOnlineSignDisabled=Hoppla, online unterschreiben ist entweder deaktiviert - oder die Offerte wurde erstellt, bevor online unterschreiben aktiviert worden war.
diff --git a/htdocs/langs/de_CH/ecm.lang b/htdocs/langs/de_CH/ecm.lang
index 57cb0298e43..814cee2c845 100644
--- a/htdocs/langs/de_CH/ecm.lang
+++ b/htdocs/langs/de_CH/ecm.lang
@@ -6,7 +6,6 @@ ECMAddSection=Ordner hinzufügen
ECMNbOfFilesInDir=Anzahl der Dateien in Ordner
ECMNbOfSubDir=Anzahl der Unterordner
ECMNbOfFilesInSubDir=Anzahl Dateien in Unterordnern
-ECMAreaDesc2=* In den automatischen Verzeichnissen werden die vom System erzeugeten Dokumente abgelegt.
* Die manuellen Verzeichnisse können Sie selbst verwalten und zusätzliche nicht direkt zuordenbare Dokument hinterlegen.
ECMSectionWasRemoved=Der Ordner
%s wurde gelöscht.
ECMSearchByKeywords=Suche nach Stichwörter
ECMSearchByEntity=Suche nach Objekt
diff --git a/htdocs/langs/el_CY/members.lang b/htdocs/langs/el_CY/members.lang
deleted file mode 100644
index 5f7a2ff4020..00000000000
--- a/htdocs/langs/el_CY/members.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - members
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
diff --git a/htdocs/langs/el_CY/projects.lang b/htdocs/langs/el_CY/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/el_CY/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/en_AE/members.lang b/htdocs/langs/en_AE/members.lang
deleted file mode 100644
index 5f7a2ff4020..00000000000
--- a/htdocs/langs/en_AE/members.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - members
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
diff --git a/htdocs/langs/en_AE/projects.lang b/htdocs/langs/en_AE/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/en_AE/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/en_AU/members.lang b/htdocs/langs/en_AU/members.lang
deleted file mode 100644
index 5f7a2ff4020..00000000000
--- a/htdocs/langs/en_AU/members.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - members
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
diff --git a/htdocs/langs/en_AU/projects.lang b/htdocs/langs/en_AU/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/en_AU/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/en_CA/members.lang b/htdocs/langs/en_CA/members.lang
deleted file mode 100644
index 5f7a2ff4020..00000000000
--- a/htdocs/langs/en_CA/members.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - members
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
diff --git a/htdocs/langs/en_CA/projects.lang b/htdocs/langs/en_CA/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/en_CA/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/en_GB/accountancy.lang b/htdocs/langs/en_GB/accountancy.lang
index 0afbc72c036..8ed034a497b 100644
--- a/htdocs/langs/en_GB/accountancy.lang
+++ b/htdocs/langs/en_GB/accountancy.lang
@@ -50,7 +50,6 @@ ACCOUNTING_LIST_SORT_VENTILATION_TODO=Begin sorting the page "Links to do" by th
ACCOUNTING_LIST_SORT_VENTILATION_DONE=Begin sorting the page "Links done" by the most recent elements
ACCOUNTING_LENGTH_GACCOUNT=Length of the General Ledger accounts (If you set value to 6 here, the account '706' will appear as '706000' on screen)
ACCOUNTING_SELL_JOURNAL=Sales journal
-ACCOUNTING_MISCELLANEOUS_JOURNAL=General journal
ACCOUNTING_ACCOUNT_SUSPENSE=Suspense account
DONATION_ACCOUNTINGACCOUNT=Finance account to register donations
ACCOUNTING_PRODUCT_SOLD_ACCOUNT=Default sales account (used if not defined in the product sheet)
diff --git a/htdocs/langs/en_GB/admin.lang b/htdocs/langs/en_GB/admin.lang
index 40504938dbe..f61f52381f7 100644
--- a/htdocs/langs/en_GB/admin.lang
+++ b/htdocs/langs/en_GB/admin.lang
@@ -39,7 +39,6 @@ UMaskExplanation=This parameter allows you to define permissions set by default
ListOfDirectories=List of OpenDocument template directories
ListOfDirectoriesForModelGenODT=List of directories containing template files in OpenDocument format.
Put here full path of directories.
Add a carriage return between each directory.
To add a directory of the GED module, add here
DOL_DATA_ROOT/ecm/yourdirectoryname .
Files in those directories must end with
.odt or
.ods .
FollowingSubstitutionKeysCanBeUsed=
To learn how to create your .odt document templates, before storing them in those directories, read wiki documentation:
-InitEmptyBarCode=Init value for the %s empty barcodes
Module50200Name=PayPal
DictionaryAccountancyJournal=Finance journals
CompanyZip=Postcode
diff --git a/htdocs/langs/en_GB/members.lang b/htdocs/langs/en_GB/members.lang
deleted file mode 100644
index 5f7a2ff4020..00000000000
--- a/htdocs/langs/en_GB/members.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - members
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
diff --git a/htdocs/langs/en_GB/projects.lang b/htdocs/langs/en_GB/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/en_GB/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/en_GB/trips.lang b/htdocs/langs/en_GB/trips.lang
index 31e58b7f935..b9af13b26fa 100644
--- a/htdocs/langs/en_GB/trips.lang
+++ b/htdocs/langs/en_GB/trips.lang
@@ -1,8 +1,8 @@
# Dolibarr language file - Source file is en_US - trips
-TripsAndExpensesStatistics=Expense report statistics
-FeesKilometersOrAmout=Amount or Miles
-TripNDF=Information expense report
-TF_METRO=Tube
-ErrorDoubleDeclaration=You have submitted another expense report in a similar date range.
BrouillonnerTrip=Move expense report status back to "Draft"
ConfirmBrouillonnerTrip=Are you sure you want to move this expense report status back to "Draft"?
+ErrorDoubleDeclaration=You have submitted another expense report in a similar date range.
+FeesKilometersOrAmout=Amount or Miles
+TripNDF=Information expense report
+TripsAndExpensesStatistics=Expense report statistics
+TF_METRO=Tube
diff --git a/htdocs/langs/en_IN/members.lang b/htdocs/langs/en_IN/members.lang
deleted file mode 100644
index 5f7a2ff4020..00000000000
--- a/htdocs/langs/en_IN/members.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - members
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
diff --git a/htdocs/langs/en_SG/members.lang b/htdocs/langs/en_SG/members.lang
deleted file mode 100644
index 5f7a2ff4020..00000000000
--- a/htdocs/langs/en_SG/members.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - members
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
diff --git a/htdocs/langs/en_SG/projects.lang b/htdocs/langs/en_SG/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/en_SG/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang
index 6e64f1c6e48..e988764d8ba 100644
--- a/htdocs/langs/en_US/accountancy.lang
+++ b/htdocs/langs/en_US/accountancy.lang
@@ -59,6 +59,7 @@ MainAccountForSuppliersNotDefined=Main accounting account for vendors not define
MainAccountForUsersNotDefined=Main accounting account for users not defined in setup
MainAccountForVatPaymentNotDefined=Main accounting account for VAT payment not defined in setup
MainAccountForSubscriptionPaymentNotDefined=Main accounting account for subscription payment not defined in setup
+UserAccountNotDefined=Accounting account for user not defined in setup
AccountancyArea=Accounting area
AccountancyAreaDescIntro=Usage of the accountancy module is done in several step:
@@ -164,12 +165,14 @@ ACCOUNTANCY_COMBO_FOR_AUX=Enable combo list for subsidiary account (may be slow
ACCOUNTING_DATE_START_BINDING=Define a date to start binding & transfer in accountancy. Below this date, the transactions will not be transferred to accounting.
ACCOUNTING_DEFAULT_PERIOD_ON_TRANSFER=On accountancy transfer, what is the period selected by default
-ACCOUNTING_SELL_JOURNAL=Sell journal
-ACCOUNTING_PURCHASE_JOURNAL=Purchase journal
-ACCOUNTING_MISCELLANEOUS_JOURNAL=Miscellaneous journal
+ACCOUNTING_SELL_JOURNAL=Sales journal (sales and returns)
+ACCOUNTING_PURCHASE_JOURNAL=Purchase journal (purchase and returns)
+ACCOUNTING_BANK_JOURNAL=Cash journal (receipts and disbursements)
ACCOUNTING_EXPENSEREPORT_JOURNAL=Expense report journal
-ACCOUNTING_SOCIAL_JOURNAL=Social journal
+ACCOUNTING_MISCELLANEOUS_JOURNAL=General journal
ACCOUNTING_HAS_NEW_JOURNAL=Has new Journal
+ACCOUNTING_INVENTORY_JOURNAL=Inventory journal
+ACCOUNTING_SOCIAL_JOURNAL=Social journal
ACCOUNTING_RESULT_PROFIT=Result accounting account (Profit)
ACCOUNTING_RESULT_LOSS=Result accounting account (Loss)
@@ -322,9 +325,10 @@ AccountingJournalType1=Miscellaneous operations
AccountingJournalType2=Sales
AccountingJournalType3=Purchases
AccountingJournalType4=Bank
-AccountingJournalType5=Expenses report
+AccountingJournalType5=Expense reports
AccountingJournalType8=Inventory
AccountingJournalType9=Has-new
+GenerationOfAccountingEntries=Generation of accounting entries
ErrorAccountingJournalIsAlreadyUse=This journal is already use
AccountingAccountForSalesTaxAreDefinedInto=Note: Accounting account for Sales tax are defined into menu
%s -
%s
NumberOfAccountancyEntries=Number of entries
@@ -332,8 +336,10 @@ NumberOfAccountancyMovements=Number of movements
ACCOUNTING_DISABLE_BINDING_ON_SALES=Disable binding & transfer in accountancy on sales (customer invoices will not be taken into account in accounting)
ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Disable binding & transfer in accountancy on purchases (vendor invoices will not be taken into account in accounting)
ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Disable binding & transfer in accountancy on expense reports (expense reports will not be taken into account in accounting)
+ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting
## Export
+NotExportLettering=Do not export the lettering when generating the file
NotifiedExportDate=Flag exported lines as Exported
(to modify a line, you will need to delete the whole transaction and re-transfert it into accounting)
NotifiedValidationDate=Validate and Lock the exported entries
(same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible)
DateValidationAndLock=Date validation and lock
@@ -401,7 +407,11 @@ Calculated=Calculated
Formula=Formula
## Reconcile
+LetteringAuto=Reconcile auto
+LetteringManual=Reconcile manual
Unlettering=Unreconcile
+UnletteringAuto=Unreconcile auto
+UnletteringManual=Unreconcile manual
AccountancyNoLetteringModified=No reconcile modified
AccountancyOneLetteringModifiedSuccessfully=One reconcile successfully modified
AccountancyLetteringModifiedSuccessfully=%s reconcile successfully modified
@@ -410,8 +420,9 @@ AccountancyOneUnletteringModifiedSuccessfully=One unreconcile successfully modif
AccountancyUnletteringModifiedSuccessfully=%s unreconcile successfully modified
## Confirm box
-ConfirmMassUnlettering=Bulk Unreconcile confirmation
-ConfirmMassUnletteringQuestion=Are you sure you want to Unreconcile the %s selected record(s)?
+ConfirmMassUnletteringAuto=Bulk auto unreconcile confirmation
+ConfirmMassUnletteringManual=Bulk manual unreconcile confirmation
+ConfirmMassUnletteringQuestion=Are you sure you want to unreconcile the %s selected record(s)?
ConfirmMassDeleteBookkeepingWriting=Bulk Delete confirmation
ConfirmMassDeleteBookkeepingWritingQuestion=This will delete the transaction from the accounting (all lines related to the same transaction will be deleted) Are you sure you want to delete the %s selected record(s)?
@@ -457,6 +468,5 @@ FECFormatMulticurrencyCode=Multicurrency code (Idevise)
DateExport=Date export
WarningReportNotReliable=Warning, this report is not based on the Ledger, so does not contains transaction modified manually in the Ledger. If your journalization is up to date, the bookkeeping view is more accurate.
ExpenseReportJournal=Expense Report Journal
-InventoryJournal=Inventory Journal
NAccounts=%s accounts
diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang
index b5c3bb30aec..fb15f7f1be8 100644
--- a/htdocs/langs/en_US/admin.lang
+++ b/htdocs/langs/en_US/admin.lang
@@ -292,6 +292,7 @@ MAIN_MAIL_SMTP_SERVER=SMTP/SMTPS Host (default value in php.ini:
%s )
MAIN_MAIL_SMTP_PORT_NotAvailableOnLinuxLike=SMTP/SMTPS Port (Not defined into PHP on Unix-like systems)
MAIN_MAIL_SMTP_SERVER_NotAvailableOnLinuxLike=SMTP/SMTPS Host (Not defined into PHP on Unix-like systems)
MAIN_MAIL_EMAIL_FROM=Sender email for automatic emails (default value in php.ini:
%s )
+EMailHelpMsgSPFDKIM=To prevent Dolibarr emails to be classified as spam, make sure that the server is authorized to send e-mails from this address by SPF and DKIM configuration
MAIN_MAIL_ERRORS_TO=Email used for error returns emails (fields 'Errors-To' in emails sent)
MAIN_MAIL_AUTOCOPY_TO= Copy (Bcc) all sent emails to
MAIN_DISABLE_ALL_MAILS=Disable all email sending (for test purposes or demos)
@@ -501,7 +502,8 @@ WarningPHPMail=WARNING: The setup to send emails from the application is using t
WarningPHPMailA=- Using the server of the Email Service Provider increases the trustability of your email, so it increases the deliverablity without being flagged as SPAM
WarningPHPMailB=- Some Email Service Providers (like Yahoo) do not allow you to send an email from another server than their own server. Your current setup uses the server of the application to send email and not the server of your email provider, so some recipients (the one compatible with the restrictive DMARC protocol), will ask your email provider if they can accept your email and some email providers (like Yahoo) may respond "no" because the server is not theirs, so few of your sent Emails may not be accepted for delivery (be careful also of your email provider's sending quota).
WarningPHPMailC=- Using the SMTP server of your own Email Service Provider to send emails is also interesting so all emails sent from application will also be saved into your "Sent" directory of your mailbox.
-WarningPHPMailD=Also, it is therefore recommended to change the sending method of e-mails to the value "SMTP". If you really want to keep the default "PHP" method to send emails, just ignore this warning, or remove it by setting the MAIN_HIDE_WARNING_TO_ENCOURAGE_SMTP_SETUP constant to 1 in Home - Setup - Other.
+WarningPHPMailD=It is therefore recommended to change the sending method of e-mails to the value "SMTP".
+WarningPHPMailDbis=If you really want to keep the default "PHP" method to send emails, just ignore this warning, or remove it by %sclicking here%s.
WarningPHPMail2=If your email SMTP provider need to restrict email client to some IP addresses (very rare), this is the IP address of the mail user agent (MUA) for your ERP CRM application:
%s .
WarningPHPMailSPF=If the domain name in your sender email address is protected by a SPF record (ask your domain name registar), you must add the following IPs in the SPF record of the DNS of your domain:
%s .
ActualMailSPFRecordFound=Actual SPF record found (for email %s) : %s
@@ -645,9 +647,9 @@ Module2400Name=Events/Agenda
Module2400Desc=Track events. Log automatic events for tracking purposes or record manual events or meetings. This is the principal module for good Customer or Vendor Relationship Management.
Module2500Name=DMS / ECM
Module2500Desc=Document Management System / Electronic Content Management. Automatic organization of your generated or stored documents. Share them when you need.
-Module2600Name=API/Web services (SOAP server)
+Module2600Name=API / Web services (SOAP server)
Module2600Desc=Enable the Dolibarr SOAP server providing API services
-Module2610Name=API/Web services (REST server)
+Module2610Name=API / Web services (REST server)
Module2610Desc=Enable the Dolibarr REST server providing API services
Module2660Name=Call WebServices (SOAP client)
Module2660Desc=Enable the Dolibarr web services client (Can be used to push data/requests to external servers. Only Purchase orders are currently supported.)
@@ -1081,6 +1083,10 @@ DictionaryAssetDisposalType=Type of disposal of assets
TypeOfUnit=Type of unit
SetupSaved=Setup saved
SetupNotSaved=Setup not saved
+OAuthServiceConfirmDeleteTitle=Delete OAuth entry
+OAuthServiceConfirmDeleteMessage=Are you sure you want to delete this OAuth entry ? All existing tokens for it will also be deleted.
+ErrorInEntryDeletion=Error in entry deletion
+EntryDeleted=Entry deleted
BackToModuleList=Back to Module list
BackToDictionaryList=Back to Dictionaries list
TypeOfRevenueStamp=Type of tax stamp
@@ -1742,8 +1748,8 @@ ActivateFCKeditor=Activate advanced editor for:
FCKeditorForNotePublic=WYSIWIG creation/edition of the field "public notes" of elements
FCKeditorForNotePrivate=WYSIWIG creation/edition of the field "private notes" of elements
FCKeditorForCompany=WYSIWIG creation/edition of the field description of elements (except products/services)
-FCKeditorForProduct=WYSIWIG creation/edition of the field description of products/services
-FCKeditorForProductDetails=WYSIWIG creation/edition of products details lines for all entities (proposals, orders, invoices, etc...).
Warning: Using this option for this case is seriously not recommended as it can create problems with special characters and page formatting when building PDF files.
+FCKeditorForProductDetails=WYSIWIG creation/edition of products description or lines for objects (lines of proposals, orders, invoices, etc...).
+FCKeditorForProductDetails2=Warning: Using this option for this case is seriously not recommended as it can create problems with special characters and page formatting when building PDF files.
FCKeditorForMailing= WYSIWIG creation/edition for mass eMailings (Tools->eMailing)
FCKeditorForUserSignature=WYSIWIG creation/edition of user signature
FCKeditorForMail=WYSIWIG creation/edition for all mail (except Tools->eMailing)
@@ -1840,7 +1846,7 @@ StockDecreaseForPointOfSaleDisabledbyBatch=Stock decrease in POS is not compatib
CashDeskYouDidNotDisableStockDecease=You did not disable stock decrease when making a sale from Point of Sale. Hence a warehouse is required.
CashDeskForceDecreaseStockLabel=Stock decrease for batch products was forced.
CashDeskForceDecreaseStockDesc=Decrease first by the oldest eatby and sellby dates.
-CashDeskReaderKeyCodeForEnter=Key code for "Enter" defined in barcode reader (Example: 13)
+CashDeskReaderKeyCodeForEnter=Key ASCII code for "Enter" defined in barcode reader (Example: 13)
##### Bookmark #####
BookmarkSetup=Bookmark module setup
BookmarkDesc=This module allows you to manage bookmarks. You can also add shortcuts to any Dolibarr pages or external web sites on your left menu.
@@ -1878,7 +1884,7 @@ SuppliersInvoiceNumberingModel=Vendor invoices numbering models
IfSetToYesDontForgetPermission=If set to a non null value, don't forget to provide permissions to groups or users allowed for the second approval
##### GeoIPMaxmind #####
GeoIPMaxmindSetup=GeoIP Maxmind module setup
-PathToGeoIPMaxmindCountryDataFile=Path to file containing Maxmind ip to country translation.
Examples:
/usr/local/share/GeoIP/GeoIP.dat
/usr/share/GeoIP/GeoIP.dat
/usr/share/GeoIP/GeoLite2-Country.mmdb
+PathToGeoIPMaxmindCountryDataFile=Path to file containing Maxmind ip to country translation
NoteOnPathLocation=Note that your ip to country data file must be inside a directory your PHP can read (Check your PHP open_basedir setup and filesystem permissions).
YouCanDownloadFreeDatFileTo=You can download a
free demo version of the Maxmind GeoIP country file at %s.
YouCanDownloadAdvancedDatFileTo=You can also download a more
complete version, with updates, of the Maxmind GeoIP country file at %s.
@@ -1929,6 +1935,7 @@ BackupDumpWizard=Wizard to build the database dump file
BackupZipWizard=Wizard to build the archive of documents directory
SomethingMakeInstallFromWebNotPossible=Installation of external module is not possible from the web interface for the following reason:
SomethingMakeInstallFromWebNotPossible2=For this reason, process to upgrade described here is a manual process only a privileged user may perform.
+InstallModuleFromWebHasBeenDisabledContactUs=Install or development of external modules from the application is currently locked for security purpose. Please contact us if you need to enable this feature.
InstallModuleFromWebHasBeenDisabledByFile=Install of external module from application has been disabled by your administrator. You must ask him to remove the file
%s to allow this feature.
ConfFileMustContainCustom=Installing or building an external module from application need to save the module files into directory
%s . To have this directory processed by Dolibarr, you must setup your
conf/conf.php to add the 2 directive lines:
$dolibarr_main_url_root_alt='/custom'; $dolibarr_main_document_root_alt='%s/custom';
HighlightLinesOnMouseHover=Highlight table lines when mouse move passes over
@@ -2056,6 +2063,8 @@ RemoveSpecialChars=Remove special characters
COMPANY_AQUARIUM_CLEAN_REGEX=Regex filter to clean value (COMPANY_AQUARIUM_CLEAN_REGEX)
COMPANY_DIGITARIA_CLEAN_REGEX=Regex filter to clean value (COMPANY_DIGITARIA_CLEAN_REGEX)
COMPANY_DIGITARIA_UNIQUE_CODE=Duplicate not allowed
+RemoveSpecialWords=Clean certain words when generating sub-accounts for customers or suppliers
+RemoveSpecialWordsHelp=Specify the words to be cleaned before calculating the customer or supplier account. Use a ";" between each word
GDPRContact=Data Protection Officer (DPO, Data Privacy or GDPR contact)
GDPRContactDesc=If you store personal data in your Information System, you can name the contact who is responsible for the General Data Protection Regulation here
HelpOnTooltip=Help text to show on tooltip
@@ -2187,6 +2196,7 @@ ShowProjectLabel=Project Label
PDF_INCLUDE_ALIAS_IN_THIRDPARTY_NAME=Include alias in thirdparty name
THIRDPARTY_ALIAS=Name thirdparty - Alias thirdparty
ALIAS_THIRDPARTY=Alias thirdparty - Name thirdparty
+PDFIn2Languages=Show labels into PDF in 2 different languages
PDF_USE_ALSO_LANGUAGE_CODE=If you want to have some texts in your PDF duplicated in 2 different languages in the same generated PDF, you must set here this second language so generated PDF will contains 2 different languages in same page, the one chosen when generating PDF and this one (only few PDF templates support this). Keep empty for 1 language per PDF.
PDF_USE_A=Gererate PDF documents with format PDF/A instead of defaut format PDF
FafaIconSocialNetworksDesc=Enter here the code of a FontAwesome icon. If you don't know what is FontAwesome, you can use the generic value fa-address-book.
@@ -2268,7 +2278,7 @@ LateWarningAfter="Late" warning after
TemplateforBusinessCards=Template for a business card in different size
InventorySetup= Inventory Setup
ExportUseLowMemoryMode=Use a low memory mode
-ExportUseLowMemoryModeHelp=Use the low memory mode to execute the exec of the dump (compression is done through a pipe instead of into the PHP memory). This method does not allow to check that file is completed and error message can't be reported if it fails.
+ExportUseLowMemoryModeHelp=Use the low memory mode to generate the dump file (compression is done through a pipe instead of into the PHP memory). This method does not allow to check that the file is complete and error message can't be reported if it fails. Use it if you experience not enough memory errors.
ModuleWebhookName = Webhook
ModuleWebhookDesc = Interface to catch dolibarr triggers and send it to an URL
@@ -2310,10 +2320,9 @@ MAIN_MAIL_SMTPS_AUTH_TYPE=Authentification method
UsePassword=Use a password
UseOauth=Use a OAUTH token
Images=Images
-Posts=Posts
MaxNumberOfImagesInGetPost=Max number of images allowed in a HTML field submitted in a form
-MaxNumberOfPostOnPublicPagesByIP=Max number of posts on public pages with an IP Address
-CIDLookupURL=The module brings an URL that can be used by an external tool to get the name of a thirdparty or contact from its phone number. URL to use is:
+MaxNumberOfPostOnPublicPagesByIP=Max number of posts on public pages with the same IP address
+CIDLookupURL=The module brings an URL that can be used by an external tool to get the name of a thirdparty or contact from its phone number. URL to use is:
ScriptIsEmpty=The script is empty
ShowHideTheNRequests=Show/hide the %s SQL request(s)
DefinedAPathForAntivirusCommandIntoSetup=Define a path for an antivirus program into
%s
@@ -2326,5 +2335,12 @@ CssOnList=Css on list pages
HelpCssOnEditDesc=The Css used when editing the field.
Example: "minwiwdth100 maxwidth500 widthcentpercentminusx"
HelpCssOnViewDesc=The Css used when viewing the field.
HelpCssOnListDesc=The Css used when field is inside a list table.
Example: "tdoverflowmax200"
-RECEPTION_PDF_HIDE_ORDERED=Hide the quantity ordered on the generated documents for receptions
+RECEPTION_PDF_HIDE_ORDERED=Hide the quantity ordered on the generated documents for receptions
MAIN_PDF_RECEPTION_DISPLAY_AMOUNT_HT=Show the price on the generated documents for receptions
+WarningDisabled=Warning disabled
+LimitsAndMitigation=Access limits and mitigation
+DesktopsOnly=Desktops only
+DesktopsAndSmartphones=Desktops et smartphones
+AllowOnlineSign=Allow online signing
+AllowExternalDownload=Allow external download (without login, using a shared link)
+DeadlineDayVATSubmission=Deadline day for vat submission on the next month
diff --git a/htdocs/langs/en_US/banks.lang b/htdocs/langs/en_US/banks.lang
index 71a80406ae4..10ba859e71f 100644
--- a/htdocs/langs/en_US/banks.lang
+++ b/htdocs/langs/en_US/banks.lang
@@ -185,4 +185,3 @@ AlreadyOneBankAccount=Already one bank account defined
SEPAXMLPlacePaymentTypeInformationInCreditTransfertransactionInformation=SEPA transfer: 'Payment Type' at 'Credit Transfer' level
SEPAXMLPlacePaymentTypeInformationInCreditTransfertransactionInformationHelp=When generatin a SEPA XML file for Credit transfers, the section "PaymentTypeInformation" can now be placed inside the "CreditTransferTransactionInformation" section (instead of "Payment" section). We strongly recommend to keep this unchecked to place PaymentTypeInformation at Payment level, as all banks will not necessarily accept it at CreditTransferTransactionInformation level. Contact your bank before placing PaymentTypeInformation at CreditTransferTransactionInformation level.
ToCreateRelatedRecordIntoBank=To create missing related bank record
-BanklineExtraFields=Bank Line Extrafields
diff --git a/htdocs/langs/en_US/bills.lang b/htdocs/langs/en_US/bills.lang
index 7ea8295a346..2551f92af53 100644
--- a/htdocs/langs/en_US/bills.lang
+++ b/htdocs/langs/en_US/bills.lang
@@ -13,6 +13,7 @@ BillsStatistics=Customers invoices statistics
BillsStatisticsSuppliers=Vendors invoices statistics
DisabledBecauseDispatchedInBookkeeping=Disabled because invoice was dispatched into bookkeeping
DisabledBecauseNotLastInvoice=Disabled because invoice is not erasable. Some invoices were recorded after this one and it will create holes in the counter.
+DisabledBecauseNotLastSituationInvoice=Disabled because invoice is not erasable. This invoice is not the last one in situation invoice cycle.
DisabledBecauseNotErasable=Disabled because cannot be erased
InvoiceStandard=Standard invoice
InvoiceStandardAsk=Standard invoice
@@ -624,3 +625,4 @@ PaymentRegisteredAndInvoiceSetToPaid=Payment registered and invoice %s set to pa
SendEmailsRemindersOnInvoiceDueDate=Send reminder by email for unpaid invoices
MakePaymentAndClassifyPayed=Record payment
BulkPaymentNotPossibleForInvoice=Bulk payment is not possible for invoice %s (bad type or status)
+MentionVATDebitOptionIsOn=Option to pay tax based on debits
diff --git a/htdocs/langs/en_US/blockedlog.lang b/htdocs/langs/en_US/blockedlog.lang
index a1046827559..9fdef53260f 100644
--- a/htdocs/langs/en_US/blockedlog.lang
+++ b/htdocs/langs/en_US/blockedlog.lang
@@ -14,28 +14,6 @@ OkCheckFingerprintValidityButChainIsKo=Archived log seems valid compared to prev
AddedByAuthority=Stored into remote authority
NotAddedByAuthorityYet=Not yet stored into remote authority
ShowDetails=Show stored details
-logPAYMENT_VARIOUS_CREATE=Payment (not assigned to an invoice) created
-logPAYMENT_VARIOUS_MODIFY=Payment (not assigned to an invoice) modified
-logPAYMENT_VARIOUS_DELETE=Payment (not assigned to an invoice) logical deletion
-logPAYMENT_ADD_TO_BANK=Payment added to bank
-logPAYMENT_CUSTOMER_CREATE=Customer payment created
-logPAYMENT_CUSTOMER_DELETE=Customer payment logical deletion
-logDONATION_PAYMENT_CREATE=Donation payment created
-logDONATION_PAYMENT_DELETE=Donation payment logical deletion
-logBILL_PAYED=Customer invoice paid
-logBILL_UNPAYED=Customer invoice set unpaid
-logBILL_VALIDATE=Customer invoice validated
-logBILL_SENTBYMAIL=Customer invoice send by mail
-logBILL_DELETE=Customer invoice logically deleted
-logMODULE_RESET=Module BlockedLog was disabled
-logMODULE_SET=Module BlockedLog was enabled
-logDON_VALIDATE=Donation validated
-logDON_MODIFY=Donation modified
-logDON_DELETE=Donation logical deletion
-logMEMBER_SUBSCRIPTION_CREATE=Member subscription created
-logMEMBER_SUBSCRIPTION_MODIFY=Member subscription modified
-logMEMBER_SUBSCRIPTION_DELETE=Member subscription logical deletion
-logCASHCONTROL_VALIDATE=Cash desk closing recording
BlockedLogBillDownload=Customer invoice download
BlockedLogBillPreview=Customer invoice preview
BlockedlogInfoDialog=Log Details
@@ -54,4 +32,30 @@ TooManyRecordToScanRestrictFilters=Too many records to scan/analyze. Please rest
RestrictYearToExport=Restrict month / year to export
BlockedLogEnabled=System to track events into unalterable logs has been enabled
BlockedLogDisabled=System to track events into unalterable logs has been disabled after some recording were done. We saved a special Fingerprint to track the chain as broken
-BlockedLogDisabledBis=System to track events into unalterable logs has been disabled. This is possible because no record were done yet.
\ No newline at end of file
+BlockedLogDisabledBis=System to track events into unalterable logs has been disabled. This is possible because no record were done yet.
+
+## logTypes
+logBILL_DELETE=Customer invoice logically deleted
+logBILL_PAYED=Customer invoice paid
+logBILL_SENTBYMAIL=Customer invoice send by mail
+logBILL_UNPAYED=Customer invoice set unpaid
+logBILL_VALIDATE=Customer invoice validated
+logCASHCONTROL_VALIDATE=Cash desk closing recording
+logDOC_DOWNLOAD=Download of a validated document in order to print or send
+logDOC_PREVIEW=Preview of a validated document in order to print or download
+logDONATION_PAYMENT_CREATE=Donation payment created
+logDONATION_PAYMENT_DELETE=Donation payment logical deletion
+logDON_DELETE=Donation logical deletion
+logDON_MODIFY=Donation modified
+logDON_VALIDATE=Donation validated
+logMEMBER_SUBSCRIPTION_CREATE=Member subscription created
+logMEMBER_SUBSCRIPTION_DELETE=Member subscription logical deletion
+logMEMBER_SUBSCRIPTION_MODIFY=Member subscription modified
+logMODULE_RESET=Module BlockedLog was disabled
+logMODULE_SET=Module BlockedLog was enabled
+logPAYMENT_ADD_TO_BANK=Payment added to bank
+logPAYMENT_CUSTOMER_CREATE=Customer payment created
+logPAYMENT_CUSTOMER_DELETE=Customer payment logical deletion
+logPAYMENT_VARIOUS_CREATE=Payment (not assigned to an invoice) created
+logPAYMENT_VARIOUS_DELETE=Payment (not assigned to an invoice) logical deletion
+logPAYMENT_VARIOUS_MODIFY=Payment (not assigned to an invoice) modified
diff --git a/htdocs/langs/en_US/categories.lang b/htdocs/langs/en_US/categories.lang
index af816e362e4..0493968798e 100644
--- a/htdocs/langs/en_US/categories.lang
+++ b/htdocs/langs/en_US/categories.lang
@@ -42,6 +42,7 @@ MemberHasNoCategory=This member is not in any tags/categories
ContactHasNoCategory=This contact is not in any tags/categories
ProjectHasNoCategory=This project is not in any tags/categories
ClassifyInCategory=Add to tag/category
+RemoveCategory=Remove category
NotCategorized=Without tag/category
CategoryExistsAtSameLevel=This category already exists with this ref
ContentsVisibleByAllShort=Contents visible by all
@@ -87,7 +88,7 @@ DeleteFromCat=Remove from tags/category
ExtraFieldsCategories=Complementary attributes
CategoriesSetup=Tags/categories setup
CategorieRecursiv=Link with parent tag/category automatically
-CategorieRecursivHelp=If option is on, when you add a product into a subcategory, product will also be added into the parent category.
+CategorieRecursivHelp=If option is on, when you add an object into a subcategory, the object will also be added into the parent categories.
AddProductServiceIntoCategory=Add the following product/service
AddCustomerIntoCategory=Assign category to customer
AddSupplierIntoCategory=Assign category to supplier
diff --git a/htdocs/langs/en_US/commercial.lang b/htdocs/langs/en_US/commercial.lang
index 21d282cd794..eba95a8aabb 100644
--- a/htdocs/langs/en_US/commercial.lang
+++ b/htdocs/langs/en_US/commercial.lang
@@ -74,8 +74,16 @@ StatusProsp=Prospect status
DraftPropals=Draft commercial proposals
NoLimit=No limit
ToOfferALinkForOnlineSignature=Link for online signature
-WelcomeOnOnlineSignaturePage=Welcome to the page to accept commercial proposals from %s
-ThisScreenAllowsYouToSignDocFrom=This screen allow you to accept and sign, or refuse, a quote/commercial proposal
-ThisIsInformationOnDocumentToSign=This is information on document to accept or refuse
+WelcomeOnOnlineSignaturePageProposal=Welcome to the page to accept commercial proposals from %s
+WelcomeOnOnlineSignaturePageContract=Welcome to %s Contract PDF Signing Page
+WelcomeOnOnlineSignaturePageFichinter=Welcome to %s Intervention PDF Signing Page
+ThisScreenAllowsYouToSignDocFromProposal=This screen allow you to accept and sign, or refuse, a quote/commercial proposal
+ThisScreenAllowsYouToSignDocFromContract=This screen allow you to sign contract on PDF format online.
+ThisScreenAllowsYouToSignDocFromFichinter=This screen allow you to sign intervention on PDF format online.
+ThisIsInformationOnDocumentToSignProposal=This is information on document to accept or refuse
+ThisIsInformationOnDocumentToSignContract=This is information on contract to sign
+ThisIsInformationOnDocumentToSignFichinter=This is information on intervention to sign
SignatureProposalRef=Signature of quote/commercial proposal %s
+SignatureContractRef=Signature of contract %s
+SignatureFichinterRef=Signature of intervention %s
FeatureOnlineSignDisabled=Feature for online signing disabled or document generated before the feature was enabled
diff --git a/htdocs/langs/en_US/cron.lang b/htdocs/langs/en_US/cron.lang
index d9bdd2691eb..19572c361ad 100644
--- a/htdocs/langs/en_US/cron.lang
+++ b/htdocs/langs/en_US/cron.lang
@@ -26,7 +26,7 @@ CronCommand=Command
CronList=Scheduled jobs
CronDelete=Delete scheduled jobs
CronConfirmDelete=Are you sure you want to delete these scheduled jobs?
-CronExecute=Launch scheduled job
+CronExecute=Launch now
CronConfirmExecute=Are you sure you want to execute these scheduled jobs now?
CronInfo=Scheduled job module allows to schedule jobs to execute them automatically. Jobs can also be started manually.
CronTask=Job
@@ -58,7 +58,7 @@ CronNote=Comment
CronFieldMandatory=Fields %s is mandatory
CronErrEndDateStartDt=End date cannot be before start date
StatusAtInstall=Status at module installation
-CronStatusActiveBtn=Schedule
+CronStatusActiveBtn=Enable scheduling
CronStatusInactiveBtn=Disable
CronTaskInactive=This job is disabled (not scheduled)
CronId=Id
@@ -84,11 +84,15 @@ MakeLocalDatabaseDumpShort=Local database backup
MakeLocalDatabaseDump=Create a local database dump. Parameters are: compression ('gz' or 'bz' or 'none'), backup type ('mysql', 'pgsql', 'auto'), 1, 'auto' or filename to build, number of backup files to keep
MakeSendLocalDatabaseDumpShort=Send local database backup
MakeSendLocalDatabaseDump=Send local database backup by email. Parameters are: to, from, subject, message, filename (Name of file sent), filter ('sql' for backup of database only)
+BackupIsTooLargeSend=Sorry, last backup file is too large to be send by email
CleanUnfinishedCronjobShort=Clean unfinished cronjob
CleanUnfinishedCronjob=Clean cronjob stuck in processing when the process is no longer running
WarningCronDelayed=Attention, for performance purpose, whatever is next date of execution of enabled jobs, your jobs may be delayed to a maximum of %s hours, before being run.
DATAPOLICYJob=Data cleaner and anonymizer
JobXMustBeEnabled=Job %s must be enabled
+EmailIfError=Email for warning on error
+ErrorInBatch=Error when running the job %s
+
# Cron Boxes
LastExecutedScheduledJob=Last executed scheduled job
NextScheduledJobExecute=Next scheduled job to execute
diff --git a/htdocs/langs/en_US/dict.lang b/htdocs/langs/en_US/dict.lang
index 0524cf1ca18..00ab5a05f24 100644
--- a/htdocs/langs/en_US/dict.lang
+++ b/htdocs/langs/en_US/dict.lang
@@ -250,7 +250,9 @@ CountryMF=Saint Martin
##### Civilities #####
CivilityMME=Mrs.
+CivilityMMEShort=Mrs.
CivilityMR=Mr.
+CivilityMRShort=Mr.
CivilityMLE=Ms.
CivilityMTRE=Master
CivilityDR=Doctor
diff --git a/htdocs/langs/en_US/ecm.lang b/htdocs/langs/en_US/ecm.lang
index 494a6c55164..5ced4ec5617 100644
--- a/htdocs/langs/en_US/ecm.lang
+++ b/htdocs/langs/en_US/ecm.lang
@@ -5,6 +5,7 @@ ECMSectionManual=Manual directory
ECMSectionAuto=Automatic directory
ECMSectionsManual=Manual tree
ECMSectionsAuto=Automatic tree
+ECMSectionsMedias=Medias tree
ECMSections=Directories
ECMRoot=ECM Root
ECMNewSection=New directory
@@ -16,7 +17,9 @@ ECMNbOfFilesInSubDir=Number of files in sub-directories
ECMCreationUser=Creator
ECMArea=DMS/ECM area
ECMAreaDesc=The DMS/ECM (Document Management System / Electronic Content Management) area allows you to save, share and search quickly all kind of documents in Dolibarr.
-ECMAreaDesc2=* Automatic directories are filled automatically when adding documents from card of an element.
* Manual directories can be used to save documents not linked to a particular element.
+ECMAreaDesc2a=* Manual directories can be used to save documents not linked to a particular element.
+ECMAreaDesc2b=* Automatic directories are filled automatically when adding documents from the page of an element.
+ECMAreaDesc3=* Medias directories are files into the subdirectory
/medias of documents directory, readable by everybody with no need to be logged and no need to have the file shared explicitely. It is used to store image files from emailing or website module.
ECMSectionWasRemoved=Directory
%s has been deleted.
ECMSectionWasCreated=Directory
%s has been created.
ECMSearchByKeywords=Search by keywords
diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang
index 2560f248a9b..1625f580305 100644
--- a/htdocs/langs/en_US/errors.lang
+++ b/htdocs/langs/en_US/errors.lang
@@ -14,6 +14,7 @@ ErrorLoginAlreadyExists=Login %s already exists.
ErrorGroupAlreadyExists=Group %s already exists.
ErrorEmailAlreadyExists=Email %s already exists.
ErrorRecordNotFound=Record not found.
+ErrorRecordNotFoundShort=Not found
ErrorFailToCopyFile=Failed to copy file '
%s ' into '
%s '.
ErrorFailToCopyDir=Failed to copy directory '
%s ' into '
%s '.
ErrorFailToRenameFile=Failed to rename file '
%s ' into '
%s '.
@@ -48,6 +49,7 @@ ErrorBadImageFormat=Image file has not a supported format (Your PHP does not sup
ErrorBadDateFormat=Value '%s' has wrong date format
ErrorWrongDate=Date is not correct!
ErrorFailedToWriteInDir=Failed to write in directory %s
+ErrorFailedToBuildArchive=Failed to build archive file %s
ErrorFoundBadEmailInFile=Found incorrect email syntax for %s lines in file (example line %s with email=%s)
ErrorUserCannotBeDelete=User cannot be deleted. Maybe it is associated to Dolibarr entities.
ErrorFieldsRequired=Some required fields have been left blank.
@@ -95,6 +97,7 @@ ErrorWrongValueForField=Field
%s : '
%s ' does not match regex rule <
ErrorHtmlInjectionForField=Field
%s : The value '
%s ' contains a malicious data not allowed
ErrorFieldValueNotIn=Field
%s : '
%s ' is not a value found in field
%s of
%s
ErrorFieldRefNotIn=Field
%s : '
%s ' is not a
%s existing ref
+ErrorMultipleRecordFoundFromRef=Several record found when searching from ref
%s . No way to know which ID to use.
ErrorsOnXLines=%s errors found
ErrorFileIsInfectedWithAVirus=The antivirus program was not able to validate the file (file might be infected by a virus)
ErrorNumRefModel=A reference exists into database (%s) and is not compatible with this numbering rule. Remove record or renamed reference to activate this module.
@@ -295,6 +298,9 @@ ErrorThisPaymentModeIsNotSepa=This payment mode is not a bank account
ErrorStripeCustomerNotFoundCreateFirst=Stripe customer is not set for this thirdparty (or set to a value deleted on Stripe side). Create (or re-attach) it first.
ErrorCharPlusNotSupportedByImapForSearch=IMAP search is not able to search into sender or recipient for a string containing the character +
ErrorTableNotFound=Table
%s not found
+ErrorValueForTooLow=Value for
%s is too low
+ErrorValueCantBeNull=Value for
%s can't be null
+ErrorDateOfMovementLowerThanDateOfFileTransmission=The date of the bank transaction can't be lower than the date of the file transmission
# Warnings
WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Your PHP parameter upload_max_filesize (%s) is higher than PHP parameter post_max_size (%s). This is not a consistent setup.
@@ -308,7 +314,7 @@ WarningConfFileMustBeReadOnly=Warning, your config file (
htdocs/conf/conf.php
WarningsOnXLines=Warnings on %s source record(s)
WarningNoDocumentModelActivated=No model, for document generation, has been activated. A model will be chosen by default until you check your module setup.
WarningLockFileDoesNotExists=Warning, once setup is finished, you must disable the installation/migration tools by adding a file install.lock into directory %s . Omitting the creation of this file is a grave security risk.
-WarningUntilDirRemoved=All security warnings (visible by admin users only) will remain active as long as the vulnerability is present (or that constant MAIN_REMOVE_INSTALL_WARNING is added in Setup->Other Setup).
+WarningUntilDirRemoved=This security warning will remain active as long as the vulnerability is present.
WarningCloseAlways=Warning, closing is done even if amount differs between source and target elements. Enable this feature with caution.
WarningUsingThisBoxSlowDown=Warning, using this box slow down seriously all pages showing the box.
WarningClickToDialUserSetupNotComplete=Setup of ClickToDial information for your user are not complete (see tab ClickToDial onto your user card).
diff --git a/htdocs/langs/en_US/eventorganization.lang b/htdocs/langs/en_US/eventorganization.lang
index b4179b04be6..f9531260c97 100644
--- a/htdocs/langs/en_US/eventorganization.lang
+++ b/htdocs/langs/en_US/eventorganization.lang
@@ -122,7 +122,7 @@ ViewAndVote = View and vote for suggested events
PublicAttendeeSubscriptionGlobalPage = Public link for registration to the event
PublicAttendeeSubscriptionPage = Public link for registration to this event only
MissingOrBadSecureKey = The security key is invalid or missing
-EvntOrgWelcomeMessage = This form allows you to register as a new participant to the event : %s
+EvntOrgWelcomeMessage = This form allows you to register as a new participant to the event
EvntOrgDuration = This conference starts on %s and ends on %s.
ConferenceAttendeeFee = Conference attendee fee for the event : '%s' occurring from %s to %s.
BoothLocationFee = Booth location for the event : '%s' occurring from %s to %s
@@ -132,7 +132,7 @@ LabelOfconference=Conference label
ConferenceIsNotConfirmed=Registration not available, conference is not confirmed yet
DateMustBeBeforeThan=%s must be before %s
DateMustBeAfterThan=%s must be after %s
-
+MaxNbOfAttendeesReached=The maximum number of participants has been reached
NewSubscription=Registration
OrganizationEventConfRequestWasReceived=Your suggestion for a conference has been received
OrganizationEventBoothRequestWasReceived=Your request for a booth has been received
@@ -157,7 +157,7 @@ VoteOk = Your vote has been accepted.
AlreadyVoted = You have already voted for this event.
VoteError = An error has occurred during the vote, please try again.
-SubscriptionOk = Your registration has been validated
+SubscriptionOk=Your registration has been recorded
ConfAttendeeSubscriptionConfirmation = Confirmation of your subscription to an event
Attendee = Attendee
PaymentConferenceAttendee = Conference attendee payment
@@ -165,6 +165,7 @@ PaymentBoothLocation = Booth location payment
DeleteConferenceOrBoothAttendee=Remove attendee
RegistrationAndPaymentWereAlreadyRecorder=A registration and a payment were already recorded for the email %s
EmailAttendee=Attendee email
+EmailCompany=Company email
EmailCompanyForInvoice=Company email (for invoice, if different of attendee email)
ErrorSeveralCompaniesWithEmailContactUs=Several companies with this email has been found so we can't validate automaticaly your registration. Please contact us at %s for a manual validation
ErrorSeveralCompaniesWithNameContactUs=Several companies with this name has been found so we can't validate automaticaly your registration. Please contact us at %s for a manual validation
diff --git a/htdocs/langs/en_US/expensereports.lang b/htdocs/langs/en_US/expensereports.lang
index 6a305e43ad7..f3b5f07f241 100644
--- a/htdocs/langs/en_US/expensereports.lang
+++ b/htdocs/langs/en_US/expensereports.lang
@@ -1,3 +1,160 @@
+# Dolibarr language file - Source file is en_US - expensereports.lang
+# copied from trips.lang
+
+AUTHOR=Recorded by
+AUTHORPAIEMENT=Paid by
+AddTrip=Create expense report
+AllExpenseReport=All type of expense report
+AllExpenseReports=All expense reports
+AnyOtherInThisListCanValidate=Person to be informed for validating the request.
+AttachTheNewLineToTheDocument=Attach the line to an uploaded document
+AucuneLigne=There is no expense report declared yet
+BrouillonnerTrip=Move back expense report to status "Draft"
+byEX_DAY=by day (limitation to %s)
+byEX_EXP=by line (limitation to %s)
+byEX_MON=by month (limitation to %s)
+byEX_YEA=by year (limitation to %s)
+CANCEL_USER=Deleted by
+CarCategory=Vehicle category
+ClassifyRefunded=Classify 'Refunded'
+CompanyVisited=Company/organization visited
+ConfirmBrouillonnerTrip=Are you sure you want to move this expense report to status "Draft"?
+ConfirmCancelTrip=Are you sure you want to cancel this expense report?
+ConfirmCloneExpenseReport=Are you sure you want to clone this expense report ?
+ConfirmDeleteTrip=Are you sure you want to delete this expense report?
+ConfirmPaidTrip=Are you sure you want to change status of this expense report to "Paid"?
+ConfirmRefuseTrip=Are you sure you want to deny this expense report?
+ConfirmSaveTrip=Are you sure you want to validate this expense report?
+ConfirmValideTrip=Are you sure you want to approve this expense report?
+DATE_CANCEL=Cancelation date
+DATE_PAIEMENT=Payment date
+DATE_REFUS=Deny date
+DATE_SAVE=Validation date
+DefaultCategoryCar=Default transportation mode
+DefaultRangeNumber=Default range number
+DeleteTrip=Delete expense report
+ErrorDoubleDeclaration=You have declared another expense report into a similar date range.
+Error_EXPENSEREPORT_ADDON_NotDefined=Error, the rule for expense report numbering ref was not defined into setup of module 'Expense Report'
+ExpenseRangeOffset=Offset amount: %s
+expenseReportCatDisabled=Category disabled - see the c_exp_tax_cat dictionary
+expenseReportCoef=Coefficient
+expenseReportCoefUndefined=(value not defined)
+expenseReportOffset=Offset
+expenseReportPrintExample=offset + (d x coef) = %s
+expenseReportRangeDisabled=Range disabled - see the c_exp_tax_range dictionay
+expenseReportRangeFromTo=from %d to %d
+expenseReportRangeMoreThan=more than %d
+expenseReportTotalForFive=Example with d = 5
+ExpenseReportApplyTo=Apply to
+ExpenseReportApproved=An expense report was approved
+ExpenseReportApprovedMessage=The expense report %s was approved. - User: %s - Approved by: %s Click here to show the expense report: %s
+ExpenseReportCanceled=An expense report was canceled
+ExpenseReportCanceledMessage=The expense report %s was canceled. - User: %s - Canceled by: %s - Motive for cancellation: %s Click here to show the expense report: %s
+ExpenseReportConstraintViolationError=Max amount exceeded (rule %s): %s is higher than %s (Exceeding forbidden)
+ExpenseReportConstraintViolationWarning=Max amount exceeded (rule %s): %s is higher than %s (Exceeding authorized)
+ExpenseReportDateEnd=Date end
+ExpenseReportDateStart=Date start
+ExpenseReportDomain=Domain to apply
+ExpenseReportIkDesc=You can modify the calculation of kilometers expense by category and range who they are previously defined. d is the distance in kilometers
+ExpenseReportLimitAmount=Max amount
+ExpenseReportLimitOn=Limit on
+ExpenseReportLine=Expense report line
+ExpenseReportPaid=An expense report was paid
+ExpenseReportPaidMessage=The expense report %s was paid. - User: %s - Paid by: %s Click here to show the expense report: %s
+ExpenseReportPayment=Expense report payment
+ExpenseReportRef=Ref. expense report
+ExpenseReportRefused=An expense report was refused
+ExpenseReportRefusedMessage=The expense report %s was refused. - User: %s - Refused by: %s - Motive for refusal: %s Click here to show the expense report: %s
+ExpenseReportRestrictive=Exceeding forbidden
+ExpenseReportRuleErrorOnSave=Error: %s
+ExpenseReportRuleSave=Expense report rule saved
+ExpenseReportRulesDesc=You can define max amount rules for expense reports. These rules will be applied when a new expense is added to an expense report
+ExpenseReportWaitingForApproval=A new expense report has been submitted for approval
+ExpenseReportWaitingForApprovalMessage=A new expense report has been submitted and is waiting for approval. - User: %s - Period: %s Click here to validate: %s
+ExpenseReportWaitingForReApproval=An expense report has been submitted for re-approval
+ExpenseReportWaitingForReApprovalMessage=An expense report has been submitted and is waiting for re-approval. The %s, you refused to approve the expense report for this reason: %s. A new version has been proposed and waiting for your approval. - User: %s - Period: %s Click here to validate: %s
+ExpenseReportsIk=Configuration of mileage charges
+ExpenseReportsRules=Expense report rules
+ExpenseReportsToApprove=Expense reports to approve
+ExpenseReportsToPay=Expense reports to pay
+ExpensesArea=Expense reports area
+FeesKilometersOrAmout=Amount or kilometers
+LastExpenseReports=Latest %s expense reports
+ListOfFees=List of fees
+ListOfTrips=List of expense reports
+ListToApprove=Waiting for approval
+ListTripsAndExpenses=List of expense reports
+MOTIF_CANCEL=Reason
+MOTIF_REFUS=Reason
+ModePaiement=Payment mode
+NewTrip=New expense report
+nolimitbyEX_DAY=by day (no limitation)
+nolimitbyEX_EXP=by line (no limitation)
+nolimitbyEX_MON=by month (no limitation)
+nolimitbyEX_YEA=by year (no limitation)
+NoTripsToExportCSV=No expense report to export for this period.
+NOT_AUTHOR=You are not the author of this expense report. Operation cancelled.
+OnExpense=Expense line
+PDFStandardExpenseReports=Standard template to generate a PDF document for expense report
+PaidTrip=Pay an expense report
+REFUSEUR=Denied by
+RangeIk=Mileage range
+RangeNum=Range %d
+SaveTrip=Validate expense report
+ShowExpenseReport=Show expense report
+ShowTrip=Show expense report
+TripCard=Expense report card
+TripId=Id expense report
+TripNDF=Informations expense report
+TripSociete=Information company
+Trips=Expense reports
+TripsAndExpenses=Expenses reports
+TripsAndExpensesStatistics=Expense reports statistics
+TypeFees=Types of fees
+UploadANewFileNow=Upload a new document now
+VALIDATOR=User responsible for approval
+VALIDOR=Approved by
+ValidateAndSubmit=Validate and submit for approval
+ValidatedWaitingApproval=Validated (waiting for approval)
+ValideTrip=Approve expense report
+
+## Dictionary
+EX_BRE=Breakfast
+EX_CAM=CV maintenance and repair
+EX_CAM_VP=PV maintenance and repair
+EX_CAR=Car rental
+EX_CUR=Customers receiving
+EX_DOC=Documentation
+EX_EMM=Employees meal
+EX_FUE=Fuel CV
+EX_FUE_VP=Fuel PV
+EX_GUM=Guests meal
+EX_HOT=Hotel
+EX_IND=Indemnity transportation subscription
+EX_KME=Mileage costs
+EX_OTR=Other receiving
+EX_PAR=Parking CV
+EX_PAR_VP=Parking PV
+EX_POS=Postage
+EX_SUM=Maintenance supply
+EX_SUO=Office supplies
+EX_TAX=Various Taxes
+EX_TOL=Toll CV
+EX_TOL_VP=Toll PV
+TF_BUS=Bus
+TF_CAR=Car
+TF_ESSENCE=Fuel
+TF_HOTEL=Hotel
+TF_LUNCH=Lunch
+TF_METRO=Metro
+TF_OTHER=Other
+TF_PEAGE=Toll
+TF_TAXI=Taxi
+TF_TRAIN=Train
+TF_TRIP=Transportation
+
+
+## add new (not from trips.lang)
ExpenseReportPayments=Expense report payments
#
# error
diff --git a/htdocs/langs/en_US/hrm.lang b/htdocs/langs/en_US/hrm.lang
index cbd3dc91663..966f2399a13 100644
--- a/htdocs/langs/en_US/hrm.lang
+++ b/htdocs/langs/en_US/hrm.lang
@@ -26,8 +26,8 @@ HRM_DEFAULT_SKILL_DESCRIPTION=Default description of ranks when skill is created
deplacement=Shift
DateEval=Evaluation date
JobCard=Job card
-JobPosition=Job
-JobsPosition=Jobs
+JobPosition=Job profile
+JobsPosition=Job profiles
NewSkill=New Skill
SkillType=Skill type
Skilldets=List of ranks for this skill
diff --git a/htdocs/langs/en_US/install.lang b/htdocs/langs/en_US/install.lang
index ad8217153be..d0c841fe802 100644
--- a/htdocs/langs/en_US/install.lang
+++ b/htdocs/langs/en_US/install.lang
@@ -214,3 +214,4 @@ Loaded=Loaded
FunctionTest=Function test
NodoUpgradeAfterDB=No action requested by external modules after upgrade of database
NodoUpgradeAfterFiles=No action requested by external modules after upgrade of files or directories
+MigrationContractLineRank=Migrate Contract Line to use Rank (and enable Reorder)
diff --git a/htdocs/langs/en_US/interventions.lang b/htdocs/langs/en_US/interventions.lang
index 767688a4ce8..c93a5c4db09 100644
--- a/htdocs/langs/en_US/interventions.lang
+++ b/htdocs/langs/en_US/interventions.lang
@@ -68,4 +68,4 @@ ConfirmReopenIntervention=Are you sure you want to open back the intervention %s? This will change code in PHP class but also remove column from table definition of object.
NotNull=Not NULL
NotNullDesc=1=Set database to NOT NULL, 0=Allow null values, -1=Allow null values by forcing value to NULL if empty ('' or 0)
@@ -84,13 +86,14 @@ IsAMeasure=Is a measure
DirScanned=Directory scanned
NoTrigger=No trigger
NoWidget=No widget
-GoToApiExplorer=API explorer
+ApiExplorer=API explorer
ListOfMenusEntries=List of menu entries
ListOfDictionariesEntries=List of dictionaries entries
ListOfPermissionsDefined=List of defined permissions
SeeExamples=See examples here
EnabledDesc=Condition to have this field active. Examples: 1 isModEnabled('MAIN_MODULE_MYMODULE') getDolGlobalString('MYMODULE_OPTION')==2
-VisibleDesc=Is the field visible ? (Examples: 0=Never visible, 1=Visible on list and create/update/view forms, 2=Visible on list only, 3=Visible on create/update/view form only (not list), 4=Visible on list and update/view form only (not create), 5=Visible on list end view form only (not create, not update). Using a negative value means field is not shown by default on list but can be selected for viewing). It can be an expression, for example: preg_match('/public/', $_SERVER['PHP_SELF'])?0:1 $user->hasRight('holiday', 'define_holiday')?1:5
+VisibleDesc=Is the field visible ? (Examples: 0=Never visible, 1=Visible on list and create/update/view forms, 2=Visible on list only, 3=Visible on create/update/view form only (not list), 4=Visible on list and update/view form only (not create), 5=Visible on list end view form only (not create, not update). Using a negative value means field is not shown by default on list but can be selected for viewing).
+ItCanBeAnExpression=It can be an expression. Example: preg_match('/public/', $_SERVER['PHP_SELF'])?0:1 $user->hasRight('holiday', 'define_holiday')?1:5
DisplayOnPdfDesc=Display this field on compatible PDF documents, you can manage position with "Position" field.For document : 0 = not displayed 1 = display 2 = display only if not emptyFor document lines : 0 = not displayed 1 = displayed in a column 3 = display in line description column after the description 4 = display in description column after the description only if not empty
DisplayOnPdf=On PDF
IsAMeasureDesc=Can the value of field be cumulated to get a total into list? (Examples: 1 or 0)
@@ -144,13 +147,15 @@ CSSViewClass=CSS for read form
CSSListClass=CSS for list
NotEditable=Not editable
ForeignKey=Foreign key
-TypeOfFieldsHelp=Type of fields: varchar(99), double(24,8), real, text, html, datetime, timestamp, integer, integer:ClassName:relativepath/to/classfile.class.php[:1[:filter]] '1' means we add a + button after the combo to create the record 'filter' is a sql condition, example: 'status=1 AND fk_user=__USER_ID__ AND entity IN (__SHARED_ENTITIES__)'
+ForeignKeyDesc=If the value of this field must be guaranted to exists into another table. Enter here a value matching syntax: tablename.parentfieldtocheck
+TypeOfFieldsHelp=Example: varchar(99), double(24,8), real, text, html, datetime, timestamp, integer, integer:ClassName:relativepath/to/classfile.class.php[:1[:filter]] '1' means we add a + button after the combo to create the record 'filter' is a sql condition, example: 'status=1 AND fk_user=__USER_ID__ AND entity IN (__SHARED_ENTITIES__)'
+TypeOfFieldsHelpIntro=This is the type of the field/attribute.
AsciiToHtmlConverter=Ascii to HTML converter
AsciiToPdfConverter=Ascii to PDF converter
TableNotEmptyDropCanceled=Table not empty. Drop has been canceled.
ModuleBuilderNotAllowed=The module builder is available but not allowed to your user.
ImportExportProfiles=Import and export profiles
-ValidateModBuilderDesc=Set this to 1 if you want to have the method $this->validateField() of object being called to validate the content of the field during insert or upadate. Set 0 if there is no validation required.
+ValidateModBuilderDesc=Set this to 1 if you want to have the method $this->validateField() of object being called to validate the content of the field during insert or update. Set 0 if there is no validation required.
WarningDatabaseIsNotUpdated=Warning: The database is not updated automatically, you must destroy tables and disable-enable the module to have tables recreated
LinkToParentMenu=Parent menu (fk_xxxxmenu)
ListOfTabsEntries=List of tab entries
diff --git a/htdocs/langs/en_US/mrp.lang b/htdocs/langs/en_US/mrp.lang
index 44fb4457999..82196b584bd 100644
--- a/htdocs/langs/en_US/mrp.lang
+++ b/htdocs/langs/en_US/mrp.lang
@@ -114,3 +114,4 @@ MoChildGenerate=Generate Child Mo
ParentMo=MO Parent
MOChild=MO Child
BomCantAddChildBom=The nomenclature %s is already present in the tree leading to the nomenclature %s
+BOMNetNeeds = BOM Net Needs
diff --git a/htdocs/langs/en_US/other.lang b/htdocs/langs/en_US/other.lang
index 46cb61ff3f0..d5701ba2224 100644
--- a/htdocs/langs/en_US/other.lang
+++ b/htdocs/langs/en_US/other.lang
@@ -181,6 +181,7 @@ SizeUnitfoot=foot
SizeUnitpoint=point
BugTracker=Bug tracker
SendNewPasswordDesc=This form allows you to request a new password. It will be sent to your email address. Change will become effective once you click on the confirmation link in the email. Check your inbox.
+EnterNewPasswordHere=Enter your new password here
BackToLoginPage=Back to login page
AuthenticationDoesNotAllowSendNewPassword=Authentication mode is %s . In this mode, Dolibarr can't know nor change your password. Contact your system administrator if you want to change your password.
EnableGDLibraryDesc=Install or enable GD library on your PHP installation to use this option.
diff --git a/htdocs/langs/en_US/partnership.lang b/htdocs/langs/en_US/partnership.lang
index 6490bf23d8b..89a1bfa742d 100644
--- a/htdocs/langs/en_US/partnership.lang
+++ b/htdocs/langs/en_US/partnership.lang
@@ -20,6 +20,7 @@ ModulePartnershipName=Partnership management
PartnershipDescription=Module Partnership management
PartnershipDescriptionLong= Module Partnership management
Partnership=Partnership
+Partnerships=Partnerships
AddPartnership=Add partnership
CancelPartnershipForExpiredMembers=Partnership: Cancel partnership of members with expired subscriptions
PartnershipCheckBacklink=Partnership: Check referring backlink
@@ -49,8 +50,8 @@ PublicFormRegistrationPartnerDesc=Dolibarr can provide you a public URL/website
# Object
#
DeletePartnership=Delete a partnership
-PartnershipDedicatedToThisThirdParty=Partnership dedicated to this third party
-PartnershipDedicatedToThisMember=Partnership dedicated to this member
+PartnershipDedicatedToThisThirdParty=Partnership dedicated to this third party
+PartnershipDedicatedToThisMember=Partnership dedicated to this member
DatePartnershipStart=Start date
DatePartnershipEnd=End date
ReasonDecline=Decline reason
diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang
index bf2dabf5a0a..3d5048d99a9 100644
--- a/htdocs/langs/en_US/products.lang
+++ b/htdocs/langs/en_US/products.lang
@@ -399,7 +399,7 @@ ActionAvailableOnVariantProductOnly=Action only available on the variant of prod
ProductsPricePerCustomer=Product prices per customers
ProductSupplierExtraFields=Additional Attributes (Supplier Prices)
DeleteLinkedProduct=Delete the child product linked to the combination
-AmountUsedToUpdateWAP=Amount to use to update the Weighted Average Price
+AmountUsedToUpdateWAP=Unit amount to use to update the Weighted Average Price
PMPValue=Weighted average price
PMPValueShort=WAP
mandatoryperiod=Mandatory periods
@@ -416,6 +416,7 @@ ProductsMergeSuccess=Products have been merged
ErrorsProductsMerge=Errors in products merge
SwitchOnSaleStatus=Switch on sale status
SwitchOnPurchaseStatus=Switch on purchase status
+UpdatePrice=Increase/decrease customer price
StockMouvementExtraFields= Extra Fields (stock mouvement)
InventoryExtraFields= Extra Fields (inventory)
ScanOrTypeOrCopyPasteYourBarCodes=Scan or type or copy/paste your barcodes
diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang
index 037ddd1c4e1..67dfb75a242 100644
--- a/htdocs/langs/en_US/projects.lang
+++ b/htdocs/langs/en_US/projects.lang
@@ -37,7 +37,9 @@ OpportunitiesStatusForOpenedProjects=Leads amount of open projects by status
OpportunitiesStatusForProjects=Leads amount of projects by status
ShowProject=Show project
ShowTask=Show task
+SetThirdParty=Set third party
SetProject=Set project
+OutOfProject=Out of project
NoProject=No project defined or owned
NbOfProjects=Number of projects
NbOfTasks=Number of tasks
@@ -238,7 +240,7 @@ OppStatusPENDING=Pending
OppStatusWON=Won
OppStatusLOST=Lost
Budget=Budget
-AllowToLinkFromOtherCompany=Allow to link project from other companySupported values: - Keep empty: Can link any project of the company (default) - "all": Can link any projects, even projects of other companies - A list of third-party ids separated by commas: can link all projects of these third partys (Example: 123,4795,53)
+AllowToLinkFromOtherCompany=Allow to link an element with a project of other companySupported values: - Keep empty: Can link elements with any projects in the same company (default) - "all": Can link elements with any projects, even projects of other companies - A list of third-party ids separated by commas: can link elements with any projects of these third partys (Example: 123,4795,53)
LatestProjects=Latest %s projects
LatestModifiedProjects=Latest %s modified projects
OtherFilteredTasks=Other filtered tasks
@@ -282,7 +284,7 @@ ProfitIsCalculatedWith=Profit is calculated using
AddPersonToTask=Add also to tasks
UsageOrganizeEvent=Usage: Event Organization
PROJECT_CLASSIFY_CLOSED_WHEN_ALL_TASKS_DONE=Classify project as closed when all its tasks are completed (100%% progress)
-PROJECT_CLASSIFY_CLOSED_WHEN_ALL_TASKS_DONE_help=Note: existing projects with all tasks at 100 %% progress won't be affected: you will have to close them manually. This option only affects open projects.
+PROJECT_CLASSIFY_CLOSED_WHEN_ALL_TASKS_DONE_help=Note: existing projects with all tasks already set to a progress of 100 %% won't be affected: you will have to close them manually. This option only affects open projects.
SelectLinesOfTimeSpentToInvoice=Select lines of time spent that are unbilled, then bulk action "Generate Invoice" to bill them
ProjectTasksWithoutTimeSpent=Project tasks without time spent
FormForNewLeadDesc=Thanks to fill the following form to contact us. You can also send us an email directly to %s .
diff --git a/htdocs/langs/en_US/propal.lang b/htdocs/langs/en_US/propal.lang
index aa5ef73f7dc..7e9afd4e27c 100644
--- a/htdocs/langs/en_US/propal.lang
+++ b/htdocs/langs/en_US/propal.lang
@@ -103,11 +103,15 @@ IdProposal=Proposal ID
IdProduct=Product ID
LineBuyPriceHT=Buy Price Amount net of tax for line
SignPropal=Accept proposal
+SignContract=Sign contract
+SignFichinter=Sign intervention
RefusePropal=Refuse proposal
Sign=Sign
NoSign=Refuse
PropalAlreadySigned=Proposal already accepted
PropalAlreadyRefused=Proposal already refused
PropalSigned=Proposal accepted
+ContractSigned=Contract signed
+FichinterSigned=Intervention signed
PropalRefused=Proposal refused
ConfirmRefusePropal=Are you sure you want to refuse this commercial proposal?
diff --git a/htdocs/langs/en_US/receptions.lang b/htdocs/langs/en_US/receptions.lang
index 5b51f5ba071..7324f14f2e0 100644
--- a/htdocs/langs/en_US/receptions.lang
+++ b/htdocs/langs/en_US/receptions.lang
@@ -32,6 +32,7 @@ StatusReceptionDraftShort=Draft
StatusReceptionValidatedShort=Validated
StatusReceptionProcessedShort=Processed
ReceptionSheet=Reception sheet
+ValidateReception=Validate reception
ConfirmDeleteReception=Are you sure you want to delete this reception?
ConfirmValidateReception=Are you sure you want to validate this reception with reference %s ?
ConfirmCancelReception=Are you sure you want to cancel this reception?
diff --git a/htdocs/langs/en_US/recruitment.lang b/htdocs/langs/en_US/recruitment.lang
index 1f80ecf1082..686722a48c5 100644
--- a/htdocs/langs/en_US/recruitment.lang
+++ b/htdocs/langs/en_US/recruitment.lang
@@ -66,7 +66,7 @@ ContractRefused=Contract refused
RecruitmentCandidature=Application
JobPositions=Job positions
RecruitmentCandidatures=Applications
-InterviewToDo=Interview to do
+InterviewToDo=Contacts to follow
AnswerCandidature=Application answer
YourCandidature=Your application
YourCandidatureAnswerMessage=Thanks you for your application. ...
diff --git a/htdocs/langs/en_US/stocks.lang b/htdocs/langs/en_US/stocks.lang
index 5332b8123e0..f789ce283e5 100644
--- a/htdocs/langs/en_US/stocks.lang
+++ b/htdocs/langs/en_US/stocks.lang
@@ -49,7 +49,7 @@ StockCorrection=Stock correction
CorrectStock=Correct stock
StockTransfer=Stock transfer
TransferStock=Transfer stock
-MassStockTransferShort=Mass stock transfer
+MassStockTransferShort=Bulk stock change
StockMovement=Stock movement
StockMovements=Stock movements
NumberOfUnit=Number of units
@@ -147,8 +147,9 @@ Replenishments=Replenishments
NbOfProductBeforePeriod=Quantity of product %s in stock before selected period (< %s)
NbOfProductAfterPeriod=Quantity of product %s in stock after selected period (> %s)
MassMovement=Mass movement
-SelectProductInAndOutWareHouse=Select a source warehouse and a target warehouse, a product and a quantity then click "%s". Once this is done for all required movements, click on "%s".
+SelectProductInAndOutWareHouse=Select a source warehouse (optional), a target warehouse, a product and a quantity then click "%s". Once this is done for all required movements, click on "%s".
RecordMovement=Record transfer
+RecordMovements=Record stock movements
ReceivingForSameOrder=Receipts for this order
StockMovementRecorded=Stock movements recorded
RuleForStockAvailability=Rules on stock requirements
@@ -271,7 +272,7 @@ InventoryStartedShort=Started
ErrorOnElementsInventory=Operation canceled for the following reason:
ErrorCantFindCodeInInventory=Can't find the following code in inventory
QtyWasAddedToTheScannedBarcode=Success !! The quantity was added to all the requested barcode. You can close the Scanner tool.
-StockChangeDisabled=Change on stock disabled
+StockChangeDisabled=Stock change disabled
NoWarehouseDefinedForTerminal=No warehouse defined for terminal
ClearQtys=Clear all quantities
ModuleStockTransferName=Advanced Stock Transfer
diff --git a/htdocs/langs/en_US/stripe.lang b/htdocs/langs/en_US/stripe.lang
index 3ea0cf2354b..2a3f988cebf 100644
--- a/htdocs/langs/en_US/stripe.lang
+++ b/htdocs/langs/en_US/stripe.lang
@@ -61,6 +61,7 @@ DeleteACard=Delete Card
ConfirmDeleteCard=Are you sure you want to delete this Credit or Debit card?
CreateCustomerOnStripe=Create customer on Stripe
CreateCardOnStripe=Create card on Stripe
+CreateBANOnStripe=Create bank on Stripe
ShowInStripe=Show in Stripe
StripeUserAccountForActions=User account to use for email notification of some Stripe events (Stripe payouts)
StripePayoutList=List of Stripe payouts
@@ -69,4 +70,5 @@ ToOfferALinkForLiveWebhook=Link to setup Stripe WebHook to call the IPN (live mo
PaymentWillBeRecordedForNextPeriod=Payment will be recorded for the next period.
ClickHereToTryAgain=Click here to try again...
CreationOfPaymentModeMustBeDoneFromStripeInterface=Due to Strong Customer Authentication rules, creation of a card must be done from Stripe backoffice. You can click here to switch on Stripe customer record: %s
-TERMINAL_LOCATION=Location (address) for terminals
\ No newline at end of file
+TERMINAL_LOCATION=Location (address) for terminals
+RequestDirectDebitWithStripe=Request Direct Debit with Stripe
\ No newline at end of file
diff --git a/htdocs/langs/en_US/ticket.lang b/htdocs/langs/en_US/ticket.lang
index 3e1415c3625..0cde40ba20a 100644
--- a/htdocs/langs/en_US/ticket.lang
+++ b/htdocs/langs/en_US/ticket.lang
@@ -194,8 +194,7 @@ TicketAssigned=Ticket is now assigned
TicketChangeType=Change type
TicketChangeCategory=Change analytic code
TicketChangeSeverity=Change severity
-TicketAddMessage=Add a message
-AddMessage=Add a message
+TicketAddMessage=Add private message
MessageSuccessfullyAdded=Ticket added
TicketMessageSuccessfullyAdded=Message successfully added
TicketMessagesList=Message list
@@ -242,6 +241,7 @@ TicketMessageMailIntroAutoNewPublicMessage=A new message was posted on the ticke
TicketAssignedToYou=Ticket assigned
TicketAssignedEmailBody=You have been assigned the ticket #%s by %s
MarkMessageAsPrivate=Mark message as private
+TicketMessageSendEmailHelp=An email will be sent to all assigned contact (internal contacts, but also external contacts except if the option "%s" is checked)
TicketMessagePrivateHelp=This message will not display to external users
TicketEmailOriginIssuer=Issuer at origin of the tickets
InitialMessage=Initial Message
diff --git a/htdocs/langs/en_US/trips.lang b/htdocs/langs/en_US/trips.lang
index 9f51df0bf56..b37233a526f 100644
--- a/htdocs/langs/en_US/trips.lang
+++ b/htdocs/langs/en_US/trips.lang
@@ -1,120 +1,120 @@
# Dolibarr language file - Source file is en_US - trips
-ShowExpenseReport=Show expense report
-Trips=Expense reports
-TripsAndExpenses=Expenses reports
-TripsAndExpensesStatistics=Expense reports statistics
-TripCard=Expense report card
+AUTHOR=Recorded by
+AUTHORPAIEMENT=Paid by
AddTrip=Create expense report
-ListOfTrips=List of expense reports
-ListOfFees=List of fees
-TypeFees=Types of fees
-ShowTrip=Show expense report
-NewTrip=New expense report
-LastExpenseReports=Latest %s expense reports
+AllExpenseReport=All type of expense report
AllExpenseReports=All expense reports
-CompanyVisited=Company/organization visited
-FeesKilometersOrAmout=Amount or kilometers
-DeleteTrip=Delete expense report
-ConfirmDeleteTrip=Are you sure you want to delete this expense report?
-ListTripsAndExpenses=List of expense reports
-ListToApprove=Waiting for approval
-ExpensesArea=Expense reports area
+AnyOtherInThisListCanValidate=Person to be informed for validating the request.
+AttachTheNewLineToTheDocument=Attach the line to an uploaded document
+AucuneLigne=There is no expense report declared yet
+BrouillonnerTrip=Move back expense report to status "Draft"
+byEX_DAY=by day (limitation to %s)
+byEX_EXP=by line (limitation to %s)
+byEX_MON=by month (limitation to %s)
+byEX_YEA=by year (limitation to %s)
+CANCEL_USER=Deleted by
+CarCategory=Vehicle category
ClassifyRefunded=Classify 'Refunded'
+CompanyVisited=Company/organization visited
+ConfirmBrouillonnerTrip=Are you sure you want to move this expense report to status "Draft"?
+ConfirmCancelTrip=Are you sure you want to cancel this expense report?
+ConfirmCloneExpenseReport=Are you sure you want to clone this expense report ?
+ConfirmDeleteTrip=Are you sure you want to delete this expense report?
+ConfirmPaidTrip=Are you sure you want to change status of this expense report to "Paid"?
+ConfirmRefuseTrip=Are you sure you want to deny this expense report?
+ConfirmSaveTrip=Are you sure you want to validate this expense report?
+ConfirmValideTrip=Are you sure you want to approve this expense report?
+DATE_CANCEL=Cancelation date
+DATE_PAIEMENT=Payment date
+DATE_REFUS=Deny date
+DATE_SAVE=Validation date
+DefaultCategoryCar=Default transportation mode
+DefaultRangeNumber=Default range number
+DeleteTrip=Delete expense report
+ErrorDoubleDeclaration=You have declared another expense report into a similar date range.
+Error_EXPENSEREPORT_ADDON_NotDefined=Error, the rule for expense report numbering ref was not defined into setup of module 'Expense Report'
+ExpenseRangeOffset=Offset amount: %s
+expenseReportCatDisabled=Category disabled - see the c_exp_tax_cat dictionary
+expenseReportCoef=Coefficient
+expenseReportCoefUndefined=(value not defined)
+expenseReportOffset=Offset
+expenseReportPrintExample=offset + (d x coef) = %s
+expenseReportRangeDisabled=Range disabled - see the c_exp_tax_range dictionay
+expenseReportRangeFromTo=from %d to %d
+expenseReportRangeMoreThan=more than %d
+expenseReportTotalForFive=Example with d = 5
+ExpenseReportApplyTo=Apply to
+ExpenseReportApproved=An expense report was approved
+ExpenseReportApprovedMessage=The expense report %s was approved. - User: %s - Approved by: %s Click here to show the expense report: %s
+ExpenseReportCanceled=An expense report was canceled
+ExpenseReportCanceledMessage=The expense report %s was canceled. - User: %s - Canceled by: %s - Motive for cancellation: %s Click here to show the expense report: %s
+ExpenseReportConstraintViolationError=Max amount exceeded (rule %s): %s is higher than %s (Exceeding forbidden)
+ExpenseReportConstraintViolationWarning=Max amount exceeded (rule %s): %s is higher than %s (Exceeding authorized)
+ExpenseReportDateEnd=Date end
+ExpenseReportDateStart=Date start
+ExpenseReportDomain=Domain to apply
+ExpenseReportIkDesc=You can modify the calculation of kilometers expense by category and range who they are previously defined. d is the distance in kilometers
+ExpenseReportLimitAmount=Max amount
+ExpenseReportLimitOn=Limit on
+ExpenseReportLine=Expense report line
+ExpenseReportPaid=An expense report was paid
+ExpenseReportPaidMessage=The expense report %s was paid. - User: %s - Paid by: %s Click here to show the expense report: %s
+ExpenseReportPayment=Expense report payment
+ExpenseReportRef=Ref. expense report
+ExpenseReportRefused=An expense report was refused
+ExpenseReportRefusedMessage=The expense report %s was refused. - User: %s - Refused by: %s - Motive for refusal: %s Click here to show the expense report: %s
+ExpenseReportRestrictive=Exceeding forbidden
+ExpenseReportRuleErrorOnSave=Error: %s
+ExpenseReportRuleSave=Expense report rule saved
+ExpenseReportRulesDesc=You can define max amount rules for expense reports. These rules will be applied when a new expense is added to an expense report
ExpenseReportWaitingForApproval=A new expense report has been submitted for approval
ExpenseReportWaitingForApprovalMessage=A new expense report has been submitted and is waiting for approval. - User: %s - Period: %s Click here to validate: %s
ExpenseReportWaitingForReApproval=An expense report has been submitted for re-approval
ExpenseReportWaitingForReApprovalMessage=An expense report has been submitted and is waiting for re-approval. The %s, you refused to approve the expense report for this reason: %s. A new version has been proposed and waiting for your approval. - User: %s - Period: %s Click here to validate: %s
-ExpenseReportApproved=An expense report was approved
-ExpenseReportApprovedMessage=The expense report %s was approved. - User: %s - Approved by: %s Click here to show the expense report: %s
-ExpenseReportRefused=An expense report was refused
-ExpenseReportRefusedMessage=The expense report %s was refused. - User: %s - Refused by: %s - Motive for refusal: %s Click here to show the expense report: %s
-ExpenseReportCanceled=An expense report was canceled
-ExpenseReportCanceledMessage=The expense report %s was canceled. - User: %s - Canceled by: %s - Motive for cancellation: %s Click here to show the expense report: %s
-ExpenseReportPaid=An expense report was paid
-ExpenseReportPaidMessage=The expense report %s was paid. - User: %s - Paid by: %s Click here to show the expense report: %s
-TripId=Id expense report
-AnyOtherInThisListCanValidate=Person to be informed for validating the request.
-TripSociete=Information company
-TripNDF=Informations expense report
-PDFStandardExpenseReports=Standard template to generate a PDF document for expense report
-ExpenseReportLine=Expense report line
-DefaultCategoryCar=Default transportation mode
-DefaultRangeNumber=Default range number
-UploadANewFileNow=Upload a new document now
-Error_EXPENSEREPORT_ADDON_NotDefined=Error, the rule for expense report numbering ref was not defined into setup of module 'Expense Report'
-ErrorDoubleDeclaration=You have declared another expense report into a similar date range.
-AucuneLigne=There is no expense report declared yet
-ModePaiement=Payment mode
-VALIDATOR=User responsible for approval
-VALIDOR=Approved by
-AUTHOR=Recorded by
-AUTHORPAIEMENT=Paid by
-REFUSEUR=Denied by
-CANCEL_USER=Deleted by
-MOTIF_REFUS=Reason
-MOTIF_CANCEL=Reason
-DATE_REFUS=Deny date
-DATE_SAVE=Validation date
-DATE_CANCEL=Cancelation date
-DATE_PAIEMENT=Payment date
-ExpenseReportRef=Ref. expense report
-ValidateAndSubmit=Validate and submit for approval
-ValidatedWaitingApproval=Validated (waiting for approval)
-NOT_AUTHOR=You are not the author of this expense report. Operation cancelled.
-ConfirmRefuseTrip=Are you sure you want to deny this expense report?
-ValideTrip=Approve expense report
-ConfirmValideTrip=Are you sure you want to approve this expense report?
-PaidTrip=Pay an expense report
-ConfirmPaidTrip=Are you sure you want to change status of this expense report to "Paid"?
-ConfirmCancelTrip=Are you sure you want to cancel this expense report?
-BrouillonnerTrip=Move back expense report to status "Draft"
-ConfirmBrouillonnerTrip=Are you sure you want to move this expense report to status "Draft"?
-SaveTrip=Validate expense report
-ConfirmSaveTrip=Are you sure you want to validate this expense report?
-NoTripsToExportCSV=No expense report to export for this period.
-ExpenseReportPayment=Expense report payment
-ExpenseReportsToApprove=Expense reports to approve
-ExpenseReportsToPay=Expense reports to pay
-ConfirmCloneExpenseReport=Are you sure you want to clone this expense report ?
ExpenseReportsIk=Configuration of mileage charges
ExpenseReportsRules=Expense report rules
-ExpenseReportIkDesc=You can modify the calculation of kilometers expense by category and range who they are previously defined. d is the distance in kilometers
-ExpenseReportRulesDesc=You can define max amount rules for expense reports. These rules will be applied when a new expense is added to an expense report
-expenseReportOffset=Offset
-expenseReportCoef=Coefficient
-expenseReportTotalForFive=Example with d = 5
-expenseReportRangeFromTo=from %d to %d
-expenseReportRangeMoreThan=more than %d
-expenseReportCoefUndefined=(value not defined)
-expenseReportCatDisabled=Category disabled - see the c_exp_tax_cat dictionary
-expenseReportRangeDisabled=Range disabled - see the c_exp_tax_range dictionay
-expenseReportPrintExample=offset + (d x coef) = %s
-ExpenseReportApplyTo=Apply to
-ExpenseReportDomain=Domain to apply
-ExpenseReportLimitOn=Limit on
-ExpenseReportDateStart=Date start
-ExpenseReportDateEnd=Date end
-ExpenseReportLimitAmount=Max amount
-ExpenseReportRestrictive=Exceeding forbidden
-AllExpenseReport=All type of expense report
-OnExpense=Expense line
-ExpenseReportRuleSave=Expense report rule saved
-ExpenseReportRuleErrorOnSave=Error: %s
-RangeNum=Range %d
-ExpenseReportConstraintViolationError=Max amount exceeded (rule %s): %s is higher than %s (Exceeding forbidden)
-byEX_DAY=by day (limitation to %s)
-byEX_MON=by month (limitation to %s)
-byEX_YEA=by year (limitation to %s)
-byEX_EXP=by line (limitation to %s)
-ExpenseReportConstraintViolationWarning=Max amount exceeded (rule %s): %s is higher than %s (Exceeding authorized)
+ExpenseReportsToApprove=Expense reports to approve
+ExpenseReportsToPay=Expense reports to pay
+ExpensesArea=Expense reports area
+FeesKilometersOrAmout=Amount or kilometers
+LastExpenseReports=Latest %s expense reports
+ListOfFees=List of fees
+ListOfTrips=List of expense reports
+ListToApprove=Waiting for approval
+ListTripsAndExpenses=List of expense reports
+MOTIF_CANCEL=Reason
+MOTIF_REFUS=Reason
+ModePaiement=Payment mode
+NewTrip=New expense report
nolimitbyEX_DAY=by day (no limitation)
+nolimitbyEX_EXP=by line (no limitation)
nolimitbyEX_MON=by month (no limitation)
nolimitbyEX_YEA=by year (no limitation)
-nolimitbyEX_EXP=by line (no limitation)
-CarCategory=Vehicle category
-ExpenseRangeOffset=Offset amount: %s
+NoTripsToExportCSV=No expense report to export for this period.
+NOT_AUTHOR=You are not the author of this expense report. Operation cancelled.
+OnExpense=Expense line
+PDFStandardExpenseReports=Standard template to generate a PDF document for expense report
+PaidTrip=Pay an expense report
+REFUSEUR=Denied by
RangeIk=Mileage range
-AttachTheNewLineToTheDocument=Attach the line to an uploaded document
+RangeNum=Range %d
+SaveTrip=Validate expense report
+ShowExpenseReport=Show expense report
+ShowTrip=Show expense report
+TripCard=Expense report card
+TripId=Id expense report
+TripNDF=Informations expense report
+TripSociete=Information company
+Trips=Expense reports
+TripsAndExpenses=Expenses reports
+TripsAndExpensesStatistics=Expense reports statistics
+TypeFees=Types of fees
+UploadANewFileNow=Upload a new document now
+VALIDATOR=User responsible for approval
+VALIDOR=Approved by
+ValidateAndSubmit=Validate and submit for approval
+ValidatedWaitingApproval=Validated (waiting for approval)
+ValideTrip=Approve expense report
## Dictionary
EX_BRE=Breakfast
diff --git a/htdocs/langs/en_US/users.lang b/htdocs/langs/en_US/users.lang
index c6b5c2fe106..757e9f1dedf 100644
--- a/htdocs/langs/en_US/users.lang
+++ b/htdocs/langs/en_US/users.lang
@@ -47,7 +47,7 @@ RemoveFromGroup=Remove from group
PasswordChangedAndSentTo=Password changed and sent to %s .
PasswordChangeRequest=Request to change password for %s
PasswordChangeRequestSent=Request to change password for %s sent to %s .
-IfLoginExistPasswordRequestSent=If this login is a valid account, an email to reset password has been sent.
+IfLoginExistPasswordRequestSent=If this login is a valid account (with a valid email), an email to reset password has been sent.
IfEmailExistPasswordRequestSent=If this email is a valid account, an email to reset password has been sent.
ConfirmPasswordReset=Confirm password reset
MenuUsersAndGroups=Users & Groups
@@ -127,3 +127,5 @@ DateLastLogin=Date last login
DatePreviousLogin=Date previous login
IPLastLogin=IP last login
IPPreviousLogin=IP previous login
+ShowAllPerms=Show all permission rows
+HideAllPerms=Hide all permission rows
diff --git a/htdocs/langs/en_US/website.lang b/htdocs/langs/en_US/website.lang
index 379eadef08f..742e3afff67 100644
--- a/htdocs/langs/en_US/website.lang
+++ b/htdocs/langs/en_US/website.lang
@@ -140,7 +140,7 @@ PagesRegenerated=%s page(s)/container(s) regenerated
RegenerateWebsiteContent=Regenerate web site cache files
AllowedInFrames=Allowed in Frames
DefineListOfAltLanguagesInWebsiteProperties=Define list of all available languages into web site properties.
-GenerateSitemaps=Generate website sitemap file
+GenerateSitemaps=Generate website sitemap.xml file
ConfirmGenerateSitemaps=If you confirm, you will erase the existing sitemap file...
ConfirmSitemapsCreation=Confirm sitemap generation
SitemapGenerated=Sitemap file %s generated
@@ -150,4 +150,8 @@ ErrorFaviconSize=Favicon must be sized 16x16, 32x32 or 64x64
FaviconTooltip=Upload an image which needs to be a png (16x16, 32x32 or 64x64)
NextContainer=Next page/container
PreviousContainer=Previous page/container
-WebsiteMustBeDisabled=The website must have the status "Disabled"
+WebsiteMustBeDisabled=The website must have the status "%s"
+WebpageMustBeDisabled=The web page must have the status "%s"
+SetWebsiteOnlineBefore=When website is offline, all pages are offline. Change status of website first.
+Booking=Booking
+Reservation=Reservation
diff --git a/htdocs/langs/en_US/workflow.lang b/htdocs/langs/en_US/workflow.lang
index 803a31c9646..a2b6b4c1f95 100644
--- a/htdocs/langs/en_US/workflow.lang
+++ b/htdocs/langs/en_US/workflow.lang
@@ -22,7 +22,7 @@ descWORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_SUPPLIER_ORDER=Classify linked sourc
descWORKFLOW_ORDER_CLASSIFY_RECEIVED_RECEPTION=Classify linked source purchase order as received when a reception is validated (and if the quantity received by all receptions is the same as in the purchase order to update)
descWORKFLOW_ORDER_CLASSIFY_RECEIVED_RECEPTION_CLOSED=Classify linked source purchase order as received when a reception is closed (and if the quantity received by all rceptions is the same as in the purchase order to update)
# Autoclassify purchase invoice
-descWORKFLOW_BILL_ON_RECEPTION=Classify receptions to "billed" when a linked supplier order is validated
+descWORKFLOW_EXPEDITION_CLASSIFY_CLOSED_INVOICE=Classify receptions to "billed" when a linked purchase invoice is validated (and if the amount of the invoice is the same as the total amount of the linked receptions)
# Automatically link ticket to contract
descWORKFLOW_TICKET_LINK_CONTRACT=When creating a ticket, link available contracts of matching thirdparty
descWORKFLOW_TICKET_USE_PARENT_COMPANY_CONTRACTS=When linking contracts, search among those of parents companies
@@ -31,6 +31,6 @@ descWORKFLOW_TICKET_CLOSE_INTERVENTION=Close all interventions linked to the tic
AutomaticCreation=Automatic creation
AutomaticClassification=Automatic classification
# Autoclassify shipment
-descWORKFLOW_SHIPPING_CLASSIFY_CLOSED_INVOICE=Classify linked source shipment as closed when customer invoice is validated
+descWORKFLOW_SHIPPING_CLASSIFY_CLOSED_INVOICE=Classify linked source shipment as closed when customer invoice is validated (and if the amount of the invoice is the same as the total amount of the linked shipments)
AutomaticClosing=Automatic closing
AutomaticLinking=Automatic linking
diff --git a/htdocs/langs/en_ZA/members.lang b/htdocs/langs/en_ZA/members.lang
deleted file mode 100644
index 5f7a2ff4020..00000000000
--- a/htdocs/langs/en_ZA/members.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - members
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
diff --git a/htdocs/langs/en_ZA/projects.lang b/htdocs/langs/en_ZA/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/en_ZA/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/es_AR/admin.lang b/htdocs/langs/es_AR/admin.lang
index 76c93629d16..beedcee5010 100644
--- a/htdocs/langs/es_AR/admin.lang
+++ b/htdocs/langs/es_AR/admin.lang
@@ -252,7 +252,6 @@ UpdateServerOffline=Actualizar servidor fuera de línea
WithCounter=Administrar un contador
AddCRIfTooLong=No hay ajuste de texto automático. El texto que es demasiado largo no será mostrado en el documento. Por favor agregar saltos de línea en el área de texto si es necesario.
String=Cuerda
-InitEmptyBarCode=Init value for the %s empty barcodes
Module30Name=Facturas
Module40Desc=Gestión de proveedores y compras (órdenes de compra y facturas de proveedores)
Module52Name=Inventarios(Stocks)
diff --git a/htdocs/langs/es_AR/commercial.lang b/htdocs/langs/es_AR/commercial.lang
index d85913580a1..b8b70ff7a01 100644
--- a/htdocs/langs/es_AR/commercial.lang
+++ b/htdocs/langs/es_AR/commercial.lang
@@ -60,6 +60,5 @@ Stats=Estadísticas de ventas
StatusProsp=Estado del cliente potencial
DraftPropals=Presupuestos en borrador
ToOfferALinkForOnlineSignature=Vínculo para firma digital
-ThisScreenAllowsYouToSignDocFrom=Esta pantalla te permitirá aceptar, firmar o rechazar un presupuesto
SignatureProposalRef=Firma del presupuesto %s
FeatureOnlineSignDisabled=La funcionalidad para la firma digital está deshabilitada o el documento fue generado antes de habilitar la función
diff --git a/htdocs/langs/es_AR/ecm.lang b/htdocs/langs/es_AR/ecm.lang
index a668d35a6b8..099dbdbaf6f 100644
--- a/htdocs/langs/es_AR/ecm.lang
+++ b/htdocs/langs/es_AR/ecm.lang
@@ -15,7 +15,6 @@ ECMNbOfSubDir=Cantidad de sub-carpetas
ECMNbOfFilesInSubDir=Cantidad de archivos en sub-carpetas
ECMArea=Area SAD/ACE
ECMAreaDesc=El área de SAD/ACE (Sistema de Administración de Documentos / Administración de Contenido Electrónico) te permite guardar, compartir y rápidamente buscar todo tipo de documentos en Dolibarr.
-ECMAreaDesc2=* Las carpetas automáticas son llenadas automáticamente al agregar documentos desde la ficha de un elemento. * Las carpetas manuales pueden ser usadas para guardar documentos no enlazados a un elemento en particular.
ECMSectionWasRemoved=Carpeta %s ha sido eliminada.
ECMSectionWasCreated=Carpeta %s ha sido creada.
ECMSearchByKeywords=Búsqueda por palabras clave
diff --git a/htdocs/langs/es_AR/mailmanspip.lang b/htdocs/langs/es_AR/mailmanspip.lang
index 700cfd3bb70..840c7e7dd58 100644
--- a/htdocs/langs/es_AR/mailmanspip.lang
+++ b/htdocs/langs/es_AR/mailmanspip.lang
@@ -7,7 +7,6 @@ MailmanCreationSuccess=La prueba de suscripción se ha ejecutado correctamente
MailmanDeletionSuccess=La prueba de desuscripción se ha ejecutado correctamente
SynchroMailManEnabled=Será realizada una actualización en la lista de envío de correos
SynchroSpipEnabled=Será realizada una actualización en el módulo SPIP
-DescADHERENT_MAILMAN_ADMINPW=Contraseña de administrador de Envío de Correos
DescADHERENT_MAILMAN_URL=URL para suscripciones a la lista de envío de correos
DescADHERENT_MAILMAN_UNSUB_URL=URL para desuscripciones a la lista de envío de correos
DescADHERENT_MAILMAN_LISTS=Lista(s) para inscripción automática de nuevos miembros (separados por una coma)
diff --git a/htdocs/langs/es_BO/members.lang b/htdocs/langs/es_BO/members.lang
deleted file mode 100644
index 5f7a2ff4020..00000000000
--- a/htdocs/langs/es_BO/members.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - members
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
diff --git a/htdocs/langs/es_BO/projects.lang b/htdocs/langs/es_BO/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/es_BO/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/es_CL/accountancy.lang b/htdocs/langs/es_CL/accountancy.lang
index 2bff8d60933..9a12ca9824b 100644
--- a/htdocs/langs/es_CL/accountancy.lang
+++ b/htdocs/langs/es_CL/accountancy.lang
@@ -217,4 +217,3 @@ ToBind=Líneas para enlazar
UseMenuToSetBindindManualy=Líneas aún no enlazadas, use el menú %s para hacer el enlace manualmente
WarningReportNotReliable=Advertencia, este informe no se basa en el Libro mayor, por lo que no contiene la transacción modificada manualmente en el Libro mayor. Si su publicación está actualizada, la vista de contabilidad es más precisa.
ExpenseReportJournal=Diario del informe de gastos
-InventoryJournal=Revista de inventario
diff --git a/htdocs/langs/es_CL/admin.lang b/htdocs/langs/es_CL/admin.lang
index aa792dc23db..7e7c5a27736 100644
--- a/htdocs/langs/es_CL/admin.lang
+++ b/htdocs/langs/es_CL/admin.lang
@@ -340,7 +340,6 @@ DefaultLink=Enlace predeterminado
ValueOverwrittenByUserSetup=Advertencia, este valor puede ser sobrescrito por la configuración específica del usuario (cada usuario puede establecer su propia URL de clicktodial)
BarcodeInitForProductsOrServices=Inicialización o reinicio masivo del código de barras para productos o servicios
CurrentlyNWithoutBarCode=Actualmente, tiene %s registros en %s %s sin código de barras definido.
-InitEmptyBarCode=Init value for the %s empty barcodes
EraseAllCurrentBarCode=Borrar todos los valores actuales del código de barras
ConfirmEraseAllCurrentBarCode=¿Seguro que quieres borrar todos los valores actuales del código de barras?
AllBarcodeReset=Todos los valores del código de barras han sido eliminados
@@ -574,7 +573,6 @@ Permission281=Leer contactos
Permission291=Tarifas de lectura
Permission292=Establecer permisos sobre las tarifas
Permission293=Modificar las tarifas del cliente.
-Permission300=Leer codigos de barras
Permission301=Crear / modificar códigos de barras
Permission311=Leer Servicios
Permission312=Asignar servicio / suscripción al contrato
diff --git a/htdocs/langs/es_CL/commercial.lang b/htdocs/langs/es_CL/commercial.lang
index 33c14696715..2308c317fae 100644
--- a/htdocs/langs/es_CL/commercial.lang
+++ b/htdocs/langs/es_CL/commercial.lang
@@ -57,6 +57,4 @@ ActionAC_AUTO=Eventos insertados automáticamente
Stats=Estadísticas de ventas
StatusProsp=Estado de la perspectiva
DraftPropals=Cotizaciones borrador
-WelcomeOnOnlineSignaturePage=Bienvenido a la página para aceptar propuestas comerciales de %s
-ThisScreenAllowsYouToSignDocFrom=Esta pantalla le permite aceptar y firmar, o rechazar, un presupuesto/propuesta comercial
SignatureProposalRef=Firma de cotización / propuesta comercial %s
diff --git a/htdocs/langs/es_CL/ecm.lang b/htdocs/langs/es_CL/ecm.lang
index c8bda73008d..462663342bc 100644
--- a/htdocs/langs/es_CL/ecm.lang
+++ b/htdocs/langs/es_CL/ecm.lang
@@ -6,7 +6,6 @@ ECMNbOfSubDir=Cantidad de subdirectorios
ECMNbOfFilesInSubDir=Número de archivos en subdirectorios
ECMArea=Área de DMS / ECM
ECMAreaDesc=El área DMS / ECM (Sistema de gestión de documentos / gestión de contenido electrónico) le permite guardar, compartir y buscar rápidamente todo tipo de documentos en Dolibarr.
-ECMAreaDesc2=* Los directorios automáticos se rellenan automáticamente al agregar documentos desde la tarjeta de un elemento. * Los directorios manuales se pueden usar para guardar documentos no vinculados a un elemento en particular.
ECMSectionWasRemoved=El directorio %s ha sido borrado.
ECMSectionWasCreated=El directorio %s ha sido creado.
ECMNoDirectoryYet=Sin directorio creado
diff --git a/htdocs/langs/es_CL/errors.lang b/htdocs/langs/es_CL/errors.lang
index 8c45fd1469b..93bfc615ce6 100644
--- a/htdocs/langs/es_CL/errors.lang
+++ b/htdocs/langs/es_CL/errors.lang
@@ -69,7 +69,6 @@ ErrorFieldValueNotIn=El campo %s : ' %s ' no es un valor e
ErrorFieldRefNotIn=Campo %s : ' %s ' no es una referencia %s existente
ErrorsOnXLines=Se encontraron errores %s
ErrorFileIsInfectedWithAVirus=El programa antivirus no pudo validar el archivo (el archivo podría estar infectado por un virus)
-ErrorSpecialCharNotAllowedForField=Los caracteres especiales no están permitidos para el campo "%s"
ErrorNumRefModel=Existe una referencia en la base de datos (%s) y no es compatible con esta regla de numeración. Elimine la referencia de registro o renombrada para activar este módulo.
ErrorQtyTooLowForThisSupplier=Cantidad demasiado baja para este proveedor o ningún precio definido en este producto para este proveedor
ErrorOrdersNotCreatedQtyTooLow=Algunos pedidos no se han creado debido a cantidades demasiado bajas
diff --git a/htdocs/langs/es_CL/mailmanspip.lang b/htdocs/langs/es_CL/mailmanspip.lang
index 34a39aa742a..fdbf3c00d12 100644
--- a/htdocs/langs/es_CL/mailmanspip.lang
+++ b/htdocs/langs/es_CL/mailmanspip.lang
@@ -6,7 +6,6 @@ MailmanCreationSuccess=La prueba de suscripción se ejecutó con éxito
MailmanDeletionSuccess=La prueba de cancelación se ejecutó con éxito
SynchroMailManEnabled=Se realizará una actualización de Mailman
SynchroSpipEnabled=Se realizará una actualización de Spip
-DescADHERENT_MAILMAN_ADMINPW=Contraseña de administrador de Mailman
DescADHERENT_MAILMAN_URL=URL para las suscripciones de Mailman
DescADHERENT_MAILMAN_UNSUB_URL=URL para la cancelación de suscripciones de Mailman
DescADHERENT_MAILMAN_LISTS=Lista (s) para la inscripción automática de nuevos miembros (separados por una coma)
diff --git a/htdocs/langs/es_CL/members.lang b/htdocs/langs/es_CL/members.lang
index a226d236563..d8ea715ef45 100644
--- a/htdocs/langs/es_CL/members.lang
+++ b/htdocs/langs/es_CL/members.lang
@@ -53,7 +53,6 @@ YourMembershipWasValidated=Su membresía fue validada
YourMembershipWasCanceled=Su membresía fue cancelada
CardContent=Contenido de su tarjeta de miembro
ThisIsContentOfYourMembershipRequestWasReceived=Queremos informarle que se recibió su solicitud de membresía.
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
ThisIsContentOfSubscriptionReminderEmail=Queremos informarle que su suscripción está a punto de caducar o ya ha caducado (__MEMBER_LAST_SUBSCRIPTION_DATE_END__). Esperamos que lo renueven.
ThisIsContentOfYourCard=Este es un resumen de la información que tenemos sobre usted. Por favor, póngase en contacto con nosotros si algo es incorrecto.
DescADHERENT_AUTOREGISTER_NOTIF_MAIL_SUBJECT=Asunto de la notificación por correo electrónico recibida en caso de autoinscripción de un invitado
@@ -85,7 +84,6 @@ MenuMembersStats=Estadística
NewMemberbyWeb=Nuevo miembro agregado. Esperando aprobacion
NewMemberForm=Nueva forma de miembro
TurnoverOrBudget=Volumen de ventas (empresa) o Cotización (asociación o colectivo)
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
MEMBER_NEWFORM_PAYONLINE=Salte en la página integrada de pago en línea
MembersStatisticsByProperties=Estadísticas de miembros por naturaleza
NoEmailSentToMember=No se envió ningún correo electrónico al miembro
diff --git a/htdocs/langs/es_CL/projects.lang b/htdocs/langs/es_CL/projects.lang
index aaae5a794c4..7afb36f5a70 100644
--- a/htdocs/langs/es_CL/projects.lang
+++ b/htdocs/langs/es_CL/projects.lang
@@ -156,6 +156,5 @@ ModuleSalaryToDefineHourlyRateMustBeEnabled=El módulo 'Salarios' debe e
NewTaskRefSuggested=Referencia de tarea ya utilizada, se requiere una nueva referencia de tarea
TimeSpentForIntervention=Tiempo dedicado
TimeSpentForInvoice=Tiempo dedicado
-ServiceToUseOnLines=Service to use on lines by default
InvoiceGeneratedFromTimeSpent=La factura %s se ha generado desde el tiempo invertido en el proyecto
UsageBillTimeShort=Uso: Bill time
diff --git a/htdocs/langs/es_CL/ticket.lang b/htdocs/langs/es_CL/ticket.lang
index c1f9984feda..3cec391874a 100644
--- a/htdocs/langs/es_CL/ticket.lang
+++ b/htdocs/langs/es_CL/ticket.lang
@@ -60,7 +60,6 @@ TicketAssigned=Ticket ahora está asignado
TicketChangeCategory=Cambiar código analítico
TicketChangeSeverity=Cambiar severidad
TicketAddMessage=Añade un mensaje
-AddMessage=Añade un mensaje
MessageSuccessfullyAdded=Ticket agregado
TicketMessageSuccessfullyAdded=Mensaje agregado con éxito
TicketMessagesList=Lista de mensajes
@@ -73,8 +72,6 @@ TicketDurationAutoInfos=Duración calculada automáticamente a partir de interve
SendMessageByEmail=Enviar mensaje por correo electrónico
ErrorMailRecipientIsEmptyForSendTicketMessage=El destinatario está vacío. Sin enviar correo electrónico
TicketMessageMailIntroHelp=Este texto se agrega solo al comienzo del correo electrónico y no se guardará.
-TicketMessageMailSignatureHelp=Este texto se agrega solo al final del correo electrónico y no se guardará.
-TicketMessageMailSignatureLabelAdmin=Firma del correo electrónico de respuesta
TicketMessageHelp=Solo este texto se guardará en la lista de mensajes en la tarjeta de Tickets.
TicketTimeToRead=Tiempo transcurrido antes de leer
TicketContacts=Ticket de contactos
diff --git a/htdocs/langs/es_CO/accountancy.lang b/htdocs/langs/es_CO/accountancy.lang
index 8e9afa1c3f8..43dd8df9360 100644
--- a/htdocs/langs/es_CO/accountancy.lang
+++ b/htdocs/langs/es_CO/accountancy.lang
@@ -33,7 +33,6 @@ GroupIsEmptyCheckSetup=El grupo está vacío, verifique la configuración del gr
DetailByAccount=Mostrar detalle por cuenta
AccountWithNonZeroValues=Cuentas con valores distintos de cero.
CountriesInEECExceptMe=Países en EEC excepto %s
-ExportAccountingSourceDocHelp=With this tool, you can search and export the source events that are used to generate your accountancy. The exported ZIP file will contain the lists of requested items in CSV, as well as their attached files in their original format (PDF, ODT, DOCX...).
MainAccountForCustomersNotDefined=Cuenta contable principal para clientes no definidos en la configuración.
MainAccountForSuppliersNotDefined=Cuenta de contabilidad principal para proveedores no definidos en la configuración.
MainAccountForUsersNotDefined=Cuenta de contabilidad principal para usuarios no definidos en la configuración.
@@ -215,7 +214,6 @@ AccountingAccountForSalesTaxAreDefinedInto=Nota: la cuenta contable del impuesto
NumberOfAccountancyMovements=Numero de movimientos
ACCOUNTING_DISABLE_BINDING_ON_SALES=Deshabilitar la vinculación y la transferencia en la contabilidad de las ventas (las facturas de los clientes no se tendrán en cuenta en la contabilidad)
ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Deshabilite la vinculación y transferencia en contabilidad en compras (las facturas de proveedores no se tendrán en cuenta en la contabilidad)
-NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible)
ExportDraftJournal=Exportar borrador de revista
Selectmodelcsv=Selecciona un modelo de exportación.
Modelcsv_CEGID=Exportación para CEGID Expert Comptabilité
@@ -277,4 +275,3 @@ FECFormatCredit=Crédito (crédito)
DateExport=Exportación de fecha
WarningReportNotReliable=Advertencia, este informe no se basa en el Libro mayor, por lo que no contiene la transacción modificada manualmente en el Libro mayor. Si su publicación está actualizada, la vista de contabilidad es más precisa.
ExpenseReportJournal=Diario de informe de gastos
-InventoryJournal=Diario de inventario
diff --git a/htdocs/langs/es_CO/admin.lang b/htdocs/langs/es_CO/admin.lang
index d6fec62304b..4ca8b5f0aa3 100644
--- a/htdocs/langs/es_CO/admin.lang
+++ b/htdocs/langs/es_CO/admin.lang
@@ -362,7 +362,6 @@ ValueOverwrittenByUserSetup=Advertencia, este valor puede ser sobrescrito por la
BarcodeInitForThirdparties=init para código de barras masivo para terceros
BarcodeInitForProductsOrServices=Código de barras masivo de inicio o reinicio para productos o servicios.
CurrentlyNWithoutBarCode=Actualmente, tienes el registro %s en %s %s sin un código de barras definido.
-InitEmptyBarCode=Init value for the %s empty barcodes
EraseAllCurrentBarCode=Borrar todos los valores de código de barras actuales
ConfirmEraseAllCurrentBarCode=¿Está seguro de que desea borrar todos los valores de código de barras actuales?
AllBarcodeReset=Todos los valores de código de barras han sido eliminados
@@ -1308,7 +1307,6 @@ ActivateFCKeditor=Activar editor avanzado para:
FCKeditorForNotePublic=Creación / edición WYSIWIG del campo "notas públicas" de elementos
FCKeditorForNotePrivate=Creación / edición WYSIWIG del campo "notas privadas" de elementos
FCKeditorForCompany=Creación / edición WYSIWIG de la descripción de campo de elementos (excepto productos / servicios)
-FCKeditorForProduct=Creación / edición WYSIWIG de la descripción de campo de productos / servicios
FCKeditorForProductDetails=WYSIWIG creación / edición de líneas de detalle de productos para todas las entidades (propuestas, pedidos, facturas, etc ...). Advertencia: El uso de esta opción para este caso no se recomienda seriamente, ya que puede crear problemas con caracteres especiales y formato de página al crear archivos PDF.
FCKeditorForMailing=Creación / edición WYSIWIG para eMailings masivos (Herramientas-> eMailing)
FCKeditorForUserSignature=Creación / edición WYSIWIG de la firma del usuario.
diff --git a/htdocs/langs/es_CO/commercial.lang b/htdocs/langs/es_CO/commercial.lang
index 4ecf1bf3338..a682aab5fd4 100644
--- a/htdocs/langs/es_CO/commercial.lang
+++ b/htdocs/langs/es_CO/commercial.lang
@@ -53,8 +53,5 @@ Stats=Estadísticas de ventas
StatusProsp=Estado cliente potencial
DraftPropals=Borrador de propuestas comerciales
ToOfferALinkForOnlineSignature=Enlace para firma en línea
-WelcomeOnOnlineSignaturePage=Bienvenido a la página para aceptar propuestas comerciales de %s
-ThisScreenAllowsYouToSignDocFrom=Esta pantalla le permite aceptar y firmar, o rechazar, una cotización / propuesta comercial
-ThisIsInformationOnDocumentToSign=Esta es información en el documento para aceptar o rechazar
SignatureProposalRef=Firma de cotización / propuesta comercial %s
FeatureOnlineSignDisabled=Característica para la firma en línea deshabilitada o documento generado antes de que se habilitara la característica
diff --git a/htdocs/langs/es_CO/ecm.lang b/htdocs/langs/es_CO/ecm.lang
index 8e5fb615fc0..27f9ce5dd7b 100644
--- a/htdocs/langs/es_CO/ecm.lang
+++ b/htdocs/langs/es_CO/ecm.lang
@@ -6,7 +6,6 @@ ECMCreationDate=Fecha de creación
ECMNbOfFilesInSubDir=Número de archivos en subdirectorios
ECMArea=Área DMS / ECM
ECMAreaDesc=El área DMS / ECM (Document Management System / Electronic Content Management) permite guardar, compartir y buscar rápidamente todo tipo de documentos en Dolibarr.
-ECMAreaDesc2=* Los directorios automáticos se llenan automáticamente al agregar documentos desde la tarjeta de un elemento. * Los directorios manuales se pueden usar para guardar documentos que no están vinculados a un elemento en particular.
ECMSectionWasRemoved=El directorio %s ha sido eliminado.
ECMSectionWasCreated=Se ha creado el directorio %s .
ECMNoDirectoryYet=No se creó ningún directorio
diff --git a/htdocs/langs/es_CO/errors.lang b/htdocs/langs/es_CO/errors.lang
index 2e958b678d9..23b931b6d88 100644
--- a/htdocs/langs/es_CO/errors.lang
+++ b/htdocs/langs/es_CO/errors.lang
@@ -73,7 +73,6 @@ ErrorWrongValueForField=El campo %s : '%s ' no coincide con la regla
ErrorFieldValueNotIn=El campo %s : ' %s ' no es un valor que se encuentra en el campo %s de %s
ErrorFieldRefNotIn=El campo%s : '%s ' no es una referia existente %s
ErrorFileIsInfectedWithAVirus=El programa antivirus no pudo validar el archivo (el archivo podría estar infectado por un virus)
-ErrorSpecialCharNotAllowedForField=No se permiten caracteres especiales para el campo "%s"
ErrorNumRefModel=Existe una referencia en la base de datos (%s) y no es compatible con esta regla de numeración. Elimine el registro o la referencia renombrada para activar este módulo.
ErrorQtyTooLowForThisSupplier=Cantidad demasiado baja para este proveedor o ningún precio definido en este producto para este proveedor
ErrorOrdersNotCreatedQtyTooLow=Algunos pedidos no se han creado debido a cantidades demasiado bajas.
diff --git a/htdocs/langs/es_CO/mailmanspip.lang b/htdocs/langs/es_CO/mailmanspip.lang
index 98090117641..eaf04c1a531 100644
--- a/htdocs/langs/es_CO/mailmanspip.lang
+++ b/htdocs/langs/es_CO/mailmanspip.lang
@@ -6,7 +6,6 @@ MailmanCreationSuccess=La prueba de suscripción se ejecutó con éxito
MailmanDeletionSuccess=La prueba de cancelación de suscripción se ejecutó con éxito
SynchroMailManEnabled=Se realizará una actualización de Mailman
SynchroSpipEnabled=Se realizará una actualización de Spip
-DescADHERENT_MAILMAN_ADMINPW=Contraseña de administrador de Mailman
DescADHERENT_MAILMAN_URL=URL de las suscripciones de Mailman
DescADHERENT_MAILMAN_UNSUB_URL=URL para darse de baja de Mailman
DescADHERENT_MAILMAN_LISTS=Lista(s) para la inscripción automática de nuevos miembros (separados por coma)
diff --git a/htdocs/langs/es_CO/projects.lang b/htdocs/langs/es_CO/projects.lang
index d7d0f29d616..2535094af83 100644
--- a/htdocs/langs/es_CO/projects.lang
+++ b/htdocs/langs/es_CO/projects.lang
@@ -186,7 +186,6 @@ NewTaskRefSuggested=La referencia de tarea ya se usó, se requiere una nueva ref
TimeSpentInvoiced=Tiempo invertido facturado
TimeSpentForIntervention=Tiempo usado
TimeSpentForInvoice=Tiempo usado
-ServiceToUseOnLines=Service to use on lines by default
InvoiceGeneratedFromTimeSpent=La factura %s se ha generado a partir del tiempo dedicado al proyecto
InterventionGeneratedFromTimeSpent=La intervención %s se ha generado a partir del tiempo dedicado al proyecto
ProjectBillTimeDescription=Verifique si ingresa la hoja de tiempo en las tareas del proyecto Y planea generar factura(s) a partir de la hoja de tiempo para facturar al cliente del proyecto (no verifique si planea crear una factura que no se base en las hojas de tiempo ingresadas). Nota: Para generar factura, vaya a la pestaña 'Tiempo invertido' del proyecto y seleccione las líneas para incluir.
diff --git a/htdocs/langs/es_CO/ticket.lang b/htdocs/langs/es_CO/ticket.lang
index 02301c15de2..ea3d8b55ff9 100644
--- a/htdocs/langs/es_CO/ticket.lang
+++ b/htdocs/langs/es_CO/ticket.lang
@@ -77,7 +77,6 @@ TicketChangeType=Tipo de cambio
TicketChangeCategory=Cambiar el código analítico
TicketChangeSeverity=Cambiar la gravedad
TicketAddMessage=Añade un mensaje
-AddMessage=Añade un mensaje
MessageSuccessfullyAdded=Ticket agregado
TicketMessageSuccessfullyAdded=Mensaje agregado exitosamente
TicketMessagesList=Lista de mensajes
@@ -93,8 +92,6 @@ SendMessageByEmail=Enviar mensaje por correo electrónico
ErrorMailRecipientIsEmptyForSendTicketMessage=El destinatario está vacío. No enviar correo electrónico
TicketGoIntoContactTab=Vaya a la pestaña "Contactos" para seleccionarlos.
TicketMessageMailIntroHelp=Este texto se agrega solo al comienzo del correo electrónico y no se guardará.
-TicketMessageMailSignatureHelp=Este texto se agrega solo al final del correo electrónico y no se guardará.
-TicketMessageMailSignatureLabelAdmin=Firma del correo electrónico de respuesta
TicketMessageHelp=Solo este texto se guardará en la lista de mensajes de la tarjeta del ticket.
TicketTimeToRead=Tiempo transcurrido antes de leer
TicketContacts=Ticket de contactos
diff --git a/htdocs/langs/es_CO/workflow.lang b/htdocs/langs/es_CO/workflow.lang
index 326b17aadd9..aee62bbc20c 100644
--- a/htdocs/langs/es_CO/workflow.lang
+++ b/htdocs/langs/es_CO/workflow.lang
@@ -14,5 +14,4 @@ descWORKFLOW_ORDER_CLASSIFY_SHIPPED_SHIPPING=Clasifique el pedido de ventas de o
descWORKFLOW_ORDER_CLASSIFY_SHIPPED_SHIPPING_CLOSED=Clasifique el pedido de venta de origen vinculado como enviado cuando se cierra un envío (y si la cantidad enviada por todos los envíos es la misma que en el pedido para actualizar)
descWORKFLOW_ORDER_CLASSIFY_BILLED_SUPPLIER_PROPOSAL=Clasifique la propuesta del proveedor de origen vinculado como facturada cuando se valida la factura del proveedor (y si el monto de la factura es el mismo que el monto total de la propuesta vinculada)
descWORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_SUPPLIER_ORDER=Clasifique el pedido de compra de origen vinculado como facturado cuando se valida la factura del proveedor (y si el monto de la factura es el mismo que el monto total del pedido vinculado)
-descWORKFLOW_BILL_ON_RECEPTION=Clasifique las recepciones como "facturadas" cuando un pedido de proveedor vinculado is validado
descWORKFLOW_SHIPPING_CLASSIFY_CLOSED_INVOICE=Clasifique el envío de origen vinculado como cerrado cuando se valida la factura del cliente
diff --git a/htdocs/langs/es_DO/members.lang b/htdocs/langs/es_DO/members.lang
deleted file mode 100644
index 5f7a2ff4020..00000000000
--- a/htdocs/langs/es_DO/members.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - members
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
diff --git a/htdocs/langs/es_DO/projects.lang b/htdocs/langs/es_DO/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/es_DO/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/es_EC/accountancy.lang b/htdocs/langs/es_EC/accountancy.lang
index 56a5c3e928d..b24e09e5bb2 100644
--- a/htdocs/langs/es_EC/accountancy.lang
+++ b/htdocs/langs/es_EC/accountancy.lang
@@ -229,4 +229,3 @@ ToBind=Líneas para atar
UseMenuToSetBindindManualy=Líneas aún no enlazadas, use el menú %s para hacer el enlace manualmente.
WarningReportNotReliable=Advertencia, este informe no se basa en el Libro mayor, por lo que no contiene la transacción modificada manualmente en el Libro mayor. Si su publicación está actualizada, la vista de contabilidad es más precisa.
ExpenseReportJournal=Diario del informe de gastos
-InventoryJournal=Diario de inventario
diff --git a/htdocs/langs/es_EC/admin.lang b/htdocs/langs/es_EC/admin.lang
index 96820c4587e..6286debaffd 100644
--- a/htdocs/langs/es_EC/admin.lang
+++ b/htdocs/langs/es_EC/admin.lang
@@ -335,7 +335,6 @@ ValueOverwrittenByUserSetup=Advertencia: este valor puede ser sobrescrito por la
BarcodeInitForThirdparties=Inicio masivo de código de barras para terceros.
BarcodeInitForProductsOrServices=Inicio de código de barras masivo o restablecimiento de productos o servicios
CurrentlyNWithoutBarCode=Actualmente, tiene %s registrado en %s %s sin código de barras definido.
-InitEmptyBarCode=Init value for the %s empty barcodes
EraseAllCurrentBarCode=Borrar todos los valores de códigos de barras actuales
ConfirmEraseAllCurrentBarCode=¿Está seguro de que desea borrar todos los valores de códigos de barras actuales?
AllBarcodeReset=Todos los valores de código de barras se han eliminado
@@ -586,7 +585,6 @@ Permission282=Crear / modificar contactos
Permission291=Leer tarifas
Permission292=Establecer permisos en las tarifas
Permission293=Modificar las tarifas del cliente.
-Permission300=Leer codigos de barras
Permission301=Crear / modificar códigos de barras
Permission311=Leer servicios
Permission312=Asignar servicio / suscripción al contrato.
diff --git a/htdocs/langs/es_EC/commercial.lang b/htdocs/langs/es_EC/commercial.lang
index 85789b47b39..ee890081cfd 100644
--- a/htdocs/langs/es_EC/commercial.lang
+++ b/htdocs/langs/es_EC/commercial.lang
@@ -60,6 +60,4 @@ ActionAC_OTH_AUTOShort=Automático
Stats=Estadísticas de ventas
StatusProsp=Estado del prospecto
DraftPropals=Proyecto de propuestas comerciales
-WelcomeOnOnlineSignaturePage=Bienvenido a la página para aceptar propuestas comerciales de %s
-ThisScreenAllowsYouToSignDocFrom=Esta pantalla le permite aceptar y firmar, o rechazar, una propuesta de cotización/comercial
SignatureProposalRef=Firma de cotización/propuesta comercial %s.
diff --git a/htdocs/langs/es_EC/ecm.lang b/htdocs/langs/es_EC/ecm.lang
index 7f8d9157910..0fea60981c8 100644
--- a/htdocs/langs/es_EC/ecm.lang
+++ b/htdocs/langs/es_EC/ecm.lang
@@ -5,7 +5,6 @@ ECMCreationDate=Fecha de creación
ECMNbOfFilesInSubDir=Número de archivos en subdirectorios
ECMArea=Área de DMS/ECM
ECMAreaDesc=El área SGD/GCE (Sistema de Gestión de Documentos / Gestión de Contenido Electrónico) le permite guardar, compartir y buscar rápidamente todo tipo de documentos en Dolibarr.
-ECMAreaDesc2=* Los directorios automáticos se rellenan automáticamente al agregar documentos desde la tarjeta de un elemento. * Los directorios manuales se pueden utilizar para guardar documentos no vinculados a un elemento en particular.
ECMSectionWasRemoved=Se ha eliminado el directorio %s .
ECMSectionWasCreated=Directorio %s ha sido creado.
ECMSearchByKeywords=Búsqueda por palabras clave
diff --git a/htdocs/langs/es_EC/errors.lang b/htdocs/langs/es_EC/errors.lang
index 87dd8507320..ae701afac8d 100644
--- a/htdocs/langs/es_EC/errors.lang
+++ b/htdocs/langs/es_EC/errors.lang
@@ -64,7 +64,6 @@ ErrorWrongValueForField=El campo %s : '%s ' no coincide con la expre
ErrorFieldValueNotIn=El campo %s : '%s ' no es un valor que se encuentra en el campo %s de %s
ErrorFieldRefNotIn=Campo %s : '%s ' no es una %s referencia existente
ErrorFileIsInfectedWithAVirus=El programa antivirus no pudo validar el archivo (el archivo podría estar infectado por un virus)
-ErrorSpecialCharNotAllowedForField=No se permiten caracteres especiales para el campo "%s"
ErrorNumRefModel=Existe una referencia en la base de datos (%s) y no es compatible con esta regla de numeración. Elimine la referencia de registro o renombrado para activar este módulo.
ErrorQtyTooLowForThisSupplier=Cantidad demasiado baja para este proveedor o ningún precio definido en este producto para este proveedor
ErrorOrdersNotCreatedQtyTooLow=Algunos pedidos no se han creado debido a cantidades demasiado bajas
diff --git a/htdocs/langs/es_EC/mailmanspip.lang b/htdocs/langs/es_EC/mailmanspip.lang
index 6b8fb02ecff..dc6431a176e 100644
--- a/htdocs/langs/es_EC/mailmanspip.lang
+++ b/htdocs/langs/es_EC/mailmanspip.lang
@@ -6,7 +6,6 @@ MailmanCreationSuccess=La prueba de suscripción se ejecutó correctamente
MailmanDeletionSuccess=La prueba de cancelación de la suscripción se ejecutó correctamente
SynchroMailManEnabled=Se realizará una actualización Mailman
SynchroSpipEnabled=Se realizará una actualización de Spip
-DescADHERENT_MAILMAN_ADMINPW=Contraseña del administrador de Mailman
DescADHERENT_MAILMAN_URL=URL para las suscripciones de Mailman
DescADHERENT_MAILMAN_UNSUB_URL=URL para cancelación de suscripciones de Mailman
DescADHERENT_MAILMAN_LISTS=Lista(s) para la inscripción automática de nuevos miembros (separados por una coma)
diff --git a/htdocs/langs/es_EC/projects.lang b/htdocs/langs/es_EC/projects.lang
index 7ac28478c77..c87a5444272 100644
--- a/htdocs/langs/es_EC/projects.lang
+++ b/htdocs/langs/es_EC/projects.lang
@@ -165,7 +165,6 @@ NewTaskRefSuggested=Referencia de tarea ya utilizada, se requiere una nueva refe
TimeSpentInvoiced=Tiempo gastado facturado
TimeSpentForIntervention=Tiempo usado
TimeSpentForInvoice=Tiempo usado
-ServiceToUseOnLines=Service to use on lines by default
InvoiceGeneratedFromTimeSpent=La factura %s se ha generado a partir del tiempo dedicado al proyecto
ProjectBillTimeDescription=Verifique si ingresa la hoja de tiempo en las tareas del proyecto Y planea generar factura(s) de la hoja de tiempo para facturar al cliente del proyecto (no verifique si planea crear una factura que no se base en las hojas de tiempo ingresadas). Nota: Para generar la factura, vaya a la pestaña 'Tiempo empleado' del proyecto y seleccione las líneas para incluir.
UsageBillTimeShort=Uso: Tiempo a facturar
diff --git a/htdocs/langs/es_EC/ticket.lang b/htdocs/langs/es_EC/ticket.lang
index 657aba67728..1580632c9ad 100644
--- a/htdocs/langs/es_EC/ticket.lang
+++ b/htdocs/langs/es_EC/ticket.lang
@@ -53,7 +53,6 @@ TicketAssigned=Ticket ahora está asignado
TicketChangeCategory=Cambiar código analítico
TicketChangeSeverity=Cambiar severidad
TicketAddMessage=Añade un mensaje
-AddMessage=Añade un mensaje
MessageSuccessfullyAdded=Ticket agregado
TicketMessageSuccessfullyAdded=Mensaje agregado con éxito
TicketMessagesList=Lista de mensajes
@@ -65,9 +64,6 @@ TicketDurationAutoInfos=Duración calculada automáticamente a partir de interve
SendMessageByEmail=Enviar mensaje por correo electrónico
ErrorMailRecipientIsEmptyForSendTicketMessage=El destinatario está vacío. No se envio el correo electrónico
TicketMessageMailIntroHelp=Este texto se agrega solo al comienzo del correo electrónico y no se guardará.
-TicketMessageMailSignatureHelp=Este texto se agrega solo al final del correo electrónico y no se guardará.
-TicketMessageMailSignatureLabelAdmin=Firma del correo electrónico de respuesta
-TicketMessageMailSignatureHelpAdmin=Este texto se inserta después del mensaje de respuesta.
TicketMessageHelp=Solo este texto se guardará en la lista de mensajes en la tarjeta de tickets.
TicketTimeToRead=Tiempo transcurrido antes de leer
TicketContacts=Boleto de contactos
diff --git a/htdocs/langs/es_ES/commercial.lang b/htdocs/langs/es_ES/commercial.lang
index 5fe49a5b4f4..8292b6391d6 100644
--- a/htdocs/langs/es_ES/commercial.lang
+++ b/htdocs/langs/es_ES/commercial.lang
@@ -68,13 +68,22 @@ ActionAC_OTH_AUTO=Eventos creados automáticamente
ActionAC_MANUAL=Eventos creados manualmente
ActionAC_AUTO=Eventos creados automáticamente
ActionAC_OTH_AUTOShort=Auto
+ActionAC_EVENTORGANIZATION=Eventos de organización
Stats=Estadísticas de venta
StatusProsp=Estado prospección
DraftPropals=Presupuestos borrador
NoLimit=Sin límite
ToOfferALinkForOnlineSignature=Enlace para la firma en línea
-WelcomeOnOnlineSignaturePage=Bienvenido a la página para aceptar presupuestos de %s
-ThisScreenAllowsYouToSignDocFrom=Esta pantalla le permite aceptar y firmar, o rechazar, una presupuesto/propuesta comercial
-ThisIsInformationOnDocumentToSign=Esta es la información del documento para aceptar o rechazar
+WelcomeOnOnlineSignaturePageProposal=Bienvenido a la página para firmar presupuestos de %s
+WelcomeOnOnlineSignaturePageContract=Bienvenido a la página para firmar contratos de %s
+WelcomeOnOnlineSignaturePageFichinter=Bienvenido a la página para firmar intervenciones de %s
+ThisScreenAllowsYouToSignDocFromProposal=Esta página permite aceptar y firmar o rechazar un presupuesto o propuesta comercial.
+ThisScreenAllowsYouToSignDocFromContract=Esta página permite aceptar y firmar el contrato PDF online.
+ThisScreenAllowsYouToSignDocFromFichinter=Esta página permite aceptar y firmar una intervención en formato PDF online.
+ThisIsInformationOnDocumentToSignProposal=Esta es la información del presupuesto para aceptar o rechazar
+ThisIsInformationOnDocumentToSignContract=Esta es la información del contrato a firmar
+ThisIsInformationOnDocumentToSignFichinter=Esta es la información de la intervención a firmar
SignatureProposalRef=Firma del presupuesto/propuesta comercial %s
+SignatureContractRef=Firma del contrato %s
+SignatureFichinterRef=Firma de la intervención %s
FeatureOnlineSignDisabled=Característica para la firma en línea inhabilitada o documento generado antes de que se habilitara la característica
diff --git a/htdocs/langs/es_ES/interventions.lang b/htdocs/langs/es_ES/interventions.lang
index 83471928031..b335c533713 100644
--- a/htdocs/langs/es_ES/interventions.lang
+++ b/htdocs/langs/es_ES/interventions.lang
@@ -66,3 +66,8 @@ RepeatableIntervention=Plantilla de intervención
ToCreateAPredefinedIntervention=Para crear una intervención predefinida o recurrente, cree una intervención común y conviértala en plantilla de intervención
ConfirmReopenIntervention=¿Está seguro de querer volver a abrir la intervención %s ?
GenerateInter=Generar intervención
+FichinterNoContractLinked=La intervención %s se ha creado sin un contacto vinculado.
+ErrorFicheinterCompanyDoesNotExist=La compañía no existe, la intervención no se ha creado.
+NextDateToIntervention=Fecha para la próxima generación de intervención
+AllowOnlineSign=Permitir firma online
+AllowExternalDownload=Permitir descarga externa
\ No newline at end of file
diff --git a/htdocs/langs/es_ES/main.lang b/htdocs/langs/es_ES/main.lang
index 2af1c00c5cf..00488783f8a 100644
--- a/htdocs/langs/es_ES/main.lang
+++ b/htdocs/langs/es_ES/main.lang
@@ -926,6 +926,7 @@ DirectDownloadInternalLink=Enlace de descarga privado
PrivateDownloadLinkDesc=Debe iniciar sesión y necesita permisos para ver o descargar el archivo
Download=Descargar
DownloadDocument=Descargar el documento
+DownloadSignedDocument=Descargar el documento firmado
ActualizeCurrency=Actualizar el tipo de cambio
Fiscalyear=Año fiscal
ModuleBuilder=Módulo Builder
diff --git a/htdocs/langs/es_ES/propal.lang b/htdocs/langs/es_ES/propal.lang
index 2f31aab4e89..159daf31178 100644
--- a/htdocs/langs/es_ES/propal.lang
+++ b/htdocs/langs/es_ES/propal.lang
@@ -103,11 +103,15 @@ IdProposal=ID de Presupuesto
IdProduct=ID del Producto
LineBuyPriceHT=Precio de compra Importe neto de impuestos por línea
SignPropal=Aceptar presupuesto
+SignContract=Firmar contrato
+SignFichinter=Firmar intervención
RefusePropal=Rechazar presupuesto
Sign=Firma
NoSign=Establecer no firmado
PropalAlreadySigned=Presupuesto ya aceptado
PropalAlreadyRefused=Presupuesto ya rechazado
PropalSigned=Presupuesto aceptado
+ContractSigned=Contrato firmado
+FichinterSigned=Intervención firmada
PropalRefused=Presupuesto rechazado
ConfirmRefusePropal=¿Está seguro de querer rechazar este presupuesto?
diff --git a/htdocs/langs/es_GT/members.lang b/htdocs/langs/es_GT/members.lang
deleted file mode 100644
index 5f7a2ff4020..00000000000
--- a/htdocs/langs/es_GT/members.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - members
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
diff --git a/htdocs/langs/es_GT/projects.lang b/htdocs/langs/es_GT/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/es_GT/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/es_HN/members.lang b/htdocs/langs/es_HN/members.lang
deleted file mode 100644
index 5f7a2ff4020..00000000000
--- a/htdocs/langs/es_HN/members.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - members
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
diff --git a/htdocs/langs/es_HN/projects.lang b/htdocs/langs/es_HN/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/es_HN/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/es_MX/accountancy.lang b/htdocs/langs/es_MX/accountancy.lang
index 1ae2423f16f..ef79a5fabff 100644
--- a/htdocs/langs/es_MX/accountancy.lang
+++ b/htdocs/langs/es_MX/accountancy.lang
@@ -125,4 +125,3 @@ ExportDraftJournal=Exportar borrador de diario
SomeMandatoryStepsOfSetupWereNotDone=Algunos pasos obligatorios de la instalación no se realizaron, favor de completar
ExportNotSupported=El formato de exportación configurado no se admite en esta página
NoJournalDefined=Ningún diario definido
-InventoryJournal=Diario de inventario
diff --git a/htdocs/langs/es_MX/admin.lang b/htdocs/langs/es_MX/admin.lang
index 8c57272b7ea..4097de49b9f 100644
--- a/htdocs/langs/es_MX/admin.lang
+++ b/htdocs/langs/es_MX/admin.lang
@@ -238,7 +238,6 @@ ExtrafieldSelectList =Seleccionar de la tabla
ComputedFormula=Campo calculado
Computedpersistent=Almacenar campo calculado
SetAsDefault=Establecer como predeterminado
-InitEmptyBarCode=Init value for the %s empty barcodes
ClickToShowDescription=Haga clic para mostrar la descripción
DependsOn=Este módulo necesita los módulo(s)
WarningSettingSortOrder=Advertencia, establecer un orden predeterminado puede resultar en un error técnico al pasar a la página de lista si "campo" es un campo desconocido. Si experimenta un error de este tipo, vuelva a esta página para eliminar el orden predeterminado y restaurar el comportamiento predeterminado.
diff --git a/htdocs/langs/es_PA/members.lang b/htdocs/langs/es_PA/members.lang
deleted file mode 100644
index 5f7a2ff4020..00000000000
--- a/htdocs/langs/es_PA/members.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - members
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
diff --git a/htdocs/langs/es_PA/projects.lang b/htdocs/langs/es_PA/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/es_PA/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/es_PE/members.lang b/htdocs/langs/es_PE/members.lang
deleted file mode 100644
index 5f7a2ff4020..00000000000
--- a/htdocs/langs/es_PE/members.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - members
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
diff --git a/htdocs/langs/es_PY/members.lang b/htdocs/langs/es_PY/members.lang
deleted file mode 100644
index 5f7a2ff4020..00000000000
--- a/htdocs/langs/es_PY/members.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - members
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
diff --git a/htdocs/langs/es_PY/projects.lang b/htdocs/langs/es_PY/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/es_PY/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/es_US/members.lang b/htdocs/langs/es_US/members.lang
deleted file mode 100644
index 5f7a2ff4020..00000000000
--- a/htdocs/langs/es_US/members.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - members
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
diff --git a/htdocs/langs/es_US/projects.lang b/htdocs/langs/es_US/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/es_US/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/es_UY/members.lang b/htdocs/langs/es_UY/members.lang
deleted file mode 100644
index 5f7a2ff4020..00000000000
--- a/htdocs/langs/es_UY/members.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - members
-ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded. Please find your invoice here enclosed.
-CanEditAmount=Visitor can choose/edit amount of its contribution regardless of the member type
diff --git a/htdocs/langs/es_UY/projects.lang b/htdocs/langs/es_UY/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/es_UY/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/es_VE/admin.lang b/htdocs/langs/es_VE/admin.lang
index 33ac1c8513d..5ac3d8e921b 100644
--- a/htdocs/langs/es_VE/admin.lang
+++ b/htdocs/langs/es_VE/admin.lang
@@ -5,7 +5,6 @@ ConfirmPurgeSessions=¿De verdad quieres purgar todas las sesiones? Esto descone
SetupArea=Parametrizaje
NotConfigured=Módulo / Aplicación no configurada
GenericMaskCodes3=Cualquier otro carácter en la máscara se quedará sin cambios. No se permiten espacios
-InitEmptyBarCode=Init value for the %s empty barcodes
Module1780Desc=Crear etiquetas/Categoría (Productos, clientes, proveedores, contactos y miembros)
Permission254=Modificar la contraseña de otros usuarios
Permission255=Eliminar o desactivar otros usuarios
diff --git a/htdocs/langs/es_VE/projects.lang b/htdocs/langs/es_VE/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/es_VE/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/fr_CA/admin.lang b/htdocs/langs/fr_CA/admin.lang
index a04f84af674..d9c277fcdf6 100644
--- a/htdocs/langs/fr_CA/admin.lang
+++ b/htdocs/langs/fr_CA/admin.lang
@@ -72,7 +72,6 @@ ExtrafieldCheckBoxFromList=Les cases à cocher du tableau
ExtrafieldLink=Lier à un objet
LibraryToBuildPDF=Bibliothèque utilisée pour la génération de PDF
CurrentlyNWithoutBarCode=Actuellement, vous avez %s enregistrements sur %s %s sans code à barres défini.
-InitEmptyBarCode=Init value for the %s empty barcodes
ConfirmEraseAllCurrentBarCode=Êtes-vous sûr de vouloir effacer toutes les valeurs actuelles du code-barres?
EnableFileCache=Activer le cache de fichiers
DisplayCompanyManagers=Afficher les noms des gestionnaires
diff --git a/htdocs/langs/fr_CA/commercial.lang b/htdocs/langs/fr_CA/commercial.lang
index fe52f49e25d..0f68fbd09db 100644
--- a/htdocs/langs/fr_CA/commercial.lang
+++ b/htdocs/langs/fr_CA/commercial.lang
@@ -9,5 +9,3 @@ SaleRepresentativesOfThirdParty=Représentants commerciaux de tiers
LastDoneTasks=Dernières %s actions complétées
LastActionsToDo=Le plus ancien %s actions non complétées
ActionAC_OTH_AUTO=Événements insérés automatiquement
-ThisScreenAllowsYouToSignDocFrom=Cet écran vous permet d'accepter et signer ou de refuser le devis ou la proposition commerciale
-ThisIsInformationOnDocumentToSign=Ceci est une information sur le document à accepter ou à refuser
diff --git a/htdocs/langs/fr_CA/ecm.lang b/htdocs/langs/fr_CA/ecm.lang
index d660995b9f5..c6a678b714f 100644
--- a/htdocs/langs/fr_CA/ecm.lang
+++ b/htdocs/langs/fr_CA/ecm.lang
@@ -5,7 +5,6 @@ ECMSectionsManual=Arbre manuel
ECMSectionsAuto=Arbre automatique
ECMAddSection=Ajouter un répertoire
ECMCreationDate=Date création
-ECMAreaDesc2=* Les répertoires automatiques sont remplis automatiquement lors de l'ajout de documents à partir d'une carte d'un élément. * Les répertoires manuels peuvent être utilisés pour enregistrer des documents non liés à un élément particulier.
ECMSectionWasRemoved=Le répertoire %s a été supprimé.
ECMSectionOfDocuments=Répertoires de documents
ShowECMSection=Afficher le répertoire
diff --git a/htdocs/langs/fr_CA/errors.lang b/htdocs/langs/fr_CA/errors.lang
index 86d639a66e5..2560a86fb1b 100644
--- a/htdocs/langs/fr_CA/errors.lang
+++ b/htdocs/langs/fr_CA/errors.lang
@@ -51,7 +51,6 @@ ErrorLDAPMakeManualTest=Un fichier .ldif a été généré dans le répertoire %
ErrorModuleRequireJavascript=Javascript ne doit pas être désactivé pour que cette fonction fonctionne. Pour activer / désactiver Javascript, accédez au menu Accueil-> Configuration-> Affichage.
ErrorPasswordsMustMatch=Les deux mots de passe dactylographiés doivent correspondre les uns aux autres
ErrorFileIsInfectedWithAVirus=Le programme antivirus n'a pas pu valider le fichier (le fichier peut être infecté par un virus)
-ErrorSpecialCharNotAllowedForField=Les caractères spéciaux ne sont pas autorisés pour le champ "%s"
ErrorNumRefModel=Une référence existe dans la base de données (%s) et n'est pas compatible avec cette règle de numérotation. Supprimez l'enregistrement ou la renommée référence pour activer ce module.
ErrorBadMaskBadRazMonth=Erreur, mauvaise valeur de réinitialisation
ErrorCounterMustHaveMoreThan3Digits=Le compteur doit avoir plus de 3 chiffres
diff --git a/htdocs/langs/fr_FR/accountancy.lang b/htdocs/langs/fr_FR/accountancy.lang
index 83d10982ca2..53edef4c0a1 100644
--- a/htdocs/langs/fr_FR/accountancy.lang
+++ b/htdocs/langs/fr_FR/accountancy.lang
@@ -59,6 +59,7 @@ MainAccountForSuppliersNotDefined=Compte comptable général pour les fournisseu
MainAccountForUsersNotDefined=Compte comptable général pour les utilisateurs non défini dans la configuration
MainAccountForVatPaymentNotDefined=Compte comptable général pour les paiements de TVA non défini dans la configuration
MainAccountForSubscriptionPaymentNotDefined=Le compte comptable général des paiements de cotisations n'est pas défini dans la configuration
+UserAccountNotDefined=Compte comptable pour l'utilisateur non défini dans la configuration
AccountancyArea=Espace comptabilité
AccountancyAreaDescIntro=L'utilisation du module de comptabilité se fait en plusieurs étapes:
@@ -185,7 +186,7 @@ ADHERENT_SUBSCRIPTION_ACCOUNTINGACCOUNT=Compte comptable pour enregistrer les ad
ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Compte comptable par défaut pour les acomptes clients
UseAuxiliaryAccountOnCustomerDeposit=Enregistrer le compte client comme compte individuel dans le grand livre auxiliaire pour les lignes d'acompte (si désactivé, le compte individuel pour les lignes d'acompte restera vide)
ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Compte comptable par défaut pour enregistrer l'acompte fournisseur
-UseAuxiliaryAccountOnSupplierDeposit=Store supplier account as individual account in subsidiary ledger for lines of down payments (if disabled, individual account for down payment lines will remain empty)
+UseAuxiliaryAccountOnSupplierDeposit=Stocker le compte fournisseur comme compte individuel dans le grand livre auxiliaire pour les lignes d'acomptes (si désactivé, le compte individuel pour les lignes d'acompte restera vide)
ACCOUNTING_PRODUCT_BUY_ACCOUNT=Compte comptable par défaut pour les produits achetés (utilisé si non défini dans la fiche produit)
ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Compte comptable par défaut pour les produits achetés dans la CEE (utilisé si non défini dans la fiche produit)
@@ -286,7 +287,7 @@ DescClosure=Consultez ici le nombre de mouvements par mois non encore validés &
OverviewOfMovementsNotValidated=Aperçu des mouvements non validés et verrouillés
AllMovementsWereRecordedAsValidated=Tous les mouvements ont été enregistrés comme validés et ont été verrouillés
NotAllMovementsCouldBeRecordedAsValidated=Certains mouvements n'ont pas pu être enregistrés comme validés et n'ont pas été verrouillés
-ValidateMovements=Valider et verrouiller l'enregistrement...
+ValidateMovements=Valider et verrouiller les mouvements...
DescValidateMovements=Toute modification ou suppression d'écriture, de lettrage et de suppression sera interdite. Toutes les entrées pour un exercice doivent être validées, sinon la fermeture ne sera pas possible
ValidateHistory=Lier automatiquement
@@ -401,7 +402,11 @@ Calculated=Calculé
Formula=Formule
## Reconcile
+LetteringAuto=Rapprocher automatiquement
+LetteringManual=Rapprocher manuel
Unlettering=Annuler le rapprochement
+UnletteringAuto=Annuler le rapprochement automatique
+UnletteringManual=Annuler rapprochement manuel
AccountancyNoLetteringModified=Pas de rapprochement modifié
AccountancyOneLetteringModifiedSuccessfully=Un rapprochement modifié avec succès
AccountancyLetteringModifiedSuccessfully=%s rapprochements modifiés avec succès
@@ -410,8 +415,9 @@ AccountancyOneUnletteringModifiedSuccessfully=Une annulation de rapprochement mo
AccountancyUnletteringModifiedSuccessfully=%s annulations de rapprochement modifiées avec succès
## Confirm box
-ConfirmMassUnlettering=Confirmation d'annulation de rapprochement en masse
-ConfirmMassUnletteringQuestion=Êtes-vous sûr de vouloir annuler le rapprochement de(s) %s enregistrement(s) sélectionné(s) ?
+ConfirmMassUnletteringAuto=Confirmation d'annulation de rapprochement automatique
+ConfirmMassUnletteringManual=Confirmation de dé-rapprochement manuel
+ConfirmMassUnletteringQuestion=Voulez-vous vraiment annuler le rapprochement des %s enregistrements sélectionnés ?
ConfirmMassDeleteBookkeepingWriting=Confirmation de suppression en masse
ConfirmMassDeleteBookkeepingWritingQuestion=Cela supprimera la transaction de la comptabilité (toutes les lignes liées à la même transaction seront supprimées). Êtes-vous sûr de vouloir supprimer le(s) %s enregistrement(s) sélectionné(s) ?
diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang
index 3fd0532dba9..431132def6d 100644
--- a/htdocs/langs/fr_FR/admin.lang
+++ b/htdocs/langs/fr_FR/admin.lang
@@ -51,8 +51,6 @@ ClientSortingCharset=Jeu de caractère de tri du client
WarningModuleNotActive=Le module %s doit être activé pour utiliser cette fonction.
WarningOnlyPermissionOfActivatedModules=Attention, seules les permissions en rapport avec les modules activés sont affichées ici. Vous pouvez activer d'autres modules sur la page Accueil->Configuration->Modules.
DolibarrSetup=Installation ou mise à jour de Dolibarr
-InternalUser=Utilisateur interne
-ExternalUser=Utilisateur externe
InternalUsers=Utilisateurs internes
ExternalUsers=Utilisateurs externes
UserInterface=Interface utilisateur
@@ -190,7 +188,7 @@ Compression=Compression
CommandsToDisableForeignKeysForImport=Commande pour désactiver les clés étrangères à l'importation
CommandsToDisableForeignKeysForImportWarning=Requis si vous voulez être en mesure de restaurer votre « dump » SQL plus tard
ExportCompatibility=Compatibilité du fichier d'exportation généré
-ExportUseMySQLQuickParameter=Utiliser le paramètre --quick
+ExportUseMySQLQuickParameter=Utiliser le paramètre --quick
ExportUseMySQLQuickParameterHelp=Le paramètre '--quick' aide à réduire la consommation de RAM pour les longues listes
MySqlExportParameters=Paramètres de l'exportation MySQL
PostgreSqlExportParameters= Paramètres de l'exportation PostgreSQL
@@ -285,7 +283,7 @@ ContentForLines=Contenu à afficher pour chaque produit ou service (à partir de
NoticePeriod=Délai de prévenance
NewByMonth=Mois suivant
Emails=Emails
-EMailsSetup=Configuration Emails
+EMailsSetup=Configuration des mails
EMailsDesc=Cette page permet de définir les paramètres et options d'envoi des e-mails.
EmailSenderProfiles=Expéditeur des e-mails
EMailsSenderProfileDesc=Vous pouvez garder cette section vide. Si vous entrez des emails ici, ils seront ajoutés à la liste des expéditeurs possibles dans la liste déroulante lorsque vous écrivez un nouvel email.
@@ -338,7 +336,7 @@ MenuHandlers=Gestionnaires de menu
MenuAdmin=Édition menu
DoNotUseInProduction=Ne pas utiliser en production
ThisIsProcessToFollow=Procédure de mise à jour:
-ThisIsAlternativeProcessToFollow=Voici une procédure de configuration alternative
+ThisIsAlternativeProcessToFollow=Voici une procédure de configuration alternative
StepNb=Étape %s
FindPackageFromWebSite=Rechercher le paquet qui répond à votre besoin (par exemple sur le site web %s).
DownloadPackageFromWebSite=Télécharger le package (par exemple depuis le site web officiel %s)
@@ -439,8 +437,10 @@ Unique=Unique
Boolean=Boolean (case à cocher unique)
ExtrafieldPhone = Téléphone
ExtrafieldPrice = Prix
+ExtrafieldPriceWithCurrency=Prix avec devise
ExtrafieldMail = Email
ExtrafieldUrl = Url
+ExtrafieldIP = IP
ExtrafieldSelect = Liste de sélection
ExtrafieldSelectList = Liste issue d'une table
ExtrafieldSeparator=Séparateur (il ne s'agit pas d'un champ de saisie)
@@ -501,7 +501,7 @@ WarningPHPMail=AVERTISSEMENT: la configuration pour envoyer des e-mails à parti
WarningPHPMailA= - L'utilisation des serveurs de prestataires de messagerie augmente le niveau confiance des e-mails, cela augmente donc les chances de délivrabilité en n'étant pas considéré comme spam.
WarningPHPMailB=- Certains fournisseurs de services de messagerie (comme Yahoo) ne vous permettent pas d'envoyer un e-mail à partir d'un autre serveur que leur propre serveur. Votre configuration actuelle utilise le serveur de l'application pour envoyer des e-mails et non le serveur de votre fournisseur de messagerie, donc certains destinataires (ceux compatibles avec le protocole DMARC restrictif), demanderont à votre fournisseur de messagerie si ils peuvent accepter votre message et ce fournisseur de messagerie (comme Yahoo) peut répondre «non» parce que le serveur d'envoi n'est pas le leur, aussi une partie de vos e-mails envoyés peuvent ne pas être acceptés pour la livraison (faites également attention au quota d'envoi de votre fournisseur de messagerie).
WarningPHPMailC=- Utiliser le serveur SMTP de votre propre fournisseur de services de messagerie pour envoyer des e-mails est également intéressant afin que tous les e-mails envoyés depuis l'application soient également enregistrés dans votre répertoire "Envoyés" de votre boîte aux lettres.
-WarningPHPMailD=Aussi, il est recommandé de changer le mode d'envoi des e-mails à la valeur "SMTP". Si vous souhaitez vraiment conserver la méthode "PHP" par défaut pour envoyer des e-mails, ignorez simplement cet avertissement ou supprimez-le en définissant la constante MAIN_HIDE_WARNING_TO_ENCOURAGE_SMTP_SETUP sur 1 dans Accueil - Configuration - Autre.
+WarningPHPMailD=Aussi, il est recommandé de changer le mode d'envoi des e-mails à la valeur "SMTP". Si vous souhaitez vraiment conserver la méthode "PHP" par défaut pour envoyer des e-mails, ignorez simplement cet avertissement ou supprimez-le en définissant la constante MAIN_HIDE_WARNING_TO_ENCOURAGE_SMTP_SETUP sur 1 dans Accueil - Configuration - Divers.
WarningPHPMail2=Si votre fournisseur de messagerie SMTP a besoin de restreindre le client de messagerie à certaines adresses IP (très rare), voici l'adresse IP du mail user agent (MUA) de votre application CRM ERP : %s .
WarningPHPMailSPF=Si le nom de domaine de votre adresse e-mail d'expéditeur est protégé par un enregistrement SPF (demandez à votre fournisseur de nom de domaine), vous devez inclure les adresses IP suivantes dans l'enregistrement SPF du DNS de votre domaine: %s .
ActualMailSPFRecordFound=Enregistrement SPF réel trouvé (pour l'e-mail %s) : %s
@@ -842,9 +842,9 @@ Permission286=Exporter les contacts
Permission291=Consulter les tarifs
Permission292=Définir les permissions sur les tarifs
Permission293=Modifier les tarifs clients
-Permission300=Consulter les codes-barres
-Permission301=Créer/modifier les codes-barres
-Permission302=Supprimer les codes-barres
+Permission301=Générer le PDF du code barre
+Permission304=Créer/modifier les codes-barres
+Permission305=Supprimer les codes-barres
Permission311=Consulter les services
Permission312=Affecter le service/abonnement au contrat
Permission331=Lire les marque-pages
@@ -1081,6 +1081,10 @@ DictionaryAssetDisposalType=Type de cession d'actifs
TypeOfUnit=Type d'unité
SetupSaved=Configuration sauvegardée
SetupNotSaved=Configuration non enregistrée
+OAuthServiceConfirmDeleteTitle=Supprimer l'entrée OAuth
+OAuthServiceConfirmDeleteMessage=Voulez-vous vraiment supprimer cette entrée OAuth ? Tous les jetons existants pour celui-ci seront également supprimés.
+ErrorInEntryDeletion=Erreur lors de la suppression de l'entrée
+EntryDeleted=Entrée supprimée
BackToModuleList=Retour liste des modules
BackToDictionaryList=Retour liste des dictionnaires
TypeOfRevenueStamp=Type de timbre fiscal
@@ -1238,7 +1242,7 @@ BrowserName=Nom du navigateur
BrowserOS=OS du navigateur
ListOfSecurityEvents=Liste des événements de sécurité Dolibarr
SecurityEventsPurged=Evenement de sécurité purgés
-TrackableSecurityEvents=Trackable security events
+TrackableSecurityEvents=événement de sécurité traçable
LogEventDesc=Vous pouvez activer ici l'historique des événements d'audit de sécurité. Cet historique est consultable par les administrateurs dans le menu %s - %s . Attention, cette fonctionnalité peut générer un gros volume de données.
AreaForAdminOnly=Les paramètres d'installation ne peuvent être remplis que par les utilisateurs administrateurs uniquement.
SystemInfoDesc=Les informations systèmes sont des informations techniques diverses accessibles en lecture seule aux administrateurs uniquement.
@@ -1381,7 +1385,7 @@ NumberingModules=Modèles de numérotation
DocumentModules=Modèles de documents
##### Module password generation
PasswordGenerationStandard=Renvoie un mot de passe généré selon l'algorythme interne de Dolibarr :%s caractères contenant chiffres et minuscules
-PasswordGenerationNone=Ne pas suggérer un mot de passe généré. Le mot de passe doit être entré manuellement.
+PasswordGenerationNone=Ne pas suggérer un mot de passe généré. Le mot de passe doit être entré manuellement.
PasswordGenerationPerso=Renvoie un mot de passe en fonction d'une configuration personnalisée.
SetupPerso=Selon votre configuration
PasswordPatternDesc=Description du masque du mot de passe
@@ -1459,7 +1463,7 @@ OrdersNumberingModules=Modèles de numérotation des commandes
OrdersModelModule=Modèles de document des commandes
FreeLegalTextOnOrders=Mention complémentaire sur les commandes
WatermarkOnDraftOrders=Filigrane sur les brouillons de commandes (aucun si vide)
-ShippableOrderIconInList=Ajouter une icône dans la liste des commandes qui indique si la commande est expédiable.
+ShippableOrderIconInList=Ajouter une icône dans la liste des commandes qui indique si la commande est expédiable.
BANK_ASK_PAYMENT_BANK_DURING_ORDER=Demander le compte bancaire cible durant la commande
##### Interventions #####
InterventionsSetup=Configuration du module Interventions
@@ -1614,7 +1618,7 @@ LDAPFieldUserid=Id utilisateur
LDAPFieldUseridExample=Exemple: uidnumber
LDAPFieldHomedirectory=Répertoire racine
LDAPFieldHomedirectoryExample=Exemple: homedirectory
-LDAPFieldHomedirectoryprefix=Répertoire racine
+LDAPFieldHomedirectoryprefix=Préfixe du répertoire racine
LDAPSetupNotComplete=Configuration LDAP incomplète (à compléter sur les autres onglets)
LDAPNoUserOrPasswordProvidedAccessIsReadOnly=Administrateur ou mot de passe non renseigné. Les accès LDAP seront donc anonymes et en lecture seule.
LDAPDescContact=Cette page permet de définir le nom des attributs de l'arbre LDAP pour chaque information des contacts Dolibarr.
@@ -1649,7 +1653,7 @@ TestNotPossibleWithCurrentBrowsers=Une détection automatique n'est pas possible
DefaultValuesDesc=Vous pouvez définir/forcer ici la valeur par défaut que vous voulez obtenir lorsque vous créez un nouvel enregistrement, et/ou les filtres par défaut ou ordre de tri des listes.
DefaultCreateForm=Valeurs par défaut (sur les formulaires de création)
DefaultSearchFilters=Filtres de recherche par défaut
-DefaultSortOrder=Ordre de tri par défaut
+DefaultSortOrder=Ordre de tri par défaut
DefaultFocus=Champs par défaut ayant le focus
DefaultMandatory=Champs de formulaire obligatoires
##### Products #####
@@ -1743,7 +1747,8 @@ FCKeditorForNotePublic=Création/édition WYSIWIG du champ notes publiques des
FCKeditorForNotePrivate=Création/édition WYSIWIG du champ notes privées des éléments
FCKeditorForCompany=Création/édition WYSIWIG de la description des éléments (autre que produits/services)
FCKeditorForProduct=Création/édition WYSIWIG du champ description des produits/services
-FCKeditorForProductDetails=Création/édition WYSIWYG des lignes de détails produits sur tous les éléments (commandes, propales, factures, etc...). Attention: L'utilisation pour ce cas est fortement déconseillée car peut créer des problèmes dans la gestion de caractères et mise en page des fichiers PDF générés.
+FCKeditorForProductDetails=Création/édition WYSIWYG des lignes de détails produits sur tous les éléments (commandes, propales, factures, etc...).
+FCKeditorForProductDetails2=Attention: L'utilisation pour ce cas est fortement déconseillée car peut créer des problèmes dans la gestion de caractères et mise en page des fichiers PDF générés.
FCKeditorForMailing= Création/édition WYSIWIG des emailings (Outils->Emailings)
FCKeditorForUserSignature=Création/édition WYSIWIG de la signature des utilisateurs
FCKeditorForMail=Création/édition WYSIWIG tous les emails (sauf Outils->Emailings)
@@ -1766,7 +1771,7 @@ DetailMenuHandler=Nom du gestionnaire menu dans lequel faire apparaitre le nouve
DetailMenuModule=Nom du module si l'entrée menu est issue d'un module
DetailType=Type de menu (top ou left)
DetailTitre=Libellé du menu ou code libellé à traduire
-DetailUrl=URL vers laquelle le menu pointe (Lien URL absolu ou lien externe avec http://)
+DetailUrl=URL où le menu vous envoie (lien URL relatif ou lien externe avec https://)
DetailEnabled=Condition d'affichage ou non
DetailRight=Condition d'affichage plein ou grisé
DetailLangs=Fichier .lang pour la traduction du code libellé
@@ -1871,7 +1876,7 @@ ChequeReceiptsNumberingModule=Module de numérotation des bordereaux de remises
MultiCompanySetup=Configuration du module Multi-société
##### Suppliers #####
SuppliersSetup=Configuration du module Fournisseurs
-SuppliersCommandModel=Modèle de commande fournisseur complet
+SuppliersCommandModel=Modèle de commande fournisseur complet
SuppliersCommandModelMuscadet=Modèle de commande fournisseur complet (ancienne implémentation du modèle Cornas)
SuppliersInvoiceModel=Modèle de facture fournisseur complet
SuppliersInvoiceNumberingModel=Modèles de numérotation des factures fournisseur
@@ -1906,7 +1911,7 @@ NbMajMin=Nombre minimal de caractères majuscules
NbNumMin=Nombre minimal de caractères numériques
NbSpeMin=Nombre minimal de caractères spéciaux
NbIteConsecutive=Nombre maximal de répétition des mêmes caractères
-NoAmbiCaracAutoGeneration=Ne pas utiliser des caractères ambigus ("1","l","i","|","0","O") pour la génération automatique
+NoAmbiCaracAutoGeneration=Ne pas utiliser des caractères ambigus ("1","l","i","|","0","O") pour la génération automatique
SalariesSetup=Configuration du module salaires
SortOrder=Ordre de tri
Format=Format
@@ -1927,7 +1932,7 @@ GoOntoContactCardToAddMore=Rendez-vous sur l'onglet "Notifications" d'un tiers p
Threshold=Seuil
BackupDumpWizard=Assistant pour créer le fichier dump de la base de données
BackupZipWizard=Assistant pour générer l'archive du répertoire documents
-SomethingMakeInstallFromWebNotPossible=L'installation de module externe est impossible depuis l'interface web pour la raison suivante :
+SomethingMakeInstallFromWebNotPossible=L'installation de module externe est impossible depuis l'interface web pour la raison suivante :
SomethingMakeInstallFromWebNotPossible2=Pour cette raison, le processus de mise à jour décrit ici est une processus manuel que seul un utilisateur ayant des droits privilégiés peut réaliser.
InstallModuleFromWebHasBeenDisabledByFile=L'installation de module externe depuis l'application a été désactivé par l'administrator. Vous devez lui demander de supprimer le fichier %s pour permettre cette fonctionnalité.
ConfFileMustContainCustom=Installer ou créer un module externe à partir de l'application nécessite de sauvegarder les fichiers du module dans le répertoire %s . Pour que ce répertoire soit reconnu par Dolibarr, vous devez paramétrer le fichier de configuration conf/conf.php en ajoutant les 2 lignes suivantes :$dolibarr_main_url_root_alt='/custom' $dolibarr_main_document_root_alt='%s/custom';
@@ -2077,12 +2082,13 @@ loginPassword=Mot de passe
oauthToken=Jeton Oauth2
accessType=Type d'accès
oauthService=Service Oauth
-TokenMustHaveBeenCreated=Module OAuth2 must be enabled and an oauth2 token must have been created with the correct permissions (for example scope "gmail_full" with OAuth for Gmail).
+TokenMustHaveBeenCreated=Le module OAuth2 doit être activé et un token oauth2 doit avoir été créé avec les bonnes permissions (par exemple scope "gmail_full" avec OAuth pour Gmail).
MailboxSourceDirectory=Répertoire source de la boîte aux lettres
MailboxTargetDirectory=Répertoire cible de la boîte aux lettres
EmailcollectorOperations=Opérations à effectuer par le collecteur
EmailcollectorOperationsDesc=Les opérations sont exécutées de haut en bas
MaxEmailCollectPerCollect=Nombre maximum d'emails collectés par collecte
+TestCollectNow=Tester la collecte
CollectNow=Collecter maintenant
ConfirmCloneEmailCollector=Voulez-vous vraiment cloner le collecteur d'e-mails %s ?
DateLastCollectResult=Date de la dernière tentative de collecte
@@ -2106,7 +2112,7 @@ NoNewEmailToProcess=Aucun nouvel email (correspondants aux filtres) à traiter
NothingProcessed=Aucune action faite
XEmailsDoneYActionsDone=%s e-mails pré-qualifiés, %s e-mails traités avec succès (pour %s enregistrement/actions effectuées)
RecordEvent=Enregistrer un événement dans l'agenda (avec le type Email envoyé ou reçu)
-CreateLeadAndThirdParty=Créer un prospect (et un tiers si nécessaire)
+CreateLeadAndThirdParty=Créer une opportunité (et un tiers si nécessaire)
CreateTicketAndThirdParty=Créer un ticket (lié à un tiers si le tiers a été chargé par une opération précédente ou a été deviné à partir d'un tracker en en-tête d'email, sans tiers sinon)
CodeLastResult=Dernier code de retour
NbOfEmailsInInbox=Nombre de courriels dans le répertoire source
@@ -2227,7 +2233,7 @@ NoExternalModuleWithUpdate=Aucune mise à jour trouvée pour les modules externe
SwaggerDescriptionFile=Fichier de description de l’API Swagger (à utiliser avec redoc par exemple)
YouEnableDeprecatedWSAPIsUseRESTAPIsInstead=Vous avez activé l'API WS qui est dépréciée. Vous devriez utiliser l'API REST à la place.
RandomlySelectedIfSeveral=Sélectionnée au hasard si plusieurs images sont disponibles
-SalesRepresentativeInfo=For Proposals, Orders, Invoices.
+SalesRepresentativeInfo=Pour Propositions, Commandes, Factures
DatabasePasswordObfuscated=Le mot de passe de la base de données est masqué dans le fichier de configuration
DatabasePasswordNotObfuscated=Le mot de passe de la base de données n'est PAS masqué dans le fichier de configuration
APIsAreNotEnabled=Les modules API ne sont pas activés
@@ -2309,4 +2315,22 @@ MAIN_MAIL_SMTPS_AUTH_TYPE=Méthode d'authentification
UsePassword=Utiliser mot de passe
UseOauth=Utiliser un token OAUTH
Images=Images
+Posts=publications
MaxNumberOfImagesInGetPost=Nombre maximum d'images autorisées dans un champ HTML soumis dans un formulaire
+MaxNumberOfPostOnPublicPagesByIP=Nombre maximum de publications sur des pages publiques avec une adresse IP
+CIDLookupURL=Le module apporte une URL qui peut être utilisée par un outil externe pour obtenir le nom d'un tiers ou d'un contact à partir de son numéro de téléphone. L'URL à utiliser est :
+ScriptIsEmpty=Le script est manquant
+ShowHideTheNRequests=Afficher/Cacher les %s requête(s) SQL.
+DefinedAPathForAntivirusCommandIntoSetup=Définir un chemin pour un programme antivirus dans %s
+TriggerCodes=Événements déclenchables
+TriggerCodeInfo=Saisissez ici le(s) code(s) déclencheur(s) qui doivent générer la publication d'une requête web (seules les URL externes sont autorisées). Vous pouvez entrer plusieurs codes déclencheurs séparés par une virgule.
+EditableWhenDraftOnly=Si décochée, la valeur ne peut être modifiée que lorsque l'objet a un état de brouillon
+CssOnEdit=CSS sur les pages d'édition
+CssOnView=CSS sur les pages de visualisation
+CssOnList=CSS sur les pages de liste
+HelpCssOnEditDesc=Le CSS utilisé lors de la modification du champ. Exemple : "minwidth100 maxwidth500 widthcentpercentminusx"
+HelpCssOnViewDesc=Le CSS utilisé lors de l'affichage du champ.
+HelpCssOnListDesc=Le CSS utilisé lorsque le champ est à l'intérieur du tableau d'une liste. Exemple : "tdoverflowmax200"
+RECEPTION_PDF_HIDE_ORDERED=Masquer la quantité commandée sur les documents générés pour les réceptions
+MAIN_PDF_RECEPTION_DISPLAY_AMOUNT_HT=Afficher le prix sur les documents générés pour les réceptions
+AllowExternalDownload=Autoriser le téléchargement externe
diff --git a/htdocs/langs/fr_FR/agenda.lang b/htdocs/langs/fr_FR/agenda.lang
index 1ac6cb60597..62dbae7233e 100644
--- a/htdocs/langs/fr_FR/agenda.lang
+++ b/htdocs/langs/fr_FR/agenda.lang
@@ -87,6 +87,7 @@ SupplierInvoiceSentByEMail=Facture fournisseur %s envoyée par email
ShippingSentByEMail=Bon d'expédition %s envoyé par email
ShippingValidated= Expédition %s validée
InterventionSentByEMail=Intervention %s envoyé par email
+ProjectSentByEMail=Projet %s envoyé par email
ProposalDeleted=Proposition commerciale supprimée
OrderDeleted=Commande supprimée
InvoiceDeleted=Facture supprimée
@@ -99,7 +100,7 @@ PRODUCT_MODIFYInDolibarr=Produit %s modifié
PRODUCT_DELETEInDolibarr=Produit%ssupprimé
HOLIDAY_CREATEInDolibarr=Demande de congé %s créée
HOLIDAY_MODIFYInDolibarr=Demande de congé %s modifiée
-HOLIDAY_APPROVEInDolibarr=Demande de congé %s approuvée
+HOLIDAY_APPROVEInDolibarr=Demande de congé %s approuvée
HOLIDAY_VALIDATEInDolibarr=Demande de congé %s validée
HOLIDAY_DELETEInDolibarr=Demande de congé %s supprimée
EXPENSE_REPORT_CREATEInDolibarr=Note de frais %s créée
diff --git a/htdocs/langs/fr_FR/banks.lang b/htdocs/langs/fr_FR/banks.lang
index af88349f585..35de9806932 100644
--- a/htdocs/langs/fr_FR/banks.lang
+++ b/htdocs/langs/fr_FR/banks.lang
@@ -185,4 +185,4 @@ AlreadyOneBankAccount=un compte bancaire est déjà défini
SEPAXMLPlacePaymentTypeInformationInCreditTransfertransactionInformation=Virement SEPA : 'Type de paiement' au niveau 'Virement'
SEPAXMLPlacePaymentTypeInformationInCreditTransfertransactionInformationHelp=A la génération d'un fichier SEPA XML pour les virements, la section "PaymentTypeInformation" peut maintenant être placée dans la section "CreditTransferTransactionInformation" (à la place de la section "Payment").\nNous recommandons fortement de ne pas cocher cette case pour conserver "PaymentTypeInformation" dans "Payment level" car toutes les banques ne l'accepterons pas obligatoirement au niveau de "CreditTransferTransactionInformation". Contactez votre banque avant de modifier ce paramètre.
ToCreateRelatedRecordIntoBank=Pour créer un enregistrement bancaire associé manquant
-BanklineExtraFields=Bank Line Extrafields
+BanklineExtraFields=Extrait de la ligne bancaire
diff --git a/htdocs/langs/fr_FR/bills.lang b/htdocs/langs/fr_FR/bills.lang
index a764b511920..15a7901a2e9 100644
--- a/htdocs/langs/fr_FR/bills.lang
+++ b/htdocs/langs/fr_FR/bills.lang
@@ -448,8 +448,8 @@ PaymentTypeShortVIR=Virement bancaire
PaymentTypePRE=Ordre de prélèvement
PaymentTypePREdetails=(sur compte *-%s)
PaymentTypeShortPRE=Ordre de prélèvement
-PaymentTypeLIQ=Espèce
-PaymentTypeShortLIQ=Espèce
+PaymentTypeLIQ=Espèces
+PaymentTypeShortLIQ=Espèces
PaymentTypeCB=Carte bancaire
PaymentTypeShortCB=Carte bancaire
PaymentTypeCHQ=Chèque
diff --git a/htdocs/langs/fr_FR/bookmarks.lang b/htdocs/langs/fr_FR/bookmarks.lang
index b449ca7110a..355b1b351e4 100644
--- a/htdocs/langs/fr_FR/bookmarks.lang
+++ b/htdocs/langs/fr_FR/bookmarks.lang
@@ -20,3 +20,4 @@ ChooseIfANewWindowMustBeOpenedOnClickOnBookmark=Choisir si le raccourci doit ouv
BookmarksManagement=Gestion des marque-pages
BookmarksMenuShortCut=Ctrl + Maj + m
NoBookmarks=Aucun marque page enregistré
+NoBookmarkFound=Pas de marque-page trouvé.
diff --git a/htdocs/langs/fr_FR/boxes.lang b/htdocs/langs/fr_FR/boxes.lang
index 75c6ccb9ed9..4cb9011885d 100644
--- a/htdocs/langs/fr_FR/boxes.lang
+++ b/htdocs/langs/fr_FR/boxes.lang
@@ -46,6 +46,7 @@ BoxMyLastBookmarks=Mes %s derniers marque-pages
BoxOldestExpiredServices=Plus anciens services expirés
BoxLastExpiredServices=Les %s plus anciens contrats avec services actifs expirés
BoxTitleLastActionsToDo=Les %s derniers événements à réaliser
+BoxTitleOldestActionsToDo=Les %s plus anciens événement non terminés
BoxTitleLastContracts=Les %s derniers contrats modifiés
BoxTitleLastModifiedDonations=Les %s derniers dons modifiés
BoxTitleLastModifiedExpenses=Les %s dernières notes de frais modifiées
diff --git a/htdocs/langs/fr_FR/cashdesk.lang b/htdocs/langs/fr_FR/cashdesk.lang
index 244718df17d..049ee169cef 100644
--- a/htdocs/langs/fr_FR/cashdesk.lang
+++ b/htdocs/langs/fr_FR/cashdesk.lang
@@ -136,10 +136,12 @@ PrintWithoutDetails=Générer sans les détails
YearNotDefined=L'année n'est pas définie
TakeposBarcodeRuleToInsertProduct=Règle de lecture du code barre des produits
TakeposBarcodeRuleToInsertProductDesc=Règle pour extraire la référence produit + une quantité d'un code barre scanné. Si vide (valeur par défaut), l'application utilisera le code-barres complet scanné pour trouver le produit. Si elle est définie, la syntaxe doit être: ref: NB + Qu: NB + QD: NB + autres: NB où NB est le nombre de caractères à utiliser pour extraire les données du code à barres scannés avec: ref : référence produit qu : quantité de jeu lors de l'insertion article (unités) qd: quantité de jeu lors de l'insertion article (décimaux) autre : autres caractères
-HideCategories=Masquer les catégories
-HideStockOnLine=Masquer le stock en ligne
-ShowOnlyProductInStock=Affficher les produits en stock
-ShowCategoryDescription=Afficher la description des catégories
-ShowProductReference=Afficher la référence des produits
-UsePriceHT= Utiliser le prix HT et non en TTC
AlreadyPrinted=Déjà imprimé
+HideCategories=Cacher catégories
+HideStockOnLine=Cacher les stocks sur les lignes
+ShowOnlyProductInStock=Afficher les produits en stock
+ShowCategoryDescription=Afficher la description de la catégorie
+ShowProductReference=Afficher la référence des produits
+UsePriceHT=Utiliser le prix HT et non le prix TTC
+TerminalName=Terminal %s
+TerminalNameDesc=Nom du terminal
diff --git a/htdocs/langs/fr_FR/categories.lang b/htdocs/langs/fr_FR/categories.lang
index 5f478aabc7f..641cf97bacf 100644
--- a/htdocs/langs/fr_FR/categories.lang
+++ b/htdocs/langs/fr_FR/categories.lang
@@ -42,6 +42,7 @@ MemberHasNoCategory=Ce membre n'appartient à aucun(e) tag/catégorie
ContactHasNoCategory=Ce contact n'appartient à aucun(e) tag/catégorie
ProjectHasNoCategory=Ce projet n'est classé dans aucune catégorie
ClassifyInCategory=Ajouter tag/catégorie
+RemoveCategory=Supprimer la catégorie
NotCategorized=Sans tag/catégorie
CategoryExistsAtSameLevel=Ce tag existe déjà avec cette référence
ContentsVisibleByAllShort=Contenu visible par tous
@@ -67,6 +68,7 @@ StockCategoriesShort=Tags/catégories d’entrepôt
ThisCategoryHasNoItems=Cette catégorie ne contient aucun élément.
CategId=ID du(de la) tag/catégorie
ParentCategory=Catégorie parente
+ParentCategoryID=ID de la balise/catégorie parent
ParentCategoryLabel=Libellé du tag/catégorie parent
CatSupList=Liste des tags/catégories des fournisseurs
CatCusList=Liste des tags/catégories des clients/prospects
diff --git a/htdocs/langs/fr_FR/commercial.lang b/htdocs/langs/fr_FR/commercial.lang
index d663185936b..924059a1262 100644
--- a/htdocs/langs/fr_FR/commercial.lang
+++ b/htdocs/langs/fr_FR/commercial.lang
@@ -74,8 +74,12 @@ StatusProsp=Status prospection
DraftPropals=Propositions brouillons
NoLimit=Pas de limite
ToOfferALinkForOnlineSignature=Lien pour signature en ligne
-WelcomeOnOnlineSignaturePage=Bienvenue sur la page pour accepter les propositions commerciales de %s
-ThisScreenAllowsYouToSignDocFrom=Cet écran vous permet d'accepter et signer en ligne, ou de refuser, le devis ou la proposition commerciale
-ThisIsInformationOnDocumentToSign=Voici les informations sur le document à accepter ou refuser
+WelcomeOnOnlineSignaturePageProposal=Bienvenue sur la page pour accepter les propositions commerciales de %s
+WelcomeOnOnlineSignaturePageContract=Bienvenue sur la page de signature du contrat PDF %s
+ThisScreenAllowsYouToSignDocFromProposal=Cet écran vous permet d'accepter et signer en ligne, ou de refuser, le devis ou la proposition commerciale
+ThisScreenAllowsYouToSignDocFromContract=Cet écran vous permet de signer en ligne un contrat au format PDF.
+ThisIsInformationOnDocumentToSignProposal=Voici les informations sur le document à accepter ou refuser
+ThisIsInformationOnDocumentToSignContract=Voici les informations sur le contrat à signer
SignatureProposalRef=Signature du devis ou proposition commerciale %s
+SignatureContractRef=Signature du contrat %s
FeatureOnlineSignDisabled=Fonctionnalité pour la signature en ligne désactivée ou document généré avant l'activation de la fonctionnalité
diff --git a/htdocs/langs/fr_FR/companies.lang b/htdocs/langs/fr_FR/companies.lang
index e875ef168fd..f66d2005c73 100644
--- a/htdocs/langs/fr_FR/companies.lang
+++ b/htdocs/langs/fr_FR/companies.lang
@@ -313,11 +313,11 @@ CustomerAbsoluteDiscountShort=Remise fixe
CompanyHasRelativeDiscount=Ce client a une remise par défaut de %s%%
CompanyHasNoRelativeDiscount=Ce client n'a pas de remise relative par défaut
HasRelativeDiscountFromSupplier=Vous avez une réduction par défaut de %s%% chez ce fournisseur
-HasNoRelativeDiscountFromSupplier=Vous n'avez pas de remise relative par défaut chez ce fournisseur
+HasNoRelativeDiscountFromSupplier=Aucune remise relative par défaut de ce fournisseur
CompanyHasAbsoluteDiscount=Ce client dispose de crédits disponibles (avoirs ou acomptes) pour un montant de %s %s
CompanyHasDownPaymentOrCommercialDiscount=Ce client a une réduction disponible (commercial, acompte) pour %s %s
CompanyHasCreditNote=Ce client a %s %s d'avoirs disponibles
-HasNoAbsoluteDiscountFromSupplier=Vous n'avez aucun crédit de réduction disponible auprès de ce fournisseur
+HasNoAbsoluteDiscountFromSupplier=Aucun rabais/crédit disponible auprès de ce fournisseur
HasAbsoluteDiscountFromSupplier=Vous avez des crédits disponibles (avoirs ou acomptes) pour %s %s chez ce fournisseur
HasDownPaymentOrCommercialDiscountFromSupplier=Vous avez des crédits disponibles (bon de réductions, acomptes) pour %s %s chez ce fournisseur
HasCreditNoteFromSupplier=Vous avez des avoirs pour %s %s chez ce fournisseur
@@ -444,7 +444,7 @@ AddAddress=Créer adresse
SupplierCategory=Catégorie du fournisseur
JuridicalStatus200=Indépendant
DeleteFile=Suppression d'un fichier
-ConfirmDeleteFile=Êtes-vous sûr de vouloir supprimer ce fichier %s ?
+ConfirmDeleteFile=Êtes-vous sûr de vouloir supprimer ce fichier %s ?
AllocateCommercial=Affecter un commercial
Organization=Organisme
FiscalYearInformation=Exercice fiscal
@@ -467,7 +467,7 @@ UniqueThirdParties=Nombre total des tiers
InActivity=Ouvert
ActivityCeased=Clos
ThirdPartyIsClosed=Le tiers est clôturé
-ProductsIntoElements=Liste des produits/services jusqu'à %s
+ProductsIntoElements=Liste des produits/services présents dans %s
CurrentOutstandingBill=Montant encours
OutstandingBill=Montant encours autorisé
OutstandingBillReached=Montant encours autorisé dépassé
@@ -498,3 +498,5 @@ RestOfEurope=Reste de l'Union Européenne (UE)
OutOfEurope=Hors Union Européenne (UE)
CurrentOutstandingBillLate=Montant impayé arrivé à échéance
BecarefullChangeThirdpartyBeforeAddProductToInvoice=Attention : selon votre configuration des prix des produits/services, vous devriez changer le tiers avant d'ajouter le produit
+EmailAlreadyExistsPleaseRewriteYourCompanyName=l'e-mail existe déjà, veuillez réécrire le nom de votre entreprise
+TwoRecordsOfCompanyName=plusieurs fiches existent pour cette entreprise merci de nous contacter pour compléter votre demande de partenariat"
diff --git a/htdocs/langs/fr_FR/contracts.lang b/htdocs/langs/fr_FR/contracts.lang
index 8d89487c5cf..7d6bfc6f2e0 100644
--- a/htdocs/langs/fr_FR/contracts.lang
+++ b/htdocs/langs/fr_FR/contracts.lang
@@ -20,6 +20,7 @@ ContractsSubscriptions=Contrats/Abonnements
ContractsAndLine=Contrats et lignes de contrats
Contract=Contrat
ContractLine=Ligne de contrat
+ContractLines=Lignes du contrat
Closing=Fermé
NoContracts=Pas de contrats
MenuServices=Services
@@ -79,7 +80,7 @@ ConfirmDeleteContractLine=Êtes-vous sûr de vouloir supprimer cette ligne de co
MoveToAnotherContract=Déplacer le service vers un autre contrat de ce tiers.
ConfirmMoveToAnotherContract=J'ai choisi le contrat cible et confirme le déplacement du service dans ce contrat.
ConfirmMoveToAnotherContractQuestion=Choisissez vers quel autre contrat (du même tiers), vous voulez déplacer ce service ?
-PaymentRenewContractId=Renouvellement service (numéro %s)
+PaymentRenewContractId=Renouveler le contrat %s (service %s)
ExpiredSince=Expiré le
NoExpiredServices=Pas de services actifs expirés
ListOfServicesToExpireWithDuration=Liste des services actifs expirant dans %s jours
@@ -100,5 +101,8 @@ TypeContact_contrat_external_BILLING=Contact client facturation contrat
TypeContact_contrat_external_CUSTOMER=Contact client suivi contrat
TypeContact_contrat_external_SALESREPSIGN=Contact client signataire contrat
HideClosedServiceByDefault=Masquer les services fermés par défaut
+AllowOnlineSign=Autoriser la signature en ligne
ShowClosedServices=Afficher les services fermés
HideClosedServices=Masquer les services fermés
+UserStartingService=Utilisateur démarrant le service
+UserClosingService=Utilisateur stoppant le service
diff --git a/htdocs/langs/fr_FR/cron.lang b/htdocs/langs/fr_FR/cron.lang
index 64bf5493285..e851fd5a13a 100644
--- a/htdocs/langs/fr_FR/cron.lang
+++ b/htdocs/langs/fr_FR/cron.lang
@@ -82,10 +82,18 @@ UseMenuModuleToolsToAddCronJobs=Aller à la page "Accueil - Outils
JobDisabled=Travail désactivé
MakeLocalDatabaseDumpShort=Sauvegarde locale de base
MakeLocalDatabaseDump=Créez un fichier dump de base local. Les paramètres sont: compression ('gz' ou 'bz' ou 'none'), type de sauvegarde ('mysql', 'pgsql', 'auto'), 1, 'auto' ou nom du fichier à générer, nombre de fichiers de sauvegarde à garder
+MakeSendLocalDatabaseDumpShort=Envoyer la sauvegarde de la base de données locale
+MakeSendLocalDatabaseDump=Envoyez la sauvegarde de la base de données locale par e-mail. Les paramètres sont : to, from, subject, message, filename (nom du fichier envoyé), filter ('sql' pour la sauvegarde de la base de données uniquement)
+CleanUnfinishedCronjobShort=Nettoyer la tâche planifiée inachevée
+CleanUnfinishedCronjob=Nettoyer la tâche planifiée bloquée dans le traitement lorsque le processus n'est plus en cours d'exécution
WarningCronDelayed=Attention, à des fins de performance, quelle que soit la prochaine date d'exécution des travaux activés, vos travaux peuvent être retardés jusqu'à %s heures avant d'être exécutés.
DATAPOLICYJob=Nettoyeur de données et anonymiseur
JobXMustBeEnabled=La tâche planifiée %s doit être activée
+EmailIfError=E-mail d'avertissement en cas d'erreur
+ErrorInBatch=Erreur lors de l'exécution du travail %s
+
# Cron Boxes
LastExecutedScheduledJob=Dernier travail planifié exécuté
NextScheduledJobExecute=Prochaine travail planifié à exécuter
NumberScheduledJobError=Nombre de travaux planifiées en erreur
+NumberScheduledJobNeverFinished=Nombre de tâches planifiées jamais terminées
diff --git a/htdocs/langs/fr_FR/datapolicy.lang b/htdocs/langs/fr_FR/datapolicy.lang
new file mode 100644
index 00000000000..16ed7ca5933
--- /dev/null
+++ b/htdocs/langs/fr_FR/datapolicy.lang
@@ -0,0 +1,92 @@
+# Copyright (C) 2018 Nicolas ZABOURI
+#
+# 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 .
+
+# Module label 'ModuledatapolicyName'
+Module4100Name = Politique de confidentialité des données
+# Module description 'ModuledatapolicyDesc'
+Module4100Desc = Module de gestion de la confidentialité des données (conformité avec le RGPD)
+
+#
+# Administration page
+#
+datapolicySetup = Configuration de la politique de confidentialité des données du module
+Deletion = Suppression de données
+datapolicySetupPage = En fonction des législations de vos pays (Exemple Article 5 du RGPD), les données personnelles doivent être conservées pendant une durée n'excédant pas celle nécessaire aux finalités pour lesquelles elles ont été collectées, sauf à des fins d'archivage. La suppression se fera automatiquement après une certaine durée sans événement (la durée que vous aurez indiquée ci-dessous).
+NB_MONTHS = %s mois
+ONE_YEAR = 1 an
+NB_YEARS = %s ans
+DATAPOLICY_TIERS_CLIENT = Client
+DATAPOLICY_TIERS_PROSPECT = Prospect
+DATAPOLICY_TIERS_PROSPECT_CLIENT = Prospect/Client
+DATAPOLICY_TIERS_NIPROSPECT_NICLIENT = Ni prospect/Ni client
+DATAPOLICY_TIERS_FOURNISSEUR = Fournisseur
+DATAPOLICY_CONTACT_CLIENT = Client
+DATAPOLICY_CONTACT_PROSPECT = Prospect
+DATAPOLICY_CONTACT_PROSPECT_CLIENT = Prospect/Client
+DATAPOLICY_CONTACT_NIPROSPECT_NICLIENT = Ni prospect/Ni client
+DATAPOLICY_CONTACT_FOURNISSEUR = Fournisseur
+DATAPOLICY_ADHERENT = Adhérent
+DATAPOLICY_Tooltip_SETUP = Type de contact - Indiquez vos choix pour chaque type.
+DATAPOLICYMail = Configuration des e-mails
+DATAPOLICYSUBJECTMAIL = Objet du courriel
+DATAPOLICYCONTENTMAIL = Contenu de l'e-mail
+DATAPOLICYSUBSITUTION = Vous pouvez utiliser les variables suivantes dans votre email (LINKACCEPT permet de créer un lien enregistrant l'accord de la personne, LINKREFUSED permet d'enregistrer le refus de la personne) :
+DATAPOLICYACCEPT = Message après accord
+DATAPOLICYREFUSE = Message après désaccord
+SendAgreementText = Vous pouvez envoyer un e-mail RGPD à tous vos contacts concernés (qui n'ont pas encore reçu d'e-mail et pour lesquels vous n'avez rien enregistré concernant leur accord RGPD). Pour ce faire, utilisez le bouton suivant.
+SendAgreement = Envoyer des emails
+AllAgreementSend = Tous les e-mails ont été envoyés
+TXTLINKDATAPOLICYACCEPT = Texte pour le lien "accord"
+TXTLINKDATAPOLICYREFUSE = Texte pour le lien "désaccord"
+
+
+#
+# Extrafields
+#
+DATAPOLICY_BLOCKCHECKBOX = RGPD : Traitement des données personnelles
+DATAPOLICY_consentement = Consentement obtenu pour le traitement des données personnelles
+DATAPOLICY_opposition_traitement = S'oppose au traitement de ses données personnelles
+DATAPOLICY_opposition_prospection = S'oppose au traitement de ses données personnelles à des fins de prospection
+
+#
+# Popup
+#
+DATAPOLICY_POPUP_ANONYME_TITLE = Anonymiser un tiers
+DATAPOLICY_POPUP_ANONYME_TEXTE = Vous ne pouvez pas supprimer ce contact de Dolibarr car il y a des éléments liés. Conformément au RGPD, vous rendrez toutes ces données anonymes pour respecter vos obligations. Voulez-vous continuer ?
+
+#
+# Button for portability
+#
+DATAPOLICY_PORTABILITE = Portabilité RGPD
+DATAPOLICY_PORTABILITE_TITLE = Exportation de données personnelles
+DATAPOLICY_PORTABILITE_CONFIRMATION = Vous souhaitez exporter les données personnelles de ce contact. Êtes-vous sûr ?
+
+#
+# Notes added during an anonymization
+#
+ANONYMISER_AT = Anonymisé le %s
+
+# V2
+DATAPOLICYReturn = Validation RGPD
+DATAPOLICY_date = Date d'accord/désaccord RGPD
+DATAPOLICY_send = Date d'envoi de l'e-mail d'accord
+DATAPOLICYReturn = Validation RGPD
+DATAPOLICY_SEND = Envoyer un e-mail RGPD
+MailSent = L'email a été envoyé
+
+# ERROR
+ErrorSubjectIsRequired = Erreur : L'objet de l'email est obligatoire. Indiquez-le dans la configuration du module
+=Suite à un problème technique, nous n'avons pas pu enregistrer votre choix. Nous nous en excusons. Contactez-nous pour nous faire part de votre choix.
+NUMBER_MONTH_BEFORE_DELETION = Nombre de mois avant la suppression
diff --git a/htdocs/langs/fr_FR/errors.lang b/htdocs/langs/fr_FR/errors.lang
index f043c5b5afc..d407d7c91b8 100644
--- a/htdocs/langs/fr_FR/errors.lang
+++ b/htdocs/langs/fr_FR/errors.lang
@@ -48,6 +48,7 @@ ErrorBadImageFormat=Cet image est dans un format non pris en charge (Votre PHP n
ErrorBadDateFormat=La valeur '%s' a un format de date non reconnu
ErrorWrongDate=La date est incorrecte
ErrorFailedToWriteInDir=Impossible d'écrire dans le répertoire %s
+ErrorFailedToBuildArchive=Échec de la création du fichier d'archive %s
ErrorFoundBadEmailInFile=Syntaxe d'email incorrecte trouvée pour %s lignes dans le fichier (exemple ligne %s avec email=%s)
ErrorUserCannotBeDelete=L'utilisateur ne peut pas être supprimé. Peut-être est-il associé à des éléments de Dolibarr.
ErrorFieldsRequired=Des champs obligatoire n'ont pas été remplis.
@@ -76,7 +77,7 @@ ErrorNoValueForCheckBoxType=Les valeurs de la liste de case à cochées doivent
ErrorNoValueForRadioType=Les valeurs de la liste d'options doivent être renseignées
ErrorBadFormatValueList=Les valeurs de la liste ne peuvent pas avoir plus d'une virgule: %s mais il en faut au moins une: clé, valeur
ErrorFieldCanNotContainSpecialCharacters=Le champ %s ne peut contenir de caractères spéciaux.
-ErrorFieldCanNotContainSpecialNorUpperCharacters=Le champ %s ne doit contenir ni caractères spéciaux ni majuscules et ne peut contenir que des chiffres.
+ErrorFieldCanNotContainSpecialNorUpperCharacters=Le champ %s ne doit pas contenir de caractères spéciaux, ni de majuscules, et doit commencer par un caractère alphabétique (a-z)
ErrorFieldMustHaveXChar=Le champ %s doit comporter au moins %s caractères.
ErrorNoAccountancyModuleLoaded=Aucun module de comptabilité activé
ErrorExportDuplicateProfil=Ce nom de profil existe déjà pour ce lot d'export.
@@ -97,7 +98,6 @@ ErrorFieldValueNotIn=Champ %s : '%s ' n'est pas une valeur disponibl
ErrorFieldRefNotIn=Champ %s : '%s ' n'est pas une référence existante comme %s
ErrorsOnXLines=Erreurs sur %s enregistrement(s) source
ErrorFileIsInfectedWithAVirus=L'antivirus n'a pas pu valider ce fichier (il est probablement infecté par un virus) !
-ErrorSpecialCharNotAllowedForField=Les caractères spéciaux ne sont pas admis pour le champ "%s"
ErrorNumRefModel=Une référence existe en base (%s) et est incompatible avec cette numérotation. Supprimez la ligne ou renommez la référence pour activer ce module.
ErrorQtyTooLowForThisSupplier=Quantité insuffisante pour ce fournisseur ou aucun tarif défini sur ce produit pour ce fournisseur
ErrorOrdersNotCreatedQtyTooLow=Certaines commandes n'ont pas été créées en raison de quantités trop faibles
@@ -291,6 +291,13 @@ ErrorAjaxRequestFailed=Demande échouée
ErrorThirpdartyOrMemberidIsMandatory=Définir un tiers ou un adhérent dans le partenariat est obligatoire
ErrorFailedToWriteInTempDirectory=Impossible d'écrire dans le répertoire temporaire
ErrorQuantityIsLimitedTo=La quantité est limitée à %s
+ErrorFailedToLoadThirdParty=Impossible de trouver/charger un tiers à partir de id=%s, email=%s, name=%s
+ErrorThisPaymentModeIsNotSepa=Ce mode de paiement n'est pas un compte bancaire
+ErrorStripeCustomerNotFoundCreateFirst=Le client Stripe n'est pas défini pour ce tiers (ou défini sur une valeur supprimée du côté Stripe). Créez (ou rattachez) d'abord.
+ErrorCharPlusNotSupportedByImapForSearch=La recherche IMAP n'est pas en mesure de rechercher dans l'expéditeur ou le destinataire une chaîne contenant le caractère +
+ErrorTableNotFound=Table %s introuvable
+ErrorValueForTooLow=La valeur pour %s est trop faible
+ErrorValueCantBeNull=La valeur pour %s ne peut pas être nulle
# Warnings
WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Votre paramètre PHP upload_max_filesize (%s) est supérieur au paramètre PHP post_max_size (%s). Ceci n'est pas une configuration cohérente.
@@ -326,6 +333,8 @@ WarningAvailableOnlyForHTTPSServers=Disponible uniquement si une connexion sécu
WarningModuleXDisabledSoYouMayMissEventHere=Le module %s n’a pas été activé. Par conséquent, il se peut que vous manquiez beaucoup d’événements ici.
WarningPaypalPaymentNotCompatibleWithStrict=La valeur 'Strict' fait que les fonctionnalités de paiement en ligne ne fonctionnent pas correctement. Utilisez plutôt 'Lax'.
WarningThemeForcedTo=Attention, le choix du thème a été forcé à %s par la constante cachée MAIN_FORCETHEME
+WarningPagesWillBeDeleted=Attention, cela supprimera également toutes les pages/conteneurs existants du site. Vous devriez exporter votre site Web avant, afin d'avoir une sauvegarde pour le réimporter plus tard.
+WarningAutoValNotPossibleWhenStockIsDecreasedOnInvoiceVal=La validation automatique est désactivée lorsque l'option de diminution du stock est définie sur "Validation de la facture".
# Validate
RequireValidValue = Valeur non valide
diff --git a/htdocs/langs/fr_FR/exports.lang b/htdocs/langs/fr_FR/exports.lang
index 665173fd58e..260bcebda1d 100644
--- a/htdocs/langs/fr_FR/exports.lang
+++ b/htdocs/langs/fr_FR/exports.lang
@@ -95,8 +95,8 @@ NbOfLinesOK=Nombre de lignes sans erreur ni avertissement : %s .
NbOfLinesImported=Nombre de lignes importées avec succès : %s .
DataComeFromNoWhere=La valeur à insérer n'est issue d'aucun champ du fichier source.
DataComeFromFileFieldNb=La valeur à insérer provient de la colonne %s dans le fichier source.
-DataComeFromIdFoundFromRef=La valeur provenant du fichier source sera utilisée pour trouver l'identifiant de l'objet parent à utiliser (donc l'objet %s qui a la référence du fichier source doit exister dans la base de données).
-DataComeFromIdFoundFromCodeId=Le valeur du code provenant du fichier source sera utilisé pour trouver l'id de l'objet parent à utiliser (donc le code du fichier source doit exister dans le dictionnaire %s ). Notez que si vous connaissez l'identifiant, vous pouvez également l'utiliser dans le fichier source à la place du code. L'importation devrait fonctionner dans les deux cas.
+DataComeFromIdFoundFromRef=La valeur qui vient du fichier source sera utilisée pour trouver l'id de l'objet parent à utiliser (donc l'objet %s qui a la réf. du fichier source doit exister dans la base de données).
+DataComeFromIdFoundFromCodeId=La valeur du code provenant du fichier source sera utilisée pour trouver l'identifiant de l'objet parent à utiliser (donc le code du fichier source doit exister dans le dictionnaire %s ). Notez que si vous connaissez l'identifiant, vous pouvez également l'utiliser dans le fichier source à la place du code. L'importation devrait fonctionner dans les deux cas.
DataIsInsertedInto=La donnée issue du fichier source sera insérée dans le champ suivant:
DataIDSourceIsInsertedInto=L'identifiant de l'objet père, retrouvé à partir de la donnée dans le fichier source, sera inséré dans le champ suivant :
DataCodeIDSourceIsInsertedInto=L'identifiant de la ligne père, retrouvé à partir du code, sera inséré dans le champ suivant :
@@ -134,7 +134,9 @@ FormatControlRule=Règle de contrôle de format
## imports updates
KeysToUseForUpdates=Clé à utiliser pour mettre à jour les données
NbInsert=Nombre de lignes insérées: %s
+NbInsertSim=Nombre de lignes qui seront insérées : %s
NbUpdate=Nombre de lignes mises à jour: %s
+NbUpdateSim=Nombre de lignes qui seront mises à jour : %s
MultipleRecordFoundWithTheseFilters=Plusieurs enregistrements ont été trouvés avec ces filtres: %s
StocksWithBatch=Stocks et entrepôts des produits avec numéro de lot/série
WarningFirstImportedLine=La ou les premières lignes ne seront pas importées avec la sélection actuelle
diff --git a/htdocs/langs/fr_FR/holiday.lang b/htdocs/langs/fr_FR/holiday.lang
index 22720779eaf..27439f66c27 100644
--- a/htdocs/langs/fr_FR/holiday.lang
+++ b/htdocs/langs/fr_FR/holiday.lang
@@ -1,10 +1,11 @@
# Dolibarr language file - Source file is en_US - holiday
HRM=GRH
-Holidays=Congés
-Holiday=Congé
+Holidays=Feuilles
+Holiday=Demande de congés
CPTitreMenu=Demande de congés
MenuReportMonth=État mensuel
MenuAddCP=Créer demande de congés
+MenuCollectiveAddCP=Nouvelle demande de congé collectif
NotActiveModCP=Vous devez activer le module Congés pour afficher cette page.
AddCP=Créer une demande de congés
DateDebCP=Date Début
@@ -57,6 +58,7 @@ ConfirmDeleteCP=Confirmer la suppression de cette demande de congés ?
ErrorCantDeleteCP=Erreur, vous n'avez pas le droit de supprimer cette demande de congés.
CantCreateCP=Erreur, vous n'avez pas le droit de créer une demande de congés.
InvalidValidatorCP=Vous devez choisir un approbateur pour votre demande de congés.
+InvalidValidator=L'utilisateur choisi n'est pas un approbateur.
NoDateDebut=Vous devez choisir une date de début.
NoDateFin=Vous devez choisir une date de fin.
ErrorDureeCP=Votre demande de congés payés ne contient aucun jour ouvré.
@@ -80,6 +82,8 @@ MotifCP=Motif
UserCP=Utilisateur
ErrorAddEventToUserCP=Une erreur est survenue durant l'ajout du congé exceptionnel.
AddEventToUserOkCP=L'ajout du congé exceptionnel à bien été effectué.
+ErrorFieldRequiredUserOrGroup=Le champ "groupe" ou le champ "utilisateur" doivent être remplis
+fusionGroupsUsers=Le champ "groupes" et le champ "utilisateur" seront fusionnés
MenuLogCP=Voir historique modif.
LogCP=Historique des mises à jour de jours de congés disponibles
ActionByCP=Réalisée par
@@ -87,6 +91,13 @@ UserUpdateCP=Mis à jour pour
PrevSoldeCP=Précédent Solde
NewSoldeCP=Nouveau Solde
alreadyCPexist=Une demande de congés a déjà été faite sur cette période.
+UseralreadyCPexist=Une demande de congé a déjà été faite pour cette période pour %s.
+groups=Groupes
+users=Utilisateurs
+AutoSendMail=Envoi automatique d'email
+NewHolidayForGroup=Nouvelle demande de congé collectif
+SendRequestCollectiveCP=Envoyer la demande de congé collectif
+AutoValidationOnCreate=Validation automatique
FirstDayOfHoliday=Premier jour de congés
LastDayOfHoliday=Dernier jour de congés
BoxTitleLastLeaveRequests=Les %s dernières demandes de congés modifiées
@@ -138,3 +149,10 @@ XIsAUsualNonWorkingDay=%s est généralement un jour NON ouvrable
BlockHolidayIfNegative=Bloqué lorsque le solde est négatif
LeaveRequestCreationBlockedBecauseBalanceIsNegative=La création de cette demande de congé est bloquée car votre solde est négatif
ErrorLeaveRequestMustBeDraftCanceledOrRefusedToBeDeleted=La demande de congé %s doit être brouillon, annulée ou refusée pour être supprimée
+IncreaseHolidays=Augmenter le nombre de jours de vacances
+HolidayRecordsIncreased= %s registres de vacances augmentés
+HolidayRecordIncreased=Registre de vacances augmenté
+ConfirmMassIncreaseHoliday=Augmentation en masse des vacances
+NumberDayAddMass=Nombre de jours à ajouter à la sélection
+ConfirmMassIncreaseHolidayQuestion=Êtes-vous sûr de vouloir augmenter les vacances du ou des enregistrement(s) sélectionnés %s ?
+HolidayQtyNotModified=Le solde des jours restants pour %s n'a pas été modifié
diff --git a/htdocs/langs/fr_FR/install.lang b/htdocs/langs/fr_FR/install.lang
index 5e520547352..0888db3aca6 100644
--- a/htdocs/langs/fr_FR/install.lang
+++ b/htdocs/langs/fr_FR/install.lang
@@ -28,6 +28,7 @@ ErrorPHPVersionTooLow=Version PHP trop ancienne. La version %s ou supérieure es
ErrorPHPVersionTooHigh=Version PHP trop élevée. La version %s ou inférieure est requise.
ErrorConnectedButDatabaseNotFound=Connexion au serveur réussie mais base '%s' introuvable.
ErrorDatabaseAlreadyExists=La base de données '%s' existe déjà.
+ErrorNoMigrationFilesFoundForParameters=Aucun fichier de migration trouvé pour les versions sélectionnées
IfDatabaseNotExistsGoBackAndUncheckCreate=Si la base n'existe pas, revenez en arrière et cochez l'option "Créer la base de données".
IfDatabaseExistsGoBackAndCheckCreate=Si la base existe déjà, revenez en arrière et désactiver l'option "Créer la base de données".
WarningBrowserTooOld=Version du navigateur trop ancienne. Nous vous recommandons de mettre à jour vers une version récente de Firefox, Chrome ou Opera.
@@ -50,7 +51,6 @@ DatabaseName=Nom de la base de données
DatabasePrefix=Préfixe des tables
DatabasePrefixDescription=Préfixe de table de base de données. Si vide, la valeur par défaut est llx_.
AdminLogin=Identifiant du propriétaire de la base de données Dolibarr.
-PasswordAgain=Vérification du mot de passe
AdminPassword=Mot de passe du propriétaire de la base de données Dolibarr.
CreateDatabase=Créer la base de données
CreateUser=Créer le propriétaire ou lui affecter les droits à la base
@@ -212,3 +212,5 @@ ClickHereToGoToApp=Cliquez ici pour aller sur votre application
ClickOnLinkOrRemoveManualy=Si une mise à niveau est en cours, veuillez patienter. Si non, cliquez sur le lien suivant. Si vous atteignez toujours cette page, vous devez supprimer manuellement le fichier install.lock dans le répertoire documents
Loaded=Chargé
FunctionTest=Fonction test
+NodoUpgradeAfterDB=Aucune action demandée par les modules externes après la mise à jour de la base de données
+NodoUpgradeAfterFiles=Aucune action demandée par les modules externes après la mise à jour des fichiers ou des répertoires
diff --git a/htdocs/langs/fr_FR/interventions.lang b/htdocs/langs/fr_FR/interventions.lang
index 50e6ff1d9d1..c09f8431498 100644
--- a/htdocs/langs/fr_FR/interventions.lang
+++ b/htdocs/langs/fr_FR/interventions.lang
@@ -68,3 +68,4 @@ ConfirmReopenIntervention=Êtes-vous sur de vouloir ré-ouvrir l'intervention %s , i
ErrorUserPermissionAllowsToLinksToItselfOnly=Pour des raisons de sécurité, il faut posséder les droits de modification de tous les utilisateurs pour pouvoir lier un adhérent à un utilisateur autre que vous même.
SetLinkToUser=Lier à un utilisateur Dolibarr
SetLinkToThirdParty=Lier à un tiers Dolibarr
+MemberCountersArePublic=Les compteurs de membres valides sont publics
MembersCards=Génération de cartes pour les membres
MembersList=Liste des adhérents
MembersListToValid=Liste des adhérents brouillons (à valider)
@@ -72,6 +73,12 @@ MemberTypeCanNotBeDeleted=Ce type d'adhérent ne peut pas être supprimé
NewSubscription=Nouvelle cotisation
NewSubscriptionDesc=Ce formulaire permet de vous inscrire comme nouvel adhérent de l'association. Pour un renouvellement (si vous êtes déjà adhérent), contactez plutôt l'association par email %s.
Subscription=Adhésion / cotisation
+AnyAmountWithAdvisedAmount=Tout montant avec une quantité recommandée de %s%s
+AnyAmountWithoutAdvisedAmount=Tout montant
+CanEditAmountShort=Tout montant
+CanEditAmountShortForValues=recommandé, tout montant
+MembershipDuration=Durée
+GetMembershipButtonLabel=Obtenir l'adhésion
Subscriptions=Adhésions / cotisations
SubscriptionLate=En retard
SubscriptionNotReceived=Cotisation non reçue
@@ -136,7 +143,7 @@ CardContent=Contenu de votre fiche adhérent
# Text of email templates
ThisIsContentOfYourMembershipRequestWasReceived=Nous vous informons que votre demande d'adhésion a bien été reçue.
ThisIsContentOfYourMembershipWasValidated=Nous vous informons que votre adhésion a été validé avec les informations suivantes:
-ThisIsContentOfYourSubscriptionWasRecorded=Nous vous informons que votre nouvelle cotisation a été enregistrée.
+ThisIsContentOfYourSubscriptionWasRecorded=Nous voulons vous informer que votre nouvelle cotisation a été enregistrée. Veuillez trouver votre facture ci-jointe.
ThisIsContentOfSubscriptionReminderEmail=Nous voulons vous informer que votre adhésion est sur le point d'expirer ou a déjà expiré (__MEMBER_LAST_SUBSCRIPTION_DATE_END__). Nous espérons que vous pourrez la renouveler, votre soutien nous est précieux.
ThisIsContentOfYourCard=Ceci est un rappel des informations que nous avons vous concernant. N'hésitez pas à nous contacter en cas d'erreur.
DescADHERENT_AUTOREGISTER_NOTIF_MAIL_SUBJECT=Sujet de l'email reçu en cas d'auto-inscription d'un invité
@@ -199,14 +206,8 @@ NbOfSubscriptions=Nombre de cotisations
AmountOfSubscriptions=Montant des cotisations
TurnoverOrBudget=Chiffre affaire (pour société) ou Budget (asso ou collectivité)
DefaultAmount=Montant par défaut de la cotisation
-CanEditAmount=Le visiteur peut modifier / choisir le montant de sa cotisation quel que soit le type d'adhésion
-AmountIsLowerToMinimumNotice=sur un dû total de %s
-AnyAmountWithAdvisedAmount=Montant libre avec un montant recommandé de %s %s
-AnyAmountWithoutAdvisedAmount=Montant libre
-CanEditAmountShortForValues=conseillé, montant libre
-MembershipDuration=Durée
-GetMembershipButtonLabel=Adhérer
-CanEditAmountShort=Montant libre
+CanEditAmount=Le visiteur peut choisir/modifier le montant de sa contribution quel que soit le type d'adhérent
+AmountIsLowerToMinimumNotice=Le montant est inférieur au montant minimum de %s
MEMBER_NEWFORM_PAYONLINE=Rediriger sur la page intégrée de paiement en ligne
ByProperties=Par nature
MembersStatisticsByProperties=Statistiques des adhérents par nature
diff --git a/htdocs/langs/fr_FR/modulebuilder.lang b/htdocs/langs/fr_FR/modulebuilder.lang
index d29c9f2164b..2bd50f4225b 100644
--- a/htdocs/langs/fr_FR/modulebuilder.lang
+++ b/htdocs/langs/fr_FR/modulebuilder.lang
@@ -1,7 +1,8 @@
# Dolibarr language file - Source file is en_US - loan
+IdModule= ID module
ModuleBuilderDesc=Cet outil ne doit être utilisé que par des utilisateurs ou des développeurs expérimentés. Il fournit des utilitaires pour construire ou éditer votre propre module. La documentation pour le développement manuel alternatif est ici .
EnterNameOfModuleDesc=Entrez le nom du module/application à créer sans espaces. Utilisez des majuscules pour séparer les mots (Par exemple: MyModule, EcommerceForShop, SyncWithMySystem...)
-EnterNameOfObjectDesc=Entrez le nom de l'objet à créer sans espaces. Utilisez des majuscules pour séparer les mots (par exemple: MyObject, Student, Teacher...). Le fichier de classe CRUD, mais aussi le fichier d'API, les pages pour lister/ajouter/modifier/supprimer l'objet et les fichiers SQL seront générés.
+EnterNameOfObjectDesc=Renseignez le nom de l'objet à créer, sans utiliser d'espace. Utilisez des majuscules pour séparer les termes (par exemple : MyObject, Student, Teacher...). Le fichier de classe CRUD, les pages pour lister/ajouter/modifier/supprimer l'objet et les fichiers SQL seront générés.
EnterNameOfDictionaryDesc=Entrez le nom du dictionnaire à créer sans espaces. Utilisez des majuscules pour séparer les mots (Par exemple : MyDico...). Le fichier de classe, mais aussi le fichier SQL seront générés.
ModuleBuilderDesc2=Chemin ou les modules sont générés/modifiés (premier répertoire pour les modules externes défini dans %s):%s
ModuleBuilderDesc3=Modules générés/éditables trouvés : %s
@@ -9,6 +10,7 @@ ModuleBuilderDesc4=Un module est détecté comme 'modifiable' quand le fichier <
NewModule=Nouveau module
NewObjectInModulebuilder=Nouvel objet
NewDictionary=Nouveau dictionnaire
+ModuleName=Nom du module
ModuleKey=Clé du module
ObjectKey=Clé de l'objet
DicKey=Clé du dictionnaire
@@ -48,6 +50,7 @@ PathToModulePackage=Chemin du zip du package du module/application
PathToModuleDocumentation=Chemin d'accès au fichier de documentation du module (%s)
SpaceOrSpecialCharAreNotAllowed=Les espaces et les caractères spéciaux ne sont pas autorisés.
FileNotYetGenerated=Fichier non encore généré
+GenerateCode=Générer le code
RegenerateClassAndSql=Forcer la mise à jour des fichiers .class et .sql
RegenerateMissingFiles=Générer les fichiers manquant
SpecificationFile=Fichier de documentation
@@ -86,10 +89,10 @@ ListOfMenusEntries=Liste des entrées du menu
ListOfDictionariesEntries=Liste des entrées de dictionnaires
ListOfPermissionsDefined=Liste des permissions
SeeExamples=Voir des exemples ici
-EnabledDesc=Condition pour que ce champ soit actif (Exemples: 1 ou $conf->global->MYMODULE_MYOPTION)
-VisibleDesc=Le champ est-il visible ? (Exemples: 0 = Jamais visible, 1 = Visible sur les listes et formulaires de création/mise à jour/visualisation, 2 = Visible uniquement sur la liste, 3 = Visible uniquement sur le formulaire de création/mise à jour/affichage (pas les listes), 4=Visible sur les listes et formulaire de mise à jour et affichage uniquement (pas en création), 5=Visible sur les listes et formulaire en lecture (pas en création ni modification). Utiliser une valeur négative signifie que le champ n'est pas affiché par défaut sur la liste mais peut être sélectionné pour l'affichage). Il peut s'agir d'une expression, par exemple : preg_match('/public/', $_SERVER['PHP_SELF'])?0:1 ($user->rights->holiday->define_holiday ? 1 : 0)
-DisplayOnPdfDesc=Afficher ce champ sur les documents PDF compatibles, vous pouvez gérer la position avec le champ "Position. Actuellement, les modèles compatibles PDF connus sont : eratostene (commande), espadon (expédition), sponge (factures), cyan (devis/propositions commerciales), cornas (commande fournisseur)Pour le document : 0 = non affiché 1 = affiché 2 = affiché uniquement si non videPour les lignes de document : 0 = non affiché 1 = affiché dans une colonne 3 = affiché dans la colonne description après la description 4 = affiché dans la colonne description après la description uniquement si non vide
-DisplayOnPdf=Afficher sur PDF
+EnabledDesc=Condition pour que ce champs soit actif. Exemples: 1 isModEnabled('MAIN_MODULE_MYMODULE') getDolGlobalString('MYMODULE_OPTION')==2
+VisibleDesc=Le champ est-il visible ? (Exemples: 0=Jamais visible, 1=Visible sur les listes et formulaires de création/mise à jour/visualisation, 2=Visible uniquement sur les listes, 3=Visible uniquement sur le formulaire de création/mise à jour/affichage (pas les listes), 4=Visible sur les listes et formulaire de mise à jour et affichage uniquement (pas en création), 5=Visible sur les listes et formulaire en lecture (pas en création ni modification). Utiliser une valeur négative signifie que le champ n'est pas affiché par défaut sur la liste mais peut être sélectionné pour l'affichage). Il peut s'agir d'une expression, par exemple : preg_match('/public/', $_SERVER['PHP_SELF'])?0:1 $user->hasRight('holiday', 'define_holiday')?1:5
+DisplayOnPdfDesc=Affichez ce champ sur les documents PDF compatibles, vous pouvez gérer la position avec le champ "Position". Pour le document : 0 = non affiché 1 = affiché 2 = affiché uniquement si non vide Pour les lignes de document : 0 = non affiché 1 = affiché dans une colonne 3 = affiché dans la colonne description après la description 4 = affiché dans la colonne description après la description uniquement si non vide
+DisplayOnPdf=Sur les PDF
IsAMeasureDesc=Peut-on cumuler la valeur du champ pour obtenir un total dans les listes ? (Exemples: 1 ou 0)
SearchAllDesc=Le champ doit-il être utilisé pour effectuer une recherche à partir de l'outil de recherche rapide ? (Exemples: 1 ou 0)
SpecDefDesc=Entrez ici toute la documentation que vous souhaitez joindre au module et qui n'a pas encore été définis dans d'autres onglets. Vous pouvez utiliser .md ou, mieux, la syntaxe enrichie .asciidoc.
@@ -105,7 +108,7 @@ TriggerDefDesc=Définissez dans le fichier trigger le code que vous souhaitez ex
SeeIDsInUse=Voir les IDs utilisés dans votre installation
SeeReservedIDsRangeHere=Voir la plage des ID réservés
ToolkitForDevelopers=Boîte à outils pour développeurs Dolibarr
-TryToUseTheModuleBuilder=Si vous connaissez SQL et PHP, vous pouvez utiliser l'assistant de création de module natif. Activez le module %s et utilisez l'assistant en cliquant sur la . dans le menu en haut à droite. Avertissement: Il s'agit d'une fonctionnalité avancée pour les développeurs. Ne pas expérimenter sur votre site de production!
+TryToUseTheModuleBuilder=Si vous connaissez SQL et PHP, vous pouvez utiliser l'assistant de création de module natif. Activez le module %s et utilisez l'assistant en cliquant sur la dans le menu en haut à droite. Avertissement: Il s'agit d'une fonctionnalité avancée pour les développeurs. Ne pas expérimenter sur votre site de production!
SeeTopRightMenu=Voir à droite de votre barre de menu principal
AddLanguageFile=Ajouter le fichier de langue
YouCanUseTranslationKey=Vous pouvez utiliser ici une clé qui est la clé de traduction trouvée dans le fichier de langue (voir l'onglet "Langues")
@@ -132,9 +135,9 @@ UseSpecificAuthor = Utiliser un auteur spécifique
UseSpecificVersion = Utiliser une version initiale spécifique
IncludeRefGeneration=La référence de l'objet doit être générée automatiquement par des règles de numérotation personnalisées
IncludeRefGenerationHelp=Cochez cette case si vous souhaitez inclure du code pour gérer automatiquement la génération de la référence à l'aide de règles de numérotation personnalisées
-IncludeDocGeneration=Je souhaite générer des documents à partir de modèles pour l'objet
+IncludeDocGeneration=Je souhaite la fonctionnalité pour générer des documents (PDF, ODT) à partir de modèles pour cet objet
IncludeDocGenerationHelp=Si vous cochez cette case, du code sera généré pour ajouter une section "Générer un document" sur la fiche de l'objet.
-ShowOnCombobox=Afficher la valeur dans la liste déroulante
+ShowOnCombobox=Afficher la valeur dans les listes déroulantes
KeyForTooltip=Clé pour l'info-bulle
CSSClass=CSS pour le formulaire d'édition / création
CSSViewClass=CSS pour le formulaire de lecture
@@ -154,3 +157,6 @@ ListOfTabsEntries=Liste des entrées d'onglet
TabsDefDesc=Définissez ici les onglets proposés par votre module
TabsDefDescTooltip=Les onglets fournis par votre module/application sont définis dans le tableau $this->tabs dans le fichier descripteur de module. Vous pouvez modifier manuellement ce fichier ou utiliser l'éditeur intégré.
BadValueForType=Mauvaise valeur pour le type %s
+DefinePropertiesFromExistingTable=Définir des propriétés à partir d'une table existante
+DefinePropertiesFromExistingTableDesc=Si une table dans la base de données (pour l'objet à créer) existe déjà, vous pouvez l'utiliser pour définir les propriétés de l'objet.
+DefinePropertiesFromExistingTableDesc2=Laisser vide si la table n'existe pas encore. Le générateur de code utilisera différents types de champs pour créer un exemple de table que vous pourrez modifier ultérieurement.
diff --git a/htdocs/langs/fr_FR/mrp.lang b/htdocs/langs/fr_FR/mrp.lang
index b9730cdb7f8..3cab2476a09 100644
--- a/htdocs/langs/fr_FR/mrp.lang
+++ b/htdocs/langs/fr_FR/mrp.lang
@@ -82,9 +82,7 @@ ProductsToProduce=Produits à produire
UnitCost=Coût unitaire
TotalCost=Coût total
BOMTotalCost=Le coût de production de cette nomenclature basé sur chaque quantité et produit à consommer (utilise le prix de revient si défini, sinon le PMP si défini, sinon le meilleur prix d'achat)
-BOMTotalCostService=Si le module "Poste de travail" est activé et qu'un poste de travail est défini par défaut sur la ligne, alors le calcul est "quantité (convertie en heures) x thm du poste de travail", sinon "quantité (convertie en heures) x prix de revient du service"
-BOMProductsList=Liste des composants
-BOMServicesList=Liste des services
+BOMTotalCostService=Si le module "Poste de travail" est activé et qu'un poste de travail est défini par défaut sur la ligne, alors le calcul est "quantité (convertie en heures) x poste de travail ahr", sinon "quantité (convertie en heures) x prix de revient de la prestation"
GoOnTabProductionToProduceFirst=Vous devez avoir la production pour clôturer un Ordre de Fabrication (voir onglet '%s'). Mais vous pouvez l'annuler.
ErrorAVirtualProductCantBeUsedIntoABomOrMo=Un kit ne peut pas être utilisé dans une Nomenclature ou un Ordre de fabrication.
Workstation=Poste de travail
@@ -94,7 +92,6 @@ WorkstationSetup = Configuration du module Poste de travail
WorkstationSetupPage = Configuration du module Poste de travail
WorkstationList=Liste des postes de travail
WorkstationCreate=Ajouter un nouveau poste de travail
-DefaultWorkstation=Poste de travail par défaut
ConfirmEnableWorkstation=Voulez-vous vraiment activer le poste de travail %s ?
EnableAWorkstation=Activer le module Poste de travail
ConfirmDisableWorkstation=Voulez-vous vraiment désactiver la station de travail %s ?
@@ -113,7 +110,7 @@ THMEstimatedHelp=Ce taux permet de définir un coût prévisionnel de l'article
BOM=Nomenclature
CollapseBOMHelp=Vous pouvez définir l'affichage par défaut des détails de la nomenclature dans la configuration du module BOM
MOAndLines=Ordres de fabrication et lignes
-MoChildGenerate=Generate Child Mo
-ParentMo=MO Parent
-MOChild=MO Child
-BomCantAddChildBom=La nomenclature %s est déjà présente dans l'arborescence qui mène à la nomenclature %s
+MoChildGenerate=Générer OF enfant
+ParentMo=OF parent
+MOChild=OF Enfant
+BomCantAddChildBom=La nomenclature %s est déjà présente dans l'arbre menant à la nomenclature %s
diff --git a/htdocs/langs/fr_FR/oauth.lang b/htdocs/langs/fr_FR/oauth.lang
index 95cb2958bcb..e884f616f39 100644
--- a/htdocs/langs/fr_FR/oauth.lang
+++ b/htdocs/langs/fr_FR/oauth.lang
@@ -9,8 +9,9 @@ HasAccessToken=Un jeton a été généré et sauvegardé dans la base de donnée
NewTokenStored=Jeton reçu et sauvegardé
ToCheckDeleteTokenOnProvider=Cliquer ici pour vérifier/effacer les autorisations sauvées par le fournisseur OAuth %s
TokenDeleted=Jeton effacé
+GetAccess=Cliquez ici pour obtenir un token
RequestAccess=Cliquez ici pour demander/renouveler l'accès et recevoir un nouveau jeton
-DeleteAccess=Cliquez ici pour effacer le jeton
+DeleteAccess=Cliquez ici pour supprimer le jeton
UseTheFollowingUrlAsRedirectURI=Utilisez l'URL suivante comme URI de redirection quand vous créez des identifiants d'accès chez votre fournisseur OAuth :
ListOfSupportedOauthProviders=Ajoutez vos fournisseurs de jetons OAuth2. Ensuite, rendez-vous sur la page d'administration de votre fournisseur OAuth pour créer/obtenir un identifiant et un secret OAuth et enregistrez-les ici. Une fois cela fait, basculez sur l'autre onglet pour générer votre jeton.
OAuthSetupForLogin=Page pour gérer (générer/supprimer) les jetons OAuth
@@ -34,5 +35,6 @@ OAUTH_ID=ID OAuth
OAUTH_SECRET=Code secret OAuth
OAuthProviderAdded=Fournisseur OAuth ajouté
AOAuthEntryForThisProviderAndLabelAlreadyHasAKey=Une entrée OAuth pour ce fournisseur et ce libellé existe déjà
-ScopeUndefined=Permissions (Scopes) non définies (voir onglet précédent)
-Scopes=Portées
\ No newline at end of file
+URLOfServiceForAuthorization=URL fournie par le service OAuth pour l'authentification
+Scopes=Permissions ("Scopes" OAuth)
+ScopeUndefined=Permissions (Cibles) non définies (voir onglet précédent)
diff --git a/htdocs/langs/fr_FR/other.lang b/htdocs/langs/fr_FR/other.lang
index 7617085348e..6c714be2c4d 100644
--- a/htdocs/langs/fr_FR/other.lang
+++ b/htdocs/langs/fr_FR/other.lang
@@ -311,10 +311,10 @@ ExternalSiteURL=URL du site externe du contenu iFrame HTML
ExternalSiteModuleNotComplete=La configuration du module "Site externe" est incomplète.
ExampleMyMenuEntry=Mon entrée de menu
-# FTP
+# ftp
FTPClientSetup=Connexion client FTP/FTPS
NewFTPClient=Nouvelle connexion FTP/FTPS
-FTPArea=Zone des connexions FTP/FTPS
+FTPArea=Zone FTP/SFTP
FTPAreaDesc=Vue d'un serveur FTP/FTPS
SetupOfFTPClientModuleNotComplete=La configuration du client FTP/FTPS semble incomplète
FTPFeatureNotSupportedByYourPHP=Votre version de PHP ne supporte pas les fonctions FTP/FTPS
@@ -325,3 +325,9 @@ FTPFailedToRemoveDir=Échec suppression répertoire %s (Vérifiez les per
FTPPassiveMode=Mode passif
ChooseAFTPEntryIntoMenu=Sélection d'un site FTP/FTPS depuis le menu
FailedToGetFile=Echec à la récupération du fichier %s
+ErrorFTPNodisconnect=Erreur de déconnexion du serveur FTP/SFTP
+FileWasUpload=Le fichier %s a été téléchargé
+FTPFailedToUploadFile=Impossible de télécharger le fichier %s .
+AddFolder=Créer un dossier
+FileWasCreateFolder=Le dossier %s a été créé
+FTPFailedToCreateFolder=Échec de la création du dossier %s .
diff --git a/htdocs/langs/fr_FR/partnership.lang b/htdocs/langs/fr_FR/partnership.lang
index 845bf4ff36c..20c3fc0d801 100644
--- a/htdocs/langs/fr_FR/partnership.lang
+++ b/htdocs/langs/fr_FR/partnership.lang
@@ -20,6 +20,7 @@ ModulePartnershipName=Gestion des partenariats
PartnershipDescription=Module de gestion des partenariats
PartnershipDescriptionLong= Module de gestion des partenariats
Partnership=Partenariat
+Partnerships=Partenariats
AddPartnership=Ajouter un partenariat
CancelPartnershipForExpiredMembers=Partenariat : annuler le partenariat des adhérents dont les cotisations ont expirés
PartnershipCheckBacklink=Partenariat : Vérifiez le backlink référent
@@ -28,6 +29,7 @@ PartnershipCheckBacklink=Partenariat : Vérifiez le backlink référent
# Menu
#
NewPartnership=Nouveau partenariat
+NewPartnershipbyWeb= Votre partenariat a été ajouté avec succès.
ListOfPartnerships=Listes des partenariats
#
@@ -42,6 +44,7 @@ PARTNERSHIP_BACKLINKS_TO_CHECK=Liens de retour à vérifier
PARTNERSHIP_NBDAYS_AFTER_MEMBER_EXPIRATION_BEFORE_CANCEL=Nb de jours avant l'annulation de l'état d'un partenariat lorsque la cotisation a expiré
ReferingWebsiteCheck=Vérification du site référent
ReferingWebsiteCheckDesc=Vous pouvez activer une fonctionnalité pour vérifier que vos partenaires ont ajouté un rétrolien vers les domaines de votre site Web sur leur propre site Web.
+PublicFormRegistrationPartnerDesc=Dolibarr peut vous fournir une URL/un site Web public pour permettre aux visiteurs externes de demander à faire partie du programme de partenariat.
#
# Object
@@ -59,6 +62,12 @@ BacklinkNotFoundOnPartnerWebsite=Lien de retour non trouvé sur le site web part
ConfirmClosePartnershipAsk=Êtes-vous sûr de vouloir annuler ce partenariat ?
PartnershipType=Type de partenariat
PartnershipRefApproved=Partenariat %s approuvé
+KeywordToCheckInWebsite=Si vous souhaitez vérifier qu'un mot-clé donné est présent dans le site de chaque partenaire, définissez ce mot-clé ici
+PartnershipDraft=Brouillon
+PartnershipAccepted=Accepté
+PartnershipRefused=Refusé
+PartnershipCanceled=Annulé
+PartnershipManagedFor=Les partenaires sont
#
# Template Mail
@@ -82,11 +91,6 @@ CountLastUrlCheckError=Nombre d'erreurs lors de la dernière vérification d'URL
LastCheckBacklink=Date de la dernière vérification d'URL
ReasonDeclineOrCancel=Raison du refus
-#
-# Status
-#
-PartnershipDraft=Brouillon
-PartnershipAccepted=Accepté
-PartnershipRefused=Refusé
-PartnershipCanceled=Annulé
-PartnershipManagedFor=Les partenaires sont
+NewPartnershipRequest=Nouvelle demande de partenariat
+NewPartnershipRequestDesc=Ce formulaire vous permet de demander à faire partie de l'un de nos programmes de partenariat. Si vous avez besoin d'aide pour remplir ce formulaire, veuillez contacter par email %s .
+
diff --git a/htdocs/langs/fr_FR/paypal.lang b/htdocs/langs/fr_FR/paypal.lang
index 0fdb3e38d20..be600a2671b 100644
--- a/htdocs/langs/fr_FR/paypal.lang
+++ b/htdocs/langs/fr_FR/paypal.lang
@@ -34,3 +34,4 @@ ARollbackWasPerformedOnPostActions=Une annulation a été effectuée sur toutes
ValidationOfPaymentFailed=La validation du paiement a échoué
CardOwner=Titulaire de la carte
PayPalBalance=Crédit Paypal
+OnlineSubscriptionPaymentLine=Cotisation en ligne enregistrée sur %s Payé via %s Adresse IP d'origine : %s ID de transaction : %s
diff --git a/htdocs/langs/fr_FR/productbatch.lang b/htdocs/langs/fr_FR/productbatch.lang
index 68b5e928084..8493e419384 100644
--- a/htdocs/langs/fr_FR/productbatch.lang
+++ b/htdocs/langs/fr_FR/productbatch.lang
@@ -1,8 +1,8 @@
# ProductBATCH language file - Source file is en_US - ProductBATCH
ManageLotSerial=Utiliser les numéros de lots/série
-ProductStatusOnBatch=Oui (Lot/Série requis)
+ProductStatusOnBatch=Oui (lot/série requis)
ProductStatusOnSerial=Oui (numéro de série unique requis)
-ProductStatusNotOnBatch=Non (Lot/Série non utilisé)
+ProductStatusNotOnBatch=Non (lot/série non utilisé)
ProductStatusOnBatchShort=Lot
ProductStatusOnSerialShort=Numéro Série
ProductStatusNotOnBatchShort=Non
@@ -17,6 +17,7 @@ printBatch=Lot/Série: %s
printEatby=DMD/DLUO: %s
printSellby=DLC: %s
printQty=Qté: %d
+printPlannedWarehouse=Entrepôt : %s
AddDispatchBatchLine=Ajouter une ligne pour la répartition par durée de conservation
WhenProductBatchModuleOnOptionAreForced=Quand le module Lot/Série est activé, le mode de décrémentation automatique des stocks est forcé sur 'Décrémenter les stocks réel sur validation d'expédition' et le mode d'incrémentation automatique de stocks est forcé sur 'Incrémenter les stocks réels sur ventilation manuels dans les entrepôts' et ne peut pas être édité. Les autres options peuvent être définies comme vous le voulez.
ProductDoesNotUseBatchSerial=Ce produit n'utilise pas les numéros de lot/série
@@ -43,4 +44,4 @@ HideLots=Masquer les lots
OutOfOrder=Hors d'usage
InWorkingOrder=En état de marche
ToReplace=Remplacer
-CantMoveNonExistantSerial=Erreur : Vous avez demandé un mouvement sur un numéro de série qui n’existe plus. Peut-être avez-vous requis le même numéro de série plusieurs fois dans une même expédition, ou il a déjà servi dans une autre expédition. Supprimez cette expédition et préparez-en une autre.
+CantMoveNonExistantSerial=Erreur : un numéro de série sur lequel vous avez demandé un mouvement n'existe plus. Peut-être avez-vous utilisé plusieurs fois le même numéro de série depuis le même entrepôt sur la même expédition, ou peut-être était-il utilisé sur une autre expédition. Supprimez cette expédition et préparez-en une autre.
diff --git a/htdocs/langs/fr_FR/products.lang b/htdocs/langs/fr_FR/products.lang
index 3e7eece5d0e..2592548059c 100644
--- a/htdocs/langs/fr_FR/products.lang
+++ b/htdocs/langs/fr_FR/products.lang
@@ -140,7 +140,7 @@ PriceQtyMin=Prix quantité min.
PriceQtyMinCurrency=Prix (devise) pour cette quantité.
WithoutDiscount=Sans remise
VATRateForSupplierProduct=Taux TVA (pour ce produit/fournisseur)
-DiscountQtyMin=Remise par défaut quantité min.
+DiscountQtyMin=Remise pour cette qté.
NoPriceDefinedForThisSupplier=Aucun prix/qté défini pour ce fournisseur/produit
NoSupplierPriceDefinedForThisProduct=Aucun prix/qté fournisseur défini pour ce produit
PredefinedItem=Article prédéfini
@@ -345,7 +345,7 @@ PossibleValues=Valeurs possibles
GoOnMenuToCreateVairants=Allez sur le menu %s - %s pour ajouter les attributs de variantes (comme les couleurs, tailles, ...)
UseProductFournDesc=Ajouter une fonctionnalité pour définir la description produit définie par les vendeurs (pour chaque référence vendeur) en plus de la description pour les clients
ProductSupplierDescription=Description du fournisseur du produit
-UseProductSupplierPackaging=Utiliser le conditionnement/emballage sur les prix fournisseur (recalculer les quantités en fonction de l'emballage défini sur le prix fournisseur lors de l'ajout / mise à jour de la ligne dans les documents fournisseurs)
+UseProductSupplierPackaging=Utiliser l'emballage pour les prix arrondis aux multiples pour les prix d'achat (recalculer les quantités en fonction des multiples définis sur les prix d'achat lors de l'ajout/de la mise à jour d'une ligne dans les documents d'un fournisseur)
PackagingForThisProduct=Conditionnement
PackagingForThisProductDesc=Vous achèterez automatiquement un multiple de cette quantité.
QtyRecalculatedWithPackaging=La quantité de la ligne a été recalculée en fonction de l'emballage du fournisseur
@@ -416,8 +416,8 @@ ProductsMergeSuccess=Produits fusionnés
ErrorsProductsMerge=Erreur lors de la fusion des produits
SwitchOnSaleStatus=Basculer le statut En vente
SwitchOnPurchaseStatus=Basculer le statut En achat
+UpdatePrice=Augmenter/baisser le prix de vente
StockMouvementExtraFields= Champs supplémentaires (mouvement de stock)
-OrProductsWithCategories=Ou produits avec tags/categories
InventoryExtraFields= Attributs supplémentaires (inventaire)
ScanOrTypeOrCopyPasteYourBarCodes=Scannez ou tapez ou copiez/collez vos codes-barres
PuttingPricesUpToDate=Mise à jour des prix avec les prix connus actuels
@@ -428,3 +428,4 @@ RealValuation=Valorisation réelle
ConfirmEditExtrafield = Sélectionnez l'extrafield que vous souhaitez modifier
ConfirmEditExtrafieldQuestion = Voulez-vous vraiment modifier cet extrafield ?
ModifyValueExtrafields = Modifier la valeur d'un extrafield
+OrProductsWithCategories=Ou des produits avec des tags/catégories
diff --git a/htdocs/langs/fr_FR/projects.lang b/htdocs/langs/fr_FR/projects.lang
index af97ce451bb..90fe82c2ffb 100644
--- a/htdocs/langs/fr_FR/projects.lang
+++ b/htdocs/langs/fr_FR/projects.lang
@@ -167,7 +167,7 @@ OpportunityAmount=Montant opportunité
OpportunityAmountShort=Montant opportunité
OpportunityWeightedAmount=Montant pondéré des opportunités
OpportunityWeightedAmountShort=Montant pondéré opp.
-OpportunityAmountAverageShort=montant moyen des opportunités
+OpportunityAmountAverageShort=Montant moyen des opportunités
OpportunityAmountWeigthedShort=Montant pondéré des opportunités
WonLostExcluded=hors opportunités remportées/perdues
##### Types de contacts #####
@@ -259,7 +259,7 @@ TimeSpentInvoiced=Temps passé facturé
TimeSpentForIntervention=Temps consommé
TimeSpentForInvoice=Temps consommés
OneLinePerUser=Une ligne par utilisateur
-ServiceToUseOnLines=Service à utiliser sur les lignes
+ServiceToUseOnLines=Service à utiliser sur les lignes par défaut
InvoiceGeneratedFromTimeSpent=La facture %s a été générée à partir du temps passé sur le projet
InterventionGeneratedFromTimeSpent=L'intervention %s a été générée à partir du temps consacré au projet
ProjectBillTimeDescription=Cochez si vous saisissez du temps sur les tâches du projet ET prévoyez de générer des factures à partir des temps pour facturer le client du projet (ne cochez pas si vous comptez créer une facture qui n'est pas basée sur la saisie des temps). Note: Pour générer une facture, aller sur l'onglet 'Temps consommé' du project et sélectionnez les lignes à inclure.
@@ -294,3 +294,4 @@ EnablePublicLeadForm=Activer le formulaire public de contact
NewLeadbyWeb=Votre message ou votre demande a été enregistré. Nous vous répondrons ou vous contacterons bientôt.
NewLeadForm=Nouveau formulaire de contact
LeadFromPublicForm=Lead en ligne à partir d'un formulaire public
+ExportAccountingReportButtonLabel=Obtenir un rapport
diff --git a/htdocs/langs/fr_FR/propal.lang b/htdocs/langs/fr_FR/propal.lang
index 41483196a39..93bfd82a24e 100644
--- a/htdocs/langs/fr_FR/propal.lang
+++ b/htdocs/langs/fr_FR/propal.lang
@@ -103,11 +103,13 @@ IdProposal=ID de la proposition commerciale
IdProduct=ID produit
LineBuyPriceHT=Prix d'achat HT de la ligne
SignPropal=Accepter la proposition
+SignContract=Signer le contrat
RefusePropal=Refuser la proposition
Sign=Signer
NoSign=Mettre à Non signé
PropalAlreadySigned=Proposition déjà acceptée
PropalAlreadyRefused=Proposition déjà refusée
PropalSigned=Proposition acceptée
+ContractSigned=Contrat signé
PropalRefused=Proposition refusée
ConfirmRefusePropal=Êtes-vous sûr de vouloir refuser cette proposition ?
diff --git a/htdocs/langs/fr_FR/receiptprinter.lang b/htdocs/langs/fr_FR/receiptprinter.lang
index 6c313e08dd8..6964eb61308 100644
--- a/htdocs/langs/fr_FR/receiptprinter.lang
+++ b/htdocs/langs/fr_FR/receiptprinter.lang
@@ -7,7 +7,7 @@ TestSentToPrinter=Test envoyé à l'imprimante %s
ReceiptPrinter=Imprimantes Tickets
ReceiptPrinterDesc=Réglage des imprimantes de tickets
ReceiptPrinterTemplateDesc=Réglage des modèles
-ReceiptPrinterTypeDesc=Description des types d'imprimantes de tickets
+ReceiptPrinterTypeDesc=Exemple de valeurs possibles pour le champ "Paramètres" selon le type de driver
ReceiptPrinterProfileDesc=Description des imprimantes de tickets
ListPrinters=Liste des imprimantes
SetupReceiptTemplate=Réglage des modèles
@@ -54,7 +54,9 @@ DOL_DOUBLE_WIDTH=Double la taille en largeur
DOL_DEFAULT_HEIGHT_WIDTH=Hauteur et largeur par défaut
DOL_UNDERLINE=Activer le souligné
DOL_UNDERLINE_DISABLED=Désactiver le souligné
-DOL_BEEP=Bruit de fond
+DOL_BEEP=Notification sonore
+DOL_BEEP_ALTERNATIVE=Bip sonore (mode alternatif)
+DOL_PRINT_CURR_DATE=Imprimer la date/l'heure actuelle
DOL_PRINT_TEXT=Imprimer le texte
DateInvoiceWithTime=Date et heure de facturation
YearInvoice=Année de facturation
diff --git a/htdocs/langs/fr_FR/receptions.lang b/htdocs/langs/fr_FR/receptions.lang
index 30ac8e985bc..5411fc7142f 100644
--- a/htdocs/langs/fr_FR/receptions.lang
+++ b/htdocs/langs/fr_FR/receptions.lang
@@ -48,7 +48,6 @@ ReceptionsNumberingModules=Module de numérotation pour les réceptions
ReceptionsReceiptModel=Modèles de document pour les réceptions
NoMorePredefinedProductToDispatch=Plus de produits prédéfinis à expédier
ReceptionExist=Une réception existe
-ByingPrice=Prix d'achat
ReceptionBackToDraftInDolibarr=Réception %s retourné en brouillon
ReceptionClassifyClosedInDolibarr=Reception %s classée Fermée
ReceptionUnClassifyCloseddInDolibarr=Réception %s ré-ouverte
diff --git a/htdocs/langs/fr_FR/recruitment.lang b/htdocs/langs/fr_FR/recruitment.lang
index f2d8df78aa3..1525b06d5b3 100644
--- a/htdocs/langs/fr_FR/recruitment.lang
+++ b/htdocs/langs/fr_FR/recruitment.lang
@@ -57,8 +57,9 @@ EmailRecruiter=Email recruteur
ToUseAGenericEmail=Pour utiliser un e-mail générique. S'il n'est pas défini, l'email du responsable du recrutement sera utilisé
NewCandidature=Nouvelle candidature
ListOfCandidatures=Liste des candidatures
-RequestedRemuneration=Rémunération demandée
-ProposedRemuneration=Rémunération proposée
+Remuneration=Salaire
+RequestedRemuneration=Salaire demandé
+ProposedRemuneration=Salaire proposé
ContractProposed=Contrat proposé
ContractSigned=Contrat signé
ContractRefused=Contrat refusé
@@ -74,3 +75,5 @@ JobClosedTextCanceled=Le poste n'est plus ouvert.
ExtrafieldsJobPosition=Attributs complémentaires (postes)
ExtrafieldsApplication=Attributs complémentaires (candidature)
MakeOffer=Faire un offre
+WeAreRecruiting=Nous recrutons. Voici une liste de postes à pourvoir...
+NoPositionOpen=Aucun poste ouvert pour le moment
diff --git a/htdocs/langs/fr_FR/stocks.lang b/htdocs/langs/fr_FR/stocks.lang
index 2b3559787d3..a0d91884279 100644
--- a/htdocs/langs/fr_FR/stocks.lang
+++ b/htdocs/langs/fr_FR/stocks.lang
@@ -24,6 +24,7 @@ StockAtDateInFuture=Date dans le futur
StocksByLotSerial=Stocks par lot/série
LotSerial=Lots/séries
LotSerialList=Liste des numéros de lots/séries
+SubjectToLotSerialOnly=Produits soumis au lot/série uniquement
Movements=Mouvements
ErrorWarehouseRefRequired=Le nom de référence de l'entrepôt est obligatoire
ListOfWarehouses=Liste des entrepôts
@@ -234,7 +235,7 @@ StockIncrease=Augmentation du stock
StockDecrease=Diminution du stock
InventoryForASpecificWarehouse=Inventaire pour un entrepôt spécifique
InventoryForASpecificProduct=Inventaire pour un produit spécifique
-StockIsRequiredToChooseWhichLotToUse=Un stock existant est requis pour pouvoir choisir un lot
+StockIsRequiredToChooseWhichLotToUse=Un stock existant est nécessaire pour pouvoir choisir le lot à utiliser
ForceTo=Forcer à
AlwaysShowFullArbo=Afficher l'arborescence complète de l'entrepôt sur la popup du lien entrepôt (Avertissement: cela peut réduire considérablement les performances)
StockAtDatePastDesc=Vous pouvez voir ici le stock (stock réel) à une date donnée dans le passé
diff --git a/htdocs/langs/fr_FR/suppliers.lang b/htdocs/langs/fr_FR/suppliers.lang
index 0998191b0a2..f73df3434c9 100644
--- a/htdocs/langs/fr_FR/suppliers.lang
+++ b/htdocs/langs/fr_FR/suppliers.lang
@@ -4,6 +4,7 @@ SuppliersInvoice=Facture fournisseur
SupplierInvoices=Factures fournisseur
ShowSupplierInvoice=Montrer la facture fournisseur
NewSupplier=Nouveau fournisseur
+NewSupplierInvoice = Nouvelle facture du vendeur
History=Historique
ListOfSuppliers=Liste des fournisseurs
ShowSupplier=Afficher fournisseur
diff --git a/htdocs/langs/fr_FR/ticket.lang b/htdocs/langs/fr_FR/ticket.lang
index 3f5be72e1d9..be78d74f2a8 100644
--- a/htdocs/langs/fr_FR/ticket.lang
+++ b/htdocs/langs/fr_FR/ticket.lang
@@ -149,6 +149,8 @@ TicketsAutoNotifyCloseHelp=Lors de la clôture d'un ticket, il vous sera propos
TicketWrongContact=Le contact fourni ne fait pas partie des contacts actuels du ticket. E-mail non envoyé.
TicketChooseProductCategory=Catégorie de produit pour les tickets
TicketChooseProductCategoryHelp=Sélectionnez la catégorie de produit du support de ticket. Celui-ci sera utilisé pour lier automatiquement un contrat à un ticket.
+TicketUseCaptchaCode=Utiliser le code graphique (CAPTCHA) lors de la création d'un ticket
+TicketUseCaptchaCodeHelp=Ajoute la vérification CAPTCHA lors de la création d'un nouveau ticket.
#
# Index & list page
@@ -204,8 +206,8 @@ TicketSeverity=Sévérité
ShowTicket=Voir le ticket
RelatedTickets=Tickets liés
TicketAddIntervention=Créer intervention
-CloseTicket=Fermer|Résoudre ticket
-AbandonTicket=Abandonner le ticket
+CloseTicket=Fermer|Résoudre
+AbandonTicket=Abandonner
CloseATicket=Fermer|Résoudre un ticket
ConfirmCloseAticket=Confirmer la fermeture du ticket
ConfirmAbandonTicket=Confirmez-vous la fermeture du ticket au statut 'Abandonné'
@@ -219,18 +221,17 @@ SendMessageByEmail=Envoyer ce message par email
TicketNewMessage=Nouveau message
ErrorMailRecipientIsEmptyForSendTicketMessage=Le destinataire est vide. Aucun e-mail envoyé
TicketGoIntoContactTab=Rendez-vous dans le tableau "Contacts" pour les sélectionner
-TicketMessageMailIntro=Introduction
+TicketMessageMailIntro=Entête de message
TicketMessageMailIntroHelp=Ce texte est ajouté seulement au début de l'email et ne sera pas sauvegardé.
-TicketMessageMailIntroLabelAdmin=Texte d'introduction à toutes les réponses aux tickets
TicketMessageMailIntroText=Bonjour, Une nouvelle réponse a été ajoutée à un ticket que vous suivez. Voici le message :
TicketMessageMailIntroHelpAdmin=Ce texte sera inséré avant la réponse lors d'une réponse à un ticket depuis Dolibarr
-TicketMessageMailSignature=Signature
-TicketMessageMailSignatureHelp=Ce texte est ajouté seulement à la fin de l'email et ne sera pas sauvegardé.
-TicketMessageMailSignatureText=Message envoyé par %s via Dolibarr
-TicketMessageMailSignatureLabelAdmin=Signature de l'email de réponse
-TicketMessageMailSignatureHelpAdmin=Ce texte sera inséré après le message de réponse.
+TicketMessageMailFooter=Pied de page des messages
+TicketMessageMailFooterHelp=Ce texte est ajouté uniquement à la fin du message envoyé par e-mail et ne sera pas enregistré.
+TicketMessageMailFooterText=Message envoyé par %s via Dolibarr
+TicketMessageMailFooterHelpAdmin=Ce texte sera inséré après le message de réponse.
TicketMessageHelp=Seul ce texte sera sauvegardé dans la liste des messages sur la fiche ticket.
TicketMessageSubstitutionReplacedByGenericValues=Les variables de substitution sont remplacées par des valeurs génériques.
+ForEmailMessageWillBeCompletedWith=Pour les e-mails envoyés à des utilisateurs externes, le message sera complété par
TimeElapsedSince=Temps écoulé depuis
TicketTimeToRead=Temps écoulé avant la lecture
TicketTimeElapsedBeforeSince=Temps écoulé avant / depuis
@@ -296,7 +297,7 @@ TicketNewEmailBodyInfosTrackUrlCustomer=Vous pouvez voir la progression du ticke
TicketCloseEmailBodyInfosTrackUrlCustomer=Vous pouvez consulter l'historique de ce ticket en cliquant sur le lien suivant
TicketEmailPleaseDoNotReplyToThisEmail=Merci de ne pas répondre directement à ce courriel ! Utilisez le lien pour répondre via l'interface.
TicketPublicInfoCreateTicket=Ce formulaire vous permet d'enregistrer un ticket dans notre système de gestion.
-TicketPublicPleaseBeAccuratelyDescribe=Veuillez décrire avec précision le problème. Fournissez le plus d'informations possibles pour nous permettre d'identifier correctement votre demande.
+TicketPublicPleaseBeAccuratelyDescribe=Veuillez décrire précisément votre question. Fournissez le plus d'informations possible pour nous permettre d'identifier correctement votre demande.
TicketPublicMsgViewLogIn=Merci d'entrer le code de suivi du ticket
TicketTrackId=ID de suivi publique
OneOfTicketTrackId=Un de vos ID de suivi
diff --git a/htdocs/langs/fr_FR/users.lang b/htdocs/langs/fr_FR/users.lang
index 5888332a820..4840c05740a 100644
--- a/htdocs/langs/fr_FR/users.lang
+++ b/htdocs/langs/fr_FR/users.lang
@@ -68,7 +68,6 @@ CreateDolibarrLogin=Créer un compte utilisateur
CreateDolibarrThirdParty=Créer un tiers
LoginAccountDisableInDolibarr=Le compte est désactivé sur Dolibarr.
UsePersonalValue=Utiliser valeur personnalisée
-InternalUser=Utilisateur interne
ExportDataset_user_1=Utilisateurs et attributs
DomainUser=Utilisateur du domaine %s
Reactivate=Réactiver
diff --git a/htdocs/langs/fr_FR/website.lang b/htdocs/langs/fr_FR/website.lang
index 53e07d0dd2e..c46c3b33e37 100644
--- a/htdocs/langs/fr_FR/website.lang
+++ b/htdocs/langs/fr_FR/website.lang
@@ -1,5 +1,6 @@
# Dolibarr language file - Source file is en_US - website
Shortname=Code
+WebsiteName=Nom du site web
WebsiteSetupDesc=Créez ici les sites Web que vous souhaitez utiliser. Ensuite, allez dans le menu Sites Web pour les éditer.
DeleteWebsite=Effacer site web
ConfirmDeleteWebsite=Êtes-vous sûr de vouloir supprimer ce site web. Toutes les pages et le contenu seront également supprimés. Les fichiers téléversés (comme ceux dans le répertoire medias, dans le module GED, ...) seront conservés.
@@ -15,9 +16,9 @@ WEBSITE_HTML_HEADER=Ajout en bas de l'en-tête HTML (commun à toutes les pages)
WEBSITE_ROBOT=Fichier robot (robots.txt)
WEBSITE_HTACCESS=Fichier .htaccess du site web
WEBSITE_MANIFEST_JSON=Fichier manifest.json de site Web
-WEBSITE_README=Fichier README.md
WEBSITE_KEYWORDSDesc=Utiliser une virgule pour séparer les valeurs
-EnterHereLicenseInformation=Entrez ici les métadonnées ou les informations de licence pour créer un fichier README.md. Si vous distribuez votre site Web en tant que modèle, le fichier sera inclus dans le package.
+EnterHereReadmeInformation=Entrez ici une description du site Web. Si vous distribuez votre site Web en tant que modèle, le fichier sera inclus dans le package de modèles.
+EnterHereLicenseInformation=Entrez ici la LICENCE du code du site Web. Si vous distribuez votre site Web en tant que modèle, le fichier sera inclus dans le package de modèles.
HtmlHeaderPage=En-tête HTML (spécifique pour la page uniquement)
PageNameAliasHelp=Nom ou alias de la page. Cet alias est également utilisé pour forger une URL SEO lorsque le site Web est exécuté à partir d'un hôte virtuel d'un serveur Web (comme Apache, Nginx, ...). Utilisez le bouton "%s " pour modifier cet alias.
EditTheWebSiteForACommonHeader=Remarque: Si vous souhaitez définir un en-tête personnalisé pour toutes les pages, modifiez l'en-tête au niveau du site plutôt qu'au niveau page/container.
@@ -42,6 +43,8 @@ ViewPageInNewTab=Pré-visualiser la page dans un nouvel onglet
SetAsHomePage=Définir comme page d'accueil
RealURL=URL réelle
ViewWebsiteInProduction=Pré-visualiser le site web en utilisant l'URL de la page d'accueil
+Virtualhost=Hôte virtuel ou nom de domaine
+VirtualhostDesc=Le nom de l'hôte virtuel ou du domaine (par exemple : www.mywebsite.com, mybigcompany.net, ...)
SetHereVirtualHost= Utilisation avec Apache/NGinx/... Créez sur votre serveur Web (Apache, Nginx, ...) un hôte virtuel dédié avec PHP activé et un répertoire racine sur %s
ExampleToUseInApacheVirtualHostConfig=Exemple à utiliser dans la configuration de l'hôte virtuel Apache:
YouCanAlsoTestWithPHPS= Utilisation avec un serveur PHP incorporé Sous environnement de développement, vous pouvez préférer tester le site avec le serveur Web PHP intégré (PHP 5.5 requis) en exécutant php -S 0.0.0.0:8080 -t %s
@@ -145,3 +148,6 @@ ImportFavicon=Favicon
ErrorFaviconType=Le Favicon doit être en png
ErrorFaviconSize=Le Favicon doit être de taille 16x16, 32x32 ou 64x64
FaviconTooltip=Téléverser une image qui doit être au format png (16x16, 32x32 ou 64x64)
+NextContainer=Page/conteneur suivant(e)
+PreviousContainer=Page/conteneur précédent(e)
+WebsiteMustBeDisabled=Le site Web doit avoir le statut "désactivé"
diff --git a/htdocs/langs/fr_FR/withdrawals.lang b/htdocs/langs/fr_FR/withdrawals.lang
index f91ffbd55f3..8b6e6aa317e 100644
--- a/htdocs/langs/fr_FR/withdrawals.lang
+++ b/htdocs/langs/fr_FR/withdrawals.lang
@@ -42,6 +42,7 @@ CreditTransferStatistics=Statistiques sur les virements
Rejects=Rejets
LastWithdrawalReceipt=Les %s derniers bons de prélèvements
MakeWithdrawRequest=Faire une demande de prélèvement
+MakeWithdrawRequestStripe=Faire une demande de paiement par prélèvement automatique via Stripe
MakeBankTransferOrder=Faire une demande de virement
WithdrawRequestsDone=%s demandes de prélèvements enregistrées
BankTransferRequestsDone=%s demandes de prélèvements enregistrées
@@ -100,8 +101,11 @@ CreditDate=Crédité le
WithdrawalFileNotCapable=Impossible de générer le fichier de reçu des prélèvement pour votre pays %s (Votre pays n'est pas supporté)
ShowWithdraw=Afficher ordre de prélèvement
IfInvoiceNeedOnWithdrawPaymentWontBeClosed=Toutefois, si la facture a au moins une demande de prélèvement non traité, elle ne sera pas classée payée afin de permettre le prélèvement d'abord.
-DoStandingOrdersBeforePayments=Cet onglet vous permet de demander un prélèvement. Une fois la demande faite, allez dans le menu Banque->Paiement par prélèvement pour générer l'ordre de prélèvement. Lorsque l'ordre de paiement est clos, le paiement sur les factures seront automatiquement enregistrés, et les factures fermées si le reste à payer est nul.
-DoCreditTransferBeforePayments=Cet onglet vous permet de demander un ordre de virement. Une fois fait, allez dans le menu Banque ->Paiements par virement pour gérer l'ordre de virement. Lorsque le virement est clôturé, le paiement des factures fournisseurs sera automatiquement enregistré et les factures clôturées si le solde à payer est nul.
+DoStandingOrdersBeforePayments=Cet onglet vous permet de demander un ordre de prélèvement automatique. Une fois cela fait, vous pouvez vous rendre dans le menu "Banque->Paiement par prélèvement" pour générer et gérer un fichier d'ordre de prélèvement.
+DoStandingOrdersBeforePayments2=Vous pouvez également envoyer une demande directement à un processeur de paiement SEPA comme Stripe, ...
+DoStandingOrdersBeforePayments3=Lors de la clôture d'un ordre de prélèvement, le règlement des factures sera automatiquement enregistré, et les factures clôturées si le reste à payer est nul.
+DoCreditTransferBeforePayments=Cet onglet vous permet de demander un ordre de virement. Une fois cela fait, allez dans le menu "Banque->Paiement par virement" pour générer et gérer un fichier d'ordre de virement.
+DoCreditTransferBeforePayments3=A la clôture de l'ordre de virement, le règlement des factures sera automatiquement enregistré, et les factures clôturées si le reste à payer est nul.
WithdrawalFile=Fichier de prélèvement
CreditTransferFile=Fichier de virement
SetToStatusSent=Mettre au statut "Fichier envoyé"
@@ -118,7 +122,7 @@ WithdrawRequestErrorNilAmount=Impossible de créer une demande de prélèvement
SepaMandate=Mandat prélèvement SEPA
SepaMandateShort=Mandat SEPA
PleaseReturnMandate=Merci de retourner ce formulaire mandat par email à %s ou par courrier à
-SEPALegalText=En signant ce formulaire de mandat, vous autorisez (A) %s à envoyer des instructions à votre banque pour débiter votre compte et (B) votre banque à débiter votre compte conformément aux instructions de %s. Dans le cadre de vos droits, vous avez droit à un remboursement de votre banque selon les termes et conditions de votre accord avec votre banque. Vos droits concernant le mandat ci-dessus sont expliqués dans une déclaration que vous pouvez obtenir auprès de votre banque.
+SEPALegalText=En signant ce formulaire de mandat, vous autorisez (A) %s et son prestataire de services de paiement à envoyer des instructions à votre banque pour débiter votre compte et (B) votre banque à débiter votre compte conformément aux instructions de %s. Dans le cadre de vos droits, vous avez droit à un remboursement de votre banque selon les termes et conditions de votre accord avec votre banque. Vos droits concernant le mandat ci-dessus sont expliqués dans une déclaration que vous pouvez obtenir auprès de votre banque.
CreditorIdentifier=Identifiant créditeur
CreditorName=Nom du créditeur
SEPAFillForm=(B) Remplir tous les champs marqués *
@@ -137,7 +141,7 @@ SEPAFRST=SEPA FRST
ExecutionDate=Date d'éxecution
CreateForSepa=Créer fichier de prélèvement automatique
ICS=Identifiant du créancier - ICS
-IDS=Debitor Identifier
+IDS=Identifiant débiteur
END_TO_END=Balise XML SEPA "EndToEndId" - Identifiant unique attribué par transaction
USTRD=Balise XML SEPA "Non structurée"
ADDDAYS=Ajouter des jours à la date d'exécution
@@ -156,4 +160,4 @@ ErrorICSmissing=ICS manquant pour le compte bancaire %s
TotalAmountOfdirectDebitOrderDiffersFromSumOfLines=Le montant total de l'ordre de prélèvement diffère de la somme des lignes
WarningSomeDirectDebitOrdersAlreadyExists=Attention : Il y a déjà des ordres de prélèvement automatique en attente (%s) demandés pour un montant de %s
WarningSomeCreditTransferAlreadyExists=Attention : Il y a déjà des virements en attente (%s) demandés pour un montant de %s
-UsedFor=Used for %s
+UsedFor=Utilisé pour %s
diff --git a/htdocs/langs/it_CH/accountancy.lang b/htdocs/langs/it_CH/accountancy.lang
deleted file mode 100644
index 44c4229cd8b..00000000000
--- a/htdocs/langs/it_CH/accountancy.lang
+++ /dev/null
@@ -1,3 +0,0 @@
-# Dolibarr language file - Source file is en_US - accountancy
-ExportAccountingSourceDocHelp=With this tool, you can search and export the source events that are used to generate your accountancy. The exported ZIP file will contain the lists of requested items in CSV, as well as their attached files in their original format (PDF, ODT, DOCX...).
-NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible)
diff --git a/htdocs/langs/nl_BE/admin.lang b/htdocs/langs/nl_BE/admin.lang
index 29adcec7d4d..96a2c46c4ed 100644
--- a/htdocs/langs/nl_BE/admin.lang
+++ b/htdocs/langs/nl_BE/admin.lang
@@ -192,7 +192,6 @@ LibraryToBuildPDF=Bibliotheek om PDF bestanden te genereren.
RefreshPhoneLink=Herladen link
SetAsDefault=Instellen als standaard
BarcodeInitForProductsOrServices=Mass barcode init of reset voor producten of diensten
-InitEmptyBarCode=Init value for the %s empty barcodes
NoDetails=Geen aanvullende details in voettekst
DisplayCompanyInfo=Bedrijfsadres weergeven
DisplayCompanyManagers=Namen van beheerders weergeven
diff --git a/htdocs/langs/nl_BE/commercial.lang b/htdocs/langs/nl_BE/commercial.lang
index d949aad6bac..fae3f5e6ae7 100644
--- a/htdocs/langs/nl_BE/commercial.lang
+++ b/htdocs/langs/nl_BE/commercial.lang
@@ -11,8 +11,5 @@ ActionAC_COM=Verzend verkooporder per mail
ActionAC_SUP_ORD=Verzend bestelling per mail
ActionAC_SUP_INV=Stuur leveranciersfactuur per mail
ToOfferALinkForOnlineSignature=Link voor online handtekening
-WelcomeOnOnlineSignaturePage=Welkom op deze pagina om commerciële voorstellen van %s te accepteren
-ThisScreenAllowsYouToSignDocFrom=Met dit scherm kunt u een offerte / commercieel voorstel accepteren en ondertekenen of weigeren
-ThisIsInformationOnDocumentToSign=In dit document is informatie om te accepteren of te weigeren
SignatureProposalRef=Handtekening van offerte / commercieel voorstel %s
FeatureOnlineSignDisabled=Functie voor online ondertekenen uitgeschakeld of het document is gegenereerd voordat de functie was ingeschakeld
diff --git a/htdocs/langs/nl_BE/ticket.lang b/htdocs/langs/nl_BE/ticket.lang
index 37e0550685c..3d1419278be 100644
--- a/htdocs/langs/nl_BE/ticket.lang
+++ b/htdocs/langs/nl_BE/ticket.lang
@@ -57,7 +57,6 @@ MarkAsRead=Markeer ticket als gelezen
TicketHistory=Ticket geschiedenis
TicketChangeType=Van type veranderen
TicketAddMessage=Voeg een bericht toe
-AddMessage=Voeg een bericht toe
TicketMessageSuccessfullyAdded=Bericht is succesvol toegevoegd
NoMsgForThisTicket=Geen bericht voor dit ticket
TicketSeverity=Strengheid
@@ -67,7 +66,6 @@ SendMessageByEmail=Stuur bericht per e-mail
ErrorMailRecipientIsEmptyForSendTicketMessage=Ontvanger is leeg. Geen e-mail verzonden
TicketMessageMailIntro=Inleiding
TicketMessageMailIntroHelp=Deze tekst wordt alleen aan het begin van de e-mail toegevoegd en wordt niet opgeslagen.
-TicketMessageMailSignatureLabelAdmin=Handtekening van reactie-e-mail
TicketMessageHelp=Alleen deze tekst wordt opgeslagen in de berichtenlijst van het ticket.
TicketMessageSubstitutionReplacedByGenericValues=Vervangingenvariabelen worden vervangen door generieke waarden.
TimeElapsedSince=tijd verstreken sinds
diff --git a/htdocs/langs/pt_AO/projects.lang b/htdocs/langs/pt_AO/projects.lang
deleted file mode 100644
index f5f817beac1..00000000000
--- a/htdocs/langs/pt_AO/projects.lang
+++ /dev/null
@@ -1,2 +0,0 @@
-# Dolibarr language file - Source file is en_US - projects
-ServiceToUseOnLines=Service to use on lines by default
diff --git a/htdocs/langs/pt_BR/admin.lang b/htdocs/langs/pt_BR/admin.lang
index d2ab3e033a9..837113cb418 100644
--- a/htdocs/langs/pt_BR/admin.lang
+++ b/htdocs/langs/pt_BR/admin.lang
@@ -47,8 +47,6 @@ ClientSortingCharset=Conferência de Clientes
WarningModuleNotActive=Módulo %s deve ser Ativado!
WarningOnlyPermissionOfActivatedModules=Somente as permissões relacionadas com os módulos ativados que aparecem aqui.
DolibarrSetup=Instalação/Atualização do Dolibarr
-InternalUser=Usuário Interno
-ExternalUser=Usuário Externo
InternalUsers=Usuários Internos
ExternalUsers=Usuários Externos
UploadNewTemplate=Carregar novo(s) tema(s)
@@ -652,7 +650,6 @@ Permission283=Deletar Contatos
Permission286=Exportar Contatos
Permission291=Ler Tarifas
Permission292=Definir Permissões das Tarifas
-Permission300=Ler códigos de barras
Permission301=Criar/modificar códigos de barras
Permission311=Ler Serviços
Permission312=Atribuir Serviço no Contrato
@@ -1336,7 +1333,6 @@ ActivateFCKeditor=Editor avançado ativo por:
FCKeditorForNotePublic=Usar editor WYSIWIG nos campos de "notas públicas" dos elementos
FCKeditorForNotePrivate=Usar editor WYSIWIG nos campos de "notas privadas" dos elementos
FCKeditorForCompany=Usar editor WYSIWIG nos campos de descrição dos elementos (exceto produtos/serviços)
-FCKeditorForProduct=Usar editor WYSIWIG nos campos de descrição de produtos/serviços
FCKeditorForProductDetails=Criação / edição WYSIWIG de linhas de detalhes de produtos para todas as entidades (propostas, encomendas, facturas, etc ...). Aviso: O uso desta opção neste caso não é recomendado, pois pode criar problemas com caracteres especiais e formatação de página ao construir arquivos PDF.
FCKeditorForMailing=Criação/edição do WYSIWIG nos E-Mails massivos (ferramentas->emailing)
FCKeditorForUserSignature=criação/edição do WYSIWIG nas assinaturas de usuários
diff --git a/htdocs/langs/pt_BR/commercial.lang b/htdocs/langs/pt_BR/commercial.lang
index a70dde7954c..d7296bed8f8 100644
--- a/htdocs/langs/pt_BR/commercial.lang
+++ b/htdocs/langs/pt_BR/commercial.lang
@@ -54,7 +54,5 @@ Stats=Estatísticas de vendas
StatusProsp=Status de prospecto de cliente
DraftPropals=Minutas de orçamentos
ToOfferALinkForOnlineSignature=Link para assinatura on-line
-WelcomeOnOnlineSignaturePage=Bem-vindo à página para aceitar propostas comerciais de %s
-ThisScreenAllowsYouToSignDocFrom=Esta tela permite que você aceite e assine ou recuse um orçamento / proposta comercial
SignatureProposalRef=Assinatura da cotação / proposta comercial %s
FeatureOnlineSignDisabled=Recurso para assinatura online desabilitado ou documento gerado antes que o recurso fosse ativado
diff --git a/htdocs/langs/pt_BR/ecm.lang b/htdocs/langs/pt_BR/ecm.lang
index 3c7bb7eddf3..1b5ed3fa5cb 100644
--- a/htdocs/langs/pt_BR/ecm.lang
+++ b/htdocs/langs/pt_BR/ecm.lang
@@ -12,7 +12,6 @@ ECMNbOfFilesInSubDir=Numero de arquivos nos subpastas
ECMCreationUser=Criado por
ECMArea=Área DMS / ECM
ECMAreaDesc=A área DMS / ECM (Gerenciamento de documentos / Gerenciamento de conteúdo eletrônico) permite salvar, compartilhar e pesquisar rapidamente todos os tipos de documentos no Dolibarr.
-ECMAreaDesc2=* As pastas automáticas são geradas automaticamente quando algum arquivo é adicionado a algum ficheiro do sistema. * As pastas manuais podem ser usados para guardar documentos sem ligação a um cadastro do sistema.
ECMSectionWasRemoved=A pasta %s foi eliminada
ECMSearchByKeywords=Busca usando palavras chave
ECMSearchByEntity=Busca por objeto
diff --git a/htdocs/langs/pt_BR/errors.lang b/htdocs/langs/pt_BR/errors.lang
index 03f3d75a362..517027dde8c 100644
--- a/htdocs/langs/pt_BR/errors.lang
+++ b/htdocs/langs/pt_BR/errors.lang
@@ -64,7 +64,6 @@ ErrorFieldValueNotIn=Campo %s : '%s ' não é um valor encontrado n
ErrorFieldRefNotIn=Campo %s : '%s ' não é uma referência existente %s
ErrorsOnXLines=%s erros encontrados
ErrorFileIsInfectedWithAVirus=O antivírus não foi capaz de atestar o arquivo (o arquivo pode estar infectado por um vírus)
-ErrorSpecialCharNotAllowedForField=O campo "%s" não aceita caracteres especiais
ErrorNumRefModel=Uma referência existe no banco de dados (% s) e não é compatível com esta regra de numeração. Remover registro ou referência renomeado para ativar este módulo.
ErrorQtyTooLowForThisSupplier=Quantidade muito baixa para este fornecedor ou nenhum preço definido neste produto para este fornecedor
ErrorOrdersNotCreatedQtyTooLow=Algumas encomendas não foram criadas por causa de quantidades muito baixas
diff --git a/htdocs/langs/pt_BR/mailmanspip.lang b/htdocs/langs/pt_BR/mailmanspip.lang
index bbea232c4ef..9e0a707c3eb 100644
--- a/htdocs/langs/pt_BR/mailmanspip.lang
+++ b/htdocs/langs/pt_BR/mailmanspip.lang
@@ -7,7 +7,6 @@ MailmanCreationSuccess=O teste da assinatura foi realizado com sucesso
MailmanDeletionSuccess=O teste de cancelamento da assinatura foi realizado com sucesso
SynchroMailManEnabled=O Mailman sera atualizado
SynchroSpipEnabled=O SPIP sera atualizado
-DescADHERENT_MAILMAN_ADMINPW=Senha do administrador Mailman
DescADHERENT_MAILMAN_URL=URL para inscriçoes Mailman
DescADHERENT_MAILMAN_UNSUB_URL=URL para desenscriçoes Mailman
DescADHERENT_MAILMAN_LISTS=Lista(s) para inscriçao automatica de novos membros (separado por virgula)
diff --git a/htdocs/langs/pt_BR/ticket.lang b/htdocs/langs/pt_BR/ticket.lang
index 2a751f5516a..09f8001f5b1 100644
--- a/htdocs/langs/pt_BR/ticket.lang
+++ b/htdocs/langs/pt_BR/ticket.lang
@@ -76,7 +76,6 @@ TicketHistory=Histórico de bilhetes
TicketChangeCategory=Modifica o código analítico
TicketChangeSeverity=Alterar gravidade
TicketAddMessage=Adiciona uma mensagem
-AddMessage=Adiciona uma mensagem
MessageSuccessfullyAdded=Bilhete adicionado
NoMsgForThisTicket=Nenhuma mensagem para este bilhete
TicketProperties=Classificação
@@ -97,8 +96,6 @@ TicketUpdated=Bilhete atualizado
SendMessageByEmail=Enviar mensagem por e-mail
ErrorMailRecipientIsEmptyForSendTicketMessage=O destinatário está vazio. Nenhum e-mail enviado
TicketMessageMailIntroHelp=Este texto é adicionado apenas no início do e-mail e não será salvo.
-TicketMessageMailSignatureHelp=Este texto é adicionado somente no final do e-mail e não será salvo.
-TicketMessageMailSignatureLabelAdmin=Assinatura do e-mail de resposta
TicketTimeElapsedBeforeSince=Tempo decorrido antes / desde
TicketContacts=Bilhete de contatos
TicketDocumentsLinked=Documentos vinculados ao ticket
diff --git a/htdocs/langs/pt_BR/website.lang b/htdocs/langs/pt_BR/website.lang
index a5781ea5a75..e2afc369eb2 100644
--- a/htdocs/langs/pt_BR/website.lang
+++ b/htdocs/langs/pt_BR/website.lang
@@ -9,7 +9,6 @@ WEBSITE_CSS_URL=URL do arquivo CSS externo.
WEBSITE_HTML_HEADER=Adição na parte inferior do cabeçalho HTML (comum a todas as páginas)
WEBSITE_ROBOT=Arquivo robô (robots.txt)
WEBSITE_MANIFEST_JSON=Arquivo manifest.json do site
-WEBSITE_README=Arquivo README.md
EnterHereLicenseInformation=Digite aqui metadados ou informações de licença para arquivar num arquivo README.md. Se você distribuir seu site como modelo, o arquivo será incluído no pacote tentado.
HtmlHeaderPage=Cabeçalho HTML (específico apenas para esta página)
PageNameAliasHelp=Nome ou alias da página. Esse alias também é usado para forjar uma URL de SEO quando o site é executado a partir de um host virtual de um servidor da Web (como Apacke, Nginx, ...). Use o botão %s para editar este alias.
diff --git a/htdocs/langs/pt_MZ/accountancy.lang b/htdocs/langs/pt_MZ/accountancy.lang
index 90584e4bd28..b99e895d7c0 100644
--- a/htdocs/langs/pt_MZ/accountancy.lang
+++ b/htdocs/langs/pt_MZ/accountancy.lang
@@ -27,7 +27,6 @@ ConfirmDeleteCptCategory=Tem certeza de que deseja remover essa conta contábil
JournalizationInLedgerStatus=Situação do registro do diário
GroupIsEmptyCheckSetup=O grupo está vazio, verifique a configuração do grupo de contabilidade personalizado
AccountantFiles=Exportar documentos de origem
-ExportAccountingSourceDocHelp=With this tool, you can search and export the source events that are used to generate your accountancy. The exported ZIP file will contain the lists of requested items in CSV, as well as their attached files in their original format (PDF, ODT, DOCX...).
VueByAccountAccounting=Ver por conta contábil
MainAccountForCustomersNotDefined=Conta contábil principal para clientes não definidos na configuração
MainAccountForUsersNotDefined=Conta contábil principal para usuários não definidos na configuração
@@ -185,7 +184,6 @@ AccountingJournalType9=Novo
ErrorAccountingJournalIsAlreadyUse=Esta Livro de Registro já está sendo usado
NumberOfAccountancyEntries=Número de entradas
NumberOfAccountancyMovements=Número de movimentos
-NotifiedValidationDate=Validate and Lock the exported entries (same effect than the "%s" feature, modification and deletion of the lines will DEFINITELY not be possible)
ExportDraftJournal=Livro de Registro de rascunho de exportação
Selectmodelcsv=Escolha um modelo de exportação
Modelcsv_CEGID=Exportar para CEGID Expert Comptable
diff --git a/htdocs/langs/pt_MZ/admin.lang b/htdocs/langs/pt_MZ/admin.lang
index e805a0c6120..961304d0627 100644
--- a/htdocs/langs/pt_MZ/admin.lang
+++ b/htdocs/langs/pt_MZ/admin.lang
@@ -47,8 +47,6 @@ ClientSortingCharset=Conferência de Clientes
WarningModuleNotActive=Módulo %s deve ser Ativado!
WarningOnlyPermissionOfActivatedModules=Somente as permissões relacionadas com os módulos ativados que aparecem aqui.
DolibarrSetup=Instalação/Atualização do Dolibarr
-InternalUser=Usuário Interno
-ExternalUser=Usuário Externo
InternalUsers=Usuários Internos
ExternalUsers=Usuários Externos
SetupArea=Conf.
@@ -647,7 +645,6 @@ Permission283=Deletar Contatos
Permission286=Exportar Contatos
Permission291=Ler Tarifas
Permission292=Definir Permissões das Tarifas
-Permission300=Ler códigos de barras
Permission301=Criar/modificar códigos de barras
Permission311=Ler Serviços
Permission312=Atribuir Serviço no Contrato
@@ -1332,7 +1329,6 @@ ActivateFCKeditor=Editor avançado ativo por:
FCKeditorForNotePublic=Usar editor WYSIWIG nos campos de "notas públicas" dos elementos
FCKeditorForNotePrivate=Usar editor WYSIWIG nos campos de "notas privadas" dos elementos
FCKeditorForCompany=Usar editor WYSIWIG nos campos de descrição dos elementos (exceto produtos/serviços)
-FCKeditorForProduct=Usar editor WYSIWIG nos campos de descrição de produtos/serviços
FCKeditorForProductDetails=Criação / edição WYSIWIG de linhas de detalhes de produtos para todas as entidades (propostas, encomendas, facturas, etc ...). Aviso: O uso desta opção neste caso não é recomendado, pois pode criar problemas com caracteres especiais e formatação de página ao construir arquivos PDF.
FCKeditorForMailing=Criação/edição do WYSIWIG nos E-Mails massivos (ferramentas->emailing)
FCKeditorForUserSignature=criação/edição do WYSIWIG nas assinaturas de usuários
diff --git a/htdocs/langs/pt_MZ/commercial.lang b/htdocs/langs/pt_MZ/commercial.lang
index 493791da89d..4e15f6d6895 100644
--- a/htdocs/langs/pt_MZ/commercial.lang
+++ b/htdocs/langs/pt_MZ/commercial.lang
@@ -56,7 +56,5 @@ Stats=Estatísticas de vendas
StatusProsp=Status de prospecto de cliente
DraftPropals=Minutas de orçamentos
ToOfferALinkForOnlineSignature=Link para assinatura on-line
-WelcomeOnOnlineSignaturePage=Bem-vindo à página para aceitar propostas comerciais de %s
-ThisScreenAllowsYouToSignDocFrom=Esta tela permite que você aceite e assine ou recuse um orçamento / proposta comercial
SignatureProposalRef=Assinatura da cotação / proposta comercial %s
FeatureOnlineSignDisabled=Recurso para assinatura online desabilitado ou documento gerado antes que o recurso fosse ativado
diff --git a/htdocs/langs/pt_MZ/ecm.lang b/htdocs/langs/pt_MZ/ecm.lang
index 3c7bb7eddf3..1b5ed3fa5cb 100644
--- a/htdocs/langs/pt_MZ/ecm.lang
+++ b/htdocs/langs/pt_MZ/ecm.lang
@@ -12,7 +12,6 @@ ECMNbOfFilesInSubDir=Numero de arquivos nos subpastas
ECMCreationUser=Criado por
ECMArea=Área DMS / ECM
ECMAreaDesc=A área DMS / ECM (Gerenciamento de documentos / Gerenciamento de conteúdo eletrônico) permite salvar, compartilhar e pesquisar rapidamente todos os tipos de documentos no Dolibarr.
-ECMAreaDesc2=* As pastas automáticas são geradas automaticamente quando algum arquivo é adicionado a algum ficheiro do sistema. * As pastas manuais podem ser usados para guardar documentos sem ligação a um cadastro do sistema.
ECMSectionWasRemoved=A pasta %s foi eliminada
ECMSearchByKeywords=Busca usando palavras chave
ECMSearchByEntity=Busca por objeto
diff --git a/htdocs/langs/pt_MZ/errors.lang b/htdocs/langs/pt_MZ/errors.lang
index 03f3d75a362..517027dde8c 100644
--- a/htdocs/langs/pt_MZ/errors.lang
+++ b/htdocs/langs/pt_MZ/errors.lang
@@ -64,7 +64,6 @@ ErrorFieldValueNotIn=Campo %s : '%s ' não é um valor encontrado n
ErrorFieldRefNotIn=Campo %s : '%s ' não é uma referência existente %s
ErrorsOnXLines=%s erros encontrados
ErrorFileIsInfectedWithAVirus=O antivírus não foi capaz de atestar o arquivo (o arquivo pode estar infectado por um vírus)
-ErrorSpecialCharNotAllowedForField=O campo "%s" não aceita caracteres especiais
ErrorNumRefModel=Uma referência existe no banco de dados (% s) e não é compatível com esta regra de numeração. Remover registro ou referência renomeado para ativar este módulo.
ErrorQtyTooLowForThisSupplier=Quantidade muito baixa para este fornecedor ou nenhum preço definido neste produto para este fornecedor
ErrorOrdersNotCreatedQtyTooLow=Algumas encomendas não foram criadas por causa de quantidades muito baixas
diff --git a/htdocs/langs/pt_MZ/mailmanspip.lang b/htdocs/langs/pt_MZ/mailmanspip.lang
index bbea232c4ef..9e0a707c3eb 100644
--- a/htdocs/langs/pt_MZ/mailmanspip.lang
+++ b/htdocs/langs/pt_MZ/mailmanspip.lang
@@ -7,7 +7,6 @@ MailmanCreationSuccess=O teste da assinatura foi realizado com sucesso
MailmanDeletionSuccess=O teste de cancelamento da assinatura foi realizado com sucesso
SynchroMailManEnabled=O Mailman sera atualizado
SynchroSpipEnabled=O SPIP sera atualizado
-DescADHERENT_MAILMAN_ADMINPW=Senha do administrador Mailman
DescADHERENT_MAILMAN_URL=URL para inscriçoes Mailman
DescADHERENT_MAILMAN_UNSUB_URL=URL para desenscriçoes Mailman
DescADHERENT_MAILMAN_LISTS=Lista(s) para inscriçao automatica de novos membros (separado por virgula)
diff --git a/htdocs/langs/pt_MZ/projects.lang b/htdocs/langs/pt_MZ/projects.lang
index 8d0c1cedae8..065ddf804d6 100644
--- a/htdocs/langs/pt_MZ/projects.lang
+++ b/htdocs/langs/pt_MZ/projects.lang
@@ -6,6 +6,5 @@ LinkToElementShort=Link para
ProjectReferers=Itens correlatos
OppStatusPROPO=Proposta
OppStatusPENDING=Pedente
-ServiceToUseOnLines=Service to use on lines by default
NewInter=Nova Intervenção
StartDateCannotBeAfterEndDate=A data final não pode ser anterior a data de início
diff --git a/htdocs/langs/pt_MZ/website.lang b/htdocs/langs/pt_MZ/website.lang
index a5781ea5a75..e2afc369eb2 100644
--- a/htdocs/langs/pt_MZ/website.lang
+++ b/htdocs/langs/pt_MZ/website.lang
@@ -9,7 +9,6 @@ WEBSITE_CSS_URL=URL do arquivo CSS externo.
WEBSITE_HTML_HEADER=Adição na parte inferior do cabeçalho HTML (comum a todas as páginas)
WEBSITE_ROBOT=Arquivo robô (robots.txt)
WEBSITE_MANIFEST_JSON=Arquivo manifest.json do site
-WEBSITE_README=Arquivo README.md
EnterHereLicenseInformation=Digite aqui metadados ou informações de licença para arquivar num arquivo README.md. Se você distribuir seu site como modelo, o arquivo será incluído no pacote tentado.
HtmlHeaderPage=Cabeçalho HTML (específico apenas para esta página)
PageNameAliasHelp=Nome ou alias da página. Esse alias também é usado para forjar uma URL de SEO quando o site é executado a partir de um host virtual de um servidor da Web (como Apacke, Nginx, ...). Use o botão %s para editar este alias.
diff --git a/htdocs/loan/payment/card.php b/htdocs/loan/payment/card.php
index 6c302feddac..309e0d99f4a 100644
--- a/htdocs/loan/payment/card.php
+++ b/htdocs/loan/payment/card.php
@@ -223,9 +223,9 @@ print '';
if (empty($action) && !empty($user->rights->loan->delete)) {
if (!$disable_delete) {
- print '
'.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', 1);
} else {
- print '
'.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans("CantRemovePaymentWithOneInvoicePaid"), $langs->trans("Delete"), 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', 0);
}
}
diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php
index 6f010215df3..4b580e7b808 100644
--- a/htdocs/main.inc.php
+++ b/htdocs/main.inc.php
@@ -518,7 +518,7 @@ if ((!defined('NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) && getDolGlobalInt(
$sensitiveget = false;
if ((GETPOSTISSET('massaction') || GETPOST('action', 'aZ09')) && getDolGlobalInt('MAIN_SECURITY_CSRF_WITH_TOKEN') >= 3) {
// All GET actions and mass actions are processed as sensitive.
- if (GETPOSTISSET('massaction') || !in_array(GETPOST('action', 'aZ09'), array('create', 'createsite', 'edit', 'editvalidator', 'file_manager', 'presend', 'presend_addmessage'))) { // We exclude the case action='create' and action='file_manager' that are legitimate
+ if (GETPOSTISSET('massaction') || !in_array(GETPOST('action', 'aZ09'), array('create', 'createsite', 'createcard', 'edit', 'editvalidator', 'file_manager', 'presend', 'presend_addmessage', 'preview', 'specimen'))) { // We exclude the case action='create' and action='file_manager' that are legitimate
$sensitiveget = true;
}
} elseif (getDolGlobalInt('MAIN_SECURITY_CSRF_WITH_TOKEN') >= 2) {
@@ -1207,14 +1207,22 @@ if (GETPOST('dol_no_mouse_hover', 'int') || !empty($_SESSION['dol_no_mouse_hover
if (GETPOST('dol_use_jmobile', 'int') || !empty($_SESSION['dol_use_jmobile'])) {
$conf->dol_use_jmobile = 1;
}
+// If not on Desktop
if (!empty($conf->browser->layout) && $conf->browser->layout != 'classic') {
$conf->dol_no_mouse_hover = 1;
}
+
+// If on smartphone or optmized for small screen
if ((!empty($conf->browser->layout) && $conf->browser->layout == 'phone')
|| (!empty($_SESSION['dol_screenwidth']) && $_SESSION['dol_screenwidth'] < 400)
- || (!empty($_SESSION['dol_screenheight']) && $_SESSION['dol_screenheight'] < 400)
+ || (!empty($_SESSION['dol_screenheight']) && $_SESSION['dol_screenheight'] < 400
+ || !empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER))
) {
$conf->dol_optimize_smallscreen = 1;
+
+ if (isset($conf->global->PRODUIT_DESC_IN_FORM) && $conf->global->PRODUIT_DESC_IN_FORM == 1) {
+ $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
+ }
}
// Replace themes bugged with jmobile with eldy
if (!empty($conf->dol_use_jmobile) && in_array($conf->theme, array('bureau2crea', 'cameleo', 'amarok'))) {
@@ -1476,7 +1484,7 @@ function top_httphead($contenttype = 'text/html', $forcenocache = 0)
// Referrer-Policy
// Say if we must provide the referrer when we jump onto another web page.
- // Default browser are 'strict-origin-when-cross-origin', we want more so we use 'same-origin' so we don't send any referrer when going into another web site
+ // Default browser are 'strict-origin-when-cross-origin' (only domain is sent on other domain switching), we want more so we use 'same-origin' so browser doesn't send any referrer when going into another web site domain.
if (!defined('MAIN_SECURITY_FORCERP')) {
$referrerpolicy = getDolGlobalString('MAIN_SECURITY_FORCERP', "same-origin");
@@ -1540,6 +1548,7 @@ function top_htmlhead($head, $title = '', $disablejs = 0, $disablehead = 0, $arr
print '
'."\n"; // Do not index
print '
'."\n"; // Scale for mobile device
print '
'."\n";
+ print '
'."\n";
if (getDolGlobalInt('MAIN_FEATURES_LEVEL')) {
print '
'."\n";
}
@@ -1548,8 +1557,8 @@ function top_htmlhead($head, $title = '', $disablejs = 0, $disablehead = 0, $arr
if (!empty($mysoc->logo_squarred_mini)) {
$favicon = DOL_URL_ROOT.'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode('logos/thumbs/'.$mysoc->logo_squarred_mini);
}
- if (!empty($conf->global->MAIN_FAVICON_URL)) {
- $favicon = $conf->global->MAIN_FAVICON_URL;
+ if (getDolGlobalString('MAIN_FAVICON_URL')) {
+ $favicon = getDolGlobalString('MAIN_FAVICON_URL');
}
if (empty($conf->dol_use_jmobile)) {
print '
'."\n"; // Not required into an Android webview
@@ -2468,7 +2477,7 @@ function printDropdownQuickadd()
"title" => "NewPropal@propal",
"name" => "Proposal@propal",
"picto" => "object_propal",
- "activation" => isModEnabled("propal") && $user->hasRight("propale", "write"), // vs hooking
+ "activation" => isModEnabled("propal") && $user->hasRight("propal", "write"), // vs hooking
"position" => 30,
),
@@ -3004,7 +3013,7 @@ function left_menu($menu_array_before, $helppagename = '', $notused = '', $menu_
}
print '';
}
diff --git a/htdocs/master.inc.php b/htdocs/master.inc.php
index fe4bdf42d79..03515c9a2e2 100644
--- a/htdocs/master.inc.php
+++ b/htdocs/master.inc.php
@@ -58,10 +58,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/conf.class.php';
$conf = new Conf();
// Set properties specific to database
-$conf->db->host = $dolibarr_main_db_host;
-$conf->db->port = $dolibarr_main_db_port;
-$conf->db->name = $dolibarr_main_db_name;
-$conf->db->user = $dolibarr_main_db_user;
+$conf->db->host = empty($dolibarr_main_db_host) ? '' : $dolibarr_main_db_host;
+$conf->db->port = empty($dolibarr_main_db_port) ? '' : $dolibarr_main_db_port;
+$conf->db->name = empty($dolibarr_main_db_name) ? '' : $dolibarr_main_db_name;
+$conf->db->user = empty($dolibarr_main_db_user) ? '' : $dolibarr_main_db_user;
$conf->db->pass = empty($dolibarr_main_db_pass) ? '' : $dolibarr_main_db_pass;
$conf->db->type = $dolibarr_main_db_type;
$conf->db->prefix = $dolibarr_main_db_prefix;
@@ -208,10 +208,16 @@ if (!defined('NOREQUIREDB') && !defined('NOREQUIRESOC')) {
$mysoc = new Societe($db);
$mysoc->setMysoc($conf);
- // For some countries, we need to invert our address with customer address
+ // We set some specific default values according to country
+
if ($mysoc->country_code == 'DE' && !isset($conf->global->MAIN_INVERT_SENDER_RECIPIENT)) {
+ // For DE, we need to invert our address with customer address
$conf->global->MAIN_INVERT_SENDER_RECIPIENT = 1;
}
+ if ($mysoc->country_code == 'FR' && !isset($conf->global->MAIN_PROFID1_IN_ADDRESS)) {
+ // For FR, default value of option to show profid SIRET is on by default
+ $conf->global->MAIN_PROFID1_IN_ADDRESS = 1;
+ }
}
diff --git a/htdocs/modulebuilder/admin/setup.php b/htdocs/modulebuilder/admin/setup.php
index 50c86e38cc0..4c7e597e889 100644
--- a/htdocs/modulebuilder/admin/setup.php
+++ b/htdocs/modulebuilder/admin/setup.php
@@ -132,21 +132,23 @@ if ($conf->global->MAIN_FEATURES_LEVEL >= 2) {
}
}
print '';
+}
- print '
';
- print ''.$langs->trans("UseSpecificEditorName").' ';
- print '';
- print ' ';
- print ' ';
- print ' ';
+print '
';
+print ''.$langs->trans("UseSpecificEditorName").' ';
+print '';
+print ' ';
+print ' ';
+print ' ';
- print '
';
- print ''.$langs->trans("UseSpecificEditorURL").' ';
- print '';
- print ' ';
- print ' ';
- print ' ';
+print '
';
+print ''.$langs->trans("UseSpecificEditorURL").' ';
+print '';
+print ' ';
+print ' ';
+print ' ';
+if ($conf->global->MAIN_FEATURES_LEVEL >= 2) {
print '
';
print ''.$langs->trans("UseSpecificFamily").' ';
print '';
diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php
index 1c30d709576..538b1cac290 100644
--- a/htdocs/modulebuilder/index.php
+++ b/htdocs/modulebuilder/index.php
@@ -84,7 +84,7 @@ $idmodule= GETPOST('idmodule', 'alpha');
if (!isModEnabled('modulebuilder')) {
accessforbidden('Module ModuleBuilder not enabled');
}
-if (!$user->admin && empty($conf->global->MODULEBUILDER_FOREVERYONE)) {
+if (!$user->hasRight("modulebuilder", "run")) {
accessforbidden('ModuleBuilderNotAllowed');
}
@@ -1771,7 +1771,7 @@ if ($dirins && $action == 'generatepackage') {
$arrayversion = explode('.', $moduleobj->version, 3);
if (count($arrayversion)) {
- $FILENAMEZIP = "module_".$modulelowercase.'-'.$arrayversion[0].(empty($arrayversion[1]) ? '.0' : '.'.$arrayversion[1]).($arrayversion[2] ? '.'.$arrayversion[2] : '').'.zip';
+ $FILENAMEZIP = "module_".$modulelowercase.'-'.$arrayversion[0].(empty($arrayversion[1]) ? '.0' : '.'.$arrayversion[1]).(empty($arrayversion[2]) ? '' : '.'.$arrayversion[2]).'.zip';
$dirofmodule = dol_buildpath($modulelowercase, 0).'/bin';
$outputfilezip = $dirofmodule.'/'.$FILENAMEZIP;
@@ -1780,7 +1780,7 @@ if ($dirins && $action == 'generatepackage') {
dol_mkdir($dirofmodule);
}
// Note: We exclude /bin/ to not include the already generated zip
- $result = dol_compress_dir($dir, $outputfilezip, 'zip', '/\/bin\//', $modulelowercase);
+ $result = dol_compress_dir($dir, $outputfilezip, 'zip', '/\/bin\/|\.git|\.old|\.back|\.ssh/', $modulelowercase);
} else {
$result = -1;
}
@@ -1974,6 +1974,28 @@ if ($message) {
$infomodulesfound = ''.$form->textwithpicto('', $langs->trans("ModuleBuilderDesc3", count($listofmodules)).' '.$langs->trans("ModuleBuilderDesc4", $FILEFLAG).' '.$textforlistofdirs).'
';
+
+$dolibarrdataroot = preg_replace('/([\\/]+)$/i', '', DOL_DATA_ROOT);
+$allowonlineinstall = true;
+if (dol_is_file($dolibarrdataroot.'/installmodules.lock')) {
+ $allowonlineinstall = false;
+}
+if (empty($allowonlineinstall)) {
+ if (getDolGlobalString('MAIN_MESSAGE_INSTALL_MODULES_DISABLED_CONTACT_US')) {
+ // Show clean message
+ $message = info_admin($langs->trans('InstallModuleFromWebHasBeenDisabledContactUs'));
+ } else {
+ // Show technical message
+ $message = info_admin($langs->trans("InstallModuleFromWebHasBeenDisabledByFile", $dolibarrdataroot.'/installmodules.lock'), 0, 0, 1, 'warning');
+ }
+
+ print $message;
+
+ llxFooter();
+ exit(0);
+}
+
+
// Load module descriptor
$error = 0;
$moduleobj = null;
@@ -2161,25 +2183,30 @@ if ($module == 'initmodule') {
print '';
print '';
print ''.$langs->trans("Family").' ';
print '
';
print '';
- print ''.$langs->trans("ModuleFamilyHr").' ';
- print ''.$langs->trans("ModuleFamilyCrm").' ';
- print ''.$langs->trans("ModuleFamilySrm").' ';
- print ''.$langs->trans("ModuleFamilyFinancial").' ';
- print ''.$langs->trans("ModuleFamilyProducts").' ';
- print ''.$langs->trans("ModuleFamilyProjects").' ';
- print ''.$langs->trans("ModuleFamilyECM").' ';
- print ''.$langs->trans("ModuleFamilyTechnic").' ';
- print ''.$langs->trans("ModuleFamilyPortal").' ';
- print ''.$langs->trans("ModuleFamilyInterface").' ';
- print ''.$langs->trans("ModuleFamilyBase").' ';
- print ''.$langs->trans("ModuleFamilyOther").' ';
+ $arrayoffamilies = array(
+ 'hr' => "ModuleFamilyHr",
+ 'crm' => "ModuleFamilyCrm",
+ 'srm' => "ModuleFamilySrm",
+ 'financial' => 'ModuleFamilyFinancial',
+ 'products' => 'ModuleFamilyProducts',
+ 'projects' => 'ModuleFamilyProjects',
+ 'ecm' => 'ModuleFamilyECM',
+ 'technic' => 'ModuleFamilyTechnic',
+ 'portal' => 'ModuleFamilyPortal',
+ 'interface' => 'ModuleFamilyInterface',
+ 'base' => 'ModuleFamilyBase',
+ 'other' => 'ModuleFamilyOther'
+ );
+ foreach ($arrayoffamilies as $key => $value) {
+ print '- '.$key.'').'">'.$langs->trans($value).' ';
+ }
print ' ';
print ajax_combobox("family");
print '
';
@@ -2187,20 +2214,20 @@ if ($module == 'initmodule') {
print '';
print '';
print '';
print ' ';
@@ -2337,15 +2364,15 @@ if ($module == 'initmodule') {
print ' ';
print ' '.$langs->trans("DescriptorFile").' : '.$pathtofile.' ';
- print ' '.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ''.img_picto($langs->trans("Edit"), 'edit').' ';
print '';
print '
'.$langs->trans("ReadmeFile").' : '.$pathtofilereadme.' ';
- print ''.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ''.img_picto($langs->trans("Edit"), 'edit').' ';
print '';
print '
'.$langs->trans("ChangeLog").' : '.$pathtochangelog.' ';
- print ''.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ''.img_picto($langs->trans("Edit"), 'edit').' ';
print '';
print '
';
@@ -2416,7 +2443,7 @@ if ($module == 'initmodule') {
print $langs->trans("EditorUrl");
print '
';
if (!empty($moduleobj->editor_url)) {
- print ''.$moduleobj->editor_url.' '.img_picto('', 'globe').' ';
+ print ''.$moduleobj->editor_url.' '.img_picto('', 'globe').' ';
}
print ' ';
@@ -2527,8 +2554,8 @@ if ($module == 'initmodule') {
$pathtofile = 'langs/'.$langfile['relativename'];
}
print ' '.$langs->trans("LanguageFile").' '.basename(dirname($pathtofile)).' : '.$pathtofile.' ';
- print ''.img_picto($langs->trans("Edit"), 'edit').' ';
- print ''.img_picto($langs->trans("Delete"), 'delete').' ';
+ print ''.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ''.img_picto($langs->trans("Delete"), 'delete').' ';
print ' ';
}
print '
';
@@ -2810,12 +2837,12 @@ if ($module == 'initmodule') {
print '';
// Main DAO class file
print '
'.$langs->trans("ClassFile").' :
'.(dol_is_file($realpathtoclass) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtoclass).(dol_is_file($realpathtoclass) ? '' : ' ').' ';
- print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
+ print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
print '
';
// Image
if (dol_is_file($realpathtopicto)) {
print '
'.$langs->trans("Image").' :
'.(dol_is_file($realpathtopicto) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtopicto).(dol_is_file($realpathtopicto) ? '' : ' ').' ';
- //print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
+ //print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
print '
';
} elseif (!empty($tmpobject)) {
print '
'.$langs->trans("Image").' : '.img_picto('', $tmpobject->picto, 'class="pictofixedwidth"');
@@ -2826,117 +2853,117 @@ if ($module == 'initmodule') {
print '
';
print '
'.$langs->trans("ApiClassFile").' :
'.(dol_is_file($realpathtoapi) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtoapi).(dol_is_file($realpathtoapi)?'':' ').' ';
if (dol_is_file($realpathtoapi)) {
- print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
+ print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
print ' ';
- print '
'.img_picto($langs->trans("Delete"), 'delete').' ';
+ print '
'.img_picto($langs->trans("Delete"), 'delete').' ';
print ' ';
if (empty($conf->global->$const_name)) { // If module is not activated
- print '
'.$langs->trans("GoToApiExplorer").' ';
+ print '
'.$langs->trans("ApiExplorer").' ';
} else {
- print '
'.$langs->trans("GoToApiExplorer").' ';
+ print '
'.$langs->trans("ApiExplorer").' ';
}
} else {
- print '
'.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
+ print '
'.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
}
// PHPUnit
print '
';
print '
'.$langs->trans("TestClassFile").' :
'.(dol_is_file($realpathtophpunit) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtophpunit).(dol_is_file($realpathtophpunit)?'':' ').' ';
if (dol_is_file($realpathtophpunit)) {
- print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
+ print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
print ' ';
- print '
'.img_picto($langs->trans("Delete"), 'delete').' ';
+ print '
'.img_picto($langs->trans("Delete"), 'delete').' ';
} else {
- print '
'.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
+ print '
'.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
}
print '
';
print '
';
print '
'.$langs->trans("PageForLib").' :
'.(dol_is_file($realpathtolib) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtolib).(dol_is_file($realpathtolib) ? '' : ' ').' ';
- print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
+ print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
print '
';
print '
'.$langs->trans("PageForObjLib").' :
'.(dol_is_file($realpathtoobjlib) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtoobjlib).(dol_is_file($realpathtoobjlib) ? '' : ' ').' ';
- print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
+ print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
print '
';
print '
';
print '
'.$langs->trans("SqlFile").' :
'.(dol_is_file($realpathtosql) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtosql).(dol_is_file($realpathtosql) ? '' : ' ').' ';
- print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
- print '
'.$langs->trans("DropTableIfEmpty").' ';
+ print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
+ print '
'.$langs->trans("DropTableIfEmpty").' ';
//print '
'.$langs->trans("RunSql").' ';
print '
';
print '
'.$langs->trans("SqlFileKey").' :
'.(dol_is_file($realpathtosqlkey) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtosqlkey).(dol_is_file($realpathtosqlkey) ? '' : ' ').' ';
- print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
+ print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
//print '
'.$langs->trans("RunSql").' ';
print '
';
print '
'.$langs->trans("SqlFileExtraFields").' :
'.(dol_is_file($realpathtosqlextra) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtosqlextra).(dol_is_file($realpathtosqlextra) && dol_is_file($realpathtosqlextrakey) ? '' : ' ').' ';
if (dol_is_file($realpathtosqlextra) && dol_is_file($realpathtosqlextrakey)) {
- print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
+ print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
print ' ';
- print '
'.img_picto($langs->trans("Delete"), 'delete').' ';
+ print '
'.img_picto($langs->trans("Delete"), 'delete').' ';
print ' ';
- print '
'.$langs->trans("DropTableIfEmpty").' ';
+ print '
'.$langs->trans("DropTableIfEmpty").' ';
} else {
- print '
'.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
+ print '
'.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
}
//print '
'.$langs->trans("RunSql").' ';
print '
';
print '
'.$langs->trans("SqlFileKeyExtraFields").' :
'.(dol_is_file($realpathtosqlextrakey) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtosqlextrakey).(dol_is_file($realpathtosqlextra) && dol_is_file($realpathtosqlextrakey) ? '' : ' ').' ';
if (dol_is_file($realpathtosqlextra) && dol_is_file($realpathtosqlextrakey)) {
- print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
+ print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
print ' ';
- print '
'.img_picto($langs->trans("Delete"), 'delete').' ';
+ print '
'.img_picto($langs->trans("Delete"), 'delete').' ';
} else {
- print '
'.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
+ print '
'.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
}
print '
';
print '
';
print '';
print '
'.$langs->trans("PageForList").' :
'.(dol_is_file($realpathtolist) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtolist).(dol_is_file($realpathtolist) ? '' : ' ').' ';
- print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
+ print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
print '
';
print '
'.$langs->trans("PageForCreateEditView").' :
'.(dol_is_file($realpathtocard) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtocard).(dol_is_file($realpathtocard) ? '' : ' ').'?action=create ';
- print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
+ print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
print '
';
// Page contact
print '
'.$langs->trans("PageForContactTab").' :
'.(dol_is_file($realpathtocontact) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtocontact).(dol_is_file($realpathtocontact) ? '' : ' ').' ';
- print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
+ print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
if (dol_is_file($realpathtocontact)) {
print ' ';
- print '
'.img_picto($langs->trans("Delete"), 'delete').' ';
+ print '
'.img_picto($langs->trans("Delete"), 'delete').' ';
} else {
- print '
'.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
+ print '
'.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
}
print '
';
// Page document
print '
'.$langs->trans("PageForDocumentTab").' :
'.(dol_is_file($realpathtodocument) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtodocument).(dol_is_file($realpathtodocument) ? '' : ' ').' ';
- print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
+ print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
if (dol_is_file($realpathtodocument)) {
print ' ';
- print '
'.img_picto($langs->trans("Delete"), 'delete').' ';
+ print '
'.img_picto($langs->trans("Delete"), 'delete').' ';
} else {
- print '
'.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
+ print '
'.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
}
print '
';
// Page notes
print '
'.$langs->trans("PageForNoteTab").' :
'.(dol_is_file($realpathtonote) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtonote).(dol_is_file($realpathtonote) ? '' : ' ').' ';
- print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
+ print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
if (dol_is_file($realpathtonote)) {
print ' ';
- print '
'.img_picto($langs->trans("Delete"), 'delete').' ';
+ print '
'.img_picto($langs->trans("Delete"), 'delete').' ';
} else {
- print '
'.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
+ print '
'.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
}
print '
';
// Page agenda
print '
'.$langs->trans("PageForAgendaTab").' :
'.(dol_is_file($realpathtoagenda) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtoagenda).(dol_is_file($realpathtoagenda) ? '' : ' ').' ';
- print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
+ print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
if (dol_is_file($realpathtoagenda)) {
print ' ';
- print '
'.img_picto($langs->trans("Delete"), 'delete').' ';
+ print '
'.img_picto($langs->trans("Delete"), 'delete').' ';
} else {
- print '
'.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
+ print '
'.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
}
print '
';
print '
';
@@ -2969,21 +2996,24 @@ if ($module == 'initmodule') {
print '
';
print '
';
print '';
- print ''.$langs->trans("Property");
- print ' ('.$langs->trans("SeeExamples").' )';
+ print ' ';
+
+ $htmltext = $langs->trans("PropertyDesc").''.$langs->trans("SeeExamples").' ';
+ print $form->textwithpicto($langs->trans("Code"), $htmltext, 1, 'help', 'extracss', 0, 3, 'propertyhelp');
+
print ' ';
print '';
print $form->textwithpicto($langs->trans("Label"), $langs->trans("YouCanUseTranslationKey"));
print ' ';
- print ''.$form->textwithpicto($langs->trans("Type"), $langs->trans("TypeOfFieldsHelp")).' ';
+ print ''.$form->textwithpicto($langs->trans("Type"), $langs->trans("TypeOfFieldsHelpIntro").' '.$langs->trans("TypeOfFieldsHelp"), 1, 'help', 'extracss', 0, 3, 'typehelp').' ';
print ''.$form->textwithpicto($langs->trans("ArrayOfKeyValues"), $langs->trans("ArrayOfKeyValuesDesc")).' ';
print ''.$form->textwithpicto($langs->trans("NotNull"), $langs->trans("NotNullDesc")).' ';
print ''.$langs->trans("DefaultValue").' ';
print ''.$langs->trans("DatabaseIndex").' ';
- print ''.$langs->trans("ForeignKey").' ';
+ print ''.$form->textwithpicto($langs->trans("ForeignKey"), $langs->trans("ForeignKeyDesc"), 1, 'help', 'extracss', 0, 3, 'foreignkeyhelp').' ';
print ''.$langs->trans("Position").' ';
- print ''.$form->textwithpicto($langs->trans("Enabled"), $langs->trans("EnabledDesc")).' ';
- print ''.$form->textwithpicto($langs->trans("Visible"), $langs->trans("VisibleDesc")).' ';
+ print ''.$form->textwithpicto($langs->trans("Enabled"), $langs->trans("EnabledDesc"), 1, 'help', 'extracss', 0, 3, 'enabledhelp').' ';
+ print ''.$form->textwithpicto($langs->trans("Visibility"), $langs->trans("VisibleDesc").' '.$langs->trans("ItCanBeAnExpression"), 1, 'help', 'extracss', 0, 3, 'visiblehelp').' ';
print ''.$langs->trans("NotEditable").' ';
print ''.$langs->trans("AlwaysEditable").' ';
print ''.$form->textwithpicto($langs->trans("SearchAll"), $langs->trans("SearchAllDesc")).' ';
@@ -3091,7 +3121,9 @@ if ($module == 'initmodule') {
print '';
print ' ';
print '';
@@ -3106,7 +3138,7 @@ if ($module == 'initmodule') {
print ' ';
print ' ';
print '';
- print ' ';
+ print ' ';
print ' ';
print '';
print ' ';
@@ -3180,13 +3212,15 @@ if ($module == 'initmodule') {
print ' ';
print dol_escape_htmltag($propposition);
print ' ';
- print '';
+ print ' ';
print $propenabled ? dol_escape_htmltag($propenabled) : '';
print ' ';
- print '';
+ // Visibility
+ print ' ';
print $propvisible ? dol_escape_htmltag($propvisible) : '0';
print ' ';
- print '';
+ // Readonly
+ print ' ';
print $propnoteditable ? dol_escape_htmltag($propnoteditable) : '';
print ' ';
print '';
@@ -3198,16 +3232,17 @@ if ($module == 'initmodule') {
print ' ';
print $propisameasure ? dol_escape_htmltag($propisameasure) : '';
print ' ';
- print '';
+ print ' ';
print $propcss ? dol_escape_htmltag($propcss) : '';
print ' ';
- print '';
+ print ' ';
print $propcssview ? dol_escape_htmltag($propcssview) : '';
print ' ';
- print '';
+ print ' ';
print $propcsslist ? dol_escape_htmltag($propcsslist) : '';
print ' ';
- print '';
+ // Key for tooltop
+ print ' ';
print $prophelp ? dol_escape_htmltag($prophelp) : '';
print ' ';
print '';
@@ -3248,7 +3283,7 @@ if ($module == 'initmodule') {
$format = 'markdown';
}
print ' '.$langs->trans("SpecificationFile").' : '.$pathtofile.' ';
- print ' '.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ' '.img_picto($langs->trans("Edit"), 'edit').' ';
print ' ';
}
} else {
@@ -3341,7 +3376,7 @@ if ($module == 'initmodule') {
print ' ';
print ' '.$langs->trans("DescriptorFile").' : '.$pathtofile.' ';
- print ' '.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ' '.img_picto($langs->trans("Edit"), 'edit').' ';
print ' ';
if (is_array($dicts) && !empty($dicts)) {
print ' '.$langs->trans("LanguageFile").' : ';
@@ -3365,18 +3400,20 @@ if ($module == 'initmodule') {
//$listofobject = dol_dir_list($dir, 'files', 0, '\.class\.php$');
$firstdicname = '';
- foreach ($dicts['tabname'] as $key => $dic) {
- $dicname = $dic;
- $diclabel = $dicts['tablib'][$key];
+ if (!empty($dicts['tabname'])) {
+ foreach ($dicts['tabname'] as $key => $dic) {
+ $dicname = $dic;
+ $diclabel = $dicts['tablib'][$key];
- if (empty($firstdicname)) {
- $firstdicname = $dicname;
+ if (empty($firstdicname)) {
+ $firstdicname = $dicname;
+ }
+
+ $head3[$h][0] = $_SERVER["PHP_SELF"].'?tab=dictionaries&module='.$module.($forceddirread ? '@'.$dirread : '').'&tabdic='.$dicname;
+ $head3[$h][1] = $diclabel;
+ $head3[$h][2] = $dicname;
+ $h++;
}
-
- $head3[$h][0] = $_SERVER["PHP_SELF"].'?tab=dictionaries&module='.$module.($forceddirread ? '@'.$dirread : '').'&tabdic='.$dicname;
- $head3[$h][1] = $diclabel;
- $head3[$h][2] = $dicname;
- $h++;
}
if ($h > 1) {
@@ -3566,7 +3603,7 @@ if ($module == 'initmodule') {
print ' ';
print ' '.$langs->trans("DescriptorFile").' : '.$pathtofile.' ';
- print ' '.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ' '.img_picto($langs->trans("Edit"), 'edit').' ';
print ' ';
print ' ';
@@ -3716,7 +3753,7 @@ if ($module == 'initmodule') {
print ' ';
print ' '.$langs->trans("DescriptorFile").' : '.$pathtofile.' ';
- print ' '.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ' '.img_picto($langs->trans("Edit"), 'edit').' ';
print ' ';
print ' ';
@@ -3807,7 +3844,7 @@ if ($module == 'initmodule') {
print ' ';
print ' '.$langs->trans("DescriptorFile").' : '.$pathtofile.' ';
print ' ';
- print ''.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ''.img_picto($langs->trans("Edit"), 'edit').' ';
print ' ';
print '';
@@ -3816,11 +3853,11 @@ if ($module == 'initmodule') {
if (dol_is_file($dirins.'/'.$pathtohook)) {
print ''.$pathtohook.' ';
print ' ';
- print ''.img_picto($langs->trans("Edit"), 'edit').' ';
- print ''.img_picto($langs->trans("Delete"), 'delete').' ';
+ print ''.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ''.img_picto($langs->trans("Delete"), 'delete').' ';
} else {
print ''.$langs->trans("FileNotYetGenerated").' ';
- print ''.img_picto('Generate', 'generate', 'class="paddingleft"').'';
+ print ' '.img_picto('Generate', 'generate', 'class="paddingleft"').'';
print ' ';
}
print ' ';
@@ -3867,7 +3904,7 @@ if ($module == 'initmodule') {
print '';
print ' '.$langs->trans("DescriptorFile").' : '.$pathtofile.' ';
print ' ';
- print ''.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ''.img_picto($langs->trans("Edit"), 'edit').' ';
print ' ';
if (!empty($triggers)) {
@@ -3876,15 +3913,15 @@ if ($module == 'initmodule') {
print '';
print ' '.$langs->trans("TriggersFile").' : '.$pathtofile.' ';
- print ' '.img_picto($langs->trans("Edit"), 'edit').' ';
- print ''.img_picto($langs->trans("Delete"), 'delete').' ';
+ print ''.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ''.img_picto($langs->trans("Delete"), 'delete').' ';
print ' ';
}
} else {
print '';
print ' '.$langs->trans("TriggersFile");
print ' : '.$langs->trans("FileNotYetGenerated").' ';
- print ''.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
+ print ''.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
print ' ';
print ' ';
}
@@ -3929,11 +3966,11 @@ if ($module == 'initmodule') {
print ' '.$langs->trans("CSSFile").' : ';
if (dol_is_file($dirins.'/'.$pathtohook)) {
print ''.$pathtohook.' ';
- print ''.img_picto($langs->trans("Edit"), 'edit').' ';
- print ''.img_picto($langs->trans("Delete"), 'delete').' ';
+ print ''.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ''.img_picto($langs->trans("Delete"), 'delete').' ';
} else {
print ''.$langs->trans("FileNotYetGenerated").' ';
- print ''.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
+ print ''.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
}
print '';
} else {
@@ -3975,11 +4012,11 @@ if ($module == 'initmodule') {
print ' '.$langs->trans("JSFile").' : ';
if (dol_is_file($dirins.'/'.$pathtohook)) {
print ''.$pathtohook.' ';
- print ''.img_picto($langs->trans("Edit"), 'edit').' ';
- print ''.img_picto($langs->trans("Delete"), 'delete').' ';
+ print ''.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ''.img_picto($langs->trans("Delete"), 'delete').' ';
} else {
print ''.$langs->trans("FileNotYetGenerated").' ';
- print ''.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
+ print ''.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
}
print '';
} else {
@@ -4024,13 +4061,13 @@ if ($module == 'initmodule') {
$pathtofile = $widget['relpath'];
print ' '.$langs->trans("WidgetFile").' : '.$pathtofile.' ';
- print ''.img_picto($langs->trans("Edit"), 'edit').' ';
- print ''.img_picto($langs->trans("Delete"), 'delete').' ';
+ print ''.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ''.img_picto($langs->trans("Delete"), 'delete').' ';
print ' ';
}
} else {
print ' '.$langs->trans("WidgetFile").' : '.$langs->trans("NoWidget").' ';
- print ''.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
+ print ''.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
print ' ';
}
print '
';
@@ -4072,7 +4109,7 @@ if ($module == 'initmodule') {
print '
';
print '
'.$langs->trans("DescriptorFile").' :
'.$pathtofile.' ';
- print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
+ print '
'.img_picto($langs->trans("Edit"), 'edit').' ';
print '
';
} else {
$fullpathoffile = dol_buildpath($file, 0);
@@ -4143,13 +4180,13 @@ if ($module == 'initmodule') {
$pathtofile = $clifile['relpath'];
print '
'.$langs->trans("CLIFile").' : '.$pathtofile.' ';
- print ''.img_picto($langs->trans("Edit"), 'edit').' ';
- print ''.img_picto($langs->trans("Delete"), 'delete').' ';
+ print ''.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ''.img_picto($langs->trans("Delete"), 'delete').' ';
print '';
}
} else {
print '
'.$langs->trans("CLIFile").' : '.$langs->trans("FileNotYetGenerated"); ' ';
- print ''.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
+ print ''.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
print '';
}
print '
';
@@ -4190,7 +4227,7 @@ if ($module == 'initmodule') {
print ' ';
print ' '.$langs->trans("DescriptorFile").' : '.$pathtofile.' ';
- print ' '.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ' '.img_picto($langs->trans("Edit"), 'edit').' ';
print ' ';
print ' ';
@@ -4319,14 +4356,14 @@ if ($module == 'initmodule') {
}
print ' ';
print ' '.$langs->trans("SpecificationFile").' : '.$pathtofile.' ';
- print ' '.img_picto($langs->trans("Edit"), 'edit').' ';
- print ''.img_picto($langs->trans("Delete"), 'delete').' ';
+ print ''.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ''.img_picto($langs->trans("Delete"), 'delete').' ';
print ' ';
}
} else {
print '';
print ' '.$langs->trans("SpecificationFile").' : '.$langs->trans("FileNotYetGenerated").' ';
- print ' '.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
+ print ''.img_picto('Generate', 'generate', 'class="paddingleft"').' ';
print ' ';
}
print '
';
@@ -4381,7 +4418,7 @@ if ($module == 'initmodule') {
print '';
print '';
print ' ('.$langs->trans("GeneratedOn").' '.dol_print_date(dol_filemtime($outputfiledoc), 'dayhour').') ';
- print ' '.img_picto($langs->trans("Delete"), 'delete').' ';
+ print ' '.img_picto($langs->trans("Delete"), 'delete').' ';
}
print ' ';
@@ -4396,7 +4433,7 @@ if ($module == 'initmodule') {
print '';
print '';
print ' ('.$langs->trans("GeneratedOn").' '.dol_print_date(dol_filemtime($outputfiledocpdf), 'dayhour').') ';
- print ' '.img_picto($langs->trans("Delete"), 'delete').' ';
+ print ' '.img_picto($langs->trans("Delete"), 'delete').' ';
}
print ' ';
@@ -4451,7 +4488,7 @@ if ($module == 'initmodule') {
$arrayversion = explode('.', $moduleobj->version, 3);
if (count($arrayversion)) {
- $FILENAMEZIP = "module_".$modulelowercase.'-'.$arrayversion[0].(empty($arrayversion[1]) ? '.0' : '.'.$arrayversion[1]).($arrayversion[2] ? ".".$arrayversion[2] : '').".zip";
+ $FILENAMEZIP = "module_".$modulelowercase.'-'.$arrayversion[0].(empty($arrayversion[1]) ? '.0' : '.'.$arrayversion[1]).(empty($arrayversion[2]) ? '' : ".".$arrayversion[2]).".zip";
$outputfilezip = dol_buildpath($modulelowercase, 0).'/bin/'.$FILENAMEZIP;
}
@@ -4464,7 +4501,7 @@ if ($module == 'initmodule') {
$relativepath = $modulelowercase.'/bin/'.$FILENAMEZIP;
print ''.$outputfilezip.' ';
print ' ('.$langs->trans("GeneratedOn").' '.dol_print_date(dol_filemtime($outputfilezip), 'dayhour').') ';
- print ' '.img_picto($langs->trans("Delete"), 'delete').' ';
+ print ' '.img_picto($langs->trans("Delete"), 'delete').' ';
}
print '';
@@ -4495,7 +4532,7 @@ if ($module == 'initmodule') {
print ' ';
print ' '.$langs->trans("DescriptorFile").' : '.$pathtofile.' ';
- print ' '.img_picto($langs->trans("Edit"), 'edit').' ';
+ print ' '.img_picto($langs->trans("Edit"), 'edit').' ';
print ' ';
print ' ';
diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php
index b30391becc7..97c4e9ba646 100644
--- a/htdocs/modulebuilder/template/class/myobject.class.php
+++ b/htdocs/modulebuilder/template/class/myobject.class.php
@@ -450,7 +450,7 @@ class MyObject extends CommonObject
$sql = "SELECT ";
$sql .= $this->getFieldList('t');
- $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t";
+ $sql .= " FROM ".$this->db->prefix().$this->table_element." as t";
if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
$sql .= " WHERE t.entity IN (".getEntity($this->element).")";
} else {
diff --git a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php
index 212f02aa4b3..99cd900b512 100644
--- a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php
+++ b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php
@@ -188,7 +188,7 @@ class modMyModule extends DolibarrModules
// 'invoice_supplier' to add a tab in supplier invoice view
// 'member' to add a tab in fundation member view
// 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
+ // 'order' to add a tab in sale order view
// 'order_supplier' to add a tab in supplier order view
// 'payment' to add a tab in payment view
// 'payment_supplier' to add a tab in supplier payment view
diff --git a/htdocs/modulebuilder/template/core/modules/mymodule/doc/doc_generic_myobject_odt.modules.php b/htdocs/modulebuilder/template/core/modules/mymodule/doc/doc_generic_myobject_odt.modules.php
index 46967d6e4fa..b7dfc374a52 100644
--- a/htdocs/modulebuilder/template/core/modules/mymodule/doc/doc_generic_myobject_odt.modules.php
+++ b/htdocs/modulebuilder/template/core/modules/mymodule/doc/doc_generic_myobject_odt.modules.php
@@ -119,7 +119,7 @@ class doc_generic_myobject_odt extends ModelePDFMyObject
$form = new Form($this->db);
$texte = $this->description.". \n";
- $texte .= '';
+ $texte .= ' ';
$texte .= ' ';
$texte .= ' ';
$texte .= ' ';
@@ -158,7 +158,7 @@ class doc_generic_myobject_odt extends ModelePDFMyObject
$texte .= $conf->global->MYMODULE_MYOBJECT_ADDON_PDF_ODT_PATH;
$texte .= '';
$texte .= '';
- $texte .= ' ';
+ $texte .= ' ';
$texte .= '
';
// Scan directories
@@ -172,18 +172,16 @@ class doc_generic_myobject_odt extends ModelePDFMyObject
}
if ($nbofiles) {
- $texte .= '';
+ $texte .= '
';
}
- $texte .= '
';
-
// Add input to upload a new template file.
$texte .= ''.$langs->trans("UploadNewTemplate");
$maxfilesizearray = getMaxFileSizeArray();
@@ -195,6 +193,7 @@ class doc_generic_myobject_odt extends ModelePDFMyObject
$texte .= ' ';
$texte .= ' ';
$texte .= '
';
+
$texte .= '';
$texte .= '';
@@ -282,8 +281,10 @@ class doc_generic_myobject_odt extends ModelePDFMyObject
$newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile);
$newfiletmp = preg_replace('/template_/i', '', $newfiletmp);
$newfiletmp = preg_replace('/modele_/i', '', $newfiletmp);
+
$newfiletmp = $objectref . '_' . $newfiletmp;
//$file=$dir.'/'.$newfiletmp.'.'.dol_print_date(dol_now(),'%Y%m%d%H%M%S').'.odt';
+
// Get extension (ods or odt)
$newfileformat = substr($newfile, strrpos($newfile, '.') + 1);
if (!empty($conf->global->MAIN_DOC_USE_TIMING)) {
@@ -308,7 +309,7 @@ class doc_generic_myobject_odt extends ModelePDFMyObject
return -1;
}
- // If CUSTOMER contact defined on order, we use it
+ // If CUSTOMER contact defined on object, we use it
$usecontact = false;
$arrayidcontact = $object->getIdContact('external', 'CUSTOMER');
if (count($arrayidcontact) > 0) {
@@ -348,7 +349,7 @@ class doc_generic_myobject_odt extends ModelePDFMyObject
// Line of free text
$newfreetext = '';
- $paramfreetext = 'ORDER_FREE_TEXT';
+ $paramfreetext = 'MYMODULE_MYOBJECT_FREE_TEXT';
if (!empty($conf->global->$paramfreetext)) {
$newfreetext = make_substitutions($conf->global->$paramfreetext, $substitutionarray);
}
diff --git a/htdocs/modulebuilder/template/core/modules/mymodule/doc/pdf_standard_myobject.modules.php b/htdocs/modulebuilder/template/core/modules/mymodule/doc/pdf_standard_myobject.modules.php
index 312f1215406..66e2b4dfa82 100644
--- a/htdocs/modulebuilder/template/core/modules/mymodule/doc/pdf_standard_myobject.modules.php
+++ b/htdocs/modulebuilder/template/core/modules/mymodule/doc/pdf_standard_myobject.modules.php
@@ -206,7 +206,7 @@ class pdf_standard_myobject extends ModelePDFMyObject
if (empty($object->lines[$i]->fk_product)) continue;
//var_dump($objphoto->ref);exit;
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
$pdir[0] = get_exdir($objphoto->id, 2, 0, 0, $objphoto, 'product').$objphoto->id."/photos/";
$pdir[1] = get_exdir(0, 0, 0, 0, $objphoto, 'product').dol_sanitizeFileName($objphoto->ref).'/';
} else {
@@ -312,7 +312,7 @@ class pdf_standard_myobject extends ModelePDFMyObject
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("PdfTitle")." ".$outputlangs->convToOutputCharset($object->thirdparty->name));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
diff --git a/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_advanced.php b/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_advanced.php
index 61186a3b4f3..cce647de224 100644
--- a/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_advanced.php
+++ b/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_advanced.php
@@ -30,7 +30,7 @@ dol_include_once('/mymodule/core/modules/mymodule/modules_myobject.php');
/**
- * Class to manage customer Bom numbering rules advanced
+ * Class to manage the Advanced numbering rule for MyObject
*/
class mod_myobject_advanced extends ModeleNumRefMyObject
{
diff --git a/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_standard.php b/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_standard.php
index 75068cf8d57..f21ffe880d0 100644
--- a/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_standard.php
+++ b/htdocs/modulebuilder/template/core/modules/mymodule/mod_myobject_standard.php
@@ -26,7 +26,7 @@ dol_include_once('/mymodule/core/modules/mymodule/modules_myobject.php');
/**
- * Class to manage customer order numbering rules standard
+ * Class to manage the Standard numbering rule for MyObject
*/
class mod_myobject_standard extends ModeleNumRefMyObject
{
diff --git a/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php b/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php
index 2c76818ab84..8f7764ad100 100644
--- a/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php
+++ b/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php
@@ -155,7 +155,7 @@ class InterfaceMyModuleTriggers extends DolibarrTriggers
//case 'MYECMDIR_MODIFY':
//case 'MYECMDIR_DELETE':
- // Customer orders
+ // Sales orders
//case 'ORDER_CREATE':
//case 'ORDER_MODIFY':
//case 'ORDER_VALIDATE':
diff --git a/htdocs/modulebuilder/template/myobject_card.php b/htdocs/modulebuilder/template/myobject_card.php
index 16a471ac51d..95f10b5b90c 100644
--- a/htdocs/modulebuilder/template/myobject_card.php
+++ b/htdocs/modulebuilder/template/myobject_card.php
@@ -126,11 +126,11 @@ include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be includ
// Set $enablepermissioncheck to 1 to enable a minimum low level of checks
$enablepermissioncheck = 0;
if ($enablepermissioncheck) {
- $permissiontoread = $user->rights->mymodule->myobject->read;
- $permissiontoadd = $user->rights->mymodule->myobject->write; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
- $permissiontodelete = $user->rights->mymodule->myobject->delete || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
- $permissionnote = $user->rights->mymodule->myobject->write; // Used by the include of actions_setnotes.inc.php
- $permissiondellink = $user->rights->mymodule->myobject->write; // Used by the include of actions_dellink.inc.php
+ $permissiontoread = $user->hasRight('mymodule', 'myobject', 'read');
+ $permissiontoadd = $user->hasRight('mymodule', 'myobject', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
+ $permissiontodelete = $user->hasRight('mymodule', 'myobject', 'delete') || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
+ $permissionnote = $user->hasRight('mymodule', 'myobject', 'write'); // Used by the include of actions_setnotes.inc.php
+ $permissiondellink = $user->hasRight('mymodule', 'myobject', 'write'); // Used by the include of actions_dellink.inc.php
} else {
$permissiontoread = 1;
$permissiontoadd = 1; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
@@ -356,6 +356,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
}*/
$formquestion = array();
+
/*
$forcecombo=0;
if ($conf->browser->name == 'ie') $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy
@@ -535,7 +536,9 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
}
// Clone
- print dolGetButtonAction('', $langs->trans('ToClone'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.(!empty($object->socid)?'&socid='.$object->socid:'').'&action=clone&token='.newToken(), '', $permissiontoadd);
+ if ($permissiontoadd) {
+ print dolGetButtonAction('', $langs->trans('ToClone'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.(!empty($object->socid)?'&socid='.$object->socid:'').'&action=clone&token='.newToken(), '', $permissiontoadd);
+ }
/*
if ($permissiontoadd) {
@@ -554,8 +557,9 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
}
*/
- // Delete (need delete permission, or if draft, just need create/modify permission)
- print dolGetButtonAction('', $langs->trans('Delete'), 'delete', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=delete&token='.newToken(), '', $permissiontodelete || ($object->status == $object::STATUS_DRAFT && $permissiontoadd));
+ // Delete
+ $params = array();
+ print dolGetButtonAction('', $langs->trans("Delete"), 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete, $params);
}
print ''."\n";
}
diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php
index 8ab14a190c1..f26afd1a503 100644
--- a/htdocs/modulebuilder/template/myobject_list.php
+++ b/htdocs/modulebuilder/template/myobject_list.php
@@ -87,7 +87,7 @@ require_once __DIR__.'/class/myobject.class.php';
// Load translation files required by the page
$langs->loadLangs(array("mymodule@mymodule", "other"));
-$action = GETPOST('action', 'aZ09') ?GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ...
+$action = GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ...
$massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
$show_files = GETPOST('show_files', 'int'); // Show files area generated by bulk actions ?
$confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
@@ -136,7 +136,7 @@ if (!$sortorder) {
}
// Initialize array of search criterias
-$search_all = GETPOST('search_all', 'alphanohtml');
+$search_all = GETPOST('search_all', 'alphanohtml') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml');
$search = array();
foreach ($object->fields as $key => $val) {
if (GETPOST('search_'.$key, 'alpha') !== '') {
@@ -198,7 +198,7 @@ if ($user->socid > 0) accessforbidden();
//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
//restrictedArea($user, $object->element, 0, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
if (!isModEnabled("mymodule")) {
- accessforbidden();
+ accessforbidden('Module mymodule not enabled');
}
if (!$permissiontoread) accessforbidden();
@@ -378,7 +378,7 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
}
}*/
/* The fast and low memory method to get and count full list converts the sql into a sql count */
- $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
+ $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/Ui', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
$resql = $db->query($sqlforcount);
if ($resql) {
$objforcount = $db->fetch_object($resql);
diff --git a/htdocs/mrp/mo_card.php b/htdocs/mrp/mo_card.php
index fde5811547a..aa3381c1242 100644
--- a/htdocs/mrp/mo_card.php
+++ b/htdocs/mrp/mo_card.php
@@ -49,7 +49,8 @@ $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'moc
$backtopage = GETPOST('backtopage', 'alpha');
$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
$TBomLineId = GETPOST('bomlineid', 'array');
-//$lineid = GETPOST('lineid', 'int');
+$lineid = GETPOST('lineid', 'int');
+$socid = GETPOST("socid", 'int');
// Initialize technical objects
$object = new Mo($db);
@@ -678,7 +679,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
// Clone
if ($permissiontoadd) {
- print ''.$langs->trans("ToClone").' ';
+ print dolGetButtonAction($langs->trans("ToClone"), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.(!empty($object->socid) ? '&socid='.$object->socid : "").'&action=clone&object=mo', 'clone', $permissiontoadd);
}
// Cancel - Reopen
@@ -703,12 +704,8 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
}
}
- // Delete (need delete permission, or if draft, just need create/modify permission)
- if ($permissiontodelete || ($object->status == $object::STATUS_DRAFT && $permissiontoadd)) {
- print 'id.'&action=delete&token='.newToken().'">'.$langs->trans('Delete').' '."\n";
- } else {
- print ''.$langs->trans('Delete').' '."\n";
- }
+ // Delete
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete);
}
print ''."\n";
}
@@ -729,12 +726,12 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
$filedir = $conf->mrp->dir_output.'/'.$objref;
$urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
$genallowed = $user->rights->mrp->read; // If you can read, you can build the PDF to read content
- $delallowed = $user->rights->mrp->create; // If you can create/edit, you can remove a file on card
+ $delallowed = $user->hasRight("mrp", "creer"); // If you can create/edit, you can remove a file on card
print $formfile->showdocuments('mrp:mo', $objref, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', '', '', $mysoc->default_lang);
// Show links to link elements
$linktoelem = $form->showLinkToObjectBlock($object, null, array('mo'));
- $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem, false, 'MOChild');
+ $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem, false);
print '';
diff --git a/htdocs/mrp/mo_list.php b/htdocs/mrp/mo_list.php
index 7f0cc15f873..c2ae1e78613 100644
--- a/htdocs/mrp/mo_list.php
+++ b/htdocs/mrp/mo_list.php
@@ -84,7 +84,7 @@ if (!$sortorder) {
}
// Initialize array of search criterias
-$search_all = GETPOST('search_all', 'alphanohtml');
+$search_all = GETPOST('search_all', 'alphanohtml') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml');
$search = array();
foreach ($object->fields as $key => $val) {
if (GETPOST('search_'.$key, 'alpha') !== '') {
@@ -174,6 +174,9 @@ if (empty($reshook)) {
if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
foreach ($object->fields as $key => $val) {
$search[$key] = '';
+ if ($key == 'status') {
+ $search[$key] = -1;
+ }
if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
$search[$key.'_dtstart'] = '';
$search[$key.'_dtend'] = '';
@@ -230,8 +233,8 @@ $sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as t";
if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)";
}
-$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."mrp_production lineparent ON t.fk_parent_line = lineparent.rowid";
-$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."mrp_mo moparent ON lineparent.fk_mo = moparent.rowid";
+$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."mrp_production as lineparent ON t.fk_parent_line = lineparent.rowid";
+$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."mrp_mo as moparent ON lineparent.fk_mo = moparent.rowid";
// Add table from hooks
$parameters = array();
$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
@@ -247,7 +250,7 @@ foreach ($search as $key => $val) {
if ($key == 'status' && $search[$key] == -1) {
continue;
}
- if ($key == 'fk_parent_line') {
+ if ($key == 'fk_parent_line' && $search[$key] != '') {
$sql .= natural_search('moparent.ref', $search[$key], 0);
continue;
}
@@ -266,17 +269,17 @@ foreach ($search as $key => $val) {
$mode_search = 2;
}
if ($search[$key] != '') {
- $sql .= natural_search($key, $search[$key], (($key == 'status') ? 2 : $mode_search));
+ $sql .= natural_search("t.".$db->escape($key), $search[$key], (($key == 'status') ? 2 : $mode_search));
}
} else {
if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') {
$columnName = preg_replace('/(_dtstart|_dtend)$/', '', $key);
if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) {
if (preg_match('/_dtstart$/', $key)) {
- $sql .= " AND t.".$columnName." >= '".$db->idate($search[$key])."'";
+ $sql .= " AND t.".$db->escape($columnName)." >= '".$db->idate($search[$key])."'";
}
if (preg_match('/_dtend$/', $key)) {
- $sql .= " AND t." . $columnName . " <= '" . $db->idate($search[$key]) . "'";
+ $sql .= " AND t.".$db->escape($columnName)." <= '".$db->idate($search[$key])."'";
}
}
}
@@ -450,7 +453,7 @@ if (!empty($moreforfilter)) {
}
$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
-$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
+$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields
$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
print '
'; // You can use div-table-responsive-no-min if you dont need reserved height for your table
@@ -460,6 +463,13 @@ print '
';
+// Action column
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons('left');
+ print $searchpicto;
+ print ' ';
+}
foreach ($object->fields as $key => $val) {
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
if ($key == 'status') {
@@ -505,16 +515,22 @@ $parameters = array('arrayfields'=>$arrayfields);
$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Action column
-print '';
-$searchpicto = $form->showFilterButtons();
-print $searchpicto;
-print ' ';
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons();
+ print $searchpicto;
+ print ' ';
+}
print ''."\n";
// Fields title label
// --------------------------------------------------------------------
print '';
+// Action column
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+}
foreach ($object->fields as $key => $val) {
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
if ($key == 'status') {
@@ -539,7 +555,9 @@ $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$
$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Action column
-print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+}
print ' '."\n";
@@ -570,6 +588,18 @@ while ($i < ($limit ? min($num, $limit) : $num)) {
// Show here line of result
print '';
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($object->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
foreach ($object->fields as $key => $val) {
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
@@ -627,15 +657,17 @@ while ($i < ($limit ? min($num, $limit) : $num)) {
$reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Action column
- print '';
- if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
- $selected = 0;
- if (in_array($object->id, $arrayofselected)) {
- $selected = 1;
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print ' ';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($object->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
}
- print ' ';
+ print ' ';
}
- print '';
if (!$i) {
$totalarray['nbfield']++;
}
diff --git a/htdocs/mrp/mo_movements.php b/htdocs/mrp/mo_movements.php
index 761a17f016d..2f3ed1f2d2b 100644
--- a/htdocs/mrp/mo_movements.php
+++ b/htdocs/mrp/mo_movements.php
@@ -47,7 +47,8 @@ $confirm = GETPOST('confirm', 'alpha');
$cancel = GETPOST('cancel', 'aZ09');
$contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'mostockmovement'; // To manage different context of search
$backtopage = GETPOST('backtopage', 'alpha');
-//$lineid = GETPOST('lineid', 'int');
+$massaction = GETPOST('massaction', 'aZ09');
+$lineid = GETPOST('lineid', 'int');
$msid = GETPOST('msid', 'int');
$year = GETPOST("year", 'int');
diff --git a/htdocs/mrp/mo_production.php b/htdocs/mrp/mo_production.php
index 24b3516684e..64ae11909ef 100644
--- a/htdocs/mrp/mo_production.php
+++ b/htdocs/mrp/mo_production.php
@@ -814,6 +814,8 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
// Lines to consume
+ $bomcostupdated = 0; // We will recalculate the unitary cost to produce a product using the real "products to consume into MO"
+
if (!empty($object->lines)) {
$nblinetoconsume = 0;
foreach ($object->lines as $line) {
@@ -832,7 +834,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
$linecost = price2num($tmpproduct->pmp, 'MT');
if ($object->qty > 0) {
- // add free consume line cost to bomcost
+ // add free consume line cost to $bomcostupdated
$costprice = price2num((!empty($tmpproduct->cost_price)) ? $tmpproduct->cost_price : $tmpproduct->pmp);
if (empty($costprice)) {
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
@@ -843,12 +845,11 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
$costprice = 0;
}
}
- $linecost = price2num(($line->qty * $costprice) / $object->qty, 'MT');
- $bomcost += $linecost;
+ $linecost = price2num(($line->qty * $costprice) / $object->qty, 'MT'); // price for line for all quantities
+ $bomcostupdated += price2num(($line->qty * $costprice) / $object->qty, 'MU'); // same but with full accuracy
}
- $bomcost = price2num($bomcost, 'MU');
-
+ $bomcostupdated = price2num($bomcostupdated, 'MU');
$arrayoflines = $object->fetchLinesLinked('consumed', $line->id);
$alreadyconsumed = 0;
foreach ($arrayoflines as $line2) {
@@ -1136,7 +1137,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
print ''.$langs->trans("Product").' ';
print ''.$langs->trans("Qty").' ';
if ($permissiontoupdatecost) {
- if (empty($bomcost)) {
+ if (empty($bomcostupdated)) {
print ''.$form->textwithpicto($langs->trans("UnitCost"), $langs->trans("AmountUsedToUpdateWAP")).' ';
} else {
print ''.$form->textwithpicto($langs->trans("ManufacturingPrice"), $langs->trans("AmountUsedToUpdateWAP")).' ';
@@ -1230,17 +1231,25 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
if ($permissiontoupdatecost) {
// Defined $manufacturingcost
$manufacturingcost = 0;
- if ($object->mrptype == 0) { // If MO is a "Manufacture" type (and not "Disassemble"
- $manufacturingcost = $bomcost;
+ $manufacturingcostsrc = '';
+ if ($object->mrptype == 0) { // If MO is a "Manufacture" type (and not "Disassemble")
+ $manufacturingcost = $bomcostupdated;
+ $manufacturingcostsrc = $langs->trans("CalculatedFromProductsToConsume");
+ if (empty($manufacturingcost)) {
+ $manufacturingcost = $bomcost;
+ $manufacturingcostsrc = $langs->trans("ValueFromBom");
+ }
if (empty($manufacturingcost)) {
$manufacturingcost = price2num($tmpproduct->cost_price, 'MU');
+ $manufacturingcostsrc = $langs->trans("CostPrice");
}
if (empty($manufacturingcost)) {
$manufacturingcost = price2num($tmpproduct->pmp, 'MU');
+ $manufacturingcostsrc = $langs->trans("PMPValue");
}
}
- print '';
+ print ' ';
if ($manufacturingcost) {
print price($manufacturingcost);
}
@@ -1344,19 +1353,27 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
if ($permissiontoupdatecost) {
// Defined $manufacturingcost
$manufacturingcost = 0;
- if ($object->mrptype == 0) { // If MO is a "Manufacture" type (and not "Disassemble"
- $manufacturingcost = $bomcost;
+ $manufacturingcostsrc = '';
+ if ($object->mrptype == 0) { // If MO is a "Manufacture" type (and not "Disassemble")
+ $manufacturingcost = $bomcostupdated;
+ $manufacturingcostsrc = $langs->trans("CalculatedFromProductsToConsume");
+ if (empty($manufacturingcost)) {
+ $manufacturingcost = $bomcost;
+ $manufacturingcostsrc = $langs->trans("ValueFromBom");
+ }
if (empty($manufacturingcost)) {
$manufacturingcost = price2num($tmpproduct->cost_price, 'MU');
+ $manufacturingcostsrc = $langs->trans("CostPrice");
}
if (empty($manufacturingcost)) {
$manufacturingcost = price2num($tmpproduct->pmp, 'MU');
+ $manufacturingcostsrc = $langs->trans("PMPValue");
}
}
if ($tmpproduct->type == Product::TYPE_PRODUCT || !empty($conf->global->STOCK_SUPPORTS_SERVICES)) {
$preselected = (GETPOSTISSET('pricetoproduce-'.$line->id.'-'.$i) ? GETPOST('pricetoproduce-'.$line->id.'-'.$i) : ($manufacturingcost ? price($manufacturingcost) : ''));
- print ' ';
+ print ' ';
} else {
print ' ';
}
diff --git a/htdocs/mrp/tpl/linkedobjectblock.tpl.php b/htdocs/mrp/tpl/linkedobjectblock.tpl.php
index 3b8c3f2ecaa..84ca487b771 100644
--- a/htdocs/mrp/tpl/linkedobjectblock.tpl.php
+++ b/htdocs/mrp/tpl/linkedobjectblock.tpl.php
@@ -39,48 +39,79 @@ $langs->load("bom");
$total = 0;
$ilink = 0;
-$mo_static = new Mo($db);
-$res = $mo_static->fetch($object->id);
-$TMoChilds = $mo_static->getMoChilds();
-$hookmanager->initHooks('LinesLinkedObjectBlock');
-$parameters = array('TMoChilds' => $TMoChilds);
-$reshook = $hookmanager->executeHooks('LinesLinkedObjectBlock', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
-if (empty($reshook)) {
- foreach ($TMoChilds as $key => $objectlink) {
+if ($object->element == 'mo') {
+ $mo_static = new Mo($db);
+ $res = $mo_static->fetch($object->id);
+ $TMoChilds = $mo_static->getMoChilds();
+
+ $hookmanager->initHooks('LinesLinkedObjectBlock');
+ $parameters = array('TMoChilds' => $TMoChilds);
+ $reshook = $hookmanager->executeHooks('LinesLinkedObjectBlock', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+ if (empty($reshook)) {
+ foreach ($TMoChilds as $key => $objectlink) {
+ $ilink++;
+
+ $trclass = 'oddeven';
+
+ echo ' ';
+ echo '' . $langs->trans("ManufacturingOrder");
+ if (!empty($showImportButton) && $conf->global->MAIN_ENABLE_IMPORT_LINKED_OBJECT_LINES) {
+ print ' ';
+ echo ' ' . $objectlink->getNomUrl(1) . ' ';
+
+ echo '';
+ // $result = $product_static->fetch($objectlink->fk_product);
+ print ' ';
+ echo '' . dol_print_date($objectlink->date_creation, 'day') . ' ';
+ echo '- ';
+ echo '' . $objectlink->getLibStatut(3) . ' ';
+ echo '';
+
+ // we want to make the link via element_element for delete action
+ $sql = " Select rowid from " . MAIN_DB_PREFIX . "element_element";
+ $sql .= " WHERE fk_source = " . (int) $object->id . " and fk_target = '" . dol_escape_htmltag($key) . "'";
+
+ $resql = $db->query($sql);
+ $k = 0;
+ if ($resql) {
+ $obj = $db->fetch_object($resql);
+ if ($obj->rowid && $obj->rowid > 0) $k = $obj->rowid;
+ }
+ echo 'id . '&action=dellink&token=' . newToken() . '&dellinkid=' . $k . '">' . img_picto($langs->transnoentitiesnoconv("RemoveLink"), 'unlink') . ' ';
+ echo ' ';
+ echo " \n";
+ }
+ }
+} else {
+ $linkedObjectBlock = dol_sort_array($linkedObjectBlock, 'date', 'desc', 0, 0, 1);
+
+ $total = 0;
+ $ilink = 0;
+ foreach ($linkedObjectBlock as $key => $objectlink) {
$ilink++;
$trclass = 'oddeven';
-
- echo '';
- echo '' . $langs->trans("ManufacturingOrder");
+ if ($ilink == count($linkedObjectBlock) && empty($noMoreLinkedObjectBlockAfter) && count($linkedObjectBlock) <= 1) {
+ $trclass .= ' liste_sub_total';
+ }
+ print ' ';
+ print ''.$langs->trans("ManufacturingOrder");
if (!empty($showImportButton) && $conf->global->MAIN_ENABLE_IMPORT_LINKED_OBJECT_LINES) {
- print ' id;
+ print ' ';
}
- echo ' ';
- echo ''.$objectlink->getNomUrl(1).' ';
-
- echo '';
- // $result = $product_static->fetch($objectlink->fk_product);
print ' ';
- echo '' . dol_print_date($objectlink->date_creation, 'day') . ' ';
- echo '- ';
- echo '' . $objectlink->getLibStatut(3) . ' ';
- echo '';
- // we want to make the link via element_element for delete action
- $sql = " Select rowid from " . MAIN_DB_PREFIX . "element_element";
- $sql .= " WHERE fk_source = ". (int) $object->id . " and fk_target = '" . dol_escape_htmltag($key) ."'";
-
- $resql = $db->query($sql);
- $k = 0;
- if ($resql) {
- $obj = $db->fetch_object($resql);
- if ($obj->rowid && $obj->rowid > 0 ) $k = $obj->rowid;
- }
- echo 'id . '&action=dellink&token=' . newToken() . '&dellinkid=' . $k . '">' . img_picto($langs->transnoentitiesnoconv("RemoveLink"), 'unlink') . ' ';
-
- echo ' ';
- echo " \n";
+ print ''.$objectlink->getNomUrl(1).' ';
+ print ''.$objectlink->ref_client.' ';
+ print ''.dol_print_date($objectlink->date_start_planned, 'day').' ';
+ print '- ';
+ print ''.$objectlink->getLibStatut(3).' ';
+ print 'id.'&action=dellink&token='.newToken().'&dellinkid='.$key.'">'.img_picto($langs->transnoentitiesnoconv("RemoveLink"), 'unlink').' ';
+ print "\n";
}
}
+
echo "\n";
diff --git a/htdocs/opensurvey/card.php b/htdocs/opensurvey/card.php
index 2fa2f6d9f31..b243b8c8342 100644
--- a/htdocs/opensurvey/card.php
+++ b/htdocs/opensurvey/card.php
@@ -61,6 +61,10 @@ $hookmanager->initHooks(array('surveycard', 'globalcard'));
$expiredate = dol_mktime(0, 0, 0, GETPOST('expiremonth'), GETPOST('expireday'), GETPOST('expireyear'));
+$permissiontoread = $user->rights->opensurvey->read;
+$permissiontoadd = $user->rights->opensurvey->write;
+// permission delete doesn't exists
+$permissiontodelete = $user->rights->opensurvey->write;
/*
@@ -364,26 +368,25 @@ print ''."\n";
-/*
- * Action bar
- */
+// Action bar
+
print '';
if ($action != 'edit' && $user->rights->opensurvey->write) {
- //Modify button
+ // Modify button
print '
'.$langs->trans("Modify").' ';
if ($object->status == Opensurveysondage::STATUS_VALIDATED) {
- //Close button
+ // Close button
print '
'.$langs->trans("Close").' ';
}
if ($object->status == Opensurveysondage::STATUS_CLOSED) {
- //Opened button
+ // Re-Open
print '
'.$langs->trans("ReOpen").' ';
}
- //Delete button
- print '
'.$langs->trans('Delete').' ';
+ // Delete
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?suppressionsondage=1&id='.urlencode($numsondage).'&action=delete&token='.newToken(), 'delete', $permissiontodelete);
}
print '
';
diff --git a/htdocs/opensurvey/list.php b/htdocs/opensurvey/list.php
index 44241007dfb..e03ee278574 100644
--- a/htdocs/opensurvey/list.php
+++ b/htdocs/opensurvey/list.php
@@ -327,6 +327,13 @@ print '';
+// Action column
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons('left');
+ print $searchpicto;
+ print ' ';
+}
print ' ';
print ' ';
print ' ';
@@ -344,16 +351,22 @@ $parameters = array('arrayfields'=>$arrayfields);
$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Action column
-print '';
-$searchpicto = $form->showFilterButtons();
-print $searchpicto;
-print ' ';
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons();
+ print $searchpicto;
+ print ' ';
+}
print ''."\n";
// Fields title label
// --------------------------------------------------------------------
print '';
+// Action column
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ')."\n";
+}
print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "p.id_sondage", $param, "", "", $sortfield, $sortorder);
print_liste_field_titre("Title", $_SERVER["PHP_SELF"], "p.titre", $param, "", "", $sortfield, $sortorder);
print_liste_field_titre("Type", $_SERVER["PHP_SELF"], "p.format", $param, "", "", $sortfield, $sortorder);
@@ -369,7 +382,9 @@ $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$
$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Action column
-print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ')."\n";
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ')."\n";
+}
print ' '."\n";
@@ -402,7 +417,18 @@ while ($i < min($num, $limit)) {
// Show here line of result
print '';
-
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->rowid, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
// Ref
print '';
print $opensurvey_static->getNomUrl(1);
@@ -478,15 +504,17 @@ while ($i < min($num, $limit)) {
$reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Action column
- print ' ';
- if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
- $selected = 0;
- if (in_array($obj->rowid, $arrayofselected)) {
- $selected = 1;
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print ' ';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->rowid, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
}
- print ' ';
+ print ' ';
}
- print '';
if (!$i) {
$totalarray['nbfield']++;
}
diff --git a/htdocs/partnership/admin/website.php b/htdocs/partnership/admin/website.php
index b3bccf9fa00..bb86f95269b 100644
--- a/htdocs/partnership/admin/website.php
+++ b/htdocs/partnership/admin/website.php
@@ -189,13 +189,13 @@ if (!empty($conf->global->PARTNERSHIP_ENABLE_PUBLIC)) {
$listofval = array();
$listofval['-1'] = $langs->trans('No');
$listofval['all'] = $langs->trans('Yes').' ('.$langs->trans("VisitorCanChooseItsPaymentMode").')';
- if (!empty($conf->paybox->enabled)) {
+ if (isModEnabled('paybox')) {
$listofval['paybox'] = 'Paybox';
}
- if (!empty($conf->paypal->enabled)) {
+ if (isModEnabled('paypal')) {
$listofval['paypal'] = 'PayPal';
}
- if (!empty($conf->stripe->enabled)) {
+ if (isModEnabled('stripe')) {
$listofval['stripe'] = 'Stripe';
}
print $form->selectarray("PARTNERSHIP_NEWFORM_PAYONLINE", $listofval, (!empty($conf->global->PARTNERSHIP_NEWFORM_PAYONLINE) ? $conf->global->PARTNERSHIP_NEWFORM_PAYONLINE : ''), 0);
diff --git a/htdocs/partnership/class/partnership.class.php b/htdocs/partnership/class/partnership.class.php
index 9e7cfdd5d03..4838c80f92d 100644
--- a/htdocs/partnership/class/partnership.class.php
+++ b/htdocs/partnership/class/partnership.class.php
@@ -118,7 +118,7 @@ class Partnership extends CommonObject
'model_pdf' => array('type'=>'varchar(255)', 'label'=>'Model pdf', 'enabled'=>'1', 'position'=>1010, 'notnull'=>-1, 'visible'=>0,),
'date_partnership_start' => array('type'=>'date', 'label'=>'DatePartnershipStart', 'enabled'=>'1', 'position'=>52, 'notnull'=>1, 'visible'=>1,),
'date_partnership_end' => array('type'=>'date', 'label'=>'DatePartnershipEnd', 'enabled'=>'1', 'position'=>53, 'notnull'=>0, 'visible'=>1,),
- 'status' => array('type'=>'smallint', 'label'=>'Status', 'enabled'=>'1', 'position'=>54, 'notnull'=>0, 'visible'=>2, 'index'=>1, 'arrayofkeyval'=>array('-1'=>'', '0'=>'Draft', '1'=>'Accepted', '2'=>'Refused', '8'=>'Suspended', '9'=>'Terminated'),),
+ 'status' => array('type'=>'smallint', 'label'=>'Status', 'enabled'=>'1', 'position'=>54, 'notnull'=>0, 'visible'=>2, 'default'=>'0', 'index'=>1, 'arrayofkeyval'=>array('-1'=>'', '0'=>'Draft', '1'=>'Accepted', '2'=>'Refused', '8'=>'Suspended', '9'=>'Terminated'),),
'url_to_check' => array('type'=>'varchar(255)', 'label'=>'UrlToCheck', 'enabled'=>'1', 'position'=>70, 'notnull'=>0, 'visible'=>-1,),
'count_last_url_check_error' => array('type'=>'integer', 'label'=>'CountLastUrlCheckError', 'enabled'=>'1', 'position'=>71, 'notnull'=>0, 'visible'=>-2, 'default'=>'0',),
'last_check_backlink' => array('type'=>'datetime', 'label'=>'LastCheckBacklink', 'enabled'=>'1', 'position'=>72, 'notnull'=>0, 'visible'=>-2,),
diff --git a/htdocs/partnership/class/partnership_type.class.php b/htdocs/partnership/class/partnership_type.class.php
index 0074d2e80ee..0c42dae87d2 100644
--- a/htdocs/partnership/class/partnership_type.class.php
+++ b/htdocs/partnership/class/partnership_type.class.php
@@ -129,9 +129,6 @@ class PartnershipType extends CommonObject
public function create(User $user, $notrigger = false)
{
$resultcreate = $this->createCommon($user, $notrigger);
-
- //$resultvalidate = $this->validate($user, $notrigger);
-
return $resultcreate;
}
@@ -145,9 +142,6 @@ class PartnershipType extends CommonObject
public function fetch($id, $ref = null)
{
$result = $this->fetchCommon($id, $ref);
- if ($result > 0 && !empty($this->table_element_line)) {
- $this->fetchLines();
- }
return $result;
}
@@ -253,79 +247,6 @@ class PartnershipType extends CommonObject
public function delete(User $user, $notrigger = false)
{
return $this->deleteCommon($user, $notrigger);
- //return $this->deleteCommon($user, $notrigger, 1);
- }
-
- /**
- * Set draft status
- *
- * @param User $user Object user that modify
- * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers
- * @return int <0 if KO, >0 if OK
- */
- public function setDraft($user, $notrigger = 0)
- {
- // Protection
- if ($this->status <= self::STATUS_DRAFT) {
- return 0;
- }
-
- /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->mymodule->write))
- || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->mymodule->mymodule_advance->validate))))
- {
- $this->error='Permission denied';
- return -1;
- }*/
-
- return $this->setStatusCommon($user, self::STATUS_DRAFT, $notrigger, 'PARTNERSHIPTYPE_UNVALIDATE');
- }
-
- /**
- * Set cancel status
- *
- * @param User $user Object user that modify
- * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers
- * @return int <0 if KO, 0=Nothing done, >0 if OK
- */
- public function cancel($user, $notrigger = 0)
- {
- // Protection
- if ($this->status != self::STATUS_VALIDATED) {
- return 0;
- }
-
- /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->mymodule->write))
- || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->mymodule->mymodule_advance->validate))))
- {
- $this->error='Permission denied';
- return -1;
- }*/
-
- return $this->setStatusCommon($user, self::STATUS_CANCELED, $notrigger, 'PARTNERSHIPTYPE_CANCEL');
- }
-
- /**
- * Set back to validated status
- *
- * @param User $user Object user that modify
- * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers
- * @return int <0 if KO, 0=Nothing done, >0 if OK
- */
- public function reopen($user, $notrigger = 0)
- {
- // Protection
- if ($this->status != self::STATUS_CANCELED) {
- return 0;
- }
-
- /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->mymodule->write))
- || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->mymodule->mymodule_advance->validate))))
- {
- $this->error='Permission denied';
- return -1;
- }*/
-
- return $this->setStatusCommon($user, self::STATUS_VALIDATED, $notrigger, 'PARTNERSHIPTYPE_REOPEN');
}
/**
@@ -445,59 +366,6 @@ class PartnershipType extends CommonObject
return $result;
}
- /**
- * Return the label of the status
- *
- * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto
- * @return string Label of status
- */
- public function getLabelStatus($mode = 0)
- {
- return $this->LibStatut($this->status, $mode);
- }
-
- /**
- * Return the label of the status
- *
- * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto
- * @return string Label of status
- */
- public function getLibStatut($mode = 0)
- {
- return $this->LibStatut($this->status, $mode);
- }
-
- // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
- /**
- * Return the status
- *
- * @param int $status Id status
- * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto
- * @return string Label of status
- */
- public function LibStatut($status, $mode = 0)
- {
- // phpcs:enable
- if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
- global $langs;
- //$langs->load("mymodule@mymodule");
- $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
- $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
- $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
- $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
- $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
- $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
- }
-
- $statusType = 'status'.$status;
- //if ($status == self::STATUS_VALIDATED) $statusType = 'status1';
- if ($status == self::STATUS_CANCELED) {
- $statusType = 'status6';
- }
-
- return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode);
- }
-
/**
* Load the info information in the object
*
diff --git a/htdocs/partnership/class/partnershiputils.class.php b/htdocs/partnership/class/partnershiputils.class.php
index 366bee570df..647d1492ced 100644
--- a/htdocs/partnership/class/partnershiputils.class.php
+++ b/htdocs/partnership/class/partnershiputils.class.php
@@ -41,6 +41,8 @@ class PartnershipUtils
public $error; //!< To return error code (or message)
public $errors = array(); //!< To return several error codes (or messages)
+ public $output; // To store output of some cron methods
+
/**
* Constructor
diff --git a/htdocs/partnership/core/modules/partnership/mod_partnership_advanced.php b/htdocs/partnership/core/modules/partnership/mod_partnership_advanced.php
index d717bdc49bf..676de032659 100644
--- a/htdocs/partnership/core/modules/partnership/mod_partnership_advanced.php
+++ b/htdocs/partnership/core/modules/partnership/mod_partnership_advanced.php
@@ -30,7 +30,7 @@ dol_include_once('/partnership/core/modules/partnership/modules_partnership.php'
/**
- * Class to manage customer Bom numbering rules advanced
+ * Class to manage the Advanced numbering rule for Partnership
*/
class mod_partnership_advanced extends ModeleNumRefPartnership
{
diff --git a/htdocs/partnership/core/modules/partnership/mod_partnership_standard.php b/htdocs/partnership/core/modules/partnership/mod_partnership_standard.php
index d5a2bb326b2..5de4b07f215 100644
--- a/htdocs/partnership/core/modules/partnership/mod_partnership_standard.php
+++ b/htdocs/partnership/core/modules/partnership/mod_partnership_standard.php
@@ -26,7 +26,7 @@ dol_include_once('/partnership/core/modules/partnership/modules_partnership.php'
/**
- * Class to manage customer order numbering rules standard
+ * Class to manage the Standard numbering rule for Partnership
*/
class mod_partnership_standard extends ModeleNumRefPartnership
{
diff --git a/htdocs/partnership/partnership_card.php b/htdocs/partnership/partnership_card.php
index 551794b5d4a..de5449b7e80 100644
--- a/htdocs/partnership/partnership_card.php
+++ b/htdocs/partnership/partnership_card.php
@@ -374,7 +374,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
// require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
// $notify = new Notify($db);
// $formquestion = array_merge($formquestion, array(
- // array('type' => 'onecolumn', 'value' => $notify->confirmMessage('PROPAL_CLOSE_SIGNED', $object->socid, $object)),
+ // array('type' => 'onecolumn', 'value' => $notify->confirmMessage('PARTNERSHIP_CLOSE_DENY', $object->socid, $object)),
// ));
// }
diff --git a/htdocs/partnership/partnership_list.php b/htdocs/partnership/partnership_list.php
index bc99655efa3..36a0fd39218 100644
--- a/htdocs/partnership/partnership_list.php
+++ b/htdocs/partnership/partnership_list.php
@@ -28,7 +28,9 @@ require '../main.inc.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/member.lib.php';
require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
+require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php';
require_once DOL_DOCUMENT_ROOT.'/partnership/class/partnership.class.php';
// for other modules
@@ -49,7 +51,8 @@ $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '
$mode = GETPOST('mode', 'aZ');
$id = GETPOST('id', 'int');
-
+$socid = GETPOST('socid', 'int');
+$memberid = GETPOST('rowid', 'int');
// Load variable for pagination
$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
$sortfield = GETPOST('sortfield', 'aZ09comma');
@@ -68,7 +71,13 @@ $object = new Partnership($db);
$extrafields = new ExtraFields($db);
$adherent = new Adherent($db);
$diroutputmassaction = $conf->partnership->dir_output.'/temp/massgeneration/'.$user->id;
-$hookmanager->initHooks(array('partnershiplist')); // Note that conf->hooks_modules contains array
+if ($socid > 0) {
+ $hookmanager->initHooks(array('thirdpartypartnership'));
+} elseif ($memberid > 0) {
+ $hookmanager->initHooks(array('memberpartnership'));
+} else {
+ $hookmanager->initHooks(array('partnershiplist')); // Note that conf->hooks_modules contains array
+}
// Fetch optionals attributes and labels
$extrafields->fetch_name_optionals_label($object->table_element);
@@ -144,7 +153,6 @@ $permissiontodelete = $user->rights->partnership->delete;
if (empty($conf->partnership->enabled)) {
accessforbidden('Module not enabled');
}
-$socid = 0;
if ($user->socid > 0) { // Protection if external user
//$socid = $user->socid;
accessforbidden();
@@ -325,9 +333,19 @@ if ($object->ismultientitymanaged == 1) {
} else {
$sql .= " WHERE 1 = 1";
}
-if ($managedfor == 'member')
- $sql .= " AND fk_member > 0";
-else $sql .= " AND fk_soc > 0";
+if ($managedfor == 'member') {
+ if ($memberid > 0) {
+ $sql .= " AND t.fk_member = ".((int) $memberid);
+ } else {
+ $sql .= " AND fk_member > 0";
+ }
+} else {
+ if ($socid > 0) {
+ $sql .= " AND t.fk_soc = ".((int) $socid);
+ } else {
+ $sql .= " AND fk_soc > 0";
+ }
+}
foreach ($search as $key => $val) {
if (array_key_exists($key, $object->fields)) {
if ($key == 'status' && $search[$key] == -1) {
@@ -359,13 +377,16 @@ foreach ($search as $key => $val) {
}
if ($managedfor == 'member') {
if ($search_filter == 'withoutsubscription') {
- $sql .= " AND (d.datefin IS NULL OR dty.subscription = 0)";
+ $sql .= " AND (d.datefin IS NULL)";
+ }
+ if ($search_filter == 'waitingsubscription') {
+ $sql .= " AND (d.datefin IS NULL AND t.subscription = '1')";
}
if ($search_filter == 'uptodate') {
- $sql .= " AND (d.datefin >= '".$db->idate($now)."' OR dty.subscription = 0)";
+ $sql .= " AND (d.datefin >= '".$db->idate($now)."' OR dty.subscription = '0')";
}
if ($search_filter == 'outofdate') {
- $sql .= " AND (d.datefin < '".$db->idate($now)."' AND dty.subscription = 1)";
+ $sql .= " AND (d.datefin < '".$db->idate($now)."' AND dty.subscription = '1')";
}
}
if ($search_all) {
@@ -401,7 +422,7 @@ $sql=preg_replace('/,\s*$/','', $sql);
$nbtotalofrecords = '';
if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
/* The fast and low memory method to get and count full list converts the sql into a sql count */
- $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
+ $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/Ui', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
$resql = $db->query($sqlforcount);
if ($resql) {
$objforcount = $db->fetch_object($resql);
@@ -446,6 +467,113 @@ if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $
llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'classforhorizontalscrolloftabs');
+if ($managedfor == "member") {
+ if ($memberid > 0 && $user->hasRight('adherent', 'lire')) {
+ $langs->load("members");
+
+ $adhstat = new Adherent($db);
+ $adht = new AdherentType($db);
+ $result = $adhstat->fetch($memberid);
+
+ if (isModEnabled('notification')) {
+ $langs->load("mails");
+ }
+
+ $adht->fetch($adhstat->typeid);
+
+ $head = member_prepare_head($adhstat);
+
+ print dol_get_fiche_head($head, 'partnerships', $langs->trans("ThirdParty"), -1, 'user');
+
+ $linkback = ''.$langs->trans("BackToList").' ';
+
+ dol_banner_tab($object, 'rowid', $linkback);
+
+ print '';
+
+ print '
';
+ print '
';
+
+ // Login
+ if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) {
+ print ''.$langs->trans("Login").' / '.$langs->trans("Id").' '.$object->login.' ';
+ }
+
+ // Type
+ print ''.$langs->trans("Type").' '.$adht->getNomUrl(1)." \n";
+
+ // Morphy
+ print ''.$langs->trans("MemberNature").' '.$adhstat->getmorphylib().' ';
+ print ' ';
+
+ // Company
+ print ''.$langs->trans("Company").' '.$adhstat->company.' ';
+
+ // Civility
+ print ''.$langs->trans("UserTitle").' '.$adhstat->getCivilityLabel().' ';
+ print ' ';
+
+ print '
';
+
+ print '
';
+
+ print dol_get_fiche_end();
+ }
+} elseif ($managedfor == "thirdparty") {
+ if ($socid && $user->hasRight('societe', 'lire')) {
+ $socstat = new Societe($db);
+ $res = $socstat->fetch($socid);
+ if ($res > 0) {
+ $tmpobject = $object;
+ $object = $socstat; // $object must be of type Societe when calling societe_prepare_head
+ $head = societe_prepare_head($socstat);
+ $object = $tmpobject;
+
+ print dol_get_fiche_head($head, 'partnerships', $langs->trans("ThirdParty"), -1, 'company');
+
+ dol_banner_tab($socstat, 'socid', '', ($user->socid ? 0 : 1), 'rowid', 'nom');
+
+ print '';
+
+ print '
';
+ print '
';
+
+ // Type Prospect/Customer/Supplier
+ print ''.$langs->trans('NatureOfThirdParty').' ';
+ print $socstat->getTypeUrl(1);
+ print ' ';
+
+ // Customer code
+ if ($socstat->client && !empty($socstat->code_client)) {
+ print '';
+ print $langs->trans('CustomerCode').' ';
+ print showValueWithClipboardCPButton(dol_escape_htmltag($socstat->code_client));
+ $tmpcheck = $socstat->check_codeclient();
+ if ($tmpcheck != 0 && $tmpcheck != -5) {
+ print ' ('.$langs->trans("WrongCustomerCode").') ';
+ }
+ print ' ';
+ print ' ';
+ }
+ // Supplier code
+ if ($socstat->fournisseur && !empty($socstat->code_fournisseur)) {
+ print '';
+ print $langs->trans('SupplierCode').' ';
+ print showValueWithClipboardCPButton(dol_escape_htmltag($socstat->code_fournisseur));
+ $tmpcheck = $socstat->check_codefournisseur();
+ if ($tmpcheck != 0 && $tmpcheck != -5) {
+ print ' ('.$langs->trans("WrongSupplierCode").') ';
+ }
+ print ' ';
+ print ' ';
+ }
+
+ print '
';
+ print '
';
+ print dol_get_fiche_end();
+ }
+ }
+}
$arrayofselected = is_array($toselect) ? $toselect : array();
@@ -456,6 +584,12 @@ if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
if ($limit > 0 && $limit != $conf->liste_limit) {
$param .= '&limit='.urlencode($limit);
}
+if ($socid) {
+ $param .= '&socid='.urlencode($socid);
+}
+if ($memberid) {
+ $param .= '&rowid='.urlencode($memberid);
+}
foreach ($search as $key => $val) {
if (is_array($search[$key]) && count($search[$key])) {
foreach ($search[$key] as $skey) {
@@ -509,7 +643,11 @@ print ' ';
print ' ';
print ' ';
print ' ';
-
+if ($socid) {
+ print ' ';
+} elseif ($memberid) {
+ print ' ';
+}
$newcardbutton = '';
$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/partnership/partnership_card.php', 1).'?action=create&backtopage='.urlencode($_SERVER['PHP_SELF']), '', $permissiontoadd);
@@ -682,7 +820,7 @@ print ' '."\n";
$needToFetchEachLine = 0;
if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) {
foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) {
- if (preg_match('/\$object/', $val)) {
+ if ($val && preg_match('/\$object/', $val)) {
$needToFetchEachLine++; // There is at least one compute field that use $object
}
}
diff --git a/htdocs/product/admin/product.php b/htdocs/product/admin/product.php
index 7462431d087..a8106a9ae88 100644
--- a/htdocs/product/admin/product.php
+++ b/htdocs/product/admin/product.php
@@ -133,7 +133,7 @@ if ($action == 'other') {
/*$value = GETPOST('PRODUIT_SOUSPRODUITS', 'alpha');
$res = dolibarr_set_const($db, "PRODUIT_SOUSPRODUITS", $value, 'chaine', 0, '', $conf->entity);*/
- $value = GETPOST('activate_viewProdDescInForm', 'alpha');
+ $value = GETPOST('PRODUIT_DESC_IN_FORM', 'alpha');
$res = dolibarr_set_const($db, "PRODUIT_DESC_IN_FORM", $value, 'chaine', 0, '', $conf->entity);
$value = GETPOST('activate_viewProdTextsInThirdpartyLanguage', 'alpha');
@@ -689,7 +689,8 @@ print '';
print '';
print ''.$langs->trans("ViewProductDescInFormAbility").' ';
print '';
-print $form->selectyesno("activate_viewProdDescInForm", $conf->global->PRODUIT_DESC_IN_FORM, 1);
+$arrayofchoices = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes").' ('.$langs->trans("DesktopsOnly").')', '2' => $langs->trans("Yes").' ('.$langs->trans("DesktopsAndSmartphones").')');
+print $form->selectarray("PRODUIT_DESC_IN_FORM", $arrayofchoices, getDolGlobalInt('PRODUIT_DESC_IN_FORM'), 0);
print ' ';
print ' ';
diff --git a/htdocs/product/ajax/products.php b/htdocs/product/ajax/products.php
index b2ce6e48c09..24da89b7619 100644
--- a/htdocs/product/ajax/products.php
+++ b/htdocs/product/ajax/products.php
@@ -188,7 +188,7 @@ if ($action == 'fetch' && !empty($id)) {
$filter = array('t.fk_product' => $object->id, 't.fk_soc' => $socid);
- $result = $prodcustprice->fetch_all('', '', 0, 0, $filter);
+ $result = $prodcustprice->fetchAll('', '', 0, 0, $filter);
if ($result) {
if (count($prodcustprice->lines) > 0) {
$found = true;
diff --git a/htdocs/product/card.php b/htdocs/product/card.php
index f455806e0ce..c1be61741bb 100644
--- a/htdocs/product/card.php
+++ b/htdocs/product/card.php
@@ -147,7 +147,7 @@ if ($id > 0 || !empty($ref)) {
$upload_dir = $conf->service->multidir_output[$object->entity].'/'.get_exdir(0, 0, 0, 0, $object, 'product').dol_sanitizeFileName($object->ref);
}
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) { // For backward compatiblity, we scan also old dirs
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) { // For backward compatiblity, we scan also old dirs
if (isModEnabled("product")) {
$upload_dirold = $conf->product->multidir_output[$object->entity].'/'.substr(substr("000".$object->id, -2), 1, 1).'/'.substr(substr("000".$object->id, -2), 0, 1).'/'.$object->id."/photos";
} else {
@@ -1039,7 +1039,7 @@ if (empty($reshook)) {
$filter = array('t.fk_product' => $object->id, 't.fk_soc' => $soc->id);
- $result = $prodcustprice->fetch_all('', '', 0, 0, $filter);
+ $result = $prodcustprice->fetchAll('', '', 0, 0, $filter);
if ($result) {
if (count($prodcustprice->lines) > 0) {
$pu_ht = price($prodcustprice->lines [0]->price);
@@ -1444,9 +1444,8 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
// Description (used in invoice, propal...)
print ''.$langs->trans("Description").' ';
- $doleditor = new DolEditor('desc', GETPOST('desc', 'restricthtml'), '', 160, 'dolibarr_details', '', false, true, getDolGlobalString('FCKEDITOR_ENABLE_PRODUCTDESC'), ROWS_4, '90%');
+ $doleditor = new DolEditor('desc', GETPOST('desc', 'restricthtml'), '', 160, 'dolibarr_details', '', false, true, getDolGlobalString('FCKEDITOR_ENABLE_DETAILS'), ROWS_4, '90%');
$doleditor->Create();
-
print " ";
if (empty($conf->global->PRODUCT_DISABLE_PUBLIC_URL)) {
@@ -1620,7 +1619,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
print ''.$langs->trans("NoteNotVisibleOnBill").' ';
// We use dolibarr_details as type of DolEditor here, because we must not accept images as description is included into PDF and not accepted by TCPDF.
- $doleditor = new DolEditor('note_private', GETPOST('note_private', 'restricthtml'), '', 140, 'dolibarr_details', '', false, true, getDolGlobalString('FCKEDITOR_ENABLE_PRODUCTDESC'), ROWS_8, '90%');
+ $doleditor = new DolEditor('note_private', GETPOST('note_private', 'restricthtml'), '', 140, 'dolibarr_details', '', false, true, getDolGlobalString('FCKEDITOR_ENABLE_NOTE_PRIVATE'), ROWS_8, '90%');
$doleditor->Create();
print " ";
@@ -1866,7 +1865,12 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
print '';
// Ref
- print ''.$langs->trans("Ref").' ';
+ if (empty($conf->global->MAIN_PRODUCT_REF_NOT_EDITABLE)) {
+ print ''.$langs->trans("Ref").' ';
+ } else {
+ print ''.$langs->trans("Ref").' ';
+ }
+
// Label
print ''.$langs->trans("Label").' ';
@@ -2002,7 +2006,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
print ''.$langs->trans("Description").' ';
// We use dolibarr_details as type of DolEditor here, because we must not accept images as description is included into PDF and not accepted by TCPDF.
- $doleditor = new DolEditor('desc', GETPOSTISSET('desc') ? GETPOST('desc', 'restricthtml') : $object->description, '', 160, 'dolibarr_details', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_PRODUCTDESC'), ROWS_4, '90%');
+ $doleditor = new DolEditor('desc', GETPOSTISSET('desc') ? GETPOST('desc', 'restricthtml') : $object->description, '', 160, 'dolibarr_details', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_DETAILS'), ROWS_4, '90%');
$doleditor->Create();
print " ";
@@ -2193,7 +2197,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
if (!empty($conf->global->MAIN_DISABLE_NOTES_TAB)) {
print ''.$langs->trans("NoteNotVisibleOnBill").' ';
- $doleditor = new DolEditor('note_private', $object->note_private, '', 140, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_PRODUCTDESC'), ROWS_4, '90%');
+ $doleditor = new DolEditor('note_private', $object->note_private, '', 140, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_NOTE_PRIVATE'), ROWS_4, '90%');
$doleditor->Create();
print " ";
@@ -2831,7 +2835,7 @@ if (!empty($conf->global->PRODUCT_ADD_FORM_ADD_TO) && $object->id && ($action ==
//print '';
// Propals
- if (isModEnabled("propal") && $user->rights->propale->creer) {
+ if (isModEnabled("propal") && $user->rights->propal->creer) {
$propal = new Propal($db);
$langs->load("propal");
diff --git a/htdocs/product/class/api_products.class.php b/htdocs/product/class/api_products.class.php
index 1c17deae602..e234f4dba8e 100644
--- a/htdocs/product/class/api_products.class.php
+++ b/htdocs/product/class/api_products.class.php
@@ -670,7 +670,7 @@ class Products extends DolibarrApi
if ($thirdparty_id) {
$filter['t.fk_soc'] .= $thirdparty_id;
}
- $result = $prodcustprice->fetch_all('', '', 0, 0, $filter);
+ $result = $prodcustprice->fetchAll('', '', 0, 0, $filter);
}
if (empty($prodcustprice->lines)) {
@@ -1014,7 +1014,7 @@ class Products extends DolibarrApi
throw new RestException(401);
}
- $sql = "SELECT t.rowid, t.ref, t.ref_ext, t.label, t.rang, t.entity";
+ $sql = "SELECT t.rowid, t.ref, t.ref_ext, t.label, t.position, t.entity";
$sql .= " FROM ".$this->db->prefix()."product_attribute as t";
$sql .= ' WHERE t.entity IN ('.getEntity('product').')';
@@ -1051,7 +1051,7 @@ class Products extends DolibarrApi
$tmp->ref = $result->ref;
$tmp->ref_ext = $result->ref_ext;
$tmp->label = $result->label;
- $tmp->rang = $result->rang;
+ $tmp->position = $result->position;
$tmp->entity = $result->entity;
$return[] = $this->_cleanObjectDatas($tmp);
@@ -1088,7 +1088,7 @@ class Products extends DolibarrApi
throw new RestException(404, "Product attribute not found");
}
- $fields = ["id", "ref", "ref_ext", "label", "rang", "entity"];
+ $fields = ["id", "ref", "ref_ext", "label", "position", "entity"];
foreach ($prodattr as $field => $value) {
if (!in_array($field, $fields)) {
diff --git a/htdocs/product/class/html.formproduct.class.php b/htdocs/product/class/html.formproduct.class.php
index a21ff6348e6..75a929f53e5 100644
--- a/htdocs/product/class/html.formproduct.class.php
+++ b/htdocs/product/class/html.formproduct.class.php
@@ -403,6 +403,7 @@ class FormProduct
dol_syslog(get_class($this)."::selectWorkstations $selected, $htmlname, $empty, $disabled, $fk_product, $empty_label, $forcecombo, $morecss", LOG_DEBUG);
+ $filterstatus='';
$out = '';
if (!empty($fk_product) && $fk_product > 0) {
$this->cache_workstations = array();
diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php
index 30cf4393d1b..ffb72bfca78 100644
--- a/htdocs/product/class/product.class.php
+++ b/htdocs/product/class/product.class.php
@@ -127,19 +127,23 @@ class Product extends CommonObject
public $type = self::TYPE_PRODUCT;
/**
- * Selling price
+ * Selling price without tax
*
* @var float
*/
- public $price; // Price net
+ public $price;
+
+ public $price_formated; // used by takepos/ajax/ajax.php
/**
- * Price with tax
+ * Selling price with tax
*
* @var float
*/
public $price_ttc;
+ public $price_ttc_formated; // used by takepos/ajax/ajax.php
+
/**
* Minimum price net
*
@@ -1872,7 +1876,7 @@ class Product extends CommonObject
$filter = array('t.fk_product' => $this->id, 't.fk_soc' => $thirdparty_buyer->id);
- $result = $prodcustprice->fetch_all('', '', 0, 0, $filter);
+ $result = $prodcustprice->fetchAll('', '', 0, 0, $filter);
if ($result) {
if (count($prodcustprice->lines) > 0) {
$pu_ht = price($prodcustprice->lines[0]->price);
@@ -3525,7 +3529,7 @@ class Product extends CommonObject
global $db, $conf, $user, $hookmanager;
$sql = "SELECT COUNT(DISTINCT f.fk_soc) as nb_customers, COUNT(DISTINCT f.rowid) as nb,";
- $sql .= " COUNT(fd.rowid) as nb_rows, SUM('fd.qty') as qty";
+ $sql .= " COUNT(fd.rowid) as nb_rows, SUM(fd.qty) as qty";
$sql .= " FROM ".MAIN_DB_PREFIX."facturedet_rec as fd";
$sql .= ", ".MAIN_DB_PREFIX."facture_rec as f";
$sql .= ", ".MAIN_DB_PREFIX."societe as s";
@@ -4846,7 +4850,7 @@ class Product extends CommonObject
$sql .= " AND pa.fk_product_fils <> ".((int) $id); // This should not happens, it is to avoid infinite loop if it happens
$sql.= " ORDER BY pa.rang";
- dol_syslog(get_class($this).'::getChildsArbo id='.$id.' level='.$level. ' parents='.implode(',', $parents), LOG_DEBUG);
+ dol_syslog(get_class($this).'::getChildsArbo id='.$id.' level='.$level. ' parents='.(is_array($parents)?implode(',', $parents):$parents), LOG_DEBUG);
if ($level == 1) {
$alreadyfound = array($id=>1); // We init array of found object to start of tree, so if we found it later (should not happened), we stop immediatly
@@ -5535,7 +5539,7 @@ class Product extends CommonObject
}
$stock_reception_fournisseur = $this->stats_reception['qty'];
}
- if (!empty($conf->mrp->enabled)) {
+ if (isModEnabled('mrp')) {
$result = $this->load_stats_inproduction(0, '1,2', 1, $dateofvirtualstock);
if ($result < 0) {
dol_print_error($this->db, $this->error);
@@ -5630,7 +5634,7 @@ class Product extends CommonObject
$result = 0;
$dir = $sdir;
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
$dir .= '/'.get_exdir($this->id, 2, 0, 0, $this, 'product').$this->id."/photos";
} else {
$dir .= '/'.get_exdir(0, 0, 0, 0, $this, 'product').dol_sanitizeFileName($this->ref);
@@ -5675,7 +5679,7 @@ class Product extends CommonObject
global $conf;
$dir = $sdir;
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
$dir .= '/'.get_exdir($this->id, 2, 0, 0, $this, 'product').$this->id."/photos/";
} else {
$dir .= '/'.get_exdir(0, 0, 0, 0, $this, 'product');
diff --git a/htdocs/product/class/productcustomerprice.class.php b/htdocs/product/class/productcustomerprice.class.php
index ed003d85667..197816f48ca 100644
--- a/htdocs/product/class/productcustomerprice.class.php
+++ b/htdocs/product/class/productcustomerprice.class.php
@@ -354,11 +354,31 @@ class Productcustomerprice extends CommonObject
* @param int $limit page
* @param int $offset offset
* @param array $filter Filter for select
+ * @deprecated since dolibarr v17 use fetchAll
* @return int <0 if KO, >0 if OK
*/
public function fetch_all($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, $filter = array())
{
// phpcs:enable
+
+ dol_syslog(get_class($this)."::fetch_all is deprecated, use fetchAll instead", LOG_NOTICE);
+
+ return $this->fetchAll($sortorder, $sortfield, $limit, $offset, $filter);
+ }
+
+ /**
+ * Load all customer prices in memory from database
+ *
+ * @param string $sortorder order
+ * @param string $sortfield field
+ * @param int $limit page
+ * @param int $offset offset
+ * @param array $filter Filter for select
+ * @return int <0 if KO, >0 if OK
+ * @since dolibarr v17
+ */
+ public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, $filter = array())
+ {
global $langs;
if (empty($sortfield)) {
@@ -421,7 +441,7 @@ class Productcustomerprice extends CommonObject
$sql .= $this->db->plimit($limit + 1, $offset);
}
- dol_syslog(get_class($this)."::fetch_all", LOG_DEBUG);
+ dol_syslog(get_class($this)."::fetchAll", LOG_DEBUG);
$resql = $this->db->query($sql);
if ($resql) {
$this->lines = array();
@@ -832,7 +852,7 @@ class Productcustomerprice extends CommonObject
't.fk_product' => $this->fk_product, 't.fk_soc' => $obj->rowid
);
- $result = $prodsocprice->fetch_all('', '', 0, 0, $filter);
+ $result = $prodsocprice->fetchAll('', '', 0, 0, $filter);
if ($result < 0) {
$error++;
$this->error = $prodsocprice->error;
diff --git a/htdocs/product/document.php b/htdocs/product/document.php
index bfb5978406d..c24082ae6e6 100644
--- a/htdocs/product/document.php
+++ b/htdocs/product/document.php
@@ -90,7 +90,7 @@ if ($id > 0 || !empty($ref)) {
$upload_dir = $conf->service->multidir_output[$object->entity].'/'.get_exdir(0, 0, 0, 1, $object, 'product');
}
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) { // For backward compatiblity, we scan also old dirs
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) { // For backward compatiblity, we scan also old dirs
if (isModEnabled("product")) {
$upload_dirold = $conf->product->multidir_output[$object->entity].'/'.substr(substr("000".$object->id, -2), 1, 1).'/'.substr(substr("000".$object->id, -2), 0, 1).'/'.$object->id."/photos";
} else {
@@ -228,7 +228,7 @@ if ($object->id) {
// Build file list
$filearray = dol_dir_list($upload_dir, "files", 0, '', '(\.meta|_preview.*\.png)$', $sortfield, (strtolower($sortorder) == 'desc' ?SORT_DESC:SORT_ASC), 1);
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) { // For backward compatiblity, we scan also old dirs
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) { // For backward compatiblity, we scan also old dirs
$filearrayold = dol_dir_list($upload_dirold, "files", 0, '', '(\.meta|_preview.*\.png)$', $sortfield, (strtolower($sortorder) == 'desc' ?SORT_DESC:SORT_ASC), 1);
$filearray = array_merge($filearray, $filearrayold);
}
@@ -283,7 +283,7 @@ if ($object->id) {
$filearray = dol_dir_list($upload_dir, "files", 0, '', '\.meta$', 'name', SORT_ASC, 1);
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) { // For backward compatiblity, we scan also old dirs
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) { // For backward compatiblity, we scan also old dirs
$filearray = array_merge($filearray, dol_dir_list($upload_dirold, "files", 0, '', '\.meta$', 'name', SORT_ASC, 1));
}
diff --git a/htdocs/product/dynamic_price/class/price_parser.class.php b/htdocs/product/dynamic_price/class/price_parser.class.php
index 764ff919cc7..412d015f8b9 100644
--- a/htdocs/product/dynamic_price/class/price_parser.class.php
+++ b/htdocs/product/dynamic_price/class/price_parser.class.php
@@ -150,6 +150,8 @@ class PriceParser
"length" => $product->length,
"surface" => $product->surface,
"price_min" => $product->price_min,
+ "cost_price" => $product->cost_price,
+ "pmp" => $product->pmp,
));
//Retrieve all extrafield for product and add it to values
diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php
index 034fa97f86f..7182dd45f31 100644
--- a/htdocs/product/fournisseurs.php
+++ b/htdocs/product/fournisseurs.php
@@ -270,10 +270,13 @@ if (empty($reshook)) {
if ($ret == -3) {
$error++;
- $object->fetch($object->product_id_already_linked);
- $productLink = $object->getNomUrl(1, 'supplier');
+ $tmpobject = new Product($db);
+ $tmpobject->fetch($object->product_id_already_linked);
+ $productLink = $tmpobject->getNomUrl(1, 'supplier');
- setEventMessages($langs->trans("ReferenceSupplierIsAlreadyAssociatedWithAProduct", $productLink), null, 'errors');
+ $texttoshow = $langs->trans("ReferenceSupplierIsAlreadyAssociatedWithAProduct", '{s1}');
+ $texttoshow = str_replace('{s1}', $productLink, $texttoshow);
+ setEventMessages($texttoshow, null, 'errors');
} elseif ($ret < 0) {
$error++;
setEventMessages($object->error, $object->errors, 'errors');
@@ -821,7 +824,7 @@ END;
print '
'.$langs->trans('ProductSupplierDescription').' ';
print '';
- $doleditor = new DolEditor('supplier_description', $object->desc_supplier, '', 160, 'dolibarr_details', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_PRODUCTDESC'), ROWS_4, '90%');
+ $doleditor = new DolEditor('supplier_description', $object->desc_supplier, '', 160, 'dolibarr_details', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_DETAILS'), ROWS_4, '90%');
$doleditor->Create();
print ' ';
@@ -949,8 +952,8 @@ END;
'pfp.quantity'=>array('label'=>$langs->trans("QtyMin"), 'checked'=>1, 'position'=>5),
'pfp.unitprice'=>array('label'=>$langs->trans("UnitPriceHT"), 'checked'=>1, 'position'=>9),
'pfp.multicurrency_unitprice'=>array('label'=>$langs->trans("UnitPriceHTCurrency"), 'enabled' => isModEnabled('multicurrency'), 'checked'=>0, 'position'=>10),
- 'pfp.delivery_time_days'=>array('label'=>$langs->trans("NbDaysToDelivery"), 'checked'=>1, 'position'=>13),
- 'pfp.supplier_reputation'=>array('label'=>$langs->trans("ReputationForThisProduct"), 'checked'=>1, 'position'=>14),
+ 'pfp.delivery_time_days'=>array('label'=>$langs->trans("NbDaysToDelivery"), 'checked'=>-1, 'position'=>13),
+ 'pfp.supplier_reputation'=>array('label'=>$langs->trans("ReputationForThisProduct"), 'checked'=>-1, 'position'=>14),
'pfp.fk_barcode_type'=>array('label'=>$langs->trans("BarcodeType"), 'enabled' => isModEnabled('barcode'), 'checked'=>0, 'position'=>15),
'pfp.barcode'=>array('label'=>$langs->trans("BarcodeValue"), 'enabled' => isModEnabled('barcode'), 'checked'=>0, 'position'=>16),
'pfp.packaging'=>array('label'=>$langs->trans("PackagingForThisProduct"), 'enabled' => getDolGlobalInt('PRODUCT_USE_SUPPLIER_PACKAGING'), 'checked'=>0, 'position'=>17),
@@ -995,52 +998,72 @@ END;
$param = "&id=".$object->id;
+ $nbfields = 0;
+
print '';
if (!empty($arrayfields['pfp.datec']['checked'])) {
print_liste_field_titre("AppliedPricesFrom", $_SERVER["PHP_SELF"], "pfp.datec", "", $param, "", $sortfield, $sortorder, '', '', 1);
+ $nbfields++;
}
if (!empty($arrayfields['s.nom']['checked'])) {
print_liste_field_titre("Suppliers", $_SERVER["PHP_SELF"], "s.nom", "", $param, "", $sortfield, $sortorder, '', '', 1);
+ $nbfields++;
}
print_liste_field_titre("SupplierRef", $_SERVER["PHP_SELF"], "", "", $param, "", $sortfield, $sortorder, '', '', 1);
+ $nbfields++;
if (!empty($arrayfields['pfp.fk_availability']['checked'])) {
print_liste_field_titre("Availability", $_SERVER["PHP_SELF"], "pfp.fk_availability", "", $param, "", $sortfield, $sortorder);
+ $nbfields++;
}
if (!empty($arrayfields['pfp.quantity']['checked'])) {
print_liste_field_titre("QtyMin", $_SERVER["PHP_SELF"], "pfp.quantity", "", $param, '', $sortfield, $sortorder, 'right ');
+ $nbfields++;
}
print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
+ $nbfields++;
print_liste_field_titre("PriceQtyMinHT", $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
+ $nbfields++;
if (isModEnabled("multicurrency")) {
print_liste_field_titre("PriceQtyMinHTCurrency", $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
+ $nbfields++;
}
if (!empty($arrayfields['pfp.unitprice']['checked'])) {
print_liste_field_titre("UnitPriceHT", $_SERVER["PHP_SELF"], "pfp.unitprice", "", $param, '', $sortfield, $sortorder, 'right ');
+ $nbfields++;
}
if (!empty($arrayfields['pfp.multicurrency_unitprice']['checked'])) {
print_liste_field_titre("UnitPriceHTCurrency", $_SERVER["PHP_SELF"], "pfp.multicurrency_unitprice", "", $param, '', $sortfield, $sortorder, 'right ');
+ $nbfields++;
}
if (isModEnabled("multicurrency")) {
print_liste_field_titre("Currency", $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right ');
+ $nbfields++;
}
print_liste_field_titre("DiscountQtyMin", $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
+ $nbfields++;
if (!empty($arrayfields['pfp.delivery_time_days']['checked'])) {
print_liste_field_titre("NbDaysToDelivery", $_SERVER["PHP_SELF"], "pfp.delivery_time_days", "", $param, '', $sortfield, $sortorder, 'right ');
+ $nbfields++;
}
if (!empty($arrayfields['pfp.supplier_reputation']['checked'])) {
print_liste_field_titre("ReputationForThisProduct", $_SERVER["PHP_SELF"], "pfp.supplier_reputation", "", $param, '', $sortfield, $sortorder, 'center ');
+ $nbfields++;
}
if (!empty($arrayfields['pfp.fk_barcode_type']['checked'])) {
print_liste_field_titre("BarcodeType", $_SERVER["PHP_SELF"], "pfp.fk_barcode_type", "", $param, '', $sortfield, $sortorder, 'center ');
+ $nbfields++;
}
if (!empty($arrayfields['pfp.barcode']['checked'])) {
print_liste_field_titre("BarcodeValue", $_SERVER["PHP_SELF"], "pfp.barcode", "", $param, '', $sortfield, $sortorder, 'center ');
+ $nbfields++;
}
if (!empty($arrayfields['pfp.packaging']['checked'])) {
print_liste_field_titre("PackagingForThisProduct", $_SERVER["PHP_SELF"], "pfp.packaging", "", $param, 'align="center"', $sortfield, $sortorder);
+ $nbfields++;
}
if (!empty($arrayfields['pfp.tms']['checked'])) {
print_liste_field_titre("DateModification", $_SERVER["PHP_SELF"], "pfp.tms", "", $param, '', $sortfield, $sortorder, 'right ', '', 1);
+ $nbfields++;
}
// fetch optionals attributes and labels
@@ -1062,6 +1085,7 @@ END;
}
if (!empty($arrayfields['ef.' . $key]['checked'])) {
print_liste_field_titre($extratitle, $_SERVER["PHP_SELF"], 'ef.' . $key, '', $param, '', $sortfield, $sortorder, 'right ');
+ $nbfields++;
}
}
}
@@ -1069,10 +1093,11 @@ END;
}
if (is_object($hookmanager)) {
- $parameters = array('id_fourn'=>(!empty($id_fourn)?$id_fourn:''), 'prod_id'=>$object->id);
+ $parameters = array('id_fourn'=>(!empty($id_fourn)?$id_fourn:''), 'prod_id'=>$object->id, 'nbfields'=>$nbfields);
$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action);
}
print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
+ $nbfields++;
print " \n";
if (is_array($product_fourn_list)) {
@@ -1254,6 +1279,10 @@ END;
print '';
}
+
+ if (empty($product_fourn_list)) {
+ print ''.$langs->trans("None").' ';
+ }
} else {
dol_print_error($db);
}
diff --git a/htdocs/product/index.php b/htdocs/product/index.php
index 845c2e1012d..c2704111094 100644
--- a/htdocs/product/index.php
+++ b/htdocs/product/index.php
@@ -126,7 +126,7 @@ if (!empty($conf->global->MAIN_SEARCH_FORM_ON_HOME_AREAS)) { // This may be
/*
* Number of products and/or services
*/
-if ((isModEnabled("product") || isModEnabled("service")) && ($user->rights->produit->lire || $user->rights->service->lire)) {
+if ((isModEnabled("product") || isModEnabled("service")) && ($user->hasRight("produit", "lire") || $user->hasRight("service", "lire"))) {
$prodser = array();
$prodser[0][0] = $prodser[0][1] = $prodser[0][2] = $prodser[0][3] = 0;
$prodser[0]['sell'] = 0;
@@ -284,7 +284,7 @@ print '';
/*
* Latest modified products
*/
-if ((isModEnabled("product") || isModEnabled("service")) && ($user->rights->produit->lire || $user->rights->service->lire)) {
+if ((isModEnabled("product") || isModEnabled("service")) && ($user->hasRight("produit", "lire") || $user->hasRight("service", "lire"))) {
$max = 15;
$sql = "SELECT p.rowid, p.label, p.price, p.ref, p.fk_product_type, p.tosell, p.tobuy, p.tobatch, p.fk_price_expression,";
$sql .= " p.entity,";
diff --git a/htdocs/product/inventory/card.php b/htdocs/product/inventory/card.php
index 6e1bb1e8a2e..fb9803dd23b 100644
--- a/htdocs/product/inventory/card.php
+++ b/htdocs/product/inventory/card.php
@@ -417,17 +417,12 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
}
// Clone
- /*if ($permissiontoadd)
- {
- print '
'.$langs->trans("ToClone").' '."\n";
- }*/
-
- // Delete (need delete permission, or if draft, just need create/modify permission)
- if ($permissiontodelete || ($object->status == $object::STATUS_DRAFT && $permissiontoadd)) {
- print '
id.'&action=delete&token='.newToken().'">'.$langs->trans('Delete').' '."\n";
- } else {
- print '
'.$langs->trans('Delete').' '."\n";
+ if ($permissiontoadd) {
+ //print dolGetButtonAction($langs->trans("ToClone"), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&socid='.$object->socid.'&action=clone&object=inventory', 'clone', $permissiontoadd);
}
+
+ // Delete
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete);
}
print '
'."\n";
}
diff --git a/htdocs/product/inventory/class/inventory.class.php b/htdocs/product/inventory/class/inventory.class.php
index 281d58ea99e..9acc4232490 100644
--- a/htdocs/product/inventory/class/inventory.class.php
+++ b/htdocs/product/inventory/class/inventory.class.php
@@ -104,10 +104,10 @@ class Inventory extends CommonObject
'fk_warehouse' => array('type'=>'integer:Entrepot:product/stock/class/entrepot.class.php', 'label'=>'Warehouse', 'visible'=>1, 'enabled'=>1, 'position'=>30, 'index'=>1, 'help'=>'InventoryForASpecificWarehouse', 'picto'=>'stock', 'css'=>'minwidth300 maxwidth500 widthcentpercentminusx', 'csslist'=>'tdoverflowmax200'),
'fk_product' => array('type'=>'integer:Product:product/class/product.class.php', 'label'=>'Product', 'get_name_url_params' => '0::0:-1:0::1', 'visible'=>1, 'enabled'=>1, 'position'=>32, 'index'=>1, 'help'=>'InventoryForASpecificProduct', 'picto'=>'product', 'css'=>'minwidth300 maxwidth500 widthcentpercentminusx', 'csslist'=>'tdoverflowmax200'),
'categories_product' => array('type'=>'chkbxlst:categorie:label:rowid::type=0:0:', 'label'=>'OrProductsWithCategories', 'visible'=>3, 'enabled'=>1, 'position'=>33, 'help'=>'', 'picto'=>'category', 'css'=>'minwidth300 maxwidth500 widthcentpercentminusx'),
- 'date_inventory' => array('type'=>'date', 'label'=>'DateValue', 'visible'=>1, 'enabled'=>'$conf->global->STOCK_INVENTORY_ADD_A_VALUE_DATE', 'position'=>35), // This date is not used so disabled by default.
- 'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>500),
- 'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>501),
- 'date_validation' => array('type'=>'datetime', 'label'=>'DateValidation', 'visible'=>-2, 'enabled'=>1, 'position'=>502),
+ 'date_inventory' => array('type'=>'date', 'label'=>'DateValue', 'visible'=>1, 'enabled'=>'$conf->global->STOCK_INVENTORY_ADD_A_VALUE_DATE', 'position'=>35, 'csslist'=>'nowraponall'), // This date is not used so disabled by default.
+ 'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>500, 'csslist'=>'nowraponall'),
+ 'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>501, 'csslist'=>'nowraponall'),
+ 'date_validation' => array('type'=>'datetime', 'label'=>'DateValidation', 'visible'=>-2, 'enabled'=>1, 'position'=>502, 'csslist'=>'nowraponall'),
'fk_user_creat' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserAuthor', 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>510, 'foreignkey'=>'user.rowid', 'csslist'=>'tdoverflowmax200'),
'fk_user_modif' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'enabled'=>1, 'visible'=>-2, 'notnull'=>-1, 'position'=>511, 'csslist'=>'tdoverflowmax200'),
'fk_user_valid' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserValidation', 'visible'=>-2, 'enabled'=>1, 'position'=>512, 'csslist'=>'tdoverflowmax200'),
diff --git a/htdocs/product/inventory/list.php b/htdocs/product/inventory/list.php
index 793fedd3a2d..68a08d37959 100644
--- a/htdocs/product/inventory/list.php
+++ b/htdocs/product/inventory/list.php
@@ -270,51 +270,34 @@ foreach ($search as $key => $val) {
if ($search_all) {
$sql .= natural_search(array_keys($fieldstosearchall), $search_all);
}
-$searchCategoryProductSqlList = array();
-if ($searchCategoryProductOperator == 1) {
- $existsCategoryProductList = array();
+// Search for tag/category ($searchCategoryProductList is an array of ID)
+if (!empty($searchCategoryProductList)) {
+ $searchCategoryProductSqlList = array();
+ $listofcategoryid = '';
foreach ($searchCategoryProductList as $searchCategoryProduct) {
if (intval($searchCategoryProduct) == -2) {
- $sqlCategoryProductNotExists = " NOT EXISTS (";
- $sqlCategoryProductNotExists .= " SELECT cp.fk_product";
- $sqlCategoryProductNotExists .= " FROM ".$db->prefix()."categorie_product AS cp";
- $sqlCategoryProductNotExists .= " WHERE cp.fk_product = t.fk_product";
- $sqlCategoryProductNotExists .= " )";
- $searchCategoryProductSqlList[] = $sqlCategoryProductNotExists;
+ $searchCategoryProductSqlList[] = "NOT EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck WHERE p.rowid = ck.fk_product)";
} elseif (intval($searchCategoryProduct) > 0) {
- $existsCategoryProductList[] = $db->escape($searchCategoryProduct);
+ if ($searchCategoryProductOperator == 0) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck WHERE p.rowid = ck.fk_product AND ck.fk_categorie = ".((int) $searchCategoryProduct).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProduct);
+ }
}
}
- if (!empty($existsCategoryProductList)) {
- $sqlCategoryProductExists = " EXISTS (";
- $sqlCategoryProductExists .= " SELECT cp.fk_product";
- $sqlCategoryProductExists .= " FROM ".$db->prefix()."categorie_product AS cp";
- $sqlCategoryProductExists .= " WHERE cp.fk_product = t.fk_product";
- $sqlCategoryProductExists .= " AND cp.fk_categorie IN (".$db->sanitize(implode(',', $existsCategoryProductList)).")";
- $sqlCategoryProductExists .= " )";
- $searchCategoryProductSqlList[] = $sqlCategoryProductExists;
+ if ($listofcategoryid) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck WHERE p.rowid = ck.fk_product AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
}
- if (!empty($searchCategoryProductSqlList)) {
- $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
- }
-} else {
- foreach ($searchCategoryProductList as $searchCategoryProduct) {
- if (intval($searchCategoryProduct) == -2) {
- $sqlCategoryProductNotExists = " NOT EXISTS (";
- $sqlCategoryProductNotExists .= " SELECT cp.fk_product";
- $sqlCategoryProductNotExists .= " FROM ".$db->prefix()."categorie_product AS cp";
- $sqlCategoryProductNotExists .= " WHERE cp.fk_product = t.fk_product";
- $sqlCategoryProductNotExists .= " )";
- $searchCategoryProductSqlList[] = $sqlCategoryProductNotExists;
- } elseif (intval($searchCategoryProduct) > 0) {
- $searchCategoryProductSqlList[] = "t.fk_product IN (SELECT fk_product FROM ".$db->prefix()."categorie_product WHERE fk_categorie = ".((int) $searchCategoryProduct).")";
+ if ($searchCategoryProductOperator == 1) {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
}
- }
- if (!empty($searchCategoryProductSqlList)) {
- $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
}
}
-//$sql.= dolSqlDateFilter("t.field", $search_xxxday, $search_xxxmonth, $search_xxxyear);
// Add where from extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
// Add where from hooks
@@ -491,7 +474,7 @@ if (!empty($moreforfilter)) {
}
$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
-$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
+$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields
$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
print '
'; // You can use div-table-responsive-no-min if you dont need reserved height for your table
@@ -501,6 +484,13 @@ print '
';
+// Action column
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons('left');
+ print $searchpicto;
+ print ' ';
+}
foreach ($object->fields as $key => $val) {
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
if ($key == 'status') {
@@ -539,16 +529,22 @@ $parameters = array('arrayfields'=>$arrayfields);
$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Action column
-print '';
-$searchpicto = $form->showFilterButtons();
-print $searchpicto;
-print ' ';
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons();
+ print $searchpicto;
+ print ' ';
+}
print ''."\n";
// Fields title label
// --------------------------------------------------------------------
print '';
+// Action column
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+}
foreach ($object->fields as $key => $val) {
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
if ($key == 'status') {
@@ -571,7 +567,9 @@ $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$
$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Action column
-print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+}
print ' '."\n";
@@ -601,6 +599,18 @@ while ($i < ($limit ? min($num, $limit) : $num)) {
// Show here line of result
print '';
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($object->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
foreach ($object->fields as $key => $val) {
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
@@ -653,15 +663,17 @@ while ($i < ($limit ? min($num, $limit) : $num)) {
$reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Action column
- print '';
- if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
- $selected = 0;
- if (in_array($object->id, $arrayofselected)) {
- $selected = 1;
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print ' ';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($object->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
}
- print ' ';
+ print ' ';
}
- print '';
if (!$i) {
$totalarray['nbfield']++;
}
diff --git a/htdocs/product/list.php b/htdocs/product/list.php
index 3561388709d..613d0a1c5d6 100644
--- a/htdocs/product/list.php
+++ b/htdocs/product/list.php
@@ -45,6 +45,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
if (isModEnabled('categorie')) {
require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
+ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcategory.class.php';
}
// Load translation files required by the page
@@ -72,17 +73,20 @@ $search_type = GETPOST("search_type", 'int');
$search_vatrate = GETPOST("search_vatrate", 'alpha');
$searchCategoryProductOperator = 0;
if (GETPOSTISSET('formfilteraction')) {
- $searchCategoryProductOperator = GETPOST('search_category_product_operator', 'int');
+ $searchCategoryProductOperator = GETPOSTINT('search_category_product_operator');
} elseif (!empty($conf->global->MAIN_SEARCH_CAT_OR_BY_DEFAULT)) {
$searchCategoryProductOperator = $conf->global->MAIN_SEARCH_CAT_OR_BY_DEFAULT;
}
$searchCategoryProductList = GETPOST('search_category_product_list', 'array');
+$catid = GETPOST('catid', 'int');
+if (!empty($catid) && empty($searchCategoryProductList)) {
+ $searchCategoryProductList = array($catid);
+}
$search_tosell = GETPOST("search_tosell", 'int');
$search_tobuy = GETPOST("search_tobuy", 'int');
$search_country = GETPOST("search_country", 'int');
$search_state = GETPOST("state_id", 'int');
$fourn_id = GETPOST("fourn_id", 'int');
-$catid = GETPOST('catid', 'int');
$search_tobatch = GETPOST("search_tobatch", 'int');
$search_accountancy_code_sell = GETPOST("search_accountancy_code_sell", 'alpha');
$search_accountancy_code_sell_intra = GETPOST("search_accountancy_code_sell_intra", 'alpha');
@@ -172,7 +176,6 @@ if (!empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT)
// List of fields to search into when doing a "search in all"
$fieldstosearchall = array(
'p.ref'=>"Ref",
- 'pfp.ref_fourn'=>"RefSupplier",
'p.label'=>"ProductLabel",
'p.description'=>"Description",
"p.note"=>"Note",
@@ -186,7 +189,6 @@ if (getDolGlobalInt('MAIN_MULTILANGS')) {
}
if (isModEnabled('barcode')) {
$fieldstosearchall['p.barcode'] = 'Gencod';
- $fieldstosearchall['pfp.barcode'] = 'GencodBuyPrice';
}
// Personalized search criterias. Example: $conf->global->PRODUCT_QUICKSEARCH_ON_FIELDS = 'p.ref=ProductRef;p.label=ProductLabel;p.description=Description;p.note=Note;'
if (!empty($conf->global->PRODUCT_QUICKSEARCH_ON_FIELDS)) {
@@ -296,6 +298,7 @@ if ($search_type == '0') {
$result = restrictedArea($user, 'produit|service', '', '', '', '', '', 0);
}
+
/*
* Actions
*/
@@ -306,7 +309,6 @@ if (GETPOST('cancel', 'alpha')) {
if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
$massaction = '';
}
-
$parameters = array();
$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
if ($reshook < 0) {
@@ -405,7 +407,7 @@ if ($search_type != '' && $search_type != '-1') {
}
}
-$sql = 'SELECT DISTINCT p.rowid, p.ref, p.label, p.fk_product_type, p.barcode, p.price, p.tva_tx, p.price_ttc, p.price_base_type, p.entity,';
+$sql = 'SELECT p.rowid, p.ref, p.label, p.fk_product_type, p.barcode, p.price, p.tva_tx, p.price_ttc, p.price_base_type, p.entity,';
$sql .= ' p.fk_product_type, p.duration, p.finished, p.tosell, p.tobuy, p.seuil_stock_alerte, p.desiredstock,';
$sql .= ' p.tobatch,';
if (empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
@@ -418,9 +420,9 @@ $sql .= ' p.weight, p.weight_units, p.length, p.length_units, p.width, p.width_u
if (!empty($conf->global->PRODUCT_USE_UNITS)) {
$sql .= ' p.fk_unit, cu.label as cu_label,';
}
-$sql .= ' MIN(pfp.unitprice) as minsellprice';
+$sql .= ' MIN(pfp.unitprice) as bestpurchaseprice';
if (isModEnabled('variants') && (!empty($conf->global->PRODUIT_ATTRIBUTES_HIDECHILD) && !$show_childproducts)) {
- $sql .= ', pac.rowid prod_comb_id';
+ $sql .= ', pac.rowid as prod_comb_id';
}
// Add fields from extrafields
if (!empty($extrafields->attributes[$object->table_element]['label'])) {
@@ -432,6 +434,9 @@ if (!empty($extrafields->attributes[$object->table_element]['label'])) {
$parameters = array();
$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$sql .= $hookmanager->resPrint;
+
+$sqlfields = $sql; // $sql fields to remove for count total
+
$sql .= ' FROM '.MAIN_DB_PREFIX.'product as p';
if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product_perentity as ppe ON ppe.fk_product = p.rowid AND ppe.entity = " . ((int) $conf->entity);
@@ -439,10 +444,8 @@ if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product_extrafields as ef on (p.rowid = ef.fk_object)";
}
-if (!empty($searchCategoryProductList) || !empty($catid)) {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_product as cp ON p.rowid = cp.fk_product"; // We'll need this table joined to the select in order to filter by categ
-}
-$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product_fournisseur_price as pfp ON p.rowid = pfp.fk_product";
+$linktopfp = " LEFT JOIN ".MAIN_DB_PREFIX."product_fournisseur_price as pfp ON p.rowid = pfp.fk_product";
+$sql .= $linktopfp;
// multilang
if (getDolGlobalInt('MAIN_MULTILANGS')) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product_lang as pl ON pl.fk_product = p.rowid AND pl.lang = '".$db->escape($langs->getDefaultLang())."'";
@@ -455,10 +458,18 @@ if (!empty($conf->global->PRODUCT_USE_UNITS)) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_units cu ON cu.rowid = p.fk_unit";
}
-
$sql .= ' WHERE p.entity IN ('.getEntity('product').')';
if ($sall) {
- $sql .= natural_search(array_keys($fieldstosearchall), $sall);
+ $sql .= ' AND (';
+ $sql .= natural_search(array_keys($fieldstosearchall), $sall, 0, 1);
+ // Search also into a supplier reference 'pfp.ref_fourn'="RefSupplier"
+ $sql .= ' OR EXISTS (SELECT rowid FROM '.MAIN_DB_PREFIX.'product_fournisseur_price as pfp WHERE pfp.fk_product = p.rowid';
+ $sql .= ' AND ('.natural_search('pfp.ref_fourn', $sall, 0, 1);
+ if (isModEnabled('barcode')) {
+ // Search also into a supplier barcode 'pfp.barcode'='GencodBuyPrice';
+ $sql .= ' OR '.natural_search('pfp.barcode', $sall, 0, 1);
+ }
+ $sql .= ')))';
}
// if the type is not 1, we show all products (type = 0,2,3)
if (dol_strlen($search_type) && $search_type != '-1') {
@@ -500,34 +511,32 @@ if ($search_vatrate) {
if (dol_strlen($canvas) > 0) {
$sql .= " AND p.canvas = '".$db->escape($canvas)."'";
}
-if ($catid > 0) {
- $sql .= " AND cp.fk_categorie = ".((int) $catid);
-}
-if ($catid == -2) {
- $sql .= " AND cp.fk_categorie IS NULL";
-}
-$searchCategoryProductSqlList = array();
-if ($searchCategoryProductOperator == 1) {
+// Search for tag/category ($searchCategoryProductList is an array of ID)
+if (!empty($searchCategoryProductList)) {
+ $searchCategoryProductSqlList = array();
+ $listofcategoryid = '';
foreach ($searchCategoryProductList as $searchCategoryProduct) {
if (intval($searchCategoryProduct) == -2) {
- $searchCategoryProductSqlList[] = "cp.fk_categorie IS NULL";
+ $searchCategoryProductSqlList[] = "NOT EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck WHERE p.rowid = ck.fk_product)";
} elseif (intval($searchCategoryProduct) > 0) {
- $searchCategoryProductSqlList[] = "cp.fk_categorie = ".$db->escape($searchCategoryProduct);
+ if ($searchCategoryProductOperator == 0) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck WHERE p.rowid = ck.fk_product AND ck.fk_categorie = ".((int) $searchCategoryProduct).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProduct);
+ }
}
}
- if (!empty($searchCategoryProductSqlList)) {
- $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
+ if ($listofcategoryid) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck WHERE p.rowid = ck.fk_product AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
}
-} else {
- foreach ($searchCategoryProductList as $searchCategoryProduct) {
- if (intval($searchCategoryProduct) == -2) {
- $searchCategoryProductSqlList[] = "cp.fk_categorie IS NULL";
- } elseif (intval($searchCategoryProduct) > 0) {
- $searchCategoryProductSqlList[] = "p.rowid IN (SELECT fk_product FROM ".MAIN_DB_PREFIX."categorie_product WHERE fk_categorie = ".((int) $searchCategoryProduct).")";
+ if ($searchCategoryProductOperator == 1) {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
}
- }
- if (!empty($searchCategoryProductSqlList)) {
- $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
}
}
if ($fourn_id > 0) {
@@ -560,7 +569,6 @@ if ($search_accountancy_code_buy_intra) {
if ($search_accountancy_code_buy_export) {
$sql .= natural_search($alias_product_perentity . '.accountancy_code_buy_export', $search_accountancy_code_buy_export);
}
-
// Add where from extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
// Add where from hooks
@@ -594,737 +602,754 @@ $parameters = array();
$reshook = $hookmanager->executeHooks('printFieldSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
$sql .= $hookmanager->resPrint;
//if (GETPOST("toolowstock")) $sql.= " HAVING SUM(s.reel) < p.seuil_stock_alerte"; // Not used yet
-$sql .= $db->order($sortfield, $sortorder);
$nbtotalofrecords = '';
if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
- $result = $db->query($sql);
- $nbtotalofrecords = $db->num_rows($result);
+ /* The fast and low memory method to get and count full list converts the sql into a sql count */
+ $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
+ $sqlforcount = preg_replace('/'.preg_quote($linktopfp, '/').'/', '', $sqlforcount);
+ $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
+ $resql = $db->query($sqlforcount);
+ if ($resql) {
+ $objforcount = $db->fetch_object($resql);
+ $nbtotalofrecords = $objforcount->nbtotalofrecords;
+ } else {
+ dol_print_error($db);
+ }
+
if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
$page = 0;
$offset = 0;
}
}
-$sql .= $db->plimit($limit + 1, $offset);
+// Complete request and execute it with limit
+$sql .= $db->order($sortfield, $sortorder);
+if ($limit) {
+ $sql .= $db->plimit($limit + 1, $offset);
+}
$resql = $db->query($sql);
+if (!$resql) {
+ dol_print_error($db);
+ exit;
+}
-if ($resql) {
- $num = $db->num_rows($resql);
+$num = $db->num_rows($resql);
- $arrayofselected = is_array($toselect) ? $toselect : array();
- if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $sall) {
- $obj = $db->fetch_object($resql);
- $id = $obj->rowid;
- header("Location: ".DOL_URL_ROOT.'/product/card.php?id='.$id);
- exit;
+$arrayofselected = is_array($toselect) ? $toselect : array();
+
+// Direct jump if only one record found
+if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $sall) {
+ $obj = $db->fetch_object($resql);
+ $id = $obj->rowid;
+ header("Location: ".DOL_URL_ROOT.'/product/card.php?id='.$id);
+ exit;
+}
+
+$helpurl = '';
+if ($search_type != '') {
+ if ($search_type == 0) {
+ $helpurl = 'EN:Module_Products|FR:Module_Produits|ES:Módulo_Productos';
+ } elseif ($search_type == 1) {
+ $helpurl = 'EN:Module_Services_En|FR:Module_Services|ES:Módulo_Servicios';
}
+}
- $helpurl = '';
- if ($search_type != '') {
- if ($search_type == 0) {
- $helpurl = 'EN:Module_Products|FR:Module_Produits|ES:Módulo_Productos';
- } elseif ($search_type == 1) {
- $helpurl = 'EN:Module_Services_En|FR:Module_Services|ES:Módulo_Servicios';
+$paramsCat = '';
+foreach ($searchCategoryProductList as $searchCategoryProduct) {
+ $paramsCat .= "&search_category_product_list[]=".urlencode($searchCategoryProduct);
+}
+
+//llxHeader('', $title, $helpurl, '', 0, 0, array(), array(), $paramsCat, 'classforhorizontalscrolloftabs');
+llxHeader('', $title, $helpurl, '', 0, 0, array(), array(), $paramsCat, '');
+
+// Displays product removal confirmation
+if (GETPOST('delprod')) {
+ setEventMessages($langs->trans("ProductDeleted", GETPOST('delprod')), null, 'mesgs');
+}
+
+$param = '';
+if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
+ $param .= '&contextpage='.urlencode($contextpage);
+}
+if ($limit > 0 && $limit != $conf->liste_limit) {
+ $param .= '&limit='.urlencode($limit);
+}
+if ($sall) {
+ $param .= "&sall=".urlencode($sall);
+}
+if ($searchCategoryProductOperator == 1) {
+ $param .= "&search_category_product_operator=".urlencode($searchCategoryProductOperator);
+}
+foreach ($searchCategoryProductList as $searchCategoryProduct) {
+ $param .= "&search_category_product_list[]=".urlencode($searchCategoryProduct);
+}
+if ($search_ref) {
+ $param = "&search_ref=".urlencode($search_ref);
+}
+if ($search_ref_supplier) {
+ $param = "&search_ref_supplier=".urlencode($search_ref_supplier);
+}
+if ($search_barcode) {
+ $param .= ($search_barcode ? "&search_barcode=".urlencode($search_barcode) : "");
+}
+if ($search_label) {
+ $param .= "&search_label=".urlencode($search_label);
+}
+if ($search_tosell != '') {
+ $param .= "&search_tosell=".urlencode($search_tosell);
+}
+if ($search_tobuy != '') {
+ $param .= "&search_tobuy=".urlencode($search_tobuy);
+}
+if ($search_tobatch) {
+ $param = "&search_tobatch=".urlencode($search_tobatch);
+}
+if ($search_country != '') {
+ $param .= "&search_country=".urlencode($search_country);
+}
+if ($search_state != '') {
+ $param .= "&search_state=".urlencode($search_state);
+}
+if ($search_vatrate) {
+ $param = "&search_vatrate=".urlencode($search_vatrate);
+}
+if ($fourn_id > 0) {
+ $param .= "&fourn_id=".urlencode($fourn_id);
+}
+if ($show_childproducts) {
+ $param .= ($show_childproducts ? "&search_show_childproducts=".urlencode($show_childproducts) : "");
+}
+if ($type != '') {
+ $param .= '&type='.urlencode($type);
+}
+if ($search_type != '') {
+ $param .= '&search_type='.urlencode($search_type);
+}
+if ($optioncss != '') {
+ $param .= '&optioncss='.urlencode($optioncss);
+}
+if ($search_accountancy_code_sell) {
+ $param = "&search_accountancy_code_sell=".urlencode($search_accountancy_code_sell);
+}
+if ($search_accountancy_code_sell_intra) {
+ $param = "&search_accountancy_code_sell_intra=".urlencode($search_accountancy_code_sell_intra);
+}
+if ($search_accountancy_code_sell_export) {
+ $param = "&search_accountancy_code_sell_export=".urlencode($search_accountancy_code_sell_export);
+}
+if ($search_accountancy_code_buy) {
+ $param = "&search_accountancy_code_buy=".urlencode($search_accountancy_code_buy);
+}
+if ($search_accountancy_code_buy_intra) {
+ $param = "&search_accountancy_code_buy_intra=".urlencode($search_accountancy_code_buy_intra);
+}
+if ($search_accountancy_code_buy_export) {
+ $param = "&search_accountancy_code_buy_export=".urlencode($search_accountancy_code_buy_export);
+}
+if ($search_finished) {
+ $param = "&search_finished=".urlencode($search_finished);
+}
+// Add $param from extra fields
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
+
+// List of mass actions available
+$arrayofmassactions = array(
+ 'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
+ 'edit_extrafields'=>img_picto('', 'edit', 'class="pictofixedwidth"').$langs->trans("ModifyValueExtrafields"),
+ //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
+ //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
+);
+
+if ($user->rights->{$rightskey}->supprimer) {
+ $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
+}
+if ($user->rights->{$rightskey}->creer) {
+ $arrayofmassactions['switchonsalestatus'] = img_picto('', 'stop-circle', 'class="pictofixedwidth"').$langs->trans("SwitchOnSaleStatus");
+ $arrayofmassactions['switchonpurchasestatus'] = img_picto('', 'stop-circle', 'class="pictofixedwidth"').$langs->trans("SwitchOnPurchaseStatus");
+ $arrayofmassactions['preupdateprice'] = img_picto('', 'edit', 'class="pictofixedwidth"').$langs->trans("UpdatePrice");
+}
+if (isModEnabled('category') && $user->rights->{$rightskey}->creer) {
+ $arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("AffectTag");
+}
+if (in_array($massaction, array('presend', 'predelete','preaffecttag', 'edit_extrafields', 'preupdateprice'))) {
+ $arrayofmassactions = array();
+}
+$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
+
+$newcardbutton = '';
+if ($type === "") {
+ $perm = ($user->rights->produit->creer || $user->rights->service->creer);
+} elseif ($type == Product::TYPE_SERVICE) {
+ $perm = $user->rights->service->creer;
+} elseif ($type == Product::TYPE_PRODUCT) {
+ $perm = $user->rights->produit->creer;
+}
+$oldtype = $type;
+$params = array();
+if ($type === "") {
+ $params['forcenohideoftext'] = 1;
+}
+if ($type === "") {
+ $newcardbutton .= dolGetButtonTitle($langs->trans('NewProduct'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/product/card.php?action=create&type=0', '', $perm, $params);
+ $type = Product::TYPE_SERVICE;
+}
+$label = 'NewProduct';
+if ($type == Product::TYPE_SERVICE) {
+ $label = 'NewService';
+}
+$newcardbutton .= dolGetButtonTitle($langs->trans($label), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/product/card.php?action=create&type='.$type, '', $perm, $params);
+
+$type = $oldtype;
+
+print '';
+if ($optioncss != '') {
+ print ' ';
+}
+print ' ';
+print ' ';
+print ' ';
+print ' ';
+print ' ';
+//print ' ';
+print ' ';
+if (empty($arrayfields['p.fk_product_type']['checked'])) {
+ print ' ';
+}
+
+$picto = 'product';
+if ($type == 1) {
+ $picto = 'service';
+}
+
+print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, $picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
+
+$topicmail = "Information";
+$modelmail = "product";
+$objecttmp = new Product($db);
+$trackid = 'prod'.$object->id;
+include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
+
+if (!empty($catid)) {
+ print "";
+ $c = new Categorie($db);
+ $ways = $c->print_all_ways(' > ', 'product/list.php');
+ print " > ".$ways[0]." \n";
+ print "
";
+}
+
+if ($sall) {
+ $setupstring = '';
+ foreach ($fieldstosearchall as $key => $val) {
+ $fieldstosearchall[$key] = $langs->trans($val);
+ $setupstring .= $key."=".$val.";";
+ }
+ print ''."\n";
+ print ''.$langs->trans("FilterOnInto", $sall).join(', ', $fieldstosearchall).'
'."\n";
+}
+
+// Filter on categories
+$moreforfilter = '';
+if (isModEnabled('categorie') && $user->hasRight('categorie', 'read')) {
+ $formcategory = new FormCategory($db);
+ $moreforfilter .= $formcategory->getFilterBox(Categorie::TYPE_PRODUCT, $searchCategoryProductList, 'minwidth300', $searchCategoryProductOperator ? $searchCategoryProductOperator : 0);
+}
+
+//Show/hide child products. Hidden by default
+if (isModEnabled('variants') && !empty($conf->global->PRODUIT_ATTRIBUTES_HIDECHILD)) {
+ $moreforfilter .= '';
+ $moreforfilter .= ' ';
+ $moreforfilter .= ' '.$langs->trans('ShowChildProducts').' ';
+ $moreforfilter .= '
';
+}
+
+$parameters = array();
+$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+if (empty($reshook)) {
+ $moreforfilter .= $hookmanager->resPrint;
+} else {
+ $moreforfilter = $hookmanager->resPrint;
+}
+
+if ($moreforfilter) {
+ print '';
+ print $moreforfilter;
+ print '
';
+}
+
+$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
+
+$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields
+if ($massactionbutton) {
+ $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
+}
+
+print '';
+print '
'."\n";
+
+// Lines with input filters
+print '';
+if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print '';
+ $searchpicto = $form->showFilterButtons('left');
+ print $searchpicto;
+ print ' ';
+}
+if (!empty($arrayfields['p.rowid']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+}
+if (!empty($arrayfields['p.ref']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+}
+if (!empty($arrayfields['pfp.ref_fourn']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+}
+// Thumbnail
+if (!empty($arrayfields['thumbnail']['checked'])) {
+ print '';
+ print ' ';
+}
+if (!empty($arrayfields['p.label']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+}
+// Type
+if (!empty($arrayfields['p.fk_product_type']['checked'])) {
+ print '';
+ $array = array('-1'=>' ', '0'=>$langs->trans('Product'), '1'=>$langs->trans('Service'));
+ print $form->selectarray('search_type', $array, $search_type);
+ print ' ';
+}
+// Barcode
+if (!empty($arrayfields['p.barcode']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+}
+// Duration
+if (!empty($arrayfields['p.duration']['checked'])) {
+ print '';
+ print ' ';
+}
+
+// Finished
+if (!empty($arrayfields['p.finished']['checked'])) {
+ print '';
+ print $formproduct->selectProductNature('search_finished', $search_finished);
+ print ' ';
+}
+// Weight
+if (!empty($arrayfields['p.weight']['checked'])) {
+ print '';
+ print ' ';
+}
+// Weight units
+if (!empty($arrayfields['p.weight_units']['checked'])) {
+ print '';
+ print ' ';
+}
+// Length
+if (!empty($arrayfields['p.length']['checked'])) {
+ print '';
+ print ' ';
+}
+// Length units
+if (!empty($arrayfields['p.length_units']['checked'])) {
+ print '';
+ print ' ';
+}
+// Width
+if (!empty($arrayfields['p.width']['checked'])) {
+ print '';
+ print ' ';
+}
+// Width units
+if (!empty($arrayfields['p.width_units']['checked'])) {
+ print '';
+ print ' ';
+}
+// Height
+if (!empty($arrayfields['p.height']['checked'])) {
+ print '';
+ print ' ';
+}
+// Height units
+if (!empty($arrayfields['p.height_units']['checked'])) {
+ print '';
+ print ' ';
+}
+// Surface
+if (!empty($arrayfields['p.surface']['checked'])) {
+ print '';
+ print ' ';
+}
+// Surface units
+if (!empty($arrayfields['p.surface_units']['checked'])) {
+ print '';
+ print ' ';
+}
+// Volume
+if (!empty($arrayfields['p.volume']['checked'])) {
+ print '';
+ print ' ';
+}
+// Volume units
+if (!empty($arrayfields['p.volume_units']['checked'])) {
+ print '';
+ print ' ';
+}
+
+// Unit
+if (!empty($arrayfields['cu.label']['checked'])) {
+ print '';
+ print ' ';
+}
+
+// Sell price
+if (!empty($arrayfields['p.sellprice']['checked'])) {
+ print '';
+ print ' ';
+}
+
+// Multiprice
+if (!empty($conf->global->PRODUIT_MULTIPRICES)) {
+ foreach ($arraypricelevel as $key => $value) {
+ if (!empty($arrayfields['p.sellprice'.$key]['checked'])) {
+ print '';
+ print ' ';
}
}
+}
- $paramsCat = '';
- foreach ($searchCategoryProductList as $searchCategoryProduct) {
- $paramsCat .= "&search_category_product_list[]=".urlencode($searchCategoryProduct);
- }
-
- //llxHeader('', $title, $helpurl, '', 0, 0, array(), array(), $paramsCat, 'classforhorizontalscrolloftabs');
- llxHeader('', $title, $helpurl, '', 0, 0, array(), array(), $paramsCat, '');
-
- // Displays product removal confirmation
- if (GETPOST('delprod')) {
- setEventMessages($langs->trans("ProductDeleted", GETPOST('delprod')), null, 'mesgs');
- }
-
- $param = '';
- if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
- $param .= '&contextpage='.urlencode($contextpage);
- }
- if ($limit > 0 && $limit != $conf->liste_limit) {
- $param .= '&limit='.urlencode($limit);
- }
- if ($sall) {
- $param .= "&sall=".urlencode($sall);
- }
- if ($searchCategoryProductOperator == 1) {
- $param .= "&search_category_product_operator=".urlencode($searchCategoryProductOperator);
- }
- foreach ($searchCategoryProductList as $searchCategoryProduct) {
- $param .= "&search_category_product_list[]=".urlencode($searchCategoryProduct);
- }
- if ($search_ref) {
- $param = "&search_ref=".urlencode($search_ref);
- }
- if ($search_ref_supplier) {
- $param = "&search_ref_supplier=".urlencode($search_ref_supplier);
- }
- if ($search_barcode) {
- $param .= ($search_barcode ? "&search_barcode=".urlencode($search_barcode) : "");
- }
- if ($search_label) {
- $param .= "&search_label=".urlencode($search_label);
- }
- if ($search_tosell != '') {
- $param .= "&search_tosell=".urlencode($search_tosell);
- }
- if ($search_tobuy != '') {
- $param .= "&search_tobuy=".urlencode($search_tobuy);
- }
- if ($search_tobatch) {
- $param = "&search_tobatch=".urlencode($search_tobatch);
- }
- if ($search_country != '') {
- $param .= "&search_country=".urlencode($search_country);
- }
- if ($search_state != '') {
- $param .= "&search_state=".urlencode($search_state);
- }
- if ($search_vatrate) {
- $param = "&search_vatrate=".urlencode($search_vatrate);
- }
- if ($fourn_id > 0) {
- $param .= "&fourn_id=".urlencode($fourn_id);
- }
- //if ($seach_categ) $param.=($search_categ?"&search_categ=".urlencode($search_categ):"");
- if ($show_childproducts) {
- $param .= ($show_childproducts ? "&search_show_childproducts=".urlencode($show_childproducts) : "");
- }
- if ($type != '') {
- $param .= '&type='.urlencode($type);
- }
- if ($search_type != '') {
- $param .= '&search_type='.urlencode($search_type);
- }
- if ($optioncss != '') {
- $param .= '&optioncss='.urlencode($optioncss);
- }
- if ($search_accountancy_code_sell) {
- $param = "&search_accountancy_code_sell=".urlencode($search_accountancy_code_sell);
- }
- if ($search_accountancy_code_sell_intra) {
- $param = "&search_accountancy_code_sell_intra=".urlencode($search_accountancy_code_sell_intra);
- }
- if ($search_accountancy_code_sell_export) {
- $param = "&search_accountancy_code_sell_export=".urlencode($search_accountancy_code_sell_export);
- }
- if ($search_accountancy_code_buy) {
- $param = "&search_accountancy_code_buy=".urlencode($search_accountancy_code_buy);
- }
- if ($search_accountancy_code_buy_intra) {
- $param = "&search_accountancy_code_buy_intra=".urlencode($search_accountancy_code_buy_intra);
- }
- if ($search_accountancy_code_buy_export) {
- $param = "&search_accountancy_code_buy_export=".urlencode($search_accountancy_code_buy_export);
- }
- if ($search_finished) {
- $param = "&search_finished=".urlencode($search_finished);
- }
- // Add $param from extra fields
- include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
-
- // List of mass actions available
- $arrayofmassactions = array(
- 'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
- 'edit_extrafields'=>img_picto('', 'edit', 'class="pictofixedwidth"').$langs->trans("ModifyValueExtrafields"),
- //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
- //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
+// Minimum buying Price
+if (!empty($arrayfields['p.minbuyprice']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+}
+// Number buying Price
+if (!empty($arrayfields['p.numbuyprice']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+}
+// Sell price
+if (!empty($arrayfields['p.tva_tx']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+}
+// WAP
+if (!empty($arrayfields['p.pmp']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+}
+// cost_price
+if (!empty($arrayfields['p.cost_price']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+}
+// Limit for alert
+if (!empty($arrayfields['p.seuil_stock_alerte']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+}
+// Desired stock
+if (!empty($arrayfields['p.desiredstock']['checked'])) {
+ print '';
+ print ' ';
+ print ' ';
+}
+// Stock
+if (!empty($arrayfields['p.stock']['checked'])) {
+ print ' ';
+}
+// Stock
+if (!empty($arrayfields['stock_virtual']['checked'])) {
+ print ' ';
+}
+// To batch
+if (!empty($arrayfields['p.tobatch']['checked'])) {
+ print '';
+ $statutarray = array(
+ '-1' => '',
+ '0' => $langs->trans("ProductStatusNotOnBatchShort"),
+ '1' => $langs->trans("ProductStatusOnBatchShort"),
+ '2' => $langs->trans("ProductStatusOnSerialShort")
);
+ print $form->selectarray('search_tobatch', $statutarray, $search_tobatch);
+ print ' ';
+}
+// Country
+if (!empty($arrayfields['p.fk_country']['checked'])) {
+ print '';
+ print $form->select_country($search_country, 'search_country', '', 0);
+ print ' ';
+}
+// State
+if (!empty($arrayfields['p.fk_state']['checked'])) {
+ print '';
+ print $formcompany->select_state($search_state, $search_country);
+ print ' ';
+}
+// Accountancy code sell
+if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell']['checked'])) {
+ print ' ';
+}
+if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_intra']['checked'])) {
+ print ' ';
+}
+if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_export']['checked'])) {
+ print ' ';
+}
+// Accountancy code buy
+if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy']['checked'])) {
+ print ' ';
+}
+if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_intra']['checked'])) {
+ print ' ';
+}
+if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_export']['checked'])) {
+ print ' ';
+}
+// Extra fields
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
+// Fields from hook
+$parameters = array('arrayfields'=>$arrayfields);
+$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+print $hookmanager->resPrint;
+// Date creation
+if (!empty($arrayfields['p.datec']['checked'])) {
+ print '';
+ print ' ';
+}
+// Date modification
+if (!empty($arrayfields['p.tms']['checked'])) {
+ print '';
+ print ' ';
+}
+if (!empty($arrayfields['p.tosell']['checked'])) {
+ print '';
+ print $form->selectarray('search_tosell', array('0'=>$langs->trans('ProductStatusNotOnSellShort'), '1'=>$langs->trans('ProductStatusOnSellShort')), $search_tosell, 1);
+ print ' ';
+}
+if (!empty($arrayfields['p.tobuy']['checked'])) {
+ print '';
+ print $form->selectarray('search_tobuy', array('0'=>$langs->trans('ProductStatusNotOnBuyShort'), '1'=>$langs->trans('ProductStatusOnBuyShort')), $search_tobuy, 1);
+ print ' ';
+}
+if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print '';
+ $searchpicto = $form->showFilterButtons();
+ print $searchpicto;
+ print ' ';
+}
+print ' ';
- if ($user->rights->{$rightskey}->supprimer) {
- $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
- }
- if ($user->rights->{$rightskey}->creer) {
- $arrayofmassactions['switchonsalestatus'] = img_picto('', 'stop-circle', 'class="pictofixedwidth"').$langs->trans("SwitchOnSaleStatus");
- $arrayofmassactions['switchonpurchasestatus'] = img_picto('', 'stop-circle', 'class="pictofixedwidth"').$langs->trans("SwitchOnPurchaseStatus");
- }
- if (isModEnabled('category') && $user->rights->{$rightskey}->creer) {
- $arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("AffectTag");
- }
- if (in_array($massaction, array('presend', 'predelete','preaffecttag', 'edit_extrafields'))) {
- $arrayofmassactions = array();
- }
- $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
+print '';
+if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
+}
+if (!empty($arrayfields['p.rowid']['checked'])) {
+ print_liste_field_titre($arrayfields['p.rowid']['label'], $_SERVER["PHP_SELF"], "p.rowid", "", $param, "", $sortfield, $sortorder);
+}
+if (!empty($arrayfields['p.ref']['checked'])) {
+ print_liste_field_titre($arrayfields['p.ref']['label'], $_SERVER["PHP_SELF"], "p.ref", "", $param, "", $sortfield, $sortorder);
+}
+if (!empty($arrayfields['pfp.ref_fourn']['checked'])) {
+ print_liste_field_titre($arrayfields['pfp.ref_fourn']['label'], $_SERVER["PHP_SELF"], "pfp.ref_fourn", "", $param, "", $sortfield, $sortorder);
+}
+if (!empty($arrayfields['thumbnail']['checked'])) {
+ print_liste_field_titre($arrayfields['thumbnail']['label'], $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.label']['checked'])) {
+ print_liste_field_titre($arrayfields['p.label']['label'], $_SERVER["PHP_SELF"], "p.label", "", $param, "", $sortfield, $sortorder);
+}
+if (!empty($arrayfields['p.fk_product_type']['checked'])) {
+ print_liste_field_titre($arrayfields['p.fk_product_type']['label'], $_SERVER["PHP_SELF"], "p.fk_product_type", "", $param, "", $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.barcode']['checked'])) {
+ print_liste_field_titre($arrayfields['p.barcode']['label'], $_SERVER["PHP_SELF"], "p.barcode", "", $param, "", $sortfield, $sortorder);
+}
+if (!empty($arrayfields['p.duration']['checked'])) {
+ print_liste_field_titre($arrayfields['p.duration']['label'], $_SERVER["PHP_SELF"], "p.duration", "", $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.finished']['checked'])) {
+ print_liste_field_titre($arrayfields['p.finished']['label'], $_SERVER["PHP_SELF"], "p.finished", "", $param, '', $sortfield, $sortorder, 'center ');
+}
- $newcardbutton = '';
- if ($type === "") {
- $perm = ($user->rights->produit->creer || $user->rights->service->creer);
- } elseif ($type == Product::TYPE_SERVICE) {
- $perm = $user->rights->service->creer;
- } elseif ($type == Product::TYPE_PRODUCT) {
- $perm = $user->rights->produit->creer;
- }
- $oldtype = $type;
- $params = array();
- if ($type === "") {
- $params['forcenohideoftext'] = 1;
- }
- if ($type === "") {
- $newcardbutton .= dolGetButtonTitle($langs->trans('NewProduct'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/product/card.php?action=create&type=0', '', $perm, $params);
- $type = Product::TYPE_SERVICE;
- }
- $label = 'NewProduct';
- if ($type == Product::TYPE_SERVICE) {
- $label = 'NewService';
- }
- $newcardbutton .= dolGetButtonTitle($langs->trans($label), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/product/card.php?action=create&type='.$type, '', $perm, $params);
+if (!empty($arrayfields['p.weight']['checked'])) {
+ print_liste_field_titre($arrayfields['p.weight']['label'], $_SERVER['PHP_SELF'], 'p.weight', '', $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.weight_units']['checked'])) {
+ print_liste_field_titre($arrayfields['p.weight_units']['label'], $_SERVER['PHP_SELF'], 'p.weight_units', '', $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.length']['checked'])) {
+ print_liste_field_titre($arrayfields['p.length']['label'], $_SERVER['PHP_SELF'], 'p.length', '', $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.length_units']['checked'])) {
+ print_liste_field_titre($arrayfields['p.length_units']['label'], $_SERVER['PHP_SELF'], 'p.length_units', '', $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.width']['checked'])) {
+ print_liste_field_titre($arrayfields['p.width']['label'], $_SERVER['PHP_SELF'], 'p.width', '', $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.width_units']['checked'])) {
+ print_liste_field_titre($arrayfields['p.width_units']['label'], $_SERVER['PHP_SELF'], 'p.width_units', '', $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.height']['checked'])) {
+ print_liste_field_titre($arrayfields['p.height']['label'], $_SERVER['PHP_SELF'], 'p.height', '', $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.height_units']['checked'])) {
+ print_liste_field_titre($arrayfields['p.height_units']['label'], $_SERVER['PHP_SELF'], 'p.height_units', '', $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.surface']['checked'])) {
+ print_liste_field_titre($arrayfields['p.surface']['label'], $_SERVER['PHP_SELF'], "p.surface", '', $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.surface_units']['checked'])) {
+ print_liste_field_titre($arrayfields['p.surface_units']['label'], $_SERVER['PHP_SELF'], 'p.surface_units', '', $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.volume']['checked'])) {
+ print_liste_field_titre($arrayfields['p.volume']['label'], $_SERVER['PHP_SELF'], 'p.volume', '', $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.volume_units']['checked'])) {
+ print_liste_field_titre($arrayfields['p.volume_units']['label'], $_SERVER['PHP_SELF'], 'p.volume_units', '', $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['cu.label']['checked'])) {
+ print_liste_field_titre($arrayfields['cu.label']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.sellprice']['checked'])) {
+ print_liste_field_titre($arrayfields['p.sellprice']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right ');
+}
- $type = $oldtype;
-
- print '';
- if ($optioncss != '') {
- print ' ';
- }
- print ' ';
- print ' ';
- print ' ';
- print ' ';
- print ' ';
- //print ' ';
- print ' ';
- if (empty($arrayfields['p.fk_product_type']['checked'])) {
- print ' ';
- }
-
- $picto = 'product';
- if ($type == 1) {
- $picto = 'service';
- }
-
- print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, $picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
-
- $topicmail = "Information";
- $modelmail = "product";
- $objecttmp = new Product($db);
- $trackid = 'prod'.$object->id;
- include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
-
- if (!empty($catid)) {
- print "";
- $c = new Categorie($db);
- $ways = $c->print_all_ways(' > ', 'product/list.php');
- print " > ".$ways[0]." \n";
- print "
";
- }
-
- if ($sall) {
- $setupstring = '';
- foreach ($fieldstosearchall as $key => $val) {
- $fieldstosearchall[$key] = $langs->trans($val);
- $setupstring .= $key."=".$val.";";
+// Multiprices
+if (!empty($conf->global->PRODUIT_MULTIPRICES)) {
+ foreach ($arraypricelevel as $key => $value) {
+ if (!empty($arrayfields['p.sellprice'.$key]['checked'])) {
+ print_liste_field_titre($arrayfields['p.sellprice'.$key]['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right ');
}
- print ''."\n";
- print ''.$langs->trans("FilterOnInto", $sall).join(', ', $fieldstosearchall).'
'."\n";
}
+}
- // Filter on categories
- $moreforfilter = '';
- if (isModEnabled('categorie') && $user->rights->categorie->lire) {
- $moreforfilter .= '';
- $moreforfilter .= img_picto($langs->trans('Categories'), 'category', 'class="pictofixedwidth"');
- $categoriesProductArr = $form->select_all_categories(Categorie::TYPE_PRODUCT, '', '', 64, 0, 1);
- $categoriesProductArr[-2] = '- '.$langs->trans('NotCategorized').' -';
- $moreforfilter .= Form::multiselectarray('search_category_product_list', $categoriesProductArr, $searchCategoryProductList, 0, 0, 'minwidth300');
- $moreforfilter .= ' '.$langs->trans('UseOrOperatorForCategories').' ';
- $moreforfilter .= '
';
+if (!empty($arrayfields['p.minbuyprice']['checked'])) {
+ print_liste_field_titre($arrayfields['p.minbuyprice']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right ');
+}
+if (!empty($arrayfields['p.numbuyprice']['checked'])) {
+ print_liste_field_titre($arrayfields['p.numbuyprice']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right ');
+}
+if (!empty($arrayfields['p.tva_tx']['checked'])) {
+ print_liste_field_titre($arrayfields['p.tva_tx']['label'], $_SERVER["PHP_SELF"], 'p.tva_tx', "", $param, '', $sortfield, $sortorder, 'right ');
+}
+if (!empty($arrayfields['p.pmp']['checked'])) {
+ print_liste_field_titre($arrayfields['p.pmp']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right ');
+}
+if (!empty($arrayfields['p.cost_price']['checked'])) {
+ print_liste_field_titre($arrayfields['p.cost_price']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right ');
+}
+if (!empty($arrayfields['p.seuil_stock_alerte']['checked'])) {
+ print_liste_field_titre($arrayfields['p.seuil_stock_alerte']['label'], $_SERVER["PHP_SELF"], "p.seuil_stock_alerte", "", $param, '', $sortfield, $sortorder, 'right ');
+}
+if (!empty($arrayfields['p.desiredstock']['checked'])) {
+ print_liste_field_titre($arrayfields['p.desiredstock']['label'], $_SERVER["PHP_SELF"], "p.desiredstock", "", $param, '', $sortfield, $sortorder, 'right ');
+}
+if (!empty($arrayfields['p.stock']['checked'])) {
+ print_liste_field_titre($arrayfields['p.stock']['label'], $_SERVER["PHP_SELF"], "p.stock", "", $param, '', $sortfield, $sortorder, 'right ');
+}
+if (!empty($arrayfields['stock_virtual']['checked'])) {
+ print_liste_field_titre($arrayfields['stock_virtual']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right ');
+}
+if (!empty($arrayfields['p.tobatch']['checked'])) {
+ print_liste_field_titre($arrayfields['p.tobatch']['label'], $_SERVER["PHP_SELF"], "p.tobatch", "", $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.fk_country']['checked'])) {
+ print_liste_field_titre($arrayfields['p.fk_country']['label'], $_SERVER["PHP_SELF"], "p.fk_country", "", $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields['p.fk_state']['checked'])) {
+ print_liste_field_titre($arrayfields['p.fk_state']['label'], $_SERVER["PHP_SELF"], "p.fk_state", "", $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell']['checked'])) {
+ print_liste_field_titre($arrayfields[$alias_product_perentity . '.accountancy_code_sell']['label'], $_SERVER["PHP_SELF"], $alias_product_perentity . ".accountancy_code_sell", "", $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_intra']['checked'])) {
+ print_liste_field_titre($arrayfields[$alias_product_perentity . '.accountancy_code_sell_intra']['label'], $_SERVER["PHP_SELF"], $alias_product_perentity . ".accountancy_code_sell_intra", "", $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_export']['checked'])) {
+ print_liste_field_titre($arrayfields[$alias_product_perentity . '.accountancy_code_sell_export']['label'], $_SERVER["PHP_SELF"], $alias_product_perentity . ".accountancy_code_sell_export", "", $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy']['checked'])) {
+ print_liste_field_titre($arrayfields[$alias_product_perentity . '.accountancy_code_buy']['label'], $_SERVER["PHP_SELF"], $alias_product_perentity . ".accountancy_code_buy", "", $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_intra']['checked'])) {
+ print_liste_field_titre($arrayfields[$alias_product_perentity . '.accountancy_code_buy_intra']['label'], $_SERVER["PHP_SELF"], $alias_product_perentity . ".accountancy_code_buy_intra", "", $param, '', $sortfield, $sortorder);
+}
+if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_export']['checked'])) {
+ print_liste_field_titre($arrayfields[$alias_product_perentity . '.accountancy_code_buy_export']['label'], $_SERVER["PHP_SELF"], $alias_product_perentity . ".accountancy_code_buy_export", "", $param, '', $sortfield, $sortorder);
+}
+// Extra fields
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
+// Hook fields
+$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
+$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+print $hookmanager->resPrint;
+if (!empty($arrayfields['p.datec']['checked'])) {
+ print_liste_field_titre($arrayfields['p.datec']['label'], $_SERVER["PHP_SELF"], "p.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
+}
+if (!empty($arrayfields['p.tms']['checked'])) {
+ print_liste_field_titre($arrayfields['p.tms']['label'], $_SERVER["PHP_SELF"], "p.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
+}
+if (!empty($arrayfields['p.tosell']['checked'])) {
+ print_liste_field_titre($arrayfields['p.tosell']['label'], $_SERVER["PHP_SELF"], "p.tosell", "", $param, '', $sortfield, $sortorder, 'center ');
+}
+if (!empty($arrayfields['p.tobuy']['checked'])) {
+ print_liste_field_titre($arrayfields['p.tobuy']['label'], $_SERVER["PHP_SELF"], "p.tobuy", "", $param, '', $sortfield, $sortorder, 'center ');
+}
+if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
+}
+print " \n";
+
+
+$product_static = new Product($db);
+$product_fourn = new ProductFournisseur($db);
+
+$i = 0;
+$totalarray = array();
+$totalarray['nbfield'] = 0;
+while ($i < min($num, $limit)) {
+ $obj = $db->fetch_object($resql);
+
+ // Multilangs
+ if (getDolGlobalInt('MAIN_MULTILANGS')) { // If multilang is enabled
+ $sql = "SELECT label";
+ $sql .= " FROM ".MAIN_DB_PREFIX."product_lang";
+ $sql .= " WHERE fk_product = ".((int) $obj->rowid);
+ $sql .= " AND lang = '".$db->escape($langs->getDefaultLang())."'";
+ $sql .= " LIMIT 1";
+
+ $result = $db->query($sql);
+ if ($result) {
+ $objtp = $db->fetch_object($result);
+ if (!empty($objtp->label)) {
+ $obj->label = $objtp->label;
+ }
+ }
}
-
- //Show/hide child products. Hidden by default
- if (isModEnabled('variants') && !empty($conf->global->PRODUIT_ATTRIBUTES_HIDECHILD)) {
- $moreforfilter .= '';
- $moreforfilter .= ' ';
- $moreforfilter .= ' '.$langs->trans('ShowChildProducts').' ';
- $moreforfilter .= '
';
- }
-
- $parameters = array();
- $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+ $parameters = array('staticdata' => $obj);
+ // Note that $action and $object may have been modified by hook
+ // do product_static fetch in hook if wanted or anything else
+ $reshook = $hookmanager->executeHooks('loadStaticObject', $parameters, $product_static, $action);
if (empty($reshook)) {
- $moreforfilter .= $hookmanager->resPrint;
- } else {
- $moreforfilter = $hookmanager->resPrint;
- }
-
- if ($moreforfilter) {
- print '';
- print $moreforfilter;
- print '
';
- }
-
- $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
-
- $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields
- if ($massactionbutton) {
- $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
- }
-
- print '';
- print '
'."\n";
-
- // Lines with input filters
- print '';
- if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
- print '';
- $searchpicto = $form->showFilterButtons('left');
- print $searchpicto;
- print ' ';
- }
- if (!empty($arrayfields['p.rowid']['checked'])) {
- print '';
- print ' ';
- print ' ';
- }
- if (!empty($arrayfields['p.ref']['checked'])) {
- print '';
- print ' ';
- print ' ';
- }
- if (!empty($arrayfields['pfp.ref_fourn']['checked'])) {
- print '';
- print ' ';
- print ' ';
- }
- // Thumbnail
- if (!empty($arrayfields['thumbnail']['checked'])) {
- print '';
- print ' ';
- }
- if (!empty($arrayfields['p.label']['checked'])) {
- print '';
- print ' ';
- print ' ';
- }
- // Type
- if (!empty($arrayfields['p.fk_product_type']['checked'])) {
- print '';
- $array = array('-1'=>' ', '0'=>$langs->trans('Product'), '1'=>$langs->trans('Service'));
- print $form->selectarray('search_type', $array, $search_type);
- print ' ';
- }
- // Barcode
- if (!empty($arrayfields['p.barcode']['checked'])) {
- print '';
- print ' ';
- print ' ';
- }
- // Duration
- if (!empty($arrayfields['p.duration']['checked'])) {
- print '';
- print ' ';
- }
-
- // Finished
- if (!empty($arrayfields['p.finished']['checked'])) {
- print '';
- print $formproduct->selectProductNature('search_finished', $search_finished);
- print ' ';
- }
- // Weight
- if (!empty($arrayfields['p.weight']['checked'])) {
- print '';
- print ' ';
- }
- // Weight units
- if (!empty($arrayfields['p.weight_units']['checked'])) {
- print '';
- print ' ';
- }
- // Length
- if (!empty($arrayfields['p.length']['checked'])) {
- print '';
- print ' ';
- }
- // Length units
- if (!empty($arrayfields['p.length_units']['checked'])) {
- print '';
- print ' ';
- }
- // Width
- if (!empty($arrayfields['p.width']['checked'])) {
- print '';
- print ' ';
- }
- // Width units
- if (!empty($arrayfields['p.width_units']['checked'])) {
- print '';
- print ' ';
- }
- // Height
- if (!empty($arrayfields['p.height']['checked'])) {
- print '';
- print ' ';
- }
- // Height units
- if (!empty($arrayfields['p.height_units']['checked'])) {
- print '';
- print ' ';
- }
- // Surface
- if (!empty($arrayfields['p.surface']['checked'])) {
- print '';
- print ' ';
- }
- // Surface units
- if (!empty($arrayfields['p.surface_units']['checked'])) {
- print '';
- print ' ';
- }
- // Volume
- if (!empty($arrayfields['p.volume']['checked'])) {
- print '';
- print ' ';
- }
- // Volume units
- if (!empty($arrayfields['p.volume_units']['checked'])) {
- print '';
- print ' ';
- }
-
- // Unit
- if (!empty($arrayfields['cu.label']['checked'])) {
- print '';
- print ' ';
- }
-
- // Sell price
- if (!empty($arrayfields['p.sellprice']['checked'])) {
- print '';
- print ' ';
- }
-
- // Multiprice
- if (!empty($conf->global->PRODUIT_MULTIPRICES)) {
- foreach ($arraypricelevel as $key => $value) {
- if (!empty($arrayfields['p.sellprice'.$key]['checked'])) {
- print '';
- print ' ';
- }
- }
- }
-
- // Minimum buying Price
- if (!empty($arrayfields['p.minbuyprice']['checked'])) {
- print '';
- print ' ';
- print ' ';
- }
- // Number buying Price
- if (!empty($arrayfields['p.numbuyprice']['checked'])) {
- print '';
- print ' ';
- print ' ';
- }
- // Sell price
- if (!empty($arrayfields['p.tva_tx']['checked'])) {
- print '';
- print ' ';
- print ' ';
- }
- // WAP
- if (!empty($arrayfields['p.pmp']['checked'])) {
- print '';
- print ' ';
- print ' ';
- }
- // cost_price
- if (!empty($arrayfields['p.cost_price']['checked'])) {
- print '';
- print ' ';
- print ' ';
- }
- // Limit for alert
- if (!empty($arrayfields['p.seuil_stock_alerte']['checked'])) {
- print '';
- print ' ';
- print ' ';
- }
- // Desired stock
- if (!empty($arrayfields['p.desiredstock']['checked'])) {
- print '';
- print ' ';
- print ' ';
- }
- // Stock
- if (!empty($arrayfields['p.stock']['checked'])) {
- print ' ';
- }
- // Stock
- if (!empty($arrayfields['stock_virtual']['checked'])) {
- print ' ';
- }
- // To batch
- if (!empty($arrayfields['p.tobatch']['checked'])) {
- print '';
- $statutarray = array(
- '-1' => '',
- '0' => $langs->trans("ProductStatusNotOnBatchShort"),
- '1' => $langs->trans("ProductStatusOnBatchShort"),
- '2' => $langs->trans("ProductStatusOnSerialShort")
- );
- print $form->selectarray('search_tobatch', $statutarray, $search_tobatch);
- print ' ';
- }
- // Country
- if (!empty($arrayfields['p.fk_country']['checked'])) {
- print '';
- print $form->select_country($search_country, 'search_country', '', 0);
- print ' ';
- }
- // State
- if (!empty($arrayfields['p.fk_state']['checked'])) {
- print '';
- print $formcompany->select_state($search_state, $search_country);
- print ' ';
- }
- // Accountancy code sell
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell']['checked'])) {
- print ' ';
- }
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_intra']['checked'])) {
- print ' ';
- }
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_export']['checked'])) {
- print ' ';
- }
- // Accountancy code buy
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy']['checked'])) {
- print ' ';
- }
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_intra']['checked'])) {
- print ' ';
- }
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_export']['checked'])) {
- print ' ';
- }
- // Extra fields
- include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
- // Fields from hook
- $parameters = array('arrayfields'=>$arrayfields);
- $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
- print $hookmanager->resPrint;
- // Date creation
- if (!empty($arrayfields['p.datec']['checked'])) {
- print '';
- print ' ';
- }
- // Date modification
- if (!empty($arrayfields['p.tms']['checked'])) {
- print '';
- print ' ';
- }
- if (!empty($arrayfields['p.tosell']['checked'])) {
- print '';
- print $form->selectarray('search_tosell', array('0'=>$langs->trans('ProductStatusNotOnSellShort'), '1'=>$langs->trans('ProductStatusOnSellShort')), $search_tosell, 1);
- print ' ';
- }
- if (!empty($arrayfields['p.tobuy']['checked'])) {
- print '';
- print $form->selectarray('search_tobuy', array('0'=>$langs->trans('ProductStatusNotOnBuyShort'), '1'=>$langs->trans('ProductStatusOnBuyShort')), $search_tobuy, 1);
- print ' ';
- }
- if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
- print '';
- $searchpicto = $form->showFilterButtons();
- print $searchpicto;
- print ' ';
- }
- print ' ';
-
- print '';
- if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
- print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
- }
- if (!empty($arrayfields['p.rowid']['checked'])) {
- print_liste_field_titre($arrayfields['p.rowid']['label'], $_SERVER["PHP_SELF"], "p.rowid", "", $param, "", $sortfield, $sortorder);
- }
- if (!empty($arrayfields['p.ref']['checked'])) {
- print_liste_field_titre($arrayfields['p.ref']['label'], $_SERVER["PHP_SELF"], "p.ref", "", $param, "", $sortfield, $sortorder);
- }
- if (!empty($arrayfields['pfp.ref_fourn']['checked'])) {
- print_liste_field_titre($arrayfields['pfp.ref_fourn']['label'], $_SERVER["PHP_SELF"], "pfp.ref_fourn", "", $param, "", $sortfield, $sortorder);
- }
- if (!empty($arrayfields['thumbnail']['checked'])) {
- print_liste_field_titre($arrayfields['thumbnail']['label'], $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.label']['checked'])) {
- print_liste_field_titre($arrayfields['p.label']['label'], $_SERVER["PHP_SELF"], "p.label", "", $param, "", $sortfield, $sortorder);
- }
- if (!empty($arrayfields['p.fk_product_type']['checked'])) {
- print_liste_field_titre($arrayfields['p.fk_product_type']['label'], $_SERVER["PHP_SELF"], "p.fk_product_type", "", $param, "", $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.barcode']['checked'])) {
- print_liste_field_titre($arrayfields['p.barcode']['label'], $_SERVER["PHP_SELF"], "p.barcode", "", $param, "", $sortfield, $sortorder);
- }
- if (!empty($arrayfields['p.duration']['checked'])) {
- print_liste_field_titre($arrayfields['p.duration']['label'], $_SERVER["PHP_SELF"], "p.duration", "", $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.finished']['checked'])) {
- print_liste_field_titre($arrayfields['p.finished']['label'], $_SERVER["PHP_SELF"], "p.finished", "", $param, '', $sortfield, $sortorder, 'center ');
- }
-
- if (!empty($arrayfields['p.weight']['checked'])) {
- print_liste_field_titre($arrayfields['p.weight']['label'], $_SERVER['PHP_SELF'], 'p.weight', '', $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.weight_units']['checked'])) {
- print_liste_field_titre($arrayfields['p.weight_units']['label'], $_SERVER['PHP_SELF'], 'p.weight_units', '', $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.length']['checked'])) {
- print_liste_field_titre($arrayfields['p.length']['label'], $_SERVER['PHP_SELF'], 'p.length', '', $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.length_units']['checked'])) {
- print_liste_field_titre($arrayfields['p.length_units']['label'], $_SERVER['PHP_SELF'], 'p.length_units', '', $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.width']['checked'])) {
- print_liste_field_titre($arrayfields['p.width']['label'], $_SERVER['PHP_SELF'], 'p.width', '', $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.width_units']['checked'])) {
- print_liste_field_titre($arrayfields['p.width_units']['label'], $_SERVER['PHP_SELF'], 'p.width_units', '', $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.height']['checked'])) {
- print_liste_field_titre($arrayfields['p.height']['label'], $_SERVER['PHP_SELF'], 'p.height', '', $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.height_units']['checked'])) {
- print_liste_field_titre($arrayfields['p.height_units']['label'], $_SERVER['PHP_SELF'], 'p.height_units', '', $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.surface']['checked'])) {
- print_liste_field_titre($arrayfields['p.surface']['label'], $_SERVER['PHP_SELF'], "p.surface", '', $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.surface_units']['checked'])) {
- print_liste_field_titre($arrayfields['p.surface_units']['label'], $_SERVER['PHP_SELF'], 'p.surface_units', '', $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.volume']['checked'])) {
- print_liste_field_titre($arrayfields['p.volume']['label'], $_SERVER['PHP_SELF'], 'p.volume', '', $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.volume_units']['checked'])) {
- print_liste_field_titre($arrayfields['p.volume_units']['label'], $_SERVER['PHP_SELF'], 'p.volume_units', '', $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['cu.label']['checked'])) {
- print_liste_field_titre($arrayfields['cu.label']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.sellprice']['checked'])) {
- print_liste_field_titre($arrayfields['p.sellprice']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right ');
- }
-
- // Multiprices
- if (!empty($conf->global->PRODUIT_MULTIPRICES)) {
- foreach ($arraypricelevel as $key => $value) {
- if (!empty($arrayfields['p.sellprice'.$key]['checked'])) {
- print_liste_field_titre($arrayfields['p.sellprice'.$key]['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right ');
- }
- }
- }
-
- if (!empty($arrayfields['p.minbuyprice']['checked'])) {
- print_liste_field_titre($arrayfields['p.minbuyprice']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right ');
- }
- if (!empty($arrayfields['p.numbuyprice']['checked'])) {
- print_liste_field_titre($arrayfields['p.numbuyprice']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right ');
- }
- if (!empty($arrayfields['p.tva_tx']['checked'])) {
- print_liste_field_titre($arrayfields['p.tva_tx']['label'], $_SERVER["PHP_SELF"], 'p.tva_tx', "", $param, '', $sortfield, $sortorder, 'right ');
- }
- if (!empty($arrayfields['p.pmp']['checked'])) {
- print_liste_field_titre($arrayfields['p.pmp']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right ');
- }
- if (!empty($arrayfields['p.cost_price']['checked'])) {
- print_liste_field_titre($arrayfields['p.cost_price']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right ');
- }
- if (!empty($arrayfields['p.seuil_stock_alerte']['checked'])) {
- print_liste_field_titre($arrayfields['p.seuil_stock_alerte']['label'], $_SERVER["PHP_SELF"], "p.seuil_stock_alerte", "", $param, '', $sortfield, $sortorder, 'right ');
- }
- if (!empty($arrayfields['p.desiredstock']['checked'])) {
- print_liste_field_titre($arrayfields['p.desiredstock']['label'], $_SERVER["PHP_SELF"], "p.desiredstock", "", $param, '', $sortfield, $sortorder, 'right ');
- }
- if (!empty($arrayfields['p.stock']['checked'])) {
- print_liste_field_titre($arrayfields['p.stock']['label'], $_SERVER["PHP_SELF"], "p.stock", "", $param, '', $sortfield, $sortorder, 'right ');
- }
- if (!empty($arrayfields['stock_virtual']['checked'])) {
- print_liste_field_titre($arrayfields['stock_virtual']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right ');
- }
- if (!empty($arrayfields['p.tobatch']['checked'])) {
- print_liste_field_titre($arrayfields['p.tobatch']['label'], $_SERVER["PHP_SELF"], "p.tobatch", "", $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.fk_country']['checked'])) {
- print_liste_field_titre($arrayfields['p.fk_country']['label'], $_SERVER["PHP_SELF"], "p.fk_country", "", $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields['p.fk_state']['checked'])) {
- print_liste_field_titre($arrayfields['p.fk_state']['label'], $_SERVER["PHP_SELF"], "p.fk_state", "", $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell']['checked'])) {
- print_liste_field_titre($arrayfields[$alias_product_perentity . '.accountancy_code_sell']['label'], $_SERVER["PHP_SELF"], $alias_product_perentity . ".accountancy_code_sell", "", $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_intra']['checked'])) {
- print_liste_field_titre($arrayfields[$alias_product_perentity . '.accountancy_code_sell_intra']['label'], $_SERVER["PHP_SELF"], $alias_product_perentity . ".accountancy_code_sell_intra", "", $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_export']['checked'])) {
- print_liste_field_titre($arrayfields[$alias_product_perentity . '.accountancy_code_sell_export']['label'], $_SERVER["PHP_SELF"], $alias_product_perentity . ".accountancy_code_sell_export", "", $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy']['checked'])) {
- print_liste_field_titre($arrayfields[$alias_product_perentity . '.accountancy_code_buy']['label'], $_SERVER["PHP_SELF"], $alias_product_perentity . ".accountancy_code_buy", "", $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_intra']['checked'])) {
- print_liste_field_titre($arrayfields[$alias_product_perentity . '.accountancy_code_buy_intra']['label'], $_SERVER["PHP_SELF"], $alias_product_perentity . ".accountancy_code_buy_intra", "", $param, '', $sortfield, $sortorder);
- }
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_export']['checked'])) {
- print_liste_field_titre($arrayfields[$alias_product_perentity . '.accountancy_code_buy_export']['label'], $_SERVER["PHP_SELF"], $alias_product_perentity . ".accountancy_code_buy_export", "", $param, '', $sortfield, $sortorder);
- }
- // Extra fields
- include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
- // Hook fields
- $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
- $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
- print $hookmanager->resPrint;
- if (!empty($arrayfields['p.datec']['checked'])) {
- print_liste_field_titre($arrayfields['p.datec']['label'], $_SERVER["PHP_SELF"], "p.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
- }
- if (!empty($arrayfields['p.tms']['checked'])) {
- print_liste_field_titre($arrayfields['p.tms']['label'], $_SERVER["PHP_SELF"], "p.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
- }
- if (!empty($arrayfields['p.tosell']['checked'])) {
- print_liste_field_titre($arrayfields['p.tosell']['label'], $_SERVER["PHP_SELF"], "p.tosell", "", $param, '', $sortfield, $sortorder, 'center ');
- }
- if (!empty($arrayfields['p.tobuy']['checked'])) {
- print_liste_field_titre($arrayfields['p.tobuy']['label'], $_SERVER["PHP_SELF"], "p.tobuy", "", $param, '', $sortfield, $sortorder, 'center ');
- }
- if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
- print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
- }
- print " \n";
-
-
- $product_static = new Product($db);
- $product_fourn = new ProductFournisseur($db);
-
- $i = 0;
- $totalarray = array();
- $totalarray['nbfield'] = 0;
- while ($i < min($num, $limit)) {
- $obj = $db->fetch_object($resql);
-
- // Multilangs
- if (getDolGlobalInt('MAIN_MULTILANGS')) { // If multilang is enabled
- $sql = "SELECT label";
- $sql .= " FROM ".MAIN_DB_PREFIX."product_lang";
- $sql .= " WHERE fk_product = ".((int) $obj->rowid);
- $sql .= " AND lang = '".$db->escape($langs->getDefaultLang())."'";
- $sql .= " LIMIT 1";
-
- $result = $db->query($sql);
- if ($result) {
- $objtp = $db->fetch_object($result);
- if (!empty($objtp->label)) {
- $obj->label = $objtp->label;
- }
- }
- }
-
$product_static->id = $obj->rowid;
$product_static->ref = $obj->ref;
$product_static->ref_fourn = empty($obj->ref_supplier) ? '' : $obj->ref_supplier; // deprecated
@@ -1333,7 +1358,7 @@ if ($resql) {
$product_static->finished = $obj->finished;
$product_static->type = $obj->fk_product_type;
$product_static->status_buy = $obj->tobuy;
- $product_static->status = $obj->tosell;
+ $product_static->status = $obj->tosell;
$product_static->status_batch = $obj->tobatch;
$product_static->entity = $obj->entity;
$product_static->pmp = $obj->pmp;
@@ -1361,7 +1386,7 @@ if ($resql) {
// STOCK_DISABLE_OPTIM_LOAD can be set to force load_stock whatever is permissions on stock.
if ((isModEnabled('stock') && $user->rights->stock->lire && $search_type != 1) || !empty($conf->global->STOCK_DISABLE_OPTIM_LOAD)) { // To optimize call of load_stock
- if ($obj->fk_product_type != 1 || !empty($conf->global->STOCK_SUPPORTS_SERVICES)) { // Not a service
+ if ($product_static->type != 1 || !empty($conf->global->STOCK_SUPPORTS_SERVICES)) { // Not a service
$option = 'nobatch';
if (empty($arrayfields['stock_virtual']['checked'])) {
$option .= ',novirtual';
@@ -1369,617 +1394,617 @@ if ($resql) {
$product_static->load_stock($option); // Load stock_reel + stock_warehouse. This can also call load_virtual_stock()
}
}
+ }
- $usercancreadprice = getDolGlobalString('MAIN_USE_ADVANCED_PERMS')?$user->hasRight('product', 'product_advance', 'read_prices'):$user->hasRight('product', 'lire');
- if ($product_static->isService()) {
- $usercancreadprice = getDolGlobalString('MAIN_USE_ADVANCED_PERMS')?$user->hasRight('service', 'service_advance', 'read_prices'):$user->hasRight('service', 'lire');
- }
+ $usercancreadprice = getDolGlobalString('MAIN_USE_ADVANCED_PERMS')?$user->hasRight('product', 'product_advance', 'read_prices'):$user->hasRight('product', 'lire');
+ if ($product_static->isService()) {
+ $usercancreadprice = getDolGlobalString('MAIN_USE_ADVANCED_PERMS')?$user->hasRight('service', 'service_advance', 'read_prices'):$user->hasRight('service', 'lire');
+ }
- print '';
+ print ' ';
- // Action column
- if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
- print '';
- if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
- $selected = 0;
- if (in_array($obj->rowid, $arrayofselected)) {
- $selected = 1;
- }
- print ' ';
+ // Action column
+ if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print ' ';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->rowid, $arrayofselected)) {
+ $selected = 1;
}
- print ' ';
- }
- // Ref
- if (!empty($arrayfields['p.rowid']['checked'])) {
- print '';
- print $product_static->id;
- print " \n";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Ref
- if (!empty($arrayfields['p.ref']['checked'])) {
- print '';
- print $product_static->getNomUrl(1);
- print " \n";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Ref supplier
- if (!empty($arrayfields['pfp.ref_fourn']['checked'])) {
- print '';
- print $product_static->getNomUrl(1);
- print " \n";
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Thumbnail
- if (!empty($arrayfields['thumbnail']['checked'])) {
- $product_thumbnail_html = '';
- if (!empty($product_static->entity)) {
- $product_thumbnail = $product_static->show_photos('product', $conf->product->multidir_output[$product_static->entity], 1, 1, 0, 0, 0, 80);
- if ($product_static->nbphoto > 0) {
- $product_thumbnail_html = $product_thumbnail;
- }
- }
-
- print '' . $product_thumbnail_html . ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Label
- if (!empty($arrayfields['p.label']['checked'])) {
- print ''.$obj->label.' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Type
- if (!empty($arrayfields['p.fk_product_type']['checked'])) {
- print '';
- $s = '';
- if ($obj->fk_product_type == 0) {
- $s .= img_picto($langs->trans("Product"), 'product', 'class="paddingleftonly paddingrightonly colorgrey"');
- } else {
- $s .= img_picto($langs->trans("Service"), 'service', 'class="paddingleftonly paddingrightonly colorgrey"');
- }
- print $s;
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Barcode
- if (!empty($arrayfields['p.barcode']['checked'])) {
- print ''.$obj->barcode.' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Duration
- if (!empty($arrayfields['p.duration']['checked'])) {
- print '';
-
- if (preg_match('/([^a-z]+)[a-z]$/i', $obj->duration)) {
- $duration_value = substr($obj->duration, 0, dol_strlen($obj->duration) - 1);
- $duration_unit = substr($obj->duration, -1);
-
- if ((float) $duration_value > 1) {
- $dur = array("i"=>$langs->trans("Minutes"), "h"=>$langs->trans("Hours"), "d"=>$langs->trans("Days"), "w"=>$langs->trans("Weeks"), "m"=>$langs->trans("Months"), "y"=>$langs->trans("Years"));
- } elseif ((float) $duration_value > 0) {
- $dur = array("i"=>$langs->trans("Minute"), "h"=>$langs->trans("Hour"), "d"=>$langs->trans("Day"), "w"=>$langs->trans("Week"), "m"=>$langs->trans("Month"), "y"=>$langs->trans("Year"));
- }
- print $duration_value;
- print ((!empty($duration_unit) && isset($dur[$duration_unit]) && $duration_value != '') ? ' '.$langs->trans($dur[$duration_unit]) : '');
- } elseif (!preg_match('/^[a-z]$/i', $obj->duration)) { // If duration is a simple char (like 's' of 'm'), we do not show value
- print $obj->duration;
- }
-
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Finished
- if (!empty($arrayfields['p.finished']['checked'])) {
- print '';
- print $product_static->getLibFinished();
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Weight
- if (!empty($arrayfields['p.weight']['checked'])) {
- print '';
- print $obj->weight;
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Weight units
- if (!empty($arrayfields['p.weight_units']['checked'])) {
- print '';
- if ($product_static->weight != '') {
- print measuringUnitString(0, 'weight', $product_static->weight_units);
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Length
- if (!empty($arrayfields['p.length']['checked'])) {
- print '';
- print $obj->length;
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Length units
- if (!empty($arrayfields['p.length_units']['checked'])) {
- print '';
- if ($product_static->length != '') {
- print measuringUnitString(0, 'size', $product_static->length_units);
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Width
- if (!empty($arrayfields['p.width']['checked'])) {
- print '';
- print $obj->width;
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Width units
- if (!empty($arrayfields['p.width_units']['checked'])) {
- print '';
- if ($product_static->width != '') {
- print measuringUnitString(0, 'size', $product_static->width_units);
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Height
- if (!empty($arrayfields['p.height']['checked'])) {
- print '';
- print $obj->height;
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Height units
- if (!empty($arrayfields['p.height_units']['checked'])) {
- print '';
- if ($product_static->height != '') {
- print measuringUnitString(0, 'size', $product_static->height_units);
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Surface
- if (!empty($arrayfields['p.surface']['checked'])) {
- print '';
- print $obj->surface;
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Surface units
- if (!empty($arrayfields['p.surface_units']['checked'])) {
- print '';
- if ($product_static->surface != '') {
- print measuringUnitString(0, 'surface', $product_static->surface_units);
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Volume
- if (!empty($arrayfields['p.volume']['checked'])) {
- print '';
- print $obj->volume;
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Volume units
- if (!empty($arrayfields['p.volume_units']['checked'])) {
- print '';
- if ($product_static->volume != '') {
- print measuringUnitString(0, 'volume', $product_static->volume_units);
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Unit
- if (!empty($arrayfields['cu.label']['checked'])) {
- print '';
- if (!empty($obj->cu_label)) {
- print $langs->trans($obj->cu_label);
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Sell price
- if (!empty($arrayfields['p.sellprice']['checked'])) {
- print '';
- if ($obj->tosell && $usercancreadprice) {
- if ($obj->price_base_type == 'TTC') {
- print ''.price($obj->price_ttc).' '.$langs->trans("TTC").' ';
- } else {
- print ''.price($obj->price).' '.$langs->trans("HT").' ';
- }
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
-
- // Multiprices
- if (!empty($conf->global->PRODUIT_MULTIPRICES)) {
- if (! isset($productpricescache)) {
- $productpricescache=array();
- }
- if (! isset($productpricescache[$obj->rowid])) {
- $productpricescache[$obj->rowid] = array();
- }
-
- if ($obj->tosell && $usercancreadprice) {
- // Make 1 request for all price levels (without filter on price_level) and saved result into an cache array
- // then reuse the cache array if we need prices for other price levels
- $sqlp = "SELECT p.rowid, p.fk_product, p.price, p.price_ttc, p.price_level, p.date_price, p.price_base_type";
- $sqlp .= " FROM ".MAIN_DB_PREFIX."product_price as p";
- $sqlp .= " WHERE fk_product = ".((int) $obj->rowid);
- $sqlp .= " ORDER BY p.date_price DESC, p.rowid DESC, p.price_level ASC";
- $resultp = $db->query($sqlp);
- if ($resultp) {
- $nump = $db->num_rows($resultp);
- $j = 0;
- while ($j < $nump) {
- $objp = $db->fetch_object($resultp);
-
- if (empty($productpricescache[$obj->rowid][$objp->price_level])) {
- $productpricescache[$obj->rowid][$objp->price_level]['price'] = $objp->price;
- $productpricescache[$obj->rowid][$objp->price_level]['price_ttc'] = $objp->price_ttc;
- $productpricescache[$obj->rowid][$objp->price_level]['price_base_type'] = $objp->price_base_type;
- }
-
- $j++;
- }
-
- $db->free($resultp);
- } else {
- dol_print_error($db);
- }
- }
-
- foreach ($arraypricelevel as $key => $value) {
- if (!empty($arrayfields['p.sellprice'.$key]['checked'])) {
- print '';
- if (!empty($productpricescache[$obj->rowid])) {
- if ($productpricescache[$obj->rowid][$key]['price_base_type'] == 'TTC') {
- print ''.price($productpricescache[$obj->rowid][$key]['price_ttc']).' '.$langs->trans("TTC").' ';
- } else {
- print ''.price($productpricescache[$obj->rowid][$key]['price']).' '.$langs->trans("HT").' ';
- }
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- }
- }
-
- // Better buy price
- if (!empty($arrayfields['p.minbuyprice']['checked'])) {
- print '';
- if ($obj->tobuy && $obj->minsellprice != '' && $usercancreadprice) {
- //print price($obj->minsellprice).' '.$langs->trans("HT");
- if ($product_fourn->find_min_price_product_fournisseur($obj->rowid) > 0) {
- if ($product_fourn->product_fourn_price_id > 0) {
- if ((isModEnabled("fournisseur") && !empty($user->rights->fournisseur->lire) && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || (isModEnabled("supplier_order") && !empty($user->rights->supplier_order->lire)) || (isModEnabled("supplier_invoice") && !empty($user->rights->supplier_invoice->lire))) {
- $htmltext = $product_fourn->display_price_product_fournisseur(1, 1, 0, 1);
- print ''.$form->textwithpicto(price($product_fourn->fourn_unitprice * (1 - $product_fourn->fourn_remise_percent / 100) - $product_fourn->fourn_remise).' '.$langs->trans("HT"), $htmltext).' ';
- } else {
- print ''.price($product_fourn->fourn_unitprice).' '.$langs->trans("HT").' ';
- }
- }
- }
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Number of buy prices
- if (!empty($arrayfields['p.numbuyprice']['checked'])) {
- print '';
- if ($obj->tobuy && $usercancreadprice) {
- if (count($productFournList = $product_fourn->list_product_fournisseur_price($obj->rowid)) > 0) {
- $htmltext = $product_fourn->display_price_product_fournisseur(1, 1, 0, 1, $productFournList);
- print $form->textwithpicto(count($productFournList), $htmltext);
- }
- }
- print ' ';
- }
-
- // VAT or Sell Tax Rate
- if (!empty($arrayfields['p.tva_tx']['checked'])) {
- print '';
- print vatrate($obj->tva_tx, true);
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // WAP
- if (!empty($arrayfields['p.pmp']['checked'])) {
- print '';
- if ($usercancreadprice) {
- print ''.price($product_static->pmp, 1, $langs)." ";
- }
- print ' ';
- }
- // Cost price
- if (!empty($arrayfields['p.cost_price']['checked'])) {
- print '';
- //print $obj->cost_price;
- if ($usercancreadprice) {
- print ''.price($obj->cost_price).' '.$langs->trans("HT").' ';
- }
- print ' ';
- }
-
- // Limit alert
- if (!empty($arrayfields['p.seuil_stock_alerte']['checked'])) {
- print '';
- if ($obj->fk_product_type != 1) {
- print $obj->seuil_stock_alerte;
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Desired stock
- if (!empty($arrayfields['p.desiredstock']['checked'])) {
- print '';
- if ($obj->fk_product_type != 1) {
- print $obj->desiredstock;
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Stock real
- if (!empty($arrayfields['p.stock']['checked'])) {
- print '';
- if ($obj->fk_product_type != 1) {
- if ($obj->seuil_stock_alerte != '' && $product_static->stock_reel < (float) $obj->seuil_stock_alerte) {
- print img_warning($langs->trans("StockLowerThanLimit", $obj->seuil_stock_alerte)).' ';
- }
- if ($usercancreadprice) {
- print price(price2num($product_static->stock_reel, 'MS'));
- }
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Stock virtual
- if (!empty($arrayfields['stock_virtual']['checked'])) {
- print '';
- if ($obj->fk_product_type != 1) {
- if ($obj->seuil_stock_alerte != '' && $product_static->stock_theorique < (float) $obj->seuil_stock_alerte) {
- print img_warning($langs->trans("StockLowerThanLimit", $obj->seuil_stock_alerte)).' ';
- }
- if ($usercancreadprice) {
- print price(price2num($product_static->stock_theorique, 'MS'));
- }
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Lot/Serial
- if (!empty($arrayfields['p.tobatch']['checked'])) {
- print '';
- print $product_static->getLibStatut(1, 2);
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Country
- if (!empty($arrayfields['p.fk_country']['checked'])) {
- print ''.getCountry($obj->fk_country, 0, $db).' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // State
- if (!empty($arrayfields['p.fk_state']['checked'])) {
- print '';
- if (!empty($obj->fk_state)) {
- print getState($obj->fk_state, 0, $db);
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Accountancy code sell
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell']['checked'])) {
- print ''.$obj->accountancy_code_sell.' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_intra']['checked'])) {
- print ''.$obj->accountancy_code_sell_intra.' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_export']['checked'])) {
- print ''.$obj->accountancy_code_sell_export.' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Accountancy code buy
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy']['checked'])) {
- print ''.$obj->accountancy_code_buy.' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_intra']['checked'])) {
- print ''.$obj->accountancy_code_buy_intra.' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_export']['checked'])) {
- print ''.$obj->accountancy_code_buy_export.' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Extra fields
- include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
- // Fields from hook
- $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
- $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
- print $hookmanager->resPrint;
- // Date creation
- if (!empty($arrayfields['p.datec']['checked'])) {
- print '';
- print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Date modification
- if (!empty($arrayfields['p.tms']['checked'])) {
- print '';
- print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser');
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Status (to sell)
- if (!empty($arrayfields['p.tosell']['checked'])) {
- print '';
- if (!empty($conf->use_javascript_ajax) && $user->rights->produit->creer && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) {
- print ajax_object_onoff($product_static, 'status', 'tosell', 'ProductStatusOnSell', 'ProductStatusNotOnSell');
- } else {
- print $product_static->LibStatut($obj->tosell, 5, 0);
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
- // Status (to buy)
- if (!empty($arrayfields['p.tobuy']['checked'])) {
- print '';
- if (!empty($conf->use_javascript_ajax) && $user->rights->produit->creer && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) {
- print ajax_object_onoff($product_static, 'status_buy', 'tobuy', 'ProductStatusOnBuy', 'ProductStatusNotOnBuy');
- } else {
- print $product_static->LibStatut($obj->tobuy, 5, 1);
- }
- print ' ';
- if (!$i) {
- $totalarray['nbfield']++;
- }
- }
-
- // Action column
- if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
- print '';
- if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
- $selected = 0;
- if (in_array($obj->rowid, $arrayofselected)) {
- $selected = 1;
- }
- print ' ';
- }
- print ' ';
+ print ' ';
}
+ print '';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Ref
+ if (!empty($arrayfields['p.rowid']['checked'])) {
+ print '';
+ print $product_static->id;
+ print " \n";
if (!$i) {
$totalarray['nbfield']++;
}
-
- print " \n";
- $i++;
}
- $db->free($resql);
+ // Ref
+ if (!empty($arrayfields['p.ref']['checked'])) {
+ print '';
+ print $product_static->getNomUrl(1);
+ print " \n";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
- // If no record found
- if ($num == 0) {
- $colspan = 1;
- foreach ($arrayfields as $key => $val) {
- if (!empty($val['checked'])) {
- $colspan++;
+ // Ref supplier
+ if (!empty($arrayfields['pfp.ref_fourn']['checked'])) {
+ print '';
+ print $product_static->getNomUrl(1);
+ print " \n";
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Thumbnail
+ if (!empty($arrayfields['thumbnail']['checked'])) {
+ $product_thumbnail_html = '';
+ if (!empty($product_static->entity)) {
+ $product_thumbnail = $product_static->show_photos('product', $conf->product->multidir_output[$product_static->entity], 1, 1, 0, 0, 0, 80);
+ if ($product_static->nbphoto > 0) {
+ $product_thumbnail_html = $product_thumbnail;
}
}
- print ''.$langs->trans("NoRecordFound").' ';
+
+ print '' . $product_thumbnail_html . ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
}
- print "
";
- print "
";
- print '';
-} else {
- dol_print_error($db);
+ // Label
+ if (!empty($arrayfields['p.label']['checked'])) {
+ print ''.$product_static->label.' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Type
+ if (!empty($arrayfields['p.fk_product_type']['checked'])) {
+ print '';
+ $s = '';
+ if ($product_static->type == 0) {
+ $s .= img_picto($langs->trans("Product"), 'product', 'class="paddingleftonly paddingrightonly colorgrey"');
+ } else {
+ $s .= img_picto($langs->trans("Service"), 'service', 'class="paddingleftonly paddingrightonly colorgrey"');
+ }
+ print $s;
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Barcode
+ if (!empty($arrayfields['p.barcode']['checked'])) {
+ print ''.$product_static->barcode.' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Duration
+ if (!empty($arrayfields['p.duration']['checked'])) {
+ print '';
+
+ if (preg_match('/([^a-z]+)[a-z]$/i', $obj->duration)) {
+ $duration_value = substr($obj->duration, 0, dol_strlen($obj->duration) - 1);
+ $duration_unit = substr($obj->duration, -1);
+
+ if ((float) $duration_value > 1) {
+ $dur = array("i"=>$langs->trans("Minutes"), "h"=>$langs->trans("Hours"), "d"=>$langs->trans("Days"), "w"=>$langs->trans("Weeks"), "m"=>$langs->trans("Months"), "y"=>$langs->trans("Years"));
+ } elseif ((float) $duration_value > 0) {
+ $dur = array("i"=>$langs->trans("Minute"), "h"=>$langs->trans("Hour"), "d"=>$langs->trans("Day"), "w"=>$langs->trans("Week"), "m"=>$langs->trans("Month"), "y"=>$langs->trans("Year"));
+ }
+ print $duration_value;
+ print ((!empty($duration_unit) && isset($dur[$duration_unit]) && $duration_value != '') ? ' '.$langs->trans($dur[$duration_unit]) : '');
+ } elseif (!preg_match('/^[a-z]$/i', $obj->duration)) { // If duration is a simple char (like 's' of 'm'), we do not show value
+ print $obj->duration;
+ }
+
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Finished
+ if (!empty($arrayfields['p.finished']['checked'])) {
+ print '';
+ print $product_static->getLibFinished();
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Weight
+ if (!empty($arrayfields['p.weight']['checked'])) {
+ print '';
+ print $product_static->weight;
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Weight units
+ if (!empty($arrayfields['p.weight_units']['checked'])) {
+ print '';
+ if ($product_static->weight != '') {
+ print measuringUnitString(0, 'weight', $product_static->weight_units);
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Length
+ if (!empty($arrayfields['p.length']['checked'])) {
+ print '';
+ print $product_static->length;
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Length units
+ if (!empty($arrayfields['p.length_units']['checked'])) {
+ print '';
+ if ($product_static->length != '') {
+ print measuringUnitString(0, 'size', $product_static->length_units);
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Width
+ if (!empty($arrayfields['p.width']['checked'])) {
+ print '';
+ print $product_static->width;
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Width units
+ if (!empty($arrayfields['p.width_units']['checked'])) {
+ print '';
+ if ($product_static->width != '') {
+ print measuringUnitString(0, 'size', $product_static->width_units);
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Height
+ if (!empty($arrayfields['p.height']['checked'])) {
+ print '';
+ print $product_static->height;
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Height units
+ if (!empty($arrayfields['p.height_units']['checked'])) {
+ print '';
+ if ($product_static->height != '') {
+ print measuringUnitString(0, 'size', $product_static->height_units);
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Surface
+ if (!empty($arrayfields['p.surface']['checked'])) {
+ print '';
+ print $product_static->surface;
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Surface units
+ if (!empty($arrayfields['p.surface_units']['checked'])) {
+ print '';
+ if ($product_static->surface != '') {
+ print measuringUnitString(0, 'surface', $product_static->surface_units);
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Volume
+ if (!empty($arrayfields['p.volume']['checked'])) {
+ print '';
+ print $product_static->volume;
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Volume units
+ if (!empty($arrayfields['p.volume_units']['checked'])) {
+ print '';
+ if ($product_static->volume != '') {
+ print measuringUnitString(0, 'volume', $product_static->volume_units);
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Unit
+ if (!empty($arrayfields['cu.label']['checked'])) {
+ print '';
+ if (!empty($obj->cu_label)) {
+ print $langs->trans($obj->cu_label);
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Sell price
+ if (!empty($arrayfields['p.sellprice']['checked'])) {
+ print '';
+ if ($product_static->status && $usercancreadprice) {
+ if ($obj->price_base_type == 'TTC') {
+ print ''.price($obj->price_ttc).' '.$langs->trans("TTC").' ';
+ } else {
+ print ''.price($obj->price).' '.$langs->trans("HT").' ';
+ }
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+
+ // Multiprices
+ if (!empty($conf->global->PRODUIT_MULTIPRICES)) {
+ if (! isset($productpricescache)) {
+ $productpricescache=array();
+ }
+ if (! isset($productpricescache[$obj->rowid])) {
+ $productpricescache[$obj->rowid] = array();
+ }
+
+ if ($product_static->status && $usercancreadprice) {
+ // Make 1 request for all price levels (without filter on price_level) and saved result into an cache array
+ // then reuse the cache array if we need prices for other price levels
+ $sqlp = "SELECT p.rowid, p.fk_product, p.price, p.price_ttc, p.price_level, p.date_price, p.price_base_type";
+ $sqlp .= " FROM ".MAIN_DB_PREFIX."product_price as p";
+ $sqlp .= " WHERE fk_product = ".((int) $obj->rowid);
+ $sqlp .= " ORDER BY p.date_price DESC, p.rowid DESC, p.price_level ASC";
+ $resultp = $db->query($sqlp);
+ if ($resultp) {
+ $nump = $db->num_rows($resultp);
+ $j = 0;
+ while ($j < $nump) {
+ $objp = $db->fetch_object($resultp);
+
+ if (empty($productpricescache[$obj->rowid][$objp->price_level])) {
+ $productpricescache[$obj->rowid][$objp->price_level]['price'] = $objp->price;
+ $productpricescache[$obj->rowid][$objp->price_level]['price_ttc'] = $objp->price_ttc;
+ $productpricescache[$obj->rowid][$objp->price_level]['price_base_type'] = $objp->price_base_type;
+ }
+
+ $j++;
+ }
+
+ $db->free($resultp);
+ } else {
+ dol_print_error($db);
+ }
+ }
+
+ foreach ($arraypricelevel as $key => $value) {
+ if (!empty($arrayfields['p.sellprice'.$key]['checked'])) {
+ print '';
+ if (!empty($productpricescache[$obj->rowid])) {
+ if ($productpricescache[$obj->rowid][$key]['price_base_type'] == 'TTC') {
+ print ''.price($productpricescache[$obj->rowid][$key]['price_ttc']).' '.$langs->trans("TTC").' ';
+ } else {
+ print ''.price($productpricescache[$obj->rowid][$key]['price']).' '.$langs->trans("HT").' ';
+ }
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ }
+ }
+
+ // Better buy price
+ if (!empty($arrayfields['p.minbuyprice']['checked'])) {
+ print '';
+ if ($product_static->status_buy && $obj->bestpurchaseprice != '' && $usercancreadprice) {
+ if ($product_fourn->find_min_price_product_fournisseur($obj->rowid) > 0) {
+ if ($product_fourn->product_fourn_price_id > 0) {
+ if ((isModEnabled("fournisseur") && !empty($user->rights->fournisseur->lire) && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || (isModEnabled("supplier_order") && !empty($user->rights->supplier_order->lire)) || (isModEnabled("supplier_invoice") && !empty($user->rights->supplier_invoice->lire))) {
+ $htmltext = $product_fourn->display_price_product_fournisseur(1, 1, 0, 1);
+ print ''.$form->textwithpicto(price($product_fourn->fourn_unitprice * (1 - $product_fourn->fourn_remise_percent / 100) - $product_fourn->fourn_remise).' '.$langs->trans("HT"), $htmltext).' ';
+ } else {
+ print ''.price($product_fourn->fourn_unitprice).' '.$langs->trans("HT").' ';
+ }
+ }
+ }
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Number of buy prices
+ if (!empty($arrayfields['p.numbuyprice']['checked'])) {
+ print '';
+ if ($product_static->status_buy && $usercancreadprice) {
+ if (count($productFournList = $product_fourn->list_product_fournisseur_price($obj->rowid)) > 0) {
+ $htmltext = $product_fourn->display_price_product_fournisseur(1, 1, 0, 1, $productFournList);
+ print $form->textwithpicto(count($productFournList), $htmltext);
+ }
+ }
+ print ' ';
+ }
+
+ // VAT or Sell Tax Rate
+ if (!empty($arrayfields['p.tva_tx']['checked'])) {
+ print '';
+ print vatrate($obj->tva_tx, true);
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // WAP
+ if (!empty($arrayfields['p.pmp']['checked'])) {
+ print '';
+ if ($usercancreadprice) {
+ print ''.price($product_static->pmp, 1, $langs)." ";
+ }
+ print ' ';
+ }
+ // Cost price
+ if (!empty($arrayfields['p.cost_price']['checked'])) {
+ print '';
+ //print $obj->cost_price;
+ if ($usercancreadprice) {
+ print ''.price($obj->cost_price).' '.$langs->trans("HT").' ';
+ }
+ print ' ';
+ }
+
+ // Limit alert
+ if (!empty($arrayfields['p.seuil_stock_alerte']['checked'])) {
+ print '';
+ if ($product_static->type != 1) {
+ print $obj->seuil_stock_alerte;
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Desired stock
+ if (!empty($arrayfields['p.desiredstock']['checked'])) {
+ print '';
+ if ($product_static->type != 1) {
+ print $obj->desiredstock;
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Stock real
+ if (!empty($arrayfields['p.stock']['checked'])) {
+ print '';
+ if ($product_static->type != 1) {
+ if ($obj->seuil_stock_alerte != '' && $product_static->stock_reel < (float) $obj->seuil_stock_alerte) {
+ print img_warning($langs->trans("StockLowerThanLimit", $obj->seuil_stock_alerte)).' ';
+ }
+ if ($usercancreadprice) {
+ print price(price2num($product_static->stock_reel, 'MS'));
+ }
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Stock virtual
+ if (!empty($arrayfields['stock_virtual']['checked'])) {
+ print '';
+ if ($product_static->type != 1) {
+ if ($obj->seuil_stock_alerte != '' && $product_static->stock_theorique < (float) $obj->seuil_stock_alerte) {
+ print img_warning($langs->trans("StockLowerThanLimit", $obj->seuil_stock_alerte)).' ';
+ }
+ if ($usercancreadprice) {
+ print price(price2num($product_static->stock_theorique, 'MS'));
+ }
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Lot/Serial
+ if (!empty($arrayfields['p.tobatch']['checked'])) {
+ print '';
+ print $product_static->getLibStatut(1, 2);
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Country
+ if (!empty($arrayfields['p.fk_country']['checked'])) {
+ print ''.getCountry($obj->fk_country, 0, $db).' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // State
+ if (!empty($arrayfields['p.fk_state']['checked'])) {
+ print '';
+ if (!empty($obj->fk_state)) {
+ print getState($obj->fk_state, 0, $db);
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Accountancy code sell
+ if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell']['checked'])) {
+ print ''.$product_static->accountancy_code_sell.' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_intra']['checked'])) {
+ print ''.$product_static->accountancy_code_sell_intra.' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_sell_export']['checked'])) {
+ print ''.$product_static->accountancy_code_sell_export.' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Accountancy code buy
+ if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy']['checked'])) {
+ print ''.$product_static->accountancy_code_buy.' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_intra']['checked'])) {
+ print ''.$product_static->accountancy_code_buy_intra.' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ if (!empty($arrayfields[$alias_product_perentity . '.accountancy_code_buy_export']['checked'])) {
+ print ''.$product_static->accountancy_code_buy_export.' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Extra fields
+ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
+ // Fields from hook
+ $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
+ $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+ print $hookmanager->resPrint;
+ // Date creation
+ if (!empty($arrayfields['p.datec']['checked'])) {
+ print '';
+ print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Date modification
+ if (!empty($arrayfields['p.tms']['checked'])) {
+ print '';
+ print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser');
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Status (to sell)
+ if (!empty($arrayfields['p.tosell']['checked'])) {
+ print '';
+ if (!empty($conf->use_javascript_ajax) && $user->hasRight("produit", "creer") && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) {
+ print ajax_object_onoff($product_static, 'status', 'tosell', 'ProductStatusOnSell', 'ProductStatusNotOnSell');
+ } else {
+ print $product_static->LibStatut($product_static->status, 5, 0);
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+ // Status (to buy)
+ if (!empty($arrayfields['p.tobuy']['checked'])) {
+ print '';
+ if (!empty($conf->use_javascript_ajax) && $user->hasRight("produit", "creer") && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) {
+ print ajax_object_onoff($product_static, 'status_buy', 'tobuy', 'ProductStatusOnBuy', 'ProductStatusNotOnBuy');
+ } else {
+ print $product_static->LibStatut($product_static->status_buy, 5, 1);
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ // Action column
+ if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->rowid, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
+ }
+
+ print "\n";
+ $i++;
}
+$db->free($resql);
+
+// If no record found
+if ($num == 0) {
+ $colspan = 1;
+ foreach ($arrayfields as $key => $val) {
+ if (!empty($val['checked'])) {
+ $colspan++;
+ }
+ }
+ print ''.$langs->trans("NoRecordFound").' ';
+}
+
+print "
";
+print "
";
+print ' ';
+
// End of page
llxFooter();
$db->close();
diff --git a/htdocs/product/note.php b/htdocs/product/note.php
index 0d7ad91af5f..ba83e64c401 100644
--- a/htdocs/product/note.php
+++ b/htdocs/product/note.php
@@ -54,13 +54,13 @@ $permissionnote = $user->rights->produit->creer; // Used by the include of actio
if ($object->id > 0) {
if ($object->type == $object::TYPE_PRODUCT) {
- restrictedArea($user, 'produit', $object->id, 'product&product', '', '');
+ restrictedArea($user, 'product', $object->id, 'product&product', '', '');
}
if ($object->type == $object::TYPE_SERVICE) {
restrictedArea($user, 'service', $object->id, 'product&product', '', '');
}
} else {
- restrictedArea($user, 'produit|service', $fieldvalue, 'product&product', '', '', $fieldtype);
+ restrictedArea($user, 'product|service', $fieldvalue, 'product&product', '', '', $fieldtype);
}
diff --git a/htdocs/product/price.php b/htdocs/product/price.php
index aa9a34336b0..ca69f12170d 100644
--- a/htdocs/product/price.php
+++ b/htdocs/product/price.php
@@ -556,7 +556,7 @@ if (empty($reshook)) {
// Ajout / mise à jour
if ($rowid > 0) {
$sql = "UPDATE ".MAIN_DB_PREFIX."product_price_by_qty SET";
- $sql .= " price=".((float) $price)."',";
+ $sql .= " price=".((float) $price).",";
$sql .= " unitprice=".((float) $unitPrice).",";
$sql .= " quantity=".((float) $quantity).",";
$sql .= " remise_percent=".((float) $remise_percent).",";
@@ -1217,9 +1217,9 @@ if (!empty($conf->global->PRODUIT_MULTIPRICES) || !empty($conf->global->PRODUIT_
if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY) || !empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) { // TODO Fix the form inside tr instead of td
print ' '.$langs->trans("PriceByQuantity");
if ($object->prices_by_qty[0] == 0) {
- print ' ('.$langs->trans("Activate").')';
+ print ' ('.$langs->trans("Activate").')';
} else {
- print ' ('.$langs->trans("DisablePriceByQty").')';
+ print ' ('.$langs->trans("DisablePriceByQty").')';
}
print ' ';
@@ -2222,10 +2222,10 @@ if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) {
// Count total nb of records
$nbtotalofrecords = '';
if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
- $nbtotalofrecords = $prodcustprice->fetch_all($sortorder, $sortfield, 0, 0, $filter);
+ $nbtotalofrecords = $prodcustprice->fetchAll($sortorder, $sortfield, 0, 0, $filter);
}
- $result = $prodcustprice->fetch_all($sortorder, $sortfield, $conf->liste_limit, $offset, $filter);
+ $result = $prodcustprice->fetchAll($sortorder, $sortfield, $conf->liste_limit, $offset, $filter);
if ($result < 0) {
setEventMessages($prodcustprice->error, $prodcustprice->errors, 'errors');
}
@@ -2249,7 +2249,7 @@ if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) {
}
print ' ';
- print ' ';
+ print ' ';
print ' ';
// Print the search button
print '';
@@ -2261,7 +2261,7 @@ if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) {
print ' ';
print ''.$langs->trans("ThirdParty").' ';
- print '' . $langs->trans('RefCustomer') . ' ';
+ print ''.$langs->trans('RefCustomer').' ';
print ''.$langs->trans("AppliedPricesFrom").' ';
print ''.$langs->trans("PriceBase").' ';
print ''.$langs->trans("DefaultTaxRate").' ';
@@ -2298,6 +2298,8 @@ if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) {
print '' . $langs->trans('Default') . ' ';
print ''.$langs->trans($object->price_base_type)." ";
+
+ // VAT Rate
print '';
$positiverates = '';
@@ -2319,12 +2321,12 @@ if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) {
//print $object->default_vat_code?' ('.$object->default_vat_code.')':'';
print " ";
- print ''.price($object->price)." ";
+ print ''.price($object->price)." ";
- print ''.price($object->price_ttc)." ";
+ print ''.price($object->price_ttc)." ";
if ($mysoc->localtax1_assuj == "1" || $mysoc->localtax2_assuj == "1") {
//print '' . price($object->price_ttc) . " ";
- print ''.price($resultarray[2]).' ';
+ print ''.price($resultarray[2]).' ';
}
print ''.price($object->price_min).' ';
@@ -2376,6 +2378,7 @@ if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) {
print ''.dol_escape_htmltag($line->ref_customer).' ';
print "".dol_print_date($line->datec, "dayhour", 'tzuserrel')." ";
print ''.$langs->trans($line->price_base_type)." ";
+ // VAT Rate
print '';
$positiverates = '';
@@ -2395,12 +2398,13 @@ if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) {
echo vatrate($positiverates.($line->default_vat_code ? ' ('.$line->default_vat_code.')' : ''), '%', ($line->tva_npr ? $line->tva_npr : $line->recuperableonly));
print " ";
+
print ''.price($line->price)." ";
print ''.price($line->price_ttc)." ";
if ($mysoc->localtax1_assuj == "1" || $mysoc->localtax2_assuj == "1") {
//print '' . price($line->price_ttc) . " ";
- print ''.price($resultarray[2]).' ';
+ print ''.price($resultarray[2]).' ';
}
print ''.price($line->price_min).' ';
diff --git a/htdocs/product/reassort.php b/htdocs/product/reassort.php
index 0da084d1f39..c5b27a00c20 100644
--- a/htdocs/product/reassort.php
+++ b/htdocs/product/reassort.php
@@ -91,7 +91,7 @@ if (!empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT)
|| !empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE)
|| !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION)
|| !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION_CLOSE)
- || !empty($conf->mrp->enabled)) {
+ || isModEnabled('mrp')) {
$virtualdiffersfromphysical = 1; // According to increase/decrease stock options, virtual and physical stock may differs.
}
@@ -147,7 +147,7 @@ $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $obje
$sql .= $hookmanager->resPrint;
$sql .= ' FROM '.MAIN_DB_PREFIX.'product as p';
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product_stock as s ON p.rowid = s.fk_product';
-$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'entrepot as e ON s.fk_entrepot = e.rowid AND e.entity IN ('.getEntity('entrepot').')';
+$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'entrepot as e ON s.fk_entrepot = e.rowid AND e.entity IN ('.getEntity('stock').')';
if (!empty($conf->global->PRODUCT_USE_UNITS)) {
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_units as u on p.fk_unit = u.rowid';
}
diff --git a/htdocs/product/stats/bom.php b/htdocs/product/stats/bom.php
index 707549655e0..66e673567a6 100644
--- a/htdocs/product/stats/bom.php
+++ b/htdocs/product/stats/bom.php
@@ -259,12 +259,11 @@ if ($id > 0 || !empty($ref)) {
}
$db->free($result);
+ $option .= '&id='.$product->id;
+
if ($limit > 0 && $limit != $conf->liste_limit) {
$option .= '&limit='.urlencode($limit);
}
- if (!empty($id)) {
- $option .= '&id='.$product->id;
- }
if (!empty($search_month)) {
$option .= '&search_month='.urlencode($search_month);
}
diff --git a/htdocs/product/stats/card.php b/htdocs/product/stats/card.php
index d2f3e2358d9..b0d06f15701 100644
--- a/htdocs/product/stats/card.php
+++ b/htdocs/product/stats/card.php
@@ -375,7 +375,7 @@ if ($result || !($id > 0)) {
$morefilters = ' AND d.fk_product IN ('.$db->sanitize((is_array($listofprodids) && count($listofprodids)) ? join(',', $listofprodids) : '0').')';
}
if ($search_categ == -2) {
- $morefilters = ' AND d.fk_product NOT IN (SELECT cp.fk_product from '.MAIN_DB_PREFIX.'categorie_product as cp)';
+ $morefilters = ' AND NOT EXISTS (SELECT cp.fk_product FROM '.MAIN_DB_PREFIX.'categorie_product as cp WHERE d.fk_product = cp.fk_product)';
}
if ($key == 'propal') {
@@ -440,7 +440,7 @@ if ($result || !($id > 0)) {
continue;
}
- if ($graphfiles == 'propal' && !$user->rights->propale->lire) {
+ if ($graphfiles == 'propal' && !$user->rights->propal->lire) {
continue;
}
if ($graphfiles == 'order' && !$user->rights->commande->lire) {
diff --git a/htdocs/product/stats/commande.php b/htdocs/product/stats/commande.php
index f856b8a310f..5559eaf8413 100644
--- a/htdocs/product/stats/commande.php
+++ b/htdocs/product/stats/commande.php
@@ -140,6 +140,7 @@ if ($id > 0 || !empty($ref)) {
$sql = "SELECT DISTINCT s.nom as name, s.rowid as socid, s.code_client, c.rowid, d.total_ht as total_ht, c.ref,";
$sql .= " c.ref_client,";
$sql .= " c.date_commande, c.fk_statut as statut, c.facture, c.rowid as commandeid, d.rowid, d.qty";
+ $sql .= ", c.date_livraison";
if (empty($user->rights->societe->client->voir) && !$socid) {
$sql .= ", sc.fk_soc, sc.fk_user ";
}
@@ -184,12 +185,11 @@ if ($id > 0 || !empty($ref)) {
if ($result) {
$num = $db->num_rows($result);
+ $option = '&id='.$product->id;
+
if ($limit > 0 && $limit != $conf->liste_limit) {
$option .= '&limit='.urlencode($limit);
}
- if (!empty($id)) {
- $option .= '&id='.$product->id;
- }
if (!empty($search_month)) {
$option .= '&search_month='.urlencode($search_month);
}
@@ -232,6 +232,7 @@ if ($id > 0 || !empty($ref)) {
print_liste_field_titre("Company", $_SERVER["PHP_SELF"], "s.nom", "", $option, '', $sortfield, $sortorder);
print_liste_field_titre("CustomerCode", $_SERVER["PHP_SELF"], "s.code_client", "", $option, '', $sortfield, $sortorder);
print_liste_field_titre("OrderDate", $_SERVER["PHP_SELF"], "c.date_commande", "", $option, 'align="center"', $sortfield, $sortorder);
+ print_liste_field_titre('DateDeliveryPlanned', $_SERVER['PHP_SELF'], 'c.date_livraison', '', $option, 'align="center"', $sortfield, $sortorder);
print_liste_field_titre("Qty", $_SERVER["PHP_SELF"], "d.qty", "", $option, 'align="center"', $sortfield, $sortorder);
print_liste_field_titre("AmountHT", $_SERVER["PHP_SELF"], "c.total_ht", "", $option, 'align="right"', $sortfield, $sortorder);
print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "c.fk_statut", "", $option, 'align="right"', $sortfield, $sortorder);
@@ -257,6 +258,10 @@ if ($id > 0 || !empty($ref)) {
print "".$objp->code_client." \n";
print '';
print dol_print_date($db->jdate($objp->date_commande), 'dayhour')." ";
+ // delivery planned date
+ print '';
+ print dol_print_date($db->jdate($objp->date_livraison), 'dayhour');
+ print ' ';
print ''.$objp->qty." \n";
print ''.price($objp->total_ht)." \n";
print ''.$orderstatic->LibStatut($objp->statut, $objp->facture, 5).' ';
@@ -271,6 +276,8 @@ if ($id > 0 || !empty($ref)) {
print ''.$langs->trans("Totalforthispage").' ';
}
print ' ';
+ // delivery planned date
+ print ' ';
print ''.$total_qty.' ';
print ''.price($total_ht).' ';
print ' ';
diff --git a/htdocs/product/stats/commande_fournisseur.php b/htdocs/product/stats/commande_fournisseur.php
index 8a4957d574d..6ae1d7881ef 100644
--- a/htdocs/product/stats/commande_fournisseur.php
+++ b/htdocs/product/stats/commande_fournisseur.php
@@ -140,6 +140,7 @@ if ($id > 0 || !empty($ref)) {
$sql = "SELECT DISTINCT s.nom as name, s.rowid as socid, s.code_client,";
$sql .= " c.rowid, d.total_ht as total_ht, c.ref,";
$sql .= " c.date_commande, c.fk_statut as statut, c.rowid as commandeid, d.rowid, d.qty";
+ $sql .= ", c.date_livraison";
if (empty($user->rights->societe->client->voir) && !$socid) {
$sql .= ", sc.fk_soc, sc.fk_user ";
}
@@ -184,12 +185,11 @@ if ($id > 0 || !empty($ref)) {
if ($result) {
$num = $db->num_rows($result);
+ $option = '&id='.$product->id;
+
if ($limit > 0 && $limit != $conf->liste_limit) {
$option .= '&limit='.urlencode($limit);
}
- if (!empty($id)) {
- $option .= '&id='.$product->id;
- }
if (!empty($search_month)) {
$option .= '&search_month='.urlencode($search_month);
}
@@ -226,12 +226,13 @@ if ($id > 0 || !empty($ref)) {
$i = 0;
print '';
- print '
';
+ print '';
print '';
print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "c.rowid", "", $option, '', $sortfield, $sortorder);
print_liste_field_titre("Company", $_SERVER["PHP_SELF"], "s.nom", "", $option, '', $sortfield, $sortorder);
print_liste_field_titre("SupplierCode", $_SERVER["PHP_SELF"], "s.code_client", "", $option, '', $sortfield, $sortorder);
print_liste_field_titre("OrderDate", $_SERVER["PHP_SELF"], "c.date_commande", "", $option, 'align="center"', $sortfield, $sortorder);
+ print_liste_field_titre('DateDeliveryPlanned', $_SERVER['PHP_SELF'], 'c.date_livraison', '', $option, 'align="center"', $sortfield, $sortorder);
print_liste_field_titre("Qty", $_SERVER["PHP_SELF"], "d.qty", "", $option, 'align="center"', $sortfield, $sortorder);
print_liste_field_titre("AmountHT", $_SERVER["PHP_SELF"], "c.total_ht", "", $option, 'align="right"', $sortfield, $sortorder);
print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "c.fk_statut", "", $option, 'align="right"', $sortfield, $sortorder);
@@ -257,6 +258,10 @@ if ($id > 0 || !empty($ref)) {
print "".$objp->code_client." \n";
print '';
print dol_print_date($db->jdate($objp->date_commande), 'dayhour')." ";
+ // delivery planned date
+ print '';
+ print dol_print_date($db->jdate($objp->date_livraison), 'dayhour');
+ print ' ';
print ''.$objp->qty." \n";
print ''.price($objp->total_ht)." \n";
print ''.$supplierorderstatic->getLibStatut(4).' ';
@@ -271,6 +276,8 @@ if ($id > 0 || !empty($ref)) {
print ''.$langs->trans("Totalforthispage").' ';
}
print ' ';
+ // delivery planned date
+ print ' ';
print ''.$total_qty.' ';
print ''.price($total_ht).' ';
print ' ';
diff --git a/htdocs/product/stats/contrat.php b/htdocs/product/stats/contrat.php
index 196831a5466..bcf9c8c0737 100644
--- a/htdocs/product/stats/contrat.php
+++ b/htdocs/product/stats/contrat.php
@@ -170,12 +170,11 @@ if ($id > 0 || !empty($ref)) {
if ($result) {
$num = $db->num_rows($result);
+ $option = '&id='.$product->id;
+
if ($limit > 0 && $limit != $conf->liste_limit) {
$option .= '&limit='.urlencode($limit);
}
- if (!empty($id)) {
- $option .= '&id='.$product->id;
- }
if (!empty($search_month)) {
$option .= '&search_month='.urlencode($search_month);
}
diff --git a/htdocs/product/stats/facture.php b/htdocs/product/stats/facture.php
index 4ee1e4f95b2..3ff0b00d56a 100644
--- a/htdocs/product/stats/facture.php
+++ b/htdocs/product/stats/facture.php
@@ -201,12 +201,11 @@ if ($id > 0 || !empty($ref)) {
if ($result) {
$num = $db->num_rows($result);
+ $option .= '&id='.$product->id;
+
if ($limit > 0 && $limit != $conf->liste_limit) {
$option .= '&limit='.urlencode($limit);
}
- if (!empty($id)) {
- $option .= '&id='.$product->id;
- }
if (!empty($search_month)) {
$option .= '&search_month='.urlencode($search_month);
}
diff --git a/htdocs/product/stats/facture_fournisseur.php b/htdocs/product/stats/facture_fournisseur.php
index 6e5ed524ad9..20bb56a3c19 100644
--- a/htdocs/product/stats/facture_fournisseur.php
+++ b/htdocs/product/stats/facture_fournisseur.php
@@ -184,12 +184,11 @@ if ($id > 0 || !empty($ref)) {
if ($result) {
$num = $db->num_rows($result);
+ $option .= '&id='.$product->id;
+
if ($limit > 0 && $limit != $conf->liste_limit) {
$option .= '&limit='.urlencode($limit);
}
- if (!empty($id)) {
- $option .= '&id='.$product->id;
- }
if (!empty($search_month)) {
$option .= '&search_month='.urlencode($search_month);
}
diff --git a/htdocs/product/stats/facturerec.php b/htdocs/product/stats/facturerec.php
index 9415f2d6546..9b982407825 100644
--- a/htdocs/product/stats/facturerec.php
+++ b/htdocs/product/stats/facturerec.php
@@ -202,12 +202,11 @@ if ($id > 0 || !empty($ref)) {
if ($result) {
$num = $db->num_rows($result);
+ $option = '&id='.$product->id;
+
if ($limit > 0 && $limit != $conf->liste_limit) {
$option .= '&limit='.urlencode($limit);
}
- if (!empty($id)) {
- $option .= '&id='.$product->id;
- }
if (!empty($search_month)) {
$option .= '&search_month='.urlencode($search_month);
}
diff --git a/htdocs/product/stats/mo.php b/htdocs/product/stats/mo.php
index a4947db1085..085a6687f5c 100644
--- a/htdocs/product/stats/mo.php
+++ b/htdocs/product/stats/mo.php
@@ -163,12 +163,11 @@ if ($id > 0 || !empty($ref)) {
if ($result) {
$num = $db->num_rows($result);
+ $option = '&id='.$product->id;
+
if ($limit > 0 && $limit != $conf->liste_limit) {
$option .= '&limit='.urlencode($limit);
}
- if (!empty($id)) {
- $option .= '&id='.$product->id;
- }
if (!empty($search_month)) {
$option .= '&search_month='.urlencode($search_month);
}
diff --git a/htdocs/product/stats/propal.php b/htdocs/product/stats/propal.php
index 42467368b91..b70d2e08161 100644
--- a/htdocs/product/stats/propal.php
+++ b/htdocs/product/stats/propal.php
@@ -138,7 +138,7 @@ if ($id > 0 || !empty($ref)) {
print dol_get_fiche_end();
- if ($user->rights->propale->lire) {
+ if ($user->rights->propal->lire) {
$sql = "SELECT DISTINCT s.nom as name, s.rowid as socid, p.rowid as propalid, p.ref, d.total_ht as amount,";
$sql .= " p.ref_client,";
$sql .= "p.datep, p.fk_statut as statut, d.rowid, d.qty";
@@ -186,12 +186,11 @@ if ($id > 0 || !empty($ref)) {
if ($result) {
$num = $db->num_rows($result);
+ $option = '&id='.$product->id;
+
if ($limit > 0 && $limit != $conf->liste_limit) {
$option .= '&limit='.urlencode($limit);
}
- if (!empty($id)) {
- $option .= '&id='.$product->id;
- }
if (!empty($search_month)) {
$option .= '&search_month='.urlencode($search_month);
}
diff --git a/htdocs/product/stats/supplier_proposal.php b/htdocs/product/stats/supplier_proposal.php
index ff14c764af6..50b17b0ac06 100644
--- a/htdocs/product/stats/supplier_proposal.php
+++ b/htdocs/product/stats/supplier_proposal.php
@@ -137,7 +137,7 @@ if ($id > 0 || !empty($ref)) {
print dol_get_fiche_end();
- if ($user->rights->propale->lire) {
+ if ($user->rights->propal->lire) {
$sql = "SELECT DISTINCT s.nom as name, s.rowid as socid, p.rowid as propalid, p.ref, d.total_ht as amount,";
//$sql .= " p.ref_supplier,";
$sql .= "p.date_valid, p.fk_statut as statut, d.rowid, d.qty";
@@ -185,12 +185,11 @@ if ($id > 0 || !empty($ref)) {
if ($result) {
$num = $db->num_rows($result);
+ $option = '&id='.$product->id;
+
if ($limit > 0 && $limit != $conf->liste_limit) {
$option .= '&limit='.urlencode($limit);
}
- if (!empty($id)) {
- $option .= '&id='.$product->id;
- }
if (!empty($search_month)) {
$option .= '&search_month='.urlencode($search_month);
}
diff --git a/htdocs/product/stock/card.php b/htdocs/product/stock/card.php
index 095eaee313f..81fcb2db701 100644
--- a/htdocs/product/stock/card.php
+++ b/htdocs/product/stock/card.php
@@ -789,6 +789,7 @@ if ($action == 'create') {
print $langs->trans("CorrectStock");
print "";
}
+
if (!empty($conf->global->PRODUCT_USE_UNITS)) {
if ($i == 0) {
$units = $productstatic->fk_unit;
@@ -796,11 +797,13 @@ if ($action == 'create') {
$sameunits = false;
}
}
+
print " ";
$i++;
}
$db->free($resql);
+ // Total
print ''.$langs->trans("Total").' ';
print '';
$valtoshow = price2num($totalunit, 'MS');
@@ -818,9 +821,15 @@ if ($action == 'create') {
print ' ';
print ''.price(price2num($totalvaluesell, 'MT')).' ';
}
- print ' ';
- print ' ';
- print ' ';
+
+ if ($user->rights->stock->mouvement->creer) {
+ print ' ';
+ }
+
+ if ($user->rights->stock->creer) {
+ print ' ';
+ }
+
print ' ';
} else {
dol_print_error($db);
diff --git a/htdocs/product/stock/class/mouvementstock.class.php b/htdocs/product/stock/class/mouvementstock.class.php
index 31e66796a48..282f09e276e 100644
--- a/htdocs/product/stock/class/mouvementstock.class.php
+++ b/htdocs/product/stock/class/mouvementstock.class.php
@@ -977,10 +977,9 @@ class MouvementStock extends CommonObject
// Separate originetype with "@" : left part is class name, right part is module name
$origin_type_array = explode('@', $origin_type);
$classname = ucfirst($origin_type_array[0]);
- $modulename = empty($origin_type_array[1]) ? $classname : $origin_type_array[1];
+ $modulename = empty($origin_type_array[1]) ? strtolower($classname) : $origin_type_array[1];
$result = dol_include_once('/'.$modulename.'/class/'.strtolower($classname).'.class.php');
if ($result) {
- $classname = ucfirst($classname);
$origin = new $classname($this->db);
}
}
diff --git a/htdocs/product/stock/class/productlot.class.php b/htdocs/product/stock/class/productlot.class.php
index d2f21ac372e..7009d0d55fc 100644
--- a/htdocs/product/stock/class/productlot.class.php
+++ b/htdocs/product/stock/class/productlot.class.php
@@ -101,7 +101,7 @@ class Productlot extends CommonObject
'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>501),
'fk_user_creat' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserAuthor', 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>510, 'foreignkey'=>'llx_user.rowid'),
'fk_user_modif' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'enabled'=>1, 'visible'=>-2, 'notnull'=>-1, 'position'=>511),
- 'import_key' => array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'notnull'=>-1, 'index'=>0, 'position'=>1000),
+ 'import_key' => array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'notnull'=>-1, 'index'=>0, 'position'=>1000)
);
/**
@@ -295,7 +295,9 @@ class Productlot extends CommonObject
$sql .= " t.tms,";
$sql .= " t.fk_user_creat,";
$sql .= " t.fk_user_modif,";
- $sql .= " t.import_key";
+ $sql .= " t.import_key,";
+ $sql .= " t.note_public,";
+ $sql .= " t.note_private";
$sql .= " FROM ".$this->db->prefix().$this->table_element." as t";
if ($product_id > 0 && $batch != '') {
$sql .= " WHERE t.batch = '".$this->db->escape($batch)."' AND t.fk_product = ".((int) $product_id);
@@ -329,6 +331,8 @@ class Productlot extends CommonObject
$this->fk_user_creat = $obj->fk_user_creat;
$this->fk_user_modif = $obj->fk_user_modif;
$this->import_key = $obj->import_key;
+ $this->note_public = $obj->note_public;
+ $this->note_private = $obj->note_private;
// Retrieve all extrafield
// fetch optionals attributes and labels
diff --git a/htdocs/product/stock/fiche-valo.php b/htdocs/product/stock/fiche-valo.php
index b4277e559b1..0e3f9367e16 100644
--- a/htdocs/product/stock/fiche-valo.php
+++ b/htdocs/product/stock/fiche-valo.php
@@ -106,7 +106,7 @@ if ($id > 0) {
/* ************************************************************************** */
print "\n";
- $year = strftime("%Y", time());
+ $year = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$file = $conf->stock->dir_temp.'/entrepot-'.$entrepot->id.'-'.($year).'.png';
diff --git a/htdocs/product/stock/index.php b/htdocs/product/stock/index.php
index dcf53a760b1..896ba2e20ba 100644
--- a/htdocs/product/stock/index.php
+++ b/htdocs/product/stock/index.php
@@ -162,7 +162,7 @@ if ($resql) {
print '
';
print '
';
- print "";
+ print ' ';
print ''.$langs->trans("LastMovements", min($num, $max)).' ';
print ''.$langs->trans("Product").' ';
if (isModEnabled('productbatch')) {
@@ -202,7 +202,7 @@ if ($resql) {
print ' ';
print ''.img_picto($langs->trans("Ref").' '.$objp->mid, 'movement', 'class="pictofixedwidth"').dol_print_date($db->jdate($objp->datem), 'dayhour').' ';
- print '';
+ print ' ';
print $producttmp->getNomUrl(1);
print " \n";
if (isModEnabled('productbatch')) {
@@ -216,7 +216,7 @@ if ($resql) {
print ''.dol_print_date($db->jdate($objp->eatby), 'day').' ';
}*/
}
- print '';
+ print ' ';
print $warehouse->getNomUrl(1);
print " \n";
print '';
diff --git a/htdocs/product/stock/list.php b/htdocs/product/stock/list.php
index 496a2720e97..b0c33e61484 100644
--- a/htdocs/product/stock/list.php
+++ b/htdocs/product/stock/list.php
@@ -227,9 +227,6 @@ $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $obje
$sql .= $hookmanager->resPrint;
$sql = preg_replace('/,\s*$/', '', $sql);
$sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as t";
-if (isModEnabled('categorie')) {
- $sql .= Categorie::getFilterJoinQuery(Categorie::TYPE_WAREHOUSE, "t.rowid");
-}
if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)";
}
@@ -240,12 +237,7 @@ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as ccount ON ccount.rowid = t.fk
if ($separatedPMP) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product_perentity as pa ON pa.fk_product = p.rowid AND pa.fk_product = ps.fk_product AND pa.entity = ". (int) $conf->entity;
}
-
$sql .= " WHERE t.entity IN (".getEntity('stock').")";
-
-if (isModEnabled('categorie')) {
- $sql .= Categorie::getFilterSelectQuery(Categorie::TYPE_WAREHOUSE, "t.rowid", $search_category_list);
-}
foreach ($search as $key => $val) {
$class_key = $key;
if ($class_key == 'status') {
@@ -268,6 +260,37 @@ foreach ($search as $key => $val) {
if ($search_all) {
$sql .= natural_search(array_keys($fieldstosearchall), $search_all);
}
+// Search for tag/category ($searchCategoryWarehouseList is an array of ID)
+$searchCategoryWarehouseList = $search_category_list;
+$searchCategoryWarehouseOperator = 0;
+if (!empty($searchCategoryWarehouseList)) {
+ $searchCategoryWarehouseSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategoryWarehouseList as $searchCategoryWarehouse) {
+ if (intval($searchCategoryWarehouse) == -2) {
+ $searchCategoryWarehouseSqlList[] = "NOT EXISTS (SELECT ck.fk_warehouse FROM ".MAIN_DB_PREFIX."categorie_warehouse as ck WHERE p.rowid = ck.fk_warehouse)";
+ } elseif (intval($searchCategoryWarehouse) > 0) {
+ if ($searchCategoryWarehouseOperator == 0) {
+ $searchCategoryWarehouseSqlList[] = " EXISTS (SELECT ck.fk_warehouse FROM ".MAIN_DB_PREFIX."categorie_warehouse as ck WHERE p.rowid = ck.fk_warehouse AND ck.fk_categorie = ".((int) $searchCategoryWarehouse).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryWarehouse);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategoryWarehouseSqlList[] = " EXISTS (SELECT ck.fk_warehouse FROM ".MAIN_DB_PREFIX."categorie_warehouse as ck WHERE p.rowid = ck.fk_warehouse AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategoryWarehouseOperator == 1) {
+ if (!empty($searchCategoryWarehouseSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryWarehouseSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryWarehouseSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryWarehouseSqlList).")";
+ }
+ }
+}
+
// Add where from extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
// Add where from hooks
diff --git a/htdocs/product/stock/massstockmove.php b/htdocs/product/stock/massstockmove.php
index 0c41cbed44a..df0eb013397 100644
--- a/htdocs/product/stock/massstockmove.php
+++ b/htdocs/product/stock/massstockmove.php
@@ -1,5 +1,5 @@
+/* Copyright (C) 2013-2022 Laurent Destaileur
* Copyright (C) 2014 Regis Houssin
*
* This program is free software: you can redistribute it and/or modify
@@ -77,6 +77,9 @@ if (!$sortorder) {
$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
$offset = $limit * $page;
+if (GETPOST('init')) {
+ unset($_SESSION['massstockmove']);
+}
$listofdata = array();
if (!empty($_SESSION['massstockmove'])) {
$listofdata = json_decode($_SESSION['massstockmove'], true);
@@ -88,13 +91,12 @@ if (!empty($_SESSION['massstockmove'])) {
*/
if ($action == 'addline' && !empty($user->rights->stock->mouvement->creer)) {
- if (!($id_product > 0)) {
- $error++;
- setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Product")), null, 'errors');
- }
if (!($id_sw > 0)) {
- $error++;
- setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("WarehouseSource")), null, 'errors');
+ //$error++;
+ //setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("WarehouseSource")), null, 'errors');
+ if ($id_sw < 0) {
+ $id_sw = 0;
+ }
}
if (!($id_tw > 0)) {
$error++;
@@ -105,6 +107,10 @@ if ($action == 'addline' && !empty($user->rights->stock->mouvement->creer)) {
$langs->load("errors");
setEventMessages($langs->trans("ErrorWarehouseMustDiffers"), null, 'errors');
}
+ if (!($id_product > 0)) {
+ $error++;
+ setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Product")), null, 'errors');
+ }
if (!$qty) {
$error++;
setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Qty")), null, 'errors');
@@ -132,6 +138,7 @@ if ($action == 'addline' && !empty($user->rights->stock->mouvement->creer)) {
}
}
+ //var_dump($_SESSION['massstockmove']);exit;
if (!$error) {
if (count(array_keys($listofdata)) > 0) {
$id = max(array_keys($listofdata)) + 1;
@@ -197,20 +204,22 @@ if ($action == 'createmovements' && !empty($user->rights->stock->mouvement->cree
//print 'price src='.$pricesrc.', price dest='.$pricedest;exit;
- if (empty($conf->productbatch->enabled) || !$product->hasbatch()) { // If product does not need lot/serial
- // Remove stock
- $result1 = $product->correct_stock(
- $user,
- $id_sw,
- $qty,
- 1,
- GETPOST("label"),
- $pricesrc,
- GETPOST("codemove")
- );
- if ($result1 < 0) {
- $error++;
- setEventMessages($product->error, $product->errors, 'errors');
+ if (empty($conf->productbatch->enabled) || !$product->hasbatch()) { // If product does not need lot/serial
+ // Remove stock if source warehouse defined
+ if ($id_sw > 0) {
+ $result1 = $product->correct_stock(
+ $user,
+ $id_sw,
+ $qty,
+ 1,
+ GETPOST("label"),
+ $pricesrc,
+ GETPOST("codemove")
+ );
+ if ($result1 < 0) {
+ $error++;
+ setEventMessages($product->error, $product->errors, 'errors');
+ }
}
// Add stock
@@ -244,21 +253,23 @@ if ($action == 'createmovements' && !empty($user->rights->stock->mouvement->cree
}
// Remove stock
- $result1 = $product->correct_stock_batch(
- $user,
- $id_sw,
- $qty,
- 1,
- GETPOST("label"),
- $pricesrc,
- $dlc,
- $dluo,
- $batch,
- GETPOST("codemove")
- );
- if ($result1 < 0) {
- $error++;
- setEventMessages($product->error, $product->errors, 'errors');
+ if ($id_sw > 0) {
+ $result1 = $product->correct_stock_batch(
+ $user,
+ $id_sw,
+ $qty,
+ 1,
+ GETPOST("label"),
+ $pricesrc,
+ $dlc,
+ $dluo,
+ $batch,
+ GETPOST("codemove")
+ );
+ if ($result1 < 0) {
+ $error++;
+ setEventMessages($product->error, $product->errors, 'errors');
+ }
}
// Add stock
@@ -285,6 +296,7 @@ if ($action == 'createmovements' && !empty($user->rights->stock->mouvement->cree
}
}
}
+ //var_dump($_SESSION['massstockmove']);exit;
if (!$error) {
unset($_SESSION['massstockmove']);
@@ -465,9 +477,9 @@ llxHeader('', $title, $help_url);
print load_fiche_titre($langs->trans("MassStockTransferShort"), '', 'stock');
$titletoadd = $langs->trans("Select");
-$buttonrecord = $langs->trans("RecordMovement");
+$buttonrecord = $langs->trans("RecordMovements");
$titletoaddnoent = $langs->transnoentitiesnoconv("Select");
-$buttonrecordnoent = $langs->transnoentitiesnoconv("RecordMovement");
+$buttonrecordnoent = $langs->transnoentitiesnoconv("RecordMovements");
print ''.$langs->trans("SelectProductInAndOutWareHouse", $titletoaddnoent, $buttonrecordnoent).' ';
print ' ';
@@ -569,25 +581,25 @@ $param = '';
print '';
print getTitleFieldOfList($langs->trans('WarehouseSource'), 0, $_SERVER["PHP_SELF"], '', $param, '', '', $sortfield, $sortorder, 'tagtd maxwidthonsmartphone ');
print getTitleFieldOfList($langs->trans('WarehouseTarget'), 0, $_SERVER["PHP_SELF"], '', $param, '', '', $sortfield, $sortorder, 'tagtd maxwidthonsmartphone ');
-print getTitleFieldOfList($langs->trans('ProductRef'), 0, $_SERVER["PHP_SELF"], '', $param, '', '', $sortfield, $sortorder, 'tagtd maxwidthonsmartphone ');
+print getTitleFieldOfList($langs->trans('Product'), 0, $_SERVER["PHP_SELF"], '', $param, '', '', $sortfield, $sortorder, 'tagtd maxwidthonsmartphone ');
if (isModEnabled('productbatch')) {
print getTitleFieldOfList($langs->trans('Batch'), 0, $_SERVER["PHP_SELF"], '', $param, '', '', $sortfield, $sortorder, 'tagtd maxwidthonsmartphone ');
}
-print getTitleFieldOfList($langs->trans('Qty'), 0, $_SERVER["PHP_SELF"], '', $param, '', '', $sortfield, $sortorder, 'center tagtd maxwidthonsmartphone ');
+print getTitleFieldOfList($langs->trans('Qty'), 0, $_SERVER["PHP_SELF"], '', $param, '', '', $sortfield, $sortorder, 'right tagtd maxwidthonsmartphone ');
print getTitleFieldOfList('', 0);
print ' ';
print '';
// From warehouse
-print '';
+print ' ';
print img_picto($langs->trans("WarehouseSource"), 'stock', 'class="paddingright"').$formproduct->selectWarehouses($id_sw, 'id_sw', 'warehouseopen,warehouseinternal', 1, 0, 0, '', 0, 0, array(), 'minwidth200imp maxwidth200');
print ' ';
// To warehouse
-print '';
+print ' ';
print img_picto($langs->trans("WarehouseTarget"), 'stock', 'class="paddingright"').$formproduct->selectWarehouses($id_tw, 'id_tw', 'warehouseopen,warehouseinternal', 1, 0, 0, '', 0, 0, array(), 'minwidth200imp maxwidth200');
print ' ';
// Product
-print '';
+print ' ';
$filtertype = 0;
if (!empty($conf->global->STOCK_SUPPORTS_SERVICES)) {
$filtertype = '';
@@ -603,13 +615,13 @@ print $form->select_produits($id_product, 'productid', $filtertype, $limit, 0, -
print ' ';
// Batch number
if (isModEnabled('productbatch')) {
- print '';
+ print ' ';
print img_picto($langs->trans("LotSerial"), 'lot', 'class="paddingright"');
- print ' ';
+ print ' ';
print ' ';
}
// Qty
-print ' ';
+print ' ';
// Button to add line
print ' ';
@@ -617,18 +629,25 @@ print ' ';
foreach ($listofdata as $key => $val) {
$productstatic->fetch($val['id_product']);
- $warehousestatics->fetch($val['id_sw']);
- $warehousestatict->fetch($val['id_tw']);
+
+ $warehousestatics->id = 0;
+ $warehousestatict->id = 0;
+ if ($val['id_sw'] > 0) {
+ $warehousestatics->fetch($val['id_sw']);
+ }
+ if ($val['id_tw'] > 0) {
+ $warehousestatict->fetch($val['id_tw']);
+ }
if ($productstatic->id <= 0) {
$error++;
setEventMessages($langs->trans("ObjectNotFound", $langs->transnoentitiesnoconv("Product")), null, 'errors');
}
- if ($warehousestatics->id <= 0) {
+ if ($warehousestatics->id < 0) { // We accept 0 for source warehouse id
$error++;
setEventMessages($langs->trans("ObjectNotFound", $langs->transnoentitiesnoconv("WarehouseSource")), null, 'errors');
}
- if ($warehousestatics->id <= 0) {
+ if ($warehousestatict->id <= 0) {
$error++;
setEventMessages($langs->trans("ObjectNotFound", $langs->transnoentitiesnoconv("WarehouseTarget")), null, 'errors');
}
@@ -636,7 +655,13 @@ foreach ($listofdata as $key => $val) {
if (!$error) {
print '';
print '';
- print $warehousestatics->getNomUrl(1);
+ if ($warehousestatics->id > 0) {
+ print $warehousestatics->getNomUrl(1);
+ } else {
+ print '';
+ print $langs->trans("None");
+ print ' ';
+ }
print ' ';
print '';
print $warehousestatict->getNomUrl(1);
@@ -649,7 +674,7 @@ foreach ($listofdata as $key => $val) {
print dol_escape_htmltag($val['batch']);
print ' ';
}
- print ''.price2num((float) $val['qty'], 'MS').' ';
+ print ''.price2num((float) $val['qty'], 'MS').' ';
print ''.img_delete($langs->trans("Remove")).' ';
print ' ';
}
@@ -670,7 +695,7 @@ if (count($listofdata)) {
// Button to record mass movement
$codemove = (GETPOSTISSET("codemove") ? GETPOST("codemove", 'alpha') : dol_print_date(dol_now(), '%Y%m%d%H%M%S'));
- $labelmovement = GETPOST("label") ? GETPOST('label') : $langs->trans("StockTransfer").' '.dol_print_date($now, '%Y-%m-%d %H:%M');
+ $labelmovement = GETPOST("label") ? GETPOST('label') : $langs->trans("MassStockTransferShort").' '.dol_print_date($now, '%Y-%m-%d %H:%M');
print '';
print ''.$langs->trans("InventoryCode").': ';
@@ -696,6 +721,7 @@ if ($action == 'delete') {
llxFooter();
$db->close();
+
/**
* Verify if $haystack startswith $needle
*
diff --git a/htdocs/product/stock/movement_list.php b/htdocs/product/stock/movement_list.php
index 7e34931f9a8..56030347d12 100644
--- a/htdocs/product/stock/movement_list.php
+++ b/htdocs/product/stock/movement_list.php
@@ -600,7 +600,6 @@ if (!empty($conf->project->enabled)) {
}
// Build and execute select
-// --------------------------------------------------------------------
$sql = "SELECT p.rowid, p.ref as product_ref, p.label as produit, p.tosell, p.tobuy, p.tobatch, p.fk_product_type as type, p.entity,";
$sql .= " e.ref as warehouse_ref, e.rowid as entrepot_id, e.lieu, e.fk_parent, e.statut,";
$sql .= " m.rowid as mid, m.value as qty, m.datem, m.fk_user_author, m.label, m.inventorycode, m.fk_origin, m.origintype,";
@@ -691,32 +690,6 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
$parameters = array();
$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
$sql .= $hookmanager->resPrint;
-
-/* If a group by is required
- $sql .= " GROUP BY ";
- foreach($object->fields as $key => $val) {
- $sql .= "t.".$key.", ";
- }
- // Add fields from extrafields
- if (!empty($extrafields->attributes[$object->table_element]['label'])) {
- foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
- $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? "ef.".$key.', ' : '');
- }
- }
- // Add where from hooks
- $parameters = array();
- $reshook = $hookmanager->executeHooks('printFieldListGroupBy', $parameters, $object); // Note that $action and $object may have been modified by hook
- $sql .= $hookmanager->resPrint;
- $sql = preg_replace('/,\s*$/', '', $sql);
- */
-
-// Add HAVING from hooks
-/*
- $parameters = array();
- $reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object); // Note that $action and $object may have been modified by hook
- $sql .= empty($hookmanager->resPrint) ? "" : " HAVING 1=1 ".$hookmanager->resPrint;
- */
-
// Count total nb of records
$nbtotalofrecords = '';
if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
@@ -730,7 +703,7 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
$nbtotalofrecords++;
}*/
/* The fast and low memory method to get and count full list converts the sql into a sql count */
- $sqlforcount = preg_replace('/^SELECT[a-z0-9\._\s\(\),]+FROM/i', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
+ $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/Ui', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
$resql = $db->query($sqlforcount);
$objforcount = $db->fetch_object($resql);
$nbtotalofrecords = $objforcount->nbtotalofrecords;
@@ -1369,7 +1342,7 @@ while ($i < ($limit ? min($num, $limit) : $num)) {
print '
';
// Id movement
if (!empty($arrayfields['m.rowid']['checked'])) {
- print '';
+ print ' ';
print img_picto($langs->trans("StockMovement"), 'movement', 'class="pictofixedwidth"');
print $obj->mid;
print ' '; // This is primary not movement id
diff --git a/htdocs/product/stock/product.php b/htdocs/product/stock/product.php
index bd679a3f2d8..b0771bc39d9 100644
--- a/htdocs/product/stock/product.php
+++ b/htdocs/product/stock/product.php
@@ -117,6 +117,12 @@ $error = 0;
$usercanread = (($object->type == Product::TYPE_PRODUCT && $user->rights->produit->lire) || ($object->type == Product::TYPE_SERVICE && $user->rights->service->lire));
$usercancreate = (($object->type == Product::TYPE_PRODUCT && $user->rights->produit->creer) || ($object->type == Product::TYPE_SERVICE && $user->rights->service->creer));
+$usercancreadprice = getDolGlobalString('MAIN_USE_ADVANCED_PERMS')?$user->hasRight('product', 'product_advance', 'read_prices'):$user->hasRight('product', 'lire');
+
+if ($object->isService()) {
+ $label = $langs->trans('Service');
+ $usercancreadprice = getDolGlobalString('MAIN_USE_ADVANCED_PERMS')?$user->hasRight('service', 'service_advance', 'read_prices'):$user->hasRight('service', 'lire');
+}
if ($object->id > 0) {
if ($object->type == $object::TYPE_PRODUCT) {
@@ -643,17 +649,25 @@ if ($id > 0 || $ref) {
$textdesc = $langs->trans("CostPriceDescription");
$textdesc .= " ".$langs->trans("CostPriceUsage");
$text = $form->textwithpicto($langs->trans("CostPrice"), $textdesc, 1, 'help', '');
- print $form->editfieldkey($text, 'cost_price', $object->cost_price, $object, $usercancreate, 'amount:6');
- print '';
- print $form->editfieldval($text, 'cost_price', $object->cost_price, $object, $usercancreate, 'amount:6');
+ if (!$usercancreadprice) {
+ print $form->editfieldkey($text, 'cost_price', '', $object, 0, 'amount:6');
+ print ' ';
+ print $form->editfieldval($text, 'cost_price', '', $object, 0, 'amount:6');
+ } else {
+ print $form->editfieldkey($text, 'cost_price', $object->cost_price, $object, $usercancreate, 'amount:6');
+ print ' ';
+ print $form->editfieldval($text, 'cost_price', $object->cost_price, $object, $usercancreate, 'amount:6');
+ }
print ' ';
+
+
// AWP
print '';
print $form->textwithpicto($langs->trans("AverageUnitPricePMPShort"), $langs->trans("AverageUnitPricePMPDesc"));
print ' ';
print '';
- if ($object->pmp > 0) {
+ if ($object->pmp > 0 && $usercancreadprice) {
print price($object->pmp).' '.$langs->trans("HT");
}
print ' ';
@@ -664,7 +678,7 @@ if ($id > 0 || $ref) {
print '';
$product_fourn = new ProductFournisseur($db);
if ($product_fourn->find_min_price_product_fournisseur($object->id) > 0) {
- if ($product_fourn->product_fourn_price_id > 0) {
+ if ($product_fourn->product_fourn_price_id > 0 && $usercancreadprice) {
print $product_fourn->display_price_product_fournisseur();
} else {
print $langs->trans("NotDefined");
@@ -675,19 +689,23 @@ if ($id > 0 || $ref) {
if (empty($conf->global->PRODUIT_MULTIPRICES)) {
// Price
print ' '.$langs->trans("SellingPrice").' ';
- if ($object->price_base_type == 'TTC') {
- print price($object->price_ttc).' '.$langs->trans($object->price_base_type);
- } else {
- print price($object->price).' '.$langs->trans($object->price_base_type);
+ if ($usercancreadprice) {
+ if ($object->price_base_type == 'TTC') {
+ print price($object->price_ttc).' '.$langs->trans($object->price_base_type);
+ } else {
+ print price($object->price).' '.$langs->trans($object->price_base_type);
+ }
}
print ' ';
// Price minimum
print ''.$langs->trans("MinPrice").' ';
- if ($object->price_base_type == 'TTC') {
- print price($object->price_min_ttc).' '.$langs->trans($object->price_base_type);
- } else {
- print price($object->price_min).' '.$langs->trans($object->price_base_type);
+ if ($usercancreadprice) {
+ if ($object->price_base_type == 'TTC') {
+ print price($object->price_min_ttc).' '.$langs->trans($object->price_base_type);
+ } else {
+ print price($object->price_min).' '.$langs->trans($object->price_base_type);
+ }
}
print ' ';
} else {
@@ -761,7 +779,7 @@ if ($id > 0 || $ref) {
$found = 0;
$helpondiff = ''.$langs->trans("StockDiffPhysicTeoric").': ';
- // Number of customer orders running
+ // Number of sales orders running
if (isModEnabled('commande')) {
if ($found) {
$helpondiff .= ' ';
@@ -776,7 +794,7 @@ if ($id > 0 || $ref) {
$helpondiff .= ' ('.$langs->trans("ProductQtyInDraft").': '.$object->stats_commande['qty'].') ';
}
- // Number of product from customer order already sent (partial shipping)
+ // Number of product from sales order already sent (partial shipping)
if (isModEnabled("expedition")) {
require_once DOL_DOCUMENT_ROOT.'/expedition/class/expedition.class.php';
$filterShipmentStatus = '';
@@ -821,7 +839,7 @@ if ($id > 0 || $ref) {
}
// Number of product in production
- if (!empty($conf->mrp->enabled)) {
+ if (isModEnabled('mrp')) {
if ($found) {
$helpondiff .= ' ';
} else {
@@ -1043,7 +1061,11 @@ if (!$variants) {
print ''.(price2num($object->pmp) ? price2num($object->pmp, 'MU') : '').' ';
// Value purchase
- print ''.(price2num($object->pmp) ? price(price2num($object->pmp * $obj->reel, 'MT')) : '').' ';
+ if ($usercancreadprice) {
+ print ''.(price2num($object->pmp) ? price(price2num($object->pmp * $obj->reel, 'MT')) : '').' ';
+ } else {
+ print ' ';
+ }
// Sell price
$minsellprice = null; $maxsellprice = null;
@@ -1060,14 +1082,16 @@ if (!$variants) {
}
}
print '';
- if ($minsellprice != $maxsellprice) {
- print price(price2num($minsellprice, 'MU'), 1).' - '.price(price2num($maxsellprice, 'MU'), 1);
- } else {
- print price(price2num($minsellprice, 'MU'), 1);
+ if ($usercancreadprice) {
+ if ($minsellprice != $maxsellprice) {
+ print price(price2num($minsellprice, 'MU'), 1).' - '.price(price2num($maxsellprice, 'MU'), 1);
+ } else {
+ print price(price2num($minsellprice, 'MU'), 1);
+ }
}
print ' ';
print $form->textwithpicto('', $langs->trans("Variable"));
- } else {
+ } elseif ($usercancreadprice) {
print price(price2num($object->price, 'MU'), 1);
}
print ' ';
@@ -1076,15 +1100,19 @@ if (!$variants) {
print '';
if (!empty($conf->global->PRODUIT_MULTIPRICES)) {
print '';
- if ($minsellprice != $maxsellprice) {
- print price(price2num($minsellprice * $obj->reel, 'MT'), 1).' - '.price(price2num($maxsellprice * $obj->reel, 'MT'), 1);
- } else {
- print price(price2num($minsellprice * $obj->reel, 'MT'), 1);
+ if ($usercancreadprice) {
+ if ($minsellprice != $maxsellprice) {
+ print price(price2num($minsellprice * $obj->reel, 'MT'), 1).' - '.price(price2num($maxsellprice * $obj->reel, 'MT'), 1);
+ } else {
+ print price(price2num($minsellprice * $obj->reel, 'MT'), 1);
+ }
}
print ' ';
print $form->textwithpicto('', $langs->trans("Variable"));
} else {
- print price(price2num($object->price * $obj->reel, 'MT'), 1);
+ if ($usercancreadprice) {
+ print price(price2num($object->price * $obj->reel, 'MT'), 1);
+ }
}
print ' ';
print ' ';
@@ -1189,11 +1217,15 @@ if (!$variants) {
print ' '.$langs->trans("Total").': ';
print ''.price2num($total, 'MS').' ';
print '';
- print ($totalwithpmp ? price(price2num($totalvalue / $totalwithpmp, 'MU')) : ' '); // This value may have rounding errors
+ if ($usercancreadprice) {
+ print ($totalwithpmp ? price(price2num($totalvalue / $totalwithpmp, 'MU')) : ' '); // This value may have rounding errors
+ }
print ' ';
// Value purchase
print '';
- print $totalvalue ? price(price2num($totalvalue, 'MT'), 1) : ' ';
+ if ($usercancreadprice) {
+ print $totalvalue ? price(price2num($totalvalue, 'MT'), 1) : ' ';
+ }
print ' ';
print '';
if ($num) {
@@ -1201,7 +1233,7 @@ if (!$variants) {
print '';
if (!empty($conf->global->PRODUIT_MULTIPRICES)) {
print $form->textwithpicto('', $langs->trans("Variable"));
- } else {
+ } elseif ($usercancreadprice) {
print price($totalvaluesell / $total, 1);
}
print ' ';
@@ -1212,7 +1244,7 @@ if (!$variants) {
print ' ';
if ($num) {
print '';
- if (empty($conf->global->PRODUIT_MULTIPRICES)) {
+ if (empty($conf->global->PRODUIT_MULTIPRICES) && $usercancreadprice) {
print price(price2num($totalvaluesell, 'MT'), 1);
} else {
print $form->textwithpicto('', $langs->trans("Variable"));
diff --git a/htdocs/product/stock/productlot_card.php b/htdocs/product/stock/productlot_card.php
index 5219897ed61..acf2f526773 100644
--- a/htdocs/product/stock/productlot_card.php
+++ b/htdocs/product/stock/productlot_card.php
@@ -540,10 +540,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
print ''."\n";
}
- if ($user->rights->stock->supprimer)
- {
- print ''."\n";
- }
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $user->rights->stock->supprimer);
*/
}
diff --git a/htdocs/product/stock/productlot_list.php b/htdocs/product/stock/productlot_list.php
index c15479b1f4f..8981d1cff56 100644
--- a/htdocs/product/stock/productlot_list.php
+++ b/htdocs/product/stock/productlot_list.php
@@ -315,7 +315,7 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
}
}*/
/* The fast and low memory method to get and count full list converts the sql into a sql count */
- $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
+ $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/Ui', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
$resql = $db->query($sqlforcount);
if ($resql) {
$objforcount = $db->fetch_object($resql);
diff --git a/htdocs/product/stock/productlot_note.php b/htdocs/product/stock/productlot_note.php
new file mode 100644
index 00000000000..c8cd43f2091
--- /dev/null
+++ b/htdocs/product/stock/productlot_note.php
@@ -0,0 +1,113 @@
+
+ * Copyright (C) ---Put here your own copyright and developer email---
+ *
+ * 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 .
+ */
+
+/**
+ * \file productlot_note.php
+ * \ingroup productlot
+ * \brief Tab for notes on productlot
+ */
+
+
+
+require '../../main.inc.php';
+dol_include_once('/product/stock/class/productlot.class.php');
+dol_include_once('/core/lib/product.lib.php');
+
+// Load translation files required by the page
+$langs->loadLangs(array('other', 'products'));
+
+// Get parameters
+$id = GETPOST('id', 'int');
+$ref = GETPOST('ref', 'alpha');
+$action = GETPOST('action', 'aZ09');
+
+// Initialize technical objects
+$object = new Productlot($db);
+$extrafields = new ExtraFields($db);
+$diroutputmassaction = $conf->productlot->dir_output.'/temp/massgeneration/'.$user->id;
+$hookmanager->initHooks(array('productlotnote')); // Note that conf->hooks_modules contains array
+// Fetch optionals attributes and labels
+$extrafields->fetch_name_optionals_label($object->table_element);
+
+// Load object
+include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals
+if ($id > 0 || !empty($ref)) {
+ $upload_dir = $conf->productlot->multidir_output[!empty($object->entity) ? $object->entity : $conf->entity]."/".$object->id;
+}
+
+$permissionnote = $user->rights->produit->lire; // Used by the include of actions_setnotes.inc.php
+
+// Security check (enable the most restrictive one)
+//if ($user->socid > 0) accessforbidden();
+//if ($user->socid > 0) $socid = $user->socid;
+//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
+//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
+//if (empty($conf->calibration->enabled)) accessforbidden();
+//if (!$permissiontoread) accessforbidden();
+
+
+/*
+ * Actions
+ */
+
+$reshook = $hookmanager->executeHooks('doActions', array(), $object, $action); // Note that $action and $object may have been modified by some hooks
+if ($reshook < 0) {
+ setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+}
+if (empty($reshook)) {
+ include DOL_DOCUMENT_ROOT.'/core/actions_setnotes.inc.php'; // Must be include, not include_once
+}
+
+
+/*
+ * View
+ */
+
+$form = new Form($db);
+
+$help_url = '';
+llxHeader('', $langs->trans('productlot'), $help_url);
+
+if ($id > 0 || !empty($ref)) {
+ $object->fetch_thirdparty();
+
+ $head = productlot_prepare_head($object);
+
+ print dol_get_fiche_head($head, 'note', '', -1, $object->picto);
+
+ // Object card
+ // ------------------------------------------------------------
+ $linkback = ''.$langs->trans("BackToList").' ';
+
+ dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'batch');
+
+ print '';
+ print '
';
+
+ $cssclass = "titlefield";
+ include DOL_DOCUMENT_ROOT.'/core/tpl/notes.tpl.php';
+
+ print '
';
+
+
+ print dol_get_fiche_end();
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/product/stock/replenish.php b/htdocs/product/stock/replenish.php
index 291fb2b7333..be7f006d5a0 100644
--- a/htdocs/product/stock/replenish.php
+++ b/htdocs/product/stock/replenish.php
@@ -111,7 +111,7 @@ if (!empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT)
|| !empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE)
|| !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION)
|| !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION_CLOSE)
- || !empty($conf->mrp->enabled)) {
+ || isModEnabled('mrp')) {
$virtualdiffersfromphysical = 1; // According to increase/decrease stock options, virtual and physical stock may differs.
}
@@ -459,7 +459,7 @@ if ($usevirtualstock) {
$sqlReceptionFourn = '0';
}
- if (!empty($conf->mrp->enabled)) {
+ if (isModEnabled('mrp')) {
$sqlProductionToConsume = "(SELECT GREATEST(0, ".$db->ifsql("SUM(".$db->ifsql("mp5.role = 'toconsume'", 'mp5.qty', '- mp5.qty').") IS NULL", "0", "SUM(".$db->ifsql("mp5.role = 'toconsume'", 'mp5.qty', '- mp5.qty').")").") as qty"; // We need the ifsql because if result is 0 for product p.rowid, we must return 0 and not NULL
$sqlProductionToConsume .= " FROM ".MAIN_DB_PREFIX."mrp_mo as mm5,";
$sqlProductionToConsume .= " ".MAIN_DB_PREFIX."mrp_production as mp5";
@@ -849,8 +849,8 @@ while ($i < ($limit ? min($num, $limit) : $num)) {
$desiredstock = $objp->desiredstock;
$alertstock = $objp->seuil_stock_alerte;
- $desiredstockwarehouse = ($objp->desiredstockpse ? $objp->desiredstockpse : 0);
- $alertstockwarehouse = ($objp->seuil_stock_alertepse ? $objp->seuil_stock_alertepse : 0);
+ $desiredstockwarehouse = (!empty($objp->desiredstockpse) ? $objp->desiredstockpse : 0);
+ $alertstockwarehouse = (!empty($objp->seuil_stock_alertepse) ? $objp->seuil_stock_alertepse : 0);
$warning = '';
if ($alertstock && ($stock < $alertstock)) {
diff --git a/htdocs/product/stock/replenishorders.php b/htdocs/product/stock/replenishorders.php
index d077c1d0ba8..c3c031b14bd 100644
--- a/htdocs/product/stock/replenishorders.php
+++ b/htdocs/product/stock/replenishorders.php
@@ -51,6 +51,7 @@ $search_dateyear = GETPOST('search_dateyear', 'int');
$search_datemonth = GETPOST('search_datemonth', 'int');
$search_dateday = GETPOST('search_dateday', 'int');
$search_date = dol_mktime(0, 0, 0, $search_datemonth, $search_dateday, $search_dateyear);
+$optioncss = GETPOST('optioncss', 'alpha');
$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
$sortfield = GETPOST('sortfield', 'aZ09comma');
@@ -130,9 +131,9 @@ if (empty($user->rights->societe->client->voir) && !$socid) {
}
$sql .= ' WHERE cf.fk_soc = s.rowid ';
$sql .= ' AND cf.entity = '.$conf->entity;
-if ($conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER) {
+if (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER)) {
$sql .= ' AND cf.fk_statut < 3';
-} elseif ($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER || !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION) || !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION_CLOSE)) {
+} elseif (!empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER) || !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION) || !empty($conf->global->STOCK_CALCULATE_ON_RECEPTION_CLOSE)) {
$sql .= ' AND cf.fk_statut < 6'; // We want also status 5, we will keep them visible if dispatching is not yet finished (tested with function dolDispatchToDo).
} else {
$sql .= ' AND cf.fk_statut < 5';
diff --git a/htdocs/product/stock/stockatdate.php b/htdocs/product/stock/stockatdate.php
index d88355c6912..69893559dfa 100644
--- a/htdocs/product/stock/stockatdate.php
+++ b/htdocs/product/stock/stockatdate.php
@@ -243,7 +243,7 @@ $num = 0;
$title = $langs->trans('StockAtDate');
-$sql = 'SELECT p.rowid, p.ref, p.label, p.description, p.price,';
+$sql = 'SELECT p.rowid, p.ref, p.label, p.description, p.price, p.pmp,';
$sql .= ' p.price_ttc, p.price_base_type, p.fk_product_type, p.desiredstock, p.seuil_stock_alerte,';
$sql .= ' p.tms as datem, p.duration, p.tobuy, p.stock, ';
if ($fk_warehouse > 0) {
@@ -565,12 +565,12 @@ while ($i < ($limit ? min($num, $limit) : $num)) {
// PMP value
print ' ';
- if (price2num($objp->estimatedvalue, 'MT')) {
- print ''.price(price2num($objp->estimatedvalue, 'MT'), 1).' ';
+ if (price2num($stock * $objp->pmp, 'MT')) {
+ print ''.price(price2num($stock * $objp->pmp, 'MT'), 1).' ';
} else {
print '';
}
- $totalbuyingprice += $objp->estimatedvalue;
+ $totalbuyingprice += $stock * $objp->pmp;
print ' ';
// Selling value
diff --git a/htdocs/product/stock/stocktransfer/class/stocktransfer.class.php b/htdocs/product/stock/stocktransfer/class/stocktransfer.class.php
index a71098fc2bf..5ffb56ced44 100644
--- a/htdocs/product/stock/stocktransfer/class/stocktransfer.class.php
+++ b/htdocs/product/stock/stocktransfer/class/stocktransfer.class.php
@@ -1,7 +1,7 @@
* Copyright (C) 2021 Gauthier VERDOL
- * Copyright (C) ---Put here your own copyright and developer email---
+ * Copyright (C) 2022 Frédéric France
*
* 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
@@ -229,7 +229,7 @@ class StockTransfer extends CommonObject
// Translate some data of arrayofkeyval
if (is_object($langs)) {
foreach ($this->fields as $key => $val) {
- if (is_array($val['arrayofkeyval'])) {
+ if (isset($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
foreach ($val['arrayofkeyval'] as $key2 => $val2) {
$this->fields[$key]['arrayofkeyval'][$key2] = $langs->trans($val2);
}
diff --git a/htdocs/product/stock/stocktransfer/stocktransfer_card.php b/htdocs/product/stock/stocktransfer/stocktransfer_card.php
index 8250006178a..54384ae0b3f 100644
--- a/htdocs/product/stock/stocktransfer/stocktransfer_card.php
+++ b/htdocs/product/stock/stocktransfer/stocktransfer_card.php
@@ -37,7 +37,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/modules/stocktransfer/modules_stocktransfe
// Load translation files required by the page
$langs->loadLangs(array("stocks", "other", "productbatch", "companies"));
- if (!empty($conf->incoterm->enabled)) $langs->load('incoterm');
+ if (isModEnabled('incoterm')) $langs->load('incoterm');
// Get parameters
$id = GETPOST('id', 'int');
@@ -84,7 +84,7 @@ include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be includ
$permissiontoread = $user->rights->stocktransfer->stocktransfer->read;
$permissiontoadd = $user->rights->stocktransfer->stocktransfer->write; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
$permissionnote = $user->rights->stocktransfer->stocktransfer->write; // Used by the include of actions_setnotes.inc.php
-$permissiontodelete = $user->rights->stocktransfer->stocktransfer->delete || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
+$permissiontodelete = $user->rights->stocktransfer->stocktransfer->delete || ($permissiontoadd && isset($object->status) && $object->status < $object::STATUS_TRANSFERED);
$permissiondellink = $user->rights->stocktransfer->stocktransfer->write; // Used by the include of actions_dellink.inc.php
$upload_dir = $conf->stocktransfer->multidir_output[isset($object->entity) ? $object->entity : 1];
@@ -336,7 +336,7 @@ if (empty($reshook)) {
}
// Set incoterm
- if ($action == 'set_incoterms' && !empty($conf->incoterm->enabled) && $permissiontoadd) {
+ if ($action == 'set_incoterms' && isModEnabled('incoterm') && $permissiontoadd) {
$result = $object->setIncoterms(GETPOST('incoterm_id', 'int'), GETPOST('location_incoterms', 'alpha'));
}
// Actions to send emails
@@ -399,7 +399,7 @@ if ($action == 'create') {
// Common attributes
include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_add.tpl.php';
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
print '';
print ''.$form->textwithpicto($langs->trans("IncotermLabel"), $soc->label_incoterms, 1).' ';
print '';
@@ -611,7 +611,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php';
// Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
print ' ';
print '';
print $langs->trans('IncotermLabel');
@@ -964,7 +964,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
// Clone
if ($permissiontoadd) {
- print ''.$langs->trans("ToClone").' '."\n";
+ print dolGetButtonAction($langs->trans("ToClone"), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&socid='.$object->socid.'&action=clone&object=stocktransfer', 'clone', $permissiontoadd);
}
/*
@@ -992,14 +992,8 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
}
*/
- // Delete (need delete permission, or if draft, just need create/modify permission)
- if ($object->status < $object::STATUS_TRANSFERED && $permissiontodelete) {
- print 'id.'&action=delete&token='.newToken().'">'.$langs->trans('Delete').' '."\n";
- }
- /*else
- {
- print ''.$langs->trans('Delete').' '."\n";
- }*/
+ // Delete
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete);
}
print ''."\n";
}
diff --git a/htdocs/product/stock/tpl/extrafields_add.tpl.php b/htdocs/product/stock/tpl/extrafields_add.tpl.php
index 62921f0a6e0..144c638a1cf 100644
--- a/htdocs/product/stock/tpl/extrafields_add.tpl.php
+++ b/htdocs/product/stock/tpl/extrafields_add.tpl.php
@@ -38,13 +38,13 @@ if (empty($conf) || !is_object($conf)) {
// Other attributes
if (!isset($parameters)) $parameters = array();
-$reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $movement, $action); // Note that $action and $object may have been modified by hook
+$reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
if (empty($reshook)) {
$params = array();
if (isset($tpl_context)) $params['tpl_context'] = $tpl_context;
$params['cols'] = $parameters['colspanvalue'];
- print $movement->showOptionals($extrafields, 'create', $params);
+ print $object->showOptionals($extrafields, 'create', $params);
}
?>
diff --git a/htdocs/product/stock/tpl/stockcorrection.tpl.php b/htdocs/product/stock/tpl/stockcorrection.tpl.php
index 40181167baa..69ae5eda5e0 100644
--- a/htdocs/product/stock/tpl/stockcorrection.tpl.php
+++ b/htdocs/product/stock/tpl/stockcorrection.tpl.php
@@ -109,7 +109,7 @@ if ($object->element == 'product') {
if (empty($ident) && !empty($conf->global->MAIN_DEFAULT_WAREHOUSE)) {
$ident = $conf->global->MAIN_DEFAULT_WAREHOUSE;
}
- print img_picto('', 'stock').$formproduct->selectWarehouses($ident, 'id_entrepot', 'warehouseopen,warehouseinternal', 1, 0, 0, '', 0, 0, null, 'minwidth100');
+ print img_picto('', 'stock', 'class="pictofixedwidth"').$formproduct->selectWarehouses($ident, 'id_entrepot', 'warehouseopen,warehouseinternal', 1, 0, 0, '', 0, 0, null, 'minwidth100 maxwidth300 widthcentpercentminusx');
print ' ';
}
if ($object->element == 'stock') {
@@ -155,10 +155,11 @@ if (ismodEnabled('productbatch') &&
print ' ';
print ' ';
} else {
- print ' ';
+ print img_picto('', 'barcode', 'class="pictofixedwidth"').' ';
}
print '';
print ' ';
+
print '';
if (empty($conf->global->PRODUCT_DISABLE_SELLBY)) {
print ''.$langs->trans("SellByDate").' ';
diff --git a/htdocs/product/stock/tpl/stocktransfer.tpl.php b/htdocs/product/stock/tpl/stocktransfer.tpl.php
index 819fa404d52..7d08f2014a0 100644
--- a/htdocs/product/stock/tpl/stocktransfer.tpl.php
+++ b/htdocs/product/stock/tpl/stocktransfer.tpl.php
@@ -104,7 +104,7 @@ if (isModEnabled('productbatch') &&
print ' ';
print ' ';
} else {
- print ' ';
+ print img_picto('', 'barcode', 'class="pictofixedwidth"').' ';
}
print ' ';
print ' ';
diff --git a/htdocs/product/stock/valo.php b/htdocs/product/stock/valo.php
index 6bf59ebeb0e..af98ee98540 100644
--- a/htdocs/product/stock/valo.php
+++ b/htdocs/product/stock/valo.php
@@ -52,7 +52,7 @@ if ($page < 0) {
$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
$offset = $limit * $page;
-$year = strftime("%Y", time());
+$year = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
/*
diff --git a/htdocs/product/traduction.php b/htdocs/product/traduction.php
index 3f536b6761a..ba4dc956d08 100644
--- a/htdocs/product/traduction.php
+++ b/htdocs/product/traduction.php
@@ -265,12 +265,12 @@ if ($action == 'edit') {
print '';
print ''.$langs->trans('Label').' ';
print ''.$langs->trans('Description').' ';
- $doleditor = new DolEditor("desc-$key", $object->multilangs[$key]["description"], '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_PRODUCTDESC'), ROWS_3, '90%');
+ $doleditor = new DolEditor("desc-$key", $object->multilangs[$key]["description"], '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_DETAILS'), ROWS_3, '90%');
$doleditor->Create();
print ' ';
if (!empty($conf->global->PRODUCT_USE_OTHER_FIELD_IN_TRANSLATION)) {
print ''.$langs->trans('Other').' ('.$langs->trans("NotUsed").') ';
- $doleditor = new DolEditor("other-$key", $object->multilangs[$key]["other"], '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_PRODUCTDESC'), ROWS_3, '90%');
+ $doleditor = new DolEditor("other-$key", $object->multilangs[$key]["other"], '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_DETAILS'), ROWS_3, '90%');
$doleditor->Create();
}
print ' ';
@@ -336,13 +336,13 @@ if ($action == 'add' && ($user->rights->produit->creer || $user->rights->service
print '';
print ''.$langs->trans('Label').' ';
print ''.$langs->trans('Description').' ';
- $doleditor = new DolEditor('desc', '', '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_PRODUCTDESC'), ROWS_3, '90%');
+ $doleditor = new DolEditor('desc', '', '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_DETAILS'), ROWS_3, '90%');
$doleditor->Create();
print ' ';
// Other field (not used)
if (!empty($conf->global->PRODUCT_USE_OTHER_FIELD_IN_TRANSLATION)) {
print ''.$langs->trans('Other').' ('.$langs->trans("NotUsed").' ';
- $doleditor = new DolEditor('other', '', '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_PRODUCTDESC'), ROWS_3, '90%');
+ $doleditor = new DolEditor('other', '', '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_DETAILS'), ROWS_3, '90%');
$doleditor->Create();
print ' ';
}
diff --git a/htdocs/projet/activity/perday.php b/htdocs/projet/activity/perday.php
index 0854dceee67..14b98b82581 100644
--- a/htdocs/projet/activity/perday.php
+++ b/htdocs/projet/activity/perday.php
@@ -709,7 +709,7 @@ if (count($tasksarray) > 0) {
// Calculate total for all tasks
$listofdistinctprojectid = array(); // List of all distinct projects
- if (is_array($tasksarraywithoutfilter) && count($tasksarraywithoutfilter)) {
+ if (!empty($tasksarraywithoutfilter) && is_array($tasksarraywithoutfilter) && count($tasksarraywithoutfilter)) {
foreach ($tasksarraywithoutfilter as $tmptask) {
$listofdistinctprojectid[$tmptask->fk_project] = $tmptask->fk_project;
}
@@ -795,12 +795,12 @@ print '';
print '';
-$modeinput = 'hours';
-
-if ($conf->use_javascript_ajax) {
+if (!empty($conf->use_javascript_ajax)) {
+ $modeinput = 'hours';
print "\n\n";
print '';
}
diff --git a/htdocs/projet/activity/permonth.php b/htdocs/projet/activity/permonth.php
index 380b4891376..49849b362ba 100644
--- a/htdocs/projet/activity/permonth.php
+++ b/htdocs/projet/activity/permonth.php
@@ -419,7 +419,7 @@ if (!empty($conf->categorie->enabled))
// If the user can view user other than himself
$moreforfilter .= '';
$moreforfilter .= '
';
-$includeonly = 'hierachyme';
+$includeonly = 'hierarchyme';
if (empty($user->rights->user->user->lire)) {
$includeonly = array($user->id);
}
@@ -524,7 +524,7 @@ if (count($tasksarray) > 0) {
// Calculate total for all tasks
$listofdistinctprojectid = array(); // List of all distinct projects
- if (is_array($tasksarraywithoutfilter) && count($tasksarraywithoutfilter)) {
+ if (!empty($tasksarraywithoutfilter) && is_array($tasksarraywithoutfilter) && count($tasksarraywithoutfilter)) {
foreach ($tasksarraywithoutfilter as $tmptask) {
$listofdistinctprojectid[$tmptask->fk_project] = $tmptask->fk_project;
}
diff --git a/htdocs/projet/activity/perweek.php b/htdocs/projet/activity/perweek.php
index e7bc897db5a..7177f35e71c 100644
--- a/htdocs/projet/activity/perweek.php
+++ b/htdocs/projet/activity/perweek.php
@@ -747,7 +747,7 @@ if (count($tasksarray) > 0) {
// Calculate total for all tasks
$listofdistinctprojectid = array(); // List of all distinct projects
- if (is_array($tasksarraywithoutfilter) && count($tasksarraywithoutfilter)) {
+ if (!empty($tasksarraywithoutfilter) && is_array($tasksarraywithoutfilter) && count($tasksarraywithoutfilter)) {
foreach ($tasksarraywithoutfilter as $tmptask) {
$listofdistinctprojectid[$tmptask->fk_project] = $tmptask->fk_project;
}
diff --git a/htdocs/projet/info.php b/htdocs/projet/agenda.php
similarity index 74%
rename from htdocs/projet/info.php
rename to htdocs/projet/agenda.php
index bef020d9a38..a3c120d0a23 100644
--- a/htdocs/projet/info.php
+++ b/htdocs/projet/agenda.php
@@ -17,7 +17,7 @@
*/
/**
- * \file htdocs/projet/info.php
+ * \file htdocs/projet/agenda.php
* \ingroup project
* \brief Page with events on project
*/
@@ -132,7 +132,7 @@ $morehtmlref = '
';
$morehtmlref .= $object->title;
// Thirdparty
if (!empty($object->thirdparty->id) && $object->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '
';
@@ -166,18 +166,40 @@ if ($permok) {
}
-//print '
';
-$morehtmlcenter = '';
-if (isModEnabled('agenda')) {
- $addActionBtnRight = !empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create);
- $morehtmlcenter .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create'.$out.'&socid='.$object->socid.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.$object->id), '', $addActionBtnRight);
-}
//print '
';
if (!empty($object->id)) {
print '
';
+ //print '
';
+ $morehtmlcenter = '';
+
+ // Show link to change view in message
+ $messagingUrl = DOL_URL_ROOT.'/projet/messaging.php?id='.$object->id;
+ $morehtmlcenter .= dolGetButtonTitle($langs->trans('ShowAsConversation'), '', 'fa fa-comments imgforviewmode', $messagingUrl, '', 1);
+
+ // Show link to change view in agenda
+ $messagingUrl = DOL_URL_ROOT.'/projet/info.php?id='.$object->id;
+ $morehtmlcenter .= dolGetButtonTitle($langs->trans('MessageListViewType'), '', 'fa fa-bars imgforviewmode', $messagingUrl, '', 2);
+
+
+ // // Show link to send an email (if read and not closed)
+ // $btnstatus = $object->status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage";
+ // $url = 'card.php?track_id='.$object->track_id.'&action=presend_addmessage&mode=init&private_message=0&send_email=1&backtopage='.urlencode($_SERVER["PHP_SELF"].'?track_id='.$object->track_id).'#formmailbeforetitle';
+ // $morehtmlright .= dolGetButtonTitle($langs->trans('SendMail'), '', 'fa fa-paper-plane', $url, 'email-title-button', $btnstatus);
+
+ // // Show link to add a private message (if read and not closed)
+ // $btnstatus = $object->status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage";
+ // $url = 'card.php?track_id='.$object->track_id.'&action=presend_addmessage&mode=init&backtopage='.urlencode($_SERVER["PHP_SELF"].'?track_id='.$object->track_id).'#formmailbeforetitle';
+ // $morehtmlright .= dolGetButtonTitle($langs->trans('TicketAddMessage'), '', 'fa fa-comment-dots', $url, 'add-new-ticket-title-button', $btnstatus);
+
+ // Show link to add event
+ if (isModEnabled('agenda')) {
+ $addActionBtnRight = !empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create);
+ $morehtmlcenter .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create'.$out.'&socid='.$object->socid.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.$object->id), '', $addActionBtnRight);
+ }
+
$param = '&id='.$object->id;
if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
$param .= '&contextpage='.$contextpage;
diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php
index a308476ae50..1bdcccbaecf 100644
--- a/htdocs/projet/card.php
+++ b/htdocs/projet/card.php
@@ -55,13 +55,15 @@ $dol_openinpopup = GETPOST('dol_openinpopup', 'aZ09');
$status = GETPOST('status', 'int');
$opp_status = GETPOST('opp_status', 'int');
-$opp_percent = price2num(GETPOST('opp_percent', 'alpha'));
-$objcanvas = GETPOST("objcanvas", "alpha");
-$comefromclone = GETPOST("comefromclone", "alpha");
+$opp_percent = price2num(GETPOST('opp_percent', 'alphanohtml'));
+$objcanvas = GETPOST("objcanvas", "alphanohtml");
+$comefromclone = GETPOST("comefromclone", "alphanohtml");
+$date_start = dol_mktime(0, 0, 0, GETPOST('projectstartmonth', 'int'), GETPOST('projectstartday', 'int'), GETPOST('projectstartyear', 'int'));
+$date_end = dol_mktime(0, 0, 0, GETPOST('projectendmonth', 'int'), GETPOST('projectendday', 'int'), GETPOST('projectendyear', 'int'));
+$date_start_event = dol_mktime(GETPOST('date_start_eventhour', 'int'), GETPOST('date_start_eventmin', 'int'), GETPOST('date_start_eventsec', 'int'), GETPOST('date_start_eventmonth', 'int'), GETPOST('date_start_eventday', 'int'), GETPOST('date_start_eventyear', 'int'));
+$date_end_event = dol_mktime(GETPOST('date_end_eventhour', 'int'), GETPOST('date_end_eventmin', 'int'), GETPOST('date_end_eventsec', 'int'), GETPOST('date_end_eventmonth', 'int'), GETPOST('date_end_eventday', 'int'), GETPOST('date_end_eventyear', 'int'));
+$location = GETPOST('location', 'alphanohtml');
-if ($id == '' && $ref == '' && ($action != "create" && $action != "add" && $action != "update" && !GETPOST("cancel"))) {
- accessforbidden();
-}
$mine = GETPOST('mode') == 'mine' ? 1 : 0;
//if (! $user->rights->projet->all->lire) $mine=1; // Special for projects
@@ -88,14 +90,15 @@ if ($id > 0 || !empty($ref)) {
// fetch optionals attributes and labels
$extrafields->fetch_name_optionals_label($object->table_element);
-$date_start = dol_mktime(0, 0, 0, GETPOST('projectstartmonth', 'int'), GETPOST('projectstartday', 'int'), GETPOST('projectstartyear', 'int'));
-$date_end = dol_mktime(0, 0, 0, GETPOST('projectendmonth', 'int'), GETPOST('projectendday', 'int'), GETPOST('projectendyear', 'int'));
-
// Security check
$socid = GETPOST('socid', 'int');
//if ($user->socid > 0) $socid = $user->socid; // For external user, no check is done on company because readability is managed by public status of project and assignement.
restrictedArea($user, 'projet', $object->id, 'projet&project');
+if ($id == '' && $ref == '' && ($action != "create" && $action != "add" && $action != "update" && !GETPOST("cancel"))) {
+ accessforbidden();
+}
+
$permissiondellink = $user->rights->projet->creer; // Used by the include of actions_dellink.inc.php
@@ -187,6 +190,9 @@ if (empty($reshook)) {
$object->date_c = dol_now();
$object->date_start = $date_start;
$object->date_end = $date_end;
+ $object->date_start_event = $date_start_event;
+ $object->date_end_event = $date_end_event;
+ $object->location = $location;
$object->statut = $status;
$object->opp_status = $opp_status;
$object->opp_percent = $opp_percent;
@@ -281,6 +287,9 @@ if (empty($reshook)) {
$object->public = GETPOST('public', 'alpha');
$object->date_start = (!GETPOST('projectstart')) ? '' : $date_start;
$object->date_end = (!GETPOST('projectend')) ? '' : $date_end;
+ $object->date_start_event = (!GETPOST('date_start_event')) ? '' : $date_start_event;
+ $object->date_end_event = (!GETPOST('date_end_event')) ? '' : $date_end_event;
+ $object->location = $location;
if (GETPOSTISSET('opp_amount')) {
$object->opp_amount = price2num(GETPOST('opp_amount', 'alpha'));
}
@@ -552,7 +561,9 @@ if ($action == 'create' && $user->rights->projet->creer) {
// Ref
$suggestedref = (GETPOST("ref") ? GETPOST("ref") : $defaultref);
print '
'.$langs->trans("Ref").' ';
- print ' '.$form->textwithpicto('', $langs->trans("YouCanCompleteRef", $suggestedref));
+ if ($suggestedref) {
+ print ' '.$form->textwithpicto('', $langs->trans("YouCanCompleteRef", $suggestedref));
+ }
print '';
// Label
@@ -603,6 +614,23 @@ if ($action == 'create' && $user->rights->projet->creer) {
print '
';
$htmltext = $langs->trans("EventOrganizationDescriptionLong");
print '
'.$form->textwithpicto($langs->trans("ManageOrganizeEvent"), $htmltext).' ';
+ print '';
}
print '';
print '';
@@ -673,16 +701,6 @@ if ($action == 'create' && $user->rights->projet->creer) {
}
print '';
- // Date start
- print '
'.$langs->trans("DateStart").' ';
- print $form->selectDate(($date_start ? $date_start : ''), 'projectstart', 0, 0, 0, '', 1, 0);
- print ' ';
-
- // Date end
- print '
'.$langs->trans("DateEnd").' ';
- print $form->selectDate(($date_end ? $date_end : -1), 'projectend', 0, 0, 0, '', 1, 0);
- print ' ';
-
if (!empty($conf->global->PROJECT_USE_OPPORTUNITIES)) {
// Opportunity status
print '
'.$langs->trans("OpportunityStatus").' ';
@@ -708,6 +726,27 @@ if ($action == 'create' && $user->rights->projet->creer) {
print ' ';
print '';
+ // Date project
+ print '
'.$langs->trans("Date").(isModEnabled('eventorganization') ? ' ('.$langs->trans("Project").') ' : '').' ';
+ print $form->selectDate(($date_start ? $date_start : ''), 'projectstart', 0, 0, 0, '', 1, 0);
+ print ' '.$langs->trans("to").' ';
+ print $form->selectDate(($date_end ? $date_end : -1), 'projectend', 0, 0, 0, '', 1, 0);
+ print ' ';
+
+ if (isModEnabled('eventorganization')) {
+ // Date event
+ print '
'.$langs->trans("Date").' ('.$langs->trans("Event").') ';
+ print $form->selectDate(($date_start_event ? $date_start_event : -1), 'date_start_event', 1, 1, 1, '', 1, 0);
+ print ' '.$langs->trans("to").' ';
+ print $form->selectDate(($date_end_event ? $date_end_event : -1), 'date_end_event', 1, 1, 1, '', 1, 0);
+ print ' ';
+
+ // Location
+ print '
'.$langs->trans("Location").' ';
+ print ' ';
+ print '';
+ }
+
// Description
print '
'.$langs->trans("Description").' ';
print '';
@@ -852,11 +891,12 @@ if ($action == 'create' && $user->rights->projet->creer) {
// Status
print ' '.$langs->trans("Status").' ';
- print '';
+ print '';
foreach ($object->statuts_short as $key => $val) {
- print 'statut) == $key ? ' selected="selected"' : '').'>'.$langs->trans($val).' ';
+ print 'statut) == $key ? ' selected="selected"' : '').'>'.$langs->trans($val).' ';
}
print ' ';
+ print ajax_combobox('status');
print ' ';
// Usage
@@ -902,6 +942,21 @@ if ($action == 'create' && $user->rights->projet->creer) {
print '
usage_organize_event ? ' checked="checked"' : '')) . '"> ';
$htmltext = $langs->trans("EventOrganizationDescriptionLong");
print '
'.$form->textwithpicto($langs->trans("ManageOrganizeEvent"), $htmltext).' ';
+ print '';
}
print '';
}
@@ -981,9 +1036,18 @@ if ($action == 'create' && $user->rights->projet->creer) {
print '';
}
- // Date start
- print '
'.$langs->trans("DateStart").' ';
+ // Budget
+ print ' '.$langs->trans("Budget").' ';
+ print ' ';
+ print $langs->getCurrencySymbol($conf->currency);
+ print ' ';
+ print '';
+
+ // Date project
+ print '
'.$langs->trans("Date").(isModEnabled('eventorganization') ? ' ('.$langs->trans("Project").') ' : '').' ';
print $form->selectDate($object->date_start ? $object->date_start : -1, 'projectstart', 0, 0, 0, '', 1, 0);
+ print ' '.$langs->trans("to").' ';
+ print $form->selectDate($object->date_end ? $object->date_end : -1, 'projectend', 0, 0, 0, '', 1, 0);
print ' rights->projet->creer) {
print '/>'.$langs->trans("ProjectReportDate").' ';
print ' ';
- // Date end
- print '
'.$langs->trans("DateEnd").' ';
- print $form->selectDate($object->date_end ? $object->date_end : -1, 'projectend', 0, 0, 0, '', 1, 0);
- print ' ';
+ if (isModEnabled('eventorganization')) {
+ // Date event
+ print '
'.$langs->trans("Date").' ('.$langs->trans("Event").') ';
+ print $form->selectDate(($date_start_event ? $date_start_event : ($object->date_start_event ? $object->date_start_event : -1)), 'date_start_event', 1, 1, 1, '', 1, 0);
+ print ' '.$langs->trans("to").' ';
+ print $form->selectDate(($date_end_event ? $date_end_event : ($object->date_end_event ? $object->date_end_event : -1)), 'date_end_event', 1, 1, 1, '', 1, 0);
+ print ' ';
- // Budget
- print '
'.$langs->trans("Budget").' ';
- print ' ';
- print $langs->getCurrencySymbol($conf->currency);
- print ' ';
- print '';
+ // Location
+ print '
'.$langs->trans("Location").' ';
+ print ' ';
+ print '';
+ }
// Description
print '
'.$langs->trans("Description").' ';
@@ -1043,7 +1109,7 @@ if ($action == 'create' && $user->rights->projet->creer) {
// Title
$morehtmlref .= dol_escape_htmltag($object->title);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : ';
+ $morehtmlref .= ' ';
if (!empty($object->thirdparty->id) && $object->thirdparty->id > 0) {
$morehtmlref .= $object->thirdparty->getNomUrl(1, 'project');
}
@@ -1143,18 +1209,6 @@ if ($action == 'create' && $user->rights->projet->creer) {
*/
}
- // Date start - end
- print ''.$langs->trans("DateStart").' - '.$langs->trans("DateEnd").' ';
- $start = dol_print_date($object->date_start, 'day');
- print ($start ? $start : '?');
- $end = dol_print_date($object->date_end, 'day');
- print ' - ';
- print ($end ? $end : '?');
- if ($object->hasDelay()) {
- print img_warning("Late");
- }
- print ' ';
-
// Budget
print '
'.$langs->trans("Budget").' ';
if (strcmp($object->budget_amount, '')) {
@@ -1162,6 +1216,18 @@ if ($action == 'create' && $user->rights->projet->creer) {
}
print ' ';
+ // Date start - end project
+ print '
'.$langs->trans("Dates").' ';
+ $start = dol_print_date($object->date_start, 'day');
+ print ($start ? $start : '?');
+ $end = dol_print_date($object->date_end, 'day');
+ print ' - ';
+ print ($end ? $end : '?');
+ if ($object->hasDelay()) {
+ print img_warning("Late");
+ }
+ print ' ';
+
// Other attributes
$cols = 2;
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
@@ -1401,7 +1467,7 @@ if ($action == 'create' && $user->rights->projet->creer) {
// Delete
if ($user->rights->projet->supprimer || ($object->statut == Project::STATUS_DRAFT && $user->rights->projet->creer)) {
if ($userDelete > 0 || ($object->statut == Project::STATUS_DRAFT && $user->rights->projet->creer)) {
- print dolGetButtonAction('', $langs->trans('Delete'), 'delete', $_SERVER["PHP_SELF"].'?action=delete&token='.newToken().'&id='.$object->id, '');
+ print dolGetButtonAction('', $langs->trans('Delete'), 'delete', $_SERVER["PHP_SELF"].'?action=delete&token='.newToken().'&id='.$object->id, '');
} else {
print dolGetButtonAction($langs->trans('NotOwnerOfProject'), $langs->trans('Delete'), 'default', $_SERVER['PHP_SELF']. '#', '', false);
}
diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php
index 9987f9bc4f0..e3865663bf7 100644
--- a/htdocs/projet/class/project.class.php
+++ b/htdocs/projet/class/project.class.php
@@ -87,29 +87,44 @@ class Project extends CommonObject
public $title;
/**
- * @var int Date start
+ * @var int Date start
* @deprecated
* @see $date_start
*/
public $dateo;
/**
- * @var int Date start
+ * @var int Date start
*/
public $date_start;
/**
- * @var int Date end
+ * @var int Date end
* @deprecated
* @see $date_end
*/
public $datee;
/**
- * @var int Date end
+ * @var int Date end
*/
public $date_end;
+ /**
+ * @var int Date start event
+ */
+ public $date_start_event;
+
+ /**
+ * @var int Date end event
+ */
+ public $date_end_event;
+
+ /**
+ * @var string Location
+ */
+ public $location;
+
/**
* @var int Date close
*/
@@ -264,30 +279,35 @@ class Project extends CommonObject
'datee' =>array('type'=>'date', 'label'=>'DateEnd', 'enabled'=>1, 'visible'=>1, 'position'=>35),
'description' =>array('type'=>'text', 'label'=>'Description', 'enabled'=>1, 'visible'=>3, 'position'=>55, 'searchall'=>1),
'public' =>array('type'=>'integer', 'label'=>'Visibility', 'enabled'=>1, 'visible'=>1, 'position'=>65),
- 'fk_opp_status' =>array('type'=>'integer', 'label'=>'OpportunityStatusShort', 'enabled'=>'!empty($conf->global->PROJECT_USE_OPPORTUNITIES)', 'visible'=>1, 'position'=>75),
- 'opp_percent' =>array('type'=>'double(5,2)', 'label'=>'OpportunityProbabilityShort', 'enabled'=>'!empty($conf->global->PROJECT_USE_OPPORTUNITIES)', 'visible'=>1, 'position'=>80),
+ 'fk_opp_status' =>array('type'=>'integer', 'label'=>'OpportunityStatusShort', 'enabled'=>'getDolGlobalString("PROJECT_USE_OPPORTUNITIES")', 'visible'=>1, 'position'=>75),
+ 'opp_percent' =>array('type'=>'double(5,2)', 'label'=>'OpportunityProbabilityShort', 'enabled'=>'getDolGlobalString("PROJECT_USE_OPPORTUNITIES")', 'visible'=>1, 'position'=>80),
'note_private' =>array('type'=>'text', 'label'=>'NotePrivate', 'enabled'=>1, 'visible'=>0, 'position'=>85, 'searchall'=>1),
'note_public' =>array('type'=>'text', 'label'=>'NotePublic', 'enabled'=>1, 'visible'=>0, 'position'=>90, 'searchall'=>1),
'model_pdf' =>array('type'=>'varchar(255)', 'label'=>'ModelPdf', 'enabled'=>1, 'visible'=>0, 'position'=>95),
'date_close' =>array('type'=>'datetime', 'label'=>'DateClosing', 'enabled'=>1, 'visible'=>0, 'position'=>105),
'fk_user_close' =>array('type'=>'integer', 'label'=>'UserClosing', 'enabled'=>1, 'visible'=>0, 'position'=>110),
- 'opp_amount' =>array('type'=>'double(24,8)', 'label'=>'OpportunityAmountShort', 'enabled'=>1, 'visible'=>'!empty($conf->global->PROJECT_USE_OPPORTUNITIES)', 'position'=>115),
+ 'opp_amount' =>array('type'=>'double(24,8)', 'label'=>'OpportunityAmountShort', 'enabled'=>1, 'visible'=>'getDolGlobalString("PROJECT_USE_OPPORTUNITIES")', 'position'=>115),
'budget_amount' =>array('type'=>'double(24,8)', 'label'=>'Budget', 'enabled'=>1, 'visible'=>1, 'position'=>119),
'usage_bill_time' =>array('type'=>'integer', 'label'=>'UsageBillTimeShort', 'enabled'=>1, 'visible'=>-1, 'position'=>130),
'usage_opportunity' =>array('type'=>'integer', 'label'=>'UsageOpportunity', 'enabled'=>1, 'visible'=>-1, 'position'=>135),
'usage_task' =>array('type'=>'integer', 'label'=>'UsageTasks', 'enabled'=>1, 'visible'=>-1, 'position'=>140),
'usage_organize_event' =>array('type'=>'integer', 'label'=>'UsageOrganizeEvent', 'enabled'=>1, 'visible'=>-1, 'position'=>145),
- 'accept_conference_suggestions' =>array('type'=>'integer', 'label'=>'AllowUnknownPeopleSuggestConf', 'enabled'=>1, 'visible'=>-1, 'position'=>146),
- 'accept_booth_suggestions' =>array('type'=>'integer', 'label'=>'AllowUnknownPeopleSuggestBooth', 'enabled'=>1, 'visible'=>-1, 'position'=>147),
- 'price_registration' =>array('type'=>'double(24,8)', 'label'=>'PriceOfRegistration', 'enabled'=>1, 'visible'=>-1, 'position'=>148),
- 'price_booth' =>array('type'=>'double(24,8)', 'label'=>'PriceOfBooth', 'enabled'=>1, 'visible'=>-1, 'position'=>149),
- 'max_attendees' =>array('type'=>'integer', 'label'=>'MaxNbOfAttendees', 'enabled'=>1, 'visible'=>-1, 'position'=>150),
- 'datec' =>array('type'=>'datetime', 'label'=>'DateCreationShort', 'enabled'=>1, 'visible'=>-2, 'position'=>200),
- 'tms' =>array('type'=>'timestamp', 'label'=>'DateModificationShort', 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>205),
- 'fk_user_creat' =>array('type'=>'integer', 'label'=>'UserCreation', 'enabled'=>1, 'visible'=>0, 'notnull'=>1, 'position'=>210),
- 'fk_user_modif' =>array('type'=>'integer', 'label'=>'UserModification', 'enabled'=>1, 'visible'=>0, 'position'=>215),
- 'import_key' =>array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>0, 'position'=>220),
- 'email_msgid'=>array('type'=>'varchar(255)', 'label'=>'EmailMsgID', 'enabled'=>1, 'visible'=>-1, 'position'=>250, 'help'=>'EmailMsgIDWhenSourceisEmail'),
+ // Properties for event organization
+ 'date_start_event' =>array('type'=>'date', 'label'=>'DateStartEvent', 'enabled'=>1, 'visible'=>1, 'position'=>200),
+ 'date_end_event' =>array('type'=>'date', 'label'=>'DateEndEvent', 'enabled'=>1, 'visible'=>1, 'position'=>201),
+ 'location' =>array('type'=>'text', 'label'=>'Location', 'enabled'=>1, 'visible'=>3, 'position'=>55, 'searchall'=>202),
+ 'accept_conference_suggestions' =>array('type'=>'integer', 'label'=>'AllowUnknownPeopleSuggestConf', 'enabled'=>1, 'visible'=>-1, 'position'=>210),
+ 'accept_booth_suggestions' =>array('type'=>'integer', 'label'=>'AllowUnknownPeopleSuggestBooth', 'enabled'=>1, 'visible'=>-1, 'position'=>211),
+ 'price_registration' =>array('type'=>'double(24,8)', 'label'=>'PriceOfRegistration', 'enabled'=>1, 'visible'=>-1, 'position'=>212),
+ 'price_booth' =>array('type'=>'double(24,8)', 'label'=>'PriceOfBooth', 'enabled'=>1, 'visible'=>-1, 'position'=>215),
+ 'max_attendees' =>array('type'=>'integer', 'label'=>'MaxNbOfAttendees', 'enabled'=>1, 'visible'=>-1, 'position'=>215),
+ // Generic
+ 'datec' =>array('type'=>'datetime', 'label'=>'DateCreationShort', 'enabled'=>1, 'visible'=>-2, 'position'=>400),
+ 'tms' =>array('type'=>'timestamp', 'label'=>'DateModificationShort', 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>405),
+ 'fk_user_creat' =>array('type'=>'integer', 'label'=>'UserCreation', 'enabled'=>1, 'visible'=>0, 'notnull'=>1, 'position'=>410),
+ 'fk_user_modif' =>array('type'=>'integer', 'label'=>'UserModification', 'enabled'=>1, 'visible'=>0, 'position'=>415),
+ 'import_key' =>array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>0, 'position'=>420),
+ 'email_msgid'=>array('type'=>'varchar(255)', 'label'=>'EmailMsgID', 'enabled'=>1, 'visible'=>-1, 'position'=>450, 'help'=>'EmailMsgIDWhenSourceisEmail'),
'fk_statut' =>array('type'=>'smallint(6)', 'label'=>'Status', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'position'=>500)
);
// END MODULEBUILDER PROPERTIES
@@ -408,6 +428,9 @@ class Project extends CommonObject
$sql .= ", price_registration";
$sql .= ", price_booth";
$sql .= ", max_attendees";
+ $sql .= ", date_start_event";
+ $sql .= ", date_end_event";
+ $sql .= ", location";
$sql .= ", email_msgid";
$sql .= ", note_private";
$sql .= ", note_public";
@@ -436,6 +459,9 @@ class Project extends CommonObject
$sql .= ", ".(strcmp($this->price_registration, '') ? price2num($this->price_registration) : 'null');
$sql .= ", ".(strcmp($this->price_booth, '') ? price2num($this->price_booth) : 'null');
$sql .= ", ".(strcmp($this->max_attendees, '') ? ((int) $this->max_attendees) : 'null');
+ $sql .= ", ".($this->date_start_event != '' ? "'".$this->db->idate($this->date_start_event)."'" : 'null');
+ $sql .= ", ".($this->date_end_event != '' ? "'".$this->db->idate($this->date_end_event)."'" : 'null');
+ $sql .= ", ".($this->location ? "'".$this->db->escape($this->location)."'" : 'null');
$sql .= ", ".($this->email_msgid ? "'".$this->db->escape($this->email_msgid)."'" : 'null');
$sql .= ", ".($this->note_private ? "'".$this->db->escape($this->note_private)."'" : 'null');
$sql .= ", ".($this->note_public ? "'".$this->db->escape($this->note_public)."'" : 'null');
@@ -530,11 +556,11 @@ class Project extends CommonObject
$sql .= ", fk_opp_status = ".((is_numeric($this->opp_status) && $this->opp_status > 0) ? $this->opp_status : 'null');
$sql .= ", opp_percent = ".((is_numeric($this->opp_percent) && $this->opp_percent != '') ? $this->opp_percent : 'null');
$sql .= ", public = ".($this->public ? 1 : 0);
- $sql .= ", datec=".($this->date_c != '' ? "'".$this->db->idate($this->date_c)."'" : 'null');
- $sql .= ", dateo=".($this->date_start != '' ? "'".$this->db->idate($this->date_start)."'" : 'null');
- $sql .= ", datee=".($this->date_end != '' ? "'".$this->db->idate($this->date_end)."'" : 'null');
- $sql .= ", date_close=".($this->date_close != '' ? "'".$this->db->idate($this->date_close)."'" : 'null');
- $sql .= ", fk_user_close=".($this->fk_user_close > 0 ? $this->fk_user_close : "null");
+ $sql .= ", datec = ".($this->date_c != '' ? "'".$this->db->idate($this->date_c)."'" : 'null');
+ $sql .= ", dateo = ".($this->date_start != '' ? "'".$this->db->idate($this->date_start)."'" : 'null');
+ $sql .= ", datee = ".($this->date_end != '' ? "'".$this->db->idate($this->date_end)."'" : 'null');
+ $sql .= ", date_close = ".($this->date_close != '' ? "'".$this->db->idate($this->date_close)."'" : 'null');
+ $sql .= ", fk_user_close = ".($this->fk_user_close > 0 ? $this->fk_user_close : "null");
$sql .= ", opp_amount = ".(strcmp($this->opp_amount, '') ? price2num($this->opp_amount) : "null");
$sql .= ", budget_amount = ".(strcmp($this->budget_amount, '') ? price2num($this->budget_amount) : "null");
$sql .= ", fk_user_modif = ".$user->id;
@@ -547,6 +573,9 @@ class Project extends CommonObject
$sql .= ", price_registration = ".(strcmp($this->price_registration, '') ? price2num($this->price_registration) : "null");
$sql .= ", price_booth = ".(strcmp($this->price_booth, '') ? price2num($this->price_booth) : "null");
$sql .= ", max_attendees = ".(strcmp($this->max_attendees, '') ? price2num($this->max_attendees) : "null");
+ $sql .= ", date_start_event = ".($this->date_start_event != '' ? "'".$this->db->idate($this->date_start_event)."'" : 'null');
+ $sql .= ", date_end_event = ".($this->date_end_event != '' ? "'".$this->db->idate($this->date_end_event)."'" : 'null');
+ $sql .= ", location = '".$this->db->escape($this->location)."'";
$sql .= ", entity = ".((int) $this->entity);
$sql .= " WHERE rowid = ".((int) $this->id);
@@ -631,9 +660,9 @@ class Project extends CommonObject
}
$sql = "SELECT rowid, entity, ref, title, description, public, datec, opp_amount, budget_amount,";
- $sql .= " tms, dateo, datee, date_close, fk_soc, fk_user_creat, fk_user_modif, fk_user_close, fk_statut as status, fk_opp_status, opp_percent,";
+ $sql .= " tms, dateo as date_start, datee as date_end, date_close, fk_soc, fk_user_creat, fk_user_modif, fk_user_close, fk_statut as status, fk_opp_status, opp_percent,";
$sql .= " note_private, note_public, model_pdf, usage_opportunity, usage_task, usage_bill_time, usage_organize_event, email_msgid,";
- $sql .= " accept_conference_suggestions, accept_booth_suggestions, price_registration, price_booth, max_attendees";
+ $sql .= " accept_conference_suggestions, accept_booth_suggestions, price_registration, price_booth, max_attendees, date_start_event, date_end_event, location";
$sql .= " FROM ".MAIN_DB_PREFIX."projet";
if (!empty($id)) {
$sql .= " WHERE rowid = ".((int) $id);
@@ -665,8 +694,8 @@ class Project extends CommonObject
$this->datec = $this->db->jdate($obj->datec); // TODO deprecated
$this->date_m = $this->db->jdate($obj->tms);
$this->datem = $this->db->jdate($obj->tms); // TODO deprecated
- $this->date_start = $this->db->jdate($obj->dateo);
- $this->date_end = $this->db->jdate($obj->datee);
+ $this->date_start = $this->db->jdate($obj->date_start);
+ $this->date_end = $this->db->jdate($obj->date_end);
$this->date_close = $this->db->jdate($obj->date_close);
$this->note_private = $obj->note_private;
$this->note_public = $obj->note_public;
@@ -692,6 +721,9 @@ class Project extends CommonObject
$this->price_registration = $obj->price_registration;
$this->price_booth = $obj->price_booth;
$this->max_attendees = $obj->max_attendees;
+ $this->date_start_event = $this->db->jdate($obj->date_start_event);
+ $this->date_end_event = $this->db->jdate($obj->date_end_event);
+ $this->location = $obj->location;
$this->email_msgid = $obj->email_msgid;
$this->db->free($resql);
@@ -894,7 +926,7 @@ class Project extends CommonObject
}
// Fetch tasks
- $this->getLinesArray($user);
+ $this->getLinesArray($user, 0);
// Delete tasks
$ret = $this->deleteTasks($user);
@@ -1247,7 +1279,7 @@ class Project extends CommonObject
$label .= ($label ? '
' : '').'
'.$langs->trans('Label').': '.$this->title; // The space must be after the : to not being explode when showing the title in img_picto
if (isset($this->public)) {
$label .= '
'.$langs->trans("Visibility").": ";
- $label .= ($this->public ? img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"').$langs->trans("SharedProject") : img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"').$langs->trans("PrivateProject"));
+ $label .= ($this->public ? img_picto($langs->trans('SharedProject'), 'world', 'class="pictofixedwidth"').$langs->trans("SharedProject") : img_picto($langs->trans('PrivateProject'), 'private', 'class="pictofixedwidth"').$langs->trans("PrivateProject"));
}
if (!empty($this->thirdparty_name)) {
$label .= ($label ? '
' : '').'
'.$langs->trans('ThirdParty').': '.$this->thirdparty_name; // The space must be after the : to not being explode when showing the title in img_picto
@@ -1308,14 +1340,14 @@ class Project extends CommonObject
$result .= $linkstart;
if ($withpicto) {
- $result .= img_object(($notooltip ? '' : $label), $picto, ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip pictofixedwidth em088"'), 0, 0, $notooltip ? 0 : 1);
+ $result .= img_object(($notooltip ? '' : $label), $picto, ($notooltip ? (($withpicto != 2) ? 'class="pictofixedwidth"' : '') : 'class="'.(($withpicto != 2) ? 'pictofixedwidth ' : '').'classfortooltip pictofixedwidth em088"'), 0, 0, $notooltip ? 0 : 1);
}
if ($withpicto != 2) {
$result .= $this->ref;
}
$result .= $linkend;
if ($withpicto != 2) {
- $result .= (($addlabel && $this->title) ? $sep.dol_trunc($this->title, ($addlabel > 1 ? $addlabel : 0)) : '');
+ $result .= (($addlabel && $this->title) ? '
'.$sep.dol_trunc($this->title, ($addlabel > 1 ? $addlabel : 0)).' ' : '');
}
global $action;
@@ -2014,7 +2046,7 @@ class Project extends CommonObject
$sql .= " AND pt.fk_projet = ".((int) $this->id);
$sql .= " AND (ptt.task_date >= '".$this->db->idate($datestart)."' ";
$sql .= " AND ptt.task_date <= '".$this->db->idate(dol_time_plus_duree($datestart, 1, 'm') - 1)."')";
- if ($task_id) {
+ if ($taskid) {
$sql .= " AND ptt.fk_task=".((int) $taskid);
}
if (is_numeric($userid)) {
@@ -2268,14 +2300,15 @@ class Project extends CommonObject
/**
* Create an array of tasks of current project
*
- * @param User $user Object user we want project allowed to
- * @return int >0 if OK, <0 if KO
+ * @param User $user Object user we want project allowed to
+ * @param int $loadRoleMode 1= will test Roles on task; 0 used in delete project action
+ * @return int >0 if OK, <0 if KO
*/
- public function getLinesArray($user)
+ public function getLinesArray($user, $loadRoleMode = 1)
{
require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
$taskstatic = new Task($this->db);
- $this->lines = $taskstatic->getTasksArray(0, $user, $this->id, 0, 0);
+ $this->lines = $taskstatic->getTasksArray(0, $user, $this->id, 0, 0, '', '-1', '', 0, 0, array(), 0, array(), 0, $loadRoleMode);
}
}
diff --git a/htdocs/projet/class/task.class.php b/htdocs/projet/class/task.class.php
index 48b0b63e31a..ef04862eb71 100644
--- a/htdocs/projet/class/task.class.php
+++ b/htdocs/projet/class/task.class.php
@@ -811,9 +811,10 @@ class Task extends CommonObjectLine
* @param int $includebilltime Calculate also the time to bill and billed
* @param array $search_array_options Array of search
* @param int $loadextras Fetch all Extrafields on each task
+ * @param int $loadRoleMode 1= will test Roles on task; 0 used in delete project action
* @return array Array of tasks
*/
- public function getTasksArray($usert = null, $userp = null, $projectid = 0, $socid = 0, $mode = 0, $filteronproj = '', $filteronprojstatus = '-1', $morewherefilter = '', $filteronprojuser = 0, $filterontaskuser = 0, $extrafields = array(), $includebilltime = 0, $search_array_options = array(), $loadextras = 0)
+ public function getTasksArray($usert = null, $userp = null, $projectid = 0, $socid = 0, $mode = 0, $filteronproj = '', $filteronprojstatus = '-1', $morewherefilter = '', $filteronprojuser = 0, $filterontaskuser = 0, $extrafields = array(), $includebilltime = 0, $search_array_options = array(), $loadextras = 0, $loadRoleMode = 1)
{
global $conf, $hookmanager;
@@ -968,14 +969,16 @@ class Task extends CommonObjectLine
$obj = $this->db->fetch_object($resql);
- if ((!$obj->public) && (is_object($userp))) { // If not public project and we ask a filter on project owned by a user
- if (!$this->getUserRolesForProjectsOrTasks($userp, 0, $obj->projectid, 0)) {
- $error++;
+ if ($loadRoleMode) {
+ if ((!$obj->public) && (is_object($userp))) { // If not public project and we ask a filter on project owned by a user
+ if (!$this->getUserRolesForProjectsOrTasks($userp, 0, $obj->projectid, 0)) {
+ $error++;
+ }
}
- }
- if (is_object($usert)) { // If we ask a filter on a user affected to a task
- if (!$this->getUserRolesForProjectsOrTasks(0, $usert, $obj->projectid, $obj->taskid)) {
- $error++;
+ if (is_object($usert)) { // If we ask a filter on a user affected to a task
+ if (!$this->getUserRolesForProjectsOrTasks(0, $usert, $obj->projectid, $obj->taskid)) {
+ $error++;
+ }
}
}
@@ -2200,7 +2203,7 @@ class Task extends CommonObjectLine
$sql .= " t.rowid as taskid, t.progress as progress, t.fk_statut as status,";
$sql .= " t.dateo as date_start, t.datee as datee";
$sql .= " FROM ".MAIN_DB_PREFIX."projet as p";
- $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on p.fk_soc = s.rowid";
+ //$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on p.fk_soc = s.rowid";
//if (! $user->rights->societe->client->voir && ! $socid) $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON sc.fk_soc = s.rowid";
$sql .= ", ".MAIN_DB_PREFIX."projet_task as t";
$sql .= " WHERE p.entity IN (".getEntity('project', 0).')';
diff --git a/htdocs/projet/class/taskstats.class.php b/htdocs/projet/class/taskstats.class.php
index a5b088f01e8..5794d585101 100644
--- a/htdocs/projet/class/taskstats.class.php
+++ b/htdocs/projet/class/taskstats.class.php
@@ -193,4 +193,35 @@ class TaskStats extends Stats
// var_dump($res);print '
';
return $res;
}
+
+
+ /**
+ * Return the Task amount by month for a year
+ *
+ * @param int $year Year to scan
+ * @param int $format 0=Label of abscissa is a translated text, 1=Label of abscissa is month number, 2=Label of abscissa is first letter of month
+ * @return array Array with amount by month
+ */
+ public function getAmountByMonth($year, $format = 0)
+ {
+ // Return an empty array at the moment because task has no amount
+ return array();
+ }
+
+ /**
+ * Return average of entity by month
+ * @param int $year year number
+ * @return int value
+ */
+ protected function getAverageByMonth($year)
+ {
+ $sql = "SELECT date_format(datef,'%m') as dm, AVG(f.".$this->field.")";
+ $sql .= " FROM ".$this->from;
+ $sql .= " WHERE f.datef BETWEEN '".$this->db->idate(dol_get_first_day($year))."' AND '".$this->db->idate(dol_get_last_day($year))."'";
+ $sql .= " AND ".$this->where;
+ $sql .= " GROUP BY dm";
+ $sql .= $this->db->order('dm', 'DESC');
+
+ return $this->_getAverageByMonth($year, $sql);
+ }
}
diff --git a/htdocs/projet/comment.php b/htdocs/projet/comment.php
index 5ea5b920f8c..024dce3abc9 100644
--- a/htdocs/projet/comment.php
+++ b/htdocs/projet/comment.php
@@ -105,7 +105,7 @@ $morehtmlref = '
';
$morehtmlref .= $object->title;
// Thirdparty
if (!empty($object->thirdparty->id) && $object->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '
';
@@ -134,15 +134,6 @@ if ($object->public) {
}
print '';
-// Date start - end
-print '
'.$langs->trans("DateStart").' - '.$langs->trans("DateEnd").' ';
-print dol_print_date($object->date_start, 'day');
-$end = dol_print_date($object->date_end, 'day');
-if ($end) {
- print ' - '.$end;
-}
-print ' ';
-
// Budget
print '
'.$langs->trans("Budget").' ';
if (strcmp($object->budget_amount, '')) {
@@ -150,6 +141,15 @@ if (strcmp($object->budget_amount, '')) {
}
print ' ';
+// Date start - end project
+print '
'.$langs->trans("Dates").' ';
+print dol_print_date($object->date_start, 'day');
+$end = dol_print_date($object->date_end, 'day');
+if ($end) {
+ print ' - '.$end;
+}
+print ' ';
+
// Other attributes
$cols = 2;
// include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php';
diff --git a/htdocs/projet/contact.php b/htdocs/projet/contact.php
index ee37aa68fdd..f6827fc19b3 100644
--- a/htdocs/projet/contact.php
+++ b/htdocs/projet/contact.php
@@ -296,7 +296,7 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $object->title;
// Thirdparty
if (!empty($object->thirdparty->id) && $object->thirdparty->id > 0) {
- $morehtmlref .= '
'.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= '
'.$object->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '
';
@@ -385,8 +385,15 @@ if ($id > 0 || !empty($ref)) {
print '';
}
- // Date start - end
- print '
'.$langs->trans("DateStart").' - '.$langs->trans("DateEnd").' ';
+ // Budget
+ print ' '.$langs->trans("Budget").' ';
+ if (strcmp($object->budget_amount, '')) {
+ print ''.price($object->budget_amount, '', $langs, 0, 0, 0, $conf->currency).' ';
+ }
+ print ' ';
+
+ // Date start - end project
+ print '
'.$langs->trans("Dates").' ';
$start = dol_print_date($object->date_start, 'day');
print ($start ? $start : '?');
$end = dol_print_date($object->date_end, 'day');
@@ -397,13 +404,6 @@ if ($id > 0 || !empty($ref)) {
}
print ' ';
- // Budget
- print '
'.$langs->trans("Budget").' ';
- if (strcmp($object->budget_amount, '')) {
- print ''.price($object->budget_amount, '', $langs, 0, 0, 0, $conf->currency).' ';
- }
- print ' ';
-
// Other attributes
$cols = 2;
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
diff --git a/htdocs/projet/document.php b/htdocs/projet/document.php
index 0a2acc4c3bc..bb50bf0def6 100644
--- a/htdocs/projet/document.php
+++ b/htdocs/projet/document.php
@@ -138,7 +138,7 @@ if ($object->id > 0) {
$morehtmlref .= $object->title;
// Thirdparty
if (!empty($object->thirdparty->id) && $object->thirdparty->id > 0) {
- $morehtmlref .= '
'.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= '
'.$object->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '
';
diff --git a/htdocs/projet/element.php b/htdocs/projet/element.php
index 032677c27d8..f96f5737cf4 100644
--- a/htdocs/projet/element.php
+++ b/htdocs/projet/element.php
@@ -99,7 +99,7 @@ if (!empty($conf->salaries->enabled)) {
if (isModEnabled('categorie')) {
require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
}
-if (!empty($conf->mrp->enabled)) {
+if (isModEnabled('mrp')) {
require_once DOL_DOCUMENT_ROOT.'/mrp/class/mo.class.php';
}
@@ -132,7 +132,7 @@ if (!empty($conf->loan->enabled)) {
if (!empty($conf->salaries->enabled)) {
$langs->load("salaries");
}
-if (!empty($conf->mrp->enabled)) {
+if (isModEnabled('mrp')) {
$langs->load("mrp");
}
if (isModEnabled('eventorganization')) {
@@ -218,7 +218,7 @@ $morehtmlref = '';
$morehtmlref .= $object->title;
// Thirdparty
if (!empty($object->thirdparty->id) && $object->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '
';
@@ -307,8 +307,15 @@ if (!empty($conf->global->PROJECT_USE_OPPORTUNITIES)) {
print '';
}
-// Date start - end
-print ''.$langs->trans("DateStart").' - '.$langs->trans("DateEnd").' ';
+// Budget
+print ' '.$langs->trans("Budget").' ';
+if (strcmp($object->budget_amount, '')) {
+ print ''.price($object->budget_amount, '', $langs, 1, 0, 0, $conf->currency).' ';
+}
+print ' ';
+
+// Date start - end project
+print ''.$langs->trans("Dates").' ';
$start = dol_print_date($object->date_start, 'day');
print ($start ? $start : '?');
$end = dol_print_date($object->date_end, 'day');
@@ -319,13 +326,6 @@ if ($object->hasDelay()) {
}
print ' ';
-// Budget
-print ''.$langs->trans("Budget").' ';
-if (strcmp($object->budget_amount, '')) {
- print ''.price($object->budget_amount, '', $langs, 1, 0, 0, $conf->currency).' ';
-}
-print ' ';
-
// Other attributes
$cols = 2;
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
@@ -388,7 +388,7 @@ $listofreferent = array(
'lang'=>'propal',
'buttonnew'=>'AddProp',
'testnew'=>$user->rights->propal->creer,
- 'test'=>$conf->propal->enabled && $user->rights->propale->lire),
+ 'test'=>$conf->propal->enabled && $user->rights->propal->lire),
'order'=>array(
'name'=>"CustomersOrders",
'title'=>"ListOrdersAssociatedProject",
diff --git a/htdocs/projet/ganttview.php b/htdocs/projet/ganttview.php
index c5549429edb..f2889d7c469 100644
--- a/htdocs/projet/ganttview.php
+++ b/htdocs/projet/ganttview.php
@@ -117,7 +117,7 @@ if (($id > 0 && is_numeric($id)) || !empty($ref)) {
$morehtmlref .= $object->title;
// Thirdparty
if (!empty($object->thirdparty->id) && $object->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '';
@@ -179,8 +179,15 @@ if (($id > 0 && is_numeric($id)) || !empty($ref)) {
}
print '';
- // Date start - end
- print ''.$langs->trans("DateStart").' - '.$langs->trans("DateEnd").' ';
+ // Budget
+ print ' '.$langs->trans("Budget").' ';
+ if (strcmp($object->budget_amount, '')) {
+ print price($object->budget_amount, '', $langs, 1, 0, 0, $conf->currency);
+ }
+ print ' ';
+
+ // Date start - end project
+ print ''.$langs->trans("Dates").' ';
$start = dol_print_date($object->date_start, 'day');
print ($start ? $start : '?');
$end = dol_print_date($object->date_end, 'day');
@@ -191,13 +198,6 @@ if (($id > 0 && is_numeric($id)) || !empty($ref)) {
}
print ' ';
- // Budget
- print ''.$langs->trans("Budget").' ';
- if (strcmp($object->budget_amount, '')) {
- print price($object->budget_amount, '', $langs, 1, 0, 0, $conf->currency);
- }
- print ' ';
-
// Other attributes
$cols = 2;
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
diff --git a/htdocs/projet/graph_opportunities.inc.php b/htdocs/projet/graph_opportunities.inc.php
index ae0542d8b4b..8c6fc512509 100644
--- a/htdocs/projet/graph_opportunities.inc.php
+++ b/htdocs/projet/graph_opportunities.inc.php
@@ -43,7 +43,7 @@ if (!empty($conf->global->PROJECT_USE_OPPORTUNITIES)) {
$valsnb = array();
$valsamount = array();
$dataseries = array();
- // -1=Canceled, 0=Draft, 1=Validated, (2=Accepted/On process not managed for customer orders), 3=Closed (Sent/Received, billed or not)
+ // -1=Canceled, 0=Draft, 1=Validated, (2=Accepted/On process not managed for sale orders), 3=Closed (Sent/Received, billed or not)
while ($i < $num) {
$obj = $db->fetch_object($resql);
if ($obj) {
diff --git a/htdocs/projet/index.php b/htdocs/projet/index.php
index b0e779a5bec..2698a4b1a21 100644
--- a/htdocs/projet/index.php
+++ b/htdocs/projet/index.php
@@ -1,6 +1,6 @@
- * Copyright (C) 2004-2020 Laurent Destailleur
+ * Copyright (C) 2004-2022 Laurent Destailleur
* Copyright (C) 2005-2010 Regis Houssin
* Copyright (C) 2019 Nicolas ZABOURI
*
@@ -259,7 +259,7 @@ if ($resql) {
$companystatic->status = $obj->thirdpartystatus;
print '';
- print '';
+ print ' ';
print $projectstatic->getNomUrl(1);
print ' ';
diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php
index 2193b0e6676..1d1ad691505 100644
--- a/htdocs/projet/list.php
+++ b/htdocs/projet/list.php
@@ -35,6 +35,8 @@ require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
+require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
if (isModEnabled('categorie')) {
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcategory.class.php';
@@ -143,15 +145,12 @@ $search_date_end_endmonth = GETPOST('search_date_end_endmonth', 'int');
$search_date_end_endyear = GETPOST('search_date_end_endyear', 'int');
$search_date_end_endday = GETPOST('search_date_end_endday', 'int');
$search_date_end_end = dol_mktime(23, 59, 59, $search_date_end_endmonth, $search_date_end_endday, $search_date_end_endyear); // Use tzserver
-
+$search_category_array = GETPOST("search_category_".Categorie::TYPE_PROJECT."_list", "array");
if ($search_status == '') {
$search_status = -1; // -1 or 1
}
-if (isModEnabled('categorie')) {
- $search_category_array = GETPOST("search_category_".Categorie::TYPE_PROJECT."_list", "array");
-}
// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
$object = new Project($db);
@@ -358,8 +357,10 @@ if (empty($reshook)) {
*/
$form = new Form($db);
+$formcompany = new FormCompany($db);
$companystatic = new Societe($db);
+$taskstatic = new Task($db);
$formother = new FormOther($db);
$formproject = new FormProjets($db);
@@ -424,9 +425,6 @@ $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $obje
$sql .= preg_replace('/^,/', '', $hookmanager->resPrint);
$sql = preg_replace('/,\s*$/', '', $sql);
$sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as p";
-if (isModEnabled('categorie')) {
- $sql .= Categorie::getFilterJoinQuery(Categorie::TYPE_PROJECT, "p.rowid");
-}
if (!empty($extrafields->attributes[$object->table_element]['label']) &&is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (p.rowid = ef.fk_object)";
}
@@ -447,9 +445,6 @@ if ($search_project_contact > 0) {
$sql .= ", ".MAIN_DB_PREFIX."element_contact as ecp_contact";
}
$sql .= " WHERE p.entity IN (".getEntity('project').')';
-if (isModEnabled('categorie')) {
- $sql .= Categorie::getFilterSelectQuery(Categorie::TYPE_PROJECT, "p.rowid", $search_category_array);
-}
if (empty($user->rights->projet->all->lire)) {
$sql .= " AND p.rowid IN (".$db->sanitize($projectsListId).")"; // public and assigned to, or restricted to company for external users
}
@@ -569,6 +564,36 @@ if ($search_price_booth != '') {
if ($search_login) {
$sql .= natural_search(array('u.login', 'u.firstname', 'u.lastname'), $search_login);
}
+// Search for tag/category ($searchCategoryProjectList is an array of ID)
+$searchCategoryProjectList = $search_category_array;
+$searchCategoryProjectOperator = 0;
+if (!empty($searchCategoryProjectList)) {
+ $searchCategoryProjectSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategoryProjectList as $searchCategoryProject) {
+ if (intval($searchCategoryProject) == -2) {
+ $searchCategoryProjectSqlList[] = "NOT EXISTS (SELECT ck.fk_project FROM ".MAIN_DB_PREFIX."categorie_project as ck WHERE p.rowid = ck.fk_project)";
+ } elseif (intval($searchCategoryProject) > 0) {
+ if ($searchCategoryProjectOperator == 0) {
+ $searchCategoryProjectSqlList[] = " EXISTS (SELECT ck.fk_project FROM ".MAIN_DB_PREFIX."categorie_project as ck WHERE p.rowid = ck.fk_project AND ck.fk_categorie = ".((int) $searchCategoryProject).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProject);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategoryProjectSqlList[] = " EXISTS (SELECT ck.fk_project FROM ".MAIN_DB_PREFIX."categorie_project as ck WHERE p.rowid = ck.fk_project AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategoryProjectOperator == 1) {
+ if (!empty($searchCategoryProjectSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryProjectSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryProjectSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryProjectSqlList).")";
+ }
+ }
+}
// Add where from extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
// Add where from hooks
@@ -781,6 +806,7 @@ $arrayofmassactions = array(
//if($user->rights->societe->creer) $arrayofmassactions['createbills']=$langs->trans("CreateInvoiceForThisCustomer");
if ($user->rights->projet->creer) {
$arrayofmassactions['close'] = img_picto('', 'close_title', 'class="pictofixedwidth"').$langs->trans("Close");
+ $arrayofmassactions['preaffectuser'] = img_picto('', 'user', 'class="pictofixedwidth"').$langs->trans("AffectUser");
}
if ($user->rights->projet->supprimer) {
$arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
@@ -788,7 +814,7 @@ if ($user->rights->projet->supprimer) {
if (isModEnabled('category') && $user->rights->projet->creer) {
$arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("AffectTag");
}
-if (in_array($massaction, array('presend', 'predelete', 'preaffecttag'))) {
+if (in_array($massaction, array('presend', 'predelete', 'preaffecttag', 'preaffectuser'))) {
$arrayofmassactions = array();
}
@@ -973,10 +999,11 @@ if (!empty($arrayfields['p.datee']['checked'])) {
print '';
print '';
}
+// Visibility
if (!empty($arrayfields['p.public']['checked'])) {
print '';
$array = array(''=>'', 0 => $langs->trans("PrivateProject"), 1 => $langs->trans("SharedProject"));
- print $form->selectarray('search_public', $array, $search_public);
+ print $form->selectarray('search_public', $array, $search_public, 0, 0, 0, '', 0, 0, 0, '', 'maxwidth75');
print ' ';
}
if (!empty($arrayfields['c.assigned']['checked'])) {
@@ -986,7 +1013,7 @@ if (!empty($arrayfields['c.assigned']['checked'])) {
// Opp status
if (!empty($arrayfields['p.fk_opp_status']['checked'])) {
print '';
- print $formproject->selectOpportunityStatus('search_opp_status', $search_opp_status, 1, 0, 1, 0, 'maxwidth100 nowrapoption', 1, 0);
+ print $formproject->selectOpportunityStatus('search_opp_status', $search_opp_status, 1, 1, 1, 0, 'maxwidth125 nowrapoption', 1, 1);
print ' ';
}
if (!empty($arrayfields['p.opp_amount']['checked'])) {
@@ -1245,6 +1272,9 @@ while ($i < $imaxinloop) {
print ' ';
}
print '';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
}
// Project url
if (!empty($arrayfields['p.ref']['checked'])) {
@@ -1295,7 +1325,7 @@ while ($i < $imaxinloop) {
}
// Sales Representatives
if (!empty($arrayfields['commercial']['checked'])) {
- print '';
+ print ' ';
if ($obj->socid) {
$companystatic->id = $obj->socid;
$companystatic->name = $obj->name;
@@ -1337,7 +1367,8 @@ while ($i < $imaxinloop) {
$totalarray['nbfield']++;
}
}
- // Date start
+
+ // Date start project
if (!empty($arrayfields['p.dateo']['checked'])) {
print ' ';
print dol_print_date($db->jdate($obj->date_start), 'day');
@@ -1346,7 +1377,7 @@ while ($i < $imaxinloop) {
$totalarray['nbfield']++;
}
}
- // Date end
+ // Date end project
if (!empty($arrayfields['p.datee']['checked'])) {
print ' ';
print dol_print_date($db->jdate($obj->date_end), 'day');
@@ -1355,6 +1386,7 @@ while ($i < $imaxinloop) {
$totalarray['nbfield']++;
}
}
+
// Visibility
if (!empty($arrayfields['p.public']['checked'])) {
print ' ';
@@ -1372,10 +1404,10 @@ while ($i < $imaxinloop) {
}
// Contacts of project
if (!empty($arrayfields['c.assigned']['checked'])) {
- print ' ';
+ print ' ';
$ifisrt = 1;
foreach (array('internal', 'external') as $source) {
- $tab = $object->liste_contact(-1, $source);
+ $tab = $object->liste_contact(-1, $source, 0, '', 1);
$numcontact = count($tab);
if (!empty($numcontact)) {
foreach ($tab as $contactproject) {
@@ -1404,6 +1436,9 @@ while ($i < $imaxinloop) {
}
}
print ' ';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
}
// Opp Status
if (!empty($arrayfields['p.fk_opp_status']['checked'])) {
@@ -1588,7 +1623,7 @@ while ($i < $imaxinloop) {
$userstatic->gender = $obj->gender;
if (!empty($arrayfields['u.login']['checked'])) {
- print '';
+ print ' ';
if ($userstatic->id) {
print $userstatic->getNomUrl(-1);
} else {
@@ -1648,9 +1683,9 @@ while ($i < $imaxinloop) {
print ' ';
}
print ' ';
- }
- if (!$i) {
- $totalarray['nbfield']++;
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
}
print " \n";
diff --git a/htdocs/projet/messaging.php b/htdocs/projet/messaging.php
new file mode 100644
index 00000000000..7fe5b4a0b9d
--- /dev/null
+++ b/htdocs/projet/messaging.php
@@ -0,0 +1,221 @@
+
+ * Copyright (C) 2005-2009 Regis Houssin
+ *
+ * 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 .
+ */
+
+/**
+ * \file htdocs/projet/messaging.php
+ * \ingroup project
+ * \brief Page with events on project
+ */
+
+// Load Dolibarr environment
+require '../main.inc.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
+
+// Load translation files required by the page
+$langs->load("projects");
+
+$id = GETPOST('id', 'int');
+$ref = GETPOST('ref', 'alpha');
+$socid = GETPOST('socid', 'int');
+$action = GETPOST('action', 'aZ09');
+
+$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
+$sortfield = GETPOST("sortfield", "aZ09comma");
+$sortorder = GETPOST("sortorder", 'aZ09comma');
+$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
+$page = is_numeric($page) ? $page : 0;
+$page = $page == -1 ? 0 : $page;
+if (!$sortfield) {
+ $sortfield = "a.datep,a.id";
+}
+if (!$sortorder) {
+ $sortorder = "DESC";
+}
+$offset = $limit * $page;
+$pageprev = $page - 1;
+$pagenext = $page + 1;
+
+if (GETPOST('actioncode', 'array')) {
+ $actioncode = GETPOST('actioncode', 'array', 3);
+ if (!count($actioncode)) {
+ $actioncode = '0';
+ }
+} else {
+ $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT));
+}
+$search_agenda_label = GETPOST('search_agenda_label');
+
+$hookmanager->initHooks(array('projectcardinfo'));
+
+// Security check
+$id = GETPOST("id", 'int');
+$socid = 0;
+//if ($user->socid > 0) $socid = $user->socid; // For external user, no check is done on company because readability is managed by public status of project and assignement.
+$result = restrictedArea($user, 'projet', $id, 'projet&project');
+
+if (!$user->rights->projet->lire) {
+ accessforbidden();
+}
+
+
+
+/*
+ * Actions
+ */
+
+$parameters = array('id'=>$socid);
+$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
+if ($reshook < 0) {
+ setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+}
+
+// Purge search criteria
+if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All test are required to be compatible with all browsers
+ $actioncode = '';
+ $search_agenda_label = '';
+}
+
+
+
+/*
+ * View
+ */
+
+$form = new Form($db);
+$object = new Project($db);
+
+if ($id > 0 || !empty($ref)) {
+ $object->fetch($id, $ref);
+ $object->fetch_thirdparty();
+ if (!empty($conf->global->PROJECT_ALLOW_COMMENT_ON_PROJECT) && method_exists($object, 'fetchComments') && empty($object->comments)) {
+ $object->fetchComments();
+ }
+ $object->info($object->id);
+}
+$agenda = (isModEnabled('agenda') && (!empty($user->rights->agenda->myactions->read) || !empty($user->rights->agenda->allactions->read))) ? '/'.$langs->trans("Agenda") : '';
+$title = $langs->trans('Events').$agenda.' - '.$object->ref.' '.$object->name;
+if (!empty($conf->global->MAIN_HTML_TITLE) && preg_match('/projectnameonly/', $conf->global->MAIN_HTML_TITLE) && $object->name) {
+ $title = $object->ref.' '.$object->name.' - '.$langs->trans("Info");
+}
+$help_url = "EN:Module_Projects|FR:Module_Projets|ES:Módulo_Proyectos";
+llxHeader("", $title, $help_url);
+
+$head = project_prepare_head($object);
+
+print dol_get_fiche_head($head, 'agenda', $langs->trans("Project"), -1, ($object->public ? 'projectpub' : 'project'));
+
+
+// Project card
+
+$linkback = ''.$langs->trans("BackToList").' ';
+
+$morehtmlref = '';
+// Title
+$morehtmlref .= $object->title;
+// Thirdparty
+if (!empty($object->thirdparty->id) && $object->thirdparty->id > 0) {
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1, 'project');
+}
+$morehtmlref .= '
';
+
+// Define a complementary filter for search of next/prev ref.
+if (empty($user->rights->projet->all->lire)) {
+ $objectsListId = $object->getProjectsAuthorizedForUser($user, 0, 0);
+ $object->next_prev_filter = " rowid IN (".$db->sanitize(count($objectsListId) ?join(',', array_keys($objectsListId)) : '0').")";
+}
+
+dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
+
+
+print '';
+print '
';
+
+dol_print_object_info($object, 1);
+
+print '
';
+
+print '
';
+
+print dol_get_fiche_end();
+
+
+// Actions buttons
+
+$out = '';
+$permok = $user->rights->agenda->myactions->create;
+if ($permok) {
+ $out .= '&projectid='.$object->id;
+}
+
+
+
+//print '';
+
+if (!empty($object->id)) {
+ print ' ';
+
+ //print '';
+ $morehtmlcenter = '';
+
+ // Show link to change view in message
+ $messagingUrl = DOL_URL_ROOT.'/projet/messaging.php?id='.$object->id;
+ $morehtmlcenter .= dolGetButtonTitle($langs->trans('ShowAsConversation'), '', 'fa fa-comments imgforviewmode', $messagingUrl, '', 2);
+
+ // Show link to change view in agenda
+ $messagingUrl = DOL_URL_ROOT.'/projet/agenda.php?id='.$object->id;
+ $morehtmlcenter .= dolGetButtonTitle($langs->trans('MessageListViewType'), '', 'fa fa-bars imgforviewmode', $messagingUrl, '', 1);
+
+
+ // // Show link to send an email (if read and not closed)
+ // $btnstatus = $object->status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage";
+ // $url = 'card.php?track_id='.$object->track_id.'&action=presend_addmessage&mode=init&private_message=0&send_email=1&backtopage='.urlencode($_SERVER["PHP_SELF"].'?track_id='.$object->track_id).'#formmailbeforetitle';
+ // $morehtmlright .= dolGetButtonTitle($langs->trans('SendMail'), '', 'fa fa-paper-plane', $url, 'email-title-button', $btnstatus);
+
+ // // Show link to add a private message (if read and not closed)
+ // $btnstatus = $object->status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage";
+ // $url = 'card.php?track_id='.$object->track_id.'&action=presend_addmessage&mode=init&backtopage='.urlencode($_SERVER["PHP_SELF"].'?track_id='.$object->track_id).'#formmailbeforetitle';
+ // $morehtmlright .= dolGetButtonTitle($langs->trans('TicketAddMessage'), '', 'fa fa-comment-dots', $url, 'add-new-ticket-title-button', $btnstatus);
+
+ // Show link to add event
+ if (isModEnabled('agenda')) {
+ $addActionBtnRight = !empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create);
+ $morehtmlcenter .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create'.$out.'&socid='.$object->socid.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.$object->id), '', $addActionBtnRight);
+ }
+
+ $param = '&id='.$object->id;
+ if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
+ $param .= '&contextpage='.$contextpage;
+ }
+ if ($limit > 0 && $limit != $conf->liste_limit) {
+ $param .= '&limit='.$limit;
+ }
+
+ print_barre_liste($langs->trans("ActionsOnProject"), 0, $_SERVER["PHP_SELF"], '', $sortfield, $sortorder, '', 0, -1, '', 0, $morehtmlcenter, '', 0, 1, 1);
+
+ // List of all actions
+ $filters = array();
+ $filters['search_agenda_label'] = $search_agenda_label;
+ show_actions_messaging($conf, $langs, $db, $object, null, 0, $actioncode, '', $filters, $sortfield, $sortorder);
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/projet/note.php b/htdocs/projet/note.php
index ce099c04745..3ca7949b35a 100644
--- a/htdocs/projet/note.php
+++ b/htdocs/projet/note.php
@@ -102,7 +102,7 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $object->title;
// Thirdparty
if (!empty($object->thirdparty->id) && $object->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '
';
diff --git a/htdocs/projet/stats/index.php b/htdocs/projet/stats/index.php
index ba293dea744..32498121045 100644
--- a/htdocs/projet/stats/index.php
+++ b/htdocs/projet/stats/index.php
@@ -41,7 +41,7 @@ if ($user->socid > 0) {
$action = '';
$socid = $user->socid;
}
-$nowyear = strftime("%Y", dol_now());
+$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$year = GETPOST('year', 'int') > 0 ? GETPOST('year', 'int') : $nowyear;
$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS)));
$endyear = $year;
diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php
index 73d3c238026..951406b4275 100644
--- a/htdocs/projet/tasks.php
+++ b/htdocs/projet/tasks.php
@@ -553,7 +553,7 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $object->title;
// Thirdparty
if (!empty($object->thirdparty->id) && $object->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '';
@@ -614,8 +614,15 @@ if ($id > 0 || !empty($ref)) {
}
print '';
- // Date start - end
- print ''.$langs->trans("DateStart").' - '.$langs->trans("DateEnd").' ';
+ // Budget
+ print ' '.$langs->trans("Budget").' ';
+ if (strcmp($object->budget_amount, '')) {
+ print ''.price($object->budget_amount, '', $langs, 1, 0, 0, $conf->currency).' ';
+ }
+ print ' ';
+
+ // Date start - end project
+ print ''.$langs->trans("Dates").' ';
$start = dol_print_date($object->date_start, 'day');
print ($start ? $start : '?');
$end = dol_print_date($object->date_end, 'day');
@@ -626,13 +633,6 @@ if ($id > 0 || !empty($ref)) {
}
print ' ';
- // Budget
- print ''.$langs->trans("Budget").' ';
- if (strcmp($object->budget_amount, '')) {
- print ''.price($object->budget_amount, '', $langs, 1, 0, 0, $conf->currency).' ';
- }
- print ' ';
-
// Other attributes
$cols = 2;
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
@@ -750,12 +750,12 @@ if ($action == 'create' && $user->rights->projet->creer && (empty($object->third
}
print '';
- // Date start
+ // Date start task
print ''.$langs->trans("DateStart").' ';
print $form->selectDate((!empty($date_start) ? $date_start : ''), 'dateo', 1, 1, 0, '', 1, 1);
print ' ';
- // Date end
+ // Date end task
print ''.$langs->trans("DateEnd").' ';
print $form->selectDate((!empty($date_end) ? $date_end : -1), 'datee', -1, 1, 0, '', 1, 1);
print ' ';
@@ -774,18 +774,14 @@ if ($action == 'create' && $user->rights->projet->creer && (empty($object->third
print ''.$langs->trans("Description").' ';
print '';
- if (empty($conf->global->FCKEDITOR_ENABLE_SOCIETE)) {
- print ''.$description.' ';
- } else {
- // WYSIWYG editor
- include_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
- $cked_enabled = (!empty($conf->global->FCKEDITOR_ENABLE_DETAILS) ? $conf->global->FCKEDITOR_ENABLE_DETAILS : 0);
- if (!empty($conf->global->MAIN_INPUT_DESC_HEIGHT)) {
- $nbrows = $conf->global->MAIN_INPUT_DESC_HEIGHT;
- }
- $doleditor = new DolEditor('description', $object->description, '', 80, 'dolibarr_details', '', false, true, $cked_enabled, $nbrows);
- print $doleditor->Create();
+ // WYSIWYG editor
+ include_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
+ $cked_enabled = (!empty($conf->global->FCKEDITOR_ENABLE_SOCIETE) ? $conf->global->FCKEDITOR_ENABLE_SOCIETE : 0);
+ if (!empty($conf->global->MAIN_INPUT_DESC_HEIGHT)) {
+ $nbrows = $conf->global->MAIN_INPUT_DESC_HEIGHT;
}
+ $doleditor = new DolEditor('description', $object->description, '', 80, 'dolibarr_details', '', false, true, $cked_enabled, $nbrows);
+ print $doleditor->Create();
print ' ';
diff --git a/htdocs/projet/tasks/comment.php b/htdocs/projet/tasks/comment.php
index 1f5628bb050..4540112f4c3 100644
--- a/htdocs/projet/tasks/comment.php
+++ b/htdocs/projet/tasks/comment.php
@@ -132,7 +132,7 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $projectstatic->title;
// Thirdparty
if ($projectstatic->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$projectstatic->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$projectstatic->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '';
@@ -221,8 +221,15 @@ if ($id > 0 || !empty($ref)) {
print '';
}
- // Date start - end
- print ''.$langs->trans("DateStart").' - '.$langs->trans("DateEnd").' ';
+ // Budget
+ print ' '.$langs->trans("Budget").' ';
+ if (strcmp($projectstatic->budget_amount, '')) {
+ print price($projectstatic->budget_amount, '', $langs, 1, 0, 0, $conf->currency);
+ }
+ print ' ';
+
+ // Date start - end project
+ print ''.$langs->trans("Dates").' ';
$start = dol_print_date($projectstatic->date_start, 'day');
print ($start ? $start : '?');
$end = dol_print_date($projectstatic->date_end, 'day');
@@ -233,13 +240,6 @@ if ($id > 0 || !empty($ref)) {
}
print ' ';
- // Budget
- print ''.$langs->trans("Budget").' ';
- if (strcmp($projectstatic->budget_amount, '')) {
- print price($projectstatic->budget_amount, '', $langs, 1, 0, 0, $conf->currency);
- }
- print ' ';
-
// Other attributes
$cols = 2;
//include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php';
diff --git a/htdocs/projet/tasks/contact.php b/htdocs/projet/tasks/contact.php
index 14a87b375e8..4bbc48900af 100644
--- a/htdocs/projet/tasks/contact.php
+++ b/htdocs/projet/tasks/contact.php
@@ -196,7 +196,7 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $projectstatic->title;
// Thirdparty
if ($projectstatic->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$projectstatic->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$projectstatic->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '';
@@ -257,8 +257,15 @@ if ($id > 0 || !empty($ref)) {
}
print '';
- // Date start - end
- print ''.$langs->trans("DateStart").' - '.$langs->trans("DateEnd").' ';
+ // Budget
+ print ' '.$langs->trans("Budget").' ';
+ if (strcmp($projectstatic->budget_amount, '')) {
+ print price($projectstatic->budget_amount, '', $langs, 1, 0, 0, $conf->currency);
+ }
+ print ' ';
+
+ // Date start - end project
+ print ''.$langs->trans("Dates").' ';
$start = dol_print_date($projectstatic->date_start, 'day');
print ($start ? $start : '?');
$end = dol_print_date($projectstatic->date_end, 'day');
@@ -269,13 +276,6 @@ if ($id > 0 || !empty($ref)) {
}
print ' ';
- // Budget
- print ''.$langs->trans("Budget").' ';
- if (strcmp($projectstatic->budget_amount, '')) {
- print price($projectstatic->budget_amount, '', $langs, 1, 0, 0, $conf->currency);
- }
- print ' ';
-
// Other attributes
$cols = 2;
//include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php';
diff --git a/htdocs/projet/tasks/document.php b/htdocs/projet/tasks/document.php
index 3e569cd557f..6a62e973a62 100644
--- a/htdocs/projet/tasks/document.php
+++ b/htdocs/projet/tasks/document.php
@@ -153,7 +153,7 @@ if ($object->id > 0) {
$morehtmlref .= $projectstatic->title;
// Thirdparty
if ($projectstatic->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$projectstatic->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$projectstatic->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '';
@@ -214,8 +214,15 @@ if ($object->id > 0) {
}
print '';
- // Date start - end
- print ''.$langs->trans("DateStart").' - '.$langs->trans("DateEnd").' ';
+ // Budget
+ print ' '.$langs->trans("Budget").' ';
+ if (strcmp($projectstatic->budget_amount, '')) {
+ print price($projectstatic->budget_amount, '', $langs, 1, 0, 0, $conf->currency);
+ }
+ print ' ';
+
+ // Date start - end project
+ print ''.$langs->trans("Dates").' ';
$start = dol_print_date($projectstatic->date_start, 'day');
print ($start ? $start : '?');
$end = dol_print_date($projectstatic->date_end, 'day');
@@ -226,13 +233,6 @@ if ($object->id > 0) {
}
print ' ';
- // Budget
- print ''.$langs->trans("Budget").' ';
- if (strcmp($projectstatic->budget_amount, '')) {
- print price($projectstatic->budget_amount, '', $langs, 1, 0, 0, $conf->currency);
- }
- print ' ';
-
// Other attributes
$cols = 2;
//include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php';
diff --git a/htdocs/projet/tasks/list.php b/htdocs/projet/tasks/list.php
index 2c84872bb38..fdec5c6a958 100644
--- a/htdocs/projet/tasks/list.php
+++ b/htdocs/projet/tasks/list.php
@@ -46,7 +46,7 @@ $mode = GETPOST('mode', 'aZ');
$id = GETPOST('id', 'int');
$search_all = trim((GETPOST('search_all', 'alphanohtml') != '') ?GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml'));
-$search_categ = GETPOST("search_categ", 'alpha');
+$search_categ = GETPOST("search_categ", 'int');
$search_projectstatus = GETPOST('search_projectstatus');
if (!isset($search_projectstatus) || $search_projectstatus === '') {
@@ -332,13 +332,9 @@ $distinct = 'DISTINCT'; // We add distinct until we are added a protection to be
$sql = "SELECT ".$distinct." p.rowid as projectid, p.ref as projectref, p.title as projecttitle, p.fk_statut as projectstatus, p.datee as projectdatee, p.fk_opp_status, p.public, p.fk_user_creat as projectusercreate, p.usage_bill_time,";
$sql .= " s.nom as name, s.name_alias as alias, s.rowid as socid,";
$sql .= " t.datec as date_creation, t.dateo as date_start, t.datee as date_end, t.tms as date_update,";
-$sql .= " t.rowid as id, t.ref, t.label, t.planned_workload, t.duration_effective, t.progress, t.fk_statut, ";
+$sql .= " t.rowid as id, t.ref, t.label, t.planned_workload, t.duration_effective, t.progress, t.fk_statut,";
$sql .= " t.description, t.fk_task_parent";
$sql .= " ,t.budget_amount";
-// We'll need these fields in order to filter by categ
-if ($search_categ > 0) {
- $sql .= ", cs.fk_categorie, cs.fk_project";
-}
// Add sum fields
if (!empty($arrayfields['t.tobill']['checked']) || !empty($arrayfields['t.billed']['checked'])) {
$sql .= " , SUM(tt.task_duration * ".$db->ifsql("invoice_id IS NULL", "1", "0").") as tobill, SUM(tt.task_duration * ".$db->ifsql("invoice_id IS NULL", "0", "1").") as billed";
@@ -355,10 +351,6 @@ $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // N
$sql .= $hookmanager->resPrint;
$sql .= " FROM ".MAIN_DB_PREFIX."projet as p";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on p.fk_soc = s.rowid";
-// We'll need this table joined to the select in order to filter by categ
-if ($search_categ > 0) {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_project as cs ON p.rowid = cs.fk_project"; // We'll need this table joined to the select in order to filter by categ
-}
$sql .= ", ".MAIN_DB_PREFIX."projet_task as t";
if (!empty($arrayfields['t.tobill']['checked']) || !empty($arrayfields['t.billed']['checked'])) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet_task_time as tt ON tt.fk_task = t.rowid";
@@ -384,12 +376,6 @@ if (is_object($projectstatic) && $projectstatic->id > 0) {
if ($socid) {
$sql .= " AND (p.fk_soc IS NULL OR p.fk_soc = 0 OR p.fk_soc = ".((int) $socid).")";
}
-if ($search_categ > 0) {
- $sql .= " AND cs.fk_categorie = ".((int) $search_categ);
-}
-if ($search_categ == -2) {
- $sql .= " AND cs.fk_categorie IS NULL";
-}
if ($search_project_ref) {
$sql .= natural_search('p.ref', $search_project_ref);
}
@@ -448,6 +434,36 @@ if ($search_project_user > 0) {
if ($search_task_user > 0) {
$sql .= " AND ect.fk_c_type_contact IN (".$db->sanitize(join(',', array_keys($listoftaskcontacttype))).") AND ect.element_id = t.rowid AND ect.fk_socpeople = ".((int) $search_task_user);
}
+// Search for tag/category ($searchCategoryProjectList is an array of ID)
+$searchCategoryProjectList = array($search_categ);
+$searchCategoryProjectOperator = 0;
+if (!empty($searchCategoryProjectList)) {
+ $searchCategoryProjectSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategoryProjectList as $searchCategoryProject) {
+ if (intval($searchCategoryProject) == -2) {
+ $searchCategoryProjectSqlList[] = "NOT EXISTS (SELECT ck.fk_project FROM ".MAIN_DB_PREFIX."categorie_project as ck WHERE p.rowid = ck.fk_project)";
+ } elseif (intval($searchCategoryProject) > 0) {
+ if ($searchCategoryProjectOperator == 0) {
+ $searchCategoryProjectSqlList[] = " EXISTS (SELECT ck.fk_project FROM ".MAIN_DB_PREFIX."categorie_project as ck WHERE p.rowid = ck.fk_project AND ck.fk_categorie = ".((int) $searchCategoryProject).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProject);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategoryProjectSqlList[] = " EXISTS (SELECT ck.fk_project FROM ".MAIN_DB_PREFIX."categorie_project as ck WHERE p.rowid = ck.fk_project AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategoryProjectOperator == 1) {
+ if (!empty($searchCategoryProjectSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryProjectSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryProjectSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryProjectSqlList).")";
+ }
+ }
+}
// Add where from extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
// Add where from hooks
@@ -459,9 +475,6 @@ if (!empty($arrayfields['t.tobill']['checked']) || !empty($arrayfields['t.billed
$sql .= " s.nom, s.rowid,";
$sql .= " t.datec, t.dateo, t.datee, t.tms,";
$sql .= " t.rowid, t.ref, t.label, t.planned_workload, t.duration_effective, t.progress,t.budget_amount, t.fk_statut";
- if ($search_categ) {
- $sql .= ", cs.fk_categorie, cs.fk_project";
- }
// Add fields from extrafields
if (!empty($extrafields->attributes[$object->table_element]['label'])) {
foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
@@ -675,7 +688,7 @@ if (isModEnabled('categorie') && $user->rights->categorie->lire) {
require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
$moreforfilter .= '';
$tmptitle = $langs->trans('ProjectCategories');
- $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$formother->select_categories('project', $search_categ, 'search_categ', 0, $tmptitle, 'maxwidth300');
+ $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$formother->select_categories('project', $search_categ, 'search_categ', 1, $tmptitle, 'maxwidth300');
$moreforfilter .= '
';
}
@@ -1108,7 +1121,8 @@ while ($i < $imaxinloop) {
$totalarray['nbfield']++;
}
}
- // Date start
+
+ // Date start project
if (!empty($arrayfields['t.dateo']['checked'])) {
print '';
print dol_print_date($db->jdate($obj->date_start), 'day');
@@ -1117,7 +1131,7 @@ while ($i < $imaxinloop) {
$totalarray['nbfield']++;
}
}
- // Date end
+ // Date end project
if (!empty($arrayfields['t.datee']['checked'])) {
print ' ';
print dol_print_date($db->jdate($obj->date_end), 'day');
diff --git a/htdocs/projet/tasks/note.php b/htdocs/projet/tasks/note.php
index 40f8f636e72..01c39c990f4 100644
--- a/htdocs/projet/tasks/note.php
+++ b/htdocs/projet/tasks/note.php
@@ -142,7 +142,7 @@ if ($object->id > 0) {
$morehtmlref .= $projectstatic->title;
// Thirdparty
if ($projectstatic->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$projectstatic->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$projectstatic->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '';
@@ -203,8 +203,15 @@ if ($object->id > 0) {
}
print ' ';
- // Date start - end
- print ''.$langs->trans("DateStart").' - '.$langs->trans("DateEnd").' ';
+ // Budget
+ print ' '.$langs->trans("Budget").' ';
+ if (strcmp($projectstatic->budget_amount, '')) {
+ print price($projectstatic->budget_amount, '', $langs, 1, 0, 0, $conf->currency);
+ }
+ print ' ';
+
+ // Date start - end project
+ print ''.$langs->trans("Dates").' ';
$start = dol_print_date($projectstatic->date_start, 'day');
print ($start ? $start : '?');
$end = dol_print_date($projectstatic->date_end, 'day');
@@ -215,13 +222,6 @@ if ($object->id > 0) {
}
print ' ';
- // Budget
- print ''.$langs->trans("Budget").' ';
- if (strcmp($projectstatic->budget_amount, '')) {
- print price($projectstatic->budget_amount, '', $langs, 1, 0, 0, $conf->currency);
- }
- print ' ';
-
// Other attributes
$cols = 2;
//include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php';
diff --git a/htdocs/projet/tasks/stats/index.php b/htdocs/projet/tasks/stats/index.php
index dd807b7bb93..07b0199d480 100644
--- a/htdocs/projet/tasks/stats/index.php
+++ b/htdocs/projet/tasks/stats/index.php
@@ -44,7 +44,7 @@ if ($user->socid > 0) {
$action = '';
$socid = $user->socid;
}
-$nowyear = strftime("%Y", dol_now());
+$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$year = GETPOST('year') > 0 ?GETPOST('year') : $nowyear;
$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS)));
$endyear = $year;
diff --git a/htdocs/projet/tasks/task.php b/htdocs/projet/tasks/task.php
index ef00a85a0d4..8b19c8c0519 100644
--- a/htdocs/projet/tasks/task.php
+++ b/htdocs/projet/tasks/task.php
@@ -100,8 +100,11 @@ if ($action == 'update' && !GETPOST("cancel") && $user->rights->projet->creer) {
$object->ref = $taskref ? $taskref : GETPOST("ref", 'alpha', 2);
$object->label = GETPOST("label", "alphanohtml");
- if (empty($conf->global->FCKEDITOR_ENABLE_SOCIETE)) $object->description = GETPOST('description', "alphanohtml");
- else $object->description = GETPOST('description', "restricthtml");
+ if (empty($conf->global->FCKEDITOR_ENABLE_SOCIETE)) {
+ $object->description = GETPOST('description', "alphanohtml");
+ } else {
+ $object->description = GETPOST('description', "restricthtml");
+ }
$object->fk_task_parent = $task_parent;
$object->planned_workload = $planned_workload;
$object->date_start = dol_mktime(GETPOST('dateohour', 'int'), GETPOST('dateomin', 'int'), 0, GETPOST('dateomonth', 'int'), GETPOST('dateoday', 'int'), GETPOST('dateoyear', 'int'));
@@ -264,7 +267,7 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $projectstatic->title;
// Thirdparty
if (!empty($projectstatic->thirdparty->id) &&$projectstatic->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$projectstatic->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$projectstatic->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '';
@@ -325,8 +328,15 @@ if ($id > 0 || !empty($ref)) {
}
print '';
- // Date start - end
- print ''.$langs->trans("DateStart").' - '.$langs->trans("DateEnd").' ';
+ // Budget
+ print ' '.$langs->trans("Budget").' ';
+ if (strcmp($projectstatic->budget_amount, '')) {
+ print ''.price($projectstatic->budget_amount, '', $langs, 1, 0, 0, $conf->currency).' ';
+ }
+ print ' ';
+
+ // Date start - end project
+ print ''.$langs->trans("Dates").' ';
$start = dol_print_date($projectstatic->date_start, 'day');
print ($start ? $start : '?');
$end = dol_print_date($projectstatic->date_end, 'day');
@@ -337,13 +347,6 @@ if ($id > 0 || !empty($ref)) {
}
print ' ';
- // Budget
- print ''.$langs->trans("Budget").' ';
- if (strcmp($projectstatic->budget_amount, '')) {
- print ''.price($projectstatic->budget_amount, '', $langs, 1, 0, 0, $conf->currency).' ';
- }
- print ' ';
-
// Other attributes
$cols = 2;
//include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php';
@@ -491,18 +494,14 @@ if ($id > 0 || !empty($ref)) {
print ''.$langs->trans("Description").' ';
print '';
- if (empty($conf->global->FCKEDITOR_ENABLE_SOCIETE)) {
- print ''.$object->description.' ';
- } else {
- // WYSIWYG editor
- include_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
- $cked_enabled = (!empty($conf->global->FCKEDITOR_ENABLE_DETAILS) ? $conf->global->FCKEDITOR_ENABLE_DETAILS : 0);
- if (!empty($conf->global->MAIN_INPUT_DESC_HEIGHT)) {
- $nbrows = $conf->global->MAIN_INPUT_DESC_HEIGHT;
- }
- $doleditor = new DolEditor('description', $object->description, '', 80, 'dolibarr_details', '', false, true, $cked_enabled, $nbrows);
- print $doleditor->Create();
+ // WYSIWYG editor
+ include_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
+ $cked_enabled = (!empty($conf->global->FCKEDITOR_ENABLE_SOCIETE) ? $conf->global->FCKEDITOR_ENABLE_SOCIETE : 0);
+ if (!empty($conf->global->MAIN_INPUT_DESC_HEIGHT)) {
+ $nbrows = $conf->global->MAIN_INPUT_DESC_HEIGHT;
}
+ $doleditor = new DolEditor('description', $object->description, '', 80, 'dolibarr_details', '', false, true, $cked_enabled, $nbrows);
+ print $doleditor->Create();
print ' ';
print ''.$langs->trans("Budget").' ';
@@ -578,7 +577,7 @@ if ($id > 0 || !empty($ref)) {
}
print ' ';
- // Date start - Date end
+ // Date start - Date end task
print ''.$langs->trans("DateStart").' - '.$langs->trans("Deadline").' ';
$start = dol_print_date($object->date_start, 'dayhour');
print ($start ? $start : '?');
@@ -674,14 +673,15 @@ if ($id > 0 || !empty($ref)) {
}
// Delete
- if ($user->rights->projet->supprimer) {
+ $permissiontodelete = $user->hasRight('projet', 'supprimer');
+ if ($permissiontodelete) {
if (!$object->hasChildren() && !$object->hasTimeSpent()) {
- print ''.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken().'&withproject='.((int) $withproject), 'delete', $permissiontodelete);
} else {
- print ''.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans("TaskHasChild"), $langs->trans("Delete"), 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken().'&withproject='.((int) $withproject), 'delete', 0);
}
} else {
- print ''.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken().'&withproject='.((int) $withproject), 'delete', $permissiontodelete);
}
print '';
diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php
index b25ad6fa202..0b6896260c2 100644
--- a/htdocs/projet/tasks/time.php
+++ b/htdocs/projet/tasks/time.php
@@ -54,6 +54,7 @@ $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected i
$contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'timespentlist'; // To manage different context of search
$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
$optioncss = GETPOST('optioncss', 'alpha');
+$mode = GETPOST('mode', 'alpha');
$id = GETPOST('id', 'int');
$projectid = GETPOST('projectid', 'int');
@@ -323,10 +324,10 @@ if (($action == 'updateline' || $action == 'updatesplitline') && !$cancel && $us
}
}
-if ($action == 'confirm_deleteline' && $confirm == "yes" && $user->rights->projet->supprimer) {
- $object->fetchTimeSpent(GETPOST('lineid', 'int')); // load properties like $object->timespent_id
+if ($action == 'confirm_deleteline' && $confirm == "yes" && ($user->hasRight('projet', 'time') || $user->hasRight('projet', 'all', 'creer'))) {
+ $object->fetchTimeSpent(GETPOST('lineid', 'int')); // load properties like $object->timespent_xxx
- if (in_array($object->timespent_fk_user, $childids) || $user->rights->projet->all->creer) {
+ if (in_array($object->timespent_fk_user, $childids) || $user->hasRight('projet', 'all', 'creer')) {
$result = $object->delTimeSpent($user); // delete line with $object->timespent_id
if ($result < 0) {
@@ -432,6 +433,9 @@ if ($action == 'confirm_generateinvoice') {
$tmpinvoice->socid = $projectstatic->thirdparty->id;
$tmpinvoice->date = dol_mktime(GETPOST('rehour', 'int'), GETPOST('remin', 'int'), GETPOST('resec', 'int'), GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int'));
$tmpinvoice->fk_project = $projectstatic->id;
+ $tmpinvoice->cond_reglement_id = $projectstatic->thirdparty->cond_reglement_id;
+ $tmpinvoice->mode_reglement_id = $projectstatic->thirdparty->mode_reglement_id;
+ $tmpinvoice->fk_account = $projectstatic->thirdparty->fk_account;
if ($invoiceToUse) {
$tmpinvoice->fetch($invoiceToUse);
@@ -903,7 +907,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser
$morehtmlref .= $projectstatic->title;
// Thirdparty
if (!empty($projectstatic->thirdparty->id) && $projectstatic->thirdparty->id > 0) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$projectstatic->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= ' '.$projectstatic->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '';
@@ -964,8 +968,15 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser
}
print ' ';
- // Date start - end
- print ''.$langs->trans("DateStart").' - '.$langs->trans("DateEnd").' ';
+ // Budget
+ print ' '.$langs->trans("Budget").' ';
+ if (strcmp($projectstatic->budget_amount, '')) {
+ print ''.price($projectstatic->budget_amount, '', $langs, 1, 0, 0, $conf->currency).' ';
+ }
+ print ' ';
+
+ // Date start - end project
+ print ''.$langs->trans("Dates").' ';
$start = dol_print_date($projectstatic->date_start, 'day');
print ($start ? $start : '?');
$end = dol_print_date($projectstatic->date_end, 'day');
@@ -976,16 +987,12 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser
}
print ' ';
- // Budget
- print ''.$langs->trans("Budget").' ';
- if (strcmp($projectstatic->budget_amount, '')) {
- print ''.price($projectstatic->budget_amount, '', $langs, 1, 0, 0, $conf->currency).' ';
- }
- print ' ';
-
// Other attributes
$cols = 2;
- //include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php';
+ $savobject = $object;
+ $object = $projectstatic;
+ include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php';
+ $object = $savobject;
print '
';
@@ -1124,7 +1131,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser
}
print '';
- // Date start - Date end
+ // Date start - Date end task
print ''.$langs->trans("DateStart").' - '.$langs->trans("Deadline").' ';
$start = dol_print_date($object->date_start, 'dayhour');
print ($start ? $start : '?');
@@ -1886,14 +1893,16 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser
// Thirdparty
if (!empty($arrayfields['p.fk_soc']['checked'])) {
print ' ';
- if (empty($conf->cache['thridparty'][$task_time->fk_soc])) {
- $tmpsociete = new Societe($db);
- $tmpsociete->fetch($task_time->fk_soc);
- $conf->cache['thridparty'][$task_time->fk_soc] = $tmpsociete;
- } else {
- $tmpsociete = $conf->cache['thridparty'][$task_time->fk_soc];
+ if ($task_time->fk_soc > 0) {
+ if (empty($conf->cache['thridparty'][$task_time->fk_soc])) {
+ $tmpsociete = new Societe($db);
+ $tmpsociete->fetch($task_time->fk_soc);
+ $conf->cache['thridparty'][$task_time->fk_soc] = $tmpsociete;
+ } else {
+ $tmpsociete = $conf->cache['thridparty'][$task_time->fk_soc];
+ }
+ print $tmpsociete->getNomUrl(1);
}
- print $tmpsociete->getNomUrl(1);
print ' ';
if (!$i) {
$totalarray['nbfield']++;
@@ -1985,7 +1994,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser
if (!empty($arrayfields['t.note']['checked'])) {
print '';
if ($action == 'editline' && GETPOST('lineid', 'int') == $task_time->rowid) {
- print ''.dol_escape_htmltag($task_time->note).' ';
+ print ''.dol_escape_htmltag($task_time->note, 0, 1).' ';
} else {
print dol_nl2br($task_time->note);
}
@@ -1994,7 +2003,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser
$totalarray['nbfield']++;
}
} elseif ($action == 'editline' && GETPOST('lineid', 'int') == $task_time->rowid) {
- print ' ';
+ print ' ';
}
// Time spent
@@ -2101,7 +2110,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser
print ' ';
print ' ';
} elseif ($user->hasRight('projet', 'time') || $user->hasRight('projet', 'all', 'creer')) { // Read project and enter time consumed on assigned tasks
- if ($task_time->fk_user == $user->id || in_array($task_time->fk_user, $childids) || $user->hasRight('projet', 'all', 'creer')) {
+ if (in_array($task_time->fk_user, $childids) || $user->hasRight('projet', 'all', 'creer')) {
if (getDolGlobalString('MAIN_FEATURES_LEVEL') >= 2) {
print ' ';
print 'rowid.$param.((empty($id) || $tab == 'timespent') ? '&tab=timespent' : '').'">';
@@ -2216,13 +2225,13 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser
if (!empty($arrayfields['t.note']['checked'])) {
print ' ';
if ($action == 'splitline' && GETPOST('lineid', 'int') == $task_time->rowid) {
- print ''.dol_escape_htmltag($task_time->note).' ';
+ print ''.dol_escape_htmltag($task_time->note, 0, 1).' ';
} else {
print dol_nl2br($task_time->note);
}
print ' ';
} elseif ($action == 'splitline' && GETPOST('lineid', 'int') == $task_time->rowid) {
- print ' ';
+ print ' ';
}
// Time spent
@@ -2354,13 +2363,13 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser
if (!empty($arrayfields['t.note']['checked'])) {
print '';
if ($action == 'splitline' && GETPOST('lineid', 'int') == $task_time->rowid) {
- print ''.dol_escape_htmltag($task_time->note).' ';
+ print ''.dol_escape_htmltag($task_time->note, 0, 1).' ';
} else {
print dol_nl2br($task_time->note);
}
print ' ';
} elseif ($action == 'splitline' && GETPOST('lineid', 'int') == $task_time->rowid) {
- print ' ';
+ print ' ';
}
// Time spent
diff --git a/htdocs/public/eventorganization/attendee_new.php b/htdocs/public/eventorganization/attendee_new.php
index 589bf2c8dac..b4f6ee14217 100644
--- a/htdocs/public/eventorganization/attendee_new.php
+++ b/htdocs/public/eventorganization/attendee_new.php
@@ -104,14 +104,16 @@ if ($type == 'global') {
$errmsg .= $project->error;
$errors = array_merge($errors, $project->errors);
} else {
- $sql = "SELECT COUNT(*) as nb FROM ".MAIN_DB_PREFIX."projet";
- $sql .= " WHERE ".MAIN_DB_PREFIX."eventorganization_conferenceorboothattendee = ".((int) $project->id);
+ $sql = "SELECT COUNT(*) as nb FROM ".MAIN_DB_PREFIX."eventorganization_conferenceorboothattendee";
+ $sql .= " WHERE fk_project = ".((int) $project->id);
- $resql = $db->query($resql);
+ $resql = $db->query($sql);
if ($resql) {
$obj = $db->fetch_object($resql);
if ($obj) {
$currentnbofattendees = $obj->nb;
+ } else {
+ dol_print_error($db);
}
}
}
@@ -475,7 +477,7 @@ if (empty($reshook) && $action == 'add' && (!empty($conference->id) && $conferen
$resultprod = $productforinvoicerow->fetch($conf->global->SERVICE_CONFERENCE_ATTENDEE_SUBSCRIPTION);
}
- // Create invoice
+ // Create the draft invoice for the payment
if ($resultprod < 0) {
$error++;
$errmsg .= $productforinvoicerow->error;
@@ -524,12 +526,19 @@ if (empty($reshook) && $action == 'add' && (!empty($conference->id) && $conferen
$vattouse = get_default_tva($mysoc, $thirdparty, $productforinvoicerow->id);
$labelforproduct = $outputlangs->trans("EventFee", $project->title);
- $date_start = $project->date_start;
- $date_end = $project->date_end;
+ if ($project->location) {
+ $labelforproduct .= ' - '.$project->location;
+ }
+ $date_start = $project->date_start_event;
+ $date_end = $project->date_end_event;
// If there is no lines yet, we add one
if (empty($facture->lines)) {
- $result = $facture->addline($labelforproduct, floatval($project->price_registration), 1, $vattouse, 0, 0, $productforinvoicerow->id, 0, $date_start, $date_end, 0, 0, '', 'HT', 0, 1);
+ $pu_ttc = floatval($project->price_registration);
+ $pu_ht = 0;
+ $price_base_type = 'TTC';
+
+ $result = $facture->addline($labelforproduct, $pu_ht, 1, $vattouse, 0, 0, $productforinvoicerow->id, 0, $date_start, $date_end, 0, 0, '', $price_base_type, $pu_ttc, 1);
if ($result <= 0) {
$confattendee->error = $facture->error;
$confattendee->errors = $facture->errors;
@@ -642,28 +651,60 @@ print load_fiche_titre($langs->trans("NewRegistration"), '', '', 0, 0, 'center')
print '';
print '
';
-print '
';
+print '
';
// Welcome message
-print $langs->trans("EvntOrgWelcomeMessage", $project->title . ' '. $conference->label);
+print ''.$langs->trans("EvntOrgWelcomeMessage").' ';
print ' ';
+print ''.$project->title . ' '. $conference->label.' ';
+if ($project->date_start_event || $project->date_end_event) {
+ print ' ';
+}
+if ($project->date_start_event) {
+ $format = 'day';
+ $tmparray = dol_getdate($project->date_start_event, false, '');
+ if ($tmparray['hours'] || $tmparray['minutes'] || $tmparray['minutes']) {
+ $format = 'dayhour';
+ }
+ print dol_print_date($project->date_start_event, $format);
+}
+if ($project->date_start_event && $project->date_end_event) {
+ print ' - ';
+}
+if ($project->date_end_event) {
+ $format = 'day';
+ $tmparray = dol_getdate($project->date_end_event, false, '');
+ if ($tmparray['hours'] || $tmparray['minutes'] || $tmparray['minutes']) {
+ $format = 'dayhour';
+ }
+ print dol_print_date($project->date_end_event, $format);
+}
+if ($project->date_start_event || $project->date_end_event) {
+ print ' ';
+}
+if ($project->location) {
+ print ' '.$project->location.' ';
+}
+
$maxattendees = 0;
-if ($conference->id) {
+if ($conference->id > 0) {
+ /* date of project is not date of event so commented
print $langs->trans("Date").': ';
print dol_print_date($conference->datep);
if ($conference->date_end) {
print ' - ';
print dol_print_date($conference->datef);
- }
+ }*/
} else {
+ /* date of project is not date of event so commented
print $langs->trans("Date").': ';
print dol_print_date($project->date_start);
if ($project->date_end) {
print ' - ';
print dol_print_date($project->date_end);
- }
- $maxattendees = $project->max_attendees;
+ }*/
+ $maxattendees = $project->max_attendees; // Max attendeed for the project/event
}
print '
';
@@ -674,7 +715,6 @@ if ($maxattendees && $currentnbofattendees >= $maxattendees) {
}
-print '
';
dol_htmloutput_errors($errmsg, $errors);
@@ -691,8 +731,8 @@ if ((!empty($conference->id) && $conference->status == ConferenceOrBooth::STATUS
print '
';
print '
';
-
- print '
' . $langs->trans("FieldsWithAreMandatory", '*') . ' ';
+ print '
';
+ //print '
' . $langs->trans("FieldsWithAreMandatory", '*') . ' ';
//print $langs->trans("FieldsWithIsForPublic",'**').'
';
print dol_get_fiche_head('');
@@ -711,22 +751,26 @@ if ((!empty($conference->id) && $conference->status == ConferenceOrBooth::STATUS
print '
' . "\n";
// Email
- print '' . $langs->trans("EmailAttendee") . '* ';
+ print ' ' . $langs->trans("EmailAttendee") . ' ';
print img_picto('', 'email', 'class="pictofixedwidth"');
- print ' ' . "\n";
+ print ' ' . "\n";
// Company
- print '' . $langs->trans("Company");
+ print ' ';
if (!empty(floatval($project->price_registration))) {
- print '* ';
+ print '';
}
- print ' ';
+ print $langs->trans("Company");
+ if (!empty(floatval($project->price_registration))) {
+ print '';
+ }
+ print ' ';
print img_picto('', 'company', 'class="pictofixedwidth"');
- print ' ' . "\n";
+ print ' price_registration)) ? '' : ' required').'>' . "\n";
// Email company for invoice
if ($project->price_registration) {
- print '' . $langs->trans("EmailCompanyForInvoice") . ' ';
+ print ' ' . $form->textwithpicto($langs->trans("EmailCompany"), $langs->trans("EmailCompanyForInvoice")) . ' ';
print img_picto('', 'email', 'class="pictofixedwidth"');
print ' ' . "\n";
}
@@ -743,7 +787,7 @@ if ((!empty($conference->id) && $conference->status == ConferenceOrBooth::STATUS
print '';
// Country
- print '' . $langs->trans('Country') . '* ';
+ print ' trans('Country') . ' ';
print img_picto('', 'country', 'class="pictofixedwidth"');
$country_id = GETPOST('country_id');
if (!$country_id && !empty($conf->global->MEMBER_NEWFORM_FORCECOUNTRYCODE)) {
@@ -777,7 +821,7 @@ if ((!empty($conference->id) && $conference->status == ConferenceOrBooth::STATUS
if ($project->price_registration) {
print ' ' . $langs->trans('Price') . ' ';
- print price($project->price_registration, 1, $langs, 1, -1, -1, $conf->currency);
+ print ''.price($project->price_registration, 1, $langs, 1, -1, -1, $conf->currency).' ';
print ' ';
}
@@ -801,8 +845,8 @@ if ((!empty($conference->id) && $conference->status == ConferenceOrBooth::STATUS
}
print '';
-
print "\n";
+
print " ";
print '';
}
diff --git a/htdocs/public/eventorganization/subscriptionok.php b/htdocs/public/eventorganization/subscriptionok.php
index 745c9885647..043e0e8d021 100644
--- a/htdocs/public/eventorganization/subscriptionok.php
+++ b/htdocs/public/eventorganization/subscriptionok.php
@@ -53,7 +53,7 @@ require '../../main.inc.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
-if (!empty($conf->paypal->enabled)) {
+if (isModEnabled('paypal')) {
require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypal.lib.php';
require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypalfunctions.lib.php';
}
diff --git a/htdocs/public/members/new.php b/htdocs/public/members/new.php
index 051506d54ac..9346988274a 100644
--- a/htdocs/public/members/new.php
+++ b/htdocs/public/members/new.php
@@ -277,11 +277,11 @@ if (empty($reshook) && $action == 'add') {
$adh->pass = GETPOST('pass1');
}
$adh->photo = GETPOST('photo');
- $adh->country_id = $conf->global->MEMBER_NEWFORM_FORCECOUNTRYCODE ? $conf->global->MEMBER_NEWFORM_FORCECOUNTRYCODE : GETPOST('country_id', 'int');
+ $adh->country_id = getDolGlobalString("MEMBER_NEWFORM_FORCECOUNTRYCODE", GETPOST('country_id', 'int'));
$adh->state_id = GETPOST('state_id', 'int');
- $adh->typeid = $conf->global->MEMBER_NEWFORM_FORCETYPE ? $conf->global->MEMBER_NEWFORM_FORCETYPE : GETPOST('typeid', 'int');
+ $adh->typeid = getDolGlobalString("MEMBER_NEWFORM_FORCETYPE", GETPOST('typeid', 'int'));
$adh->note_private = GETPOST('note_private');
- $adh->morphy = $conf->global->MEMBER_NEWFORM_FORCEMORPHY ? $conf->global->MEMBER_NEWFORM_FORCEMORPHY : GETPOST('morphy');
+ $adh->morphy = getDolGlobalString("MEMBER_NEWFORM_FORCEMORPHY", GETPOST('morphy'));
$adh->birth = $birthday;
@@ -292,137 +292,146 @@ if (empty($reshook) && $action == 'add') {
$error++;
}
- $result = $adh->create($user);
- if ($result > 0) {
- require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
- $object = $adh;
+ if (!$error) {
+ $result = $adh->create($user);
+ if ($result > 0) {
+ require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
+ $object = $adh;
- $adht = new AdherentType($db);
- $adht->fetch($object->typeid);
+ $adht = new AdherentType($db);
+ $adht->fetch($object->typeid);
- if ($object->email) {
- $subject = '';
- $msg = '';
+ if ($object->email) {
+ $subject = '';
+ $msg = '';
- // Send subscription email
- include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
- $formmail = new FormMail($db);
- // Set output language
- $outputlangs = new Translate('', $conf);
- $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
- // Load traductions files required by page
- $outputlangs->loadLangs(array("main", "members"));
- // Get email content from template
- $arraydefaultmessage = null;
- $labeltouse = $conf->global->ADHERENT_EMAIL_TEMPLATE_AUTOREGISTER;
+ // Send subscription email
+ include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
+ $formmail = new FormMail($db);
+ // Set output language
+ $outputlangs = new Translate('', $conf);
+ $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
+ // Load traductions files required by page
+ $outputlangs->loadLangs(array("main", "members"));
+ // Get email content from template
+ $arraydefaultmessage = null;
+ $labeltouse = $conf->global->ADHERENT_EMAIL_TEMPLATE_AUTOREGISTER;
- if (!empty($labeltouse)) {
- $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
+ if (!empty($labeltouse)) {
+ $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
+ }
+
+ if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
+ $subject = $arraydefaultmessage->topic;
+ $msg = $arraydefaultmessage->content;
+ }
+
+ $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
+ complete_substitutions_array($substitutionarray, $outputlangs, $object);
+ $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
+ $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnValid()), $substitutionarray, $outputlangs);
+
+ if ($subjecttosend && $texttosend) {
+ $moreinheader = 'X-Dolibarr-Info: send_an_email by public/members/new.php'."\r\n";
+
+ $result = $object->send_an_email($texttosend, $subjecttosend, array(), array(), array(), "", "", 0, -1, '', $moreinheader);
+ }
+ /*if ($result < 0) {
+ $error++;
+ setEventMessages($object->error, $object->errors, 'errors');
+ }*/
}
- if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
- $subject = $arraydefaultmessage->topic;
- $msg = $arraydefaultmessage->content;
- }
-
- $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
- complete_substitutions_array($substitutionarray, $outputlangs, $object);
- $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
- $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnValid()), $substitutionarray, $outputlangs);
-
- if ($subjecttosend && $texttosend) {
- $moreinheader = 'X-Dolibarr-Info: send_an_email by public/members/new.php'."\r\n";
-
- $result = $object->send_an_email($texttosend, $subjecttosend, array(), array(), array(), "", "", 0, -1, '', $moreinheader);
- }
- /*if ($result < 0) {
- $error++;
- setEventMessages($object->error, $object->errors, 'errors');
- }*/
- }
-
- // Send email to the foundation to say a new member subscribed with autosubscribe form
- if (!empty($conf->global->MAIN_INFO_SOCIETE_MAIL) && !empty($conf->global->ADHERENT_AUTOREGISTER_NOTIF_MAIL_SUBJECT) &&
- !empty($conf->global->ADHERENT_AUTOREGISTER_NOTIF_MAIL)) {
- // Define link to login card
- $appli = constant('DOL_APPLICATION_TITLE');
- if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
- $appli = $conf->global->MAIN_APPLICATION_TITLE;
- if (preg_match('/\d\.\d/', $appli)) {
- if (!preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) {
- $appli .= " (".DOL_VERSION.")"; // If new title contains a version that is different than core
+ // Send email to the foundation to say a new member subscribed with autosubscribe form
+ if (!empty($conf->global->MAIN_INFO_SOCIETE_MAIL) && !empty($conf->global->ADHERENT_AUTOREGISTER_NOTIF_MAIL_SUBJECT) &&
+ !empty($conf->global->ADHERENT_AUTOREGISTER_NOTIF_MAIL)) {
+ // Define link to login card
+ $appli = constant('DOL_APPLICATION_TITLE');
+ if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
+ $appli = $conf->global->MAIN_APPLICATION_TITLE;
+ if (preg_match('/\d\.\d/', $appli)) {
+ if (!preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) {
+ $appli .= " (".DOL_VERSION.")"; // If new title contains a version that is different than core
+ }
+ } else {
+ $appli .= " ".DOL_VERSION;
}
} else {
$appli .= " ".DOL_VERSION;
}
+
+ $to = $adh->makeSubstitution($conf->global->MAIN_INFO_SOCIETE_MAIL);
+ $from = $conf->global->ADHERENT_MAIL_FROM;
+ $mailfile = new CMailFile(
+ '['.$appli.'] '.$conf->global->ADHERENT_AUTOREGISTER_NOTIF_MAIL_SUBJECT,
+ $to,
+ $from,
+ $adh->makeSubstitution($conf->global->ADHERENT_AUTOREGISTER_NOTIF_MAIL),
+ array(),
+ array(),
+ array(),
+ "",
+ "",
+ 0,
+ -1
+ );
+
+ if (!$mailfile->sendfile()) {
+ dol_syslog($langs->trans("ErrorFailedToSendMail", $from, $to), LOG_ERR);
+ }
+ }
+
+ // Auto-create thirdparty on member creation
+ if (!empty($conf->global->ADHERENT_DEFAULT_CREATE_THIRDPARTY)) {
+ $company = new Societe($db);
+ $result = $company->create_from_member($adh);
+ if ($result < 0) {
+ $error++;
+ $errmsg .= join(' ', $company->errors);
+ }
+ }
+
+ if (!empty($backtopage)) {
+ $urlback = $backtopage;
+ } elseif (!empty($conf->global->MEMBER_URL_REDIRECT_SUBSCRIPTION)) {
+ $urlback = $conf->global->MEMBER_URL_REDIRECT_SUBSCRIPTION;
+ // TODO Make replacement of __AMOUNT__, etc...
} else {
- $appli .= " ".DOL_VERSION;
+ $urlback = $_SERVER["PHP_SELF"]."?action=added&token=".newToken();
}
- $to = $adh->makeSubstitution($conf->global->MAIN_INFO_SOCIETE_MAIL);
- $from = $conf->global->ADHERENT_MAIL_FROM;
- $mailfile = new CMailFile(
- '['.$appli.'] '.$conf->global->ADHERENT_AUTOREGISTER_NOTIF_MAIL_SUBJECT,
- $to,
- $from,
- $adh->makeSubstitution($conf->global->ADHERENT_AUTOREGISTER_NOTIF_MAIL),
- array(),
- array(),
- array(),
- "",
- "",
- 0,
- -1
- );
+ if (!empty($conf->global->MEMBER_NEWFORM_PAYONLINE) && $conf->global->MEMBER_NEWFORM_PAYONLINE != '-1') {
+ if (empty($conf->global->MEMBER_NEWFORM_EDITAMOUNT)) { // If edition of amount not allowed
+ // TODO Check amount is same than the amount required for the type of member or if not defined as the defeault amount into $conf->global->MEMBER_NEWFORM_AMOUNT
+ // It is not so important because a test is done on return of payment validation.
+ }
- if (!$mailfile->sendfile()) {
- dol_syslog($langs->trans("ErrorFailedToSendMail", $from, $to), LOG_ERR);
- }
- }
+ $urlback = getOnlinePaymentUrl(0, 'member', $adh->ref, price2num(GETPOST('amount', 'alpha'), 'MT'), '', 0);
- // Auto-create thirdparty on member creation
- if (!empty($conf->global->ADHERENT_DEFAULT_CREATE_THIRDPARTY)) {
- $company = new Societe($db);
- $result = $company->create_from_member($adh);
- if ($result < 0) {
- $error++;
- $errmsg .= join(' ', $company->errors);
+ if (GETPOST('email')) {
+ $urlback .= '&email='.urlencode(GETPOST('email'));
+ }
+ if ($conf->global->MEMBER_NEWFORM_PAYONLINE != '-1' && $conf->global->MEMBER_NEWFORM_PAYONLINE != 'all') {
+ $urlback .= '&paymentmethod='.urlencode($conf->global->MEMBER_NEWFORM_PAYONLINE);
+ }
+ } else {
+ if (!empty($entity)) {
+ $urlback .= '&entity='.((int) $entity);
+ }
}
}
if (!empty($backtopage)) {
$urlback = $backtopage;
+ dol_syslog("member ".$adh->ref." was created, we redirect to ".$urlback);
} elseif (!empty($conf->global->MEMBER_URL_REDIRECT_SUBSCRIPTION)) {
$urlback = $conf->global->MEMBER_URL_REDIRECT_SUBSCRIPTION;
// TODO Make replacement of __AMOUNT__, etc...
+ dol_syslog("member ".$adh->ref." was created, we redirect to ".$urlback);
} else {
- $urlback = $_SERVER["PHP_SELF"]."?action=added&token=".newToken();
+ $error++;
+ $errmsg .= join(' ', $adh->errors);
}
-
- if (!empty($conf->global->MEMBER_NEWFORM_PAYONLINE) && $conf->global->MEMBER_NEWFORM_PAYONLINE != '-1') {
- if (empty($conf->global->MEMBER_NEWFORM_EDITAMOUNT)) { // If edition of amount not allowed
- // TODO Check amount is same than the amount required for the type of member or if not defined as the defeault amount into $conf->global->MEMBER_NEWFORM_AMOUNT
- // It is not so important because a test is done on return of payment validation.
- }
-
- $urlback = getOnlinePaymentUrl(0, 'member', $adh->ref, price2num(GETPOST('amount', 'alpha'), 'MT'), '', 0);
-
- if (GETPOST('email')) {
- $urlback .= '&email='.urlencode(GETPOST('email'));
- }
- if ($conf->global->MEMBER_NEWFORM_PAYONLINE != '-1' && $conf->global->MEMBER_NEWFORM_PAYONLINE != 'all') {
- $urlback .= '&paymentmethod='.urlencode($conf->global->MEMBER_NEWFORM_PAYONLINE);
- }
- } else {
- if (!empty($entity)) {
- $urlback .= '&entity='.((int) $entity);
- }
- }
-
- dol_syslog("member ".$adh->ref." was created, we redirect to ".$urlback);
- } else {
- $error++;
- $errmsg .= join(' ', $adh->errors);
}
}
@@ -433,6 +442,7 @@ if (empty($reshook) && $action == 'add') {
exit;
} else {
$db->rollback();
+ $action = "create";
}
}
@@ -483,6 +493,7 @@ if (!empty($conf->global->MEMBER_NEWFORM_TEXT)) {
print '';
dol_htmloutput_errors($errmsg);
+dol_htmloutput_events();
// Print form
print ''."\n";
@@ -770,7 +781,7 @@ if (!empty($conf->global->MEMBER_SKIP_TABLE) || !empty($conf->global->MEMBER_NEW
foreach ($measuringUnits->records as $lines)
$units[$lines->short_label] = $langs->trans(ucfirst($lines->label));
- $publiccounters = $conf->global->MEMBER_COUNTERS_ARE_PUBLIC;
+ $publiccounters = getDolGlobalString("MEMBER_COUNTERS_ARE_PUBLIC");
$sql = "SELECT d.rowid, d.libelle as label, d.subscription, d.amount, d.caneditamount, d.vote, d.note, d.duration, d.statut as status, d.morphy, COUNT(a.rowid) AS membercount";
$sql .= " FROM ".MAIN_DB_PREFIX."adherent_type as d";
diff --git a/htdocs/public/onlinesign/newonlinesign.php b/htdocs/public/onlinesign/newonlinesign.php
index fe1b71423ce..f0738f0e420 100644
--- a/htdocs/public/onlinesign/newonlinesign.php
+++ b/htdocs/public/onlinesign/newonlinesign.php
@@ -78,6 +78,9 @@ $message = GETPOST('message', 'aZ09');
$suffix = GETPOST("suffix", 'aZ09');
$source = GETPOST("source", 'alpha');
$ref = $REF = GETPOST("ref", 'alpha');
+$urlok = '';
+$urlko = '';
+
if (empty($source)) {
$source = 'proposal';
@@ -128,8 +131,11 @@ if (!$action) {
$securekeyseed = '';
if ($source == 'proposal') {
$securekeyseed = getDolGlobalString('PROPOSAL_ONLINE_SIGNATURE_SECURITY_TOKEN');
+} elseif ($source == 'contract') {
+ $securekeyseed = getDolGlobalString('CONTRACT_ONLINE_SIGNATURE_SECURITY_TOKEN');
+} elseif ($source == 'fichinter') {
+ $securekeyseed = getDolGlobalString('FICHINTER_ONLINE_SIGNATURE_SECURITY_TOKEN');
}
-
if (!dol_verifyHash($securekeyseed.$type.$ref.(isModEnabled('multicompany') ? $entity : ''), $SECUREKEY, '0')) {
httponly_accessforbidden('Bad value for securitykey. Value provided '.dol_escape_htmltag($SECUREKEY).' does not match expected value for ref='.dol_escape_htmltag($ref), 403, 1);
}
@@ -138,6 +144,14 @@ if ($source == 'proposal') {
require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
$object = new Propal($db);
$result= $object->fetch(0, $ref, '', $entity);
+} elseif ($source == 'contract') {
+ require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
+ $object = new Contrat($db);
+ $result= $object->fetch(0, $ref);
+} elseif ($source == 'fichinter') {
+ require_once DOL_DOCUMENT_ROOT.'/fichinter/class/fichinter.class.php';
+ $object = new Fichinter($db);
+ $result= $object->fetch(0, $ref);
} else {
httponly_accessforbidden($langs->trans('ErrorBadParameters')." - Bad value for source", 400, 1);
}
@@ -169,6 +183,7 @@ if ($action == 'confirm_refusepropal' && $confirm == 'yes') {
// Online customer is not a user, so we use the use that validates the documents
$user = new User($db);
$user->fetch($object->user_valid_id);
+ $object->context = array('closedfromonlinesignature' => 'closedfromonlinesignature');
$result = $object->call_trigger('PROPAL_CLOSE_REFUSED', $user);
if ($result < 0) {
$error++;
@@ -278,16 +293,29 @@ if (!empty($conf->global->ONLINE_SIGN_NEWFORM_TEXT)) {
$text = ' '.$text.' '."\n";
}
if (empty($text)) {
- $text .= ''.$langs->trans("WelcomeOnOnlineSignaturePage", $mysoc->name).' '."\n";
- $text .= ''.$langs->trans("ThisScreenAllowsYouToSignDocFrom", $creditor).' '."\n";
+ if ($source == 'proposal') {
+ $text .= ''.$langs->trans("WelcomeOnOnlineSignaturePageProposal", $mysoc->name).' '."\n";
+ $text .= ''.$langs->trans("ThisScreenAllowsYouToSignDocFromProposal", $creditor).' '."\n";
+ } elseif ($source == 'contract') {
+ $text .= ''.$langs->trans("WelcomeOnOnlineSignaturePageContract", $mysoc->name).' '."\n";
+ $text .= ''.$langs->trans("ThisScreenAllowsYouToSignDocFromContract", $creditor).' '."\n";
+ } elseif ($source == 'fichinter') {
+ $text .= ''.$langs->trans("WelcomeOnOnlineSignaturePageFichinter", $mysoc->name).' '."\n";
+ $text .= ''.$langs->trans("ThisScreenAllowsYouToSignDocFromFichinter", $creditor).' '."\n";
+ }
}
print $text;
// Output payment summary form
print '';
print '';
-print ''.$langs->trans("ThisIsInformationOnDocumentToSign").' : '."\n";
-
+if ($source == 'proposal') {
+ print ''.$langs->trans("ThisIsInformationOnDocumentToSignProposal").' : '."\n";
+} elseif ($source == 'contract') {
+ print ''.$langs->trans("ThisIsInformationOnDocumentToSignContract").' : '."\n";
+} elseif ($source == 'fichinter') {
+ print ''.$langs->trans("ThisIsInformationOnDocumentToSignFichinter").' : '."\n";
+}
$found = false;
$error = 0;
@@ -370,8 +398,106 @@ if ($source == 'proposal') {
print ' ';
print ' ';
print ''."\n";
-}
+} elseif ($source == 'contract') { // Signature on contract
+ $found = true;
+ $langs->load("contract");
+ $result = $object->fetch_thirdparty($object->socid);
+
+ // Proposer
+ print ''.$langs->trans("Proposer");
+ print ' ';
+ print img_picto('', 'company', 'class="pictofixedwidth"');
+ print ''.$creditor.' ';
+ print ' ';
+ print ' '."\n";
+
+ // Target
+ print ''.$langs->trans("ThirdParty");
+ print ' ';
+ print img_picto('', 'company', 'class="pictofixedwidth"');
+ print ''.$object->thirdparty->name.' ';
+ print ' '."\n";
+
+ // Object
+ $text = ''.$langs->trans("SignatureContractRef", $object->ref).' ';
+ print ''.$langs->trans("Designation");
+ print ' '.$text;
+
+ $last_main_doc_file = $object->last_main_doc;
+
+ if (empty($last_main_doc_file) || !dol_is_file(DOL_DATA_ROOT.'/'.$object->last_main_doc)) {
+ // It seems document has never been generated, or was generated and then deleted.
+ // So we try to regenerate it with its default template.
+ $defaulttemplate = ''; // We force the use an empty string instead of $object->model_pdf to be sure to use a "main" default template and not the last one used.
+ $object->generateDocument($defaulttemplate, $langs);
+ }
+
+ $directdownloadlink = $object->getLastMainDocLink('contract');
+ if ($directdownloadlink) {
+ print '';
+ print img_mime($object->last_main_doc, '');
+ if ($message == "signed") {
+ print $langs->trans("DownloadSignedDocument").' ';
+ } else {
+ print $langs->trans("DownloadDocument").'';
+ }
+ }
+
+
+ print ' ';
+ print ' ';
+ print ' '."\n";
+} elseif ($source == 'fichinter') { // Signature on fichinter
+ $found = true;
+ $langs->load("fichinter");
+
+ $result = $object->fetch_thirdparty($object->socid);
+ // Proposer
+ print ''.$langs->trans("Proposer");
+ print ' ';
+ print img_picto('', 'company', 'class="pictofixedwidth"');
+ print ''.$creditor.' ';
+ print ' ';
+ print ' '."\n";
+
+ // Target
+ print ''.$langs->trans("ThirdParty");
+ print ' ';
+ print img_picto('', 'company', 'class="pictofixedwidth"');
+ print ''.$object->thirdparty->name.' ';
+ print ' '."\n";
+
+ // Object
+ $text = ''.$langs->trans("SignatureFichinterRef", $object->ref).' ';
+ print ''.$langs->trans("Designation");
+ print ' '.$text;
+
+ $last_main_doc_file = $object->last_main_doc;
+
+ if (empty($last_main_doc_file) || !dol_is_file(DOL_DATA_ROOT.'/'.$object->last_main_doc)) {
+ // It seems document has never been generated, or was generated and then deleted.
+ // So we try to regenerate it with its default template.
+ $defaulttemplate = ''; // We force the use an empty string instead of $object->model_pdf to be sure to use a "main" default template and not the last one used.
+ $object->generateDocument($defaulttemplate, $langs);
+ }
+
+ $directdownloadlink = $object->getLastMainDocLink('fichinter');
+ if ($directdownloadlink) {
+ print '';
+ print img_mime($object->last_main_doc, '');
+ if ($message == "signed") {
+ print $langs->trans("DownloadSignedDocument").' ';
+ } else {
+ print $langs->trans("DownloadDocument").'';
+ }
+ }
+
+
+ print ' ';
+ print ' ';
+ print ' '."\n";
+}
if (!$found && !$mesg) {
@@ -436,7 +562,7 @@ if ($action == "dosign" && empty($cancel)) {
success: function(response) {
if(response == "success"){
console.log("Success on saving signature");
- window.location.replace("'.$_SERVER["PHP_SELF"].'?ref='.urlencode($ref).'&message=signed&securekey='.urlencode($SECUREKEY).(isModEnabled('multicompany')?'&entity='.$entity:'').'");
+ window.location.replace("'.$_SERVER["PHP_SELF"].'?ref='.urlencode($ref).'&source='.urlencode($source).'&message=signed&securekey='.urlencode($SECUREKEY).(isModEnabled('multicompany')?'&entity='.$entity:'').'");
}else{
console.error(response);
}
@@ -474,6 +600,18 @@ if ($action == "dosign" && empty($cancel)) {
print ' ';
print ' ';
}
+ } elseif ($source == 'contract') {
+ if ($message == 'signed') {
+ print ''.$langs->trans("ContractSigned").' ';
+ } else {
+ print ' ';
+ }
+ } elseif ($source == 'fichinter') {
+ if ($message == 'signed') {
+ print ''.$langs->trans("FichinterSigned").' ';
+ } else {
+ print ' ';
+ }
}
}
print ''."\n";
diff --git a/htdocs/public/opensurvey/studs.php b/htdocs/public/opensurvey/studs.php
index bd49b6afbe4..f11f8aea918 100644
--- a/htdocs/public/opensurvey/studs.php
+++ b/htdocs/public/opensurvey/studs.php
@@ -116,9 +116,9 @@ if (GETPOST("boutonp") || GETPOST("boutonp.x") || GETPOST("boutonp_x")) { // bo
if (GETPOST('nom', 'alphanohtml')) {
$nouveauchoix = '';
for ($i = 0; $i < $nbcolonnes; $i++) {
- if (GETPOSTISSET("choix$i") && GETPOST("choix$i") == '1') {
+ if (GETPOSTISSET("choix".$i) && GETPOST("choix".$i) == '1') {
$nouveauchoix .= "1";
- } elseif (GETPOSTISSET("choix$i") && GETPOST("choix$i") == '2') {
+ } elseif (GETPOSTISSET("choix".$i) && GETPOST("choix".$i) == '2') {
$nouveauchoix .= "2";
} else {
$nouveauchoix .= "0";
diff --git a/htdocs/public/partnership/new.php b/htdocs/public/partnership/new.php
index 68e9034a761..5064ec68695 100644
--- a/htdocs/public/partnership/new.php
+++ b/htdocs/public/partnership/new.php
@@ -502,7 +502,7 @@ if (empty($reshook) && $action == 'added') {
$form = new Form($db);
$formcompany = new FormCompany($db);
-$extrafields->fetch_name_optionals_label($partnership->table_element); // fetch optionals attributes and labels
+$extrafields->fetch_name_optionals_label($object->table_element); // fetch optionals attributes and labels
llxHeaderVierge($langs->trans("NewPartnershipRequest"));
@@ -518,7 +518,7 @@ print '';
if (!empty($conf->global->PARTNERSHIP_NEWFORM_TEXT)) {
print $langs->trans($conf->global->PARTNERSHIP_NEWFORM_TEXT)." \n";
} else {
- print $langs->trans("NewPartnershipRequestDesc", $conf->global->MAIN_INFO_SOCIETE_MAIL)." \n";
+ print $langs->trans("NewPartnershipRequestDesc", getDolGlobalString("MAIN_INFO_SOCIETE_MAIL"))." \n";
}
print '
';
diff --git a/htdocs/public/payment/newpayment.php b/htdocs/public/payment/newpayment.php
index 9d5fb5f122f..79104817e77 100644
--- a/htdocs/public/payment/newpayment.php
+++ b/htdocs/public/payment/newpayment.php
@@ -247,7 +247,7 @@ $urlko = preg_replace('/&$/', '', $urlko); // Remove last &
// Make special controls
-if ((empty($paymentmethod) || $paymentmethod == 'paypal') && !empty($conf->paypal->enabled)) {
+if ((empty($paymentmethod) || $paymentmethod == 'paypal') && isModEnabled('paypal')) {
require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypal.lib.php';
require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypalfunctions.lib.php';
@@ -273,10 +273,10 @@ if ((empty($paymentmethod) || $paymentmethod == 'paypal') && !empty($conf->paypa
return -1;
}
}
-if ((empty($paymentmethod) || $paymentmethod == 'paybox') && !empty($conf->paybox->enabled)) {
+if ((empty($paymentmethod) || $paymentmethod == 'paybox') && isModEnabled('paybox')) {
// No specific test for the moment
}
-if ((empty($paymentmethod) || $paymentmethod == 'stripe') && !empty($conf->stripe->enabled)) {
+if ((empty($paymentmethod) || $paymentmethod == 'stripe') && isModEnabled('stripe')) {
require_once DOL_DOCUMENT_ROOT.'/stripe/config.php'; // This include also /stripe/lib/stripe.lib.php, /includes/stripe/stripe-php/init.php, ...
}
@@ -342,9 +342,9 @@ $creditor = $mysoc->name;
$paramcreditor = 'ONLINE_PAYMENT_CREDITOR';
$paramcreditorlong = 'ONLINE_PAYMENT_CREDITOR_'.$suffix;
if (!empty($conf->global->$paramcreditorlong)) {
- $creditor = $conf->global->$paramcreditorlong;
+ $creditor = $conf->global->$paramcreditorlong; // use label long of the seller to show
} elseif (!empty($conf->global->$paramcreditor)) {
- $creditor = $conf->global->$paramcreditor;
+ $creditor = $conf->global->$paramcreditor; // use label short of the seller to show
}
$mesg = '';
@@ -356,6 +356,8 @@ $mesg = '';
// Action dopayment is called after clicking/choosing the payment mode
if ($action == 'dopayment') {
+ dol_syslog("--- newpayment.php Execute action = ".$action." paymentmethod=".$paymentmethod.' amount='.$amount.' newamount='.GETPOST("newamount", 'alpha'), LOG_DEBUG, 0, '_payment');
+
if ($paymentmethod == 'paypal') {
$PAYPAL_API_PRICE = price2num(GETPOST("newamount", 'alpha'), 'MT');
$PAYPAL_PAYMENT_TYPE = 'Sale';
@@ -481,7 +483,7 @@ if ($action == 'dopayment') {
// Called when choosing Stripe mode.
// When using the old Charge API architecture, this code is called after clicking the 'dopayment' with the Charge API architecture.
// When using the PaymentIntent API architecture, the Stripe customer was already created when creating PaymentIntent when showing payment page, and the payment is already ok when action=charge.
-if ($action == 'charge' && !empty($conf->stripe->enabled)) {
+if ($action == 'charge' && isModEnabled('stripe')) {
$amountstripe = $amount;
// Correct the amount according to unit of currency
@@ -491,9 +493,9 @@ if ($action == 'charge' && !empty($conf->stripe->enabled)) {
$amountstripe = $amountstripe * 100;
}
- dol_syslog("--- newpayment.php Execute action = ".$action." STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION=".getDolGlobalInt('STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION'), LOG_DEBUG, 0, '_stripe');
- dol_syslog("GET=".var_export($_GET, true), LOG_DEBUG, 0, '_stripe');
- dol_syslog("POST=".var_export($_POST, true), LOG_DEBUG, 0, '_stripe');
+ dol_syslog("--- newpayment.php Execute action = ".$action." STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION=".getDolGlobalInt('STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION'), LOG_DEBUG, 0, '_payment');
+ dol_syslog("GET=".var_export($_GET, true), LOG_DEBUG, 0, '_payment');
+ dol_syslog("POST=".var_export($_POST, true), LOG_DEBUG, 0, '_payment');
$stripeToken = GETPOST("stripeToken", 'alpha');
$email = GETPOST("email", 'alpha');
@@ -503,10 +505,10 @@ if ($action == 'charge' && !empty($conf->stripe->enabled)) {
$vatnumber = GETPOST('vatnumber', 'alpha');
$savesource = GETPOSTISSET('savesource') ? GETPOST('savesource', 'int') : 1;
- dol_syslog("POST stripeToken = ".$stripeToken, LOG_DEBUG, 0, '_stripe');
- dol_syslog("POST email = ".$email, LOG_DEBUG, 0, '_stripe');
- dol_syslog("POST thirdparty_id = ".$thirdparty_id, LOG_DEBUG, 0, '_stripe');
- dol_syslog("POST vatnumber = ".$vatnumber, LOG_DEBUG, 0, '_stripe');
+ dol_syslog("POST stripeToken = ".$stripeToken, LOG_DEBUG, 0, '_payment');
+ dol_syslog("POST email = ".$email, LOG_DEBUG, 0, '_payment');
+ dol_syslog("POST thirdparty_id = ".$thirdparty_id, LOG_DEBUG, 0, '_payment');
+ dol_syslog("POST vatnumber = ".$vatnumber, LOG_DEBUG, 0, '_payment');
$error = 0;
$errormessage = '';
@@ -527,7 +529,7 @@ if ($action == 'charge' && !empty($conf->stripe->enabled)) {
}
if ($thirdparty_id > 0) {
- dol_syslog("Search existing Stripe customer profile for thirdparty_id=".$thirdparty_id, LOG_DEBUG, 0, '_stripe');
+ dol_syslog("Search existing Stripe customer profile for thirdparty_id=".$thirdparty_id, LOG_DEBUG, 0, '_payment');
$service = 'StripeTest';
$servicestatus = 0;
@@ -546,7 +548,7 @@ if ($action == 'charge' && !empty($conf->stripe->enabled)) {
$customer = $stripe->customerStripe($thirdparty, $stripeacc, $servicestatus, 1);
if (empty($customer)) {
$error++;
- dol_syslog('Failed to get/create stripe customer for thirdparty id = '.$thirdparty_id.' and servicestatus = '.$servicestatus.': '.$stripe->error, LOG_ERR, 0, '_stripe');
+ dol_syslog('Failed to get/create stripe customer for thirdparty id = '.$thirdparty_id.' and servicestatus = '.$servicestatus.': '.$stripe->error, LOG_ERR, 0, '_payment');
setEventMessages('Failed to get/create stripe customer for thirdparty id = '.$thirdparty_id.' and servicestatus = '.$servicestatus.': '.$stripe->error, null, 'errors');
$action = '';
}
@@ -561,7 +563,7 @@ if ($action == 'charge' && !empty($conf->stripe->enabled)) {
if (empty($card)) {
$error++;
- dol_syslog('Failed to create card record', LOG_WARNING, 0, '_stripe');
+ dol_syslog('Failed to create card record', LOG_WARNING, 0, '_payment');
setEventMessages('Failed to create card record', null, 'errors');
$action = '';
} else {
@@ -575,7 +577,7 @@ if ($action == 'charge' && !empty($conf->stripe->enabled)) {
$metadata["dol_type"] = $dol_type;
}
- dol_syslog("Create charge on card ".$card->id, LOG_DEBUG, 0, '_stripe');
+ dol_syslog("Create charge on card ".$card->id, LOG_DEBUG, 0, '_payment');
$charge = \Stripe\Charge::create(array(
'amount' => price2num($amountstripe, 'MU'),
'currency' => $currency,
@@ -589,7 +591,7 @@ if ($action == 'charge' && !empty($conf->stripe->enabled)) {
// Return $charge = array('id'=>'ch_XXXX', 'status'=>'succeeded|pending|failed', 'failure_code'=>, 'failure_message'=>...)
if (empty($charge)) {
$error++;
- dol_syslog('Failed to charge card', LOG_WARNING, 0, '_stripe');
+ dol_syslog('Failed to charge card', LOG_WARNING, 0, '_payment');
setEventMessages('Failed to charge card', null, 'errors');
$action = '';
}
@@ -607,7 +609,7 @@ if ($action == 'charge' && !empty($conf->stripe->enabled)) {
if (empty($vatcleaned)) $taxinfo=null;
*/
- dol_syslog("Create anonymous customer card profile", LOG_DEBUG, 0, '_stripe');
+ dol_syslog("Create anonymous customer card profile", LOG_DEBUG, 0, '_payment');
$customer = \Stripe\Customer::create(array(
'email' => $email,
@@ -644,7 +646,7 @@ if ($action == 'charge' && !empty($conf->stripe->enabled)) {
// The customer was just created with a source, so we can make a charge
// with no card defined, the source just used for customer creation will be used.
- dol_syslog("Create charge", LOG_DEBUG, 0, '_stripe');
+ dol_syslog("Create charge", LOG_DEBUG, 0, '_payment');
$charge = \Stripe\Charge::create(array(
'customer' => $customer->id,
'amount' => price2num($amountstripe, 'MU'),
@@ -657,7 +659,7 @@ if ($action == 'charge' && !empty($conf->stripe->enabled)) {
// Return $charge = array('id'=>'ch_XXXX', 'status'=>'succeeded|pending|failed', 'failure_code'=>, 'failure_message'=>...)
if (empty($charge)) {
$error++;
- dol_syslog('Failed to charge card', LOG_WARNING, 0, '_stripe');
+ dol_syslog('Failed to charge card', LOG_WARNING, 0, '_payment');
setEventMessages('Failed to charge card', null, 'errors');
$action = '';
}
@@ -676,21 +678,21 @@ if ($action == 'charge' && !empty($conf->stripe->enabled)) {
$error++;
$errormessage = "ErrorCard ".$e->getMessage()." err=".var_export($err, true);
- dol_syslog($errormessage, LOG_WARNING, 0, '_stripe');
+ dol_syslog($errormessage, LOG_WARNING, 0, '_payment');
setEventMessages($e->getMessage(), null, 'errors');
$action = '';
} catch (\Stripe\Error\RateLimit $e) {
// Too many requests made to the API too quickly
$error++;
$errormessage = "ErrorRateLimit ".$e->getMessage();
- dol_syslog($errormessage, LOG_WARNING, 0, '_stripe');
+ dol_syslog($errormessage, LOG_WARNING, 0, '_payment');
setEventMessages($e->getMessage(), null, 'errors');
$action = '';
} catch (\Stripe\Error\InvalidRequest $e) {
// Invalid parameters were supplied to Stripe's API
$error++;
$errormessage = "ErrorInvalidRequest ".$e->getMessage();
- dol_syslog($errormessage, LOG_WARNING, 0, '_stripe');
+ dol_syslog($errormessage, LOG_WARNING, 0, '_payment');
setEventMessages($e->getMessage(), null, 'errors');
$action = '';
} catch (\Stripe\Error\Authentication $e) {
@@ -698,14 +700,14 @@ if ($action == 'charge' && !empty($conf->stripe->enabled)) {
// (maybe you changed API keys recently)
$error++;
$errormessage = "ErrorAuthentication ".$e->getMessage();
- dol_syslog($errormessage, LOG_WARNING, 0, '_stripe');
+ dol_syslog($errormessage, LOG_WARNING, 0, '_payment');
setEventMessages($e->getMessage(), null, 'errors');
$action = '';
} catch (\Stripe\Error\ApiConnection $e) {
// Network communication with Stripe failed
$error++;
$errormessage = "ErrorApiConnection ".$e->getMessage();
- dol_syslog($errormessage, LOG_WARNING, 0, '_stripe');
+ dol_syslog($errormessage, LOG_WARNING, 0, '_payment');
setEventMessages($e->getMessage(), null, 'errors');
$action = '';
} catch (\Stripe\Error\Base $e) {
@@ -713,14 +715,14 @@ if ($action == 'charge' && !empty($conf->stripe->enabled)) {
// yourself an email
$error++;
$errormessage = "ErrorBase ".$e->getMessage();
- dol_syslog($errormessage, LOG_WARNING, 0, '_stripe');
+ dol_syslog($errormessage, LOG_WARNING, 0, '_payment');
setEventMessages($e->getMessage(), null, 'errors');
$action = '';
} catch (Exception $e) {
// Something else happened, completely unrelated to Stripe
$error++;
$errormessage = "ErrorException ".$e->getMessage();
- dol_syslog($errormessage, LOG_WARNING, 0, '_stripe');
+ dol_syslog($errormessage, LOG_WARNING, 0, '_payment');
setEventMessages($e->getMessage(), null, 'errors');
$action = '';
}
@@ -755,7 +757,7 @@ if ($action == 'charge' && !empty($conf->stripe->enabled)) {
} catch (Exception $e) {
$error++;
$errormessage = "CantRetrievePaymentIntent ".$e->getMessage();
- dol_syslog($errormessage, LOG_WARNING, 0, '_stripe');
+ dol_syslog($errormessage, LOG_WARNING, 0, '_payment');
setEventMessages($e->getMessage(), null, 'errors');
$action = '';
}
@@ -763,13 +765,13 @@ if ($action == 'charge' && !empty($conf->stripe->enabled)) {
if ($paymentintent->status != 'succeeded') {
$error++;
$errormessage = "StatusOfRetrievedIntent is not succeeded: ".$paymentintent->status;
- dol_syslog($errormessage, LOG_WARNING, 0, '_stripe');
+ dol_syslog($errormessage, LOG_WARNING, 0, '_payment');
setEventMessages($paymentintent->status, null, 'errors');
$action = '';
} else {
// TODO We can also record the payment mode into llx_societe_rib with stripe $paymentintent->payment_method
// Note that with other old Stripe architecture (using Charge API), the payment mode was not recorded, so it is not mandatory to do it here.
- //dol_syslog("Create payment_method for ".$paymentintent->payment_method, LOG_DEBUG, 0, '_stripe');
+ //dol_syslog("Create payment_method for ".$paymentintent->payment_method, LOG_DEBUG, 0, '_payment');
// Get here amount and currency used for payment and force value into $amount and $currency so the real amount is saved into session instead
// of the amount and currency retreived from the POST.
@@ -799,11 +801,13 @@ if ($action == 'charge' && !empty($conf->stripe->enabled)) {
$_SESSION['TRANSACTIONID'] = (is_object($charge) ? $charge->id : (is_object($paymentintent) ? $paymentintent->id : ''));
$_SESSION['errormessage'] = $errormessage;
- dol_syslog("Action charge stripe STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION=".getDolGlobalInt('STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION')." ip=".$remoteip, LOG_DEBUG, 0, '_stripe');
- dol_syslog("onlinetoken=".$_SESSION["onlinetoken"]." FinalPaymentAmt=".$_SESSION["FinalPaymentAmt"]." currencyCodeType=".$_SESSION["currencyCodeType"]." payerID=".$_SESSION['payerID']." TRANSACTIONID=".$_SESSION['TRANSACTIONID'], LOG_DEBUG, 0, '_stripe');
- dol_syslog("FULLTAG=".$FULLTAG, LOG_DEBUG, 0, '_stripe');
- dol_syslog("error=".$error." errormessage=".$errormessage, LOG_DEBUG, 0, '_stripe');
- dol_syslog("Now call the redirect to paymentok or paymentko, URL = ".($error ? $urlko : $urlok), LOG_DEBUG, 0, '_stripe');
+ dol_syslog("Action charge stripe STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION=".getDolGlobalInt('STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION')." ip=".$remoteip, LOG_DEBUG, 0, '_payment');
+ dol_syslog("onlinetoken=".$_SESSION["onlinetoken"]." FinalPaymentAmt=".$_SESSION["FinalPaymentAmt"]." currencyCodeType=".$_SESSION["currencyCodeType"]." payerID=".$_SESSION['payerID']." TRANSACTIONID=".$_SESSION['TRANSACTIONID'], LOG_DEBUG, 0, '_payment');
+ dol_syslog("FULLTAG=".$FULLTAG, LOG_DEBUG, 0, '_payment');
+ dol_syslog("error=".$error." errormessage=".$errormessage, LOG_DEBUG, 0, '_payment');
+ dol_syslog("_SERVER[SERVER_NAME] = ".(empty($_SERVER["SERVER_NAME"]) ? '' : dol_escape_htmltag($_SERVER["SERVER_NAME"])), LOG_DEBUG, 0, '_payment');
+ dol_syslog("_SERVER[SERVER_ADDR] = ".(empty($_SERVER["SERVER_ADDR"]) ? '' : dol_escape_htmltag($_SERVER["SERVER_ADDR"])), LOG_DEBUG, 0, '_payment');
+ dol_syslog("Now call the redirect to paymentok or paymentko, URL = ".($error ? $urlko : $urlok), LOG_DEBUG, 0, '_payment');
if ($error) {
header("Location: ".$urlko);
@@ -832,6 +836,11 @@ $conf->dol_hide_leftmenu = 1;
$replacemainarea = (empty($conf->dol_hide_leftmenu) ? '' : '').'
';
llxHeader($head, $langs->trans("PaymentForm"), '', '', 0, 0, '', '', '', 'onlinepaymentbody', $replacemainarea);
+dol_syslog("--- newpayment.php action = ".$action, LOG_DEBUG, 0, '_payment');
+dol_syslog("newpayment.php show page source=".$source." paymentmethod=".$paymentmethod.' amount='.$amount.' newamount='.GETPOST("newamount", 'alpha')." ref=".$ref, LOG_DEBUG, 0, '_payment');
+dol_syslog("_SERVER[SERVER_NAME] = ".(empty($_SERVER["SERVER_NAME"]) ? '' : dol_escape_htmltag($_SERVER["SERVER_NAME"])), LOG_DEBUG, 0, '_payment');
+dol_syslog("_SERVER[SERVER_ADDR] = ".(empty($_SERVER["SERVER_ADDR"]) ? '' : dol_escape_htmltag($_SERVER["SERVER_ADDR"])), LOG_DEBUG, 0, '_payment');
+
// Check link validity
if ($source && in_array($ref, array('member_ref', 'contractline_ref', 'invoice_ref', 'order_ref', 'donation_ref', ''))) {
$langs->load("errors");
@@ -844,10 +853,10 @@ if ($source && in_array($ref, array('member_ref', 'contractline_ref', 'invoice_r
// Show sandbox warning
-if ((empty($paymentmethod) || $paymentmethod == 'paypal') && !empty($conf->paypal->enabled) && (!empty($conf->global->PAYPAL_API_SANDBOX) || GETPOST('forcesandbox', 'int'))) { // We can force sand box with param 'forcesandbox'
+if ((empty($paymentmethod) || $paymentmethod == 'paypal') && isModEnabled('paypal') && (!empty($conf->global->PAYPAL_API_SANDBOX) || GETPOST('forcesandbox', 'int'))) { // We can force sand box with param 'forcesandbox'
dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode', 'Paypal'), '', 'warning');
}
-if ((empty($paymentmethod) || $paymentmethod == 'stripe') && !empty($conf->stripe->enabled) && (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'int'))) {
+if ((empty($paymentmethod) || $paymentmethod == 'stripe') && isModEnabled('stripe') && (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'int'))) {
dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode', 'Stripe'), '', 'warning');
}
@@ -911,14 +920,14 @@ if (!empty($conf->global->MAIN_IMAGE_PUBLIC_PAYMENT)) {
print ''."\n";
print ''."\n";
// Additionnal information for each payment system
-if (!empty($conf->paypal->enabled)) {
+if (isModEnabled('paypal')) {
print ''."\n";
print ''."\n";
}
-if (!empty($conf->paybox->enabled)) {
+if (isModEnabled('paybox')) {
print ''."\n";
}
-if (!empty($conf->stripe->enabled)) {
+if (isModEnabled('stripe')) {
print ''."\n";
}
print ''."\n";
@@ -1005,7 +1014,7 @@ if (!$source) {
}
-// Payment on customer order
+// Payment on sales order
if ($source == 'order') {
$found = true;
$langs->load("orders");
@@ -1361,10 +1370,6 @@ if ($source == 'contractline') {
if ($contractline->description) {
$text .= '
'.dol_htmlentitiesbr($contractline->description);
}
- //if ($contractline->date_fin_validite) {
- // $text.='
'.$langs->trans("DateEndPlanned").': ';
- // $text.=dol_print_date($contractline->date_fin_validite);
- //}
if ($contractline->date_end) {
$text .= '
'.$langs->trans("ExpiredSince").': '.dol_print_date($contractline->date_end);
}
@@ -2043,7 +2048,7 @@ if ($action != 'dopayment') {
'paymentmethod' => $paymentmethod
];
$reshook = $hookmanager->executeHooks('doAddButton', $parameters, $object, $action);
- if ((empty($paymentmethod) || $paymentmethod == 'paybox') && !empty($conf->paybox->enabled)) {
+ if ((empty($paymentmethod) || $paymentmethod == 'paybox') && isModEnabled('paybox')) {
print '
';
print '
';
print '
'.$langs->trans("CreditOrDebitCard").' ';
@@ -2062,7 +2067,7 @@ if ($action != 'dopayment') {
';
}
- if ((empty($paymentmethod) || $paymentmethod == 'stripe') && !empty($conf->stripe->enabled)) {
+ if ((empty($paymentmethod) || $paymentmethod == 'stripe') && isModEnabled('stripe')) {
print '
';
print '
';
print '
';
@@ -2083,7 +2088,7 @@ if ($action != 'dopayment') {
';
}
- if ((empty($paymentmethod) || $paymentmethod == 'paypal') && !empty($conf->paypal->enabled)) {
+ if ((empty($paymentmethod) || $paymentmethod == 'paypal') && isModEnabled('paypal')) {
if (empty($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY)) {
$conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY = 'integral';
}
@@ -2358,7 +2363,17 @@ if (preg_match('/^dopayment/', $action)) { // If we choosed/click on the payme
// Code for payment with option STRIPE_USE_NEW_CHECKOUT set
// Create a Stripe client.
+
var stripe = Stripe('');
+
+ var stripe = Stripe('', { stripeAccount: '' });
+
// Create an instance of Elements
var elements = stripe.elements();
@@ -2403,7 +2418,17 @@ if (preg_match('/^dopayment/', $action)) { // If we choosed/click on the payme
// Code for payment with option STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION set to 1 or 2
// Create a Stripe client.
+
var stripe = Stripe('');
+
+ var stripe = Stripe('', { stripeAccount: '' });
+
paypal->enabled)) {
+if (isModEnabled('paypal')) {
require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypal.lib.php';
require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypalfunctions.lib.php';
}
$langs->loadLangs(array("main", "other", "dict", "bills", "companies", "paybox", "paypal", "stripe"));
-if (!empty($conf->paypal->enabled)) {
+if (isModEnabled('paypal')) {
$PAYPALTOKEN = GETPOST('TOKEN');
if (empty($PAYPALTOKEN)) {
$PAYPALTOKEN = GETPOST('token');
@@ -68,9 +68,9 @@ if (!empty($conf->paypal->enabled)) {
$PAYPALPAYERID = GETPOST('PayerID');
}
}
-if (!empty($conf->paybox->enabled)) {
+if (isModEnabled('paybox')) {
}
-if (!empty($conf->stripe->enabled)) {
+if (isModEnabled('stripe')) {
}
$FULLTAG = GETPOST('FULLTAG');
@@ -96,13 +96,13 @@ if (empty($paymentmethod)) {
$validpaymentmethod = array();
-if (!empty($conf->paypal->enabled)) {
+if (isModEnabled('paypal')) {
$validpaymentmethod['paypal'] = 'paypal';
}
-if (!empty($conf->paybox->enabled)) {
+if (isModEnabled('paybox')) {
$validpaymentmethod['paybox'] = 'paybox';
}
-if (!empty($conf->stripe->enabled)) {
+if (isModEnabled('stripe')) {
$validpaymentmethod['stripe'] = 'stripe';
}
@@ -136,6 +136,10 @@ foreach ($_POST as $k => $v) {
dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_payment');
+// Set $appli for emails title
+$appli = $mysoc->name;
+
+
if (!empty($_SESSION['ipaddress'])) { // To avoid to make action twice
// Get on url call
$fulltag = $FULLTAG;
@@ -173,21 +177,6 @@ if (!empty($_SESSION['ipaddress'])) { // To avoid to make action twice
$from = $conf->global->MAILING_EMAIL_FROM;
$sendto = $sendemail;
- // Define link to login card
- $appli = constant('DOL_APPLICATION_TITLE');
- if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
- $appli = $conf->global->MAIN_APPLICATION_TITLE;
- if (preg_match('/\d\.\d/', $appli)) {
- if (!preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) {
- $appli .= " (".DOL_VERSION.")"; // If new title contains a version that is different than core
- }
- } else {
- $appli .= " ".DOL_VERSION;
- }
- } else {
- $appli .= " ".DOL_VERSION;
- }
-
$urlback = $_SERVER["REQUEST_URI"];
$topic = '['.$appli.'] '.$companylangs->transnoentitiesnoconv("NewOnlinePaymentFailed");
$content = "";
diff --git a/htdocs/public/payment/paymentok.php b/htdocs/public/payment/paymentok.php
index b8e4e9d4e19..6d50d1c8c76 100644
--- a/htdocs/public/payment/paymentok.php
+++ b/htdocs/public/payment/paymentok.php
@@ -57,7 +57,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
require_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorboothattendee.class.php';
require_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorbooth.class.php';
-if (!empty($conf->paypal->enabled)) {
+if (isModEnabled('paypal')) {
require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypal.lib.php';
require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypalfunctions.lib.php';
}
@@ -65,7 +65,7 @@ if (!empty($conf->paypal->enabled)) {
$langs->loadLangs(array("main", "other", "dict", "bills", "companies", "paybox", "paypal"));
// Clean parameters
-if (!empty($conf->paypal->enabled)) {
+if (isModEnabled('paypal')) {
$PAYPAL_API_USER = "";
if (!empty($conf->global->PAYPAL_API_USER)) {
$PAYPAL_API_USER = $conf->global->PAYPAL_API_USER;
@@ -127,13 +127,13 @@ dol_syslog("***** paymentok.php is called paymentmethod=".$paymentmethod." FULLT
$validpaymentmethod = array();
-if (!empty($conf->paypal->enabled)) {
+if (isModEnabled('paypal')) {
$validpaymentmethod['paypal'] = 'paypal';
}
-if (!empty($conf->paybox->enabled)) {
+if (isModEnabled('paybox')) {
$validpaymentmethod['paybox'] = 'paybox';
}
-if (!empty($conf->stripe->enabled)) {
+if (isModEnabled('stripe')) {
$validpaymentmethod['stripe'] = 'stripe';
}
@@ -167,13 +167,20 @@ $error = 0;
$now = dol_now();
-dol_syslog("Callback url when a payment was done. query_string=".(dol_escape_htmltag($_SERVER["QUERY_STRING"]) ?dol_escape_htmltag($_SERVER["QUERY_STRING"]) : '')." script_uri=".(dol_escape_htmltag($_SERVER["SCRIPT_URI"]) ?dol_escape_htmltag($_SERVER["SCRIPT_URI"]) : ''), LOG_DEBUG, 0, '_payment');
+dol_syslog("Callback url when a payment was done. query_string=".(empty($_SERVER["QUERY_STRING"]) ? '' : dol_escape_htmltag($_SERVER["QUERY_STRING"]))." script_uri=".(empty($_SERVER["SCRIPT_URI"]) ? '' : dol_escape_htmltag($_SERVER["SCRIPT_URI"])), LOG_DEBUG, 0, '_payment');
+dol_syslog("_SERVER[SERVER_NAME] = ".(empty($_SERVER["SERVER_NAME"]) ? '' : dol_escape_htmltag($_SERVER["SERVER_NAME"])), LOG_DEBUG, 0, '_payment');
+dol_syslog("_SERVER[SERVER_ADDR] = ".(empty($_SERVER["SERVER_ADDR"]) ? '' : dol_escape_htmltag($_SERVER["SERVER_ADDR"])), LOG_DEBUG, 0, '_payment');
$tracepost = "";
foreach ($_POST as $k => $v) {
$tracepost .= "{$k} - {$v}\n";
}
dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_payment');
+$tracesession = "";
+foreach ($_SESSION as $k => $v) {
+ $tracesession .= "{$k} - {$v}\n";
+}
+dol_syslog("SESSION=".$tracesession, LOG_DEBUG, 0, '_payment');
$head = '';
if (!empty($conf->global->ONLINE_PAYMENT_CSS_URL)) {
@@ -236,7 +243,7 @@ if (!empty($conf->global->MAIN_IMAGE_PUBLIC_PAYMENT)) {
print '
';
-if (!empty($conf->paypal->enabled)) {
+if (isModEnabled('paypal')) {
if ($paymentmethod == 'paypal') { // We call this page only if payment is ok on payment system
if ($PAYPALTOKEN) {
// Get on url call
@@ -316,14 +323,14 @@ if (!empty($conf->paypal->enabled)) {
}
}
-if (!empty($conf->paybox->enabled)) {
+if (isModEnabled('paybox')) {
if ($paymentmethod == 'paybox') {
// TODO Add a check to validate that payment is ok.
$ispaymentok = true; // We call this page only if payment is ok on payment system
}
}
-if (!empty($conf->stripe->enabled)) {
+if (isModEnabled('stripe')) {
if ($paymentmethod == 'stripe') {
// TODO Add a check to validate that payment is ok. We can request Stripe with payment_intent and payment_intent_client_secret
$ispaymentok = true; // We call this page only if payment is ok on payment system
@@ -1266,7 +1273,7 @@ if ($ispaymentok) {
$thirdparty = new Societe($db);
$resultthirdparty = $thirdparty->fetch($attendeetovalidate->fk_soc);
if ($resultthirdparty < 0) {
- setEventMessages(null, $attendeetovalidate->errors, "errors");
+ setEventMessages($resultthirdparty->error, $resultthirdparty->errors, "errors");
} else {
require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
@@ -1289,11 +1296,10 @@ if ($ispaymentok) {
$subject = $arraydefaultmessage->topic;
$msg = $arraydefaultmessage->content;
} else {
- $subject = '['.$object->ref.' - '.$outputlangs->trans("NewRegistration").']';
+ $subject = '['.$appli.'] '.$object->ref.' - '.$outputlangs->trans("NewRegistration").']';
$msg = $outputlangs->trans("OrganizationEventPaymentOfRegistrationWasReceived");
}
-
$substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $thirdparty);
complete_substitutions_array($substitutionarray, $outputlangs, $object);
@@ -1301,6 +1307,13 @@ if ($ispaymentok) {
$texttosend = make_substitutions($msg, $substitutionarray, $outputlangs);
$sendto = $attendeetovalidate->email;
+ $cc = '';
+ if ($thirdparty->email) {
+ $cc = $thirdparty->email;
+ }
+ if ($attendeetovalidate->email_company && $attendeetovalidate->email_company != $thirdparty->email) {
+ $cc = ($cc ? ', ' : '').$attendeetovalidate->email_company;
+ }
$from = $conf->global->MAILING_EMAIL_FROM;
$urlback = $_SERVER["REQUEST_URI"];
@@ -1321,7 +1334,7 @@ if ($ispaymentok) {
$listofmimes = array(dol_mimetype($file));
}
- $mailfile = new CMailFile($subjecttosend, $sendto, $from, $texttosend, $listofpaths, $listofmimes, $listofnames, '', '', 0, $ishtml);
+ $mailfile = new CMailFile($subjecttosend, $sendto, $from, $texttosend, $listofpaths, $listofmimes, $listofnames, $cc, '', 0, $ishtml);
$result = $mailfile->sendfile();
if ($result) {
@@ -1493,7 +1506,7 @@ if ($ispaymentok) {
$subject = $arraydefaultmessage->topic;
$msg = $arraydefaultmessage->content;
} else {
- $subject = '['.$booth->ref.' - '.$outputlangs->trans("NewRegistration").']';
+ $subject = '['.$appli.'] '.$booth->ref.' - '.$outputlangs->trans("NewRegistration").']';
$msg = $outputlangs->trans("OrganizationEventPaymentOfBoothWasReceived");
}
@@ -1542,6 +1555,11 @@ if ($ispaymentok) {
}
}
+
+// Set $appli for emails title
+$appli = $mysoc->name;
+
+
if ($ispaymentok) {
// Get on url call
$onlinetoken = empty($PAYPALTOKEN) ? $_SESSION['onlinetoken'] : $PAYPALTOKEN;
@@ -1600,19 +1618,6 @@ if ($ispaymentok) {
//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
// Define link to login card
- $appli = constant('DOL_APPLICATION_TITLE');
- if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
- $appli = $conf->global->MAIN_APPLICATION_TITLE;
- if (preg_match('/\d\.\d/', $appli)) {
- if (!preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) {
- $appli .= " (".DOL_VERSION.")"; // If new title contains a version that is different than core
- }
- } else {
- $appli .= " ".DOL_VERSION;
- }
- } else {
- $appli .= " ".DOL_VERSION;
- }
$urlback = $_SERVER["REQUEST_URI"];
$topic = '['.$appli.'] '.$companylangs->transnoentitiesnoconv("NewOnlinePaymentReceived");
@@ -1740,21 +1745,6 @@ if ($ispaymentok) {
$urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
- // Define link to login card
- $appli = constant('DOL_APPLICATION_TITLE');
- if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
- $appli = $conf->global->MAIN_APPLICATION_TITLE;
- if (preg_match('/\d\.\d/', $appli)) {
- if (!preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) {
- $appli .= " (".DOL_VERSION.")"; // If new title contains a version that is different than core
- }
- } else {
- $appli .= " ".DOL_VERSION;
- }
- } else {
- $appli .= " ".DOL_VERSION;
- }
-
$urlback = $_SERVER["REQUEST_URI"];
$topic = '['.$appli.'] '.$companylangs->transnoentitiesnoconv("ValidationOfPaymentFailed");
$content = "";
diff --git a/htdocs/public/recruitment/index.php b/htdocs/public/recruitment/index.php
index bb135d54d50..23a180b9a7b 100644
--- a/htdocs/public/recruitment/index.php
+++ b/htdocs/public/recruitment/index.php
@@ -171,6 +171,7 @@ if (!empty($conf->global->RECRUITMENT_IMAGE_PUBLIC_INTERFACE)) {
$results = $object->fetchAll($sortfield, $sortorder, 0, 0, array('status' => 1));
+$now = dol_now();
if (is_array($results)) {
if (empty($results)) {
diff --git a/htdocs/public/recruitment/view.php b/htdocs/public/recruitment/view.php
index 24c0eaf6088..57cb82d9b08 100644
--- a/htdocs/public/recruitment/view.php
+++ b/htdocs/public/recruitment/view.php
@@ -94,7 +94,7 @@ if ($cancel) {
$action = 'view';
}
-if ($action == "view" || $action == "presend" || $action == "close" || $action == "confirm_public_close" || $action == "add_message") {
+if ($action == "view" || $action == "presend" || $action == "dosubmit") {
$error = 0;
$display_ticket = false;
if (!strlen($ref)) {
@@ -119,11 +119,11 @@ if ($action == "view" || $action == "presend" || $action == "close" || $action =
}
/*
- if (!$error && $action == "add_message" && $display_ticket && GETPOSTISSET('btn_add_message'))
+ if (!$error && $action == "dosubmit")
{
- // TODO Add message...
- $ret = $object->newMessage($user, $action, 0, 1);
+ // Test MAIN_SECURITY_MAX_POST_ON_PUBLIC_PAGES_BY_IP_ADDRESS
+ // TODO Create job application
@@ -136,7 +136,7 @@ if ($action == "view" || $action == "presend" || $action == "close" || $action =
if ($error || $errors) {
setEventMessages($object->error, $object->errors, 'errors');
- if ($action == "add_message") {
+ if ($action == "dosubmit") {
$action = 'presend';
} else {
$action = '';
@@ -185,7 +185,7 @@ print '
'."\n";
print '
'."\n";
print '
'."\n";
print ' '."\n";
-print ' '."\n";
+print ' '."\n";
print ' '."\n";
print ' '."\n";
print ' '."\n";
diff --git a/htdocs/public/ticket/create_ticket.php b/htdocs/public/ticket/create_ticket.php
index 50f5a8776c2..43c2e7bbd78 100644
--- a/htdocs/public/ticket/create_ticket.php
+++ b/htdocs/public/ticket/create_ticket.php
@@ -163,8 +163,17 @@ if (empty($reshook)) {
// Le premier contact trouvé est utilisé pour déterminer le contact suivi
$contacts = $object->searchContactByEmail($origin_email);
+ // Ensure that contact is active and select first active contact
+ $cid = -1;
+ foreach ($contacts as $key => $contact) {
+ if ((int) $contact->statut == 1) {
+ $cid = $key;
+ break;
+ }
+ }
+
// Option to require email exists to create ticket
- if (!empty($conf->global->TICKET_EMAIL_MUST_EXISTS) && !$contacts[0]->socid) {
+ if (!empty($conf->global->TICKET_EMAIL_MUST_EXISTS) && ($cid < 0 || empty($contacts[$cid]->socid))) {
$error++;
array_push($object->errors, $langs->trans("ErrorEmailMustExistToCreateTicket"));
$action = '';
@@ -310,13 +319,13 @@ if (empty($reshook)) {
}
}
- if (is_array($searched_companies)) {
+ if (!empty($searched_companies) && is_array($searched_companies)) {
$object->fk_soc = $searched_companies[0]->id;
}
- if (is_array($contacts) and count($contacts) > 0) {
- $object->fk_soc = $contacts[0]->socid;
- $usertoassign = $contacts[0]->id;
+ if (is_array($contacts) && count($contacts) > 0 && $cid >= 0) {
+ $object->fk_soc = $contacts[$cid]->socid;
+ $usertoassign = $contacts[$cid]->id;
}
$ret = $extrafields->setOptionalsFromPost(null, $object);
@@ -329,7 +338,7 @@ if (empty($reshook)) {
if ($nb_post_max > 0 && $nb_post_ip >= $nb_post_max) {
$error++;
$errors = array($langs->trans("AlreadyTooMuchPostOnThisIPAdress"));
- array_push($object->errors, array($langs->trans("AlreadyTooMuchPostOnThisIPAdress")));
+ array_push($object->errors, $langs->trans("AlreadyTooMuchPostOnThisIPAdress"));
$action = 'create_ticket';
}
diff --git a/htdocs/public/ticket/list.php b/htdocs/public/ticket/list.php
index 3fe6253b879..c929c2486bd 100644
--- a/htdocs/public/ticket/list.php
+++ b/htdocs/public/ticket/list.php
@@ -62,6 +62,8 @@ $cancel = GETPOST('cancel', 'aZ09');
$track_id = GETPOST('track_id', 'alpha');
$email = strtolower(GETPOST('email', 'alpha'));
+$suffix = "";
+$moreforfilter = "";
if (GETPOST('btn_view_ticket_list')) {
unset($_SESSION['track_id_customer']);
@@ -364,7 +366,7 @@ if ($action == "view_ticketlist") {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."element_contact as ec ON ec.element_id = t.rowid";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_type_contact as tc ON ec.fk_c_type_contact = tc.rowid";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople sp ON ec.fk_socpeople = sp.rowid";
- if (is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
+ if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."ticket_extrafields as ef on (t.rowid = ef.fk_object)";
}
$sql .= " WHERE t.entity IN (".getEntity('ticket').")";
@@ -736,7 +738,7 @@ if ($action == "view_ticketlist") {
print '';
print ''.$langs->trans('Email').' ';
- print ' ';
+ print ' ';
print '
';
print '';
diff --git a/htdocs/public/ticket/view.php b/htdocs/public/ticket/view.php
index 3f137148a89..edf2504fb0c 100644
--- a/htdocs/public/ticket/view.php
+++ b/htdocs/public/ticket/view.php
@@ -63,6 +63,7 @@ $cancel = GETPOST('cancel', 'aZ09');
$track_id = GETPOST('track_id', 'alpha');
$email = GETPOST('email', 'email');
+$suffix = "";
if (GETPOST('btn_view_ticket')) {
unset($_SESSION['email_customer']);
@@ -205,7 +206,7 @@ if ($action == "view_ticket" || $action == "presend" || $action == "close" || $a
$triggersendname = 'TICKET_SENTBYMAIL';
$paramname = 'id';
$autocopy = 'MAIN_MAIL_AUTOCOPY_TICKET_TO'; // used to know the automatic BCC to add
-$trackid = 'tic'.$object->id;
+if (!empty($object->id)) $trackid = 'tic'.$object->id;
include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
@@ -371,7 +372,7 @@ if ($action == "view_ticket" || $action == "presend" || $action == "close" || $a
if ($object->dao->fk_statut < Ticket::STATUS_CLOSED) {
// New message
- print '
';
+ print '';
// Close ticket
if ($object->dao->fk_statut >= Ticket::STATUS_NOT_READ && $object->dao->fk_statut < Ticket::STATUS_CLOSED) {
@@ -401,7 +402,7 @@ if ($action == "view_ticket" || $action == "presend" || $action == "close" || $a
print '';
print ''.$langs->trans('Email').' ';
- print ' ';
+ print ' ';
print '
';
print '';
diff --git a/htdocs/reception/card.php b/htdocs/reception/card.php
index 7d4d58cbc83..9fdae4e0cc7 100644
--- a/htdocs/reception/card.php
+++ b/htdocs/reception/card.php
@@ -51,10 +51,8 @@ if (isModEnabled("product") || isModEnabled("service")) {
if (isModEnabled("propal")) {
require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
}
-if ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order")) {
- require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
- require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.dispatch.class.php';
-}
+require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
+require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.dispatch.class.php';
if (isModEnabled('productbatch')) {
require_once DOL_DOCUMENT_ROOT.'/product/class/productbatch.class.php';
}
@@ -65,7 +63,7 @@ if (!empty($conf->project->enabled)) {
$langs->loadLangs(array("receptions", "companies", "bills", 'deliveries', 'orders', 'stocks', 'other', 'propal', 'sendings'));
-if (!empty($conf->incoterm->enabled)) {
+if (isModEnabled('incoterm')) {
$langs->load('incoterm');
}
if (isModEnabled('productbatch')) {
@@ -219,7 +217,7 @@ if (empty($reshook)) {
}
// Set incoterm
- if ($action == 'set_incoterms' && !empty($conf->incoterm->enabled) && $permissiontoadd) {
+ if ($action == 'set_incoterms' && isModEnabled('incoterm') && $permissiontoadd) {
$result = $object->setIncoterms(GETPOST('incoterm_id', 'int'), GETPOST('location_incoterms', 'alpha'));
}
@@ -360,6 +358,7 @@ if (empty($reshook)) {
$batch = "batch".$i;
$cost_price = "cost_price".$i;
+ //if (GETPOST($qty, 'int') > 0 || (GETPOST($qty, 'int') == 0 && getDolGlobalString('RECEPTION_GETS_ALL_ORDER_PRODUCTS')) || (GETPOST($qty, 'int') < 0 && getDolGlobalString('RECEPTION_ALLOW_NEGATIVE_QTY'))) {
if (GETPOST($qty, 'int') > 0 || (GETPOST($qty, 'int') == 0 && $conf->global->RECEPTION_GETS_ALL_ORDER_PRODUCTS)) {
$ent = "entl".$i;
@@ -893,7 +892,7 @@ if ($action == 'create') {
}
// Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
print '
';
print ''.$form->textwithpicto($langs->trans("IncotermLabel"), $objectsrc->label_incoterms, 1).' ';
print '';
@@ -1102,14 +1101,14 @@ if ($action == 'create') {
$text = $product_static->getNomUrl(1);
$text .= ' - '.(!empty($line->label) ? $line->label : $line->product_label);
- $description = ($conf->global->PRODUIT_DESC_IN_FORM ? '' : dol_htmlentitiesbr($line->desc));
+ $description = (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE') ? '' : dol_htmlentitiesbr($line->desc));
print $form->textwithtooltip($text, $description, 3, '', '', $i);
// Show range
print_date_range($db->jdate($line->date_start), $db->jdate($line->date_end));
// Add description in form
- if (!empty($conf->global->PRODUIT_DESC_IN_FORM)) {
+ if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
print ($line->desc && $line->desc != $line->product_label) ? ' '.dol_htmlentitiesbr($line->desc) : '';
}
}
@@ -1380,39 +1379,25 @@ if ($action == 'create') {
$morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->reception->creer, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1);
// Project
if (!empty($conf->project->enabled)) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
+ $morehtmlref .= ' ';
if (0) { // Do not change on reception
- if ($action != 'classify') {
- $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- // $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
+ if ($action != 'classify' && $permissiontoadd) {
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
- // We don't have project on reception, so we will use the project or source object instead
- // TODO Add project on reception
- $morehtmlref .= ' : ';
- if (!empty($objectsrc->fk_project)) {
+ if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
$proj = new Project($db);
$proj->fetch($objectsrc->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
@@ -1628,7 +1613,7 @@ if ($action == 'create') {
print ' ';
// Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
print '';
print '';
print $langs->trans('IncotermLabel');
@@ -1825,10 +1810,10 @@ if ($action == 'create') {
if (!array_key_exists($lines[$i]->fk_commandefourndet, $arrayofpurchaselinealreadyoutput)) {
$text = $lines[$i]->product->getNomUrl(1);
$text .= ' - '.$label;
- $description = (!empty($conf->global->PRODUIT_DESC_IN_FORM) ? '' : dol_htmlentitiesbr($lines[$i]->product->description));
+ $description = (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE') ? '' : dol_htmlentitiesbr($lines[$i]->product->description));
print $form->textwithtooltip($text, $description, 3, '', '', $i);
print_date_range(!empty($lines[$i]->date_start) ? $lines[$i]->date_start : 0, !empty($lines[$i]->date_end) ? $lines[$i]->date_end : 0);
- if (!empty($conf->global->PRODUIT_DESC_IN_FORM)) {
+ if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
print (!empty($lines[$i]->product->description) && $lines[$i]->description != $lines[$i]->product->description) ? ' '.dol_htmlentitiesbr($lines[$i]->description) : '';
}
}
diff --git a/htdocs/reception/class/reception.class.php b/htdocs/reception/class/reception.class.php
index 47b4bcdeb0d..bda9821f993 100644
--- a/htdocs/reception/class/reception.class.php
+++ b/htdocs/reception/class/reception.class.php
@@ -50,6 +50,11 @@ class Reception extends CommonObject
{
use CommonIncoterm;
+ /**
+ * @var string code
+ */
+ public $code = "";
+
/**
* @var string element name
*/
@@ -113,6 +118,10 @@ class Reception extends CommonObject
public $lines = array();
+ // detail of lot and qty = array(id in llx_commande_fournisseur_dispatch, batch, qty)
+ // We can use this to know warehouse planned to be used for each lot.
+ public $detail_batch;
+
const STATUS_DRAFT = 0;
const STATUS_VALIDATED = 1;
const STATUS_CLOSED = 2;
@@ -571,7 +580,7 @@ class Reception extends CommonObject
$qty = $obj->qty;
- if ($qty <= 0) {
+ if ($qty == 0 || ($qty < 0 && !getDolGlobalInt('RECEPTION_ALLOW_NEGATIVE_QTY'))) {
continue;
}
dol_syslog(get_class($this)."::valid movement index ".$i." ed.rowid=".$obj->rowid." edb.rowid=".$obj->edbrowid);
@@ -1204,6 +1213,14 @@ class Reception extends CommonObject
$this->total_ttc += $pu_ht + $tva;
+ if (isModEnabled('productbatch') && !empty($line->batch)) {
+ $detail_batch = new stdClass();
+ $detail_batch->eatby = $line->eatby;
+ $detail_batch->sellby = $line->sellby;
+ $detail_batch->batch = $line->batch;
+ $detail_batch->qty = $line->qty;
+ $line->detail_batch[] = $detail_batch;
+ }
$this->lines[] = $line;
}
@@ -1641,23 +1658,8 @@ class Reception extends CommonObject
}
}
- // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
- * Classify the reception as invoiced (used when WORKFLOW_BILL_ON_RECEPTION is on)
- *
- * @deprecated
- * @see setBilled()
- * @return int <0 if ko, >0 if ok
- */
- public function set_billed()
- {
- // phpcs:enable
- dol_syslog(get_class($this)."::set_billed is deprecated, use setBilled instead", LOG_NOTICE);
- return $this->setBilled();
- }
-
- /**
- * Classify the reception as invoiced (used when WORKFLOW_BILL_ON_RECEPTION is on)
+ * Classify the reception as invoiced (used when WORKFLOW_EXPEDITION_CLASSIFY_CLOSED_INVOICE is on)
*
* @return int <0 if ko, >0 if ok
*/
diff --git a/htdocs/reception/class/receptionstats.class.php b/htdocs/reception/class/receptionstats.class.php
index a27f458d01a..7a8562b706d 100644
--- a/htdocs/reception/class/receptionstats.class.php
+++ b/htdocs/reception/class/receptionstats.class.php
@@ -69,7 +69,7 @@ class ReceptionStats extends Stats
$this->where .= " c.fk_statut > 0"; // Not draft and not cancelled
//$this->where.= " AND c.fk_soc = s.rowid AND c.entity = ".$conf->entity;
- $this->where .= " AND c.entity = ".$conf->entity;
+ $this->where .= " AND c.entity IN (".getEntity('reception').")";
if (empty($user->rights->societe->client->voir) && !$this->socid) {
$this->where .= " AND c.fk_soc = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
}
@@ -128,6 +128,54 @@ class ReceptionStats extends Stats
return $this->_getNbByYear($sql);
}
+ /**
+ * Return the orders amount by month for a year
+ *
+ * @param int $year Year to scan
+ * @param int $format 0=Label of abscissa is a translated text, 1=Label of abscissa is month number, 2=Label of abscissa is first letter of month
+ * @return array Array with amount by month
+ */
+ public function getAmountByMonth($year, $format = 0)
+ {
+ global $user;
+
+ $sql = "SELECT date_format(c.date_valid,'%m') as dm, SUM(c.".$this->field.")";
+ $sql .= " FROM ".$this->from;
+ if (empty($user->rights->societe->client->voir) && !$this->socid) {
+ $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
+ }
+ $sql .= " WHERE c.date_valid BETWEEN '".$this->db->idate(dol_get_first_day($year))."' AND '".$this->db->idate(dol_get_last_day($year))."'";
+ $sql .= " AND ".$this->where;
+ $sql .= " GROUP BY dm";
+ $sql .= $this->db->order('dm', 'DESC');
+
+ $res = $this->_getAmountByMonth($year, $sql, $format);
+ return $res;
+ }
+
+ /**
+ * Return the orders amount average by month for a year
+ *
+ * @param int $year year for stats
+ * @return array array with number by month
+ */
+ public function getAverageByMonth($year)
+ {
+ global $user;
+
+ $sql = "SELECT date_format(c.date_valid,'%m') as dm, AVG(c.".$this->field.")";
+ $sql .= " FROM ".$this->from;
+ if (empty($user->rights->societe->client->voir) && !$this->socid) {
+ $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
+ }
+ $sql .= " WHERE c.date_valid BETWEEN '".$this->db->idate(dol_get_first_day($year))."' AND '".$this->db->idate(dol_get_last_day($year))."'";
+ $sql .= " AND ".$this->where;
+ $sql .= " GROUP BY dm";
+ $sql .= $this->db->order('dm', 'DESC');
+
+ return $this->_getAverageByMonth($year, $sql);
+ }
+
/**
* Return nb, total and average
*
diff --git a/htdocs/reception/contact.php b/htdocs/reception/contact.php
index 442657ecf43..a03460b1e49 100644
--- a/htdocs/reception/contact.php
+++ b/htdocs/reception/contact.php
@@ -35,6 +35,8 @@ if (!empty($conf->project->enabled)) {
require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
}
+require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
+require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.dispatch.class.php';
$langs->loadLangs(array("orders", "receptions", "companies"));
@@ -75,6 +77,20 @@ if ($origin == 'reception') {
}
}
+if (isModEnabled("reception")) {
+ $permissiontoread = $user->rights->reception->lire;
+ $permissiontoadd = $user->rights->reception->creer;
+ $permissiondellink = $user->rights->reception->creer; // Used by the include of actions_dellink.inc.php
+ $permissiontovalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->reception->creer)) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->reception->reception_advance->validate)));
+ $permissiontodelete = $user->rights->reception->supprimer;
+} else {
+ $permissiontoread = $user->rights->fournisseur->commande->receptionner;
+ $permissiontoadd = $user->rights->fournisseur->commande->receptionner;
+ $permissiondellink = $user->rights->fournisseur->commande->receptionner; // Used by the include of actions_dellink.inc.php
+ $permissiontovalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->fournisseur->commande->receptionner)) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->fournisseur->commande_advance->check)));
+ $permissiontodelete = $user->rights->fournisseur->commande->receptionner;
+}
+
/*
* Actions
@@ -146,39 +162,25 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $form->editfieldkey("RefSupplier", '', $object->ref_supplier, $object, $user->rights->reception->creer, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefSupplier", '', $object->ref_supplier, $object, $user->rights->reception->creer, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= ' '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= ' '.$object->thirdparty->getNomUrl(1);
// Project
if (!empty($conf->project->enabled)) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
+ $morehtmlref .= ' ';
if (0) { // Do not change on reception
- if ($action != 'classify') {
- $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- // $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
+ if ($action != 'classify' && $permissiontoadd) {
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
- // We don't have project on reception, so we will use the project or source object instead
- // TODO Add project on reception
- $morehtmlref .= ' : ';
- if (!empty($objectsrc->fk_project)) {
+ if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
$proj = new Project($db);
$proj->fetch($objectsrc->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
@@ -191,7 +193,7 @@ if ($id > 0 || !empty($ref)) {
//print '';
print '
';
- print '
';
+ print '';
// Linked documents
if ($origin == 'order_supplier' && $object->$typeobject->id && (isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) || isModEnabled("supplier_order"))) {
print '';
diff --git a/htdocs/reception/document.php b/htdocs/reception/document.php
index 10227373015..980b5e50a33 100644
--- a/htdocs/reception/document.php
+++ b/htdocs/reception/document.php
@@ -37,6 +37,8 @@ require_once DOL_DOCUMENT_ROOT.'/reception/class/reception.class.php';
if (!empty($conf->project->enabled)) {
require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
}
+require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
+require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.dispatch.class.php';
// Load translation files required by the page
$langs->loadLangs(array('companies', 'other'));
@@ -65,19 +67,48 @@ if (!$sortfield) {
}
$object = new Reception($db);
-
-if ($object->fetch($id, $ref)) {
+if ($id > 0 || !empty($ref)) {
+ $object->fetch($id, $ref);
$object->fetch_thirdparty();
+
+ if (!empty($object->origin)) {
+ $origin = $object->origin;
+
+ $object->fetch_origin();
+ $typeobject = $object->origin;
+ }
+
+ // Linked documents
+ if ($origin == 'order_supplier' && $object->$typeobject->id && (isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) || isModEnabled("supplier_order"))) {
+ $objectsrc = new CommandeFournisseur($db);
+ $objectsrc->fetch($object->$typeobject->id);
+ }
+
$upload_dir = $conf->reception->dir_output."/".dol_sanitizeFileName($object->ref);
}
+// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
+$hookmanager->initHooks(array('receptiondocument'));
+
// Security check
-if ($user->socid) {
+if ($user->socid > 0) {
$socid = $user->socid;
}
$result = restrictedArea($user, 'reception', $object->id, '');
-$permissiontoadd = $user->rights->reception->creer; // Used by the include of actions_dellink.inc.php
+if (isModEnabled("reception")) {
+ $permissiontoread = $user->rights->reception->lire;
+ $permissiontoadd = $user->rights->reception->creer;
+ $permissiondellink = $user->rights->reception->creer; // Used by the include of actions_dellink.inc.php
+ $permissiontovalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->reception->creer)) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->reception->reception_advance->validate)));
+ $permissiontodelete = $user->rights->reception->supprimer;
+} else {
+ $permissiontoread = $user->rights->fournisseur->commande->receptionner;
+ $permissiontoadd = $user->rights->fournisseur->commande->receptionner;
+ $permissiondellink = $user->rights->fournisseur->commande->receptionner; // Used by the include of actions_dellink.inc.php
+ $permissiontovalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->fournisseur->commande->receptionner)) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->fournisseur->commande_advance->check)));
+ $permissiontodelete = $user->rights->fournisseur->commande->receptionner;
+}
/*
@@ -117,41 +148,30 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref = '';
+ // Ref customer reception
+ $morehtmlref .= $form->editfieldkey("RefSupplier", '', $object->ref_supplier, $object, $user->rights->reception->creer, 'string', '', 0, 1);
+ $morehtmlref .= $form->editfieldval("RefSupplier", '', $object->ref_supplier, $object, $user->rights->reception->creer, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= '
'.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= '
'.$object->thirdparty->getNomUrl(1);
// Project
if (!empty($conf->project->enabled)) {
$langs->load("projects");
- $morehtmlref .= '
'.$langs->trans('Project').' ';
- if (0) { // Do not change on shipment
- if ($action != 'classify') {
- $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- // $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= '
';
+ if (0) { // Do not change on reception
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
+ if ($action != 'classify' && $permissiontoadd) {
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
- // We don't have project on shipment, so we will use the project or source object instead
- // TODO Add project on shipment
- $morehtmlref .= ' : ';
- if (!empty($objectsrc->fk_project)) {
+ if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
$proj = new Project($db);
$proj->fetch($objectsrc->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/reception/list.php b/htdocs/reception/list.php
index 155e5185f57..210f068af0a 100644
--- a/htdocs/reception/list.php
+++ b/htdocs/reception/list.php
@@ -52,6 +52,22 @@ $search_zip = GETPOST('search_zip', 'alpha');
$search_state = GETPOST("search_state");
$search_country = GETPOST("search_country", 'int');
$search_type_thirdparty = GETPOST("search_type_thirdparty", 'int');
+$search_date_delivery_startday = GETPOST('search_date_delivery_startday', 'int');
+$search_date_delivery_startmonth = GETPOST('search_date_delivery_startmonth', 'int');
+$search_date_delivery_startyear = GETPOST('search_date_delivery_startyear', 'int');
+$search_date_delivery_endday = GETPOST('search_date_delivery_endday', 'int');
+$search_date_delivery_endmonth = GETPOST('search_date_delivery_endmonth', 'int');
+$search_date_delivery_endyear = GETPOST('search_date_delivery_endyear', 'int');
+$search_date_delivery_start = dol_mktime(0, 0, 0, $search_date_delivery_startmonth, $search_date_delivery_startday, $search_date_delivery_startyear); // Use tzserver
+$search_date_delivery_end = dol_mktime(23, 59, 59, $search_date_delivery_endmonth, $search_date_delivery_endday, $search_date_delivery_endyear);
+$search_date_create_startday = GETPOST('search_date_create_startday', 'int');
+$search_date_create_startmonth = GETPOST('search_date_create_startmonth', 'int');
+$search_date_create_startyear = GETPOST('search_date_create_startyear', 'int');
+$search_date_create_endday = GETPOST('search_date_create_endday', 'int');
+$search_date_create_endmonth = GETPOST('search_date_create_endmonth', 'int');
+$search_date_create_endyear = GETPOST('search_date_create_endyear', 'int');
+$search_date_create_start = dol_mktime(0, 0, 0, $search_date_create_startmonth, $search_date_create_startday, $search_date_create_startyear); // Use tzserver
+$search_date_create_end = dol_mktime(23, 59, 59, $search_date_create_endmonth, $search_date_create_endday, $search_date_create_endyear);
$search_billed = GETPOST("search_billed", 'int');
$sall = GETPOST('sall', 'alphanohtml');
$optioncss = GETPOST('optioncss', 'alpha');
@@ -161,6 +177,22 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x'
$search_state = "";
$search_country = '';
$search_type_thirdparty = '';
+ $search_date_delivery_startday = '';
+ $search_date_delivery_startmonth = '';
+ $search_date_delivery_startyear = '';
+ $search_date_delivery_endday = '';
+ $search_date_delivery_endmonth = '';
+ $search_date_delivery_endyear = '';
+ $search_date_delivery_start = '';
+ $search_date_delivery_end = '';
+ $search_date_create_startday = '';
+ $search_date_create_startmonth = '';
+ $search_date_create_startyear = '';
+ $search_date_create_endday = '';
+ $search_date_create_endmonth = '';
+ $search_date_create_endyear = '';
+ $search_date_create_start = '';
+ $search_date_create_end = '';
$search_billed = '';
$search_status = '';
$search_array_options = array();
@@ -545,6 +577,18 @@ if ($search_country) {
if ($search_type_thirdparty != '' && $search_type_thirdparty > 0) {
$sql .= " AND s.fk_typent IN (".$db->sanitize($search_type_thirdparty).')';
}
+if ($search_date_delivery_start) {
+ $sql .= " AND e.date_delivery >= '".$db->idate($search_date_delivery_start)."'";
+}
+if ($search_date_delivery_end) {
+ $sql .= " AND e.date_delivery <= '".$db->idate($search_date_delivery_end)."'";
+}
+if ($search_date_create_start) {
+ $sql .= " AND e.date_creation >= '".$db->idate($search_date_create_start)."'";
+}
+if ($search_date_create_end) {
+ $sql .= " AND e.date_creation <= '".$db->idate($search_date_create_end)."'";
+}
if ($search_ref_rcp) {
$sql .= natural_search('e.ref', $search_ref_rcp);
}
@@ -633,6 +677,42 @@ if ($search_country) {
if ($search_type_thirdparty) {
$param .= "&search_type_thirdparty=".urlencode($search_type_thirdparty);
}
+if ($search_date_delivery_startday) {
+ $param .= '&search_date_delivery_startday='.urlencode($search_date_delivery_startday);
+}
+if ($search_date_delivery_startmonth) {
+ $param .= '&search_date_delivery_startmonth='.urlencode($search_date_delivery_startmonth);
+}
+if ($search_date_delivery_startyear) {
+ $param .= '&search_date_delivery_startyear='.urlencode($search_date_delivery_startyear);
+}
+if ($search_date_delivery_endday) {
+ $param .= '&search_date_delivery_endday='.urlencode($search_date_delivery_endday);
+}
+if ($search_date_delivery_endmonth) {
+ $param .= '&search_date_delivery_endmonth='.urlencode($search_date_delivery_endmonth);
+}
+if ($search_date_delivery_endyear) {
+ $param .= '&search_date_delivery_endyear='.urlencode($search_date_delivery_endyear);
+}
+if ($search_date_create_startday) {
+ $param .= '&search_date_create_startday='.urlencode($search_date_create_startday);
+}
+if ($search_date_create_startmonth) {
+ $param .= '&search_date_create_startmonth='.urlencode($search_date_create_startmonth);
+}
+if ($search_date_create_startyear) {
+ $param .= '&search_date_create_startyear='.urlencode($search_date_create_startyear);
+}
+if ($search_date_create_endday) {
+ $param .= '&search_date_create_endday='.urlencode($search_date_create_endday);
+}
+if ($search_date_create_endmonth) {
+ $param .= '&search_date_create_endmonth='.urlencode($search_date_create_endmonth);
+}
+if ($search_date_create_endyear) {
+ $param .= '&search_date_create_endyear='.urlencode($search_date_create_endyear);
+}
if ($search_ref_supplier) {
$param .= "&search_ref_supplier=".urlencode($search_ref_supplier);
}
@@ -815,7 +895,14 @@ if (!empty($arrayfields['typent.code']['checked'])) {
}
// Date delivery planned
if (!empty($arrayfields['e.date_delivery']['checked'])) {
- print '
';
+ print '
';
+ print '';
+ print $form->selectDate($search_date_delivery_start ? $search_date_delivery_start : -1, 'search_date_delivery_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
+ print '
';
+ print '';
+ print $form->selectDate($search_date_delivery_end ? $search_date_delivery_end : -1, 'search_date_delivery_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
+ print '
';
+ print ' ';
}
if (!empty($arrayfields['l.ref']['checked'])) {
// Delivery ref
@@ -836,7 +923,13 @@ $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // N
print $hookmanager->resPrint;
// Date creation
if (!empty($arrayfields['e.datec']['checked'])) {
- print '
';
+ print ' ';
+ print '';
+ print $form->selectDate($search_date_create_start ? $search_date_create_start : -1, 'search_date_create_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
+ print '
';
+ print '';
+ print $form->selectDate($search_date_create_end ? $search_date_create_end : -1, 'search_date_create_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
+ print '
';
print ' ';
}
// Date modification
@@ -1026,10 +1119,12 @@ while ($i < min($num, $limit)) {
// Type ent
if (!empty($arrayfields['typent.code']['checked'])) {
print '
';
- if (count($typenArray) == 0) {
+ if (!isset($typenArray) || empty($typenArray)) {
$typenArray = $formcompany->typent_array(1);
}
- print $typenArray[$obj->typent_code];
+ if (isset($typenArray[$obj->typent_code])) {
+ print $typenArray[$obj->typent_code];
+ }
print ' ';
if (!$i) {
$totalarray['nbfield']++;
diff --git a/htdocs/reception/note.php b/htdocs/reception/note.php
index 617d260e643..d916099b872 100644
--- a/htdocs/reception/note.php
+++ b/htdocs/reception/note.php
@@ -28,11 +28,12 @@
require '../main.inc.php';
require_once DOL_DOCUMENT_ROOT.'/reception/class/reception.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/reception.lib.php';
-dol_include_once('/fourn/class/fournisseur.commande.class.php');
if (!empty($conf->project->enabled)) {
require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
}
+require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
+require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.dispatch.class.php';
$langs->loadLangs(array("receptions", "companies", "bills", 'deliveries', 'orders', 'stocks', 'other', 'propal'));
@@ -46,32 +47,41 @@ if ($id > 0 || !empty($ref)) {
$object->fetch_thirdparty();
if (!empty($object->origin)) {
- $typeobject = $object->origin;
$origin = $object->origin;
+
$object->fetch_origin();
+ $typeobject = $object->origin;
}
// Linked documents
- if ($typeobject == 'commande' && $object->$typeobject->id && isModEnabled('commande')) {
- $objectsrc = new Commande($db);
- $objectsrc->fetch($object->$typeobject->id);
- }
- if ($typeobject == 'propal' && $object->$typeobject->id && isModEnabled("propal")) {
- $objectsrc = new Propal($db);
+ if ($origin == 'order_supplier' && $object->$typeobject->id && (isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) || isModEnabled("supplier_order"))) {
+ $objectsrc = new CommandeFournisseur($db);
$objectsrc->fetch($object->$typeobject->id);
}
}
-$permissionnote = $user->rights->reception->creer; // Used by the include of actions_setnotes.inc.php
+// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
+$hookmanager->initHooks(array('receptionnote'));
// Security check
if ($user->socid > 0) {
$socid = $user->socid;
}
-
-// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
-$hookmanager->initHooks(array('receptionnote'));
+if (isModEnabled("reception")) {
+ $permissiontoread = $user->rights->reception->lire;
+ $permissiontoadd = $user->rights->reception->creer;
+ $permissiondellink = $user->rights->reception->creer; // Used by the include of actions_dellink.inc.php
+ $permissiontovalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->reception->creer)) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->reception->reception_advance->validate)));
+ $permissiontodelete = $user->rights->reception->supprimer;
+} else {
+ $permissiontoread = $user->rights->fournisseur->commande->receptionner;
+ $permissiontoadd = $user->rights->fournisseur->commande->receptionner;
+ $permissiondellink = $user->rights->fournisseur->commande->receptionner; // Used by the include of actions_dellink.inc.php
+ $permissiontovalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->fournisseur->commande->receptionner)) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->fournisseur->commande_advance->check)));
+ $permissiontodelete = $user->rights->fournisseur->commande->receptionner;
+}
+$permissionnote = $user->rights->reception->creer; // Used by the include of actions_setnotes.inc.php
if ($origin == 'reception') {
$result = restrictedArea($user, $origin, $object->id);
@@ -106,7 +116,7 @@ if (empty($reshook)) {
* View
*/
-llxHeader('', 'Reception');
+llxHeader('', $langs->trans('Reception'));
$form = new Form($db);
@@ -123,39 +133,25 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= $form->editfieldkey("RefSupplier", '', $object->ref_supplier, $object, $user->rights->reception->creer, 'string', '', 0, 1);
$morehtmlref .= $form->editfieldval("RefSupplier", '', $object->ref_supplier, $object, $user->rights->reception->creer, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= '
'.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= '
'.$object->thirdparty->getNomUrl(1);
// Project
if (!empty($conf->project->enabled)) {
$langs->load("projects");
- $morehtmlref .= '
'.$langs->trans('Project').' ';
+ $morehtmlref .= '
';
if (0) { // Do not change on reception
- if ($action != 'classify') {
- $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- // $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
+ if ($action != 'classify' && $permissiontoadd) {
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
- // We don't have project on reception, so we will use the project or source object instead
- // TODO Add project on reception
- $morehtmlref .= ' : ';
- if (!empty($objectsrc->fk_project)) {
+ if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
$proj = new Project($db);
$proj->fetch($objectsrc->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/reception/stats/index.php b/htdocs/reception/stats/index.php
index b1f5dbdc7f9..1e26bf5871a 100644
--- a/htdocs/reception/stats/index.php
+++ b/htdocs/reception/stats/index.php
@@ -36,7 +36,7 @@ $HEIGHT = DolGraph::getDefaultGraphSizeForStats('height');
$userid = GETPOST('userid', 'int');
$socid = GETPOST('socid', 'int');
-$nowyear = strftime("%Y", dol_now());
+$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$year = GETPOST('year') > 0 ?GETPOST('year') : $nowyear;
$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS)));
$endyear = $year;
diff --git a/htdocs/recruitment/class/api_recruitment.class.php b/htdocs/recruitment/class/api_recruitment.class.php
index af2c87dcdb3..cf4fa7a143e 100644
--- a/htdocs/recruitment/class/api_recruitment.class.php
+++ b/htdocs/recruitment/class/api_recruitment.class.php
@@ -441,7 +441,7 @@ class Recruitment extends DolibarrApi
// $this->jobposition->abc = sanitizeVal($this->jobposition->abc, 'alphanohtml');
if ($this->jobposition->update(DolibarrApiAccess::$user, false) > 0) {
- return $this->get($id);
+ return $this->getJobPosition($id);
} else {
throw new RestException(500, $this->jobposition->error);
}
@@ -484,7 +484,7 @@ class Recruitment extends DolibarrApi
// $this->jobposition->abc = sanitizeVal($this->jobposition->abc, 'alphanohtml');
if ($this->candidature->update(DolibarrApiAccess::$user, false) > 0) {
- return $this->get($id);
+ return $this->getCandidature($id);
} else {
throw new RestException(500, $this->candidature->error);
}
diff --git a/htdocs/recruitment/class/recruitmentcandidature.class.php b/htdocs/recruitment/class/recruitmentcandidature.class.php
index 794eed1716d..2ece5dbe217 100644
--- a/htdocs/recruitment/class/recruitmentcandidature.class.php
+++ b/htdocs/recruitment/class/recruitmentcandidature.class.php
@@ -111,14 +111,14 @@ class RecruitmentCandidature extends CommonObject
'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>0, 'noteditable'=>'1', 'index'=>1, 'comment'=>"Id"),
'entity' => array('type'=>'integer', 'label'=>'Entity', 'enabled'=>1, 'visible'=>0, 'position'=>5, 'notnull'=>1, 'default'=>'1', 'index'=>1),
'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>'1', 'position'=>10, 'notnull'=>1, 'visible'=>4, 'noteditable'=>'1', 'default'=>'(PROV)', 'index'=>1, 'searchall'=>1, 'showoncombobox'=>'1', 'comment'=>"Reference of candidature", 'csslist'=>'nowraponall'),
- 'fk_recruitmentjobposition' => array('type'=>'integer:RecruitmentJobPosition:recruitment/class/recruitmentjobposition.class.php', 'label'=>'Job', 'enabled'=>'1', 'position'=>15, 'notnull'=>0, 'visible'=>1, 'index'=>1, 'picto'=>'recruitmentjobposition', 'css'=>'minwidth300 maxwidth500 widthcentpercentminusx', 'csslist'=>'minwidth125 tdoverflowmax200'),
+ 'fk_recruitmentjobposition' => array('type'=>'integer:RecruitmentJobPosition:recruitment/class/recruitmentjobposition.class.php', 'label'=>'Job', 'enabled'=>'1', 'position'=>15, 'notnull'=>0, 'visible'=>1, 'index'=>1, 'picto'=>'recruitmentjobposition', 'css'=>'minwidth300 maxwidth500 widthcentpercentminusx', 'csslist'=>'minwidth100 nowraponall'),
'note_public' => array('type'=>'html', 'label'=>'NotePublic', 'enabled'=>'1', 'position'=>61, 'notnull'=>0, 'visible'=>0,),
'note_private' => array('type'=>'html', 'label'=>'NotePrivate', 'enabled'=>'1', 'position'=>62, 'notnull'=>0, 'visible'=>0,),
- 'fk_user_creat' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserAuthor', 'enabled'=>'1', 'position'=>510, 'notnull'=>1, 'visible'=>-2, 'foreignkey'=>'user.rowid',),
- 'fk_user_modif' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'enabled'=>'1', 'position'=>511, 'notnull'=>-1, 'visible'=>-2,),
+ 'fk_user_creat' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserAuthor', 'enabled'=>'1', 'position'=>510, 'notnull'=>1, 'visible'=>-2, 'foreignkey'=>'user.rowid', 'csslist'=>'tdoverflowmax100'),
+ 'fk_user_modif' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'enabled'=>'1', 'position'=>511, 'notnull'=>-1, 'visible'=>-2, 'csslist'=>'tdoverflowmax100'),
'lastname' => array('type'=>'varchar(128)', 'label'=>'Lastname', 'enabled'=>'1', 'position'=>20, 'notnull'=>0, 'visible'=>1, 'csslist'=>'tdoverflowmax150'),
'firstname' => array('type'=>'varchar(128)', 'label'=>'Firstname', 'enabled'=>'1', 'position'=>21, 'notnull'=>0, 'visible'=>1, 'csslist'=>'tdoverflowmax150'),
- 'email' => array('type'=>'email', 'label'=>'EMail', 'enabled'=>'1', 'position'=>30, 'notnull'=>1, 'visible'=>1, 'picto'=>'email', 'csslist'=>'tdoverflowmax200'),
+ 'email' => array('type'=>'email', 'label'=>'EMail', 'enabled'=>'1', 'position'=>30, 'notnull'=>1, 'visible'=>1, 'picto'=>'email', 'csslist'=>'tdoverflowmax150'),
'phone' => array('type'=>'phone', 'label'=>'Phone', 'enabled'=>'1', 'position'=>31, 'notnull'=>0, 'visible'=>1, 'picto'=>'phone', 'csslist'=>'tdoverflowmax150'),
'date_birth' => array('type'=>'date', 'label'=>'DateOfBirth', 'enabled'=>'1', 'position'=>70, 'visible'=>-1,),
'email_msgid' => array('type'=>'varchar(255)', 'label'=>'EmailMsgID', 'visible'=>-2, 'enabled'=>1, 'position'=>540, 'notnull'=>-1, 'help'=>'EmailMsgIDDesc'),
@@ -127,7 +127,7 @@ class RecruitmentCandidature extends CommonObject
'remuneration_requested' => array('type'=>'integer', 'label'=>'RequestedRemuneration', 'enabled'=>'1', 'position'=>80, 'notnull'=>0, 'visible'=>-1,),
'remuneration_proposed' => array('type'=>'integer', 'label'=>'ProposedRemuneration', 'enabled'=>'1', 'position'=>81, 'notnull'=>0, 'visible'=>-1,),
'description' => array('type'=>'html', 'label'=>'Description', 'enabled'=>'1', 'position'=>300, 'notnull'=>0, 'visible'=>3, 'cssview'=>'wordbreak'),
- 'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>'1', 'position'=>500, 'notnull'=>1, 'visible'=>1, 'csslist'=>'nowraponall'),
+ 'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>'1', 'position'=>500, 'notnull'=>1, 'visible'=>-4, 'csslist'=>'nowraponall'),
'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>'1', 'position'=>501, 'notnull'=>0, 'visible'=>-2, 'csslist'=>'nowraponall'),
'import_key' => array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>'1', 'position'=>1000, 'notnull'=>-1, 'visible'=>-2,),
'model_pdf' => array('type'=>'varchar(255)', 'label'=>'Model pdf', 'enabled'=>'1', 'position'=>1010, 'notnull'=>-1, 'visible'=>0,),
@@ -827,6 +827,9 @@ class RecruitmentCandidature extends CommonObject
if ($status == self::STATUS_CANCELED) {
$statusType = 'status9';
}
+ if ($status == self::STATUS_CONTRACT_PROPOSED) {
+ $statusType = 'status4';
+ }
if ($status == self::STATUS_CONTRACT_SIGNED) {
$statusType = 'status6';
}
diff --git a/htdocs/recruitment/class/recruitmentjobposition.class.php b/htdocs/recruitment/class/recruitmentjobposition.class.php
index d5c109a5516..dda796c243e 100644
--- a/htdocs/recruitment/class/recruitmentjobposition.class.php
+++ b/htdocs/recruitment/class/recruitmentjobposition.class.php
@@ -254,7 +254,7 @@ class RecruitmentJobPosition extends CommonObject
// Reset some properties
unset($object->id);
unset($object->fk_user_creat);
- unset($object->import_key);
+ $object->import_key = null;
// Clear fields
if (property_exists($object, 'ref')) {
diff --git a/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php b/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php
index 007333dfd5d..199513993f2 100644
--- a/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php
+++ b/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php
@@ -217,7 +217,7 @@ class pdf_standard_recruitmentjobposition extends ModelePDFRecruitmentJobPositio
$objphoto->fetch($object->lines[$i]->fk_product);
//var_dump($objphoto->ref);exit;
- if (!empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) {
+ if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
$pdir[0] = get_exdir($objphoto->id, 2, 0, 0, $objphoto, 'product').$objphoto->id."/photos/";
$pdir[1] = get_exdir(0, 0, 0, 0, $objphoto, 'product').dol_sanitizeFileName($objphoto->ref).'/';
} else {
@@ -327,7 +327,7 @@ class pdf_standard_recruitmentjobposition extends ModelePDFRecruitmentJobPositio
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$object->label." ".$outputlangs->convToOutputCharset($object->thirdparty->name));
- if (!empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) {
+ if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false);
}
diff --git a/htdocs/recruitment/core/modules/recruitment/mod_recruitmentcandidature_advanced.php b/htdocs/recruitment/core/modules/recruitment/mod_recruitmentcandidature_advanced.php
index 8772e97bf77..9635eba3e58 100644
--- a/htdocs/recruitment/core/modules/recruitment/mod_recruitmentcandidature_advanced.php
+++ b/htdocs/recruitment/core/modules/recruitment/mod_recruitmentcandidature_advanced.php
@@ -30,7 +30,7 @@ dol_include_once('/recruitment/core/modules/recruitment/modules_recruitmentcandi
/**
- * Class to manage customer Bom numbering rules advanced
+ * Class to manage the Advanced numbering rule for Job application
*/
class mod_recruitmentcandidature_advanced extends ModeleNumRefRecruitmentCandidature
{
diff --git a/htdocs/recruitment/core/modules/recruitment/mod_recruitmentcandidature_standard.php b/htdocs/recruitment/core/modules/recruitment/mod_recruitmentcandidature_standard.php
index ce96d1cd67b..4221915eb29 100644
--- a/htdocs/recruitment/core/modules/recruitment/mod_recruitmentcandidature_standard.php
+++ b/htdocs/recruitment/core/modules/recruitment/mod_recruitmentcandidature_standard.php
@@ -26,7 +26,7 @@ dol_include_once('/recruitment/core/modules/recruitment/modules_recruitmentcandi
/**
- * Class to manage customer order numbering rules standard
+ * Class to manage the Standard numbering rule for Job application
*/
class mod_recruitmentcandidature_standard extends ModeleNumRefRecruitmentCandidature
{
diff --git a/htdocs/recruitment/core/modules/recruitment/mod_recruitmentjobposition_advanced.php b/htdocs/recruitment/core/modules/recruitment/mod_recruitmentjobposition_advanced.php
index c280153f9c8..4f781a18214 100644
--- a/htdocs/recruitment/core/modules/recruitment/mod_recruitmentjobposition_advanced.php
+++ b/htdocs/recruitment/core/modules/recruitment/mod_recruitmentjobposition_advanced.php
@@ -30,7 +30,7 @@ dol_include_once('/recruitment/core/modules/recruitment/modules_recruitmentjobpo
/**
- * Class to manage customer Bom numbering rules advanced
+ * Class to manage the Advanced numbering rule for Job position
*/
class mod_recruitmentjobposition_advanced extends ModeleNumRefRecruitmentJobPosition
{
diff --git a/htdocs/recruitment/core/modules/recruitment/mod_recruitmentjobposition_standard.php b/htdocs/recruitment/core/modules/recruitment/mod_recruitmentjobposition_standard.php
index b2b413ee508..260ee510c5b 100644
--- a/htdocs/recruitment/core/modules/recruitment/mod_recruitmentjobposition_standard.php
+++ b/htdocs/recruitment/core/modules/recruitment/mod_recruitmentjobposition_standard.php
@@ -26,7 +26,7 @@ dol_include_once('/recruitment/core/modules/recruitment/modules_recruitmentjobpo
/**
- * Class to manage customer order numbering rules standard
+ * Class to manage the Standard numbering rule for Job positions
*/
class mod_recruitmentjobposition_standard extends ModeleNumRefRecruitmentJobPosition
{
diff --git a/htdocs/recruitment/recruitmentcandidature_agenda.php b/htdocs/recruitment/recruitmentcandidature_agenda.php
index 9988140393d..04118f55572 100644
--- a/htdocs/recruitment/recruitmentcandidature_agenda.php
+++ b/htdocs/recruitment/recruitmentcandidature_agenda.php
@@ -40,6 +40,7 @@ $ref = GETPOST('ref', 'alpha');
$action = GETPOST('action', 'aZ09');
$cancel = GETPOST('cancel', 'aZ09');
$backtopage = GETPOST('backtopage', 'alpha');
+$socid = GETPOST('socid', 'int');
if (GETPOST('actioncode', 'array')) {
$actioncode = GETPOST('actioncode', 'array', 3);
@@ -79,7 +80,7 @@ $extrafields->fetch_name_optionals_label($object->table_element);
// Load object
include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals
if ($id > 0 || !empty($ref)) {
- $upload_dir = $conf->recruitment->multidir_output[$object->entity]."/".$object->id;
+ $upload_dir = $conf->recruitment->multidir_output[!empty($object->entity) ? $object->entity : $conf->entity]."/".$object->id;
}
$permissiontoadd = $user->rights->recruitment->recruitmentjobposition->write; // Used by the include of actions_addupdatedelete.inc.php
@@ -209,7 +210,8 @@ if ($object->id > 0) {
if (get_class($objthirdparty) == 'Societe') {
$out .= '&socid='.$objthirdparty->id;
}
- $out .= (!empty($objcon->id) ? '&contactid='.$objcon->id : '').'&backtopage=1&percentage=-1';
+ $backtopageurl = urlencode($_SERVER['PHP_SELF'].'?id='.$objthirdparty->id);
+ $out .= (!empty($objcon->id) ? '&contactid='.$objcon->id : '').'&backtopage='.$backtopageurl.'&percentage=-1';
//$out.=$langs->trans("AddAnAction").' ';
//$out.=img_picto($langs->trans("AddAnAction"),'filenew');
//$out.="";
diff --git a/htdocs/recruitment/recruitmentcandidature_card.php b/htdocs/recruitment/recruitmentcandidature_card.php
index 7f1bbab2566..2452c9e530b 100644
--- a/htdocs/recruitment/recruitmentcandidature_card.php
+++ b/htdocs/recruitment/recruitmentcandidature_card.php
@@ -43,7 +43,7 @@ $cancel = GETPOST('cancel', 'aZ09');
$contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'recruitmentcandidaturecard'; // To manage different context of search
$backtopage = GETPOST('backtopage', 'alpha');
$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
-//$lineid = GETPOST('lineid', 'int');
+$lineid = GETPOST('lineid', 'int');
// Initialize technical objects
$object = new RecruitmentCandidature($db);
@@ -526,7 +526,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
// Back to draft
if ($object->status == $object::STATUS_VALIDATED) {
if ($permissiontoadd) {
- print '
'.$langs->trans("SetToDraft").' ';
+ print '
'.$langs->trans("SetToDraft").' ';
}
}
@@ -552,7 +552,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
// Make offer - Refuse - Decline
if ($object->status >= $object::STATUS_VALIDATED && $object->status < $object::STATUS_CONTRACT_PROPOSED) {
if ($permissiontoadd) {
- print '
'.$langs->trans("MakeOffer").' / '.$langs->trans("Decline").' ';
+ print '
'.$langs->trans("MakeOffer").' / '.$langs->trans("Decline").' ';
}
}
@@ -565,7 +565,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
// Clone
if ($permissiontoadd) {
- print '
'.$langs->trans("ToClone").' '."\n";
+ print dolGetButtonAction($langs->trans("ToClone"), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.(!empty($object->socid) ? '&socid='.$object->socid : '').'&action=clone&object=recruitmentcandidature', 'clone', $permissiontoadd);
}
// Button to convert into a user
@@ -592,12 +592,8 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
}
}
- // Delete (need delete permission, or if draft, just need create/modify permission)
- if ($permissiontodelete || ($object->status == $object::STATUS_DRAFT && $permissiontoadd)) {
- print '
id.'&action=delete&token='.newToken().'">'.$langs->trans('Delete').' '."\n";
- } else {
- print '
'.$langs->trans('Delete').' '."\n";
- }
+ // Delete
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete);
}
print '
'."\n";
}
diff --git a/htdocs/recruitment/recruitmentcandidature_list.php b/htdocs/recruitment/recruitmentcandidature_list.php
index 34b852574f6..9b860ac54d5 100644
--- a/htdocs/recruitment/recruitmentcandidature_list.php
+++ b/htdocs/recruitment/recruitmentcandidature_list.php
@@ -47,6 +47,7 @@ $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : ((e
$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
$mode = GETPOST('mode', 'aZ');
+$lineid = GETPOST('lineid', 'int');
// Load variable for pagination
$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
@@ -303,7 +304,7 @@ $sql = preg_replace('/,\s*$/', '', $sql);
$nbtotalofrecords = '';
if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
/* The fast and low memory method to get and count full list converts the sql into a sql count */
- $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
+ $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/Ui', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
$resql = $db->query($sqlforcount);
if ($resql) {
$objforcount = $db->fetch_object($resql);
@@ -437,7 +438,7 @@ if ($jobposition->id > 0 && (empty($action) || ($action != 'edit' && $action !=
$morehtmlref .= ' ';
$morehtmlref .= '';
} else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, !empty($object->socid) ? $object->socid : 0, $object->fk_project, 'none', 0, 0, 0, 1);
}
} else {
if (!empty($object->fk_project)) {
diff --git a/htdocs/recruitment/recruitmentcandidature_note.php b/htdocs/recruitment/recruitmentcandidature_note.php
index 543d7a66c10..1649ab5ee5e 100644
--- a/htdocs/recruitment/recruitmentcandidature_note.php
+++ b/htdocs/recruitment/recruitmentcandidature_note.php
@@ -48,7 +48,7 @@ $extrafields->fetch_name_optionals_label($object->table_element);
// Load object
include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals
if ($id > 0 || !empty($ref)) {
- $upload_dir = $conf->recruitment->multidir_output[$object->entity]."/".$object->id;
+ $upload_dir = $conf->recruitment->multidir_output[!empty($object->entity) ? $object->entity : $conf->entity]."/".$object->id;
}
$permissionnote = $user->rights->recruitment->recruitmentjobposition->write; // Used by the include of actions_setnotes.inc.php
diff --git a/htdocs/recruitment/recruitmentjobposition_card.php b/htdocs/recruitment/recruitmentjobposition_card.php
index a23888fd8a9..d1ca4ef2db1 100644
--- a/htdocs/recruitment/recruitmentjobposition_card.php
+++ b/htdocs/recruitment/recruitmentjobposition_card.php
@@ -42,7 +42,7 @@ $cancel = GETPOST('cancel', 'aZ09');
$contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'recruitmentjobpositioncard'; // To manage different context of search
$backtopage = GETPOST('backtopage', 'alpha');
$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
-//$lineid = GETPOST('lineid', 'int');
+$lineid = GETPOST('lineid', 'int');
// Initialize technical objects
$object = new RecruitmentJobPosition($db);
@@ -279,6 +279,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
$formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneAsk', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
}
if ($action == 'closeas') {
+ $text = "";
//Form to close proposal (signed or not)
$formquestion = array(
array('type' => 'select', 'name' => 'status', 'label' => ''.$langs->trans("CloseAs").' ', 'values' => array(3=>$object->LibStatut($object::STATUS_RECRUITED), 9=>$object->LibStatut($object::STATUS_CANCELED))),
@@ -290,7 +291,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
$notify = new Notify($db);
$formquestion = array_merge($formquestion, array(
- array('type' => 'onecolumn', 'value' => $notify->confirmMessage('PROPAL_CLOSE_SIGNED', $object->socid, $object)),
+ array('type' => 'onecolumn', 'value' => $notify->confirmMessage('RECRUITMENTJOBPOSITION_CLOSE_SIGNED', $object->socid, $object)),
));
}*/
@@ -340,7 +341,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
$morehtmlref .= ' ';
$morehtmlref .= '';
} else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, !empty($object->socid) ? $object->socid : 0, $object->fk_project, 'none', 0, 0, 0, 1);
}
} else {
if (!empty($object->fk_project)) {
@@ -435,7 +436,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
// Clone
if ($permissiontoadd) {
- print ''.$langs->trans("ToClone").' '."\n";
+ print dolGetButtonAction($langs->trans("ToClone"), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.(!empty($object->socid) ? '&socid='.$object->socid : "").'&action=clone&object=recruitmentjobposition', 'clone', $permissiontoadd);
}
/*
@@ -452,12 +453,8 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
}
}
- // Delete (need delete permission, or if draft, just need create/modify permission)
- if ($permissiontodelete || ($object->status == $object::STATUS_DRAFT && $permissiontoadd)) {
- print 'id.'&action=delete&token='.newToken().'">'.$langs->trans('Delete').' '."\n";
- } else {
- print ''.$langs->trans('Delete').' '."\n";
- }
+ // Delete
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete);
}
print ''."\n";
}
diff --git a/htdocs/recruitment/recruitmentjobposition_document.php b/htdocs/recruitment/recruitmentjobposition_document.php
index ca9907976be..a162f4c3af7 100644
--- a/htdocs/recruitment/recruitmentjobposition_document.php
+++ b/htdocs/recruitment/recruitmentjobposition_document.php
@@ -148,7 +148,7 @@ if ($object->id) {
$morehtmlref .= ' ';
$morehtmlref .= '';
} else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, !empty($object->socid) ? $object->socid : 0, $object->fk_project, 'none', 0, 0, 0, 1);
}
} else {
if (!empty($object->fk_project)) {
diff --git a/htdocs/recruitment/recruitmentjobposition_list.php b/htdocs/recruitment/recruitmentjobposition_list.php
index 5b1bee43e56..e6b538b5167 100644
--- a/htdocs/recruitment/recruitmentjobposition_list.php
+++ b/htdocs/recruitment/recruitmentjobposition_list.php
@@ -300,7 +300,7 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
}*/
/* The fast and low memory method to get and count full list converts the sql into a sql count */
/*
- $sqlforcount = preg_replace('/^SELECT[a-z0-9\._\s\(\),]+FROM/i', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
+ $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/Ui', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
print $sqlforcount;
$resql = $db->query($sqlforcount);
$objforcount = $db->fetch_object($resql);
@@ -446,7 +446,7 @@ if (!empty($moreforfilter)) {
}
$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
-$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
+$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
print ''; // You can use div-table-responsive-no-min if you dont need reserved height for your table
@@ -456,6 +456,13 @@ print '
';
+// Action column
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons('left');
+ print $searchpicto;
+ print ' ';
+}
foreach ($object->fields as $key => $val) {
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
if ($key == 'status') {
@@ -501,10 +508,12 @@ if (!empty($arrayfields['nbapplications']['checked'])) {
print ' ';
}
// Action column
-print '';
-$searchpicto = $form->showFilterButtons();
-print $searchpicto;
-print ' ';
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons();
+ print $searchpicto;
+ print ' ';
+}
print ''."\n";
$totalarray = array();
@@ -513,6 +522,10 @@ $totalarray['nbfield'] = 0;
// Fields title label
// --------------------------------------------------------------------
print '';
+// Action column
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+}
foreach ($object->fields as $key => $val) {
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
if ($key == 'status') {
@@ -540,7 +553,9 @@ if (!empty($arrayfields['nbapplications']['checked'])) {
$totalarray['nbfield']++;
}
// Action column
-print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+}
$totalarray['nbfield']++;
print ' '."\n";
@@ -586,6 +601,18 @@ while ($i < $imaxinloop) {
// Show here line of result
$j = 0;
print '';
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($object->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
foreach ($object->fields as $key => $val) {
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
@@ -642,15 +669,17 @@ while ($i < $imaxinloop) {
print ''.$obj->nbapplications.' ';
}
// Action column
- print '';
- if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
- $selected = 0;
- if (in_array($object->id, $arrayofselected)) {
- $selected = 1;
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print ' ';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($object->id, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
}
- print ' ';
+ print ' ';
}
- print '';
if (!$i) {
$totalarray['nbfield']++;
}
diff --git a/htdocs/recruitment/recruitmentjobposition_note.php b/htdocs/recruitment/recruitmentjobposition_note.php
index dcda5b53109..5dc4004a361 100644
--- a/htdocs/recruitment/recruitmentjobposition_note.php
+++ b/htdocs/recruitment/recruitmentjobposition_note.php
@@ -53,7 +53,7 @@ $extrafields->fetch_name_optionals_label($object->table_element);
// Load object
include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals
if ($id > 0 || !empty($ref)) {
- $upload_dir = $conf->recruitment->multidir_output[$object->entity]."/".$object->id;
+ $upload_dir = $conf->recruitment->multidir_output[!empty($object->entity) ? $object->entity : $conf->entity]."/".$object->id;
}
$permissionnote = $user->rights->recruitment->recruitmentjobposition->write; // Used by the include of actions_setnotes.inc.php
@@ -125,7 +125,7 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref .= ' ';
$morehtmlref .= '';
} else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, !empty($object->socid) ? $object->socid : 0, $object->fk_project, 'none', 0, 0, 0, 1);
}
} else {
if (!empty($object->fk_project)) {
diff --git a/htdocs/resource/card.php b/htdocs/resource/card.php
index cf4b4b8e110..1816528b854 100644
--- a/htdocs/resource/card.php
+++ b/htdocs/resource/card.php
@@ -63,7 +63,7 @@ include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be includ
$result = restrictedArea($user, 'resource', $object->id, 'resource');
$permissiontoadd = $user->rights->resource->write; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
-
+$permissiontodelete = $user->rights->resource->delete;
/*
@@ -349,12 +349,7 @@ if ($action == 'create' || $object->fetch($id, $ref) > 0) {
}
}
if ($action != "delete" && $action != "create" && $action != "edit") {
- // Delete resource
- if ($user->rights->resource->delete) {
- print '';
- }
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete);
}
}
print '';
diff --git a/htdocs/resource/class/dolresource.class.php b/htdocs/resource/class/dolresource.class.php
index 46371fead0f..3e1a2615cd9 100644
--- a/htdocs/resource/class/dolresource.class.php
+++ b/htdocs/resource/class/dolresource.class.php
@@ -527,7 +527,7 @@ class Dolresource extends CommonObject
if ($limit) {
$sql .= $this->db->plimit($limit, $offset);
}
- dol_syslog(get_class($this)."::fetch_all", LOG_DEBUG);
+ dol_syslog(get_class($this)."::fetchAll", LOG_DEBUG);
$this->lines = array();
$resql = $this->db->query($sql);
diff --git a/htdocs/resource/element_resource.php b/htdocs/resource/element_resource.php
index a5ca456310e..eedfcc06245 100644
--- a/htdocs/resource/element_resource.php
+++ b/htdocs/resource/element_resource.php
@@ -324,6 +324,9 @@ if (!$ret) {
if (($element_id || $element_ref) && $element == 'action') {
require_once DOL_DOCUMENT_ROOT.'/core/lib/agenda.lib.php';
+ // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
+ $hookmanager->initHooks(array('actioncard', 'globalcard'));
+
$act = fetchObjectByElement($element_id, $element, $element_ref);
if (is_object($act)) {
$head = actions_prepare_head($act);
@@ -344,27 +347,44 @@ if (!$ret) {
$out .= ''.img_picto($langs->trans("ViewDay"), 'object_calendarday', 'class="hideonsmartphone pictoactionview"');
$out .= ''.$langs->trans("ViewDay").' ';
+ // Add more views from hooks
+ $parameters = array();
+ $reshook = $hookmanager->executeHooks('addCalendarView', $parameters, $object, $action);
+ if (empty($reshook)) {
+ $out .= $hookmanager->resPrint;
+ } elseif ($reshook > 1) {
+ $out = $hookmanager->resPrint;
+ }
+
$linkback .= $out;
$morehtmlref = '';
// Thirdparty
//$morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . $object->thirdparty->getNomUrl(1);
// Project
+ $savobject = $object;
+ $object = $act;
if (isModEnabled('project')) {
$langs->load("projects");
- //$morehtmlref.='
'.$langs->trans('Project') . ' ';
- $morehtmlref .= $langs->trans('Project').': ';
- if (!empty($act->fk_project)) {
- $proj = new Project($db);
- $proj->fetch($act->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
- if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ //$morehtmlref .= '
';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
+ if ($action != 'classify') {
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
- $morehtmlref .= '';
+ if (!empty($object->fk_project)) {
+ $proj = new Project($db);
+ $proj->fetch($object->fk_project);
+ $morehtmlref .= $proj->getNomUrl(1);
+ if ($proj->title) {
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
+ }
+ }
}
}
+ $object = $savobject;
$morehtmlref .= '
';
dol_banner_tab($act, 'element_id', $linkback, ($user->socid ? 0 : 1), 'id', 'ref', $morehtmlref, '&element='.$element, 0, '', '');
diff --git a/htdocs/resource/list.php b/htdocs/resource/list.php
index 23282fe6363..6b649b396db 100644
--- a/htdocs/resource/list.php
+++ b/htdocs/resource/list.php
@@ -169,7 +169,7 @@ if ($search_type != '') {
}
// Including the previous script generate the correct SQL filter for all the extrafields
-// we are playing with the behaviour of the Dolresource::fetch_all() by generating a fake
+// we are playing with the behaviour of the Dolresource::fetchAll() by generating a fake
// extrafields filter key to make it works
$filter['ef.resource'] = $sql;
diff --git a/htdocs/salaries/card.php b/htdocs/salaries/card.php
index ab4ba4cd4b8..1b53388bcaa 100644
--- a/htdocs/salaries/card.php
+++ b/htdocs/salaries/card.php
@@ -110,12 +110,13 @@ $permissiontoadd = $user->rights->salaries->write; // Used by the include of act
$permissiontodelete = $user->rights->salaries->delete || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
-/**
+/*
* Actions
*/
$parameters = array();
-$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
+// Note that $action and $object may be modified by some hooks
+$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action);
if ($reshook < 0) {
setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
}
@@ -123,14 +124,14 @@ if ($reshook < 0) {
if (empty($reshook)) {
$error = 0;
- $backurlforlist = dol_buildpath('/salaries/list.php', 1);
+ $backurlforlist = DOL_URL_ROOT.'/salaries/list.php';
if (empty($backtopage) || ($cancel && empty($id))) {
if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
$backtopage = $backurlforlist;
} else {
- $backtopage = dol_buildpath('/salaries/card.php', 1).'?id='.($id > 0 ? $id : '__ID__');
+ $backtopage = DOL_URL_ROOT.'/salaries/card.php?id='.($id > 0 ? $id : '__ID__');
}
}
}
@@ -444,9 +445,10 @@ $form = new Form($db);
$formfile = new FormFile($db);
if (isModEnabled('project')) $formproject = new FormProjets($db);
-$title = $langs->trans('Salary')." - ".$langs->trans('Card');
+$title = $langs->trans('Salary')." - ".$object->ref;
$help_url = "";
-llxHeader("", $title, $help_url);
+
+llxHeader('', $title, $help_url);
if ($id > 0) {
@@ -458,8 +460,8 @@ if ($id > 0) {
}
// Create
-if ($action == 'create') {
- $year_current = strftime("%Y", dol_now());
+if ($action == 'create' && $permissiontoadd) {
+ $year_current = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$pastmonth = strftime("%m", dol_now()) - 1;
$pastmonthyear = $year_current;
if ($pastmonth == 0) {
@@ -480,7 +482,7 @@ if ($action == 'create') {
$datesp = dol_get_first_day($pastmonthyear, $pastmonth, false); $dateep = dol_get_last_day($pastmonthyear, $pastmonth, false);
}
- print '';
+ print ' ';
print ' ';
print ' ';
if ($backtopage) {
@@ -522,7 +524,7 @@ if ($action == 'create') {
print ''."\n";
}
- print dol_get_fiche_head('', '');
+ print dol_get_fiche_head('');
print '';
@@ -692,13 +694,8 @@ if ($action == 'create') {
}
-/* ************************************************************************** */
-/* */
-/* View mode */
-/* */
-/* ************************************************************************** */
-
-if ($id) {
+// View mode
+if ($id > 0) {
$head = salaries_prepare_head($object);
$formconfirm = '';
@@ -711,7 +708,7 @@ if ($id) {
$formquestion[] = array('type' => 'date', 'name' => 'clone_date_start', 'label' => $langs->trans("DateStart"), 'value' => -1);
$formquestion[] = array('type' => 'date', 'name' => 'clone_date_end', 'label' => $langs->trans("DateEnd"), 'value' => -1);
- $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneSalary', $object->ref), 'confirm_clone', $formquestion, 'yes', 1, 240);
+ $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneSalary', $object->ref), 'confirm_clone', $formquestion, 'yes', 1, 250);
}
if ($action == 'paid') {
@@ -794,34 +791,26 @@ if ($id) {
$morehtmlref .= '';
}
+ $usercancreate = $permissiontoadd;
+
// Project
if (isModEnabled('project')) {
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->salaries->write) {
+ $langs->load("projects");
+ $morehtmlref .= ' ';
+ if ($usercancreate) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects(-1, $object->fk_project, 'projectid', 0, 0, 1, 0, 1, 0, 0, '', 1, 0, 'maxwidth500');
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/salaries/document.php b/htdocs/salaries/document.php
index 163042dbeb8..2ce7b2e2745 100644
--- a/htdocs/salaries/document.php
+++ b/htdocs/salaries/document.php
@@ -78,7 +78,9 @@ $childids = $user->getAllChildIds(1);
// fetch optionals attributes and labels
$extrafields->fetch_name_optionals_label($object->table_element);
-$object = new Salary($db);
+// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
+$hookmanager->initHooks(array('salarydoc', 'globalcard'));
+
if ($id > 0 || !empty($ref)) {
$object->fetch($id, $ref);
@@ -105,7 +107,9 @@ if ($user->socid) {
}
restrictedArea($user, 'salaries', $object->id, 'salary', '');
+$permissiontoread = $user->rights->salaries->read;
$permissiontoadd = $user->rights->salaries->write; // Used by the include of actions_addupdatedelete.inc.php and actions_linkedfiles
+$permissiontodelete = $user->rights->salaries->delete || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
/*
@@ -176,34 +180,26 @@ if ($object->id) {
$morehtmlref .= ' '.$langs->trans('Employee').' : '.$userstatic->getNomUrl(-1);
+ $usercancreate = $permissiontoadd;
+
// Project
if (isModEnabled('project')) {
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->salaries->write) {
+ $langs->load("projects");
+ $morehtmlref .= ' ';
+ if ($usercancreate) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects(-1, $object->fk_project, 'projectid', 0, 0, 1, 0, 1, 0, 0, '', 1, 0, 'maxwidth500');
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, -1, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/salaries/info.php b/htdocs/salaries/info.php
index e16493ddc91..1085b1175cf 100644
--- a/htdocs/salaries/info.php
+++ b/htdocs/salaries/info.php
@@ -58,6 +58,9 @@ $childids = $user->getAllChildIds(1);
// fetch optionals attributes and labels
$extrafields->fetch_name_optionals_label($object->table_element);
+// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
+$hookmanager->initHooks(array('salaryinfo', 'globalcard'));
+
$object = new Salary($db);
if ($id > 0 || !empty($ref)) {
$object->fetch($id, $ref);
@@ -77,6 +80,10 @@ if ($id > 0 || !empty($ref)) {
restrictedArea($user, 'salaries', $object->id, 'salary', '');
+$permissiontoread = $user->rights->salaries->read;
+$permissiontoadd = $user->rights->salaries->write; // Used by the include of actions_addupdatedelete.inc.php and actions_linkedfiles
+$permissiontodelete = $user->rights->salaries->delete || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
+
/*
* Actions
@@ -107,7 +114,6 @@ $title = $langs->trans('Salary')." - ".$langs->trans('Info');
$help_url = "";
llxHeader("", $title, $help_url);
-$object = new Salary($db);
$object->fetch($id);
$object->info($id);
@@ -139,34 +145,26 @@ if ($action != 'editlabel') {
$morehtmlref .= ' '.$langs->trans('Employee').' : '.$userstatic->getNomUrl(-1);
+$usercancreate = $permissiontoadd;
+
// Project
if (isModEnabled('project')) {
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->salaries->write) {
+ $langs->load("projects");
+ $morehtmlref .= ' ';
+ if ($usercancreate) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects(-1, $object->fk_project, 'projectid', 0, 0, 1, 0, 1, 0, 0, '', 1, 0, 'maxwidth500');
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
@@ -180,7 +178,7 @@ print '
';
print ' ';
-print '';
+print '';
dol_print_object_info($object);
print '
';
diff --git a/htdocs/salaries/list.php b/htdocs/salaries/list.php
index 639879f8e17..e0efb53915b 100644
--- a/htdocs/salaries/list.php
+++ b/htdocs/salaries/list.php
@@ -403,10 +403,10 @@ print '';
// Ref
print '';
-print ' ';
+print ' ';
print ' ';
// Label
-print ' ';
+print ' ';
// Date start
print '';
@@ -435,13 +435,13 @@ print ' ';
// Type
print '';
-print $form->select_types_paiements($search_type_id, 'search_type_id', '', 0, 1, 1, 16, 1, '', 1);
+print $form->select_types_paiements($search_type_id, 'search_type_id', '', 0, 1, 1, 16, 1, 'maxwidth125', 1);
print ' ';
// Bank account
if (isModEnabled("banque")) {
print '';
- $form->select_comptes($search_account, 'search_account', 0, '', 1);
+ print $form->select_comptes($search_account, 'search_account', 0, '', 1, '', 0, 'maxwidth125', 1);
print ' ';
}
@@ -546,7 +546,7 @@ while ($i < ($limit ? min($num, $limit) : $num)) {
}
// Label payment
- print "".dol_trunc($obj->label, 40)." \n";
+ print ''.dol_escape_htmltag($obj->label)." \n";
if (!$i) {
$totalarray['nbfield']++;
}
@@ -564,7 +564,7 @@ while ($i < ($limit ? min($num, $limit) : $num)) {
}
// Employee
- print "".$userstatic->getNomUrl(1)." \n";
+ print ''.$userstatic->getNomUrl(1)." \n";
if (!$i) {
$totalarray['nbfield']++;
}
diff --git a/htdocs/salaries/payment_salary/card.php b/htdocs/salaries/payment_salary/card.php
index 2d295a23131..c9f0a151901 100644
--- a/htdocs/salaries/payment_salary/card.php
+++ b/htdocs/salaries/payment_salary/card.php
@@ -251,9 +251,9 @@ print '';
if ($action == '') {
if ($user->rights->salaries->delete) {
if (!$disable_delete) {
- print '
'.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', 1);
} else {
- print '
'.$langs->trans('Delete').' ';
+ print dolGetButtonAction($langs->trans("CantRemovePaymentSalaryPaid"), $langs->trans("Delete"), 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', 0);
}
}
}
diff --git a/htdocs/salaries/stats/index.php b/htdocs/salaries/stats/index.php
index 4dfd0c84e0c..ba5d254f22b 100644
--- a/htdocs/salaries/stats/index.php
+++ b/htdocs/salaries/stats/index.php
@@ -51,7 +51,7 @@ if ($user->socid) {
}
$result = restrictedArea($user, 'salaries', '', '', '');
-$nowyear = strftime("%Y", dol_now());
+$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$year = GETPOST('year') > 0 ?GETPOST('year') : $nowyear;
$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS)));
$endyear = $year;
diff --git a/htdocs/societe/admin/societe.php b/htdocs/societe/admin/societe.php
index 76fd9297e2b..d466f1fe9a7 100644
--- a/htdocs/societe/admin/societe.php
+++ b/htdocs/societe/admin/societe.php
@@ -181,6 +181,20 @@ if ($action == "setaccountancycodecustomerinvoicemandatory") {
}
}
+//Activate Set vat id unique
+if ($action == "setvatintraunique") {
+ $setvatintraunique = GETPOST('value', 'int');
+ $res = dolibarr_set_const($db, "SOCIETE_VAT_INTRA_UNIQUE", $setvatintraunique, 'yesno', 0, '', $conf->entity);
+ if (!($res > 0)) {
+ $error++;
+ }
+ if (!$error) {
+ setEventMessages($langs->trans("SetupSaved"), null, 'mesgs');
+ } else {
+ setEventMessages($langs->trans("Error"), null, 'errors');
+ }
+}
+
//Activate Set ref in list
if ($action == "setaddrefinlist") {
$setaddrefinlist = GETPOST('value', 'int');
@@ -731,6 +745,22 @@ if (isModEnabled('accounting')) {
print "\n";
}
+// VAT ID
+print '
';
+print ''.$langs->trans('VATIntra')." \n";
+
+if (!empty($conf->global->SOCIETE_VAT_INTRA_UNIQUE)) {
+ print '';
+ print img_picto($langs->trans("Activated"), 'switch_on');
+ print ' ';
+} else {
+ print '';
+ print img_picto($langs->trans("Disabled"), 'switch_off');
+ print ' ';
+}
+print ' ';
+print " \n";
+
print "
\n";
print '';
diff --git a/htdocs/societe/agenda.php b/htdocs/societe/agenda.php
index 550d8ca772d..9e6c10a0ccd 100644
--- a/htdocs/societe/agenda.php
+++ b/htdocs/societe/agenda.php
@@ -160,10 +160,26 @@ if ($socid > 0) {
$out .= '&datep='.dol_print_date(dol_now(), 'dayhourlog');
}
- $newcardbutton = '';
+ $morehtmlright = '';
+
+ $messagingUrl = DOL_URL_ROOT.'/societe/messaging.php?socid='.$object->id;
+ $morehtmlright .= dolGetButtonTitle($langs->trans('ShowAsConversation'), '', 'fa fa-comments imgforviewmode', $messagingUrl, '', 1);
+ $messagingUrl = DOL_URL_ROOT.'/societe/agenda.php?socid='.$object->id;
+ $morehtmlright .= dolGetButtonTitle($langs->trans('MessageListViewType'), '', 'fa fa-bars imgforviewmode', $messagingUrl, '', 2);
+
+ // // Show link to send an email (if read and not closed)
+ // $btnstatus = $object->status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage";
+ // $url = 'card.php?track_id='.$object->track_id.'&action=presend_addmessage&mode=init&private_message=0&send_email=1&backtopage='.urlencode($_SERVER["PHP_SELF"].'?track_id='.$object->track_id).'#formmailbeforetitle';
+ // $morehtmlright .= dolGetButtonTitle($langs->trans('SendMail'), '', 'fa fa-paper-plane', $url, 'email-title-button', $btnstatus);
+
+ // // Show link to add a private message (if read and not closed)
+ // $btnstatus = $object->status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage";
+ // $url = 'card.php?track_id='.$object->track_id.'&action=presend_addmessage&mode=init&backtopage='.urlencode($_SERVER["PHP_SELF"].'?track_id='.$object->track_id).'#formmailbeforetitle';
+ // $morehtmlright .= dolGetButtonTitle($langs->trans('TicketAddMessage'), '', 'fa fa-comment-dots', $url, 'add-new-ticket-title-button', $btnstatus);
+
if (isModEnabled('agenda')) {
if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) {
- $newcardbutton .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create'.$out);
+ $morehtmlright .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create'.$out);
}
}
@@ -178,8 +194,8 @@ if ($socid > 0) {
$param .= '&limit='.urlencode($limit);
}
- print load_fiche_titre($langs->trans("ActionsOnCompany"), $newcardbutton, '');
- //print_barre_liste($langs->trans("ActionsOnCompany"), 0, $_SERVER["PHP_SELF"], '', $sortfield, $sortorder, '', 0, -1, '', 0, $newcardbutton, '', 0, 1, 1);
+ // print load_fiche_titre($langs->trans("ActionsOnCompany"), $newcardbutton, '');
+ print_barre_liste($langs->trans("ActionsOnCompany"), 0, $_SERVER["PHP_SELF"], '', $sortfield, $sortorder, '', 0, -1, '', 0, $morehtmlright, '', 0, 1, 1);
// List of all actions
$filters = array();
diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php
index cc75d8c91d1..aea4bb916a5 100644
--- a/htdocs/societe/card.php
+++ b/htdocs/societe/card.php
@@ -74,7 +74,7 @@ if (isModEnabled('adherent')) {
if (isModEnabled('categorie')) {
$langs->load("categories");
}
-if (!empty($conf->incoterm->enabled)) {
+if (isModEnabled('incoterm')) {
$langs->load("incoterm");
}
if (isModEnabled('notification')) {
@@ -537,7 +537,7 @@ if (empty($reshook)) {
}
// Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
$object->fk_incoterms = GETPOST('incoterm_id', 'int');
$object->location_incoterms = GETPOST('location_incoterms', 'alpha');
}
@@ -938,7 +938,7 @@ if (empty($reshook)) {
}
// Set incoterm
- if ($action == 'set_incoterms' && $user->rights->societe->creer && !empty($conf->incoterm->enabled)) {
+ if ($action == 'set_incoterms' && $user->rights->societe->creer && isModEnabled('incoterm')) {
$object->fetch($socid);
$result = $object->setIncoterms(GETPOST('incoterm_id', 'int'), GETPOST('location_incoterms', 'alpha'));
}
@@ -1812,7 +1812,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
}
// Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
print ' ';
print ''.$form->editfieldkey('IncotermLabel', 'incoterm_id', '', $object, 0).' ';
print '';
@@ -2042,7 +2042,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
}
//Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
$object->fk_incoterms = GETPOST('incoterm_id', 'int');
$object->location_incoterms = GETPOST('lcoation_incoterms', 'alpha');
}
@@ -2562,7 +2562,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
}
// Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
print ' ';
print ''.$form->editfieldkey('IncotermLabel', 'incoterm_id', '', $object, 0).' ';
print '';
@@ -2935,7 +2935,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
print ' '.$langs->trans('VATIntra').' ';
if ($object->tva_intra) {
$s = '';
- $s .= dol_print_profids($object->tva_intra, 'VATIntra', $object->country_code, 1);
+ $s .= dol_print_profids($object->tva_intra, 'VAT', $object->country_code, 1);
$s .= ' ';
if (empty($conf->global->MAIN_DISABLEVATCHECK) && isInEEC($object)) {
@@ -3084,7 +3084,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
}
// Incoterms
- if (!empty($conf->incoterm->enabled)) {
+ if (isModEnabled('incoterm')) {
print ' ';
print ''.$langs->trans('IncotermLabel').' ';
if ($action != 'editincoterm' && $user->rights->societe->creer) {
diff --git a/htdocs/societe/class/api_thirdparties.class.php b/htdocs/societe/class/api_thirdparties.class.php
index c0401ce958f..f68122bdfff 100644
--- a/htdocs/societe/class/api_thirdparties.class.php
+++ b/htdocs/societe/class/api_thirdparties.class.php
@@ -1094,7 +1094,7 @@ class Thirdparties extends DolibarrApi
$invoice = new Facture($this->db);
$result = $invoice->list_replacable_invoices($id);
if ($result < 0) {
- throw new RestException(405, $this->thirdparty->error);
+ throw new RestException(405, $invoice->error);
}
return $result;
@@ -1137,7 +1137,7 @@ class Thirdparties extends DolibarrApi
$invoice = new Facture($this->db);
$result = $invoice->list_qualified_avoir_invoices($id);
if ($result < 0) {
- throw new RestException(405, $this->thirdparty->error);
+ throw new RestException(405, $invoice->error);
}
return $result;
@@ -1154,7 +1154,7 @@ class Thirdparties extends DolibarrApi
*/
public function getCompanyBankAccount($id)
{
- if (!DolibarrApiAccess::$user->rights->facture->lire) {
+ if (!DolibarrApiAccess::$user->rights->societe->lire) {
throw new RestException(401);
}
if (empty($id)) {
@@ -1176,10 +1176,9 @@ class Thirdparties extends DolibarrApi
$sql .= " WHERE fk_soc = ".((int) $id);
}
-
$result = $this->db->query($sql);
- if ($result->num_rows == 0) {
+ if ($this->db->num_rows($result) == 0) {
throw new RestException(404, 'Account not found');
}
@@ -1421,7 +1420,7 @@ class Thirdparties extends DolibarrApi
if ($result > 0) {
return array("success" => $result);
} else {
- throw new RestException(500, 'Error generating the document '.$this->error);
+ throw new RestException(500, 'Error generating the document '.$this->company->error);
}
}
diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php
index 586f955c1e0..1fb149ba250 100644
--- a/htdocs/societe/class/societe.class.php
+++ b/htdocs/societe/class/societe.class.php
@@ -15,7 +15,7 @@
* Copyright (C) 2017 Rui Strecht
* Copyright (C) 2018 Philippe Grand
* Copyright (C) 2019-2020 Josep Lluís Amador
- * Copyright (C) 2019-2021 Frédéric France
+ * Copyright (C) 2019-2022 Frédéric France
* Copyright (C) 2020 Open-Dsi
* Copyright (C) 2022 ButterflyOfFire
*
@@ -1171,7 +1171,7 @@ class Societe extends CommonObject
}
// Check for duplicate or mandatory fields defined into setup
- $array_to_check = array('IDPROF1', 'IDPROF2', 'IDPROF3', 'IDPROF4', 'IDPROF5', 'IDPROF6', 'EMAIL');
+ $array_to_check = array('IDPROF1', 'IDPROF2', 'IDPROF3', 'IDPROF4', 'IDPROF5', 'IDPROF6', 'EMAIL', 'TVA_INTRA');
foreach ($array_to_check as $key) {
$keymin = strtolower($key);
$i = (int) preg_replace('/[^0-9]/', '', $key);
@@ -1216,6 +1216,14 @@ class Societe extends CommonObject
$error++; $this->errors[] = $langs->trans('Email')." ".$langs->trans("ErrorProdIdAlreadyExist", $vallabel).' ('.$langs->trans("ForbiddenBySetupRules").')';
}
}
+ } elseif ($key == 'TVA_INTRA') {
+ // Check for unicity
+ if ($vallabel && !empty($conf->global->SOCIETE_VAT_INTRA_UNIQUE)) {
+ if ($this->id_prof_exists($keymin, $vallabel, ($this->id > 0 ? $this->id : 0))) {
+ $langs->load("errors");
+ $error++; $this->errors[] = $langs->trans('VATIntra')." ".$langs->trans("ErrorProdIdAlreadyExist", $vallabel).' ('.$langs->trans("ForbiddenBySetupRules").')';
+ }
+ }
}
}
}
@@ -1474,7 +1482,7 @@ class Societe extends CommonObject
$sql .= ",fk_effectif = ".($this->effectif_id > 0 ? ((int) $this->effectif_id) : "null");
if (isset($this->stcomm_id)) {
- $sql .= ",fk_stcomm=".($this->stcomm_id > 0 ? ((int) $this->stcomm_id) : "0");
+ $sql .= ",fk_stcomm=".(int) $this->stcomm_id;
}
if (isset($this->typent_id)) {
$sql .= ",fk_typent = ".($this->typent_id > 0 ? ((int) $this->typent_id) : "0");
@@ -1702,13 +1710,13 @@ class Societe extends CommonObject
$sql .= ', s.tms as date_modification, s.fk_user_creat, s.fk_user_modif';
$sql .= ', s.phone, s.fax, s.email';
$sql .= ', s.socialnetworks';
- $sql .= ', s.url, s.zip, s.town, s.note_private, s.note_public, s.model_pdf, s.client, s.fournisseur';
+ $sql .= ', s.url, s.zip, s.town, s.note_private, s.note_public, s.client, s.fournisseur';
$sql .= ', s.siren as idprof1, s.siret as idprof2, s.ape as idprof3, s.idprof4, s.idprof5, s.idprof6';
$sql .= ', s.capital, s.tva_intra';
$sql .= ', s.fk_typent as typent_id';
$sql .= ', s.fk_effectif as effectif_id';
$sql .= ', s.fk_forme_juridique as forme_juridique_code';
- $sql .= ', s.webservices_url, s.webservices_key, s.model_pdf';
+ $sql .= ', s.webservices_url, s.webservices_key, s.model_pdf, s.last_main_doc';
if (empty($conf->global->MAIN_COMPANY_PERENTITY_SHARED)) {
$sql .= ', s.code_compta, s.code_compta_fournisseur, s.accountancy_code_buy, s.accountancy_code_sell';
} else {
@@ -1939,7 +1947,10 @@ class Societe extends CommonObject
// multicurrency
$this->fk_multicurrency = $obj->fk_multicurrency;
$this->multicurrency_code = $obj->multicurrency_code;
+
+ // pdf
$this->model_pdf = $obj->model_pdf;
+ $this->last_main_doc = $obj->last_main_doc;
$result = 1;
@@ -2268,14 +2279,15 @@ class Societe extends CommonObject
/**
* Add a discount for third party
*
- * @param float $remise Amount of discount
- * @param User $user User adding discount
- * @param string $desc Reason of discount
- * @param string $vatrate VAT rate (may contain the vat code too). Exemple: '1.23', '1.23 (ABC)', ...
- * @param int $discount_type 0 => customer discount, 1 => supplier discount
- * @return int <0 if KO, id of discount record if OK
+ * @param float $remise Amount of discount
+ * @param User $user User adding discount
+ * @param string $desc Reason of discount
+ * @param string $vatrate VAT rate (may contain the vat code too). Exemple: '1.23', '1.23 (ABC)', ...
+ * @param int $discount_type 0 => customer discount, 1 => supplier discount
+ * @param string $price_base_type Price base type 'HT' or 'TTC'
+ * @return int <0 if KO, id of discount record if OK
*/
- public function set_remise_except($remise, User $user, $desc, $vatrate = '', $discount_type = 0)
+ public function set_remise_except($remise, User $user, $desc, $vatrate = '', $discount_type = 0, $price_base_type = 'HT')
{
// phpcs:enable
global $langs;
@@ -2310,9 +2322,15 @@ class Societe extends CommonObject
$discount->discount_type = $discount_type;
- $discount->amount_ht = $discount->multicurrency_amount_ht = price2num($remise, 'MT');
- $discount->amount_tva = $discount->multicurrency_amount_tva = price2num($remise * $vatrate / 100, 'MT');
- $discount->amount_ttc = $discount->multicurrency_amount_ttc = price2num($discount->amount_ht + $discount->amount_tva, 'MT');
+ if ($price_base_type == 'TTC') {
+ $discount->amount_ttc = $discount->multicurrency_amount_ttc = price2num($remise, 'MT');
+ $discount->amount_ht = $discount->multicurrency_amount_ht = price2num($remise / (1 + $vatrate / 100), 'MT');
+ $discount->amount_tva = $discount->multicurrency_amount_tva = price2num($discount->amount_ttc - $discount->amount_ht, 'MT');
+ } else {
+ $discount->amount_ht = $discount->multicurrency_amount_ht = price2num($remise, 'MT');
+ $discount->amount_tva = $discount->multicurrency_amount_tva = price2num($remise * $vatrate / 100, 'MT');
+ $discount->amount_ttc = $discount->multicurrency_amount_ttc = price2num($discount->amount_ht + $discount->amount_tva, 'MT');
+ }
$discount->tva_tx = price2num($vatrate);
$discount->vat_src_code = $vat_src_code;
@@ -2684,23 +2702,24 @@ class Societe extends CommonObject
if (!empty($this->tva_intra) || (!empty($conf->global->SOCIETE_SHOW_FIELD_IN_TOOLTIP) && strpos($conf->global->SOCIETE_SHOW_FIELD_IN_TOOLTIP, 'vatnumber') !== false)) {
$label2 .= ''.$langs->trans('VATIntra').': '.dol_escape_htmltag($this->tva_intra);
}
+
if (!empty($conf->global->SOCIETE_SHOW_FIELD_IN_TOOLTIP)) {
- if (strpos($conf->global->SOCIETE_SHOW_FIELD_IN_TOOLTIP, 'profid1') !== false) {
+ if (strpos($conf->global->SOCIETE_SHOW_FIELD_IN_TOOLTIP, 'profid1') !== false && $langs->trans('ProfId1'.$this->country_code) != '-') {
$label2 .= ''.$langs->trans('ProfId1'.$this->country_code).': '.$this->idprof1;
}
- if (strpos($conf->global->SOCIETE_SHOW_FIELD_IN_TOOLTIP, 'profid2') !== false) {
+ if (strpos($conf->global->SOCIETE_SHOW_FIELD_IN_TOOLTIP, 'profid2') !== false && $langs->trans('ProfId2'.$this->country_code) != '-') {
$label2 .= ''.$langs->trans('ProfId2'.$this->country_code).': '.$this->idprof2;
}
- if (strpos($conf->global->SOCIETE_SHOW_FIELD_IN_TOOLTIP, 'profid3') !== false) {
+ if (strpos($conf->global->SOCIETE_SHOW_FIELD_IN_TOOLTIP, 'profid3') !== false && $langs->trans('ProfId3'.$this->country_code) != '-') {
$label2 .= ''.$langs->trans('ProfId3'.$this->country_code).': '.$this->idprof3;
}
- if (strpos($conf->global->SOCIETE_SHOW_FIELD_IN_TOOLTIP, 'profid4') !== false) {
+ if (strpos($conf->global->SOCIETE_SHOW_FIELD_IN_TOOLTIP, 'profid4') !== false && $langs->trans('ProfId4'.$this->country_code) != '-') {
$label2 .= ''.$langs->trans('ProfId4'.$this->country_code).': '.$this->idprof4;
}
- if (strpos($conf->global->SOCIETE_SHOW_FIELD_IN_TOOLTIP, 'profid5') !== false) {
+ if (strpos($conf->global->SOCIETE_SHOW_FIELD_IN_TOOLTIP, 'profid5') !== false && $langs->trans('ProfId5'.$this->country_code) != '-') {
$label2 .= ''.$langs->trans('ProfId5'.$this->country_code).': '.$this->idprof5;
}
- if (strpos($conf->global->SOCIETE_SHOW_FIELD_IN_TOOLTIP, 'profid6') !== false) {
+ if (strpos($conf->global->SOCIETE_SHOW_FIELD_IN_TOOLTIP, 'profid6') !== false && $langs->trans('ProfId6'.$this->country_code) != '-') {
$label2 .= ''.$langs->trans('ProfId6'.$this->country_code).': '.$this->idprof6;
}
}
@@ -3597,14 +3616,14 @@ class Societe extends CommonObject
}
//Verify duplicate entries
- $sql = "SELECT COUNT(*) as idprof FROM ".MAIN_DB_PREFIX."societe WHERE ".$field." = '".$this->db->escape($value)."' AND entity IN (".getEntity('societe').")";
+ $sql = "SELECT COUNT(*) as nb FROM ".MAIN_DB_PREFIX."societe WHERE ".$field." = '".$this->db->escape($value)."' AND entity IN (".getEntity('societe').")";
if ($socid) {
$sql .= " AND rowid <> ".$socid;
}
$resql = $this->db->query($sql);
if ($resql) {
$obj = $this->db->fetch_object($resql);
- $count = $obj->idprof;
+ $count = $obj->nb;
} else {
$count = 0;
print $this->db->error();
@@ -4932,15 +4951,16 @@ class Societe extends CommonObject
*/
public function setThirdpartyType($typent_id)
{
+ global $user;
+
+ dol_syslog(__METHOD__, LOG_DEBUG);
+
if ($this->id) {
- $sql = "UPDATE ".MAIN_DB_PREFIX."societe";
- $sql .= " SET fk_typent = ".($typent_id > 0 ? $typent_id : "null");
- $sql .= " WHERE rowid = ".((int) $this->id);
- dol_syslog(get_class($this).'::setThirdpartyType', LOG_DEBUG);
- $resql = $this->db->query($sql);
- if ($resql) {
+ $result = $this->setValueFrom('fk_typent', $typent_id, '', null, '', '', $user, 'COMPANY_MODIFY');
+
+ if ($result > 0) {
$this->typent_id = $typent_id;
- $this->typent_code = dol_getIdFromCode($this->db, $this->$typent_id, 'c_typent', 'id', 'code');
+ $this->typent_code = dol_getIdFromCode($this->db, $this->typent_id, 'c_typent', 'id', 'code');
return 1;
} else {
return -1;
diff --git a/htdocs/societe/consumption.php b/htdocs/societe/consumption.php
index 83961ac74cf..c74b5e68985 100644
--- a/htdocs/societe/consumption.php
+++ b/htdocs/societe/consumption.php
@@ -274,8 +274,9 @@ if ($type_element == 'propal') {
}
if ($type_element == 'order') {
require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
+ $langs->load('sendings'); // delivery planned date
$documentstatic = new Commande($db);
- $sql_select = 'SELECT c.rowid as doc_id, c.ref as doc_number, \'1\' as doc_type, c.date_commande as dateprint, c.fk_statut as status, NULL as paid, ';
+ $sql_select = 'SELECT c.rowid as doc_id, c.ref as doc_number, \'1\' as doc_type, c.date_commande as dateprint, c.fk_statut as status, NULL as paid, c.date_livraison as delivery_planned_date,';
$tables_from = MAIN_DB_PREFIX."commande as c,".MAIN_DB_PREFIX."commandedet as d";
$where = " WHERE c.fk_soc = s.rowid AND s.rowid = ".((int) $socid);
$where .= " AND d.fk_commande = c.rowid";
@@ -310,8 +311,9 @@ if ($type_element == 'supplier_proposal') {
}
if ($type_element == 'supplier_order') { // Supplier : Show products from orders.
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
+ $langs->load('sendings'); // delivery planned date
$documentstatic = new CommandeFournisseur($db);
- $sql_select = 'SELECT c.rowid as doc_id, c.ref as doc_number, \'1\' as doc_type, c.date_valid as dateprint, c.fk_statut as status, NULL as paid, ';
+ $sql_select = 'SELECT c.rowid as doc_id, c.ref as doc_number, \'1\' as doc_type, c.date_valid as dateprint, c.fk_statut as status, NULL as paid, c.date_livraison as delivery_planned_date, ';
$tables_from = MAIN_DB_PREFIX."commande_fournisseur as c,".MAIN_DB_PREFIX."commande_fournisseurdet as d";
$where = " WHERE c.fk_soc = s.rowid AND s.rowid = ".((int) $socid);
$where .= " AND d.fk_commande = c.rowid";
@@ -396,14 +398,6 @@ if (empty($elementTypeArray) && !$object->client && !$object->fournisseur) {
$typeElementString = $form->selectarray("type_element", $elementTypeArray, GETPOST('type_element'), $showempty, 0, 0, '', 0, 0, $disabled, '', 'maxwidth150onsmartphone');
$button = ' ';
-$param = '';
-$param .= "&sref=".urlencode($sref);
-$param .= "&month=".urlencode($month);
-$param .= "&year=".urlencode($year);
-$param .= "&sprod_fulldescr=".urlencode($sprod_fulldescr);
-$param .= "&socid=".urlencode($socid);
-$param .= "&type_element=".urlencode($type_element);
-
$total_qty = 0;
if ($sql_select) {
@@ -451,6 +445,10 @@ if ($sql_select) {
print $formother->select_month($month ? $month : -1, 'month', 1, 0, 'valignmiddle');
print $formother->selectyear($year ? $year : -1, 'year', 1, 20, 1, 0, 0, '', 'valignmiddle maxwidth75imp marginleftonly');
print '';
+ // delivery planned date
+ if ($type_element == 'order' || $type_element == 'supplier_order') {
+ print ' ';
+ }
print '';
print ' ';
print '';
@@ -470,6 +468,10 @@ if ($sql_select) {
print ' ';
print_liste_field_titre('Ref', $_SERVER['PHP_SELF'], 'doc_number', '', $param, '', $sortfield, $sortorder, 'left ');
print_liste_field_titre('Date', $_SERVER['PHP_SELF'], 'dateprint', '', $param, '', $sortfield, $sortorder, 'center ');
+ // delivery planned date
+ if ($type_element == 'order' || $type_element == 'supplier_order') {
+ print_liste_field_titre('DateDeliveryPlanned', $_SERVER['PHP_SELF'], 'delivery_planned_date', '', $param, '', $sortfield, $sortorder, 'center ');
+ }
print_liste_field_titre('Status', $_SERVER['PHP_SELF'], 'fk_statut', '', $param, '', $sortfield, $sortorder, 'center ');
print_liste_field_titre('Product', $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'left ');
print_liste_field_titre('Quantity', $_SERVER['PHP_SELF'], 'prod_qty', '', $param, '', $sortfield, $sortorder, 'right ');
@@ -499,6 +501,10 @@ if ($sql_select) {
print $documentstatic->getNomUrl(1);
print '';
print ''.dol_print_date($db->jdate($objp->dateprint), 'day').' ';
+ // delivery planned date
+ if ($type_element == 'order' || $type_element == 'supplier_order') {
+ print ''.dol_print_date($db->jdate($objp->delivery_planned_date), 'day').' ';
+ }
// Status
print '';
@@ -558,7 +564,7 @@ if ($sql_select) {
}
$text .= ' - '.(!empty($objp->label) ? $objp->label : $label);
- $description = (!empty($conf->global->PRODUIT_DESC_IN_FORM) ? '' : dol_htmlentitiesbr($objp->description));
+ $description = (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE') ? '' : dol_htmlentitiesbr($objp->description));
}
if (($objp->info_bits & 2) == 2) { ?>
@@ -613,7 +619,7 @@ if ($sql_select) {
echo get_date_range($objp->date_start, $objp->date_end);
// Add description in form
- if (!empty($conf->global->PRODUIT_DESC_IN_FORM)) {
+ if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
print (!empty($objp->description) && $objp->description != $objp->product_label) ? ' '.dol_htmlentitiesbr($objp->description) : '';
}
} else {
@@ -650,7 +656,7 @@ if ($sql_select) {
// Show range
$prodreftxt .= get_date_range($objp->date_start, $objp->date_end);
// Add description in form
- if (!empty($conf->global->PRODUIT_DESC_IN_FORM))
+ if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE'))
{
$prodreftxt .= (!empty($objp->description) && $objp->description!=$objp->product_label)?' '.dol_htmlentitiesbr($objp->description):'';
}
@@ -679,6 +685,10 @@ if ($sql_select) {
print ' ';
print ''.$langs->trans('Total').' ';
print ' ';
+ // delivery planned date
+ if ($type_element == 'order' || $type_element == 'supplier_order') {
+ print ' ';
+ }
print ''.$total_qty.' ';
print ''.price($total_ht).' ';
print ''.price(price2num($total_ht / (empty($total_qty) ? 1 : $total_qty), 'MU')).' ';
diff --git a/htdocs/societe/contact.php b/htdocs/societe/contact.php
index 90267403a16..f477935d994 100644
--- a/htdocs/societe/contact.php
+++ b/htdocs/societe/contact.php
@@ -53,7 +53,7 @@ $langs->loadLangs(array("companies", "commercial", "bills", "banks", "users"));
if (isModEnabled('categorie')) {
$langs->load("categories");
}
-if (!empty($conf->incoterm->enabled)) {
+if (isModEnabled('incoterm')) {
$langs->load("incoterm");
}
if (isModEnabled('notification')) {
diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php
index 6c45982a929..f5fcc56b49d 100644
--- a/htdocs/societe/list.php
+++ b/htdocs/societe/list.php
@@ -78,8 +78,8 @@ $search_supplier_code = trim(GETPOST('search_supplier_code', 'alpha'));
$search_account_customer_code = trim(GETPOST('search_account_customer_code', 'alpha'));
$search_account_supplier_code = trim(GETPOST('search_account_supplier_code', 'alpha'));
$search_address = trim(GETPOST('search_address', 'alpha'));
-$search_town = trim(GETPOST("search_town", 'alpha'));
$search_zip = trim(GETPOST("search_zip", 'alpha'));
+$search_town = trim(GETPOST("search_town", 'alpha'));
$search_state = trim(GETPOST("search_state", 'alpha'));
$search_region = trim(GETPOST("search_region", 'alpha'));
$search_email = trim(GETPOST('search_email', 'alpha'));
@@ -351,8 +351,8 @@ if (empty($reshook)) {
$search_account_customer_code = '';
$search_account_supplier_code = '';
$search_address = '';
- $search_town = "";
$search_zip = "";
+ $search_town = "";
$search_state = "";
$search_region = "";
$search_country = '';
@@ -478,13 +478,6 @@ $sql .= " region.code_region as region_code, region.nom as region_name";
if ($search_sale && $search_sale != '-1') {
$sql .= ", sc.fk_soc, sc.fk_user";
}
-// We'll need these fields in order to filter by categ
-if ($search_categ_cus && $search_categ_cus != -1) {
- $sql .= ", cc.fk_categorie, cc.fk_soc";
-}
-if ($search_categ_sup && $search_categ_sup != -1) {
- $sql .= ", cs.fk_categorie, cs.fk_soc";
-}
// Add fields from extrafields
if (!empty($extrafields->attributes[$object->table_element]['label'])) {
foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
@@ -505,13 +498,6 @@ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_ty
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_effectif as staff on (staff.id = s.fk_effectif)";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_regions as region on (region.code_region = state.fk_region)";
-// We'll need this table joined to the select in order to filter by categ
-if (!empty($search_categ_cus) && $search_categ_cus != '-1') {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_societe as cc ON s.rowid = cc.fk_soc"; // We'll need this table joined to the select in order to filter by categ
-}
-if (!empty($search_categ_sup) && $search_categ_sup != '-1') {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_fournisseur as cs ON s.rowid = cs.fk_soc"; // We'll need this table joined to the select in order to filter by categ
-}
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."c_stcomm as st ON s.fk_stcomm = st.id";
// We'll need this table joined to the select in order to filter by sale
if ($search_sale == -2) {
@@ -540,26 +526,72 @@ if ($search_sale == -2) {
} elseif ($search_sale > 0) {
$sql .= " AND sc.fk_user = ".((int) $search_sale);
}
-if ($search_categ_cus > 0) {
- $sql .= " AND cc.fk_categorie = ".((int) $search_categ_cus);
+$searchCategoryCustomerList = $search_categ_cus ? array($search_categ_cus) : array();;
+$searchCategoryCustomerOperator = 0;
+// Search for tag/category ($searchCategoryCustomerList is an array of ID)
+if (!empty($searchCategoryCustomerList)) {
+ $searchCategoryCustomerSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategoryCustomerList as $searchCategoryCustomer) {
+ if (intval($searchCategoryCustomer) == -2) {
+ $searchCategoryCustomerSqlList[] = "NOT EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as ck WHERE s.rowid = ck.fk_soc)";
+ } elseif (intval($searchCategoryCustomer) > 0) {
+ if ($searchCategoryCustomerOperator == 0) {
+ $searchCategoryCustomerSqlList[] = " EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as ck WHERE s.rowid = ck.fk_soc AND ck.fk_categorie = ".((int) $searchCategoryCustomer).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryCustomer);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategoryCustomerSqlList[] = " EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as ck WHERE s.rowid = ck.fk_soc AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategoryCustomerOperator == 1) {
+ if (!empty($searchCategoryCustomerSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryCustomerSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryCustomerSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryCustomerSqlList).")";
+ }
+ }
}
-if ($search_categ_sup > 0) {
- $sql .= " AND cs.fk_categorie = ".((int) $search_categ_sup);
+$searchCategorySupplierList = $search_categ_sup ? array($search_categ_sup) : array();
+$searchCategorySupplierOperator = 0;
+// Search for tag/category ($searchCategorySupplierList is an array of ID)
+if (!empty($searchCategorySupplierList)) {
+ $searchCategorySupplierSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategorySupplierList as $searchCategorySupplier) {
+ if (intval($searchCategorySupplier) == -2) {
+ $searchCategorySupplierSqlList[] = "NOT EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_fournisseur as ck WHERE s.rowid = ck.fk_soc)";
+ } elseif (intval($searchCategorySupplier) > 0) {
+ if ($searchCategorySupplierOperator == 0) {
+ $searchCategorySupplierSqlList[] = " EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_fournisseur as ck WHERE s.rowid = ck.fk_soc AND ck.fk_categorie = ".((int) $searchCategorySupplier).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategorySupplier);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategorySupplierSqlList[] = " EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_fournisseur as ck WHERE s.rowid = ck.fk_soc AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategorySupplierOperator == 1) {
+ if (!empty($searchCategorySupplierSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategorySupplierSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategorySupplierSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategorySupplierSqlList).")";
+ }
+ }
}
-if ($search_categ_cus == -2) {
- $sql .= " AND cc.fk_categorie IS NULL";
-}
-if ($search_categ_sup == -2) {
- $sql .= " AND cs.fk_categorie IS NULL";
-}
-
if ($search_all) {
$sql .= natural_search(array_keys($fieldstosearchall), $search_all);
}
if (strlen($search_cti)) {
$sql .= natural_search('s.phone', $search_cti);
}
-
if ($search_id > 0) {
$sql .= natural_search("s.rowid", $search_id, 1);
}
@@ -587,12 +619,12 @@ if ($search_account_supplier_code) {
if ($search_address) {
$sql .= natural_search('s.address', $search_address);
}
-if ($search_town) {
- $sql .= natural_search("s.town", $search_town);
-}
if (strlen($search_zip)) {
$sql .= natural_search("s.zip", $search_zip);
}
+if ($search_town) {
+ $sql .= natural_search("s.town", $search_town);
+}
if ($search_state) {
$sql .= natural_search("state.nom", $search_state);
}
@@ -691,11 +723,20 @@ $sql .= $hookmanager->resPrint;
// Count total nb of records with no order and no limits
$nbtotalofrecords = '';
if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
- $resql = $db->query($sql);
+ /*$resql = $db->query($sql);
if ($resql) {
$nbtotalofrecords = $db->num_rows($resql);
} else {
dol_print_error($db);
+ }*/
+ /* The fast and low memory method to get and count full list converts the sql into a sql count */
+ $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/Ui', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
+ $resql = $db->query($sqlforcount);
+ if ($resql) {
+ $objforcount = $db->fetch_object($resql);
+ $nbtotalofrecords = $objforcount->nbtotalofrecords;
+ } else {
+ dol_print_error($db);
}
if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
@@ -726,7 +767,7 @@ if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && (
$obj = $db->fetch_object($resql);
$id = $obj->rowid;
if (!empty($conf->global->SOCIETE_ON_SEARCH_AND_LIST_GO_ON_CUSTOMER_OR_SUPPLIER_CARD)) {
- if ($obj->client > 0) {
+ if ($companystatic->client > 0) {
header("Location: ".DOL_URL_ROOT.'/comm/card.php?socid='.$id);
exit;
}
@@ -774,12 +815,12 @@ if ($search_alias != '') {
if ($search_address != '') {
$param .= '&search_address='.urlencode($search_address);
}
-if ($search_town != '') {
- $param .= "&search_town=".urlencode($search_town);
-}
if ($search_zip != '') {
$param .= "&search_zip=".urlencode($search_zip);
}
+if ($search_town != '') {
+ $param .= "&search_town=".urlencode($search_town);
+}
if ($search_phone != '') {
$param .= "&search_phone=".urlencode($search_phone);
}
@@ -1217,7 +1258,7 @@ if (!empty($arrayfields['customerorsupplier']['checked'])) {
print ' ';
}
print $formcompany->selectProspectCustomerType($search_type, 'search_type', 'search_type', 'list');
- print '';
+ print '';
}
// Prospect level
if (!empty($arrayfields['s.fk_prospectlevel']['checked'])) {
@@ -1406,27 +1447,36 @@ $totalarray = array();
$totalarray['nbfield'] = 0;
while ($i < min($num, $limit)) {
$obj = $db->fetch_object($resql);
+ $parameters = array('staticdata' => $obj);
+ // Note that $action and $object may have been modified by hook
+ // do companystatic fetch in hook if wanted or anything else
+ $reshook = $hookmanager->executeHooks('loadStaticObject', $parameters, $companystatic, $action);
+ if (empty($reshook)) {
+ $companystatic->id = $obj->rowid;
+ $companystatic->name = $obj->name;
+ $companystatic->name_alias = $obj->name_alias;
+ $companystatic->logo = $obj->logo;
+ $companystatic->barcode = $obj->barcode;
+ $companystatic->canvas = $obj->canvas;
+ $companystatic->client = $obj->client;
+ $companystatic->status = $obj->status;
+ $companystatic->email = $obj->email;
+ $companystatic->address = $obj->address;
+ $companystatic->zip = $obj->zip;
+ $companystatic->town = $obj->town;
+ $companystatic->fournisseur = $obj->fournisseur;
+ $companystatic->code_client = $obj->code_client;
+ $companystatic->code_fournisseur = $obj->code_fournisseur;
+ $companystatic->tva_intra = $obj->tva_intra;
+ $companystatic->country_code = $obj->country_code;
- $companystatic->id = $obj->rowid;
- $companystatic->name = $obj->name;
- $companystatic->name_alias = $obj->name_alias;
- $companystatic->logo = $obj->logo;
- $companystatic->canvas = $obj->canvas;
- $companystatic->client = $obj->client;
- $companystatic->status = $obj->status;
- $companystatic->email = $obj->email;
- $companystatic->fournisseur = $obj->fournisseur;
- $companystatic->code_client = $obj->code_client;
- $companystatic->code_fournisseur = $obj->code_fournisseur;
- $companystatic->tva_intra = $obj->tva_intra;
- $companystatic->country_code = $obj->country_code;
+ $companystatic->code_compta_client = $obj->code_compta;
+ $companystatic->code_compta_fournisseur = $obj->code_compta_fournisseur;
- $companystatic->code_compta_client = $obj->code_compta;
- $companystatic->code_compta_fournisseur = $obj->code_compta_fournisseur;
-
- $companystatic->fk_prospectlevel = $obj->fk_prospectlevel;
- $companystatic->fk_parent = $obj->fk_parent;
- $companystatic->entity = $obj->entity;
+ $companystatic->fk_prospectlevel = $obj->fk_prospectlevel;
+ $companystatic->fk_parent = $obj->fk_parent;
+ $companystatic->entity = $obj->entity;
+ }
print ' ';
}
print '';
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
}
if (!empty($arrayfields['s.rowid']['checked'])) {
print '';
@@ -1457,7 +1510,7 @@ while ($i < min($num, $limit)) {
if (!empty($arrayfields['s.nom']['checked'])) {
print ' global->MAIN_SOCIETE_SHOW_COMPLETE_NAME) ? ' class="tdoverflowmax200"' : '').' data-key="ref">';
if ($contextpage == 'poslist') {
- print dol_escape_htmltag($obj->name);
+ print dol_escape_htmltag($companystatic->name);
} else {
print $companystatic->getNomUrl(1, '', 100, 0, 1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1);
}
@@ -1476,56 +1529,56 @@ while ($i < min($num, $limit)) {
}
// Barcode
if (!empty($arrayfields['s.barcode']['checked'])) {
- print ' '.dol_escape_htmltag($obj->barcode).' ';
+ print ''.dol_escape_htmltag($companystatic->barcode).' ';
if (!$i) {
$totalarray['nbfield']++;
}
}
// Customer code
if (!empty($arrayfields['s.code_client']['checked'])) {
- print ''.dol_escape_htmltag($obj->code_client).' ';
+ print ''.dol_escape_htmltag($companystatic->code_client).' ';
if (!$i) {
$totalarray['nbfield']++;
}
}
// Supplier code
if (!empty($arrayfields['s.code_fournisseur']['checked'])) {
- print ''.dol_escape_htmltag($obj->code_fournisseur).' ';
+ print ''.dol_escape_htmltag($companystatic->code_fournisseur).' ';
if (!$i) {
$totalarray['nbfield']++;
}
}
// Account customer code
if (!empty($arrayfields['s.code_compta']['checked'])) {
- print ''.dol_escape_htmltag($obj->code_compta).' ';
+ print ''.dol_escape_htmltag($companystatic->code_compta_client).' ';
if (!$i) {
$totalarray['nbfield']++;
}
}
// Account supplier code
if (!empty($arrayfields['s.code_compta_fournisseur']['checked'])) {
- print ''.dol_escape_htmltag($obj->code_compta_fournisseur).' ';
+ print ''.dol_escape_htmltag($companystatic->code_compta_fournisseur).' ';
if (!$i) {
$totalarray['nbfield']++;
}
}
// Address
if (!empty($arrayfields['s.address']['checked'])) {
- print ''.dol_escape_htmltag($obj->address).' ';
+ print ''.dol_escape_htmltag($companystatic->address).' ';
if (!$i) {
$totalarray['nbfield']++;
}
}
// Zip
if (!empty($arrayfields['s.zip']['checked'])) {
- print "".dol_escape_htmltag($obj->zip)." \n";
+ print "".dol_escape_htmltag($companystatic->zip)." \n";
if (!$i) {
$totalarray['nbfield']++;
}
}
// Town
if (!empty($arrayfields['s.town']['checked'])) {
- print ''.dol_escape_htmltag($obj->town)." \n";
+ print ''.dol_escape_htmltag($companystatic->town)." \n";
if (!$i) {
$totalarray['nbfield']++;
}
@@ -1547,7 +1600,7 @@ while ($i < min($num, $limit)) {
// Country
if (!empty($arrayfields['country.code_iso']['checked'])) {
print '';
- $labelcountry = ($obj->country_code && ($langs->trans("Country".$obj->country_code) != "Country".$obj->country_code)) ? $langs->trans("Country".$obj->country_code) : $obj->country_label;
+ $labelcountry = ($companystatic->country_code && ($langs->trans("Country".$companystatic->country_code) != "Country".$companystatic->country_code)) ? $langs->trans("Country".$companystatic->country_code) : $obj->country_label;
print $labelcountry;
print ' ';
if (!$i) {
@@ -1594,13 +1647,13 @@ while ($i < min($num, $limit)) {
}
}
if (!empty($arrayfields['s.phone']['checked'])) {
- print ''.dol_print_phone($obj->phone, $obj->country_code, 0, $obj->rowid, 'AC_TEL', ' ', 'phone')." \n";
+ print ''.dol_print_phone($obj->phone, $companystatic->country_code, 0, $obj->rowid, 'AC_TEL', ' ', 'phone')." \n";
if (!$i) {
$totalarray['nbfield']++;
}
}
if (!empty($arrayfields['s.fax']['checked'])) {
- print ''.dol_print_phone($obj->fax, $obj->country_code, 0, $obj->rowid, 'AC_TEL', ' ', 'fax')." \n";
+ print ''.dol_print_phone($obj->fax, $companystatic->country_code, 0, $obj->rowid, 'AC_TEL', ' ', 'fax')." \n";
if (!$i) {
$totalarray['nbfield']++;
}
@@ -1649,11 +1702,11 @@ while ($i < min($num, $limit)) {
}
// VAT
if (!empty($arrayfields['s.tva_intra']['checked'])) {
- print '';
- if ($obj->tva_intra && !isValidVATID($companystatic)) {
+ print ' ';
+ if ($companystatic->tva_intra && !isValidVATID($companystatic)) {
print img_warning("BadVATNumber", '', 'pictofixedwidth');
}
- print $obj->tva_intra;
+ print $companystatic->tva_intra;
print " \n";
if (!$i) {
$totalarray['nbfield']++;
@@ -1681,7 +1734,7 @@ while ($i < min($num, $limit)) {
if (!empty($arrayfields['s.fk_stcomm']['checked'])) {
// Prospect status
- print '';
+ print '
';
print '
';
print $companystatic->LibProspCommStatut($obj->stcomm_id, 2, $prospectstatic->cacheprospectstatus[$obj->stcomm_id]['label'], $obj->stcomm_picto);
print '
-
';
@@ -1762,9 +1815,9 @@ while ($i < min($num, $limit)) {
print ' ';
}
print '
';
- }
- if (!$i) {
- $totalarray['nbfield']++;
+ if (!$i) {
+ $totalarray['nbfield']++;
+ }
}
print '
'."\n";
diff --git a/htdocs/societe/messaging.php b/htdocs/societe/messaging.php
new file mode 100644
index 00000000000..c73d6ffe0b1
--- /dev/null
+++ b/htdocs/societe/messaging.php
@@ -0,0 +1,211 @@
+
+ * Copyright (C) 2005 Brice Davoleau
+ * Copyright (C) 2005-2012 Regis Houssin
+ * Copyright (C) 2006-2019 Laurent Destailleur
+ * Copyright (C) 2007 Patrick Raguin
+ * Copyright (C) 2010 Juanjo Menent
+ * Copyright (C) 2015 Marcos García
+ *
+ * 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 .
+ */
+
+/**
+ * \file htdocs/societe/messaging.php
+ * \ingroup societe
+ * \brief Page of third party events
+ */
+
+// Load Dolibarr environment
+require '../main.inc.php';
+require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
+require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
+
+// Load translation files required by the page
+$langs->loadLangs(array('agenda', 'bills', 'companies', 'orders', 'propal'));
+
+
+if (GETPOST('actioncode', 'array')) {
+ $actioncode = GETPOST('actioncode', 'array', 3);
+ if (!count($actioncode)) {
+ $actioncode = '0';
+ }
+} else {
+ $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : (empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT));
+}
+
+$search_agenda_label = GETPOST('search_agenda_label');
+
+// Security check
+$socid = GETPOST('socid', 'int');
+if ($user->socid) {
+ $socid = $user->socid;
+}
+$result = restrictedArea($user, 'societe', $socid, '&societe');
+
+$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
+$sortfield = GETPOST('sortfield', 'aZ09comma');
+$sortorder = GETPOST('sortorder', 'aZ09comma');
+$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
+if (empty($page) || $page == -1) {
+ $page = 0;
+} // If $page is not defined, or '' or -1
+$offset = $limit * $page;
+$pageprev = $page - 1;
+$pagenext = $page + 1;
+if (!$sortfield) {
+ $sortfield = 'a.datep,a.id';
+}
+if (!$sortorder) {
+ $sortorder = 'DESC,DESC';
+}
+
+// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
+$hookmanager->initHooks(array('agendathirdparty'));
+
+
+/*
+ * Actions
+ */
+
+$parameters = array('id'=>$socid);
+$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
+if ($reshook < 0) {
+ setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+}
+
+if (empty($reshook)) {
+ // Cancel
+ if (GETPOST('cancel', 'alpha') && !empty($backtopage)) {
+ header("Location: ".$backtopage);
+ exit;
+ }
+
+ // Purge search criteria
+ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
+ $actioncode = '';
+ $search_agenda_label = '';
+ }
+}
+
+
+
+/*
+ * View
+ */
+
+$form = new Form($db);
+
+if ($socid > 0) {
+ require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
+ require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
+
+ $object = new Societe($db);
+ $result = $object->fetch($socid);
+
+ $title = $langs->trans("Agenda");
+ if (!empty($conf->global->MAIN_HTML_TITLE) && preg_match('/thirdpartynameonly/', $conf->global->MAIN_HTML_TITLE) && $object->name) {
+ $title = $object->name." - ".$title;
+ }
+ llxHeader('', $title);
+
+ if (isModEnabled('notification')) {
+ $langs->load("mails");
+ }
+ $head = societe_prepare_head($object);
+
+ print dol_get_fiche_head($head, 'agenda', $langs->trans("ThirdParty"), -1, 'company');
+
+ $linkback = ''.$langs->trans("BackToList").' ';
+
+ dol_banner_tab($object, 'socid', $linkback, ($user->socid ? 0 : 1), 'rowid', 'nom');
+
+ print '';
+
+ print '
';
+
+ $object->info($socid);
+ dol_print_object_info($object, 1);
+
+ print '
';
+
+ print dol_get_fiche_end();
+
+
+
+ // Actions buttons
+
+ $objthirdparty = $object;
+ $objcon = new stdClass();
+
+ $out = '';
+ $permok = $user->hasRight('agenda', 'myactions', 'create');
+ if ((!empty($objthirdparty->id) || !empty($objcon->id)) && $permok) {
+ if (is_object($objthirdparty) && get_class($objthirdparty) == 'Societe') {
+ $out .= '&originid='.$objthirdparty->id.($objthirdparty->id > 0 ? '&socid='.$objthirdparty->id : '').'&backtopage='.urlencode($_SERVER['PHP_SELF'].($objthirdparty->id > 0 ? '?socid='.$objthirdparty->id : ''));
+ }
+ $out .= (!empty($objcon->id) ? '&contactid='.$objcon->id : '').'&percentage=-1';
+ $out .= '&datep='.dol_print_date(dol_now(), 'dayhourlog');
+ }
+
+ $morehtmlright = '';
+
+ $messagingUrl = DOL_URL_ROOT.'/societe/messaging.php?socid='.$object->id;
+ $morehtmlright .= dolGetButtonTitle($langs->trans('ShowAsConversation'), '', 'fa fa-comments imgforviewmode', $messagingUrl, '', 2);
+ $messagingUrl = DOL_URL_ROOT.'/societe/agenda.php?socid='.$object->id;
+ $morehtmlright .= dolGetButtonTitle($langs->trans('MessageListViewType'), '', 'fa fa-bars imgforviewmode', $messagingUrl, '', 1);
+
+ // // Show link to send an email (if read and not closed)
+ // $btnstatus = $object->status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage";
+ // $url = 'card.php?track_id='.$object->track_id.'&action=presend_addmessage&mode=init&private_message=0&send_email=1&backtopage='.urlencode($_SERVER["PHP_SELF"].'?track_id='.$object->track_id).'#formmailbeforetitle';
+ // $morehtmlright .= dolGetButtonTitle($langs->trans('SendMail'), '', 'fa fa-paper-plane', $url, 'email-title-button', $btnstatus);
+
+ // // Show link to add a private message (if read and not closed)
+ // $btnstatus = $object->status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage";
+ // $url = 'card.php?track_id='.$object->track_id.'&action=presend_addmessage&mode=init&backtopage='.urlencode($_SERVER["PHP_SELF"].'?track_id='.$object->track_id).'#formmailbeforetitle';
+ // $morehtmlright .= dolGetButtonTitle($langs->trans('TicketAddMessage'), '', 'fa fa-comment-dots', $url, 'add-new-ticket-title-button', $btnstatus);
+
+ if (isModEnabled('agenda')) {
+ if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) {
+ $morehtmlright .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create'.$out);
+ }
+ }
+
+ if (isModEnabled('agenda') && (!empty($user->rights->agenda->myactions->read) || !empty($user->rights->agenda->allactions->read))) {
+ print ' ';
+
+ $param = '&socid='.urlencode($socid);
+ if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
+ $param .= '&contextpage='.urlencode($contextpage);
+ }
+ if ($limit > 0 && $limit != $conf->liste_limit) {
+ $param .= '&limit='.urlencode($limit);
+ }
+
+ // print load_fiche_titre($langs->trans("ActionsOnCompany"), $newcardbutton, '');
+ print_barre_liste($langs->trans("ActionsOnCompany"), 0, $_SERVER["PHP_SELF"], '', $sortfield, $sortorder, '', 0, -1, '', 0, $morehtmlright, '', 0, 1, 1);
+
+ // List of all actions
+ $filters = array();
+ $filters['search_agenda_label'] = $search_agenda_label;
+
+ // TODO Replace this with same code than into list.php
+ show_actions_messaging($conf, $langs, $db, $object, null, 0, $actioncode, '', $filters, $sortfield, $sortorder);
+ }
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/htdocs/societe/partnership.php b/htdocs/societe/partnership.php
deleted file mode 100644
index b7bcd153092..00000000000
--- a/htdocs/societe/partnership.php
+++ /dev/null
@@ -1,274 +0,0 @@
-
- * Copyright (C) 2021 NextGestion
- * Copyright (C) 2022 Charlene Benke
- *
- * 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 .
- */
-
-/**
- * \file partnership_card.php
- * \ingroup partnership
- * \brief Page to create/edit/view partnership
- */
-
-// Load Dolibarr environment
-require '../main.inc.php';
-require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
-require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
-require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
-require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
-require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
-require_once DOL_DOCUMENT_ROOT.'/partnership/class/partnership.class.php';
-require_once DOL_DOCUMENT_ROOT.'/partnership/lib/partnership.lib.php';
-
-// Load translation files required by the page
-$langs->loadLangs(array("companies", "partnership", "other"));
-
-// Get parameters
-$id = GETPOST('id', 'int');
-$ref = GETPOST('ref', 'alpha');
-$action = GETPOST('action', 'aZ09');
-$confirm = GETPOST('confirm', 'alpha');
-$cancel = GETPOST('cancel', 'aZ09');
-$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'partnershipcard'; // To manage different context of search
-$backtopage = GETPOST('backtopage', 'alpha');
-$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
-//$lineid = GETPOST('lineid', 'int');
-
-// Security check
-$socid = GETPOST('socid', 'int');
-if (!empty($user->socid)) {
- $socid = $user->socid;
-}
-
-if (empty($id) && $socid && (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty') == 'thirdparty')) {
- $id = $socid;
-}
-
-$object = new Societe($db);
-if ($id > 0) {
- $object->fetch($id);
-}
-
-// Initialize technical objects
-$object = new Partnership($db);
-$extrafields = new ExtraFields($db);
-$diroutputmassaction = $conf->partnership->dir_output.'/temp/massgeneration/'.$user->id;
-$hookmanager->initHooks(array('thirdpartypartnership', 'globalcard')); // Note that conf->hooks_modules contains array
-
-// Fetch optionals attributes and labels
-$extrafields->fetch_name_optionals_label($object->table_element);
-
-$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
-
-// Initialize array of search criterias
-$search_all = GETPOST("search_all", 'alpha');
-$search = array();
-
-foreach ($object->fields as $key => $val) {
- if (GETPOST('search_'.$key, 'alpha')) {
- $search[$key] = GETPOST('search_'.$key, 'alpha');
- }
-}
-
-// Load object
-include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once.
-
-$permissiontoread = $user->rights->partnership->read;
-$permissiontoadd = $user->rights->partnership->write; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
-$permissiontodelete = $user->rights->partnership->delete || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
-$permissionnote = $user->rights->partnership->write; // Used by the include of actions_setnotes.inc.php
-$permissiondellink = $user->rights->partnership->write; // Used by the include of actions_dellink.inc.php
-$usercanclose = $user->rights->partnership->write; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
-$upload_dir = $conf->partnership->multidir_output[isset($object->entity) ? $object->entity : 1];
-
-
-if (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty') != 'thirdparty') {
- accessforbidden('Partnership is not activated for thirdparties');
-}
-if (empty($conf->partnership->enabled)) {
- accessforbidden();
-}
-if (empty($permissiontoread)) {
- accessforbidden();
-}
-if ($action == 'edit' && empty($permissiontoadd)) {
- accessforbidden();
-}
-
-if (($action == 'update' || $action == 'edit') && $object->status != $object::STATUS_DRAFT && !empty($user->socid)) {
- accessforbidden();
-}
-
-
-// Security check
-$result = restrictedArea($user, 'societe', $id, '&societe', '', 'fk_soc', 'rowid', 0);
-
-
-/*
- * Actions
- */
-
-$parameters = array('socid' => $id);
-$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
-if ($reshook < 0) {
- setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
-}
-
-$date_start = dol_mktime(0, 0, 0, GETPOST('date_partnership_startmonth', 'int'), GETPOST('date_partnership_startday', 'int'), GETPOST('date_partnership_startyear', 'int'));
-$date_end = dol_mktime(0, 0, 0, GETPOST('date_partnership_endmonth', 'int'), GETPOST('date_partnership_endday', 'int'), GETPOST('date_partnership_endyear', 'int'));
-
-if (empty($reshook)) {
- $error = 0;
-
- $backtopage = DOL_URL_ROOT.'/partnership/partnership.php?id='.($id > 0 ? $id : '__ID__');
-
- // Actions when linking object each other
- include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php';
-}
-
-$object->fields['fk_soc']['visible'] = 0;
-if ($object->id > 0 && $object->status == $object::STATUS_REFUSED && empty($action)) {
- $object->fields['reason_decline_or_cancel']['visible'] = 1;
-}
-$object->fields['note_public']['visible'] = 1;
-
-
-/*
- * View
- */
-
-$form = new Form($db);
-$formfile = new FormFile($db);
-
-$title = $langs->trans("Partnership");
-llxHeader('', $title);
-
-$form = new Form($db);
-
-if ($id > 0) {
- $langs->load("companies");
-
- $object = new Societe($db);
- $result = $object->fetch($id);
-
- if (isModEnabled('notification')) {
- $langs->load("mails");
- }
- $head = societe_prepare_head($object);
-
- print dol_get_fiche_head($head, 'partnership', $langs->trans("ThirdParty"), -1, 'company');
-
- $linkback = ''.$langs->trans("BackToList").' ';
-
- dol_banner_tab($object, 'socid', $linkback, ($user->socid ? 0 : 1), 'rowid', 'nom');
-
- print '';
-
- print '
';
- print '
';
-
- if (!empty($conf->global->SOCIETE_USEPREFIX)) { // Old not used prefix field
- print ''.$langs->trans('Prefix').' '.$object->prefix_comm.' ';
- }
-
- if ($object->client) {
- print '';
- print $langs->trans('CustomerCode').' ';
- print showValueWithClipboardCPButton(dol_escape_htmltag($object->code_client));
- $tmpcheck = $object->check_codeclient();
- if ($tmpcheck != 0 && $tmpcheck != -5) {
- print ' ('.$langs->trans("WrongCustomerCode").') ';
- }
- print ' ';
- }
-
- if ($object->fournisseur) {
- print '';
- print $langs->trans('SupplierCode').' ';
- print showValueWithClipboardCPButton(dol_escape_htmltag($object->code_fournisseur));
- $tmpcheck = $object->check_codefournisseur();
- if ($tmpcheck != 0 && $tmpcheck != -5) {
- print ' ('.$langs->trans("WrongSupplierCode").') ';
- }
- print ' ';
- print ' ';
- }
-
- print '
';
-
- print '
';
-
- print dol_get_fiche_end();
-} else {
- dol_print_error('', 'Parameter id not defined');
-}
-
-// Part to show record
-if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) {
- // Buttons for actions
-
- if ($action != 'presend') {
- print ''."\n";
- $parameters = array();
- $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
- if ($reshook < 0) {
- setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
- }
-
- if (empty($reshook)) {
- // Show
- if ($permissiontoadd) {
- print dolGetButtonAction($langs->trans('AddPartnership'), '', 'default', DOL_URL_ROOT.'/partnership/partnership_card.php?action=create&fk_soc='.$object->id.'&backtopage='.urlencode(DOL_URL_ROOT.'/societe/partnership.php?id='.$object->id), '', $permissiontoadd);
- }
- }
- print '
'."\n";
- }
-
-
- //$morehtmlright = 'partnership/partnership_card.php?action=create&backtopage=%2Fdolibarr%2Fhtdocs%2Fpartnership%2Fpartnership_list.php';
- $morehtmlright = '';
-
- print load_fiche_titre($langs->trans("PartnershipDedicatedToThisThirdParty", $langs->transnoentitiesnoconv("Partnership")), $morehtmlright, '');
-
- $socid = $object->id;
-
-
- // TODO Replace this card with a table of list of all partnerships.
-
- $object = new Partnership($db);
- $partnershipid = $object->fetch(0, '', 0, $socid);
-
- if ($partnershipid > 0) {
- print '';
- print '
';
- print '
';
- print '
'."\n";
-
- // Common attributes
- unset($object->fields['fk_soc']); // Hide field already shown in banner
- include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php';
- $forcefieldid = 'socid';
- $forceobjectid = $object->fk_soc;
- include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
-
- print '
';
- print '
';
- }
-}
-
-// End of page
-llxFooter();
-$db->close();
diff --git a/htdocs/societe/paymentmodes.php b/htdocs/societe/paymentmodes.php
index 6110fc7a5e5..a7a7cd44972 100644
--- a/htdocs/societe/paymentmodes.php
+++ b/htdocs/societe/paymentmodes.php
@@ -84,7 +84,7 @@ $permissiontoadd = $user->rights->societe->creer; // Used by the include of acti
$permissiontoaddupdatepaymentinformation = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $permissiontoadd) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->societe->thirdparty_paymentinformation_advance->write)));
-if (!empty($conf->stripe->enabled)) {
+if (isModEnabled('stripe')) {
$service = 'StripeTest';
$servicestatus = 0;
if (!empty($conf->global->STRIPE_LIVE) && !GETPOST('forcesandbox', 'alpha')) {
@@ -493,7 +493,7 @@ if (empty($reshook)) {
$id = $savid;
// Action for stripe
- if (!empty($conf->stripe->enabled) && class_exists('Stripe')) {
+ if (isModEnabled('stripe') && class_exists('Stripe')) {
if ($action == 'synccustomertostripe') {
if ($object->client == 0) {
$error++;
@@ -782,11 +782,11 @@ llxHeader('', $title, $help_url);
$head = societe_prepare_head($object);
// Show sandbox warning
-/*if (!empty($conf->paypal->enabled) && (!empty($conf->global->PAYPAL_API_SANDBOX) || GETPOST('forcesandbox','alpha'))) // We can force sand box with param 'forcesandbox'
+/*if (isModEnabled('paypal') && (!empty($conf->global->PAYPAL_API_SANDBOX) || GETPOST('forcesandbox','alpha'))) // We can force sand box with param 'forcesandbox'
{
dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode','Paypal'),'','warning');
}*/
-if (!empty($conf->stripe->enabled) && (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'alpha'))) {
+if (isModEnabled('stripe') && (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'alpha'))) {
dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode', 'Stripe'), '', 'warning');
}
@@ -885,13 +885,13 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard'
$elementTypeArray['contract'] = $langs->transnoentitiesnoconv('Contracts');
}
- if (!empty($conf->stripe->enabled)) {
+ if (isModEnabled('stripe')) {
// Stripe customer key 'cu_....' stored into llx_societe_account
print '
';
print $form->editfieldkey("StripeCustomerId", 'key_account', $stripecu, $object, $permissiontoaddupdatepaymentinformation, 'string', '', 0, 2, 'socid');
print ' ';
print $form->editfieldval("StripeCustomerId", 'key_account', $stripecu, $object, $permissiontoaddupdatepaymentinformation, 'string', '', null, null, '', 2, '', 'socid');
- if (!empty($conf->stripe->enabled) && $stripecu && $action != 'editkey_account') {
+ if (isModEnabled('stripe') && $stripecu && $action != 'editkey_account') {
$connect = '';
if (!empty($stripeacc)) {
$connect = $stripeacc.'/';
@@ -947,7 +947,7 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard'
}
}
- if (!empty($conf->stripe->enabled) && !empty($conf->stripeconnect->enabled) && getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) {
+ if (isModEnabled('stripe') && !empty($conf->stripeconnect->enabled) && getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) {
$stripesupplieracc = $stripe->getStripeAccount($service, $object->id); // Get Stripe OAuth connect account (no network access here)
// Stripe customer key 'cu_....' stored into llx_societe_account
@@ -955,7 +955,7 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard'
print $form->editfieldkey("StripeConnectAccount", 'key_account_supplier', $stripesupplieracc, $object, $permissiontoaddupdatepaymentinformation, 'string', '', 0, 2, 'socid');
print ' ';
print $form->editfieldval("StripeConnectAccount", 'key_account_supplier', $stripesupplieracc, $object, $permissiontoaddupdatepaymentinformation, 'string', '', null, null, '', 2, '', 'socid');
- if (!empty($conf->stripe->enabled) && $stripesupplieracc && $action != 'editkey_account_supplier') {
+ if (isModEnabled('stripe') && $stripesupplieracc && $action != 'editkey_account_supplier') {
$connect = '';
$url = 'https://dashboard.stripe.com/test/connect/accounts/'.$stripesupplieracc;
@@ -1338,7 +1338,7 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard'
}
// List of Stripe connect accounts
- if (!empty($conf->stripe->enabled) && !empty($conf->stripeconnect->enabled) && !empty($stripesupplieracc)) {
+ if (isModEnabled('stripe') && !empty($conf->stripeconnect->enabled) && !empty($stripesupplieracc)) {
print load_fiche_titre($langs->trans('StripeBalance').($stripesupplieracc ? ' (Stripe connection with StripeConnect account '.$stripesupplieracc.')' : ' (Stripe connection with keys from Stripe module setup)'), $morehtmlright, 'stripe-s');
$balance = \Stripe\Balance::retrieve(array("stripe_account" => $stripesupplieracc));
print ''."\n";
@@ -1591,16 +1591,16 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard'
if ($permissiontoaddupdatepaymentinformation) {
if (empty($rib->stripe_card_ref)) {
// Add link to create BAN on Stripe
- print 'id.'&id='.$rib->id.'&action=syncsepatostripe">';
+ print ' id.'&id='.$rib->id.'&action=syncsepatostripe&token='.newToken().'">';
print img_picto($langs->trans("CreateBANOnStripe"), 'stripe');
print ' ';
}
- print 'id.'&id='.$rib->id.'&action=edit">';
+ print ' id.'&id='.$rib->id.'&action=edit">';
print img_picto($langs->trans("Modify"), 'edit');
print ' ';
- print 'id.'&id='.$rib->id.'&action=delete&token='.newToken().'">';
+ print ' id.'&id='.$rib->id.'&action=delete&token='.newToken().'">';
print img_picto($langs->trans("Delete"), 'delete');
print ' ';
}
diff --git a/htdocs/societe/price.php b/htdocs/societe/price.php
index 5ff503c9eec..b4e60cf0051 100644
--- a/htdocs/societe/price.php
+++ b/htdocs/societe/price.php
@@ -158,7 +158,7 @@ if (empty($reshook)) {
if ($result < 0) {
setEventMessages($prodcustprice->error, $prodcustprice->errors, 'mesgs');
} else {
- setEventMessages($langs->trans('Delete'), null, 'errors');
+ setEventMessages($langs->trans('RecordDeleted'), null, 'errors');
}
$action = '';
}
@@ -532,10 +532,10 @@ if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) {
// Count total nb of records
$nbtotalofrecords = '';
if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
- $nbtotalofrecords = $prodcustprice->fetch_all('', '', 0, 0, $filter);
+ $nbtotalofrecords = $prodcustprice->fetchAll('', '', 0, 0, $filter);
}
- $result = $prodcustprice->fetch_all($sortorder, $sortfield, $conf->liste_limit, $offset, $filter);
+ $result = $prodcustprice->fetchAll($sortorder, $sortfield, $conf->liste_limit, $offset, $filter);
if ($result < 0) {
setEventMessages($prodcustprice->error, $prodcustprice->errors, 'errors');
}
diff --git a/htdocs/stripe/admin/stripe.php b/htdocs/stripe/admin/stripe.php
index 33536271115..6cbefc14185 100644
--- a/htdocs/stripe/admin/stripe.php
+++ b/htdocs/stripe/admin/stripe.php
@@ -399,7 +399,7 @@ if ($conf->global->MAIN_FEATURES_LEVEL >= 2) { // TODO Not used by current code
if (!empty($site_account)) {
\Stripe\Stripe::setApiKey($site_account);
}
- if (!empty($conf->stripe->enabled) && (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'alpha'))) {
+ if (isModEnabled('stripe') && (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'alpha'))) {
$service = 'StripeTest';
$servicestatus = '0';
dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode', 'Stripe'), '', 'warning');
diff --git a/htdocs/stripe/charge.php b/htdocs/stripe/charge.php
index 522445334eb..f598275177e 100644
--- a/htdocs/stripe/charge.php
+++ b/htdocs/stripe/charge.php
@@ -68,7 +68,7 @@ $stripe = new Stripe($db);
llxHeader('', $langs->trans("StripeChargeList"));
-if (!empty($conf->stripe->enabled) && (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'alpha'))) {
+if (isModEnabled('stripe') && (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'alpha'))) {
$service = 'StripeTest';
$servicestatus = '0';
dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode', 'Stripe'), '', 'warning');
@@ -225,7 +225,7 @@ if (!$rowid) {
// Stripe customer
print "";
- if (!empty($conf->stripe->enabled) && !empty($stripeacc)) {
+ if (isModEnabled('stripe') && !empty($stripeacc)) {
$connect = $stripeacc.'/';
}
$url = 'https://dashboard.stripe.com/'.$connect.'test/customers/'.$charge->customer;
diff --git a/htdocs/stripe/class/actions_stripe.class.php b/htdocs/stripe/class/actions_stripe.class.php
index 0d8b5e03435..8e5cd833a71 100644
--- a/htdocs/stripe/class/actions_stripe.class.php
+++ b/htdocs/stripe/class/actions_stripe.class.php
@@ -71,7 +71,7 @@ class ActionsStripeconnect
{
global $db, $conf, $user, $langs, $form;
- if (!empty($conf->stripe->enabled) && (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'alpha'))) {
+ if (isModEnabled('stripe') && (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'alpha'))) {
$service = 'StripeTest';
dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode', 'Stripe'), '', 'warning');
} else {
diff --git a/htdocs/stripe/class/stripe.class.php b/htdocs/stripe/class/stripe.class.php
index cc8178d2a01..43f940acdee 100644
--- a/htdocs/stripe/class/stripe.class.php
+++ b/htdocs/stripe/class/stripe.class.php
@@ -386,7 +386,7 @@ class Stripe extends CommonObject
// That's why we can comment the part of code to retrieve a payment intent with object id (never mind if we cumulate payment intent with old ones that will not be used)
$sql = "SELECT pi.ext_payment_id, pi.entity, pi.fk_facture, pi.sourcetype, pi.ext_payment_site";
- $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_facture_demande as pi";
+ $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pi";
$sql .= " WHERE pi.fk_facture = ".((int) $object->id);
$sql .= " AND pi.sourcetype = '".$this->db->escape($object->element)."'";
$sql .= " AND pi.entity IN (".getEntity('societe').")";
@@ -530,12 +530,12 @@ class Stripe extends CommonObject
$paymentintentalreadyexists = 0;
// Check that payment intent $paymentintent->id is not already recorded.
$sql = "SELECT pi.rowid";
- $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_facture_demande as pi";
+ $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pi";
$sql .= " WHERE pi.entity IN (".getEntity('societe').")";
$sql .= " AND pi.ext_payment_site = '".$this->db->escape($service)."'";
$sql .= " AND pi.ext_payment_id = '".$this->db->escape($paymentintent->id)."'";
- dol_syslog(get_class($this)."::getPaymentIntent search if payment intent already in prelevement_facture_demande", LOG_DEBUG);
+ dol_syslog(get_class($this)."::getPaymentIntent search if payment intent already in prelevement_demande", LOG_DEBUG);
$resql = $this->db->query($sql);
if ($resql) {
$num = $this->db->num_rows($resql);
@@ -552,7 +552,7 @@ class Stripe extends CommonObject
// If not, we create it.
if (!$paymentintentalreadyexists) {
$now = dol_now();
- $sql = "INSERT INTO ".MAIN_DB_PREFIX."prelevement_facture_demande (date_demande, fk_user_demande, ext_payment_id, fk_facture, sourcetype, entity, ext_payment_site, amount)";
+ $sql = "INSERT INTO ".MAIN_DB_PREFIX."prelevement_demande (date_demande, fk_user_demande, ext_payment_id, fk_facture, sourcetype, entity, ext_payment_site, amount)";
$sql .= " VALUES ('".$this->db->idate($now)."', ".((int) $user->id).", '".$this->db->escape($paymentintent->id)."', ".((int) $object->id).", '".$this->db->escape($object->element)."', ".((int) $conf->entity).", '".$this->db->escape($service)."', ".((float) $amount).")";
$resql = $this->db->query($sql);
if (!$resql) {
@@ -696,12 +696,12 @@ class Stripe extends CommonObject
$setupintentalreadyexists = 0;
// Check that payment intent $setupintent->id is not already recorded.
$sql = "SELECT pi.rowid";
- $sql.= " FROM " . MAIN_DB_PREFIX . "prelevement_facture_demande as pi";
+ $sql.= " FROM " . MAIN_DB_PREFIX . "prelevement_demande as pi";
$sql.= " WHERE pi.entity IN (".getEntity('societe').")";
$sql.= " AND pi.ext_payment_site = '" . $this->db->escape($service) . "'";
$sql.= " AND pi.ext_payment_id = '".$this->db->escape($setupintent->id)."'";
- dol_syslog(get_class($this) . "::getPaymentIntent search if payment intent already in prelevement_facture_demande", LOG_DEBUG);
+ dol_syslog(get_class($this) . "::getPaymentIntent search if payment intent already in prelevement_demande", LOG_DEBUG);
$resql = $this->db->query($sql);
if ($resql) {
$num = $this->db->num_rows($resql);
@@ -717,7 +717,7 @@ class Stripe extends CommonObject
if (! $setupintentalreadyexists)
{
$now=dol_now();
- $sql = "INSERT INTO " . MAIN_DB_PREFIX . "prelevement_facture_demande (date_demande, fk_user_demande, ext_payment_id, fk_facture, sourcetype, entity, ext_payment_site)";
+ $sql = "INSERT INTO " . MAIN_DB_PREFIX . "prelevement_demande (date_demande, fk_user_demande, ext_payment_id, fk_facture, sourcetype, entity, ext_payment_site)";
$sql .= " VALUES ('".$this->db->idate($now)."', ".((int) $user->id).", '".$this->db->escape($setupintent->id)."', ".((int) $object->id).", '".$this->db->escape($object->element)."', " . ((int) $conf->entity) . ", '" . $this->db->escape($service) . "', ".((float) $amount).")";
$resql = $this->db->query($sql);
if (! $resql)
@@ -908,7 +908,7 @@ class Stripe extends CommonObject
$sql = "SELECT sa.stripe_card_ref, sa.proprio, sa.iban_prefix"; // stripe_card_ref is src_ for sepa
$sql .= " FROM ".MAIN_DB_PREFIX."societe_rib as sa";
- $sql .= " WHERE sa.rowid = '".$this->db->escape($object->id)."'"; // We get record from ID, no need for filter on entity
+ $sql .= " WHERE sa.rowid = ".((int) $object->id); // We get record from ID, no need for filter on entity
$sql .= " AND sa.type = 'ban'"; //type ban to get normal bank account of customer (prelevement)
$soc = new Societe($this->db);
diff --git a/htdocs/stripe/payout.php b/htdocs/stripe/payout.php
index 81baa5db4ac..1965c8ab73d 100644
--- a/htdocs/stripe/payout.php
+++ b/htdocs/stripe/payout.php
@@ -72,7 +72,7 @@ $stripe = new Stripe($db);
llxHeader('', $langs->trans("StripePayoutList"));
-if (!empty($conf->stripe->enabled) && (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'alpha'))) {
+if (isModEnabled('stripe') && (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'alpha'))) {
$service = 'StripeTest';
$servicestatus = '0';
dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode', 'Stripe'), '', 'warning');
diff --git a/htdocs/stripe/transaction.php b/htdocs/stripe/transaction.php
index c36c061b91e..29eec246af8 100644
--- a/htdocs/stripe/transaction.php
+++ b/htdocs/stripe/transaction.php
@@ -71,7 +71,7 @@ $stripe = new Stripe($db);
llxHeader('', $langs->trans("StripeTransactionList"));
-if (!empty($conf->stripe->enabled) && (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'alpha'))) {
+if (isModEnabled('stripe') && (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'alpha'))) {
$service = 'StripeTest';
$servicestatus = '0';
dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode', 'Stripe'), '', 'warning');
diff --git a/htdocs/supplier_proposal/card.php b/htdocs/supplier_proposal/card.php
index 49f0fc408ce..66f69a25ff9 100644
--- a/htdocs/supplier_proposal/card.php
+++ b/htdocs/supplier_proposal/card.php
@@ -52,7 +52,7 @@ if (!empty($conf->project->enabled)) {
// Load translation files required by the page
$langs->loadLangs(array('companies', 'supplier_proposal', 'compta', 'bills', 'propal', 'orders', 'products', 'deliveries', 'sendings'));
-if (!empty($conf->margin->enabled)) {
+if (isModEnabled('margin')) {
$langs->load('margins');
}
@@ -62,13 +62,13 @@ $id = GETPOST('id', 'int');
$ref = GETPOST('ref', 'alpha');
$socid = GETPOST('socid', 'int');
$action = GETPOST('action', 'aZ09');
-$cancel = GETPOST('cancel');
+$cancel = GETPOST('cancel', 'alpha');
$origin = GETPOST('origin', 'alpha');
$originid = GETPOST('originid', 'int');
$confirm = GETPOST('confirm', 'alpha');
-$projectid = GETPOST('projectid', 'int');
$lineid = GETPOST('lineid', 'int');
$contactid = GETPOST('contactid', 'int');
+$projectid = GETPOST('projectid', 'int');
$rank = (GETPOST('rank', 'int') > 0) ? GETPOST('rank', 'int') : -1;
// PDF
@@ -79,12 +79,6 @@ $hideref = (GETPOST('hideref', 'int') ? GETPOST('hideref', 'int') : (!empty($con
// Nombre de ligne pour choix de produit/service predefinis
$NBLINES = 4;
-// Security check
-if (!empty($user->socid)) {
- $socid = $user->socid;
-}
-$result = restrictedArea($user, 'supplier_proposal', $id);
-
// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
$hookmanager->initHooks(array('supplier_proposalcard', 'globalcard'));
@@ -100,8 +94,9 @@ if ($id > 0 || !empty($ref)) {
if ($ret > 0) {
$ret = $object->fetch_thirdparty();
}
- if ($ret < 0) {
- dol_print_error('', $object->error);
+ if ($ret <= 0) {
+ setEventMessages($object->error, $object->errors, 'errors');
+ $action = '';
}
}
@@ -124,6 +119,12 @@ $permissiondellink = $usercancreate; // Used by the include of actions_dellink.i
$permissiontoedit = $usercancreate; // Used by the include of actions_lineupdown.inc.php
$permissiontoadd = $usercancreate;
+// Security check
+if (!empty($user->socid)) {
+ $socid = $user->socid;
+}
+$result = restrictedArea($user, 'supplier_proposal', $object->id);
+
/*
* Actions
@@ -166,7 +167,7 @@ if (empty($reshook)) {
include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php'; // Must be include, not include_once
// Action clone object
- if ($action == 'confirm_clone' && $confirm == 'yes') {
+ if ($action == 'confirm_clone' && $confirm == 'yes' && $usercancreate) {
if (1 == 0 && !GETPOST('clone_content') && !GETPOST('clone_receivers')) {
setEventMessages($langs->trans("NoCloneOptionsSpecified"), null, 'errors');
} else {
@@ -195,8 +196,11 @@ if (empty($reshook)) {
// Remove line
$result = $object->deleteline($lineid);
// reorder lines
- if ($result) {
+ if ($result > 0) {
$object->line_order(true);
+ } else {
+ $langs->load("errors");
+ setEventMessages($object->error, $object->errors, 'errors');
}
if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
@@ -208,6 +212,9 @@ if (empty($reshook)) {
$outputlangs->setDefaultLang($newlang);
}
$ret = $object->fetch($id); // Reload to get new records
+ if ($ret > 0) {
+ $object->fetch_thirdparty();
+ }
$object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
}
@@ -218,25 +225,25 @@ if (empty($reshook)) {
$result = $object->valid($user);
if ($result >= 0) {
if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
- // Define output language
- if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
- $outputlangs = $langs;
- $newlang = '';
- if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
- $newlang = GETPOST('lang_id', 'aZ09');
- }
- if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
- $newlang = $object->thirdparty->default_lang;
- }
- if (!empty($newlang)) {
- $outputlangs = new Translate("", $conf);
- $outputlangs->setDefaultLang($newlang);
- }
- $model = $object->model_pdf;
- $ret = $object->fetch($id); // Reload to get new records
-
- $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
+ $outputlangs = $langs;
+ $newlang = '';
+ if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
+ $newlang = GETPOST('lang_id', 'aZ09');
}
+ if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
+ $newlang = $object->thirdparty->default_lang;
+ }
+ if (!empty($newlang)) {
+ $outputlangs = new Translate("", $conf);
+ $outputlangs->setDefaultLang($newlang);
+ }
+ $model = $object->model_pdf;
+ $ret = $object->fetch($id); // Reload to get new records
+ if ($ret > 0) {
+ $object->fetch_thirdparty();
+ }
+
+ $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
}
} else {
$langs->load("errors");
@@ -322,6 +329,7 @@ if (empty($reshook)) {
if (!$error) {
if ($origin && $originid) {
+ // Parse element/subelement (ex: project_task)
$element = $subelement = $origin;
if (preg_match('/^([^_]+)_([^_]+)/i', $origin, $regs)) {
$element = $regs[1];
@@ -336,6 +344,15 @@ if (empty($reshook)) {
$element = 'comm/propal';
$subelement = 'propal';
}
+ if ($element == 'contract') {
+ $element = $subelement = 'contrat';
+ }
+ if ($element == 'inter') {
+ $element = $subelement = 'ficheinter';
+ }
+ if ($element == 'shipping') {
+ $element = $subelement = 'expedition';
+ }
$object->origin = $origin;
$object->origin_id = $originid;
@@ -533,6 +550,9 @@ if (empty($reshook)) {
$outputlangs->setDefaultLang($newlang);
}
$ret = $object->fetch($id); // Reload to get new records
+ if ($ret > 0) {
+ $object->fetch_thirdparty();
+ }
$object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
}
} elseif ($action == "setabsolutediscount" && $usercancreate) {
@@ -568,11 +588,13 @@ if (empty($reshook)) {
$ref_supplier = GETPOST('fourn_ref', 'alpha');
- $prod_entry_mode = GETPOST('prod_entry_mode');
- if ($prod_entry_mode == 'free') {
+ $prod_entry_mode = GETPOST('prod_entry_mode', 'aZ09');
+ if ($prod_entry_mode == 'free') {
$idprod = 0;
+ $tva_tx = (GETPOST('tva_tx', 'alpha') ? price2num(preg_replace('/\s*\(.*\)/', '', GETPOST('tva_tx', 'alpha'))) : 0);
} else {
$idprod = GETPOST('idprod', 'int');
+ $tva_tx = '';
}
$tva_tx = (GETPOST('tva_tx') ? GETPOST('tva_tx') : 0); // Can be '1.2' or '1.2 (CODE)'
@@ -581,7 +603,8 @@ if (empty($reshook)) {
$price_ht_devise = price2num(GETPOST('multicurrency_price_ht'), 'CU', 2);
$price_ttc = price2num(GETPOST('price_ttc'), 'MU', 2);
$price_ttc_devise = price2num(GETPOST('multicurrency_price_ttc'), 'CU', 2);
- $qty = price2num(GETPOST('qty'.$predef, 'alpha'), 'MS');
+
+ $qty = price2num(GETPOST('qty'.$predef, 'alpha'), 'MS', 2);
$remise_percent = (GETPOSTISSET('remise_percent'.$predef) ? price2num(GETPOST('remise_percent'.$predef, 'alpha'), '', 2) : 0);
if (empty($remise_percent)) {
@@ -864,6 +887,9 @@ if (empty($reshook)) {
}
$model = $object->model_pdf;
$ret = $object->fetch($id); // Reload to get new records
+ if ($ret > 0) {
+ $object->fetch_thirdparty();
+ }
$result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
if ($result < 0) {
@@ -917,7 +943,7 @@ if (empty($reshook)) {
}
}
} elseif ($action == 'updateline' && $usercancreate && GETPOST('save') == $langs->trans("Save")) {
- // Mise a jour d'une ligne dans la demande de prix
+ // Update a line within proposal
$vat_rate = (GETPOST('tva_tx') ?GETPOST('tva_tx') : 0);
// Define info_bits
@@ -1403,7 +1429,7 @@ if ($action == 'create') {
/*
- * Combobox pour la fonction de copie
+ * Combobox for copy function
*/
if (empty($conf->global->SUPPLIER_PROPOSAL_CLONE_ON_CREATE_PAGE)) {
@@ -1425,7 +1451,7 @@ if ($action == 'create') {
$sql .= " FROM ".MAIN_DB_PREFIX."supplier_proposal p";
$sql .= ", ".MAIN_DB_PREFIX."societe s";
$sql .= " WHERE s.rowid = p.fk_soc";
- $sql .= " AND p.entity = ".$conf->entity;
+ $sql .= " AND p.entityy IN (".getEntity('supplier_proposal').")";
$sql .= " AND p.fk_statut <> ".SupplierProposal::STATUS_DRAFT;
$sql .= " ORDER BY Id";
@@ -1435,8 +1461,8 @@ if ($action == 'create') {
$i = 0;
while ($i < $num) {
$row = $db->fetch_row($resql);
- $askPriceSupplierRefAndSocName = $row [1]." - ".$row [2];
- $liste_ask [$row [0]] = $askPriceSupplierRefAndSocName;
+ $askPriceSupplierRefAndSocName = $row[1]." - ".$row[2];
+ $liste_ask[$row[0]] = $askPriceSupplierRefAndSocName;
$i++;
}
print $form->selectarray("copie_supplier_proposal", $liste_ask, 0);
@@ -1564,39 +1590,28 @@ if ($action == 'create') {
//$morehtmlref.=$form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $usercancreateorder, 'string', '', 0, 1);
//$morehtmlref.=$form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $usercancreateorder, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= $langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'supplier');
+ $morehtmlref .= $object->thirdparty->getNomUrl(1, 'supplier');
if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
$morehtmlref .= ' ('.$langs->trans("OtherProposals").' )';
}
// Project
- if (!empty($conf->project->enabled)) {
+ if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
+ $morehtmlref .= ' ';
if ($usercancreate) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects((empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
@@ -1610,10 +1625,10 @@ if ($action == 'create') {
print '';
print '
';
- print '
';
+ print '';
// Relative and absolute discounts
- if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
+ if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
$filterabsolutediscount = "fk_invoice_supplier_source IS NULL"; // If we want deposit to be substracted to payments only and not to total of final invoice
$filtercreditnote = "fk_invoice_supplier_source IS NOT NULL"; // If we want deposit to be substracted to payments only and not to total of final invoice
} else {
@@ -2003,10 +2018,7 @@ if ($action == 'create') {
}
// Delete
- if (($object->statut == SupplierProposal::STATUS_DRAFT && $usercancreate) || $usercandelete) {
- print '';
- }
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', ($object->statut == SupplierProposal::STATUS_DRAFT && $usercancreate) || $usercandelete);
}
}
diff --git a/htdocs/supplier_proposal/class/supplier_proposal.class.php b/htdocs/supplier_proposal/class/supplier_proposal.class.php
index 7ecd6e0b3a5..221700ee369 100644
--- a/htdocs/supplier_proposal/class/supplier_proposal.class.php
+++ b/htdocs/supplier_proposal/class/supplier_proposal.class.php
@@ -1261,8 +1261,9 @@ class SupplierProposal extends CommonObject
$this->statut_libelle = $obj->statut_label;
$this->datec = $this->db->jdate($obj->datec); // TODO deprecated
$this->datev = $this->db->jdate($obj->datev); // TODO deprecated
- $this->date_creation = $this->db->jdate($obj->datec); //Creation date
- $this->date_validation = $this->db->jdate($obj->datev); //Validation date
+ $this->date_creation = $this->db->jdate($obj->datec); // Creation date
+ $this->date = $this->date_creation;
+ $this->date_validation = $this->db->jdate($obj->datev); // Validation date
$this->date_livraison = $this->db->jdate($obj->delivery_date); // deprecated
$this->delivery_date = $this->db->jdate($obj->delivery_date);
$this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method : null;
diff --git a/htdocs/supplier_proposal/contact.php b/htdocs/supplier_proposal/contact.php
index fde016c78c4..8db19cfb2a7 100644
--- a/htdocs/supplier_proposal/contact.php
+++ b/htdocs/supplier_proposal/contact.php
@@ -31,6 +31,8 @@ require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/supplier_proposal.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
+require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
+require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.dispatch.class.php';
// Load translation files required by the page
$langs->loadLangs(array("propal", "supplier_proposal", "facture", "orders", "sendings", "companies"));
@@ -130,40 +132,28 @@ if ($id > 0 || !empty($ref)) {
$morehtmlref = '';
// Ref supplier
- $morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', 0, 1);
- $morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', null, null, '', 1);
+ //$morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', 0, 1);
+ //$morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= '
'.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= $object->thirdparty->getNomUrl(1);
// Project
if (!empty($conf->project->enabled)) {
$langs->load("projects");
- $morehtmlref .= '
'.$langs->trans('Project').' ';
- if ($permissiontoedit) {
+ $morehtmlref .= '
';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
- $morehtmlref .= ' - '.$proj->title;
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/supplier_proposal/document.php b/htdocs/supplier_proposal/document.php
index 7aacfb8f8b2..c1829fd61d6 100644
--- a/htdocs/supplier_proposal/document.php
+++ b/htdocs/supplier_proposal/document.php
@@ -77,6 +77,7 @@ if ($object->id > 0) {
}
$permissiontoadd = $user->rights->supplier_proposal->creer;
+$usercancreate = $permissiontoadd;
/*
* Actions
@@ -120,37 +121,25 @@ if ($object->id > 0) {
//$morehtmlref.=$form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->fournisseur->commande->creer, 'string', '', 0, 1);
//$morehtmlref.=$form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->fournisseur->commande->creer, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= $langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= $object->thirdparty->getNomUrl(1);
// Project
if (!empty($conf->project->enabled)) {
$langs->load("projects");
- $morehtmlref .= '
'.$langs->trans('Project').' ';
- if ($user->rights->supplier_proposal->creer) {
+ $morehtmlref .= '
';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
$morehtmlref .= ' - '.$proj->title;
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/supplier_proposal/index.php b/htdocs/supplier_proposal/index.php
index a77c4eac47d..40cca19a8b1 100644
--- a/htdocs/supplier_proposal/index.php
+++ b/htdocs/supplier_proposal/index.php
@@ -90,7 +90,7 @@ if ($resql) {
$dataseries = array();
$colorseries = array();
$vals = array();
- // -1=Canceled, 0=Draft, 1=Validated, (2=Accepted/On process not managed for customer orders), 3=Closed (Sent/Received, billed or not)
+ // -1=Canceled, 0=Draft, 1=Validated, (2=Accepted/On process not managed for sales orders), 3=Closed (Sent/Received, billed or not)
while ($i < $num) {
$row = $db->fetch_row($resql);
if ($row) {
diff --git a/htdocs/supplier_proposal/info.php b/htdocs/supplier_proposal/info.php
index d1f0daad639..0b2af861163 100644
--- a/htdocs/supplier_proposal/info.php
+++ b/htdocs/supplier_proposal/info.php
@@ -72,32 +72,22 @@ $morehtmlref = '
';
//$morehtmlref.=$form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->fournisseur->commande->creer, 'string', '', 0, 1);
//$morehtmlref.=$form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->fournisseur->commande->creer, 'string', '', null, null, '', 1);
// Thirdparty
-$morehtmlref .= $langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+$morehtmlref .= $object->thirdparty->getNomUrl(1);
// Project
if (!empty($conf->project->enabled)) {
$langs->load("projects");
- $morehtmlref .= '
'.$langs->trans('Project').' ';
- if ($user->rights->supplier_proposal->creer) {
+ $morehtmlref .= '
';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
$morehtmlref .= ' - '.$proj->title;
}
diff --git a/htdocs/supplier_proposal/list.php b/htdocs/supplier_proposal/list.php
index 5cb7cf69ef8..66ea5cf46ee 100644
--- a/htdocs/supplier_proposal/list.php
+++ b/htdocs/supplier_proposal/list.php
@@ -94,6 +94,7 @@ $search_multicurrency_montant_ht = GETPOST('search_multicurrency_montant_ht', 'a
$search_multicurrency_montant_vat = GETPOST('search_multicurrency_montant_vat', 'alpha');
$search_multicurrency_montant_ttc = GETPOST('search_multicurrency_montant_ttc', 'alpha');
$search_status = GETPOST('search_status', 'int');
+$search_product_category = GETPOST('search_product_category', 'int');
$object_statut = $db->escape(GETPOST('supplier_proposal_statut'));
$search_btn = GETPOST('button_search', 'alpha');
@@ -176,7 +177,7 @@ $arrayfields = array(
'state.nom'=>array('label'=>$langs->trans("StateShort"), 'checked'=>0),
'country.code_iso'=>array('label'=>$langs->trans("Country"), 'checked'=>0),
'typent.code'=>array('label'=>$langs->trans("ThirdPartyType"), 'checked'=>$checkedtypetiers),
- 'sp.date_valid'=>array('label'=>$langs->trans("Date"), 'checked'=>1),
+ 'sp.date_valid'=>array('label'=>$langs->trans("DateValidation"), 'checked'=>1),
'sp.date_livraison'=>array('label'=>$langs->trans("DateEnd"), 'checked'=>1),
'sp.total_ht'=>array('label'=>$langs->trans("AmountHT"), 'checked'=>1),
'sp.total_tva'=>array('label'=>$langs->trans("AmountVAT"), 'checked'=>0),
@@ -216,8 +217,6 @@ if ($reshook < 0) {
setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
}
-$search_product_category = 0;
-
include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
// Do we click on purge search criteria ?
@@ -295,7 +294,7 @@ $help_url = 'EN:Ask_Price_Supplier|FR:Demande_de_prix_fournisseur';
llxHeader('', $title, $help_url);
$sql = 'SELECT';
-if ($sall || $search_product_category > 0 || $search_user > 0) {
+if ($sall || $search_user > 0) {
$sql = 'SELECT DISTINCT';
}
$sql .= ' s.rowid as socid, s.nom as name, s.name_alias as alias, s.town, s.zip, s.fk_pays, s.client, s.code_client,';
@@ -327,12 +326,9 @@ $sql .= ', '.MAIN_DB_PREFIX.'supplier_proposal as sp';
if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (sp.rowid = ef.fk_object)";
}
-if ($sall || $search_product_category > 0) {
+if ($sall) {
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'supplier_proposaldet as pd ON sp.rowid=pd.fk_supplier_proposal';
}
-if ($search_product_category > 0) {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_product as cp ON cp.fk_product=pd.fk_product';
-}
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'user as u ON sp.fk_user_author = u.rowid';
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet as p ON p.rowid = sp.fk_projet";
// We'll need this table joined to the select in order to filter by sale
@@ -426,6 +422,36 @@ if ($search_sale > 0) {
if ($search_user > 0) {
$sql .= " AND c.fk_c_type_contact = tc.rowid AND tc.element='supplier_proposal' AND tc.source='internal' AND c.element_id = sp.rowid AND c.fk_socpeople = ".((int) $search_user);
}
+// Search for tag/category ($searchCategoryProductList is an array of ID)
+$searchCategoryProductOperator = -1;
+$searchCategoryProductList = array($search_product_category);
+if (!empty($searchCategoryProductList)) {
+ $searchCategoryProductSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategoryProductList as $searchCategoryProduct) {
+ if (intval($searchCategoryProduct) == -2) {
+ $searchCategoryProductSqlList[] = "NOT EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."supplier_proposaldet as sd WHERE sd.fk_supplier_proposal = sp.rowid AND sd.fk_product = ck.fk_product)";
+ } elseif (intval($searchCategoryProduct) > 0) {
+ if ($searchCategoryProductOperator == 0) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."supplier_proposaldet as sd WHERE sd.fk_supplier_proposal = sp.rowid AND sd.fk_product = ck.fk_product AND ck.fk_categorie = ".((int) $searchCategoryProduct).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProduct);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."supplier_proposaldet as sd WHERE sd.fk_supplier_proposal = sp.rowid AND sd.fk_product = ck.fk_product AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategoryProductOperator == 1) {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryProductSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
+ }
+ }
+}
// Add where from extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
// Add where from hooks
@@ -668,7 +694,7 @@ if ($resql) {
}
$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
- $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
+ $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
if ($massactionbutton) {
$selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
}
@@ -677,6 +703,13 @@ if ($resql) {
print '
'."\n";
print '';
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons('left');
+ print $searchpicto;
+ print ' ';
+ }
if (!empty($arrayfields['sp.ref']['checked'])) {
print '';
print ' ';
@@ -816,15 +849,20 @@ if ($resql) {
print ' ';
}
// Action column
- print '';
- $searchpicto = $form->showFilterButtons();
- print $searchpicto;
- print ' ';
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons();
+ print $searchpicto;
+ print ' ';
+ }
print " \n";
// Fields title
print '';
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
+ }
if (!empty($arrayfields['sp.ref']['checked'])) {
print_liste_field_titre($arrayfields['sp.ref']['label'], $_SERVER["PHP_SELF"], 'sp.ref', '', $param, '', $sortfield, $sortorder);
}
@@ -897,7 +935,9 @@ if ($resql) {
if (!empty($arrayfields['sp.fk_statut']['checked'])) {
print_liste_field_titre($arrayfields['sp.fk_statut']['label'], $_SERVER["PHP_SELF"], "sp.fk_statut", "", $param, '', $sortfield, $sortorder, 'right ');
}
- print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
+ }
print ' '."\n";
$now = dol_now();
@@ -927,7 +967,18 @@ if ($resql) {
$companystatic->code_client = $obj->code_client;
print '';
-
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->rowid, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
if (!empty($arrayfields['sp.ref']['checked'])) {
print '';
@@ -1121,7 +1172,7 @@ if ($resql) {
$userstatic->id = $obj->fk_user_author;
$userstatic->login = $obj->login;
- $userstatic->status = $obj->status;
+ $userstatic->status = $obj->ustatus;
$userstatic->lastname = $obj->name;
$userstatic->firstname = $obj->firstname;
$userstatic->photo = $obj->photo;
@@ -1177,15 +1228,17 @@ if ($resql) {
}
// Action column
- print ' ';
- if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
- $selected = 0;
- if (in_array($obj->rowid, $arrayofselected)) {
- $selected = 1;
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print ' ';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->rowid, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
}
- print ' ';
+ print ' ';
}
- print '';
if (!$i) {
$totalarray['nbfield']++;
}
@@ -1201,6 +1254,17 @@ if ($resql) {
// Show total line
include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
+ // If no record found
+ if ($num == 0) {
+ $colspan = 1;
+ foreach ($arrayfields as $key => $val) {
+ if (!empty($val['checked'])) {
+ $colspan++;
+ }
+ }
+ print ' '.$langs->trans("NoRecordFound").' ';
+ }
+
$db->free($resql);
$parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
diff --git a/htdocs/supplier_proposal/note.php b/htdocs/supplier_proposal/note.php
index 118855cecf3..aa0ccc5276a 100644
--- a/htdocs/supplier_proposal/note.php
+++ b/htdocs/supplier_proposal/note.php
@@ -21,9 +21,9 @@
*/
/**
- * \file htdocs/comm/propal/note.php
+ * \file htdocs/supplier_proposal/note.php
* \ingroup propal
- * \brief Fiche d'information sur une proposition commerciale
+ * \brief Page to show notes of a supplier proposal request
*/
// Load Dolibarr environment
@@ -53,6 +53,8 @@ $result = restrictedArea($user, 'supplier_proposal', $id, 'supplier_proposal');
$object = new SupplierProposal($db);
+$usercancreate = $user->hasRight("supplier_propal", "write");
+
/*
@@ -104,37 +106,25 @@ if ($id > 0 || !empty($ref)) {
//$morehtmlref.=$form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->fournisseur->commande->creer, 'string', '', 0, 1);
//$morehtmlref.=$form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->fournisseur->commande->creer, 'string', '', null, null, '', 1);
// Thirdparty
- $morehtmlref .= $langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
+ $morehtmlref .= $object->thirdparty->getNomUrl(1);
// Project
if (!empty($conf->project->enabled)) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project').' ';
- if ($user->rights->supplier_proposal->creer) {
+ $morehtmlref .= ' ';
+ if ($usercancreate) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
$proj = new Project($db);
$proj->fetch($object->fk_project);
- $morehtmlref .= ' : '.$proj->getNomUrl(1);
+ $morehtmlref .= $proj->getNomUrl(1);
if ($proj->title) {
$morehtmlref .= ' - '.$proj->title;
}
- } else {
- $morehtmlref .= '';
}
}
}
diff --git a/htdocs/takepos/admin/appearance.php b/htdocs/takepos/admin/appearance.php
index 250606703af..54ed2f642a2 100644
--- a/htdocs/takepos/admin/appearance.php
+++ b/htdocs/takepos/admin/appearance.php
@@ -115,7 +115,7 @@ print '';
print $langs->trans("NumberOfLinesToShow");
print ' ';
$array = array(1=>"1", 2=>"2", 3=>"3", 4=>"4", 5=>"5", 6=>"6");
-print $form->selectarray('TAKEPOS_LINES_TO_SHOW', $array, (empty($conf->global->TAKEPOS_LINES_TO_SHOW) ? '2' : $conf->global->TAKEPOS_LINES_TO_SHOW), 0);
+print $form->selectarray('TAKEPOS_LINES_TO_SHOW', $array, getDolGlobalInt('TAKEPOS_LINES_TO_SHOW', 2), 0);
print " \n";
// D'ont display category
diff --git a/htdocs/takepos/admin/receipt.php b/htdocs/takepos/admin/receipt.php
index bcf0a853705..1cfe141478d 100644
--- a/htdocs/takepos/admin/receipt.php
+++ b/htdocs/takepos/admin/receipt.php
@@ -93,75 +93,6 @@ print '';
print ' ';
-print load_fiche_titre($langs->trans("PrintMethod"), '', '');
-
-print '';
-
-
print load_fiche_titre($langs->trans("Receipt"), '', '');
print '';
@@ -285,6 +216,13 @@ print $form->buttonsSaveCancel("Save", '');
print "\n";
+print load_fiche_titre($langs->trans("Preview"), '', '');
+print '
';
+print '
';
+print '';
+print ' ';
+print '';
+
print '
';
llxFooter();
diff --git a/htdocs/takepos/admin/terminal.php b/htdocs/takepos/admin/terminal.php
index eb43455216c..fe03139c8a3 100644
--- a/htdocs/takepos/admin/terminal.php
+++ b/htdocs/takepos/admin/terminal.php
@@ -79,7 +79,7 @@ if (GETPOST('action', 'alpha') == 'set') {
$res = dolibarr_set_const($db, "CASHDESK_ID_BANKACCOUNT_CASH".$terminaltouse, (GETPOST('CASHDESK_ID_BANKACCOUNT_CASH'.$terminaltouse, 'alpha') > 0 ? GETPOST('CASHDESK_ID_BANKACCOUNT_CASH'.$terminaltouse, 'alpha') : ''), 'chaine', 0, '', $conf->entity);
$res = dolibarr_set_const($db, "CASHDESK_ID_BANKACCOUNT_CHEQUE".$terminaltouse, (GETPOST('CASHDESK_ID_BANKACCOUNT_CHEQUE'.$terminaltouse, 'alpha') > 0 ? GETPOST('CASHDESK_ID_BANKACCOUNT_CHEQUE'.$terminaltouse, 'alpha') : ''), 'chaine', 0, '', $conf->entity);
$res = dolibarr_set_const($db, "CASHDESK_ID_BANKACCOUNT_CB".$terminaltouse, (GETPOST('CASHDESK_ID_BANKACCOUNT_CB'.$terminaltouse, 'alpha') > 0 ? GETPOST('CASHDESK_ID_BANKACCOUNT_CB'.$terminaltouse, 'alpha') : ''), 'chaine', 0, '', $conf->entity);
- if (!empty($conf->stripe->enabled) && !empty($conf->global->STRIPE_CARD_PRESENT)) {
+ if (isModEnabled('stripe') && !empty($conf->global->STRIPE_CARD_PRESENT)) {
$res = dolibarr_set_const($db, "CASHDESK_ID_BANKACCOUNT_STRIPETERMINAL".$terminaltouse, GETPOST('CASHDESK_ID_BANKACCOUNT_STRIPETERMINAL'.$terminaltouse, 'alpha'), 'chaine', 0, '', $conf->entity);
}
if (getDolGlobalInt('TAKEPOS_ENABLE_SUMUP')) {
@@ -189,7 +189,7 @@ if (isModEnabled("banque")) {
}
print '';
- if (!empty($conf->stripe->enabled) && !empty($conf->global->STRIPE_CARD_PRESENT)) {
+ if (isModEnabled('stripe') && !empty($conf->global->STRIPE_CARD_PRESENT)) {
print '
'.$langs->trans("CashDeskBankAccountForStripeTerminal").' '; // Force Stripe Terminal
print '';
$service = 'StripeTest';
@@ -201,7 +201,7 @@ if (isModEnabled("banque")) {
global $stripearrayofkeysbyenv;
$site_account = $stripearrayofkeysbyenv[$servicestatus]['secret_key'];
\Stripe\Stripe::setApiKey($site_account);
- if (!empty($conf->stripe->enabled) && (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'alpha'))) {
+ if (isModEnabled('stripe') && (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'alpha'))) {
$service = 'StripeTest';
$servicestatus = '0';
dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode', 'Stripe'), '', 'warning');
@@ -338,7 +338,7 @@ if (getDolGlobalString('TAKEPOS_PRINT_METHOD') == "receiptprinter" || getDolGlob
print ' '.$langs->trans('CashDeskReaderKeyCodeForEnter').' ';
print '';
-print ' ';
+print ' ';
print ' ';
// Numbering module
@@ -414,7 +414,7 @@ $htmltext .= '';
print '
';
print load_fiche_titre($langs->trans('FreeLegalTextOnInvoices'), '', '');
-print '
';
+print '
';
print '
';
print '';
print ''.$langs->trans("Parameters").' '.$langs->trans('Value').' ';
diff --git a/htdocs/takepos/ajax/ajax.php b/htdocs/takepos/ajax/ajax.php
index 1ee27c51f8b..db6b224466c 100644
--- a/htdocs/takepos/ajax/ajax.php
+++ b/htdocs/takepos/ajax/ajax.php
@@ -84,6 +84,10 @@ if ($action == 'getProducts') {
}
unset($prod->fields);
unset($prod->db);
+
+ $prod->price_formated = price(price2num($prod->price, 'MT'), 1, $langs, 1, -1, -1, $conf->currency);
+ $prod->price_ttc_formated = price(price2num($prod->price_ttc, 'MT'), 1, $langs, 1, -1, -1, $conf->currency);
+
$res[] = $prod;
}
}
@@ -157,7 +161,7 @@ if ($action == 'getProducts') {
if (isset($barcode_value_list['ref'])) {
// search product from reference
- $sql = "SELECT rowid, ref, label, tosell, tobuy, barcode, price";
+ $sql = "SELECT rowid, ref, label, tosell, tobuy, barcode, price, price_ttc";
$sql .= " FROM " . $db->prefix() . "product as p";
$sql .= " WHERE entity IN (" . getEntity('product') . ")";
$sql .= " AND ref = '" . $db->escape($barcode_value_list['ref']) . "'";
@@ -206,6 +210,7 @@ if ($action == 'getProducts') {
'tobuy' => $obj->tobuy,
'barcode' => $obj->barcode,
'price' => $obj->price,
+ 'price_ttc' => $obj->price_ttc,
'object' => 'product',
'img' => $ig,
'qty' => $qty,
@@ -222,7 +227,7 @@ if ($action == 'getProducts') {
}
}
- $sql = 'SELECT p.rowid, p.ref, p.label, p.tosell, p.tobuy, p.barcode, p.price' ;
+ $sql = 'SELECT p.rowid, p.ref, p.label, p.tosell, p.tobuy, p.barcode, p.price, p.price_ttc' ;
if (getDolGlobalInt('TAKEPOS_PRODUCT_IN_STOCK') == 1) {
$sql .= ', ps.reel';
}
@@ -298,10 +303,12 @@ if ($action == 'getProducts') {
'tobuy' => $obj->tobuy,
'barcode' => $obj->barcode,
'price' => $obj->price,
+ 'price_ttc' => $obj->price_ttc,
'object' => 'product',
'img' => $ig,
'qty' => 1,
- //'price_formated' => price(price2num($obj->price, 'MU'), 1, $langs, 1, -1, -1, $conf->currency)
+ 'price_formated' => price(price2num($obj->price, 'MT'), 1, $langs, 1, -1, -1, $conf->currency),
+ 'price_ttc_formated' => price(price2num($obj->price_ttc, 'MT'), 1, $langs, 1, -1, -1, $conf->currency)
);
// Add entries to row from hooks
$parameters=array();
diff --git a/htdocs/takepos/css/pos.css.php b/htdocs/takepos/css/pos.css.php
index 1ffe5c63db3..6f72fa6e7f2 100644
--- a/htdocs/takepos/css/pos.css.php
+++ b/htdocs/takepos/css/pos.css.php
@@ -477,7 +477,7 @@ p.description_content{
div.description_content {
display: -webkit-box;
-webkit-box-orient: vertical;
- -webkit-line-clamp: global->TAKEPOS_LINES_TO_SHOW; ?>;
+ -webkit-line-clamp: ;
overflow: hidden;
padding-left: 2px;
padding-right: 2px;
@@ -554,6 +554,7 @@ div.description_content {
padding: 7px 4px 7px 4px;
margin: 8px;
margin-left: 4px;
+ border-radius: 3px;
}
.topnav-left a:hover, .topnav .login_block_other a:hover {
background-color: #ddd;
@@ -580,6 +581,14 @@ div#moreinfo, div#infowarehouse {
padding: 0 8px 0 8px;
}
+.basketselected {
+ font-weight: bold;
+ /* text-decoration: underline; */
+}
+.basketnotselected {
+ opacity: 0.8;
+}
+
.productprice {
position: absolute;
top: 5px;
@@ -587,11 +596,11 @@ div#moreinfo, div#infowarehouse {
background: var(--colorbackhmenu1);
color: var(--colortextbackhmenu);
font-size: 2em;
- padding: 5px;
+ padding: 4px;
border-radius: 2px;
opacity: 0.9;
- padding-left: 8px;
- padding-right: 8px;
+ padding-left: 6px;
+ padding-right: 6px;
}
@@ -825,3 +834,211 @@ div#moreinfo, div#infowarehouse {
display: table;
clear: both;
}
+
+.div5 .imgadd {
+ display: none;
+}
+
+@media screen and (max-width: 767px) {
+ .div4 {
+ height: auto;
+ width: 100%;
+ float: left;
+ box-sizing: border-box;
+ font-size: 6px;
+ padding-top: 10px;
+ padding-bottom: 2px;
+ margin-left: 2px;
+ }
+
+ .div4 .wrapper.divempty, .div4 img, .div4 .wrapper:nth-last-child(1), .div4 .wrapper:nth-last-child(2), #prodiv22, #prodiv23, .catwatermark {
+ display: none!important;
+ }
+
+ .tab-category {
+ float: left;
+ position: relative;
+ width: 25%;
+ height: 33%;
+ margin: 0;
+ padding: 1px;
+ border: 2px solid #EEE;
+ text-align: center;
+ box-sizing: border-box;
+ background-color: #fff;
+ }
+
+ .div4 .wrapper, .tab-category {
+ width: auto;
+ height: auto;
+ padding: 6px;
+ text-align: center;
+ cursor: pointer;
+ border: 1px solid #FFF!important;
+ border-top: 3px solid #FFF!important;
+ }
+
+ .div4 .tab-category.active {
+ border-right: 1px solid #CCC !important;
+ border-left: 1px solid #CCC !important;
+ border-top: 3px solid var(--colorbackhmenu1) !important;
+ }
+
+ .div5 {
+ height: 100%;
+ width: 100%;
+ padding-top: 0px;
+ }
+
+ div.description {
+ position: initial;
+ width: auto;
+ background-color: black;
+ opacity: 1;
+ text-align: center;
+ padding-top: 0px;
+ background: -webkit-linear-gradient(top, rgba(250,250,250,0), rgba(250,250,250,0.5), rgba(250,250,250,0.95), rgba(250,250,250,1));
+ }
+
+ .div5 .description .description_content {
+ font-weight: bold;
+ font-size: 14px;
+ padding-left: 10px;
+ }
+
+ .div5 .wrapper2 {
+ width: 100%;
+ display: inline-flex;
+ align-items: center;
+ padding: 10px;
+ }
+
+ .div5 .wrapper2.divempty {
+ display: none;
+ }
+
+ div.wrapper2 {
+ float: none;
+ }
+
+ .div5 .arrow {
+ width: auto;
+ height: auto;
+ display: none!important;
+ }
+
+ .div5 .arrow .centerinmiddle {
+ transform: translate(0, 0);
+ }
+
+ .div5 .imgadd {
+ display: flex;
+ }
+
+ div.wrapper2{
+ height:10%;
+ }
+}
+
+.arrows {
+ display: none;
+ position: absolute;
+ justify-content: space-between;
+ width: 100%;
+}
+
+.indicator {
+ background: #00000042;
+ padding: 15px 5px;
+ cursor: pointer;
+}
+
+.indicator:hover {
+ background: #000000;
+}
+
+.indicator i {
+ color: white;
+}
+
+.topnav-left {
+ margin-left: 20px;
+}
+
+.topnav-right {
+ margin-right: 20px;
+}
+
+/* For Header Scroll */
+html {
+ scroll-behavior: smooth;
+}
+
+.topnav {
+ scroll-behavior: smooth;
+}
+
+.header {
+ height: unset;
+}
+
+.topnav {
+ width: 100%;
+ white-space: nowrap;
+ overflow-x: scroll;
+ display: inline-flex;
+}
+
+.topnav-left {
+ white-space: nowrap;
+ float: none;
+ margin-right: auto;
+ align-items: center;
+}
+
+.topnav-right {
+ display: flex;
+ white-space: nowrap;
+ float: none;
+ align-items: center;
+}
+
+.topnav-left #shoppingcart {
+ display:inline-flex;
+}
+
+.topnav-right .login_block_other {
+ display: flex;
+ white-space: nowrap;
+}
+
+::-webkit-scrollbar {
+ width: 8px;
+}
+
+
+::-webkit-scrollbar-track {
+ background: #f1f1f1;
+}
+
+
+::-webkit-scrollbar-thumb {
+ background: #888;
+}
+
+.topnav::-webkit-scrollbar-track{
+ background: #eeeeee;
+}
+
+.topnav::-webkit-scrollbar{
+ width: 1px;
+ background: #F5F5F5;
+}
+
+.topnav::-webkit-scrollbar-thumb{
+ background: #f9171700;
+}
+
+.topnav.overflow .arrows {
+ display: flex;
+}
\ No newline at end of file
diff --git a/htdocs/takepos/index.php b/htdocs/takepos/index.php
index c43d0ec092f..dc2bd8b684a 100644
--- a/htdocs/takepos/index.php
+++ b/htdocs/takepos/index.php
@@ -367,7 +367,7 @@ function LoadProducts(position, issubcat) {
?>
if (data[parseInt(idata)]['price_formated']) {
$("#proprice"+ishow).attr("class", "productprice");
- $("#proprice"+ishow).html(data[parseInt(idata)]['price_formated']);
+ $("#proprice"+ishow).html(data[parseInt(idata)]['price_ttc_formated']);
}
console.log("#prodiv"+ishow+".data(rowid)="+data[idata]['id']);
console.log($("#prodiv"+ishow));
@@ -449,7 +449,7 @@ function MoreProducts(moreorless) {
$("#probutton"+ishow).show();
if (data[parseInt(idata)]['price_formated']) {
$("#proprice"+ishow).attr("class", "productprice");
- $("#proprice"+ishow).html(data[parseInt(idata)]['price_formated']);
+ $("#proprice"+ishow).html(data[parseInt(idata)]['price_ttc_formated']);
}
$("#proimg"+ishow).attr("src","genimg/index.php?query=pro&id="+data[idata]['id']);
$("#prodiv"+ishow).data("rowid",data[idata]['id']);
@@ -583,11 +583,14 @@ function New() {
/**
* Search products
*
- * @param {int} keyCodeForEnter Key code for "enter"
- * return {void}
+ * @param string keyCodeForEnter Key code for "enter" or '' if not
+ * @param int moreorless ??
+ * return void
*/
function Search2(keyCodeForEnter, moreorless) {
- console.log("Search2 Call ajax search to replace products keyCodeForEnter="+keyCodeForEnter);
+ var eventKeyCode = window.event.keyCode;
+
+ console.log("Search2 Call ajax search to replace products keyCodeForEnter="+keyCodeForEnter+", eventKeyCode="+eventKeyCode);
var search_term = $('#search').val();
var search_start = 0;
@@ -597,6 +600,8 @@ function Search2(keyCodeForEnter, moreorless) {
search_start = $('#search_start_'+moreorless).val();
}
+ console.log("search_term="+search_term);
+
if (search_term == '') {
$("[id^=prowatermark]").html("");
$("[id^=prodesc]").text("");
@@ -610,20 +615,19 @@ function Search2(keyCodeForEnter, moreorless) {
}
var search = false;
- var eventKeyCode = window.event.keyCode;
if (keyCodeForEnter == '' || eventKeyCode == keyCodeForEnter) {
search = true;
}
if (search === true) {
-
- // temporization time to give time to type
+ // if a timer has been already started (search2_timer is a global js variable), we cancel it now
+ // we click onto another key, we will restart another timer just after
if (search2_timer) {
clearTimeout(search2_timer);
}
+ // temporization time to give time to type
search2_timer = setTimeout(function(){
-
pageproducts = 0;
jQuery(".wrapper2 .catwatermark").hide();
var nbsearchresults = 0;
@@ -656,7 +660,7 @@ function Search2(keyCodeForEnter, moreorless) {
$("#probutton" + i).show();
if (data[i]['price_formated']) {
$("#proprice" + i).attr("class", "productprice");
- $("#proprice" + i).html(data[i]['price_formated']);
+ $("#proprice" + i).html(data[i]['price_ttc_formated']);
}
$("#proimg" + i).attr("title", titlestring);
if( undefined !== data[i]['img']) {
@@ -695,8 +699,8 @@ function Search2(keyCodeForEnter, moreorless) {
if (data.length == 0) {
$('#search').val('load('errors');
- echo dol_escape_js($langs->trans("ErrorRecordNotFound"));
- ?>');
+ echo dol_escape_js($langs->transnoentitiesnoconv("ErrorRecordNotFoundShort"));
+ ?> ('+search_term+')');
$('#search').select();
}
else ClearSearch();
@@ -938,6 +942,65 @@ $( document ).ready(function() {
}
}
?>
+
+ /* For Header Scroll */
+ var elem1 = $("#topnav-left")[0];
+ var elem2 = $("#topnav-right")[0];
+ var checkOverflow = function() {
+ if (scrollBars().horizontal) $("#topnav").addClass("overflow");
+ else $("#topnav").removeClass("overflow");
+ }
+
+ var scrollBars = function(){
+ var container= $('#topnav')[0];
+ return {
+ vertical:container.scrollHeight > container.clientHeight,
+ horizontal:container.scrollWidth > container.clientWidth
+ };
+ }
+
+ $(window).resize(function(){
+ checkOverflow();
+ });
+
+ let resizeObserver = new ResizeObserver(() => {
+ checkOverflow();
+ });
+ resizeObserver.observe(elem1);
+ resizeObserver.observe(elem2);
+ checkOverflow();
+
+ var pressTimer = [];
+ var direction = 1;
+ var step = 200;
+
+ $(".indicator").mousedown(function(){
+ direction = $(this).hasClass("left") ? -1 : 1;
+ scrollTo();
+ pressTimer.push(setInterval(scrollTo, 100));
+ });
+
+ $(".indicator").mouseup(function(){
+ pressTimer.forEach(clearInterval);
+ });
+
+ $("body").mouseup(function(){
+ pressTimer.forEach(clearInterval);
+ console.log("body");
+ });
+
+ function scrollTo(){
+ console.log("here");
+ var pos = $("#topnav").scrollLeft();
+ document.getElementById("topnav").scrollTo({ left: $("#topnav").scrollLeft() + direction * step, behavior: 'smooth' })
+ }
+
+ $("#topnav").scroll(function(){
+ if (($("#topnav").offsetWidth + $("#topnav").scrollLeft >= $("#topnav").scrollWidth)) {
+ console.log("end");
+ }
+ });
+ /* End Header Scroll */
});
@@ -950,8 +1013,8 @@ $keyCodeForEnter = getDolGlobalInt('CASHDESK_READER_KEYCODE_FOR_ENTER'.$_SESSION
if (empty($conf->global->TAKEPOS_HIDE_HEAD_BAR)) {
?>
';
print '
';
@@ -1413,12 +1405,12 @@ if ($action == 'create' || $action == 'presend') {
if (empty($reshook)) {
// Email
if (isset($object->status) && $object->status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage") {
- print dolGetButtonAction('', $langs->trans('SendMail'), 'default', $_SERVER["PHP_SELF"].'?action=presend_addmessage&send_email=1&private_message=0&mode=init&token='.newToken().'&track_id='.$object->track_id, '');
+ print dolGetButtonAction('', $langs->trans('SendMail'), 'default', $_SERVER["PHP_SELF"].'?action=presend_addmessage&send_email=1&private_message=0&mode=init&token='.newToken().'&track_id='.$object->track_id.'#formmailbeforetitle', '');
}
// Show link to add a message (if read and not closed)
if (isset($object->status) && $object->status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage") {
- print dolGetButtonAction('', $langs->trans('TicketAddMessage'), 'default', $_SERVER["PHP_SELF"].'?action=presend_addmessage&mode=init&token='.newToken().'&track_id='.$object->track_id, '');
+ print dolGetButtonAction('', $langs->trans('TicketAddMessage'), 'default', $_SERVER["PHP_SELF"].'?action=presend_addmessage&mode=init&token='.newToken().'&track_id='.$object->track_id.'#formmailbeforetitle', '');
}
// Link to create an intervention
@@ -1564,7 +1556,7 @@ if ($action == 'create' || $action == 'presend') {
// List of all actions
$filters = array();
$filters['search_agenda_label'] = $search_agenda_label;
- show_ticket_messaging($conf, $langs, $db, $object, null, 0, $actioncode, '', $filters, $sortfield, $sortorder);
+ show_actions_messaging($conf, $langs, $db, $object, null, 0, $actioncode, '', $filters, $sortfield, $sortorder);
}
if ($action != 'presend' && $action != 'presend_addmessage' && $action != 'add_message') {
diff --git a/htdocs/ticket/class/actions_ticket.class.php b/htdocs/ticket/class/actions_ticket.class.php
index 9a01c5cf7d2..c5e267fddf6 100644
--- a/htdocs/ticket/class/actions_ticket.class.php
+++ b/htdocs/ticket/class/actions_ticket.class.php
@@ -164,7 +164,7 @@ class ActionsTicket
} elseif ($action == 'view') {
return $langs->trans("TicketCard");
} elseif ($action == 'add_message') {
- return $langs->trans("AddMessage");
+ return $langs->trans("TicketAddMessage");
} else {
return $langs->trans("TicketsManagement");
}
@@ -199,7 +199,7 @@ class ActionsTicket
print ' ';
print $langs->trans("InitialMessage");
print ' ';
- if ($user->rights->ticket->manage) {
+ if ($user->hasRight("ticket", "manage")) {
print ''.img_edit($langs->trans('Modify')).' ';
}
print ' ';
diff --git a/htdocs/ticket/class/api_tickets.class.php b/htdocs/ticket/class/api_tickets.class.php
index 2fd77693984..e7930569bdd 100644
--- a/htdocs/ticket/class/api_tickets.class.php
+++ b/htdocs/ticket/class/api_tickets.class.php
@@ -181,36 +181,6 @@ class Tickets extends DolibarrApi
$this->ticket->messages = $messages;
}
- // History
- $history = array();
- $this->ticket->loadCacheLogsTicket();
- if (is_array($this->ticket->cache_logs_ticket) && count($this->ticket->cache_logs_ticket) > 0) {
- $num = count($this->ticket->cache_logs_ticket);
- $i = 0;
- $user_action = new User($this->db);
-
- while ($i < $num) {
- $userstring = '';
- if ($this->ticket->cache_logs_ticket[$i]['fk_user_create'] > 0) {
- $user_action->fetch($this->ticket->cache_logs_ticket[$i]['fk_user_create']);
-
- $userstring = dolGetFirstLastname($user_action->firstname, $user_action->lastname);
- }
-
- // Now define messages
- $history[] = array(
- 'id' => $this->ticket->cache_logs_ticket[$i]['id'],
- 'fk_user_author' => $this->ticket->cache_msgs_ticket[$i]['fk_user_author'],
- 'fk_user_action' => $this->ticket->cache_logs_ticket[$i]['fk_user_create'],
- 'fk_user_action_string' => $userstring,
- 'message' => $this->ticket->cache_logs_ticket[$i]['message'],
- 'datec' => $this->ticket->cache_logs_ticket[$i]['datec'],
- );
- $i++;
- }
- $this->ticket->history = $history;
- }
-
if (!DolibarrApi::_checkAccessToResource('ticket', $this->ticket->id)) {
throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
}
@@ -246,6 +216,7 @@ class Tickets extends DolibarrApi
$socid = DolibarrApiAccess::$user->socid;
}
+ $search_sale = null;
// If the internal user must only see his customers, force searching by him
$search_sale = 0;
if (!DolibarrApiAccess::$user->rights->societe->client->voir && !$socid) {
diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php
index 42ffa662246..440950628d1 100644
--- a/htdocs/ticket/class/ticket.class.php
+++ b/htdocs/ticket/class/ticket.class.php
@@ -1580,144 +1580,6 @@ class Ticket extends CommonObject
}
}
-
- /**
- * Send notification of changes by email
- *
- * @param User $user User that create
- * @param string $message Log message
- * @return int <0 if KO, >0 if OK (number of emails sent)
- */
- private function sendLogByEmail($user, $message)
- {
- global $conf, $langs;
-
- $nb_sent = 0;
-
- $langs->load('ticket');
-
- // Retrieve email of all contacts (internal and external)
- $contacts = $this->listeContact(-1, 'internal');
- $contacts = array_merge($contacts, $this->listeContact(-1, 'external'));
-
- /* If origin_email and no socid, we add email to the list * */
- if (!empty($this->origin_email) && empty($this->fk_soc)) {
- $array_ext = array(array('firstname' => '', 'lastname' => '', 'email' => $this->origin_email, 'libelle' => $langs->transnoentities('TicketEmailOriginIssuer'), 'socid' => "-1"));
- $contacts = array_merge($contacts, $array_ext);
- }
-
- if (!empty($this->fk_soc)) {
- $this->fetch_thirdparty($this->fk_soc);
- $array_company = array(array('firstname' => '', 'lastname' => $this->client->name, 'email' => $this->client->email, 'libelle' => $langs->transnoentities('Customer'), 'socid' => $this->client->id));
- $contacts = array_merge($contacts, $array_company);
- }
-
- // foreach contact send email with notification message
- if (count($contacts) > 0) {
- foreach ($contacts as $key => $info_sendto) {
- $tmpmessage = '';
- $subject = '['.$conf->global->MAIN_INFO_SOCIETE_NOM.'] '.$langs->transnoentities('TicketNotificationEmailSubject', $this->track_id);
- $tmpmessage .= $langs->transnoentities('TicketNotificationEmailBody', $this->track_id)."\n\n";
- $tmpmessage .= $langs->transnoentities('Title').' : '.$this->subject."\n";
-
- $recipient_name = dolGetFirstLastname($info_sendto['firstname'], $info_sendto['lastname'], '-1');
- $recipient = (!empty($recipient_name) ? $recipient_name : $info_sendto['email']).' ('.strtolower($info_sendto['libelle']).')';
- $tmpmessage .= $langs->transnoentities('TicketNotificationRecipient').' : '.$recipient."\n";
- $tmpmessage .= "\n";
- $tmpmessage .= '* '.$langs->transnoentities('TicketNotificationLogMessage').' *'."\n";
- $tmpmessage .= dol_html_entity_decode($message, ENT_QUOTES | ENT_HTML5)."\n";
-
- if ($info_sendto['source'] == 'internal') {
- $url_internal_ticket = dol_buildpath('/ticket/card.php', 2).'?track_id='.$this->track_id;
- $tmpmessage .= "\n".$langs->transnoentities('TicketNotificationEmailBodyInfosTrackUrlinternal').' :
'.$this->track_id.' '."\n";
- } else {
- $url_public_ticket = ($conf->global->TICKET_URL_PUBLIC_INTERFACE ? $conf->global->TICKET_URL_PUBLIC_INTERFACE.'/view.php' : dol_buildpath('/public/ticket/view.php', 2)).'?track_id='.$this->track_id;
- $tmpmessage .= "\n".$langs->transnoentities('TicketNewEmailBodyInfosTrackUrlCustomer').' :
'.$this->track_id.' '."\n";
- }
-
- $tmpmessage .= "\n";
- $tmpmessage .= $langs->transnoentities('TicketEmailPleaseDoNotReplyToThisEmail')."\n";
-
- $from = $conf->global->MAIN_INFO_SOCIETE_NOM.'<'.$conf->global->TICKET_NOTIFICATION_EMAIL_FROM.'>';
- $replyto = $from;
-
- // Init to avoid errors
- $filepath = array();
- $filename = array();
- $mimetype = array();
-
- $tmpmessage = dol_nl2br($tmpmessage);
-
- if (!empty($conf->global->TICKET_DISABLE_MAIL_AUTOCOPY_TO)) {
- $old_MAIN_MAIL_AUTOCOPY_TO = $conf->global->MAIN_MAIL_AUTOCOPY_TO;
- $conf->global->MAIN_MAIL_AUTOCOPY_TO = '';
- }
- include_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
- $sendtocc = '';
- $deliveryreceipt = 0;
- $mailfile = new CMailFile($subject, $info_sendto['email'], $from, $tmpmessage, $filepath, $mimetype, $filename, $sendtocc, '', $deliveryreceipt, 0);
- if ($mailfile->error || !empty($mailfile->errors)) {
- setEventMessages($mailfile->error, $mailfile->errors, 'errors');
- } else {
- $result = $mailfile->sendfile();
- if ($result > 0) {
- $nb_sent++;
- }
- }
- if (!empty($conf->global->TICKET_DISABLE_MAIL_AUTOCOPY_TO)) {
- $conf->global->MAIN_MAIL_AUTOCOPY_TO = $old_MAIN_MAIL_AUTOCOPY_TO;
- }
- }
-
- setEventMessages($langs->trans('TicketNotificationNumberEmailSent', $nb_sent), null, 'mesgs');
- }
-
- return $nb_sent;
- }
-
- /**
- * Charge la liste des actions sur le ticket
- *
- * @return int Number of lines loaded, 0 if already loaded, <0 if KO
- */
- public function loadCacheLogsTicket()
- {
- global $langs;
-
- if (is_array($this->cache_logs_ticket) && count($this->cache_logs_ticket)) {
- return 0;
- }
- // Cache deja charge
-
- // TODO Read the table llx_actioncomm
- /*
- $sql = "SELECT rowid, fk_user_create, datec, message";
- $sql .= " FROM " . MAIN_DB_PREFIX . "ticket_logs";
- $sql .= " WHERE fk_track_id ='" . $this->db->escape($this->track_id) . "'";
- $sql .= " ORDER BY datec DESC";
-
- $resql = $this->db->query($sql);
- if ($resql) {
- $num = $this->db->num_rows($resql);
- $i = 0;
- while ($i < $num) {
- $obj = $this->db->fetch_object($resql);
- $this->cache_logs_ticket[$i]['id'] = $obj->rowid;
- $this->cache_logs_ticket[$i]['fk_user_create'] = $obj->fk_user_create;
- $this->cache_logs_ticket[$i]['datec'] = $this->db->jdate($obj->datec);
- $this->cache_logs_ticket[$i]['message'] = $obj->message;
- $i++;
- }
- return $num;
- } else {
- $this->error = "Error " . $this->db->lasterror();
- dol_syslog(get_class($this) . "::loadCacheLogsTicket " . $this->error, LOG_ERR);
- return -1;
- }*/
-
- return 0;
- }
-
/**
* Add message into database
*
@@ -1767,6 +1629,7 @@ class Ticket extends CommonObject
$actioncomm->percentage = -1; // percentage is not relevant for punctual events
$actioncomm->elementtype = 'ticket';
$actioncomm->fk_element = $this->id;
+ $actioncomm->fk_project = $this->fk_project;
$attachedfiles = array();
$attachedfiles['paths'] = $filename_list;
@@ -1804,7 +1667,7 @@ class Ticket extends CommonObject
*/
public function loadCacheMsgsTicket()
{
- if (is_array($this->cache_msgs_ticket) && count($this->cache_msgs_ticket)) {
+ if (!empty($this->cache_msgs_ticket) && is_array($this->cache_msgs_ticket) && count($this->cache_msgs_ticket)) {
return 0;
}
@@ -2516,6 +2379,7 @@ class Ticket extends CommonObject
$object->socid = $object->fk_soc;
$object->fetch_thirdparty();
+ $object->fetch_project();
if ($ret < 0) {
$error++;
@@ -2559,7 +2423,7 @@ class Ticket extends CommonObject
if (!empty($public_area)) {
/*
- * Message created fromthe Public interface
+ * Message created from the Public interface
*
* Send emails to assigned users (public area notification)
*/
@@ -2629,9 +2493,9 @@ class Ticket extends CommonObject
}
} else {
/*
- * Send from Backoffice / Private area
+ * Message send from the Backoffice / Private area
*
- * Send emails to internal users (linked contacts)
+ * Send emails to internal users (linked contacts) then, if private is not set, to external users (linked contacts or thirdparty email if no contact set)
*/
if ($send_email > 0) {
// Retrieve internal contact datas
@@ -2639,9 +2503,10 @@ class Ticket extends CommonObject
$sendto = array();
if (is_array($internal_contacts) && count($internal_contacts) > 0) {
- // altairis: set default subject
+ // Set default subject
$label_title = empty($conf->global->MAIN_APPLICATION_TITLE) ? $mysoc->name : $conf->global->MAIN_APPLICATION_TITLE;
- $subject = GETPOST('subject', 'alphanohtml') ? GETPOST('subject', 'alphanohtml') : '['.$label_title.'- ticket #'.$object->track_id.'] '.$langs->trans('TicketNewMessage');
+ $appli = $label_title;
+ $subject = GETPOST('subject', 'alphanohtml') ? GETPOST('subject', 'alphanohtml') : '['.$appli.' - '.$langs->trans("Ticket").' #'.$object->track_id.'] '.$langs->trans('TicketNewMessage');
$message_intro = $langs->trans('TicketNotificationEmailBody', "#".$object->id);
$message_signature = GETPOST('mail_signature') ? GETPOST('mail_signature') : getDolGlobalString('TICKET_MESSAGE_MAIL_SIGNATURE');
@@ -2654,7 +2519,7 @@ class Ticket extends CommonObject
}
$message .= $messagePost;
- // Coordonnées client
+ // Data about customer
$message .= '
';
$message .= "==============================================
";
$message .= !empty($object->thirdparty->name) ? $langs->trans('Thirdparty')." : ".$object->thirdparty->name : '';
@@ -2663,7 +2528,7 @@ class Ticket extends CommonObject
// Build array to display recipient list
foreach ($internal_contacts as $key => $info_sendto) {
- // altairis: avoid duplicate notifications
+ // Avoid duplicate notifications
if ($info_sendto['id'] == $user->id) {
continue;
}
@@ -2673,7 +2538,7 @@ class Ticket extends CommonObject
$sendto[] = trim($info_sendto['firstname']." ".$info_sendto['lastname'])." <".$info_sendto['email'].">";
}
- //Contact type
+ // Contact type
$recipient = dolGetFirstLastname($info_sendto['firstname'], $info_sendto['lastname'], '-1').' ('.strtolower($info_sendto['libelle']).')';
$message .= (!empty($recipient) ? $langs->trans('TicketNotificationRecipient').' : '.$recipient.'
' : '');
}
@@ -2682,7 +2547,7 @@ class Ticket extends CommonObject
// URL ticket
$url_internal_ticket = dol_buildpath('/ticket/card.php', 2).'?track_id='.$object->track_id;
- // add html link on url
+ // Add html link on url
$message .= '
'.$langs->trans('TicketNotificationEmailBodyInfosTrackUrlinternal').' :
'.$object->track_id.' ';
// Add global email address recipient
@@ -2719,9 +2584,10 @@ class Ticket extends CommonObject
$sendto = array();
if (is_array($external_contacts) && count($external_contacts) > 0) {
- // altairis: get default subject for email to external contacts
+ // Get default subject for email to external contacts
$label_title = empty($conf->global->MAIN_APPLICATION_TITLE) ? $mysoc->name : $conf->global->MAIN_APPLICATION_TITLE;
- $subject = GETPOST('subject') ? GETPOST('subject') : '['.$label_title.'- ticket #'.$object->track_id.'] '.$langs->trans('TicketNewMessage');
+ $appli = $mysoc->name;
+ $subject = GETPOST('subject') ? GETPOST('subject') : '['.$appli.' - '.$langs->trans("Ticket").' #'.$object->track_id.'] '.$langs->trans('TicketNewMessage');
$message_intro = GETPOST('mail_intro') ? GETPOST('mail_intro', 'restricthtml') : getDolGlobalString('TICKET_MESSAGE_MAIL_INTRO');
$message_signature = GETPOST('mail_signature') ? GETPOST('mail_signature', 'restricthtml') : getDolGlobalString('TICKET_MESSAGE_MAIL_SIGNATURE');
@@ -2779,20 +2645,20 @@ class Ticket extends CommonObject
}
}
- // altairis: Add global email address reciepient
+ // Add global email address recipient
if ($conf->global->TICKET_NOTIFICATION_ALSO_MAIN_ADDRESS && !in_array($conf->global->TICKET_NOTIFICATION_EMAIL_TO, $sendto)) {
if (!empty($conf->global->TICKET_NOTIFICATION_EMAIL_TO)) {
$sendto[] = $conf->global->TICKET_NOTIFICATION_EMAIL_TO;
}
}
- // altairis: dont try to send email when no recipient
+ // Dont try to send email when no recipient
if (!empty($sendto)) {
$result = $this->sendTicketMessageByEmail($subject, $message, '', $sendto, $listofpaths, $listofmimes, $listofnames);
if ($result) {
- // update last_msg_sent date
- $object->date_last_msg_sent = dol_now();
- $object->update($user);
+ // update last_msg_sent date (for last message sent to external users)
+ $this->date_last_msg_sent = dol_now();
+ $this->update($user, 1); // disable trigger when updating date_last_msg_sent. sendTicketMessageByEmail already create an event in actioncomm table.
}
}
}
@@ -2800,8 +2666,8 @@ class Ticket extends CommonObject
}
}
- // Set status to "answered" if not set yet, but only if internal user
- if ($object->fk_statut < 3 && !$user->socid) {
+ // Set status to "answered" if not set yet, but only if internal user and not private message
+ if ($object->status < 3 && !$user->socid && !$private) {
$object->setStatut(3);
}
return 1;
@@ -2869,9 +2735,17 @@ class Ticket extends CommonObject
$conf->global->MAIN_MAIL_AUTOCOPY_TO = '';
}
+ $upload_dir_tmp = $conf->user->dir_output."/".$user->id.'/temp';
+
include_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
$trackid = "tic".$this->id;
- $mailfile = new CMailFile($subject, $receiver, $from, $message, $filepath, $mimetype, $filename, $sendtocc, '', $deliveryreceipt, -1, '', '', $trackid, '', 'ticket');
+
+ $moreinheader = 'X-Dolibarr-Info: sendTicketMessageByEmail'."\r\n";
+ if (!empty($this->email_msgid)) {
+ $moreinheader .= 'References <'.$this->email_msgid.'>'."\r\n";
+ }
+
+ $mailfile = new CMailFile($subject, $receiver, $from, $message, $filepath, $mimetype, $filename, $sendtocc, '', $deliveryreceipt, -1, '', '', $trackid, $moreinheader, 'ticket', '', $upload_dir_tmp);
if ($mailfile->error) {
setEventMessages($mailfile->error, null, 'errors');
} else {
@@ -2898,6 +2772,7 @@ class Ticket extends CommonObject
$langs->load("other");
setEventMessages($langs->trans('ErrorMailRecipientIsEmptyForSendTicketMessage'), null, 'warnings');
}
+
return $is_sent;
}
diff --git a/htdocs/ticket/contact.php b/htdocs/ticket/contact.php
index bf39f123708..7f5a36faf1b 100644
--- a/htdocs/ticket/contact.php
+++ b/htdocs/ticket/contact.php
@@ -34,6 +34,11 @@ require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
require_once DOL_DOCUMENT_ROOT."/core/lib/company.lib.php";
require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
+if (isModEnabled('project')) {
+ include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
+ include_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php';
+}
// Load translation files required by the page
$langs->loadLangs(array('companies', 'ticket'));
@@ -212,45 +217,33 @@ if ($id > 0 || !empty($track_id) || !empty($ref)) {
// Thirdparty
if (isModEnabled("societe")) {
- $morehtmlref .= '
'.$langs->trans('ThirdParty');
- /*if ($action != 'editcustomer' && $object->fk_statut < 8 && !$user->socid && $user->rights->ticket->write) {
- $morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('Edit'), 1) . ' ';
- }*/
- $morehtmlref .= ' : ';
- if ($action == 'editcustomer') {
- $morehtmlref .= $form->form_thirdparty($url_page_current.'?track_id='.$object->track_id, $object->socid, 'editcustomer', '', 1, 0, 0, array(), 1);
- } else {
- $morehtmlref .= $form->form_thirdparty($url_page_current.'?track_id='.$object->track_id, $object->socid, 'none', '', 1, 0, 0, array(), 1);
+ $morehtmlref .= '
';
+ $morehtmlref .= img_picto($langs->trans("ThirdParty"), 'company', 'class="pictofixedwidth"');
+ if ($action != 'editcustomer' && 0) {
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetThirdParty'), 0).' ';
}
+ $morehtmlref .= $form->form_thirdparty($url_page_current.'?track_id='.$object->track_id, $object->socid, $action == 'editcustomer' ? 'editcustomer' : 'none', '', 1, 0, 0, array(), 1);
}
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= '
'.$langs->trans('Project').' ';
- if ($user->rights->ticket->write) {
+ if (0) {
+ $morehtmlref .= '
';
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', 0, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
+ $morehtmlref .= '
';
$proj = new Project($db);
$proj->fetch($object->fk_project);
$morehtmlref .= $proj->getNomUrl(1);
- } else {
- $morehtmlref .= '';
+ if ($proj->title) {
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
+ }
}
}
}
diff --git a/htdocs/ticket/document.php b/htdocs/ticket/document.php
index 5a7d46540c4..8015cb32145 100644
--- a/htdocs/ticket/document.php
+++ b/htdocs/ticket/document.php
@@ -33,6 +33,11 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
require_once DOL_DOCUMENT_ROOT."/core/lib/company.lib.php";
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
+if (isModEnabled('project')) {
+ include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
+ include_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php';
+}
// Load translation files required by the page
$langs->loadLangs(array("companies", "other", "ticket", "mails"));
@@ -147,45 +152,33 @@ if ($object->id) {
// Thirdparty
if (isModEnabled("societe")) {
- $morehtmlref .= '
'.$langs->trans('ThirdParty');
- /*if ($action != 'editcustomer' && $object->fk_statut < 8 && !$user->socid && $user->rights->ticket->write) {
- $morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('Edit'), 1) . ' ';
- }*/
- $morehtmlref .= ' : ';
- if ($action == 'editcustomer') {
- $morehtmlref .= $form->form_thirdparty($url_page_current.'?track_id='.$object->track_id, $object->socid, 'editcustomer', '', 1, 0, 0, array(), 1);
- } else {
- $morehtmlref .= $form->form_thirdparty($url_page_current.'?track_id='.$object->track_id, $object->socid, 'none', '', 1, 0, 0, array(), 1);
+ $morehtmlref .= '
';
+ $morehtmlref .= img_picto($langs->trans("ThirdParty"), 'company', 'class="pictofixedwidth"');
+ if ($action != 'editcustomer' && 0) {
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetThirdParty'), 0).' ';
}
+ $morehtmlref .= $form->form_thirdparty($url_page_current.'?track_id='.$object->track_id, $object->socid, $action == 'editcustomer' ? 'editcustomer' : 'none', '', 1, 0, 0, array(), 1);
}
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= '
'.$langs->trans('Project').' ';
- if ($user->rights->ticket->write) {
+ if (0) {
+ $morehtmlref .= '
';
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '
';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', 0, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= '
'.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
+ $morehtmlref .= '
';
$proj = new Project($db);
$proj->fetch($object->fk_project);
$morehtmlref .= $proj->getNomUrl(1);
- } else {
- $morehtmlref .= '';
+ if ($proj->title) {
+ $morehtmlref .= '
- '.dol_escape_htmltag($proj->title).' ';
+ }
}
}
}
diff --git a/htdocs/ticket/list.php b/htdocs/ticket/list.php
index fd4d7f15f9e..8430598a308 100644
--- a/htdocs/ticket/list.php
+++ b/htdocs/ticket/list.php
@@ -397,6 +397,12 @@ foreach ($search as $key => $val) {
$sql .= natural_search($key, $search[$key], 2);
}
continue;
+ } elseif ($key == 'type_code') {
+ $newarrayoftypecodes = is_array($search[$key]) ? $search[$key] : (!empty($search[$key]) ? explode(',', $search[$key]) : array());
+ if (count($newarrayoftypecodes)) {
+ $sql .= natural_search($key, join(',', $newarrayoftypecodes), 3);
+ }
+ continue;
}
$mode_search = ((!empty($object->fields[$key]) && ($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key]))) ? 1 : 0);
@@ -452,7 +458,7 @@ $sql .= $hookmanager->resPrint;
$nbtotalofrecords = '';
if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
/* The fast and low memory method to get and count full list converts the sql into a sql count */
- $sqlforcount = preg_replace('/^SELECT[a-z0-9\._\s\(\),]+FROM/i', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
+ $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/Ui', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
$resql = $db->query($sqlforcount);
$objforcount = $db->fetch_object($resql);
$nbtotalofrecords = $objforcount->nbtotalofrecords;
@@ -572,7 +578,7 @@ if ($projectid > 0 || $project_ref) {
$morehtmlref .= $object->title;
// Thirdparty
if (!empty($object->thirdparty->id) && $object->thirdparty->id > 0) {
- $morehtmlref .= '
'.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'project');
+ $morehtmlref .= '
'.$object->thirdparty->getNomUrl(1, 'project');
}
$morehtmlref .= '
';
@@ -587,7 +593,7 @@ if ($projectid > 0 || $project_ref) {
print '
';
print '
';
- print '
';
+ print '';
// Visibility
print ''.$langs->trans("Visibility").' ';
@@ -785,7 +791,7 @@ if (!empty($moreforfilter)) {
}
$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
-$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
+$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
print ''; // You can use div-table-responsive-no-min if you dont need reserved height for your table
@@ -796,6 +802,13 @@ print '
';
+// Action column
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons('left');
+ print $searchpicto;
+ print ' ';
+}
foreach ($object->fields as $key => $val) {
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
if ($key == 'fk_statut') {
@@ -814,7 +827,7 @@ foreach ($object->fields as $key => $val) {
print '';
} elseif ($key == 'type_code') {
print '';
- $formTicket->selectTypesTickets(dol_escape_htmltag(empty($search[$key]) ? '' : $search[$key]), 'search_'.$key.'', '', 2, 1, 1, 0, (!empty($val['css']) ? $val['css'] : 'maxwidth150'));
+ $formTicket->selectTypesTickets(dol_escape_htmltag(empty($search[$key]) ? '' : $search[$key]), 'search_'.$key.'', '', 2, 1, 1, 0, (!empty($val['css']) ? $val['css'] : 'maxwidth150'), 1);
print ' ';
} elseif ($key == 'category_code') {
print '';
@@ -897,16 +910,21 @@ $parameters = array('arrayfields'=>$arrayfields);
$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Action column
-print ' ';
-$searchpicto = $form->showFilterButtons();
-print $searchpicto;
-print ' ';
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ $searchpicto = $form->showFilterButtons();
+ print $searchpicto;
+ print ' ';
+}
print ''."\n";
// Fields title label
// --------------------------------------------------------------------
print '';
+if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+}
foreach ($object->fields as $key => $val) {
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
if ($key == 'fk_statut' || $key == 'severity_code') {
@@ -937,7 +955,9 @@ $parameters = array(
);
$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
-print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
+}
print ' '."\n";
@@ -972,6 +992,18 @@ while ($i < ($limit ? min($num, $limit) : $num)) {
// Show here line of result
print '';
+ // Action column
+ if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print '';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->rowid, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
+ }
+ print ' ';
+ }
foreach ($object->fields as $key => $val) {
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
@@ -1112,15 +1144,17 @@ while ($i < ($limit ? min($num, $limit) : $num)) {
$reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
// Action column
- print '';
- if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
- $selected = 0;
- if (in_array($obj->rowid, $arrayofselected)) {
- $selected = 1;
+ if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
+ print ' ';
+ if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
+ $selected = 0;
+ if (in_array($obj->rowid, $arrayofselected)) {
+ $selected = 1;
+ }
+ print ' ';
}
- print ' ';
+ print ' ';
}
- print '';
if (!$i) {
$totalarray['nbfield']++;
}
diff --git a/htdocs/ticket/messaging.php b/htdocs/ticket/messaging.php
index 88ac4ef686c..bd06bd32e94 100644
--- a/htdocs/ticket/messaging.php
+++ b/htdocs/ticket/messaging.php
@@ -30,6 +30,11 @@ require_once DOL_DOCUMENT_ROOT."/core/lib/company.lib.php";
require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
+if (isModEnabled('project')) {
+ include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
+ include_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php';
+}
// Load translation files required by the page
$langs->loadLangs(array('companies', 'other', 'ticket'));
@@ -173,46 +178,34 @@ if ($object->fk_user_create > 0) {
// Thirdparty
if (isModEnabled("societe")) {
- $morehtmlref .= ' '.$langs->trans('ThirdParty');
- /*if ($action != 'editcustomer' && $object->fk_statut < 8 && !$user->socid && $user->rights->ticket->write) {
- $morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('Edit'), 1) . ' ';
- }*/
- $morehtmlref .= ' : ';
- if ($action == 'editcustomer') {
- $morehtmlref .= $form->form_thirdparty($url_page_current.'?track_id='.$object->track_id, $object->socid, 'editcustomer', '', 1, 0, 0, array(), 1);
- } else {
- $morehtmlref .= $form->form_thirdparty($url_page_current.'?track_id='.$object->track_id, $object->socid, 'none', '', 1, 0, 0, array(), 1);
+ if (isModEnabled("societe")) {
+ $morehtmlref .= ' ';
+ $morehtmlref .= img_picto($langs->trans("ThirdParty"), 'company', 'class="pictofixedwidth"');
+ if ($action != 'editcustomer' && 0) {
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetThirdParty'), 0).' ';
+ }
+ $morehtmlref .= $form->form_thirdparty($url_page_current.'?track_id='.$object->track_id, $object->socid, $action == 'editcustomer' ? 'editcustomer' : 'none', '', 1, 0, 0, array(), 1);
}
}
// Project
if (isModEnabled('project')) {
$langs->load("projects");
- $morehtmlref .= ' '.$langs->trans('Project');
- if ($user->rights->ticket->write) {
+ $morehtmlref .= ' ';
+ if (0) {
+ $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
if ($action != 'classify') {
- //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' ';
- $morehtmlref .= ' : ';
- }
- if ($action == 'classify') {
- //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
- $morehtmlref .= '';
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', 0, 0, 1, 0, 1, 0, 0, '', 1);
- $morehtmlref .= ' ';
- $morehtmlref .= ' ';
- } else {
- $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
+ $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('SetProject')).' ';
}
+ $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, ($action == 'classify' ? 1 : 0), 0, 1, '');
} else {
if (!empty($object->fk_project)) {
- require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
$proj = new Project($db);
$proj->fetch($object->fk_project);
$morehtmlref .= $proj->getNomUrl(1);
- } else {
- $morehtmlref .= '';
+ if ($proj->title) {
+ $morehtmlref .= ' - '.dol_escape_htmltag($proj->title).' ';
+ }
}
}
}
@@ -256,7 +249,7 @@ if (!empty($object->id)) {
// Show link to add event (if read and not closed)
$btnstatus = $object->status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage";
- $url = DOL_URL_ROOT.'/comm/action/card.php?action=create&datep='.date('YmdHi').'&origin=ticket&originid='.$object->id.'&projectid='.$object->fk_project.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?track_id='.$object->track_id);
+ $url = DOL_URL_ROOT.'/comm/action/card.php?action=create&datep=now&origin=ticket&originid='.$object->id.'&projectid='.$object->fk_project.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?track_id='.$object->track_id);
$morehtmlright .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', $url, 'add-new-ticket-even-button', $btnstatus);
@@ -265,7 +258,7 @@ if (!empty($object->id)) {
// List of all actions
$filters = array();
$filters['search_agenda_label'] = $search_agenda_label;
- show_ticket_messaging($conf, $langs, $db, $object, null, 0, $actioncode, '', $filters, $sortfield, $sortorder);
+ show_actions_messaging($conf, $langs, $db, $object, null, 0, $actioncode, '', $filters, $sortfield, $sortorder);
}
// End of page
diff --git a/htdocs/ticket/stats/index.php b/htdocs/ticket/stats/index.php
index 52965da8182..7e94af1a431 100644
--- a/htdocs/ticket/stats/index.php
+++ b/htdocs/ticket/stats/index.php
@@ -45,7 +45,7 @@ if ($user->socid > 0) {
$socid = $user->socid;
}
-$nowyear = strftime("%Y", dol_now());
+$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$year = GETPOST('year') > 0 ? GETPOST('year', 'int') : $nowyear;
$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS)));
$endyear = $year;
diff --git a/htdocs/user/card.php b/htdocs/user/card.php
index 3c65d018e6b..7fc268568c8 100644
--- a/htdocs/user/card.php
+++ b/htdocs/user/card.php
@@ -1,7 +1,7 @@
* Copyright (C) 2002-2003 Jean-Louis Bergamo
- * Copyright (C) 2004-2020 Laurent Destailleur
+ * Copyright (C) 2004-2022 Laurent Destailleur
* Copyright (C) 2004 Eric Seigne
* Copyright (C) 2005-2021 Regis Houssin
* Copyright (C) 2005 Lionel Cousteix
@@ -276,8 +276,8 @@ if (empty($reshook)) {
$object->job = GETPOST("job", 'alphanohtml');
$object->signature = GETPOST("signature", 'restricthtml');
$object->accountancy_code = GETPOST("accountancy_code", 'alphanohtml');
- $object->note = GETPOST("note", 'restricthtml');
- $object->note_private = GETPOST("note", 'restricthtml');
+ $object->note_public = GETPOST("note_public", 'restricthtml');
+ $object->note_private = GETPOST("note_private", 'restricthtml');
$object->ldap_sid = GETPOST("ldap_sid", 'alphanohtml');
$object->fk_user = GETPOST("fk_user", 'int') > 0 ? GETPOST("fk_user", 'int') : 0;
$object->fk_user_expense_validator = GETPOST("fk_user_expense_validator", 'int') > 0 ? GETPOST("fk_user_expense_validator", 'int') : 0;
@@ -1205,15 +1205,6 @@ if ($action == 'create' || $action == 'adduserldap') {
$parameters = array();
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
- // Note
- print '';
- print $langs->trans("Note");
- print ' ';
- require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
- $doleditor = new DolEditor('note', GETPOSTISSET('note') ? GETPOST('note', 'restricthtml') : '', '', 120, 'dolibarr_notes', '', false, true, getDolGlobalString('FCKEDITOR_ENABLE_SOCIETE'), ROWS_3, '90%');
- $doleditor->Create();
- print " \n";
-
// Signature
print ''.$langs->trans("Signature").' ';
print '';
@@ -1222,6 +1213,23 @@ if ($action == 'create' || $action == 'adduserldap') {
print $doleditor->Create(1);
print ' ';
+ // Note private
+ print '';
+ print $langs->trans("NotePublic");
+ print ' ';
+ require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
+ $doleditor = new DolEditor('note_public', GETPOSTISSET('note_public') ? GETPOST('note_public', 'restricthtml') : '', '', 100, 'dolibarr_notes', '', false, true, getDolGlobalString('FCKEDITOR_ENABLE_NOTE_PUBLIC'), ROWS_3, '90%');
+ $doleditor->Create();
+ print " \n";
+
+ // Note private
+ print '';
+ print $langs->trans("NotePrivate");
+ print ' ';
+ require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
+ $doleditor = new DolEditor('note_private', GETPOSTISSET('note_private') ? GETPOST('note_private', 'restricthtml') : '', '', 100, 'dolibarr_notes', '', false, true, getDolGlobalString('FCKEDITOR_ENABLE_NOTE_PRIVATE'), ROWS_3, '90%');
+ $doleditor->Create();
+ print " \n";
print '
';
@@ -1282,7 +1290,7 @@ if ($action == 'create' || $action == 'adduserldap') {
print "\n";
// Date employment
- print ''.$langs->trans("DateEmployment").' ';
+ print ''.$langs->trans("DateOfEmployment").' ';
print '';
print $form->selectDate($dateemployment, 'dateemployment', 0, 0, 1, 'formdateemployment', 1, 1);
@@ -1426,7 +1434,7 @@ if ($action == 'create' || $action == 'adduserldap') {
print '';
print '
';
- print '
';
+ print '';
// Login
print ''.$langs->trans("Login").' ';
@@ -1731,9 +1739,11 @@ if ($action == 'create' || $action == 'adduserldap') {
print "
\n";
+
// Credentials
+ print ' ';
print '';
- print '
';
+ print '';
print '';
print img_picto('', 'security', 'class="paddingleft pictofixedwidth"').$langs->trans("Credentials");
print ' ';
@@ -1741,7 +1751,7 @@ if ($action == 'create' || $action == 'adduserldap') {
print ' ';
// Date login validity
- print ''.$langs->trans("RangeOfLoginValidity").' ';
+ print ''.$langs->trans("RangeOfLoginValidity").' ';
print '';
if ($object->datestartvalidity) {
print ''.$langs->trans("FromDate").' ';
@@ -1755,9 +1765,6 @@ if ($action == 'create' || $action == 'adduserldap') {
print " \n";
// Password
- print ''.$langs->trans("Password").' ';
-
- print '';
$valuetoshow = '';
if (preg_match('/ldap/', $dolibarr_main_authentication)) {
if (!empty($object->ldap_sid)) {
@@ -1777,6 +1784,7 @@ if ($action == 'create' || $action == 'adduserldap') {
if (preg_match('/http/', $dolibarr_main_authentication)) {
$valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '').$langs->trans("HTTPBasicPassword");
}
+ /*
if (preg_match('/dolibarr/', $dolibarr_main_authentication)) {
if ($object->pass) {
$valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '');
@@ -1784,15 +1792,15 @@ if ($action == 'create' || $action == 'adduserldap') {
} else {
if ($user->admin && $user->id == $object->id) {
$valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '');
- //$valuetoshow .= ''.$langs->trans("Crypted").' - ';
$valuetoshow .= ''.$langs->trans("Hidden").' ';
- // TODO Add a feature to reveal the hash
$valuetoshow .= '';
} else {
- $valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '').''.$langs->trans("Hidden").' ';
+ $valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '');
+ $valuetoshow .= ''.$langs->trans("Hidden").' ';
}
}
}
+ */
// Other form for user password
$parameters = array('valuetoshow' => $valuetoshow);
@@ -1803,13 +1811,17 @@ if ($action == 'create' || $action == 'adduserldap') {
$valuetoshow .= $hookmanager->resPrint; // to add
}
- print $valuetoshow;
- print " ";
- print ' '."\n";
+ if (dol_string_nohtmltag($valuetoshow)) { // If there is a real visible content to show
+ print ''.$langs->trans("Password").' ';
+ print '';
+ print $valuetoshow;
+ print " ";
+ print ' '."\n";
+ }
// API key
if (!empty($conf->api->enabled) && ($user->id == $id || $user->admin || $user->hasRight("api", "apikey", "generate"))) {
- print ''.$langs->trans("ApiKey").' ';
+ print ''.$langs->trans("ApiKey").' ';
print '';
if (!empty($object->api_key)) {
print '';
@@ -1819,18 +1831,19 @@ if ($action == 'create' || $action == 'adduserldap') {
print ' ';
}
- print ''.$langs->trans("LastConnexion").' ';
+ print ''.$langs->trans("LastConnexion").' ';
print '';
if ($object->datepreviouslogin) {
- print dol_print_date($object->datepreviouslogin, "dayhour").' ('.$langs->trans("Previous").') , ';
+ print dol_print_date($object->datepreviouslogin, "dayhour", "tzuserrel").' ('.$langs->trans("Previous").') , ';
}
if ($object->datelastlogin) {
- print dol_print_date($object->datelastlogin, "dayhour").' ('.$langs->trans("Currently").') ';
+ print dol_print_date($object->datelastlogin, "dayhour", "tzuserrel").' ('.$langs->trans("Currently").') ';
}
print ' ';
print " \n";
- print '
';
+ print '
';
+ print '
';
print '';
@@ -2098,7 +2111,7 @@ if ($action == 'create' || $action == 'adduserldap') {
print '';
// Firstname
- print "".''.$langs->trans("Firstname").' ';
+ print ' '.$langs->trans("Firstname").' ';
print '';
if ($caneditfield && !$object->ldap_sid) {
print ' ';
@@ -2226,7 +2239,7 @@ if ($action == 'create' || $action == 'adduserldap') {
print ' ';
// Hierarchy
- print ''.$langs->trans("HierarchicalResponsible").' ';
+ print ''.$langs->trans("HierarchicalResponsible").' ';
print '';
if ($caneditfield) {
print img_picto('', 'user').$form->select_dolusers($object->fk_user, 'fk_user', 1, array($object->id), 0, '', 0, $object->entity, 0, 0, '', 0, '', 'widthcentpercentminusx maxwidth300');
@@ -2241,7 +2254,7 @@ if ($action == 'create' || $action == 'adduserldap') {
// Expense report validator
if (isModEnabled('expensereport')) {
- print ' ';
+ print ' ';
$text = $langs->trans("ForceUserExpenseValidator");
print $form->textwithpicto($text, $langs->trans("ValidatorIsSupervisorByDefault"), 1, 'help');
print ' ';
@@ -2260,7 +2273,7 @@ if ($action == 'create' || $action == 'adduserldap') {
// Holiday request validator
if (isModEnabled('holiday')) {
- print '';
+ print ' ';
$text = $langs->trans("ForceUserHolidayValidator");
print $form->textwithpicto($text, $langs->trans("ValidatorIsSupervisorByDefault"), 1, 'help');
print ' ';
@@ -2299,32 +2312,35 @@ if ($action == 'create' || $action == 'adduserldap') {
if ($object->socid > 0 && !($object->contact_id > 0)) { // external user but no link to a contact
print img_picto('', 'company').$form->select_company($object->socid, 'socid', '', ' ');
- print img_picto('', 'contact').$form->selectcontacts(0, 0, 'contactid', 1, '', '', 1, '', false, 1);
+ print img_picto('', 'contact').$form->selectcontacts(0, 0, 'contactid', 1, '', '', 1, 'maxwidth300', false, 1);
if ($object->ldap_sid) {
print ' ('.$langs->trans("DomainUser").')';
}
} elseif ($object->socid > 0 && $object->contact_id > 0) { // external user with a link to a contact
print img_picto('', 'company').$form->select_company($object->socid, 'socid', '', ' '); // We keep thirdparty empty, contact is already set
- print img_picto('', 'contact').$form->selectcontacts(0, $object->contact_id, 'contactid', 1, '', '', 1, '', false, 1);
+ print img_picto('', 'contact').$form->selectcontacts(0, $object->contact_id, 'contactid', 1, '', '', 1, 'maxwidth300', false, 1);
if ($object->ldap_sid) {
print ' ('.$langs->trans("DomainUser").')';
}
} elseif (!($object->socid > 0) && $object->contact_id > 0) { // internal user with a link to a contact
print img_picto('', 'company').$form->select_company(0, 'socid', '', ' '); // We keep thirdparty empty, contact is already set
- print img_picto('', 'contact').$form->selectcontacts(0, $object->contact_id, 'contactid', 1, '', '', 1, '', false, 1);
+ print img_picto('', 'contact').$form->selectcontacts(0, $object->contact_id, 'contactid', 1, '', '', 1, 'maxwidth300', false, 1);
if ($object->ldap_sid) {
print ' ('.$langs->trans("DomainUser").')';
}
} else { // $object->socid is not > 0 here
print img_picto('', 'company').$form->select_company(0, 'socid', '', ' '); // We keep thirdparty empty, contact is already set
- print img_picto('', 'contact').$form->selectcontacts(0, 0, 'contactid', 1, '', '', 1, '', false, 1);
+ print img_picto('', 'contact').$form->selectcontacts(0, 0, 'contactid', 1, '', '', 1, 'maxwidth300', false, 1);
}
}
print ' ';
- print '
';
+ print '
';
+
+ print '
';
// Date access validity
print ''.$langs->trans("RangeOfLoginValidity").' ';
@@ -2829,7 +2845,7 @@ if ($action == 'create' || $action == 'adduserldap') {
// List of actions on element
include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
$formactions = new FormActions($db);
- $somethingshown = $formactions->showactions($object, 'user', $socid, 1);
+ $somethingshown = $formactions->showactions($object, 'user', $socid, 1, 'listactions', 0, '', '', $object->id);
print '';
}
diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php
index b263eeaa666..d49f810f915 100644
--- a/htdocs/user/class/user.class.php
+++ b/htdocs/user/class/user.class.php
@@ -717,6 +717,7 @@ class User extends CommonObject
'shipping' => 'expedition',
'task' => 'task@projet',
'fichinter' => 'ficheinter',
+ 'propale' => 'propal',
'inventory' => 'stock',
'invoice' => 'facture',
'invoice_supplier' => 'fournisseur',
@@ -2692,7 +2693,7 @@ class User extends CommonObject
}
/**
- * Return a link to the user card (with optionaly the picto)
+ * Return a HTML link to the user card (with optionaly the picto)
* Use this->id,this->lastname, this->firstname
*
* @param int $withpictoimg Include picto in link (0=No picto, 1=Include picto into link, 2=Only picto, -1=Include photo into link, -2=Only picto photo, -3=Only photo very small)
@@ -2720,8 +2721,7 @@ class User extends CommonObject
$withpictoimg = 0;
}
- $result = ''; $label = '';
- $companylink = '';
+ $result = ''; $label = ''; $companylink = '';
if (!empty($this->photo)) {
$label .= '
';
+ print '
';
+ print ''."\n";
+ //print ' ';
}
/*
diff --git a/htdocs/user/hierarchy.php b/htdocs/user/hierarchy.php
index c48eda2312e..44ab46193d9 100644
--- a/htdocs/user/hierarchy.php
+++ b/htdocs/user/hierarchy.php
@@ -4,7 +4,7 @@
* Copyright (C) 2006-2015 Laurent Destailleur
* Copyright (C) 2007 Patrick Raguin
* Copyright (C) 2005-2012 Regis Houssin
- * Copyright (C) 2019-2021 Frédéric France
+ * Copyright (C) 2019-2021 Frédéric France
*
* 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
@@ -31,7 +31,7 @@ require '../main.inc.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/treeview.lib.php';
// Load translation files required by page
-$langs->loadLangs(array('users', 'companies'));
+$langs->loadLangs(array('users', 'companies', 'hrm', 'salaries'));
// Security check (for external users)
$socid = 0;
@@ -40,16 +40,15 @@ if ($user->socid > 0) {
}
$optioncss = GETPOST('optioncss', 'alpha');
-$contextpage = GETPOST('optioncss', 'aZ09');
+$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'userlist'; // To manage different context of search
+$mode = GETPOST("mode", 'alpha');
+
$sortfield = GETPOST('sortfield', 'aZ09comma');
$sortorder = GETPOST('sortorder', 'aZ09comma');
$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
-// Load mode employee
-$mode = GETPOST("mode", 'alpha');
$search_statut = GETPOST('search_statut', 'int');
-
if ($search_statut == '' || $search_statut == '0') {
$search_statut = '1';
}
@@ -58,18 +57,30 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter',
$search_statut = "";
}
+if ($contextpage == 'employeelist') {
+ $search_employee = 1;
+}
+
$userstatic = new User($db);
// Define value to know what current user can do on users
$canadduser = (!empty($user->admin) || $user->hasRight("user", "user", "write"));
-if (!$user->hasRight("user", "user", "read") && !$user->admin) {
- accessforbidden();
+// Permission to list
+if ($contextpage == 'employeelist' && $search_employee == 1) {
+ if (!$user->hasRight("salaries", "read")) {
+ accessforbidden();
+ }
+} else {
+ if (!$user->hasRight("user", "user", "read") && empty($user->admin)) {
+ accessforbidden();
+ }
}
$childids = $user->getAllChildIds(1);
+
/*
* View
*/
@@ -77,7 +88,11 @@ $childids = $user->getAllChildIds(1);
$form = new Form($db);
$help_url = 'EN:Module_Users|FR:Module_Utilisateurs|ES:Módulo_Usuarios|DE:Modul_Benutzer';
-$title = $langs->trans("Users");
+if ($contextpage == 'employeelist' && $search_employee == 1) {
+ $title = $langs->trans("Employees");
+} else {
+ $title = $langs->trans("Users");
+}
$arrayofjs = array(
'/includes/jquery/plugins/jquerytreeview/jquery.treeview.js',
'/includes/jquery/plugins/jquerytreeview/lib/jquery.cookie.js',
@@ -152,6 +167,7 @@ if (!is_array($user_arbo) && $user_arbo < 0) {
//var_dump($data);
$param = "&search_statut=".urlencode($search_statut);
+ $param = "&contextpage=".urlencode($contextpage);
$newcardbutton = '';
$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars paddingleft imgforviewmode', DOL_URL_ROOT.'/user/list.php?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition'));
diff --git a/htdocs/user/list.php b/htdocs/user/list.php
index 04f8e5679fd..d472ae3e9f4 100644
--- a/htdocs/user/list.php
+++ b/htdocs/user/list.php
@@ -41,9 +41,10 @@ $show_files = GETPOST('show_files', 'int'); // Show files area generated by bulk
$confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
$cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
$toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
-$contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'userlist'; // To manage different context of search
+$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'userlist'; // To manage different context of search
$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
+$mode = GETPOST("mode", 'alpha');
// Security check (for external users)
$socid = 0;
@@ -51,9 +52,6 @@ if ($user->socid > 0) {
$socid = $user->socid;
}
-// Load mode employee
-$mode = GETPOST("mode", 'alpha');
-
// Load variable for pagination
$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
$sortfield = GETPOST('sortfield', 'aZ09comma');
@@ -125,7 +123,7 @@ $arrayfields = array(
'u.firstname'=>array('label'=>"Firstname", 'checked'=>1, 'position'=>20),
'u.entity'=>array('label'=>"Entity", 'checked'=>1, 'position'=>50, 'enabled'=>(isModEnabled('multicompany') && empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE))),
'u.gender'=>array('label'=>"Gender", 'checked'=>0, 'position'=>22),
- 'u.employee'=>array('label'=>"Employee", 'checked'=>($mode == 'employee' ? 1 : 0), 'position'=>25),
+ 'u.employee'=>array('label'=>"Employee", 'checked'=>($contextpage == 'employeelist' ? 1 : 0), 'position'=>25),
'u.fk_user'=>array('label'=>"HierarchicalResponsible", 'checked'=>1, 'position'=>27),
'u.accountancy_code'=>array('label'=>"AccountancyCode", 'checked'=>0, 'position'=>30),
'u.office_phone'=>array('label'=>"PhonePro", 'checked'=>1, 'position'=>31),
@@ -163,15 +161,28 @@ $search_statut = GETPOST('search_statut', 'intcomma');
$search_thirdparty = GETPOST('search_thirdparty', 'alpha');
$search_warehouse = GETPOST('search_warehouse', 'alpha');
$search_supervisor = GETPOST('search_supervisor', 'intcomma');
-$optioncss = GETPOST('optioncss', 'alpha');
$search_categ = GETPOST("search_categ", 'int');
+$searchCategoryUserOperator = 0;
+if (GETPOSTISSET('formfilteraction')) {
+ $searchCategoryUserOperator = GETPOSTINT('search_category_user_operator');
+} elseif (!empty($conf->global->MAIN_SEARCH_CAT_OR_BY_DEFAULT)) {
+ $searchCategoryUserOperator = $conf->global->MAIN_SEARCH_CAT_OR_BY_DEFAULT;
+}
+$searchCategoryUserList = GETPOST('search_category_user_list', 'array');
$catid = GETPOST('catid', 'int');
+if (!empty($catid) && empty($searchCategoryUserList)) {
+ $searchCategoryUserList = array($catid);
+}
+$catid = GETPOST('catid', 'int');
+if (!empty($catid) && empty($search_categ)) {
+ $search_categ = $catid;
+}
// Default search
if ($search_statut == '') {
$search_statut = '1';
}
-if ($mode == 'employee' && !GETPOSTISSET('search_employee')) {
+if ($contextpage == 'employeelist' && !GETPOSTISSET('search_employee')) {
$search_employee = 1;
}
@@ -190,7 +201,7 @@ if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS)) {
$error = 0;
// Permission to list
-if ($mode == 'employee') {
+if ($contextpage == 'employeelist' && $search_employee == 1) {
if (!$user->hasRight("salaries", "read")) {
accessforbidden();
}
@@ -368,9 +379,6 @@ if (isset($extrafields->attributes[$object->table_element]['label']) && is_array
}
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON u.fk_soc = s.rowid";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u2 ON u.fk_user = u2.rowid";
-if (!empty($search_categ) || !empty($catid)) {
- $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_user as cu ON u.rowid = cu.fk_user"; // We'll need this table joined to the select in order to filter by categ
-}
// Add table from hooks
$parameters = array();
$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
@@ -428,22 +436,39 @@ if ($search_statut != '' && $search_statut >= 0) {
if ($sall) {
$sql .= natural_search(array_keys($fieldstosearchall), $sall);
}
-if ($catid > 0) {
- $sql .= " AND cu.fk_categorie = ".((int) $catid);
-}
-if ($catid == -2) {
- $sql .= " AND cu.fk_categorie IS NULL";
-}
-if ($search_categ > 0) {
- $sql .= " AND cu.fk_categorie = ".((int) $search_categ);
-}
-if ($search_categ == -2) {
- $sql .= " AND cu.fk_categorie IS NULL";
+// Search for tag/category ($searchCategoryUserList is an array of ID)
+$searchCategoryUserList = array($search_categ);
+if (!empty($searchCategoryUserList)) {
+ $searchCategoryUserSqlList = array();
+ $listofcategoryid = '';
+ foreach ($searchCategoryUserList as $searchCategoryUser) {
+ if (intval($searchCategoryUser) == -2) {
+ $searchCategoryUserSqlList[] = "NOT EXISTS (SELECT ck.fk_user FROM ".MAIN_DB_PREFIX."categorie_user as ck WHERE u.rowid = ck.fk_user)";
+ } elseif (intval($searchCategoryUser) > 0) {
+ if ($searchCategoryUserOperator == 0) {
+ $searchCategoryUserSqlList[] = " EXISTS (SELECT ck.fk_user FROM ".MAIN_DB_PREFIX."categorie_user as ck WHERE u.rowid = ck.fk_user AND ck.fk_categorie = ".((int) $searchCategoryUser).")";
+ } else {
+ $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryUser);
+ }
+ }
+ }
+ if ($listofcategoryid) {
+ $searchCategoryUserSqlList[] = " EXISTS (SELECT ck.fk_user FROM ".MAIN_DB_PREFIX."categorie_user as ck WHERE u.rowid = ck.fk_user AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
+ }
+ if ($searchCategoryUserOperator == 1) {
+ if (!empty($searchCategoryUserSqlList)) {
+ $sql .= " AND (".implode(' OR ', $searchCategoryUserSqlList).")";
+ }
+ } else {
+ if (!empty($searchCategoryUserSqlList)) {
+ $sql .= " AND (".implode(' AND ', $searchCategoryUserSqlList).")";
+ }
+ }
}
if ($search_warehouse > 0) {
$sql .= " AND u.fk_warehouse = ".((int) $search_warehouse);
}
-if ($mode == 'employee' && !$user->hasRight("salaries", "readall")) {
+if ($contextpage == 'employeelist' && !$user->hasRight("salaries", "readall")) {
$sql .= " AND u.rowid IN (".$db->sanitize(join(',', $childids)).")";
}
// Add where from extra fields
@@ -470,7 +495,7 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
}
}*/
/* The fast and low memory method to get and count full list converts the sql into a sql count */
- $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
+ $sqlforcount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/Ui', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
$resql = $db->query($sqlforcount);
if ($resql) {
$objforcount = $db->fetch_object($resql);
@@ -510,7 +535,6 @@ if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $
// Output page
// --------------------------------------------------------------------
-$title = $langs->trans("ListOfUsers");
llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'bodyforlist');
@@ -591,9 +615,12 @@ if ($permissiontoadd) {
if (isModEnabled('category') && $permissiontoadd) {
$arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("AffectTag");
}
+if ($permissiontoadd) {
+ $arrayofmassactions['presetsupervisor'] = img_picto('', 'user', 'class="pictofixedwidth"').$langs->trans("SetSupervisor");
+}
//if ($permissiontodelete) $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
-if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete', 'preaffecttag'))) {
+if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete', 'preaffecttag', 'presetsupervisor'))) {
$arrayofmassactions = array();
}
$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
@@ -610,7 +637,7 @@ print ' ';
print ' ';
print ' ';
-$url = DOL_URL_ROOT.'/user/card.php?action=create'.($mode == 'employee' ? '&employee=1' : '').'&leftmenu=';
+$url = DOL_URL_ROOT.'/user/card.php?action=create'.($contextpage == 'employeelist' ? '&search_employee=1' : '').'&leftmenu=';
if (!empty($socid)) {
$url .= '&socid='.urlencode($socid);
}
@@ -1075,14 +1102,15 @@ while ($i < $imaxinloop) {
}
}
+ // Phone
if (!empty($arrayfields['u.office_phone']['checked'])) {
- print ''.dol_print_phone($obj->office_phone, $obj->country_code, 0, $obj->rowid, 'AC_TEL', ' ', 'phone')." \n";
+ print ''.dol_print_phone($obj->office_phone, $obj->country_code, 0, $obj->rowid, 'AC_TEL', ' ', 'phone')." \n";
if (!$i) {
$totalarray['nbfield']++;
}
}
if (!empty($arrayfields['u.user_mobile']['checked'])) {
- print ''.dol_print_phone($obj->user_mobile, $obj->country_code, 0, $obj->rowid, 'AC_TEL', ' ', 'mobile')." \n";
+ print ''.dol_print_phone($obj->user_mobile, $obj->country_code, 0, $obj->rowid, 'AC_TEL', ' ', 'mobile')." \n";
if (!$i) {
$totalarray['nbfield']++;
}
@@ -1094,10 +1122,10 @@ while ($i < $imaxinloop) {
}
}
if (!empty($arrayfields['u.api_key']['checked'])) {
- print '';
+ print ' ';
if ($obj->api_key) {
if ($canreadsecretapi) {
- print $obj->api_key;
+ print dol_escape_htmltag($obj->api_key);
} else {
print ''.$langs->trans("Hidden").' ';
}
diff --git a/htdocs/user/passwordforgotten.php b/htdocs/user/passwordforgotten.php
index eee3816ca67..96054b0d802 100644
--- a/htdocs/user/passwordforgotten.php
+++ b/htdocs/user/passwordforgotten.php
@@ -51,6 +51,8 @@ if (!$mode) {
$username = GETPOST('username', 'alphanohtml');
$passworduidhash = GETPOST('passworduidhash', 'alpha');
+$setnewpassword = GETPOST('setnewpassword', 'aZ09');
+
$conf->entity = (GETPOST('entity', 'int') ? GETPOST('entity', 'int') : 1);
// Instantiate hooks of thirdparty module only if not already define
@@ -90,7 +92,7 @@ if (empty($reshook)) {
$edituser = new User($db);
$result = $edituser->fetch('', $username);
if ($result < 0) {
- $message = ''.dol_escape_htmltag($langs->trans("ErrorLoginDoesNotExists", $username)).'
';
+ $message = ''.dol_escape_htmltag($langs->trans("ErrorTechnicalError")).'
';
} else {
global $dolibarr_main_instance_unique_id;
@@ -98,7 +100,7 @@ if (empty($reshook)) {
if ($edituser->pass_temp && dol_verifyHash($edituser->pass_temp.'-'.$edituser->id.'-'.$dolibarr_main_instance_unique_id, $passworduidhash)) {
// Clear session
unset($_SESSION['dol_login']);
- $_SESSION['dol_loginmesg'] = $langs->transnoentitiesnoconv('NewPasswordValidated'); // Save message for the session page
+ $_SESSION['dol_loginmesg'] = ''.$langs->transnoentitiesnoconv('NewPasswordValidated'); // Save message for the session page
$newpassword = $edituser->setPassword($user, $edituser->pass_temp, 0);
dol_syslog("passwordforgotten.php new password for user->id=".$edituser->id." validated in database");
@@ -111,7 +113,8 @@ if (empty($reshook)) {
}
}
}
- // Action modif mot de passe
+
+ // Action to set a temporary password and send email for reset
if ($action == 'buildnewpassword' && $username) {
$sessionkey = 'dol_antispam_value';
$ok = (array_key_exists($sessionkey, $_SESSION) === true && (strtolower($_SESSION[$sessionkey]) == strtolower(GETPOST('code'))));
@@ -128,36 +131,34 @@ if (empty($reshook)) {
$result = $edituser->fetch('', '', '', 1, -1, $username);
}
+ // Set the message to show (must be the same if login/email exists or not
+ // to avoid to guess them.
+ $messagewarning = '';
+ if (!$isanemail) {
+ $messagewarning .= $langs->trans("IfLoginExistPasswordRequestSent");
+ } else {
+ $messagewarning .= $langs->trans("IfEmailExistPasswordRequestSent");
+ }
+ $messagewarning .= '
';
+
if ($result <= 0 && $edituser->error == 'USERNOTFOUND') {
- $message = '';
- if (!$isanemail) {
- $message .= $langs->trans("IfLoginExistPasswordRequestSent");
- } else {
- $message .= $langs->trans("IfEmailExistPasswordRequestSent");
- }
- $message .= '
';
+ $message .= $messagewarning;
$username = '';
} else {
- if (!$edituser->email) {
- $message = ''.$langs->trans("ErrorLoginHasNoEmail").'
';
+ if (empty($edituser->email)) {
+ $message .= $messagewarning;
} else {
$newpassword = $edituser->setPassword($user, '', 1);
if ($newpassword < 0) {
- // Failed
+ // Technical failure
$message = ''.$langs->trans("ErrorFailedToChangePassword").'
';
} else {
// Success
if ($edituser->send_password($user, $newpassword, 1) > 0) {
- $message = '';
- if (!$isanemail) {
- $message .= $langs->trans("IfLoginExistPasswordRequestSent");
- } else {
- $message .= $langs->trans("IfEmailExistPasswordRequestSent");
- }
- //$message .= $langs->trans("PasswordChangeRequestSent", $edituser->login, dolObfuscateEmail($edituser->email));
- $message .= '
';
+ $message .= $messagewarning;
$username = '';
} else {
+ // Technical failure
$message .= ''.$edituser->error.'
';
}
}
@@ -237,4 +238,8 @@ $parameters = array('entity' => GETPOST('entity', 'int'));
$reshook = $hookmanager->executeHooks('getPasswordForgottenPageExtraOptions', $parameters); // Note that $action and $object may have been modified by some hooks.
$moreloginextracontent = $hookmanager->resPrint;
-include $template_dir.'passwordforgotten.tpl.php'; // To use native PHP
+if (empty($setnewpassword)) {
+ include $template_dir.'passwordforgotten.tpl.php'; // To use native PHP
+} else {
+ include $template_dir.'passwordreset.tpl.php'; // To use native PHP
+}
diff --git a/htdocs/user/perms.php b/htdocs/user/perms.php
index 6dca3bdca83..1ededd091b3 100644
--- a/htdocs/user/perms.php
+++ b/htdocs/user/perms.php
@@ -44,6 +44,7 @@ $action = GETPOST('action', 'aZ09');
$confirm = GETPOST('confirm', 'alpha');
$module = GETPOST('module', 'alpha');
$rights = GETPOST('rights', 'int');
+$updatedmodulename = GETPOST('updatedmodulename', 'alpha');
$contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'userperms'; // To manage different context of search
if (!isset($id) || empty($id)) {
@@ -267,7 +268,7 @@ print '
';
print '';
// Login
-print ''.$langs->trans("Login").' ';
+print ''.$langs->trans("Login").' ';
if (!empty($object->ldap_sid) && $object->statut == 0) {
print '';
print $langs->trans("LoginAccountDisableInDolibarr");
@@ -306,7 +307,6 @@ if ($reshook < 0) {
setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
}
-
print "\n";
print '';
print '
';
@@ -320,13 +320,22 @@ if (($caneditperms && empty($objMod->rights_admin_allowed)) || empty($object->ad
print ' / ';
print 'id.'&action=delrights&token='.newToken().'&entity='.$entity.'&module=allmodules&confirm=yes">'.$langs->trans("None")." ";
print '';
+ } else {
+ print ' ';
}
print ' ';
+} else {
+ print ' ';
+ print ' ';
}
+
print ''.$langs->trans("Permissions").' ';
-if ($user->admin) {
- print ' ';
-}
+print '';
+print ''.img_picto('', 'folder-open', 'class="paddingright"').''.$langs->trans("ExpandAll").' ';
+print ' | ';
+print ''.img_picto('', 'folder', 'class="paddingright"').''.$langs->trans("UndoExpandAll").' ';
+print ' ';
+
print ''."\n";
@@ -460,6 +469,11 @@ if ($result) {
}
*/
+ $isexpanded = ($updatedmodulename == $obj->module || $module == "allmodules");
+ if (!$action) {
+ $isexpanded = 1; // By default (no action done) we have lines expanded
+ }
+
// Break found, it's a new module to catch
if (isset($obj->module) && ($oldmod <> $obj->module)) {
$oldmod = $obj->module;
@@ -469,38 +483,51 @@ if ($result) {
$picto = ($objMod->picto ? $objMod->picto : 'generic');
// Show break line
- print '';
+ print ' ';
print '';
print img_object('', $picto, 'class="pictoobjectwidth paddingright"').' '.$objMod->getName();
print ' ';
print ' ';
if (($caneditperms && empty($objMod->rights_admin_allowed)) || empty($object->admin)) {
if ($caneditperms) {
- print '';
- print 'id.'&action=addrights&token='.newToken().'&entity='.$entity.'&module='.$obj->module.'&confirm=yes">'.$langs->trans("All")." ";
+ print ' ';
+ print 'id.'&action=addrights&token='.newToken().'&entity='.$entity.'&module='.$obj->module.'&confirm=yes&updatedmodulename='.$obj->module.'">'.$langs->trans("All")." ";
print ' / ';
- print 'id.'&action=delrights&token='.newToken().'&entity='.$entity.'&module='.$obj->module.'&confirm=yes">'.$langs->trans("None")." ";
+ print 'id.'&action=delrights&token='.newToken().'&entity='.$entity.'&module='.$obj->module.'&confirm=yes&updatedmodulename='.$obj->module.'">'.$langs->trans("None")." ";
print ' ';
+ print ' ';
+ } else {
+ print ' ';
}
print ' ';
} else {
if ($caneditperms) {
- print ' ';
+ print '';
+ print 'id.'&action=addrights&token='.newToken().'&entity='.$entity.'&module='.$obj->module.'&confirm=yes&updatedmodulename='.$obj->module.'">'.$langs->trans("All")." ";
+ print ' / ';
+ print 'id.'&action=delrights&token='.newToken().'&entity='.$entity.'&module='.$obj->module.'&confirm=yes&updatedmodulename='.$obj->module.'">'.$langs->trans("None")." ";
+ print ' ';
+ print ' ';
+ } else {
+ print ' ';
}
print ' ';
}
print ' ';
- // Permission id
- if ($user->admin) {
- print ' ';
- }
-
+ print '';
+ print '';
+ print img_picto('', 'folder', 'class="marginright"');
+ print '
';
+ print '';
+ print img_picto('', 'folder-open', 'class="marginright"');
+ print '
';
+ print ' '; //Add picto + / - when open en closed
print ' '."\n";
}
print ''."\n";
- print '';
+ print ' ';
// Picto and label of module
print '';
@@ -511,16 +538,20 @@ if ($result) {
if (!empty($object->admin) && !empty($objMod->rights_admin_allowed)) { // Permission granted because admin
if ($caneditperms) {
print ' '.img_picto($langs->trans("Administrator"), 'star').' ';
+ } else {
+ print ' ';
}
print '';
print img_picto($langs->trans("Active"), 'tick');
print ' ';
} elseif (in_array($obj->id, $permsuser)) { // Permission granted by user
if ($caneditperms) {
- print 'id.'&action=delrights&token='.newToken().'&entity='.$entity.'&rights='.$obj->id.'&confirm=yes">';
+ print ' id.'&action=delrights&token='.newToken().'&entity='.$entity.'&rights='.$obj->id.'&confirm=yes&updatedmodulename='.$obj->module.'">';
//print img_edit_remove($langs->trans("Remove"));
print img_picto($langs->trans("Remove"), 'switch_on');
print ' ';
+ } else {
+ print ' ';
}
print '';
print img_picto($langs->trans("Active"), 'tick');
@@ -531,6 +562,8 @@ if ($result) {
print ' ';
print $form->textwithtooltip($langs->trans("Inherited"), $langs->trans("PermissionInheritedFromAGroup"));
print ' ';
+ } else {
+ print ' ';
}
print '';
print img_picto($langs->trans("Active"), 'tick');
@@ -538,27 +571,35 @@ if ($result) {
} else {
// Do not own permission
if ($caneditperms) {
- print ' id.'&action=addrights&entity='.$entity.'&rights='.$obj->id.'&confirm=yes&token='.newToken().'">';
+ print ' id.'&action=addrights&entity='.$entity.'&rights='.$obj->id.'&confirm=yes&token='.newToken().'&updatedmodulename='.$obj->module.'">';
//print img_edit_add($langs->trans("Add"));
print img_picto($langs->trans("Add"), 'switch_off');
print ' ';
+ } else {
+ print ' ';
}
print ' ';
}
} else {
// Do not own permission
if ($caneditperms) {
- print 'id.'&action=addrights&entity='.$entity.'&rights='.$obj->id.'&confirm=yes&token='.newToken().'">';
+ print ' id.'&action=addrights&entity='.$entity.'&rights='.$obj->id.'&confirm=yes&token='.newToken().'&updatedmodulename='.$obj->module.'">';
//print img_edit_add($langs->trans("Add"));
print img_picto($langs->trans("Add"), 'switch_off');
print ' ';
+ } else {
+ print ' ';
}
print ' ';
}
// Description of permission
$permlabel = (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ($langs->trans("PermissionAdvanced".$obj->id) != ("PermissionAdvanced".$obj->id)) ? $langs->trans("PermissionAdvanced".$obj->id) : (($langs->trans("Permission".$obj->id) != ("Permission".$obj->id)) ? $langs->trans("Permission".$obj->id) : $langs->trans($obj->label)));
- print '';
+ if (!$user->admin) {
+ print ' ';
+ } else {
+ print ' ';
+ }
print $permlabel;
if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS)) {
if (preg_match('/_advance$/', $obj->perms)) {
@@ -587,6 +628,56 @@ if ($result) {
print '
';
print '
';
+print '';
+
+print '';
+
$parameters = array();
$reshook = $hookmanager->executeHooks('insertExtraFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
if ($reshook < 0) {
diff --git a/htdocs/variants/ajax/get_attribute_values.php b/htdocs/variants/ajax/get_attribute_values.php
index 8f522bb8107..1867eb368de 100644
--- a/htdocs/variants/ajax/get_attribute_values.php
+++ b/htdocs/variants/ajax/get_attribute_values.php
@@ -74,7 +74,7 @@ if ($prodattr->fetch($id) < 0) {
$prodattrval = new ProductAttributeValue($db);
-$res = $prodattrval->fetchAllByProductAttribute($id);
+$res = $prodattrval->fetchAllByProductAttribute($id, false, 1);
if ($res == -1) {
print json_encode(array(
diff --git a/htdocs/variants/card.php b/htdocs/variants/card.php
index 956d95f0a82..634290ca187 100644
--- a/htdocs/variants/card.php
+++ b/htdocs/variants/card.php
@@ -214,6 +214,9 @@ if ($action == 'create') {
// Common attributes
include DOL_DOCUMENT_ROOT . '/core/tpl/commonfields_edit.tpl.php';
+ $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+ print $hookmanager->resPrint;
+
print '
';
print dol_get_fiche_end();
@@ -324,24 +327,11 @@ if ($action == 'create') {
print '';
if (!empty($object->lines) || ($permissiontoedit && $action != 'selectlines' && $action != 'editline')) {
- print '
';
- }
-
- // Form to add new line
- if ($permissiontoedit && $action != 'selectlines') {
- if ($action != 'editline') {
- // Add products/services form
-
- $parameters = array();
- $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
- if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
- if (empty($reshook))
- $object->formAddObjectLine(1, $mysoc, $soc);
- }
+ print '';
}
if (!empty($object->lines)) {
- $object->printObjectLines($action, $mysoc, null, GETPOST('lineid', 'int'), 1);
+ $object->printObjectLines($action, $mysoc, null, GETPOST('lineid', 'int'), 1, '/variants/tpl', ($permissiontoedit ? 1 : 0));
}
if (!empty($object->lines) || ($permissiontoedit && $action != 'selectlines' && $action != 'editline')) {
diff --git a/htdocs/variants/class/ProductAttribute.class.php b/htdocs/variants/class/ProductAttribute.class.php
index fc96f247e63..ae82873d8bd 100644
--- a/htdocs/variants/class/ProductAttribute.class.php
+++ b/htdocs/variants/class/ProductAttribute.class.php
@@ -1272,11 +1272,13 @@ class ProductAttribute extends CommonObject
* @param int $selected Object line selected
* @param int $dateSelector 1=Show also date range input fields
* @param string $defaulttpldir Directory where to find the template
+ * @param int $addcreateline 1=Add create line
* @return void
*/
- public function printObjectLines($action, $seller, $buyer, $selected = 0, $dateSelector = 0, $defaulttpldir = '/variants/tpl')
+ public function printObjectLines($action, $seller, $buyer, $selected = 0, $dateSelector = 0, $defaulttpldir = '/variants/tpl', $addcreateline = 0)
{
global $conf, $hookmanager, $langs, $user, $form, $object;
+ global $mysoc;
// TODO We should not use global var for this
global $disableedit, $disablemove, $disableremove;
@@ -1306,9 +1308,25 @@ class ProductAttribute extends CommonObject
}
}
+
+ if ($addcreateline) {
+ // Form to add new line
+ if ($action != 'selectlines') {
+ if ($action != 'editline') {
+ // Add products/services form
+
+ $parameters = array();
+ $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
+ if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+ if (empty($reshook))
+ $object->formAddObjectLine(1, $mysoc, $buyer);
+ }
+ }
+ }
+
$i = 0;
- print "\n";
+ print "\n";
foreach ($this->lines as $line) {
if (is_object($hookmanager)) { // Old code is commented on preceding line.
$parameters = array('line' => $line, 'num' => $num, 'i' => $i, 'selected' => $selected, 'table_element_line' => $line->table_element);
@@ -1320,7 +1338,7 @@ class ProductAttribute extends CommonObject
$i++;
}
- print " \n";
+ print "\n";
}
/**
diff --git a/htdocs/variants/class/ProductAttributeValue.class.php b/htdocs/variants/class/ProductAttributeValue.class.php
index d6da6bcd95a..734e82b7c27 100644
--- a/htdocs/variants/class/ProductAttributeValue.class.php
+++ b/htdocs/variants/class/ProductAttributeValue.class.php
@@ -259,11 +259,12 @@ class ProductAttributeValue extends CommonObjectLine
/**
* Returns all product attribute values of a product attribute
*
- * @param int $prodattr_id Product attribute id
- * @param bool $only_used Fetch only used attribute values
- * @return ProductAttributeValue[]
+ * @param int $prodattr_id Product attribute id
+ * @param bool $only_used Fetch only used attribute values
+ * @param int $returnonlydata 0: return object, 1: return only data
+ * @return ProductAttributeValue[] Array of object
*/
- public function fetchAllByProductAttribute($prodattr_id, $only_used = false)
+ public function fetchAllByProductAttribute($prodattr_id, $only_used = false, $returnonlydata = 0)
{
$return = array();
@@ -290,7 +291,12 @@ class ProductAttributeValue extends CommonObjectLine
$query = $this->db->query($sql);
while ($result = $this->db->fetch_object($query)) {
- $tmp = new ProductAttributeValue($this->db);
+ if (empty($returnonlydata)) {
+ $tmp = new ProductAttributeValue($this->db);
+ } else {
+ $tmp = new stdClass();
+ }
+
$tmp->fk_product_attribute = $result->fk_product_attribute;
$tmp->id = $result->rowid;
$tmp->ref = $result->ref;
diff --git a/htdocs/variants/combinations.php b/htdocs/variants/combinations.php
index 0f149a4dd6a..64a18cf2a74 100644
--- a/htdocs/variants/combinations.php
+++ b/htdocs/variants/combinations.php
@@ -496,7 +496,7 @@ if (!empty($id) || !empty($ref)) {
}
if ($action == 'add') {
- $prodattr_all = $prodattr->fetchAll();
+ $prodattr_all = $prodattr->fetchAll(1);
if (!$selected) {
$selected = $prodattr_all[key($prodattr_all)]->id;
@@ -507,7 +507,6 @@ if (!empty($id) || !empty($ref)) {
foreach ($prodattr_all as $each) {
$prodattr_alljson[$each->id] = $each;
}
-
?>
'."\n";
$htmlheadercontentdefault .= ''."\n";
-$htmlheadercontentdefault .= ''."\n";
-$htmlheadercontentdefault .= ''."\n";
-$htmlheadercontentdefault .= ''."\n";
$htmlheadercontentdefault .= '';
+ print '';
if ($action != 'file_manager') {
- print '';
+ print '';
print $langs->trans("Website").': ';
+ print '
';
+
+ // Button Add new website
+ $urltocreatenewwebsite = $_SERVER["PHP_SELF"].'?action=createsite';
+ print '';
+ print ' ';
print ' ';
- $urltocreatenewwebsite = $_SERVER["PHP_SELF"].'?action=createsite';
- if (empty($conf->use_javascript_ajax)) {
- print '';
- print ' ';
- print ' ';
- }
-
// List of website
- print '';
+ print '';
+
$out = '';
$out .= '';
if (empty($object->records)) {
$out .= ' ';
}
- if (!empty($conf->use_javascript_ajax)) {
- $valueoption = ''.img_picto('', 'add', 'class="paddingrightonly"').$langs->trans("AddWebsite").' ';
- $out .= ''.$valueoption.' ';
- }
+
// Loop on each sites
$i = 0;
foreach ($object->records as $key => $valwebsite) {
@@ -2758,16 +2839,40 @@ if (!GETPOST('hide_websitemenu')) {
}
print $out;
- if (empty($conf->use_javascript_ajax)) {
- print ' ';
+ print ' ';
+
+ // Switch offline/onine
+ if (!empty($conf->use_javascript_ajax)) {
+ print '';
+ // Do not use ajax, we need a refresh of full page when we change status of a website
+ //print '';
+ //print ajax_object_onoff($object, 'status', 'status', 'Online', 'Offline', array(), 'valignmiddle', 'statuswebsite');
+ //print '
';
+ if ($website->status == $website::STATUS_DRAFT) {
+ $text_off = 'Offline';
+ print 'ref).'&websitepage='.((int) $websitepage->id).'">'.img_picto($langs->trans($text_off), 'switch_off').' ';
+ } else {
+ $text_off = 'Online';
+ print 'ref).'&websitepage='.((int) $websitepage->id).'">'.img_picto($langs->trans($text_off), 'switch_on').' ';
+ }
+ print ' ';
}
+ // Refresh / Reload web site (for non javascript browers)
+ if (empty($conf->use_javascript_ajax)) {
+ print '';
+ print ' ';
+ print ' ';
+ }
+
+
+ print '';
+
if ($websitekey && $websitekey != '-1' && ($action == 'preview' || $action == 'createfromclone' || $action == 'createpagefromclone' || $action == 'deletesite')) {
- print ' ';
-
- //print ' ';
- print 'ref.'&pageid='.$pageid.'&action=editcss&token='.newToken().'" class="button bordertransp" title="'.dol_escape_htmltag($langs->trans("EditCss")).'"'.$disabled.'>'.dol_escape_htmltag($langs->trans("EditCss")).' ';
+ // Edit website properties
+ print 'ref).'&pageid='.((int) $pageid).'&action=editcss&token='.newToken().'" class="button bordertransp" title="'.dol_escape_htmltag($langs->trans("EditCss")).'"'.$disabled.'>'.dol_escape_htmltag($langs->trans("EditCss")).' ';
+ // Import web site
$importlabel = $langs->trans("ImportSite");
$exportlabel = $langs->trans("ExportSite");
if (!empty($conf->dol_optimize_smallscreen)) {
@@ -2781,17 +2886,23 @@ if (!GETPOST('hide_websitemenu')) {
print ' ';
}
- //print ' ';
+ // Export web site
print ' ';
+ // Clone web site
print ' ';
// Delete website
if ($website->status == $website::STATUS_VALIDATED) {
- print ' ';
+ $disabled = ' disabled="disabled"';
+ $title = $langs->trans("WebsiteMustBeDisabled", $langs->transnoentitiesnoconv($website->LibStatut(0, 0)));
+ $url = '#';
} else {
- print ' ';
+ $disabled = '';
+ $title = $langs->trans("Delete");
+ $url = $_SERVER["PHP_SELF"].'?action=deletesite&token='.newToken().'&website='.urlencode($website->ref);
}
+ print ''.img_picto('', 'delete', 'class=""').''.$langs->trans("Delete").' ';
// Regenerate all pages
print 'ref).'" class="button bordertransp"'.$disabled.' title="'.dol_escape_htmltag($langs->trans("RegenerateWebsiteContent")).'"> ';
@@ -2799,7 +2910,8 @@ if (!GETPOST('hide_websitemenu')) {
// Generate site map
print 'ref).'" class="button bordertransp"'.$disabled.' title="'.dol_escape_htmltag($langs->trans("GenerateSitemaps")).'"> ';
- print 'ref).'" class="button bordertransp"'.$disabled.' title="'.dol_escape_htmltag($langs->trans("ReplaceWebsiteContent")).'"> ';
+ // Find / replace tool
+ print 'ref).'" class="button bordertransp"'.$disabled.' title="'.dol_escape_htmltag($langs->trans("ReplaceWebsiteContent")).'"> ';
}
print ' ';
@@ -2879,7 +2991,7 @@ if (!GETPOST('hide_websitemenu')) {
print ' ';
}
- if (in_array($action, array('editcss', 'editmenu', 'file_manager', 'replacesite', 'replacesiteconfirm'))) {
+ if (in_array($action, array('editcss', 'editmenu', 'file_manager', 'replacesiteconfirm')) || in_array($mode, array('replacesite'))) {
if ($action == 'editcss') {
print ' ';
}
@@ -2900,59 +3012,69 @@ if (!GETPOST('hide_websitemenu')) {
// Toolbar for pages
//
- if ($websitekey && $websitekey != '-1' && !in_array($action, array('editcss', 'editmenu', 'importsite', 'file_manager', 'replacesite', 'replacesiteconfirm')) && !$file_manager) {
+ if ($websitekey && $websitekey != '-1' && (!in_array($action, array('editcss', 'editmenu', 'importsite', 'file_manager', 'replacesiteconfirm'))) && (!in_array($mode, array('replacesite'))) && !$file_manager) {
print ''; // Close current websitebar to open a new one
- print '';
+ print '';
print '';
- print '
';
+ print '';
print $langs->trans("PageContainer").': ';
+ print '
';
+
+ // Button Add new web page
+ print '';
+ print 'ref).'" class=""'.$disabled.' title="'.dol_escape_htmltag($langs->trans("AddPage")).'"> ';
print ' ';
- print '';
- print 'ref).'" class="button bordertransp"'.$disabled.' title="'.dol_escape_htmltag($langs->trans("AddPage")).'"> ';
- print ' ';
- //print '';
+ $out = '';
- if ($action != 'addcontainer') {
- $out = '';
+ $s = $formwebsite->selectContainer($website, 'pageid', $pageid, 0, $action, 'minwidth100 maxwidth200onsmartphone');
- $s = $formwebsite->selectContainer($website, 'pageid', $pageid, 0, $action, 'maxwidth200onsmartphone');
+ $out .= '';
+ $out .= $s;
+ $out .= ' ';
- if ($formwebsite->num > 0) {
- $out .= '';
- $out .= $s;
- $out .= ' ';
+ $urltocreatenewpage = $_SERVER["PHP_SELF"].'?action=createcontainer&token='.newToken().'&website='.urlencode($website->ref);
- $urltocreatenewpage = $_SERVER["PHP_SELF"].'?action=createcontainer&token='.newToken().'&website='.urlencode($website->ref);
-
- if (!empty($conf->use_javascript_ajax)) {
- $out .= '';
- }
- }
-
- print $out;
- } else {
- print $langs->trans("New");
+ if (!empty($conf->use_javascript_ajax)) {
+ $out .= '';
}
+ print $out;
+
+ if (!empty($conf->use_javascript_ajax)) {
+ print '';
+ //print '';
+ if ($object->status == $object::STATUS_DRAFT) { // website is off, we do not allow to change status of page
+ $text_off = 'SetWebsiteOnlineBefore';
+ if ($websitepage->status == $websitepage::STATUS_DRAFT) { // page is off
+ print ''.img_picto($langs->trans($text_off), 'switch_off').' ';
+ } else {
+ print ''.img_picto($langs->trans($text_off), 'switch_on').' ';
+ }
+ } else {
+ print ajax_object_onoff($websitepage, 'status', 'status', 'Online', 'Offline', array(), 'valignmiddle'.(empty($websitepage->id) ? ' opacitymedium disabled' : ''), 'statuswebsitepage');
+ }
+ //print '
';
+ print ' ';
+ }
print '';
- print ' ';
+ print ' ';
// Print nav arrows
$pagepreviousid = 0;
@@ -2981,23 +3103,18 @@ if (!GETPOST('hide_websitemenu')) {
}
if ($pagepreviousid) {
- print ''.img_previous($langs->trans("PreviousContainer")).' ';
+ print ''.img_previous($langs->trans("PreviousContainer")).' ';
} else {
print ''.img_previous($langs->trans("PreviousContainer")).' ';
}
if ($pagenextid) {
- print ''.img_next($langs->trans("NextContainer")).' ';
+ print ''.img_next($langs->trans("NextContainer")).' ';
} else {
print ''.img_next($langs->trans("NextContainer")).' ';
}
print ' ';
- $websitepage = new WebSitePage($db);
- if ($pageid > 0 && ($action == 'preview' || $action == 'createfromclone' || $action == 'createpagefromclone')) {
- $websitepage->fetch($pageid);
- }
-
if ($action == 'preview' || $action == 'createfromclone' || $action == 'createpagefromclone' || $action == 'deletesite') {
$disabled = '';
if (empty($user->rights->website->write)) {
@@ -3075,15 +3192,15 @@ if (!GETPOST('hide_websitemenu')) {
print '';
- print ' ';
-
- //print ' ';
+ // Edit web page properties
print 'ref.'&pageid='.$pageid.'&action=editmeta&token='.newToken().'" class="button bordertransp" title="'.dol_escape_htmltag($langs->trans("EditPageMeta")).'"'.$disabled.'>'.dol_escape_htmltag($langs->trans("EditPageMeta")).' ';
- //print ' ';
+ // Edit HTML content
print 'ref.'&pageid='.$pageid.'&action=editsource&token='.newToken().'" class="button bordertransp"'.$disabled.'>'.dol_escape_htmltag($langs->trans($conf->dol_optimize_smallscreen ? "HTML" : "EditHTMLSource")).' ';
print ' ';
+
+ // Switch include dynamic content / edit inline
print ''."\n";
print '';
@@ -3176,7 +3293,19 @@ if (!GETPOST('hide_websitemenu')) {
print '
ref).'&pageid='.((int) $pageid).'" class="button bordertransp"'.$disabled.' title="'.dol_escape_htmltag($langs->trans("SetAsHomePage")).'"> ';
}
print '
';
- print '
';
+
+ // Delete
+ //print '
';
+ if ($websitepage->status == $websitepage::STATUS_DRAFT || !$atleastonepage) {
+ $disabled = ' disabled="disabled"';
+ $title = $langs->trans("WebpageMustBeDisabled", $langs->transnoentitiesnoconv($websitepage->LibStatut(0, 0)));
+ $url = '#';
+ } else {
+ $disabled = '';
+ $title = '';
+ $url = $_SERVER["PHP_SELF"].'?action=delete&token='.newToken().'&website='.urlencode($website->ref);
+ }
+ print '
'.img_picto('', 'delete', 'class=""').''.$langs->trans("Delete").' ';
}
}
@@ -3220,7 +3349,7 @@ if (!GETPOST('hide_websitemenu')) {
// TODO Add js to save alias like we save virtual host name and use dynamic virtual host for url of id=previewpageext
}
- if (!in_array($action, array('editcss', 'editmenu', 'file_manager', 'replacesite', 'replacesiteconfirm', 'createsite', 'createcontainer', 'createfromclone', 'createpagefromclone', 'deletesite'))) {
+ if (!in_array($mode, array('replacesite')) && !in_array($action, array('editcss', 'editmenu', 'file_manager', 'replacesiteconfirm', 'createsite', 'createcontainer', 'createfromclone', 'createpagefromclone', 'deletesite'))) {
if ($action == 'editsource' || $action == 'editmeta') {
print '
';
}
@@ -3432,13 +3561,16 @@ if ($action == 'editcss') {
print '';
// Status of web site
- print ''."\n";
- print '
';
- print $langs->trans('Status');
- print ' ';
- print ajax_object_onoff($object, 'status', 'status', 'Enabled', 'Disabled');
- //print dol_print_date($pagedatecreation, 'dayhour');
- print ' ';
+ if ($action != 'createcontainer') {
+ if (empty($conf->use_javascript_ajax)) {
+ print ''."\n";
+ print '
';
+ print $langs->trans('Status');
+ print ' ';
+ print $form->selectyesno('status', $object->status);
+ print ' ';
+ }
+ }
// Main language
print '
';
@@ -3549,7 +3681,7 @@ if ($action == 'editcss') {
// Manifest.json
print ' ';
$htmlhelp = $langs->trans("Example").' : ';
- $htmlhelp .= dol_htmlentitiesbr($manifestjsoncontentdefault);
+ $htmlhelp .= ''.dol_htmlentitiesbr($manifestjsoncontentdefault).' ';
print $form->textwithpicto($langs->trans('WEBSITE_MANIFEST_JSON'), $htmlhelp, 1, 'help', '', 0, 2, 'manifestjsontooltip');
print ' ';
print $langs->trans("UseManifest").': '.$form->selectyesno('use_manifest', $website->use_manifest, 1).' ';
@@ -3817,7 +3949,7 @@ if ($action == 'editmeta' || $action == 'createcontainer') { // Edit properties
$pageusermodifid = $objectpage->fk_user_modif;
$pageauthoralias = $objectpage->author_alias;
$pagestatus = $objectpage->status;
- } else {
+ } else { // $action = 'createcontainer'
$type_container = 'page';
$pageurl = '';
$pagealiasalt = '';
@@ -3864,13 +3996,14 @@ if ($action == 'editmeta' || $action == 'createcontainer') { // Edit properties
}
if ($action != 'createcontainer') {
- print ''."\n";
- print ' ';
- print $langs->trans('Status');
- print ' ';
- print ajax_object_onoff($objectpage, 'status', 'status', 'Enabled', 'Disabled');
- //print dol_print_date($pagedatecreation, 'dayhour');
- print ' ';
+ if (empty($conf->use_javascript_ajax)) {
+ print ''."\n";
+ print '
';
+ print $langs->trans('Status');
+ print ' ';
+ print $form->selectyesno('status', $objectpage->status);
+ print ' ';
+ }
}
// Type of container
@@ -3881,6 +4014,7 @@ if ($action == 'editmeta' || $action == 'createcontainer') { // Edit properties
$formwebsite->selectTypeOfContainer('WEBSITE_TYPE_CONTAINER', (GETPOST('WEBSITE_TYPE_CONTAINER', 'alpha') ? GETPOST('WEBSITE_TYPE_CONTAINER', 'alpha') : $type_container), 0, '', 1);
print '';
+ // Example/templates of page
if ($action == 'createcontainer') {
print '
';
print $langs->trans('WEBSITE_PAGE_EXAMPLE');
@@ -4115,6 +4249,7 @@ if ($action == 'editmeta' || $action == 'createcontainer') { // Edit properties
print ' ';
print '
';
+
if ($action == 'createcontainer') {
print '';
@@ -4143,7 +4278,10 @@ if ($action == 'editmeta' || $action == 'createcontainer') { // Edit properties
$arraygrabimagesinto = array('root'=>$langs->trans("WebsiteRootOfImages"), 'subpage'=>$langs->trans("SubdirOfPage"));
print $form->selectarray('grabimagesinto', $arraygrabimagesinto, GETPOSTISSET('grabimagesinto') ? GETPOST('grabimagesinto') : 'root', 0, 0, 0, '', 0, 0, 0, '', '', 1);
print ' ';
- print ' ';
+
+ print ' ';
+ print ' ';
+
print '';
print '
';
}
@@ -4283,10 +4421,11 @@ print "
\n";
print "\n";
-if ($action == 'replacesite' || $action == 'replacesiteconfirm' || $massaction == 'replace') {
+if ($mode == 'replacesite' || $massaction == 'replace') {
print '';
print ' ';
print ' ';
+ print ' ';
print ' ';
@@ -4364,7 +4503,7 @@ if ($action == 'replacesite' || $action == 'replacesiteconfirm' || $massaction =
print '';
- if ($action == 'replacesiteconfirm') {
+ if ($mode == 'replacesite') {
print ''."\n";
print '';
@@ -4376,18 +4515,21 @@ if ($action == 'replacesite' || $action == 'replacesiteconfirm' || $massaction =
$param = '';
$nbtotalofrecords = count($listofpages['list']);
$num = $limit;
- $permissiontodelete = $user->rights->website->delete;
+ $permissiontodelete = $user->hasRight('website', 'delete');
// List of mass actions available
$arrayofmassactions = array();
- if ($user->rights->website->writephp && $searchkey) {
- $arrayofmassactions['replace'] = $langs->trans("Replace");
+ if ($user->hasRight('website', 'writephp') && $searchkey) {
+ $arrayofmassactions['replace'] = img_picto('', 'replacement', 'class="pictofixedwidth"').$langs->trans("Replace");
}
- if ($user->rights->website->write) {
- $arrayofmassactions['setcategory'] = $langs->trans("ClassifyInCategory");
+ if ($user->hasRight('website', 'write')) {
+ $arrayofmassactions['setcategory'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("ClassifyInCategory");
+ }
+ if ($user->hasRight('website', 'write')) {
+ $arrayofmassactions['delcategory'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("RemoveCategory");
}
if ($permissiontodelete) {
- $arrayofmassactions['predelete'] = ' '.$langs->trans("Delete");
+ $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
}
if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete'))) {
$arrayofmassactions = array();
@@ -4398,8 +4540,8 @@ if ($action == 'replacesite' || $action == 'replacesiteconfirm' || $massaction =
$massactionbutton .= $langs->trans("ReplaceString");
$massactionbutton .= ' ';
$massactionbutton .= '
';
- $massactionbutton .= '';
- $massactionbutton .= $langs->trans("Category");
+ $massactionbutton .= '
';
+ $massactionbutton .= img_picto('', 'category').' '.$langs->trans("Category");
$massactionbutton .= ' '.$form->select_all_categories(Categorie::TYPE_WEBSITE_PAGE, GETPOSTISSET('setcategory') ? GETPOST('setcategory') : '', 'setcategory', 64, 0, 0, 0, 'minwidth300 alignstart');
include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
$massactionbutton .= ajax_combobox('setcategory');
@@ -4419,7 +4561,7 @@ if ($action == 'replacesite' || $action == 'replacesiteconfirm' || $massaction =
$trackid = 'wsp'.$object->id;
include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
- $param = 'action=replacesiteconfirm&website='.urlencode($website->ref);
+ $param = 'mode=replacesite&website='.urlencode($website->ref);
$param .= '&searchstring='.urlencode($searchkey);
if (GETPOST('optioncontent')) {
$param .= '&optioncontent=content';
@@ -4493,7 +4635,7 @@ if ($action == 'replacesite' || $action == 'replacesiteconfirm' || $massaction =
print '
';
- $param = '?action=replacesiteconfirm';
+ $param = '?mode=replacesite';
$param .= '&websiteid='.$website->id;
$param .= '&optioncontent='.GETPOST('optioncontent', 'aZ09');
$param .= '&optionmeta='.GETPOST('optionmeta', 'aZ09');
@@ -4542,7 +4684,8 @@ if ($action == 'replacesite' || $action == 'replacesiteconfirm' || $massaction =
}
print ''.img_picto($langs->trans("EditHTMLSource"), 'edit').' ';
- print ' '.ajax_object_onoff($answerrecord, 'status', 'status', 'Enabled', 'Disabled', array(), 'valignmiddle');
+ print ' ';
+ print ajax_object_onoff($answerrecord, 'status', 'status', 'Enabled', 'Disabled', array(), 'valignmiddle');
print ' ';
@@ -4581,7 +4724,7 @@ if ($action == 'replacesite' || $action == 'replacesiteconfirm' || $massaction =
}
print '';
- $param = '?action=replacesiteconfirm';
+ $param = '?mode=replacesite';
$param .= '&websiteid='.$website->id;
$param .= '&optioncontent='.GETPOST('optioncontent', 'aZ09');
$param .= '&optionmeta='.GETPOST('optionmeta', 'aZ09');
@@ -4680,7 +4823,7 @@ if ($action == 'replacesite' || $action == 'replacesiteconfirm' || $massaction =
print '';
}
-if ($action == 'preview' || $action == 'createfromclone' || $action == 'createpagefromclone') {
+if ((empty($action) || $action == 'preview' || $action == 'createfromclone' || $action == 'createpagefromclone') && !in_array($mode, array('replacesite'))) {
if ($pageid > 0 && $atleastonepage) {
// $filejs
// $filecss
diff --git a/htdocs/website/websiteaccount_card.php b/htdocs/website/websiteaccount_card.php
index 39e6e10e3d7..a9fabffba3c 100644
--- a/htdocs/website/websiteaccount_card.php
+++ b/htdocs/website/websiteaccount_card.php
@@ -63,19 +63,22 @@ if (empty($action) && empty($id) && empty($ref)) {
$action = 'view';
}
+// Load object
+include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once.
+
// Security check - Protection if external user
//if ($user->socid > 0) accessforbidden();
//if ($user->socid > 0) $socid = $user->socid;
//$result = restrictedArea($user, 'website', $id);
+if (empty($user->rights->websiteaccount->read)) {
+ accessforbidden('NotAllowed');
+}
// Permissions
$permissionnote = $user->rights->websiteaccount->write; // Used by the include of actions_setnotes.inc.php
$permissiondellink = $user->rights->websiteaccount->write; // Used by the include of actions_dellink.inc.php
$permissiontoadd = $user->rights->websiteaccount->write; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
-
-// Load object
-include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once.
-
+$permissiontodelete = $user->rights->websiteaccount->delete;
/*
@@ -320,8 +323,8 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
}
*/
- if ($user->rights->website->delete) {
- print ''."\n";
+ if ($permissiontodelete) {
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete);
}
}
print ''."\n";
diff --git a/htdocs/workstation/workstation_card.php b/htdocs/workstation/workstation_card.php
index 280478c2977..87ee470dce7 100644
--- a/htdocs/workstation/workstation_card.php
+++ b/htdocs/workstation/workstation_card.php
@@ -451,10 +451,10 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
// Clone
if ($permissiontoadd) {
- print ''.$langs->trans("ToClone").' '."\n";
+ print dolGetButtonAction($langs->trans("ToClone"), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&socid='.$object->socid.'&action=clone&object=workstation', 'clone', $permissiontoadd);
}
-
+ // Disable / Enable
if ($permissiontoadd) {
if ($object->status == $object::STATUS_ENABLED) {
print 'id.'&action=disable&token='.newToken().'">'.$langs->trans("Disable").' '."\n";
@@ -463,13 +463,8 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
}
}
-
- // Delete (need delete permission, or if draft, just need create/modify permission)
- if ($permissiontodelete) {
- print 'id.'&action=delete&token='.newToken().'">'.$langs->trans('Delete').' '."\n";
- } else {
- print ''.$langs->trans('Delete').' '."\n";
- }
+ // Delete
+ print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete);
}
print ''."\n";
}
diff --git a/scripts/accountancy/export-thirdpartyaccount.php b/scripts/accountancy/export-thirdpartyaccount.php
index a8a4363ba5c..d7793c3ced1 100755
--- a/scripts/accountancy/export-thirdpartyaccount.php
+++ b/scripts/accountancy/export-thirdpartyaccount.php
@@ -45,7 +45,7 @@ if (!$user->admin) {
// Date range
$year = GETPOST("year");
if (empty($year)) {
- $year_current = strftime("%Y", dol_now());
+ $year_current = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
$month_current = strftime("%m", dol_now());
$year_start = $year_current;
} else {
diff --git a/scripts/cron/cron_run_jobs.php b/scripts/cron/cron_run_jobs.php
index ee866203665..630ae8c9948 100755
--- a/scripts/cron/cron_run_jobs.php
+++ b/scripts/cron/cron_run_jobs.php
@@ -92,7 +92,7 @@ $hookmanager->initHooks(array('cli'));
$now = dol_now();
@set_time_limit(0);
-print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." ***** userlogin=".$userlogin." ***** ".dol_print_date($now, 'dayhourrfc')." *****\n";
+print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." - userlogin=".$userlogin." - ".dol_print_date($now, 'dayhourrfc')." *****\n";
// Check module cron is activated
if (empty($conf->cron->enabled)) {
@@ -164,6 +164,10 @@ $user->getrights();
if (isset($argv[3]) && $argv[3]) {
$id = $argv[3];
}
+$forcequalified = 0;
+if (isset($argv[4]) && $argv[4] == '--force') {
+ $forcequalified = 1;
+}
// create a jobs object
$object = new Cronjob($db);
@@ -246,7 +250,7 @@ if (is_array($qualifiedjobs) && (count($qualifiedjobs) > 0)) {
}
//If date_next_jobs is less of current date, execute the program, and store the execution time of the next execution in database
- if (($line->datenextrun < $now) && (empty($line->datestart) || $line->datestart <= $now) && (empty($line->dateend) || $line->dateend >= $now)) {
+ if ($forcequalified || (($line->datenextrun < $now) && (empty($line->datestart) || $line->datestart <= $now) && (empty($line->dateend) || $line->dateend >= $now))) {
echo " - qualified";
dol_syslog("cron_run_jobs.php line->datenextrun:".dol_print_date($line->datenextrun, 'dayhourrfc')." line->datestart:".dol_print_date($line->datestart, 'dayhourrfc')." line->dateend:".dol_print_date($line->dateend, 'dayhourrfc')." now:".dol_print_date($now, 'dayhourrfc'));
@@ -313,7 +317,7 @@ exit(0);
*/
function usage($path, $script_file)
{
- print "Usage: ".$script_file." securitykey userlogin|'firstadmin' [cronjobid]\n";
+ print "Usage: ".$script_file." securitykey userlogin|'firstadmin' [cronjobid] [--force]\n";
print "The script return 0 when everything worked successfully.\n";
print "\n";
print "On Linux system, you can have cron jobs ran automatically by adding an entry into cron.\n";
@@ -321,4 +325,6 @@ function usage($path, $script_file)
print "30 3 * * * ".$path.$script_file." securitykey userlogin > ".DOL_DATA_ROOT."/".$script_file.".log\n";
print "For example, to run pending tasks every 5mn, you can add this line:\n";
print "*/5 * * * * ".$path.$script_file." securitykey userlogin > ".DOL_DATA_ROOT."/".$script_file.".log\n";
+ print "\n";
+ print "The option --force allow to bypass the check on date of execution so job will be executed even if date is not yet reached.\n";
}
diff --git a/scripts/emailings/mailing-send.php b/scripts/emailings/mailing-send.php
index f427e42d8cb..78e4488ec46 100755
--- a/scripts/emailings/mailing-send.php
+++ b/scripts/emailings/mailing-send.php
@@ -307,7 +307,8 @@ if ($resql) {
}
// Fabrication du mail
$trackid = 'emailing-'.$obj->fk_mailing.'-'.$obj->rowid;
- $mail = new CMailFile($newsubject, $sendto, $from, $newmessage, $arr_file, $arr_mime, $arr_name, '', '', 0, $msgishtml, $errorsto, $arr_css, $trackid, $moreinheader, 'emailing');
+ $upload_dir_tmp = $upload_dir;
+ $mail = new CMailFile($newsubject, $sendto, $from, $newmessage, $arr_file, $arr_mime, $arr_name, '', '', 0, $msgishtml, $errorsto, $arr_css, $trackid, $moreinheader, 'emailing', '', $upload_dir_tmp);
if ($mail->error) {
$res = 0;
diff --git a/test/phpunit/AdminLibTest.php b/test/phpunit/AdminLibTest.php
index 317d486434e..6649aa19798 100644
--- a/test/phpunit/AdminLibTest.php
+++ b/test/phpunit/AdminLibTest.php
@@ -165,6 +165,9 @@ class AdminLibTest extends PHPUnit\Framework\TestCase
require_once dirname(__FILE__).'/../../htdocs/core/modules/modExpenseReport.class.php';
print "Enable module modExpenseReport";
$moduledescriptor=new modExpenseReport($db);
+
+ $result = $moduledescriptor->remove();
+
$result = $moduledescriptor->init();
print __METHOD__." result=".$result."\n";
$this->assertEquals(1, $result);
@@ -173,6 +176,9 @@ class AdminLibTest extends PHPUnit\Framework\TestCase
require_once dirname(__FILE__).'/../../htdocs/core/modules/modApi.class.php';
print "Enable module modAPI";
$moduledescriptor=new modApi($db);
+
+ $result = $moduledescriptor->remove();
+
$result = $moduledescriptor->init();
print __METHOD__." result=".$result."\n";
$this->assertEquals(1, $result);
diff --git a/test/phpunit/CodingPhpTest.php b/test/phpunit/CodingPhpTest.php
index 6af80a304ae..e0f36279437 100644
--- a/test/phpunit/CodingPhpTest.php
+++ b/test/phpunit/CodingPhpTest.php
@@ -178,6 +178,9 @@ class CodingPhpTest extends PHPUnit\Framework\TestCase
if (preg_match('/\/htdocs\/includes\//', $file['fullname'])) {
continue;
}
+ if (preg_match('/\/htdocs\/install\/doctemplates\/websites\//', $file['fullname'])) {
+ continue;
+ }
if (preg_match('/\/htdocs\/custom\//', $file['fullname'])) {
continue;
}
diff --git a/test/phpunit/CodingSqlTest.php b/test/phpunit/CodingSqlTest.php
index b04f6ed4737..00c7a5aebae 100644
--- a/test/phpunit/CodingSqlTest.php
+++ b/test/phpunit/CodingSqlTest.php
@@ -193,10 +193,10 @@ class CodingSqlTest extends PHPUnit\Framework\TestCase
$result=strpos($filecontent, '"');
if ($result) {
- $result=(! strpos($filecontent, '["') && ! strpos($filecontent, '{"'));
+ $result=(! strpos($filecontent, '["') && ! strpos($filecontent, '{"') && ! strpos($filecontent, '("'));
}
//print __METHOD__." Result for checking we don't have double quote = ".$result."\n";
- $this->assertTrue($result===false, 'Found double quote that is not [" neither {" (used for json content) into '.$file.'. Bad.');
+ $this->assertTrue($result===false, 'Found double quote that is not [" neither {" (used for json content) neither (" (used for content with string like isModEnabled("")) into '.$file.'. Bad.');
$result=strpos($filecontent, 'int(');
//print __METHOD__." Result for checking we don't have 'int(' instead of 'integer' = ".$result."\n";
diff --git a/test/phpunit/DateLibTest.php b/test/phpunit/DateLibTest.php
index 9e7fc91fc7a..6f50e5b3085 100644
--- a/test/phpunit/DateLibTest.php
+++ b/test/phpunit/DateLibTest.php
@@ -362,6 +362,12 @@ class DateLibTest extends PHPUnit\Framework\TestCase
$langs=$this->savlangs;
$db=$this->savdb;
+ // Check %Y-%m-%d %H:%M:%S format
+ $result=dol_print_date('1970-01-01', '%Y-%m-%d %H:%M:%S', true); // A case for compatibility check
+ print __METHOD__." result=".$result."\n";
+ $this->assertEquals('1970-01-01 00:00:00', $result);
+
+
// Check %Y-%m-%d %H:%M:%S format
$result=dol_print_date(0, '%Y-%m-%d %H:%M:%S', true);
print __METHOD__." result=".$result."\n";
diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php
index 5357f7c8061..12c8683bb8f 100644
--- a/test/phpunit/FunctionsLibTest.php
+++ b/test/phpunit/FunctionsLibTest.php
@@ -188,6 +188,8 @@ class FunctionsLibTest extends PHPUnit\Framework\TestCase
$this->assertEquals($this->savdb->connected, 1, 'Savdb is connected');
$this->assertNotNull($newproduct1->db->db, 'newproduct1->db is not null');
+ $newproductcloned2 = dol_clone($newproduct1, 2);
+ var_dump($newproductcloned2);
//print __METHOD__." newproductcloned1->db must be null\n";
//$this->assertNull($newproductcloned1->db, 'newproductcloned1->db is null');
}
diff --git a/test/phpunit/Website.class.php b/test/phpunit/Website.class.php
new file mode 100644
index 00000000000..50d0c16453d
--- /dev/null
+++ b/test/phpunit/Website.class.php
@@ -0,0 +1,178 @@
+
+ *
+ * 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 .
+ * or see https://www.gnu.org/
+ */
+
+/**
+ * \file test/phpunit/WebsiteTest.php
+ * \ingroup test
+ * \brief PHPUnit test
+ * \remarks To run this script as CLI: phpunit filename.php
+ */
+
+global $conf,$user,$langs,$db;
+//define('TEST_DB_FORCE_TYPE','mysql'); // This is to force using mysql driver
+//require_once 'PHPUnit/Autoload.php';
+
+if (! defined('NOREQUIRESOC')) {
+ define('NOREQUIRESOC', '1');
+}
+if (! defined('NOCSRFCHECK')) {
+ define('NOCSRFCHECK', '1');
+}
+if (! defined('NOTOKENRENEWAL')) {
+ define('NOTOKENRENEWAL', '1');
+}
+if (! defined('NOREQUIREMENU')) {
+ define('NOREQUIREMENU', '1'); // If there is no menu to show
+}
+if (! defined('NOREQUIREHTML')) {
+ define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php
+}
+if (! defined('NOREQUIREAJAX')) {
+ define('NOREQUIREAJAX', '1');
+}
+if (! defined("NOLOGIN")) {
+ define("NOLOGIN", '1'); // If this page is public (can be called outside logged session)
+}
+if (! defined("NOSESSION")) {
+ define("NOSESSION", '1');
+}
+
+require_once dirname(__FILE__).'/../../htdocs/main.inc.php';
+require_once dirname(__FILE__).'/../../htdocs/core/lib/website.lib.php';
+
+
+if (empty($user->id)) {
+ print "Load permissions for admin user nb 1\n";
+ $user->fetch(1);
+ $user->getrights();
+}
+$conf->global->MAIN_DISABLE_ALL_MAILS=1;
+
+
+/**
+ * Class for PHPUnit tests
+ *
+ * @backupGlobals disabled
+ * @backupStaticAttributes enabled
+ * @remarks backupGlobals must be disabled to have db,conf,user and lang not erased.
+ */
+class WebsiteTest extends PHPUnit\Framework\TestCase
+{
+ protected $savconf;
+ protected $savuser;
+ protected $savlangs;
+ protected $savdb;
+
+ /**
+ * Constructor
+ * We save global variables into local variables
+ *
+ * @return SecurityTest
+ */
+ public function __construct()
+ {
+ parent::__construct();
+
+ //$this->sharedFixture
+ global $conf,$user,$langs,$db;
+ $this->savconf=$conf;
+ $this->savuser=$user;
+ $this->savlangs=$langs;
+ $this->savdb=$db;
+
+ print __METHOD__." db->type=".$db->type." user->id=".$user->id;
+ //print " - db ".$db->db;
+ print "\n";
+ }
+
+ /**
+ * setUpBeforeClass
+ *
+ * @return void
+ */
+ public static function setUpBeforeClass()
+ {
+ global $conf,$user,$langs,$db;
+ $db->begin(); // This is to have all actions inside a transaction even if test launched without suite.
+
+ print __METHOD__."\n";
+ }
+
+ /**
+ * tearDownAfterClass
+ *
+ * @return void
+ */
+ public static function tearDownAfterClass()
+ {
+ global $conf,$user,$langs,$db;
+ $db->rollback();
+
+ print __METHOD__."\n";
+ }
+
+ /**
+ * Init phpunit tests
+ *
+ * @return void
+ */
+ protected function setUp()
+ {
+ global $conf,$user,$langs,$db;
+ $conf=$this->savconf;
+ $user=$this->savuser;
+ $langs=$this->savlangs;
+ $db=$this->savdb;
+
+ print __METHOD__."\n";
+ }
+
+ /**
+ * End phpunit tests
+ *
+ * @return void
+ */
+ protected function tearDown()
+ {
+ print __METHOD__."\n";
+ }
+
+
+ /**
+ * testGetPagesFromSearchCriterias
+ *
+ * @return void
+ */
+ public function testGetPagesFromSearchCriterias()
+ {
+ global $db;
+
+ $s = "123') OR 1=1-- \' xxx";
+ /*
+ var_dump($s);
+ var_dump($db->escapeforlike($s));
+ var_dump($db->escape($db->escapeforlike($s)));
+ */
+
+ $res = getPagesFromSearchCriterias('page,blogpost', 'meta,content', $s, 2, 'date_creation', 'DESC', 'en');
+ //var_dump($res);
+ print __METHOD__." message=".$res['code']."\n";
+ // We must found no line (so code should be KO). If we found somethiing, it means there is a SQL injection of the 1=1
+ $this->assertEquals($res['code'], 'KO');
+ }
+}